Catch up of Symbian tools for @1627812
authorPat Downey <patrick.downey@nokia.com>
Thu, 25 Jun 2009 15:59:54 +0100
changeset 1 0a7b44b10206
parent 0 c55016431358
child 2 806186ab5e14
Catch up of Symbian tools for @1627812
symport/bafl/inc/bacline.h
symport/bafl/inc/stringpool.h
symport/bafl/inc/stringpool.inl
symport/bafl/inc/stringpoolerr.h
symport/bafl/inc/stringtablesupport.h
symport/bafl/src/bacline.cpp
symport/bafl/src/stringpoolapi.cpp
symport/bafl/src/stringpoolimplementation.cpp
symport/bafl/src/stringpoolimplementation.h
symport/bldtest/bld.inf
symport/bldtest/test.pl
symport/bldtest/testdll.cpp
symport/bldtest/testdll.h
symport/bldtest/testexe.cpp
symport/bldtest/testexe_main.cpp
symport/bldtest/teststatic.cpp
symport/bldtest/teststatic.h
symport/charconv/framework/inc/utf.h
symport/charconv/framework/src/charconv/utf.cpp
symport/e32/common/array.cpp
symport/e32/common/common.h
symport/e32/common/des16.cpp
symport/e32/common/des8.cpp
symport/e32/common/mem.cpp
symport/e32/common/secure.cpp
symport/e32/euser/cbase/ub_array.cpp
symport/e32/euser/cbase/ub_buf.cpp
symport/e32/euser/cbase/ub_circ.cpp
symport/e32/euser/cbase/ub_cln.cpp
symport/e32/euser/cbase/ub_cons.cpp
symport/e32/euser/cbase/ub_std.h
symport/e32/euser/cbase/ub_utl.cpp
symport/e32/euser/epoc/x86/uc_i64.cia
symport/e32/euser/epoc/x86/uc_realx.cia
symport/e32/euser/epoc/x86/uc_realx.cpp
symport/e32/euser/epoc/x86/uc_seh.cpp
symport/e32/euser/epoc/x86/uc_trp.cpp
symport/e32/euser/epoc/x86/uc_utl.cia
symport/e32/euser/epoc/x86/uc_utl.cpp
symport/e32/euser/maths/um_asin.cpp
symport/e32/euser/maths/um_atan.cpp
symport/e32/euser/maths/um_dtor.cpp
symport/e32/euser/maths/um_exp.cpp
symport/e32/euser/maths/um_frac.cpp
symport/e32/euser/maths/um_int.cpp
symport/e32/euser/maths/um_ln.cpp
symport/e32/euser/maths/um_log.cpp
symport/e32/euser/maths/um_mod.cpp
symport/e32/euser/maths/um_pow.cpp
symport/e32/euser/maths/um_pow10.cpp
symport/e32/euser/maths/um_rand.cpp
symport/e32/euser/maths/um_rtod.cpp
symport/e32/euser/maths/um_sin.cpp
symport/e32/euser/maths/um_spec.cpp
symport/e32/euser/maths/um_sqrt.cpp
symport/e32/euser/maths/um_std.h
symport/e32/euser/maths/um_tan.cpp
symport/e32/euser/maths/um_utl.cpp
symport/e32/euser/unicode/collate.cpp
symport/e32/euser/unicode/collateimp.h
symport/e32/euser/unicode/collateimp.inl
symport/e32/euser/unicode/compare.cpp
symport/e32/euser/unicode/compareimp.h
symport/e32/euser/unicode/compareimp.inl
symport/e32/euser/unicode/folddecomp.inl
symport/e32/euser/unicode/foldtable.inl
symport/e32/euser/unicode/unicode.cpp
symport/e32/euser/unicode/unitable.cpp
symport/e32/euser/us_data.h
symport/e32/euser/us_decode.cpp
symport/e32/euser/us_des.cpp
symport/e32/euser/us_encode.cpp
symport/e32/euser/us_exec.cpp
symport/e32/euser/us_func.cpp
symport/e32/euser/us_graph.cpp
symport/e32/euser/us_htab.cpp
symport/e32/euser/us_lex16.cpp
symport/e32/euser/us_lex8.cpp
symport/e32/euser/us_loc.cpp
symport/e32/euser/us_parse.cpp
symport/e32/euser/us_que.cpp
symport/e32/euser/us_regn.cpp
symport/e32/euser/us_std.h
symport/e32/euser/us_test.cpp
symport/e32/euser/us_time.cpp
symport/e32/euser/us_trp.cpp
symport/e32/euser/us_utl.cpp
symport/e32/include/collate.h
symport/e32/include/cpudefs.h
symport/e32/include/d32locd.h
symport/e32/include/d32locd.inl
symport/e32/include/e32base.h
symport/e32/include/e32base.inl
symport/e32/include/e32base_private.h
symport/e32/include/e32btrace.h
symport/e32/include/e32capability.h
symport/e32/include/e32cmn.h
symport/e32/include/e32cmn.inl
symport/e32/include/e32cmn_private.h
symport/e32/include/e32cons.h
symport/e32/include/e32const.h
symport/e32/include/e32const_private.h
symport/e32/include/e32debug.h
symport/e32/include/e32def.h
symport/e32/include/e32def_private.h
symport/e32/include/e32des16.h
symport/e32/include/e32des16_private.h
symport/e32/include/e32des8.h
symport/e32/include/e32des8_private.h
symport/e32/include/e32err.h
symport/e32/include/e32event.h
symport/e32/include/e32event_private.h
symport/e32/include/e32hal.h
symport/e32/include/e32hashtab.h
symport/e32/include/e32huffman.h
symport/e32/include/e32keys.h
symport/e32/include/e32kpan.h
symport/e32/include/e32ktran.h
symport/e32/include/e32lang.h
symport/e32/include/e32ldr.h
symport/e32/include/e32lmsg.h
symport/e32/include/e32math.h
symport/e32/include/e32math.inl
symport/e32/include/e32notif.h
symport/e32/include/e32panic.h
symport/e32/include/e32power.h
symport/e32/include/e32property.h
symport/e32/include/e32rom.h
symport/e32/include/e32shbuf_priv.h
symport/e32/include/e32shbufcmn.h
symport/e32/include/e32std.h
symport/e32/include/e32std.inl
symport/e32/include/e32std_private.h
symport/e32/include/e32svr.h
symport/e32/include/e32test.h
symport/e32/include/e32ver.h
symport/e32/include/partitions.h
symport/e32/include/u32exec.h
symport/e32/include/u32hal.h
symport/e32/include/u32property.h
symport/e32/include/u32std.h
symport/e32/include/unicode.h
symport/e32/include/videodriver.h
symport/e32/include/x86hlp_gcc.inl
symport/e32test/buffer/T_FoldPerf.cpp
symport/e32test/buffer/UnicodeData.txt
symport/e32test/buffer/t_bflat.cpp
symport/e32test/buffer/t_bseg.cpp
symport/e32test/buffer/t_buf.cpp
symport/e32test/buffer/t_char.cpp
symport/e32test/buffer/t_circ.cpp
symport/e32test/buffer/t_collate.cpp
symport/e32test/buffer/t_des.cpp
symport/e32test/buffer/t_farray.cpp
symport/e32test/buffer/t_func.cpp
symport/e32test/buffer/t_graph.cpp
symport/e32test/buffer/t_hashtab.cpp
symport/e32test/buffer/t_huff.cpp
symport/e32test/buffer/t_key.cpp
symport/e32test/buffer/t_lex.cpp
symport/e32test/buffer/t_match.cpp
symport/e32test/buffer/t_parray.cpp
symport/e32test/buffer/t_que.cpp
symport/e32test/buffer/t_rbuf.cpp
symport/e32test/buffer/t_readar.cpp
symport/e32test/buffer/t_regn.cpp
symport/e32test/buffer/t_sque.cpp
symport/e32test/buffer/t_varray.cpp
symport/e32test/buffer/t_versio.cpp
symport/e32test/math/largeint.cpp
symport/e32test/math/largeint.h
symport/e32test/math/t_float.cpp
symport/e32test/math/t_float.h
symport/e32test/math/t_float1.cpp
symport/e32test/math/t_float2.cpp
symport/e32test/math/t_float3.cpp
symport/e32test/math/t_fltcl.cpp
symport/e32test/math/t_i64.cpp
symport/e32test/math/t_i64_2.cpp
symport/e32test/math/t_math.cpp
symport/e32test/math/t_math.h
symport/e32test/math/t_math2.cpp
symport/e32test/math/t_vals.h
symport/e32test/misc/prbs.h
symport/e32test/system/t_ctrap.cpp
symport/e32test/system/t_trap.cpp
symport/f32/inc/f32file.h
symport/f32/inc/f32file.inl
symport/f32/sfsrv/cl_cli.cpp
symport/f32/sfsrv/cl_drive.cpp
symport/f32/sfsrv/cl_entry.cpp
symport/f32/sfsrv/cl_file.cpp
symport/f32/sfsrv/cl_find.cpp
symport/f32/sfsrv/cl_ftext.cpp
symport/f32/sfsrv/cl_parse.cpp
symport/f32/sfsrv/cl_std.h
symport/flm/export.pl
symport/flm/x86tool.flm
symport/flm/x86tool.xml
symport/group/bld.inf
symport/group/how to build Symport.doc
symport/group/how to use symport.doc
symport/group/libsymport.a
symport/group/release.txt
symport/group/symport.mrp
symport/group/test.pl
symport/group/ver.cpp
symport/inc/x86tool.h
symport/symfile/bld.inf
symport/symfile/t_symfile.mmp
symport/symfile/test.cpp
symport/symfile/test.pl
symport/symuser/bld.inf
symport/symuser/exec.cpp
symport/symuser/exec_enum.h
symport/symuser/exec_user.h
symport/symuser/exestub.cpp
symport/symuser/loader.cpp
symport/symuser/new.cpp
symport/symuser/symuser.cpp
symport/symuser/test.pl
symport/symuser/x86hlp.cia
symport/symutil/group/bld.inf
symport/symutil/inc/errorstrings.h
symport/symutil/inc/errortranslator.h
symport/symutil/inc/utils.h
symport/symutil/src/errortranslator.cpp
symport/symutil/src/utils.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/bafl/inc/bacline.h	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,72 @@
+// Copyright (c) 1997-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+#ifndef __BACLINE_H
+#define __BACLINE_H
+
+#ifndef __E32BASE_H
+#include <e32base.h>
+#endif
+
+/**
+Not available until Platform 003
+@internalComponent
+*/
+typedef TBuf<0x100> TBaCommand;
+
+class CCommandLineArguments : public CBase
+/** Parses command line arguments.
+
+The class provides functions to access the arguments that are supplied when 
+a program is launched as a new process. 
+
+The program name is returned as argument 0. Other arguments are returned as 
+arguments 1, 2 etc. 
+
+The Count() function indicates how many arguments there are, including the 
+program name. Arguments may be quoted to contain blanks and quotes.
+
+The command line arguments and process name occupy 256 characters each. In 
+order to minimise the space used throughout the lifetime of a program, it 
+is recommended that the program parse the arguments shortly after initialisation, 
+save the argument values appropriately, and then destroy the CCommandLineArguments 
+object.
+
+The main use of this class is in parsing the arguments of WINC command-line 
+utilities.
+
+This class is not intended for user derivation 
+@publishedAll
+@released
+*/
+	{
+public:
+	// construct/destruct
+	IMPORT_C static CCommandLineArguments* NewLC();
+	IMPORT_C static CCommandLineArguments* NewL();
+	IMPORT_C ~CCommandLineArguments();
+	// extract
+	IMPORT_C TPtrC Arg(TInt aArg) const;
+	IMPORT_C TInt Count() const;
+private:
+	CCommandLineArguments();
+	void ConstructL();
+private:
+	CArrayFixFlat<TPtrC>* iArgs;
+	HBufC* iCommandLine;
+	TFileName iFileName;
+	};
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/bafl/inc/stringpool.h	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,291 @@
+// Copyright (c) 2001-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+#ifndef __STRINGPOOL_H__
+#define __STRINGPOOL_H__ 
+
+#include <e32base.h>
+#include <stringtablesupport.h>
+#include <stringpoolerr.h>
+
+class RStringF;
+class RString;
+class RStringToken;
+class RStringTokenF;
+class MStringPoolCloseCallBack;
+class RStringBase;
+class CStringPoolImplementation;
+
+
+class MStringPoolCloseCallBack
+/** 
+Abstract callback interface that alerts implementors to when a string pool 
+closes.
+@publishedAll
+@released
+*/
+	{
+	///Implement this function to perform some operation when the string pool is being closed
+	public:
+	/** Called when the string pool is about to close. */
+		virtual void StringPoolClosing()=0;
+	};
+
+/** The string pool handle object.  A string pool can have several
+	distinct handles associated with it, each associated with a
+	different pre-loaded table. The difference between them is that
+	creating a string from an enum will interpret the enum as an
+	offset into the relevant pre-loaded table */
+class RStringPool
+/** 
+String pool handle.
+
+A string pool can have several distinct handles associated with it, each associated 
+with a different pre-loaded table. Creating a string from an enum value interprets 
+the value as an offset into the relevant pre-loaded table. 
+@publishedAll
+@released
+*/
+	{
+ public:
+	inline RStringPool();
+
+	IMPORT_C void OpenL();
+
+	IMPORT_C void OpenL(const TStringTable& aTable);
+
+	IMPORT_C void OpenL(const TStringTable& aTable,MStringPoolCloseCallBack& aCallBack);
+
+	IMPORT_C void Close();
+
+	IMPORT_C RStringF OpenFStringL(const TDesC8& aString) const;
+
+	IMPORT_C RString OpenStringL(const TDesC8& aString) const;
+
+	IMPORT_C RString String(RStringToken aString) const;
+
+	IMPORT_C RString String(TInt aIndex,const TStringTable& aTable) const;	
+
+	IMPORT_C RStringF StringF(RStringTokenF aString) const;
+
+	IMPORT_C RStringF StringF(TInt aIndex,const TStringTable& aTable) const;	
+
+ private:
+	friend class RStringBase;
+	friend class RString;
+	friend class RStringF;
+	friend class CStringPoolImplementation;
+
+	CStringPoolImplementation* iImplementation;
+	};
+
+/** A compact (4 byte) representation of a string in the string pool. This
+	class must be turned into a RStringBase (or one of its derived classes) before you can do anything
+	useful with it. It is only intended to be used when storing strings 
+	in situations where space matters; normaly use RStringBase.
+	@see RStringBase
+*/
+class RStringTokenBase
+/** 
+Base class for the RStringToken and RStringTokenF string representations.
+A compact (4 byte) representation of a string in the string pool. This
+class must be turned into a RStringBase (or one of its derived classes) before you can do anything
+useful with it. It is only intended to be used when storing strings 
+in situations where space matters; normaly use RStringBase.
+@see RStringBase
+@publishedAll
+@released
+*/
+	{
+ public:
+	inline RStringTokenBase();
+
+	inline RStringTokenBase operator=(RStringBase aVal);
+
+	inline TBool IsNull() const;
+
+ protected:
+	friend class RStringPool;
+	friend class RStringBase;
+	friend class RStringTokenEither;
+	friend class CStringPoolImplementation;
+
+	TUint32 iVal;
+	};
+
+
+class RStringToken : public RStringTokenBase
+/** 
+A compact (4 byte) representation of a string in the string pool. 
+
+This class must be turned into a RString before you can do anything useful 
+with it. It is only intended to be used when storing strings in situations 
+where space matters. You should normally use RString. 
+@publishedAll
+@released
+*/
+	{
+ public:
+	inline TBool operator==(RStringToken aVal) const;
+
+	inline TBool operator!=(RStringToken aVal) const;
+
+	inline RStringToken operator=(RString aVal);
+
+	friend class RStringPool;
+	friend class RString;
+	friend class CStringPoolImplementation;
+	};
+
+class RStringTokenF  : public RStringTokenBase
+/** 
+A compact (4 byte) representation of a RStringF string in the string pool. 
+
+This class must be turned into a RStringF before you can do anything useful 
+with it. It is only intended to be used when storing strings in situations 
+where space matters. You should normally use RStringF. 
+@publishedAll
+@released
+*/
+	{
+ public:
+	inline TBool operator==(RStringTokenF aVal) const;
+
+	inline TBool operator!=(RStringTokenF aVal) const;
+
+	inline RStringTokenF operator=(RStringF aVal);
+
+	friend class RStringPool;
+	friend class RStringF;
+	friend class CStringPoolImplementation;
+	};
+
+class RStringBase
+/** 
+Base class for classes that represent a string in a string pool. 
+
+There are sub-classes for folded and non-folded strings. Use this class when 
+you want to receive a string, but have no intention of comparing it with anything. 
+
+
+@see RStringPool 
+@publishedAll
+@released
+*/
+	{
+ public:
+	inline RStringBase();
+
+	IMPORT_C void Close();
+
+	IMPORT_C RStringBase Copy();
+
+	IMPORT_C const TDesC8& DesC() const;
+
+	inline operator RStringTokenBase() const;
+
+	IMPORT_C TInt Index(const TStringTable& aTable) const;
+
+	IMPORT_C const TStringTable*  OriginalTableRef() const;
+
+	inline RStringPool Pool() const;
+
+ protected:
+	friend class RStringPool;
+	friend class RStringTokenBase;
+
+	RStringPool iPool;
+	TUint32 iVal;
+	};
+
+class RString : public RStringBase
+/** 
+A string that is stored in a string pool, with case-sensitive comparisons. 
+
+To initialise values of this class, you need to use the operator() functions 
+on the RStringPool. 
+
+This class performs comparisons in a non-folded (case sensitive) manner. 
+
+@see RStringPool
+@publishedAll
+@released
+*/
+	{
+ public:
+	inline RString Copy();
+
+	inline operator RStringToken() const;
+
+	inline TBool operator==(const RString& aVal) const;
+
+	inline TBool operator!=(const RString& aVal) const;
+
+	friend class RStringPool;
+	friend class RStringToken;
+	};
+
+class RStringF : public RStringBase
+/** 
+A string that is stored in a string pool, with case-insensitive comparisons.
+
+To initialise values of this class, you need to use the operator() functions 
+on the RStringPool. 
+
+Comparisons with this class use folded (case insensitive) comparisons. 
+@publishedAll
+@released
+*/
+	{
+ public:
+	inline RStringF Copy();
+
+	inline operator RStringTokenF() const;
+
+	inline TBool operator==(const RStringF& aVal) const;
+
+	inline TBool operator!=(const RStringF& aVal) const;
+
+	friend class RStringPool;
+	friend class RStringTokenF;
+	};
+
+/**
+A pointer to a string table.
+@publishedAll
+@released
+*/
+
+struct TStringTable
+	{
+	/// The number of elements in the table
+	/** The number of elements in the table. */
+	TUint iCount;
+	/// A pointer to an array of pointers to the strings
+	/** A pointer to an array of pointers to the strings. */
+	const void* const * iTable;	
+
+	/// ETrue if the table should be considered case-sensitive.
+	/** Flag that is ETrue if the table should be considered case-sensitive, otherwise 
+	EFalse. */
+	TBool iCaseSensitive;
+	};
+
+// Include the inline functions
+#include <stringpool.inl>
+
+#endif // __STRINGPOOL_H__
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/bafl/inc/stringpool.inl	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,222 @@
+// Copyright (c) 2001-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+#ifndef __STRINGPOOL_INL__
+#define __STRINGPOOL_INL__
+
+
+
+inline RStringTokenBase::RStringTokenBase()
+		: iVal(0)
+/** Default constructor. */
+	{
+	}
+
+
+inline RStringTokenBase RStringTokenBase::operator=(RStringBase aVal)
+/** Assignment operator, which makes a string token from a string. 
+
+@param aVal The value of the string to copy.
+@return The string token base. */
+	{
+	iVal = aVal.iVal;
+	return *this;
+	}
+
+
+inline TBool RStringTokenBase::IsNull() const
+/** Tests if the string is null or not.
+
+@return ETrue if the string is null, otherwise EFalse. */
+	{
+	return (iVal == 0);
+	}
+
+
+inline TBool RStringToken::operator==(RStringToken aVal) const
+/** Equality operator. 
+
+@param aVal The string to compare.
+@return ETrue if the strings are the same, otherwise EFalse. */
+	{
+	return iVal == aVal.iVal;
+	}
+
+
+inline TBool RStringToken::operator!=(RStringToken aVal) const
+/** Inequality operator. 
+
+@param aVal The string to compare.
+@return ETrue if the strings are different, else EFalse */
+	{
+	return iVal != aVal.iVal;
+	}
+
+
+inline RStringToken RStringToken::operator=(RString aVal)
+/** Assignment operator, which makes a string token from a string. 
+
+@param aVal The string to copy.
+@return The string token. */
+	{
+	iVal = aVal.iVal;
+	return *this;
+	}
+
+
+inline TBool RStringTokenF::operator==(RStringTokenF aVal) const
+/** Equality operator.
+
+@param aVal The string to compare.
+@return ETrue if the strings are the same, otherwise EFalse. */
+	{
+	return iVal == aVal.iVal;
+	}
+
+
+inline TBool RStringTokenF::operator!=(RStringTokenF aVal) const
+/** Inequality operator. 
+
+@param aVal The string to compare.
+@return ETrue if any strings are different, else EFalse */
+	{
+	return iVal != aVal.iVal;
+	}
+
+
+inline RStringTokenF RStringTokenF::operator=(RStringF aVal)
+/** Assignment operator that makes a string token from a string. 
+
+@param aVal The string to compare.
+@return The string token. */
+	{
+	iVal = aVal.iVal;
+	return *this;
+	}
+
+
+inline RStringBase::RStringBase()
+		: iVal(0)
+/** Default constructor. */
+	{
+	}
+
+/** Returns a compact string equivalent to the string  */
+inline RStringBase::operator RStringTokenBase() const
+	{
+	RStringTokenBase s;
+	s.iVal = iVal;
+	return s;
+	}
+
+inline RString RString::Copy()
+/** Copies a string. 
+
+Both the original and the copy must be separately closed.
+
+@return The string to copy. */
+	{
+	RStringBase::Copy();
+	return *this;
+	}
+
+/** Returns a compact string equivalent to the string (for case-sensitive strings)  */
+inline RString::operator RStringToken() const
+	{
+	RStringToken s;
+	s.iVal = iVal;
+	return s;
+	}
+
+inline RStringF RStringF::Copy()
+/** Copies a string. 
+
+Both the original and the copy must be separately closed.
+
+@return The string to copy. */
+	{
+	RStringBase::Copy();
+	return *this;
+	}
+
+
+inline TBool RStringF::operator==(const RStringF& aVal) const
+/** Equality operator.
+
+@param aVal The string to compare.
+@return ETrue if the strings are equal, else EFalse */
+	{
+	__ASSERT_DEBUG(iPool.iImplementation==aVal.iPool.iImplementation || aVal.iVal==0 || iVal==0, StringPoolPanic::Panic(StringPoolPanic::EComparisonBetweenTwoStringPoolsNotAllowed));
+	return (iVal == aVal.iVal);
+	}
+
+
+inline TBool RStringF::operator!=(const RStringF& aVal) const
+/** Inequality operator.
+
+@param aVal The string to compare.
+@return ETrue if the strings are not equal, else EFalse */
+	{
+	__ASSERT_DEBUG(iPool.iImplementation==aVal.iPool.iImplementation || aVal.iVal==0 || iVal==0, StringPoolPanic::Panic(StringPoolPanic::EComparisonBetweenTwoStringPoolsNotAllowed));
+	return (iVal != aVal.iVal);
+	}
+
+
+inline RStringF::operator RStringTokenF() const
+	{
+	RStringTokenF s;
+	s.iVal = iVal;
+	return s;
+	}
+
+
+inline RStringPool RStringBase::Pool() const 
+/** Gets the string pool.
+
+@return The string pool. */
+	{
+	return iPool;
+	}
+
+
+inline TBool RString::operator==(const RString& aVal) const
+/** Equality operator.
+
+@param aVal The string to compare.
+@return ETrue if the strings are equal, else EFalse */
+	{
+	__ASSERT_DEBUG(iPool.iImplementation==aVal.iPool.iImplementation || aVal.iVal==0 || iVal==0, StringPoolPanic::Panic(StringPoolPanic::EComparisonBetweenTwoStringPoolsNotAllowed));
+	return (iVal == aVal.iVal);
+	}
+
+
+inline TBool RString::operator!=(const RString& aVal) const
+/** Inequality operator.
+
+@param aVal The string to compare.
+@return ETrue if the strings are not equal, else EFalse */
+	{
+	__ASSERT_DEBUG(iPool.iImplementation==aVal.iPool.iImplementation || aVal.iVal==0 || iVal==0, StringPoolPanic::Panic(StringPoolPanic::EComparisonBetweenTwoStringPoolsNotAllowed));
+	return (iVal != aVal.iVal);
+	}
+
+inline RStringPool::RStringPool()
+		: iImplementation(0)
+/** Default constructor. */
+	{
+	}
+
+
+#endif // __STRINGPOOL_INL__
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/bafl/inc/stringpoolerr.h	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,46 @@
+// Copyright (c) 2001-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+#ifndef __STRINGPOOLERR_H
+#define __STRINGPOOLERR_H
+
+#include <e32std.h>
+#include <e32base.h>
+
+class StringPoolPanic
+/**
+@internalComponent
+*/
+	{
+public:
+	enum TStringPoolPanic
+		{
+		EComparisonBetweenTwoStringPoolsNotAllowed=0,// We are trying to compare a string from one string pool to a string from another string pool
+		EIllegalUseOfNullString,
+		ECreatingStringWithWrongCase,
+        EStringNotTableEntry,
+        EStringTableNotFound
+		};
+	static void Panic(TStringPoolPanic aPanic);
+	};
+
+inline void StringPoolPanic::Panic(StringPoolPanic::TStringPoolPanic aPanic)
+	{
+	_LIT(KStringPoolPanic,"StringPool");
+	User::Panic(KStringPoolPanic,aPanic);
+	}
+
+#endif // __STRINGPOOLERR_H
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/bafl/inc/stringtablesupport.h	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,69 @@
+// Copyright (c) 2001-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// StringTableSupport.h
+// 
+// This file contains defines needed by the auto-generated string table files.
+// There is no reason why a manualy written cpp file outsinde the string pool
+// implementation should include it.
+//
+
+#ifndef __STRINGTABLESUPPORT_H__
+#define __STRINGTABLESUPPORT_H__
+
+/**
+@internalComponent
+*/
+#define _STLIT8(name,s) const static TStLitC8<sizeof(s)> name={sizeof(s)-1,s}
+
+// A class that differs from TLitC only in that it does not have a
+// dereference operator defined
+//##ModelId=3B1E52AB0100
+template <TInt S>
+class TStLitC8
+/**
+@internalComponent
+*/
+	{
+public:
+	inline operator const TDesC8&() const;
+	inline const TDesC8& operator()() const;
+	inline operator const __TRefDesC8() const;
+public:
+	//##ModelId=3B1E52AB0120
+	TUint iTypeLength;
+	//##ModelId=3B1E52AB0117
+	TText8 iBuf[__Align8(S)];
+	};
+
+template <TInt S>
+inline const TDesC8& TStLitC8<S>::operator()() const
+	{
+	return *REINTERPRET_CAST(const TDesC8*,this);
+	}
+
+template <TInt S>
+inline TStLitC8<S>::operator const TDesC8&() const
+	{
+	return *REINTERPRET_CAST(const TDesC8*,this);
+	}
+
+template <TInt S>
+inline TStLitC8<S>::operator const __TRefDesC8() const
+	{
+	return *REINTERPRET_CAST(const TDesC8*,this);
+	}
+
+struct TStringTable;
+
+#endif // __STRINGTABLESUPPORT_H__
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/bafl/src/bacline.cpp	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,150 @@
+// Copyright (c) 1997-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+#ifdef __TOOLS2__
+#ifndef _WIN32
+#define __TOOLS__
+#endif
+#endif
+
+#include <bacline.h>
+
+#ifdef __TOOLS2__
+#include <cstring>
+extern char **gArgv;
+#endif
+
+EXPORT_C CCommandLineArguments* CCommandLineArguments::NewLC()
+/** Allocates and constructs a command line arguments parser, putting the returned 
+pointer onto the cleanup stack. The function leaves if there is insufficient 
+memory.
+
+@return The command line arguments parser. */
+	{
+	CCommandLineArguments* self=new (ELeave) CCommandLineArguments;
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	return self;
+	}
+
+EXPORT_C CCommandLineArguments* CCommandLineArguments::NewL()
+/** Allocates and constructs a command line arguments parser. The function leaves 
+if there is insufficient memory.
+
+@return The command line arguments parser. */
+	{
+	CCommandLineArguments* self=CCommandLineArguments::NewLC();
+	CleanupStack::Pop();
+	return self;
+	}
+
+EXPORT_C CCommandLineArguments::~CCommandLineArguments()
+/** Frees resources prior to destruction. */
+	{
+	delete iArgs;
+	delete iCommandLine;
+	}
+
+CCommandLineArguments::CCommandLineArguments()
+	{
+	}
+
+void CCommandLineArguments::ConstructL()
+	{
+	// allocate args array
+	iArgs=new (ELeave) CArrayFixFlat<TPtrC> (10);
+	// get raw command line
+
+#ifndef __TOOLS2__
+	RProcess me;
+#endif
+	iCommandLine=HBufC::NewL(User::CommandLineLength());
+	TPtr commandLine(iCommandLine->Des());
+	User::CommandLine(commandLine);
+#ifndef __TOOLS2__
+	iFileName=me.FileName();
+#else
+	iFileName.Copy(TPtrC8((TUint8*)gArgv[0], strlen(gArgv[0])));
+#endif
+
+	// scan for each argument
+	TText* out=CONST_CAST(TText*,iCommandLine->Ptr());
+	const TText* scan=out;
+	const TText* end=scan+iCommandLine->Length();
+	while (scan < end) // scan one argument
+		{
+		while (scan < end && *scan==' ') // skip leading space
+			scan++;
+		if (scan == end) // ignore if blank
+			break;
+		TBool quoted=*scan=='\"'; // note leading quote
+		if (quoted)
+			scan++;
+		TText* start=out; // note start in output
+		if (!quoted) // if not quoted, scan for blank
+			{
+			while (scan < end && *scan!=' ')
+				*out++ = *scan++;
+			}
+		else // quoted, scan for quote
+			{
+			for (;;) // one quote-or-double sequence
+				{
+				while (scan < end && *scan!='\"') // all up to quote
+					*out++ = *scan++;
+				if (scan < end) // skip quote
+					scan++;
+				if (scan < end && *scan=='\"') // transfer if quote is doubled
+					*out++ = *scan++;
+				else // finished this arg
+					break;
+				}
+			}
+		TPtrC arg(start, out-start);
+		iArgs->AppendL(arg);
+		}
+	}
+
+
+EXPORT_C TPtrC CCommandLineArguments::Arg(TInt aArg) const
+/** Returns a non-modifiable pointer descriptor representing the specified command-line 
+argument.
+
+Arg(0) is the file name as specified on the command line. Arg(1), Arg(2) etc. 
+are the arguments specified to the command.
+
+The pointer descriptor is valid throughout the lifetime of the CCommandLineArguments 
+object. If you wish to retain argument values after the CCommandLineArguments 
+object is destroyed, you should copy the argument data into a different object.
+
+@param aArg The index of the desired argument. This number must be less than 
+Count(). Specify 0 for the name used to invoke the process. Specify 1, 2 etc. 
+for the arguments.
+@return Non-modifiable pointer descriptor to the specified argument text. */
+	{
+	if (aArg > 0 ) // a normal argument
+		return iArgs->operator[](aArg-1);
+	else // process name
+		return TPtrC(iFileName);
+	}
+
+EXPORT_C TInt CCommandLineArguments::Count() const
+/** Returns the number of command line arguments, including the program name.
+
+@return The number of command line arguments, plus one for the program name. 
+Returns 1, if no arguments are specified. */
+	{
+	return iArgs->Count()+1;
+	}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/bafl/src/stringpoolapi.cpp	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,292 @@
+// Copyright (c) 2003-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+#include <e32std.h>
+#include "stringpoolimplementation.h"
+
+
+
+EXPORT_C void RStringBase::Close()
+/** Closes a string.
+
+You must close every string you open. In other words, every call to RStringBase::Copy(),
+RStringPool::OpenStringL() and RStringPool::OpenFStringL() must be matched
+by a close.
+
+Strings created through RStringPool::String() or RStringPool::StringF() with
+an integer argument need not be closed (but closing is harmless).
+
+Strings created through RStringPool::String() or RStringPool::StringF() with
+a StringToken or StringTokenF argument must not be closed, as they're just
+changing the external representation. */
+	{
+	if (iVal)
+		//harmless for empty strings
+		iPool.iImplementation->Close(RStringTokenEither(iVal));
+	// invalidate the string if it's a dinamic one	otherwise do nothing
+	if(!StringUtils::IsTableEntry(this->iVal))
+		iVal=0U;
+	}
+
+
+EXPORT_C RStringBase RStringBase::Copy()
+/** Copies a string.
+
+Both the original and the copy string must be separately closed.
+
+@return The string base. */
+	{
+	if (iVal)
+		iPool.iImplementation->IncrementCount(RStringTokenEither(iVal));
+	return *this;
+	}
+
+
+/** Returns the content of the string
+ */
+EXPORT_C const TDesC8& RStringBase::DesC() const
+/** Gets the content of the string.
+
+@return Descriptor containing the content of the string. */
+	{
+	// check for empty string
+	if (iVal == 0)
+		return KNullDesC8();
+	if (StringUtils::IsTableEntry(iVal))
+		{
+		TInt index = StringUtils::TableIndex(iVal);
+		TInt tableUid= StringUtils::TableUid(iVal);
+		return iPool.iImplementation->TableLookup(index, tableUid);
+		}
+	else
+		return *StringUtils::NodePtr(iVal)->iDes;
+	}
+
+
+EXPORT_C TInt RStringBase::Index(const TStringTable& aTable) const
+/** Gets the enumeration value corresponding to this string.
+
+@param	aTable String table to look in
+@return	The string's enumeration value, or -1 if there is no such value
+@panic	EStringTableNotFound If the table supplied is not found. This panic is raised in debug builds only, in release mode the behaviour is undefined*/
+	{
+	//return an error for empty strings(i.e. with iVal=0 )
+	if(!this->iVal)
+	   return KErrNotFound;
+	TInt tableId=iPool.iImplementation->TableUid(aTable);
+	__ASSERT_DEBUG(tableId!=KErrNotFound,StringPoolPanic::Panic(StringPoolPanic::EStringTableNotFound));
+	// First check the iVal is part of the same table
+	if (StringUtils::IsTableEntry(iVal))
+	   {
+	   if (tableId==StringUtils::TableUid(iVal))
+		   return StringUtils::TableIndex(iVal);
+	   }
+	// Then check if the iVal is in the reverse duplicate list
+	TInt index=iPool.iImplementation->FindTableIndexFromFirstVal(iVal, tableId);
+	return index;
+	}
+
+
+EXPORT_C const TStringTable* RStringBase::OriginalTableRef() const
+/** Gets the table (if any) that first added the current string to the pool.
+
+Note there multiple tables can contain the same string.
+
+@return The table or NULL if the string was created dynamically (not from
+a table) */
+	{
+	if(StringUtils::IsTableEntry(iVal))
+		return &iPool.iImplementation->TableRef(iVal);
+	else
+		return NULL;
+	}
+
+/** Implementation of RStringPool class*/
+
+EXPORT_C void RStringPool::OpenL()
+/** Creates an initialised string pool with no pre-loaded string tables.
+
+@leave KErrNoMemory Not enough memory to open the pool */
+	{
+	iImplementation = new (ELeave) CStringPoolImplementation;
+	}
+
+EXPORT_C void RStringPool::OpenL(const TStringTable& aTable,MStringPoolCloseCallBack& aCallBack)
+/** Creates an initialised string pool with a pre-loaded string table, and a string-pool-closing
+callback.
+
+@param aTable The pre-loaded string table.
+@param aCallBack Callback interface that is called when the string pool closes
+@leave KErrNoMemory Not enough memory to open the pool */
+	{
+	if (!iImplementation)
+		{
+		iImplementation = new (ELeave) CStringPoolImplementation;
+		CleanupClosePushL(*this);
+		iImplementation->AddTableL(aTable);
+		iImplementation->AddCallBackL(aCallBack);
+		CleanupStack::Pop(); //this
+		}
+	else
+		{
+		iImplementation->AddTableL(aTable);
+		iImplementation->AddCallBackL(aCallBack);
+		}
+	}
+
+EXPORT_C void RStringPool::OpenL(const TStringTable& aTable)
+/** Creates an initialised string pool with a pre-loaded string table.
+
+@param aTable The pre-loaded string table.
+@leave KErrNoMemory Not enough memory to open the pool */
+	{
+	if (!iImplementation)
+		{
+		iImplementation = new (ELeave) CStringPoolImplementation;
+		CleanupClosePushL(*this);
+		iImplementation->AddTableL(aTable);
+		CleanupStack::Pop(); //this
+		}
+	else
+		{
+		iImplementation->AddTableL(aTable);
+		}
+	}
+
+
+EXPORT_C void RStringPool::Close()
+/** Closes the string pool table.
+
+This invalidates all other handles to the table. */
+	{
+	delete iImplementation;
+	iImplementation = NULL;
+	}
+
+EXPORT_C RStringF RStringPool::OpenFStringL(const TDesC8& aString) const
+/** Creates an RStringF using the current string pool.
+
+The string is opened as case-insensitive.
+
+@param aString The value of the string.
+@leave KErrNoMemory Not enough memory to open the string
+@return Initialised RStringF object */
+	{
+	RStringTokenEither newString = iImplementation->OpenL(aString, ETrue);
+	RStringF r;
+	r.iPool = *this;
+	r.iVal = newString.iVal;
+	return r;
+	}
+
+EXPORT_C RString RStringPool::OpenStringL(const TDesC8& aString) const
+/** Creates an RString using the current string pool.
+
+The string is opened as case-sensitive.
+
+@param aString The value of the string.
+@leave KErrNoMemory Not enough memory to open the string
+@return Initialised RString object */
+	{
+	RStringTokenEither newString = iImplementation->OpenL(aString, EFalse);
+	RString r;
+	r.iPool = *this;
+	r.iVal = newString.iVal;
+	return r;
+	}
+
+EXPORT_C RString RStringPool::String(RStringToken aString) const
+/** Creates an RString from the supplied RStringToken.
+
+@param aString The string token
+@return Initialised RString object */
+	{
+	RString r;
+	r.iPool = *this;
+	r.iVal = aString.iVal;
+	return r;
+	}
+
+EXPORT_C RString RStringPool::String(TInt aIndex,const TStringTable& aTable) const
+/** Gets a case-sensitive string specified by a string table enumeration value.
+
+aIndex is interpreted as an offset into the handle's pre-loaded string table.
+
+@param	aIndex The string table enumeration value
+@param	aTable The string table from which to read the string
+@return	Initialised RString object
+@panic	EStringTableNotFound If the table supplied is not found. This panic is raised in debug builds only, in release mode the behaviour is undefined*/
+	{
+	__ASSERT_DEBUG(aTable.iCaseSensitive==1,StringPoolPanic::Panic(StringPoolPanic::ECreatingStringWithWrongCase));
+	if(aIndex <(TInt)aTable.iCount)
+		{//the index is in valid range the index
+		RString r;
+		r.iPool = *this;
+		TInt16 tableUid = iImplementation->TableUid(aTable);
+		__ASSERT_DEBUG(tableUid!=KErrNotFound,StringPoolPanic::Panic(StringPoolPanic::EStringTableNotFound));
+		r.iVal = StringUtils::ValFromIndex(aIndex, tableUid);
+		TInt originalVal;
+		if (KErrNotFound!=(originalVal=iImplementation->FindFirstValFromDuplicate(r.iVal)))
+			{
+			r.iVal=originalVal;
+			}
+		return r;
+		}
+	else // the index is out of range
+	return RString();
+	}
+
+EXPORT_C RStringF RStringPool::StringF(RStringTokenF aString) const
+/** Creates a RStringF from the supplied RStringToken.
+
+@param aString The value of the string
+@return Initialised RStringF object */
+	{
+	RStringF r;
+	r.iPool = *this;
+	r.iVal = aString.iVal;
+	return r;
+	}
+
+EXPORT_C RStringF RStringPool::StringF(TInt aIndex,const TStringTable& aTable) const
+/** Gets a case-insensitive string specified by a string table enumeration value.
+
+Creates an RStringF from a string table enumeration value.
+
+aIndex is interpreted as an offset into the handle's pre-loaded string table.
+
+@param	aIndex The string table enumeration value
+@param	aTable The string table from which to read the string
+@return	Initialised RStringF object
+@panic	EStringTableNotFound If the table supplied is not found. This panic is raised in debug builds only, in release mode the behaviour is undefined*/
+	{
+	__ASSERT_DEBUG(aTable.iCaseSensitive==0,StringPoolPanic::Panic(StringPoolPanic::ECreatingStringWithWrongCase));
+	if(aIndex <(TInt)aTable.iCount)
+		{//the index is in valid range the index
+		RStringF r;
+		r.iPool = *this;
+		TInt16 tableUid = iImplementation->TableUid(aTable);
+		__ASSERT_DEBUG(tableUid!=KErrNotFound,StringPoolPanic::Panic(StringPoolPanic::EStringTableNotFound));
+		r.iVal = StringUtils::ValFromIndexF(aIndex, tableUid);
+		TInt originalVal;
+		if (KErrNotFound!=(originalVal=iImplementation->FindFirstValFromDuplicate(r.iVal)))
+			{
+			r.iVal=originalVal;
+			}
+		return r;
+		}
+	else // the index is out of range so return an empty string
+	return RStringF();
+	}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/bafl/src/stringpoolimplementation.cpp	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,566 @@
+// Copyright (c) 2001-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+#include <e32base.h>
+#include "stringpoolimplementation.h"
+
+const TInt KMapGranularity=20;
+
+CStringPoolNode::~CStringPoolNode()
+	{
+	delete iDes;
+	}
+
+CStringPoolImplementation::CStringPoolImplementation() : iStringMapList(KMapGranularity, _FOFF(TStringIdMap, iSourceTableVal)), iStringMapListReverse(KMapGranularity, _FOFF(TStringIdMap, iTargetTableVal))
+	{
+	}
+
+CStringPoolImplementation::~CStringPoolImplementation()
+	{
+	// Look for non-expirable strings
+	TInt i;
+	for (i = 0; i < KHashModulo; i++ )
+		{
+		DeleteUndeletableStrings(iCIHashTable, i);
+		DeleteUndeletableStrings(iCSHashTable, i);
+		}
+#ifdef _DEBUG
+
+	__LOG(_L8(":Closing String Pool.\n"))
+		TBool leaksFound = EFalse;
+	// Check that the string pool is empty, or more accurately that
+	// everything in it is a pre-loaded string
+	for (i = 0; i < KHashModulo; i++ )
+		{
+		if (iCIHashTable[i])
+			{
+			for (TInt j = 0; j < iCIHashTable[i]->Count(); j++)
+				{
+				if (!StringUtils::IsTableEntry(iCIHashTable[i]->At(j).iVal))
+					{
+					if (!leaksFound)
+						{
+						__LOG(_L8("The following strings were leaked through not being Closed:\n"))
+						leaksFound = ETrue;
+						}
+
+					// Get the problem string
+					__LOG((reinterpret_cast<CStringPoolNode*>
+							(iCIHashTable[i]->At(j).iVal & KTokenToNode))->iDes->Des());
+					}
+				}
+			}
+		if (iCSHashTable[i])
+			{
+			for (TInt j = 0; j < iCSHashTable[i]->Count(); j++)
+				{
+				if (!StringUtils::IsTableEntry(iCSHashTable[i]->At(j).iVal))
+					{
+					if (!leaksFound)
+						{
+						__LOG(_L8("The following strings were leaked through not being Closed:\n"))
+						leaksFound = ETrue;
+						}
+
+					// Get the problem string
+					__LOG((reinterpret_cast<CStringPoolNode*>(
+							iCSHashTable[i]->At(j).iVal & KTokenToNode))->iDes->Des());
+					}
+				}
+			}
+		if (leaksFound)
+			__DEBUGGER();
+		}
+
+	if (!leaksFound)
+		__LOG(_L8("No leakages were detected\n"));
+
+#endif //_DEBUG
+	for (TInt ii = 0; ii < KHashModulo; ii++)
+		{
+		delete iCIHashTable[ii];
+		delete iCSHashTable[ii];
+		}
+
+	iTablePtrs.Close();
+	iStringMapList.Close();
+	iStringMapListReverse.Close();
+	iRollbackMapList.Close();
+	iRollbackHashListCS.Close();
+	iRollbackHashListCI.Close();
+	// Notify the external users of the StringPool that the object is getting closed
+	TInt cBCounter = iCallBacks.Count();
+	if(cBCounter>0)
+		{
+		while (--cBCounter>=0)
+			{
+			iCallBacks[cBCounter]->StringPoolClosing();
+			}
+		}
+	iCallBacks.Close();
+	}
+
+// Check for any undeletable string and delete them now
+void CStringPoolImplementation::DeleteUndeletableStrings(CArrayFixSeg<RStringTokenEither>* aArray[KHashModulo], TInt i)
+	{
+	if (aArray[i])
+		{
+		for (TInt j = 0; j < aArray[i]->Count(); ++j)
+			{
+			if (!StringUtils::IsTableEntry(aArray[i]->At(j).iVal))
+				{
+				CStringPoolNode* node= reinterpret_cast<CStringPoolNode*>(aArray[i]->At(j).iVal & KTokenToNode);
+				if (KMarkedForNoDeleted==node->iRefcount)
+					{
+					delete node;
+					aArray[i]->Delete(j);
+					j--;
+					}
+				}
+			}
+		}
+	}
+
+CStringPoolImplementation* CStringPoolImplementation::NewL()
+	{
+	CStringPoolImplementation* table = new (ELeave) CStringPoolImplementation();
+	return table;
+	}
+
+void CStringPoolImplementation::CleanupHashCS(TAny* aImplementation)
+	{
+	CStringPoolImplementation* imp=reinterpret_cast<CStringPoolImplementation*>(aImplementation);
+	CleanUpHash(&imp->iRollbackHashListCS, imp->iCSHashTable);
+	}
+
+void CStringPoolImplementation::CleanupHashCI(TAny* aImplementation)
+	{
+	CStringPoolImplementation* imp=reinterpret_cast<CStringPoolImplementation*>(aImplementation);
+	CleanUpHash(&imp->iRollbackHashListCI, imp->iCIHashTable);
+	}
+
+void CStringPoolImplementation::CleanUpHash(RPointerArray <RStringTokenEither>* aHashCleanup, CArrayFixSeg<RStringTokenEither>* aHash[KHashModulo])
+	{
+	if (aHashCleanup->Count()>0)
+		{
+		RStringTokenEither* token=(*aHashCleanup)[0];	// Get first entry
+		for (TInt i = 0; i < KHashModulo; i++ )
+			{
+			if (aHash[i])
+				{
+				for (TInt j = 0; j < aHash[i]->Count(); j++)
+					{
+					if (!StringUtils::IsTableEntry(aHash[i]->At(j).iVal))
+						{
+						if (aHash[i]->At(j).iVal==token->iVal)
+							{
+							CStringPoolNode* node= reinterpret_cast<CStringPoolNode*>(aHash[i]->At(j).iVal & KTokenToNode);
+							delete node;
+							aHash[i]->Delete(j);
+							aHashCleanup->Remove(0);
+							break;
+							}
+						}
+					}
+				}
+
+			}
+		}
+	}
+
+void CStringPoolImplementation::CleanupIdMap(TAny* aImplementation)
+	{
+	CStringPoolImplementation* imp=reinterpret_cast<CStringPoolImplementation*>(aImplementation);
+	if (imp->iRollbackMapList.Count()>0)
+		{
+		TStringIdMap* map=imp->iRollbackMapList[0];
+		TInt index=imp->iStringMapList.FindInUnsignedKeyOrder(*map);
+		imp->iRollbackMapList.Remove(0);
+		if (index!=KErrNotFound)
+			{
+			imp->iStringMapList.Remove(index);
+			}
+		index=imp->iStringMapListReverse.FindInUnsignedKeyOrder(*map);
+		if (index!=KErrNotFound)
+			{
+			for (TInt count=index;count<imp->iStringMapListReverse.Count();++count)
+				{
+				if (imp->iStringMapListReverse[count].iTargetTableVal==map->iTargetTableVal && imp->iStringMapListReverse[count].iSourceTableVal==map->iSourceTableVal)
+					{
+					imp->iStringMapListReverse.Remove(index);
+					}
+				}
+			}
+		}
+	}
+
+void CStringPoolImplementation::AddTableL(const TStringTable& aTable)
+	{
+	for (TInt count=0;count<iTablePtrs.Count();++count)	// check for adding the same table twice
+		{
+		if (iTablePtrs[count]==&aTable)
+			{
+			return;
+			}
+		}
+	User::LeaveIfError(iTablePtrs.Append(&aTable));	// Add the pointer to this table so we can keep track of the Table IDs. The table ID is the index in this array
+	//Is the table Case Sensitive or not?
+	TBool (*genericValFromIndex)(TInt, TUint16);
+	if (aTable.iCaseSensitive==1)
+		genericValFromIndex = StringUtils::ValFromIndex;
+	else
+		genericValFromIndex = StringUtils::ValFromIndexF;
+
+	CArrayFixSeg<RStringTokenEither>** hashTableToUse =
+	aTable.iCaseSensitive ? iCSHashTable :iCIHashTable ;
+	TInt cleanupCounter=0;
+	for (TUint i = 0; i < aTable.iCount; ++i)
+		{
+		const TStLitC8<1>* string=reinterpret_cast<const TStLitC8<1>* >(aTable.iTable[i]);
+
+		// Try to find the string in memory, maybe as a dynamic string or as a member of an another table
+		RStringTokenEither token=FindDes(*string, !aTable.iCaseSensitive);
+		if (!token.IsNull())
+			{
+			TStringIdMap map;
+			map.iSourceTableVal=StringUtils::ValFromIndex(i, (TInt16)(iTablePtrs.Count()-1),aTable.iCaseSensitive);
+			map.iTargetTableVal=token.iVal;
+
+			// Put on cleanup stack
+			User::LeaveIfError(iRollbackMapList.Append(&map));
+			TCleanupItem cleanup(CleanupIdMap, this);
+			CleanupStack::PushL(cleanup);
+			++cleanupCounter;
+
+			User::LeaveIfError(iStringMapList.InsertInUnsignedKeyOrder(map));
+
+			// Check if this is a link to a dynamic string
+			if (!StringUtils::IsTableEntry(token.iVal))
+				{
+				CStringPoolNode* node = StringUtils::NodePtr(token.iVal);
+				node->iRefcount=KMarkedForNoDeleted; // Make sure this string never gets deleted
+				}
+
+			// Now store the reverse array
+			User::LeaveIfError(iStringMapListReverse.InsertInUnsignedKeyOrderAllowRepeats(map));
+			}
+		else
+			{
+			TUint8 hash = static_cast<TUint8>(Hash(*string));
+			CArrayFixSeg<RStringTokenEither>* collisionList = hashTableToUse[hash];
+			if ( !collisionList )
+				//HashTableToUse now is used as list of all entry with the same hash
+				collisionList = hashTableToUse[hash] =
+				new (ELeave) CArrayFixSeg<RStringTokenEither>( 2 );
+			RStringTokenEither s;
+			s.iVal = genericValFromIndex(i, (TInt16)(iTablePtrs.Count()-1));
+
+			__LOG2(_L8("Table entry being added with hash %d, val %d"), hash, s.iVal);
+			__LOG(*reinterpret_cast<const TStLitC8<1>* >(aTable.iTable[i]));
+			// Put on cleanup stack
+			if (aTable.iCaseSensitive==1)
+				{
+				User::LeaveIfError(iRollbackHashListCS.Append(&s));
+				TCleanupItem cleanup(CleanupHashCS, this);
+				CleanupStack::PushL(cleanup);
+				}
+			else
+				{
+				User::LeaveIfError(iRollbackHashListCI.Append(&s));
+				TCleanupItem cleanup(CleanupHashCI, this);
+				CleanupStack::PushL(cleanup);
+				}
+
+			++cleanupCounter;
+			collisionList->AppendL(s);
+			}
+		}
+	CleanupStack::Pop(cleanupCounter);
+	iRollbackMapList.Reset();
+	iRollbackHashListCS.Reset();
+	iRollbackHashListCI.Reset();
+	}
+
+// Find FirstVal given duplicate val
+TInt32 CStringPoolImplementation::FindFirstValFromDuplicate(TInt32 aDuplicateVal) const
+	{
+	TStringIdMap map;
+	map.iSourceTableVal=aDuplicateVal;
+	TInt index=iStringMapList.FindInUnsignedKeyOrder(map);
+	if (index!=KErrNotFound)
+		return iStringMapList[index].iTargetTableVal;
+	else
+		return KErrNotFound;
+	}
+
+
+
+// Find table index Val given first val & table UID
+TInt CStringPoolImplementation::FindTableIndexFromFirstVal(TInt32 aFirstVal, TInt aTableUid) const
+	{
+	TStringIdMap map;
+	map.iTargetTableVal=aFirstVal;
+	TInt index=iStringMapListReverse.FindInUnsignedKeyOrder(map);
+	if (KErrNotFound==index)
+		return KErrNotFound;
+
+	for (TInt count=index;count<iStringMapListReverse.Count();++count)
+		{
+		if (iStringMapListReverse[count].iTargetTableVal==aFirstVal && StringUtils::TableUid(iStringMapListReverse[count].iSourceTableVal)==aTableUid)
+			{
+			return StringUtils::TableIndex(iStringMapListReverse[count].iSourceTableVal);
+			}
+		}
+		return KErrNotFound;
+	}
+
+
+// Find the UId for a given table
+TInt16 CStringPoolImplementation::TableUid(const TStringTable& aTable) const
+	{
+	for (TInt count=0; count<iTablePtrs.Count(); ++count)
+		{
+		if (iTablePtrs[count]==&aTable)
+			return (TInt16)count;
+		}
+	return KErrNotFound;
+	}
+
+// Find a reference to the table that first added the  string represented by aVal to the pool
+const TStringTable& CStringPoolImplementation::TableRef(TInt32 aVal) const
+	{
+	__ASSERT_DEBUG(aVal!=0, StringPoolPanic::Panic(StringPoolPanic::EIllegalUseOfNullString));
+	TInt16 tableUid=(TInt16)(aVal>>20);
+	const TStringTable* theTableRef=(iTablePtrs[tableUid]);
+	return  *theTableRef;
+	}
+
+// Find the descriptor for a given table and index
+const TDesC8& CStringPoolImplementation::TableLookup(TInt aIndex, TInt aTableUid) const
+	{
+	return *reinterpret_cast<const TStLitC8<1>*>(iTablePtrs[aTableUid]->iTable[aIndex]);
+	}
+
+
+// Lookup with allocating
+//
+RStringTokenEither
+CStringPoolImplementation::OpenL( const TDesC8& aAttributeName,
+								  TBool aCaseInsensitive)
+	{
+	// lookup the attribute
+	RStringTokenEither s(FindDes( aAttributeName , aCaseInsensitive));
+	if (!s.IsNull())
+		{
+		if (!StringUtils::IsTableEntry(s.iVal))
+			{
+
+			CStringPoolNode* node = StringUtils::NodePtr(s.iVal);
+			if (KMarkedForNoDeleted!=node->iRefcount)
+				node->iRefcount++;
+			__LOG1(_L8("String copied (during open). Count is now %d"), node->iRefcount);
+			__LOG(*node->iDes);
+			}
+		return s;
+		}
+
+	// create a new node at the end of the appropriate array
+	CStringPoolNode* newnode = new (ELeave) CStringPoolNode();
+	CleanupStack::PushL( newnode );
+	newnode->iDes = aAttributeName.AllocL();
+	newnode->iRefcount = 1;
+
+	TInt hash = Hash( aAttributeName );
+	CArrayFixSeg<RStringTokenEither>** hashTableToUse =
+		aCaseInsensitive ? iCIHashTable : iCSHashTable;
+	__LOG2(_L8("Newly added with hash value %d, node val 0x%x\n"), hash, newnode)
+	__LOG(aAttributeName);
+
+	newnode->iHash = static_cast<TUint8>(hash);
+	CArrayFixSeg<RStringTokenEither>* collisionList = hashTableToUse[hash];
+	if ( !collisionList )
+		collisionList = hashTableToUse[hash] = new (ELeave) CArrayFixSeg<RStringTokenEither>( 2 );
+
+	s.iVal = reinterpret_cast<TUint32>(newnode);
+	if (aCaseInsensitive)
+		s.iVal += 2;
+	collisionList->AppendL(s);
+
+	CleanupStack::Pop(); // newnode
+
+	return s;
+	}
+
+void CStringPoolImplementation::Close(RStringTokenEither aString)
+	{
+	if (StringUtils::IsTableEntry(aString.iVal))
+		return;
+
+	CStringPoolNode* node = StringUtils::NodePtr(aString.iVal);
+	if (KMarkedForNoDeleted == node->iRefcount)	// -1 means a non-expirable string
+		return;
+	if (--node->iRefcount == 0)
+		{
+		//this is  the last reference of this string
+		CArrayFixSeg<RStringTokenEither>** hashTableToUse =
+		aString.iVal & 2 ? iCIHashTable : iCSHashTable;
+
+		// Delete the node and delete the entry in the relevant collision list
+		CArrayFixSeg<RStringTokenEither>* collisionList = hashTableToUse[node->iHash];
+		TInt count = collisionList->Count();
+		for (TInt i = 0; i < count; i++)
+			{
+			if (collisionList->At(i) == aString)
+				{
+				// Log the fact that a string reference is about to die...
+				__LOG1(_L8("Removing string with hash value %d\n"), node->iHash)
+				__LOG(node->iDes->Des());
+				collisionList->Delete(i);
+				break;
+				}
+			}
+		delete node;
+		}
+	else
+		{
+		__LOG1(_L8("String closed. Count is now %d"),
+			   node->iRefcount);
+		__LOG(node->iDes->Des());
+		}
+	}
+
+void CStringPoolImplementation::IncrementCount(RStringTokenEither aString)
+	{
+	if (StringUtils::IsTableEntry(aString.iVal))
+		return;
+	CStringPoolNode* node = StringUtils::NodePtr(aString.iVal);
+	if (KMarkedForNoDeleted!=node->iRefcount)
+		node->iRefcount++;
+	__LOG1(_L8("String copied. Count is now %d"), node->iRefcount);
+	__LOG(*node->iDes);
+	}
+
+// Very simple case-sensitive comparison. We can assume that the
+// strings are the same length, and we only care if the strings are
+// the same. (Unlike normal comparison functions that also tell you
+// which one is 'smaller')
+TBool CStringPoolImplementation::CompareCS(const TDesC8& s1, const TDesC8& s2)
+	{
+	const TUint8* ptr1 = s1.Ptr();
+	const TUint8* ptr2 = s2.Ptr();
+	const TUint8* stop = &ptr1[s1.Length()];
+	for (; ptr1 < stop; ptr1++,ptr2++)
+		{
+		if (*ptr1 != *ptr2)
+			return EFalse;
+		}
+	return ETrue;
+	}
+
+// Note that the hash function must generate the same hash values for
+// strings that differ by case. If changing the algorithm here make
+// sure this is still true.
+TBool CStringPoolImplementation::CompareCI(const TDesC8& s1, const TDesC8& s2)
+	{
+	const TUint8* ptr1 = s1.Ptr();
+	const TUint8* ptr2 = s2.Ptr();
+	const TUint8* stop = &ptr1[s1.Length()];
+	for (; ptr1 < stop; ptr1++,ptr2++)
+		{
+		if (*ptr1 != *ptr2)
+			{
+			// They're not exactly the same; see if they differ only
+			// by case. If one character is a letter, we can do a
+			// comparison ignoring bit 5 in both cases. If that
+			// matches, they are the same.
+			if (!((*ptr1 & KCaseInsensitive) == (*ptr2 & KCaseInsensitive) &&
+				  (*ptr1 >= 'A' && *ptr1 <= 'Z' ||
+				   *ptr1 >= 'a' && *ptr1 <= 'z')))
+				return EFalse;
+			}
+		}
+	return ETrue;
+	}
+
+// Find the given descriptor in the hash table
+//
+RStringTokenEither
+CStringPoolImplementation::FindDes( const TDesC8& aAttributeName, TBool aCaseInsensitive)
+	{
+	CArrayFixSeg<RStringTokenEither>** hashTableToUse =
+		aCaseInsensitive ? iCIHashTable : iCSHashTable;
+	CArrayFixSeg<RStringTokenEither>* collisionList =hashTableToUse[Hash(aAttributeName)];
+	RStringPool pool;
+	TBool (*compareFunction)(const TDesC8&, const TDesC8&);
+	if (aCaseInsensitive)
+		compareFunction = CompareCI;
+	else
+		compareFunction = CompareCS;
+	pool.iImplementation = this;
+	if ( collisionList )
+		{
+		TInt length=aAttributeName.Length();
+		TInt count = collisionList->Count();
+		for ( TInt i = 0; i < count; i++ )
+			{
+			RStringTokenEither token = collisionList->At(i);
+			RStringEither s(this, token);
+			const TDesC8& string = s.DesC();
+			if ( string.Length()==length &&
+				 (*compareFunction)(aAttributeName, string))
+				return token;
+			}
+		}
+	return RStringTokenEither();
+	}
+
+
+// Generate a hash value
+//
+TUint CStringPoolImplementation::Hash( const TDesC8& aDes ) const
+	{
+	// We ignore bit 5, which is a crude way of making the hash case
+	// insensitive. This means that things that might differ only by
+	// case end up in the same bucket, and we can then worry about
+	// whether they're really the same later.
+	TInt len=aDes.Length();
+	TUint hash = 0;
+	const TUint8* ptr=aDes.Ptr();
+	for ( TInt i = 0; i < len; i++ )
+		hash = 131*hash + (*ptr++ & KCaseInsensitive);
+	return hash % KHashModulo;
+	}
+
+TInt StringUtils::ValFromIndex(TInt aIndex, TUint16 aTableId)
+	{
+	return (aTableId << 20) + (aIndex << 2) + 1;
+	}
+
+TInt StringUtils::ValFromIndexF(TInt aIndex, TUint16 aTableId)
+	{
+	return (aTableId << 20) + (aIndex << 2) + 3;
+	}
+
+TInt StringUtils::ValFromIndex(TInt aIndex, TUint16 aTableId, TBool aCaseSensitive)
+	{
+	if (aCaseSensitive)
+		return ValFromIndex(aIndex, aTableId);
+	else
+		return ValFromIndexF(aIndex, aTableId);
+	}
+void  CStringPoolImplementation::AddCallBackL( MStringPoolCloseCallBack& aCallBack)
+	{
+	User::LeaveIfError(iCallBacks.Append(&aCallBack));
+	}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/bafl/src/stringpoolimplementation.h	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,334 @@
+// Copyright (c) 2001-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+#ifndef __STRINGPOOLIMPLEMENTATION_H__
+#define __STRINGPOOLIMPLEMENTATION_H__
+
+#include <e32base.h>
+#include <stringpool.h>
+#include <stringtablesupport.h>
+
+/**
+This is an 8 bit value with every bit set except bit 5 (value
+32). The ASCII codes of upper and lower case characters differ by
+32.
+@internalComponent 
+*/
+const TUint KCaseInsensitive = 223;
+
+/**
+@internalComponent 
+*/
+const TInt KHashModulo = 32;
+
+/**
+Bit 0 represents if it is a table (set) or not (unset).
+Bit 1 represents case sensitivity (set) or not (unset)
+
+For non-static table values (dynamic strings), the remaining bits 
+are interpreted as a pointer to a CStringPoolNode (which is assumed 
+to be word aligned). 
+
+Bits 2-20 represent the table index.
+Bits 21-31 represent the table uid (that is the address of the table).
+*/
+
+/**
+Bit 1 is used in tokens to indicate case sensitivity. So mask it
+out to get the node.
+@internalComponent 
+*/
+const TUint KTokenToNode = 0xfffffffd;
+
+/**
+Determine if this id corresponds to a table.
+@internalComponent
+*/
+#define IS_TABLE_ENTRY(tableId)(tableId & 0x01)
+
+/**
+Obtain the Table Index.
+@internalComponent
+*/
+#define TABLE_INDEX(val)((val & 0xffffc)>>2)
+
+/**
+Obtain the Table UID.
+@internalComponent
+*/
+#define TABLE_UID(val)(val>>20)
+
+/**
+This is used to mark the reference count of a node so that is will not be deleted when closed
+@internalComponent
+*/
+const TUint KMarkedForNoDeleted = 0xffff;
+
+
+
+class RStringTokenEither;
+
+/**
+@internalComponent
+*/
+struct TStringIdMap
+	{
+	TInt32 iSourceTableVal;
+	TInt32 iTargetTableVal;
+	};
+
+
+/**
+Internal node class
+@internalComponent
+*/
+NONSHARABLE_CLASS(CStringPoolNode) : public CBase
+	{
+public:
+	~CStringPoolNode();
+
+ public:
+	HBufC8* iDes;
+	TUint16 iRefcount;
+	TUint8  iHash;
+	};
+
+/**
+@internalComponent
+*/
+NONSHARABLE_CLASS(CStringPoolImplementation) : public CBase
+	{
+public:
+	CStringPoolImplementation();
+	/// Destructor
+	~CStringPoolImplementation();
+
+	/// Constructs a string pool
+	static CStringPoolImplementation* NewL();
+
+	// USed for cleaning up when a OpenTableL leaves
+	static void CleanupHashCS(TAny* aImplementation);
+	static void CleanupHashCI(TAny* aImplementation);
+	static void CleanupIdMap(TAny* aImplementation);
+	static void CleanUpHash(RPointerArray <RStringTokenEither>* aHashCleanup, CArrayFixSeg<RStringTokenEither>* hash[KHashModulo]);
+
+	/// Adds a table to the pool. (Note this currently only works once)
+	void AddTableL(const TStringTable& aTable);
+	void AddCallBackL( MStringPoolCloseCallBack& aCallBack);
+
+
+	// Find FirstVal given duplicate val
+	TInt32 FindFirstValFromDuplicate(TInt32 aDuplicateVal) const;
+
+	// Find table index Val given first val & table UID
+	TInt FindTableIndexFromFirstVal(TInt32 aDuplicateVal, TInt aTableUid) const;
+
+
+	TInt16 TableUid(const TStringTable& aTable) const;
+
+	const TStringTable& TableRef(TInt32 aVal) const;
+
+	/// Looks up a particular index in the pre-loaded tables
+	const TDesC8& TableLookup(TInt aIndex, TInt aTableUid) const;
+
+	/// Finds or creates a string. Increments the reference count if needed.
+	RStringTokenEither OpenL( const TDesC8& aString, TBool aCaseInsensitive); 
+
+	/// Closes a string (decrements the reference count and deletes if 0
+	void Close(RStringTokenEither aString);
+
+	/// Increments the reference count on a string
+	void IncrementCount(RStringTokenEither aString);
+
+	inline RStringPool Handle();
+
+private:	
+
+	// Check for any undeletable string and delete them now
+	void DeleteUndeletableStrings(CArrayFixSeg<RStringTokenEither>* aArray[KHashModulo], TInt i);
+
+private:
+
+	/// Finds a string in the pool.
+	RStringTokenEither FindDes( const TDesC8& aString, TBool aCaseInsensitive);
+
+	/// Calculates a hash for a descriptor
+	TUint Hash( const TDesC8& ) const;
+
+	static TBool CompareCS(const TDesC8& s1, const TDesC8& s2);
+	static TBool CompareCI(const TDesC8& s1, const TDesC8& s2);
+
+ private:
+	/// The table.
+	CArrayFixSeg<RStringTokenEither>* iCSHashTable[KHashModulo];
+	CArrayFixSeg<RStringTokenEither>* iCIHashTable[KHashModulo];	
+	RPointerArray<TStringTable> iTablePtrs;	// Stores array of tables, where the index is the table UID
+	RArray <TStringIdMap> iStringMapList;
+	RArray <TStringIdMap> iStringMapListReverse;
+
+	// For rolling back when a leave occurs during CreateTableL
+	RPointerArray <TStringIdMap> iRollbackMapList;	
+	RPointerArray <RStringTokenEither> iRollbackHashListCS;
+	RPointerArray <RStringTokenEither> iRollbackHashListCI;
+	RPointerArray<MStringPoolCloseCallBack> iCallBacks;
+	};
+
+/** 
+An internal version of the string token class. This class can hold
+either folding or non-folding versions, and it is up to the user
+to get it right.
+@internalComponent
+*/
+class RStringTokenEither : public RStringTokenBase
+	{
+ public:
+	inline RStringTokenEither();
+
+	inline RStringTokenEither(TUint32 aVal);
+
+	/** Comparison operator
+		@param aVal The string to compare. */
+	inline TBool operator==(RStringTokenEither aVal) const;
+
+	/** Comparison operator
+		@param aVal The string to compare. */
+	inline TBool operator!=(RStringTokenEither aVal) const;
+
+	/** Assignment operator; makes a string token from a string.
+		@param aVal The string to copy */
+	inline RStringTokenEither operator=(RStringBase aVal);
+
+	friend class RStringPool;
+	friend class RStringEither;
+	friend class CStringPoolImplementation;
+	};
+
+class RStringEither : public RStringBase
+/**
+@internalComponent
+*/
+	{
+	public:
+	RStringEither(CStringPoolImplementation* aPool, RStringTokenEither aVal);
+	};
+
+class StringUtils
+/**
+@internalComponent
+*/
+	{
+ public:
+	static inline TBool IsTableEntry(TInt aVal);
+	static inline TInt TableIndex(TInt aVal);
+	static inline TInt16 TableUid(TInt aVal);
+	static inline CStringPoolNode* NodePtr(TInt aVal);
+	static TInt ValFromIndex(TInt aIndex, TUint16 aTableId);
+	static TInt ValFromIndexF(TInt aIndex, TUint16 aTableId);
+	static TInt ValFromIndex(TInt aIndex, TUint16 aTableId, TBool aCaseSensitive);
+	
+	static void LogIt(TRefByValue<const TDesC8> aFmt, ...);
+	static void LogIt1(TRefByValue<const TDesC8> aFmt);
+	};
+
+#ifndef __TOOLS2__
+#define _LOGGING
+#endif
+
+#if defined (_DEBUG) && defined (_LOGGING)
+
+/**
+HTTP Logging macros
+@internalComponent
+*/
+#define __LOG(C)			StringUtils::LogIt1(C);
+#define __LOG1(C, X)		StringUtils::LogIt(C, X);
+#define __LOG2(C, X, Y)		StringUtils::LogIt(C, X, Y);
+#define __LOG3(C, X, Y, Z)	StringUtils::LogIt(C, X, Y, Z);
+
+#else
+
+/**
+NULL macros
+@internalComponent
+*/
+#define __LOG(C)			
+#define __LOG1(C, X)		
+#define __LOG2(C, X, Y)		
+#define __LOG3(C, X, Y, Z)	
+#endif // !_DEBUG
+
+
+inline TBool StringUtils::IsTableEntry(TInt aVal)
+	{
+	return IS_TABLE_ENTRY(aVal);
+	}
+
+inline TInt StringUtils::TableIndex(TInt aVal)
+	{
+	return TABLE_INDEX(aVal);
+	}
+
+inline TInt16 StringUtils::TableUid(TInt aVal)
+	{
+	return (TInt16) TABLE_UID(aVal);
+	}
+
+inline CStringPoolNode* StringUtils::NodePtr(TInt aVal)
+	{
+	return reinterpret_cast<CStringPoolNode*>(aVal & KTokenToNode);
+	}
+
+inline RStringEither::RStringEither(CStringPoolImplementation* aPool, 
+							 RStringTokenEither aVal)
+	{
+	iPool = aPool->Handle();
+	iVal = aVal.iVal;
+	}
+
+inline RStringPool CStringPoolImplementation::Handle()
+	{
+	RStringPool p;
+	p.iImplementation = this;
+	return p;
+	}
+
+inline RStringTokenEither::RStringTokenEither()
+	{
+	}
+
+inline RStringTokenEither::RStringTokenEither(TUint32 aVal)
+	{
+	iVal = aVal;
+	}
+
+inline TBool RStringTokenEither::operator==(RStringTokenEither aVal) const
+	{
+	return iVal == aVal.iVal;
+	}
+
+inline TBool RStringTokenEither::operator!=(RStringTokenEither aVal) const
+	{
+	return iVal != aVal.iVal;
+	}
+
+inline RStringTokenEither RStringTokenEither::operator=(RStringBase aVal)
+	{
+	RStringTokenBase b = aVal;
+	iVal = b.iVal;
+	return *this;
+	}
+
+
+#endif // __STRINGPOOLIMPLEMENTATION_H__
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/bldtest/bld.inf	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,57 @@
+// Copyright (c) 1997-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+PRJ_PLATFORMS
+TOOLS2
+
+PRJ_TESTEXTENSIONS
+
+#ifdef TOOLS2
+start extension tools/x86tool
+
+	option TARGET_NAME teststatic
+	option TARGET_TYPE lib
+	option SOURCE teststatic.cpp
+end
+
+start extension tools/x86tool
+
+	option TARGET_NAME testdll
+	option TARGET_TYPE dll
+	option SOURCE testdll.cpp
+
+	option LIBS teststatic
+	option SHARED_LIBS symport
+end
+
+start extension tools/x86tool
+
+	option TARGET_NAME testexe
+	option TARGET_TYPE exe
+	option SOURCE testexe.cpp
+
+	option LIBS teststatic
+	option SHARED_LIBS symport testdll
+end
+
+start extension tools/x86tool
+
+	option TARGET_NAME testexe_main.test
+	option TARGET_TYPE exe
+	option SOURCE testexe_main.cpp
+
+	option LIBS teststatic symuser
+end
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/bldtest/test.pl	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,315 @@
+#!/usr/bin/perl
+
+# Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "Symbian Foundation License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+use strict;
+use warnings;
+use Test;
+use Getopt::Long qw(:config auto_version auto_help);
+use File::Spec::Functions;
+use File::Basename;
+use Cwd;
+
+# The following are the tests to run
+BEGIN { plan tests => 96 }
+
+# Make sure we're in the correct folder
+chdir('../bldtest') or die "Failed to set folder: $!";
+
+# Version of the script - just use the date
+$main::VERSION = '09-Oct-08';
+
+# Get command line arguments
+print "\n";
+my ( $verbose, $ignore );
+GetOptions("verbose" => \$verbose, "ignore" => \$ignore) or pod2usage(2);
+
+my $win32 = 1 if $^O =~ /MSWin32/;
+print "Running on Win32\n" if $win32 && $verbose;
+print "Running on Linux\n" if !$win32 && $verbose;
+
+# Test new build system
+my $flm = catfile($ENV{SBS_HOME}, 'lib', 'flm', 'x86tool.xml');
+my $tem = catfile($ENV{EPOCROOT}, 'epoc32', 'tools', 'makefile_templates', 'tools', 'x86tool.mk');
+
+warn "FLM $flm doesn't exist?" if !-e $flm;
+print "Testing SBSv2 with FLM\n";
+rename $tem, "$tem.disabled";
+$ENV{SBS_VERSION} = 2 if $win32;
+doCheck('deb');
+doCheck('rel');
+rename "$tem.disabled", $tem;
+
+# Disable the FLM if it exists and run test with the TEM
+print "Testing SBSv2 with TEM\n";
+rename $flm, "$flm.disabled";
+doCheck('deb');
+doCheck('rel');
+rename "$flm.disabled", $flm;
+
+# Test old build system
+print "Testing SBSv1 with TEM\n";
+if ($win32)
+	{
+	$ENV{SBS_VERSION} = 1;
+	doCheck('deb');
+	doCheck('rel');
+	}
+else
+	{
+	# No such thing on Linux - just keep Test happy
+	for(my $i = 1; $i <= 32; $i++)
+		{
+		ok(1);
+		}
+	}
+
+# ***
+# Check everything works
+#
+sub doCheck
+	{
+	my $variant = shift;
+
+	# Have to set library path for Linux
+	if (!$win32)
+		{
+		$ENV{LD_LIBRARY_PATH} =~ s[/epoc32[^:]+:/][];
+		$ENV{LD_LIBRARY_PATH} = "$ENV{EPOCROOT}epoc32/release/tools2/linux-i386/$variant:$ENV{LD_LIBRARY_PATH}";
+		}
+
+	# Build the code
+	my $sbs_ver = doBuild($variant);
+
+	# File extensions differ on Windows and Linux
+	my ( $ext_exe, $ext_dll ) = $win32 ? ( '.exe', '.dll' ) : ( '', '.so' );
+
+	# Generate string for the location of built file in epoc tree
+	my $release = catfile($ENV{EPOCROOT}, 'epoc32', 'release', 'tools2');
+	$release = catfile($release, 'linux-i386') if !$win32;
+	$release = catfile($release, '%s', '%s%s');
+
+	# The simple test should pass
+	doTest(sprintf($release, $variant, 'testexe', $ext_exe));
+	doTest(sprintf($release, $variant, 'testexe_main.test', ''));
+
+	# Check that the exe and lib have been built
+	checkExist(sprintf($release, $variant, 'testexe', $ext_exe));
+	checkExist(sprintf($release, $variant, 'testexe_main.test', ''));
+	checkExist(sprintf($release, $variant, 'libteststatic', '.a'));
+	checkExist(sprintf($release, $variant, 'libtestdll', $ext_dll));
+
+	# Check all the files exist
+	if ($sbs_ver == 1)
+		{
+		my $build = catfile($ENV{EPOCROOT}, 'epoc32', 'build', cwd(), 'wrappermakefiles', '%s', cwd(), '%s');
+		$build =~ s/\w:\\//g;
+
+		# Check the object files exist
+		checkExist(sprintf($build, $variant, 'testexe.cpp.o'));
+		checkExist(sprintf($build, $variant, 'teststatic.cpp.o'));
+		checkExist(sprintf($build, $variant, 'testdll.cpp.o'));
+
+		# Clean should delete everything
+		doClean($sbs_ver, $variant);
+	
+		# Object files should be gone now
+		checkMissing(sprintf($build, $variant, 'testexe.cpp.o'));
+		checkMissing(sprintf($build, $variant, 'teststatic.cpp.o'));
+		checkMissing(sprintf($build, $variant, 'testdll.cpp.o'));
+		}
+	else
+		{
+		my $build;
+
+		# Build location differs between the TEM and FLM
+		my $flm = catfile($ENV{SBS_HOME}, 'lib', 'flm', 'x86tool.xml');
+		if (-e $flm)
+			{
+			my $cwd = cwd();
+			$cwd =~ s/$ENV{HOME}// if $ENV{HOME};
+			$build = catfile($ENV{EPOCROOT}, 'epoc32', 'build', 'x86tools', '%s', '%s', $cwd, '%s');
+			$build =~ s/\w:\\//g;
+
+			# Check the object files exist
+			checkExist(sprintf($build, $variant, 'testexe', 'testexe.cpp.o'));
+			checkExist(sprintf($build, $variant, 'teststatic', 'teststatic.cpp.o'));
+			checkExist(sprintf($build, $variant, 'testdll', 'testdll.cpp.o'));
+	
+			# Clean should delete everything
+			doClean($sbs_ver, $variant);
+	
+			# Object files should be gone now
+			checkMissing(sprintf($build, $variant, 'testexe', 'testexe.cpp.o'));
+			checkMissing(sprintf($build, $variant, 'teststatic', 'teststatic.cpp.o'));
+			checkMissing(sprintf($build, $variant, 'testdll', 'testdll.cpp.o'));
+			}
+		else
+			{
+			$build = catfile($ENV{EPOCROOT}, 'epoc32', 'build', '%s', cwd(), '%s');
+			$build =~ s/\w:\\//g;
+
+			# Check the object files exist
+			checkExist(sprintf($build, $variant, 'testexe.cpp.o'));
+			checkExist(sprintf($build, $variant, 'teststatic.cpp.o'));
+			checkExist(sprintf($build, $variant, 'testdll.cpp.o'));
+	
+			# Clean should delete everything
+			doClean($sbs_ver, $variant);
+	
+			# Object files should be gone now
+			checkMissing(sprintf($build, $variant, 'testexe.cpp.o'));
+			checkMissing(sprintf($build, $variant, 'teststatic.cpp.o'));
+			checkMissing(sprintf($build, $variant, 'testdll.cpp.o'));
+			}
+		}
+
+	# Releaseables should be gone
+	checkMissing(sprintf($release, $variant, 'testexe', $ext_exe));
+	checkMissing(sprintf($release, $variant, 'testexe_main.test', ''));
+	checkMissing(sprintf($release, $variant, 'libteststatic', '.a'));
+	checkMissing(sprintf($release, $variant, 'libtestdll', $ext_dll));
+	}
+
+sub checkExist
+	{
+	my $file = shift;
+	print "Checking file exists: $file\n" if $verbose;
+	ok(-e $file);
+	}
+
+sub checkMissing
+	{
+	my $file = shift;
+	print "Checking file missing: $file\n" if $verbose;
+	ok(!-e $file);
+	}
+
+# ***
+# Runs test code
+#
+sub doTest
+	{
+	my $test = shift;
+	warn "Can't find test exe: $test" if (!-e $test);
+
+	my $pass;
+	if (-e $test)
+		{
+		print "Running test: $test\n" if $verbose;
+		open TEST, "$test|" or die "Failed to start test $test: $!";
+		while(<TEST>)
+			{
+			$pass = 1 if /^RTEST: SUCCESS/ or /TEST Successfully Completed/;
+			}
+		close TEST;
+		}
+	ok($pass);	
+	}
+
+# ***
+# Cleans the test code
+# *
+sub doClean
+	{
+	my $sbs_ver = shift;
+	my $variant = shift;
+
+	my $redir = $verbose?'':' >nul 2>&1';
+	print "Cleaning component for $variant\n" if $verbose;
+	if ($sbs_ver == 1)
+		{
+		# Use the old build system
+		system("bldmake bldfiles$redir");
+		system("abld test makefile tools2$redir");
+		system("abld test clean tools2 $variant$redir");
+		}
+	else
+		{
+		# Use the new build system
+		system("sbs -c tools2_$variant.test CLEAN$redir");
+		}
+	}
+
+# ***
+# Builds the test code
+# *
+sub doBuild
+	{
+	my $variant = shift;
+
+	# First of all see if SBSv2 is installed
+	my $sbs_ver = 1;
+	open SBS, 'sbs -v 2>&1|' or die "Failed to execute command: $!";
+	while(<SBS>)
+		{
+		if (/^sbs version/)
+			{
+			$sbs_ver = 2;
+			last;
+			}
+		}
+	close SBS;
+	die "This test requires SBSv2. Run with -ignore to run this test anyway" if $sbs_ver == 1 && !$ignore;
+
+	# Override the result using environment variable
+	$sbs_ver = 1 if $ENV{SBS_VERSION} && $ENV{SBS_VERSION} == 1;
+
+	# Now build the test code - assumes current working directory is correct!
+	my $redir = $verbose?'':' >nul 2>&1';
+	print "Building test code using SBSv$sbs_ver for $variant\n" if $verbose;
+	if ($sbs_ver == 1)
+		{
+		print "Building using sbsv1\n" if $verbose;
+
+		# Use the old build system
+		system("bldmake bldfiles$redir");
+		system("abld test makefile tools2$redir");
+		system("abld test clean tools2$redir");
+		system("abld test library tools2$redir");
+		system("abld test target tools2 $variant$redir");
+		}
+	else
+		{
+		print "Building using sbsv2\n" if $verbose;
+
+		# TEM can't handle parallel builds due to dependencies between extension makefiles
+		my $flm = catfile($ENV{SBS_HOME}, 'lib', 'flm', 'x86tool.xml');
+		my $jopt = (!-e $flm) ? '-j 1' : '';
+
+		# Use the new build system
+		system("sbs $jopt -c tools2_$variant.test CLEAN$redir");
+		system("sbs $jopt -c tools2_$variant.test$redir");
+		}
+
+	# Return the sbs version for later
+	return $sbs_ver;
+	}
+
+=head1 NAME
+
+test.pl - A script for running tests
+
+=head1 SYNOPSIS
+
+test.pl [-help] [-version] [-verbose] [-ignore]
+
+ Options:
+   -help      brief help message
+   -version   version of the script
+   -verbose   print what the scripts does
+   -ignore    ignore lack of SBSv2 and run tests anyway
+=cut
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/bldtest/testdll.cpp	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,77 @@
+// Copyright (c) 1997-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+#include <e32base.h>
+#include <e32std.h>
+#include <e32debug.h>
+
+#include "testdll.h"
+
+EXPORT_C CTestDll::CTestDll()
+	{
+	}
+
+EXPORT_C CTestDll::~CTestDll()
+	{
+	}
+
+void LeavingFuncL()
+	{
+	User::Leave(-777);
+	}
+
+EXPORT_C void CTestDll::LeaveL()
+	{
+	TRAPD(err, LeavingFuncL());
+	User::Leave(err);
+	}
+
+EXPORT_C TInt CTestDll::ArrayL()
+	{
+	RArray<TInt> array;
+	array.Append(1);
+	array.Append(2);
+	array.Append(3);
+
+	TInt count = array.Count();
+	array.Close();
+	return count;
+	}
+
+EXPORT_C void CTestDll::DescriptorL()
+	{
+	TBuf<256> des1;
+	TBuf<256> des2(_L("... TBuf descriptors are okay\n"));
+	des1.Format(_L("%S"), &des2);	
+	RDebug::Print(des1);
+	
+	HBufC8* hbuf1 = HBufC8::NewLC(76);
+	hbuf1->Des().Copy(_L8("... Heap descriptors are okay\n"));
+	des1.Copy(*hbuf1);
+	RDebug::Print(des1);
+
+	des1.Zero();
+	des1.AppendNum(TReal(3.14), TRealFormat());
+	RDebug::Print(_L("... The value of PI=%S\n"), &des1);
+	
+	des1.Zero();
+	des1.AppendFormat(_L("... More accurate value of PI=%e\n"), TReal(3.14159));
+	RDebug::Print(des1);
+
+	// DEF132478: libsymport.a is out of date
+	RThread().Id();
+
+	CleanupStack::PopAndDestroy(hbuf1);
+	}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/bldtest/testdll.h	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,30 @@
+// Copyright (c) 1997-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+#ifndef _TESTDLL_H__
+#define _TESTDLL_H__
+
+class CTestDll : public CBase
+	{
+public:
+	IMPORT_C CTestDll();
+	IMPORT_C ~CTestDll();
+public:
+	IMPORT_C void LeaveL();
+	IMPORT_C TInt ArrayL();
+	IMPORT_C void DescriptorL();
+	};
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/bldtest/testexe.cpp	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,80 @@
+// Copyright (c) 1997-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+#include <e32debug.h>
+#include <e32base.h>
+#include <e32hashtab.h>
+#include <e32test.h>
+
+#include "teststatic.h"
+#include "testdll.h"
+
+RTest test(_L("Simple tests"));
+
+EXPORT_C void HashL()
+	{
+	TInt in = 0x12345678;
+	TInt out = 0;
+	out = DefaultHash::Integer(in);
+	test(in != out);
+	}
+
+void DefectsL()
+	{
+	// DEF132826: symport User:Alloc family error checking
+	test(User::Alloc(-10) == NULL);
+	}
+
+void doMainL()
+	{
+	CTestDll dll;
+
+	test.Start(_L("Leaving"));
+	TRAPD(err, TestStatic::LeaveL());
+	RDebug::Print(_L("... Leave code from lib: %d\n"), err);
+	TRAP(err, dll.LeaveL());
+	RDebug::Print(_L("... Leave code from dll: %d\n"), err);
+	test(err != KErrNone);
+
+	test.Next(_L("Arrays"));
+	test(TestStatic::ArrayL() == 3);
+	test(dll.ArrayL() == 3);
+
+	test.Next(_L("Descriptors"));
+	TestStatic::DescriptorL();
+	dll.DescriptorL();
+
+	test.Next(_L("Hash"));
+	HashL();
+
+	test.Next(_L("Defects"));
+	DefectsL();
+
+	test.End();
+	}
+
+int E32Main()
+	{
+	RDebug::Print(_L("Called from E32Main\n"));
+
+	__UHEAP_MARK;
+	CTrapCleanup* theCleanup = CTrapCleanup::New();
+	TRAPD(ret, doMainL());
+	test(ret == KErrNone);
+	test.Close();
+	delete theCleanup;
+	__UHEAP_MARKEND;
+	return ret;
+	}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/bldtest/testexe_main.cpp	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,66 @@
+// Copyright (c) 1997-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+#include <e32debug.h>
+#include <e32base.h>
+#include <e32hashtab.h>
+#include <e32test.h>
+
+#include "teststatic.h"
+
+RTest test(_L("Simple tests"));
+
+EXPORT_C void HashL()
+	{
+	TInt in = 0x12345678;
+	TInt out = 0;
+	out = DefaultHash::Integer(in);
+	test(in != out);
+	}
+
+void doMainL()
+	{
+	test.Start(_L("Leaving"));
+	TRAPD(err, TestStatic::LeaveL());
+	RDebug::Print(_L("... Leave code: %d\n"), err);
+	test(err != KErrNone);
+
+	test.Next(_L("Arrays"));
+	test(TestStatic::ArrayL() == 3);
+
+	test.Next(_L("Descriptors"));
+	TestStatic::DescriptorL();
+
+	test.Next(_L("Hash"));
+	HashL();
+
+	test.End();
+	}
+
+// Note - no E32Main!
+int main(int argc, char *argv[])
+	{
+	RDebug::Print(_L("Called from main\n"));
+
+	__UHEAP_MARK;
+	CTrapCleanup* theCleanup = CTrapCleanup::New();
+	TRAPD(ret, doMainL());
+	test(ret == KErrNone);
+	test.Close();
+	delete theCleanup;
+	__UHEAP_MARKEND;
+	return ret;
+	}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/bldtest/teststatic.cpp	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,60 @@
+// Copyright (c) 1997-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+#include <e32base.h>
+#include <e32std.h>
+#include <e32debug.h>
+
+#include "teststatic.h"
+
+EXPORT_C void TestStatic::LeaveL()
+	{
+	User::Leave(-666);
+	}
+
+EXPORT_C TInt TestStatic::ArrayL()
+	{
+	RArray<TInt> array;
+	array.Append(1);
+	array.Append(2);
+	array.Append(3);
+
+	TInt count = array.Count();
+	array.Close();
+	return count;
+	}
+
+EXPORT_C void TestStatic::DescriptorL()
+	{
+	TBuf<256> des1;
+	TBuf<256> des2(_L("... TBuf descriptors are okay\n"));
+	des1.Format(_L("%S"), &des2);	
+	RDebug::Print(des1);
+	
+	HBufC8* hbuf1 = HBufC8::NewLC(76);
+	hbuf1->Des().Copy(_L8("... Heap descriptors are okay\n"));
+	des1.Copy(*hbuf1);
+	RDebug::Print(des1);
+
+	des1.Zero();
+	des1.AppendNum(TReal(3.14), TRealFormat());
+	RDebug::Print(_L("... The value of PI=%S\n"), &des1);
+	
+	des1.Zero();
+	des1.AppendFormat(_L("... More accurate value of PI=%e\n"), TReal(3.14159));
+	RDebug::Print(des1);
+
+	CleanupStack::PopAndDestroy(hbuf1);
+	}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/bldtest/teststatic.h	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,27 @@
+// Copyright (c) 1997-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+#ifndef _TESTSTATIC_H__
+#define _TESTSTATIC_H__
+
+class TestStatic
+	{
+public:
+	IMPORT_C static void LeaveL();
+	IMPORT_C static TInt ArrayL();
+	IMPORT_C static void DescriptorL();
+	};
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/charconv/framework/inc/utf.h	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,86 @@
+// Copyright (c) 1997-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+#if !defined(__UTF_H__)
+#define __UTF_H__
+
+#if !defined(__E32STD_H__)
+#include <e32std.h>
+#endif
+
+
+class CnvUtfConverter
+/** 
+Converts text between Unicode (UCS-2) and the two Unicode transformation 
+formats UTF-7 and UTF-8. There are no functions to convert directly between 
+UTF-7 and UTF-8.
+
+Objects of this class do not need to be created because all the member functions 
+are static. The four functions are passed text in the second argument and 
+output the resulting text in the first argument. Sixteen-bit descriptors are 
+used to hold text encoded in UCS-2 (i.e. normal 16 bit Unicode), and eight-bit 
+descriptors are used to hold text encoded in either of the transformation 
+formats.
+
+The conversion functions return the number of characters which were not converted 
+because the output descriptor was not long enough to hold all of the converted 
+text. This allows users of this class to perform partial conversions on an 
+input descriptor, handling the case when the input descriptor is truncated 
+mid way through a multi-byte character. The caller does not have to guess 
+how big to make the output descriptor for a given input descriptor- they 
+can simply do the conversion in a loop using a small output descriptor. The 
+ability to handle truncated descriptors is particularly useful if the caller 
+is receiving information in chunks from an external source. 
+@publishedAll
+@released
+*/
+	{
+public:
+	/** Conversion error flags. At this stage there is only one error flag 
+	- others may be added in the future. */
+	enum TError
+		{
+ 		/** The input descriptor contains a single corrupt character. This 
+ 		might occur when the input descriptor only contains some of the bytes 
+ 		of a single multi-byte character. */
+		EErrorIllFormedInput=KErrCorrupt
+		};
+	 
+	 /** Initial value for the state argument in a set of related calls to
+	ConvertToUnicode(). */
+	enum {KStateDefault=0}; 
+public:
+	// the conversion functions return either one of the TError values above, or the number of unconverted elements left at the end of the input descriptor
+	IMPORT_C static TInt ConvertFromUnicodeToUtf7(TDes8& aUtf7, const TDesC16& aUnicode, TBool aEncodeOptionalDirectCharactersInBase64);
+	static TInt ConvertFromUnicodeToUtf7(TDes8& aUtf7, const TDesC16& aUnicode, TBool aIsImapUtf7, TBool aEncodeOptionalDirectCharactersInBase64);
+	IMPORT_C static TInt ConvertFromUnicodeToUtf8(TDes8& aUtf8, const TDesC16& aUnicode);
+	static TInt ConvertFromUnicodeToUtf8(TDes8& aUtf8, const TDesC16& aUnicode, TBool aGenerateJavaConformantUtf8);
+	IMPORT_C static TInt ConvertToUnicodeFromUtf7(TDes16& aUnicode, const TDesC8& aUtf7, TInt& aState);
+	static TInt ConvertToUnicodeFromUtf7(TDes16& aUnicode, const TDesC8& aUtf7, TBool aIsImapUtf7, TInt& aState);
+	IMPORT_C static TInt ConvertToUnicodeFromUtf8(TDes16& aUnicode, const TDesC8& aUtf8);
+	static TInt ConvertToUnicodeFromUtf8(TDes16& aUnicode, const TDesC8& aUtf8, TBool aGenerateJavaConformantUtf8);
+	static TInt ConvertToUnicodeFromUtf8(TDes16& aUnicode, const TDesC8& aUtf8, TBool aGenerateJavaConformantUtf8,
+			TInt& aNumberOfUnconvertibleCharacters, TInt& aIndexOfFirstByteOfFirstUnconvertibleCharacter);
+
+	IMPORT_C static HBufC8* ConvertFromUnicodeToUtf7L(const TDesC16& aUnicode,TBool aEncodeOptionalDirectCharactersInBase64);
+	IMPORT_C static HBufC8* ConvertFromUnicodeToUtf8L(const TDesC16& aUnicode);
+	IMPORT_C static HBufC16* ConvertToUnicodeFromUtf7L(const TDesC8& aUtf7); 
+	IMPORT_C static HBufC16* ConvertToUnicodeFromUtf8L(const TDesC8& aUtf8);
+
+
+	};
+
+#endif
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/charconv/framework/src/charconv/utf.cpp	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,1437 @@
+// Copyright (c) 1997-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+#include <e32std.h>
+#include <e32base.h>
+#include <utf.h>
+
+const TUint KNotInBase64Alphabet=KMaxTUint;
+
+enum TPanic
+	{
+	EPanicBad6BitNumber=1,
+	EPanicBadUtf7Pointers1,
+	EPanicBadUtf7Pointers2,
+	EPanicBadUtf7Pointers3,
+	EPanicBadUtf7Pointers4,
+	EPanicBadUtf7Pointers5,
+	EPanicBadUtf7Pointers6,
+	EPanicBadUtf7Pointers7,
+	EPanicBadUtf7Pointers8,
+	EPanicBadUtf7Pointers9,
+	EPanicBadUtf7Pointers10,
+	EPanicBadUtf7Pointers11,
+	EPanicNotInBase64Block,
+	EPanicBadUnicodePointers1,
+	EPanicBadUnicodePointers2,
+	EPanicBadUnicodePointers3,
+	EPanicBadUnicodePointers4,
+	EPanicBadUnicodePointers5,
+	EPanicBadUnicodePointers6,
+	EPanicBadUnicodePointers7,
+	EPanicBadUnicodePointers8,
+	EPanicBadUnicodePointers9,
+	EPanicBadUnicodePointers10,
+	EPanicBadBitBufferState1,
+	EPanicBadBitBufferState2,
+	EPanicBadBitBufferState3,
+	EPanicBadBitBufferState4,
+	EPanicBadBitBufferState5,
+	EPanicBadBitBufferState6,
+	EPanicBadBitBufferState7,
+	EPanicBadBitBufferState8,
+	EPanicBadBitBufferState9,
+	EPanicBadBitBufferState10,
+	EPanicBadBitBufferState11,
+	EPanicBadBitBufferState12,
+	EPanicBadBitBufferState13,
+	EPanicBadBitBufferState14,
+	EPanicBadBitBufferState15,
+	EPanicBadBitBufferState16,
+	EPanicBadBitBufferState17,
+	EPanicUnexpectedNumberOfLoopIterations,
+	EPanicInitialEscapeCharacterButNoBase64,
+	EPanicBase64SequenceDoesNotFallOnUnicodeCharacterBoundary,
+	EPanicBadUtf8Pointers1,
+	EPanicBadUtf8Pointers2,
+	EPanicBadUtf8Pointers3,
+	EPanicBadUtf8Pointers4,
+	EPanicBadUtf8Pointers5,
+	EPanicBadUtf8Pointers6,
+	EPanicBadUtf8Pointers7,
+	EPanicOutOfSyncUtf7Byte1,
+	EPanicOutOfSyncUtf7Byte2,
+	EPanicOutOfSyncBase64Decoding
+	};
+
+_LIT(KLitPanicText, "CHARCONV-UTF");
+
+LOCAL_C void Panic(TPanic aPanic)
+	{
+	User::Panic(KLitPanicText, aPanic);
+	}
+
+inline TUint EscapeCharacterForStartingBase64Block(TBool aIsImapUtf7) {return aIsImapUtf7? '&': '+';}
+
+LOCAL_C TUint Base64Decoding(TUint aMemberOfBase64Alphabet, TBool aIsImapUtf7)
+	{
+	if ((aMemberOfBase64Alphabet>='A') && (aMemberOfBase64Alphabet<='Z'))
+		{
+		return aMemberOfBase64Alphabet-'A';
+		}
+	if ((aMemberOfBase64Alphabet>='a') && (aMemberOfBase64Alphabet<='z'))
+		{
+		return aMemberOfBase64Alphabet-('a'-26);
+		}
+	if ((aMemberOfBase64Alphabet>='0') && (aMemberOfBase64Alphabet<='9'))
+		{
+		return aMemberOfBase64Alphabet+((26*2)-'0');
+		}
+	if (aMemberOfBase64Alphabet=='+')
+		{
+		return 62;
+		}
+	if (aMemberOfBase64Alphabet==STATIC_CAST(TUint, aIsImapUtf7? ',': '/'))
+		{
+		return 63;
+		}
+	return KNotInBase64Alphabet;
+	}
+
+LOCAL_C TUint Base64Encoding(TUint a6BitNumber, TBool aIsImapUtf7)
+	{
+	__ASSERT_DEBUG(a6BitNumber<64, Panic(EPanicBad6BitNumber));
+	if ((a6BitNumber==63) && aIsImapUtf7)
+		{
+		return ',';
+		}
+	static const TUint8 base64Alphabet[64]={'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/'};
+	return base64Alphabet[a6BitNumber];
+	}
+
+LOCAL_C TUint8* PointerToEscapeCharacterStartingBase64Block(TUint8* aPointerToUtf7Byte, const TUint8* aPointerToFirstUtf7Byte, TBool aIsImapUtf7)
+	{
+	__ASSERT_DEBUG(aPointerToUtf7Byte>=aPointerToFirstUtf7Byte, Panic(EPanicBadUtf7Pointers1));
+	TUint8* pointerToCandidateEscapeCharacter=NULL;
+	FOREVER
+		{
+		const TUint utf7Byte=*aPointerToUtf7Byte;
+		if (utf7Byte==EscapeCharacterForStartingBase64Block(aIsImapUtf7))
+			{
+			pointerToCandidateEscapeCharacter=aPointerToUtf7Byte;
+			}
+		else if (Base64Decoding(utf7Byte, aIsImapUtf7)==KNotInBase64Alphabet)
+			{
+			break;
+			}
+		__ASSERT_DEBUG(aPointerToUtf7Byte>=aPointerToFirstUtf7Byte, Panic(EPanicBadUtf7Pointers2));
+		if (aPointerToUtf7Byte<=aPointerToFirstUtf7Byte)
+			{
+			break;
+			}
+		--aPointerToUtf7Byte;
+		}
+	__ASSERT_DEBUG(pointerToCandidateEscapeCharacter!=NULL, Panic(EPanicNotInBase64Block));
+	return pointerToCandidateEscapeCharacter;
+	}
+
+LOCAL_C TBool EncodeInUtf7Directly(TUint aUnicodeCharacter, TBool aIsImapUtf7, TBool aEncodeOptionalDirectCharactersInBase64)
+	{
+	if (aIsImapUtf7)
+		{
+		return (aUnicodeCharacter>=0x0020) && (aUnicodeCharacter<=0x007e);
+		}
+	if ((aUnicodeCharacter>=0x0021) && (aUnicodeCharacter<=0x007d))
+		{
+		if (aEncodeOptionalDirectCharactersInBase64)
+			{
+			return (((aUnicodeCharacter>=0x0041) && (aUnicodeCharacter<=0x005a)) ||
+					((aUnicodeCharacter>=0x0061) && (aUnicodeCharacter<=0x007a)) ||
+					((aUnicodeCharacter>=0x0027) && (aUnicodeCharacter<=0x0029)) ||
+					((aUnicodeCharacter>=0x002b) && (aUnicodeCharacter<=0x003a)) ||
+					(aUnicodeCharacter==0x003f));
+			}
+		return aUnicodeCharacter!=0x005c;
+		}
+	return (aUnicodeCharacter==0x0020) || (aUnicodeCharacter==0x0009) || (aUnicodeCharacter==0x000d) || (aUnicodeCharacter==0x000a);
+	}
+
+inline TBool BitBufferContainsNonZeroBits(TUint aBitBuffer, TInt aNumberOfBitsInBuffer)
+	{
+	return (aBitBuffer&((1<<aNumberOfBitsInBuffer)-1))!=0;
+	}
+
+
+
+/**  Converts Unicode text into UTF-7 encoding. The fucntion leaves with
+KErrCorrupt if the input string is corrupt.
+
+@param aUnicode A UCS-2 encoded input string.
+@param aEncodeOptionalDirectCharactersInBase64  If ETrue then
+characters from UTF-7 set O (optional direct characters) are encoded in
+Modified Base64. If EFalse the characters are encoded directly,
+as their ASCII equivalents.
+@return A descriptor containing the UTF-7 encoded output string. */
+EXPORT_C HBufC8* CnvUtfConverter::ConvertFromUnicodeToUtf7L(
+										const TDesC16& aUnicode,
+										TBool aEncodeOptionalDirectCharactersInBase64)
+	{
+	// If aUnicode is  Null string, return an empty HBufC
+	if (aUnicode.Length() == 0)
+		{
+		HBufC8* hBuf8 = HBufC8::NewL(1);
+		return hBuf8;
+		}
+
+	// Otherwise, convert and store result in a buffer, reallocating that buffer if needed.
+	TInt length = aUnicode.Length();
+	const TInt bufsize = 100;
+
+	TPtrC16 unicode (aUnicode);
+	TBuf8<bufsize> buf;
+	HBufC8* hBuf8 = HBufC8::NewLC(length);
+	TPtr8 utf7 = hBuf8->Des();
+
+	FOREVER
+		{
+		TInt unconverted = ConvertFromUnicodeToUtf7(buf, unicode, aEncodeOptionalDirectCharactersInBase64);
+		if( unconverted == EErrorIllFormedInput || unconverted < 0)
+			User::Leave(KErrCorrupt);
+
+		if (utf7.Length() + buf.Length() > utf7.MaxLength())
+			{
+			// Reallocate the hBuf8
+			hBuf8 = hBuf8->ReAllocL(utf7.Length() + buf.Length());
+			CleanupStack::Pop();
+			CleanupStack::PushL(hBuf8);
+			utf7.Set(hBuf8->Des());
+			}
+		utf7.Append(buf);
+		if (unconverted ==0)
+			break;
+		unicode.Set(unicode.Right(unconverted));
+		}
+	CleanupStack::Pop();
+	return hBuf8;
+
+	}
+
+/** Converts Unicode text into UTF-7 encoding.
+
+@param aUtf7 On return, contains the UTF-7 encoded output string.
+@param aUnicode A UCS-2 encoded input string.
+@param aEncodeOptionalDirectCharactersInBase64 If ETrue then characters from
+UTF-7 set O (optional direct characters) are encoded in Modified Base64. If
+EFalse the characters are encoded directly, as their ASCII equivalents.
+@return The number of unconverted characters left at the end of the input
+descriptor, or one of the error values defined in TError. */
+EXPORT_C TInt CnvUtfConverter::ConvertFromUnicodeToUtf7(
+										TDes8& aUtf7,
+										const TDesC16& aUnicode,
+										TBool aEncodeOptionalDirectCharactersInBase64)
+	{
+	return ConvertFromUnicodeToUtf7(aUtf7, aUnicode, EFalse, aEncodeOptionalDirectCharactersInBase64);
+	}
+
+TInt CnvUtfConverter::ConvertFromUnicodeToUtf7(TDes8& aUtf7,
+											   const TDesC16& aUnicode,
+											   TBool aIsImapUtf7,
+											   TBool aEncodeOptionalDirectCharactersInBase64)
+	{
+	if (aUnicode.Length()==0)
+		{
+		aUtf7.SetLength(0);
+		return 0;
+		}
+	if (aUtf7.MaxLength()==0)
+		{
+		return aUnicode.Length();
+		}
+	const TUint escapeCharacterForStartingBase64Block=EscapeCharacterForStartingBase64Block(aIsImapUtf7);
+	TUint8* pointerToPreviousUtf7Byte=CONST_CAST(TUint8*, aUtf7.Ptr()-1);
+	const TUint8* const pointerToLastUtf7Byte=pointerToPreviousUtf7Byte+aUtf7.MaxLength();
+	const TUint16* pointerToPreviousUnicodeCharacter=aUnicode.Ptr()-1;
+	const TUint16* const pointerToLastUnicodeCharacter=pointerToPreviousUnicodeCharacter+aUnicode.Length();
+	const TUint KIsInBase64Block=0x80000000u;
+	TUint bitBuffer=0;
+	TInt numberOfBitsInBuffer=0;
+	FOREVER
+		{
+		__ASSERT_DEBUG(pointerToPreviousUtf7Byte<=pointerToLastUtf7Byte, Panic(EPanicBadUtf7Pointers3));
+		__ASSERT_DEBUG(pointerToPreviousUnicodeCharacter<=pointerToLastUnicodeCharacter, Panic(EPanicBadUnicodePointers1));
+		TUint currentUnicodeCharacter=(pointerToPreviousUnicodeCharacter==pointerToLastUnicodeCharacter)? 0: *(pointerToPreviousUnicodeCharacter+1);
+		if ((pointerToPreviousUnicodeCharacter==pointerToLastUnicodeCharacter) || EncodeInUtf7Directly(currentUnicodeCharacter, aIsImapUtf7, aEncodeOptionalDirectCharactersInBase64))
+			{
+			__ASSERT_DEBUG((bitBuffer&KIsInBase64Block) || (numberOfBitsInBuffer==0), Panic(EPanicBadBitBufferState1));
+			__ASSERT_DEBUG((numberOfBitsInBuffer==0) || (numberOfBitsInBuffer==2) || (numberOfBitsInBuffer==4), Panic(EPanicBadBitBufferState2));
+			if (bitBuffer&KIsInBase64Block)
+				{
+				if (numberOfBitsInBuffer!=0)
+					{
+					if (pointerToLastUtf7Byte-pointerToPreviousUtf7Byte<2) // make sure there is enough space for the trailing '-' as well as the remains of the bitBuffer as the KIsInBase64Block flag is about to turned off, thus the trailing '-' may never get written
+						{
+						break;
+						}
+					++pointerToPreviousUtf7Byte;
+					*pointerToPreviousUtf7Byte=STATIC_CAST(TUint8, Base64Encoding((bitBuffer<<(6-numberOfBitsInBuffer))&0x3f, aIsImapUtf7));
+					}
+				else
+					{
+					if (pointerToPreviousUtf7Byte==pointerToLastUtf7Byte)
+						{
+						break;
+						}
+					}
+				++pointerToPreviousUtf7Byte;
+				*pointerToPreviousUtf7Byte='-';
+				bitBuffer=0;
+				numberOfBitsInBuffer=0;
+				}
+			__ASSERT_DEBUG(pointerToPreviousUnicodeCharacter<=pointerToLastUnicodeCharacter, Panic(EPanicBadUnicodePointers2));
+			if (pointerToPreviousUnicodeCharacter>=pointerToLastUnicodeCharacter)
+				{
+				break;
+				}
+			__ASSERT_DEBUG(pointerToPreviousUtf7Byte<=pointerToLastUtf7Byte, Panic(EPanicBadUtf7Pointers4));
+			if (pointerToLastUtf7Byte-pointerToPreviousUtf7Byte<((currentUnicodeCharacter==escapeCharacterForStartingBase64Block)? 2: 1))
+				{
+				break;
+				}
+			++pointerToPreviousUtf7Byte;
+			*pointerToPreviousUtf7Byte=STATIC_CAST(TUint8, currentUnicodeCharacter);
+			++pointerToPreviousUnicodeCharacter;
+			if (currentUnicodeCharacter==escapeCharacterForStartingBase64Block)
+				{
+				++pointerToPreviousUtf7Byte;
+				*pointerToPreviousUtf7Byte='-';
+				}
+			}
+		else
+			{
+			{
+			TInt numberOfUtf7BytesRequired=(numberOfBitsInBuffer+16)/6; // "(numberOfBitsInBuffer+16)/6" is the number of iterations that will happen in the while loop below
+			if (~bitBuffer&KIsInBase64Block)
+				{
+				++numberOfUtf7BytesRequired; // for the initial escapeCharacterForStartingBase64Block
+				}
+			if (pointerToLastUtf7Byte-pointerToPreviousUtf7Byte<numberOfUtf7BytesRequired)
+				{
+				break;
+				}
+			}
+			if (~bitBuffer&KIsInBase64Block)
+				{
+				__ASSERT_DEBUG(pointerToPreviousUtf7Byte<pointerToLastUtf7Byte, Panic(EPanicBadUtf7Pointers5));
+				++pointerToPreviousUtf7Byte;
+				*pointerToPreviousUtf7Byte=STATIC_CAST(TUint8, escapeCharacterForStartingBase64Block);
+				}
+			bitBuffer<<=16;
+			bitBuffer|=currentUnicodeCharacter;
+			numberOfBitsInBuffer+=16;
+			++pointerToPreviousUnicodeCharacter;
+			__ASSERT_DEBUG(numberOfBitsInBuffer<=20, Panic(EPanicBadBitBufferState3));
+			while (numberOfBitsInBuffer>=6)
+				{
+				numberOfBitsInBuffer-=6;
+				__ASSERT_DEBUG(pointerToPreviousUtf7Byte<pointerToLastUtf7Byte, Panic(EPanicBadUtf7Pointers6));
+				++pointerToPreviousUtf7Byte;
+				*pointerToPreviousUtf7Byte=STATIC_CAST(TUint8, Base64Encoding((bitBuffer>>numberOfBitsInBuffer)&0x3f, aIsImapUtf7));
+				}
+			bitBuffer&=((1<<numberOfBitsInBuffer)-1); // zero all the consumed bits - not strictly necessary but it leaves the buffer in a cleaner state
+			bitBuffer|=KIsInBase64Block;
+			}
+		}
+	__ASSERT_DEBUG((bitBuffer&KIsInBase64Block) || (numberOfBitsInBuffer==0), Panic(EPanicBadBitBufferState4));
+	__ASSERT_DEBUG((numberOfBitsInBuffer==0) || (numberOfBitsInBuffer==2) || (numberOfBitsInBuffer==4), Panic(EPanicBadBitBufferState5));
+	if (bitBuffer&KIsInBase64Block)
+		{
+#if defined(_DEBUG)
+		TInt numberOfLoopIterations=1;
+#endif
+		FOREVER // there should never be more than 2 iterations of this loop - the first "if" should always succeed the second time if it doesn't succeed the first time
+			{
+			__ASSERT_DEBUG(pointerToPreviousUtf7Byte<=pointerToLastUtf7Byte, Panic(EPanicBadUtf7Pointers7));
+			__ASSERT_DEBUG((numberOfBitsInBuffer==0) || (numberOfBitsInBuffer==2) || (numberOfBitsInBuffer==4), Panic(EPanicBadBitBufferState6));
+			__ASSERT_DEBUG(numberOfLoopIterations<=2, Panic(EPanicUnexpectedNumberOfLoopIterations));
+#if defined(_DEBUG)
+			++numberOfLoopIterations;
+#endif
+			if (pointerToLastUtf7Byte-pointerToPreviousUtf7Byte>=((numberOfBitsInBuffer==0)? 1: 2)) // if there's room to finish off the base-64 sequence by (i) flushing the bit-buffer and (ii) appending the trailing '-'
+				{
+				if (numberOfBitsInBuffer!=0)
+					{
+					__ASSERT_DEBUG(pointerToPreviousUtf7Byte<pointerToLastUtf7Byte, Panic(EPanicBadUtf7Pointers8));
+					++pointerToPreviousUtf7Byte;
+					*pointerToPreviousUtf7Byte=STATIC_CAST(TUint8, Base64Encoding((bitBuffer<<(6-numberOfBitsInBuffer))&0x3f, aIsImapUtf7));
+					}
+				__ASSERT_DEBUG(pointerToPreviousUtf7Byte<pointerToLastUtf7Byte, Panic(EPanicBadUtf7Pointers9));
+				++pointerToPreviousUtf7Byte;
+				*pointerToPreviousUtf7Byte='-';
+				break;
+				}
+			// it is now necessary to move back pointerToPreviousUtf7Byte so that the base-64 sequence can be terminated - note it must be terminated on a Unicode character boundary hence the reason why pointerToPreviousUnicodeCharacter may be moved back too
+			TUint8* pointerToEscapeCharacterStartingBase64Block=PointerToEscapeCharacterStartingBase64Block(pointerToPreviousUtf7Byte, aUtf7.Ptr(), aIsImapUtf7);
+			const TInt oldNumberOfBase64Characters=pointerToPreviousUtf7Byte-pointerToEscapeCharacterStartingBase64Block;
+			__ASSERT_DEBUG(oldNumberOfBase64Characters>0, Panic(EPanicInitialEscapeCharacterButNoBase64));
+			__ASSERT_DEBUG(((oldNumberOfBase64Characters*6)+numberOfBitsInBuffer)%16==0, Panic(EPanicBase64SequenceDoesNotFallOnUnicodeCharacterBoundary));
+			pointerToPreviousUnicodeCharacter-=((oldNumberOfBase64Characters*6)+numberOfBitsInBuffer)/16; // move back pointerToPreviousUnicodeCharacter to before the equivalent of the base-64 sequence
+			pointerToPreviousUtf7Byte=pointerToEscapeCharacterStartingBase64Block;
+			__ASSERT_DEBUG(*pointerToPreviousUtf7Byte==escapeCharacterForStartingBase64Block, Panic(EPanicBadUtf7Pointers10));
+			if (oldNumberOfBase64Characters<4) // if the new base-64 sequence will be so short that it won't even be able to contain the UTF-7 encoding of a single Unicode character
+				{
+				--pointerToPreviousUtf7Byte; // move back pointerToPreviousUtf7Byte to before the escapeCharacterForStartingBase64Block
+				break;
+				}
+			const TInt newNumberOfUnicodeCharacters=((oldNumberOfBase64Characters-1)*3)/8;
+			pointerToPreviousUnicodeCharacter+=newNumberOfUnicodeCharacters;
+			pointerToPreviousUtf7Byte+=((newNumberOfUnicodeCharacters*8)+2)/3;
+			const TInt numberOfBitsToBeZeroedInLastBase64Character=(newNumberOfUnicodeCharacters%3)*2;
+			if (numberOfBitsToBeZeroedInLastBase64Character!=0)
+				{
+				*pointerToPreviousUtf7Byte=STATIC_CAST(TUint8, Base64Encoding(Base64Decoding(*pointerToPreviousUtf7Byte, aIsImapUtf7)&0x3f&~((1<<numberOfBitsToBeZeroedInLastBase64Character)-1), aIsImapUtf7));
+				}
+			bitBuffer=KIsInBase64Block;
+			numberOfBitsInBuffer=0;
+			}
+		}
+	aUtf7.SetLength((pointerToPreviousUtf7Byte-aUtf7.Ptr())+1);
+	return pointerToLastUnicodeCharacter-pointerToPreviousUnicodeCharacter;
+	}
+
+
+
+/** Converts Unicode text into UTF-8 encoding.
+
+@param aUtf8 On return, contains the UTF-8 encoded output string.
+@param aUnicode The Unicode-encoded input string.
+@return The number of unconverted characters left at the end of the input
+descriptor, or one of the error values defined in TError. */
+EXPORT_C TInt CnvUtfConverter::ConvertFromUnicodeToUtf8(TDes8& aUtf8, const TDesC16& aUnicode)
+	{
+	return ConvertFromUnicodeToUtf8(aUtf8, aUnicode, EFalse);
+	}
+
+
+/**  Converts Unicode text into UTF-8 encoding.
+
+The variant of UTF-8 used internally by Java differs slightly from
+standard UTF-8. The TBool argument controls the UTF-8
+variant generated by this function. This function leaves with a
+KErrCorrupt if the input string is corrupt.
+
+@param aUnicode A UCS-2 encoded input string.
+@return A pointer to an HBufC8 containing the converted UTF8. */
+EXPORT_C HBufC8* CnvUtfConverter::ConvertFromUnicodeToUtf8L(const TDesC16& aUnicode)
+ 	{
+	// If aUnicode is  Null string, return an empty HBufC
+	if (aUnicode.Length() == 0)
+		{
+		HBufC8* hBuf8 = HBufC8::NewL(1);
+		return hBuf8;
+		}
+
+	// Otherwise, convert and store result in a buffer, reallocating that buffer if needed.
+	const TInt length = aUnicode.Length();
+	const TInt bufsize = 100;
+
+	TPtrC16 unicode (aUnicode);
+	TBuf8<bufsize> buf;
+	HBufC8* hBuf8 = HBufC8::NewLC(length);
+	TPtr8 utf8 = hBuf8->Des();
+
+	FOREVER
+		{
+		TInt unconverted = ConvertFromUnicodeToUtf8(buf, unicode);
+		if( unconverted == EErrorIllFormedInput || unconverted < 0)
+			User::Leave(KErrCorrupt);
+
+		if (utf8.Length() + buf.Length() > utf8.MaxLength())
+			{
+			// Reallocate the hBuf8
+			hBuf8 = hBuf8->ReAllocL(utf8.Length() + buf.Length());
+			CleanupStack::Pop();
+			CleanupStack::PushL(hBuf8);
+			utf8.Set(hBuf8->Des());
+			}
+		utf8.Append(buf);
+		if (unconverted ==0)
+			break;
+		unicode.Set(unicode.Right(unconverted));
+		}
+	CleanupStack::Pop();
+	return hBuf8;
+	}
+
+/** Converts Unicode text into UTF-8 encoding.
+
+Surrogate pairs can be input which will result in a valid 4 byte UTF-8 value.
+
+The variant of UTF-8 used internally by Java differs slightly from standard
+UTF-8. The TBool argument controls the UTF-8 variant generated by this function.
+
+@param aUtf8 On return, contains the UTF-8 encoded output string.
+@param aUnicode A UCS-2 encoded input string.
+@param aGenerateJavaConformantUtf8 EFalse for orthodox UTF-8. ETrue for Java
+UTF-8. The default is EFalse.
+@return The number of unconverted characters left at the end of the input descriptor,
+or one of the error values defined in TError. */
+TInt CnvUtfConverter::ConvertFromUnicodeToUtf8(TDes8& aUtf8,
+											   const TDesC16& aUnicode,
+											   TBool aGenerateJavaConformantUtf8)
+	{
+	if (aUnicode.Length() == 0)
+		{
+		aUtf8.SetLength(0);
+		return 0;
+		}
+	if (aUtf8.MaxLength() == 0)
+		{
+		return aUnicode.Length();
+		}
+
+	TUint8* pUtf8 = CONST_CAST(TUint8*, aUtf8.Ptr());
+	const TUint8* pointerToLastUtf8Byte = pUtf8 + (aUtf8.MaxLength() - 1);
+	TBool inputIsTruncated = EFalse;
+	const TUint16* pUnicode = aUnicode.Ptr();
+	const TUint16* pointerToLastUnicodeCharacter = pUnicode + (aUnicode.Length() - 1);
+
+	FOREVER
+		{
+		__ASSERT_DEBUG(pUtf8 <= pointerToLastUtf8Byte, Panic(EPanicBadUtf8Pointers1));
+		__ASSERT_DEBUG(pUnicode <= pointerToLastUnicodeCharacter, Panic(EPanicBadUnicodePointers3));
+
+		if (pUnicode[0] < 0x80)
+			{
+			// ascii - 1 byte
+
+			// internally java is different since the \x0000 character is
+			// translated into \xC0 \x80.
+
+			if ((aGenerateJavaConformantUtf8) && (pUnicode[0] == 0x0000))
+				{
+				if (pUtf8 == pointerToLastUtf8Byte)
+					{
+					pUtf8--;
+					pUnicode--;
+					break;
+					}
+				*pUtf8++ = STATIC_CAST(TUint8, 0xc0);
+				*pUtf8   = STATIC_CAST(TUint8, 0x80);
+				}
+			else
+				{
+				*pUtf8 = STATIC_CAST(TUint8, pUnicode[0]);
+				}
+			}
+		else if (pUnicode[0] < 0x800)
+			{
+			// U+0080..U+07FF - 2 bytes
+
+			if (pUtf8 == pointerToLastUtf8Byte)
+				{
+				pUtf8--;
+				pUnicode--;
+				break;
+				}
+
+			*pUtf8++ = STATIC_CAST(TUint8, 0xc0|(pUnicode[0]>>6));
+			*pUtf8   = STATIC_CAST(TUint8, 0x80|(pUnicode[0]&0x3f));
+
+			}
+
+		// check to see if we have a surrogate in the stream, surrogates encode code points outside
+		// the BMP and are 4 utf-8 chars, otherwise what we have here is 3 utf-8 chars.
+
+		else if (((pUnicode[0] & 0xfc00) == 0xd800) && !aGenerateJavaConformantUtf8)
+			{
+			// surrogate pair - 4 bytes in utf-8
+			// U+10000..U+10FFFF
+
+			__ASSERT_DEBUG(pUtf8 <= pointerToLastUtf8Byte, Panic(EPanicBadUtf8Pointers2));
+			// is there enough space to hold the character
+			if ((pointerToLastUtf8Byte - pUtf8) < 3)
+				{
+				pUtf8--;
+				pUnicode--;
+				break;  // no go to the exit condition
+				}
+
+			__ASSERT_DEBUG(pUnicode <= pointerToLastUnicodeCharacter, Panic(EPanicBadUnicodePointers4));
+			if (pUnicode >= pointerToLastUnicodeCharacter)
+				{
+				pUtf8--;
+				pUnicode--;
+				inputIsTruncated = ETrue;
+				break; // middle of a surrogate pair. go to end condition
+				}
+
+			if ((pUnicode[1] & 0xfc00) != 0xdc00)
+				{
+				return EErrorIllFormedInput;
+				}
+
+			// convert utf-16 surrogate to utf-32
+			TUint ch = ((pUnicode[0] - 0xD800) << 10 | (pUnicode[1] - 0xDC00)) + 0x10000;
+
+			// convert utf-32 to utf-8
+            *pUtf8++ = STATIC_CAST(TUint8,0xf0 | (ch >> 18));
+            *pUtf8++ = STATIC_CAST(TUint8,0x80 | ((ch >> 12) & 0x3f));
+            *pUtf8++ = STATIC_CAST(TUint8,0x80 | ((ch >> 6) & 0x3f));
+            *pUtf8   = STATIC_CAST(TUint8,0x80 | (ch & 0x3f));
+
+            // we consumed 2 utf-16 values, move this pointer
+			pUnicode++;
+			}
+		else
+			{
+			// 3 byte - utf-8, U+800..U+FFFF rest of BMP.
+
+			if (pointerToLastUtf8Byte - pUtf8 < 2)
+				{
+				pUtf8--;
+				pUnicode--;
+				break;
+				}
+			*pUtf8++ = STATIC_CAST(TUint8, 0xe0|(pUnicode[0]>>12));
+			*pUtf8++ = STATIC_CAST(TUint8, 0x80|((pUnicode[0]>>6)&0x3f));
+			*pUtf8   = STATIC_CAST(TUint8, 0x80|(pUnicode[0]&0x3f));
+			}
+
+		if ((pUnicode == pointerToLastUnicodeCharacter) || (pUtf8 == pointerToLastUtf8Byte))
+			{
+			break;
+			}
+
+		pUtf8++;
+		pUnicode++;
+
+		}
+
+	if ((pUnicode < aUnicode.Ptr()) && inputIsTruncated)
+		{
+		return EErrorIllFormedInput;
+		}
+
+	aUtf8.SetLength((pUtf8 - aUtf8.Ptr())+1);
+	return pointerToLastUnicodeCharacter-pUnicode;
+	}
+
+
+
+/**  Converts text encoded using the Unicode transformation format UTF-7
+into the Unicode UCS-2 character set.
+
+@param aUtf7 The UTF-7 encoded input string.
+@return A pointer to an HBufC16 containing the converted Unicode string */
+EXPORT_C HBufC16* CnvUtfConverter::ConvertToUnicodeFromUtf7L(const TDesC8& aUtf7)
+	{
+		// If aUtf8 is an empty string return
+	if (aUtf7.Length()==0)
+		{
+		HBufC16* hBuf = HBufC16::NewL(1);
+		return hBuf;
+		}
+
+	// else convert aUtf8 to Unicode storing the result in a buffer, reallocating
+	// it when needed.
+	TInt length = aUtf7.Length();
+	const TInt bufsize = 100;
+	TInt state = KStateDefault;
+
+	TPtrC8 utf7 (aUtf7);
+	TBuf<bufsize> buf;
+	HBufC16* hBuf = HBufC16::NewLC(length);
+	TPtr unicode = hBuf->Des();
+
+	FOREVER
+		{
+		TInt unconverted = ConvertToUnicodeFromUtf7(buf, utf7, state);
+		if( unconverted == EErrorIllFormedInput || unconverted < 0)
+			User::Leave(KErrCorrupt);
+
+		if (unicode.Length() + buf.Length() > unicode.MaxLength())
+			{
+			// Reallocate hBuf
+			hBuf = hBuf->ReAllocL(unicode.Length() + buf.Length());
+			CleanupStack::Pop();
+			CleanupStack::PushL(hBuf);
+			unicode.Set(hBuf->Des());
+			}
+		unicode.Append(buf);
+		if (unconverted ==0)
+			break;
+		utf7.Set(utf7.Right(unconverted));
+		}
+	CleanupStack::Pop();
+	return hBuf;
+	}
+
+
+
+/** Converts text encoded using the Unicode transformation format UTF-7 into the
+Unicode UCS-2 character set.
+
+If the conversion is achieved using a series of calls to this function, where
+each call starts off where the previous call reached in the input descriptor,
+the state of the conversion is stored. The initial value of the state variable
+should be set as KStateDefault when the conversion is started, and afterwards
+simply passed unchanged into each function call.
+
+@param aUnicode On return, contains the Unicode encoded output string.
+@param aUtf7 The UTF-7 encoded input string.
+@param aState For the first call of the function set to KStateDefault. For
+subsequent calls, pass in the variable unchanged.
+@return The number of unconverted bytes left at the end of the input descriptor,
+or one of the error values defined in TError. */
+EXPORT_C TInt CnvUtfConverter::ConvertToUnicodeFromUtf7(TDes16& aUnicode,
+														const TDesC8& aUtf7,
+														TInt& aState)
+	{
+	return ConvertToUnicodeFromUtf7(aUnicode, aUtf7, EFalse, aState);
+	}
+
+TInt CnvUtfConverter::ConvertToUnicodeFromUtf7(TDes16& aUnicode,
+											   const TDesC8& aUtf7,
+											   TBool aIsImapUtf7,
+											   TInt& aState)
+	{
+	if (aUtf7.Length()==0)
+		{
+		aUnicode.SetLength(0);
+		return 0;
+		}
+	if (aUnicode.MaxLength()==0)
+		{
+		return aUtf7.Length();
+		}
+	const TUint escapeCharacterForStartingBase64Block=EscapeCharacterForStartingBase64Block(aIsImapUtf7);
+	TUint16* pointerToPreviousUnicodeCharacter=CONST_CAST(TUint16*, aUnicode.Ptr()-1);
+	const TUint16* pointerToLastUnicodeCharacter=pointerToPreviousUnicodeCharacter+aUnicode.MaxLength();
+	const TUint8* pointerToCurrentUtf7Byte=aUtf7.Ptr();
+	const TUint8* pointerToLastUtf7Byte=pointerToCurrentUtf7Byte+(aUtf7.Length()-1);
+	TUint currentUtf7Byte=*pointerToCurrentUtf7Byte;
+	const TUint KIsInBase64Block=0x80000000u;
+	TUint bitBuffer=STATIC_CAST(TUint, aState);
+	TInt numberOfBitsInBuffer=((bitBuffer&0xf0)>>4);
+	bitBuffer&=~0xf0; // turn off the bits that stored numberOfBitsInBuffer
+	if (bitBuffer&KIsInBase64Block)
+		{
+		__ASSERT_ALWAYS((numberOfBitsInBuffer==0) || (numberOfBitsInBuffer==2) || (numberOfBitsInBuffer==4) || ((numberOfBitsInBuffer<16) && (numberOfBitsInBuffer%2==0) && !BitBufferContainsNonZeroBits(bitBuffer, numberOfBitsInBuffer)), Panic(EPanicBadBitBufferState7));
+		__ASSERT_ALWAYS((bitBuffer&~(KIsInBase64Block|0x0000000f))==0, Panic(EPanicBadBitBufferState8));
+		}
+	else
+		{
+		__ASSERT_ALWAYS(bitBuffer==0, Panic(EPanicBadBitBufferState9));
+		__ASSERT_ALWAYS(numberOfBitsInBuffer==0, Panic(EPanicBadBitBufferState10));
+		}
+	aState=KStateDefault;
+	if (bitBuffer&KIsInBase64Block)
+		{
+		currentUtf7Byte=Base64Decoding(currentUtf7Byte, aIsImapUtf7);
+		}
+	TBool inputIsTruncated=EFalse;
+	FOREVER
+		{
+		__ASSERT_DEBUG(pointerToPreviousUnicodeCharacter<pointerToLastUnicodeCharacter, Panic(EPanicBadUnicodePointers5));
+		__ASSERT_DEBUG(pointerToCurrentUtf7Byte<=pointerToLastUtf7Byte, Panic(EPanicBadUtf7Pointers11));
+		__ASSERT_DEBUG((bitBuffer&KIsInBase64Block) || (currentUtf7Byte==*pointerToCurrentUtf7Byte), Panic(EPanicOutOfSyncUtf7Byte1));
+		__ASSERT_DEBUG((~bitBuffer&KIsInBase64Block) || (currentUtf7Byte==Base64Decoding(*pointerToCurrentUtf7Byte, aIsImapUtf7)), Panic(EPanicOutOfSyncUtf7Byte2));
+		__ASSERT_DEBUG((bitBuffer&KIsInBase64Block) || ((bitBuffer==0) && (numberOfBitsInBuffer==0)), Panic(EPanicBadBitBufferState11));
+		if ((~bitBuffer&KIsInBase64Block) && (currentUtf7Byte==escapeCharacterForStartingBase64Block))
+			{
+			if (pointerToCurrentUtf7Byte==pointerToLastUtf7Byte)
+				{
+				--pointerToCurrentUtf7Byte;
+				inputIsTruncated=ETrue;
+				goto end;
+				}
+			++pointerToCurrentUtf7Byte;
+			currentUtf7Byte=*pointerToCurrentUtf7Byte;
+			if (currentUtf7Byte=='-')
+				{
+				currentUtf7Byte=escapeCharacterForStartingBase64Block;
+				}
+			else
+				{
+				currentUtf7Byte=Base64Decoding(currentUtf7Byte, aIsImapUtf7);
+				if (currentUtf7Byte==KNotInBase64Alphabet)
+					{
+					return EErrorIllFormedInput;
+					}
+				bitBuffer=KIsInBase64Block;
+				}
+			}
+		if (bitBuffer&KIsInBase64Block)
+			{
+			FOREVER
+				{
+				__ASSERT_DEBUG(currentUtf7Byte==Base64Decoding(*pointerToCurrentUtf7Byte, aIsImapUtf7), Panic(EPanicOutOfSyncBase64Decoding));
+				__ASSERT_DEBUG((numberOfBitsInBuffer<16) || (BitBufferContainsNonZeroBits(bitBuffer, numberOfBitsInBuffer-16) && (numberOfBitsInBuffer<16+6)), Panic(EPanicBadBitBufferState12));
+				if (currentUtf7Byte==KNotInBase64Alphabet)
+					{
+					if (BitBufferContainsNonZeroBits(bitBuffer, numberOfBitsInBuffer))
+						{
+						return EErrorIllFormedInput;
+						}
+					bitBuffer=0;
+					numberOfBitsInBuffer=0;
+					currentUtf7Byte=*pointerToCurrentUtf7Byte;
+					if (currentUtf7Byte=='-')
+						{
+						if (pointerToCurrentUtf7Byte==pointerToLastUtf7Byte)
+							{
+							goto end;
+							}
+						++pointerToCurrentUtf7Byte;
+						currentUtf7Byte=*pointerToCurrentUtf7Byte;
+						}
+					break;
+					}
+				bitBuffer<<=6;
+				bitBuffer|=currentUtf7Byte;
+				bitBuffer|=KIsInBase64Block;
+				numberOfBitsInBuffer+=6;
+				// only flush the buffer if it contains a whole Unicode character and the remainder is either all zero-bits (hence would be a legal point to end the base-64 sequence) or at least 6 bits long (therefore would leave at least one UTF-7 byte unconverted at the end of the input descriptor)
+				if ((numberOfBitsInBuffer>=16+6) || ((numberOfBitsInBuffer>=16) && !BitBufferContainsNonZeroBits(bitBuffer, numberOfBitsInBuffer-16)))
+					{
+					numberOfBitsInBuffer-=16;
+					__ASSERT_DEBUG(pointerToPreviousUnicodeCharacter<pointerToLastUnicodeCharacter, Panic(EPanicBadUnicodePointers6));
+					++pointerToPreviousUnicodeCharacter;
+					*pointerToPreviousUnicodeCharacter=STATIC_CAST(TUint16, bitBuffer>>numberOfBitsInBuffer);
+					bitBuffer&=((1<<numberOfBitsInBuffer)-1); // zero all the consumed bits - must be done as bitBuffer is stored along with numberOfBitsInBuffer in aState if the output descriptor runs out of space or if the input descriptor was truncated
+					bitBuffer|=KIsInBase64Block; // turn it back on as the line above turned it off
+					if (pointerToPreviousUnicodeCharacter==pointerToLastUnicodeCharacter)
+						{
+						goto end;
+						}
+					}
+				if (pointerToCurrentUtf7Byte==pointerToLastUtf7Byte)
+					{
+					inputIsTruncated=ETrue;
+					goto end;
+					}
+				++pointerToCurrentUtf7Byte;
+				currentUtf7Byte=Base64Decoding(*pointerToCurrentUtf7Byte, aIsImapUtf7);
+				}
+			}
+		else
+			{
+			__ASSERT_DEBUG(pointerToPreviousUnicodeCharacter<pointerToLastUnicodeCharacter, Panic(EPanicBadUnicodePointers7));
+			++pointerToPreviousUnicodeCharacter;
+			*pointerToPreviousUnicodeCharacter=STATIC_CAST(TUint16, currentUtf7Byte);
+			if ((pointerToPreviousUnicodeCharacter==pointerToLastUnicodeCharacter) || (pointerToCurrentUtf7Byte==pointerToLastUtf7Byte))
+				{
+				goto end;
+				}
+			++pointerToCurrentUtf7Byte;
+			currentUtf7Byte=*pointerToCurrentUtf7Byte;
+			}
+		}
+end:
+	if (bitBuffer&KIsInBase64Block)
+		{
+		__ASSERT_DEBUG((numberOfBitsInBuffer<16) || (BitBufferContainsNonZeroBits(bitBuffer, numberOfBitsInBuffer-16) && (numberOfBitsInBuffer<16+6)), Panic(EPanicBadBitBufferState13));
+		if (BitBufferContainsNonZeroBits(bitBuffer, numberOfBitsInBuffer))
+			{
+			// rewind how far we've got in the UTF-7 descriptor to indicate to the user (by returning a value greater than zero) that not all of the input could be converted as it ended with a truncated base-64 sequence
+			__ASSERT_DEBUG(numberOfBitsInBuffer>=6, Panic(EPanicBadBitBufferState14));
+			pointerToCurrentUtf7Byte-=numberOfBitsInBuffer/6;
+			const TInt newNumberOfBitsInBuffer=numberOfBitsInBuffer%6;
+			bitBuffer&=~KIsInBase64Block; // temporarily turn off the KIsInBase64Block for the right-shift
+			bitBuffer>>=(numberOfBitsInBuffer-newNumberOfBitsInBuffer);
+			bitBuffer|=KIsInBase64Block; // must be turned back on again as the bit-buffer is packed into aState
+			numberOfBitsInBuffer=newNumberOfBitsInBuffer;
+			__ASSERT_DEBUG((numberOfBitsInBuffer==0) || (numberOfBitsInBuffer==2) || (numberOfBitsInBuffer==4), Panic(EPanicBadBitBufferState15));
+			}
+		__ASSERT_DEBUG((numberOfBitsInBuffer<16) && (numberOfBitsInBuffer%2==0), Panic(EPanicBadBitBufferState16));
+		aState=STATIC_CAST(TInt, bitBuffer);
+		aState|=(numberOfBitsInBuffer<<4);
+		__ASSERT_DEBUG(aState&KIsInBase64Block, Panic(EPanicBadBitBufferState17));
+		bitBuffer=0;
+		numberOfBitsInBuffer=0;
+		}
+	if ((pointerToCurrentUtf7Byte<aUtf7.Ptr()) && inputIsTruncated)
+		{
+		return EErrorIllFormedInput;
+		}
+	aUnicode.SetLength((pointerToPreviousUnicodeCharacter+1)-aUnicode.Ptr());
+	return pointerToLastUtf7Byte-pointerToCurrentUtf7Byte;
+	}
+
+
+
+/** Converts text encoded using the Unicode transformation format UTF-8
+into the Unicode UCS-2 character set. This function leaves with an
+error code of the input string is corrupted.
+
+@param aUtf8 The UTF-8 encoded input string
+@return A pointer to an HBufC16 with the converted Unicode string. */
+EXPORT_C HBufC16* CnvUtfConverter::ConvertToUnicodeFromUtf8L(const TDesC8& aUtf8)
+ 	{
+	// If aUtf8 is an empty string return
+	if (aUtf8.Length()==0)
+		{
+		HBufC16* hBuf = HBufC16::NewL(1);
+		return hBuf;
+		}
+
+	// else convert aUtf8 to Unicode storing the result in a buffer, reallocating
+	// it when needed.
+	TInt length = aUtf8.Length();
+	const TInt bufsize = 100;
+
+	TPtrC8 utf8 (aUtf8);
+	TBuf<bufsize> buf;
+	HBufC16* hBuf = HBufC16::NewLC(length);
+	TPtr unicode = hBuf->Des();
+
+	FOREVER
+		{
+		TInt unconverted = ConvertToUnicodeFromUtf8(buf, utf8);
+		if( unconverted == EErrorIllFormedInput || unconverted < 0)
+			User::Leave(KErrCorrupt);
+
+		if (unicode.Length() + buf.Length() > unicode.MaxLength())
+			{
+			// Reallocate hBuf
+			hBuf = hBuf->ReAllocL(unicode.Length() + buf.Length());
+			CleanupStack::Pop();
+			CleanupStack::PushL(hBuf);
+			unicode.Set(hBuf->Des());
+			}
+		unicode.Append(buf);
+		if (unconverted ==0)
+			break;
+		utf8.Set(utf8.Right(unconverted));
+		}
+	CleanupStack::Pop();
+	return hBuf;
+	}
+
+/** Converts text encoded using the Unicode transformation format UTF-8 into the
+Unicode UCS-2 character set.
+
+@param aUnicode On return, contains the Unicode encoded output string.
+@param aUtf8 The UTF-8 encoded input string
+@return The number of unconverted bytes left at the end of the input descriptor,
+or one of the error values defined in TError. */
+EXPORT_C TInt CnvUtfConverter::ConvertToUnicodeFromUtf8(TDes16& aUnicode, const TDesC8& aUtf8)
+	{
+	return ConvertToUnicodeFromUtf8(aUnicode, aUtf8, EFalse);
+	}
+
+static void UpdateUnconvertibleInfo(TInt& aNumberOfUnconvertibleCharacters,
+		TInt& aIndexOfFirstByteOfFirstUnconvertibleCharacter, TUint8 aIndex)
+	{
+	if (aNumberOfUnconvertibleCharacters<=0)
+		{
+		aIndexOfFirstByteOfFirstUnconvertibleCharacter = aIndex;
+		}
+	++aNumberOfUnconvertibleCharacters;
+	}
+
+/** Converts text encoded using the Unicode transformation format UTF-8 into the
+Unicode UCS-2 character set.
+
+@param aUnicode On return, contains the Unicode encoded output string.
+@param aUtf8 The UTF-8 encoded input string
+@param aGenerateJavaConformantUtf8 EFalse for orthodox UTF-8. ETrue for Java
+@return The number of unconverted bytes left at the end of the input descriptor,
+or one of the error values defined in TError. */
+TInt CnvUtfConverter::ConvertToUnicodeFromUtf8(TDes16& aUnicode, const TDesC8& aUtf8, TBool aGenerateJavaConformantUtf8)
+	{
+	TInt dummyUnconverted, dummyUnconvertedIndex;
+	return ConvertToUnicodeFromUtf8(aUnicode, aUtf8, aGenerateJavaConformantUtf8, dummyUnconverted, dummyUnconvertedIndex);
+	}
+
+/** Converts text encoded using the Unicode transformation format UTF-8 into the
+Unicode UCS-2 character set. Surrogate pairs can be created when a valid 4 byte UTF-8 is input.
+
+The variant of UTF-8 used internally by Java differs slightly from standard
+UTF-8. The TBool argument controls the UTF-8 variant generated by this function.
+
+@param aUnicode On return, contains the Unicode encoded output string.
+@param aUtf8 The UTF-8 encoded input string
+@param aGenerateJavaConformantUtf8 EFalse for orthodox UTF-8. ETrue for Java
+UTF-8. The default is EFalse.
+@param aNumberOfUnconvertibleCharacters On return, contains the number of bytes
+which were not converted.
+@param aIndexOfFirstByteOfFirstUnconvertibleCharacter On return, the index
+of the first byte of the first unconvertible character. For instance if the
+first character in the input descriptor (aForeign) could not be converted,
+then this parameter is set to the first byte of that character, i.e. zero.
+A negative value is returned if all the characters were converted.
+@return The number of unconverted bytes left at the end of the input descriptor,
+or one of the error values defined in TError. */
+
+/* of note: conformance.  Unicode standard 5.0 section 3.9, table 3-7
+ * Well formed UTF-8 Byte Sequences, full table.
+ * +----------------------------------------------------------------+
+ * | Code Points        | 1st byte | 2nd byte | 3rd byte | 4th byte |
+ * +--------------------+----------+----------+----------+----------+
+ * | U+0000..U+007F     | 00..7D   |          |          |          |  1 byte, ascii
+ * | U+0080..U+07FF     | C2..DF   | 80..BF   |          |          |  2 bytes, error if 1st < 0xC2
+ * | U+0800..U+0FFF     | E0       | A0..BF   | 80..BF   |          |  3 bytes, 1st == 0xE0, error if 2nd < 0xA0
+ * | U+1000..U+CFFF     | E1..EC   | 80..BF   | 80..BF   |          |  normal
+ * | U+D000..U+D7FF     | ED       | 80..9F   | 80..BF   |          |  3 bytes, 1st == 0xED, error if 2nd > 0x9F
+ * | U+E000..U+FFFF     | EE..EF   | 80..BF   | 80..BF   |          |  normal
+ * | U+10000..U+3FFFF   | F0       | 90..BF   | 80..BF   | 80..BF   |  4 bytes, 1st == 0xf0, error if 2nd < 0x90
+ * | U+40000..U+FFFFF   | F1..F3   | 80..BF   | 80..BF   | 80..BF   |  normal
+ * | U+100000..U+10FFFF | F4       | 80..8F   | 80..BF   | 80..BF   |  4 bytes, 1st == 0xF4, error if 2nd > 0x8F
+ * +--------------------+----------+----------+----------+----------+
+ *
+ * As a consequence of the well-formedness conditions specified in table 3-7,
+ * the following byte values are disallowed in UTF-8: C0-C1, F5-FF.
+ */
+TInt CnvUtfConverter::ConvertToUnicodeFromUtf8(TDes16& aUnicode, const TDesC8& aUtf8, TBool aGenerateJavaConformantUtf8,
+		TInt& aNumberOfUnconvertibleCharacters, TInt& aIndexOfFirstByteOfFirstUnconvertibleCharacter)
+	{
+	aUnicode.SetLength(0);
+
+	if ((aUtf8.Length() == 0) || (aUnicode.MaxLength() == 0))
+		{
+		return aUtf8.Length();
+		}
+
+	TUint16*           pUnicode = CONST_CAST(TUint16*, aUnicode.Ptr());
+	const TUint16* pLastUnicode = pUnicode + (aUnicode.MaxLength() - 1);
+	const TUint8*         pUtf8 = aUtf8.Ptr();
+	const TUint8*     pLastUtf8 = pUtf8 + (aUtf8.Length() - 1);
+	const TUint16 replacementcharacter = 0xFFFD;
+	TUint currentUnicodeCharacter;
+	TInt sequenceLength;
+
+
+	FOREVER
+		{
+		TBool illFormed=EFalse;
+
+		__ASSERT_DEBUG(pUnicode <= pLastUnicode, Panic(EPanicBadUnicodePointers8));
+		__ASSERT_DEBUG(pUtf8 <= pLastUtf8, Panic(EPanicBadUtf8Pointers3));
+
+		sequenceLength = 1;
+
+		// ascii - optimisation (i.e. it isn't a sequence)
+		if (pUtf8[0] < 0x80)
+			{
+			currentUnicodeCharacter = pUtf8[0];
+			}
+		else
+			{
+			// see if well formed utf-8, use table above for reference
+			if ((pUtf8[0] >= 0xc2) && (pUtf8[0] <= 0xdf))
+				{
+				// 0xc1-0xc2 are not valid bytes
+				sequenceLength = 2;
+				}
+			else if ((pUtf8[0] & 0xf0) == 0xe0)
+				{
+				sequenceLength = 3;
+				}
+			else if ((pUtf8[0] >= 0xf0) && (pUtf8[0] < 0xf5))
+				{
+				// 0xf5-0xff, are not valid bytes
+				sequenceLength = 4;
+				}
+			else if ((pUtf8[0] == 0xc0) && aGenerateJavaConformantUtf8)
+				{
+				if ((pUtf8 == pLastUtf8) || (pUtf8[1] == 0x80))
+					{
+					// either we've split the 0xc0 0x80 (i.e. 0xc0 is
+					// the last character in the string) or we've
+					// discovered a valid 0xc0 0x80 sequence.
+					sequenceLength = 2;
+					}
+				}
+
+			/* checking to see if we got a valid sequence */
+			if (sequenceLength == 1)
+				{
+				// bad value in the leading byte, 0xc0-0xc1,0x5f-0xff for example
+				currentUnicodeCharacter = replacementcharacter;
+				UpdateUnconvertibleInfo(aNumberOfUnconvertibleCharacters,
+						aIndexOfFirstByteOfFirstUnconvertibleCharacter,	pUtf8-aUtf8.Ptr());
+				}
+			else
+				{
+				// this is a check to see if the sequence goes beyond the input
+				// stream.  if its not the first and only character in the input
+				// stream this isn't an error, otherwise it is.
+				if ((pUtf8 + sequenceLength - 1) >  pLastUtf8)
+					{
+					// check to see if this sequence was the first character
+					if ((pUnicode - aUnicode.Ptr()) == 0)
+						{
+						return EErrorIllFormedInput;
+						}
+					break;
+					}
+
+				currentUnicodeCharacter = pUtf8[0] & (0x7F>>sequenceLength);
+
+				/* check the trailing bytes, they should begin with 10 */
+				TUint i = 1;
+
+				do
+					{
+					if ((pUtf8[i] & 0xc0) == 0x80)
+						{
+						// add the trailing 6 bits to the current unicode char
+						currentUnicodeCharacter = (currentUnicodeCharacter <<6 ) | (pUtf8[i] & 0x3F);
+						}
+					else
+						{
+						// ill formed character (doesn't have a lead 10)
+						currentUnicodeCharacter = replacementcharacter;
+						UpdateUnconvertibleInfo(aNumberOfUnconvertibleCharacters,
+								aIndexOfFirstByteOfFirstUnconvertibleCharacter,	pUtf8-aUtf8.Ptr());
+						illFormed=ETrue;
+						break;
+						}
+					i++;
+					}
+				while (i < (unsigned)sequenceLength);
+				}
+
+			/* conformance check.  bits of above table for reference.
+			 * +----------------------------------------------------------------+
+			 * | Code Points        | 1st byte | 2nd byte | 3rd byte | 4th byte |
+			 * +--------------------+----------+----------+----------+----------+
+			 * | U+0800..U+0FFF     | E0       | A0..BF   | 80..BF   |          |  3 bytes, 1st == 0xE0, 2nd < 0xA0
+			 * | U+D000..U+D7FF     | ED       | 80..9F   | 80..BF   |          |  3 bytes, 1st == 0xED, 2nd > 0x9F
+			 * | U+10000..U+3FFFF   | F0       | 90..BF   | 80..BF   | 80..BF   |  4 bytes, 1st == 0xf0, 2nd < 0x90
+			 * | U+100000..U+10FFFF | F4       | 80..8F   | 80..BF   | 80..BF   |  4 bytes, 1st == 0xF4, 2nd > 0x8F
+			 * +--------------------+----------+----------+----------+----------+
+			 */
+
+			if (currentUnicodeCharacter != replacementcharacter)
+				{
+				if (sequenceLength == 3)
+					{
+					if ((pUtf8[0] == 0xE0) && (pUtf8[1] < 0xA0))
+						{
+						currentUnicodeCharacter = replacementcharacter;
+						UpdateUnconvertibleInfo(aNumberOfUnconvertibleCharacters,
+								aIndexOfFirstByteOfFirstUnconvertibleCharacter,	pUtf8-aUtf8.Ptr());
+						illFormed=ETrue;
+						}
+					else if ((pUtf8[0] == 0xED) && (pUtf8[1] > 0x9F))
+						{
+						currentUnicodeCharacter = replacementcharacter;
+						UpdateUnconvertibleInfo(aNumberOfUnconvertibleCharacters,
+								aIndexOfFirstByteOfFirstUnconvertibleCharacter,	pUtf8-aUtf8.Ptr());
+						illFormed=ETrue;
+						}
+					}
+				else if (sequenceLength == 4)
+					{
+					if ((pUtf8[0] == 0xF0) && (pUtf8[1] < 0x90))
+						{
+						currentUnicodeCharacter = replacementcharacter;
+						UpdateUnconvertibleInfo(aNumberOfUnconvertibleCharacters,
+								aIndexOfFirstByteOfFirstUnconvertibleCharacter,	pUtf8-aUtf8.Ptr());
+						illFormed=ETrue;
+						}
+					else if ((pUtf8[0] == 0xF4) && (pUtf8[1] > 0x8F))
+						{
+						currentUnicodeCharacter = replacementcharacter;
+						UpdateUnconvertibleInfo(aNumberOfUnconvertibleCharacters,
+								aIndexOfFirstByteOfFirstUnconvertibleCharacter,	pUtf8-aUtf8.Ptr());
+						illFormed=ETrue;
+						}
+					}
+
+
+				/* last conformance check - Unicode 5.0 section 3.9 D92 Because surrogate code points
+				 * are not Unicode scalar values, any UTF-8 byte sequence that would map to code
+				 * points D800..DFFF is ill formed */
+
+				if ((currentUnicodeCharacter >= 0xD800) && (currentUnicodeCharacter <= 0xDFFF))
+					{
+					currentUnicodeCharacter = replacementcharacter;
+					UpdateUnconvertibleInfo(aNumberOfUnconvertibleCharacters,
+							aIndexOfFirstByteOfFirstUnconvertibleCharacter,	pUtf8-aUtf8.Ptr());
+					illFormed=ETrue;
+					}
+				}
+				// end conformance check
+			}
+
+		// would this character generate a surrogate pair in UTF-16?
+		if (currentUnicodeCharacter > 0xFFFF)
+			{
+			// is there enough space to hold a surrogate pair in the output?
+			if (pUnicode >= pLastUnicode)
+				{
+				break; // no, end processing.
+				}
+
+			TUint surrogate = (currentUnicodeCharacter>>10) + 0xD7C0;
+			*pUnicode++ = STATIC_CAST(TUint16, surrogate);
+
+			surrogate = (currentUnicodeCharacter & 0x3FF) + 0xDC00;
+			*pUnicode++ = STATIC_CAST(TUint16, surrogate);
+			}
+		else
+			{
+			*pUnicode++ = STATIC_CAST(TUint16, currentUnicodeCharacter);
+			}
+
+		// move the input pointer
+		if (currentUnicodeCharacter != replacementcharacter)
+			{
+			pUtf8 += sequenceLength;
+			}
+		else if(illFormed == EFalse)
+			{
+			pUtf8 += (sequenceLength);
+			}
+		else
+			{
+			// we had a character we didn't recognize (i.e. it was invalid)
+			// so move to the next character in the input
+			pUtf8++;
+			}
+
+		if ((pUtf8 > pLastUtf8) || (pUnicode > pLastUnicode))
+			{
+			break;  // we've either reached the end of the input or the end of output
+			}
+		}
+
+	aUnicode.SetLength(pUnicode - aUnicode.Ptr());
+	return (pLastUtf8 - pUtf8 + 1);
+	}
+
+/** Given a sample text this function attempts to determine whether or not
+ *  the same text is encoded using the UTF-8 standard encoding scheme.
+
+@param TInt a confidence level, given at certain value.  if the given sample
+			is UTF-8 this value will not be changed (unless > 100) then its
+			set to 100.  Otherwise if the same isn't UTF-8, its set to 0.
+@param TDesC8 sample text.
+UTF-8. The default is EFalse.
+@return void
+ */
+
+/* of note: conformance.  Unicode standard 5.0 section 3.9, table 3-7
+ * Well formed UTF-8 Byte Sequences, full table.
+ * +----------------------------------------------------------------+
+ * | Code Points        | 1st byte | 2nd byte | 3rd byte | 4th byte |
+ * +--------------------+----------+----------+----------+----------+
+ * | U+0000..U+007F     | 00..7D   |          |          |          |  1 byte, ascii
+ * | U+0080..U+07FF     | C2..DF   | 80..BF   |          |          |  2 bytes, error if 1st < 0xC2
+ * | U+0800..U+0FFF     | E0       | A0..BF   | 80..BF   |          |  3 bytes, 1st == 0xE0, error if 2nd < 0xA0
+ * | U+1000..U+CFFF     | E1..EC   | 80..BF   | 80..BF   |          |  normal
+ * | U+D000..U+D7FF     | ED       | 80..9F   | 80..BF   |          |  3 bytes, 1st == 0xED, error if 2nd > 0x9F
+ * | U+E000..U+FFFF     | EE..EF   | 80..BF   | 80..BF   |          |  normal
+ * | U+10000..U+3FFFF   | F0       | 90..BF   | 80..BF   | 80..BF   |  4 bytes, 1st == 0xf0, error if 2nd < 0x90
+ * | U+40000..U+FFFFF   | F1..F3   | 80..BF   | 80..BF   | 80..BF   |  normal
+ * | U+100000..U+10FFFF | F4       | 80..8F   | 80..BF   | 80..BF   |  4 bytes, 1st == 0xF4, error if 2nd > 0x8F
+ * +--------------------+----------+----------+----------+----------+
+ *
+ * As a consequence of the well-formedness conditions specified in table 3-7,
+ * the following byte values are disallowed in UTF-8: C0-C1, F5-FF.
+ *
+ * Code Rules:
+ *   R1: If the string contains any non-UTF-8 characters the returned confidence
+ *       is 0.  Valid UTF-8 combinations are listed in the above table.
+ *   R2: Otherwise if the string starts with a UTF-8 BOM (byte order mark) in
+ *       the (see ) the returned confidence is 95.
+ *   R3: Otherwise the confidence returned is based upon the sample string
+ *       length.
+ *   R4: If the sample string is under 75 characters, the confidence is set to
+ *       75.
+ */
+GLREF_C void IsCharacterSetUTF8(TInt& aConfidenceLevel, const TDesC8& aSample)
+	{
+
+	TInt sampleLength = aSample.Length();
+
+	if (sampleLength == 0)
+		{
+		aConfidenceLevel = 89;
+		return;
+		}
+	TInt bytesRemaining  = 0;
+	TInt sequenceLength  = 0;
+
+	aConfidenceLevel = sampleLength;
+
+	const TUint8* buffer = &aSample[0];
+
+	if (sampleLength < 95)
+		{
+		// check for the BOM
+		if ((sampleLength >= 3) &&
+			((buffer[0] == 0xEF) &&
+			 (buffer[1] == 0xBB) &&
+			 (buffer[2] == 0xBF))
+			)
+			{
+			aConfidenceLevel = 95;
+			}
+		else if (sampleLength < 75)
+			{
+			aConfidenceLevel = 75;
+			}
+		}
+
+	for (TInt index = 0;index != sampleLength;index++)
+		{
+
+		if (bytesRemaining > 0)
+			{
+			// bytesRemaining > 0, means that a byte representing the start of a
+			// multibyte sequence was encountered and the bytesRemaining is the
+			// number of bytes to follow.
+
+			if ((buffer[index] & 0xc0) == 0x80)
+				{
+				// need to check for ill-formed sequences -- all are in the 2nd byte
+
+				if ((sequenceLength == 3) && (bytesRemaining == 2))
+					{
+					if ((buffer[index - 1] == 0xe0) && (buffer[index] < 0xa0))
+						{
+						aConfidenceLevel = 0;
+						break;
+						}
+					else if ((buffer[index - 1] == 0xed) && (buffer[index] > 0x9f))
+						{
+						aConfidenceLevel = 0;
+						break;
+						}
+					}
+				else if ((sequenceLength == 4) && (bytesRemaining == 3))
+					{
+					if ((buffer[index - 1] == 0xf0) && (buffer[index] < 0x90))
+						{
+						aConfidenceLevel = 0;
+						break;
+						}
+					else if ((buffer[index - 1] == 0xf4) && (buffer[index] > 0x8f))
+						{
+						aConfidenceLevel = 0;
+						break;
+						}
+					}
+
+				--bytesRemaining;
+				continue;
+				}
+			else
+				{
+				aConfidenceLevel = 0;
+				break;
+				}
+			}
+
+		if (bytesRemaining == 0)
+			{
+			if (buffer[index] < 0x80)
+				{
+				// The value of aSample[index] is in the range 0x00-0x7f
+				//UTF8 maintains ASCII transparency. So it's a valid
+				//UTF8. Do nothing, check next value.
+				continue;
+				}
+			else if ((buffer[index] >= 0xc2) && (buffer[index] < 0xe0))
+				{
+				// valid start of a 2 byte sequence (see conformance note)
+				sequenceLength = 2;
+				bytesRemaining = 1;
+				}
+			else if ((buffer[index] & 0xf0) == 0xe0)
+				{
+				// valid start of a 3 byte sequence
+				sequenceLength = 3;
+				bytesRemaining = 2;
+				}
+			else if ((buffer[index] >= 0xf0) && (buffer[index] < 0xf5))
+				{
+				// valid start of a 4 byte sequence (see conformance note)
+				sequenceLength = 4;
+				bytesRemaining = 3;
+				}
+			else
+				{
+				// wasn't anything expected so must be an illegal/irregular UTF8 coded value
+				aConfidenceLevel = 0;
+				break;
+				}
+			}
+		} // for
+
+	aConfidenceLevel = (aConfidenceLevel > 0)? ((aConfidenceLevel > 100)? 100: aConfidenceLevel): 0;
+	}
+
+GLREF_C void IsCharacterSetUTF7(TInt& aConfidenceLevel, const TDesC8& aSample)
+	{
+	TInt sampleLength = aSample.Length();
+	aConfidenceLevel = 70;
+	for (TInt i=0; i<sampleLength; ++i)
+		{
+		// UTF-7 value ranges only 7 bits
+		if((aSample[i]&0x80)!=0x00)
+			{
+			aConfidenceLevel= 0;
+			break;
+			}
+
+		// there is no "~" in UTF-7 encoding. So if find either, it's not UTF-7
+		else if (char(aSample[i])=='~')
+			{
+			aConfidenceLevel = 0;
+			break;
+			}
+
+		// The SMS7Bit escape char value is 0x1b. Reduce confidence if it follows the following format
+		else if ( (aSample[i]==0x1b) && (i <sampleLength-1) )
+			{
+			static const TInt smsExtensionTable[11] =
+				{0x0a, 0x14, 0x1b, 0x28, 0x29, 0x2f, 0x3c, 0x3d, 0x3e, 0x40, 0x65};
+			TInt increment1 = i+1;
+			if (increment1>= sampleLength)
+				break;
+			for (TInt j=0; j < 11; ++j)
+				{
+				if (aSample[increment1] == smsExtensionTable[j])
+					{
+					aConfidenceLevel-=10;
+					}
+				}
+			}
+		// The UTF-7 escape char is 0x2b. The values that follow the escape sequence
+		// the values following the escape char value must belong to the modified base64
+		// or '-' else it is an ill-formed sequence, so probably not UTF-7
+		else if ( (aSample[i]==0x2b)  && (i <sampleLength-1) )
+			{
+			TInt increment1 = i+1;
+			if ((aSample[increment1] == 0x2b) || (aSample[increment1] == 0x2d) || (aSample[increment1] == 0x2f) ||
+				((aSample[increment1] >= 0x41) && (aSample[increment1] <= 0x5a)) ||
+				((aSample[increment1] >= 0x61) && (aSample[increment1] <= 0x7a)))
+				{
+				aConfidenceLevel+=5;
+				}
+			else
+				{
+				aConfidenceLevel-=15;
+				}
+			i++; // should this be here or up in the if loop ??
+			}
+		} //for
+	aConfidenceLevel =(aConfidenceLevel >0)? ((aConfidenceLevel > 100)? 100: aConfidenceLevel): 0;
+	}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32/common/array.cpp	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,1179 @@
+// Copyright (c) 1998-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32\common\array.cpp
+// 
+//
+
+#include "common.h"
+#ifdef __KERNEL_MODE__
+#include <kernel.h>
+#endif
+
+const TInt KDefaultPtrArrayGranularity		=8;
+const TInt KPtrArrayMaxGranularity			=0x10000000;
+const TInt KDefaultSimpleArrayGranularity	=8;
+const TInt KSimpleArrayMaxGranularity		=0x10000000;
+const TInt KSimpleArrayMaxEntrySize			=640;	// allow room for a unicode TFullName
+const TInt KMaxArrayGrowBy					=65535;
+const TInt KMinArrayFactor					=257;
+const TInt KMaxArrayFactor					=32767;
+
+EXPORT_C RPointerArrayBase::RPointerArrayBase()
+	: iCount(0), iEntries(NULL), iAllocated(0), iGranularity(KDefaultPtrArrayGranularity), iSpare1(0), iSpare2(0)
+	{}
+
+EXPORT_C RPointerArrayBase::RPointerArrayBase(TInt aGranularity)
+	: iCount(0), iEntries(NULL), iAllocated(0), iGranularity(aGranularity), iSpare1(0), iSpare2(0)
+	{
+	__ASSERT_ALWAYS(aGranularity>0 && aGranularity<=KPtrArrayMaxGranularity,
+		Panic(EBadArrayGranularity));
+	}
+
+EXPORT_C RPointerArrayBase::RPointerArrayBase(TInt aMinGrowBy, TInt aFactor)
+	: iCount(0), iEntries(NULL), iAllocated(0), iSpare1(0), iSpare2(0)
+	{
+	__ASSERT_ALWAYS(aMinGrowBy>0 && aMinGrowBy<=KMaxArrayGrowBy, Panic(EBadArrayMinGrowBy));
+	__ASSERT_ALWAYS(aFactor>=KMinArrayFactor && aFactor<=KMaxArrayFactor, Panic(EBadArrayFactor));
+	iGranularity = aMinGrowBy | (aFactor << 16) | 0x80000000;
+	}
+
+#ifndef __KERNEL_MODE__
+EXPORT_C RPointerArrayBase::RPointerArrayBase(TAny** aEntries, TInt aCount)
+	: iCount(aCount), iEntries(aEntries), iAllocated(aCount), iGranularity(aCount), iSpare1(0), iSpare2(0)
+	{
+	__ASSERT_ALWAYS(aCount>0,Panic(EBadArrayCount));
+	}
+#endif
+
+EXPORT_C void RPointerArrayBase::Close()
+	{
+	iCount=0;
+	STD_CLASS::Free(iEntries);
+	iEntries=NULL;
+	iAllocated=0;
+	}
+
+EXPORT_C TInt RPointerArrayBase::Count() const
+	{
+	return iCount;
+	}
+
+#ifndef __ARRAY_MACHINE_CODED__
+EXPORT_C TAny*& RPointerArrayBase::At(TInt anIndex) const
+	{
+	__ASSERT_ALWAYS((anIndex>=0 && anIndex<iCount),Panic(EBadArrayIndex));
+	return iEntries[anIndex];
+	}
+#else
+GLDEF_C void PanicBadArrayIndex()
+	{
+	Panic(EBadArrayIndex);
+	}
+#endif
+
+TInt CalculateArraySizeAfterGrow(TInt aOrigSize, TInt aGranularity, TInt aLimit)
+	{
+	if (aGranularity >= 0)
+		{
+		if (aOrigSize > aLimit - aGranularity)
+			return KErrNoMemory;	// array can't be >2GB
+		return aOrigSize + aGranularity;
+		}
+	TUint minStep = (TUint)(aGranularity & 65535);
+	TUint factor = TUint(aGranularity & 0x7fff0000) >> 16;
+	Uint64 na64 = aOrigSize;
+	na64 *= (Uint64)factor;
+	na64 += 128;
+	na64 >>= 8;
+	Uint64 min_na64 = (Uint64)aOrigSize + (Uint64)minStep;
+	if (min_na64 > na64)
+		na64 = min_na64;
+	if (na64 > (Uint64)aLimit)
+		return KErrNoMemory;	// array can't be >2GB
+	return (TInt)na64;
+	}
+
+TInt CalculateArraySizeAfterShrink(TInt aOrigSize, TInt aGranularity, TInt aUsed)
+	{
+	TInt step = aGranularity;
+	if (step < 0)
+		step &= 65535;
+	if (aOrigSize - aUsed < step)
+		return aOrigSize;
+	aUsed += step - 1;
+	aUsed /= step;
+	aUsed *= step;
+	return aUsed;
+	}
+
+TInt RPointerArrayBase::Grow()
+	{
+	TInt newAlloc = CalculateArraySizeAfterGrow(iAllocated, iGranularity, KMaxTInt >> 2);
+	if (newAlloc < 0)
+		return newAlloc;
+	TAny** pA = (TAny**)STD_CLASS::ReAlloc(iEntries, newAlloc*sizeof(TAny*));
+	if (!pA)
+		return KErrNoMemory;
+	iEntries = pA;
+	iAllocated = newAlloc;
+	return KErrNone;
+	}
+
+#ifndef __ARRAY_MACHINE_CODED__
+EXPORT_C TInt RPointerArrayBase::Append(const TAny* anEntry)
+	{
+	if (iCount==iAllocated)
+		{
+		TInt r=Grow();
+		if (r!=KErrNone)
+			return r;
+		}
+	iEntries[iCount++]=(TAny*)anEntry;
+	return KErrNone;
+	}
+#endif
+
+EXPORT_C TInt RPointerArrayBase::Insert(const TAny* anEntry, TInt aPos)
+	{
+	__ASSERT_ALWAYS((aPos>=0 && aPos<=iCount),Panic(EBadArrayPosition));
+	if (iCount==iAllocated)
+		{
+		TInt r=Grow();
+		if (r!=KErrNone)
+			return r;
+		}
+	TInt entries=iCount-aPos;
+	if (entries!=0)
+		wordmove(iEntries+aPos+1,iEntries+aPos,entries*sizeof(TAny*));
+	iCount++;
+	iEntries[aPos]=(TAny*)anEntry;
+	return KErrNone;
+	}
+
+EXPORT_C void RPointerArrayBase::Remove(TInt anIndex)
+	{
+	__ASSERT_ALWAYS((anIndex>=0 && anIndex<iCount),Panic(EBadArrayIndex));
+	TInt entries=iCount-anIndex-1;
+	if (entries!=0)
+		wordmove(iEntries+anIndex,iEntries+anIndex+1,entries*sizeof(TAny*));
+	iCount--;
+	}
+
+EXPORT_C void RPointerArrayBase::Compress()
+	{
+	if (iCount)
+		iEntries=(TAny**)STD_CLASS::ReAlloc(iEntries,iCount*sizeof(TAny*)); // can't fail
+	else
+		{
+		STD_CLASS::Free(iEntries);
+		iEntries=NULL;
+		}
+	iAllocated=iCount;
+	}
+
+#ifndef __KERNEL_MODE__
+EXPORT_C void RPointerArrayBase::GranularCompress()
+	{
+	TInt newAlloc = CalculateArraySizeAfterShrink(iAllocated, iGranularity, iCount);
+	if (newAlloc == iAllocated)
+		return;
+	if (newAlloc)
+		iEntries=(TAny**)STD_CLASS::ReAlloc(iEntries,newAlloc*sizeof(TAny*)); // can't fail
+	else
+		{
+		STD_CLASS::Free(iEntries);
+		iEntries=NULL;
+		}
+	iAllocated=newAlloc;
+	}
+
+EXPORT_C TInt RPointerArrayBase::DoReserve(TInt aCount)
+	{
+	__ASSERT_ALWAYS(aCount>=0, Panic(EArrayBadReserveCount));
+	if (aCount <= iAllocated)
+		return KErrNone;	// if allocated space is already sufficient, nothing to do
+
+	const TInt KLimit = TInt(0x80000000u / sizeof(TAny*));
+	if (aCount >= KLimit)
+		return KErrNoMemory;
+
+	TAny** pA = (TAny**)STD_CLASS::ReAlloc(iEntries, aCount*sizeof(TAny*));
+	if (!pA)
+		return KErrNoMemory;
+	iEntries = pA;
+	iAllocated = aCount;
+	return KErrNone;
+	}
+#endif
+
+EXPORT_C void RPointerArrayBase::Reset()
+	{
+	iCount=0;
+	STD_CLASS::Free(iEntries);
+	iEntries=NULL;
+	iAllocated=0;
+	}
+
+EXPORT_C TInt RPointerArrayBase::BinarySearch(const TAny* anEntry, TInt& anIndex, TGeneralLinearOrder anOrder) const
+	{
+	return BinarySearch(anEntry, anIndex, anOrder, EArrayFindMode_Any);
+	}
+
+#ifndef __ARRAY_MACHINE_CODED__
+EXPORT_C TInt RPointerArrayBase::Find(const TAny* anEntry) const
+	{
+	TInt i;
+	for (i=0; i<iCount; i++)
+		{
+		if (iEntries[i]==anEntry)
+			return i;
+		}
+	return KErrNotFound;
+	}
+
+EXPORT_C TInt RPointerArrayBase::Find(const TAny* anEntry, TGeneralIdentityRelation anIdentity) const
+	{
+	TInt i;
+	for (i=0; i<iCount; i++)
+		{
+		if ((*anIdentity)(anEntry,iEntries[i]))
+			return i;
+		}
+	return KErrNotFound;
+	}
+
+EXPORT_C TInt RPointerArrayBase::BinarySearchSigned(TInt anEntry, TInt& anIndex) const
+	{
+	return BinarySearchSigned(anEntry, anIndex, EArrayFindMode_Any);
+	}
+
+EXPORT_C TInt RPointerArrayBase::BinarySearchSigned(TInt anEntry, TInt& anIndex, TInt aMode) const
+	{
+	__ASSERT_DEBUG(TUint(aMode)<TUint(EArrayFindMode_Limit), Panic(EBadArrayFindMode));
+	TInt l=0;
+	TInt r=iCount;
+	TInt ret = KErrNotFound;
+	while(r>l)
+		{
+		TInt m=(l+r)>>1;
+		TInt h=(TInt)iEntries[m];
+		if (anEntry==h)
+			{
+			if (aMode == EArrayFindMode_Any)
+				{
+				anIndex=m;
+				return KErrNone;
+				}
+			ret = KErrNone;
+			if (aMode == EArrayFindMode_First)
+				r=m;
+			else
+				l=m+1;
+			}
+		else if (anEntry>h)
+			l=m+1;
+		else
+			r=m;
+		}
+	anIndex=r;
+	return ret;
+	}
+
+EXPORT_C TInt RPointerArrayBase::BinarySearchUnsigned(TUint anEntry, TInt& anIndex) const
+	{
+	return BinarySearchUnsigned(anEntry, anIndex, EArrayFindMode_Any);
+	}
+
+EXPORT_C TInt RPointerArrayBase::BinarySearchUnsigned(TUint anEntry, TInt& anIndex, TInt aMode) const
+	{
+	__ASSERT_DEBUG(TUint(aMode)<TUint(EArrayFindMode_Limit), Panic(EBadArrayFindMode));
+	TInt l=0;
+	TInt r=iCount;
+	TInt ret = KErrNotFound;
+	while(r>l)
+		{
+		TUint m=(l+r)>>1;
+		TUint h=(TUint)iEntries[m];
+		if (anEntry==h)
+			{
+			if (aMode == EArrayFindMode_Any)
+				{
+				anIndex=m;
+				return KErrNone;
+				}
+			ret = KErrNone;
+			if (aMode == EArrayFindMode_First)
+				r=m;
+			else
+				l=m+1;
+			}
+		else if (anEntry>h)
+			l=m+1;
+		else
+			r=m;
+		}
+	anIndex=r;
+	return ret;
+	}
+
+EXPORT_C TInt RPointerArrayBase::BinarySearch(const TAny* anEntry, TInt& anIndex, TGeneralLinearOrder anOrder, TInt aMode) const
+	{
+	__ASSERT_DEBUG(TUint(aMode)<TUint(EArrayFindMode_Limit), Panic(EBadArrayFindMode));
+	TInt l=0;
+	TInt r=iCount;
+	TInt ret = KErrNotFound;
+	while(r>l)
+		{
+		TInt m=(l+r)>>1;
+		TInt k=(*anOrder)(anEntry,iEntries[m]);
+		if (k==0)
+			{
+			if (aMode == EArrayFindMode_Any)
+				{
+				anIndex=m;
+				return KErrNone;
+				}
+			ret = KErrNone;
+			if (aMode == EArrayFindMode_First)
+				r=m;
+			else
+				l=m+1;
+			}
+		else if (k>0)
+			l=m+1;
+		else
+			r=m;
+		}
+	anIndex=r;
+	return ret;
+	}
+
+EXPORT_C TInt RPointerArrayBase::FindIsqSigned(TInt anEntry) const
+	{
+	return FindIsqSigned(anEntry, EArrayFindMode_Any);
+	}
+
+EXPORT_C TInt RPointerArrayBase::FindIsqUnsigned(TUint anEntry) const
+	{
+	return FindIsqUnsigned(anEntry, EArrayFindMode_Any);
+	}
+
+EXPORT_C TInt RPointerArrayBase::FindIsq(const TAny* anEntry, TGeneralLinearOrder anOrder) const
+	{
+	return FindIsq(anEntry, anOrder, EArrayFindMode_Any);
+	}
+
+EXPORT_C TInt RPointerArrayBase::FindIsqSigned(TInt anEntry, TInt aMode) const
+	{
+	TInt i;
+	TInt r=BinarySearchSigned(anEntry,i,aMode);
+	return (r==KErrNone)?i:r;
+	}
+
+EXPORT_C TInt RPointerArrayBase::FindIsqUnsigned(TUint anEntry, TInt aMode) const
+	{
+	TInt i;
+	TInt r=BinarySearchUnsigned(anEntry,i,aMode);
+	return (r==KErrNone)?i:r;
+	}
+
+EXPORT_C TInt RPointerArrayBase::FindIsq(const TAny* anEntry, TGeneralLinearOrder anOrder, TInt aMode) const
+	{
+	TInt i;
+	TInt r=BinarySearch(anEntry,i,anOrder,aMode);
+	return (r==KErrNone)?i:r;
+	}
+#else
+extern "C" void PanicBadArrayFindMode()
+	{
+	Panic(EBadArrayFindMode);
+	}
+#endif
+
+
+EXPORT_C TInt RPointerArrayBase::FindReverse(const TAny* anEntry) const
+	{
+	TInt i=iCount;
+	while (i--)
+		{
+		if (iEntries[i]==anEntry)
+			return i;
+		}
+	return KErrNotFound;
+	}
+
+EXPORT_C TInt RPointerArrayBase::FindReverse(const TAny* anEntry, TGeneralIdentityRelation anIdentity) const
+	{
+	TInt i=iCount;
+	while (i--)
+		{
+		if ((*anIdentity)(anEntry,iEntries[i]))
+			return i;
+		}
+	return KErrNotFound;
+	}
+
+
+EXPORT_C TInt RPointerArrayBase::InsertIsqSigned(TInt anEntry, TBool aAllowRepeats)
+	{
+	TInt i;
+	TInt mode = aAllowRepeats ? EArrayFindMode_Last : EArrayFindMode_Any;
+	TInt r=BinarySearchSigned(anEntry,i,mode);
+	if (r==KErrNotFound || aAllowRepeats)
+		return Insert((const TAny*)anEntry,i);
+	return KErrAlreadyExists;
+	}
+
+EXPORT_C TInt RPointerArrayBase::InsertIsqUnsigned(TUint anEntry, TBool aAllowRepeats)
+	{
+	TInt i;
+	TInt mode = aAllowRepeats ? EArrayFindMode_Last : EArrayFindMode_Any;
+	TInt r=BinarySearchUnsigned(anEntry,i,mode);
+	if (r==KErrNotFound || aAllowRepeats)
+		return Insert((const TAny*)anEntry,i);
+	return KErrAlreadyExists;
+	}
+
+EXPORT_C TInt RPointerArrayBase::InsertIsq(const TAny* anEntry, TGeneralLinearOrder anOrder, TBool aAllowRepeats)
+	{
+	TInt i;
+	TInt mode = aAllowRepeats ? EArrayFindMode_Last : EArrayFindMode_Any;
+	TInt r=BinarySearch(anEntry,i,anOrder,mode);
+	if (r==KErrNotFound || aAllowRepeats)
+		return Insert((const TAny*)anEntry,i);
+	return KErrAlreadyExists;
+	}
+
+#ifndef __ARRAY_MACHINE_CODED__
+void HeapSortUnsigned(TUint* aEntries,TInt aCount)
+	{
+	TInt ss = aCount;
+	if (ss>1)
+		{
+		TInt sh = ss>>1;
+		FOREVER
+			{
+			TUint si;
+			if (sh!=0)
+				{
+				--sh;
+				si = aEntries[sh];
+				}
+			else
+				{
+				--ss;
+				si = aEntries[ss];
+				aEntries[ss]=aEntries[0];
+				if (ss==1)
+					{
+					aEntries[0]=si;
+					break;
+					}
+				}
+			TInt ii = sh;
+			TInt jj = sh;
+			FOREVER
+				{
+				jj = (jj+1)<<1;
+				if (jj>=ss || TUint(aEntries[jj-1])>TUint(aEntries[jj]) )
+					--jj;
+				if (jj>=ss || TUint(aEntries[jj])<=si)
+					break;
+				aEntries[ii]=aEntries[jj];
+				ii = jj;
+				}
+			aEntries[ii]=si;
+			}
+		}
+	}
+#endif // !__ARRAY_MACHINE_CODED__
+
+
+#ifndef __KERNEL_MODE__
+#ifndef __ARRAY_MACHINE_CODED__
+EXPORT_C void RPointerArrayBase::HeapSortSigned()
+	{
+	TInt ss = iCount;
+	if (ss>1)
+		{
+		TInt sh = ss>>1;
+		FOREVER
+			{
+			TInt si;
+			if (sh!=0)
+				{
+				--sh;
+				si = (TInt)iEntries[sh];
+				}
+			else
+				{
+				--ss;
+				si = (TInt)iEntries[ss];
+				iEntries[ss]=iEntries[0];
+				if (ss==1)
+					{
+					iEntries[0]=(TAny*)si;
+					break;
+					}
+				}
+			TInt ii = sh;
+			TInt jj = sh;
+			FOREVER
+				{
+				jj = (jj+1)<<1;
+				if (jj>=ss || TInt(iEntries[jj-1])>TInt(iEntries[jj]) )
+					--jj;
+				if (jj>=ss || TInt(iEntries[jj])<=si)
+					break;
+				iEntries[ii]=iEntries[jj];
+				ii = jj;
+				}
+			iEntries[ii]=(TAny*)si;
+			}
+		}
+	}
+
+EXPORT_C void RPointerArrayBase::HeapSortUnsigned()
+	{
+	::HeapSortUnsigned((TUint*)iEntries,iCount);
+	}
+
+EXPORT_C void RPointerArrayBase::HeapSort(TGeneralLinearOrder anOrder)
+	{
+	TInt ss = iCount;
+	if (ss>1)
+		{
+		TInt sh = ss>>1;
+		FOREVER
+			{
+			TAny* si;
+			if (sh!=0)
+				{
+				--sh;
+				si = iEntries[sh];
+				}
+			else
+				{
+				--ss;
+				si = iEntries[ss];
+				iEntries[ss]=iEntries[0];
+				if (ss==1)
+					{
+					iEntries[0]=si;
+					break;
+					}
+				}
+			TInt ii = sh;
+			TInt jj = sh;
+			FOREVER
+				{
+				jj = (jj+1)<<1;
+				if (jj>=ss || (*anOrder)(iEntries[jj-1],iEntries[jj])>0 )
+					--jj;
+				if (jj>=ss || (*anOrder)(iEntries[jj],si)<=0 )
+					break;
+				iEntries[ii]=iEntries[jj];
+				ii = jj;
+				}
+			iEntries[ii]=si;
+			}
+		}
+	}
+#endif
+
+EXPORT_C TInt RPointerArrayBase::GetCount(const CBase* aPtr)
+	{
+	return ((RPointerArrayBase*)aPtr)->Count();
+	}
+
+EXPORT_C const TAny* RPointerArrayBase::GetElementPtr(const CBase* aPtr, TInt aIndex)
+	{
+	return &(((RPointerArrayBase*)aPtr)->At(aIndex));
+	}
+#endif	// __KERNEL_MODE__
+
+EXPORT_C RArrayBase::RArrayBase(TInt anEntrySize)
+	:	iCount(0), iEntries(NULL), iKeyOffset(0), iAllocated(0),
+		iGranularity(KDefaultSimpleArrayGranularity), iSpare1(0), iSpare2(0)
+	{
+	__ASSERT_ALWAYS(anEntrySize>0 && anEntrySize<=KSimpleArrayMaxEntrySize,Panic(EBadArrayEntrySize));
+	iEntrySize=(anEntrySize+(TInt)sizeof(TInt)-1)&~((TInt)sizeof(TInt)-1);
+	}
+
+EXPORT_C RArrayBase::RArrayBase(TInt anEntrySize, TInt aGranularity)
+	:	iCount(0), iEntries(NULL), iKeyOffset(0), iAllocated(0),
+		iGranularity(aGranularity), iSpare1(0), iSpare2(0)
+	{
+	__ASSERT_ALWAYS(anEntrySize>0 && anEntrySize<=KSimpleArrayMaxEntrySize,Panic(EBadArrayEntrySize));
+	__ASSERT_ALWAYS(aGranularity>0 && (aGranularity*anEntrySize)<=KSimpleArrayMaxGranularity, Panic(EBadArrayGranularity));
+	iEntrySize=(anEntrySize+(TInt)sizeof(TInt)-1)&~((TInt)sizeof(TInt)-1);
+	}
+
+EXPORT_C RArrayBase::RArrayBase(TInt aEntrySize,TAny* aEntries, TInt aCount)
+	:	iCount(aCount), iEntries(aEntries), iKeyOffset(0), iAllocated(aCount),
+		iGranularity(KDefaultSimpleArrayGranularity), iSpare1(0), iSpare2(0)
+	{
+	__ASSERT_ALWAYS(aEntrySize>0 && aEntrySize<=KSimpleArrayMaxEntrySize,Panic(EBadArrayEntrySize));
+	__ASSERT_ALWAYS(aCount>0,Panic(EBadArrayCount));
+	iEntrySize=(aEntrySize+(TInt)sizeof(TInt)-1)&~((TInt)sizeof(TInt)-1);
+	}
+
+EXPORT_C RArrayBase::RArrayBase(TInt anEntrySize, TInt aGranularity, TInt aKeyOffset)
+	:	 iCount(0), iEntries(NULL), iKeyOffset(aKeyOffset), iAllocated(0),
+		iGranularity(aGranularity), iSpare1(0), iSpare2(0)
+	{
+	__ASSERT_ALWAYS(anEntrySize>0 && anEntrySize<=KSimpleArrayMaxEntrySize,Panic(EBadArrayEntrySize));
+	__ASSERT_ALWAYS(aGranularity>0 && (aGranularity*anEntrySize)<=KSimpleArrayMaxGranularity, Panic(EBadArrayGranularity));
+	__ASSERT_ALWAYS(aKeyOffset>=0 && (aKeyOffset&3)==0 && aKeyOffset<anEntrySize, Panic(EBadArrayKeyOffset));
+	iEntrySize=(anEntrySize+(TInt)sizeof(TInt)-1)&~((TInt)sizeof(TInt)-1);
+	}
+
+EXPORT_C RArrayBase::RArrayBase(TInt aEntrySize, TInt aMinGrowBy, TInt aKeyOffset, TInt aFactor)
+	:	 iCount(0), iEntries(NULL), iKeyOffset(aKeyOffset), iAllocated(0), iSpare1(0), iSpare2(0)
+	{
+	__ASSERT_ALWAYS(aEntrySize>0 && aEntrySize<=KSimpleArrayMaxEntrySize, Panic(EBadArrayEntrySize));
+	__ASSERT_ALWAYS(aKeyOffset>=0 && (aKeyOffset&3)==0 && aKeyOffset<aEntrySize, Panic(EBadArrayKeyOffset));
+	__ASSERT_ALWAYS(aMinGrowBy>0 && aMinGrowBy<=KMaxArrayGrowBy, Panic(EBadArrayMinGrowBy));
+	__ASSERT_ALWAYS(aFactor>=KMinArrayFactor && aFactor<=KMaxArrayFactor, Panic(EBadArrayFactor));
+	iEntrySize=(aEntrySize+(TInt)sizeof(TInt)-1)&~((TInt)sizeof(TInt)-1);
+	iGranularity = aMinGrowBy | (aFactor << 16) | 0x80000000;
+	}
+
+EXPORT_C void RArrayBase::Close()
+	{
+	iCount=0;
+	STD_CLASS::Free(iEntries);
+	iEntries=NULL;
+	iAllocated=0;
+	}
+
+EXPORT_C TInt RArrayBase::Count() const
+	{
+	return iCount;
+	}
+
+#ifndef __ARRAY_MACHINE_CODED__
+EXPORT_C TAny* RArrayBase::At(TInt anIndex) const
+	{
+	__ASSERT_ALWAYS((anIndex>=0 && anIndex<iCount),Panic(EBadArrayIndex));
+	return (((TUint8*)iEntries)+anIndex*iEntrySize);
+	}
+#endif
+
+TInt RArrayBase::Grow()
+	{
+	TInt newAlloc = CalculateArraySizeAfterGrow(iAllocated, iGranularity, KMaxTInt/iEntrySize);
+	if (newAlloc < 0)
+		return newAlloc;
+	TAny** pA = (TAny**)STD_CLASS::ReAlloc(iEntries, newAlloc*iEntrySize);
+	if (!pA)
+		return KErrNoMemory;
+	iEntries = pA;
+	iAllocated = newAlloc;
+	return KErrNone;
+	}
+
+#ifndef __ARRAY_MACHINE_CODED__
+EXPORT_C TInt RArrayBase::Append(const TAny* anEntry)
+	{
+	if (iCount==iAllocated)
+		{
+		TInt r=Grow();
+		if (r!=KErrNone)
+			return r;
+		}
+	wordmove((TUint8*)iEntries+iCount*iEntrySize, anEntry, iEntrySize);
+	iCount++;
+	return KErrNone;
+	}
+#endif
+
+EXPORT_C TInt RArrayBase::Insert(const TAny* anEntry, TInt aPos)
+	{
+	__ASSERT_ALWAYS((aPos>=0 && aPos<=iCount),Panic(EBadArrayPosition));
+	if (iCount==iAllocated)
+		{
+		TInt r=Grow();
+		if (r!=KErrNone)
+			return r;
+		}
+	TUint8 *pS=(TUint8*)iEntries+aPos*iEntrySize;
+	TUint8 *pD=pS+iEntrySize;
+	TInt entries=iCount-aPos;
+	if (entries!=0)
+		wordmove(pD,pS,entries*iEntrySize);
+	wordmove(pS,anEntry,iEntrySize);
+	iCount++;
+	return KErrNone;
+	}
+
+EXPORT_C void RArrayBase::Remove(TInt anIndex)
+	{
+	__ASSERT_ALWAYS((anIndex>=0 && anIndex<iCount),Panic(EBadArrayIndex));
+	TUint8 *pD=(TUint8*)iEntries+anIndex*iEntrySize;
+	TUint8 *pS=pD+iEntrySize;
+	TInt entries=iCount-anIndex-1;
+	if (entries!=0)
+		wordmove(pD,pS,entries*iEntrySize);
+	iCount--;
+	}
+
+EXPORT_C void RArrayBase::Compress()
+	{
+	if (iCount)
+		iEntries=STD_CLASS::ReAlloc(iEntries,iCount*iEntrySize); // can't fail
+	else
+		{
+		STD_CLASS::Free(iEntries);
+		iEntries=NULL;
+		}
+	iAllocated=iCount;
+	}
+
+#ifndef __KERNEL_MODE__
+EXPORT_C void RArrayBase::GranularCompress()
+	{
+	TInt newAlloc = CalculateArraySizeAfterShrink(iAllocated, iGranularity, iCount);
+	if (newAlloc == iAllocated)
+		return;
+	if (newAlloc)
+		iEntries=STD_CLASS::ReAlloc(iEntries,newAlloc*iEntrySize); // can't fail
+	else
+		{
+		STD_CLASS::Free(iEntries);
+		iEntries=NULL;
+		}
+	iAllocated=newAlloc;
+	}
+
+EXPORT_C TInt RArrayBase::DoReserve(TInt aCount)
+	{
+	__ASSERT_ALWAYS(aCount>=0, Panic(EArrayBadReserveCount));
+	if (aCount <= iAllocated)
+		return KErrNone;	// if allocated space is already sufficient, nothing to do
+
+	Int64 size = Int64(aCount) * Int64(iEntrySize);
+	if (size > Int64(KMaxTInt))
+		return KErrNoMemory;
+
+	TAny** pA = (TAny**)STD_CLASS::ReAlloc(iEntries, aCount*iEntrySize);
+	if (!pA)
+		return KErrNoMemory;
+	iEntries = pA;
+	iAllocated = aCount;
+	return KErrNone;
+	}
+#endif
+
+EXPORT_C void RArrayBase::Reset()
+	{
+	iCount=0;
+	STD_CLASS::Free(iEntries);
+	iEntries=NULL;
+	iAllocated=0;
+	}
+
+EXPORT_C TInt RArrayBase::BinarySearch(const TAny* anEntry, TInt& anIndex, TGeneralLinearOrder anOrder) const
+	{
+	return BinarySearch(anEntry, anIndex, anOrder, EArrayFindMode_Any);
+	}
+
+#ifndef __ARRAY_MACHINE_CODED__
+EXPORT_C TInt RArrayBase::Find(const TAny* anEntry) const
+	{
+	TUint8 *pS=(TUint8*)iEntries+iKeyOffset;
+	TInt match=*(TInt*)((TUint8*)anEntry+iKeyOffset);
+	TInt i;
+	for (i=0; i<iCount; i++)
+		{
+		TInt key=*(TInt*)pS;
+		if (key==match)
+			return i;
+		pS+=iEntrySize;
+		}
+	return KErrNotFound;
+	}
+
+EXPORT_C TInt RArrayBase::Find(const TAny* anEntry, TGeneralIdentityRelation anIdentity) const
+	{
+	TUint8 *pS=(TUint8*)iEntries;
+	TInt i;
+	for (i=0; i<iCount; i++)
+		{
+		if ((*anIdentity)(anEntry,pS))
+			return i;
+		pS+=iEntrySize;
+		}
+	return KErrNotFound;
+	}
+
+EXPORT_C TInt RArrayBase::BinarySearchSigned(const TAny* anEntry, TInt& anIndex) const
+	{
+	return BinarySearchSigned(anEntry, anIndex, EArrayFindMode_Any);
+	}
+
+EXPORT_C TInt RArrayBase::BinarySearchSigned(const TAny* anEntry, TInt& anIndex, TInt aMode) const
+	{
+	__ASSERT_DEBUG(TUint(aMode)<TUint(EArrayFindMode_Limit), Panic(EBadArrayFindMode));
+	TInt match=*(TInt*)((TUint8*)anEntry+iKeyOffset);
+	TUint8* pK=(TUint8*)iEntries+iKeyOffset;
+	TInt l=0;
+	TInt r=iCount;
+	TInt ret = KErrNotFound;
+	while(r>l)
+		{
+		TInt m=(l+r)>>1;
+		TInt h=*(TInt*)(pK+m*iEntrySize);
+		if (match==h)
+			{
+			if (aMode == EArrayFindMode_Any)
+				{
+				anIndex=m;
+				return KErrNone;
+				}
+			ret = KErrNone;
+			if (aMode == EArrayFindMode_First)
+				r=m;
+			else
+				l=m+1;
+			}
+		else if (match>h)
+			l=m+1;
+		else
+			r=m;
+		}
+	anIndex=r;
+	return ret;
+	}
+
+EXPORT_C TInt RArrayBase::BinarySearchUnsigned(const TAny* anEntry, TInt& anIndex) const
+	{
+	return BinarySearchUnsigned(anEntry, anIndex, EArrayFindMode_Any);
+	}
+
+EXPORT_C TInt RArrayBase::BinarySearchUnsigned(const TAny* anEntry, TInt& anIndex, TInt aMode) const
+	{
+	__ASSERT_DEBUG(TUint(aMode)<TUint(EArrayFindMode_Limit), Panic(EBadArrayFindMode));
+	TUint match=*(TUint*)((TUint8*)anEntry+iKeyOffset);
+	TUint8* pK=(TUint8*)iEntries+iKeyOffset;
+	TInt l=0;
+	TInt r=iCount;
+	TInt ret = KErrNotFound;
+	while(r>l)
+		{
+		TInt m=(l+r)>>1;
+		TUint h=*(TUint*)(pK+m*iEntrySize);
+		if (match==h)
+			{
+			if (aMode == EArrayFindMode_Any)
+				{
+				anIndex=m;
+				return KErrNone;
+				}
+			ret = KErrNone;
+			if (aMode == EArrayFindMode_First)
+				r=m;
+			else
+				l=m+1;
+			}
+		else if (match>h)
+			l=m+1;
+		else
+			r=m;
+		}
+	anIndex=r;
+	return ret;
+	}
+
+EXPORT_C TInt RArrayBase::BinarySearch(const TAny* anEntry, TInt& anIndex, TGeneralLinearOrder anOrder, TInt aMode) const
+	{
+	__ASSERT_DEBUG(TUint(aMode)<TUint(EArrayFindMode_Limit), Panic(EBadArrayFindMode));
+	TInt l=0;
+	TInt r=iCount;
+	TInt ret = KErrNotFound;
+	while(r>l)
+		{
+		TInt m=(l+r)>>1;
+		TInt k=(*anOrder)(anEntry,(TUint8*)iEntries+m*iEntrySize);
+		if (k==0)
+			{
+			if (aMode == EArrayFindMode_Any)
+				{
+				anIndex=m;
+				return KErrNone;
+				}
+			ret = KErrNone;
+			if (aMode == EArrayFindMode_First)
+				r=m;
+			else
+				l=m+1;
+			}
+		else if (k>0)
+			l=m+1;
+		else
+			r=m;
+		}
+	anIndex=r;
+	return ret;
+	}
+
+EXPORT_C TInt RArrayBase::FindIsqSigned(const TAny* anEntry) const
+	{
+	return FindIsqSigned(anEntry, EArrayFindMode_Any);
+	}
+
+EXPORT_C TInt RArrayBase::FindIsqUnsigned(const TAny* anEntry) const
+	{
+	return FindIsqUnsigned(anEntry, EArrayFindMode_Any);
+	}
+
+EXPORT_C TInt RArrayBase::FindIsq(const TAny* anEntry, TGeneralLinearOrder anOrder) const
+	{
+	return FindIsq(anEntry, anOrder, EArrayFindMode_Any);
+	}
+
+EXPORT_C TInt RArrayBase::FindIsqSigned(const TAny* anEntry, TInt aMode) const
+	{
+	TInt i;
+	TInt r=BinarySearchSigned(anEntry,i,aMode);
+	return (r==KErrNone)?i:r;
+	}
+
+EXPORT_C TInt RArrayBase::FindIsqUnsigned(const TAny* anEntry, TInt aMode) const
+	{
+	TInt i;
+	TInt r=BinarySearchUnsigned(anEntry,i,aMode);
+	return (r==KErrNone)?i:r;
+	}
+
+EXPORT_C TInt RArrayBase::FindIsq(const TAny* anEntry, TGeneralLinearOrder anOrder, TInt aMode) const
+	{
+	TInt i;
+	TInt r=BinarySearch(anEntry,i,anOrder,aMode);
+	return (r==KErrNone)?i:r;
+	}
+#endif
+
+EXPORT_C TInt RArrayBase::FindReverse(const TAny* anEntry) const
+	{
+	TUint8 *pS=(TUint8*)iEntries+(iCount-1)*iEntrySize+iKeyOffset;
+	TInt match=*(TInt*)((TUint8*)anEntry+iKeyOffset);
+	TInt i=iCount;
+	while(i--)
+		{
+		TInt key=*(TInt*)pS;
+		if (key==match)
+			return i;
+		pS-=iEntrySize;
+		}
+	return KErrNotFound;
+	}
+
+EXPORT_C TInt RArrayBase::FindReverse(const TAny* anEntry, TGeneralIdentityRelation anIdentity) const
+	{
+	TUint8 *pS=(TUint8*)iEntries+(iCount-1)*iEntrySize;
+	TInt i=iCount;
+	while (i--)
+		{
+		if ((*anIdentity)(anEntry,pS))
+			return i;
+		pS-=iEntrySize;
+		}
+	return KErrNotFound;
+	}
+
+EXPORT_C TInt RArrayBase::InsertIsqSigned(const TAny* anEntry, TBool aAllowRepeats)
+	{
+	TInt i;
+	TInt mode = aAllowRepeats ? EArrayFindMode_Last : EArrayFindMode_Any;
+	TInt r=BinarySearchSigned(anEntry,i,mode);
+	if (r==KErrNotFound || aAllowRepeats)
+		return Insert((const TAny*)anEntry,i);
+	return KErrAlreadyExists;
+	}
+
+EXPORT_C TInt RArrayBase::InsertIsqUnsigned(const TAny* anEntry, TBool aAllowRepeats)
+	{
+	TInt i;
+	TInt mode = aAllowRepeats ? EArrayFindMode_Last : EArrayFindMode_Any;
+	TInt r=BinarySearchUnsigned(anEntry,i,mode);
+	if (r==KErrNotFound || aAllowRepeats)
+		return Insert((const TAny*)anEntry,i);
+	return KErrAlreadyExists;
+	}
+
+EXPORT_C TInt RArrayBase::InsertIsq(const TAny* anEntry, TGeneralLinearOrder anOrder, TBool aAllowRepeats)
+	{
+	TInt i;
+	TInt mode = aAllowRepeats ? EArrayFindMode_Last : EArrayFindMode_Any;
+	TInt r=BinarySearch(anEntry,i,anOrder,mode);
+	if (r==KErrNotFound || aAllowRepeats)
+		return Insert((const TAny*)anEntry,i);
+	return KErrAlreadyExists;
+	}
+
+#ifndef __KERNEL_MODE__
+#ifndef __ARRAY_MACHINE_CODED__
+EXPORT_C void RArrayBase::HeapSortSigned()
+	{
+	TUint32 si[KSimpleArrayMaxEntrySize/4];
+	TInt ss = iCount;
+	if (ss>1)
+		{
+		TInt sh = ss>>1;
+		FOREVER
+			{
+			if (sh!=0)
+				{
+				--sh;
+				wordmove(si,(TUint8*)iEntries+sh*iEntrySize,iEntrySize);
+				}
+			else
+				{
+				--ss;
+				wordmove(si,(TUint8*)iEntries+ss*iEntrySize,iEntrySize);
+				wordmove((TUint8*)iEntries+ss*iEntrySize,iEntries,iEntrySize);
+				if (ss==1)
+					{
+					wordmove(iEntries,si,iEntrySize);
+					break;
+					}
+				}
+			TInt ii = sh;
+			TInt jj = sh;
+			TInt sikey=*(TInt*)((TUint8*)si+iKeyOffset);
+			FOREVER
+				{
+				jj = (jj+1)<<1;
+				TUint8* pKey=((TUint8*)iEntries+jj*iEntrySize+iKeyOffset);
+				if (jj>=ss || (*(TInt*)(pKey-iEntrySize))>*(TInt*)pKey )
+					{
+					--jj;
+					pKey-=iEntrySize;
+					}
+				if (jj>=ss || *(TInt*)pKey<=sikey)
+					break;
+				wordmove((TUint8*)iEntries+ii*iEntrySize,(TUint8*)iEntries+jj*iEntrySize,iEntrySize);
+				ii = jj;
+				}
+			wordmove((TUint8*)iEntries+ii*iEntrySize,si,iEntrySize);
+			}
+		}
+	}
+
+EXPORT_C void RArrayBase::HeapSortUnsigned()
+	{
+	TUint32 si[KSimpleArrayMaxEntrySize/4];
+	TInt ss = iCount;
+	if (ss>1)
+		{
+		TInt sh = ss>>1;
+		FOREVER
+			{
+			if (sh!=0)
+				{
+				--sh;
+				wordmove(si,(TUint8*)iEntries+sh*iEntrySize,iEntrySize);
+				}
+			else
+				{
+				--ss;
+				wordmove(si,(TUint8*)iEntries+ss*iEntrySize,iEntrySize);
+				wordmove((TUint8*)iEntries+ss*iEntrySize,iEntries,iEntrySize);
+				if (ss==1)
+					{
+					wordmove(iEntries,si,iEntrySize);
+					break;
+					}
+				}
+			TInt ii = sh;
+			TInt jj = sh;
+			TUint sikey=*(TUint*)((TUint8*)si+iKeyOffset);
+			FOREVER
+				{
+				jj = (jj+1)<<1;
+				TUint8* pKey=((TUint8*)iEntries+jj*iEntrySize+iKeyOffset);
+				if (jj>=ss || (*(TUint*)(pKey-iEntrySize))>*(TUint*)pKey )
+					{
+					--jj;
+					pKey-=iEntrySize;
+					}
+				if (jj>=ss || *(TUint*)pKey<=sikey)
+					break;
+				wordmove((TUint8*)iEntries+ii*iEntrySize,(TUint8*)iEntries+jj*iEntrySize,iEntrySize);
+				ii = jj;
+				}
+			wordmove((TUint8*)iEntries+ii*iEntrySize,si,iEntrySize);
+			}
+		}
+	}
+
+EXPORT_C void RArrayBase::HeapSort(TGeneralLinearOrder anOrder)
+	{
+	TUint32 si[KSimpleArrayMaxEntrySize/4];
+	TInt ss = iCount;
+	if (ss>1)
+		{
+		TInt sh = ss>>1;
+		FOREVER
+			{
+			if (sh!=0)
+				{
+				--sh;
+				wordmove(si,(TUint8*)iEntries+sh*iEntrySize,iEntrySize);
+				}
+			else
+				{
+				--ss;
+				wordmove(si,(TUint8*)iEntries+ss*iEntrySize,iEntrySize);
+				wordmove((TUint8*)iEntries+ss*iEntrySize,iEntries,iEntrySize);
+				if (ss==1)
+					{
+					wordmove(iEntries,si,iEntrySize);
+					break;
+					}
+				}
+			TInt ii = sh;
+			TInt jj = sh;
+			FOREVER
+				{
+				jj = (jj+1)<<1;
+				TUint8* pJJ=((TUint8*)iEntries+jj*iEntrySize);
+				if (jj>=ss || (*anOrder)(pJJ-iEntrySize,pJJ)>0)
+					{
+					--jj;
+					pJJ-=iEntrySize;
+					}
+				if (jj>=ss || (*anOrder)(pJJ,si)<=0)
+					break;
+				wordmove((TUint8*)iEntries+ii*iEntrySize,(TUint8*)iEntries+jj*iEntrySize,iEntrySize);
+				ii = jj;
+				}
+			wordmove((TUint8*)iEntries+ii*iEntrySize,si,iEntrySize);
+			}
+		}
+	}
+#endif
+
+EXPORT_C TInt RArrayBase::GetCount(const CBase* aPtr)
+	{
+	return ((RArrayBase*)aPtr)->Count();
+	}
+
+EXPORT_C const TAny* RArrayBase::GetElementPtr(const CBase* aPtr, TInt aIndex)
+	{
+	return ((RArrayBase*)aPtr)->At(aIndex);
+	}
+#endif	// __KERNEL_MODE__
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32/common/common.h	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,81 @@
+// Copyright (c) 1994-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32\common\common.h
+// 
+//
+
+#ifndef __E32_COMMON_H__
+#define __E32_COMMON_H__
+
+#ifdef __KERNEL_MODE__
+#include <e32cmn.h>
+#include <e32panic.h>
+#include <u32std.h>
+#else
+#include <e32std.h>
+#include <e32base.h>
+#include <e32math.h>
+#include <e32svr.h>
+#include <e32ver.h>
+#include <e32hal.h>
+#include <e32panic.h>
+#include <u32exec.h>
+#endif
+
+GLREF_C void Panic(TCdtPanic aPanic);
+GLDEF_C void PanicBadArrayIndex();
+GLREF_C TInt __DoConvertNum(TUint, TRadix, TUint, TUint8*&);
+GLREF_C TInt __DoConvertNum(Uint64, TRadix, TUint, TUint8*&);
+
+#ifdef __KERNEL_MODE__
+GLREF_C void KernHeapFault(TCdtPanic aPanic);
+GLREF_C void KHeapCheckThreadState();
+TInt StringLength(const TUint16* aPtr);
+TInt StringLength(const TUint8* aPtr);
+
+#define	STD_CLASS					Kern
+#define	STRING_LENGTH(s)			StringLength(s)
+#define	STRING_LENGTH_16(s)			StringLength(s)
+#define	PANIC_CURRENT_THREAD(c,r)	Kern::PanicCurrentThread(c, r)
+#define __KERNEL_CHECK_RADIX(r)		__ASSERT_ALWAYS(((r)==EDecimal)||((r)==EHex),Panic(EInvalidRadix))
+#define	APPEND_BUF_SIZE				10
+#define	APPEND_BUF_SIZE_64			20
+#define	HEAP_PANIC(r)				RHeapK::Fault(r)
+#define	GET_PAGE_SIZE(x)			x = M::PageSizeInBytes()
+#define	DIVISION_BY_ZERO()			FAULT()
+
+#ifdef _DEBUG
+#define	__CHECK_THREAD_STATE		RHeapK::CheckThreadState()
+#else
+#define	__CHECK_THREAD_STATE
+#endif
+
+#else
+
+#define	STD_CLASS					User
+#define	STRING_LENGTH(s)			User::StringLength(s)
+#define	STRING_LENGTH_16(s)			User::StringLength(s)
+#define	PANIC_CURRENT_THREAD(c,r)	User::Panic(c, r)
+#define	MEM_COMPARE_16				Mem::Compare
+#define __KERNEL_CHECK_RADIX(r)
+#define	APPEND_BUF_SIZE				32
+#define	APPEND_BUF_SIZE_64			64
+#define	HEAP_PANIC(r)				Panic(r)
+#define	GET_PAGE_SIZE(x)			UserHal::PageSizeInBytes(x)
+#define	DIVISION_BY_ZERO()			User::RaiseException(EExcIntegerDivideByZero)
+#define	__CHECK_THREAD_STATE
+
+#endif	// __KERNEL_MODE__
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32/common/des16.cpp	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,4316 @@
+// Copyright (c) 1994-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32\common\des16.cpp
+// 
+//
+
+#include "common.h"
+#include <collate.h>
+#ifdef _UNICODE
+#include <unicode.h>
+#include "collateimp.h"
+#endif
+#include "compareimp.h"
+
+
+#define __CHECK_ALIGNMENT(p,c) __ASSERT_DEBUG(!(TUint(p)&1),Des16Panic(c))
+
+enum TDes16Panic
+	{
+	ETDesC16ConstructCString=0,
+	ETDesC16ConstructBufLength=1,
+	ETDesC16ConstructBufLengthMax=2,
+	ETDesC16FindPtrLen=3,
+	ETDesC16FindFPtrLen=4,
+	ETDesC16FindCPtrLen=5,
+	ETBufCBase16CopyStringMax=6,
+	EHBufC16AssignCString=7,
+	ETDes16AssignCString=8,
+	ETDes16CopyCString=9,
+	ETDes16CopyBufLength=10,
+	ETDes16AppendBufLength=11,
+	ETDes16RepeatBufLength=12,
+	ETDes16AppendJustify1=13,
+	ETDes16AppendJustify2=14,
+	ETPtrC16SetBufLength=15,
+	ETPtr16SetBufLengthMax=16,
+	ETDesC16Invariant=17,
+	ETDesC16Ptr=18
+	};
+
+#ifdef _DEBUG
+_LIT(KLitDes16Align,"Des16Align");
+void Des16Panic(TDes16Panic aPanic)
+	{
+	PANIC_CURRENT_THREAD(KLitDes16Align,aPanic);
+	}
+#endif
+
+inline TUint16* memCopy(TUint16* aPtr, const TUint16* aSrc, TInt aLength)
+	{
+	return (TUint16 *)Mem::Copy(aPtr,aSrc,aLength<<1);
+	}
+
+#if !defined( __DES16_MACHINE_CODED__) | defined(__EABI_CTORS__)
+inline TInt StringLength(const TUint16* aPtr)
+	{
+	const TUint16* p = aPtr;
+	while (*p)
+		++p;
+	return p-aPtr;
+	}
+#endif
+
+inline TDesC16::TDesC16(TInt aType,TInt aLength)
+	:iLength(aLength|(aType<<KShiftDesType16))
+	{}
+inline TInt TDesC16::Type() const
+//
+// Return the descriptor type
+//
+	{
+	return(iLength>>KShiftDesType16);
+	}
+
+inline TDes16::TDes16(TInt aType,TInt aLength,TInt aMaxLength)
+	: TDesC16(aType,aLength),iMaxLength(aMaxLength)
+	{}
+
+// Class TBufCBase16
+inline TBufCBase16::TBufCBase16(TInt aLength)
+	:TDesC16(EBufC,aLength)
+	{}
+inline TUint16* TBufCBase16::WPtr() const
+	{return const_cast<TUint16*>(Ptr());}
+
+#if !defined( __DES16_MACHINE_CODED__) | defined(__EABI_CTORS__)
+EXPORT_C TPtr16::TPtr16(TBufCBase16& aLcb, TInt aMaxLength)
+	: TDes16(EBufCPtr,aLcb.Length(),aMaxLength),iPtr((TUint16*)&aLcb)
+	{
+	__ASSERT_DEBUG(aLcb.Length()<=aMaxLength,Panic(ETDes16LengthOutOfRange));
+	}
+#endif
+
+#if !defined( __DES16_MACHINE_CODED__)
+/**
+Gets a pointer to the data represented by the descriptor.
+
+The data cannot be changed through the returned pointer.
+
+@return A pointer to the data
+*/
+EXPORT_C const TUint16 *TDesC16::Ptr() const
+	{
+
+	const TUint16* p=NULL;
+	switch (Type())
+		{
+	case EBufC:
+		p=(&((SBufC16 *)this)->buf[0]); break;
+	case EPtrC:
+		p=(((SPtrC16 *)this)->ptr); break;
+	case EPtr:
+		p=(((SPtr16 *)this)->ptr); break;
+	case EBuf:
+		p=(&((SBuf16 *)this)->buf[0]); break;
+	case EBufCPtr:
+		p=(&((SBufCPtr16 *)this)->ptr->buf[0]); break;
+	default:
+		Panic(ETDes16BadDescriptorType);
+		}
+	__CHECK_ALIGNMENT(p,ETDesC16Ptr);
+	return p;
+	}
+
+EXPORT_C const TUint16 &TDesC16::AtC(TInt anIndex) const
+//
+// Return a reference to the character in the buffer.
+//
+	{
+
+	__ASSERT_ALWAYS(anIndex>=0 && anIndex<Length(),Panic(ETDes16IndexOutOfRange));
+	return(Ptr()[anIndex]);
+	}
+
+
+
+
+/**
+Compares this descriptor's data with the specified descriptor's data.
+
+The comparison proceeds on a double-byte for double byte basis.
+The result of the comparison is based on the difference of the first pair
+of bytes to disagree.
+
+Two descriptors are equal if they have the same length and content. Where 
+two descriptors have different lengths and the shorter descriptor's data 
+matches the first part of the longer descriptor's data, the shorter is
+considered to be less than the longer.
+
+@param aDes The 16-bit non-modifable descriptor whose data is to be compared 
+            with this descriptor's data. 
+            
+@return Positive. if this descriptor is greater than the specified descriptor.
+        Negative. if this descriptor is less than the specified descriptor.
+        Zero, if both descriptors have the same length and the their contents
+        are the same.
+*/
+EXPORT_C TInt TDesC16::Compare(const TDesC16 &aDes) const
+	{
+	return MEM_COMPARE_16(Ptr(),Length(),aDes.Ptr(),aDes.Length());
+	}
+
+
+
+
+/**
+Compares this descriptor's folded data with the specified descriptor's folded 
+data.
+
+Note that folding is locale-independent behaviour. It is also important to 
+note that there can be no guarantee that folding is in any way culturally 
+appropriate, and should not be used for comparing strings in natural language; 
+use CompareC() for this.
+
+@param aDes The 16-bit non-modifable descriptor whose data is to be compared 
+            with this descriptor's data. 
+            
+@return Positive, if this descriptor is greater than the specified descriptor. 
+        Negative, if this descriptor is less than the specified descriptor.
+        Zero, if both descriptors have the same length and the their contents
+        are the same.
+        
+@see TDesC16::Compare()
+*/
+EXPORT_C TInt TDesC16::CompareF(const TDesC16 &aDes) const
+	{
+
+	return(Mem::CompareF(Ptr(),Length(),aDes.Ptr(),aDes.Length()));
+	}
+
+
+
+
+/**
+Compares this descriptor's data with the specified descriptor's data using 
+the standard collation method appropriate to the current locale.
+
+@param aDes The 16-bit non-modifable descriptor whose data is to be compared 
+            with this descriptor's data. 
+            
+@return Positive, if this descriptor is greater than the specified descriptor. 
+        Negative, if this descriptor is less than the specified descriptor.
+        Zero, if the content of both descriptors match.
+        
+@see TDesC16::Compare()
+*/
+EXPORT_C TInt TDesC16::CompareC(const TDesC16 &aDes) const
+	{
+
+	return(Mem::CompareC(Ptr(),Length(),aDes.Ptr(),aDes.Length()));
+	}
+#endif
+
+
+
+
+#ifdef _UNICODE
+/**
+Compares this descriptor's data with the specified descriptor's data to the 
+specified maximum collation level and using the specified collation method.
+
+If no collation method is supplied, a default method is used that uses a
+locale-independent collation table. This means that sorting and matching will
+not be based on the current locale.
+
+This function is only defined for 16-bit (Unicode) build variants. This means 
+that the function is not defined for 8-bit build variants, even when an
+explicit 16-bit descriptor is used.
+
+Strings may match even if the lengths of their respective descriptors are 
+different.
+
+@param aDes             The 16-bit non-modifable descriptor whose data is to
+                        be compared with this descriptor's data.
+                          
+@param aMaxLevel        The maximum collation level. This is an integer with 
+                        values: 0, 1, 2 or 3, which, effectively, determines
+                        how 'tight' the matching should be. Level 3 is always
+                        used if the aim is to sort strings.
+                 
+@param aCollationMethod A pointer to the collation method or NULL. Collation 
+                        methods can be retrieved by calls to
+                        Mem::CollationMethodByIndex()
+                        and Mem::CollationMethodById(). 
+                        Specifying NULL means that the default method is used.
+                        
+@return Positive, if this descriptor is greater than the specified descriptor. 
+        Negative, if this descriptor is less than the specified descriptor.
+        Zero, if the content of both descriptors match.
+        
+@see Mem::CollationMethodByIndex()
+@see Mem::CollationMethodById()
+@see TDesC16::Compare()
+*/
+EXPORT_C TInt TDesC16::CompareC(const TDesC16& aDes, TInt aMaxLevel, const TCollationMethod* aCollationMethod) const
+	{
+	return Mem::CompareC(Ptr(),Length(),aDes.Ptr(),aDes.Length(),aMaxLevel,aCollationMethod);
+	}
+
+/**
+Get the normalized decomposed form of this 16 bit descriptor
+@return A pointer to the 16-bit heap buffer containing normalized decomposed form
+		if creation is successful
+@leave KErrNoMemory if not enough memory to construct the output buffer
+*/
+EXPORT_C HBufC16* TDesC16::GetNormalizedDecomposedFormL() const
+	{
+	//pre create a buffer with of size Length
+	TInt strLength=Length();
+	HBufC16* outBuf=HBufC16::NewL(strLength);
+
+	TUTF32Iterator input(Ptr(),Ptr()+strLength);
+	TCanonicalDecompositionIterator output;
+	output.Set(input);
+
+	TInt currentAllocateCount=0;
+	TUint16* outPtr = (TUint16* )outBuf->Des().Ptr();
+	TInt preAllocateCount= outBuf->Des().MaxLength();
+
+	for (;!output.AtEnd();output.Next(),currentAllocateCount++)
+		{
+		if (currentAllocateCount>=preAllocateCount)
+			{
+			const TInt KMaxGrowSize=16;
+			HBufC16* newOutBuf = outBuf->ReAlloc(preAllocateCount+KMaxGrowSize);
+			if(!newOutBuf)
+				{
+				delete outBuf;
+				User::Leave(KErrNoMemory);
+				}
+			outBuf = newOutBuf;
+			preAllocateCount = outBuf->Des().MaxLength();
+			}
+		outPtr[currentAllocateCount] = (TUint16)(TUint)(output.Current());
+		}
+	// update the length of the buffer...
+	outBuf->Des().SetLength(currentAllocateCount);
+
+	//compress the unused slot
+	if (currentAllocateCount<preAllocateCount)
+		outBuf = outBuf->ReAlloc(currentAllocateCount); // can't fail to shrink memory
+	return outBuf;
+	}
+
+/**
+Get the folded decomposed form of this 16 bit descriptor
+@return A pointer to the 16-bit heap buffer containing folded decomposed form
+		if creation is succesful
+@leave KErrNoMemory if not enough memory to construct the output buffer
+*/	
+EXPORT_C HBufC16* TDesC16::GetFoldedDecomposedFormL() const
+	{
+	//pre create a buffer with of size Length
+	TInt strLength=Length();
+	HBufC16* outBuf=HBufC16::NewL(strLength);
+
+	TUTF32Iterator input(Ptr(),Ptr()+strLength);
+	TFoldedCanonicalIterator output (input);
+
+	TInt currentAllocateCount=0;
+	TUint16* outPtr = (TUint16* )outBuf->Des().Ptr();
+	TInt preAllocateCount= outBuf->Des().MaxLength();
+	const TUnicodeDataSet* charDataSet = GetLocaleCharSet()->iCharDataSet;
+	for (;!output.AtEnd();output.Next(charDataSet),currentAllocateCount++)
+		{
+		if (currentAllocateCount>=preAllocateCount)
+			{
+			const TInt KMaxGrowSize=16;
+			HBufC16* newOutBuf = outBuf->ReAlloc(preAllocateCount+KMaxGrowSize);
+			if(!newOutBuf)
+				{
+				delete outBuf;
+				User::Leave(KErrNoMemory);
+				}
+			outBuf = newOutBuf;
+			preAllocateCount = outBuf->Des().MaxLength();
+			}
+		outPtr[currentAllocateCount] = (TUint16)(TUint)(output.Current());
+		}
+	// update the length of the buffer...
+	outBuf->Des().SetLength(currentAllocateCount);
+
+	//compress the unused slot
+	if (currentAllocateCount<preAllocateCount)
+		outBuf = outBuf->ReAlloc(currentAllocateCount); // can't fail to shrink memory
+	return outBuf;
+	}
+
+//some utils function
+static void ResetAndDestroyArray(TAny* aPtr)
+	{
+	(STATIC_CAST(RPointerArray<HBufC8>*,aPtr))->ResetAndDestroy();
+	}
+
+/**
+Get the collation keys of this 16 bit descriptor for a given collation level
+If no collation method is supplied, a default method is used that uses a
+locale-independent collation table. 
+@param aMaxLevel        The maximum collation level. This is an integer with 
+                        values: 0, 1, 2 or 3. Level 3 is always
+                        used if the aim is to sort strings.
+@param aCollationMethod A pointer to the collation method or NULL. Collation 
+                        methods can be retrieved by calls to
+                        Mem::CollationMethodByIndex()
+                        and Mem::CollationMethodById(). 
+                        Specifying NULL means that the default method is used.
+@return A pointer to the 8-bit heap buffer containing the collation keys if
+		creation is succesful
+@leave KErrNoMemory if not enough memory to construct the output buffer		
+*/	
+EXPORT_C HBufC8* TDesC16::GetCollationKeysL(TInt aMaxLevel,const TCollationMethod* aCollationMethod) const
+	{
+	// Clamp the maximum level of the comparison.
+	if(aMaxLevel < 0)
+		aMaxLevel = 0;
+	if(aMaxLevel > 3)
+		aMaxLevel = 3;
+	
+	RPointerArray<HBufC8> levelBuffer;
+ 	CleanupStack::PushL(TCleanupItem(ResetAndDestroyArray, &levelBuffer));
+  	TInt strLength=Length();
+ 	TInt outputBufferSize=0;
+ 	
+  	//preallocate some initial buffer size as it is not possible to determine the max buffer
+  	//required as a character can be further decomposed and each character can possibly
+  	//have up to 8 collation keys and this limit might still change.
+	for (TInt i=0;i<=aMaxLevel;i++)
+		{
+		TInt levelKeySize=TCollationKey::MaxSizePerKey(i);
+		HBufC8* buffer=HBufC8::NewLC(strLength*levelKeySize);
+		levelBuffer.AppendL(buffer);
+		CleanupStack::Pop();
+		outputBufferSize+=levelKeySize;
+		}
+	TCollationMethod clm;
+	
+	//if collationMethod is NULL, use the default one
+	if (aCollationMethod==NULL)
+		{
+		clm=*(GetLocaleCharSet()->iCollationDataSet->iMethod);
+		}
+	else
+		{
+		clm = *aCollationMethod;			
+		}
+	//if the main table is empty use the standard table
+	if (clm.iMainTable==NULL)
+		clm.iMainTable=StandardCollationMethod();	
+	
+	TCollationValueIterator tvi(clm);	
+  	TUTF32Iterator input(Ptr(),Ptr()+strLength);	
+ 	tvi.SetSourceIt(input);
+
+	//Expand the buffer by 16 bytes if buffer is exhausted
+	const TInt KMaxBufferGrowSize=16;
+	TInt currentKeyCount=0;
+	TInt preAllocateCount=strLength;
+	TCollationKey collateKey;
+	for (;tvi.GetCurrentKey(collateKey);tvi.Increment(),currentKeyCount++)
+		{
+		for (TInt i=0;i<=aMaxLevel;i++)
+			{
+			if (currentKeyCount==preAllocateCount)
+				levelBuffer[i]=levelBuffer[i]->ReAllocL((currentKeyCount+KMaxBufferGrowSize)*TCollationKey::MaxSizePerKey(i));
+			
+			collateKey.AppendToDescriptor(levelBuffer[i]->Des(),i);
+			}
+		if (currentKeyCount==preAllocateCount)
+			preAllocateCount+=KMaxBufferGrowSize;
+		}
+	//append the level separator which is a "\x00\x00" for level 0 and \x00 for other level
+	outputBufferSize=(outputBufferSize*currentKeyCount)+(aMaxLevel==0?0:4+(aMaxLevel-1)*2);
+	HBufC8* outputResult=HBufC8::NewL(outputBufferSize);
+	TPtr8 outputResultPtr(outputResult->Des());
+	for (TInt count=0;count<=aMaxLevel;count++)
+		{
+		outputResultPtr.Append(*levelBuffer[count]);
+		if (count!=aMaxLevel)
+			{
+			if (count==0)
+				outputResultPtr.Append(0);
+			outputResultPtr.Append(0);
+			}
+		}
+	CleanupStack::PopAndDestroy();
+	return outputResult;	
+	}	
+
+#endif
+
+/**
+Searches for the first occurrence of the specified data sequence within this
+descriptor.
+
+Searching always starts at the beginning of this descriptor's data.
+
+@param pS    A pointer to a location containing the data sequence to be searched 
+             for.
+             
+@param aLenS The length of the data sequence to be searched for. This value 
+             must not be negative, otherwise the function raises a panic.
+             
+@return The offset of the data sequence from the beginning of this descriptor's 
+        data. KErrNotFound, if the data sequence cannot be found.
+       
+@panic  USER 17 if aLenS is negative. 
+*/
+EXPORT_C TInt TDesC16::Find(const TUint16 *pS,TInt aLenS) const
+	{
+
+	if (!aLenS)
+		return(0);
+	__ASSERT_ALWAYS(aLenS>0,Panic(ETDes16LengthNegative));
+	__CHECK_ALIGNMENT(pS,ETDesC16FindPtrLen);
+	const TUint16 *pB=Ptr();
+	TInt aLenB=Length();
+	const TUint16 *pC=pB-1;			// using pre-increment addressing
+	TInt i=aLenB-aLenS;
+	if (i>=0)
+		{
+		const TUint16* pEndS=pS+aLenS-1;		// using pre-increment addressing
+		const TUint16 *pEndB=pB+i;			// using pre-increment addressing
+		TUint s=*pS;
+		for (;;)
+			{
+			do
+				{
+				if (pC==pEndB)
+					return KErrNotFound;
+				} while (*++pC!=s);
+			const TUint16 *p1=pC;
+			const TUint16 *p2=pS;
+			do
+				{
+				if (p2==pEndS)
+					return (pC-pB);
+				} while (*++p1==*++p2);
+			}
+		}
+	return(KErrNotFound);
+	}
+
+
+
+
+/**
+Searches for the first occurrence of the specified data sequence within this 
+descriptor.
+
+Searching always starts at the beginning of this descriptor's 
+data.
+
+@param aDes The 16-bit non-modifiable descriptor containing the data sequence 
+            to be searched for. 
+            
+@return The offset of the data sequence from the beginning of this descriptor's 
+        data. KErrNotFound, if the data sequence cannot be found.
+*/
+EXPORT_C TInt TDesC16::Find(const TDesC16 &aDes) const
+	{
+
+	return(Find(aDes.Ptr(),aDes.Length()));
+	}
+
+
+
+
+/**
+Searches for the first occurrence of the specified folded data sequence within
+this descriptor's folded data.
+
+Searching always starts at the beginning of this descriptor's data.
+
+Note that folding is locale-independent behaviour. It is also important to
+note that there can be no guarantee that folding is in any way culturally
+appropriate, and should not be used for finding strings in natural language;
+use FindC() for this.
+
+@param pS    A pointer to a location containing the data sequence to be
+             searched for.
+@param aLenS The length of the data sequence to be searched for. This value 
+             must not be negative, otherwise the function raises a panic.
+             
+@return The offset of the data sequence from the beginning of this descriptor's 
+        data. KErrNotFound, if the data sequence cannot be found. Zero, if the
+        length of the search data sequence is zero.
+
+@panic USER 17 if aLenS is negative
+
+@see TDesC16::FindC()
+*/
+EXPORT_C TInt TDesC16::FindF(const TUint16 *pS,TInt aLenS) const
+	{
+	__CHECK_ALIGNMENT(pS,ETDesC16FindFPtrLen);
+	TUTF32Iterator candidateStrIt(Ptr(), Ptr() + Length());
+	TUTF32Iterator searchTermIt(pS, pS + aLenS);
+	return ::FindFolded(candidateStrIt, searchTermIt);
+	}
+
+
+
+
+/**
+Searches for the first occurrence of the specified folded data sequence within 
+this descriptor's folded data.
+
+Searching always starts at the beginning of this descriptor's data.
+
+Note that folding is locale-independent behaviour. It is also important to 
+note that there can be no guarantee that folding is in any way culturally 
+appropriate, and should not be used for finding strings in natural language; 
+use FindC() for this.
+
+@param aDes The 16-bit non-modifable descriptor containing the data sequence 
+            to be searched for. 
+            
+@return The offset of the data sequence from the beginning of this descriptor's 
+        data. KErrNotFound, if the data sequence cannot be found.
+        Zero, if the length of the search data sequence is zero.
+        
+@see TDesC16::FindC()
+*/
+EXPORT_C TInt TDesC16::FindF(const TDesC16 &aDes) const
+	{
+	TUTF32Iterator candidateStrIt(Ptr(), Ptr() + Length());
+	TUTF32Iterator searchTermIt(aDes.Ptr(), aDes.Ptr() + aDes.Length());
+	return ::FindFolded(candidateStrIt, searchTermIt);
+	}
+
+
+
+
+/**
+Searches for the first occurrence of the specified collated data sequence within
+this descriptor's collated data.
+
+Searching always starts at the beginning of this descriptor's data. The function
+uses the standard collation method appropriate to the current locale.
+
+@param aText   A pointer to a location containing the data sequence to be
+               searched for.             
+@param aLength The length of the data sequence to be searched for.
+
+@return The offset of the data sequence from the beginning of this descriptor's data.
+        KErrNotFound, if the data sequence cannot be found. 
+
+@panic USER 17 if aLength is negative.
+*/
+EXPORT_C TInt TDesC16::FindC(const TUint16 *aText,TInt aLength) const
+	{
+	__CHECK_ALIGNMENT(aText,ETDesC16FindCPtrLen);
+
+	TCollate c(GetLocaleCharSet(),TCollationMethod::EIgnoreNone | TCollationMethod::EFoldCase);
+	return c.Find(Ptr(),Length(),aText,aLength,1);
+	}
+
+
+
+
+/**
+Searches for the first occurrence of the specified collated data sequence
+within this descriptor's collated data to the specified maximum collation
+level.
+
+@param aText            A pointer to a location containing the data sequence to
+                        be searched for.             
+                        
+@param aLength          The length of the data sequence to be searched for.
+                          
+@param aMaxLevel        The maximum collation level. This is an integer with 
+                        values: 0, 1, 2 or 3, which, effectively, determines
+                        how 'tight' the matching should be. Level 3 is always
+                        used if the aim is to sort strings.
+                       
+@return The offset of the data sequence from the beginning of this descriptor's data.
+        KErrNotFound, if the data sequence cannot be found. 
+*/
+EXPORT_C TInt TDesC16::FindC(const TUint16 *aText,TInt aLength, TInt aMaxLevel) const
+
+	{
+	__CHECK_ALIGNMENT(aText,ETDesC16FindCPtrLen);
+
+	TCollate c(GetLocaleCharSet(),TCollationMethod::EIgnoreNone | TCollationMethod::EFoldCase);
+	return c.Find(Ptr(),Length(),aText,aLength,aMaxLevel);
+	}
+
+
+
+
+/**
+Searches for the first occurrence of the specified collated data sequence 
+within this descriptor's collated data.
+
+Searching always starts at the beginning of this descriptor's data. The
+function uses the standard collation method appropriate to the current
+locale.
+
+@param aDes The 16-bit non-modifable descriptor containing the data sequence 
+            to be searched for. 
+            
+@return The offset of the data sequence from the beginning of this descriptor's 
+        data. KErrNotFound, if the data sequence cannot be found.
+*/
+EXPORT_C TInt TDesC16::FindC(const TDesC16 &aDes) const
+	{
+
+	return(FindC(aDes.Ptr(),aDes.Length()));
+	}
+
+/**
+Searches for the first occurrence of the specified collated data sequence 
+within this descriptor's collated data.
+
+Searching always starts at the beginning of this descriptor's data. The
+function uses the standard collation method appropriate to the current
+locale.
+
+@param aDes             The 16-bit non-modifable descriptor containing the data sequence 
+                        to be searched for.
+
+@param aLengthFound     A refernce to the maximal length of the match found in the candidate 
+                        string. KErrNotFound, if the data sequence cannot be found. 
+
+@param aCollationMethod A pointer to the collation method or NULL. Collation 
+                        methods can be retrieved by calls to
+                        Mem::CollationMethodByIndex()
+                        and Mem::CollationMethodById(). 
+                        Specifying NULL means that the default method is used.
+
+@param aMaxLevel        The maximum collation level. This is an integer with 
+                        values: 0, 1, 2 or 3, which, effectively, determines
+                        how 'tight' the matching should be. Level 3 is always
+                        used if the aim is to sort strings.
+                          
+@return The offset of the data sequence from the beginning of this descriptor's 
+        data. KErrNotFound, if the data sequence cannot be found.
+*/
+EXPORT_C TInt TDesC16::FindC(const TDesC16 &aDes, TInt &aLengthFound, const TCollationMethod &aMethod, TInt aMaxLevel) const
+	{
+	TCollate c(aMethod);
+	return c.Find(Ptr(),Length(),aDes.Ptr(),aDes.Length(),aLengthFound,aMaxLevel); 
+	}
+
+
+#ifdef _UNICODE
+LOCAL_C const TText* convTable(TMatchType aType)
+	{
+	switch (aType)
+		{
+		case EMatchFolded:											  // at present, folding is...
+		case EMatchCollated: return (const TText *)(TChar::EFoldStandard); // ...the same as collation: use all folding methods
+		default: return 0;
+		}
+	}
+#else
+LOCAL_C const TText* convTable(TMatchType aType)
+	{
+	switch (aType)
+		{
+		case EMatchFolded: return Locl::FoldTable();
+		case EMatchCollated: return Locl::CollTable();
+		default: return NULL;
+		}
+	}
+#endif
+
+inline TUint conv(const TUint16* aStr,const TText *aConv, const TUnicodeDataSet* aCharDataSet)
+//
+// If aConv is not NULL then convert the character.
+//
+	{
+
+#ifdef _UNICODE
+	if (aConv)
+		return TUnicode(*aStr).Fold((TInt)aConv, aCharDataSet);
+	else
+		return *aStr;
+#else
+	TUint c=*aStr;
+	return aConv && c<0x100 ? aConv[c] : c;
+#endif
+	}
+
+inline TUint lookup(const TUint16* aStr,const TText *aConv)
+	{
+#ifdef _UNICODE
+	return TUnicode(*aStr).Fold((TInt)aConv,GetLocaleCharSet()->iCharDataSet);
+#else
+	TUint c=*aStr;
+	return c<0x100 ? aConv[c] : c;
+#endif
+	}
+
+TInt DoMatch16(const TDesC16 &aLeftD,const TDesC16 &aRightD,TMatchType aType)
+	{
+	const TText* table=convTable(aType);
+	const TUint16* pRight=aRightD.Ptr();
+	const TUint16* pM=pRight-1;				// pre-increment addressing
+	const TUint16* pP=pM+aRightD.Length();
+	const TUint16* pLeft=aLeftD.Ptr()-1;		// pre-increment addressing
+	const TUint16* pB=pLeft;	
+	const TUint16* pE=pB+aLeftD.Length();
+
+
+	const TUnicodeDataSet* charDataSet = GetLocaleCharSet()->iCharDataSet;
+
+	// Match any pattern up to the first star
+	TUint c;
+	for (;;)
+		{
+		if (pM==pP)		// exhausted the pattern
+			return pB==pE ? 0 : KErrNotFound;
+		TUint c=conv(++pM,table, charDataSet);
+		if (c==KMatchAny)
+			break;
+		if (pB==pE)			// no more input
+			return KErrNotFound;
+		if (c!=conv(++pB,table, charDataSet) && c!=KMatchOne)	// match failed
+			return KErrNotFound;
+		}
+	// reached a star
+	if (pM==pP)
+		return 0;
+	TInt r=pM==pRight ? -1 : 0;
+	for (;;)
+		{
+		c=conv(++pM,table, charDataSet);
+		if (c==KMatchAny)
+			{
+star:		if (pM==pP)		// star at end of pattern, always matches
+				return Max(r,0);
+			if (r<-1)		// skipped some '?', matches at beginning
+				r=0;
+			continue;
+			}
+		if (pB==pE)			// no more input
+			return KErrNotFound;
+		if (c==KMatchOne)
+			{				// skip a character in the input
+			if (pM==pP)
+				return r+((r>=0) ? 0 : (pE-pLeft));
+			++pB;
+			if (r<0)
+				--r;
+			continue;
+			}
+	// Matching a non-wild character
+		for (;;)
+			{
+			if (table)
+				{
+				while (lookup(++pB,table)!=c)
+					{
+					if (pB==pE)				// no more input
+						return KErrNotFound;
+					}
+				}
+			else
+				{
+				while (*++pB!=c)
+					{
+					if (pB==pE)				// no more input
+						return KErrNotFound;
+					}
+				}
+			// Try to match up to the next star
+			const TUint16* pb=pB;
+			const TUint16* pm=pM;
+			for (;;)
+				{
+				if (pm<pP)
+					{
+					TUint cc=conv(++pm,table, charDataSet);
+					if (cc==KMatchAny)
+						{	// sub-match successful, back to main loop
+						r+=(r>=0 ? 0 : pB-pLeft);
+						pB=pb;
+						pM=pm;
+						goto star;
+						}
+					if (pb==pE)
+						return KErrNotFound;	// no more input
+					if (cc!=conv(++pb,table, charDataSet) && cc!=KMatchOne)
+						break;	// sub-match failed, try next input character
+					}
+				else if (pb==pE)	// end of matching pattern
+					return r+(r>=0 ? 0 : pB-pLeft);	// end of input, so have a match
+				else
+					break;		// try next input character
+				}
+			}
+		}
+	}
+
+
+
+EXPORT_C TDesC16::TPrefix TDesC16::HasPrefixC(const TDesC16& aPossiblePrefix,
+	TInt aLevel, const TCollationMethod* aCollationMethod) const
+/**
+Compares aPossiblePrefix against the start of the descriptor, using a
+collated comparison.
+
+@param aLevel The maximum level at which to perform the collation.
+
+              0: Only check character identities.
+       
+              1: Check accents as well.
+       
+              2: Check case as well.
+          
+              3: Check Unicode values.
+       
+              Currently only level 0 is supported.
+       
+@param aCollationMethod The collation method to be used for the matching.
+
+@return  EIsPrefix, if aPossiblePrefix can be extended to
+         be equivalent to the text at the start of this descriptor.
+         EIsNotPrefix if aPossiblePrefix cannot
+         be extended to be equivalent to the text at the start of this descriptor.
+         EMightBePrefix if it currently does not seem to be a prefix, but it
+         is possible that it could be extended to become equivalent to text at
+         the start of this descriptor.
+         EMightBePrefix is returned in cases where it would be expensive
+         to determine for sure.
+*/	
+	{
+	const TText16* lp = aPossiblePrefix.Ptr();
+	const TText16* rp = Ptr();
+	TInt ll = aPossiblePrefix.Length();
+	TInt rl = Length();
+	TInt r;
+	if (!aCollationMethod)
+		{
+		TCollate c(GetLocaleCharSet());
+		r = c.Compare(rp, rl, lp, ll, aLevel);
+		}
+	else
+		{
+		TCollate c(*aCollationMethod);
+		r = c.Compare(rp, rl, lp, ll, aLevel);
+		}
+	return r == 1 || r == 0? EIsPrefix : EIsNotPrefix;
+	}
+
+EXPORT_C TInt TDesC16::Match(const TDesC16 &aDes) const
+/**
+Searches this descriptor's data for a match with the match pattern supplied 
+in the specified descriptor.
+
+The match pattern can contain the wildcard characters "*" and "?", where "*" 
+matches zero or more consecutive occurrences of any character and "?" matches 
+a single occurrence of any character.
+
+Note that there is no 'escape character', which means that it is not possible
+to match either the "*" character itself or the "?" character itself using
+this function.
+
+@param aDes A 16-bit non-modifable descriptor containing the match pattern. 
+
+@return If a match is found, the offset within this descriptor's data where 
+        the match first occurs. KErrNotFound, if there is no match.
+*/
+	{
+
+	return DoMatch16(*this,aDes,EMatchNormal);
+
+	}
+
+EXPORT_C TInt TDesC16::MatchF(const TDesC16 &aDes) const
+/**
+Searches this descriptor's folded data for a match with the folded match pattern 
+supplied in the specified descriptor.
+
+The match pattern can contain the wildcard characters "*" and "?", where "*" 
+matches zero or more consecutive occurrences of any character and "?" matches 
+a single occurrence of any character.
+
+Note that folding is locale-independent behaviour. It is also important to 
+note that there can be no guarantee that folding is in any way culturally 
+appropriate, and should not be used for matching strings in natural language; 
+use MatchC() for this.
+
+Note that there is no 'escape character', which means that it is not possible
+to match either the "*" character itself or the "?" character itself using
+this function.
+
+@param aDes A 16-bit non-modifable descriptor containing the match pattern. 
+
+@return If a match is found, the offset within this descriptor's data where 
+        the match first occurs. KErrNotFound, if there is no match.
+        
+@see TDesC16::MatchC()
+*/
+	{
+	const TText16* csp = Ptr();
+	const TText16* stp = aDes.Ptr();
+	return LocateMatchStringFolded(csp, csp + Length(), stp, stp + aDes.Length());
+	}
+
+EXPORT_C TInt TDesC16::MatchC(const TDesC16 &aPattern) const
+/**
+Searches this descriptor's collated data for a match with the collated match 
+pattern supplied in the specified descriptor.
+
+The function uses the standard collation method appropriate to
+the current locale.
+	
+The match pattern can contain the wildcard characters "*" and "?", where "*" 
+matches zero or more consecutive occurrences of any character and "?" matches 
+a single occurrence of any character.
+
+Note that there is no 'escape character', which means that it is not possible
+to match either the "*" character itself or the "?" character itself using
+this function.
+	
+@param aPattern A 16-bit non-modifable descriptor containing the match pattern.
+
+@return If a match is found, the offset within this descriptor's data where 
+        the match first occurs. KErrNotFound, if there is no match.
+*/
+	{
+	TCollationMethod m=*Mem::GetDefaultMatchingTable();
+	m.iFlags |= (TCollationMethod::EIgnoreNone | TCollationMethod::EFoldCase);
+	TCollate c(m);
+	return c.Match(Ptr(), Length(), aPattern.Ptr(), aPattern.Length(), 0, '?', '*');
+	}
+
+/**
+Searches this descriptor's collated data for a match with the collated match 
+pattern supplied in the specified descriptor.
+
+The function uses the standard collation method appropriate to
+the current locale.
+	
+The match pattern can contain the wildcard characters specified by aWildChar and aWildSequenceChar 
+parameters, where aWildSequenceChar matches zero or more consecutive occurrences of any character and 
+aWildChar matches a single occurrence of any character.
+
+@param aPattern A 16-bit non-modifable descriptor containing the match pattern.
+@param aWildChar Wild card character which may be specified for aSearchTerm.
+@param aWildSequenceChar Wild card sequence character which may be specified for aSearchTerm.
+@param aEscapeChar The escape character, or 0 if there is to be none. The escape character removes any 
+ 				   special meaning from the subsequent character. For example, if the escape, wild card 
+ 				   and wild sequence characters are \, ? And * respectively, the search term "\?\*\\" matches 
+ 				   only the candidate string "?*\";
+@param aMaxLevel Determines the tightness of the collation. At level 0, only
+                 character identities are distinguished. At level 1 accents are
+                 distinguished as well. At level 2 case is distinguishes as well. At
+                 level 3 all valid different Unicode characters are considered different.
+@param aCollationMethod A pointer to the collation method or NULL. Collation methods can be retrieved by calls to
+				 Mem::CollationMethodByIndex() and Mem::CollationMethodById(). 
+				 Specifying NULL means that the default method is used.
+
+@return If a match is found, the offset within this descriptor's data where 
+        the match first occurs. KErrNotFound, if there is no match.
+*/
+EXPORT_C TInt TDesC16::MatchC(const TDesC16 &aPattern, TInt aWildChar, TInt aWildSequenceChar, 
+							  TInt aEscapeChar, TInt aMaxLevel, const TCollationMethod* aCollationMethod) const
+	{
+	TCollationMethod m(aCollationMethod ? *aCollationMethod : *Mem::GetDefaultMatchingTable());
+	m.iFlags |= (TCollationMethod::EIgnoreNone | TCollationMethod::EFoldCase);
+	TCollate c(m);
+	return c.Match(Ptr(), Length(), aPattern.Ptr(), aPattern.Length(), aMaxLevel, aWildChar, aWildSequenceChar, aEscapeChar);
+	}
+
+
+/**
+Searches this descriptor's collated data for a match with the collated match 
+pattern supplied in the specified descriptor.
+
+The function uses the standard collation method appropriate to
+the current locale.
+	
+The match pattern can contain the wildcard characters specified by aWildChar and aWildSequenceChar 
+parameters, where aWildSequenceChar matches zero or more consecutive occurrences of any character and 
+aWildChar matches a single occurrence of any character.
+
+@param aPattern A 16-bit non-modifable descriptor containing the match pattern.
+@param aFlags Flags providing advanced control of the collation algorithm @see TCollationFlag
+@param aWildChar Wild card character which may be specified for aSearchTerm. Defaulted to '?' if omitted.
+@param aWildSequenceChar Wild card sequence character which may be specified for aSearchTerm.
+						 Defaulted to '*' if omitted.
+@param aEscapeChar The escape character, or 0 if there is to be none. The escape character removes any 
+ 				   special meaning from the subsequent character. For example, if the escape, wild card 
+ 				   and wild sequence characters are \, ? And * respectively, the search term "\?\*\\" matches 
+ 				   only the candidate string "?*\".  Defaulted to 0 if omitted.
+@param aMaxLevel Determines the tightness of the collation. Defaulted to 3 if omitted. At level 0, only
+                 character identities are distinguished. At level 1 accents are
+                 distinguished as well. At level 2 case is distinguishes as well. At
+                 level 3 all valid different Unicode characters are considered different.
+@param aCollationMethod A pointer to the collation method. Collation methods can be retrieved by calls to
+				 Mem::CollationMethodByIndex(), Mem::CollationMethodById() or by custom defined name.
+				 Flags can be set on definition of the custom TCollationMethod, or by const_cast-ing
+				 the returned pointer and setting the iFlags field directly. @see TCollationMethod
+@return If a match is found, the offset within this descriptor's data where 
+        the match first occurs. KErrNotFound, if there is no match.
+*/
+EXPORT_C TInt TDesC16::MatchC(const TDesC16 &aPattern, const TCollationMethod* aCollationMethod,
+							  TInt aMaxLevel, TInt aWildChar, TInt aWildSequenceChar, TInt aEscapeChar) const
+	{
+	TCollate c(*aCollationMethod);
+	return c.Match(Ptr(), Length(), aPattern.Ptr(), aPattern.Length(), aMaxLevel, aWildChar, aWildSequenceChar, aEscapeChar);
+	}
+
+
+#ifndef __DES16_MACHINE_CODED_HWORD__
+EXPORT_C TInt TDesC16::Locate(TChar aChar) const
+/**
+Searches for the first occurrence of a character within this descriptor's 
+data.
+
+The search starts at the beginning of the data, i.e. at the leftmost 
+position.
+
+@param aChar The character to be found. 
+
+@return The offset of the character position from the beginning of the data.
+        KErrNotFound, if no matching character can be found.
+*/
+	{
+
+	const TUint16 *pBuf=Ptr();
+	const TUint16 *pB=pBuf-1;
+	const TUint16 *pE=pB+Length();
+	do
+		{
+		if (pB==pE)
+			return KErrNotFound;
+		} while (TUint(*++pB)!=aChar);
+	return pB-pBuf;
+	}
+#endif
+
+LOCAL_C TInt DoLocateF16(const TDesC16& aDes,TUint aChar)
+//
+// Locate character aChar in the descriptor folded.
+//
+	{
+#ifdef _UNICODE
+	const TText* table = convTable(EMatchFolded);
+	TUint16 aChar16 = (TUint16)aChar;
+	aChar = lookup(&aChar16,table);
+#else
+	const TText* table=Locl::FoldTable;
+	if (aChar<0x100)
+		aChar=table[aChar];
+#endif
+	const TUint16 *pBuf=aDes.Ptr();
+	const TUint16 *pB=pBuf-1;
+	const TUint16 *pE=pB+aDes.Length();
+	do
+		{
+		if (pB==pE)
+			return KErrNotFound;
+		} while (lookup(++pB,table)!=aChar);
+	return pB-pBuf;
+	}
+
+EXPORT_C TInt TDesC16::LocateF(TChar aChar) const
+/**
+Searches for the first occurrence of a folded character within this
+descriptor's folded data.
+
+The search starts at the beginning of the data, i.e. at the leftmost 
+position.
+
+Note that folding is locale-independent behaviour. It is also important to 
+note that there can be no guarantee that folding is in any way culturally 
+appropriate, and should not be used for searching strings in natural language.
+
+@param aChar The character to be found.
+
+@return The offset of the character position from the beginning of the data.
+        KErrNotFound, if no matching character can be found.
+*/
+	{
+
+	return DoLocateF16(*this,aChar);
+
+	}
+
+#ifndef __DES16_MACHINE_CODED_HWORD__
+EXPORT_C TInt TDesC16::LocateReverse(TChar aChar) const
+/**
+Searches for the first occurrence of a character within this descriptor's 
+data, searching from the end of the data.
+
+The search starts at the rightmost position.
+
+@param aChar The character to be found.
+
+@return The offset of the character position from the beginning of the data.
+        KErrNotFound, if no matching character can be found.
+*/
+	{
+
+	TInt len=Length();
+	if (len==0)
+		return(KErrNotFound);
+	const TUint16 *pB=Ptr();
+	const TUint16 *pE=pB+len-1;
+	while (pE>=pB)
+		{
+		if (TUint(*pE)==aChar)
+			break;
+		pE--;
+		}
+	return(pE<pB ? KErrNotFound : pE-pB);
+	}
+#endif
+
+EXPORT_C TInt TDesC16::LocateReverseF(TChar aChar) const
+/**
+Searches for the first occurrence of a folded character within this descriptor's 
+folded data, searching from the end of the data.
+
+The search starts at the rightmost position.
+
+Note that folding is locale-independent behaviour. It is also important to 
+note that there can be no guarantee that folding is in any way culturally 
+appropriate, and should not be used for searching strings in natural language.
+
+@param aChar The character to be found 
+@return The offset of the character position from the beginning of the data.
+        KErrNotFound, if no matching character can be found.
+*/
+	{
+
+	TInt len=Length();
+	if (len==0)
+		return(KErrNotFound);
+	const TUint16 *pB=Ptr();
+	const TUint16 *pE=pB+len-1;
+	aChar.Fold();
+	while (pE>=pB)
+		{
+		TCharF c(*pE);
+		if (c==aChar)
+			break;
+		pE--;
+		}
+	return(pE<pB ? KErrNotFound : pE-pB);
+	}
+
+EXPORT_C HBufC16 *TDesC16::Alloc() const
+/**
+Creates a new 16-bit heap descriptor and initialises it with a copy of this 
+descriptor's data.
+
+@return A pointer to the new 16-bit heap descriptor, if creation is successful. 
+        NULL, if creation of the descriptor fails.
+*/
+	{
+
+	HBufC16 *pH=HBufC16::New(Length());
+	if (pH)
+		*pH=(*this);
+	return(pH);
+	}
+
+EXPORT_C HBufC16 *TDesC16::AllocL() const
+/**
+Creates a new 16-bit heap descriptor and initialises it with a copy of this 
+descriptor's data.
+
+The function leaves, if creation of the descriptor fails.
+
+@return A pointer to the 16-bit heap descriptor, if creation is successful.
+*/
+	{
+
+	HBufC16 *pH=HBufC16::NewL(Length());
+	*pH=(*this);
+	return(pH);
+	}
+
+EXPORT_C HBufC16 *TDesC16::AllocLC() const
+/**
+Creates a new 16-bit heap descriptor, initialises it with a copy of this 
+descriptor's data, and puts a pointer to the descriptor onto the cleanup stack.
+
+The function leaves, if creation of the descriptor fails.
+
+@return A pointer to the 16-bit heap descriptor, if creation is successful. 
+        The pointer is also put onto the cleanup stack.
+*/
+	{
+
+	HBufC16 *pH=HBufC16::NewLC(Length());
+	*pH=(*this);
+	return(pH);
+	}
+
+#if !defined(__DES16_MACHINE_CODED__)
+
+EXPORT_C TPtrC16 TDesC16::Left(TInt aLength) const
+/**
+Extracts the leftmost part of the data. 
+
+The function does not cut or remove any data but constructs a non-modifiable 
+pointer descriptor to represent the leftmost part of the data.
+
+@param aLength The length of the data to be extracted. If this value is 
+               greater than the length of the descriptor, the function 
+               extracts the whole of the descriptor.
+               
+@return The 16-bit non-modifiable pointer descriptor representing the leftmost 
+        part of the data.
+
+@panic USER 10 if aLength is negative. 
+*/
+	{
+
+	__ASSERT_ALWAYS(aLength>=0,Panic(ETDes16PosOutOfRange));
+	return(TPtrC16(Ptr(),Min(aLength,Length())));
+	}
+
+EXPORT_C TPtrC16 TDesC16::Right(TInt aLength) const
+/**
+Extracts the rightmost part of the data.
+
+The function does not cut or remove any data but constructs a non-modifiable 
+pointer descriptor to represent the rightmost part of the data.
+
+@param aLength The length of data to be extracted. If this value
+               is greater than the length of the descriptor, the function
+               extracts the whole of the descriptor. 
+               
+@return The 16-bit non-modifiable pointer descriptor representing the rightmost 
+        part of the data.
+
+@panic USER 10 if aLength is negative.
+*/
+	{
+
+	__ASSERT_ALWAYS(aLength>=0,Panic(ETDes16PosOutOfRange));
+	TInt len=Length();
+	if (aLength>len)
+		aLength=len;
+    return(TPtrC16(Ptr()+len-aLength,aLength));
+	}
+
+EXPORT_C TPtrC16 TDesC16::Mid(TInt aPos) const
+/**
+Extracts a portion of the data.
+
+The function does not cut or remove any data but constructs a non-modifiable 
+pointer descriptor to represent the defined portion.
+
+The portion is identified by its starting position and by the length of the 
+remainder of the data starting from the specified position.
+
+@param aPos The starting position of the data to be extracted. This is an 
+            offset value; a zero value refers to the leftmost data position.
+             
+@return The 16-bit non-modifiable pointer descriptor representing the specified 
+        portion of the data.
+
+@panic USER 10  if aPos is negative or aPos is greater than the
+                length of the descriptor.
+*/
+	{
+
+	TInt len=Length();
+	__ASSERT_ALWAYS(aPos>=0 && aPos<=len,Panic(ETDes16PosOutOfRange));
+    return(TPtrC16(Ptr()+aPos,len-aPos));
+	}
+
+EXPORT_C TPtrC16 TDesC16::Mid(TInt aPos,TInt aLength) const
+/**
+Extracts a portion of the data.
+
+The function does not cut or remove any data but constructs a non-modifiable 
+pointer descriptor to represent the defined portion.
+
+The portion is identified by its starting position and by its length.
+
+@param aPos    The starting position of the data to be extracted. This is an 
+               offset value; a zero value refers to the leftmost data position. 
+@param aLength The length of data to be extracted.
+
+@return The 16-bit non-modifiable pointer descriptor representing the specified 
+        portion of the data.
+        
+@panic USER 10  if aPos is negative or aPos plus aLength is greater than the
+                length of the descriptor.
+*/
+	{
+
+	__ASSERT_ALWAYS(aPos>=0 && (aPos+aLength)<=Length(),Panic(ETDes16PosOutOfRange));
+    return(TPtrC16(Ptr()+aPos,aLength));
+	}
+
+#endif  // !defined(__DES16_MACHINE_CODED__)
+
+#if !defined( __DES16_MACHINE_CODED__) | defined(__EABI_CTORS__)
+EXPORT_C TBufCBase16::TBufCBase16()
+//
+// Constructor
+//
+	: TDesC16(EBufC,0)
+	{}
+#endif
+
+#if !defined( __DES16_MACHINE_CODED_HWORD__) | defined(__EABI_CTORS__)
+EXPORT_C TBufCBase16::TBufCBase16(const TUint16 *aString,TInt aMaxLength)
+//
+// Constructor
+//
+	: TDesC16(EBufC,0)
+	{
+	Copy(aString,aMaxLength);
+	}
+#endif
+
+#if !defined( __DES16_MACHINE_CODED__) | defined(__EABI_CTORS__)
+EXPORT_C TBufCBase16::TBufCBase16(const TDesC16 &aDes,TInt aMaxLength)
+//
+// Constructor
+//
+	: TDesC16(EBufC,0)
+	{
+	Copy(aDes,aMaxLength);
+	}
+#endif
+
+#ifndef __DES16_MACHINE_CODED_HWORD__
+EXPORT_C void TBufCBase16::Copy(const TUint16 *aString,TInt aMaxLength)
+//
+// Copy from a string.
+//
+	{
+
+	__CHECK_ALIGNMENT(aString,ETBufCBase16CopyStringMax);
+	TInt len=STRING_LENGTH_16(aString);
+	__ASSERT_ALWAYS(len<=aMaxLength,Panic(ETDes16Overflow));
+	memCopy(WPtr(),aString,len);
+	DoSetLength(len);
+	}
+#endif
+
+#ifndef __DES16_MACHINE_CODED__
+EXPORT_C void TBufCBase16::Copy(const TDesC16 &aDes,TInt aMaxLength)
+//
+// Copy from a descriptor.
+//
+	{
+
+	TInt len=aDes.Length();
+	__ASSERT_ALWAYS(len<=aMaxLength,Panic(ETDes16Overflow));
+	memCopy(WPtr(),aDes.Ptr(),len);
+	DoSetLength(len);
+	}
+#endif
+
+inline HBufC16::HBufC16(TInt aLength)
+	:TBufCBase16(aLength)
+	{}
+
+EXPORT_C HBufC16 *HBufC16::New(TInt aMaxLength)
+/**
+Creates, and returns a pointer to, a new 16-bit heap descriptor.
+
+The heap descriptor is empty and its length is zero.
+
+Data can, subsequently, be assigned into it using the assignment operators.
+
+@param aMaxLength The requested maximum length of the descriptor. Note that 
+                  the resulting heap cell size and, therefore, the resulting
+                  maximum length of the descriptor may be larger than
+                  requested.
+
+@return A pointer to the new 16-bit heap descriptor. NULL, if the 16-bit heap 
+        descriptor cannot be created.
+        
+@panic USER 18 if aMaxLength is negative.
+
+@see HBufC16::operator=()
+*/
+	{
+	__ASSERT_ALWAYS(aMaxLength>=0,Panic(ETDes16MaxLengthNegative));
+	return new(STD_CLASS::Alloc(_FOFF(HBufC16,iBuf[aMaxLength]))) HBufC16(0);
+	}
+
+EXPORT_C HBufC16 *HBufC16::NewL(TInt aMaxLength)
+/**
+Creates, and returns a pointer to, a new 16-bit heap descriptor, and leaves 
+on failure.
+
+The heap descriptor is empty and its length is zero.
+
+Data can, subsequently, be assigned into it using the assignment operators.
+
+@param aMaxLength The requested maximum length of the descriptor. Note that 
+                  the resulting heap cell size and, therefore, the resulting
+                  maximum length of the descriptor may be larger
+                  than requested.
+                  
+@return A pointer to the new 16-bit heap descriptor. The function leaves, if 
+        the new 16-bit heap descriptor cannot be created.
+        
+
+@panic USER 18 if aMaxLength is negative.
+
+@see HBufC16::operator=()
+*/
+	{
+	return static_cast<HBufC16*>(User::LeaveIfNull(New(aMaxLength)));
+	}
+
+EXPORT_C HBufC16 *HBufC16::NewLC(TInt aMaxLength)
+/**
+Creates, adds a pointer onto the cleanup stack and returns a pointer to, a 
+new 16-bit heap descriptor; leaves on failure.
+
+The heap descriptor is empty and its length is zero.
+
+Data can, subsequently, be assigned into it using the assignment operators.
+
+@param aMaxLength The requested maximum length of the descriptor. Note that 
+                  the resulting heap cell size and, therefore, the resulting
+                  maximum length of the descriptor may be larger
+                  than requested.
+                  
+@return A pointer to the new 16-bit heap descriptor. The function leaves, if 
+        the new 16-bit heap descriptor cannot be created.
+        
+@panic USER 18 if aMaxLength is negative.
+
+@see HBufC16::operator=()
+*/
+	{
+	HBufC16* buf=NewL(aMaxLength);
+	CleanupStack::PushL(buf);
+	return buf;
+	}
+
+EXPORT_C HBufC16 *HBufC16::NewMax(TInt aMaxLength)
+/**
+Creates, and returns a pointer to, a new 16-bit heap descriptor.
+
+No data is assigned into the new descriptor but its length
+is set to aMaxLength.
+
+Data can, subsequently, be assigned into it using the assignment operators.
+
+@param aMaxLength The requested maximum length of the descriptor. Note that 
+                  the resulting heap cell size and, therefore, the resulting
+                  maximum length of the descriptor may be larger
+                  than requested. This also means that the resulting maximum
+                  length of the descriptor may be greater than its length.
+@return A pointer to the new 16-bit heap descriptor. NULL, if the new 16-bit 
+        heap descriptor cannot be created.
+
+@panic USER 18 if aMaxLength is negative.
+
+@see HBufC16::operator=()
+*/
+	{
+	__ASSERT_ALWAYS(aMaxLength>=0,Panic(ETDes16MaxLengthNegative));
+	return new(STD_CLASS::Alloc(_FOFF(HBufC16,iBuf[aMaxLength]))) HBufC16(aMaxLength);
+	}
+
+EXPORT_C HBufC16 *HBufC16::NewMaxL(TInt aMaxLength)
+/**
+Creates, and returns a pointer to, a new 16-bit heap descriptor;
+leaves on failure.
+
+No data is assigned into the new descriptor but its length is set
+to aMaxLength.
+
+Data can, subsequently, be assigned into it using the assignment operators.
+
+@param aMaxLength The requested maximum length of the descriptor. Note that 
+                  the resulting heap cell size and, therefore, the resulting
+                  maximum length of the descriptor may be larger
+                  than requested. This also means that the resulting 
+                  maximum length of the descriptor may be greater than its length.
+                  
+@return A pointer to the new 16-bit heap descriptor. The function leaves, if 
+        the new 16-bit heap descriptor cannot be created.
+
+@panic USER 18 if aMaxLength is negative.
+
+@see HBufC16::operator=()
+*/
+	{
+	return static_cast<HBufC16*>(User::LeaveIfNull(NewMax(aMaxLength)));
+	}
+
+EXPORT_C HBufC16 *HBufC16::NewMaxLC(TInt aMaxLength)
+/**
+Creates, adds a pointer onto the cleanup stack and returns a pointer to, a 
+new 16-bit heap descriptor; leaves on failure.
+
+No data is assigned into the new descriptor but its length
+is set to aMaxLength.
+
+Data can, subsequently, be assigned into it using the assignment operators.
+
+@param aMaxLength The requested maximum length of the descriptor. Note that 
+                  the resulting heap cell size and, therefore, the resulting
+                  maximum length of the descriptor may be larger than requested.
+
+@return A pointer to the new 16-bit heap descriptor. This is also put onto 
+        the cleanup stack. The function leaves, if the new 16-bit heap descriptor 
+        cannot be created.
+
+@panic USER 18 if aMaxLength is negative.
+
+@see HBufC16::operator=()
+*/
+	{
+	HBufC16* buf=NewMaxL(aMaxLength);
+	CleanupStack::PushL(buf);
+	return buf;
+	}
+
+EXPORT_C HBufC16 &HBufC16::operator=(const TUint16 *aString)
+/**
+Copies data into this 16-bit heap descriptor replacing any existing data.
+
+The length of this descriptor is set to reflect the new data.
+
+Note that the maximum length of this (target) descriptor is the length
+of the descriptor buffer in the allocated host heap cell; this may be greater
+than the maximum length specified when this descriptor was created or
+last re-allocated.
+
+@param aString A pointer to a zero-terminated string.
+
+@return A reference to this 16-bit heap descriptor.
+
+@panic USER 11 if the length of the string, excluding the zero terminator,
+               is greater than the maximum length of this (target) descriptor.
+*/
+	{
+
+	__CHECK_ALIGNMENT(aString,EHBufC16AssignCString);
+	Copy(aString,(STD_CLASS::AllocLen(this)-sizeof(TDesC16))/sizeof(TUint16));
+	return(*this);
+	}
+
+EXPORT_C HBufC16 &HBufC16::operator=(const TDesC16 &aDes)
+/**
+Copies data into this 16-bit heap descriptor replacing any existing data.
+
+The length of this descriptor is set to reflect the new data.
+
+Note that the maximum length of this (target) descriptor is the length
+of the descriptor buffer in the allocated host heap cell; this may be greater
+than the maximum length specified when this descriptor was created or
+last re-allocated.
+
+@param aDes A 16-bit non-modifiable descriptor.
+
+@return A reference to this 16-bit heap descriptor.
+
+@panic USER 11  if the length of the descriptor aDes is greater than the
+                maximum length of this (target) descriptor
+*/
+	{
+
+	Copy(aDes,(STD_CLASS::AllocLen(this)-sizeof(TDesC16))/sizeof(TUint16));
+	return(*this);
+	}
+
+EXPORT_C HBufC16 *HBufC16::ReAlloc(TInt aMaxLength)
+/**
+Expands or contracts this 16-bit heap descriptor.
+
+This is done by:
+
+1. creating a new heap descriptor.
+
+2. copying the original data into the new descriptor.
+
+3. deleting the original descriptor.
+
+@param aMaxLength The new requested maximum length of the descriptor.
+                  Note that the resulting heap cell size and, therefore,
+                  the resulting maximum length of the descriptor may be
+                  larger than requested.
+                  
+@return A pointer to the new expanded or contracted 16-bit heap descriptor -  
+        the original descriptor is deleted. NULL, if the new 16-bit heap descriptor 
+        cannot be created - the original descriptor remains unchanged.
+
+@panic USER 14 if aMaxLength is less than the length of the existing data.
+@panic USER 18 if aMaxLength is negative.
+*/
+	{
+
+	__ASSERT_ALWAYS(aMaxLength>=0,Panic(ETDes16MaxLengthNegative));
+	__ASSERT_ALWAYS(Length()<=aMaxLength,Panic(ETDes16ReAllocTooSmall));
+	return((HBufC16 *)STD_CLASS::ReAlloc(this,(aMaxLength*sizeof(TUint16))+sizeof(TDesC16)));
+	}
+
+EXPORT_C HBufC16 *HBufC16::ReAllocL(TInt aMaxLength)
+/**
+Expands or contracts this 16-bit heap descriptor; leaves on failure.
+
+This is done by:
+
+1. creating a new heap descriptor.
+
+2. copying the original data into the new descriptor.
+
+3. deleting the original descriptor.
+
+@param aMaxLength The new requested maximum length of the descriptor.
+                  Note that the resulting heap cell size and, therefore,
+                  the resulting maximum length of the descriptor may be
+                  larger than requested.
+                  
+@return A pointer to the new expanded or contracted 16-bit heap descriptor -  
+        the original descriptor is deleted. The function leaves, if the new
+        16-bit heap descriptor cannot be created - the original descriptor
+        remains unchanged.
+
+@panic USER 14 if aMaxLength is less than the length of the existing data.
+@panic USER 18 if aMaxLength is negative.
+*/
+	{
+
+	__ASSERT_ALWAYS(aMaxLength>=0,Panic(ETDes16MaxLengthNegative));
+	__ASSERT_ALWAYS(Length()<=aMaxLength,Panic(ETDes16ReAllocTooSmall));
+	return((HBufC16 *)STD_CLASS::ReAllocL(this,(aMaxLength*sizeof(TUint16))+sizeof(TDesC16)));
+	}
+
+EXPORT_C TPtr16 HBufC16::Des()
+/**
+Creates and returns a 16-bit modifiable pointer descriptor for the data
+represented by this 16-bit heap descriptor.
+
+The content of a heap descriptor normally cannot be altered, other than by 
+complete replacement of the data. Creating a modifiable pointer descriptor 
+provides a way of changing the data.
+
+The modifiable pointer descriptor is set to point to this heap descriptor's 
+data.
+
+The length of the modifiable pointer descriptor is set to the length of this 
+heap descriptor.
+
+The maximum length of the modifiable pointer descriptor is set to the length 
+of the heap descriptor's buffer. Note that the maximum length is the length 
+of the descriptor buffer in the allocated host heap cell; this may be greater 
+than the maximum length requested when this descriptor was originally created 
+or last re-allocated.
+
+When data is modified through this new pointer descriptor, the lengths of 
+both it and this heap descriptor are changed.
+
+Note that it is a common mistake to use Des() to create a TDesC16& reference. 
+While not incorrect, it is simpler and much more efficient to simply dereference 
+the heap descriptor.
+
+@return A 16-bit modifiable pointer descriptor representing the data in this 
+        16-bit heap descriptor.
+*/
+	{
+
+	return DoDes((STD_CLASS::AllocLen(this)-sizeof(TDesC16))/sizeof(TUint16));
+	}
+
+#ifndef __DES16_MACHINE_CODED__
+EXPORT_C void TDes16::SetLength(TInt aLength)
+/**
+Sets the length of the data represented by the descriptor to the
+specified value.
+
+@param aLength The new length of the descriptor.
+
+@panic USER 11  if aLength is negative or is greater than the maximum length of
+                this (target) descriptor.
+*/
+	{
+
+	__ASSERT_ALWAYS(TUint(aLength)<=TUint(MaxLength()),Panic(ETDes16Overflow));
+	DoSetLength(aLength);
+	if (Type()==EBufCPtr)
+		((SBufCPtr16 *)this)->ptr->length=aLength; // Relies on iType==0 for an TBufC
+  	}
+
+EXPORT_C void TDes16::SetMax()
+/**
+Sets the length of the data to the maximum length of the descriptor.
+*/
+	{
+
+	SetLength(iMaxLength);
+	}
+#endif
+
+#ifndef __DES16_MACHINE_CODED_HWORD__
+EXPORT_C void TDes16::Copy(const TUint16 *aString)
+/**
+Copies data into this descriptor replacing any existing data.
+
+The length of this descriptor is set to reflect the new data.
+
+@param aString A pointer to a zero-terminated string.
+
+@panic USER 11  if the length of aString, excluding the zero terminator, is
+                greater than the maximum length of this (target) descriptor.
+*/
+	{
+
+	__CHECK_ALIGNMENT(aString,ETDes16CopyCString);
+	TInt len=STRING_LENGTH_16(aString);
+	SetLength(len);
+    memCopy(WPtr(),aString,len);
+	}
+#endif
+
+#ifndef __DES16_MACHINE_CODED__
+EXPORT_C void TDes16::Copy(const TUint16 *aBuf,TInt aLength)
+/**
+Copies data into this descriptor replacing any existing data.
+
+The length of this descriptor is set to reflect the new data.
+
+@param aBuf    The start address of data to be copied. 
+@param aLength The length of data to be copied.
+
+@panic USER 11  if aLength is negative or is greater than maximum length
+                of this (target) descriptor.
+*/
+	{
+
+	__CHECK_ALIGNMENT(aBuf,ETDes16CopyBufLength);
+	SetLength(aLength);
+    memCopy(WPtr(),aBuf,aLength);
+	}
+
+EXPORT_C void TDes16::Copy(const TDesC16 &aDes)
+/**
+Copies data into this descriptor replacing any existing data.
+
+The length of this descriptor is set to reflect the new data.
+
+@param aDes A 16-bit non modifiable descriptor.
+
+@panic USER 11  if the length of aDes is greater than the maximum length
+                of this (target) descriptor.
+*/
+	{
+
+	TInt len=aDes.Length();
+	SetLength(len);
+    memCopy(WPtr(),aDes.Ptr(),len);
+	}
+#endif
+
+EXPORT_C void TDes16::Copy(const TDesC8 &aDes)
+/**
+Copies data into this descriptor replacing any existing data.
+
+The length of this descriptor is set to reflect the new data.
+
+@param aDes An 8 bit non modifiable descriptor. 
+
+@panic USER 11  if the length of aDes is greater than the maximum
+                length of this (target) descriptor.
+*/
+	{
+
+	TInt len=aDes.Length();
+	SetLength(len);
+	const TUint8 *pS=aDes.Ptr();
+	const TUint8 *pE=pS+len;
+	TUint16 *pT=WPtr();
+	while (pS<pE)
+		*pT++=(*pS++);
+	}
+
+#ifndef __DES16_MACHINE_CODED_HWORD__
+EXPORT_C void TDes16::Append(TChar aChar)
+/**
+Appends data onto the end of this descriptor's data.
+
+The length of this descriptor is incremented to reflect the new content.
+
+@param aChar A single character to be appended. The length of the descriptor 
+             is incremented by one.
+             
+@panic USER 11  if the resulting new length of this descriptor is greater than
+                its maximum length.
+*/
+	{
+
+	TInt len=Length();
+	TUint16 *pB=WPtr()+len;
+	SetLength(len+1);
+	*pB++=(TUint16)aChar;
+	}
+#endif
+
+#ifndef __DES16_MACHINE_CODED__
+EXPORT_C void TDes16::Append(const TUint16 *aBuf,TInt aLength)
+/**
+Appends data onto the end of this descriptor's data.
+
+The length of this descriptor is incremented to reflect the new content.
+
+@param aBuf    A pointer to the data to be copied.
+@param aLength The length of data to be copied.
+
+@panic USER 11  if the resulting new length of this descriptor is greater than
+                its maximum length.
+@panic USER 17  if aLength is negative.
+*/
+	{
+
+	__ASSERT_ALWAYS(aLength>=0,Panic(ETDes16LengthNegative));
+	__CHECK_ALIGNMENT(aBuf,ETDes16AppendBufLength);
+	TInt len=Length();
+	SetLength(len+aLength);
+    memCopy(WPtr()+len,aBuf,aLength);
+	}
+
+EXPORT_C void TDes16::Append(const TDesC16 &aDes)
+/**
+Appends data onto the end of this descriptor's data.
+
+The length of this descriptor is incremented to reflect the new content.
+
+@param aDes A 16-bit non modifiable descriptor whose data is to be appended.
+
+@panic USER 11  if the resulting new length of this descriptor is greater than
+                its maximum length.
+*/
+	{
+
+	TInt len=Length();
+    TInt n=aDes.Length();
+	SetLength(len+n);
+    memCopy(WPtr()+len,aDes.Ptr(),n);
+	}
+#endif
+
+EXPORT_C void TDes16::Swap(TDes16 &aDes)
+/**
+Swaps the data represented by this descriptor with the data represented by 
+the specified descriptor.
+
+The lengths of both descriptors are also swapped to reflect the change.
+
+Note that each descriptor must be capable of accommodating the contents of
+the other descriptor.
+
+Each descriptor must be capable of accommodating the contents of the other 
+descriptor. If the maximum length of either descriptor is smaller than the 
+length of the other descriptor, then the function raises a USER 11 panic.
+
+@param aDes The 16-bit modifiable descriptor whose data is to be swapped with 
+            the data of this descriptor.
+            
+@panic USER 11  if the maximum length of either descriptor is smaller than the 
+                length of the other descriptor.
+*/
+	{
+
+	TInt l=Length();
+	TInt r=aDes.Length();
+	aDes.SetLength(l);
+	SetLength(r);
+	TInt s=Min(l,r);
+	l-=s;
+	r-=s;
+	TUint16 *pL=WPtr();
+	TUint16 *pR=aDes.WPtr();
+	while (s--)
+		{
+		TChar a=(*pL);
+		*pL++=(*pR);
+		*pR++=(TUint16)a;
+		}
+	while (l--)
+		*pR++=(*pL++);
+	while (r--)
+		*pL++=(*pR++);
+	}
+
+#ifndef __DES16_MACHINE_CODED_HWORD__
+EXPORT_C void TDes16::Fill(TChar aChar)
+/**
+Fills the descriptor's data area with the specified character, replacing any 
+existing data.
+
+The descriptor is filled from the beginning up to its current length. The 
+descriptor's length does not change. It is not filled to its maximum length.
+
+@param aChar The fill character.
+*/
+	{
+
+	TUint16 *pB=WPtr();
+	TUint16 *pE=pB+Length();
+	while (pB<pE)
+		*pB++=(TUint16)aChar;
+	}
+#endif
+
+EXPORT_C void TDes16::Fill(TChar aChar,TInt aLength)
+/** 
+Fills the descriptor's data area with the specified character, replacing any 
+existing data.
+
+The descriptor is filled with the specified number of characters,
+and its length is changed to reflect this.
+
+@param aChar   The fill character.
+@param aLength The new length of the descriptor and the number of fill characters 
+               to be copied into it. 
+               
+@panic USER 11  if aLength is negative or is greater than the maximum length
+                of this descriptor.
+*/
+	{
+
+	SetLength(aLength);
+	Fill(aChar);
+	}
+
+EXPORT_C void TDes16::AppendFill(TChar aChar,TInt aLength)
+/**
+Appends and fills this descriptor with the specified character.
+
+The descriptor is appended with the specified number of characters.
+and its length is changed to reflect this.
+
+@param aChar   The fill character. 
+@param aLength The number of fill characters to be appended.
+
+@panic USER 11  if aLength is negative, or the resulting length of this
+                descriptor is greater than its maximum length.
+*/
+	{
+
+	TInt len=Length();
+	TUint16 *pB=WPtr()+len;
+	SetLength(len+aLength);
+	TUint16 *pE=pB+aLength;
+	while (pB<pE)
+		*pB++=(TUint16)aChar;
+	}
+
+#ifndef __DES16_MACHINE_CODED_HWORD__
+EXPORT_C void TDes16::ZeroTerminate()
+/**
+Appends a zero terminator onto the end of this descriptor's data.
+
+The length of the descriptor is not changed. It must, however, be strictly less than 
+the descriptor's maximum length. 
+This condition guarantees that there is sufficient space for the zero terminator.
+
+@panic USER 11  if the descriptor's length is not strictly less than its
+                maximum length.
+*/
+	{
+
+	TInt len=Length();
+	__ASSERT_ALWAYS(len<MaxLength(),Panic(ETDes16Overflow));
+	WPtr()[len]=0;
+	}
+
+EXPORT_C const TUint16 *TDes16::PtrZ()
+/**
+Appends a zero terminator onto the end of this descriptor's data and returns 
+a pointer to the data.
+
+The length of the descriptor is not changed. It must be strictly less than 
+the descriptor's maximum length. 
+This condition guarantees that there is sufficient space for the
+zero terminator.
+
+@return A pointer to the descriptor's zero terminated data.
+
+@panic USER 11  if the descriptor's length is not strictly less than its
+                maximum length.
+*/
+	{
+
+	ZeroTerminate();
+	return(Ptr());
+	}
+#endif
+
+#ifndef __DES16_MACHINE_CODED__
+EXPORT_C void TDes16::Zero()
+/**
+Sets the length of the data to zero.
+*/
+	{
+
+	SetLength(0);
+	}
+#endif
+
+#ifndef __DES16_MACHINE_CODED__
+EXPORT_C void TDes16::FillZ()
+/**
+Fills the descriptor's data area with binary zeroes, i.e.0x0000, replacing any 
+existing data.
+
+The descriptor is filled from the beginning up to its current length. The 
+descriptor's length does not change. It is not filled to its maximum length.
+*/
+	{
+
+    memclr(WPtr(),Length()*2);
+	}
+#endif
+
+EXPORT_C void TDes16::FillZ(TInt aLength)
+/**
+Fills the descriptor's data area with binary zeroes, i.e. 0x0000, replacing any 
+existing data, and changes its length.
+
+The descriptor is filled with the specified number of binary zeroes.
+The descriptor's length is changed to reflect this.
+
+@param aLength The new length of the descriptor and the number of binary zeroes
+               to be copied into it. 
+               
+@panic USER 11  if aLength is negative, or is greater than the maximum length
+                of this descriptor.
+*/
+	{
+
+	SetLength(aLength);
+    FillZ();
+	}
+
+EXPORT_C void TDes16::Fold()
+/**
+Performs folding on the content of this descriptor.
+
+Note that folding is locale-independent behaviour. It is also important to 
+note that there can be no guarantee that folding is in any way culturally 
+appropriate, and should not be used when dealing with strings in natural
+language.
+*/
+	{
+
+	TUint16 *pB=WPtr();
+	TInt len=Length();
+	while (len--)
+		{
+		TCharF c(*pB);
+		*pB++=(TUint16)c;
+		}
+	}
+
+EXPORT_C void TDes16::Collate()
+/**
+Performs collation on the content of this descriptor.
+*/
+	{
+
+	TUint16 *pB=WPtr();
+	TInt len=Length();
+	while (len--)
+		{
+		TChar c=User::Collate(*pB);
+		*pB++=(TUint16)c;
+		}
+	}
+
+EXPORT_C void TDes16::LowerCase()
+/**
+Converts the content of this descriptor to lower case.
+
+Conversion is implemented as appropriate to the current locale.
+*/
+	{
+
+	TUint16 *pB=WPtr();
+	TInt len=Length();
+	while (len--)
+		{
+		TCharLC c(*pB);
+		*pB++=(TUint16)c;
+		}
+	}
+
+EXPORT_C void TDes16::UpperCase()
+/**
+Converts the content of this descriptor to upper case.
+
+Conversion is implemented as appropriate to the current locale.
+*/
+	{
+
+	TUint16 *pB=WPtr();
+	TInt len=Length();
+	while (len--)
+		{
+		TCharUC c(*pB);
+		*pB++=(TUint16)c;
+		}
+	}
+
+EXPORT_C void TDes16::Capitalize()
+/**
+Capitalises the content of this descriptor.
+
+Capitalisation is implemented as appropriate to the current locale.
+*/
+	{
+
+	TUint16 *pB=WPtr();
+	TInt len=Length();
+	if (len--)
+		{
+		*pB=(TUint16)User::TitleCase(*pB);
+		++pB;
+		while (len--)
+			{
+			*pB=(TUint16)User::LowerCase(*pB);
+			++pB;
+			}
+		}
+	}
+
+EXPORT_C void TDes16::CopyF(const TDesC16 &aDes)
+/**
+Copies and folds data from the specified descriptor into this descriptor replacing 
+any existing data.
+
+The length of this descriptor is set to reflect the new 
+data.
+
+Note that folding is locale-independent behaviour. It is also important to 
+note that there can be no guarantee that folding is in any way culturally 
+appropriate, and should not be used when dealing with strings in natural
+language.
+
+@param aDes A 16-bit non-modifiable descriptor.
+
+@panic USER 11  if the length of aDes is greater than the maximum length of
+                this target descriptor.
+*/
+	{
+
+	TInt len=aDes.Length();
+	SetLength(len);
+	const TUint16 *pS=aDes.Ptr();
+	TUint16 *pT=WPtr();
+	while (len--)
+		{
+		TCharF c(*pS++);
+		*pT++=(TUint16)c;
+		}
+	}
+
+EXPORT_C void TDes16::CopyC(const TDesC16 &aDes)
+/**
+Copies and collates data from the specified descriptor
+into this descriptor replacing any existing data.
+
+The length of this descriptor is set to reflect the new data.
+
+@param aDes A 16-bit non-modifiable descriptor.
+
+@panic USER 11  if the length of aDes is greater than the maximum length of
+                this target descriptor.
+*/
+	{
+
+	TInt len=aDes.Length();
+	SetLength(len);
+	const TUint16 *pS=aDes.Ptr();
+	TUint16 *pT=WPtr();
+	while (len--)
+		{
+		TChar c=User::Collate(*pS++);
+		*pT++=(TUint16)c;
+		}
+	}
+
+EXPORT_C void TDes16::CopyLC(const TDesC16 &aDes)
+/**
+Copies text from the specified descriptor and converts it to lower case before 
+putting it into this descriptor, replacing any existing data.
+
+The length of this descriptor is set to reflect the new data.
+
+Conversion to lower case is implemented as appropriate to the current locale.
+
+@param aDes A 16-bit non modifiable descriptor.
+
+@panic USER 11  if the length of aDes is greater than the maximum length of
+                this target descriptor.
+*/
+	{
+
+	TInt len=aDes.Length();
+	SetLength(len);
+	const TUint16 *pS=aDes.Ptr();
+	TUint16 *pT=WPtr();
+	while (len--)
+		{
+		TCharLC c(*pS++);
+		*pT++=(TUint16)c;
+		}
+	}
+
+EXPORT_C void TDes16::CopyUC(const TDesC16 &aDes)
+/**
+Copies text from the specified descriptor and converts it to upper case before 
+putting it into this descriptor, replacing any existing data.
+
+The length of this descriptor is set to reflect the new data.
+
+Conversion to upper case is implemented as appropriate to the current locale.
+
+@param aDes A 16-bit non modifiable descriptor.
+
+@panic USER 11  if the length of aDes is greater than the maximum length of
+                this target descriptor.
+*/
+	{
+
+	TInt len=aDes.Length();
+	SetLength(len);
+	const TUint16 *pS=aDes.Ptr();
+	TUint16 *pT=WPtr();
+	while (len--)
+		{
+		TCharUC c(*pS++);
+		*pT++=(TUint16)c;
+		}
+	}
+
+EXPORT_C void TDes16::CopyCP(const TDesC16 &aDes)
+/**
+Copies text from the specified descriptor and capitalises it before putting 
+it into this descriptor, replacing any existing data.
+
+The length of this descriptor is set to reflect the new data.
+
+Capitalisation is implemented as appropriate to the current locale.
+
+@param aDes A 16-bit non-modifiable descriptor.
+
+@panic USER 11  if the length of aDes is greater than the maximum length of
+                this target descriptor.
+*/
+	{
+
+	TInt len=aDes.Length();
+	SetLength(len);
+	const TUint16 *pS=aDes.Ptr();
+	TUint16 *pT=WPtr();
+	if (len--)
+		{
+		TChar c(*pS++);
+#ifdef _UNICODE
+		c.TitleCase();
+#else
+		c.UpperCase();
+#endif
+		*pT++=(TUint16)c;
+		while (len--)
+			{
+			TCharLC c=(*pS++);
+			*pT++=(TUint16)c;
+			}
+		}
+	}
+
+EXPORT_C void TDes16::Repeat(const TUint16 *aBuf,TInt aLength)
+/**
+Copies data with repetition into this descriptor, from a memory location
+specified by pointer, replacing any existing data.
+
+Copying proceeds until this descriptor is filled up to its current length. 
+If it cannot contain a whole number of copies of the source data, then the 
+last copy is truncated.
+
+@param aBuf    A pointer to data to be repeatedly copied. 
+@param aLength The length of data to be copied. 
+
+@panic USER 17  if aLength is negative.
+*/
+	{
+
+	__ASSERT_ALWAYS(aLength>=0,Panic(ETDes16LengthNegative));
+	__CHECK_ALIGNMENT(aBuf,ETDes16RepeatBufLength);
+	TUint16 *pB=WPtr();
+	TInt len=Length();
+	if (len && aLength)
+		{
+		while (len)
+			{
+			TInt i=Min(len,aLength);
+			pB=memCopy(pB,aBuf,i);
+			len-=i;
+			}
+		}
+	}
+
+EXPORT_C void TDes16::Repeat(const TDesC16 &aDes)
+/**
+Copies data with repetition into this descriptor, from another descriptor,
+replacing any existing data.
+
+Copying proceeds until this descriptor is filled up to its current length. 
+If it cannot contain a whole number of copies of the source data, then the 
+last copy is truncated.
+
+@param aDes A 16-bit non modifiable descriptor whose data is to be repeatedly 
+            copied.
+*/
+	{
+
+	Repeat(aDes.Ptr(),aDes.Length());
+	}
+
+EXPORT_C void TDes16::Trim()
+/**
+Deletes leading and trailing whitespace characters from the descriptor's data.
+
+The length of the descriptor is reduced to reflect the loss of the whitespace characters.
+
+@see TDes16::TrimLeft()
+@see TDes16::TrimRight()
+*/
+	{
+
+	TrimLeft();
+	TrimRight();
+	}
+
+EXPORT_C void TDes16::TrimAll()
+/**
+Deletes leading and trailing whitespace characters from the descriptor's data 
+and replaces each contiguous set of whitespace characters within the data by one 
+whitespace character.
+
+The length of the descriptor is reduced to reflect the loss of the whitespace
+characters.
+
+@see TDes16::Trim()
+*/
+	{
+
+	TrimLeft();
+	TrimRight();
+	TUint16 *pBuf=(TUint16 *)Ptr();
+	TUint16 *pSrc=pBuf;
+	TUint16 *pDst=pBuf;
+	TInt len=Length();
+	TInt spaces=0;
+	while (len--)
+		{
+		TChar c=*pSrc;
+		if (c.IsSpace())
+			{
+			if (spaces++==0)
+				{
+				if (pDst!=pSrc)
+					*pDst=*pSrc;
+				pDst++;
+				}
+			}
+		else
+			{
+			spaces=0;
+			if (pDst!=pSrc)
+				*pDst=*pSrc;
+			pDst++;
+			}
+		pSrc++;
+		}
+	Delete(pDst-pBuf, pSrc-pDst);
+	}
+
+EXPORT_C void TDes16::TrimLeft()
+/**
+Deletes leading whitespace characters from the descriptor's data.
+
+All whitespace characters up to, but not including the first
+non-whitespace character, are deleted.
+
+The length of the descriptor is reduced to reflect the loss
+of the whitespace characters.
+*/
+	{
+
+	const TUint16 *pBuf=Ptr();
+	const TUint16 *pB=pBuf;
+	TInt len=Length();
+	while (len--)
+		{
+		TChar c=(*pB);
+		if (!c.IsSpace())
+			break;
+		pB++;
+		}
+	Delete(0,pB-pBuf);
+	}
+
+EXPORT_C void TDes16::TrimRight()
+/**
+Deletes trailing whitespace characters from the descriptor's data.
+
+The process starts on the right hand side of the descriptor's data
+and proceeds to the left. 
+
+All whitespace characters up to, but not including the first non-whitespace character, 
+are deleted.
+
+The length of the descriptor is reduced to reflect the loss of the whitespace
+characters.
+*/
+	{
+
+	TInt len=Length();
+	if (len==0)
+		return;
+	const TUint16 *pB=Ptr()+len-1;
+	TInt s=len;
+	while (s)
+		{
+		TChar c=(*pB--);
+		if (!c.IsSpace())
+			break;
+		s--;
+		}
+	Delete(s,len-s);
+	}
+
+EXPORT_C void TDes16::Insert(TInt aPos,const TDesC16 &aDes)
+/**
+Inserts data into this descriptor.
+
+The length of this descriptor is changed to reflect the extra data.
+
+@param aPos The position within the data where insertion is to start. This 
+            is an offset value; a zero value refers to the leftmost data
+            position.
+            
+@param aDes A 16-bit non modifiable descriptor whose data is to be inserted.
+
+@panic USER 10  if aPos is negative or is greater than the length of this
+                descriptor.
+@panic USER 11  if the resulting length of this descriptor is greater than its
+                maximum length.
+*/
+	{
+
+	TInt len=Length();
+	__ASSERT_ALWAYS(aPos>=0 && aPos<=len,Panic(ETDes16PosOutOfRange));
+	TInt s=aDes.Length();
+	__ASSERT_ALWAYS((len+s)<=MaxLength(),Panic(ETDes16Overflow));
+	TUint16 *pB=WPtr();
+	memCopy(pB+aPos+s,pB+aPos,len-aPos);
+	memCopy(pB+aPos,aDes.Ptr(),aDes.Length());
+	SetLength(len+s);
+	}
+
+EXPORT_C void TDes16::Delete(TInt aPos,TInt aLength)
+/**
+Deletes data from this descriptor.
+
+The length of this descriptor is changed to reflect the loss of data.
+
+@param aPos    The position within the data where deletion is to start. This 
+               is an offset value; a zero value refers to the leftmost data
+               position. 
+            
+@param aLength The length of data to be deleted. If necessary, the function 
+               adjusts this value to ensure that no data beyond the end of
+               the descriptor data area is deleted.
+
+@panic USER 10  if aPos is negative or is greater than the length of this
+                descriptor.
+*/
+	{
+
+	TInt len=Length();
+	__ASSERT_ALWAYS(aPos>=0 && aPos<=len,Panic(ETDes16PosOutOfRange));
+	TInt d=Min(len-aPos,aLength);
+	TUint16 *pB=WPtr();
+	memCopy(pB+aPos,pB+aPos+d,len-aPos-d);
+	SetLength(len-d);
+	}
+
+EXPORT_C void TDes16::Replace(TInt aPos,TInt aLength,const TDesC16 &aDes)
+/**
+Replaces data in this descriptor.
+
+The specified length can be different to the length of the replacement data.
+The length of this descriptor changes to reflect the change of data.
+
+@param aPos    The position within the data where replacement is to start. 
+               This is an offset value; a zero value refers to the leftmost
+               data position. 
+            
+@param aLength The length of data to be replaced.
+
+@param aDes    The source 16-bit non modifiable descriptor whose data is to
+               replace the target descriptor's data at aPos.
+
+@panic USER  8  if aLength is negative or the sum of aLength and aPos is
+                greater than the length of this descriptor.
+               
+@panic USER 10  if aPos is negative or is greater than the length of this
+                descriptor.
+                
+@panic USER 11  if the resulting length of this descriptor is greater than its
+                maximum length.
+                
+@panic USER 16  if the length of the source descriptor aDes is negative or is
+                greater than the maximum length of this target descriptor,                
+*/
+	{
+
+	TInt len=Length();
+	__ASSERT_ALWAYS(aPos>=0 && aPos<=len,Panic(ETDes16PosOutOfRange));
+	__ASSERT_ALWAYS(aLength>=0 && aPos+aLength<=len,Panic(ETDes16LengthOutOfRange));
+	TInt s=aDes.Length();
+	TInt maxlen=MaxLength();
+	__ASSERT_ALWAYS(s>=0 && s<=maxlen,Panic(ETDes16RemoteLengthOutOfRange));
+	__ASSERT_ALWAYS((len+s-aLength)<=maxlen,Panic(ETDes16Overflow));
+	TUint16 *pB=WPtr();
+	memCopy(pB+aPos+s,pB+aPos+aLength,len-aPos-aLength);
+	memCopy(pB+aPos,aDes.Ptr(),s);
+	SetLength(len+s-aLength);
+	}
+
+EXPORT_C void TDes16::Justify(const TDesC16 &aDes,TInt aWidth,TAlign anAlignment,TChar aFill)
+/**
+Copies data into this descriptor and justifies it, replacing any existing data.
+
+The length of this descriptor is set to reflect the new data.
+
+The target area is considered to be an area of specified width positioned at
+the beginning of this descriptor's data area. Source data is copied into, and
+aligned within this target area according to the specified alignment
+instruction.
+
+If the length of the target area is larger than the length of the source, then
+spare space within the target area is padded with the fill character.
+
+@param aDes        A 16-bit non-modifiable descriptor containing the source data.
+                   The length of the data to be copied is the smaller of:
+                   the length of the source descriptor, and 
+                   the width of the target area (only if this is not the
+                   explicit negative value KDefaultJustifyWidth).
+
+@param aWidth      The width of the target area. If this has the specific
+                   negative value KDefaultJustifyWidth, then the width is
+                   re-set to the length of the data source.
+
+@param anAlignment The alignment of the data within the target area
+
+@param aFill       The fill character used to pad the target area. 
+
+@panic USER 11  if the resulting length of this descriptor is greater than
+                its maximum length or aWidth has a negative value other 
+                than KDefaultJustifyWidth.
+*/
+	{
+
+    Zero();
+    AppendJustify(aDes.Ptr(),aDes.Length(),aWidth,anAlignment,aFill);
+    }
+
+EXPORT_C void TDes16::AppendJustify(const TDesC16 &aDes,TInt aWidth,TAlign anAlignment,TChar aFill)
+/**
+Appends data onto the end of this descriptor's data and justifies it.
+	
+The source of the appended data is an existing descriptor.
+	
+The target area is considered to be an area of specified width, immediately 
+following this descriptor's existing data. Source data is copied into, and 
+aligned within this target area according to the specified alignment instruction.
+	
+If the length of the target area is larger than the length of the source, 
+then spare space within the target area is padded with the fill character.
+		
+@param aDes        A 16-bit non-modifiable descriptor containing the source
+                   data. The length of the data to be copied is the smaller of:
+                   the length of the source descriptor, and
+                   the width of the target area (only if this is not the
+                   explicit negative value KDefaultJustifyWidth). 
+	
+@param aWidth      The width of the target area. If this has the specific
+                   negative value KDefaultJustifyWidth, then the width is
+	               re-set to the length of the data source.
+	
+@param anAlignment The alignment of the data within the target area. 
+	
+@param aFill       The fill character used to pad the target area.
+
+@panic USER 11  if the resulting length of this descriptor is greater than
+                its maximum length or aWidth has a negative value other 
+                than KDefaultJustifyWidth.
+*/
+	{
+
+    AppendJustify(aDes.Ptr(),aDes.Length(),aWidth,anAlignment,aFill);
+    } 
+
+EXPORT_C void TDes16::AppendJustify(const TDesC16 &aDes,TInt aLength,TInt aWidth,TAlign anAlignment,TChar aFill)
+/**
+Appends data onto the end of this descriptor's data and justifies it.
+	
+The source of the appended data is an existing descriptor.
+	
+The target area is considered to be an area of specified width, immediately 
+following this descriptor's existing data. Source data is copied into, and 
+aligned within this target area according to the specified alignment instruction.
+	
+If the length of the target area is larger than the length of the source, 
+then spare space within the target area is padded with the fill character.
+	
+@param aDes        An 8-bit non-modifiable descriptor containing the source data. 
+
+@param aLength     The length of data to be copied from the source descriptor. 
+                   If this is greater than the width of the target area, then
+                   the length of data copied is limited to the width.
+                   The length of data to be copied must not be 	greater than
+                   the length of the source descriptor. Note that this
+                   condition is not automatically tested. 
+                   
+@param aWidth      The width of the target area. If this has the specific negative 
+                   value KDefaultJustifyWidth, then the width is
+                   re-set to the length of the data source.
+
+@param anAlignment The alignment of the data within the target area. 
+
+@param aFill       The fill character used to pad the target area.
+
+@panic USER 11  if the resulting length of this descriptor is greater than
+                its maximum length or aWidth has a negative value other 
+                than KDefaultJustifyWidth.
+*/
+	{
+
+    AppendJustify(aDes.Ptr(),aLength,aWidth,anAlignment,aFill);
+    } 
+
+EXPORT_C void TDes16::AppendJustify(const TUint16 *aString,TInt aWidth,TAlign anAlignment,TChar aFill)
+/**
+Appends a zero terminated string onto the end of this descriptor's data and 
+justifies it.
+
+The zero terminator is not copied.
+
+The target area is considered to be an area of specified width, immediately 
+following this descriptor's existing data. Source data is copied into, and 
+aligned within, this target area according to the specified alignment instruction.
+
+If the length of the target area is larger than the length of the source, 
+then spare space within the target area is padded with the fill character.
+
+@param aString     A pointer to a zero terminated string The length of the data 
+                   to be copied is the smaller of: the length of the string (excluding the zero 
+                   terminator), the width of the target area (only if this is not the explicit 
+                   negative value KDefaultJustifyWidth). 
+                    
+@param aWidth      The width of the target area. If this has the specific negative 
+                   value KDefaultJustifyWidth, then the width is re-set to the length of the 
+                   zero terminated string (excluding the zero terminator).
+                    
+@param anAlignment The alignment of the data within the target area. 
+
+@param aFill       The fill character used to pad the target area.
+
+@panic USER 11  if the resulting length of this descriptor is greater than
+                its maximum length or aWidth has a negative value other 
+                than KDefaultJustifyWidth.
+*/
+	{
+
+ 	__CHECK_ALIGNMENT(aString,ETDes16AppendJustify1);
+	AppendJustify(aString,STRING_LENGTH_16(aString),aWidth,anAlignment,aFill);
+    } 
+
+EXPORT_C void TDes16::AppendJustify(const TUint16 *aString,TInt aLength,TInt aWidth,TAlign anAlignment,TChar aFill)
+/**
+Appends data onto the end of this descriptor's data and justifies it.
+
+The source of the appended data is a memory location.
+
+The target area is considered to be an area of specified width, immediately 
+following this descriptor's existing data. Source data is copied into, and 
+aligned within, this target area according to the specified alignment instruction.
+
+If the length of the target area is larger than the length of the source, 
+then spare space within the target area is padded with the fill character.
+
+@param aString     A pointer to a source memory location. 
+
+@param aLength     The length of data to be copied. If this is greater than the 
+                   width of the target area, then the length of data copied is
+                   limited to the width.
+               
+@param aWidth      The width of the target area. If this has the specific negative 
+                   value KDefaultJustifyWidth, then the width is
+                   re-set to the length of the data source. 
+               
+@param anAlignment The alignment of the data within the target area. 
+
+@param aFill       The fill character used to pad the target area.
+
+@panic USER 11  if the resulting length of this descriptor is greater than
+                its maximum length or aWidth has a negative value other 
+                than KDefaultJustifyWidth.
+                
+@panic USER 17  if aLength is negative.  
+*/
+	{
+
+	__ASSERT_ALWAYS(aLength>=0,Panic(ETDes16LengthNegative));
+	__CHECK_ALIGNMENT(aString,ETDes16AppendJustify2);
+	if (aWidth==KDefaultJustifyWidth)
+		aWidth=aLength;
+	if (aLength>aWidth)
+		aLength=aWidth;
+	TInt offset=Length();
+	AppendFill(aFill,aWidth);
+	TInt r=aWidth-aLength;
+	if (anAlignment==ECenter)
+		r>>=1;
+	else if (anAlignment==ELeft)
+		r=0;
+	memCopy(WPtr()+offset+r,aString,aLength);
+	}
+
+EXPORT_C void TDes16::NumFixedWidth(TUint aVal,TRadix aRadix,TInt aWidth)
+/**
+Converts the specified unsigned integer into a fixed width character
+representation based on the specified number system and copies the conversion
+into this descriptor, replacing any existing data.
+
+The length of this descriptor is set to reflect the new data.
+
+The function generates the exact number of specified characters, either padding 
+to the left with character zeroes or discarding low order characters as necessary.
+
+When a hexadecimal conversion is specified, hexadecimal characters are in 
+lower case.
+
+This function is equivalent to using Format() with parameters which specify:
+
+1. a fixed length target field
+
+2. padding with zero characters, for example "%08x".
+
+When this is the case, always use NumFixedWidth() in preference 
+to Format() as it is more efficient.
+
+@param aVal   The unsigned integer value. 
+@param aRadix The number system representation for the unsigned integer. 
+@param aWidth The number of characters: to be used to contain the conversion, 
+              to be copied into this descriptor.
+*/
+	{
+
+	Zero();
+	AppendNumFixedWidth(aVal,aRadix,aWidth);
+	}
+
+EXPORT_C void TDes16::NumFixedWidthUC(TUint aVal,TRadix aRadix,TInt aWidth)
+/** 
+Converts the specified unsigned integer into a fixed width character
+representation based on the specified number system and copies the conversion
+into this descriptor, replacing any existing data.
+
+The length of this descriptor is set to reflect the new data.
+
+The function generates the exact number of specified characters, either padding 
+to the left with character zeroes or discarding low order characters as
+necessary.
+
+When a hexadecimal conversion is specified, hexadecimal characters are in 
+upper case.
+
+This function is equivalent to using Format() with parameters which specify:
+
+1. a fixed length target field
+
+2. padding with zero characters, for example "%08x".
+
+When this is the case, always use NumFixedWidthUC() in 
+preference to Format() as it is more efficient.
+
+@param aVal   The unsigned integer value. 
+@param aRadix The number system representation for the unsigned integer. 
+@param aWidth The number of characters: to be used to contain the conversion, 
+              to be copied into this descriptor.
+              
+@see TDes16::Format()
+*/
+	{
+
+    Zero();
+    AppendNumFixedWidthUC(aVal,aRadix,aWidth);
+    }
+
+EXPORT_C void TDes16::Num(TInt64 aVal)
+/**
+Converts the 64-bit signed integer into a decimal character representation 
+and copies the conversion into this descriptor, replacing any existing data. 
+
+The length of this descriptor is set to reflect the new data.
+
+If the integer is negative, the character representation is prefixed by a 
+minus sign.
+
+@param aVal The 64-bit signed integer value.
+*/
+	{
+	Zero();
+	AppendNum(aVal);
+	}
+
+EXPORT_C void TDes16::Num(TUint64 aVal, TRadix aRadix)
+/**
+Converts the specified 64 bit unsigned integer into a character representation 
+based on the specified number system and copies the conversion into this
+descriptor, replacing any existing data.
+
+The length of this descriptor is set to reflect the new data.
+	
+When a hexadecimal conversion is specified, hexadecimal characters are in 
+lower case.
+	
+@param aVal   The 64 bit integer value. This is treated as an unsigned
+              value for all builds. 
+@param aRadix The number system representation for the 64 bit integer.
+*/
+	{
+
+	Zero();
+	AppendNum(aVal,aRadix);
+	}
+
+EXPORT_C void TDes16::NumUC(TUint64 aVal, TRadix aRadix)
+/**
+Converts the specified 64 bit unsigned integer into a character representation 
+based on the specified number system and copies the conversion into this
+descriptor, replacing any existing data.
+
+The length of this descriptor is set to reflect the new data.
+
+When a hexadecimal conversion is specified, hexadecimal characters are in 
+upper case.
+
+@param aVal   The 64 bit integer value. This is always treated as an unsigned
+              value for all builds. 
+@param aRadix The number system representation for the 64 bit integer. If no 
+              explicit value is specified, then EDecimal is the default.
+*/
+	{
+
+	Zero();
+	AppendNumUC(aVal,aRadix);
+	}
+
+void TDes16::DoPadAppendNum(TInt l, TInt aW, const TUint8* p)
+	{
+	__ASSERT_DEBUG( ((l|(TInt)p)&1)==0, Panic(EDes16PadAppendBadAlign));
+	l>>=1;
+	if (aW<=0)
+		{
+		Append((const TUint16*)p, l);
+		return;
+		}
+	TInt l0 = Length();
+	SetLength(l0 + aW);
+	TUint16* d = WPtr() + l0;
+	for (; aW>l; --aW) *d++ = (TUint16)'0';
+	memcpy(d, p, aW*2);
+	}
+
+EXPORT_C void TDes16::AppendNumFixedWidth(TUint aVal,TRadix aRadix,TInt aWidth)
+/**
+Converts the specified unsigned integer into a fixed width character
+representation based on the specified number system and appends the conversion
+onto the end of this descriptor's data.
+
+The length of this descriptor is incremented to reflect the new content.
+
+The function generates the exact number of specified characters, either padding 
+to the left with character zeroes or discarding low order characters as
+necessary.
+
+When a hexadecimal conversion is specified, hexadecimal characters are in 
+lower case.
+
+@param aVal   The unsigned integer value. 
+@param aRadix The number system representation for the unsigned integer. 
+@param aWidth The number of characters to be used to contain the conversion,
+              and to be appended to this descriptor.
+*/
+	{
+
+	TBuf16<32> buf;
+	buf.Num(aVal,aRadix);
+	if (buf.Length()>=aWidth)
+		Append(buf.Left(aWidth));
+	else
+		{
+		TInt i=aWidth-buf.Length();
+		while(i--)
+			Append(TChar('0'));
+		Append(buf);
+		}
+	}
+
+#ifndef __DES16_MACHINE_CODED__
+EXPORT_C TPtr16 TDes16::LeftTPtr(TInt aLength) const
+/**
+Extracts the leftmost part of the data. 
+
+The function does not cut or remove any data but constructs a modifiable pointer
+descriptor to represent the leftmost part of the data.
+
+@param aLength The length of the data to be extracted. If this value is 
+               greater than the length of the descriptor, the function 
+               extracts the whole of the descriptor.
+               
+@return The 16-bit modifiable pointer descriptor representing the leftmost part
+		of the data.
+
+@panic USER 10  if aLength is negative. 
+*/
+	{
+
+	__ASSERT_ALWAYS(aLength>=0,Panic(ETDes16PosOutOfRange));
+	TInt len = Min(aLength,Length());
+	return(TPtr16((TUint16*)Ptr(),len,len));
+	}
+
+EXPORT_C TPtr16 TDes16::RightTPtr(TInt aLength) const
+/**
+Extracts the rightmost part of the data.
+
+The function does not cut or remove any data but constructs a modifiable pointer
+descriptor to represent the rightmost part of the data.
+
+@param aLength The length of data to be extracted. If this value
+               is greater than the length of the descriptor, the function
+               extracts the whole of the descriptor. 
+               
+@return The 16-bit modifiable pointer descriptor representing the rightmost part
+		of the data.
+
+@panic USER 10  if aLength is negative.
+*/
+	{
+
+	__ASSERT_ALWAYS(aLength>=0,Panic(ETDes16PosOutOfRange));
+	TInt len=Length();
+	if (aLength>len)
+		aLength=len;
+	return(TPtr16((TUint16*)Ptr()+len-aLength,aLength,aLength));
+	}
+
+EXPORT_C TPtr16 TDes16::MidTPtr(TInt aPos) const
+/**
+Extracts a portion of the data.
+
+The function does not cut or remove any data but constructs a modifiable pointer
+descriptor to represent the defined portion.
+
+The portion is identified by its starting position and by the length of the 
+remainder of the data starting from the specified position.
+
+@param aPos The starting position of the data to be extracted. This is an 
+            offset value; a zero value refers to the leftmost data position.
+             
+@return The 16-bit modifiable pointer descriptor representing the specified 
+        portion of the data.
+
+@panic USER 10  if aPos is negative or aPos is greater than the
+                length of the descriptor.
+*/
+	{
+
+	TInt len=Length();
+	__ASSERT_ALWAYS(aPos>=0 && aPos<=len,Panic(ETDes16PosOutOfRange));
+	return(TPtr16((TUint16*)Ptr()+aPos,len-aPos,len-aPos));
+	}
+
+EXPORT_C TPtr16 TDes16::MidTPtr(TInt aPos,TInt aLength) const
+/**
+Extracts a portion of the data.
+
+The function does not cut or remove any data but constructs a modifiable pointer
+descriptor to represent the defined portion.
+
+The portion is identified by its starting position and by its length.
+
+@param aPos    The starting position of the data to be extracted. This is an 
+               offset value; a zero value refers to the leftmost data position. 
+@param aLength The length of data to be extracted.
+
+@return The 16-bit modifiable pointer descriptor representing the specified
+		portion of the data.
+        
+@panic USER 10  if aPos is negative or aPos plus aLength is greater than the
+                length of the descriptor.
+*/
+	{
+
+	__ASSERT_ALWAYS(aPos>=0 && (aPos+aLength)<=Length(),Panic(ETDes16PosOutOfRange));
+	return(TPtr16((TUint16*)Ptr()+aPos,aLength,aLength));
+	}
+#endif
+
+EXPORT_C void TDes16::AppendNumFixedWidthUC(TUint aVal,TRadix aRadix,TInt aWidth)
+/**
+Converts the specified unsigned integer into a fixed width character
+representation based on the specified number system and appends the conversion
+onto the end of this descriptor's data.
+
+The length of this descriptor is incremented to reflect the new content.
+
+The function generates the exact number of specified characters, either
+padding to the left with character zeroes or discarding low order characters
+as necessary.
+
+When a hexadecimal conversion is specified, hexadecimal characters are in 
+upper case.
+
+@param aVal   The unsigned integer value. 
+@param aRadix The number system representation for the unsigned integer. 
+@param aWidth The number of characters: to be used to contain the conversion, 
+              to be appended to this descriptor.
+*/
+	{
+
+	TBuf16<32> buf;
+	buf.NumUC(aVal,aRadix);
+	if (buf.Length()>=aWidth)
+		Append(buf.Left(aWidth));
+	else
+		{
+		TInt i=aWidth-buf.Length();
+		while(i--)
+			Append(TChar('0'));
+		Append(buf);
+		}
+	}
+
+EXPORT_C void TDes16::AppendNum(TInt64 aVal)
+/**
+Converts the 64-bit signed integer into a decimal character representation 
+and appends the conversion onto the end of this descriptor's data.
+
+The length of this descriptor is incremented to reflect the new content.
+
+If the integer is negative, the character representation is prefixed by a 
+minus sign.
+
+@param aVal The 64-bit signed integer value.
+*/
+	{
+
+	if (aVal<0)
+		{
+		Append('-');
+		aVal=-aVal;
+		}
+	AppendNum(static_cast<TUint64>(aVal), EDecimal);
+	}
+
+void TDes16::DoAppendNum(TUint64 aVal, TRadix aRadix, TUint aA, TInt aW)
+//
+// Convert a TUint64 into the descriptor.
+//
+	{
+
+	TUint16 buf[APPEND_BUF_SIZE_64];
+	TUint8* p = (TUint8*)(buf + APPEND_BUF_SIZE_64);
+	TInt l = __DoConvertNum(aVal, aRadix, aA|256, p);
+	DoPadAppendNum(l, aW, p);
+	}
+
+EXPORT_C void TDes16::AppendNum(TUint64 aVal, TRadix aRadix)
+/**
+Converts the specified 64 bit integer into a character representation 
+based on the specified number system and appends the conversion onto the end 
+of this descriptor's data.
+
+The length of this descriptor is incremented to reflect the new content.
+	
+When a hexadecimal conversion is specified, hexadecimal characters are in 
+lower case.
+	
+@param aVal   The 64 bit integer value. This is always treated as an unsigned
+              value. 
+@param aRadix The number system representation for the 64 bit integer.
+*/
+	{
+	DoAppendNum(aVal, aRadix, 'a', 0);
+	}
+
+EXPORT_C void TDes16::AppendNumUC(TUint64 aVal,TRadix aRadix)
+/**
+Converts the specified 64 bit integer into a character representation 
+based on the specified number system and appends the conversion onto the end 
+of this descriptor's data.
+
+The length of this descriptor is incremented to reflect the new content.
+	
+When a hexadecimal conversion is specified, hexadecimal characters are in 
+upper case.
+	
+@param aVal   The 64 bit integer value. This is always treated as an unsigned
+              value. 
+@param aRadix The number system representation for the 64 bit integer. If no 
+              explicit value is specified, then EDecimal is the default.
+*/
+
+	{
+	DoAppendNum(aVal, aRadix, 'A', 0);
+	}
+
+EXPORT_C void TDes16::Format(TRefByValue<const TDesC16> aFmt,...)
+/**
+Formats and copies text into this descriptor, replacing any existing data.
+
+The length of this descriptor is set to reflect the new data.
+
+The function takes a format string and a variable number of arguments.
+The format string contains literal text embedded with directives for converting
+the trailing list of arguments into text.
+
+The embedded directives are character sequences prefixed with the '%' character.
+The literal text is simply copied into this descriptor unaltered while
+the '%' directives are used to convert successive arguments from the
+trailing list.
+
+The resulting stream of literal text and converted arguments is copied into
+this descriptor.
+
+The syntax of the embedded directives follows one of four general patterns.
+
+Note that formatting of single numerical values can be achieved more
+conveniently using the Num() and NumUC() member functions of this class.
+
+The full description of the syntax of a format string cannot be	included here.
+For full details, navigate to the Symbian OS guide, and follow the hierarchy of links:
+
+@code
+Symbian OS Guide
+	Base
+		Using  User Library (E32)
+			Buffers and Strings
+				Using Descriptors
+					How to Use Descriptors
+						Format string syntax
+@endcode
+
+@param aFmt The descriptor containing the format string.
+            The TRefByValue class provides a constructor which takes a
+            TDesC8 type.
+
+@param ...  A variable number of arguments to be converted to text as
+            dictated by the format string. 
+
+@panic USER 11  if the  resulting length of text in this descriptor exceeds
+                the descriptor's maximum length.
+@panic USER 12  if the format string has incorrect syntax.
+
+@see TDes16::Num()
+@see TDes16::NumUC()
+*/
+	{
+
+    VA_LIST list;
+    VA_START(list,aFmt);
+    FormatList(aFmt,list);
+    }
+
+EXPORT_C void TDes16::FormatList(const TDesC16 &aFmt,VA_LIST aList)
+/**
+Formats and copies text into this descriptor, replacing any existing data.
+
+The length of this descriptor is set to reflect the new data.
+
+The behaviour of this function is the same as Format(). In practice, it is 
+better and easier to use Format(), passing a variable number of arguments 
+as required by the format string.
+
+@param aFmt  The descriptor containing the format string.
+@param aList A pointer to an argument list.
+
+@see TDes16::Format()
+@see VA_LIST
+*/
+	{
+
+	Zero();
+	AppendFormatList(aFmt,aList);
+	}
+
+EXPORT_C void TDes16::AppendFormat(TRefByValue<const TDesC16> aFmt,TDes16Overflow *aOverflowHandler,...)
+/**
+Formats and appends text onto the end of this descriptor's data.
+
+The length of this descriptor is incremented to reflect the new content.
+
+The function takes a format string and a variable number of arguments.
+The format string contains literal text, embedded with directives,
+for converting the trailing list of arguments into text.
+
+The embedded directives are character sequences prefixed with the '%' character.
+The literal text is simply copied into this descriptor unaltered while
+the '%' directives are used to convert successive arguments from the
+trailing list. See the description of the Format() function.
+
+Literal text is appended on a character by character basis.
+If it results in the length of this descriptor exceeding its maximum length,
+then the function:
+
+1. calls the Overflow() member function of the overflow handler, if an overflow
+   handler is supplied
+2  raises a USER 11 panic, if no overflow handler is supplied.
+
+As much literal text as possible will have been copied into this descriptor
+and this descriptor will have reached its maximum length.
+
+Text converted from a trailing argument is appended as a complete string.
+If an attempt to append this string fails because the resulting length
+of this descriptor would exceed its maximum length, then the function:
+
+1. calls the Overflow() member function of the overflow handler, if an overflow
+   handler is supplied
+   
+2  raises a USER 11 panic, if no overflow handler is supplied.
+  
+None of the generated text is appended and length of this descriptor
+may be less than the maximum.
+
+@param aFmt             The 16-bit non-modifiable descriptor containing the
+                        format string. The TRefByValue class provides a
+                        constructor which takes a TDesC16 type. 
+
+@param aOverflowHandler A pointer to the overflow handler. 
+
+@param ...              A variable number of arguments to be converted to text
+                        as dictated by the format string. 
+
+@panic USER 11  if the length of the descriptor exceeds its maximum length and
+                no overflow handler has been supplied.
+@panic USER 12  if the format string has incorrect syntax.
+
+@see TDes16::Format()
+@see TDes16Overflow::Overflow()
+*/
+	{
+
+	VA_LIST list;
+	VA_START(list, aOverflowHandler);
+	AppendFormatList(aFmt,list,aOverflowHandler);
+	}
+
+EXPORT_C void TDes16::AppendFormat(TRefByValue<const TDesC16> aFmt,...)
+/**
+Formats and appends text onto the end of this descriptor's data.
+
+The length of this descriptor is incremented to reflect the new content.
+
+The function takes a format string and a variable number of arguments.
+The format string contains literal text, embedded with directives,
+for converting the trailing list of arguments into text.
+
+The embedded directives are character sequences prefixed with the '%' character.
+The literal text is simply copied into this descriptor unaltered while
+the '%' directives are used to convert successive arguments from the
+trailing list. See the description of the Format() function.
+
+Literal text is appended on a character by character basis.
+
+Text converted from a trailing argument is appended as a complete string.
+
+@param aFmt The 16-bit non-modifiable descriptor containing the
+            format string. The TRefByValue class provides a
+            constructor which takes a TDesC16 type. 
+
+@param ...  A variable number of arguments to be converted to text
+            as dictated by the format string. 
+
+@panic USER 11  if the  resulting length of text in this descriptor exceeds
+                the descriptor's maximum length.
+@panic USER 12  if the format string has incorrect syntax.
+
+@see TDes16::Format()
+*/
+	{
+
+    VA_LIST list;
+    VA_START(list,aFmt);
+    AppendFormatList(aFmt,list);
+    }
+
+#if !defined(__DES16_MACHINE_CODED__) | defined(__EABI_CTORS__)
+EXPORT_C TPtrC16::TPtrC16()
+	: TDesC16(EPtrC,0),iPtr(0)
+/**
+Constructs an empty 16-bit non-modifiable pointer descriptor.
+
+It represents no data and its length is zero.
+
+The non-modifiable pointer descriptor can, subsequently, be set to represent 
+data.
+
+@see TPtrC16::Set()
+*/
+	{}
+
+EXPORT_C TPtrC16::TPtrC16(const TDesC16 &aDes)
+	: TDesC16(EPtrC,aDes.Length()),iPtr(aDes.Ptr())
+/** 
+Constructs the 16-bit non-modifiable pointer descriptor from any existing
+descriptor.
+
+It is set to point to the same data and is given the same length as the source
+descriptor.
+
+@param aDes A reference to a 16-bit non-modifiable descriptor.
+*/
+	{}
+#endif
+
+#if !defined(__DES16_MACHINE_CODED_HWORD__) | defined(__EABI_CTORS__)
+EXPORT_C TPtrC16::TPtrC16(const TUint16 *aString)
+	: TDesC16(EPtrC,STRING_LENGTH_16(aString)),iPtr(aString)
+/**
+Constructs the 16-bit non-modifiable pointer descriptor to point to a zero 
+terminated string, whether in RAM or ROM.
+
+The length of the descriptor is set to the length of the zero terminated string, 
+excluding the zero terminator.
+
+@param aString A pointer to a zero terminated string.
+*/
+	{
+	__CHECK_ALIGNMENT(aString,ETDesC16ConstructCString);
+	}
+#endif
+
+#if !defined(__DES16_MACHINE_CODED__) | defined(__EABI_CTORS__)
+EXPORT_C TPtrC16::TPtrC16(const TUint16 *aBuf,TInt aLength)
+	: TDesC16(EPtrC,aLength),iPtr(aBuf)
+/**
+Constructs the 16-bit non-modifiable pointer descriptor to point to the 
+specified location in memory, whether in RAM or ROM.
+
+The length of the descriptor is set to the specified length.
+
+@param aBuf    A pointer to the location that the descriptor is to represent.
+@param aLength The length of the descriptor.This value must be non-negative.
+
+@panic USER 17  if aLength is negative.
+*/
+	{
+	__ASSERT_ALWAYS(aLength>=0,Panic(ETDes16LengthNegative));
+	__CHECK_ALIGNMENT(aBuf,ETDesC16ConstructBufLength);
+	}
+
+EXPORT_C TPtr16::TPtr16(TUint16 *aBuf,TInt aMaxLength)
+	: TDes16(EPtr,0,aMaxLength),iPtr(aBuf)
+/**
+Constructs the 16-bit modifiable pointer descriptor to point to the specified 
+location in memory, whether in RAM or ROM.
+
+The length of the descriptor is set to zero, and its maximum length is set to
+the specified value.
+
+@param aBuf       A pointer to the location that the descriptor is to represent.
+@param aMaxLength The maximum length of the descriptor.
+
+@panic USER 18  if aMaxLength is negative.
+*/
+	{
+	__ASSERT_ALWAYS(aMaxLength>=0,Panic(ETDes16MaxLengthNegative));
+	__CHECK_ALIGNMENT(aBuf,ETDesC16ConstructBufLengthMax);
+	}
+
+EXPORT_C TPtr16::TPtr16(TUint16 *aBuf,TInt aLength,TInt aMaxLength)
+	: TDes16(EPtr,aLength,aMaxLength),iPtr(aBuf)
+/**
+Constructs the 16-bit modifiable pointer descriptor to point to the specified 
+location in memory, whether in RAM or ROM.
+
+The length of the descriptor and its maximum length are set to the specified
+values.
+
+@param aBuf       A pointer to the location that the descriptor is to represent.
+@param aLength    The length of the descriptor. 
+@param aMaxLength The maximum length of the descriptor.
+
+@panic USER 8   if aLength is negative, or is greater than the descriptor's 
+                maximum length,
+                
+@panic USER 18  if aMaxLength is negative.
+*/
+	{
+	__ASSERT_ALWAYS(aMaxLength>=0,Panic(ETDes16MaxLengthNegative));
+	__ASSERT_ALWAYS(TUint(aLength)<=TUint(aMaxLength),Panic(ETDes16LengthOutOfRange));
+	__CHECK_ALIGNMENT(aBuf,ETDesC16ConstructBufLengthMax);
+	}
+
+EXPORT_C TBufBase16::TBufBase16(TInt aMaxLength)
+	:TDes16(EBuf,0,aMaxLength)
+	{
+	__ASSERT_DEBUG(aMaxLength>=0,Panic(ETDes16MaxLengthNegative));
+	}
+
+EXPORT_C TBufBase16::TBufBase16(TInt aLength,TInt aMaxLength)
+	:TDes16(EBuf,aLength,aMaxLength)
+	{
+	__ASSERT_DEBUG(aMaxLength>=0,Panic(ETDes16MaxLengthNegative));
+	__ASSERT_ALWAYS(TUint(aLength)<=TUint(aMaxLength),Panic(ETDes16LengthOutOfRange));
+	}
+#endif
+
+#if !defined( __DES16_MACHINE_CODED_HWORD__) | defined(__EABI_CTORS__)
+EXPORT_C TBufBase16::TBufBase16(const TUint16* aString,TInt aMaxLength)
+	:TDes16(EBuf,0,aMaxLength)
+	{
+	__ASSERT_DEBUG(aMaxLength>=0,Panic(ETDes16MaxLengthNegative));
+	Copy(aString);
+	}
+#endif
+
+#if !defined( __DES16_MACHINE_CODED__) | defined(__EABI_CTORS__)
+EXPORT_C TBufBase16::TBufBase16(const TDesC16& aDes,TInt aMaxLength)
+	:TDes16(EBuf,0,aMaxLength)
+	{
+	__ASSERT_DEBUG(aMaxLength>=0,Panic(ETDes16MaxLengthNegative));
+	Copy(aDes);
+	}
+#endif
+
+EXPORT_C void TDesC16::__DbgTestInvariant() const
+//
+// Test that the class obeys its invariant.
+//
+    {
+
+#if defined(_DEBUG)
+	switch (Type())
+		{
+	case EBufC:
+	case EPtrC:
+	case EPtr:
+	case EBuf:
+	case EBufCPtr:
+		break;
+	default:
+		User::Invariant();
+		}
+	if (Ptr() != NULL) // TPtr and TPtrC can be null
+ 		__CHECK_ALIGNMENT(Ptr(),ETDesC16Invariant);
+#endif
+    }
+
+EXPORT_C void TPtrC16::__DbgTestInvariant() const
+//
+// Test that the class obeys its invariant.
+//
+    {
+
+#if defined(_DEBUG)
+	TDesC16::__DbgTestInvariant(); // Test base class
+	if (Type()!=EPtrC)
+		User::Invariant();
+#endif
+	}
+
+EXPORT_C void TDes16::__DbgTestInvariant() const
+//
+// Test that the class obeys its invariant.
+//
+    {
+
+#if defined(_DEBUG)
+	TDesC16::__DbgTestInvariant(); // Test base class
+	if (Length()>MaxLength() || !(Type()==EPtr || Type()==EBufCPtr || Type()==EBuf))
+		User::Invariant();
+#endif
+	}
+
+EXPORT_C void HBufC16::__DbgTestInvariant() const
+//
+// Test that the class obeys its invariant.
+//
+    {
+
+#if defined(_DEBUG)
+	TDesC16::__DbgTestInvariant(); // Test base class
+	if (Length()>(TInt)(STD_CLASS::AllocLen(this)-sizeof(TDesC16)) || Type()!=EBufC)
+		User::Invariant();
+#endif
+	}
+
+EXPORT_C void TPtr16::__DbgTestInvariant() const
+//
+// Test that the class obeys its invariant.
+//
+    {
+
+#if defined(_DEBUG)
+	TDes16::__DbgTestInvariant(); // Test base class
+	if (!(Type()==EPtr || Type()==EBufCPtr))
+		User::Invariant();
+#endif
+	}
+
+/** Collapse all characters from 16 to 8 bits
+
+@return 8-bit pointer descriptor to transformed text
+*/
+EXPORT_C TPtr8 TDes16::Collapse()
+	{
+	TInt l = Length();
+	TInt ml = MaxLength();
+	TText8* d = (TText8*)Ptr();
+	TText8* d0 = d;
+	const TText16* s = (const TText16*)d;
+	const TText16* sE = s + l;
+	while (s < sE)
+		*d++ = (TText8)*s++;
+	return TPtr8(d0, l, ml*sizeof(TText));
+	}
+
+// Truncate literal string to fit into descriptor
+EXPORT_C void TDes16IgnoreOverflow::Overflow(TDes16& /*aDes*/)
+	{}
+
+#ifndef __KERNEL_MODE__
+
+/**
+Default constructor.
+
+Constructs a zero-length 16-bit resizable buffer descriptor.
+
+Note that the object owns no allocated memory.
+*/
+EXPORT_C RBuf16::RBuf16()
+	:TDes16(EPtr,0,0),iEPtrType(NULL)
+	{
+	// Zero-length RBuf16 is of type EPtr with NULL pointer.
+	}
+
+
+
+
+/**
+Constructor.
+			
+Constructs a 16-bit resizable buffer descriptor, transferring ownership of the
+specified heap descriptor to this object.
+
+@param aHBuf The heap descriptor to be transferred to this object. This pointer
+             can be NULL, which means that a zero length 16-bit resizable
+             buffer	descriptor is constructed, and the object will not own any
+             allocated memory.
+*/
+EXPORT_C RBuf16::RBuf16(HBufC16* aHBuf)
+	{
+	if(aHBuf)
+		//Create EBufCPtr type descriptor that points to aHBuf
+		new(this) TPtr16(aHBuf->Des());
+	else
+		//Create zero-length RBuf16. It is EPtr type of descriptor that points to NULL.
+		new(this) RBuf16();
+	}
+
+
+
+
+/**
+Protected constructor.
+*/
+EXPORT_C RBuf16::RBuf16(TInt aType,TInt aLength,TInt aMaxLength)
+	:TDes16(aType,aLength,aMaxLength)
+	{
+	}
+
+
+
+
+/**
+Transfers ownership of the specified 16-bit resizable buffer descriptor's 
+buffer to this object.
+
+Note that the function assumes that this descriptor does not already own any
+allocated memory. It does not check, nor does it free any pre-existing owned
+allocated memory.  If this descriptor does already own allocated memory,
+RBuf16::Close() should be invoked on this descriptor before this function is
+invoked.
+
+@param aRBuf The source 16-bit resizable buffer. The ownership of this
+             object's buffer is to be transferred.
+
+@see RBuf16::Close()
+*/
+EXPORT_C void RBuf16::Assign(const RBuf16& aRBuf)
+	{
+	Mem::Copy(this, &aRBuf, sizeof(*this)); 
+	__TEST_INVARIANT;
+	}
+
+
+
+
+/**
+Assigns ownership of the specified allocated memory to this object.
+
+The allocated memory forms the buffer for this descriptor. The current length
+of the descriptor is set to zero.
+
+Note that the function assumes that this descriptor does not already own any
+allocated memory. It does not check, nor does it free any pre-existing owned
+allocated memory.  If this descriptor does already own allocated memory,
+RBuf16::Close() should be invoked on this descriptor before this function is
+invoked.
+
+@param aHeapCell  The allocated memory to be assigned to this object. This
+                  pointer can be NULL, which means that a zero length 16-bit
+                  resizable buffer descriptor is created.
+@param aMaxLength The maximum length of the descriptor.
+
+@panic USER 8 If the specified maximum length is greater then the size of
+              the allocated heap cell, or the specified maximum length
+              is NOT zero when the pointer to the heap cell is NULL.
+              
+@see TDesC16::Length()
+@see TDes16::MaxLength()
+@see RBuf16::Close()
+*/
+EXPORT_C void RBuf16::Assign(TUint16 *aHeapCell,TInt aMaxLength)
+	{
+	Assign(aHeapCell,0,aMaxLength);
+	}
+
+
+
+
+/**
+Assigns ownership of the specified allocated memory to this object.
+
+The allocated memory forms the buffer for this descriptor. The current length
+of the descriptor is set to the value of the second parameter.
+
+Note that the function assumes that this descriptor does not already own any
+allocated memory. It does not check, nor does it free any pre-existing owned
+allocated memory.  If this descriptor does already own allocated memory,
+RBuf16::Close() should be invoked on this descriptor before this function is
+invoked.
+
+@param aHeapCell  The allocated memory to be assigned to this object.
+@param aLength	  The length of the descriptor.
+@param aMaxLength The maximum length of the descriptor.
+
+@panic USER 8 If the specified maximum length is greater then the size of
+              the allocated heap cell, or the specified length is greater then
+              the specified	maximum length, or the specified maximum length
+              is NOT zero when the pointer to the heap cell is NULL.
+
+@see TDesC16::Length()
+@see TDes16::MaxLength()
+@see RBuf16::Close()
+*/
+EXPORT_C void RBuf16::Assign(TUint16 *aHeapCell,TInt aLength,TInt aMaxLength)
+	{
+	__ASSERT_ALWAYS(aLength<=aMaxLength, Panic(ETDes16LengthOutOfRange));
+	if(aHeapCell)
+		{
+		__ASSERT_ALWAYS(User::AllocLen(aHeapCell) >= aMaxLength * (TInt)sizeof(TUint16), Panic(ETDes16LengthOutOfRange));
+		//Create EPtr type descriptor that points to aHeapCell
+		new(this) TPtr16(aHeapCell,aLength,aMaxLength); 
+		}
+	else
+		{
+		__ASSERT_ALWAYS(aMaxLength == 0, Panic(ETDes16LengthOutOfRange));
+		//Create zero-length RBuf. It is EPtr type of descriptor that points to NULL.
+		new(this) RBuf16();
+		}
+	__TEST_INVARIANT;
+	}
+
+
+
+
+/**
+Transfers ownership of the specified heap descriptor to this object.
+
+Note that the function assumes that this descriptor does not already own any
+allocated memory. It does not check, nor does it free any pre-existing owned
+allocated memory.  If this descriptor does already own allocated memory,
+RBuf16::Close() should be invoked on this descriptor before this function is
+invoked.
+
+@param aHBuf  The heap descriptor to be transferred to this object.
+              This pointer can be NULL, which means that a zero length
+              16-bit resizable buffer descriptor is created.
+
+@see RBuf16::Close()
+*/
+EXPORT_C void RBuf16::Assign(HBufC16* aHBuf)
+	{
+	new(this) RBuf16(aHBuf);
+	}
+
+
+
+
+/**
+Swaps the content of two 16-bit resizable buffer descriptors.
+
+@param aRBuf The 16-bit resizable buffer descriptor whose contents are to be
+             swapped with this one.
+*/
+EXPORT_C void RBuf16::Swap(RBuf16& aRBuf)
+	{
+	Mem::Swap(this,&aRBuf,sizeof(*this));
+	}
+
+
+
+
+/**
+Creates a 16-bit resizable buffer descriptor.
+
+The function allocates sufficient memory to contain descriptor data up to
+the specified maximum length.
+
+The current length of the descriptor is set to zero. The maximum length of
+the descriptor is set to the specified value.
+
+Note that the function assumes that this descriptor does not already own any
+allocated memory. It does not check, nor does it free any pre-existing owned
+allocated memory.  If this descriptor does already own allocated memory,
+RBuf16::Close() should be invoked on this descriptor before this function is
+invoked.
+
+@param aMaxLength  The maximum length of the descriptor.
+
+@return KErrNone, if successful; KErrNoMemory, if there is insufficient	memory.
+
+@see TDesC16::Length()
+@see TDes16::MaxLength()
+@see RBuf16::Close()
+*/
+EXPORT_C TInt RBuf16::Create(TInt aMaxLength)
+	{
+	if (aMaxLength)
+		{
+		//Allocate memory
+		TUint16* buf=(TUint16*)User::Alloc(aMaxLength*sizeof(TUint16));
+		if(!buf) return KErrNoMemory;
+		iEPtrType = buf;
+		}
+	else
+		iEPtrType = NULL; //Zero-length descriptor.
+
+
+	//Create EPtr type descriptor.
+	new(this) RBuf16(EPtr,0,aMaxLength);
+	__TEST_INVARIANT;
+	return KErrNone;
+	}
+
+
+
+
+/**
+Creates 16-bit resizable buffer descriptor, and leaves on failure.
+
+The function allocates sufficient memory to contain descriptor data up to
+the specified maximum length.
+
+The current length of the descriptor is set to zero. The maximum length of
+the descriptor is set to the specified value.
+
+Note that the function assumes that this descriptor does not already own any
+allocated memory. It does not check, nor does it free any pre-existing owned
+allocated memory.  If this descriptor does already own allocated memory,
+RBuf16::Close() should be invoked on this descriptor before this function is
+invoked.
+
+@param aMaxLength The maximum length of the descriptor.
+
+@leave KErrNoMemory If there is insufficient memory.
+
+@see TDesC16::Length()
+@see TDes16::MaxLength()
+@see RBuf16::Close()
+*/
+EXPORT_C void RBuf16::CreateL(TInt aMaxLength)
+	{
+	User::LeaveIfError(Create(aMaxLength));
+	}
+
+
+
+
+/**
+Creates a 16-bit resizable buffer descriptor.
+
+The function allocates sufficient memory to contain descriptor data up to
+the specified maximum length.
+
+Both the current length and the maximum length of the descriptor are set to
+the specified value.
+
+Note that the function assumes that this descriptor does not already own any
+allocated memory. It does not check, nor does it free any pre-existing owned
+allocated memory.  If this descriptor does already own allocated memory,
+RBuf16::Close() should be invoked on this descriptor before this function is
+invoked.
+
+@param aMaxLength  The length and the maximum length of the descriptor.
+
+@return KErrNone, if successful; KErrNoMemory, if there is insufficient memory.
+
+@see RBuf16::Close()
+*/
+EXPORT_C TInt RBuf16::CreateMax(TInt aMaxLength)
+	{
+	TInt err=Create(aMaxLength); 
+	if(err==KErrNone)
+		SetMax(); 
+	return err;
+	}
+
+
+
+
+/**
+Creates a 16-bit resizable buffer descriptor, and leaves on failure.
+
+The function allocates sufficient memory to contain descriptor data up to
+the specified maximum length.
+
+Both the current length and the maximum length of the descriptor are set to
+the specified value. 
+
+Note that the function assumes that this descriptor does not already own any
+allocated memory. It does not check, nor does it free any pre-existing owned
+allocated memory.  If this descriptor does already own allocated memory,
+RBuf16::Close() should be invoked on this descriptor before this function is
+invoked.
+
+@param aMaxLength The length and the maximum length of the descriptor.
+
+@leave KErrNoMemory If there is insufficient memory.
+
+@see TDesC16::Length()
+@see TDes16::MaxLength()
+@see RBuf16::Close()
+*/
+EXPORT_C void RBuf16::CreateMaxL(TInt aMaxLength)
+	{
+	User::LeaveIfError(CreateMax(aMaxLength));
+	}
+
+
+
+
+/**
+Creates a 16-bit resizable buffer descriptor to contain a copy of the
+specified (source) descriptor.
+
+The function allocates sufficient memory so that this descriptor's maximum
+length is the same as the length of the source descriptor. Both the current
+length and the maximum length of this descriptor are set to
+the length of the source descriptor.
+				
+The data contained in the source descriptor is copied into this
+descriptor.
+
+Note that the function assumes that this descriptor does not
+already own any allocated memory. It does not check, nor does it free any
+pre-existing owned allocated memory.  If this descriptor does already own 
+allocated memory, RBuf16::Close() should be invoked on this descriptor before 
+this function is invoked.
+
+@param aDes Source descriptor to be copied into this object.
+
+@return KErrNone, if successful; KErrNoMemory, if there is insufficient memory.
+
+@see TDesC16::Length()
+@see TDes16::MaxLength()
+@see TDes16::Copy()
+@see RBuf16::Close()
+*/
+EXPORT_C TInt RBuf16::Create(const TDesC16& aDes)
+	{
+	return Create(aDes,aDes.Length());
+	}
+
+
+
+
+
+/**
+Creates a 16-bit resizable buffer descriptor to contain a copy of the specified
+(source) descriptor, and leaves on failure.
+ 
+The function allocates sufficient memory so that this descriptor's maximum
+length is the same as the length of the source descriptor.Both the current
+length and the maximum length of this descriptor are set to the length
+of the source descriptor.
+
+The data contained in the source descriptor is copied into this descriptor.
+
+Note that the function assumes that this descriptor does not already own any
+allocated memory. It does not check, nor does it free any
+pre-existing owned allocated memory.  If this descriptor does already own 
+allocated memory, RBuf16::Close() should be invoked on this descriptor before 
+this function is invoked.
+
+@param aDes Source descriptor to be copied into this object.
+
+@leave KErrNoMemory If there is insufficient memory.
+
+@see TDesC16::Length()
+@see TDes16::MaxLength()
+@see TDes16::Copy()
+@see RBuf16::Close()
+*/
+EXPORT_C void RBuf16::CreateL(const TDesC16& aDes)
+	{
+	CreateL(aDes,aDes.Length());
+	}
+
+
+
+
+/**
+Creates a 16-bit resizable buffer descriptor to contain a copy of the
+specified (source) descriptor. 
+
+The function allocates sufficient memory so that this descriptor's maximum length
+is the same as the value of the aMaxLength parameter.
+
+The data contained in the source descriptor is copied into this descriptor.
+The length of data copied is either
+
+- the length of the source descriptor aDes
+
+or
+
+- the value of the aMaxLength parameter
+
+whichever is the smaller value. The current length of this descriptor is also
+set to the smaller value.
+
+Note that the function assumes that this descriptor does not already own any
+allocated memory. It does not check, nor does it free any pre-existing owned
+allocated memory.  If this descriptor does already own allocated memory,
+RBuf16::Close() should be invoked on this descriptor before this function is
+invoked.
+
+@param aDes Source descriptor to be copied into this object.
+            
+@param aMaxLength The maximum length of this descriptor.
+
+@return KErrNone, if successful; KErrNoMemory, if there is insufficient memory.
+
+@see TDesC16::Length()
+@see TDes16::MaxLength()
+@see TDes16::Copy()
+@see RBuf16::Close()
+*/
+EXPORT_C TInt RBuf16::Create(const TDesC16& aDes,TInt aMaxLength)
+	{
+	TInt err=Create(aMaxLength);
+	if(err==KErrNone) 
+		Copy(aDes.Left(aMaxLength));
+	return err;
+	}
+
+
+
+
+/**
+Creates a 16-bit resizable buffer descriptor to contain a copy of the specified
+(source) descriptor, and leaves on failure.
+
+The function allocates sufficient memory so that this descriptor's maximum
+length is the same as the value of the aMaxLength parameter.
+
+The data contained in the source descriptor is copied into this descriptor.
+The length of data copied is either
+
+- the length of the source descriptor aDes
+
+or
+
+- the value of the aMaxLength parameter
+
+whichever is the smaller value. The current length of this descriptor is also
+set to the smaller value.
+
+Note that the function assumes that this descriptor does not already own any
+allocated memory. It does not check, nor does it free any pre-existing owned
+allocated memory.  If this descriptor does already own allocated memory,
+RBuf16::Close() should be invoked on this descriptor before this function is
+invoked.
+
+@param aDes Source descriptor to be copied into this object.
+            
+@param aMaxLength The maximum length of this descriptor.
+
+@leave KErrNoMemory If there is insufficient memory.
+
+@see TDesC16::Length()
+@see TDes16::MaxLength()
+@see TDes16::Copy()
+@see RBuf16::Close()
+*/
+EXPORT_C void RBuf16::CreateL(const TDesC16& aDes,TInt aMaxLength)
+	{
+	CreateL(aMaxLength);
+	Copy(aDes.Left(aMaxLength));
+	}
+
+
+
+
+/**
+Resizes this 16-bit resizable buffer descriptor.
+
+The length and contents of the descriptor are unchanged.
+
+If the buffer descriptor was created from a zero-length heap descriptor
+HBufC, this method might leak memory (the heap descriptor is not freed).
+It is possible to avoid this by calling the Close() method prior to ReAlloc(),
+but this should be done only in this situation (otherwise the buffer contents
+will be lost).
+
+For example, add
+@code
+    if (desc.MaxLength() == 0) desc.Close();
+@endcode
+before the call to ReAlloc().
+    
+@param aMaxLength The new maximum length of the descriptor. This can be zero,
+                  which results in a descriptor with zero maximum length and no
+                  allocated memory.
+                  
+@return KErrNone, if successful; KErrNoMemory, if there is insufficient memory.
+
+@panic USER 14 If the new maximum length is less then the current descriptor length.
+*/
+EXPORT_C TInt RBuf16::ReAlloc(TInt aMaxLength)
+	{
+	__ASSERT_ALWAYS(Length()<=aMaxLength, Panic(ETDes16ReAllocTooSmall));
+	__TEST_INVARIANT;
+
+	if (!aMaxLength)				//Reallocation to zero length
+		{
+		User::Free(iEPtrType);	//Free memory 
+		new (this) RBuf16();		//Create zero-length RBuf
+		return KErrNone;
+		}
+
+	if (!iMaxLength)				//Reallocation from zero length
+		return Create(aMaxLength); 
+
+	switch(Type())
+		{
+		case EPtr:
+			{
+			TUint16* buf = (TUint16*)User::ReAlloc(iEPtrType,aMaxLength*sizeof(TUint16));
+			if(!buf) return KErrNoMemory;
+			iEPtrType = buf;
+			iMaxLength = aMaxLength;
+			break;
+			}
+		case EBufCPtr:
+			{
+			HBufC16* hbufc = iEBufCPtrType->ReAlloc(aMaxLength);
+			if(!hbufc) return KErrNoMemory;
+			Assign(hbufc);
+			break;
+			}
+		}
+
+	__TEST_INVARIANT;
+	return KErrNone;
+	}
+
+
+
+
+/**
+Resizes this 16-bit resizable buffer descriptor, leaving on failure.
+
+The length and contents of the descriptor are unchanged.
+
+If the buffer descriptor was created from a zero-length heap descriptor
+HBufC, this method might leak memory (the heap descriptor is not freed).
+It is possible to avoid this by calling the Close() method prior to ReAllocL(),
+but this should be done only in this situation (otherwise the buffer contents
+will be lost).
+
+For example, add
+@code
+    if (desc.MaxLength() == 0) desc.Close();
+@endcode
+before the call to ReAlloc().
+
+@param aMaxLength The new maximum length of the descriptor. This can be zero,
+                  which results in a descriptor with zero maximum length and no
+                  allocated memory.
+                  
+@return KErrNone, if successful; KErrNoMemory, if there is insufficient memory.
+
+@panic USER 14 If the new maximum length is less then the current descriptor length.
+*/
+EXPORT_C void RBuf16::ReAllocL(TInt aMaxLength)
+	{
+	User::LeaveIfError(ReAlloc(aMaxLength));
+	}
+
+
+
+
+/**
+Deallocates memory assigned to this object, and re-initializes the object as
+a zero-length descriptor.
+*/
+EXPORT_C void RBuf16::Close() 
+	{
+	User::Free(iEPtrType); 
+	//Create zero-length RBuf. It is EPtr type of descriptor that points to NULL.
+	new(this) RBuf16();
+	}
+
+
+
+
+/**
+Pushes a cleanup item for this object onto the cleanup stack.
+
+The effect of this is to cause Close() to be called on this 16-bit resizable
+buffer descriptor, when CleanupStack::PopAndDestroy() is called at some later time.
+
+@code
+...
+RBuf16 x;
+....
+x.CleanupClosePushL();
+...
+CleanupStack::PopAndDestroy();
+...
+@endcode
+
+@see RBuf16::Close()
+*/
+EXPORT_C void RBuf16::CleanupClosePushL()
+	{
+	::CleanupClosePushL(*this);
+	}
+
+
+
+
+/**
+Tests that the class obeys its invariant.
+*/
+EXPORT_C void RBuf16::__DbgTestInvariant() const
+	{
+#ifdef _DEBUG
+	TDes16::__DbgTestInvariant();
+	switch(Type())
+		{
+	case EPtr:
+		if (iEPtrType)
+			{
+			__ASSERT_DEBUG(User::AllocLen(iEPtrType) >= iMaxLength*(TInt)sizeof(TUint16), Panic(EInvariantFalse));
+			}
+		break;
+	case EBufCPtr:
+		iEBufCPtrType->__DbgTestInvariant(); 
+		__ASSERT_DEBUG(iEBufCPtrType->Des().MaxLength() == iMaxLength, Panic(EInvariantFalse));
+		__ASSERT_DEBUG(iEBufCPtrType->Length() == Length(), Panic(EInvariantFalse));
+		break;
+	default:
+		User::Invariant();
+		}
+#endif // _DEBUG
+	}
+
+#endif	// __KERNEL_MODE__
+
+
+#if defined(__DES16_MACHINE_CODED__) || defined(__EABI__)
+GLDEF_C void Des16PanicBadDesType()
+	{
+	Panic(ETDes16BadDescriptorType);
+	}
+
+GLDEF_C void Des16PanicPosOutOfRange()
+	{
+	Panic(ETDes16PosOutOfRange);
+	}
+#endif
+
+#ifdef __DES16_MACHINE_CODED__
+GLDEF_C void Des16PanicLengthNegative()
+	{
+	Panic(ETDes16LengthNegative);
+	}
+
+GLDEF_C void Des16PanicMaxLengthNegative()
+	{
+	Panic(ETDes16MaxLengthNegative);
+	}
+
+GLDEF_C void Des16PanicLengthOutOfRange()
+	{
+	Panic(ETDes16LengthOutOfRange);
+	}
+
+GLDEF_C void Des16PanicDesOverflow()
+	{
+	Panic(ETDes16Overflow);
+	}
+
+GLDEF_C void Des16PanicDesIndexOutOfRange()
+	{
+	Panic(ETDes16IndexOutOfRange);
+	}
+#endif
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32/common/des8.cpp	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,3955 @@
+// Copyright (c) 1994-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32\common\des8.cpp
+// 
+//
+
+#include "common.h"
+#ifndef __KERNEL_MODE__
+#include <collate.h>
+#else
+#include <kern_priv.h>
+#endif
+#include <unicode.h>
+
+// Folding/Collation for 8 bit characters
+
+extern const TUint8 __FoldCollTab8[256];
+
+const TUint8 __FoldCollTab8[256] =
+	{
+	0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07, // 0x00
+	0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,
+	0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17, // 0x10
+	0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f,
+	0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27, // 0x20
+	0x28,0x29,0x2a,0x2b,0x2c,0x2d,0x2e,0x2f,
+	0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37, // 0x30
+	0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f,
+	0x40,0x61,0x62,0x63,0x64,0x65,0x66,0x67, // 0x40
+	0x68,0x69,0x6a,0x6b,0x6c,0x6d,0x6e,0x6f,
+	0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77, // 0x50
+	0x78,0x79,0x7a,0x5b,0x5c,0x5d,0x5e,0x5f,
+	0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67, // 0x60
+	0x68,0x69,0x6a,0x6b,0x6c,0x6d,0x6e,0x6f,
+	0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77, // 0x70
+	0x78,0x79,0x7a,0x7b,0x7c,0x7d,0x7e,0x7f,
+	0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87, // 0x80
+	0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f,
+	0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97, // 0x90
+	0x98,0x99,0x9a,0x9b,0x9c,0x9d,0x9e,0x9f,
+	0x20,0xa1,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7, // 0xa0
+	0xa8,0xa9,0xaa,0xab,0xac,0xad,0xae,0xaf,
+	0xb0,0xb1,0xb2,0xb3,0xb4,0xb5,0xb6,0xb7, // 0xb0
+	0xb8,0xb9,0xba,0xbb,0xbc,0xbd,0xbe,0xbf,
+	0x61,0x61,0x61,0x61,0x61,0x61,0xe6,0x63, // 0xc0
+	0x65,0x65,0x65,0x65,0x69,0x69,0x69,0x69,
+	0xf0,0x6e,0x6f,0x6f,0x6f,0x6f,0x6f,0xd7, // 0xd0
+	0xf8,0x75,0x75,0x75,0x75,0x79,0xfe,0xdf,
+	0x61,0x61,0x61,0x61,0x61,0x61,0xe6,0x63, // 0xe0
+	0x65,0x65,0x65,0x65,0x69,0x69,0x69,0x69,
+	0xf0,0x6e,0x6f,0x6f,0x6f,0x6f,0x6f,0xf7, // 0xf0
+	0xf8,0x75,0x75,0x75,0x75,0x79,0xfe,0x79
+	};
+
+#ifndef __KERNEL_MODE__
+inline TUint8* memCopy(TUint8* aPtr, const TUint8* aSrc, TInt aLength)
+//
+// Copy 8 bit values.
+//
+	{
+
+	return Mem::Copy(aPtr, aSrc, aLength);
+	}
+#endif
+
+#if (defined(__KERNEL_MODE__) && !defined(__DES8_MACHINE_CODED__)) | defined(__EABI_CTORS__)
+inline TInt StringLength(const TUint8* aPtr)
+	{
+	const TUint8* p = aPtr;
+	while (*p)
+		++p;
+	return p-aPtr;
+	}
+#endif
+
+inline TDesC8::TDesC8(TInt aType,TInt aLength)
+	:iLength(aLength|(aType<<KShiftDesType8))
+	{}
+inline TInt TDesC8::Type() const
+//
+// Return the descriptor type
+//
+	{
+	return(iLength>>KShiftDesType8);
+	}
+
+inline TDes8::TDes8(TInt aType,TInt aLength,TInt aMaxLength)
+	: TDesC8(aType,aLength),iMaxLength(aMaxLength)
+	{}
+
+// Class TBufCBase8
+inline TBufCBase8::TBufCBase8(TInt aLength)
+	:TDesC8(EBufC,aLength)
+	{}
+
+inline TUint8* TBufCBase8::WPtr() const
+	{return const_cast<TUint8*>(Ptr());}
+
+
+#ifndef __DES8_MACHINE_CODED__
+EXPORT_C const TUint8* TDesC8::Ptr() const
+/**
+Gets a pointer to the data represented by the descriptor.
+
+The data cannot be changed through the returned pointer.
+
+@return A pointer to the data
+*/
+	{
+
+	switch (Type())
+		{
+	case EBufC:
+		return(&((SBufC8 *)this)->buf[0]);
+	case EPtrC:
+		return(((SPtrC8 *)this)->ptr);
+	case EPtr:
+		return(((SPtr8 *)this)->ptr);
+	case EBuf:
+		return(&((SBuf8 *)this)->buf[0]);
+	case EBufCPtr:
+		return(&((SBufCPtr8 *)this)->ptr->buf[0]);
+		}
+	Panic(ETDes8BadDescriptorType);
+	return(NULL);
+	}
+
+EXPORT_C const TUint8 &TDesC8::AtC(TInt anIndex) const
+//
+// Return a reference to the character in the buffer.
+//
+	{
+
+	__ASSERT_ALWAYS(anIndex>=0 && anIndex<Length(),Panic(ETDes8IndexOutOfRange));
+	return(Ptr()[anIndex]);
+	}
+
+EXPORT_C TInt TDesC8::Compare(const TDesC8 &aDes) const
+/**
+Compares this descriptor's data with the specified descriptor's data.
+
+The comparison proceeds on a byte for byte basis. The result of the comparison 
+is based on the difference of the first bytes to disagree.
+
+Two descriptors are equal if they have the same length and content. Where 
+two descriptors have different lengths and the shorter descriptor's data
+matches the first part of the longer descriptor's data, the shorter is
+considered to be less than the longer.
+
+@param aDes The 8-bit non-modifable descriptor whose data is to be compared 
+            with this descriptor's data.
+             
+@return Positive, if this descriptor is greater than the specified descriptor. 
+        Negative, if this descriptor is less than the specified descriptor.
+        Zero, if both descriptors have the same length and the their contents
+        are the same.
+*/
+	{
+
+	return memcompare(Ptr(), Length(), aDes.Ptr(), aDes.Length());
+	}
+
+#ifndef __KERNEL_MODE__
+EXPORT_C TInt TDesC8::CompareF(const TDesC8 &aDes) const
+/**
+Compares this descriptor's folded data with the specified descriptor's folded 
+data. 
+
+Note that folding is locale-independent behaviour. It is also important to 
+note that there can be no guarantee that folding is in any way culturally 
+appropriate, and should not be used for comparing strings in natural language; 
+use CompareC() for this.
+
+@param aDes The 8-bit non modifable descriptor whose data is to be compared 
+            with this descriptor's data. 
+            
+@return Positive, if this descriptor is greater than the specified descriptor. 
+        Negative, if this descriptor is less than the specified descriptor.
+        Zero, if both descriptors have the same length and the their contents
+        are the same.
+        
+@see TDesC8::Compare()
+*/
+	{
+
+	return(Mem::CompareF(Ptr(),Length(),aDes.Ptr(),aDes.Length()));
+	}
+
+EXPORT_C TInt TDesC8::CompareC(const TDesC8 &aDes) const
+/**
+Compares this descriptor's data with the specified descriptor's data using 
+the standard collation method for narrow text appropriate to the current locale.
+
+@param aDes The 8-bit non modifable descriptor whose data is to be compared 
+            with this descriptor's data. 
+            
+@return Positive, if this descriptor is greater than the specified descriptor. 
+        Negative, if this descriptor is less than the specified descriptor.
+        Zero, if both descriptors have the same length and the their contents
+        are the same.
+        
+@see TDesC8::Compare()
+@deprecated
+*/
+	{
+
+	return(Mem::CompareC(Ptr(),Length(),aDes.Ptr(),aDes.Length()));
+	}
+#endif
+#endif
+
+EXPORT_C TInt TDesC8::Find(const TUint8 *pS,TInt aLenS) const
+/**
+Searches for the first occurrence of the specified data sequence within this 
+descriptor.
+
+Searching always starts at the beginning of this descriptor's data.
+
+@param pS    A pointer to a location containing the data sequence to be searched 
+             for.
+@param aLenS The length of the data sequence to be searched for. This value 
+             must not be negative, otherwise the function raises a panic.
+             
+@return The offset of the data sequence from the beginning of this descriptor's 
+        data. KErrNotFound, if the data sequence cannot be found.
+       
+@panic  USER 29 if aLenS is negative. 
+*/
+	{
+
+	if (!aLenS)
+		return(0);
+	__ASSERT_ALWAYS(aLenS>0,Panic(ETDes8LengthNegative));
+	const TUint8 *pB=Ptr();
+	TInt aLenB=Length();
+	const TUint8 *pC=pB-1;			// using pre-increment addressing
+	TInt i=aLenB-aLenS;
+	if (i>=0)
+		{
+		const TUint8* pEndS=pS+aLenS-1;		// using pre-increment addressing
+		const TUint8 *pEndB=pB+i;			// using pre-increment addressing
+		TUint s=*pS;
+		for (;;)
+			{
+			do
+				{
+				if (pC==pEndB)
+					return KErrNotFound;
+				} while (*++pC!=s);
+			const TUint8 *p1=pC;
+			const TUint8 *p2=pS;
+			do
+				{
+				if (p2==pEndS)
+					return (pC-pB);
+				} while (*++p1==*++p2);
+			}
+		}
+	return(KErrNotFound);
+	}
+
+EXPORT_C TInt TDesC8::Find(const TDesC8 &aDes) const
+/**
+Searches for the first occurrence of the specified data sequence within this 
+descriptor.
+
+Searching always starts at the beginning of this descriptor's data.
+
+@param aDes The 8-bit non modifable descriptor containing the data sequence 
+            to be searched for. 
+            
+@return The offset of the data sequence from the beginning of this descriptor's 
+        data. KErrNotFound, if the data sequence cannot be found.
+*/
+	{
+
+	return(Find(aDes.Ptr(),aDes.Length()));
+	}
+
+const TUint8* convTable(TMatchType aType)
+	{
+	switch (aType)
+		{
+		case EMatchFolded:
+		case EMatchCollated: return __FoldCollTab8;
+		default: return NULL;
+		}
+	}
+
+inline TUint conv(const TUint8* aStr,const TUint8* aConv)
+	{
+	TUint c=*aStr;
+	return aConv ? aConv[c] : c;
+	}
+
+
+inline TUint lookup(const TUint8* aStr,const TUint8* aConv)
+	{
+	return aConv[*aStr];
+	}
+
+TInt DoMatch8(const TDesC8 &aLeftD,const TDesC8 &aRightD,TMatchType aType)
+	{
+	const TUint8* table=convTable(aType);
+	const TUint8* pRight=aRightD.Ptr();
+	const TUint8* pM=pRight-1;				// pre-increment addressing
+	const TUint8* pP=pM+aRightD.Length();
+	const TUint8* pLeft=aLeftD.Ptr()-1;		// pre-increment addressing
+	const TUint8* pB=pLeft;	
+	const TUint8* pE=pB+aLeftD.Length();
+
+	// Match any pattern up to the first star
+	TUint c;
+	for (;;)
+		{
+		if (pM==pP)		// exhausted the pattern
+			return pB==pE ? 0 : KErrNotFound;
+		TUint c=conv(++pM,table);
+		if (c==KMatchAny)
+			break;
+		if (pB==pE)			// no more input
+			return KErrNotFound;
+		if (c!=conv(++pB,table) && c!=KMatchOne)	// match failed
+			return KErrNotFound;
+		}
+	// reached a star
+	if (pM==pP)
+		return 0;
+	TInt r=pM==pRight ? -1 : 0;
+	for (;;)
+		{
+		c=conv(++pM,table);
+		if (c==KMatchAny)
+			{
+star:		if (pM==pP)		// star at end of pattern, always matches
+				return Max(r,0);
+			if (r<-1)		// skipped some '?', matches at beginning
+				r=0;
+			continue;
+			}
+		if (pB==pE)			// no more input
+			return KErrNotFound;
+		if (c==KMatchOne)
+			{				// skip a character in the input
+			if (pM==pP)
+				return r+((r>=0) ? 0 : (pE-pLeft));
+			++pB;
+			if (r<0)
+				--r;
+			continue;
+			}
+	// Matching a non-wild character
+		for (;;)
+			{
+			if (table)	// pull this test out of the tight loop (10-20% faster)
+				{
+				while (lookup(++pB,table)!=c)
+					{
+					if (pB==pE)				// no more input
+						return KErrNotFound;
+					}
+				}
+			else
+				{
+				while (*++pB!=c)
+					{
+					if (pB==pE)				// no more input
+						return KErrNotFound;
+					}
+				}
+			// Try to match up to the next star
+			const TUint8* pb=pB;
+			const TUint8* pm=pM;
+			for (;;)
+				{
+				if (pm<pP)
+					{
+					TUint cc=conv(++pm,table);
+					if (cc==KMatchAny)
+						{	// sub-match successful, back to main loop
+						r+=(r>=0 ? 0 : pB-pLeft);
+						pB=pb;
+						pM=pm;
+						goto star;
+						}
+					if (pb==pE)
+						return KErrNotFound;	// no more input
+					if (cc!=conv(++pb,table) && cc!=KMatchOne)
+						break;	// sub-match failed, try next input character
+					}
+				else if (pb==pE)	// end of matching pattern
+					return r+(r>=0 ? 0 : pB-pLeft);	// end of input, so have a match
+				else
+					break;		// try next input character
+				}
+			}
+		}
+	}
+
+EXPORT_C TInt TDesC8::Match(const TDesC8 &aDes) const
+/**
+Searches this descriptor's data for a match with the match pattern supplied 
+in the specified descriptor.
+
+The match pattern can contain the wildcard characters "*" and "?", where "*" 
+matches zero or more consecutive occurrences of any character and "?" matches 
+a single occurrence of any character.
+
+Note that there is no 'escape character', which means that it is not possible
+to match either the "*" character itself or the "?" character itself using
+this function.
+
+@param aDes An 8-bit non-modifable descriptor containing the match pattern.
+
+@return If a match is found, the offset within this descriptor's data where 
+        the match first occurs. KErrNotFound, if there is no match.
+*/
+	{
+
+	return DoMatch8(*this,aDes,EMatchNormal);
+	}
+
+EXPORT_C TInt TDesC8::MatchF(const TDesC8 &aDes) const
+/**
+Searches this descriptor's folded data for a match with the folded match 
+pattern supplied in the specified descriptor.
+
+The match pattern can contain the wildcard characters "*" and "?", where "*" 
+matches zero or more consecutive occurrences of any character and "?" matches 
+a single occurrence of any character.
+
+Note that folding is locale-independent behaviour. It is also important to 
+note that there can be no guarantee that folding is in any way culturally 
+appropriate, and should not be used for matching strings in natural language; 
+use MatchC() for this.
+
+Note that there is no 'escape character', which means that it is not possible
+to match either the "*" character itself or the "?" character itself using
+this function.
+
+@param aDes An 8-bit non-modifable descriptor containing the match pattern. 
+
+@return If a match is found, the offset within this descriptor's data where 
+        the match first occurs. KErrNotFound, if there is no match. 
+
+@see TDesC8::MatchC()
+*/
+	{
+
+	return DoMatch8(*this,aDes,EMatchFolded);
+	}
+
+EXPORT_C TInt TDesC8::MatchC(const TDesC8 &aPattern) const
+/**
+Searches this descriptor's collated data for a match with the collated match 
+pattern supplied in the specified descriptor.
+
+The function uses the standard collation method for narrow text appropriate to 
+the current locale.
+	
+The match pattern can contain the wildcard characters "*" and "?", where "*" 
+matches zero or more consecutive occurrences of any character and "?" matches 
+a single occurrence of any character.
+
+Note that there is no 'escape character', which means that it is not possible
+to match either the "*" character itself or the "?" character itself using
+this function.
+	
+@param aPattern An 8-bit non-modifable descriptor containing the match pattern. 
+
+@return If a match is found, the offset within this descriptor's data where 
+        the match first occurs. KErrNotFound, if there is no match.
+@deprecated
+*/
+	{
+#ifndef __KERNEL_MODE__
+	return MatchF(aPattern);
+#else
+	return DoMatch8(*this,aPattern,EMatchCollated);
+#endif
+	}
+
+#ifndef __KERNEL_MODE__
+
+EXPORT_C TInt TDesC8::FindF(const TUint8 *pS,TInt aLenS) const
+/**
+Searches for the first occurrence of the specified folded data sequence within 
+this descriptor's folded data.
+
+Searching always starts at the beginning of this descriptor's data.
+
+Note that folding is locale-independent behaviour. It is also important to 
+note that there can be no guarantee that folding is in any way culturally 
+appropriate, and should not be used for finding strings in natural language; 
+use FindC() for this.
+
+@param pS    A pointer to a location containing the data sequence to be
+             searched for.
+@param aLenS The length of the data sequence to be searched for. This value 
+             must not be negative, otherwise the function raises a panic.
+             
+@return The offset of the data sequence from the beginning of this descriptor's 
+        data. KErrNotFound, if the data sequence cannot be found. Zero, if the
+        length of the search data sequence is zero.
+
+@panic USER 29 if aLenS is negative
+
+@see TDesC8::FindC()
+*/
+	{
+	if (!aLenS)
+		return(0);
+	const TUint8* table=convTable(EMatchFolded);
+	const TUint8 *pB=Ptr();
+	TInt aLenB=Length();
+	const TUint8 *pC=pB-1;			// using pre-increment addressing
+	TInt i=aLenB-aLenS;
+	if (i>=0)
+		{
+		const TUint8* pEndS=pS+aLenS-1;		// using pre-increment addressing
+		const TUint8 *pEndB=pB+i;			// using pre-increment addressing
+		TUint s=lookup(pS,table);
+		for (;;)
+			{
+			do
+				{
+				if (pC==pEndB)
+					return KErrNotFound;
+				} while (lookup(++pC,table)!=s);
+			const TUint8 *p1=pC;
+			const TUint8 *p2=pS;
+			do
+				{
+				if (p2==pEndS)
+					return (pC-pB);
+				} while (lookup(++p1,table)==lookup(++p2,table));
+			}
+		}
+	return(KErrNotFound);
+	}
+
+EXPORT_C TInt TDesC8::FindF(const TDesC8 &aDes) const
+/**
+Searches for the first occurrence of the specified folded data sequence within 
+this descriptor's folded data. 
+
+Searching always starts at the beginning of this descriptor's data.
+
+Note that folding is locale-independent behaviour. It is also important to 
+note that there can be no guarantee that folding is in any way culturally 
+appropriate, and should not be used for finding strings in natural language; 
+use FindC() for this.
+
+@param aDes The 8-bit non-modifable descriptor containing the data sequence 
+            to be searched for. 
+            
+@return The offset of the data sequence from the beginning of this descriptor's 
+        data. KErrNotFound, if the data sequence cannot be found. Zero, if the 
+        length of the search data sequence is zero.
+
+@see TDesC8::FindC()
+*/
+	{
+
+	return(FindF(aDes.Ptr(),aDes.Length()));
+	}
+
+EXPORT_C TInt TDesC8::FindC(const TUint8* aText,TInt aLength) const
+/**
+Searches for the first occurrence of the specified collated data sequence within 
+this descriptor's collated data.
+	
+Searching always starts at the beginning of this descriptor's data. The function 
+uses the standard collation method for narrow text appropriate to the current 
+locale.
+	
+@param aText   A pointer to a location containing the data sequence to be
+               searched for.
+@param aLength The length of the data sequence to be searched for.
+             
+@return The offset of the data sequence from the beginning of this descriptor's 
+        data. KErrNotFound, if the data sequence cannot be found.
+      
+@panic USER 29 if aLength is negative.
+@deprecated
+*/
+	{
+	return FindF(aText, aLength);
+	}
+
+EXPORT_C TInt TDesC8::FindC(const TDesC8 &aDes) const
+/**
+Searches for the first occurrence of the specified collated data sequence within 
+this descriptor's collated data.
+
+Searching always starts at the beginning of this descriptor's data. The function 
+uses the standard collation method for narrow text appropriate to the current 
+locale.
+
+@param aDes The 8-bit non-modifable descriptor containing the data sequence 
+            to be searched for. 
+            
+@return The offset of the data sequence from the beginning of this descriptor's 
+        data. KErrNotFound, if the data sequence cannot be found.
+@deprecated
+*/
+	{
+
+	return(FindC(aDes.Ptr(),aDes.Length()));
+	}
+
+EXPORT_C TInt TDesC8::LocateF(TChar aChar) const
+/**
+Searches for the first occurrence of a folded character within this
+descriptor's folded data.
+
+The search starts at the beginning of the data,i.e. at the leftmost position.
+
+Note that folding is locale-independent behaviour. It is also important to 
+note that there can be no guarantee that folding is in any way culturally 
+appropriate, and should not be used for searching strings in natural language.
+
+@param aChar The character to be found.
+
+@return The offset of the character position from the beginning of the data.
+        KErrNotFound, if no matching character can be found.
+*/
+	{
+	TUint c = User::Fold(aChar);
+	if(c>=0x100)
+		return KErrNotFound;
+	const TUint8 *pBuf=Ptr();
+	const TUint8 *pB=pBuf-1;
+	const TUint8 *pE=pB+Length();
+	const TUint8* table=__FoldCollTab8;
+	do
+		{
+		if (pB==pE)
+			return KErrNotFound;
+		} while (table[*++pB]!=c);
+	return pB-pBuf;
+	}
+#endif	// __KERNEL_MODE__
+
+#ifndef __DES8_MACHINE_CODED__
+EXPORT_C TInt TDesC8::Locate(TChar aChar) const
+/**
+Searches for the first occurrence of a character within this descriptor's
+data.
+
+The search starts at the beginning of the data, i.e. at the leftmost position.
+
+@param aChar The character to be found. 
+
+@return The offset of the character position from the beginning of the data.
+        KErrNotFound, if no matching character can be found.
+*/
+	{
+
+	const TUint8 *pBuf=Ptr();
+	const TUint8 *pB=pBuf-1;
+	const TUint8 *pE=pB+Length();
+	do
+		{
+		if (pB==pE)
+			return KErrNotFound;
+		} while (*++pB!=aChar);
+	return pB-pBuf;
+	}
+#endif
+
+#ifndef __DES8_MACHINE_CODED__
+EXPORT_C TInt TDesC8::LocateReverse(TChar aChar) const
+/**
+Searches for the first occurrence of a character within this descriptor's data, 
+searching from the end of the data.
+
+The search starts at the rightmost position.
+
+@param aChar The character to be found.
+
+@return The offset of the character position from the beginning of the data.
+        KErrNotFound, if no matching character can be found.
+*/
+	{
+
+	TInt len=Length();
+	if (len==0)
+		return(KErrNotFound);
+	const TUint8 *pB=Ptr();
+	const TUint8 *pE=pB+len-1;
+	while (pE>=pB)
+		{
+		if (*pE==aChar)
+			break;
+		pE--;
+		}
+	return(pE<pB ? KErrNotFound : pE-pB);
+	}
+#endif
+
+#ifndef __KERNEL_MODE__
+EXPORT_C TInt TDesC8::LocateReverseF(TChar aChar) const
+/**
+Searches for the first occurrence of a folded character within this descriptor's 
+folded data, searching from the end of the data.
+
+The search starts at the rightmost position. 
+
+Note that folding is locale-independent behaviour. It is also important to 
+note that there can be no guarantee that folding is in any way culturally 
+appropriate, and should not be used for searching strings in natural language.
+
+@param aChar The character to be found 
+
+@return The offset of the character position from the beginning of the data.
+        KErrNotFound, if no matching character can be found
+*/
+	{
+
+	TInt len=Length();
+	if (len==0)
+		return(KErrNotFound);
+	const TUint8 *pB=Ptr();
+	const TUint8 *pE=pB+len-1;
+	const TUint8* table=__FoldCollTab8;
+	TUint c = table[aChar];
+	while (pE>=pB)
+		{
+		if (table[*pE]==c)
+			break;
+		pE--;
+		}
+	return(pE<pB ? KErrNotFound : pE-pB);
+	}
+
+EXPORT_C HBufC8 *TDesC8::Alloc() const
+/**
+Creates a new 8-bit heap descriptor and initialises it with a copy of this 
+descriptor's data.
+
+@return A pointer to the new 8 bit heap descriptor, if creation is successful. 
+        NULL, if creation of the descriptor fails.
+*/
+	{
+
+	HBufC8 *pH=HBufC8::New(Length());
+	if (pH)
+		*pH=(*this);
+	return(pH);
+	}
+
+EXPORT_C HBufC8 *TDesC8::AllocL() const
+/**
+Creates a new 8-bit heap descriptor and initialises it with a copy of this 
+descriptor's data.
+
+The function leaves, if creation of the descriptor fails.
+
+@return A pointer to the 8-bit heap descriptor, if creation is successful.
+*/
+	{
+
+	HBufC8 *pH=HBufC8::NewL(Length());
+	*pH=(*this);
+	return(pH);
+	}
+
+EXPORT_C HBufC8 *TDesC8::AllocLC() const
+/**
+Creates a new 8-bit heap descriptor, initialises it with a copy of this 
+descriptor's data, and puts a pointer to the descriptor onto the cleanup stack.
+
+The function leaves, if creation of the descriptor fails.
+
+@return A pointer to the 8 bit heap descriptor, if creation is successful. 
+        The pointer is also put onto the cleanup stack.
+*/
+	{
+
+	HBufC8 *pH=HBufC8::NewLC(Length());
+	*pH=(*this);
+	return(pH);
+	}
+#endif	// __KERNEL_MODE__
+
+#if !defined(__DES8_MACHINE_CODED__)
+
+EXPORT_C TPtrC8 TDesC8::Left(TInt aLength) const
+/**
+Extracts the leftmost part of the data. 
+
+The function does not cut or remove any data but constructs a non-modifiable 
+pointer descriptor to represent the leftmost part of the data.
+
+@param aLength The length of the data to be extracted. If this value
+               is greater than the length of the descriptor, the function
+               extracts the whole of the descriptor.
+
+@return The 8-bit non-modifiable pointer descriptor representing the leftmost 
+        part of the data.
+
+@panic USER 22 if aLength is negative. 
+*/
+	{
+
+	__ASSERT_ALWAYS(aLength>=0,Panic(ETDes8PosOutOfRange));
+	return(TPtrC8(Ptr(),Min(aLength,Length())));
+	}
+
+EXPORT_C TPtrC8 TDesC8::Right(TInt aLength) const
+/**
+Extracts the rightmost part of the data.
+
+The function does not cut or remove any data but constructs a non-modifiable 
+pointer descriptor to represent the rightmost part of the data.
+
+@param aLength The length of data to be extracted. If this value
+               is greater than the length of the descriptor, the function 
+               extracts the whole of the descriptor. 
+               
+@return The 8 bit non-modifiable pointer descriptor representing the rightmost 
+        part of the data.
+
+@panic USER 22 if aLength is negative. 
+*/
+	{
+
+	__ASSERT_ALWAYS(aLength>=0,Panic(ETDes8PosOutOfRange));
+	TInt len=Length();
+	if (aLength>len)
+		aLength=len;
+    return(TPtrC8(Ptr()+len-aLength,aLength));
+	}
+
+EXPORT_C TPtrC8 TDesC8::Mid(TInt aPos) const
+/**
+Extracts a portion of the data.
+
+The function does not cut or remove any data but constructs a non-modifiable 
+pointer descriptor to represent the defined portion.
+
+The portion is identified by its starting position and by the length of the 
+remainder of the data starting from the specified position.
+
+@param aPos The starting position of the data to be extracted. This is an 
+            offset value; a zero value refers to the leftmost data position. 
+            
+@return The 8-bit non-modifiable pointer descriptor representing the specified 
+        portion of the data.
+        
+@panic USER 22  if aPos is negative or aPos is greater than the
+                length of the descriptor.       
+*/
+	{
+
+	TInt len=Length();
+	__ASSERT_ALWAYS(aPos>=0 && aPos<=len,Panic(ETDes8PosOutOfRange));
+    return(TPtrC8(Ptr()+aPos,len-aPos));
+	}
+
+EXPORT_C TPtrC8 TDesC8::Mid(TInt aPos,TInt aLength) const
+/**
+Extracts a portion of the data.
+
+The function does not cut or remove any data but constructs a non-modifiable 
+pointer descriptor to represent the defined portion.
+
+The portion is identified by its starting position and by its length.
+
+@param aPos    The starting position of the data to be extracted. This is an 
+               offset value; a zero value refers to the leftmost data position. 
+@param aLength The length of data to be extracted.
+
+@return The 8 bit non-modifiable pointer descriptor representing the specified 
+        portion of the data.
+
+@panic USER 22  if aPos is negative or aPos plus aLength is greater than the
+                length of the descriptor.
+*/
+	{
+
+	__ASSERT_ALWAYS(aPos>=0 && (aPos+aLength)<=Length(),Panic(ETDes8PosOutOfRange));
+    return(TPtrC8(Ptr()+aPos,aLength));
+	}
+
+#endif  // !defined(__DES8_MACHINE_CODED__)
+
+#if !defined( __DES8_MACHINE_CODED__) | defined(__EABI_CTORS__)
+EXPORT_C TBufCBase8::TBufCBase8()
+//
+// Constructor
+//
+	: TDesC8(EBufC,0)
+	{}
+
+EXPORT_C TBufCBase8::TBufCBase8(const TUint8 *aString,TInt aMaxLength)
+//
+// Constructor
+//
+	: TDesC8(EBufC,0)
+	{
+	Copy(aString,aMaxLength);
+	}
+
+EXPORT_C TBufCBase8::TBufCBase8(const TDesC8 &aDes,TInt aMaxLength)
+//
+// Constructor
+//
+	: TDesC8(EBufC,0)
+	{
+	Copy(aDes,aMaxLength);
+	}
+#endif 
+
+#ifndef __DES8_MACHINE_CODED__
+EXPORT_C void TBufCBase8::Copy(const TUint8 *aString,TInt aMaxLength)
+//
+// Copy from a string.
+//
+	{
+
+	TInt len=STRING_LENGTH(aString);
+	__ASSERT_ALWAYS(len<=aMaxLength,Panic(ETDes8Overflow));
+	memmove(WPtr(), aString, len);
+	DoSetLength(len);
+	}
+
+EXPORT_C void TBufCBase8::Copy(const TDesC8 &aDes,TInt aMaxLength)
+//
+// Copy from a descriptor.
+//
+	{
+
+	TInt len=aDes.Length();
+	__ASSERT_ALWAYS(len<=aMaxLength,Panic(ETDes8Overflow));
+	memmove(WPtr(), aDes.Ptr(), len);
+	DoSetLength(len);
+	}
+#endif
+
+#ifndef __KERNEL_MODE__
+inline HBufC8::HBufC8(TInt aLength)
+	:TBufCBase8(aLength)
+	{}
+
+EXPORT_C HBufC8 *HBufC8::New(TInt aMaxLength)
+/**
+Creates, and returns a pointer to, a new 8-bit heap descriptor.
+
+The heap descriptor is empty and its length is zero.
+
+Data can, subsequently, be assigned into it using the assignment operators.
+
+@param aMaxLength The requested maximum length of the descriptor. Note that 
+                  the resulting heap cell size and, therefore, the resulting
+                  maximum length of the descriptor may be larger
+                  than requested.
+
+@return A pointer to the new 8-bit heap descriptor. NULL, if the 8-bit heap 
+        descriptor cannot be created.
+
+@panic USER 30 if aMaxLength is negative.
+
+@see HBufC8::operator=()
+*/
+	{
+	__ASSERT_ALWAYS(aMaxLength>=0,Panic(ETDes8MaxLengthNegative));
+	return new(STD_CLASS::Alloc(_FOFF(HBufC8,iBuf[aMaxLength]))) HBufC8(0);
+	}
+
+EXPORT_C HBufC8 *HBufC8::NewL(TInt aMaxLength)
+/** 
+Creates, and returns a pointer to, a new 8-bit heap descriptor, and leaves 
+on failure.
+
+The heap descriptor is empty and its length is zero.
+
+Data can, subsequently, be assigned into it using the assignment operators.
+
+@param aMaxLength The requested maximum length of the descriptor. Note that 
+                  the resulting heap cell size and, therefore, the resulting
+                  maximum length of the descriptor may be larger
+                  than requested.
+
+@return A pointer to the new 8 bit heap descriptor. The function leaves, if 
+        the new 8-bit heap descriptor cannot be created.
+
+@panic USER 30 if aMaxLength is negative.
+
+@see HBufC8::operator=()
+*/
+	{
+	return static_cast<HBufC8*>(User::LeaveIfNull(New(aMaxLength)));
+	}
+
+EXPORT_C HBufC8 *HBufC8::NewLC(TInt aMaxLength)
+/**
+Creates, adds a pointer onto the cleanup stack, and returns a pointer to, a 
+new 8 bit heap descriptor; leaves on failure.
+
+The heap descriptor is empty and its length is zero.
+
+Data can, subsequently, be assigned into it using the assignment operators.
+
+@param aMaxLength The requested maximum length of the descriptor. Note that 
+                  the resulting heap cell size and, therefore, the resulting
+                  maximum length of the descriptor may be larger
+                  than requested.
+                  
+@return A pointer to the new 8-bit heap descriptor. The function leaves, if 
+        the new 8-bit heap descriptor cannot be created.
+
+@panic USER 30 if aMaxLength is negative.
+
+@see HBufC8::operator=()
+*/
+	{
+	HBufC8* buf=NewL(aMaxLength);
+	CleanupStack::PushL(buf);
+	return buf;
+	}
+
+EXPORT_C HBufC8 *HBufC8::NewMax(TInt aMaxLength)
+/**
+Creates, and returns a pointer to, a new 8-bit heap descriptor.
+
+No data is assigned into the new descriptor but its length
+is set to aMaxLength.
+
+Data can, subsequently, be assigned into it using the assignment operators.
+
+@param aMaxLength The requested maximum length of the descriptor. Note that 
+                  the resulting heap cell size and, therefore, the resulting
+                  maximum length of the descriptor may be larger
+                  than requested. This also means that the resulting maximum
+                  length of the descriptor may be greater than its length.
+
+@return A pointer to the new 8-bit heap descriptor. NULL, if the new 8-bit 
+        heap descriptor cannot be created.
+
+@panic USER 30 if aMaxLength is negative.
+
+@see HBufC8::operator=()
+*/
+	{
+	__ASSERT_ALWAYS(aMaxLength>=0,Panic(ETDes8MaxLengthNegative));
+	return new(STD_CLASS::Alloc(_FOFF(HBufC8,iBuf[aMaxLength]))) HBufC8(aMaxLength);
+	}
+
+EXPORT_C HBufC8 *HBufC8::NewMaxL(TInt aMaxLength)
+/**
+Creates, and returns a pointer to, a new 8-bit heap descriptor;
+leaves on failure.
+
+No data is assigned into the new descriptor but its length
+is set to aMaxLength.
+
+Data can, subsequently, be assigned into it using the assignment operators.
+
+@param aMaxLength The requested maximum length of the descriptor. Note that 
+                  the resulting heap cell size and, therefore, the resulting
+                  maximum length of the descriptor may be larger
+                  than requested. This also means that the resulting maximum
+                  length of the descriptor may be greater than its length.
+                  
+@return A pointer to the new 8-bit heap descriptor. The function leaves, if 
+        the new 8-bit heap descriptor cannot be created.
+
+@panic USER 30 if aMaxLength is negative.
+
+@see HBufC8::operator=()
+*/
+	{
+	return static_cast<HBufC8*>(User::LeaveIfNull(NewMax(aMaxLength)));
+	}
+
+EXPORT_C HBufC8 *HBufC8::NewMaxLC(TInt aMaxLength)
+/**
+Creates, adds a pointer onto the cleanup stack and returns a pointer to, a 
+new 8-bit heap descriptor; leaves on failure.
+
+No data is assigned into the new descriptor but its length
+is set to aMaxLength.
+
+Data can, subsequently, be assigned into it using the assignment operators.
+
+@param aMaxLength The requested maximum length of the descriptor. Note that 
+                  the resulting heap cell size and, therefore, the resulting
+                  maximum length of the descriptor may be larger than requested.
+                  This also means that the resulting maximum
+                  length of the descriptor may be greater than its length.
+                  
+@return A pointer to the new 8-bit heap descriptor. This is also put onto the 
+        cleanup stack. The function leaves, if the new 8-bit heap descriptor
+        cannot be created.
+
+@panic USER 30 if aMaxLength is negative.
+
+@see HBufC8::operator=()
+*/
+	{
+	HBufC8* buf=NewMaxL(aMaxLength);
+	CleanupStack::PushL(buf);
+	return buf;
+	}
+
+EXPORT_C HBufC8 &HBufC8::operator=(const TUint8 *aString)
+/**
+Copies data into this 8-bit heap descriptor replacing any existing data.
+
+The length of this descriptor is set to reflect the new data.
+
+Note that the maximum length of this (target) descriptor is the length
+of the descriptor buffer in the allocated host heap cell; this may be greater
+than the maximum length specified when this descriptor was created or
+last re-allocated.
+
+@param aString A pointer to a zero-terminated string. 
+                 
+@return A reference to this 8 bit heap descriptor.
+
+@panic USER 23  if the length of the string, excluding the zero terminator,
+                is greater than the maximum length of this (target) descriptor,
+*/
+	{
+
+	Copy(aString,(STD_CLASS::AllocLen(this)-sizeof(TDesC8))/sizeof(TUint8));
+	return(*this);
+	}
+
+EXPORT_C HBufC8 &HBufC8::operator=(const TDesC8 &aDes)
+/**
+Copies data into this 8-bit heap descriptor replacing any existing data.
+
+The length of this descriptor is set to reflect the new data.
+
+Note that the maximum length of this (target) descriptor is the length
+of the descriptor buffer in the allocated host heap cell; this may be greater
+than the maximum length specified when this descriptor was created or last
+re-allocated.
+
+@param aDes An 8-bit non-modifiable descriptor.
+            
+@return A reference to this 8-bit heap descriptor.
+
+@panic USER 23  if the length of the descriptor aDes is greater than the
+                maximum length of this (target) descriptor
+*/
+	{
+
+	Copy(aDes,(STD_CLASS::AllocLen(this)-sizeof(TDesC8))/sizeof(TUint8));
+	return(*this);
+	}
+
+EXPORT_C HBufC8 *HBufC8::ReAlloc(TInt aMaxLength)
+/**
+Expands or contracts the heap descriptor.
+
+This is done by:
+
+1. creating a new heap descriptor.
+
+2. copying the original data into the new descriptor.
+
+3. deleting the original descriptor.
+
+@param aMaxLength The new requested maximum length of the descriptor. 
+                  Note that the resulting heap cell size and, therefore,
+                  the resulting maximum length of the descriptor may be
+                  larger than requested.
+
+@return A pointer to the new expanded or contracted 8 bit heap descriptor -  
+        the original descriptor is deleted. NULL, if the new 8-bit heap descriptor 
+        cannot be created - the original descriptor remains unchanged
+
+@panic USER 26  if aMaxLength is less than the length of the existing data.
+@panic USER 30  if aMaxLength is negative.
+*/
+	{
+
+	__ASSERT_ALWAYS(aMaxLength>=0,Panic(ETDes8MaxLengthNegative));
+	__ASSERT_ALWAYS(Length()<=aMaxLength,Panic(ETDes8ReAllocTooSmall));
+	return((HBufC8 *)STD_CLASS::ReAlloc(this,(aMaxLength*sizeof(TUint8))+sizeof(TDesC8)));
+	}
+
+EXPORT_C HBufC8 *HBufC8::ReAllocL(TInt aMaxLength)
+/**
+Expands or contracts the descriptor; leaves on failure.
+
+This is done by:
+
+1. creating a new heap descriptor.
+
+2. copying the original data into the new descriptor.
+
+3. deleting the original descriptor.
+
+@param aMaxLength The new requested maximum length of the descriptor. 
+                  Note that the resulting heap cell size and, therefore,
+                  the resulting maximum length of the descriptor may be
+                  larger than requested.
+
+@return A pointer to the new expanded or contracted 8 bit heap descriptor -  
+        the original descriptor is deleted. NULL, if the new 8-bit heap descriptor 
+        cannot be created - the original descriptor remains unchanged
+
+@panic USER 26  if aMaxLength is less than the length of the existing data.
+@panic USER 30  if aMaxLength is negative.
+*/
+	{
+
+	__ASSERT_ALWAYS(aMaxLength>=0,Panic(ETDes8MaxLengthNegative));
+	__ASSERT_ALWAYS(Length()<=aMaxLength,Panic(ETDes8ReAllocTooSmall));
+	return((HBufC8 *)STD_CLASS::ReAllocL(this,(aMaxLength*sizeof(TUint8))+sizeof(TDesC8)));
+	}
+
+EXPORT_C TPtr8 HBufC8::Des()
+/**
+Creates and returns an 8-bit modifiable pointer descriptor for the data
+represented by this 8-bit heap descriptor.
+
+The content of a heap descriptor normally cannot be altered, other than by 
+complete replacement of the data. Creating a modifiable pointer descriptor 
+provides a way of changing the data.
+
+The modifiable pointer descriptor is set to point to this heap descriptor's 
+data.
+
+The length of the modifiable pointer descriptor is set to the length of this 
+heap descriptor.
+
+The maximum length of the modifiable pointer descriptor is set to the length 
+of the heap descriptor's buffer. Note that the maximum length is the length 
+of the descriptor buffer in the allocated host heap cell; this may be greater 
+than the maximum length requested when this descriptor was originally created 
+or last re-allocated.
+
+When data is modified through this new pointer descriptor, the lengths of 
+both it and this heap descriptor are changed.
+
+Note that it is a common mistake to use Des() to create a TDesC8& reference. 
+While not incorrect, it is simpler and much more efficient to simply dereference 
+the heap descriptor.
+
+@return An 8-bit modifiable pointer descriptor representing the data in this 
+        8-bit heap descriptor.
+*/
+	{
+	return DoDes((STD_CLASS::AllocLen(this)-sizeof(TDesC8))/sizeof(TUint8));
+	}
+#endif	// __KERNEL_MODE__
+
+#ifndef __DES8_MACHINE_CODED__
+EXPORT_C void TDes8::SetLength(TInt aLength)
+/**
+Sets the length of the data represented by the descriptor to the
+specified value.
+
+@param aLength The new length of the descriptor.
+
+@panic USER 23  if alength is negative or is greater than the maximum length of
+                this (target) descriptor.
+*/
+	{
+
+	__ASSERT_ALWAYS(TUint(aLength)<=TUint(MaxLength()),Panic(ETDes8Overflow));
+	DoSetLength(aLength);
+	if (Type()==EBufCPtr)
+		((SBufCPtr8 *)this)->ptr->length=aLength; // Relies on iType==0 for an TBufC
+  	}
+
+EXPORT_C void TDes8::SetMax()
+/**
+Sets the length of the data to the maximum length of the descriptor.
+*/
+	{
+
+	SetLength(iMaxLength);
+	}
+
+EXPORT_C void TDes8::Copy(const TUint8 *aString)
+/**
+Copies data into this descriptor replacing any existing data.
+
+The length of this descriptor is set to reflect the new data.
+
+@param aString A pointer to a zero-terminated string.
+               
+@panic USER 23  if the length of aString, excluding the zero terminator, is
+                greater than the maximum length of this (target) descriptor.
+*/
+	{
+
+	TInt len=STRING_LENGTH(aString);
+	SetLength(len);
+    memmove(WPtr(), aString, len);
+	}
+
+EXPORT_C void TDes8::Copy(const TUint8 *aBuf,TInt aLength)
+/**
+Copies data into this descriptor replacing any existing data.
+
+The length of this descriptor is set to reflect the new data.
+
+@param aBuf    The start address of data to be copied.
+@param aLength The length of data to be copied.
+
+@panic USER 23  if aLength is greater than the maximum length of
+                this (target) descriptor.
+*/
+	{
+
+	SetLength(aLength);
+    memmove(WPtr(), aBuf, aLength);
+	}
+
+EXPORT_C void TDes8::Copy(const TDesC8 &aDes)
+/**
+Copies data into this descriptor replacing any existing data.
+
+The length of this descriptor is set to reflect the new data.
+
+@param aDes An 8-bit non-modifiable descriptor. The length of the data cannot 
+            be greater than the maximum length of the target descriptor.
+
+@panic USER 23  if the length of aDes is greater than the maximum length of
+                this (target) descriptor.
+*/
+	{
+
+	TInt len=aDes.Length();
+	SetLength(len);
+    memmove(WPtr(), aDes.Ptr(), len);
+	}
+#endif
+
+#ifndef __KERNEL_MODE__
+EXPORT_C void TDes8::Copy(const TDesC16 &aDes)
+/**
+Copies data into this descriptor replacing any existing data.
+
+The length of this descriptor is set to reflect the new data.
+
+@param aDes A 16-bit non-modifiable descriptor. Each double-byte value can 
+            only be copied into the corresponding single byte when the
+            double-byte value is less than decimal 256. A double-byte value of
+            256 or greater cannot be  copied and the corresponding single byte
+            is set to a value of decimal 1.
+            
+@panic USER 23  if the length of the aDes is greater than the maximum length
+                of this (target) descriptor.
+*/
+	{
+
+	TInt len=aDes.Length();
+	SetLength(len);
+	const TUint16 *pS=aDes.Ptr();
+	const TUint16 *pE=pS+len;
+	TUint8 *pT=WPtr();
+	while (pS<pE)
+		{
+		TUint c=(*pS++);
+		if (c>=0x100)
+			c=1;
+		*pT++=(TUint8)c;
+		}
+	}
+#endif
+
+#ifndef __DES8_MACHINE_CODED__
+EXPORT_C void TDes8::Append(TChar aChar)
+/**
+Appends a character onto the end of this descriptor's data.
+
+The length of this descriptor is incremented to reflect the new content.
+
+@param aChar The single character to be appended. The length of the descriptor 
+             is incremented by one. The function assumes that the character
+             is non-Unicode and that it can be represented by a single byte.
+
+@panic USER 23  if the resulting new length of this descriptor is greater than
+                its maximum length.
+*/
+	{
+
+	TInt len=Length();
+	TUint8 *pB=WPtr()+len;
+	SetLength(len+1);
+	*pB++=(TUint8)aChar;
+	}
+
+EXPORT_C void TDes8::Append(const TUint8 *aBuf,TInt aLength)
+/**
+Appends data onto the end of this descriptor's data.
+
+The length of this descriptor is incremented to reflect the new content.
+
+@param aBuf    A pointer to the data to be copied.
+@param aLength The length of the data to be copied.
+
+@panic USER 23  if the resulting new length of this descriptor is greater than
+                its maximum length.
+@panic USER 29  if aLength is negative.
+*/
+	{
+
+	__ASSERT_ALWAYS(aLength>=0,Panic(ETDes8LengthNegative));
+	TInt len=Length();
+	SetLength(len+aLength);
+    memmove(WPtr()+len, aBuf, aLength);
+	}
+
+EXPORT_C void TDes8::Append(const TDesC8 &aDes)
+/**
+Appends data onto the end of this descriptor's data.
+
+The length of this descriptor is incremented to reflect the new content.
+
+@param aDes An 8-bit non-modifiable descriptor whose data is to be appended.
+
+@panic USER 23  if the resulting new length of this descriptor is greater than
+                its maximum length.
+*/
+	{
+
+	TInt len=Length();
+    TInt n=aDes.Length();
+	SetLength(len+n);
+    memmove(WPtr()+len, aDes.Ptr(), n);
+	}
+#endif
+
+#ifndef __KERNEL_MODE__
+EXPORT_C void TDes8::Append(const TDesC16 &aDes)
+/**
+Appends data onto the end of this descriptor's data.
+
+The length of this descriptor is incremented to reflect the new content.
+
+@param aDes A 16-bit non-modifiable descriptor whose data is to be appended. 
+            Each double-byte value can only be appended as a single byte when
+            the double-byte value is less than decimal 256. A double-byte value
+            of 256 or greater cannot be appended and the corresponding single
+            byte is set to a value of decimal 1.
+
+@panic USER 23  if the resulting new length of this descriptor is greater than
+                its maximum length.
+*/
+	{
+
+	TInt len=Length();
+	TInt n=aDes.Length();
+	const TUint16* pS=aDes.Ptr();
+	const TUint16* pE=pS+n;
+	TUint8 *pT=WPtr()+len;
+	SetLength(len+n);
+	while (pS<pE)
+		{
+		TUint c=(*pS++);
+		if (c>=0x100)
+			c=1;
+		*pT++=(TUint8)c;
+		}
+	}
+#endif
+
+#ifndef __KERNEL_MODE__
+EXPORT_C void TDes8::Swap(TDes8 &aDes)
+/**
+Swaps the data represented by this descriptor with the data represented by 
+the specified descriptor.
+
+The lengths of both descriptors are swapped to reflect the change.
+
+Note that each descriptor must be capable of accommodating the contents of
+the other descriptor.
+
+@param aDes The 8-bit modifiable descriptor whose data is to be swapped with 
+            the data of this descriptor.
+            
+@panic USER 23  if the maximum length of either descriptor is smaller than the 
+                length of the other descriptor.
+*/
+	{
+
+	TInt l=Length();
+	TInt r=aDes.Length();
+	aDes.SetLength(l);
+	SetLength(r);
+	TInt s=Min(l,r);
+	l-=s;
+	r-=s;
+	TUint8 *pL=WPtr();
+	TUint8 *pR=aDes.WPtr();
+	while (s--)
+		{
+		TChar a=(*pL);
+		*pL++=(*pR);
+		*pR++=(TUint8)a;
+		}
+	while (l--)
+		*pR++=(*pL++);
+	while (r--)
+		*pL++=(*pR++);
+	}
+#endif
+
+#ifndef __DES8_MACHINE_CODED__
+EXPORT_C void TDes8::Fill(TChar aChar)
+/**
+Fills the descriptor's data area with the specified character, replacing any 
+existing data.
+
+The descriptor is filled from the beginning up to its current length. The 
+descriptor's length does not change. It is not filled to its maximum length.
+
+@param aChar The fill character. The function assumes that the character is 
+             non-Unicode, and that it can be represented by a single byte.
+*/
+	{
+
+    memset(WPtr(), (TInt)(aChar.operator TUint()), Length());
+	}
+#endif
+
+EXPORT_C void TDes8::Fill(TChar aChar,TInt aLength)
+/**
+Fills the descriptor's data area with the specified character, replacing any 
+existing data.
+
+The descriptor is filled with the specified number of characters.
+and its length is changed to reflect this.
+
+@param aChar   The fill character. The function assumes that the character is 
+               non-Unicode, and that it can be represented by a single byte. 
+@param aLength The new length of the descriptor and the number of fill
+               characters to be copied into it.
+               
+@panic USER 23  if aLength is negative or is greater than the maximum length
+                of this descriptor.
+*/
+	{
+
+	SetLength(aLength);
+    memset(WPtr(), (TInt)(aChar.operator TUint()), aLength);
+	}
+
+#ifndef __KERNEL_MODE__
+EXPORT_C void TDes8::AppendFill(TChar aChar,TInt aLength)
+/**
+Appends and fills this descriptor with the specified character.
+
+The descriptor is appended with the specified number of characters.
+and its length is changed to reflect this.
+
+@param aChar   The fill character. The function assumes that the character
+               is non-Unicode and that it can be represented by a single byte.
+@param aLength The number of fill characters to be appended.
+
+@panic USER 23  if aLength is negative, or the resulting length of this
+                descriptor is greater than its maximum length.
+*/
+	{
+
+	TInt len=Length();
+	SetLength(len+aLength);
+    memset(WPtr()+len, (TInt)(aChar.operator TUint()), aLength);
+	}
+#endif
+
+#ifndef __DES8_MACHINE_CODED__
+#ifndef __KERNEL_MODE__
+EXPORT_C void TDes8::ZeroTerminate()
+/**
+Appends a zero terminator onto the end of this descriptor's data.
+
+The length of the descriptor is not changed. It must, however, be strictly
+less than the descriptor's maximum length. 
+This condition guarantees that there is sufficient space for the
+zero terminator.
+
+@panic USER 23  if the descriptor's length is not strictly less than its
+                maximum length.
+*/
+	{
+
+	TInt len=Length();
+	__ASSERT_ALWAYS(len<MaxLength(),Panic(ETDes8Overflow));
+	WPtr()[len]=0;
+	}
+
+EXPORT_C const TUint8 *TDes8::PtrZ()
+/**
+Appends a zero terminator onto the end of this descriptor's data and returns 
+a pointer to the data.
+
+The length of the descriptor is not changed. It must, however, be strictly
+less than the descriptor's maximum length.
+This condition guarantees that there is sufficient space for the
+zero terminator.
+
+@return A pointer to the descriptor's zero terminated data.
+
+@panic USER 23  if the descriptor's length is not strictly less than its
+                maximum length.
+*/
+	{
+
+	ZeroTerminate();
+	return(Ptr());
+	}
+#endif
+
+EXPORT_C void TDes8::Zero()
+/**
+Sets the length of the data to zero.
+*/
+	{
+
+	SetLength(0);
+	}
+
+EXPORT_C void TDes8::FillZ()
+/**
+Fills the descriptor's data area with binary zeroes, i.e. 0x00, replacing any 
+existing data.
+
+The descriptor is filled from the beginning up to its current length. The 
+descriptor's length does not change. It is not filled to its maximum length.
+*/
+	{
+
+    memclr(WPtr(), Length());
+	}
+#endif
+
+EXPORT_C void TDes8::FillZ(TInt aLength)
+/**
+Fills the descriptor's data area with binary zeroes, i.e. 0x00, replacing any 
+existing data, and changes its length.
+
+The descriptor is filled with the specified number of binary zeroes.
+The descriptor's length is changed to reflect this.
+
+@param aLength The new length of the descriptor and the number of binary zeroes
+               to be copied into it. 
+               
+@panic USER 23  if aLength is negative, or is greater than the maximum length
+                of this descriptor.
+*/
+	{
+
+	SetLength(aLength);
+    memclr(WPtr(), aLength);
+	}
+
+#ifndef __KERNEL_MODE__
+EXPORT_C void TDes8::Fold()
+/**
+Performs folding on the content of this descriptor.
+
+Note that folding is locale-independent behaviour. It is also important to 
+note that there can be no guarantee that folding is in any way culturally 
+appropriate, and should not be used when dealing with strings in natural
+language.
+*/
+	{
+
+	TUint8 *pB=WPtr();
+	TInt len=Length();
+	const TUint8* table=__FoldCollTab8;
+	while (len--)
+		{
+		*pB++=table[*pB];
+		}
+	}
+
+EXPORT_C void TDes8::Collate()
+/**
+Performs collation on the content of this descriptor.
+@deprecated
+*/
+	{
+
+	TUint8 *pB=WPtr();
+	TInt len=Length();
+	while (len--)
+		{
+		TChar c=User::Collate(*pB);
+		*pB++=(TUint8)c;
+		}
+	}
+
+EXPORT_C void TDes8::LowerCase()
+/**
+Converts the content of this descriptor to lower case.
+
+Conversion is implemented as appropriate to the current locale.
+*/
+	{
+
+	TUint8 *pB=WPtr();
+	TInt len=Length();
+	while (len--)
+		{
+		TCharLC c(*pB);
+		*pB++=(TUint8)c;
+		}
+	}
+
+EXPORT_C void TDes8::UpperCase()
+/**
+Converts the content of this descriptor to upper case.
+
+Conversion is implemented as appropriate to the current locale.
+*/
+	{
+
+	TUint8 *pB=WPtr();
+	TInt len=Length();
+	while (len--)
+		{
+		TCharUC c(*pB);
+		*pB++=(TUint8)c;
+		}
+	}
+
+EXPORT_C void TDes8::Capitalize()
+/**
+Capitalises the content of this descriptor.
+
+Capitalisation is implemented as appropriate to the current locale.
+*/
+	{
+
+	TUint8 *pB=WPtr();
+	TInt len=Length();
+	if (len--)
+		{
+		*pB=(TUint8)User::TitleCase(*pB);
+		++pB;
+		while (len--)
+			{
+			*pB=(TUint8)User::LowerCase(*pB);
+			++pB;
+			}
+		}
+	}
+
+EXPORT_C void TDes8::CopyF(const TDesC8 &aDes)
+/**
+Copies and folds data from the specified descriptor into this descriptor
+replacing any existing data.
+
+The length of this descriptor is set to reflect the new 
+data.
+
+Note that folding is locale-independent behaviour. It is also important to 
+note that there can be no guarantee that folding is in any way culturally 
+appropriate, and should not be used when dealing with strings in natural
+language.
+
+@param aDes An 8-bit non-modifiable descriptor.
+
+@panic USER 23  if the length of aDes is greater than the maximum length of
+                this target descriptor.
+*/
+	{
+
+	TInt len=aDes.Length();
+	SetLength(len);
+	const TUint8 *pS=aDes.Ptr();
+	TUint8 *pT=WPtr();
+	const TUint8* table=__FoldCollTab8;
+	while (len--)
+		{
+		*pT++=table[*pS++];
+		}
+	}
+
+EXPORT_C void TDes8::CopyC(const TDesC8 &aDes)
+/**
+Copies and collates data from the specified descriptor 
+into this descriptor replacing any existing data.
+
+The length of this descriptor is set to reflect the new data.
+
+@param aDes An 8 bit non-modifiable descriptor.
+
+@panic USER 23  if the length of aDes is greater than the maximum length of
+                this target descriptor.
+@deprecated
+*/
+	{
+
+	TInt len=aDes.Length();
+	SetLength(len);
+	const TUint8 *pS=aDes.Ptr();
+	TUint8 *pT=WPtr();
+	while (len--)
+		{
+		TChar c=User::Collate(*pS++);
+		*pT++=(TUint8)c;
+		}
+	}
+
+EXPORT_C void TDes8::CopyLC(const TDesC8 &aDes)
+/**
+Copies text from the specified descriptor and converts it to lower case before 
+putting it into this descriptor, replacing any existing data.
+
+The length of this descriptor is set to reflect the new data.
+
+Conversion to lower case is implemented as appropriate to the current locale.
+
+@param aDes An 8-bit non-modifiable descriptor.
+
+@panic USER 23  if the length of aDes is greater than the maximum length of
+                this target descriptor.
+*/
+	{
+
+	TInt len=aDes.Length();
+	SetLength(len);
+	const TUint8 *pS=aDes.Ptr();
+	TUint8 *pT=WPtr();
+	while (len--)
+		{
+		TCharLC c(*pS++);
+		*pT++=(TUint8)c;
+		}
+	}
+
+EXPORT_C void TDes8::CopyUC(const TDesC8 &aDes)
+/**
+Copies text from the specified descriptor and converts it to upper case before 
+putting it into this descriptor, replacing any existing data.
+
+The length of this descriptor is set to reflect the new data.
+
+Conversion to upper case is implemented as appropriate to the current locale.
+
+@param aDes An 8-bit non-modifiable descriptor.
+
+@panic USER 23  if the length of aDes is greater than the maximum length of
+                this target descriptor.
+*/
+	{
+
+	TInt len=aDes.Length();
+	SetLength(len);
+	const TUint8 *pS=aDes.Ptr();
+	TUint8 *pT=WPtr();
+	while (len--)
+		{
+		TCharUC c(*pS++);
+		*pT++=(TUint8)c;
+		}
+	}
+
+EXPORT_C void TDes8::CopyCP(const TDesC8 &aDes)
+/**
+Copies text from the specified descriptor and capitalises it before putting 
+it into this descriptor, replacing any existing data.
+
+The length of this descriptor is set to reflect the new data.
+
+Capitalisation is implemented as appropriate to the current locale.
+
+@param aDes An 8-bit non-modifiable descriptor.
+
+@panic USER 23  if the length of aDes is greater than the maximum length of
+                this target descriptor.
+*/
+	{
+
+	TInt len=aDes.Length();
+	SetLength(len);
+	const TUint8 *pS=aDes.Ptr();
+	TUint8 *pT=WPtr();
+	if (len--)
+		{
+		TChar c(*pS++);
+#ifdef _UNICODE
+		c.TitleCase();
+#else
+		c.UpperCase();
+#endif
+		*pT++=(TUint8)c;
+		while (len--)
+			{
+			TCharLC c=(*pS++);
+			*pT++=(TUint8)c;
+			}
+		}
+	}
+
+EXPORT_C void TDes8::Repeat(const TUint8 *aBuf,TInt aLength)
+/**
+Copies data with repetition into this descriptor, from a memory location
+specified by pointer, replacing any existing data.
+
+Copying proceeds until this descriptor is filled up to its current length. 
+If it cannot contain a whole number of copies of the source data, then the 
+last copy is truncated.
+
+@param aBuf    A pointer to data to be repeatedly copied. 
+@param aLength The length of data to be copied.
+
+@panic USER 29  if aLength is negative.
+*/
+	{
+
+	__ASSERT_ALWAYS(aLength>=0,Panic(ETDes8LengthNegative));
+	TUint8 *pB=WPtr();
+	TInt len=Length();
+	if (len && aLength)
+		{
+		while (len)
+			{
+			TInt i=Min(len,aLength);
+			pB=memCopy(pB,aBuf,i);
+			len-=i;
+			}
+		}
+	}
+
+EXPORT_C void TDes8::Repeat(const TDesC8 &aDes)
+/**
+Copies data with repetition into this descriptor, from another descriptor,
+replacing any existing data.
+
+Copying proceeds until this descriptor is filled up to its current length. 
+If it cannot contain a whole number of copies of the source data, then the 
+last copy is truncated.
+
+@param aDes An 8-bit non-modifiable descriptor whose data is to be repeatedly 
+            copied.
+*/
+	{
+
+	Repeat(aDes.Ptr(),aDes.Length());
+	}
+
+EXPORT_C void TDes8::Trim()
+/**
+Deletes leading and trailing whitespace characters from the descriptor's data.
+
+The length of the descriptor is reduced to reflect the loss of the whitespace characters.
+
+@see TDes8::TrimLeft()
+@see TDes8::TrimRight()
+*/
+	{
+
+	TrimLeft();
+	TrimRight();
+	}
+
+EXPORT_C void TDes8::TrimAll()
+/**
+Deletes leading and trailing whitespace characters from the descriptor's data and 
+replaces each contiguous set of whitespace characters within the data by one whitespace 
+character.
+
+The length of the descriptor is reduced to reflect the loss of the whitespace 
+characters.
+
+@see TDes8::Trim()
+*/
+	{
+
+	TrimLeft();
+	TrimRight();
+	TUint8 *pBuf=(TUint8 *)Ptr();
+	TUint8 *pSrc=pBuf;
+	TUint8 *pDst=pBuf;
+	TInt len=Length();
+	TInt spaces=0;
+	while (len--)
+		{
+		TChar c=*pSrc;
+		if (c.IsSpace())
+			{
+			if (spaces++==0)
+				{
+				if (pDst!=pSrc)
+					*pDst=*pSrc;
+				pDst++;
+				}
+			}
+		else
+			{
+			spaces=0;
+			if (pDst!=pSrc)
+				*pDst=*pSrc;
+			pDst++;
+			}
+		pSrc++;
+		}
+	Delete(pDst-pBuf, pSrc-pDst);
+	}
+
+EXPORT_C void TDes8::TrimLeft()
+/**
+Deletes leading whitespace characters from the descriptor's data.
+
+All whitespace characters up to, but not including the first non-whitespace
+character, are deleted.
+
+The length of the descriptor is reduced to reflect the loss of the
+whitespace characters.
+*/
+	{
+
+	const TUint8 *pBuf=Ptr();
+	const TUint8 *pB=pBuf;
+	TInt len=Length();
+	while (len--)
+		{
+		TChar c=(*pB);
+		if (!c.IsSpace())
+			break;
+		pB++;
+		}
+	Delete(0,pB-pBuf);
+	}
+
+EXPORT_C void TDes8::TrimRight()
+/**
+Deletes trailing whitespace characters from the descriptor's data.
+
+The process starts on the right hand side of the descriptor's data
+and proceeds to the left. 
+
+All whitespace characters up to, but not including the first non-whitespace character, 
+are deleted.
+
+The length of the descriptor is reduced to reflect the loss of the whitespace
+characters.
+*/
+	{
+
+	TInt len=Length();
+	if (len==0)
+		return;
+	const TUint8 *pB=Ptr()+len-1;
+	TInt s=len;
+	while (s)
+		{
+		TChar c=(*pB--);
+		if (!c.IsSpace())
+			break;
+		s--;
+		}
+	Delete(s,len-s);
+	}
+
+EXPORT_C void TDes8::Insert(TInt aPos,const TDesC8 &aDes)
+/**
+Inserts data into this descriptor.
+
+The length of this descriptor is changed to reflect the extra data.
+
+@param aPos The position within the data where insertion is to start. This 
+            is an offset value; a zero value refers to the leftmost data
+            position.
+            
+@param aDes An 8 bit non modifiable descriptor whose data is to be inserted.
+
+@panic USER 22  if aPos is negative or is greater than the length of this
+                descriptor.
+@panic USER 23  if the resulting length of this descriptor is greater than its
+                maximum length.
+*/
+	{
+
+	TInt len=Length();
+	__ASSERT_ALWAYS(aPos>=0 && aPos<=len,Panic(ETDes8PosOutOfRange));
+	TInt s=aDes.Length();
+	__ASSERT_ALWAYS((len+s)<=MaxLength(),Panic(ETDes8Overflow));
+	TUint8 *pB=WPtr();
+	memmove(pB+aPos+s,pB+aPos,len-aPos);
+	memmove(pB+aPos,aDes.Ptr(),aDes.Length());
+	SetLength(len+s);
+	}
+
+EXPORT_C void TDes8::Delete(TInt aPos,TInt aLength)
+/**
+Deletes data from this descriptor.
+
+The length of this descriptor is changed to reflect the loss of data.
+
+@param aPos    The position within the data where deletion is to start. This 
+               is an offset value; a zero value refers to the leftmost data
+               position.
+               
+@param aLength The length of data to be deleted. If necessary, the function 
+               adjusts this value to ensure that no data beyond the end of the
+               descriptor data area is deleted.
+
+@panic USER 22  if aPos is negative or is greater than the length of this
+                descriptor.
+*/
+	{
+
+	TInt len=Length();
+	__ASSERT_ALWAYS(aPos>=0 && aPos<=len,Panic(ETDes8PosOutOfRange));
+	TInt d=Min(len-aPos,aLength);
+	TUint8 *pB=WPtr();
+	memmove(pB+aPos,pB+aPos+d,len-aPos-d);
+	SetLength(len-d);
+	}
+
+EXPORT_C void TDes8::Replace(TInt aPos,TInt aLength,const TDesC8 &aDes)
+/**
+Replaces data in this descriptor.
+
+The specified length can be different to the length of the replacement data.
+The length of this descriptor changes to reflect the change of data.
+
+@param aPos    The position within the data where replacement is to start.
+               This is an offset value; a zero value refers to the leftmost
+               data position.
+               
+@param aLength The length of data to be replaced.
+
+@param aDes    The source 8-bit non-modifiable descriptor whose data is to
+               replace the target descriptor's data at aPos.
+
+@panic USER 20  if aLength is negative or the sum of aLength and aPos is
+                greater than the length of this descriptor.
+                
+@panic USER 22  if aPos is negative or is greater than the length of this
+                descriptor.
+                
+@panic USER 23  if the resulting length of this descriptor is greater than its
+                maximum length.
+
+@panic USER 28  if the length of the source descriptor aDes is negative or is
+                greater than the maximum length of this target descriptor,
+*/
+	{
+
+	TInt len=Length();
+	__ASSERT_ALWAYS(aPos>=0 && aPos<=len,Panic(ETDes8PosOutOfRange));
+	__ASSERT_ALWAYS(aLength>=0 && aPos+aLength<=len,Panic(ETDes8LengthOutOfRange));
+	TInt s=aDes.Length();
+	TInt maxlen=MaxLength();
+	__ASSERT_ALWAYS(s>=0 && s<=maxlen,Panic(ETDes8RemoteLengthOutOfRange));
+	__ASSERT_ALWAYS((len+s-aLength)<=maxlen,Panic(ETDes8Overflow));
+	TUint8 *pB=WPtr();
+	memmove(pB+aPos+s,pB+aPos+aLength,len-aPos-aLength);
+	memmove(pB+aPos,aDes.Ptr(),s);
+	SetLength(len+s-aLength);
+	}
+
+EXPORT_C void TDes8::Justify(const TDesC8 &aDes,TInt aWidth,TAlign anAlignment,TChar aFill)
+/**
+Copies data into this descriptor and justifies it, replacing any existing data.
+
+The length of this descriptor is set to reflect the new data.
+
+The target area is considered to be an area of specified width positioned at
+the beginning of this descriptor's data area. Source data is copied into, and
+aligned within this target area according to the specified alignment
+instruction.
+
+If the length of the target area is larger than the length of the source, then
+spare space within the target area is padded with the fill character.
+
+@param aDes        An 8-bit non-modifiable descriptor containing the source data.
+                   The length of the data to be copied is the smaller of:
+                   the length of the source descriptor, and 
+                   the width of the target area (only if this is not the
+                   explicit negative value KDefaultJustifyWidth).
+
+@param aWidth      The width of the target area. If this has the specific
+                   negative value KDefaultJustifyWidth, then the width is
+                   re-set to the length of the data source.
+
+@param anAlignment The alignment of the data within the target area
+
+@param aFill       The fill character used to pad the target area. 
+
+@panic USER 23  if the resulting length of this descriptor is greater than
+                its maximum length or aWidth has a negative value other 
+                than KDefaultJustifyWidth.
+*/
+	{
+
+    Zero();
+    AppendJustify(aDes.Ptr(),aDes.Length(),aWidth,anAlignment,aFill);
+    }
+
+EXPORT_C void TDes8::AppendJustify(const TDesC8 &aDes,TInt aWidth,TAlign anAlignment,TChar aFill)
+/**
+Appends data onto the end of this descriptor's data and justifies it.
+	
+The source of the appended data is an existing descriptor.
+	
+The target area is considered to be an area of specified width, immediately 
+following this descriptor's existing data. Source data is copied into, and 
+aligned within this target area according to the specified alignment instruction.
+	
+If the length of the target area is larger than the length of the source, 
+then spare space within the target area is padded with the fill character.
+		
+@param aDes        An 8-bit non-modifiable descriptor containing the source
+                   data. The length of the data to be copied is the smaller of:
+                   the length of the source descriptor, and
+                   the width of the target area (only if this is not the
+                   explicit negative value KDefaultJustifyWidth). 
+	
+@param aWidth      The width of the target area. If this has the specific
+                   negative value KDefaultJustifyWidth, then the width is
+	               re-set to the length of the data source.
+	
+@param anAlignment The alignment of the data within the target area. 
+	
+@param aFill       The fill character used to pad the target area.
+
+@panic USER 23  if the resulting length of this descriptor is greater than
+                its maximum length or aWidth has a negative value other 
+                than KDefaultJustifyWidth.
+*/
+	{
+
+    AppendJustify(aDes.Ptr(),aDes.Length(),aWidth,anAlignment,aFill);
+    } 
+
+EXPORT_C void TDes8::AppendJustify(const TDesC8 &aDes,TInt aLength,TInt aWidth,TAlign anAlignment,TChar aFill)
+/**
+Appends data onto the end of this descriptor's data and justifies it.
+	
+The source of the appended data is an existing descriptor.
+	
+The target area is considered to be an area of specified width, immediately 
+following this descriptor's existing data. Source data is copied into, and 
+aligned within this target area according to the specified alignment instruction.
+	
+If the length of the target area is larger than the length of the source, 
+then spare space within the target area is padded with the fill character.
+	
+@param aDes        An 8-bit non-modifiable descriptor containing the source data. 
+
+@param aLength     The length of data to be copied from the source descriptor. 
+                   If this is greater than the width of the target area, then
+                   the length of data copied is limited to the width.
+                   The length of data to be copied must not be 	greater than
+                   the length of the source descriptor. Note that this
+                   condition is not automatically tested. 
+                   
+@param aWidth      The width of the target area. If this has the specific negative 
+                   value KDefaultJustifyWidth, then the width is
+                   re-set to the length of the data source.
+
+@param anAlignment The alignment of the data within the target area. 
+
+@param aFill       The fill character used to pad the target area.
+
+@panic USER 23  if the resulting length of this descriptor is greater than
+                its maximum length or aWidth has a negative value other 
+                than KDefaultJustifyWidth.
+*/
+	{
+
+    AppendJustify(aDes.Ptr(),aLength,aWidth,anAlignment,aFill);
+    } 
+
+EXPORT_C void TDes8::AppendJustify(const TUint8 *aString,TInt aWidth,TAlign anAlignment,TChar aFill)
+/**
+Appends a zero terminated string onto the end of this descriptor's data and 
+justifies it.
+
+The zero terminator is not copied.
+
+The target area is considered to be an area of specified width, immediately 
+following this descriptor's existing data. Source data is copied into, and 
+aligned within, this target area according to the specified alignment instruction.
+
+If the length of the target area is larger than the length of the source, 
+then spare space within the target area is padded with the fill character.
+
+@param aString     A pointer to a zero terminated string. The length of the
+                   data to be copied is the smaller of:
+                   the length of the string (excluding the zero terminator),
+                   and the width of the target area (only if this is not the
+                   explicit negative value KDefaultJustifyWidth). 
+
+@param aWidth      The width of the target area. If this has the specific
+                   negative value KDefaultJustifyWidth, then the width
+                   is re-set to the length of the  zero terminated string
+                   (excluding the zero terminator).
+               
+@param anAlignment The alignment of the data within the target area. 
+
+@param aFill       The fill character used to pad the target area.
+
+@panic USER 23  if the resulting length of this descriptor is greater than
+                its maximum length or aWidth has a negative value other 
+                than KDefaultJustifyWidth.
+*/
+	{
+
+    AppendJustify(aString,STRING_LENGTH(aString),aWidth,anAlignment,aFill);
+    } 
+
+EXPORT_C void TDes8::AppendJustify(const TUint8 *aString,TInt aLength,TInt aWidth,TAlign anAlignment,TChar aFill)
+/**
+Appends data onto the end of this descriptor's data and justifies it.
+
+The source of the appended data is a memory location.
+
+The target area is considered to be an area of specified width, immediately 
+following this descriptor's existing data. Source data is copied into, and 
+aligned within, this target area according to the specified alignment instruction.
+
+If the length of the target area is larger than the length of the source, 
+then spare space within the target area is padded with the fill character.
+
+@param aString     A pointer to a source memory location. 
+
+@param aLength     The length of data to be copied. If this is greater than the 
+                   width of the target area, then the length of data copied is
+                   limited to the width.
+                    
+@param aWidth      The width of the target area. If this has the specific
+                   negative value KDefaultJustifyWidth, then the width is
+                   re-set to the length of the data source.
+
+@param anAlignment The alignment of the data within the target area. 
+
+@param aFill       The fill character used to pad the target area.
+
+@panic USER 23  if the resulting length of this descriptor is greater than
+                its maximum length or aWidth has a negative value other 
+                than KDefaultJustifyWidth.
+                
+@panic USER 29  if aLength is negative.               
+*/
+	{
+
+	__ASSERT_ALWAYS(aLength>=0,Panic(ETDes8LengthNegative));
+	if (aWidth==KDefaultJustifyWidth)
+		aWidth=aLength;
+	if (aLength>aWidth)
+		aLength=aWidth;
+	TInt offset=Length();
+	AppendFill(aFill,aWidth);
+	TInt r=aWidth-aLength;
+	if (anAlignment==ECenter)
+		r>>=1;
+	else if (anAlignment==ELeft)
+		r=0;
+	memmove(WPtr()+offset+r,aString,aLength);
+	}
+#endif	// __KERNEL_MODE__
+
+EXPORT_C void TDes8::Num(TInt64 aVal)
+//
+// Convert a TInt64 to the descriptor.
+//
+/**
+Converts the 64-bit signed integer into a decimal character representation
+and copies the conversion into this descriptor, replacing any existing data.
+
+The length of this descriptor is set to reflect the new data.
+
+If the integer is negative, the character representation is prefixed by a 
+minus sign.
+
+@param aVal The 64-bit signed integer value.
+*/
+	{
+	Zero();
+	AppendNum(aVal);
+	}
+
+EXPORT_C void TDes8::Num(TUint64 aVal, TRadix aRadix)
+/**
+Converts the specified 64-bit unsigned integer into a character representation 
+based on the specified number system and copies the conversion into this descriptor, 
+replacing any existing data.
+
+The length of this descriptor is set to reflect the new data.
+
+When a hexadecimal conversion is specified, hexadecimal characters are in 
+lower case.
+
+@param aVal   The 64-bit integer value. This is treated as an unsigned value. 
+@param aRadix The number system representation for the 64-bit integer.
+*/
+	{
+	Zero();
+	AppendNum(aVal, aRadix);
+	}
+
+EXPORT_C void TDes8::NumFixedWidth(TUint aVal,TRadix aRadix,TInt aWidth)
+/**
+Converts the specified unsigned integer into a fixed width character
+representation based on the specified number system and copies the conversion
+into this descriptor, replacing any existing data.
+
+The length of this descriptor is set to reflect the new data.
+
+The function generates the exact number of specified characters, either padding 
+to the left with character zeroes or discarding low order characters as necessary.
+
+When a hexadecimal conversion is specified, hexadecimal characters are in 
+lower case.
+
+This function is equivalent to using Format() with parameters which specify:
+
+1. a fixed length target field
+
+2. padding with zero characters, for example "%08x".
+
+When this is the case, always use NumFixedWidth() in preference 
+to Format() as it is more efficient.
+
+@param aVal   The unsigned integer value. 
+@param aRadix The number system representation for the unsigned integer. 
+@param aWidth The number of characters: to be used to contain the conversion, 
+              to be copied into this descriptor.
+              
+@see TDes8::Format()
+*/
+	{
+
+	Zero();
+	AppendNumFixedWidth(aVal,aRadix,aWidth);
+	}
+
+#ifndef __KERNEL_MODE__
+EXPORT_C void TDes8::NumFixedWidthUC(TUint aVal,TRadix aRadix,TInt aWidth)
+/**
+Converts the specified unsigned integer into a fixed width character
+representation based on the specified number system and copies the conversion
+into this descriptor, replacing any existing data.
+
+The length of this descriptor is set to reflect the new data.
+
+The function generates the exact number of specified characters, either padding 
+to the left with character zeroes or discarding low order characters as
+necessary.
+
+When a hexadecimal conversion is specified, hexadecimal characters are in 
+upper case.
+
+This function is equivalent to using Format() with parameters which specify:
+
+1. a fixed length target field
+
+2. padding with zero characters, for example "%08x".
+
+When this is the case, always use NumFixedWidthUC() in 
+preference to Format() as it is more efficient.
+
+@param aVal   The unsigned integer value. 
+@param aRadix The number system representation for the unsigned integer. 
+@param aWidth The number of characters to be used to contain the conversion,
+              and to be copied into this descriptor.
+
+@see TDes8::Format()
+*/
+	{
+
+    Zero();
+    AppendNumFixedWidthUC(aVal,aRadix,aWidth);
+    }
+
+EXPORT_C void TDes8::NumUC(TUint64 aVal, TRadix aRadix)	//NOT __KERNEL_MODE__
+/**
+Converts the specified 64-bit unsigned integer into a character representation 
+based on the specified number system and copies the conversion into this descriptor, 
+replacing any existing data.
+
+The length of this descriptor is set to reflect the new data.
+
+When a hexadecimal conversion is specified, hexadecimal characters are in 
+upper case.
+
+@param aVal   The 64-bit integer value. This is treated as an unsigned value. 
+@param aRadix The number system representation for the 64-bit integer. If no 
+              explicit value is specified, then EDecimal is the default.
+*/
+	{
+	Zero();
+	AppendNumUC(aVal,aRadix);
+	}
+#endif	// __KERNEL_MODE__
+
+EXPORT_C void TDes8::AppendNum(TInt64 aVal)
+/**
+Converts the 64-bit signed integer into a decimal character representation 
+and appends the conversion onto the end of this descriptor's data.
+
+The length of this descriptor is incremented to reflect the new content.
+
+If the integer is negative, the character representation is prefixed by a 
+minus sign.
+
+@param aVal The 64-bit signed integer value.
+*/
+	{
+	if (aVal < 0)
+		{
+		Append('-');
+		aVal = -aVal;
+		}
+
+	AppendNum(aVal, EDecimal);
+	}
+
+#ifndef __DES_MACHINE_CODED__
+GLDEF_C TInt __DoConvertNum(TUint aVal, TRadix aRadix, TUint aA, TUint8*& aDest)
+	{
+	__KERNEL_CHECK_RADIX(aRadix);
+	TUint radix = (TUint)aRadix;
+	TUint8* p = aDest;
+	TBool out16 = (aA>255);
+	aA &= 0xff;
+	do	{
+		TUint q = aVal/radix;
+		TUint c = aVal-q*radix;
+		(c>9) ? c+=(aA-10) : c+='0';
+		aVal = q;
+		if (out16)
+			*--p = 0;
+		*--p = (TUint8)c;
+		} while (aVal);
+	TInt l = aDest - p;
+	aDest = p;
+	return l;
+	}
+
+GLDEF_C TInt __DoConvertNum(TUint64 aVal, TRadix aRadix, TUint aA, TUint8*& aDest)
+	{
+	__KERNEL_CHECK_RADIX(aRadix);
+	TUint radix = (TUint)aRadix;
+	TUint8* p = aDest;
+	TBool out16 = (aA>255);
+	TUint8 a = static_cast<TUint8>(aA);
+	while (aVal >= UI64LIT(0x100000000))
+		{
+		TUint8 c = static_cast<TUint8>(aVal % radix);
+		aVal /= radix;
+		(c > 9) ? c = static_cast<TUint8>(c + a - 10) : c = static_cast<TUint8>(c + '0');
+		if (out16)
+			*--p = 0;
+		*--p = c;
+		}
+	TInt l = aDest - p;
+	aDest = p;
+	return l + __DoConvertNum((TUint)aVal, aRadix, aA, aDest);
+	}
+#endif
+
+void TDes8::DoPadAppendNum(TInt l, TInt aW, const TUint8* p)
+	{
+	if (aW<=0)
+		{
+		Append(p, l);
+		return;
+		}
+	TInt l0 = Length();
+	SetLength(l0 + aW);
+	TUint8* d = WPtr() + l0;
+	for (; aW>l; --aW) *d++ = (TUint8)'0';
+	memcpy(d, p, aW);
+	}
+
+void TDes8::DoAppendNum(TUint64 aVal, TRadix aRadix, TUint aA, TInt aW)
+//
+// Convert a TUint64 into the descriptor.
+//
+	{
+	TUint8 buf[APPEND_BUF_SIZE_64];
+	TUint8* p = buf + APPEND_BUF_SIZE_64;
+	TInt l = __DoConvertNum(aVal, aRadix, aA, p);
+	DoPadAppendNum(l, aW, p);
+	}
+
+EXPORT_C void TDes8::AppendNum(TUint64 aVal, TRadix aRadix)
+/**
+Converts the specified 64-bit unsigned integer into a character representation 
+based on the specified number system and appends the conversion onto the end 
+of this descriptor's data. The length of this descriptor is incremented to 
+reflect the new content
+
+When a hexadecimal conversion is specified, hexadecimal characters are in 
+lower case.
+
+@param aVal   The 64-bit integer value. This is treated as an unsigned value. 
+@param aRadix The number system representation for the 64-bit integer.
+*/
+	{
+	DoAppendNum(aVal, aRadix, 'a', 0);
+	}
+
+EXPORT_C void TDes8::AppendNumFixedWidth(TUint aVal,TRadix aRadix,TInt aWidth)
+/**
+Converts the specified unsigned integer into a fixed width character
+representation based on the specified number system and appends the conversion
+onto the end of this descriptor's data.
+
+The length of this descriptor is incremented to reflect the new content.
+
+The function generates the exact number of specified characters, either padding 
+to the left with character zeroes or discarding low order characters as
+necessary.
+
+When a hexadecimal conversion is specified, hexadecimal characters are in 
+lower case.
+
+@param aVal   The unsigned integer value. 
+@param aRadix The number system representation for the unsigned integer. 
+@param aWidth The number of characters to be used to contain the conversion,
+              and to be appended to this descriptor.
+*/
+	{
+	DoAppendNum(aVal, aRadix, 'a', aWidth);
+	}
+
+#if (!defined(__DES8_MACHINE_CODED__) && !defined(__KERNEL_MODE__))
+EXPORT_C TPtr8 TDes8::LeftTPtr(TInt aLength) const
+/**
+Extracts the leftmost part of the data. 
+
+The function does not cut or remove any data but constructs a modifiable 
+pointer descriptor to represent the leftmost part of the data.
+
+@param aLength The length of the data to be extracted. If this value
+               is greater than the length of the descriptor, the function
+               extracts the whole of the descriptor.
+
+@return The 8-bit modifiable pointer descriptor representing the leftmost 
+        part of the data.
+
+@panic USER 22  if aLength is negative. 
+*/
+	{
+
+	__ASSERT_ALWAYS(aLength>=0,Panic(ETDes8PosOutOfRange));
+	TInt len=Min(aLength,Length());
+	return(TPtr8((TUint8*)Ptr(),len,len));
+	}
+
+EXPORT_C TPtr8 TDes8::RightTPtr(TInt aLength) const
+/**
+Extracts the rightmost part of the data.
+
+The function does not cut or remove any data but constructs a modifiable 
+pointer descriptor to represent the rightmost part of the data.
+
+@param aLength The length of data to be extracted. If this value
+               is greater than the length of the descriptor, the function 
+               extracts the whole of the descriptor. 
+               
+@return The 8 bit modifiable pointer descriptor representing the rightmost 
+        part of the data.
+
+@panic USER 22  if aLength is negative. 
+*/
+	{
+
+	__ASSERT_ALWAYS(aLength>=0,Panic(ETDes8PosOutOfRange));
+	TInt len=Length();
+	if (aLength>len)
+		aLength=len;
+	return(TPtr8((TUint8*)Ptr()+len-aLength,aLength,aLength));
+	}
+
+EXPORT_C TPtr8 TDes8::MidTPtr(TInt aPos) const
+/**
+Extracts a portion of the data.
+
+The function does not cut or remove any data but constructs a modifiable 
+pointer descriptor to represent the defined portion.
+
+The portion is identified by its starting position and by the length of the 
+remainder of the data starting from the specified position.
+
+@param aPos The starting position of the data to be extracted. This is an 
+            offset value; a zero value refers to the leftmost data position. 
+            
+@return The 8-bit modifiable pointer descriptor representing the specified 
+        portion of the data.
+        
+@panic USER 22  if aPos is negative or aPos is greater than the
+                length of the descriptor.       
+*/
+	{
+
+	TInt len=Length();
+	__ASSERT_ALWAYS(aPos>=0 && aPos<=len,Panic(ETDes8PosOutOfRange));
+	return(TPtr8((TUint8*)Ptr()+aPos,len-aPos,len-aPos));
+	}
+
+EXPORT_C TPtr8 TDes8::MidTPtr(TInt aPos,TInt aLength) const
+/**
+Extracts a portion of the data.
+
+The function does not cut or remove any data but constructs a modifiable 
+pointer descriptor to represent the defined portion.
+
+The portion is identified by its starting position and by its length.
+
+@param aPos    The starting position of the data to be extracted. This is an 
+               offset value; a zero value refers to the leftmost data position. 
+@param aLength The length of data to be extracted.
+
+@return The 8 bit modifiable pointer descriptor representing the specified 
+        portion of the data.
+
+@panic USER 22  if aPos is negative or aPos plus aLength is greater than the
+                length of the descriptor.
+*/
+	{
+
+	__ASSERT_ALWAYS(aPos>=0 && (aPos+aLength)<=Length(),Panic(ETDes8PosOutOfRange));
+	return(TPtr8((TUint8*)Ptr()+aPos,aLength,aLength));
+	}
+#endif
+
+#ifndef __KERNEL_MODE__
+EXPORT_C void TDes8::AppendNumFixedWidthUC(TUint aVal,TRadix aRadix,TInt aWidth)
+/**
+Converts the specified unsigned integer into a fixed width character
+representation based on the specified number system and appends the conversion
+onto the end of this descriptor's data.
+
+The length of this descriptor is incremented to reflect the new content.
+
+The function generates the exact number of specified characters, either
+padding to the left with character zeroes or discarding low order characters
+as necessary.
+
+When a hexadecimal conversion is specified, hexadecimal characters are in 
+upper case.
+
+@param aVal   The unsigned integer value. 
+@param aRadix The number system representation for the unsigned integer. 
+@param aWidth The number of characters to be used to contain the conversion,
+              and to be appended to this descriptor.
+*/
+	{
+	DoAppendNum(aVal, aRadix, 'A', aWidth);
+	}
+
+EXPORT_C void TDes8::AppendNumUC(TUint64 aVal, TRadix aRadix)
+/** Converts the specified 64-bit unsigned integer into a character
+representation based on the specified number system and appends the conversion
+onto the end of this descriptor's data.
+
+The length of this descriptor is incremented to reflect the new content.
+
+When a hexadecimal conversion is specified, hexadecimal characters are in 
+upper case.
+
+@param aVal   The 64-bit integer value. This is treated as an unsigned value. 
+@param aRadix The number system representation for the 64-bit integer. If no 
+              explicit value is specified, then EDecimal is the default.
+*/
+	{
+	DoAppendNum(aVal, aRadix, 'A', 0);
+	}
+
+EXPORT_C void TDes8::Format(TRefByValue<const TDesC8> aFmt,...)
+/**
+Formats and copies text into this descriptor, replacing any existing data.
+
+The length of this descriptor is set to reflect the new data.
+
+The function takes a format string and a variable number of arguments.
+The format string contains literal text embedded with directives for converting
+the trailing list of arguments into text.
+
+The embedded directives are character sequences prefixed with the '%' character.
+The literal text is simply copied into this descriptor unaltered while
+the '%' directives are used to convert successive arguments from the
+trailing list.
+
+The resulting stream of literal text and converted arguments is copied into
+this descriptor.
+
+The syntax of the embedded directives follows one of four general patterns.
+
+Note that formatting of single numerical values can be achieved more
+conveniently using the Num() and NumUC() member functions of this class.
+
+The full description of the syntax of a format string cannot be	included here.
+For full details, navigate to the Symbian OS guide, and follow the hierarchy of links:
+
+@code
+Symbian OS Guide
+	Base
+		Using  User Library (E32)
+			Buffers and Strings
+				Using Descriptors
+					How to Use Descriptors
+						Format string syntax
+@endcode
+
+@param aFmt The descriptor containing the format string.
+            The TRefByValue class provides a constructor which takes a
+            TDesC8 type.
+
+@param ...  A variable number of arguments to be converted to text as
+            dictated by the format string. 
+
+@panic USER 23  if the  resulting length of text in this descriptor exceeds
+                the descriptor's maximum length.
+@panic USER 24  if the format string has incorrect syntax.
+
+@see TDes8::Num()
+@see TDes8::NumUC()
+*/
+	{
+
+    VA_LIST list;
+    VA_START(list,aFmt);
+    FormatList(aFmt,list);
+    }
+
+EXPORT_C void TDes8::FormatList(const TDesC8 &aFmt,VA_LIST aList)
+/**
+Formats and copies text into this descriptor, replacing any existing data.
+
+The length of this descriptor is set to reflect the new data.
+
+The behaviour of this function is the same as Format(). In practice, it is 
+better and easier to use Format(), passing a variable number of arguments 
+as required by the format string.
+
+@param aFmt  The descriptor containing the format string.
+@param aList A pointer to an argument list.
+
+@see TDes8::Format()
+@see VA_LIST
+*/
+	{
+
+	Zero();
+	AppendFormatList(aFmt,aList);
+	}
+
+EXPORT_C void TDes8::AppendFormat(TRefByValue<const TDesC8> aFmt,TDes8Overflow *aOverflowHandler,...)
+/**
+Formats and appends text onto the end of this descriptor's data.
+
+The length of this descriptor is incremented to reflect the new content.
+
+The function takes a format string and a variable number of arguments.
+The format string contains literal text, embedded with directives,
+for converting the trailing list of arguments into text.
+
+The embedded directives are character sequences prefixed with the '%' character.
+The literal text is simply copied into this descriptor unaltered while
+the '%' directives are used to convert successive arguments from the
+trailing list. See the description of the Format() function.
+
+Literal text is appended on a character by character basis.
+If it results in the length of this descriptor exceeding its maximum length,
+then the function:
+
+1. calls the Overflow() member function of the overflow handler, if an overflow
+   handler is supplied
+2  raises a USER 23 panic, if no overflow handler is supplied.
+
+As much literal text as possible will have been copied into this descriptor
+and this descriptor will have reached its maximum length.
+
+Text converted from a trailing argument is appended as a complete string.
+If an attempt to append this string fails because the resulting length
+of this descriptor would exceed its maximum length, then the function:
+
+1. calls the Overflow() member function of the overflow handler, if an overflow
+   handler is supplied
+   
+2  raises a USER 23 panic, if no overflow handler is supplied.
+  
+None of the generated text is appended and length of this descriptor
+may be less than the maximum.
+
+@param aFmt             The 8-bit non-modifiable descriptor containing the
+                        format string. The TRefByValue class provides a
+                        constructor which takes a TDesC8 type. 
+
+@param aOverflowHandler A pointer to the overflow handler. 
+
+@param ...              A variable number of arguments to be converted to text
+                        as dictated by the format string. 
+
+@panic USER 23  if the length of the descriptor exceeds its maximum length and
+                no overflow handler has been supplied.
+@panic USER 24  if the format string has incorrect syntax.
+
+@see TDes8::Format()
+@see TDes8Overflow::Overflow()
+*/
+	{
+
+	VA_LIST list;
+	VA_START(list, aOverflowHandler);
+	AppendFormatList(aFmt,list,aOverflowHandler);
+	}
+
+EXPORT_C void TDes8::AppendFormat(TRefByValue<const TDesC8> aFmt,...)
+/**
+Formats and appends text onto the end of this descriptor's data.
+
+The length of this descriptor is incremented to reflect the new content.
+
+The function takes a format string and a variable number of arguments.
+The format string contains literal text, embedded with directives,
+for converting the trailing list of arguments into text.
+
+The embedded directives are character sequences prefixed with the '%' character.
+The literal text is simply copied into this descriptor unaltered while
+the '%' directives are used to convert successive arguments from the
+trailing list. See the description of the Format() function.
+
+Literal text is appended on a character by character basis.
+
+Text converted from a trailing argument is appended as a complete string.
+
+@param aFmt The 8-bit non-modifiable descriptor containing the
+            format string. The TRefByValue class provides a
+            constructor which takes a TDesC8 type. 
+
+@param ...  A variable number of arguments to be converted to text
+            as dictated by the format string. 
+
+
+@panic USER 23  if the  resulting length of text in this descriptor exceeds
+                the descriptor's maximum length.
+@panic USER 24  if the format string has incorrect syntax.
+
+@see TDes8::Format()
+*/
+	{
+
+    VA_LIST list;
+    VA_START(list,aFmt);
+    AppendFormatList(aFmt,list);
+    }
+#endif	// __KERNEL_MODE__
+
+#if !defined(__DES8_MACHINE_CODED__) | defined(__EABI_CTORS__)
+EXPORT_C TPtrC8::TPtrC8()
+	: TDesC8(EPtrC,0),iPtr(0)
+/**
+Default constructor.
+
+Constructs an empty 8-bit non-modifiable pointer descriptor.
+
+It represents no data and its length is zero.
+
+The non-modifiable pointer descriptor can, subsequently, be set to represent 
+data.
+
+@see TPtrC8::Set()
+*/
+	{}
+
+EXPORT_C TPtrC8::TPtrC8(const TDesC8 &aDes)
+	: TDesC8(EPtrC,aDes.Length()),iPtr(aDes.Ptr())
+/**
+Constructs the 8-bit non-modifiable pointer descriptor from any existing
+descriptor.
+
+It is set to point to the same data and is given the same length as the source 
+descriptor.
+
+@param aDes A reference to an 8bit non-modifiable descriptor.
+*/
+	{}
+
+EXPORT_C TPtrC8::TPtrC8(const TUint8 *aString)
+	: TDesC8(EPtrC,STRING_LENGTH(aString)),iPtr(aString)
+/**
+Constructs the 8-bit non-modifiable pointer descriptor to point to a zero
+terminated string, whether in RAM or ROM.
+
+The length of the descriptor is set to the length of the zero terminated
+string, excluding the zero terminator.
+
+@param aString A pointer to a zero terminated string.
+*/
+	{}
+
+EXPORT_C TPtrC8::TPtrC8(const TUint8 *aBuf,TInt aLength)
+	: TDesC8(EPtrC,aLength),iPtr(aBuf)
+/**
+Constructs the 8-bit non-modifiable pointer descriptor to point to the
+specified location in memory, whether in RAM or ROM.
+
+The length of the descriptor is set to the specified length.
+
+@param aBuf    A pointer to the location that the descriptor is to represent.
+@param aLength The length of the descriptor. This value must be non-negative.
+
+@panic USER 29  if aLength is negative.
+*/
+	{
+	__ASSERT_ALWAYS(aLength>=0,Panic(ETDes8LengthNegative));
+	}
+
+EXPORT_C TPtr8::TPtr8(TUint8 *aBuf,TInt aMaxLength)
+	: TDes8(EPtr,0,aMaxLength),iPtr(aBuf)
+/**
+Constructs the 8-bit modifiable pointer descriptor to point to the specified 
+location in memory, whether in RAM or ROM.
+
+The length of the descriptor is set to zero and its maximum length is set
+to the specified value.
+
+@param aBuf       A pointer to the location that the descriptor is to
+                  represent.
+                  
+@param aMaxLength The maximum length of the descriptor.
+
+@panic USER 30  if aMaxLength is negative.
+*/
+	{
+	__ASSERT_ALWAYS(aMaxLength>=0,Panic(ETDes8MaxLengthNegative));
+	}
+
+EXPORT_C TPtr8::TPtr8(TUint8 *aBuf,TInt aLength,TInt aMaxLength)
+	: TDes8(EPtr,aLength,aMaxLength),iPtr(aBuf)
+/**
+Constructs the 8-bit modifiable pointer descriptor to point to the specified 
+location in memory, whether in RAM or ROM.
+
+The length of the descriptor and its maximum length are set to the specified
+values.
+
+@param aBuf       A pointer to the location that the descriptor is
+                  to represent.
+@param aLength    The length of the descriptor.
+@param aMaxLength The maximum length of the descriptor.
+
+@panic USER 20  if aLength is negative, or is greater than the descriptor's 
+                maximum length,
+@panic USER 30  if aMaxLength is negative.
+*/
+	{
+	__ASSERT_ALWAYS(aMaxLength>=0,Panic(ETDes8MaxLengthNegative));
+	__ASSERT_ALWAYS(TUint(aLength)<=TUint(aMaxLength),Panic(ETDes8LengthOutOfRange));
+	}
+
+EXPORT_C TPtr8::TPtr8(TBufCBase8 &aLcb,TInt aMaxLength)
+	: TDes8(EBufCPtr,aLcb.Length(),aMaxLength),iPtr((TUint8*)&aLcb)
+	{
+	__ASSERT_DEBUG(aLcb.Length()<=aMaxLength,Panic(ETDes8LengthOutOfRange));
+	}
+
+EXPORT_C TBufBase8::TBufBase8(TInt aMaxLength)
+	:TDes8(EBuf,0,aMaxLength)
+	{
+	__ASSERT_DEBUG(aMaxLength>=0,Panic(ETDes8MaxLengthNegative));
+	}
+
+EXPORT_C TBufBase8::TBufBase8(TInt aLength,TInt aMaxLength)
+	:TDes8(EBuf,aLength,aMaxLength)
+	{
+	__ASSERT_DEBUG(aMaxLength>=0,Panic(ETDes8MaxLengthNegative));
+	__ASSERT_ALWAYS(TUint(aLength)<=TUint(aMaxLength),Panic(ETDes8LengthOutOfRange));
+	}
+
+EXPORT_C TBufBase8::TBufBase8(const TUint8* aString,TInt aMaxLength)
+	:TDes8(EBuf,0,aMaxLength)
+	{
+	__ASSERT_DEBUG(aMaxLength>=0,Panic(ETDes8MaxLengthNegative));
+	Copy(aString);
+	}
+
+EXPORT_C TBufBase8::TBufBase8(const TDesC8& aDes,TInt aMaxLength)
+	:TDes8(EBuf,0,aMaxLength)
+	{
+	__ASSERT_DEBUG(aMaxLength>=0,Panic(ETDes8MaxLengthNegative));
+	Copy(aDes);
+	}
+
+#endif
+
+// Truncate literal string to fit into descriptor
+EXPORT_C void TDes8IgnoreOverflow::Overflow(TDes8& /*aDes*/)
+	{}
+
+#ifndef __KERNEL_MODE__
+EXPORT_C void TDesC8::__DbgTestInvariant() const
+//
+// Test that the class obeys its invariant.
+//
+    {
+
+#if defined(_DEBUG)
+	switch (Type())
+		{
+	case EBufC:
+	case EPtrC:
+	case EPtr:
+	case EBuf:
+	case EBufCPtr:
+		break;
+	default:
+		User::Invariant();
+		}
+#endif
+    }
+
+EXPORT_C void TPtrC8::__DbgTestInvariant() const
+//
+// Test that the class obeys its invariant.
+//
+    {
+
+#if defined(_DEBUG)
+	TDesC8::__DbgTestInvariant(); // Test base class
+	if (Type()!=EPtrC)
+		User::Invariant();
+#endif
+	}
+
+EXPORT_C void TDes8::__DbgTestInvariant() const
+//
+// Test that the class obeys its invariant.
+//
+    {
+
+#if defined(_DEBUG)
+	TDesC8::__DbgTestInvariant(); // Test base class
+	if (Length()>MaxLength() || !(Type()==EPtr || Type()==EBufCPtr || Type()==EBuf))
+		User::Invariant();
+#endif
+	}
+
+EXPORT_C void HBufC8::__DbgTestInvariant() const
+//
+// Test that the class obeys its invariant.
+//
+    {
+
+#if defined(_DEBUG)
+	TDesC8::__DbgTestInvariant(); // Test base class
+	if (Length()>(TInt)(User::AllocLen(this)-sizeof(TDesC8)) || Type()!=EBufC)
+		User::Invariant();
+#endif
+	}
+
+EXPORT_C void TPtr8::__DbgTestInvariant() const
+//
+// Test that the class obeys its invariant.
+//
+    {
+
+#if defined(_DEBUG)
+	TDes8::__DbgTestInvariant(); // Test base class
+	if (!(Type()==EPtr || Type()==EBufCPtr))
+		User::Invariant();
+#endif
+	}
+
+/** Expand all characters from 8 to 16 bits
+
+@return 16-bit pointer descriptor to transformed text
+
+The length of descriptor increased by 2 (length *= 2).
+
+@panic USER 187 if either the descriptor length or the maximum length is odd
+or data pointer is not aligned by 2-bytes boundary
+*/
+EXPORT_C TPtr16 TDes8::Expand()
+	{
+	TInt l = Length();
+	TInt ml = MaxLength();
+	const TText8* s0 = Ptr();
+	const TText8* s = s0 + l;
+	__ASSERT_ALWAYS( !((ml|(TInt)s0)&1), Panic(EDes8ExpandOdd) );
+	SetLength(l<<1);
+	TText16* d = ((TText16*)s0) + l;
+	while (s > s0)
+		*--d = *--s;
+	return TPtr16(d, l, ml>>1);
+	}
+
+
+/** Collapse all characters from 16 to 8 bits
+
+The length of descriptor truncated by 2 (length /= 2).
+
+@panic USER 188  if either the descriptor length or the maximum length is odd
+or data pointer is not aligned by 2-bytes boundary.
+*/
+
+EXPORT_C void TDes8::Collapse()
+	{
+	TInt l = Length();
+	TInt ml = MaxLength();
+	TText8* d = (TText8*)Ptr();
+	__ASSERT_ALWAYS( !((l|ml|(TInt)d)&1), Panic(EDes8CollapseOdd) );
+	const TText16* s = (const TText16*)d;
+	const TText16* sE = s + (l>>1);
+	while (s < sE)
+		*d++ = (TText8)*s++;
+	SetLength(l>>1);
+	}
+#else // __KERNEL_MODE__
+
+EXPORT_C TInt TDesC8::CompareF(const TDesC8 &aDes) const
+/**
+Compares this descriptor's folded data with the specified descriptor's folded 
+data. 
+
+Note that folding is locale-independent behaviour. It is also important to 
+note that there can be no guarantee that folding is in any way culturally 
+appropriate, and should not be used for comparing strings in natural language; 
+use CompareC() for this.
+
+@param aDes The 8-bit non modifable descriptor whose data is to be compared 
+            with this descriptor's data. 
+            
+@return Positive, if this descriptor is greater than the specified descriptor. 
+        Negative, if this descriptor is less than the specified descriptor.
+        Zero, if both descriptors have the same length and the their contents
+        are the same.
+        
+@see TDesC8::Compare()
+*/
+	{
+
+	TInt ll = Length();
+	TInt rl = aDes.Length();
+	TInt r = memicmp(Ptr(), aDes.Ptr(), Min(ll, rl));
+	if (r == 0)
+		r = ll - rl;
+	return r;
+	}
+
+#endif	// __KERNEL_MODE__
+
+#ifndef __KERNEL_MODE__
+
+/**
+Default constructor.
+
+Constructs a zero-length 8-bit resizable buffer descriptor.
+
+Note that the object owns no allocated memory.
+*/
+EXPORT_C RBuf8::RBuf8()
+	:TDes8(EPtr,0,0),iEPtrType(NULL)
+	{
+	// Zero-length RBuf8 is of type EPtr with NULL pointer.
+	}
+
+
+
+
+/**
+Constructor.
+			
+Constructs an 8-bit resizable buffer descriptor, transferring ownership of the
+specified heap descriptor to this object.
+
+@param aHBuf The heap descriptor to be transferred to this object. This pointer
+             can be NULL, which means that a zero length 8-bit resizable
+             buffer	descriptor is constructed, and the object will not own any
+             allocated memory.
+*/
+EXPORT_C RBuf8::RBuf8(HBufC8* aHBuf)
+	{
+	if(aHBuf)
+		//Create EBufCPtr type descriptor that points to aHBuf
+		new(this) TPtr8(aHBuf->Des());
+	else
+		//Create zero-length RBuf8. It is EPtr type of descriptor that points to NULL.
+		new(this) RBuf8();
+	}
+
+
+
+
+/**
+Protected constructor.
+*/
+EXPORT_C RBuf8::RBuf8(TInt aType,TInt aLength,TInt aMaxLength)
+	:TDes8(aType,aLength,aMaxLength)
+	{
+	}
+
+
+
+
+/**
+Transfers ownership of the specified 8-bit resizable buffer descriptor's 
+buffer to this object.
+
+Note that the function assumes that this descriptor does not already own any
+allocated memory. It does not check, nor does it free any pre-existing owned
+allocated memory.  If this descriptor does already own allocated memory,
+RBuf8::Close() should be invoked on this descriptor before this function is
+invoked.
+
+@param aRBuf The source 8-bit resizable buffer. The ownership of this
+             object's buffer is to be transferred.
+
+@see RBuf8::Close()
+*/
+EXPORT_C void RBuf8::Assign(const RBuf8& aRBuf)
+	{
+	Mem::Copy(this, &aRBuf, sizeof(RBuf8)); 
+	__TEST_INVARIANT;
+	}
+
+
+
+
+/**
+Assigns ownership of the specified allocated memory to this object.
+
+The allocated memory forms the buffer for this descriptor. The current length
+of the descriptor is set to zero.
+
+Note that the function assumes that this descriptor does not already own any
+allocated memory. It does not check, nor does it free any pre-existing owned
+allocated memory.  If this descriptor does already own allocated memory,
+RBuf8::Close() should be invoked on this descriptor before this function is
+invoked.
+
+@param aHeapCell  The allocated memory to be assigned to this object. This
+                  pointer can be NULL, which means that a zero length 8-bit
+                  resizable buffer descriptor is created.
+@param aMaxLength The maximum length of the descriptor.
+
+@panic USER 20 If the specified maximum length is greater then the size of
+               the allocated heap cell, or the specified maximum length
+               is NOT zero when the pointer to the heap cell is NULL.
+              
+@see TDesC8::Length()
+@see TDes8::MaxLength()
+@see RBuf8::Close()
+*/
+EXPORT_C void RBuf8::Assign(TUint8 *aHeapCell,TInt aMaxLength)
+	{
+	Assign(aHeapCell,0,aMaxLength);
+	}
+
+
+
+
+/**
+Assigns ownership of the specified allocated memory to this object.
+
+The allocated memory forms the buffer for this descriptor. The current length
+of the descriptor is set to the value of the second parameter.
+
+Note that the function assumes that this descriptor does not already own any
+allocated memory. It does not check, nor does it free any pre-existing owned
+allocated memory.  If this descriptor does already own allocated memory,
+RBuf8::Close() should be invoked on this descriptor before this function is
+invoked.
+
+@param aHeapCell  The allocated memory to be assigned to this object.
+@param aLength	  The length of the descriptor.
+@param aMaxLength The maximum length of the descriptor.
+
+@panic USER 20 If the specified maximum length is greater then the size of
+               the allocated heap cell, or the specified length is greater then
+               the specified maximum length, or the specified maximum length
+               is NOT zero when the pointer to the heap cell is NULL.
+
+@see TDesC8::Length()
+@see TDes8::MaxLength()
+@see RBuf8::Close()
+*/
+EXPORT_C void RBuf8::Assign(TUint8 *aHeapCell,TInt aLength,TInt aMaxLength)
+	{
+	__ASSERT_ALWAYS(aLength<=aMaxLength, Panic(ETDes8LengthOutOfRange));
+	if(aHeapCell)
+		{
+		__ASSERT_ALWAYS(User::AllocLen(aHeapCell) >= aMaxLength * (TInt)sizeof(TUint8), Panic(ETDes8LengthOutOfRange));
+		//Create EPtr type descriptor that points to aHeapCell
+		new(this) TPtr8(aHeapCell,aLength,aMaxLength); 
+		}
+	else
+		{
+		__ASSERT_ALWAYS(aMaxLength == 0, Panic(ETDes8LengthOutOfRange));
+		//Create zero-length RBuf. It is EPtr type of descriptor that points to NULL.
+		new(this) RBuf8();
+		}
+	__TEST_INVARIANT;
+	}
+
+
+
+
+/**
+Transfers ownership of the specified heap descriptor to this object.
+
+Note that the function assumes that this descriptor does not already own any
+allocated memory. It does not check, nor does it free any pre-existing owned
+allocated memory.  If this descriptor does already own allocated memory,
+RBuf8::Close() should be invoked on this descriptor before this function is
+invoked.
+
+@param aHBuf  The heap descriptor to be transferred to this object.
+              This pointer can be NULL, which means that a zero length
+              8-bit resizable buffer descriptor is created.
+@see RBuf8::Close()
+*/
+EXPORT_C void RBuf8::Assign(HBufC8* aHBuf)
+	{
+	new(this) RBuf8(aHBuf);
+	}
+
+
+
+
+/**
+Swaps the content of two 8-bit resizable buffer descriptors.
+
+@param aRBuf The 8-bit resizable buffer descriptor whose contents are to be
+             swapped with this one.
+*/
+EXPORT_C void RBuf8::Swap(RBuf8& aRBuf)
+	{
+	Mem::Swap(this,&aRBuf,sizeof(*this));
+	}
+
+
+
+
+/**
+Creates an 8-bit resizable buffer descriptor.
+
+The function allocates sufficient memory to contain descriptor data up to
+the specified maximum length.
+
+The current length of the descriptor is set to zero. The maximum length of
+the descriptor is set to the specified value.
+
+Note that the function assumes that this descriptor does not already own any
+allocated memory. It does not check, nor does it free any pre-existing owned
+allocated memory.  If this descriptor does already own allocated memory,
+RBuf8::Close() should be invoked on this descriptor before this function is
+invoked.
+
+@param aMaxLength  The maximum length of the descriptor.
+
+@return KErrNone, if successful; KErrNoMemory, if there is insufficient	memory.
+
+@see TDesC8::Length()
+@see TDes8::MaxLength()
+@see RBuf8::Close()
+*/
+EXPORT_C TInt RBuf8::Create(TInt aMaxLength)
+	{
+	if (aMaxLength)
+		{
+		//Allocate memory
+		TUint8* buf=(TUint8*)User::Alloc(aMaxLength*sizeof(TUint8));
+		if(!buf) return KErrNoMemory;
+		iEPtrType = buf;
+		}
+	else
+		iEPtrType = NULL; //Zero-length descriptor.
+
+
+	//Create EPtr type descriptor.
+	new(this) RBuf8(EPtr,0,aMaxLength);
+	__TEST_INVARIANT;
+	return KErrNone;
+	}
+
+
+
+
+/**
+Creates an 8-bit resizable buffer descriptor, and leaves on failure.
+
+The function allocates sufficient memory to contain descriptor data up to
+the specified maximum length.
+
+The current length of the descriptor is set to zero. The maximum length of
+the descriptor is set to the specified value.
+
+Note that the function assumes that this descriptor does not already own any
+allocated memory. It does not check, nor does it free any pre-existing owned
+allocated memory.  If this descriptor does already own allocated memory,
+RBuf8::Close() should be invoked on this descriptor before this function is
+invoked.
+
+@param aMaxLength The length and the maximum length of the descriptor.
+
+@leave KErrNoMemory If there is insufficient memory.
+
+@see TDesC8::Length()
+@see TDes8::MaxLength()
+@see RBuf8::Close()
+*/
+EXPORT_C void RBuf8::CreateL(TInt aMaxLength)
+	{
+	User::LeaveIfError(Create(aMaxLength));
+	}
+
+
+
+
+/**
+Creates an 8-bit resizable buffer descriptor.
+
+The function allocates sufficient memory to contain descriptor data up to
+the specified maximum length.
+
+Both the current length and the maximum length of the descriptor are set to
+the specified value.
+
+Note that the function assumes that this descriptor does not already own any
+allocated memory. It does not check, nor does it free any pre-existing owned
+allocated memory.  If this descriptor does already own allocated memory,
+RBuf8::Close() should be invoked on this descriptor before this function is
+invoked.
+
+@param aMaxLength  The length and the maximum length of the descriptor.
+
+@return KErrNone, if successful; KErrNoMemory, if there is insufficient memory.
+
+@see RBuf8::Close()
+*/
+EXPORT_C TInt RBuf8::CreateMax(TInt aMaxLength)
+	{
+	TInt err=Create(aMaxLength); 
+	if(err==KErrNone)
+		SetMax(); 
+	return err;
+	}
+
+
+
+
+/**
+Creates an 8-bit resizable buffer descriptor, and leaves on failure.
+
+The function allocates sufficient memory to contain descriptor data up to
+the specified maximum length.
+
+Both the current length and the maximum length of the descriptor are set to
+the specified value. 
+
+Note that the function assumes that this descriptor does not already own any
+allocated memory. It does not check, nor does it free any pre-existing owned
+allocated memory.  If this descriptor does already own allocated memory,
+RBuf8::Close() should be invoked on this descriptor before this function is
+invoked.
+
+@param aMaxLength The length and the maximum length of the descriptor.
+
+@leave KErrNoMemory If there is insufficient memory.
+
+@see TDesC8::Length()
+@see TDes8::MaxLength()
+@see RBuf8::Close()
+*/
+EXPORT_C void RBuf8::CreateMaxL(TInt aMaxLength)
+	{
+	User::LeaveIfError(CreateMax(aMaxLength));
+	}
+
+
+
+
+/**
+Creates a 8-bit resizable buffer descriptor to contain a copy of the
+specified (source) descriptor.
+
+The function allocates sufficient memory so that this descriptor's maximum
+length is the same as the length of the source descriptor. Both the current
+length and the maximum length of this descriptor are set to
+the length of the source descriptor.
+				
+The data contained in the source descriptor is copied into this
+descriptor.
+
+Note that the function assumes that this descriptor does not
+already own any allocated memory. It does not check, nor does it free any
+pre-existing owned allocated memory.  If this descriptor does already own 
+allocated memory, RBuf8::Close() should be invoked on this descriptor before 
+this function is invoked.
+
+@param aDes Source descriptor to be copied into this object.
+
+@return KErrNone, if successful; KErrNoMemory, if there is insufficient memory.
+
+@see TDesC8::Length()
+@see TDes8::MaxLength()
+@see TDes8::Copy()
+@see RBuf8::Close()
+*/
+EXPORT_C TInt RBuf8::Create(const TDesC8& aDes)
+	{
+	return Create(aDes,aDes.Length());
+	}
+
+
+
+
+/**
+Creates an 8-bit resizable buffer descriptor to contain a copy of the specified
+(source) descriptor, and leaves on failure.
+ 
+The function allocates sufficient memory so that this descriptor's maximum
+length is the same as the length of the source descriptor.Both the current
+length and the maximum length of this descriptor are set to the length
+of the source descriptor.
+
+The data contained in the source descriptor is copied into this descriptor.
+
+Note that the function assumes that this descriptor does not already own any
+allocated memory. It does not check, nor does it free any
+pre-existing owned allocated memory.  If this descriptor does already own 
+allocated memory, RBuf8::Close() should be invoked on this descriptor before 
+this function is invoked.
+
+@param aDes Source descriptor to be copied into this object.
+
+@leave KErrNoMemory If there is insufficient memory.
+
+@see TDesC8::Length()
+@see TDes8::MaxLength()
+@see TDes8::Copy()
+@see RBuf8::Close()
+*/
+EXPORT_C void RBuf8::CreateL(const TDesC8& aDes)
+	{
+	CreateL(aDes,aDes.Length());
+	}
+
+
+
+
+/**
+Creates an 8-bit resizable buffer descriptor to contain a copy of the
+specified (source) descriptor. 
+
+The function allocates sufficient memory so that this descriptor's maximum length
+is the same as the value of the aMaxLength parameter.
+
+The data contained in the source descriptor is copied into this descriptor.
+The length of data copied is either
+
+- the length of the source descriptor aDes
+
+or
+
+- the value of the aMaxLength parameter
+
+whichever is the smaller value. The current length of this descriptor is also
+set to the smaller value.
+
+Note that the function assumes that this descriptor does not already own any
+allocated memory. It does not check, nor does it free any pre-existing owned
+allocated memory.  If this descriptor does already own allocated memory,
+RBuf8::Close() should be invoked on this descriptor before this function is
+invoked.
+
+@param aDes Source descriptor to be copied into this object.
+            
+@param aMaxLength The maximum length of this descriptor.
+
+@return KErrNone, if successful; KErrNoMemory, if there is insufficient memory.
+
+@see TDesC8::Length()
+@see TDes8::MaxLength()
+@see TDes8::Copy()
+@see RBuf8::Close()
+*/
+EXPORT_C TInt RBuf8::Create(const TDesC8& aDes,TInt aMaxLength)
+	{
+	TInt err=Create(aMaxLength);
+	if(err==KErrNone)
+		Copy(aDes.Left(aMaxLength));
+	return err;
+	}
+
+
+
+
+/**
+Creates an 8-bit resizable buffer descriptor to contain a copy of the specified
+(source) descriptor, and leaves on failure.
+
+The function allocates sufficient memory so that this descriptor's maximum
+length is the same as the value of the aMaxLength parameter.
+
+The data contained in the source descriptor is copied into this descriptor.
+The length of data copied is either
+
+- the length of the source descriptor aDes
+
+or
+
+- the value of the aMaxLength parameter
+
+whichever is the smaller value. The current length of this descriptor is also
+set to the smaller value.
+
+Note that the function assumes that this descriptor does not already own any
+allocated memory. It does not check, nor does it free any pre-existing owned
+allocated memory.  If this descriptor does already own allocated memory,
+RBuf8::Close() should be invoked on this descriptor before this function is
+invoked.
+
+@param aDes Source descriptor to be copied into this object.
+            
+@param aMaxLength The maximum length of this descriptor.
+
+@leave KErrNoMemory If there is insufficient memory.
+
+@see TDesC8::Length()
+@see TDes8::MaxLength()
+@see TDes8::Copy()
+@see RBuf8::Close()
+*/
+EXPORT_C void RBuf8::CreateL(const TDesC8& aDes,TInt aMaxLength)
+	{
+	CreateL(aMaxLength);
+	Copy(aDes.Left(aMaxLength));
+	}
+
+
+
+
+/**
+Resizes this 8-bit resizable buffer descriptor.
+
+The length and contents of the descriptor are unchanged.
+
+If the buffer descriptor was created from a zero-length heap descriptor
+HBufC, this method might leak memory (the heap descriptor is not freed).
+It is possible to avoid this by calling the Close() method prior to ReAlloc(),
+but this should be done only in this situation (otherwise the buffer contents
+will be lost).
+
+For example, add
+@code
+    if (desc.MaxLength() == 0) desc.Close();
+@endcode
+before the call to ReAlloc().
+
+@param aMaxLength The new maximum length of the descriptor. This can be zero,
+                  which results in a descriptor with zero maximum length and no
+                  allocated memory.
+                  
+@return KErrNone, if successful; KErrNoMemory, if there is insufficient memory.
+
+@panic USER 26 If the new maximum length is less then the current descriptor length.
+*/
+EXPORT_C TInt RBuf8::ReAlloc(TInt aMaxLength)
+	{
+	__ASSERT_ALWAYS(Length()<=aMaxLength, Panic(ETDes8ReAllocTooSmall));
+	__TEST_INVARIANT;
+
+	if (!aMaxLength)				//Reallocation to zero length
+		{
+		User::Free(iEPtrType);	//Free memory 
+		new (this) RBuf8();			//Create zero-length RBuf
+		return KErrNone;
+		}
+
+	if (!iMaxLength)				//Reallocation from zero length
+		return Create(aMaxLength);
+
+	switch(Type())
+		{
+		case EPtr:
+			{
+			TUint8* buf = (TUint8*)User::ReAlloc(iEPtrType,aMaxLength*sizeof(TUint8));
+			if(!buf) return KErrNoMemory;
+			iEPtrType = buf;
+			iMaxLength = aMaxLength;
+			break;
+			}
+		case EBufCPtr:
+			{
+			HBufC8* hbufc = iEBufCPtrType->ReAlloc(aMaxLength);
+			if(!hbufc) return KErrNoMemory;
+			Assign(hbufc);
+			break;
+			}
+		}
+
+	__TEST_INVARIANT;
+	return KErrNone;
+	}
+
+
+
+
+/**
+Resizes this 8-bit resizable buffer descriptor, leaving on failure.
+
+The length and contents of the descriptor are unchanged.
+
+If the buffer descriptor was created from a zero-length heap descriptor
+HBufC, this method might leak memory (the heap descriptor is not freed).
+It is possible to avoid this by calling the Close() method prior to ReAllocL(),
+but this should be done only in this situation (otherwise the buffer contents
+will be lost).
+
+For example, add
+@code
+    if (desc.MaxLength() == 0) desc.Close();
+@endcode
+before the call to ReAlloc().
+
+@param aMaxLength The new maximum length of the descriptor. This can be zero,
+                  which results in a descriptor with zero maximum length and no
+                  allocated memory.
+                  
+@return KErrNone, if successful; KErrNoMemory, if there is insufficient memory.
+
+@panic USER 26 If the new maximum length is less then the current descriptor length.
+*/
+EXPORT_C void RBuf8::ReAllocL(TInt aMaxLength)
+	{
+	User::LeaveIfError(ReAlloc(aMaxLength));
+	}
+
+
+
+
+/**
+Deallocates memory assigned to this object, and re-initializes the object as
+a zero-length descriptor.
+*/
+EXPORT_C void RBuf8::Close() 
+	{
+	User::Free(iEPtrType); 
+	//Create zero-length RBuf. It is EPtr type of descriptor that points to NULL.
+	new(this) RBuf8();
+	}
+
+
+
+
+/**
+Pushes a cleanup item for this object onto the cleanup stack.
+
+The effect of this is to cause Close() to be called on this 8-bit resizable
+buffer descriptor, when CleanupStack::PopAndDestroy() is called at some later time.
+
+@code
+...
+RBuf8 x;
+....
+x.CleanupClosePushL();
+...
+CleanupStack::PopAndDestroy();
+...
+@endcode
+
+@see RBuf8::Close()
+*/
+EXPORT_C void RBuf8::CleanupClosePushL()
+	{
+	::CleanupClosePushL(*this);
+	}
+
+
+
+
+/**
+Tests that the class obeys its invariant.
+*/
+EXPORT_C void RBuf8::__DbgTestInvariant() const
+	{
+#ifdef _DEBUG
+	TDes8::__DbgTestInvariant();
+	switch(Type())
+		{
+	case EPtr:
+		if (iEPtrType)
+			{
+			__ASSERT_DEBUG(User::AllocLen(iEPtrType) >= iMaxLength*(TInt)sizeof(TUint8), Panic(EInvariantFalse));
+			}
+		break;
+	case EBufCPtr:
+		iEBufCPtrType->__DbgTestInvariant(); 
+		__ASSERT_DEBUG(iEBufCPtrType->Des().MaxLength() == iMaxLength, Panic(EInvariantFalse));
+		__ASSERT_DEBUG(iEBufCPtrType->Length() == Length(), Panic(EInvariantFalse));
+		break;
+	default:
+		User::Invariant();
+		}
+#endif // _DEBUG
+	}
+
+#endif	// __KERNEL_MODE__
+
+
+#if defined(__DES8_MACHINE_CODED__) || defined(__EABI__)
+GLDEF_C void Des8PanicBadDesType()
+	{
+	Panic(ETDes8BadDescriptorType);
+	}
+
+GLDEF_C void Des8PanicPosOutOfRange()
+	{
+	Panic(ETDes8PosOutOfRange);
+	}
+#endif
+
+#ifdef __DES8_MACHINE_CODED__
+GLDEF_C void Des8PanicLengthNegative()
+	{
+	Panic(ETDes8LengthNegative);
+	}
+
+GLDEF_C void Des8PanicMaxLengthNegative()
+	{
+	Panic(ETDes8MaxLengthNegative);
+	}
+
+GLDEF_C void Des8PanicLengthOutOfRange()
+	{
+	Panic(ETDes8LengthOutOfRange);
+	}
+
+GLDEF_C void Des8PanicDesOverflow()
+	{
+	Panic(ETDes8Overflow);
+	}
+
+GLDEF_C void Des8PanicDesIndexOutOfRange()
+	{
+	Panic(ETDes8IndexOutOfRange);
+	}
+#endif
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32/common/mem.cpp	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,241 @@
+// Copyright (c) 1994-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32\common\mem.cpp
+//
+//
+
+#include "common.h"
+
+//This is used in heap.cpp and it is defined here, as a requirement for patchdata
+EXPORT_D extern const TInt KHeapMinCellSize = 0;
+EXPORT_D extern const TInt KHeapShrinkHysRatio = RHeap::EShrinkRatioDflt;
+//NOTE - if these values are changed then the WINS test case value must be updated
+
+#ifndef __MEM_MACHINE_CODED__
+
+extern "C" {
+
+// See header file e32cmn.h for the in-source documentation.
+EXPORT_C TAny* memcpy(TAny* aTrg, const TAny* aSrc, unsigned int aLength)
+	{
+	return memmove(aTrg, aSrc, aLength);
+	}
+
+
+
+// See header file e32cmn.h for the in-source documentation.
+EXPORT_C TAny* memmove(TAny* aTrg, const TAny* aSrc, unsigned int aLength)
+	{
+	if (aLength==0)
+		return((TUint8*)aTrg);
+	TInt aLen32=0;
+	TUint32* pT32=(TUint32*)aTrg;
+	const TUint32* pS32=(TUint32 *)aSrc;
+	if (((TInt)pT32&3)==0 && ((TInt)pS32&3)==0)
+		aLen32=aLength>>2;
+	TInt aLen8=aLength-(aLen32<<2);
+	TUint32* pE32=pT32+aLen32;
+	TUint8* pT;
+    TUint8* pE;
+    TUint8* pS;
+	if (aTrg<aSrc)
+		{
+		pS32=(TUint32*)aSrc;
+		while (pT32<pE32)
+			*pT32++=(*pS32++);
+		pT=(TUint8*)pT32;
+		pS=(TUint8*)pS32;
+		pE=(TUint8*)aTrg+aLength;
+		while (pT<pE)
+			*pT++=(*pS++);
+		}
+	else if (aTrg>aSrc)
+		{
+		pT=(TUint8*)(pT32+aLen32);
+		pE=pT+aLen8;
+		pS=(TUint8*)aSrc+aLength;
+		while (pE>pT)
+			*--pE=(*--pS);
+		pS32=(TUint32*)pS;
+		while (pE32>pT32)
+			*--pE32=(*--pS32);
+		}
+	return aTrg;
+	}
+
+
+
+// See header file e32cmn.h for the in-source documentation.
+EXPORT_C TAny* memclr(TAny* aTrg, unsigned int aLength)
+	{
+	return memset(aTrg, 0, aLength);
+	}
+
+
+
+// See header file e32cmn.h for the in-source documentation.
+EXPORT_C TAny* memset(TAny* aTrg, TInt aValue, unsigned int aLength)
+	{
+	TInt aLen32=0;
+	TUint32 *pM32=(TUint32 *)aTrg;
+	if (((TInt)aTrg&3)==0)
+		{
+		aLen32=aLength>>2;
+		TUint32 *pE32=pM32+aLen32;
+		TUint c = aValue & 0xff;
+		TUint32 fillChar=c+(c<<8)+(c<<16)+(c<<24);
+		while (pM32<pE32)
+			*pM32++=fillChar;
+		}
+	TInt aLen8=aLength-(aLen32<<2);
+	TUint8 *pM=(TUint8 *)pM32;
+	TUint8 *pE=pM+aLen8;
+	while (pM<pE)
+		*pM++=TUint8(aValue);
+	return aTrg;
+	}
+
+} // extern "C"
+
+extern "C" {
+
+
+
+// See header file e32cmn.h for the in-source documentation.
+EXPORT_C TAny* wordmove(TAny* aTrg, const TAny* aSrc, unsigned int aLength)
+	{
+	__ASSERT_DEBUG((aLength&3)==0,Panic(EWordMoveLengthNotMultipleOf4));
+	__ASSERT_DEBUG((((TUint)aSrc)&3)==0,Panic(EWordMoveSourceNotAligned));
+	__ASSERT_DEBUG((((TUint)aTrg)&3)==0,Panic(EWordMoveTargetNotAligned));
+	if (aLength==0)
+		return((TUint8*)aTrg);
+	TInt len=aLength>>2;
+	TUint32* pT=(TUint32*)aTrg;
+	const TUint32* pS=(const TUint32*)aSrc;
+	const TUint32* pE=pS+len;
+	if (pT<pS)
+		{
+		while (pS<pE)
+			*pT++=(*pS++);
+		}
+	else if (pT>pS)
+		{
+        pT+=len;
+		while (pE>pS)
+			*--pT=(*--pE);
+		}
+	return aTrg;
+	}
+
+
+
+
+// See header file e32cmn.h for the in-source documentation.
+EXPORT_C TInt memcompare(const TUint8* aLeft, TInt aLeftL, const TUint8* aRight, TInt aRightL)
+	{
+
+	__ASSERT_DEBUG(aLeftL>=0,Panic(EMemLeftNegative));
+	__ASSERT_DEBUG(aRightL>=0,Panic(EMemRightNegative));
+	const TUint8 *pE=aLeft+Min(aLeftL,aRightL);
+    while (aLeft<pE)
+		{
+		TInt d=(*aLeft++)-(*aRight++);
+		if (d!=0)
+		    return(d);
+		}
+    return(aLeftL-aRightL);
+	}
+
+} // extern "C"
+
+
+
+
+#if defined(__GCC32__) && !defined(__KERNEL_MODE__)
+/**
+Compares a block of data at one specified location with a block of data at
+another specified location.
+
+The comparison proceeds on a byte for byte basis, the result of the comparison
+is based on the difference of the first bytes to disagree.
+
+The data at the two locations are equal if they have the same length and content.
+Where the lengths are different and the shorter section of data is the same
+as the first part of the longer section of data, the shorter is considered
+to be less than the longer.
+
+@param aLeft   A pointer to the first (or left) block of 8 bit data
+               to be compared.
+@param aLeftL  The length of the first (or left) block of data to be compared,
+               i.e. the number of bytes.
+@param aRight  A pointer to the second (or right) block of 8 bit data to be
+               compared.
+@param aRightL The length of the second (or right) block of data to be compared
+               i.e. the number of bytes.
+
+@return Positive, if the first (or left) block of data is greater than the
+        second (or right) block of data.
+        Negative, if the first (or left) block of data is less than the
+        second (or right) block of data.
+        Zero, if both the first (or left) and second (or right) blocks of data
+        have the same length and the same content.
+*/
+EXPORT_C TInt Mem::Compare(const TUint8* aLeft, TInt aLeftL, const TUint8* aRight, TInt aRightL)
+	{
+	return memcompare(aLeft, aLeftL, aRight, aRightL);
+	}
+#endif
+
+#else // __MEM_MACHINE_CODED__
+
+#if defined(_DEBUG) && defined(__CPU_ARM)
+
+GLDEF_C void PanicEWordMoveLengthNotMultipleOf4()
+	{
+	Panic(EWordMoveLengthNotMultipleOf4);
+	}
+
+GLDEF_C void PanicEWordMoveSourceNotAligned()
+	{
+	Panic(EWordMoveSourceNotAligned);
+	}
+
+GLDEF_C void PanicEWordMoveTargetNotAligned()
+	{
+	Panic(EWordMoveTargetNotAligned);
+	}
+
+#endif
+
+#endif // __MEM_MACHINE_CODED__
+
+#ifndef __KERNEL_MODE__
+//
+// Dummy class for Binary Compatibility purposes
+//
+class Mem1
+	{
+public:
+	IMPORT_C static TUint8* Copy(TAny* aTrg,const TAny* aSrc,TInt aLength);
+	IMPORT_C static TUint8* Move(TAny* aTrg,const TAny* aSrc,TInt aLength);
+	IMPORT_C static void Fill(TAny* aTrg,TInt aLength,TChar aChar);
+	};
+EXPORT_C void Mem1::Fill(TAny* aTrg,TInt aLength,TChar aChar)
+	{ Mem::Fill(aTrg,aLength,aChar); }
+EXPORT_C TUint8* Mem1::Copy(TAny* aTrg, const TAny* aSrc, TInt aLength)
+	{ return Mem::Copy(aTrg, aSrc, aLength); }
+EXPORT_C TUint8* Mem1::Move(TAny* aTrg, const TAny* aSrc, TInt aLength)
+	{ return Mem::Move(aTrg, aSrc, aLength); }
+
+#endif // __KERNEL_MODE__
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32/common/secure.cpp	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,1022 @@
+// Copyright (c) 2004-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32\common\secure.cpp
+// 
+//
+
+#define __INCLUDE_ALL_SUPPORTED_CAPABILITIES__
+#include "common.h"
+#ifdef __KERNEL_MODE__
+#include <kernel.h>
+#include <kern_priv.h>
+#endif
+
+// Check that the layout of TSecurityInfo and SSecurityInfo are the same
+// because we use this assumption in the TSecurityInfo::Set methods
+__ASSERT_COMPILE(_FOFF(TSecurityInfo,iSecureId)==_FOFF(SSecurityInfo,iSecureId));
+__ASSERT_COMPILE(_FOFF(TSecurityInfo,iVendorId)==_FOFF(SSecurityInfo,iVendorId));
+__ASSERT_COMPILE(_FOFF(TSecurityInfo,iCaps)==_FOFF(SSecurityInfo,iCaps));
+
+#ifndef __TOOLS2__
+#ifdef __KERNEL_MODE__
+
+
+/**
+Construct a TSecurityInfo setting it to the security attributes of aProcess.
+@param aProcess A process.
+*/
+EXPORT_C TSecurityInfo::TSecurityInfo(DProcess* aProcess)
+	{
+	memcpy(this, &aProcess->iS, sizeof(SSecurityInfo));
+	}
+
+/**
+Construct a TSecurityInfo setting it to the security attributes to those of the process
+owning the specified thread.
+@param aThread A thread.
+*/
+EXPORT_C TSecurityInfo::TSecurityInfo(DThread* aThread)
+	{
+	memcpy(this, &aThread->iOwningProcess->iS, sizeof(SSecurityInfo));
+	}
+
+#else
+
+/**
+Construct a TSecurityInfo setting it to the security attributes of aProcess.
+@param aProcess A process.
+*/
+EXPORT_C TSecurityInfo::TSecurityInfo(RProcess aProcess)
+	{
+	Exec::ProcessSecurityInfo(aProcess.Handle(),*(SSecurityInfo*)this);
+	}
+
+/**
+Construct a TSecurityInfo setting it to the security attributes to those of the process
+owning the specified thread.
+@param aThread A thread.
+*/
+EXPORT_C TSecurityInfo::TSecurityInfo(RThread aThread)
+	{
+	Exec::ThreadSecurityInfo(aThread.Handle(),*(SSecurityInfo*)this);
+	}
+
+/**
+Construct a TSecurityInfo setting it to the security attributes of the process
+which sent the message aMsgPtr
+@param aMsgPtr a message
+*/
+EXPORT_C TSecurityInfo::TSecurityInfo(RMessagePtr2 aMsgPtr)
+	{
+	Exec::MessageSecurityInfo(aMsgPtr.Handle(),*(SSecurityInfo*)this);
+	}
+
+TInt TSecurityInfo::Set(RSessionBase aSession)
+	{
+	return Exec::SessionSecurityInfo(aSession.Handle(),*(SSecurityInfo*)this);
+	}
+
+/**
+Sets this TSecurityInfo to the security attributes of this process' creator.
+*/
+EXPORT_C void TSecurityInfo::SetToCreatorInfo()
+	{
+	Exec::CreatorSecurityInfo(*(SSecurityInfo*)this);
+	}
+
+#endif //__KERNEL_MODE__
+#endif // __TOOLS2__
+
+/**
+Construct a set consisting of two capabilities.
+@param aCapability1 The first capability.
+@param aCapability2 The second capability.
+*/
+EXPORT_C TCapabilitySet::TCapabilitySet(TCapability aCapability1, TCapability aCapability2)
+	{
+	SetEmpty();
+	AddCapability(aCapability1);
+	AddCapability(aCapability2);
+	}
+
+/**
+Make this set empty. I.e. Containing no capabilities.
+*/
+EXPORT_C void TCapabilitySet::SetEmpty()
+	{
+	memset(iCaps,0,sizeof(iCaps));
+	}
+
+
+/**
+Make this set consist of all capabilities supported by this OS version.
+*/
+EXPORT_C void TCapabilitySet::SetAllSupported()
+	{
+	*(SCapabilitySet*)&iCaps=AllSupportedCapabilities;
+	}
+
+#ifndef __TOOLS2__
+#ifndef __KERNEL_MODE__
+// Documented in header file
+EXPORT_C void TCapabilitySet::SetDisabled()
+	{
+	Exec::DisabledCapabilities(*(SCapabilitySet*)this);
+	}
+#endif // __KERNEL_MODE__
+#endif // __TOOLS2__
+
+/**
+Add a single capability to the set.
+If the capability is not supported by this OS version then it is not added and
+the set is left unchanged.
+@see TCapabilitySet::SetAllSupported()
+@param aCapability Capability to add.
+*/
+EXPORT_C void TCapabilitySet::AddCapability(TCapability aCapability)
+	{
+	if((TUint32)aCapability<(TUint32)ECapability_Limit)
+		{
+		TInt index = aCapability>>3;
+		TUint8 mask = (TUint8)(1<<(aCapability&7));
+		mask &= ((TUint8*)&AllSupportedCapabilities)[index];
+		((TUint8*)iCaps)[index] |= mask;
+		}
+	}
+
+/**
+Remove a single capability from the set, if it is present.
+@param aCapability Capability to remove.
+*/
+EXPORT_C void TCapabilitySet::RemoveCapability(TCapability aCapability)
+	{
+	if((TUint32)aCapability<(TUint32)ECapability_Limit)
+		{
+		TInt index = aCapability>>3;
+		TUint8 mask = (TUint8)(1<<(aCapability&7));
+		((TUint8*)iCaps)[index] &= ~mask;
+		}
+	}
+
+/**
+Perform a union of this capability set with another.
+The result replaces the content of 'this'.
+@param aCapabilities A cpability set
+*/
+EXPORT_C void TCapabilitySet::Union(const TCapabilitySet& aCapabilities)
+	{
+	for(TInt n = (ECapability_Limit-1)>>5; n>=0; n--)
+		iCaps[n] |= aCapabilities.iCaps[n];
+	}
+
+/**
+Perform an intersection of this capability set with another.
+The result replaces the content of 'this'.
+@param aCapabilities A capability set
+*/
+EXPORT_C void TCapabilitySet::Intersection(const TCapabilitySet& aCapabilities)
+	{
+	for(TInt n = (ECapability_Limit-1)>>5; n>=0; n--)
+		iCaps[n] &= aCapabilities.iCaps[n];
+	}
+
+/**
+Remove a set of capabilities from this set.
+@param aCapabilities The set of capabilities to remove
+*/
+EXPORT_C void TCapabilitySet::Remove(const TCapabilitySet& aCapabilities)
+	{
+	for(TInt n = (ECapability_Limit-1)>>5; n>=0; n--)
+		iCaps[n] &= ~aCapabilities.iCaps[n];
+	}
+
+/**
+Test if a single capability is present in the set.
+The capability ECapability_None is always treated as being present.
+@param aCapability The capability to test
+@return 1 if the capability is present, 0 if it is not.
+*/
+EXPORT_C TBool TCapabilitySet::HasCapability(TCapability aCapability) const
+	{
+	if((TUint32)aCapability<(TUint32)ECapability_Limit)
+		return (((TUint8*)iCaps)[aCapability>>3]>>(aCapability&7))&1;
+	if(aCapability==ECapability_None)
+		return ETrue;
+	return EFalse;  // Handles illegal argument and ECapability_Denied
+	}
+
+/**
+Test if all the capabilities in a given set are present in this set
+@param aCapabilities The capability set to test
+@return A non-zero value if all the capabilities are present, zero otherwise.
+*/
+EXPORT_C TBool TCapabilitySet::HasCapabilities(const TCapabilitySet& aCapabilities) const
+	{
+	TUint32 checkFail=0;
+	for(TInt n = (ECapability_Limit-1)>>5; n>=0; n--)
+		checkFail |= aCapabilities.iCaps[n]&~iCaps[n];
+	return checkFail?0:1;
+	}
+
+// Documented in header file
+TBool TCapabilitySet::NotEmpty() const
+	{
+	TUint32 notEmpty=0;
+	for(TInt n = (ECapability_Limit-1)>>5; n>=0; n--)
+		notEmpty |= iCaps[n];
+	return notEmpty;
+	}
+
+//ECapability_None is assumed to be -1 in the internals of TSecurityPolicy
+__ASSERT_COMPILE(ECapability_None == -1);
+
+/** Constructs a TSecurityPolicy to either always pass or always fail checks made
+against it, depending on the value of aType.
+@param aType Must be one of EAlwaysPass or EAlwaysFail
+@panic USER 191 if aType is not a valid value
+*/
+EXPORT_C TSecurityPolicy::TSecurityPolicy(TSecPolicyType aType)
+	: iType((TUint8)aType), iSecureId(TUint32(ECapability_None))
+	{
+	//This constructor uses TSecPolicyType as public alias for the internal
+	//TType.  Thus EAlwaysFail must have the same value as ETypeFail (same with the
+	//pass case too).
+	__ASSERT_COMPILE(EAlwaysFail == (TSecPolicyType)ETypeFail);
+	__ASSERT_COMPILE(EAlwaysPass == (TSecPolicyType)ETypePass);
+
+	__ASSERT_ALWAYS(aType == EAlwaysFail || aType == EAlwaysPass, Panic(ETSecPolicyTypeInvalid));
+	iCaps[0] = (TUint8)ECapability_None;
+	iCaps[1] = (TUint8)ECapability_None;
+	iCaps[2] = (TUint8)ECapability_None;
+	}
+
+/** Construct a TSecurityPolicy object to check up to 3 capabilties.
+@param aCap1 The first capability to add to this policy
+@param aCap2 An optional second capability to add to this policy
+@param aCap3 An optional third capability to add to this policy
+@panic USER 189 If any of the supplied capabilities are not valid.
+*/
+EXPORT_C TSecurityPolicy::TSecurityPolicy(TCapability aCap1, TCapability aCap2, TCapability aCap3)
+	//iSecureId=0xFFFFFFFF sets iExtraCaps[0-3] each to ECapability_None (==0xFF)
+	: iType(ETypeC3), iSecureId(TUint32(ECapability_None))
+	{
+	ConstructAndCheck3(aCap1, aCap2, aCap3);
+	}
+
+/** Construct a TSecurityPolicy object to check up to 7 capabilties.
+@param aCap1 The first capability to add to this policy
+@param aCap2 The second capability to add to this policy
+@param aCap3 The third capability to add to this policy
+@param aCap4 The fourth capability to add to this policy
+@param aCap5 An optional fifth capability to add to this policy
+@param aCap6 An optional sixth capability to add to this policy
+@param aCap7 An optional seventh capability to add to this policy
+@panic USER 189 If any of the supplied capabilities are not valid.
+*/
+EXPORT_C TSecurityPolicy::TSecurityPolicy(TCapability aCap1, TCapability aCap2, 
+	TCapability aCap3, TCapability aCap4, TCapability aCap5, TCapability aCap6, TCapability aCap7)
+	: iType(ETypeC7)  
+	{
+	ConstructAndCheck3(aCap1, aCap2, aCap3);
+	__ASSERT_COMPILE(ECapability_None==-1); // Our argument check below assumes this
+	__ASSERT_ALWAYS(  (TUint)(aCap4+1)<=(TUint)ECapability_Limit
+					&&(TUint)(aCap5+1)<=(TUint)ECapability_Limit
+					&&(TUint)(aCap6+1)<=(TUint)ECapability_Limit
+					&&(TUint)(aCap7+1)<=(TUint)ECapability_Limit
+					,Panic(ECapabilityInvalid));
+	iExtraCaps[0] = (TUint8)aCap4;
+	iExtraCaps[1] = (TUint8)aCap5;
+	iExtraCaps[2] = (TUint8)aCap6;
+	iExtraCaps[3] = (TUint8)aCap7;
+	}
+
+/** Construct a TSecurityPolicy object to check a secure id and up to 3 capabilties.
+@param aSecureId The secure id to add to this policy
+@param aCap1 The first capability to add to this policy
+@param aCap2 The second capability to add to this policy
+@param aCap3 The third capability to add to this policy
+@panic USER 189 If any of the supplied capabilities are not valid.
+*/
+EXPORT_C TSecurityPolicy::TSecurityPolicy(TSecureId aSecureId, 
+	TCapability aCap1, TCapability aCap2, TCapability aCap3)
+	: iType(ETypeS3), iSecureId(aSecureId)
+	{
+	ConstructAndCheck3(aCap1, aCap2, aCap3);
+	}
+
+/** Construct a TSecurityPolicy object to check a vendor id and up to 3 capabilties.
+@param aVendorId The vendor id to add to this policy
+@param aCap1 The first capability to add to this policy
+@param aCap2 The second capability to add to this policy
+@param aCap3 The third capability to add to this policy
+@panic USER 189 If any of the supplied capabilities are not valid.
+*/
+EXPORT_C TSecurityPolicy::TSecurityPolicy(TVendorId aVendorId, 
+	TCapability aCap1, TCapability aCap2, TCapability aCap3)
+	: iType(ETypeV3), iVendorId(aVendorId)
+	{
+	ConstructAndCheck3(aCap1, aCap2, aCap3);
+	}
+
+/** Sets up iCaps[0-2] with supplied values and checks for their validity.
+@panic USER 189 If any of the supplied capabilities are invalid.
+*/
+void TSecurityPolicy::ConstructAndCheck3(TCapability aCap1, TCapability aCap2, TCapability aCap3)
+	{
+	__ASSERT_COMPILE(ECapability_None==-1); // Our argument check below assumes this
+	__ASSERT_ALWAYS(  (TUint)(aCap1+1)<=(TUint)ECapability_Limit
+					&&(TUint)(aCap2+1)<=(TUint)ECapability_Limit
+					&&(TUint)(aCap3+1)<=(TUint)ECapability_Limit
+					,Panic(ECapabilityInvalid));
+	iCaps[0] = (TUint8)aCap1;
+	iCaps[1] = (TUint8)aCap2;
+	iCaps[2] = (TUint8)aCap3;
+	}
+
+/**
+Checks that this object is in a valid state
+@return A non-zero value if this object is valid, zero otherwise.
+@internalComponent
+*/
+TBool TSecurityPolicy::Validate() const
+	{
+	switch(iType)
+		{
+		case ETypeFail:
+		case ETypePass:
+			if(iSecureId!=TUint32(ECapability_None))
+				return EFalse;
+			__ASSERT_COMPILE(TUint8(ECapability_None)==0xffu); // Test below assumes this...
+			if((iCaps[0]&iCaps[1]&iCaps[2])!=TUint8(ECapability_None)) // check caps 0 to 2 are each == ECapability_None
+				return EFalse;
+			return ETrue;
+
+		case ETypeC7:
+			return ETrue;
+
+		case ETypeC3:
+			if(iSecureId!=TUint32(ECapability_None))
+				return EFalse;
+			return ETrue;
+
+		case ETypeS3:
+		case ETypeV3:
+			return ETrue;
+
+		default:
+			return EFalse;
+		}
+	}
+
+/** Sets this TSecurityPolicy to a copy of the policy described by the
+supplied descriptor. Such a descriptor can be obtained from
+TSecurityPolicy::Package().
+@see TSecurityPolicy::Package()
+@param aDes A descriptor representing the state of another TSecurityPolicy.
+@return KErrNone, if successful, otherwise one of the other system-wide error
+codes.
+*/
+EXPORT_C TInt TSecurityPolicy::Set(const TDesC8& aDes)
+	{
+	if(aDes.Size() == sizeof(TSecurityPolicy))
+		{
+		*this = *(TSecurityPolicy*)aDes.Ptr();
+		if(Validate())
+			return KErrNone;
+		}
+	// Set failed so set up the policy as an EAlwaysFail case.
+	iType = EAlwaysFail;
+	iCaps[0] = TUint8(ECapability_None);
+	iCaps[1] = TUint8(ECapability_None);
+	iCaps[2] = TUint8(ECapability_None);
+	iSecureId = TUint32(ECapability_None);
+	return KErrArgument;
+	}
+
+/** 
+Constructs a TPtrC8 wrapping the platform security attributes of this
+TSecurityPolicy.  Such a descriptor is suitable for passing across the
+client server boundary.
+
+The format of the descriptor is determined by the first byte which specifies 
+the type of this TSecurityPolicy.  The first byte is one of the constants
+specified in the enum TSecurityPolicy::TType.
+
+For TSecurityPolicy objects of types ETypeC3, ETypeS3, ETypePass or ETypeFail
+the descriptor will contain the following data in the order listed:
+@code
+	TUint8 iType; 		// set to ETypeC3, ETypeS3, ETypePass or ETypeFail
+	TUint8 iCaps[3];
+	TUint32 iSecureId;
+@endcode
+ETypeC3 descriptors will contain capabilities in iCaps but have iSecureId set
+to ECapability_None.  ETypeS3 are similar to ETypeC3 descriptors but will have
+iSecureId set to the secure ID value of the TSecurityPolicy object.
+ETypePass and ETypeFail objects will have values of all of the elements of iCaps
+and iSecureId set to ECapability_None.
+
+For TSecurityPolicy objects of type ETypeV3 the descriptor will contain the
+following data in the order listed:
+@code
+	TUint8 iType;		// set to ETypeV3
+	TUint8 iCaps[3];	// set to the values of 3 capabilities
+	TUint32 iVendorId;	// set to the value of the vendor ID of the TSecurityPolicy
+@endcode
+
+For TSecurityPolicy objects of type ETypeC7 the descriptor will contain the
+following data in the order listed:
+@code
+	TUint8 iType;			// set to ETypeC7
+	TUint8 iCaps[3];		// set to the values of 3 of the objects capabilities
+	TUint8 iExtraCaps[4];	// set to the values of 4 of the objects capabilities
+@endcode
+@see TSecurityPolicy::TType
+@see TSecurityPolicy::Set()
+@return A TPtrC8 wrapping the platform security attributes of this TSecurityPolicy.
+*/
+EXPORT_C TPtrC8 TSecurityPolicy::Package() const
+	{
+	return TPtrC8((TUint8*)(this), sizeof(TSecurityPolicy));
+	}
+
+/** Checks this policy against the supplied SSecurityInfo.
+@param aSecInfo The SSecurityInfo object to check against this TSecurityPolicy.
+@param aMissing A SSecurityInfo object which this method fills with any capabilities or IDs
+				it finds to be missing. This is designed to help generating diagnostic messages.
+@return ETrue if all the requirements of this TSecurityPolicy are met, EFalse
+@panic USER 190 if aSecInfo is an invalid SSecurityInfo object
+otherwise.
+*/
+TBool TSecurityPolicy::CheckPolicy(const SSecurityInfo& aSecInfo, SSecurityInfo& aMissing) const
+	{
+	TBool result = EFalse;
+	//It is thought to be by far the most common case to have 3 or less
+	//capabilities in a policy.  Hence we'll set this for all of them even
+	//though ETypePass doesn't need it.
+	aMissing.iSecureId = 0;
+	aMissing.iVendorId = 0;
+	__ASSERT_COMPILE(SCapabilitySet::ENCapW == 2);
+	aMissing.iCaps[0] = 0;
+	aMissing.iCaps[1] = 0;
+	aMissing.iCaps.AddCapability((TCapability)(iCaps[0]));
+	aMissing.iCaps.AddCapability((TCapability)(iCaps[1]));
+	aMissing.iCaps.AddCapability((TCapability)(iCaps[2]));
+	aMissing.iCaps.Remove(aSecInfo.iCaps);
+	switch(iType)
+		{
+		case ETypeFail:
+			//result already False;
+			break;
+		case ETypePass:
+			result = ETrue;	
+			break;
+		case ETypeC7:
+			aMissing.iCaps.AddCapability((TCapability)(iExtraCaps[0]));
+			aMissing.iCaps.AddCapability((TCapability)(iExtraCaps[1]));
+			aMissing.iCaps.AddCapability((TCapability)(iExtraCaps[2]));
+			aMissing.iCaps.AddCapability((TCapability)(iExtraCaps[3]));
+			aMissing.iCaps.Remove(aSecInfo.iCaps);
+			//It is intentional that there is no break statement here
+		case ETypeC3:
+			if(!aMissing.iCaps.NotEmpty())
+				{
+				result = ETrue;
+				}
+			break;
+		case ETypeS3:
+			if(!aMissing.iCaps.NotEmpty() && iSecureId == aSecInfo.iSecureId)
+				{
+				result = ETrue;
+				}
+			//This else if required to set the aMissing.iCaps secure id for diagnostics.
+			//Doesn't affect pass case.
+			else if(iSecureId != aSecInfo.iSecureId) 
+				{
+				aMissing.iSecureId = iSecureId;
+				}
+			break;
+		case ETypeV3:
+			if(!aMissing.iCaps.NotEmpty() && iVendorId == aSecInfo.iVendorId)
+				{
+				result = ETrue;
+				}
+			else if(iVendorId != aSecInfo.iVendorId)
+				{
+				aMissing.iVendorId = iVendorId;
+				}
+			break;
+		default:
+			Panic(ESecurityPolicyCorrupt);
+			break;
+		}
+	return result;
+	}
+
+#ifndef __TOOLS2__
+#ifndef __KERNEL_MODE__
+
+/** Checks this policy against the platform security attributes of aProcess.
+
+	When a check fails the action taken is determined by the system wide Platform Security
+	configuration. If PlatSecDiagnostics is ON, then a diagnostic message is emitted.
+	If PlatSecEnforcement is OFF, then this function will return ETrue even though the
+	check failed.
+
+@param aProcess The RProcess object to check against this TSecurityPolicy.
+@param aDiagnostic A string that will be emitted along with any diagnostic message
+							that may be issued if the policy check fails.
+							This string must be enclosed in the __PLATSEC_DIAGNOSTIC_STRING macro
+							which enables it to be easily removed from the system.
+@return ETrue if all the requirements of this TSecurityPolicy are met by the
+platform security attributes of aProcess, EFalse otherwise.
+@panic USER 190 if 'this' is an invalid SSecurityInfo object
+*/
+#ifndef __REMOVE_PLATSEC_DIAGNOSTICS__
+EXPORT_C TBool TSecurityPolicy::DoCheckPolicy(RProcess aProcess, const char* aDiagnostic) const
+	{
+	SSecurityInfo missing;
+	TSecurityInfo secInfo(aProcess);
+	TBool pass = CheckPolicy(*((SSecurityInfo*)&secInfo), missing);
+	if(!pass)
+		pass = PlatSec::PolicyCheckFail(aProcess.Handle(),missing,aDiagnostic)==KErrNone;
+	return pass;
+	}
+#else // !__REMOVE_PLATSEC_DIAGNOSTICS__
+EXPORT_C TBool TSecurityPolicy::DoCheckPolicy(RProcess aProcess, const char* /*aDiagnostic*/) const
+	{
+	return DoCheckPolicy(aProcess);
+	}
+#endif // !__REMOVE_PLATSEC_DIAGNOSTICS__
+
+/** Checks this policy against the platform security attributes of aProcess.
+
+	When a check fails the action taken is determined by the system wide Platform Security
+	configuration. If PlatSecDiagnostics is ON, then a diagnostic message is emitted.
+	If PlatSecEnforcement is OFF, then this function will return ETrue even though the
+	check failed.
+
+@param aProcess The RProcess object to check against this TSecurityPolicy.
+@return ETrue if all the requirements of this TSecurityPolicy are met by the
+platform security attributes of aProcess, EFalse otherwise.
+@panic USER 190 if 'this' is an invalid SSecurityInfo object
+*/
+EXPORT_C TBool TSecurityPolicy::DoCheckPolicy(RProcess aProcess) const
+	{
+#ifndef __REMOVE_PLATSEC_DIAGNOSTICS__
+	return DoCheckPolicy(aProcess, NULL);
+#else //__REMOVE_PLATSEC_DIAGNOSTICS__
+	SSecurityInfo missing;
+	TSecurityInfo secInfo(aProcess);
+	TBool pass = CheckPolicy(*((SSecurityInfo*)&secInfo), missing);
+	if(!pass)
+		pass = (PlatSec::EmitDiagnostic() == KErrNone);
+	return pass;
+#endif // !__REMOVE_PLATSEC_DIAGNOSTICS__
+	}
+
+/** Checks this policy against the platform security attributes of the process
+owning aThread.
+
+	When a check fails the action taken is determined by the system wide Platform Security
+	configuration. If PlatSecDiagnostics is ON, then a diagnostic message is emitted.
+	If PlatSecEnforcement is OFF, then this function will return ETrue even though the
+	check failed.
+
+@param aThread The thread whose owning process' platform security attributes
+are to be checked against this TSecurityPolicy.
+@param aDiagnostic A string that will be emitted along with any diagnostic message
+							that may be issued if the policy check fails.
+							This string must be enclosed in the __PLATSEC_DIAGNOSTIC_STRING macro
+							which enables it to be easily removed from the system.
+@return ETrue if all the requirements of this TSecurityPolicy are met by the
+platform security parameters of the owning process of aThread, EFalse otherwise.
+@panic USER 190 if 'this' is an invalid SSecurityInfo object
+*/
+#ifndef __REMOVE_PLATSEC_DIAGNOSTICS__
+EXPORT_C TBool TSecurityPolicy::DoCheckPolicy(RThread aThread, const char* aDiagnostic) const
+	{
+	SSecurityInfo missing;
+	TSecurityInfo secInfo(aThread);
+	TBool pass = CheckPolicy(*((SSecurityInfo*)&secInfo), missing);
+	if(!pass)
+		pass = PlatSec::PolicyCheckFail(aThread.Handle(),missing,aDiagnostic)==KErrNone;
+	return pass;
+	}
+#else //__REMOVE_PLATSEC_DIAGNOSTICS__
+EXPORT_C TBool TSecurityPolicy::DoCheckPolicy(RThread aThread, const char* /*aDiagnostic*/) const
+	{
+	return DoCheckPolicy(aThread);
+	}
+#endif // !__REMOVE_PLATSEC_DIAGNOSTICS__
+
+/** Checks this policy against the platform security attributes of the process
+owning aThread.
+
+	When a check fails the action taken is determined by the system wide Platform Security
+	configuration. If PlatSecDiagnostics is ON, then a diagnostic message is emitted.
+	If PlatSecEnforcement is OFF, then this function will return ETrue even though the
+	check failed.
+
+@param aThread The thread whose owning process' platform security attributes
+are to be checked against this TSecurityPolicy.
+@return ETrue if all the requirements of this TSecurityPolicy are met by the
+platform security parameters of the owning process of aThread, EFalse otherwise.
+@panic USER 190 if 'this' is an invalid SSecurityInfo object
+*/
+EXPORT_C TBool TSecurityPolicy::DoCheckPolicy(RThread aThread) const
+	{
+#ifndef __REMOVE_PLATSEC_DIAGNOSTICS__
+	return DoCheckPolicy(aThread, NULL);
+#else //__REMOVE_PLATSEC_DIAGNOSTICS__
+	SSecurityInfo missing;
+	TSecurityInfo secInfo(aThread);
+	TBool pass = CheckPolicy(*((SSecurityInfo*)&secInfo), missing);
+	if(!pass)
+		pass = (PlatSec::EmitDiagnostic() == KErrNone);
+	return pass;
+#endif // !__REMOVE_PLATSEC_DIAGNOSTICS__
+	}
+
+TInt TSecurityPolicy::CheckPolicy(RSessionBase aSession) const
+	{
+	SSecurityInfo missing;
+	TSecurityInfo secInfo;
+	TInt r = secInfo.Set(aSession);
+	if (r!=KErrNone)
+		return r;
+	TBool pass = CheckPolicy(*((SSecurityInfo*)&secInfo), missing);
+	if(!pass)
+		{
+#ifndef __REMOVE_PLATSEC_DIAGNOSTICS__
+		r = PlatSec::PolicyCheckFail(aSession.Handle(),missing,NULL);
+#else
+		r = PlatSec::EmitDiagnostic();
+#endif // !__REMOVE_PLATSEC_DIAGNOSTICS__
+		}
+	return r;
+	}
+
+/** Checks this policy against the platform security attributes of the process which sent
+the given message.
+
+	When a check fails the action taken is determined by the system wide Platform Security
+	configuration. If PlatSecDiagnostics is ON, then a diagnostic message is emitted.
+	If PlatSecEnforcement is OFF, then this function will return ETrue even though the
+	check failed.
+
+@param aMsgPtr The RMessagePtr2 object to check against this TSecurityPolicy.
+@param aDiagnostic A string that will be emitted along with any diagnostic message
+							that may be issued if the policy check fails.
+							This string must be enclosed in the __PLATSEC_DIAGNOSTIC_STRING macro
+							which enables it to be easily removed from the system.
+@return ETrue if all the requirements of this TSecurityPolicy are met by the
+platform security attributes of aMsg, EFalse otherwise.
+@panic USER 190 if 'this' is an invalid SSecurityInfo object
+*/
+#ifndef __REMOVE_PLATSEC_DIAGNOSTICS__
+EXPORT_C TBool TSecurityPolicy::DoCheckPolicy(RMessagePtr2 aMsgPtr, const char* aDiagnostic) const
+	{
+	SSecurityInfo missing;
+	TSecurityInfo secInfo(aMsgPtr);
+	TBool pass = CheckPolicy(*((SSecurityInfo*)&secInfo), missing);
+	if(!pass)
+		pass = PlatSec::PolicyCheckFail(aMsgPtr,missing,aDiagnostic)==KErrNone;
+	return pass;
+	}
+#else //__REMOVE_PLATSEC_DIAGNOSTICS__
+EXPORT_C TBool TSecurityPolicy::DoCheckPolicy(RMessagePtr2 aMsgPtr, const char* /*aDiagnostic*/) const
+	{
+	return DoCheckPolicy(aMsgPtr);
+	}
+#endif // !__REMOVE_PLATSEC_DIAGNOSTICS__
+
+/** Checks this policy against the platform security attributes of the process which sent
+the given message.
+
+	When a check fails the action taken is determined by the system wide Platform Security
+	configuration. If PlatSecDiagnostics is ON, then a diagnostic message is emitted.
+	If PlatSecEnforcement is OFF, then this function will return ETrue even though the
+	check failed.
+
+@param aMsgPtr The RMessagePtr2 object to check against this TSecurityPolicy.
+@return ETrue if all the requirements of this TSecurityPolicy are met by the
+platform security attributes of aMsg, EFalse otherwise.
+@panic USER 190 if 'this' is an invalid SSecurityInfo object
+*/
+EXPORT_C TBool TSecurityPolicy::DoCheckPolicy(RMessagePtr2 aMsgPtr) const
+	{
+#ifndef __REMOVE_PLATSEC_DIAGNOSTICS__
+	return DoCheckPolicy(aMsgPtr, NULL);
+#else //__REMOVE_PLATSEC_DIAGNOSTICS__
+	SSecurityInfo missing;
+	TSecurityInfo secInfo(aMsgPtr);
+	TBool pass = CheckPolicy(*((SSecurityInfo*)&secInfo), missing);
+	if(!pass)
+		pass = (PlatSec::EmitDiagnostic() == KErrNone);
+	return pass;
+#endif // !__REMOVE_PLATSEC_DIAGNOSTICS__
+	}
+
+/** Checks this policy against the platform security attributes of the process which sent
+the given message.
+
+	When a check fails the action taken is determined by the system wide Platform Security
+	configuration. If PlatSecDiagnostics is ON, then a diagnostic message is emitted.
+	If PlatSecEnforcement is OFF, then this function will return ETrue even though the
+	check failed.
+
+@param aMsgPtr The RMessagePtr2 object to check against this TSecurityPolicy.
+@param aMissing A TSecurityInfo object which this method fills with any capabilities or IDs
+				it finds to be missing. 
+@param aDiagnostic A string that will be emitted along with any diagnostic message
+							that may be issued if the policy check fails.
+							This string must be enclosed in the __PLATSEC_DIAGNOSTIC_STRING macro
+							which enables it to be easily removed from the system.
+@return ETrue if all the requirements of this TSecurityPolicy are met by the
+platform security attributes of aMsg, EFalse otherwise.
+@panic USER 190 if 'this' is an invalid SSecurityInfo object
+*/
+#ifndef __REMOVE_PLATSEC_DIAGNOSTICS__
+TBool TSecurityPolicy::DoCheckPolicy(RMessagePtr2 aMsgPtr, TSecurityInfo& aMissing, const char* aDiagnostic) const
+	{
+	TSecurityInfo secInfo(aMsgPtr);
+	TBool pass = CheckPolicy(*((SSecurityInfo*)&secInfo), *((SSecurityInfo*)&aMissing));
+	if(!pass)
+		pass = PlatSec::PolicyCheckFail(aMsgPtr,*((SSecurityInfo*)&aMissing),aDiagnostic)==KErrNone;
+	return pass;
+	}
+#endif // !__REMOVE_PLATSEC_DIAGNOSTICS__
+
+/** Checks this policy against the platform security attributes of the process which sent
+the given message.
+
+	When a check fails the action taken is determined by the system wide Platform Security
+	configuration. If PlatSecDiagnostics is ON, then a diagnostic message is emitted.
+	If PlatSecEnforcement is OFF, then this function will return ETrue even though the
+	check failed.
+
+@param aMsgPtr The RMessagePtr2 object to check against this TSecurityPolicy.
+@param aMissing A TSecurityInfo object which this method fills with any capabilities or IDs
+				it finds to be missing. 
+@return ETrue if all the requirements of this TSecurityPolicy are met by the
+platform security attributes of aMsg, EFalse otherwise.
+@panic USER 190 if 'this' is an invalid SSecurityInfo object
+*/
+TBool TSecurityPolicy::DoCheckPolicy(RMessagePtr2 aMsgPtr, TSecurityInfo& aMissing) const
+	{
+#ifndef __REMOVE_PLATSEC_DIAGNOSTICS__
+	return DoCheckPolicy(aMsgPtr, aMissing, NULL);
+#else //__REMOVE_PLATSEC_DIAGNOSTICS__
+	TSecurityInfo secInfo(aMsgPtr);
+	TBool pass = CheckPolicy(*((SSecurityInfo*)&secInfo), *((SSecurityInfo*)&aMissing));
+	if(!pass)
+		pass = (PlatSec::EmitDiagnostic() == KErrNone);
+	return pass;
+#endif // !__REMOVE_PLATSEC_DIAGNOSTICS__
+	}
+
+/** Checks this policy against the platform security attributes of this process' creator.
+
+	When a check fails the action taken is determined by the system wide Platform Security
+	configuration. If PlatSecDiagnostics is ON, then a diagnostic message is emitted.
+	If PlatSecEnforcement is OFF, then this function will return ETrue even though the
+	check failed.
+
+@param aProcess The RProcess object to check against this TSecurityPolicy.
+@param aDiagnostic A string that will be emitted along with any diagnostic message
+							that may be issued if the policy check fails.
+							This string must be enclosed in the __PLATSEC_DIAGNOSTIC_STRING macro
+							which enables it to be easily removed from the system.
+@return ETrue if all the requirements of this TSecurityPolicy are met by the
+platform security attributes of this process' creator, EFalse otherwise.
+@panic USER 190 if 'this' is an invalid SSecurityInfo object
+*/
+#ifndef __REMOVE_PLATSEC_DIAGNOSTICS__
+EXPORT_C TBool TSecurityPolicy::DoCheckPolicyCreator(const char* aDiagnostic) const
+	{
+	SSecurityInfo missing;
+	TSecurityInfo secInfo;
+	secInfo.SetToCreatorInfo();
+	TBool pass = CheckPolicy(*((SSecurityInfo*)&secInfo), missing);
+	if(!pass)
+		pass = PlatSec::CreatorPolicyCheckFail(missing,aDiagnostic)==KErrNone;
+	return pass;
+	}
+#else // !__REMOVE_PLATSEC_DIAGNOSTICS__
+EXPORT_C TBool TSecurityPolicy::DoCheckPolicyCreator(const char* /*aDiagnostic*/) const
+	{
+	return DoCheckPolicyCreator();
+	}
+#endif // !__REMOVE_PLATSEC_DIAGNOSTICS__
+
+/** Checks this policy against the platform security attributes of this process' creator.
+
+	When a check fails the action taken is determined by the system wide Platform Security
+	configuration. If PlatSecDiagnostics is ON, then a diagnostic message is emitted.
+	If PlatSecEnforcement is OFF, then this function will return ETrue even though the
+	check failed.
+
+@param aProcess The RProcess object to check against this TSecurityPolicy.
+@return ETrue if all the requirements of this TSecurityPolicy are met by the
+platform security attributes of this process' creator, EFalse otherwise.
+@panic USER 190 if 'this' is an invalid SSecurityInfo object
+*/
+EXPORT_C TBool TSecurityPolicy::DoCheckPolicyCreator() const
+	{
+#ifndef __REMOVE_PLATSEC_DIAGNOSTICS__
+	return DoCheckPolicyCreator(NULL);
+#else //__REMOVE_PLATSEC_DIAGNOSTICS__
+	SSecurityInfo missing;
+	TSecurityInfo secInfo;
+	secInfo.SetToCreatorInfo();
+	TBool pass = CheckPolicy(*((SSecurityInfo*)&secInfo), missing);
+	if(!pass)
+		pass = (PlatSec::EmitDiagnostic() == KErrNone);
+	return pass;
+#endif // !__REMOVE_PLATSEC_DIAGNOSTICS__
+	}
+
+#else //__KERNEL_MODE__
+
+/** Checks this policy against the platform security attributes of aProcess.
+
+	When a check fails the action taken is determined by the system wide Platform Security
+	configuration. If PlatSecDiagnostics is ON, then a diagnostic message is emitted.
+	If PlatSecEnforcement is OFF, then this function will return ETrue even though the
+	check failed.
+
+@param aProcess The DProcess object to check against this TSecurityPolicy.
+@param aDiagnostic A string that will be emitted along with any diagnostic message
+							that may be issued if the policy check fails.
+							This string must be enclosed in the __PLATSEC_DIAGNOSTIC_STRING macro
+							which enables it to be easily removed from the system.
+@return ETrue if all the requirements of this TSecurityPolicy are met by the
+platform security attributes of aProcess, EFalse otherwise.
+@panic KERN-COMMON 190 if 'this' is an invalid SSecurityInfo object
+*/
+#ifndef __REMOVE_PLATSEC_DIAGNOSTICS__
+EXPORT_C TBool TSecurityPolicy::DoCheckPolicy(DProcess* aProcess, const char* aDiagnostic) const
+	{
+	SSecurityInfo missing;
+	TBool pass = CheckPolicy(aProcess->iS, missing);
+	if(!pass)
+		pass = PlatSec::PolicyCheckFail(aProcess,missing,aDiagnostic)==KErrNone;
+	return pass;
+	}
+#else //__REMOVE_PLATSEC_DIAGNOSTICS__
+EXPORT_C TBool TSecurityPolicy::DoCheckPolicy(DProcess* aProcess, const char* /*aDiagnostic*/) const
+	{
+	return DoCheckPolicy(aProcess);
+	}
+#endif // !__REMOVE_PLATSEC_DIAGNOSTICS__
+
+/** Checks this policy against the platform security attributes of aProcess.
+
+	When a check fails the action taken is determined by the system wide Platform Security
+	configuration. If PlatSecDiagnostics is ON, then a diagnostic message is emitted.
+	If PlatSecEnforcement is OFF, then this function will return ETrue even though the
+	check failed.
+
+@param aProcess The DProcess object to check against this TSecurityPolicy.
+@return ETrue if all the requirements of this TSecurityPolicy are met by the
+platform security attributes of aProcess, EFalse otherwise.
+@panic KERN-COMMON 190 if 'this' is an invalid SSecurityInfo object
+*/
+EXPORT_C TBool TSecurityPolicy::DoCheckPolicy(DProcess* aProcess) const
+	{
+#ifndef __REMOVE_PLATSEC_DIAGNOSTICS__
+	return DoCheckPolicy(aProcess, NULL);
+#else //__REMOVE_PLATSEC_DIAGNOSTICS__
+	SSecurityInfo missing;
+	TBool pass = CheckPolicy(aProcess->iS, missing);
+	if(!pass)
+		pass = (PlatSec::EmitDiagnostic() == KErrNone);
+	return pass;
+#endif // !__REMOVE_PLATSEC_DIAGNOSTICS__
+	}
+
+/** Checks this policy against the platform security attributes of the process
+owning aThread.
+
+	When a check fails the action taken is determined by the system wide Platform Security
+	configuration. If PlatSecDiagnostics is ON, then a diagnostic message is emitted.
+	If PlatSecEnforcement is OFF, then this function will return ETrue even though the
+	check failed.
+
+@param aThread The thread whose owning process' platform security attributes
+are to be checked against this TSecurityPolicy.
+@param aDiagnostic A string that will be emitted along with any diagnostic message
+							that may be issued if the policy check fails.
+							This string must be enclosed in the __PLATSEC_DIAGNOSTIC_STRING macro
+							which enables it to be easily removed from the system.
+@return ETrue if all the requirements of this TSecurityPolicy are met by the
+platform security parameters of the owning process of aThread, EFalse otherwise.
+@panic KERN-COMMON 190 if 'this' is an invalid SSecurityInfo object
+*/
+#ifndef __REMOVE_PLATSEC_DIAGNOSTICS__
+EXPORT_C TBool TSecurityPolicy::DoCheckPolicy(DThread* aThread, const char* aDiagnostic) const
+	{
+	SSecurityInfo missing;
+	TBool pass = CheckPolicy(aThread->iOwningProcess->iS, missing);
+	if(!pass)
+		pass = PlatSec::PolicyCheckFail(aThread,missing,aDiagnostic)==KErrNone;
+	return pass;
+	}
+#else //__REMOVE_PLATSEC_DIAGNOSTICS__
+EXPORT_C TBool TSecurityPolicy::DoCheckPolicy(DThread* aThread, const char* /*aDiagnostic*/) const
+	{
+	return DoCheckPolicy(aThread);
+	}
+#endif // !__REMOVE_PLATSEC_DIAGNOSTICS__
+
+/** Checks this policy against the platform security attributes of the process
+owning aThread.
+
+	When a check fails the action taken is determined by the system wide Platform Security
+	configuration. If PlatSecDiagnostics is ON, then a diagnostic message is emitted.
+	If PlatSecEnforcement is OFF, then this function will return ETrue even though the
+	check failed.
+
+@param aThread The thread whose owning process' platform security attributes
+are to be checked against this TSecurityPolicy.
+@return ETrue if all the requirements of this TSecurityPolicy are met by the
+platform security parameters of the owning process of aThread, EFalse otherwise.
+@panic KERN-COMMON 190 if 'this' is an invalid SSecurityInfo object
+*/
+EXPORT_C TBool TSecurityPolicy::DoCheckPolicy(DThread* aThread) const
+	{
+#ifndef __REMOVE_PLATSEC_DIAGNOSTICS__
+	return DoCheckPolicy(aThread, NULL);
+#else //__REMOVE_PLATSEC_DIAGNOSTICS__
+	SSecurityInfo missing;
+	TBool pass = CheckPolicy(aThread->iOwningProcess->iS, missing);
+	if(!pass)
+		pass = (PlatSec::EmitDiagnostic() == KErrNone);
+	return pass;
+#endif // !__REMOVE_PLATSEC_DIAGNOSTICS__
+	}
+
+#endif // !__KERNEL_MODE__
+
+
+#ifndef __KERNEL_MODE__
+
+EXPORT_C TInt PlatSec::ConfigSetting(TConfigSetting aSetting)
+	{
+	TUint32 flags = Exec::KernelConfigFlags();
+	switch(aSetting)
+		{
+		case EPlatSecEnforcement:
+			flags &= EKernelConfigPlatSecEnforcement;
+			break;
+		case EPlatSecDiagnotics:
+#ifndef __REMOVE_PLATSEC_DIAGNOSTICS__
+			flags &= EKernelConfigPlatSecDiagnostics;
+#else //__REMOVE_PLATSEC_DIAGNOSTICS__
+			flags=0;
+#endif // !__REMOVE_PLATSEC_DIAGNOSTICS__
+			break;
+		case EPlatSecProcessIsolation:
+			flags &= EKernelConfigPlatSecProcessIsolation;
+			break;
+		case EPlatSecEnforceSysBin:
+			flags &= EKernelConfigPlatSecEnforceSysBin;
+			break;
+		case EPlatSecLocked:
+			flags &= EKernelConfigPlatSecLocked;
+			break;
+		default:
+			flags = 0;
+			break;
+		}
+	if(flags)
+		flags = 1;
+	return flags;
+	}
+
+EXPORT_C TBool PlatSec::IsCapabilityEnforced(TCapability aCapability)
+	{
+	if(!((TCapabilitySet&)AllSupportedCapabilities).HasCapability(aCapability))
+		return EFalse;
+
+	SCapabilitySet disabled;
+	Exec::DisabledCapabilities(disabled);
+	if(((TCapabilitySet&)disabled).HasCapability(aCapability))
+		return EFalse;
+
+	return PlatSec::ConfigSetting(EPlatSecEnforcement);
+	}
+
+#endif // Not __KERNEL_MODE__
+#endif // __TOOLS2__
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32/euser/cbase/ub_array.cpp	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,1480 @@
+// Copyright (c) 1994-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32\euser\cbase\ub_array.cpp
+// 
+//
+
+#include "ub_std.h"
+
+struct SVarRec
+	{
+	TInt len;
+	TAny *data;
+	};
+
+NONSHARABLE_CLASS(TSwapArray) : public TSwap
+	{
+public:
+	inline TSwapArray(CBufBase *aBase,TInt aRecordLength);
+	TUint8 *At(TInt anIndex) const;
+	virtual void Swap(TInt aLeft,TInt aRight) const;
+private:
+	CBufBase *iBase;
+	TInt iLength;
+	};
+inline TSwapArray::TSwapArray(CBufBase *aBase,TInt aRecordLength)
+	: iBase(aBase),iLength(aRecordLength)
+	{}
+
+TUint8 *TSwapArray::At(TInt anIndex) const
+//
+// Return a pointer to the array element
+//
+	{
+	
+	return((TUint8 *)iBase->Ptr(anIndex*iLength).Ptr());
+	}
+
+void TSwapArray::Swap(TInt aLeft,TInt aRight) const
+//
+// Swap two elements of the array.
+//
+	{
+	
+	Mem::Swap(At(aLeft),At(aRight),iLength);
+	}
+
+
+
+
+EXPORT_C TKeyArrayFix::TKeyArrayFix(TInt anOffset,TKeyCmpText aType)
+	: TKey(anOffset,aType)
+/**
+Constructs the characteristics of a descriptor key.
+
+No length value is passed as this is taken from the descriptor type key.
+
+@param anOffset The offset of the key from the start of an array element.
+@param aType    An enumeration which defines the type of comparison to be made 
+                between two descriptor keys.
+@see TKeyCmpText
+*/
+	{}
+
+
+
+
+EXPORT_C TKeyArrayFix::TKeyArrayFix(TInt anOffset,TKeyCmpText aType,TInt aLength)
+	: TKey(anOffset,aType,aLength)
+/**
+Constructs the characteristics of a text key.
+
+@param anOffset The offset of the key from the start of an array element.
+@param aType    An enumeration which defines the type of comparison to be made 
+                between two text keys.
+@param aLength The length of the text key.
+
+@see TKeyCmpText
+*/
+	{}
+
+
+
+
+EXPORT_C TKeyArrayFix::TKeyArrayFix(TInt anOffset,TKeyCmpNumeric aType)
+	: TKey(anOffset,aType)
+/**
+Constructs the characteristics of a numeric key.
+
+@param anOffset The offset of the key from the start of an array element.
+@param aType    An enumeration which defines the type of the numeric key.
+
+@see TKeyCmpNumeric
+*/
+	{}
+
+
+
+
+EXPORT_C void TKeyArrayFix::Set(CBufBase *aBase,TInt aRecordLength)
+//
+// Set the base and record length
+//
+	{
+
+	iBase=aBase;
+	iRecordLength=aRecordLength;
+	}
+
+EXPORT_C TAny *TKeyArrayFix::At(TInt anIndex) const
+//
+// Return an address in the array.
+//
+	{
+
+	if (anIndex==KIndexPtr)
+		return((TUint8 *)iPtr+iKeyOffset); 			
+	return((TAny *)(iBase->Ptr(anIndex*iRecordLength).Ptr()+iKeyOffset));
+	}
+
+
+
+
+EXPORT_C TKeyArrayVar::TKeyArrayVar(TInt anOffset,TKeyCmpText aType)
+	: TKey(anOffset,aType)
+/**
+Constructs the characteristics of a descriptor key.
+
+No length value is passed as this is taken from the descriptor type key.
+
+@param anOffset The offset of the key from the start of an array element.
+@param aType    An enumeration which defines the type of comparison to be made 
+                between two descriptor keys.
+                
+@see TKeyCmpText
+*/
+	{}
+
+
+
+
+EXPORT_C TKeyArrayVar::TKeyArrayVar(TInt anOffset,TKeyCmpText aType,TInt aLength)
+	: TKey(anOffset,aType,aLength)
+/**
+Constructs the characteristics of a text key.
+
+@param anOffset The offset of the key from the start of an array element.
+@param aType    An enumeration which defines the type of comparison to be made 
+                between two text keys.
+@param aLength  The length of the text key.
+
+@see TKeyCmpText
+*/
+	{}
+
+
+
+
+EXPORT_C TKeyArrayVar::TKeyArrayVar(TInt anOffset,TKeyCmpNumeric aType)
+	: TKey(anOffset,aType)
+/**
+Constructs the characteristics of a numeric key.
+
+@param anOffset The offset of the key from the start of an array element.
+@param aType    An enumeration which defines the type of the numeric key.
+
+@see TKeyCmpNumeric
+*/
+	{}
+
+
+
+
+EXPORT_C void TKeyArrayVar::Set(CBufBase *aBase)
+//
+// Set the private variable iBase to aBase.
+//
+	{
+
+	iBase=aBase;
+	}
+
+EXPORT_C TAny *TKeyArrayVar::At(TInt anIndex) const
+//
+// Return an address in the array.
+//
+	{
+
+	if (anIndex==KIndexPtr)
+		return((TUint8 *)iPtr+iKeyOffset);   
+	SVarRec *pV=(SVarRec *)iBase->Ptr(anIndex*sizeof(SVarRec)).Ptr();
+	return(((TUint8 *)pV->data)+iKeyOffset);
+	}
+
+
+
+
+EXPORT_C TKeyArrayPak::TKeyArrayPak(TInt anOffset,TKeyCmpText aType)
+	: TKeyArrayVar(anOffset,aType)
+/**
+Constructs the characteristics of a descriptor key.
+
+No length value is passed as this is taken from the descriptor type key.
+
+@param anOffset The offset of the key from the start of an array element.
+@param aType    An enumeration which defines the type of comparison to be made 
+                between two descriptor keys.
+                
+@see TKeyCmpText
+*/
+	{}
+
+
+
+
+EXPORT_C TKeyArrayPak::TKeyArrayPak(TInt anOffset,TKeyCmpText aType,TInt aLength)
+	: TKeyArrayVar(anOffset,aType,aLength)
+/**
+Constructs the characteristics of a text key.
+
+@param anOffset The offset of the key from the start of an array element.
+@param aType    An enumeration which defines the type of comparison to be made 
+                between two text keys.
+@param aLength  The length of the text key.
+
+@see TKeyCmpText
+*/
+	{}
+
+
+
+
+EXPORT_C TKeyArrayPak::TKeyArrayPak(TInt anOffset,TKeyCmpNumeric aType)
+	: TKeyArrayVar(anOffset,aType)
+/**
+Constructs the characteristics of a numeric key.
+
+@param anOffset The offset of the key from the start of an array element.
+@param aType    An enumeration which defines the type of the numeric key.
+
+@see TKeyCmpNumeric
+*/
+	{}
+
+
+
+
+EXPORT_C void TKeyArrayPak::Set(CBufBase *aBase)
+//
+// Set the private variable iBase to aBase.
+//
+	{
+
+	iBase=aBase;
+	iCacheIndex=0;
+	iCacheOffset=0;
+	}
+
+EXPORT_C TAny *TKeyArrayPak::At(TInt anIndex) const
+//
+// Return a pointer to the data in the record with index anIndex.
+//
+	{
+//
+// When anIndex is equal to KIndexPtr (HighValues) this means that we should return the address of
+// the iPtr+iKeyOffset which will have been set up by the TKeyArrayPak constructor.
+//
+	if (anIndex==KIndexPtr)
+		return((TUint8 *)iPtr+iKeyOffset); 
+//
+// Otherwise get the offset into the buffer of the record with index anIndex.
+//
+	TInt offset=0;
+ 	TInt curIndex=0;
+	if (iCacheIndex<=anIndex)
+		{
+		curIndex=iCacheIndex;
+		offset=iCacheOffset;
+		}
+	TAny *pRecord=(TAny *)iBase->Ptr(offset).Ptr();
+	while (curIndex<anIndex)
+		{
+		TInt lenData=(*(TInt *)pRecord);
+		offset+=Align4(lenData)+sizeof(TUint);
+		pRecord=(TAny *)iBase->Ptr(offset).Ptr();
+		curIndex++;
+		}
+	(TInt &)iCacheIndex=anIndex;
+	(TInt &)iCacheOffset=offset;
+	TAny *pData=(TAny *)((TInt *)pRecord + 1);
+ 	return((TUint8 *)pData+iKeyOffset);
+	}
+
+EXPORT_C CArrayFixBase::CArrayFixBase(TBufRep aRep,TInt aRecordLength,TInt aGranularity)
+//
+// Constructor
+//
+/**
+@internalComponent
+*/
+	{
+
+	__ASSERT_ALWAYS(aRecordLength>0,Panic(EArrayFixInvalidLength));
+	__ASSERT_ALWAYS(aGranularity>0,Panic(EArrayFixInvalidGranularity));
+//	iCount=0;
+//	iBase=NULL;
+	iLength=aRecordLength;
+	iGranularity=aGranularity;
+	iCreateRep=aRep;
+	}
+
+EXPORT_C CArrayFixBase::~CArrayFixBase()
+/**
+Destructor.
+
+This frees all resources owned by the object, prior to its destruction.
+*/
+	{
+
+	delete iBase;
+	}
+
+EXPORT_C void CArrayFixBase::Compress()
+/**
+Compresses the array.
+
+The function removes the excess space from the array buffer. The effect is 
+to reduce the memory allocated to the array buffer so that it is just
+sufficient to contain the elements of the array. This applies to both flat
+and segmented array buffers.
+
+If the array is empty, then the memory allocated to the array buffer is freed.
+*/
+	{
+
+	if (iBase)
+		iBase->Compress();
+	}
+
+EXPORT_C void CArrayFixBase::Reset()
+/**
+Deletes all elements from the array and frees the memory allocated 
+to the array buffer.
+*/
+	{
+
+	iCount=0;
+	if (iBase)
+		iBase->Reset();
+	}
+
+EXPORT_C TInt CArrayFixBase::Sort(TKeyArrayFix &aKey)
+/**
+Sorts the elements of the array into key sequence.
+
+@param aKey The key object defining the properties of the key. 
+
+@return KErrNone if the sort completes successfully.
+        KErrGeneral if the stack overflows
+*/
+	{
+
+	if (iCount==0)
+		return KErrNone;
+	TSwapArray aSwap(iBase,iLength);
+	SetKey(aKey);
+	return(User::QuickSort(iCount,aKey,aSwap));
+	}
+
+EXPORT_C TAny *CArrayFixBase::At(TInt anIndex) const
+//
+// Index into the array.
+//
+/**
+@internalComponent
+*/
+	{
+
+	__ASSERT_ALWAYS(anIndex>=0 && anIndex<iCount,Panic(EArrayIndexOutOfRange));
+	return((TAny *)iBase->Ptr(anIndex*iLength).Ptr());
+	}
+
+EXPORT_C TAny *CArrayFixBase::End(TInt anIndex) const
+//
+// Return a pointer past contiguous elements starting at anIndex.
+//
+/**
+@internalComponent
+*/
+	{
+
+	__ASSERT_ALWAYS(anIndex>=0 && anIndex<=iCount,Panic(EArrayIndexOutOfRange));
+	TPtr8 p=iBase->Ptr(anIndex*iLength);
+	return((TAny *)(p.Ptr()+p.Length()));
+	}
+
+EXPORT_C TAny *CArrayFixBase::Back(TInt anIndex) const
+//
+// Return a pointer to contiguous elements before anIndex.
+//
+/**
+@internalComponent
+*/
+	{
+
+	__ASSERT_ALWAYS(anIndex>=0 && anIndex<=iCount,Panic(EArrayIndexOutOfRange));
+	TPtr8 p=iBase->BackPtr(anIndex*iLength);
+	return((TAny *)p.Ptr());
+	}
+
+EXPORT_C void CArrayFixBase::Delete(TInt anIndex)
+/**
+Deletes a single element from the array at a specified position.
+
+Deleting elements from the array does not cause the array buffer to be
+automatically compressed. Call CArrayFixBase::Compress() to return excess space
+to the heap.
+
+@param anIndex The position within the array at which to delete the element, 
+               This is a value relative to zero. 
+
+@panic E32USER-CBase 21, if anIndex is negative or is greater 
+                         than or equal to the number of elements currently
+                         in the array.
+@see CArrayFixBase::Compress
+*/
+	{
+
+	Delete(anIndex,1);
+	}
+
+EXPORT_C void CArrayFixBase::Delete(TInt anIndex,TInt aCount)
+/**
+Deletes one or more contiguous elements from the array, starting at a specific 
+position.
+
+Deleting elements from the array does not cause the array buffer to be
+automatically compressed. Call CArrayFixBase::Compress() to return excess space
+to the heap.
+
+@param anIndex The position within the array from where deletion of elements 
+               is to start. The position is relative to zero, i.e. zero implies
+               that elements, starting with the first, are deleted from the
+               array.
+                
+@param aCount  The number of contiguous elements to be deleted from the array. 
+  
+@panic E32USER-CBase 21, if anIndex is negative, or is greater than or equal to
+                         the number of elements currently in the array.
+@panic E32USER-CBase 22, if aCount is negative.
+@panic E32USER-CBase 29, if the sum of anIndex and aCount is greater than or equal
+                         to the number of elements currently in the array.
+*/
+	{
+
+	if (aCount==0)
+		return;
+	__ASSERT_ALWAYS(aCount>0,Panic(EArrayCountNegative));
+	__ASSERT_ALWAYS(anIndex>=0 && anIndex<iCount,Panic(EArrayIndexOutOfRange));
+	__ASSERT_ALWAYS(anIndex+aCount<=iCount,Panic(EArrayCountTooBig));
+	iBase->Delete(anIndex*iLength,aCount*iLength);
+	iCount-=aCount;
+	}
+
+EXPORT_C TAny *CArrayFixBase::ExpandL(TInt anIndex)
+//
+// Expand the array to make room for a new record at anIndex.
+//
+/**
+@internalComponent
+*/
+	{
+
+	if (iBase==NULL)
+		iBase=(*iCreateRep)(iLength*iGranularity);
+	__ASSERT_ALWAYS(anIndex>=0 && anIndex<=iCount,Panic(EArrayIndexOutOfRange));
+	iBase->ExpandL(anIndex*iLength,iLength);
+	++iCount;
+	return((TAny *)iBase->Ptr(anIndex*iLength).Ptr());
+	}
+
+EXPORT_C TInt CArrayFixBase::Find(const TAny *aPtr,TKeyArrayFix &aKey,TInt &anIndex) const
+//
+// Find in the array using a sequential search.
+//
+/**
+@internalComponent
+*/
+	{
+
+	if (iCount==0)
+	    {
+	    anIndex=0;
+		return(-1);
+		}
+	aKey.SetPtr(aPtr);
+	SetKey(aKey);
+	TInt r=1;
+	TInt i=0;
+	while (i<Count())
+		{
+		TInt j=aKey.Compare(i,KIndexPtr);
+		if (j==0)
+			{
+			r=j;
+			break;
+			}
+		i++;
+		}
+	anIndex=i;
+	return(r);
+	}
+
+EXPORT_C TInt CArrayFixBase::FindIsq(const TAny *aPtr,TKeyArrayFix &aKey,TInt &anIndex) const
+//
+// Find in the array using a binary search.
+//
+/**
+@internalComponent
+*/
+	{
+
+	if (iCount==0)
+	    {
+	    anIndex=0;
+		return(-1);
+		}
+	aKey.SetPtr(aPtr);
+	SetKey(aKey);
+    return(User::BinarySearch(Count(),aKey,anIndex));
+	}
+
+EXPORT_C void CArrayFixBase::InsertL(TInt anIndex,const TAny *aPtr)
+//													  
+// Insert a record into the array.
+//
+/**
+@internalComponent
+*/
+	{
+
+	InsertL(anIndex,aPtr,1);
+	}
+
+EXPORT_C void CArrayFixBase::InsertL(TInt anIndex,const TAny *aPtr,TInt aCount)
+//													  
+// Insert aCount records into the array.
+//
+/**
+@internalComponent
+*/
+	{
+
+	if (aCount==0)
+		return;
+	if (iBase==NULL)
+		iBase=(*iCreateRep)(iLength*iGranularity);
+	__ASSERT_ALWAYS(aCount>0,Panic(EArrayCountNegative2));
+	__ASSERT_ALWAYS(anIndex>=0 && anIndex<=iCount,Panic(EArrayIndexOutOfRange));
+	iBase->InsertL(anIndex*iLength,aPtr,aCount*iLength);
+	iCount+=aCount;
+	}
+
+EXPORT_C void CArrayFixBase::InsertRepL(TInt anIndex,const TAny *aPtr,TInt aReplicas)
+//													  
+// Insert aReplicas copies  of a record into the array.
+//
+/**
+@internalComponent
+*/
+	{
+
+	if (aReplicas==0)
+		return;
+	if (iBase==NULL)
+		iBase=(*iCreateRep)(iLength*iGranularity);
+	__ASSERT_ALWAYS(aReplicas>0,Panic(EArrayReplicasNegative));
+	__ASSERT_ALWAYS(anIndex>=0 && anIndex<=iCount,Panic(EArrayIndexOutOfRange));
+	TInt pos=anIndex*iLength;
+	TInt len=aReplicas*iLength;
+	iBase->ExpandL(pos,len);
+	for (TInt end=pos+len;pos<end;pos+=iLength)
+		iBase->Write(pos,aPtr,iLength);
+	iCount+=aReplicas;
+	}
+
+EXPORT_C TInt CArrayFixBase::InsertIsqL(const TAny *aPtr,TKeyArrayFix &aKey)
+//
+// Insert in sequence, no duplicates allowed.
+//
+/**
+@internalComponent
+*/
+	{
+
+	TInt i=0;
+	TInt r=FindIsq(aPtr,aKey,i);
+	if (r==0) // a duplicate, leave
+		User::Leave(KErrAlreadyExists);
+	InsertL(i,aPtr,1);
+	return(i);
+	}
+
+EXPORT_C TInt CArrayFixBase::InsertIsqAllowDuplicatesL(const TAny *aPtr,TKeyArrayFix &aKey)
+//
+// Insert in sequence, allow duplicates.
+//
+/**
+@internalComponent
+*/
+	{
+
+	TInt i=0;
+	TInt r=FindIsq(aPtr,aKey,i);
+	if (r==0) // a duplicate, insert after
+		++i;
+	InsertL(i,aPtr,1);
+	return(i);
+	}
+
+EXPORT_C void CArrayFixBase::ResizeL(TInt aCount,const TAny *aPtr)
+//
+// Resize the array to contain aCount records, copying a record into any new slots.
+//
+/**
+@internalComponent
+*/
+	{
+
+	__ASSERT_ALWAYS(aCount>=0,Panic(EArrayCountNegative3));
+	TInt excess=iCount-aCount;
+	if (excess>0)
+		Delete(aCount,excess);
+	else
+		InsertRepL(iCount,aPtr,-excess);
+	}
+
+EXPORT_C void CArrayFixBase::SetReserveFlatL(TInt aCount) 
+//
+// Reserve space to contain aCount items. Only for flat arrays!
+//
+/**
+@internalComponent
+*/
+	{
+
+	__ASSERT_ALWAYS(aCount>=iCount,Panic(EArrayReserveTooSmall));
+	if (iBase==NULL)
+		iBase=(*iCreateRep)(iLength*iGranularity);
+	((CBufFlat*)iBase)->SetReserveL(iLength*aCount);		// dodgy cast. Can we assert the type?
+	}
+
+EXPORT_C void CArrayFixBase::SetKey(TKeyArrayFix &aKey) const
+//
+// Set the key data.
+//
+/**
+@internalComponent
+*/
+	{
+
+	aKey.Set(iBase,iLength);
+	}
+
+EXPORT_C TInt CArrayFixBase::CountR(const CBase *aPtr)
+//
+// Return the number of items in the array.
+//
+/**
+@internalComponent
+*/
+	{
+
+	return(((CArrayFixBase *)aPtr)->Count());
+	}
+
+EXPORT_C const TAny *CArrayFixBase::AtR(const CBase *aPtr,TInt anIndex)
+//
+// Return the address of an item in the array.
+//
+/**
+@internalComponent
+*/
+	{
+
+	return(((CArrayFixBase *)aPtr)->At(anIndex));
+	}
+
+EXPORT_C CArrayVarBase::CArrayVarBase(TBufRep aRep,TInt aGranularity)
+//
+// Constructor
+//
+/**
+@internalComponent
+*/
+	{
+
+	__ASSERT_ALWAYS(aGranularity>0,Panic(EArrayVarInvalidGranularity));
+//	iCount=0;
+//	iBase=NULL;
+	iGranularity=aGranularity;
+	iCreateRep=aRep;
+	}
+
+EXPORT_C CArrayVarBase::~CArrayVarBase()
+/**
+Destructor.
+
+Frees all resources owned by the object, prior to its destruction.
+*/
+	{
+
+	if (iBase)
+		{
+		Reset();
+		delete iBase;
+		}
+	}
+
+EXPORT_C TInt CArrayVarBase::Length(TInt anIndex) const
+/**
+Gets the length of a specific element.
+
+@param anIndex The position of the element within the array. The position 
+               is relative to zero, (i.e. the first element in the array is
+               at position 0). 
+
+@return The length of the element at position anIndex.
+
+@panic E32USER-CBase 21, if anIndex is negative or is greater than the number
+       of elements currently in the array.
+*/
+	{
+
+	__ASSERT_ALWAYS(anIndex>=0 && anIndex<iCount,Panic(EArrayIndexOutOfRange));
+	return(((SVarRec *)iBase->Ptr(anIndex*sizeof(SVarRec)).Ptr())->len);
+	}
+
+EXPORT_C void CArrayVarBase::Compress()
+/**
+Removes excess space from the array buffer.
+
+The effect is to reduce the memory allocated to the array buffer so that it is
+just sufficient to represent the array. This applies to both flat and segmented
+array buffers.
+
+If the array is empty, then the memory allocated to the array buffer is freed.
+*/
+	{
+
+	if (iBase)
+		iBase->Compress();
+	}
+
+EXPORT_C void CArrayVarBase::Reset()
+/**
+Deletes all elements from the array and frees the memory allocated to the array 
+buffer.
+
+As each element of a variable array is contained within its own heap cell, 
+this function has the effect of freeing all such cells.
+*/
+	{
+
+	Delete(0,Count());
+	}
+
+EXPORT_C TInt CArrayVarBase::Sort(TKeyArrayVar &aKey)
+/**
+Sorts the elements of the array into key sequence.
+
+@param aKey The key object defining the properties of the key. 
+
+@return KErrNone, if the sort completes successfully.
+        KErrGeneral, if the stack overflows.
+*/
+	{
+
+	if (iCount==0)
+		return KErrNone;
+	TSwapArray aSwap(iBase,sizeof(SVarRec));
+	SetKey(aKey);
+	return(User::QuickSort(iCount,aKey,aSwap));
+	}
+
+EXPORT_C TAny * CArrayVarBase::At(TInt anIndex) const
+//
+// Return a pointer to the data in the array.
+//
+/**
+@internalComponent
+*/
+	{
+
+	__ASSERT_ALWAYS(anIndex>=0 && anIndex<iCount,Panic(EArrayIndexOutOfRange));
+	return(((SVarRec *)iBase->Ptr(anIndex*sizeof(SVarRec)).Ptr())->data);
+	}
+
+EXPORT_C void CArrayVarBase::Delete(TInt anIndex)
+/**
+Removes one element from the array.
+
+Deleting elements from the array does not cause the array buffer to be
+automatically compressed. Call CArrayVarBase::Compress() to return excess
+space to the heap.
+
+@param anIndex The position within the array of the element to delete. The 
+               position is relative to zero.
+               
+@panic E32USER-CBase 21, if anIndex is negative or  greater than the number
+       of elements currently in the array.
+*/
+	{
+
+	Delete(anIndex,1);
+	}
+
+EXPORT_C void CArrayVarBase::Delete(TInt anIndex,TInt aCount)
+/**
+Removes one or more contiguous elements from the array, starting at the
+specified position.
+
+Deleting elements from the array does not cause the array buffer to be
+automatically compressed. Call CArrayVarBase::Compress() to return excess
+space to the heap.
+
+@param anIndex The position within the array from where deletion of elements is
+               to start. The position is relative to zero, i.e. zero implies
+               that elements, starting with the first, are deleted from the
+               array.
+
+@param aCount  The number of elements to be deleted from the array.
+
+@panic E32USER-CBase 21, if anIndex is negative or greater than or equal to the
+       number of elements currently in the array.
+@panic E32USER-CBase 25, if aCount is negative.
+@panic E32USER-CBase 29, if the sum of anIndexPos and aCount is greater than
+       the number of elements currently in the array.
+*/
+	{
+
+	if (aCount==0)
+		return;
+	__ASSERT_ALWAYS(aCount>0,Panic(EArrayCountNegative4));
+	__ASSERT_ALWAYS(anIndex>=0 && anIndex<iCount,Panic(EArrayIndexOutOfRange));
+	TInt end=anIndex+aCount;
+	__ASSERT_ALWAYS(end<=iCount,Panic(EArrayCountTooBig));
+	for (TInt i=anIndex;i<end;i++)
+		{
+		TPtr8 p=iBase->Ptr(i*sizeof(SVarRec));
+		User::Free(((SVarRec *)p.Ptr())->data);
+		}
+	iBase->Delete(anIndex*sizeof(SVarRec),aCount*sizeof(SVarRec));
+	iCount-=aCount;
+	}
+
+EXPORT_C TAny *CArrayVarBase::ExpandL(TInt anIndex,TInt aLength)
+//
+// Expand the array at anIndex.
+//
+/**
+@internalComponent
+*/
+	{
+
+	if (iBase==NULL)
+		iBase=(*iCreateRep)(sizeof(SVarRec)*iGranularity);
+	__ASSERT_ALWAYS(aLength>=0,Panic(EArrayLengthNegative));
+	__ASSERT_ALWAYS(anIndex>=0 && anIndex<=iCount,Panic(EArrayIndexOutOfRange));
+	TAny *pV=User::AllocL(aLength);
+	SVarRec s;
+	s.data=pV;
+	s.len=aLength;
+	TRAPD(r,iBase->InsertL(anIndex*sizeof(SVarRec),&s,sizeof(SVarRec)));
+	if (r!=KErrNone)
+		{
+		User::Free(pV);
+		User::Leave(r);
+		}
+	iCount++;
+	return(pV);
+	}
+
+EXPORT_C TInt CArrayVarBase::Find(const TAny *aPtr,TKeyArrayVar &aKey,TInt &anIndex) const
+//
+// Find using a sequential search.
+//
+/**
+@internalComponent
+*/
+	{
+
+	if (iCount==0)
+	    {
+	    anIndex=0;
+		return(-1);
+		}
+	aKey.SetPtr(aPtr);
+	SetKey(aKey);
+	TInt ret=(-1);
+	TInt i=0;
+	while (i<Count())
+		{
+		TInt j=aKey.Compare(i,KIndexPtr);
+		if (j==0)
+			{
+			ret=j;
+			break;
+			}
+		i++;
+		}
+	anIndex=i;
+	return(ret);
+	}
+
+EXPORT_C TInt CArrayVarBase::FindIsq(const TAny *aPtr,TKeyArrayVar &aKey,TInt &anIndex) const
+//
+// Find using a binary search.
+//
+/**
+@internalComponent
+*/
+	{
+
+	if (iCount==0)
+	    {
+	    anIndex=0;
+		return(-1);
+		}
+	aKey.SetPtr(aPtr);
+	SetKey(aKey);
+	return(User::BinarySearch(Count(),aKey,anIndex));
+	}
+
+EXPORT_C void CArrayVarBase::InsertL(TInt anIndex,const TAny *aPtr,TInt aLength)
+//
+// Insert a new record in the array.
+//
+/**
+@internalComponent
+*/
+	{
+
+	TAny *pV=ExpandL(anIndex,aLength);
+    Mem::Copy(pV,aPtr,aLength);
+	}
+
+EXPORT_C TInt CArrayVarBase::InsertIsqL(const TAny *aPtr,TInt aLength,TKeyArrayVar &aKey)
+//
+// Insert in sequence, no duplicates allowed.
+//
+/**
+@internalComponent
+*/
+	{
+
+	TInt i=0;
+	TInt r=FindIsq(aPtr,aKey,i);
+	if (r==0) // a duplicate, leave
+		User::Leave(KErrAlreadyExists);
+	InsertL(i,aPtr,aLength);
+	return(i);
+	}
+
+EXPORT_C TInt CArrayVarBase::InsertIsqAllowDuplicatesL(const TAny *aPtr,TInt aLength,TKeyArrayVar &aKey)
+//
+// Insert in sequence, allow duplicates.
+//
+/**
+@internalComponent
+*/
+	{
+
+	TInt i=0;
+	TInt r=FindIsq(aPtr,aKey,i);
+	if (r==0) // a duplicate, insert after
+		++i;
+	InsertL(i,aPtr,aLength);
+	return(i);
+	}
+
+EXPORT_C void CArrayVarBase::SetKey(TKeyArrayVar &aKey) const
+//
+// Set the key data.
+//
+/**
+@internalComponent
+*/
+	{
+
+	aKey.Set(iBase);
+	}
+
+EXPORT_C TInt CArrayVarBase::CountR(const CBase *aPtr)
+//
+// Return the number of items in the array.
+//
+/**
+@internalComponent
+*/
+	{
+
+	return(((CArrayVarBase *)aPtr)->Count());
+	}
+
+EXPORT_C const TAny *CArrayVarBase::AtR(const CBase *aPtr,TInt anIndex)
+//
+// Return the address of an item in the array.
+//
+/**
+@internalComponent
+*/
+	{
+
+	return(((CArrayVarBase *)aPtr)->At(anIndex));
+	}
+
+EXPORT_C CArrayPakBase::CArrayPakBase(TBufRep aRep,TInt aGranularity)
+//
+// Constructor
+//
+/**
+@internalComponent
+*/
+	{
+
+	__ASSERT_ALWAYS(aGranularity>0,Panic(EArrayPakInvalidGranularity));
+//	iCount=0;
+//	iBase=NULL;
+	iGranularity=aGranularity;
+	iCreateRep=aRep;
+	}
+
+EXPORT_C CArrayPakBase::~CArrayPakBase()
+/**
+Destructor.
+
+Frees all resources owned by the object, prior to its destruction.
+*/
+	{
+
+	if (iBase)
+		{
+		Reset();
+		delete iBase;
+		}
+	}
+
+EXPORT_C TInt CArrayPakBase::Length(TInt anIndex) const
+/**
+Gets the length of the specified element.
+
+@param anIndex The position of the element within the array. The position 
+               is relative to zero, (i.e. the first element in the array is
+               at position 0). 
+
+@return The length of the element at position anIndex.
+
+@panic E32USER-CBase 21, if anIndex is negative or is greater than the number
+       of elements currently in the array.
+*/
+	{
+
+	__ASSERT_ALWAYS(anIndex>=0 && anIndex<iCount,Panic(EArrayIndexOutOfRange));
+	return(*((TInt *)iBase->Ptr(GetOffset(anIndex)).Ptr()));
+	}
+
+EXPORT_C void CArrayPakBase::Compress()
+/**
+Removes excess space from the array buffer.
+
+The effect is to reduce the memory allocated to the array buffer so that it
+is just sufficient to contain the elements of the array.
+
+If the array is empty, then the memory allocated to the array buffer is freed.
+*/
+	{
+
+	if (iBase)
+		iBase->Compress();
+	}
+
+EXPORT_C void CArrayPakBase::Reset()
+/**
+Deletes all elements from the array and frees the memory allocated to the array 
+buffer.
+*/
+	{
+
+	Delete(0,Count());
+	}
+
+EXPORT_C void CArrayPakBase::SortL(TKeyArrayVar &aKey)
+//
+// Builds a transient CArrayVarFlat array, sorts it
+// and then copies it back to the original array.
+//
+/**
+Sorts the elements of the array into key sequence.
+
+Note that the function requires a TKeyArrayVar key object because SortL()
+creates a temporary CArrayVarFlat array in its implementation and uses that array's 
+Sort() member function.
+
+@param aKey The key object defining the properties of the key.
+
+@see CArrayVarFlat
+*/
+	{
+
+	if (iCount==0)
+		return;
+//
+// First build a variable length flat array.
+//
+	CArrayVarFlat<TAny> *pVarFlat=NULL;
+	TRAPD(r,BuildVarArrayL(pVarFlat))
+	if (r==KErrNone)
+		{
+//
+// Now sort it.
+//
+		r=pVarFlat->Sort(aKey);
+		if (r==KErrNone)
+			{
+			//
+			// Delete the records and copy back from pVarFlat.
+			//
+ 			Reset(); // Deletes the records but leaves the memory
+			TInt tCount=pVarFlat->Count();
+			for (TInt anIndex=0;anIndex<tCount;anIndex++)
+	 			{
+				TInt lenData=pVarFlat->Length(anIndex);
+				TAny *pdata=pVarFlat->At(anIndex);
+				TRAP(r,InsertL(anIndex,pdata,lenData));
+				if (r!=KErrNone)
+					break;
+				}
+			}
+		}
+	delete pVarFlat;
+	User::LeaveIfError(r);
+	}
+
+EXPORT_C TAny *CArrayPakBase::At(TInt anIndex) const
+//
+// TAny points to the data associated with the record with anIndex.
+//
+/**
+@internalComponent
+*/
+	{
+
+	__ASSERT_ALWAYS(anIndex>=0 && anIndex<iCount,Panic(EArrayIndexOutOfRange));
+	TInt *pR=(TInt *)iBase->Ptr(GetOffset(anIndex)).Ptr();
+ 	return((TAny *)(pR+1));
+	}
+
+EXPORT_C void CArrayPakBase::Delete(TInt anIndex)
+/**
+Removes a single element from the array.
+
+Deleting elements from the array does not cause the array buffer to be
+automatically compressed. Call CArrayPakBase::Compress() to return excess
+space to the heap.
+
+@param anIndex The position within the array of the element to delete, relative 
+               to zero.
+@panic E32USER-CBase 21, if anIndex is negative or is greater than the 
+       number of elements currently in the array.
+       
+@see CArrayPakBase::Compress
+*/
+	{
+
+	Delete(anIndex,1);
+	}
+
+EXPORT_C void CArrayPakBase::Delete(TInt anIndex,TInt aCount)
+/**
+Removes one or more contiguous elements from the array, starting at a specific 
+position.
+
+Deleting elements from the array does not cause the array buffer to be
+automatically compressed. Call CArrayPakBase::Compress() to return excess
+space to the heap.
+
+@param anIndex The position within the array from where deletion of elements 
+               is to start, relative to zero. 
+ 
+@param aCount  The number of elements to be deleted from the array.
+
+@panic E32USER-CBase 21, if anIndex is negative or greater than the number of
+       elements currently in the array.
+@panic E32USER-CBase 26, if aCount is negative.
+
+@see CArrayPakBase::Compress
+*/
+	{
+
+	if (aCount==0)
+		return;
+	__ASSERT_ALWAYS(aCount>0,Panic(EArrayCountNegative5));
+	__ASSERT_ALWAYS(anIndex>=0 && anIndex<iCount,Panic(EArrayIndexOutOfRange));
+	TInt end=anIndex+aCount;
+	__ASSERT_ALWAYS(end<=iCount,Panic(EArrayCountTooBig));
+	TInt totalToDelete=0;
+	TInt firstRecOffset=0;
+	for (TInt i=anIndex;i<end;i++)
+		{
+		TInt offset=GetOffset(i);
+		if (i==anIndex)
+			{
+			firstRecOffset=offset;
+			iCacheIndex=i;
+			iCacheOffset=offset;
+			}
+		TAny *pRecord=(TAny *)iBase->Ptr(offset).Ptr();
+		TInt lenData=(*(TInt *)pRecord);
+		totalToDelete+=Align4(lenData)+sizeof(TUint);
+		}
+	iBase->Delete(firstRecOffset,totalToDelete);
+	iCount-=aCount;
+	}
+
+EXPORT_C TAny *CArrayPakBase::ExpandL(TInt anIndex,TInt aLength)
+//
+// Expand the array at anIndex.
+//
+/**
+@internalComponent
+*/
+	{
+
+	if (iBase==NULL)
+		iBase=(*iCreateRep)(iGranularity);
+	__ASSERT_ALWAYS(aLength>=0,Panic(EArrayLengthNegative));
+	__ASSERT_ALWAYS(anIndex>=0 && anIndex<=iCount,Panic(EArrayIndexOutOfRange));
+	TInt offset=GetOffset(anIndex);
+	iCacheIndex=anIndex;
+	iCacheOffset=offset;
+	iBase->ExpandL(offset,Align4(aLength+sizeof(TInt)));
+	TInt *pR=(TInt *)iBase->Ptr(offset).Ptr();
+	*pR=aLength;
+	iCount++;
+ 	return((TAny *)(pR+1));
+	}
+
+EXPORT_C TInt CArrayPakBase::Find(const TAny *aPtr,TKeyArrayPak &aKey,TInt &anIndex) const
+//
+// Find using a sequential search.
+//
+/**
+@internalComponent
+*/
+	{
+
+	if (iCount==0)
+	    {
+	    anIndex=0;
+		return(-1);
+		}
+	aKey.SetPtr(aPtr);
+	SetKey(aKey);
+	TInt ret=(-1);
+	TInt i=0;
+	while (i<Count())
+		{
+		TInt j=aKey.Compare(i,KIndexPtr);
+		if (j==0)
+			{
+			ret=j;
+			break;
+			}
+		i++;
+		}
+	anIndex=i;
+	return(ret);
+	}
+
+EXPORT_C TInt CArrayPakBase::FindIsq(const TAny *aPtr,TKeyArrayPak &aKey,TInt &anIndex) const
+//
+// Find using a binary search.
+//
+/**
+@internalComponent
+*/
+	{
+
+	if (iCount==0)
+	    {
+	    anIndex=0;
+		return(-1);
+		}
+	aKey.SetPtr(aPtr);
+	SetKey(aKey);
+	return(User::BinarySearch(Count(),aKey,anIndex));
+	}
+
+EXPORT_C void CArrayPakBase::InsertL(TInt anIndex,const TAny *aPtr,TInt aLength)
+//
+// Inserts a record at index anIndex.
+//
+/**
+@internalComponent
+*/
+	{
+
+	TAny *pV=ExpandL(anIndex,aLength);
+    Mem::Copy(pV,aPtr,aLength);
+	}
+
+EXPORT_C TInt CArrayPakBase::InsertIsqL(const TAny *aPtr,TInt aLength,TKeyArrayPak &aKey)
+//
+// Insert in sequence, no duplicates allowed.
+//
+/**
+@internalComponent
+*/
+	{
+
+	TInt i=0;
+	TInt r=FindIsq(aPtr,aKey,i);
+	if (r==0) // a duplicate, leave
+		User::Leave(KErrAlreadyExists);
+	InsertL(i,aPtr,aLength);
+	return(i);
+	}
+
+EXPORT_C TInt CArrayPakBase::InsertIsqAllowDuplicatesL(const TAny *aPtr,TInt aLength,TKeyArrayPak &aKey)
+//
+// Insert in sequence, allow duplicates.
+//
+/**
+@internalComponent
+*/
+	{
+
+	TInt i=0;
+	TInt r=FindIsq(aPtr,aKey,i);
+	if (r==0) // a duplicate, insert after
+		++i;
+	InsertL(i,aPtr,aLength);
+	return(i);
+	}
+
+EXPORT_C void CArrayPakBase::SetKey(TKeyArrayPak &aKey) const
+//
+// Set the key data.
+//
+/**
+@internalComponent
+*/
+	{
+
+	aKey.Set(iBase);
+	}
+
+EXPORT_C TInt CArrayPakBase::GetOffset(TInt anIndex) const
+//
+// Return the offset into the buffer of the record with index anIndex;
+//
+/**
+@internalComponent
+*/
+	{
+
+	TInt offset=0;
+ 	TInt curIndex=0;
+	if (iCacheIndex<=anIndex)
+		{
+		curIndex=iCacheIndex;
+		offset=iCacheOffset;
+		}
+	TAny *pRecord=(TAny *)iBase->Ptr(offset).Ptr();
+	while (curIndex<anIndex)
+		{
+		TInt lenData=(*(TInt *)pRecord);
+		offset+=Align4(lenData)+sizeof(TUint);
+		pRecord=(TAny *)iBase->Ptr(offset).Ptr();
+		curIndex++;
+		}
+	(TInt &)iCacheIndex=anIndex;
+	(TInt &)iCacheOffset=offset;
+ 	return(offset);
+	}
+
+EXPORT_C void CArrayPakBase::BuildVarArrayL(CArrayVarFlat<TAny> * &aVarFlat)
+//
+// Make a copy of the current array as a CArrayVarFlat
+//
+/**
+@internalComponent
+*/
+	{
+
+	aVarFlat=new(ELeave) CArrayVarFlat<TAny>(iGranularity);
+	for (TInt anIndex=0;anIndex<iCount;anIndex++)
+		{
+		TInt offset=GetOffset(anIndex);
+		TAny *pRecord=(TAny *)iBase->Ptr(offset).Ptr();
+		TInt lengthData=(*(TInt *)pRecord);
+		TAny *pData=(TAny *)((TInt *)pRecord+1);
+		aVarFlat->InsertL(anIndex,pData,lengthData);
+		}
+	}
+
+EXPORT_C TInt CArrayPakBase::CountR(const CBase *aPtr)
+//
+// Return the number of items in the array.
+//
+/**
+@internalComponent
+*/
+	{
+
+	return(((CArrayPakBase *)aPtr)->Count());
+	}
+
+EXPORT_C const TAny *CArrayPakBase::AtR(const CBase *aPtr,TInt anIndex)
+//
+// Return the address of an item in the array.
+//
+/**
+@internalComponent
+*/
+	{
+
+	return(((CArrayPakBase *)aPtr)->At(anIndex));
+	}
+
+EXPORT_C CArrayFixFlat<TInt>::CArrayFixFlat(TInt aGranularity)
+	: CArrayFix<TInt>((TBufRep)CBufFlat::NewL,aGranularity)
+/**
+Constructs the array, with the specified granularity, to contain elements of 
+TInt type.
+	
+Note that no memory is allocated to the array buffer by this C++ constructor.
+	
+@param aGranularity The granularity of the array. 
+
+@panic E32USER-CBase 18 if aGranularity is not positive.
+*/
+	{}
+
+EXPORT_C CArrayFixFlat<TInt>::~CArrayFixFlat()
+/**
+Destructor.
+*/
+	{}
+
+EXPORT_C CArrayFixFlat<TUid>::CArrayFixFlat(TInt aGranularity)
+	: CArrayFix<TUid>((TBufRep)CBufFlat::NewL,aGranularity)
+/**
+Constructs the array, with the specified granularity, to contain elements of 
+TUid type.
+
+Note that no memory is allocated to the array buffer by this C++ constructor.
+	
+@param aGranularity The granularity of the array.
+
+@panic E32USER-CBase 18 if aGranularity is not positive.
+*/
+	{}
+
+EXPORT_C CArrayFixFlat<TUid>::~CArrayFixFlat()
+/**
+Destructor.
+*/
+	{}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32/euser/cbase/ub_buf.cpp	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,1023 @@
+// Copyright (c) 1994-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32\euser\cbase\ub_buf.cpp
+// 
+//
+
+#include "ub_std.h"
+
+class TBufSegLink : public TDblQueLink
+	{
+public:
+	inline TBufSegLink() : iLen(0) {}
+	inline TBufSegLink *Next() const {return((TBufSegLink *)iNext);}
+	inline TBufSegLink *Prev() const {return((TBufSegLink *)iPrev);}
+public:
+	TInt iLen;
+	};
+
+EXPORT_C CBufBase::CBufBase(TInt anExpandSize)
+//
+// Constructor
+//
+/**
+@internalComponent
+*/
+	{
+
+	__ASSERT_ALWAYS(anExpandSize>=0,Panic(EBufExpandSizeNegative));
+//	iSize=0;
+	iExpandSize=anExpandSize;
+	}
+
+EXPORT_C CBufBase::~CBufBase()
+/**
+Destructor
+*/
+	{
+	}
+
+EXPORT_C void CBufBase::Reset()
+/**
+Deletes all data in the buffer.
+
+Its behaviour is the same as calling Delete(0,Size()). 
+The buffer is compressed before the function returns.
+*/
+	{
+
+	if (iSize)
+		Delete(0,iSize);
+	Compress();
+	}
+
+EXPORT_C void CBufBase::Read(TInt aPos,TDes8 &aDes) const
+//
+// Read up to aDes.MaxLength() bytes.
+//
+/**
+Reads data from the buffer into a descriptor.
+
+Data, starting at the specified buffer position is written to the descriptor, 
+filling the descriptor.
+
+@param aPos Buffer position from which data is read: must be in range zero 
+            to Size(). 
+@param aDes On return, contains the data read from the buffer; its MaxLength() 
+            specifies the amount of data to be read.
+*/
+	{
+
+	Read(aPos,aDes,aDes.MaxLength());
+	}
+
+EXPORT_C void CBufBase::Read(TInt aPos,TDes8 &aDes,TInt aLength) const
+/**
+Reads the specified number of bytes of data from the buffer into a descriptor.
+
+@param aPos    Buffer position from which data is read: must be in range zero 
+               to (Size() minus the length of the data to be read). 
+@param aDes    On return, contains data read from the buffer.
+@param aLength The length of the data to be read.
+*/
+	{
+
+	aDes.SetLength(aLength);
+	Read(aPos,(TAny *)aDes.Ptr(),aLength);
+	}
+
+EXPORT_C void CBufBase::Read(TInt aPos,TAny *aPtr,TInt aLength) const
+/**
+Reads the specified number of bytes of data from the buffer into a specified 
+address.
+
+@param aPos    Buffer position from which data is read: must be in range zero 
+               to (Size() minus the length of the data to be read). 
+@param aPtr    The address into which the data should be read.
+@param aLength The length of the data to be read.
+*/
+	{
+
+	if (aLength==0)
+		return;
+	__ASSERT_ALWAYS(aLength>0,Panic(EBufReadLengthNegative));
+	__ASSERT_ALWAYS((aPos+aLength)<=iSize,Panic(EBufReadBeyondEnd));
+	TUint8 *pT=(TUint8 *)aPtr;
+	while (aLength)
+		{
+		TPtr8 p=((CBufBase *)this)->Ptr(aPos);
+		TInt s=Min(p.Length(),aLength);
+		pT=Mem::Copy(pT,p.Ptr(),s);
+		aLength-=s;
+		aPos+=s;
+		}
+	}
+
+EXPORT_C void CBufBase::Write(TInt aPos,const TDesC8 &aDes)
+//
+// Write aDes.Length() characters to the buffer. Does not cause any expansion.
+//
+/**
+Writes data from a descriptor to the buffer.
+
+The data in the descriptor overwrites the data in the buffer from the insertion 
+point onwards.
+
+No new space is allocated; this function cannot fail (provided the parameters 
+are specified within the bounds of the buffer and descriptor).
+
+No shuffling occurs; new data is written to the memory locations occupied 
+by the data it overwrites.
+
+@param aPos Buffer position at which data will begin to be written; must be 
+            in range zero to (Size() minus the length of the data
+            to be written). 
+@param aDes Contains the data to be written. The length of data to be written
+            is the descriptor length.
+*/
+	{
+
+	Write(aPos,aDes.Ptr(),aDes.Length());
+	}
+
+EXPORT_C void CBufBase::Write(TInt aPos,const TDesC8 &aDes,TInt aLength)
+//
+// Write aDes.Length() characters to the buffer. Does not cause any expansion.
+//
+/**
+Writes the specified number of bytes of data from a descriptor to the buffer.
+
+The data in the descriptor overwrites the data in the buffer from the insertion 
+point onwards.
+
+No new space is allocated; this function cannot fail (provided the parameters 
+are specified within the bounds of the buffer and descriptor).
+
+No shuffling occurs; new data is written to the memory locations occupied 
+by the data it overwrites.
+
+@param aPos    Buffer position at which data will begin to be written; must be 
+               in range zero to (Size() minus the length of the data to
+               be written). 
+@param aDes    Contains the data to be written.
+@param aLength The length of the data to be written.
+*/
+	{
+
+	Write(aPos,aDes.Ptr(),aLength);
+	}
+
+EXPORT_C void CBufBase::Write(TInt aPos,const TAny *aPtr,TInt aLength)
+/**
+Writes the specified number of bytes of data from the specified address to the 
+buffer.
+
+The data in the buffer is overwritten from the insertion point onwards.
+
+No new space is allocated; this function cannot fail (provided the parameters 
+are specified within the bounds of the buffer and descriptor).
+
+No shuffling occurs: new data is written to the memory locations occupied 
+by the data it overwrites.
+
+@param aPos    Buffer position at which data will begin to be written; must be 
+               in range zero to (Size() minus the length of the data to
+               be written). 
+@param aPtr    The address of the data to be written.
+@param aLength The length of the data to be written.
+
+@panic E32USER-CBase 7, if aLength is not positive
+@panic E32USER-CBase 5, if aPos + aLength is greater than the number of
+                        data bytes in the buffer, i.e. if the target appears
+                        to be outside the buffer.
+*/
+	{
+
+	if (aLength==0)
+		return;
+	__ASSERT_ALWAYS(aLength>0,Panic(EBufWriteLengthNegative));
+	__ASSERT_ALWAYS((aPos+aLength)<=iSize,Panic(EBufWriteBeyondEnd));
+	const TUint8 *pS=(const TUint8 *)aPtr;
+	while (aLength)
+		{
+		TPtr8 p=Ptr(aPos);
+		TInt s=Min(p.Length(),aLength);
+		Mem::Copy((TAny *)p.Ptr(),pS,s);
+		pS+=s;
+		aLength-=s;
+		aPos+=s;
+		}
+	}
+
+EXPORT_C void CBufBase::InsertL(TInt aPos,const TDesC8 &aDes)
+//
+// Insert aDes.Length() bytes into the buffer.
+//
+/**
+Inserts data into the buffer.
+
+Data at and beyond the insertion position is moved to make way for the inserted 
+data. Data before the insertion position remains in place.
+
+Notes:
+
+1. Insertion may require more buffer space to be allocated.
+
+2. In the case of flat buffers, the buffer is extended by a ReAllocL() of the 
+   buffer's heap cell, to the smallest multiple of the granularity that will 
+   contain the data required. If this reallocation fails, the insertion is
+   impossible and a leave occurs.
+
+3. In the case of segmented buffers, a reallocation is performed if the segment 
+   containing the insertion position has insufficient space, and
+   immediately-neighbouring segments cannot be used to contain the new data.
+   As many new segments as are necessary to contain the inserted data are
+   allocated. Each new segment's length is the buffer's granularity.
+   If extension or new allocation fails, a leave occurs.
+
+4. Insertion may also require data to be shuffled. In the case of flat buffers, 
+   data beyond the insertion point is shuffled up to create a gap; the new data 
+   is then inserted into this gap. In the case of segmented buffers, shuffling 
+   is minimised by inserting the new data into newly-allocated buffers, and
+   shuffling only immediately-neighbouring buffers if possible. This may result
+   in some wastage of space, but is much more time-efficient for large amounts
+   of data.
+
+@param aPos Buffer position before which the data will be inserted; must be 
+            in range zero to Size().
+@param aDes The data to be inserted; the length of the data is the descriptor
+            length.
+
+@leave KErrNoMemory If the insertion requires a bigger buffer, and the
+       necessary allocation or re-allocation fails.
+*/
+	{
+
+	InsertL(aPos,aDes.Ptr(),aDes.Length());
+	}
+
+EXPORT_C void CBufBase::InsertL(TInt aPos,const TDesC8 &aDes,TInt aLength)
+//
+// Insert aLength bytes into the buffer.
+//
+/**
+Inserts the specified number of bytes of data from a descriptor into
+the buffer.
+
+aLength bytes of data from aDes are inserted into the buffer at aPos. Data at
+and beyond the insertion position is moved to make way for the inserted data. 
+Data before the insertion position remains in place.
+
+Notes:
+
+1. Insertion may require more buffer space to be allocated.
+
+2. In the case of flat buffers, the buffer is extended by a ReAllocL() of the 
+   buffer's heap cell, to the smallest multiple of the granularity that will 
+   contain the data required. If this reallocation fails, the insertion is
+   impossible and a leave occurs.
+
+3. In the case of segmented buffers, a reallocation is performed if the segment 
+   containing the insertion position has insufficient space, and
+   immediately-neighbouring segments cannot be used to contain the new data.
+   As many new segments as are necessary to contain the inserted data are
+   allocated. Each new segment's length is the buffer's granularity.
+   If extension or new allocation fails, a leave occurs.
+
+4. Insertion may also require data to be shuffled. In the case of flat buffers, 
+   data beyond the insertion point is shuffled up to create a gap: the new data 
+   is then inserted into this gap. In the case of segmented buffers, shuffling 
+   is minimised by inserting the new data into newly-allocated buffers,
+   and shuffling  only immediately-neighbouring buffers if possible.
+   This may result in some  wastage of space, but is much more time-efficient
+   for large amounts of data.
+   
+@param aPos    Buffer position before which the data will be inserted; must be 
+               in range zero to Size().
+@param aDes    The data to be inserted.
+@param aLength The length of data to be inserted. 
+
+@leave KErrNoMemory If the insertion requires a bigger buffer, and the
+       necessary allocation or re-allocation fails.
+*/
+	{
+
+	InsertL(aPos,aDes.Ptr(),aLength);
+	}
+
+EXPORT_C void CBufBase::InsertL(TInt aPos,const TAny *aPtr,TInt aLength)
+/**
+Inserts bytes of data from the specified address into the buffer.
+
+Inserts aLength bytes of data found at address aPtr into the buffer at aPos. 
+Data at and beyond the insertion position is moved to make way for the inserted 
+data. Data before the insertion position remains in place.
+
+Notes:
+
+1. Insertion may require more buffer space to be allocated.
+
+2. In the case of flat buffers, the buffer is extended by a ReAllocL() of the 
+   buffer's heap cell, to the smallest multiple of the granularity that will 
+   contain the data required. If this reallocation fails, the insertion is
+   impossible and a leave occurs.
+
+2. In the case of segmented buffers, a reallocation is performed if the segment 
+   containing the insertion position has insufficient space, and
+   immediately-neighbouring segments cannot be used to contain the new data.
+   As many new segments as are necessary to contain the inserted data are
+   allocated. Each new segment's length is the buffer's granularity.
+   If extension or new allocation fails, a leave occurs.
+
+4. Insertion may also require data to be shuffled. In the case of flat buffers, 
+   data beyond the insertion point is shuffled up to create a gap: the new data 
+   is then inserted into this gap. In the case of segmented buffers, shuffling 
+   is minimised by inserting the new data into newly-allocated buffers, and
+   shuffling only immediately-neighbouring buffers if possible. This may result
+   in some wastage of space, but is much more time-efficient for large amounts
+   of data.
+
+@param aPos    Buffer position before which the data will be inserted: must be 
+               in range zero to Size().
+@param aPtr    The address of the data to be inserted. 
+@param aLength The length of the data to be inserted.
+ 
+@leave KErrNoMemory If the insertion requires a bigger buffer, and the
+       necessary allocation or re-allocation fails.
+*/
+	{
+
+	if (aLength==0)
+		return;
+	__ASSERT_ALWAYS(aLength>0,Panic(EBufInsertLengthNegative));
+	__ASSERT_ALWAYS(aPtr,Panic(EBufInsertBadPtr));
+	DoInsertL(aPos,aPtr,aLength);
+	}
+
+EXPORT_C void CBufBase::ExpandL(TInt aPos,TInt aLength)
+/**
+Inserts an uninitialised region into the buffer.
+
+Data at and beyond the insertion position is moved to make way for the inserted
+region. Data before the insertion position remains in place.
+
+Note:
+
+1. The inserted region is not initialised. After using ExpandL(), you should 
+   then use a series of Write()s to fill this region with data.
+
+2. Use ExpandL() followed by a series of Write()s when you know the amount of 
+   data to be inserted, in advance. It is more efficient than a series of
+   InsertL()s. In addition, once the result of the ExpandL() has been checked,
+   it is guaranteed that the Write()s do not leave, which can sometimes be
+   useful.
+
+@param aPos    Buffer position before which the region will be inserted; must 
+               be in range zero to Size(). 
+@param aLength The length of the region to be inserted.
+*/
+	{
+
+	if (aLength==0)
+		return;
+	__ASSERT_ALWAYS(aLength>0,Panic(EBufInsertLengthNegative));
+	DoInsertL(aPos,NULL,aLength);
+	}
+
+EXPORT_C void CBufBase::ResizeL(TInt aSize)
+/**
+Re-sizes the buffer to the specified size.
+
+The new size can be larger or smaller than the existing size.
+
+If the new size is larger than the existing size, the buffer is expanded by 
+adding uninitialised data to the end of it.
+
+If the new size is smaller than the existing size, the buffer is reduced; 
+any data at the end of the buffer is lost.
+
+Notes:
+
+1. If the new size is larger than the existing size, the function is equivalent 
+   to Delete(aSize,Size()-aSize).
+
+2. If the new size is smaller than the existing size, the function is equivalent 
+   to ExpandL((Size(),aSize-Size()).
+
+3. The motivations for using ResizeL() are the same as those for using Delete() 
+   and ExpandL().
+
+@param aSize The new size of the buffer; this value must be greater than or 
+             equal to zero.
+*/
+	{
+
+	TInt excess=iSize-aSize;
+	if (excess>0)
+		Delete(aSize,excess);
+	else
+		ExpandL(iSize,-excess);
+	}
+
+EXPORT_C CBufFlat *CBufFlat::NewL(TInt anExpandSize)
+/**
+Allocates and constructs a flat buffer.
+
+If there is insufficient memory available to allocate the flat buffer, the 
+function leaves.
+
+@param anExpandSize The granularity of buffer expansion. Additional space, 
+                    when required, is always allocated in multiples of
+                    this number. Note: although a value of zero is permitted
+                    by this interface, it has no meaning, and risks raising
+                    panics later during execution. We suggest that you pass
+                    a positive value.
+                                        
+@return A pointer to the flat buffer object.
+
+@panic E32USER-CBase 3 if the granularity is negative.
+*/
+	{
+
+	return(new(ELeave) CBufFlat(anExpandSize));
+	}
+
+EXPORT_C CBufFlat::CBufFlat(TInt anExpandSize)
+//
+// Constructor
+//
+/**
+@internalComponent
+*/
+	: CBufBase(anExpandSize)
+	{
+
+//	iMaxSize=0;
+//	iPtr=NULL;
+	}
+
+EXPORT_C CBufFlat::~CBufFlat()
+/** 
+Destructor.
+
+Frees all resources owned by the object, prior to its destruction.
+Specifically, it frees the allocated cell used as a buffer.
+*/
+	{
+
+	User::Free(iPtr);
+	}
+
+EXPORT_C void CBufFlat::Compress()
+/**
+Compresses the buffer so as to occupy minimal space.
+
+This frees any unused memory at the end of the buffer.
+
+@see CBufBase::Compress
+*/
+	{
+
+	SetReserveL(iSize);
+	}
+
+EXPORT_C void CBufFlat::SetReserveL(TInt aSize)
+/**
+Specifies a minimum amount of space which the flat buffer should occupy.
+
+If the required size is zero, the heap cell is deleted. If it is different 
+from the current size, the heap cell is rellocated accordingly.
+
+@param aSize The size of the buffer required. If there is no data in the
+             buffer, i.e. Size() returns zero, then this value 
+             can be zero, which causes the buffer's allocated heap cell
+             to be deleted.
+
+@panic E32USER-CBase 10, if aSize is negative.
+@panic E32USER-CBase 11, if there is data in the buffer, and aSize is less than
+       the value returned by Size().
+*/
+	{
+
+	__ASSERT_ALWAYS(aSize>=0,Panic(EBufFlatReserveNegative));
+	__ASSERT_ALWAYS(aSize>=iSize,Panic(EBufFlatReserveSetTooSmall));
+    if (!aSize)
+        {
+        User::Free(iPtr);
+        iPtr=NULL;
+        }
+    else
+        iPtr=(TUint8 *)User::ReAllocL(iPtr,aSize);
+    iMaxSize=aSize;
+	}
+
+EXPORT_C void CBufFlat::DoInsertL(TInt aPos,const TAny *aPtr,TInt aLength)
+//
+// Insert into the buffer. Can cause expansion.
+//
+	{
+
+	__ASSERT_ALWAYS(aPos>=0 && aPos<=iSize,Panic(EBufFlatPosOutOfRange));
+	TInt len=iSize+aLength;
+	if (len>iMaxSize)
+		{
+		TInt r=len-iMaxSize;
+		r=((r/iExpandSize)+1)*iExpandSize;
+		SetReserveL(iMaxSize+r);
+		}
+	Mem::Copy(iPtr+aPos+aLength,iPtr+aPos,iSize-aPos);
+	if (aPtr)
+		Mem::Copy(iPtr+aPos,aPtr,aLength);
+	iSize+=aLength;
+	}
+
+EXPORT_C void CBufFlat::Delete(TInt aPos,TInt aLength)
+/**
+Deletes data from the buffer.
+
+During deletion, any data beyond the deleted data is shuffled up so that
+the buffer contents are contiguous. No memory is freed.
+
+@param aPos    Buffer position where the deletion will begin; must be in the 
+               range zero to (Size() minus the length of the data
+               to be deleted). 
+@param aLength The number of bytes to be deleted.
+
+@panic E32USER-CBase 12, if aPos is negative or is greater than the
+       current size of the buffer.
+@panic E32USER-CBase 13, if aPos + aLength is greater than the
+       current size of the buffer.
+       
+@see CBufBase::Delete
+*/
+	{
+
+	__ASSERT_ALWAYS(aPos>=0 && aPos<=iSize,Panic(EBufFlatPosOutOfRange));
+	__ASSERT_ALWAYS((aPos+aLength)<=iSize,Panic(EBufFlatDeleteBeyondEnd));
+	Mem::Copy(iPtr+aPos,iPtr+aPos+aLength,iSize-aLength-aPos);
+	iSize-=aLength;
+	}
+
+EXPORT_C TPtr8 CBufFlat::Ptr(TInt aPos)
+/**
+Gets a pointer descriptor to represent the data starting at the specified
+data byte through to the end of the contiguous region containing that byte.
+
+Calculation of the pointer and length involves only a few machine instructions
+and is independent of the data contained in the buffer.
+
+@param aPos Buffer position: must be in range zero to Size().
+	 
+@return Descriptor representing the data starting at aPos to the end of
+        the buffer.      	
+*/
+	{
+
+	__ASSERT_ALWAYS(aPos>=0 && aPos<=iSize,Panic(EBufFlatPosOutOfRange));
+	TInt len=iSize-aPos;
+	return(TPtr8(iPtr+aPos,len,len));
+	}
+
+EXPORT_C TPtr8 CBufFlat::BackPtr(TInt aPos)
+//
+// Return a pointer to the buffer which has the maximum amount of data
+// before aPos, and the amount of data remaining.  
+//
+/**
+Gets a pointer descriptor to represent the data starting at the beginning
+of the contiguous region containing that byte through to the byte immediately
+preceding the specified byte.
+
+The descriptor always points to the beginning of the buffer containing
+the specified byte. Calculation of the pointer and length involves only a few
+machine instructions and is independent of the data contained in the buffer.
+
+@param aPos Buffer position: must be in range zero to Size().
+
+@return Descriptor representing the back contiguous region. 
+
+@see CBufBase::BackPtr
+*/
+	{
+
+	__ASSERT_ALWAYS(aPos>=0 && aPos<=iSize,Panic(EBufFlatPosOutOfRange));
+	return(TPtr8(iPtr,aPos,aPos));
+	}
+
+void CBufSeg::InsertIntoSegment(TBufSegLink *aSeg,TInt anOffset,const TAny *aPtr,TInt aLength)
+//
+// Insert into the segment.
+//
+	{
+
+    if (aLength)
+        {
+        TUint8 *pS=((TUint8 *)(aSeg+1))+anOffset;
+        Mem::Copy(pS+aLength,pS,aSeg->iLen-anOffset);
+		if (aPtr)
+			Mem::Copy(pS,aPtr,aLength);
+        aSeg->iLen+=aLength;
+        }
+	}
+
+void CBufSeg::DeleteFromSegment(TBufSegLink *aSeg,TInt anOffset,TInt aLength)
+//
+// Delete from the segment.
+//
+	{
+
+    if (aLength)
+        {
+        TUint8 *pS=((TUint8 *)(aSeg+1))+anOffset;
+        Mem::Copy(pS,pS+aLength,aSeg->iLen-anOffset-aLength);
+        aSeg->iLen-=aLength;
+        }
+	}
+
+void CBufSeg::FreeSegment(TBufSegLink *aSeg)
+//
+// Free an entire segment.
+//
+	{
+
+    aSeg->Deque();
+    User::Free(aSeg);
+	}
+
+void CBufSeg::SetSBO(TInt aPos)
+//
+// Set a segment-base-offset struct (SBO) to a new pos.
+// If the initial psbo->seg is not NULL, it assumes that it is a valid
+// SBO for a different position and counts relative to the initial SBO
+// to set the desired position. If the initial psbo->seg is NULL, it starts
+// scanning from the beginning ie pos=0.
+// When the position is between segments A and B, there are two equivalent
+// positions: (1) at the beginning of B and (2) at the end of A.
+// Option (1) is suitable for referencing the data and deleting.
+// Option (2) is best for insertion when A is not full.
+// This function uses option (1) and will always set the SBO to the
+// beginning of the next segment. It does however set to the end of the
+// last segment when pos is equal to the number of bytes in the buffer.
+//
+	{
+
+    __ASSERT_ALWAYS(aPos>=0 && aPos<=iSize,Panic(EBufSegPosOutOfRange));
+    if (aPos==iSize)
+        { // Positioning to end is treated as a special case
+        iSeg=0;
+        if (iSize)
+            iBase=aPos-(iOffset=(iSeg=iQue.Last())->iLen);
+        return;
+        }
+    TInt base=iBase;
+	TBufSegLink *next;
+    if ((next=iSeg)==NULL)
+        { // anSbo is not valid - set to pos=0
+        next=iQue.First();
+        base=0;
+        }
+    if (aPos<base)
+        { // Look to the left
+        do
+            {
+            next=next->Prev();
+            base-=next->iLen;
+            } while (aPos<base);
+        }
+    else
+        { // Look to the right
+		TBufSegLink *nn;
+        while (aPos>=(base+next->iLen) && !iQue.IsHead(nn=next->Next()))
+            {
+            base+=next->iLen;
+            next=nn;
+            }
+        }
+    iSeg=next;
+    iBase=base;
+    iOffset=aPos-base;
+	__ASSERT_DEBUG(iOffset<=iExpandSize,Panic(EBufSegSetSBO));
+	}
+
+void CBufSeg::AllocSegL(TBufSegLink *aSeg,TInt aNumber)
+//
+// Allocate a number of segments.
+//
+	{
+
+	for (TInt i=0;i<aNumber;i++)
+		{
+		TBufSegLink *pL=(TBufSegLink *)User::Alloc(sizeof(TBufSegLink)+iExpandSize);
+		if (pL==NULL)
+			{ // alloc failed - tidy up
+			while (i--)
+				FreeSegment(aSeg->Next());
+			User::Leave(KErrNoMemory);
+			}
+		new(pL) TBufSegLink;
+		pL->Enque(aSeg);
+		}
+	}
+
+EXPORT_C CBufSeg *CBufSeg::NewL(TInt anExpandSize)
+/**
+Allocates and constructs a segmented buffer.
+
+If there is insufficient memory available to allocate the segmented buffer, 
+the function leaves.
+
+@param anExpandSize The granularity of the buffer. Each segment contains (in 
+                    addition to 16 bytes of overhead) this number of bytes for
+                    data. Note: although a value of zero is permitted by this
+                    interface, it has no meaning, and risks raising panics later
+                    during execution. We suggest that you pass a positive value. 
+                    
+@return If successful, a pointer to the segmented buffer object.
+
+@panic E32USER-CBase 3 if the granularity is negative.
+*/
+	{
+
+	return(new(ELeave) CBufSeg(anExpandSize));
+	}
+
+EXPORT_C CBufSeg::CBufSeg(TInt anExpandSize)
+//
+// Constructor
+//
+	: CBufBase(anExpandSize)
+	{
+
+//	iSeg=NULL;
+	}
+
+EXPORT_C CBufSeg::~CBufSeg()
+/**
+Destructor.
+
+Frees all resources owned by the object, prior to its destruction.
+
+Specifically, it frees all segments allocated to the buffer.
+*/
+	{
+
+	Delete(0,iSize);
+	}
+
+EXPORT_C void CBufSeg::Compress()
+/**
+Compresses the buffer so as to occupy minimal space.
+
+Fills any space in each segment of the buffer by moving contents from the next
+segment to the current one.  Where this activity results in empty segments,
+it frees the memory associated with these segments.
+
+@see CBufBase::Compress
+*/
+	{
+
+    if (!iSize)
+        return;
+    iSeg=NULL; // Invalidate current position
+    TBufSegLink *p1=iQue.First();
+    TBufSegLink *p2;
+    while (!iQue.IsHead(p2=p1->Next()))
+        {
+        TInt rem=iExpandSize-p1->iLen;
+        if (rem==0)
+            {
+            p1=p2;
+            continue; // Full
+            }
+        if (rem>=p2->iLen)
+            { // Zap the next segment
+            InsertIntoSegment(p1,p1->iLen,p2+1,p2->iLen);
+            FreeSegment(p2);
+            continue;
+            }
+        InsertIntoSegment(p1,p1->iLen,p2+1,rem);  // Make full
+        DeleteFromSegment(p2,0,rem);
+        p1=p2;
+        }
+	}
+
+EXPORT_C void CBufSeg::DoInsertL(TInt aPos,const TAny *aPtr,TInt aLength)
+//
+// Insert data at the specified position. This is quite tricky.
+// In general, the data to be copied may be broken down into the
+// following elements:
+//     s1 bytes into the current segment (p1)
+//     nseg-1 segments of self->sgbuf.hd.len (ie full segments)
+//     s2 bytes into segment nseg
+//     s3 bytes into the next segment (p2)
+// where p2 is the next segment before the insertion of nseg new segments.
+// In addition, any remaining data to the right of the insertion point must
+// be moved appropriately. In general, r1 bytes must be moved into segment
+// nseg (r2 bytes) and segment p2 (r3 bytes) where r1=r2+r3.
+//
+	{
+
+    SetSBO(aPos);
+    TInt slen=iExpandSize;
+    TInt ofs=iOffset;	
+	TInt ll=0;
+    TInt s1=0;
+    TInt r1=0;
+    TBufSegLink *p1=(TBufSegLink *)(&iQue); 
+    TBufSegLink *p2=p1->Next(); 
+	TUint8 *pR=NULL;
+    if (iSize)	
+        {
+        p1=iSeg;	
+     	if (!iQue.IsHead(p2=p1->Prev()) && ofs==0 && p2->iLen<slen)
+        	{  
+        	iSeg=p1=p2;     
+        	iOffset=ofs=p1->iLen;
+        	iBase-=ofs;     
+        	}
+        s1=slen-ofs; 
+        if (s1>aLength)
+            s1=aLength; 
+		TInt r2=slen-p1->iLen; 
+        if (aLength>r2)	
+            { 
+            pR=((TUint8 *)(p1+1))+ofs; 
+            r1=aLength-r2; 
+			r2=p1->iLen-ofs; 
+            if (r1>r2) 
+                r1=r2; 
+            else
+                pR+=(r2-r1); 
+            }
+		p2=p1->Next();
+        ll=slen-p1->iLen;
+		if (!iQue.IsHead(p2))
+		  	ll+=slen-p2->iLen;
+        }
+    TUint8 *pB=((TUint8 *)aPtr)+s1; 
+    TInt lrem=aLength-s1;
+    TBufSegLink *pP=p1;
+    if (aLength>ll)
+        {// Need some more segments
+		TInt nseg=(slen-1+aLength-ll)/slen;
+        AllocSegL(p1,nseg); // Could leave
+        while (nseg--)
+            { // Copy into allocated segments
+            pP=pP->Next();
+            TInt gap=slen;
+            if (lrem<gap)
+                gap=lrem;
+			InsertIntoSegment(pP,0,aPtr==NULL ? NULL : pB,gap);
+            pB+=gap;
+            lrem-=gap;
+            }
+        }
+    if (lrem) 
+        {	
+		InsertIntoSegment(p2,0,aPtr==NULL ? NULL : pB,lrem); 
+        InsertIntoSegment(p2,lrem,pR,r1); 
+        }
+    else 
+        { 
+        TInt r2=0;
+        if (pP!=p1)
+            {
+            r2=slen-pP->iLen; 
+            if (r2>r1)
+                r2=r1;	
+            }
+        InsertIntoSegment(pP,pP->iLen,pR,r2); // Moved from p1 
+        InsertIntoSegment(p2,0,pR+r2,r1-r2); // Also moved from p1
+        }
+    p1->iLen-=r1;
+	InsertIntoSegment(p1,ofs,aPtr,s1);
+    iSize+=aLength;
+	}
+
+EXPORT_C void CBufSeg::Delete(TInt aPos,TInt aLength)
+/**
+Deletes data from the buffer.
+
+During deletion, shuffling is minimised by deleting intermediate segments
+and allowing segments to contain less data than the buffer granularity.
+
+@param aPos    Buffer position where the deletion will begin; must be in the 
+               range zero to (Size() minus the length of the data
+               to be deleted). 
+@param aLength The number of bytes to be deleted.
+
+@see CBufBase::Delete
+*/
+	{
+
+    if (aLength==0)
+        return;
+    SetSBO(aPos);
+    TInt ofs=iOffset;
+    __ASSERT_ALWAYS((iBase+ofs+aLength)<=iSize,Panic(EBufSegDeleteBeyondEnd));
+    iSize-=aLength;
+    TBufSegLink *p1=iSeg;
+	TBufSegLink *p2;
+    TInt rem=p1->iLen-ofs;
+    FOREVER
+        {
+        p2=p1->Next();
+        TInt gap=aLength;
+        if (gap>rem)
+            gap=rem;
+        DeleteFromSegment(p1,ofs,gap);
+        if (p1->iLen==0)
+            {
+            iSeg=NULL;
+            FreeSegment(p1);
+            }
+        p1=p2;
+        if ((aLength-=gap)==0)
+            break;
+        rem=p1->iLen;
+        ofs=0;
+        }
+    if (iSize)
+        {
+        p1=p2->Prev();
+        if (!iQue.IsHead(p1) && !iQue.IsHead(p2))
+            {
+            if ((p1->iLen+p2->iLen)<=iExpandSize)
+                { // Join to the right
+                InsertIntoSegment(p1,p1->iLen,p2+1,p2->iLen);
+                FreeSegment(p2);
+                }
+            }
+        }
+    SetSBO(aPos);
+	}
+
+EXPORT_C TPtr8 CBufSeg::Ptr(TInt aPos)
+/**
+Gets a pointer descriptor to represent the data starting at the specified
+data byte through to the end of the contiguous region containing that byte.
+
+The time needed for calculation of the pointer depends on how many segments
+there are in the buffer, and how near the target segment is to the segment
+which was last used in the buffer.
+
+@param aPos Buffer position: must be in range zero to Size().
+	 
+@return Descriptor representing the data starting at aPos to the end of
+        the contiguous region containing that byte.     	
+*/
+	{
+
+    if (iSize==0)
+		return(TPtr8(NULL,0,0));
+    SetSBO(aPos);
+	TInt len=iSeg->iLen-iOffset;
+    return(TPtr8(((TUint8 *)(iSeg+1))+iOffset,len,len));
+	}
+
+EXPORT_C TPtr8 CBufSeg::BackPtr(TInt aPos)
+//
+// Return a pointer to the buffer which has the maximum amount of data
+// before aPos, and the amount of data remaining.  
+//
+/**
+Gets a pointer descriptor to represent the data starting at the beginning
+of the contiguous region containing that byte through to the byte immediately
+preceding the specified byte.
+
+The descriptor always points to the beginning of the segment containing the
+specified byte. The time needed for calculation of the pointer depends on how
+many segments there are in the buffer, and how near the target segment is to
+the segment which was last used in the buffer.
+
+@param aPos Buffer position: must be in range zero to Size().
+
+@return Descriptor representing the back contiguous region. 
+
+@see CBufBase::BackPtr
+*/
+
+
+	{
+
+    if (aPos==0)
+		return(TPtr8(NULL,0,0));
+    SetSBO(aPos);
+    if (iOffset)
+        return(TPtr8((TUint8 *)(iSeg+1),iOffset,iOffset));
+    TBufSegLink *pL=iSeg->Prev();
+	TInt len=pL->iLen;
+	return(TPtr8((TUint8 *)(pL+1),len,len));
+	}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32/euser/cbase/ub_circ.cpp	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,312 @@
+// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32\euser\cbase\ub_circ.cpp
+// 
+//
+
+#include "ub_std.h"
+
+EXPORT_C CCirBufBase::CCirBufBase(TInt aSize)
+/**
+Constructor taking the size of an object within the buffer.
+
+@param aSize The size of an object in the buffer.
+
+@panic E32USER-CBase 72, if aSize is zero or negative. 
+*/
+	: iSize(aSize)
+	{
+
+	__ASSERT_ALWAYS(iSize>0,Panic(ECircItemSizeNegativeOrZero));
+//	iCount=0;
+//	iLength=0;
+//	iPtr=NULL;
+//	iPtrE=NULL;
+//	iHead=NULL;
+//	iTail=NULL;
+	}
+
+EXPORT_C CCirBufBase::~CCirBufBase()
+/**
+Destructor.
+
+This frees the memory allocated to the buffer.
+*/
+	{
+
+	User::Free(iPtr);
+	}
+
+EXPORT_C void CCirBufBase::SetLengthL(TInt aLength)
+/**
+Sets the maximum capacity of this circular buffer, and resets all
+of the buffer pointers.
+
+The capacity is the maximum number of elements that the buffer can hold.
+
+The buffer itself is allocated as a result of a call to this function. If 
+the function has previously been called, then any existing buffer is freed and 
+any information in it is lost.
+
+Notes:
+
+1. This function must be called before attempting to add any objects to
+   the buffer.
+
+2. The function can leave if there is insufficient memory available to
+   allocate the buffer.
+
+@param aLength The maximum capacity of the circular buffer.
+
+@panic E32USER-CBase 73, if aLength is zero or negative. 
+*/
+	{
+
+	__ASSERT_ALWAYS(aLength>0,Panic(ECircSetLengthNegativeOrZero));
+	iPtr=(TUint8 *)User::ReAllocL(iPtr,aLength*iSize);
+	iPtrE=iPtr+(aLength*iSize);
+	iHead=iTail=iPtr;
+	iLength=aLength;
+	iCount=0;
+	}
+
+EXPORT_C void CCirBufBase::Reset()
+/**
+Empties the buffer.
+*/
+	{
+
+	iHead=iTail=iPtr;
+	iCount=0;
+#if defined(_DEBUG)
+	Mem::FillZ(iPtr,iLength*iSize);
+#endif
+	}
+
+EXPORT_C TInt CCirBufBase::DoAdd(const TUint8 *aPtr)
+/**
+Implementation function for CCirBuf::Add(const T*)
+
+Adds a single object to the circular buffer, but only if there is
+space available.
+
+@param aPtr A pointer to the object to be added.
+
+@return 1 if the object is successfully added. 0 if the object cannot be added 
+        because the circular buffer is full.
+
+@panic E32USER-CBase 74, if a call to CCirBufBase::SetLengthL() has not been
+                         made before calling this function.
+
+@see CCirBuf::Add
+@see CCirBufBase::SetLengthL
+*/
+	{
+
+	__ASSERT_ALWAYS(iPtr!=NULL,Panic(ECircNoBufferAllocated));
+	if (iCount>=iLength)
+		return(KErrNone);
+	Mem::Copy(iHead,aPtr,iSize);
+	iCount++;
+	iHead+=iSize;
+	if (iHead>=iPtrE)
+		iHead=iPtr;
+	return(1);
+	}
+
+EXPORT_C TInt CCirBufBase::DoAdd(const TUint8 *aPtr,TInt aCount)
+/**
+Implementation function for CCirBuf::Add(const T*,TInt)
+
+Adds multiple objects to the circular buffer, but only if there is
+space available.
+
+@param aPtr   A pointer to a set of contiguous objects to be added.
+
+@param aCount The number of objects to be added.
+
+@return The number of objects successfully added to the buffer. This value 
+        may be less than the number requested and can range from 0 to aCount. 
+
+@panic E32USER-CBase 74, if a call to CCirBufBase::SetLengthL() has not been
+                         made before calling this function.
+@panic E32USER-CBase 75, if aCount is not a positive value. 
+
+@see CCirBuf::Add
+@see CCirBufBase::SetLengthL
+*/
+	{
+
+	__ASSERT_ALWAYS(iPtr!=NULL,Panic(ECircNoBufferAllocated));
+	__ASSERT_ALWAYS(aCount>0,Panic(ECircAddCountNegative));
+	TInt rem=iLength-iCount;
+	if (rem==0)
+		return(0);
+	aCount=Min(aCount,rem);
+	rem=(iPtrE-iHead)/iSize;
+	if (aCount<=rem)
+		iHead=Mem::Copy(iHead,aPtr,aCount*iSize);
+	else
+		{
+		TInt len=(rem*iSize);
+		Mem::Copy(iHead,aPtr,len);
+		iHead=Mem::Copy(iPtr,aPtr+len,(aCount*iSize)-len);
+		}
+	if (iHead>=iPtrE)
+		iHead=iPtr;
+	iCount+=aCount;
+	return(aCount);
+	}
+
+EXPORT_C TInt CCirBufBase::DoRemove(TUint8 *aPtr)
+/**
+Implementation function for CCirBuf::Remove(T*)
+
+Removes a single object from the circular buffer, but only if there are
+objects in the buffer.
+
+A binary copy of the object is made to aPtr.
+
+@param aPtr A pointer to a location supplied by the caller.
+
+@return 1 if an object is successfully removed. 0 if an object cannot be removed 
+        because the circular buffer is empty.
+
+@see CCirBuf::Remove
+*/
+	{
+
+	if (iCount==0)
+		return(0);
+	Mem::Copy(aPtr,iTail,iSize);
+	iTail+=iSize;
+	if (iTail>=iPtrE)
+		iTail=iPtr;
+	iCount--;
+	return(1);
+	}
+
+EXPORT_C TInt CCirBufBase::DoRemove(TUint8 *aPtr,TInt aCount)
+/**
+Implementation function for CCirBuf::Remove(T*,TInt)
+
+Attempts to remove aCount objects from the circular buffer, but only if there
+are objects in the buffer.
+
+A binary copy of the objects is made to aPtr.
+
+@param aPtr   A pointer to a location supplied by the caller capable of
+              holding aCount objects.
+
+@param aCount The number of objects to be removed from the circular buffer.
+
+@return The number of objects successfully removed from the buffer. This value
+        may be less than the number requested, and can range from 0 to aCount.
+
+@panic E32USER-CBase 76, if aCount is not a positive value.
+
+@see CCirBuf::Remove
+*/
+	{
+
+	if (iCount==0)
+		return(0);
+	__ASSERT_ALWAYS(aCount>0,Panic(ECircRemoveCountNegative));
+	aCount=Min(aCount,iCount);
+	TInt rem=(iPtrE-iTail)/iSize;
+	TInt len=rem*iSize;
+	if (aCount<=rem)
+		{
+		Mem::Copy(aPtr,iTail,aCount*iSize);
+		iTail+=aCount*iSize;
+		}
+	else
+		{
+		Mem::Copy(aPtr,iTail,len);
+		rem=(aCount*iSize)-len;
+		Mem::Copy(aPtr+len,iPtr,rem);
+		iTail=iPtr+rem;
+		}
+	if (iTail>=iPtrE)
+		iTail=iPtr;
+	iCount-=aCount;
+	return(aCount);
+	}
+
+EXPORT_C CCirBuffer::CCirBuffer()
+	: CCirBuf<TUint8>()
+/**
+Default C++ constructor.
+*/
+	{}
+
+EXPORT_C CCirBuffer::~CCirBuffer()
+/**
+Destructor
+*/
+	{
+	}
+
+EXPORT_C TInt CCirBuffer::Get()
+/**
+Removes an unsigned 8-bit integer value from the circular buffer and returns
+its value. 
+
+The returned TUint8 is promoted to a TInt to allow for negative error codes, 
+e.g. KErrGeneral.
+
+@return The unsigned 8-bit integer value removed from the circular buffer.
+        KErrGeneral, if the circular buffer is empty.
+*/
+	{
+
+	if (iCount==0)
+		return(KErrGeneral);
+	TUint8 *p=iTail++;
+	if (iTail>=iPtrE)
+		iTail=iPtr;
+	iCount--;
+	return(*p);
+	}
+
+EXPORT_C TInt CCirBuffer::Put(TInt aVal)
+/**
+Adds an unsigned 8-bit integer value in the range 0 to 255 to the circular buffer.
+
+If the specified integer is outside the range 0 to 255,
+this method discards all but the lowest 8 bits and treats those
+as the unsigned integer to store.
+For example, specifying -2 (or 510, or -258, etc) will result in 254 being stored,
+and therefore in 254 being returned by the Get() method
+(and not the number passed to Put()).
+
+@param aVal The unsigned 8-bit integer value to be added.
+@return KErrNone, if the unsigned integer is successfully added.
+        KErrGeneral, if the unsigned integer cannnot be added because
+        the circular buffer is full.
+
+@see CCirBuffer::Get()
+*/
+	{
+
+	__ASSERT_ALWAYS(iPtr!=NULL,Panic(ECircNoBufferAllocated));
+	if (iCount>=iLength)
+		return(KErrGeneral);
+	*iHead++=(TUint8)aVal;
+	if (iHead>=iPtrE)
+		iHead=iPtr;
+	iCount++;
+	return(KErrNone);
+	}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32/euser/cbase/ub_cln.cpp	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,780 @@
+// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32\euser\cbase\ub_cln.cpp
+// 
+//
+
+#include "ub_std.h"
+#include "us_data.h"
+
+const TInt KCleanupGranularity=4;
+const TInt KCleanupInitialSlots=8;
+
+LOCAL_C void doDelete(CBase *aPtr)
+//
+// Delete the CBase pointer
+//
+	{
+
+	delete aPtr;
+	}
+
+LOCAL_C CCleanup &cleanup()
+//
+// Return the CTrapHandler's cleanup list.
+//
+	{
+
+	TCleanupTrapHandler *pH=(TCleanupTrapHandler *)GetTrapHandler();
+	__ASSERT_ALWAYS(pH!=NULL,Panic(EClnNoTrapHandlerInstalled));
+	return(pH->Cleanup());
+	}
+
+
+
+
+TCleanupTrapHandler::TCleanupTrapHandler()
+	: iCleanup(NULL)
+/**
+Default constructor.
+*/
+	{}
+
+
+
+
+void TCleanupTrapHandler::Trap()
+/**
+Deals with the invocation of a call to TRAP.
+*/
+	{
+
+	iCleanup->NextLevel();
+	}
+
+
+
+
+void TCleanupTrapHandler::UnTrap()
+/**
+Deals with a function exiting a TRAP without leaving.
+*/
+	{
+
+	iCleanup->PreviousLevel();
+	}
+
+
+
+
+void TCleanupTrapHandler::Leave(TInt /*aValue*/)
+/**
+Deals with a function within a TRAP leaving.
+	
+@param aValue The leave value.
+*/
+	{
+
+	iCleanup->PopAndDestroyAll();
+	}
+
+
+
+
+class TCleanupStackItem
+	{
+public:
+	void Set(const TCleanupItem &aItem);
+	inline void Cleanup();
+	inline TBool IsLevelMarker() const;
+	inline void MarkLevel();
+	inline void PushLevel();
+	inline TInt PopLevel();
+	inline TBool Check(TAny* aExpectedItem) const;
+private:
+	TCleanupOperation iOperation;
+	union
+		{
+		TAny *iPtr;
+		TInt iLevelCount;			// may stack >1 level on this entry
+		};
+	};
+inline void TCleanupStackItem::MarkLevel()
+	{ iOperation=NULL; iLevelCount=1; }
+inline TBool TCleanupStackItem::IsLevelMarker() const
+	{ return (iOperation==NULL); }
+inline void TCleanupStackItem::Cleanup()
+	{ (*iOperation)(iPtr); }
+inline void TCleanupStackItem::PushLevel()
+	{ ++iLevelCount; }
+inline TInt TCleanupStackItem::PopLevel()
+	{ return (--iLevelCount); }
+inline TBool TCleanupStackItem::Check(TAny* aExpectedItem) const
+	{ return (iOperation && iPtr==aExpectedItem); }
+
+void TCleanupStackItem::Set(const TCleanupItem &anItem)
+//
+// Initialise an entry as a cleanup item.
+//
+	{
+
+	__ASSERT_ALWAYS(anItem.iOperation!=NULL,Panic(EClnNoCleanupOperation));
+	iOperation=anItem.iOperation;
+	iPtr=anItem.iPtr;
+	}
+
+
+
+
+EXPORT_C CCleanup *CCleanup::New()
+/**
+Creates a new cleanup stack object.
+
+The cleanup stack itself is allocated with enough space initially to hold 
+a number of stack items.
+
+@return A pointer to the new cleanup stack object. This is Null if there is 
+        insufficient memory.
+*/
+	{
+
+	CCleanup *pC=new CCleanup;
+	if (pC!=NULL)
+		{
+		TCleanupStackItem *base=(TCleanupStackItem *)User::Alloc(KCleanupInitialSlots*sizeof(TCleanupStackItem));
+		if (base!=NULL)
+			{
+			pC->iBase=base;
+			pC->iNext=base;
+			pC->iTop=base+KCleanupInitialSlots;
+			}
+		else
+			{
+			delete pC;
+			pC=NULL;
+			}
+		}
+	return(pC);
+	}
+
+
+
+
+EXPORT_C CCleanup *CCleanup::NewL()
+/**
+Creates a new cleanup stack object, and leaves if there is insufficient memory 
+to create it.
+
+The cleanup stack itself is allocated with enough space initially to hold 
+a number of stack items.
+
+@return A pointer to the new cleanup stack object. This is Null if there is 
+        nsufficient memory.
+*/
+	{
+
+	CCleanup *pC=New();
+	User::LeaveIfNull(pC);
+	return(pC);
+	}
+
+
+
+
+EXPORT_C CCleanup::CCleanup()
+/**
+Default constructor.
+*/
+	{
+
+//	iBase=NULL;
+//	iTop=NULL;
+//	iNext=NULL;
+	}
+
+
+
+
+EXPORT_C CCleanup::~CCleanup()
+/**
+Destructor.
+
+Pops and destroys all items from the cleanup stack and then destroys
+the cleanup stack itself.
+*/
+	{
+
+	while (iNext>iBase)
+		PopAndDestroyAll();
+	User::Free(iBase);
+	}
+
+
+
+
+EXPORT_C void CCleanup::NextLevel()
+/**
+Goes to the next cleanup level.
+*/
+	{
+
+	if (iNext>iBase && (iNext-1)->IsLevelMarker())
+		(iNext-1)->PushLevel();
+	else
+		{
+		iNext->MarkLevel();
+		++iNext;
+		}
+	}
+
+
+
+
+EXPORT_C void CCleanup::PreviousLevel()
+/**
+Goes to the previous cleanup level.
+
+@panic E32USER-CBase 71 If the previous stack item does not represent a cleanup 
+       level.
+*/
+	{
+
+	TCleanupStackItem *item=iNext;
+	--item;
+	// current level must be empty
+	__ASSERT_ALWAYS(item->IsLevelMarker(), Panic(EClnLevelNotEmpty));
+	if (item->PopLevel())
+		++item;
+	iNext=item;
+	}
+
+
+
+
+EXPORT_C void CCleanup::PushL(TAny *aPtr)
+/**
+Pushes a cleanup item onto the cleanup stack.
+
+The cleanup item represents an operation that frees the specified heap cell.
+
+@param aPtr A pointer to a heap cell that will be freed by
+            the cleanup operation.
+*/
+	{
+
+	PushL(TCleanupItem(User::Free,aPtr));
+	}
+
+
+
+
+EXPORT_C void CCleanup::PushL(CBase *anObject)
+/**
+Pushes a cleanup item onto the cleanup stack.
+
+The cleanup item represents an operation that deletes the specified CBase 
+derived object.
+
+@param anObject A pointer to CBase derived object that will be deleted by 
+                the cleanup operation.
+*/
+	{
+
+	PushL(TCleanupItem(TCleanupOperation(doDelete),anObject));
+	}
+
+
+
+
+EXPORT_C void CCleanup::PushL(TCleanupItem anItem)
+/**
+Pushes a cleanup item onto the cleanup stack.
+
+The cleanup item represents a call back operation that performs the required 
+cleanup.
+
+@param anItem Encapsulates a cleanup operation and an object on which the 
+              cleanup operation is to be performed.
+              
+@see CleanupClosePushL
+@see CleanupReleasePushL
+@see CleanupDeletePushL
+*/
+	{
+
+	TCleanupStackItem *item=iNext;
+	__ASSERT_ALWAYS(item>iBase,Panic(EClnPushAtLevelZero));
+	__ASSERT_ALWAYS(item<iTop,Panic(EClnNoFreeSlotItem));
+	item->Set(anItem);
+	iNext=++item;
+//
+// We always try and make sure that there are two free slots in the cleanup array.
+// one for a level marker and one for an item to follow it
+// If this fails its o.k. as we have already added the entry to the list, so
+// it will be cleaned up o.k.
+//
+	if (item+1>=iTop)
+		{
+		TInt size=(TUint8 *)(iTop+KCleanupGranularity)-(TUint8 *)iBase;
+		TCleanupStackItem *base=(TCleanupStackItem *)User::ReAllocL(iBase,size);
+		iNext=PtrAdd(base,(TUint8 *)item-(TUint8 *)iBase);
+		iBase=base;
+		iTop=PtrAdd(base,size);
+		}
+	}
+
+
+
+
+EXPORT_C void CCleanup::DoPop(TInt aCount,TBool aDestroy)
+/**
+Provides an implementation for Pop() and PopAndDestroy().
+
+@param aCount   The number of cleanup items to be popped from
+                the cleanup stack.
+@param aDestroy ETrue, if cleanup is to be performed; EFalse, otherwise.
+*/
+	{
+
+	__ASSERT_ALWAYS(aCount>=0,Panic(EClnPopCountNegative));
+	__ASSERT_ALWAYS((iNext-aCount)>=iBase,Panic(EClnPopUnderflow));
+	while (aCount--)
+		{
+		--iNext;
+		__ASSERT_ALWAYS(!iNext->IsLevelMarker(),Panic(EClnPopAcrossLevels));
+		if (aDestroy)
+			{
+			TInt offset = iNext - iBase;
+			iNext->Cleanup();
+			// Check that there are no extra items on the cleanup stack
+			// (if there are, we will not be deleting the right aCount items)
+			__ASSERT_ALWAYS((iNext - iBase) == offset,Panic(EClnStackModified));
+			}
+		}
+	}
+
+
+
+
+EXPORT_C void CCleanup::DoPopAll(TBool aDestroy)
+/**
+Provides an implementation for PopAll() and PopAndDestroyAll().
+
+@param aDestroy ETrue, if cleanup is to be performed; EFalse, otherwise.
+*/
+	{
+
+	__ASSERT_ALWAYS(iNext>iBase,Panic(EClnLevelUnderflow));
+	while (!(--iNext)->IsLevelMarker())
+		{
+		if (aDestroy)
+			iNext->Cleanup();
+		}
+	if (iNext->PopLevel())
+		++iNext;				// still marks a level
+	}
+
+
+
+
+EXPORT_C void CCleanup::Pop()
+/**
+Pops a single cleanup item from the cleanup stack.
+
+@panic E32USER-CBase 64 If there are no items on the cleanup stack.
+@panic E32USER-CBase 63 If a cleanup level is crossed.
+*/
+	{
+
+	DoPop(1,EFalse);
+	}
+
+
+
+
+EXPORT_C void CCleanup::Pop(TInt aCount)
+/**
+Pops the specified number of cleanup items from the cleanup stack.
+
+@param aCount The number of cleanup items to be popped from the cleanup stack.
+
+@panic E32USER-CBase 70 If the specified number of cleanup items is negative.
+@panic E32USER-CBase 64 If the specifed number of items is greater than the 
+       number of items on the cleanup stack.
+@panic E32USER-CBase 63 If the specified number of items is such that it causes 
+       a cleanup level to be crossed.
+*/
+	{
+
+	DoPop(aCount,EFalse);
+	}
+
+
+
+
+EXPORT_C void CCleanup::PopAll()
+/**
+Pops all cleanup items at the current level, and then decrements the level.
+*/
+	{
+
+	DoPopAll(EFalse);
+	}
+
+
+
+
+EXPORT_C void CCleanup::PopAndDestroy()
+/**
+Pops a single cleanup item from the cleanup stack, and invokes its cleanup 
+operation.
+
+@panic E32USER-CBase 64 If there are no items on the cleanup stack.
+@panic E32USER-CBase 63 If a cleanup level is crossed.
+*/
+	{
+
+	DoPop(1,ETrue);
+	}
+
+
+
+
+EXPORT_C void CCleanup::PopAndDestroy(TInt aCount)
+/**
+Pops the specified number of cleanup items from the cleanup stack, and invokes 
+their cleanup operations.
+
+@param aCount The number of cleanup items to be popped from the cleanup stack.
+
+@panic E32USER-CBase 70 If the specified number of cleanup items is negative.
+@panic E32USER-CBase 64 If the specifed number of items is greater than the 
+       number of items on the cleanup stack.
+@panic E32USER-CBase 63 If the specified number of items is such that it causes 
+       a cleanup level to be crossed.
+*/
+	{
+
+	DoPop(aCount,ETrue);
+	}
+
+
+
+
+EXPORT_C void CCleanup::PopAndDestroyAll()
+/**
+Pops all cleanup items at the current level, invokes their cleanup operations 
+and then decrements the level.
+*/
+	{
+
+	DoPopAll(ETrue);
+	}
+
+
+
+
+EXPORT_C void CCleanup::Check(TAny* aExpectedItem)
+/**
+Checks that the cleanup item at the top of the cleanup stack
+represents a cleanup operation for the specified object.
+
+@param aExpectedItem The object which is the subject of the test.
+*/
+	{
+
+	TCleanupStackItem* last=iNext-1;
+	__ASSERT_ALWAYS(last>=iBase && last->Check(aExpectedItem), Panic(EClnCheckFailed));
+	}
+
+
+
+
+EXPORT_C CTrapCleanup *CTrapCleanup::New()
+/**
+Allocates and constructs a cleanup stack.
+
+If successfully constructed, this cleanup stack becomes
+the current cleanup stack.
+
+@return A pointer to the new cleanup stack. This pointer is NULL, if allocation 
+        fails.
+*/
+	{
+
+	CTrapCleanup *pT=new CTrapCleanup;
+	if (pT!=NULL)
+		{
+		CCleanup *pC=CCleanup::New();
+		if (pC!=NULL)
+			{
+			pT->iHandler.iCleanup=pC;
+			pT->iOldHandler=User::SetTrapHandler(&pT->iHandler);
+			}
+		else
+			{
+			delete pT;
+			pT=NULL;
+			}
+		}
+	return(pT);
+	}
+
+
+
+
+EXPORT_C CTrapCleanup::CTrapCleanup()
+/**
+Default constructor.
+*/
+//	: iHandler()
+	{
+	}
+
+
+
+
+EXPORT_C CTrapCleanup::~CTrapCleanup()
+/**
+Destructor.
+
+Frees resources owned by the object, prior to its destruction. This cleanup 
+stack ceases to be the current cleanup stack.
+
+If there is a stack of cleanup stacks, then the next cleanup stack becomes 
+the current cleanup stack.
+*/
+	{
+
+	if (iHandler.iCleanup!=NULL)
+		{
+		User::SetTrapHandler(iOldHandler);
+		delete iHandler.iCleanup;
+		}
+	}
+
+
+
+
+EXPORT_C void CleanupStack::PushL(TAny *aPtr)
+/**
+Pushes a pointer to an object onto the cleanup stack.
+
+If a leave occurs while an object is on the stack, it is cleaned
+up automatically. Untyped objects are cleaned up with User::Free()
+(a rather limited form of cleanup, not even the C++ destructor is called).
+
+Typically, when an object has been fully constructed and it can be guaranteed
+that a pointer to this new object is stored in some other object before a leave
+occurs, issue CleanupStack::Pop() to pop it back off the stack.
+
+If no cleanup stack has been allocated, a panic occurs.
+
+It is guaranteed that the object is pushed onto the cleanup stack. However,
+this function may leave if a stack frame for the next PushL() cannot be
+allocated. In this case, the cleanup stack will be cleaned up as normal, and
+no extra programmer intervention is needed.
+
+@param aPtr Pointer to any object. If cleanup is necessary, the object will be
+            freed by User::Free(), which does not invoke any destructor: it
+            simply frees its memory
+
+@panic E32USER-CBase 66 if a call to this function is made when no prior
+       call to TRAP has been made.
+*/
+	{
+
+	cleanup().PushL(aPtr);
+	}
+
+
+
+
+EXPORT_C void CleanupStack::PushL(CBase *aPtr)
+/**
+Pushes a pointer to an object onto the cleanup stack.
+
+If a leave occurs while an object is on the stack, it is cleaned
+up automatically. CBase derived objects are cleaned up with delete.
+
+Typically, when an object has been fully constructed and it can be guaranteed
+that a pointer to this new object is stored in some other object before a leave
+occurs, issue CleanupStack::Pop() to pop it back off the stack. 
+
+If no cleanup stack has been allocated, a panic occurs.
+
+It is guaranteed that the object is pushed onto the cleanup stack. However,
+this function may leave if a stack frame for the next PushL() cannot be
+allocated. In this case, the cleanup stack will be cleaned up as normal,
+and no extra programmer intervention is needed.
+
+@param aPtr Pointer to a CBase-derived object. If cleanup is necessary, the
+            object will be freed by delete, thus invoking its destructor,
+            and freeing its memory.
+
+@panic E32USER-CBase 66 if a call to this function is made when no prior
+       call to TRAP has been made.
+*/
+	{
+
+	cleanup().PushL(aPtr);
+	}
+
+
+
+
+EXPORT_C void CleanupStack::PushL(TCleanupItem anItem)
+/**
+Pushes a cleanup item onto the cleanup stack.
+
+If a leave occurs while a cleanup item is on the stack, the cleanup operation
+defined in the construction of the TCleanupItem, is invoked.
+
+Typically, when an object has been fully constructed and it can be guaranteed
+that a pointer to this new object is stored in some other object before a leave
+occurs, issue CleanupStack::Pop() to pop it back off the stack. 
+
+If no cleanup stack has been allocated, a panic occurs.
+
+It is guaranteed that the object is pushed onto the cleanup stack. However,
+this function may leave if a stack frame for the next PushL() cannot be
+allocated. In this case, the cleanup stack will be cleaned up as normal,
+and no extra programmer intervention is needed.
+
+@param anItem A cleanup item. If cleanup is necessary, the cleanup operation
+              defined in the construction of anItem is called.
+
+@panic E32USER-CBase 66 if a call to this function is made when no prior
+       call to TRAP has been made.
+*/		
+	{
+
+	cleanup().PushL(anItem);
+	}
+
+
+
+
+EXPORT_C void CleanupStack::Pop()
+/**
+Pops an object previously pushed onto the cleanup stack
+by CleanupStack::PushL(). 
+
+After an object has been successfully constructed and stored within
+another object, it cannot be orphaned and, therefore, the object
+(i.e. a pointer or a cleanup item) can be popped from the cleanup stack.
+
+If no cleanup stack has been allocated, or there is nothing on the stack,
+a panic is raised.
+*/
+	{
+
+	cleanup().Pop();
+	}
+
+
+
+
+EXPORT_C void CleanupStack::Pop(TInt aCount)
+/**
+Pops a specified number of objects previously pushed onto the
+cleanup stack by CleanupStack::PushL().
+
+After an object has been successfully constructed and stored within another
+object, it cannot be orphaned and, therefore, the object(s), that is, pointers
+and cleanup items can be popped from the cleanup stack.
+
+If no cleanup stack has been allocated, or there is nothing on the stack,
+a panic is raised.
+
+@param aCount The number of objects to be popped off the cleanup stack.
+*/
+	{
+
+	cleanup().Pop(aCount);
+	}
+
+
+
+
+EXPORT_C void CleanupStack::PopAndDestroy()
+/**
+Pops and cleans up an item pushed onto the stack.
+
+If the item on the stack is a CBase* pointer, the pointer is removed from
+the stack and the object is destroyed with delete.
+
+If the item on the stack is a TAny* pointer, the pointer is removed from
+the stack and the memory occupied by the object is freed with User::Free().
+
+If the item on the stack is a cleanup item, i.e. an object of
+type TCleanupItem, the item is removed from the stack and the cleanup
+operation defined during construction of the TCleanupItem object is invoked.
+
+If no cleanup stack has been allocated, or there is nothing on the stack,
+a panic occurs.
+*/
+	{
+
+	cleanup().PopAndDestroy();
+	}
+
+
+
+
+EXPORT_C void CleanupStack::PopAndDestroy(TInt aCount)
+/**
+Pops and cleans up the specified number of items pushed onto the stack.
+
+If an item on the stack is a CBase* pointer, the pointer is removed from 
+the stack and the object is destroyed with delete.
+
+If an item on the stack is a TAny* pointer, the pointer is removed from the 
+stack and the memory occupied by the object is freed with User::Free().
+
+If an item on the stack is a cleanup item, i.e. an object of type TCleanupItem, 
+the item is removed from the stack and the cleanup operation defined during 
+construction of the TCleanupItem object is invoked.
+
+If no cleanup stack has been allocated, or there is nothing on the stack, 
+a panic occurs.
+
+@param aCount The number of objects to be popped off the cleanup stack and 
+destroyed.
+*/
+	{
+
+	cleanup().PopAndDestroy(aCount);
+	}
+
+
+
+
+EXPORT_C void CleanupStack::Check(TAny* aExpectedItem)
+/**
+Checks that the specified object is at the top of the cleanup stack.
+
+If the specified item is not at the top of the cleanup stack, then the function 
+raises an E32USER-CBase 90 panic.
+
+The function is part of Symbian OS in both debug and release builds, and is 
+an aid to debugging.
+
+@param aExpectedItem A pointer to the item expected to be at the top of the 
+                     cleanup stack.
+*/
+	{
+
+	cleanup().Check(aExpectedItem);
+	}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32/euser/cbase/ub_cons.cpp	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,415 @@
+// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32\euser\cbase\ub_cons.cpp
+// 
+//
+
+#include "ub_std.h"
+#ifndef __TOOLS2__
+#include <e32uid.h>
+#include <e32wins.h>
+#else
+#if defined _WIN32
+#include <cstdio>
+#else
+#include <stdio.h>
+#include <wchar.h>
+#endif
+#endif
+
+
+/**
+Default constructor.
+*/
+EXPORT_C CConsoleBase::CConsoleBase()
+	{
+	}
+
+
+
+/**
+Destructor.
+*/
+EXPORT_C CConsoleBase::~CConsoleBase()
+	{
+	}
+
+
+
+
+/**
+Gets a character from the console.
+
+@return the key code from the console.
+*/
+EXPORT_C TKeyCode CConsoleBase::Getch()
+	{
+
+	TRequestStatus s;
+	Read(s);
+	User::WaitForRequest(s);
+	__ASSERT_ALWAYS(s==KErrNone,Panic(EConsGetchFailed));
+	return(KeyCode());
+	}
+
+
+
+
+/**
+Prints characters to the console window.
+
+@param aFmt             The  non-modifiable descriptor containing the
+                        format string. The TRefByValue class provides a
+                        constructor which takes a TDesC type. 
+
+@param ...              A variable number of arguments to be converted to text
+                        as dictated by the format string. 
+*/
+EXPORT_C void CConsoleBase::Printf(TRefByValue<const TDesC> aFmt,...)
+	{
+
+	TestOverflowTruncate overflow;
+	VA_LIST list;
+	VA_START(list,aFmt);
+	TBuf<0x100> aBuf;
+	aBuf.AppendFormatList(aFmt,list,&overflow);
+	Write(aBuf);
+	}
+
+
+
+/**
+Sets the cursor's x-position.
+
+@param aX The x-position.
+*/
+EXPORT_C void CConsoleBase::SetPos(TInt aX)
+	{
+
+	SetCursorPosAbs(TPoint(aX,WhereY()));
+	}
+
+
+
+
+/**
+Sets the cursor's x-position and y-position.
+
+@param aX The x-position.
+@param aY The y-position.
+*/
+EXPORT_C void CConsoleBase::SetPos(TInt aX,TInt aY)
+	{
+
+	SetCursorPosAbs(TPoint(aX,aY));
+	}
+
+
+
+
+/**
+Gets the cursor's x-position.
+
+@return The cursor's x-position.
+*/
+EXPORT_C TInt CConsoleBase::WhereX() const
+	{
+
+	return(CursorPos().iX);
+	}
+
+
+
+/**
+Gets the cursor's y-position.
+
+@return The cursor's y-position.
+*/
+EXPORT_C TInt CConsoleBase::WhereY() const
+	{
+
+	return(CursorPos().iY);
+	}
+
+
+/**
+Extension function
+
+
+*/
+EXPORT_C TInt CConsoleBase::Extension_(TUint aExtensionId, TAny*& a0, TAny* a1)
+	{
+	return CBase::Extension_(aExtensionId, a0, a1);
+	}
+
+
+#ifndef __TOOLS2__
+
+void CColorConsoleBase::SetTextAttribute(TTextAttribute /*anAttribute*/)
+//
+//
+//
+	{
+	}
+
+
+/**
+Extension function
+
+
+*/
+EXPORT_C TInt CColorConsoleBase::Extension_(TUint aExtensionId, TAny*& a0, TAny* a1)
+	{
+	return CConsoleBase::Extension_(aExtensionId, a0, a1);
+	}
+
+
+NONSHARABLE_CLASS(CProxyConsole) : public CColorConsoleBase
+	{
+public:
+	~CProxyConsole();
+	TInt Construct(const TDesC& aImplDll);
+public:
+// implement for CConsoleBase
+	TInt Create(const TDesC &aTitle,TSize aSize);
+	void Read(TRequestStatus &aStatus);
+	void ReadCancel();
+	void Write(const TDesC &aDes);
+	TPoint CursorPos() const;
+	void SetCursorPosAbs(const TPoint &aPoint);
+	void SetCursorPosRel(const TPoint &aPoint);
+	void SetCursorHeight(TInt aPercentage);
+	void SetTitle(const TDesC &aTitle);
+	void ClearScreen();
+	void ClearToEndOfLine();
+	TSize ScreenSize() const;
+	TKeyCode KeyCode() const;
+	TUint KeyModifiers() const;
+// implement for CColorConsoleBase
+	void SetTextAttribute(TTextAttribute anAttribute); 
+	virtual TInt Extension_(TUint aExtensionId, TAny*& a0, TAny* a1);
+private:
+	RLibrary iLib;
+	CColorConsoleBase* iConsole;
+	};
+
+TInt CProxyConsole::Construct(const TDesC& aImplDll)
+	{
+	const TUidType type(KNullUid, KSharedLibraryUid, KConsoleDllUid);
+	TInt r=iLib.Load(aImplDll,type);
+	if (r==KErrNone)
+		{
+		iConsole=(CColorConsoleBase*)(iLib.Lookup(1)());
+		if (!iConsole)
+			r=KErrNoMemory;
+		}
+	return r;
+	}
+
+CProxyConsole::~CProxyConsole()
+	{
+	delete iConsole;
+	iLib.Close();
+	}
+
+TInt CProxyConsole::Create(const TDesC &aTitle,TSize aSize)
+	{
+	return iConsole->Create(aTitle,aSize);
+	}
+	
+void CProxyConsole::Read(TRequestStatus &aStatus)
+	{
+	iConsole->Read(aStatus);
+	}
+	
+void CProxyConsole::ReadCancel()
+	{
+	iConsole->ReadCancel();
+	}
+	
+void CProxyConsole::Write(const TDesC &aDes)
+	{
+	iConsole->Write(aDes);
+	}
+	
+TPoint CProxyConsole::CursorPos() const
+	{
+	return iConsole->CursorPos();
+	}
+	
+void CProxyConsole::SetCursorPosAbs(const TPoint &aPoint)
+	{
+	iConsole->SetCursorPosAbs(aPoint);
+	}
+	
+void CProxyConsole::SetCursorPosRel(const TPoint &aPoint)
+	{
+	iConsole->SetCursorPosRel(aPoint);
+	}
+	
+void CProxyConsole::SetCursorHeight(TInt aPercentage)
+	{
+	iConsole->SetCursorHeight(aPercentage);
+	}
+	
+void CProxyConsole::SetTitle(const TDesC &aTitle)
+	{
+	iConsole->SetTitle(aTitle);
+	}
+	
+void CProxyConsole::ClearScreen()
+	{
+	iConsole->ClearScreen();
+	}
+	
+void CProxyConsole::ClearToEndOfLine()
+	{
+	iConsole->ClearToEndOfLine();
+	}
+	
+TSize CProxyConsole::ScreenSize() const
+	{
+	return iConsole->ScreenSize();
+	}
+	
+TKeyCode CProxyConsole::KeyCode() const
+	{
+	return iConsole->KeyCode();
+	}
+	
+TUint CProxyConsole::KeyModifiers() const
+	{
+	return iConsole->KeyModifiers();
+	}
+	
+void CProxyConsole::SetTextAttribute(TTextAttribute anAttribute)
+	{
+	iConsole->SetTextAttribute(anAttribute);
+	}
+
+TInt CProxyConsole::Extension_(TUint aExtensionId, TAny*& a0, TAny* a1)
+	{
+	return iConsole->Extension_(aExtensionId, a0, a1);
+	}
+
+_LIT(KConsImpl,"econs");
+#ifdef __WINS__
+_LIT(KConsGuiImpl,"econseik");
+_LIT(KConsNoGuiImpl,"econsnogui");
+#endif
+
+
+
+/**
+Creates a new console object.
+
+@param aTitle The title text for the console.
+              This should not be longer than 256 characters.
+@param aSize  The size of the console window.
+
+@return A pointer to the new console object.
+
+@see CConsoleBase::Create() 
+*/
+EXPORT_C CConsoleBase *Console::NewL(const TDesC &aTitle,TSize aSize)
+	{
+	CProxyConsole *pC=new(ELeave) CProxyConsole;
+	TInt r=pC->Construct(KConsImpl);
+	if (r==KErrNone)
+		r=pC->Create(aTitle,aSize);
+#ifdef __WINS__
+	if (r!=KErrNone)
+		{
+		delete pC;
+		pC=new(ELeave) CProxyConsole;
+		if (EmulatorNoGui())
+			{
+			// try and create a dummy console via ECONSNOGUI
+			r=pC->Construct(KConsNoGuiImpl);
+			}
+		else
+			{
+			// try and create a GUI console via ECONSEIK instead
+			r=pC->Construct(KConsGuiImpl);
+			}
+		if (r==KErrNone)
+			r=pC->Create(aTitle,aSize);
+		}
+#endif
+	if (r!=KErrNone)
+		{
+		delete pC;
+		User::Leave(r);
+		}
+	return(pC);
+	}
+#else // __TOOLS2__
+class CStdConsole : public CConsoleBase
+	{
+public:
+	CStdConsole() {};
+	~CStdConsole() {};
+	//
+	TInt Create(const TDesC &aTitle,TSize aSize) { return KErrNone; };
+	void ReadCancel() {};
+	TPoint CursorPos() const { return TPoint(0,0); };
+	void SetCursorPosAbs(const TPoint &aPoint) {};
+	void SetCursorPosRel(const TPoint &aPoint) {};
+	void SetCursorHeight(TInt aPercentage) {};
+	void SetTitle(const TDesC &aTitle) {};
+	void ClearScreen() {};
+	void ClearToEndOfLine() {};
+	TSize ScreenSize() const { return TSize(0,0); };
+	TUint KeyModifiers() const { return 0; };
+	//
+	void Read(TRequestStatus &aStatus);
+	void Write(const TDesC &aDes);
+	TKeyCode KeyCode() const { return iKey; };
+	//
+private:
+	TKeyCode iKey;
+	TBuf16<256> iBuf;
+	};
+
+void CStdConsole::Read(TRequestStatus &aStatus)
+	{
+	iKey = TKeyCode(getchar());
+	aStatus = KErrNone;
+	}
+
+void CStdConsole::Write(const TDesC &aDes)
+	{
+	TInt pos = 0;
+#ifdef _WIN32
+	while(pos < aDes.Length())
+		{
+		TInt len = Min(aDes.Length() - pos, iBuf.MaxLength() - 1);
+		iBuf.Copy(aDes.Mid(pos, len));
+		
+		pos += iBuf.Length();
+		wprintf(reinterpret_cast<const wchar_t*>(iBuf.PtrZ()));
+		}
+#else
+	while(pos < aDes.Length())
+	{
+		putchar(aDes[pos++]);
+	}
+#endif
+	}
+
+EXPORT_C CConsoleBase *Console::NewL(const TDesC &aTitle, TSize aSize)
+	{
+	return new(ELeave)CStdConsole;
+	}
+#endif // __TOOLS2__
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32/euser/cbase/ub_std.h	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,27 @@
+// Copyright (c) 1994-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32\euser\cbase\ub_std.h
+// 
+//
+
+#include <e32std.h>
+#include <e32base.h>
+#include <e32cons.h>
+#include <e32ver.h>
+#include <e32panic.h>
+#include <u32exec.h>
+
+
+GLREF_C void Panic(TBasePanic aPanic);
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32/euser/cbase/ub_utl.cpp	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,67 @@
+// Copyright (c) 1994-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32\euser\cbase\ub_utl.cpp
+// 
+//
+
+#include "ub_std.h"
+
+_LIT(KE32UserCBase, "E32USER-CBase");
+GLDEF_C void Panic(TBasePanic aPanic)
+//
+// Panic the process with E32USER-ADT as the category.
+//
+	{
+
+	User::Panic(KE32UserCBase, aPanic);
+	}
+
+
+
+
+/**
+Virtual destructor.
+
+Enables any derived object to be deleted through a CBase* pointer.
+*/
+EXPORT_C CBase::~CBase()
+	{
+	}
+
+
+
+/**
+Extension function
+
+
+*/
+EXPORT_C TInt CBase::Extension_(TUint, TAny*& a0, TAny*)
+	{
+	a0 = NULL;
+	return KErrExtensionNotSupported;
+	}
+
+
+
+
+/**
+Deletes the specified object.
+
+@param aPtr Pointer to the CBase derived object to be deleted.
+*/
+EXPORT_C void CBase::Delete(CBase* aPtr)
+	{
+	delete aPtr;
+	}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32/euser/epoc/x86/uc_i64.cia	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,233 @@
+// Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32\euser\epoc\x86\uc_i64.cia
+//
+//
+
+#include "u32std.h"
+#include <e32math.h>
+
+extern "C" void UDiv64();
+
+EXPORT_C __NAKED__ void Math::Mul64(Int64 /*aX*/, Int64 /*aY*/, Int64& /*aOutH*/, Uint64& /*aOutL*/)
+/**
+Multiply aX by aY to generate a 128 bit result.
+
+The high order 64 bits of this calculation are stored in aOutH,
+and the low order 64 bits are stored in aOutL.
+
+@param aX     The first 64-bit operand.
+@param aY     The second 64-bit operand.
+@param aOutH  The high order 64 bits of the result.
+@param aOutL  The low order  64 bits of the result.
+*/
+	{
+	asm("mov eax, [esp+4]");
+	asm("mul dword ptr [esp+12]");	// edx:eax = x0*y0
+	asm("push edi");
+	asm("push esi");
+	asm("push ebx");				// [esp+16]=&aX, [esp+24]=&aY, [esp+32]=&aOutH, [esp+36]=&aOutL
+	asm("mov ecx, eax");
+	asm("mov ebx, edx");			// ebx:ecx = x0*y0
+	asm("mov eax, [esp+16]");
+	asm("mul dword ptr [esp+28]");	// edx:eax = x0*y1
+	asm("xor esi, esi");
+	asm("add ebx, eax");
+	asm("adc esi, edx");			// esi:ebx:ecx = x0*y
+	asm("mov eax, [esp+20]");		// eax=x1
+	asm("imul dword ptr [esp+28]");	// edx:eax = x1*y1
+	asm("mov edi, edx");
+	asm("add esi, eax");
+	asm("adc edi, 0");				// partial result in edi:esi:ebx:ecx
+	asm("cmp dword ptr [esp+28],0");// y<0 ?
+	asm("jns mul64_ypos");
+	asm("sub esi, [esp+16]");		// if so, subtract x0<<64
+	asm("sbb edi, 0");
+	asm("mul64_ypos:");
+	asm("mov eax, [esp+20]");		// eax=x1
+	asm("cmp eax, 0");				// x<0 ?
+	asm("jns mul64_xpos");
+	asm("sub esi, [esp+24]");		// if so, subtract y0<<64
+	asm("sbb edi, 0");
+	asm("mul64_xpos:");
+	asm("mul dword ptr [esp+24]");	// edx:eax = x1*y0
+	asm("add ebx, eax");
+	asm("mov eax, [esp+32]");		// eax=&aOutH
+	asm("adc esi, edx");
+	asm("mov edx, [esp+36]");		// edx=&aOutL
+	asm("adc edi, 0");				// full result now in edi:esi:ebx:ecx
+	asm("mov [eax], esi");
+	asm("mov [eax+4], edi");		// store high 64
+	asm("mov [edx], ecx");
+	asm("mov [edx+4], ebx");		// store low 64
+	asm("pop ebx");
+	asm("pop esi");
+	asm("pop edi");
+	asm("ret");
+	}
+
+
+
+
+EXPORT_C __NAKED__ void Math::UMul64(Uint64 /*aX*/, Uint64 /*aY*/, Uint64& /*aOutH*/, Uint64& /*aOutL*/)
+/**
+Multiply aX by aY to generate a 128 bit result.
+
+The high order 64 bits of this calculation are stored in aOutH,
+and the low order 64 bits are stored in aOutL.
+
+@param aX     The first 64-bit operand.
+@param aY     The second 64-bit operand.
+@param aOutH  The high order 64 bits of the result.
+@param aOutL  The low order  64 bits of the result.
+*/
+	{
+	asm("mov eax, [esp+4]");
+	asm("mul dword ptr [esp+12]");	// edx:eax = x0*y0
+	asm("push edi");
+	asm("push esi");
+	asm("push ebx");				// [esp+16]=&aX, [esp+24]=&aY, [esp+32]=&aOutH, [esp+36]=&aOutL
+	asm("mov ecx, eax");
+	asm("mov ebx, edx");			// ebx:ecx = x0*y0
+	asm("mov eax, [esp+16]");
+	asm("mul dword ptr [esp+28]");	// edx:eax = x0*y1
+	asm("xor esi, esi");
+	asm("add ebx, eax");
+	asm("adc esi, edx");			// esi:ebx:ecx = x0*y
+	asm("mov eax, [esp+20]");		// eax=x1
+	asm("mul dword ptr [esp+28]");	// edx:eax = x1*y1
+	asm("mov edi, edx");
+	asm("add esi, eax");
+	asm("adc edi, 0");				// partial result in edi:esi:ebx:ecx
+	asm("mov eax, [esp+20]");
+	asm("mul dword ptr [esp+24]");	// edx:eax = x1*y0
+	asm("add ebx, eax");
+	asm("mov eax, [esp+32]");		// eax=&aOutH
+	asm("adc esi, edx");
+	asm("mov edx, [esp+36]");		// edx=&aOutL
+	asm("adc edi, 0");				// full result now in edi:esi:ebx:ecx
+	asm("mov [eax], esi");
+	asm("mov [eax+4], edi");		// store high 64
+	asm("mov [edx], ecx");
+	asm("mov [edx+4], ebx");		// store low 64
+	asm("pop ebx");
+	asm("pop esi");
+	asm("pop edi");
+	asm("ret");
+	}
+
+
+
+
+EXPORT_C __NAKED__ Int64 Math::DivMod64(Int64 /*aDividend*/, Int64 /*aDivisor*/, Int64& /*aRemainder*/)
+/**
+Divides aDividend by aDivisor.
+
+The quotient is returned, and the remainder is stored in aRemainder.
+The remainder has same sign as the dividend.
+
+@param aDividend The 64-bit dividend.
+@param aDivisor  The 64-bit divisor.
+@param aRemainder The 64-bit remainder.
+
+@return The 64-bit quotient.
+*/
+	{
+	asm("mov eax, [esp+4]");
+	asm("mov edx, [esp+8]");		// edx:eax = dividend
+	asm("cmp edx, 0");
+	asm("jns divmod64_0");
+	asm("neg edx");
+	asm("neg eax");
+	asm("sbb edx, 0");
+
+	asm("divmod64_0:");				// edx:eax = ABS{dividend}
+	asm("push edi");
+	asm("push esi");
+	asm("push ebx");
+	asm("push ebp");
+	asm("mov esi, [esp+28]");
+	asm("mov edi, [esp+32]");		// edi:esi = dividend
+	asm("cmp edi, 0");
+	asm("jns divmod64_1");
+	asm("neg edi");
+	asm("neg esi");
+	asm("sbb edi, 0"); // edi:esi = ABS{dividend}
+
+	asm("divmod64_1:");
+	asm("call %a0": : "i"(&UDiv64));	// do division, quotient in ebx:eax remainder in edi:edx
+	asm("xchg ebx, edx");			// quotient in edx:eax, remainder in edi:ebx
+	asm("mov ecx, [esp+24]");		// ecx=dividend high
+	asm("xor ecx, [esp+32]");		// ecx=dividend high ^ divisor high
+	asm("jns divmod64_2");
+	asm("neg edx");
+	asm("neg eax");
+	asm("sbb edx, 0");
+
+	asm("divmod64_2:");				// edx:eax = quotient with correct sign
+	asm("cmp dword ptr [esp+24], 0");
+	asm("jns divmod64_3");
+	asm("neg edi");
+	asm("neg ebx");
+	asm("sbb edi, 0");
+
+	asm("divmod64_3:");				// edi:ebx = remainder with correct sign
+	asm("mov ecx, [esp+36]");		// ecx=&aRemainder
+	asm("mov [ecx], ebx");
+	asm("mov [ecx+4], edi");
+	asm("pop ebp");
+	asm("pop ebx");
+	asm("pop esi");
+	asm("pop edi");
+	asm("ret");
+	}
+
+
+
+
+EXPORT_C __NAKED__ Uint64 Math::UDivMod64(Uint64 /*aDividend*/, Uint64 /*aDivisor*/, Uint64& /*aRemainder*/)
+/**
+Divides aDividend by aDivisor.
+
+The quotient is returned, and the remainder is stored in aRemainder.
+
+@param aDividend The 64-bit dividend.
+@param aDivisor  The 64-bit divisor.
+@param aRemainder The 64-bit remainder.
+
+@return The 64-bit quotient.
+*/
+	{
+	asm("mov eax, [esp+4]");
+	asm("mov edx, [esp+8]");		// edx:eax = dividend
+	asm("push edi");
+	asm("push esi");
+	asm("push ebx");
+	asm("push ebp");
+	asm("mov esi, [esp+28]");
+	asm("mov edi, [esp+32]");		// edi:esi = dividend
+	asm("call %a0": : "i"(&UDiv64));	// do division, quotient in ebx:eax remainder in edi:edx
+	asm("xchg ebx, edx");			// quotient in edx:eax, remainder in edi:ebx
+	asm("mov ecx, [esp+36]");		// ecx=&aRemainder
+	asm("mov [ecx], ebx");
+	asm("mov [ecx+4], edi");
+	asm("pop ebp");
+	asm("pop ebx");
+	asm("pop esi");
+	asm("pop edi");
+	asm("ret");
+	}
+
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32/euser/epoc/x86/uc_realx.cia	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,3348 @@
+// Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32\euser\epoc\x86\uc_realx.cia
+// 
+//
+
+
+#include "u32std.h"
+#include <e32math.h>
+
+
+void TRealXPanic(TInt aErr);
+
+LOCAL_C __NAKED__ void TRealXPanicEax(void)
+	{
+	asm("push eax");
+	asm("call %a0": : "i"(&TRealXPanic));
+	}
+
+LOCAL_C __NAKED__ void TRealXRealIndefinite(void)
+	{
+	// return 'real indefinite' NaN in ecx,edx:ebx
+	asm("mov ecx, 0xFFFF0001");	// exponent=FFFF, sign negative
+	asm("mov edx, 0xC0000000"); // mantissa=C0000000 00000000
+	asm("xor ebx, ebx");
+	asm("mov eax, -6"); // return KErrArgument
+	asm("ret");
+	}
+
+LOCAL_C __NAKED__ void TRealXBinOpNaN(void)
+	{
+	// generic routine to process NaN's in binary operations
+	// destination operand in ecx,edx:eax
+	// source operand at [esi]
+
+	asm("mov eax, [esi+8]");			// source operand into eax,edi:ebp
+	asm("mov edi, [esi+4]");
+	asm("mov ebp, [esi]");
+	asm("cmp ecx, 0xFFFF0000");			// check if dest is a NaN
+	asm("jb short TRealXBinOpNaN1");	// if not, swap them
+	asm("cmp edx, 0x80000000");
+	asm("jne short TRealXBinOpNaN2");
+	asm("test ebx, ebx");
+	asm("jne short TRealXBinOpNaN2");
+	asm("TRealXBinOpNaN1:");			// swap the operands
+	asm("xchg ecx, eax");
+	asm("xchg edx, edi");
+	asm("xchg ebx, ebp");
+	asm("TRealXBinOpNaN2:");
+	asm("cmp eax, 0xFFFF0000");			// check if both operands are NaNs
+	asm("jb short TRealXBinOpNaN4");	// if not, ignore non-NaN operand
+	asm("cmp edi, 0x80000000");
+	asm("jne short TRealXBinOpNaN3");
+	asm("test ebp, ebp");
+	asm("je short TRealXBinOpNaN4");
+	asm("TRealXBinOpNaN3:");			// if both operands are NaN's, compare significands
+	asm("cmp edx, edi");
+	asm("ja short TRealXBinOpNaN4");
+	asm("jb short TRealXBinOpNaN5");
+	asm("cmp ebx, ebp");
+	asm("jae short TRealXBinOpNaN4");
+	asm("TRealXBinOpNaN5:");			// come here if dest is smaller - copy source to dest
+	asm("mov ecx, eax");
+	asm("mov edx, edi");
+	asm("mov ebx, ebp");
+	asm("TRealXBinOpNaN4:");			// NaN with larger significand is in ecx,edx:ebx
+	asm("or edx, 0x40000000");			// convert an SNaN to a QNaN
+	asm("mov eax, -6");					// return KErrArgument
+	asm("ret");
+	}
+
+// Add TRealX at [esi] + ecx,edx:ebx
+// Result in ecx,edx:ebx
+// Error code in eax
+// Note:	+0 + +0 = +0, -0 + -0 = -0, +0 + -0 = -0 + +0 = +0,
+//			+/-0 + X = X + +/-0 = X, X + -X = -X + X = +0
+LOCAL_C __NAKED__ void TRealXAdd()
+	{
+	asm("xor ch, ch");				// clear rounding flags
+	asm("cmp ecx, 0xFFFF0000");		// check if dest=NaN or infinity
+	asm("jnc addfpsd");				// branch if it is
+	asm("mov eax, [esi+8]");		// fetch sign/exponent of source
+	asm("cmp eax, 0xFFFF0000");		// check if source=NaN or infinity
+	asm("jnc addfpss");				// branch if it is
+	asm("cmp eax, 0x10000");		// check if source=0
+	asm("jc addfp0s");				// branch if it is
+	asm("cmp ecx, 0x10000");		// check if dest=0
+	asm("jc addfp0d");				// branch if it is
+	asm("and cl, 1");				// clear bits 1-7 of ecx
+	asm("and al, 1");				// clear bits 1-7 of eax
+	asm("mov ch, cl");
+	asm("xor ch, al");				// xor of signs into ch bit 0
+	asm("add ch, ch");
+	asm("or cl, ch");				// and into cl bit 1
+	asm("or al, ch");				// and al bit 1
+	asm("xor ch, ch");				// clear rounding flags
+	asm("mov ebp, [esi]");			// fetch source mantissa 0-31
+	asm("mov edi, [esi+4]");		// fetch source mantissa 32-63
+	asm("ror ecx, 16");				// dest exponent into cx
+	asm("ror eax, 16");				// source exponent into ax
+	asm("push ecx");				// push dest exponent/sign
+	asm("sub cx, ax");				// cx = dest exponent - source exponent
+	asm("je short addfp3b");		// if equal, no shifting required
+	asm("ja short addfp1");			// branch if dest exponent >= source exponent
+	asm("xchg ebx, ebp");			// make sure edi:ebp contains the mantissa to be shifted
+	asm("xchg edx, edi");			
+	asm("xchg eax, [esp]");			// and larger exponent and corresponding sign is on the stack
+	asm("neg cx");					// make cx positive = number of right shifts needed
+	asm("addfp1:");
+	asm("cmp cx, 64");				// if more than 64 shifts needed
+	asm("ja addfp2");				// branch to output larger number
+	asm("jb addfp3");				// branch if <64 shifts
+	asm("mov eax, edi");			// exactly 64 shifts needed - rounding word=mant high
+	asm("test ebp, ebp");			// check bits lost
+	asm("jz short addfp3a");
+	asm("or ch, 1");				// if not all zero, set rounded-down flag
+	asm("addfp3a:");
+	asm("xor edi, edi");			// clear edx:ebx
+	asm("xor ebp, ebp");			
+	asm("jmp short addfp5");		// finished shifting
+	asm("addfp3b:");				// exponents equal
+	asm("xor eax, eax");			// set rounding word=0
+	asm("jmp short addfp5");
+	asm("addfp3:");
+	asm("cmp cl, 32");				// 32 or more shifts needed ?
+	asm("jb short addfp4");			// skip if <32
+	asm("mov eax, ebp");			// rounding word=mant low
+	asm("mov ebp, edi");			// mant low=mant high
+	asm("xor edi, edi");			// mant high=0
+	asm("sub cl, 32");				// reduce count by 32
+	asm("jz short addfp5");			// if now zero, finished shifting
+	asm("shrd edi, eax, cl");		// shift ebp:eax:edi right by cl bits
+	asm("shrd eax, ebp, cl");		//
+	asm("shr ebp, cl");				//
+	asm("test edi, edi");			// check bits lost in shift
+	asm("jz short addfp5");			// if all zero, finished
+	asm("or ch, 1");				// else set rounded-down flag
+	asm("xor edi, edi");			// clear edx again
+	asm("jmp short addfp5");		// finished shifting
+	asm("addfp4:");					// <32 shifts needed now
+	asm("xor eax, eax");			// clear rounding word initially
+	asm("shrd eax, ebp, cl");		// shift edi:ebp:eax right by cl bits
+	asm("shrd ebp, edi, cl");		//
+	asm("shr edi, cl");				//
+
+	asm("addfp5:");
+	asm("mov [esp+3], ch");			// rounding flag into ch image on stack
+	asm("pop ecx");					// recover sign and exponent into ecx, with rounding flag
+	asm("ror ecx, 16");				// into normal position
+	asm("test cl, 2");				// addition or subtraction needed ?
+	asm("jnz short subfp1");		// branch if subtraction
+	asm("add ebx,ebp");				// addition required - add mantissas
+	asm("adc edx,edi");				//
+	asm("jnc short roundfp");		// branch if no carry
+	asm("rcr edx,1");				// shift carry right into mantissa
+	asm("rcr ebx,1");				//
+	asm("rcr eax,1");				// and into rounding word
+	asm("jnc short addfp5a");
+	asm("or ch, 1");				// if 1 shifted out, set rounded-down flag
+	asm("addfp5a:");
+	asm("add ecx, 0x10000");		// and increment exponent
+
+	// perform rounding based on rounding word in eax and rounding flag in ch
+	asm("roundfp:");
+	asm("cmp eax, 0x80000000");		
+	asm("jc roundfp0");				// if rounding word<80000000, round down
+	asm("ja roundfp1");				// if >80000000, round up
+	asm("test ch, 1");
+	asm("jnz short roundfp1");		// if rounded-down flag set, round up
+	asm("test ch, 2");
+	asm("jnz short roundfp0");		// if rounded-up flag set, round down
+	asm("test bl, 1");				// else test mantissa lsb
+	asm("jz short roundfp0");		// round down if 0, up if 1 [round to even]
+	asm("roundfp1:");				// Come here to round up
+	asm("add ebx, 1");				// increment mantissa
+	asm("adc edx,0");				//
+	asm("jnc roundfp1a");			// if no carry OK
+	asm("rcr edx,1");				// else shift carry into mantissa [edx:ebx=0 here]
+	asm("add ecx, 0x10000");		// and increment exponent
+	asm("roundfp1a:");
+	asm("cmp ecx, 0xFFFF0000");		// check for overflow
+	asm("jae short addfpovfw");		// jump if overflow
+	asm("mov ch, 2");				// else set rounded-up flag
+	asm("xor eax, eax");			// return KErrNone
+	asm("ret");
+
+	asm("roundfp0:");				// Come here to round down
+	asm("cmp ecx, 0xFFFF0000");		// check for overflow
+	asm("jae short addfpovfw");		// jump if overflow
+	asm("test eax, eax");			// else check if rounding word zero
+	asm("jz short roundfp0a");		// if so, leave rounding flags as they are
+	asm("mov ch, 1");				// else set rounded-down flag
+	asm("roundfp0a:");				
+	asm("xor eax, eax");			// return KErrNone
+	asm("ret");
+
+	asm("addfpovfw:");				// Come here if overflow occurs
+	asm("xor ch, ch");				// clear rounding flags, exponent=FFFF
+	asm("xor ebx, ebx");
+	asm("mov edx, 0x80000000");		// mantissa=80000000 00000000 for infinity
+	asm("mov eax, -9");				// return KErrOverflow
+	asm("ret");
+
+	// exponents differ by more than 64 - output larger number
+	asm("addfp2:");					
+	asm("pop ecx");					// recover exponent and sign
+	asm("ror ecx, 16");				// into normal position
+	asm("or ch, 1");				// set rounded-down flag
+	asm("test cl, 2");				// check if signs the same
+	asm("jz addfp2a");
+	asm("xor ch, 3");				// if not, set rounded-up flag
+	asm("addfp2a:");
+	asm("xor eax, eax");			// return KErrNone
+	asm("ret");
+
+	// signs differ, so must subtract mantissas
+	asm("subfp1:");
+	asm("add ch, ch");				// if rounded-down flag set, change it to rounded-up
+	asm("neg eax");					// subtract rounding word from 0
+	asm("sbb ebx, ebp");			// and subtract mantissas with borrow
+	asm("sbb edx, edi");			//
+	asm("jnc short subfp2");		// if no borrow, sign is correct
+	asm("xor cl, 1");				// else change sign of result
+	asm("shr ch, 1");				// change rounding back to rounded-down
+	asm("not eax");					// negate rounding word
+	asm("not ebx");					// and mantissa
+	asm("not edx");					//
+	asm("add eax,1");				// two's complement negation
+	asm("adc ebx,0");				//
+	asm("adc edx,0");				//
+	asm("subfp2:");
+	asm("jnz short subfp3");		// branch if edx non-zero at this point
+	asm("mov edx, ebx");			// else shift ebx into edx
+	asm("or edx, edx");				//
+	asm("jz short subfp4");			// if still zero, branch
+	asm("mov ebx, eax");			// else shift rounding word into ebx
+	asm("xor eax, eax");			// and zero rounding word
+	asm("sub ecx, 0x200000");		// decrease exponent by 32 due to shift
+	asm("jnc short subfp3");		// if no borrow, carry on
+	asm("jmp short subfpundflw");	// if borrow here, underflow
+	asm("subfp4:");
+	asm("mov edx, eax");			// move rounding word into edx
+	asm("or edx, edx");				// is edx still zero ?
+	asm("jz short subfp0");			// if so, result is precisely zero
+	asm("xor ebx, ebx");			// else zero ebx and rounding word
+	asm("xor eax, eax");			//
+	asm("sub ecx, 0x400000");		// and decrease exponent by 64 due to shift
+	asm("jc short subfpundflw");	// if borrow, underflow
+	asm("subfp3:");
+	asm("mov edi, ecx");			// preserve sign and exponent
+	asm("bsr ecx, edx");			// position of most significant 1 into ecx
+	asm("neg ecx");					//
+	asm("add ecx, 31");				// cl = 31-position of MS 1 = number of shifts to normalise
+	asm("shld edx, ebx, cl");		// shift edx:ebx:eax left by cl bits
+	asm("shld ebx, eax, cl");		//
+	asm("shl eax, cl");				//
+	asm("mov ebp, ecx");			// bit count into ebp for subtraction
+	asm("shl ebp, 16");				// shift left by 16 to align with exponent
+	asm("mov ecx, edi");			// exponent, sign, rounding flags back into ecx
+	asm("sub ecx, ebp");			// subtract shift count from exponent
+	asm("jc short subfpundflw");	// if borrow, underflow
+	asm("cmp ecx, 0x10000");		// check if exponent 0
+	asm("jnc roundfp");				// if not, jump to round result, else underflow
+
+	// come here if underflow
+	asm("subfpundflw:");			
+	asm("and ecx, 1");				// set exponent to zero, leave sign
+	asm("xor edx, edx");
+	asm("xor ebx, ebx");
+	asm("mov eax, -10");			// return KErrUnderflow
+	asm("ret");
+
+	// come here to return zero result
+	asm("subfp0:");
+	asm("xor ecx, ecx");			// set exponent to zero, positive sign
+	asm("xor edx, edx");
+	asm("xor ebx, ebx");
+	asm("addfp0snzd:");
+	asm("xor eax, eax");			// return KErrNone
+	asm("ret");
+
+	// come here if source=0 - eax=source exponent/sign
+	asm("addfp0s:");
+	asm("cmp ecx, 0x10000");		// check if dest=0
+	asm("jnc addfp0snzd");			// if not, return dest unaltered
+	asm("and ecx, eax");			// else both zero, result negative iff both zeros negative
+	asm("and ecx, 1");
+	asm("xor eax, eax");			// return KErrNone
+	asm("ret");
+
+	// come here if dest=0, source nonzero
+	asm("addfp0d:");
+	asm("mov ebx, [esi]");			// return source unaltered
+	asm("mov edx, [esi+4]");
+	asm("mov ecx, [esi+8]");
+	asm("xor eax, eax");			// return KErrNone
+	asm("ret");
+
+	// come here if dest=NaN or infinity
+	asm("addfpsd:");
+	asm("cmp edx, 0x80000000");		// check for infinity
+	_ASM_jn(e,TRealXBinOpNaN)		// branch if NaN
+	asm("test ebx, ebx");
+	_ASM_jn(e,TRealXBinOpNaN)
+	asm("mov eax, [esi+8]");		// eax=second operand exponent
+	asm("cmp eax, 0xFFFF0000");		// check second operand for NaN or infinity
+	asm("jae short addfpsd1");		// branch if NaN or infinity
+	asm("addfpsd2:");
+	asm("mov eax, -9");				// else return dest unaltered [infinity] and KErrOverflow
+	asm("ret");
+	asm("addfpsd1:");
+	asm("mov ebp, [esi]");			// source mantissa into edi:ebp
+	asm("mov edi, [esi+4]");
+	asm("cmp edi, 0x80000000");		// check for infinity
+	_ASM_jn(e,TRealXBinOpNaN)		// branch if NaN
+	asm("test ebp, ebp");
+	_ASM_jn(e,TRealXBinOpNaN)
+	asm("xor al, cl");				// both operands are infinity - check signs
+	asm("test al, 1");
+	asm("jz short addfpsd2");		// if both the same, return KErrOverflow
+	asm("jmp %a0": : "i"(&TRealXRealIndefinite));		// else return 'real indefinite'
+
+	// come here if source=NaN or infinity, dest finite
+	asm("addfpss:");
+	asm("mov ebp, [esi]");			// source mantissa into edi:ebp
+	asm("mov edi, [esi+4]");
+	asm("cmp edi, 0x80000000");		// check for infinity
+	_ASM_jn(e,TRealXBinOpNaN)		// branch if NaN
+	asm("test ebp, ebp");
+	_ASM_jn(e,TRealXBinOpNaN)
+	asm("mov ecx, eax");			// if source=infinity, return source unaltered
+	asm("mov edx, edi");
+	asm("mov ebx, ebp");
+	asm("mov eax, -9");				// return KErrOverflow
+	asm("ret");
+	}
+
+// Subtract TRealX at [esi] - ecx,edx:ebx
+// Result in ecx,edx:ebx
+// Error code in eax
+LOCAL_C __NAKED__ void TRealXSubtract()
+	{
+	asm("xor cl, 1");				// negate subtrahend
+	asm("jmp %a0": :"i"(&TRealXAdd));
+	}
+
+// Multiply TRealX at [esi] * ecx,edx:ebx
+// Result in ecx,edx:ebx
+// Error code in eax
+LOCAL_C __NAKED__ void TRealXMultiply()
+	{
+	asm("xor ch, ch");				// clear rounding flags
+	asm("mov eax, [esi+8]");		// fetch sign/exponent of source
+	asm("xor cl, al");				// xor signs
+	asm("cmp ecx, 0xFFFF0000");		// check if dest=NaN or infinity
+	asm("jnc mulfpsd");				// branch if it is
+	asm("cmp eax, 0xFFFF0000");		// check if source=NaN or infinity
+	asm("jnc mulfpss");				// branch if it is
+	asm("cmp eax, 0x10000");		// check if source=0
+	asm("jc mulfp0");				// branch if it is
+	asm("cmp ecx, 0x10000");		// check if dest=0
+	asm("jc mulfp0");				// branch if it is
+	asm("push ecx");				// save result sign
+	asm("shr ecx, 16");				// dest exponent into cx
+	asm("shr eax, 16");				// source exponent into ax
+	asm("add eax, ecx");			// add exponents
+	asm("sub eax, 0x7FFE");			// eax now contains result exponent
+	asm("push eax");				// save it
+	asm("mov edi, edx");			// save dest mantissa high
+	asm("mov eax, ebx");			// dest mantissa low -> eax
+	asm("mul dword ptr [esi]");		// dest mantissa low * source mantissa low -> edx:eax
+	asm("xchg ebx, eax");			// result dword 0 -> ebx, dest mant low -> eax
+	asm("mov ebp, edx");			// result dword 1 -> ebp
+	asm("mul dword ptr [esi+4]");	// dest mant low * src mant high -> edx:eax
+	asm("add ebp, eax");			// add in partial product to dwords 1 and 2
+	asm("adc edx, 0");				//
+	asm("mov ecx, edx");			// result dword 2 -> ecx
+	asm("mov eax, edi");			// dest mant high -> eax
+	asm("mul dword ptr [esi+4]");	// dest mant high * src mant high -> edx:eax
+	asm("add ecx, eax");			// add in partial product to dwords 2, 3
+	asm("adc edx, 0");				//
+	asm("mov eax, edi");			// dest mant high -> eax
+	asm("mov edi, edx");			// result dword 3 -> edi
+	asm("mul dword ptr [esi]");		// dest mant high * src mant low -> edx:eax
+	asm("add ebp, eax");			// add in partial product to dwords 1, 2
+	asm("adc ecx, edx");			//
+	asm("adc edi, 0");				// 128-bit mantissa product is now in edi:ecx:ebp:ebx
+	asm("mov edx, edi");			// top 64 bits into edx:ebx
+	asm("mov edi, ebx");			
+	asm("mov ebx, ecx");			// bottom 64 bits now in ebp:edi
+	asm("pop ecx");					// recover exponent
+	asm("js short mulfp1");			// skip if mantissa normalised
+	asm("add edi, edi");			// else shift left [only one shift will be needed]
+	asm("adc ebp, ebp");
+	asm("adc ebx, ebx");
+	asm("adc edx, edx");
+	asm("dec ecx");					// and decrement exponent
+	asm("mulfp1:");
+	asm("cmp ebp, 0x80000000");		// compare bottom 64 bits with 80000000 00000000 for rounding
+	asm("ja short mulfp2");			// branch to round up
+	asm("jb short mulfp3");			// branch to round down
+	asm("test edi, edi");
+	asm("jnz short mulfp2");		// branch to round up
+	asm("test bl, 1");				// if exactly half-way, test LSB of result mantissa
+	asm("jz short mulfp4");			// if LSB=0, round down [round to even]
+	asm("mulfp2:");
+	asm("add ebx, 1");				// round up - increment mantissa
+	asm("adc edx, 0");
+	asm("jnc short mulfp2a");
+	asm("rcr edx, 1");
+	asm("inc ecx");	
+	asm("mulfp2a:");
+	asm("mov al, 2");				// set rounded-up flag
+	asm("jmp short mulfp5");
+	asm("mulfp3:");					// round down
+	asm("xor al, al");				// clear rounding flags
+	asm("or ebp, edi");				// check for exact result
+	asm("jz short mulfp5");			// skip if exact
+	asm("mulfp4:");					// come here to round down when we know result inexact
+	asm("mov al, 1");				// else set rounded-down flag
+	asm("mulfp5:");					// final mantissa now in edx:ebx, exponent in ecx
+	asm("cmp ecx, 0xFFFF");			// check for overflow
+	asm("jge short mulfp6");		// branch if overflow
+	asm("cmp ecx, 0");				// check for underflow
+	asm("jle short mulfp7");		// branch if underflow
+	asm("shl ecx, 16");				// else exponent up to top end of ecx
+	asm("mov ch, al");				// rounding flags into ch
+	asm("pop eax");					// recover result sign
+	asm("mov cl, al");				// into cl
+	asm("xor eax, eax");			// return KErrNone
+	asm("ret");
+
+	// come here if overflow
+	asm("mulfp6:");					
+	asm("pop eax");					// recover result sign
+	asm("mov ecx, 0xFFFF0000");		// exponent=FFFF
+	asm("mov cl, al");				// sign into cl
+	asm("mov edx, 0x80000000");		// set mantissa to 80000000 00000000 for infinity
+	asm("xor ebx, ebx");
+	asm("mov eax, -9");				// return KErrOverflow
+	asm("ret");
+
+	// come here if underflow
+	asm("mulfp7:");				
+	asm("pop eax");					// recover result sign
+	asm("xor ecx, ecx");			// exponent=0
+	asm("mov cl, al");				// sign into cl
+	asm("xor edx, edx");
+	asm("xor ebx, ebx");
+	asm("mov eax, -10");			// return KErrUnderflow
+	asm("ret");
+
+	// come here if either operand zero
+	asm("mulfp0:");
+	asm("and ecx, 1");				// set exponent=0, keep sign
+	asm("xor edx, edx");
+	asm("xor ebx, ebx");
+	asm("xor eax, eax");			// return KErrNone
+	asm("ret");
+
+	// come here if destination operand NaN or infinity
+	asm("mulfpsd:");
+	asm("cmp edx, 0x80000000");		// check for infinity
+	_ASM_jn(e,TRealXBinOpNaN)		// branch if NaN
+	asm("test ebx, ebx");
+	_ASM_jn(e,TRealXBinOpNaN)
+	asm("cmp eax, 0xFFFF0000");		// check second operand for NaN or infinity
+	asm("jae short mulfpsd1");		// branch if NaN or infinity
+	asm("cmp eax, 0x10000");		// check if second operand zero
+	_ASM_j(c,TRealXRealIndefinite)	// if so, return 'real indefinite'
+	asm("mov eax, -9");				// else return dest [infinity] with xor sign and KErrOverflow
+	asm("ret");
+	asm("mulfpsd1:");
+	asm("mov ebp, [esi]");			// source mantissa into edi:ebp
+	asm("mov edi, [esi+4]");		
+	asm("cmp edi, 0x80000000");		// check for infinity
+	_ASM_jn(e,TRealXBinOpNaN)		// branch if NaN
+	asm("test ebp, ebp");
+	_ASM_jn(e,TRealXBinOpNaN)
+	asm("mov eax, -9");				// both operands infinity - return infinity with xor sign
+	asm("ret");						// and KErrOverflow
+
+	// come here if source operand NaN or infinity, destination finite
+	asm("mulfpss:");
+	asm("mov ebp, [esi]");			// source mantissa into edi:ebp
+	asm("mov edi, [esi+4]");
+	asm("cmp edi, 0x80000000");		// check for infinity
+	_ASM_jn(e,TRealXBinOpNaN)		// branch if NaN
+	asm("test ebp, ebp");
+	_ASM_jn(e,TRealXBinOpNaN)
+	asm("cmp ecx, 0x10000");		// source=infinity, check if dest=0
+	_ASM_j(c,TRealXRealIndefinite)	// if so, return 'real indefinite'
+	asm("or ecx, 0xFFFF0000");		// set exp=FFFF, leave xor sign in cl
+	asm("mov edx, edi");			// set mantissa for infinity
+	asm("mov ebx, ebp");
+	asm("mov eax, -9");				// return KErrOverflow
+	asm("ret");
+	}
+
+// Divide 96-bit unsigned dividend EDX:EAX:0 by 64-bit unsigned divisor ECX:EBX
+// Assume ECX bit 31 = 1, ie 2^63 <= divisor < 2^64
+// Assume the quotient fits in 32 bits
+// Return 32 bit quotient in EDI
+// Return 64 bit remainder in EBP:ESI
+LOCAL_C __NAKED__ void LongDivide(void)
+	{
+	asm("push edx");				// save dividend
+	asm("push eax");				//
+	asm("cmp edx, ecx");			// check if truncation of divisor will overflow DIV instruction
+	asm("jb short longdiv1");		// skip if not
+	asm("xor eax, eax");			// else return quotient of 0xFFFFFFFF
+	asm("dec eax");					//
+	asm("jmp short longdiv2");		//
+	asm("longdiv1:");
+	asm("div ecx");					// divide EDX:EAX by ECX to give approximate quotient in EAX
+	asm("longdiv2:");
+	asm("mov edi, eax");			// save approx quotient
+	asm("mul ebx");					// multiply approx quotient by full divisor ECX:EBX
+	asm("mov esi, eax");			// first partial product into EBP:ESI
+	asm("mov ebp, edx");			//
+	asm("mov eax, edi");			// approx quotient back into eax
+	asm("mul ecx");					// upper partial product now in EDX:EAX
+	asm("add eax, ebp");			// add to form 96-bit product in EDX:EAX:ESI
+	asm("adc edx, 0");				//
+	asm("neg esi");					// remainder = dividend - approx quotient * divisor
+	asm("mov ebp, [esp]");			// fetch dividend bits 32-63
+	asm("sbb ebp, eax");			//
+	asm("mov eax, [esp+4]");		// fetch dividend bits 64-95
+	asm("sbb eax, edx");			// remainder is now in EAX:EBP:ESI
+	asm("jns short longdiv4");		// if remainder positive, quotient is correct, so exit
+	asm("longdiv3:");
+	asm("dec edi");					// else quotient is too big, so decrement it
+	asm("add esi, ebx");			// and add divisor to remainder
+	asm("adc ebp, ecx");			//
+	asm("adc eax, 0");				//
+	asm("js short longdiv3");		// if still negative, repeat [requires <4 iterations]
+	asm("longdiv4:");
+	asm("add esp, 8");				// remove dividend from stack
+	asm("ret");						// return with quotient in EDI, remainder in EBP:ESI
+	}
+
+// Divide TRealX at [esi] / ecx,edx:ebx
+// Result in ecx,edx:ebx
+// Error code in eax
+LOCAL_C __NAKED__ void TRealXDivide(void)
+	{
+	asm("xor ch, ch");				// clear rounding flags
+	asm("mov eax, [esi+8]");		// fetch sign/exponent of dividend
+	asm("xor cl, al");				// xor signs
+	asm("cmp eax, 0xFFFF0000");		// check if dividend=NaN or infinity
+	asm("jnc divfpss");				// branch if it is
+	asm("cmp ecx, 0xFFFF0000");		// check if divisor=NaN or infinity
+	asm("jnc divfpsd");				// branch if it is
+	asm("cmp ecx, 0x10000");		// check if divisor=0
+	asm("jc divfpdv0");				// branch if it is
+	asm("cmp eax, 0x10000");		// check if dividend=0
+	asm("jc divfpdd0");				// branch if it is
+	asm("push esi");				// save pointer to dividend
+	asm("push ecx");				// save result sign
+	asm("shr ecx, 16");				// divisor exponent into cx
+	asm("shr eax, 16");				// dividend exponent into ax
+	asm("sub eax, ecx");			// subtract exponents
+	asm("add eax, 0x7FFE");			// eax now contains result exponent
+	asm("push eax");				// save it
+	asm("mov ecx, edx");			// divisor mantissa into ecx:ebx
+	asm("mov edx, [esi+4]");		// dividend mantissa into edx:eax
+	asm("mov eax, [esi]");			
+	asm("xor edi, edi");			// clear edi initially
+	asm("cmp edx, ecx");			// compare EDX:EAX with ECX:EBX
+	asm("jb short divfp1");			// if EDX:EAX < ECX:EBX, leave everything as is
+	asm("ja short divfp2");			//
+	asm("cmp eax, ebx");			// if EDX=ECX, then compare ls dwords
+	asm("jb short divfp1");			// if dividend mant < divisor mant, leave everything as is
+	asm("divfp2:");
+	asm("sub eax, ebx");			// else dividend mant -= divisor mant
+	asm("sbb edx, ecx");			//
+	asm("inc edi");					// and EDI=1 [bit 0 of EDI is the integer part of the result]
+	asm("inc dword ptr [esp]");		// also increment result exponent
+	asm("divfp1:");
+	asm("push edi");				// save top bit of result
+	asm("call %a0": : "i"(&LongDivide));	// divide EDX:EAX:0 by ECX:EBX to give next 32 bits of result in EDI
+	asm("push edi");				// save next 32 bits of result
+	asm("mov edx, ebp");			// remainder from EBP:ESI into EDX:EAX
+	asm("mov eax, esi");			//
+	asm("call %a0": : "i"(&LongDivide));	// divide EDX:EAX:0 by ECX:EBX to give next 32 bits of result in EDI
+	asm("test byte ptr [esp+4], 1");	// test integer bit of result
+	asm("jnz short divfp4");		// if set, no need to calculate another bit
+	asm("xor eax, eax");			//
+	asm("add esi, esi");			// 2*remainder into EAX:EBP:ESI
+	asm("adc ebp, ebp");			//
+	asm("adc eax, eax");			//
+	asm("sub esi, ebx");			// subtract divisor to generate final quotient bit
+	asm("sbb ebp, ecx");			//
+	asm("sbb eax, 0");				//
+	asm("jnc short divfp3");		// skip if no borrow - in this case eax=0
+	asm("add esi, ebx");			// if borrow add back - final remainder now in EBP:ESI
+	asm("adc ebp, ecx");			//
+	asm("adc eax, 0");				// eax will be zero after this and carry will be set
+	asm("divfp3:");
+	asm("cmc");						// final bit = 1-C
+	asm("rcr eax, 1");				// shift it into eax bit 31
+	asm("mov ebx, edi");			// result into EDX:EBX:EAX, remainder in EBP:ESI
+	asm("pop edx");
+	asm("add esp, 4");				// discard integer bit [zero]
+	asm("jmp short divfp5");		// branch to round
+
+	asm("divfp4:");					// integer bit was set
+	asm("mov ebx, edi");			// result into EDX:EBX:EAX
+	asm("pop edx");					//
+	asm("pop eax");					// integer part of result into eax [=1]
+	asm("stc");						// shift a 1 into top end of mantissa
+	asm("rcr edx,1");				//
+	asm("rcr ebx,1");				//
+	asm("rcr eax,1");				// bottom bit into eax bit 31
+
+	// when we get to here we have 65 bits of quotient mantissa in
+	// EDX:EBX:EAX (bottom bit in eax bit 31)
+	// and the remainder is in EBP:ESI
+	asm("divfp5:");
+	asm("pop ecx");					// recover result exponent
+	asm("add eax, eax");			// test rounding bit
+	asm("jnc short divfp6");		// branch to round down
+	asm("or ebp, esi");				// test remainder to see if we are exactly half-way
+	asm("jnz short divfp7");		// if not, round up
+	asm("test bl, 1");				// exactly halfway - test LSB of mantissa
+	asm("jz short divfp8");			// round down if LSB=0 [round to even]
+	asm("divfp7:");
+	asm("add ebx, 1");				// round up - increment mantissa
+	asm("adc edx, 0");
+	asm("jnc short divfp7a");
+	asm("rcr edx, 1");				// if carry, shift 1 into mantissa MSB
+	asm("inc ecx");					// and increment exponent
+	asm("divfp7a:");
+	asm("mov al, 2");				// set rounded-up flag
+	asm("jmp short divfp9");
+	asm("divfp6:");
+	asm("xor al, al");				// round down - first clear rounding flags
+	asm("or ebp, esi");				// test if result exact
+	asm("jz short divfp9");			// skip if exact
+	asm("divfp8:");					// come here to round down when we know result is inexact
+	asm("mov al, 1");				// set rounded-down flag
+	asm("divfp9:");					// final mantissa now in edx:ebx, exponent in ecx
+	asm("cmp ecx, 0xFFFF");			// check for overflow
+	asm("jge short divfp10");		// branch if overflow
+	asm("cmp ecx, 0");				// check for underflow
+	asm("jle short divfp11");		// branch if underflow
+	asm("shl ecx, 16");				// else exponent up to top end of ecx
+	asm("mov ch, al");				// rounding flags into ch
+	asm("pop eax");					// recover result sign
+	asm("mov cl, al");				// into cl
+	asm("pop esi");					// recover dividend pointer
+	asm("xor eax, eax");			// return KErrNone
+	asm("ret");
+
+	// come here if overflow
+	asm("divfp10:");
+	asm("pop eax");					// recover result sign
+	asm("mov ecx, 0xFFFF0000");		// exponent=FFFF
+	asm("mov cl, al");				// sign into cl
+	asm("mov edx, 0x80000000");		// set mantissa to 80000000 00000000 for infinity
+	asm("xor ebx, ebx");
+	asm("mov eax, -9");				// return KErrOverflow
+	asm("pop esi");					// recover dividend pointer
+	asm("ret");
+
+	// come here if underflow
+	asm("divfp11:");	
+	asm("pop eax");					// recover result sign
+	asm("xor ecx, ecx");			// exponent=0
+	asm("mov cl, al");				// sign into cl
+	asm("xor edx, edx");
+	asm("xor ebx, ebx");
+	asm("mov eax, -10");			// return KErrUnderflow
+	asm("pop esi");					// recover dividend pointer
+	asm("ret");
+
+
+	// come here if divisor=0, dividend finite
+	asm("divfpdv0:");
+	asm("cmp eax, 0x10000");		// check if dividend also zero
+	_ASM_j(c,TRealXRealIndefinite)	// if so, return 'real indefinite'
+	asm("or ecx, 0xFFFF0000");		// else set exponent=FFFF, leave xor sign in cl
+	asm("mov edx, 0x80000000");		// set mantissa for infinity
+	asm("xor ebx, ebx");
+	asm("mov eax, -41");			// return KErrDivideByZero
+	asm("ret");
+
+	// come here if dividend=0, divisor finite and nonzero
+	asm("divfpdd0:");
+	asm("and ecx, 1");				// exponent=0, leave xor sign in cl
+	asm("xor eax, eax");			// return KErrNone
+	asm("ret");
+
+	// come here if dividend is a NaN or infinity
+	asm("divfpss:");
+	asm("mov ebp, [esi]");			// dividend mantissa into edi:ebp
+	asm("mov edi, [esi+4]");
+	asm("cmp edi, 0x80000000");		// check for infinity
+	_ASM_jn(e,TRealXBinOpNaN)		// branch if NaN
+	asm("test ebp, ebp");
+	_ASM_jn(e,TRealXBinOpNaN)
+	asm("cmp ecx, 0xFFFF0000");		// check divisor for NaN or infinity
+	asm("jae short divfpss1");		// branch if NaN or infinity
+	asm("or ecx, 0xFFFF0000");		// infinity/finite - return infinity with xor sign
+	asm("mov edx, 0x80000000");
+	asm("xor ebx, ebx");
+	asm("mov eax, -9");				// return KErrOverflow
+	asm("ret");
+	asm("divfpss1:");
+	asm("cmp edx, 0x80000000");		// check for infinity
+	_ASM_jn(e,TRealXBinOpNaN)		// branch if NaN
+	asm("test ebx, ebx");
+	_ASM_jn(e,TRealXBinOpNaN)
+	asm("jmp %a0": : "i"(&TRealXRealIndefinite)); // if both operands infinite, return 'real indefinite'
+
+	// come here if divisor is a NaN or infinity, dividend finite
+	asm("divfpsd:");
+	asm("cmp edx, 0x80000000");		// check for infinity
+	_ASM_jn(e,TRealXBinOpNaN)		// branch if NaN
+	asm("test ebx, ebx");
+	_ASM_jn(e,TRealXBinOpNaN)
+	asm("and ecx, 1");				// dividend is finite, divisor=infinity, so return 0 with xor sign
+	asm("xor edx, edx");
+	asm("xor ebx, ebx");
+	asm("xor eax, eax");			// return KErrNone
+	asm("ret");
+	}
+
+// TRealX modulo - dividend at [esi], divisor in ecx,edx:ebx
+// Result in ecx,edx:ebx
+// Error code in eax
+LOCAL_C __NAKED__ void TRealXModulo(void)
+	{
+	asm("mov eax, [esi+8]");		// fetch sign/exponent of dividend
+	asm("mov cl, al");				// result sign=dividend sign
+	asm("xor ch, ch");				// clear rounding flags
+	asm("cmp eax, 0xFFFF0000");		// check if dividend=NaN or infinity
+	asm("jnc short modfpss");		// branch if it is
+	asm("cmp ecx, 0xFFFF0000");		// check if divisor=NaN or infinity
+	asm("jnc short modfpsd");		// branch if it is
+	asm("cmp ecx, 0x10000");		// check if divisor=0
+	_ASM_j(c,TRealXRealIndefinite)	// if so, return 'real indefinite'
+	asm("shr eax, 16");				// ax=dividend exponent
+	asm("ror ecx, 16");				// cx=divisor exponent
+	asm("sub ax, cx");				// ax=dividend exponent-divisor exponent
+	asm("jc short modfpdd0");		// if dividend exponent is smaller, return dividend
+	asm("cmp ax, 64");				// check if exponents differ by >= 64 bits
+	asm("jnc short modfplp");		// if so, underflow
+	asm("mov ah, 0");				// ah bit 0 acts as 65th accumulator bit
+	asm("mov ebp, [esi]");			// edi:ebp=dividend mantissa
+	asm("mov edi, [esi+4]");		//
+	asm("jmp short modfp2");		// skip left shift on first iteration
+	asm("modfp1:");
+	asm("add ebp, ebp");			// shift accumulator left [65 bits]
+	asm("adc edi, edi");
+	asm("adc ah, ah");
+	asm("modfp2:");
+	asm("sub ebp, ebx");			// subtract divisor from dividend
+	asm("sbb edi, edx");
+	asm("sbb ah, 0");
+	asm("jnc short modfp3");		// skip if no borrow
+	asm("add ebp, ebx");			// else add back
+	asm("adc edi, edx");
+	asm("adc ah, 0");
+	asm("modfp3:");
+	asm("dec al");					// any more bits to do?
+	asm("jns short modfp1");		// loop if there are
+	asm("mov edx, edi");			// result mantissa [not yet normalised] into edx:ebx
+	asm("mov ebx, ebp");
+	asm("or edi, ebx");				// check for zero
+	asm("jz short modfp0");			// jump if result zero
+	asm("or edx, edx");				// check if ms dword zero
+	asm("jnz short modfp4");
+	asm("mov edx, ebx");			// if so, shift left by 32
+	asm("xor ebx, ebx");
+	asm("sub cx, 32");				// and decrement exponent by 32
+	asm("jbe short modfpund");		// if borrow or exponent zero, underflow
+	asm("modfp4:");
+	asm("mov edi, ecx");			// preserve sign and exponent
+	asm("bsr ecx, edx");			// position of most significant 1 into ecx
+	asm("neg ecx");					//
+	asm("add ecx, 31");				// cl = 31-position of MS 1 = number of shifts to normalise
+	asm("shld edx, ebx, cl");		// shift edx:ebx left by cl bits
+	asm("shl ebx, cl");				//
+	asm("mov ebp, ecx");			// bit count into ebp for subtraction
+	asm("mov ecx, edi");			// exponent & sign back into ecx
+	asm("sub cx, bp");				// subtract shift count from exponent
+	asm("jbe short modfpund");		// if borrow or exponent 0, underflow
+	asm("rol ecx, 16");				// else ecx=exponent:sign
+	asm("xor eax, eax");			// normal exit, result in ecx,edx:ebx
+	asm("ret");
+
+	// dividend=NaN or infinity
+	asm("modfpss:");
+	asm("mov ebp, [esi]");			// dividend mantissa into edi:ebp
+	asm("mov edi, [esi+4]");
+	asm("cmp edi, 0x80000000");		// check for infinity
+	_ASM_jn(e,TRealXBinOpNaN)		// branch if NaN
+	asm("test ebp, ebp");
+	_ASM_jn(e,TRealXBinOpNaN)
+	asm("cmp ecx, 0xFFFF0000");		// check divisor for NaN or infinity
+	_ASM_j(b,TRealXRealIndefinite)	// infinity%finite - return 'real indefinite'
+	asm("cmp edx, 0x80000000");		// check for divisor=infinity
+	_ASM_jn(e,TRealXBinOpNaN)		// branch if NaN
+	asm("test ebx, ebx");
+	_ASM_jn(e,TRealXBinOpNaN)
+	asm("jmp %a0": : "i"(&TRealXRealIndefinite));	// if both operands infinite, return 'real indefinite'
+
+	// divisor=NaN or infinity, dividend finite
+	asm("modfpsd:");
+	asm("cmp edx, 0x80000000");		// check for infinity
+	_ASM_jn(e,TRealXBinOpNaN)		// branch if NaN
+	asm("test ebx, ebx");
+	_ASM_jn(e,TRealXBinOpNaN)
+	// finite%infinity - return dividend unaltered
+
+	asm("modfpdd0:");
+	asm("mov ebx, [esi]");			// normal exit, return dividend unaltered
+	asm("mov edx, [esi+4]");
+	asm("mov ecx, [esi+8]");
+	asm("xor eax, eax");
+	asm("ret");
+
+	asm("modfp0:");
+	asm("shr ecx, 16");				// normal exit, result 0
+	asm("xor eax, eax");
+	asm("ret");
+
+	asm("modfpund:");
+	asm("shr ecx, 16");				// underflow, result 0
+	asm("mov eax, -10");			// return KErrUnderflow
+	asm("ret");
+
+	asm("modfplp:");
+	asm("shr ecx, 16");				// loss of precision, result 0
+	asm("mov eax, -7");				// return KErrTotalLossOfPrecision
+	asm("ret");
+	}
+
+
+
+
+__NAKED__ EXPORT_C TRealX::TRealX()
+/**
+Constructs a default extended precision object.
+
+This sets the value to zero.
+*/
+	{
+	THISCALL_PROLOG0()
+	asm("xor eax, eax");
+	asm("mov [ecx], eax");				// set value to zero
+	asm("mov [ecx+4], eax");
+	asm("mov [ecx+8], eax");
+	asm("mov eax, ecx");				// must return this
+	THISCALL_EPILOG0()
+	}
+
+
+
+
+__NAKED__ EXPORT_C TRealX::TRealX(TUint /*aExp*/, TUint /*aMantHi*/, TUint /*aMantLo*/)
+/**
+Constructs an extended precision object from an explicit exponent and
+a 64 bit mantissa.
+
+@param aExp    The exponent
+@param aMantHi The high order 32 bits of the 64 bit mantissa
+@param aMantLo The low order 32 bits of the 64 bit mantissa
+*/
+	{
+	THISCALL_PROLOG3()
+	asm("mov eax, [esp+4]");			// eax=aExp
+	asm("mov [ecx+8], eax");
+	asm("mov eax, [esp+8]");			// eax=aMantHi
+	asm("mov [ecx+4], eax");
+	asm("mov eax, [esp+12]");			// eax=aMantLo
+	asm("mov [ecx], eax");
+	asm("mov eax, ecx");				// must return this
+	THISCALL_EPILOG3()
+	}
+
+
+__NAKED__ EXPORT_C TInt TRealX::Set(TInt /*aInt*/)
+/**
+Gives this extended precision object a new value taken
+from a signed integer.
+
+@param aInt The signed integer value.
+
+@return KErrNone, always.
+*/
+	{
+	THISCALL_PROLOG1()
+	// on entry ecx=this, [esp+4]=aInt, return code in eax
+	asm("mov edx, [esp+4]");	// edx=aInt
+	asm("or edx, edx");			// test sign/zero
+	asm("mov eax, 0x7FFF");
+	asm("jz short trealxfromint0_2");	// branch if 0
+	asm("jns short trealxfromint1_2");// skip if positive
+	asm("neg edx");					// take absolute value
+	asm("add eax, 0x10000");		// sign bit in eax bit 16
+	asm("trealxfromint1_2:");
+	asm("push ecx");				// save this
+	asm("bsr ecx, edx");			// bit number of edx MSB into ecx
+	asm("add eax, ecx");			// add to eax to form result exponent
+	asm("neg cl");
+	asm("add cl, 31");				// 31-bit number = number of shifts to normalise edx
+	asm("shl edx, cl");				// normalise edx
+	asm("pop ecx");					// this back into ecx
+	asm("ror eax, 16");				// sign/exponent into normal positions
+	asm("mov [ecx+4], edx");		// store mantissa high word
+	asm("mov [ecx+8], eax");		// store sign/exponent
+	asm("xor eax, eax");
+	asm("mov [ecx], eax");			// zero mantissa low word
+	THISCALL_EPILOG1()					// return KErrNone
+	asm("trealxfromint0_2:");
+	asm("mov [ecx], edx");
+	asm("mov [ecx+4], edx");		// store mantissa high word=0
+	asm("mov [ecx+8], edx");		// store sign/exponent=0
+	asm("xor eax, eax");			// return KErrNone
+	THISCALL_EPILOG1()
+	}
+
+
+
+__NAKED__ EXPORT_C TInt TRealX::Set(TUint /*aInt*/)
+/**
+Gives this extended precision object a new value taken from
+an unsigned integer.
+
+@param aInt The unsigned integer value.
+
+@return KErrNone, always.
+*/
+	{
+	THISCALL_PROLOG1()
+	asm("mov edx, [esp+4]");		// edx=aInt
+	asm("mov eax, 0x7FFF");
+	asm("or edx, edx");				// test for 0
+	asm("jz short trealxfromuint0_");// branch if 0
+	asm("push ecx");				// save this
+	asm("bsr ecx, edx");			// bit number of edx MSB into ecx
+	asm("add eax, ecx");			// add to eax to form result exponent
+	asm("neg cl");
+	asm("add cl, 31");				// 31-bit number = number of shifts to normalise edx
+	asm("shl edx, cl");				// normalise edx
+	asm("pop ecx");					// this back into ecx
+	asm("shl eax, 16");				// exponent into normal position
+	asm("mov [ecx+4], edx");		// store mantissa high word
+	asm("mov [ecx+8], eax");		// store exponent
+	asm("xor eax, eax");
+	asm("mov [ecx], eax");			// zero mantissa low word
+	THISCALL_EPILOG1()				// return KErrNone
+	asm("trealxfromuint0_:");
+	asm("mov [ecx], edx");
+	asm("mov [ecx+4], edx");		// store mantissa high word=0
+	asm("mov [ecx+8], edx");		// store sign/exponent=0
+	asm("xor eax, eax");			// return KErrNone
+	THISCALL_EPILOG1()
+	}
+
+
+
+
+LOCAL_C __NAKED__ void TRealXFromTInt64(void)
+	{
+	// Convert TInt64 in edx:ebx to TRealX in ecx,edx:ebx
+	asm("mov eax, 0x7FFF");
+	asm("or edx, edx");					// test sign/zero
+	asm("jz short trealxfromtint64a");	// branch if top word zero
+	asm("jns short trealxfromtint64b");
+	asm("add eax, 0x10000");			// sign bit into eax bit 16
+	asm("neg edx");						// take absolute value
+	asm("neg ebx");
+	asm("sbb edx, 0");
+	asm("jz short trealxfromtint64d");	// branch if top word zero
+	asm("trealxfromtint64b:");
+	asm("bsr ecx, edx");				// ecx=bit number of edx MSB
+	asm("add eax, ecx");				// add to exponent in eax
+	asm("add eax, 32");
+	asm("neg cl");
+	asm("add cl, 31");					// 31-bit number = number of left shifts to normalise
+	asm("shld edx, ebx, cl");			// shift left to normalise edx:ebx
+	asm("shl ebx, cl");
+	asm("mov ecx, eax");				// sign/exponent into ecx
+	asm("ror ecx, 16");					// and into normal positions
+	asm("ret");
+	asm("trealxfromtint64a:");			// come here if top word zero
+	asm("or ebx, ebx");					// test for bottom word also zero
+	asm("jz short trealxfromtint64c");	// branch if it is
+	asm("trealxfromtint64d:");			// come here if top word zero, bottom word not
+	asm("mov edx, ebx");				// shift edx:ebx left 32
+	asm("xor ebx, ebx");
+	asm("bsr ecx, edx");				// ecx=bit number of edx MSB
+	asm("add eax, ecx");				// add to exponent in eax
+	asm("neg cl");
+	asm("add cl, 31");					// 31-bit number = number of left shifts to normalise
+	asm("shl edx, cl");					// normalise
+	asm("mov ecx, eax");				// sign/exponent into ecx
+	asm("ror ecx, 16");					// and into normal positions
+	asm("ret");
+	asm("trealxfromtint64c:");			// entire number is zero
+	asm("xor ecx, ecx");
+	asm("ret");
+	}
+
+
+
+
+__NAKED__ EXPORT_C TInt TRealX::Set(const TInt64& /*aInt*/)
+/**
+Gives this extended precision object a new value taken from
+a 64 bit integer.
+
+@param aInt The 64 bit integer value.
+
+@return KErrNone, always.
+*/
+	{
+	// on entry ecx=this, [esp+4]=address of aInt, return code in eax
+	THISCALL_PROLOG1()
+	asm("push ebx");
+	asm("push ecx");
+	asm("mov edx, [esp+12]");			// edx=address of aInt
+	asm("mov ebx, [edx]");
+	asm("mov edx, [edx+4]");			// edx:ebx=aInt
+	asm("call %a0": : "i"(&TRealXFromTInt64)); // convert to TRealX in ecx,edx:ebx
+	asm("pop eax");						// eax=this
+	asm("mov [eax], ebx");				// store result
+	asm("mov [eax+4], edx");
+	asm("mov [eax+8], ecx");
+	asm("xor eax, eax");				// return KErrNone
+	asm("pop ebx");
+	THISCALL_EPILOG1()
+	}
+
+
+
+LOCAL_C __NAKED__ void __6TRealXi()
+	{
+	// common function for int to TRealX
+	THISCALL_PROLOG1()
+	asm("mov edx, [esp+4]");			// edx=aInt
+	asm("or edx, edx");					// test sign/zero
+	asm("mov eax, 0x7FFF");
+	asm("jz short trealxfromint0");		// branch if 0
+	asm("jns short trealxfromint1");	// skip if positive
+	asm("neg edx");						// take absolute value
+	asm("add eax, 0x10000");			// sign bit in eax bit 16
+	asm("trealxfromint1:");
+	asm("push ecx");					// save this
+	asm("bsr ecx, edx");				// bit number of edx MSB into ecx
+	asm("add eax, ecx");				// add to eax to form result exponent
+	asm("neg cl");
+	asm("add cl, 31");					// 31-bit number = number of shifts to normalise edx
+	asm("shl edx, cl");					// normalise edx
+	asm("pop ecx");						// this back into ecx
+	asm("ror eax, 16");					// sign/exponent into normal positions
+	asm("mov [ecx+4], edx");			// store mantissa high word
+	asm("mov [ecx+8], eax");			// store sign/exponent
+	asm("xor eax, eax");
+	asm("mov [ecx], eax");				// zero mantissa low word
+	asm("mov eax, ecx");				// return eax=this
+	THISCALL_EPILOG1()
+	asm("trealxfromint0:");
+	asm("mov [ecx], edx");
+	asm("mov [ecx+4], edx");			// store mantissa high word=0
+	asm("mov [ecx+8], edx");			// store sign/exponent=0
+	asm("mov eax, ecx");				// return eax=this
+	THISCALL_EPILOG1()
+	}
+
+
+__NAKED__ EXPORT_C TRealX::TRealX(TInt /*aInt*/)
+/**
+Constructs an extended precision object from a signed integer value.
+
+@param aInt The signed integer value.
+*/
+	{
+	// on entry ecx=this, [esp+4]=aInt, return eax=this
+	asm("jmp %a0": : "i"(&__6TRealXi));
+	}
+
+
+
+
+__NAKED__ EXPORT_C TRealX& TRealX::operator=(TInt /*aInt*/)
+/**
+Assigns the specified signed integer value to this extended precision object.
+
+@param aInt The signed integer value.
+
+@return A reference to this extended precision object.
+*/
+	{
+	// on entry ecx=this, [esp+4]=aInt, return eax=this
+	asm("jmp %a0": : "i"(&__6TRealXi));
+	}
+
+
+
+LOCAL_C __NAKED__ void __6TRealXui()
+	{
+	// common function for unsigned int to TRealX
+	THISCALL_PROLOG1()
+	asm("mov edx, [esp+4]");			// edx=aInt
+	asm("mov eax, 0x7FFF");
+	asm("or edx, edx");					// test for zero
+	asm("jz short trealxfromuint0");	// branch if 0
+	asm("push ecx");					// save this
+	asm("bsr ecx, edx");				// bit number of edx MSB into ecx
+	asm("add eax, ecx");				// add to eax to form result exponent
+	asm("neg cl");
+	asm("add cl, 31");					// 31-bit number = number of shifts to normalise edx
+	asm("shl edx, cl");					// normalise edx
+	asm("pop ecx");						// this back into ecx
+	asm("shl eax, 16");					// exponent into normal position
+	asm("mov [ecx+4], edx");			// store mantissa high word
+	asm("mov [ecx+8], eax");			// store exponent
+	asm("xor eax, eax");
+	asm("mov [ecx], eax");				// zero mantissa low word
+	asm("mov eax, ecx");				// return eax=this
+	THISCALL_EPILOG1()
+	asm("trealxfromuint0:");
+	asm("mov [ecx], edx");				
+	asm("mov [ecx+4], edx");			// store mantissa high word=0
+	asm("mov [ecx+8], edx");			// store sign/exponent=0
+	asm("mov eax, ecx");				// return eax=this
+	THISCALL_EPILOG1()
+	}
+
+
+
+__NAKED__ EXPORT_C TRealX::TRealX(TUint /*aInt*/)
+/**
+Constructs an extended precision object from an unsigned integer value.
+
+@param aInt The unsigned integer value.
+*/
+	{
+	// on entry ecx=this, [esp+4]=aInt, return eax=this
+	asm("jmp %a0": : "i"(&__6TRealXui));
+	}
+
+
+
+
+__NAKED__ EXPORT_C TRealX& TRealX::operator=(TUint /*aInt*/)
+/**
+Assigns the specified unsigned integer value to this extended precision object.
+
+@param aInt The unsigned integer value.
+
+@return A reference to this extended precision object.
+*/
+	{
+	// on entry ecx=this, [esp+4]=aInt, return eax=this
+	asm("jmp %a0": : "i"(&__6TRealXui));
+	}
+
+
+
+
+LOCAL_C __NAKED__ void __6TRealXRC6TInt64()
+	{
+	// common function for TInt64 to TRealX
+	THISCALL_PROLOG1()
+	asm("push ebx");					// preserve ebx
+	asm("push ecx");					// save this
+	asm("mov edx, [esp+12]");			// edx=address of aInt
+	asm("mov ebx, [edx]");
+	asm("mov edx, [edx+4]");			// edx:ebx=aInt
+	asm("call %a0": : "i"(&TRealXFromTInt64));	// convert to TRealX in ecx,edx:ebx
+	asm("pop eax");						// eax=this
+	asm("mov [eax], ebx");				// store result
+	asm("mov [eax+4], edx");
+	asm("mov [eax+8], ecx");
+	asm("mov ecx, eax");				// restore this ptr
+	asm("pop ebx");						// restore ebx
+	THISCALL_EPILOG1()
+	}
+
+
+
+
+__NAKED__ EXPORT_C TRealX::TRealX(const TInt64& /*aInt*/)
+/**
+Constructs an extended precision object from a 64 bit integer.
+
+@param aInt A reference to a 64 bit integer.
+*/
+	{
+	// on entry ecx=this, [esp+4]=address of aInt, return eax=this
+	asm("jmp %a0": : "i"(&__6TRealXRC6TInt64));
+	}
+
+
+
+
+__NAKED__ EXPORT_C TRealX& TRealX::operator=(const TInt64& /*aInt*/)
+/**
+Assigns the specified 64 bit integer value to this extended precision object.
+
+@param aInt A reference to a 64 bit integer.
+
+@return A reference to this extended precision object.
+*/
+	{
+	// on entry ecx=this, [esp+4]=address of aInt, return eax=this
+	asm("jmp %a0": : "i"(&__6TRealXRC6TInt64));
+	}
+
+
+
+
+LOCAL_C __NAKED__ void ConvertTReal32ToTRealX(void)
+	{
+	// Convert TReal32 in edx to TRealX in ecx:edx,ebx
+	asm("xor ebx, ebx");				// mant low always zero
+	asm("mov eax, edx");
+	asm("shr eax, 23");					// exponent now in al, sign in ah bit 0
+	asm("test al, al");					// check for denormal/zero
+	asm("jz short treal32totrealx2");	// branch if denormal/zero
+	asm("xor ecx, ecx");
+	asm("mov cl, al");
+	asm("add ecx, 0x7F80");				// bias exponent correctly for TRealX
+	asm("cmp al, 0xFF");				// check for infinity/NaN
+	asm("jnz short treal32totrealx1");	// skip if neither
+	asm("mov cl, al");					// else set TRealX exponent to FFFF
+	asm("mov ch, al");
+	asm("treal32totrealx1:");
+	asm("shl edx, 8");					// left-justify mantissa in edx
+	asm("or edx, 0x80000000");			// put in implied integer bit
+	asm("shl ecx, 16");					// exponent into ecx bits 16-31
+	asm("mov cl, ah");					// sign into ecx bit 0
+	asm("ret");
+	asm("treal32totrealx2:");			// come here if exponent 0
+	asm("shl edx, 9");					// left-justify mantissa in edx [shift out integer bit as well]
+	asm("jnz short treal32totrealx3");	// jump if denormal
+	asm("xor ecx, ecx");				// else return 0
+	asm("mov cl, ah");					// with same sign as input value
+	asm("ret");
+	asm("treal32totrealx3:");			// come here if denormal
+	asm("bsr ecx, edx");				// ecx=bit number of MSB of edx
+	asm("neg ecx");
+	asm("add ecx, 31");					// ecx=number of left shifts to normalise edx
+	asm("shl edx, cl");					// normalise
+	asm("neg ecx");
+	asm("add ecx, 0x7F80");				// exponent=7F80-number of shifts
+	asm("shl ecx, 16");					// exponent into ecx bits 16-31
+	asm("mov cl, ah");					// sign into ecx bit 0
+	asm("ret");
+	}
+
+
+
+
+LOCAL_C __NAKED__ void ConvertTReal64ToTRealX(void)
+	{
+	// Convert TReal64 in edx:ebx to TRealX in ecx:edx,ebx
+	asm("mov eax, edx");
+	asm("shr eax, 20");
+	asm("mov ecx, 0x7FF");
+	asm("and ecx, eax");				// ecx=exponent
+	asm("jz short treal64totrealx1");	// branch if zero/denormal
+	asm("add ecx, 0x7C00");				// else bias exponent correctly for TRealX
+	asm("cmp ecx, 0x83FF");				// check for infinity/NaN
+	asm("jnz short treal64totrealx2");
+	asm("mov ch, cl");					// if so, set exponent to FFFF
+	asm("treal64totrealx2:");		
+	asm("shl ecx, 16");					// exponent into ecx bits 16-31
+	asm("mov cl, 11");					// number of shifts needed to justify mantissa correctly
+	asm("shld edx, ebx, cl");			// shift mantissa left
+	asm("shl ebx, cl");
+	asm("or edx, 0x80000000");			// put in implied integer bit
+	asm("shr eax, 11");					// sign bit into al bit 0
+	asm("mov cl, al");					// into ecx bit 0
+	asm("ret");
+	asm("treal64totrealx1:");			// come here if zero/denormal
+	asm("mov cl, 12");					// number of shifts needed to justify mantissa correctly
+	asm("shld edx, ebx, cl");			// shift mantissa left
+	asm("shl ebx, cl");
+	asm("test edx, edx");				// check for zero
+	asm("jnz short treal64totrealx3");
+	asm("test ebx, ebx");
+	asm("jnz short treal64totrealx4");
+	asm("shr eax, 11");					// sign bit into eax bit 0, rest of eax=0
+	asm("mov ecx, eax");				// return 0 result with correct sign
+	asm("ret");
+	asm("treal64totrealx4:");			// come here if denormal, edx=0
+	asm("mov edx, ebx");				// shift mantissa left 32
+	asm("xor ebx, ebx");
+	asm("bsr ecx, edx");				// ecx=bit number of MSB of edx
+	asm("neg ecx");
+	asm("add ecx, 31");					// ecx=number of left shifts to normalise edx
+	asm("shl edx, cl");					// normalise
+	asm("neg ecx");
+	asm("add ecx, 0x7BE0");				// exponent=7BE0-number of shifts	
+	asm("shl ecx, 16");					// exponent into bits 16-31 of ecx
+	asm("shr eax, 11");
+	asm("mov cl, al");					// sign into bit 0 of ecx
+	asm("ret");
+	asm("treal64totrealx3:");			// come here if denormal, edx nonzero
+	asm("bsr ecx, edx");				// ecx=bit number of MSB of edx
+	asm("neg ecx");
+	asm("add ecx, 31");					// ecx=number of left shifts to normalise edx:ebx
+	asm("shld edx, ebx, cl");			// normalise
+	asm("shl ebx, cl");
+	asm("neg ecx");
+	asm("add ecx, 0x7C00");				// exponent=7C00-number of shifts
+	asm("shl ecx, 16");					// exponent into bits 16-31 of ecx
+	asm("shr eax, 11");
+	asm("mov cl, al");					// sign into bit 0 of ecx
+	asm("ret");
+	}
+
+
+
+
+__NAKED__ EXPORT_C TInt TRealX::Set(TReal32 /*aReal*/)
+/**
+Gives this extended precision object a new value taken from
+a single precision floating point number.
+
+@param aReal The single precision floating point value.
+
+@return KErrNone, if a valid number;
+KErrOverflow, if the number is infinite;
+KErrArgument, if not a number.
+*/
+	{
+	// on entry, ecx=this and aReal is in [esp+4]
+	// on exit, error code in eax
+	THISCALL_PROLOG1()
+	asm("push ecx");
+	asm("push ebx");					// save ebx
+	asm("push ecx");					// save this
+	asm("mov edx, [esp+16]");			// aReal into edx
+	asm("call %a0": : "i"(&ConvertTReal32ToTRealX));
+	asm("pop eax");						// eax=this
+	asm("mov [eax], ebx");				// store result
+	asm("mov [eax+4], edx");
+	asm("mov [eax+8], ecx");
+	asm("xor eax, eax");				// error code=KErrNone initially
+	asm("cmp ecx, 0xFFFF0000");			// check for infinity/NaN
+	asm("jb short trealxsettreal32a");	// if neither, return KErrNone
+	asm("mov eax, -9");					// eax=KErrOverflow
+	asm("cmp edx, 0x80000000");			// check for infinity
+	asm("je short trealxsettreal32a");	// if infinity, return KErrOverflow
+	asm("mov eax, -6");					// if NaN, return KErrArgument
+	asm("trealxsettreal32a:");
+	asm("pop ebx");
+	asm("pop ecx");
+	THISCALL_EPILOG1()
+	}
+
+
+
+
+__NAKED__ EXPORT_C TInt TRealX::Set(TReal64 /*aReal*/)
+/**
+Gives this extended precision object a new value taken from
+a double precision floating point number.
+
+@param aReal The double precision floating point value.
+
+@return KErrNone, if a valid number;
+KErrOverflow, if the number is infinite;
+KErrArgument, if not a number.
+*/
+	{
+	// on entry, ecx=this and aReal is in [esp+4] (mant low) and [esp+8] (sign/exp/mant high)
+	// on exit, error code in eax
+	THISCALL_PROLOG2()
+	asm("push ecx");
+	asm("push ebx");				// save ebx
+	asm("push ecx");				// save this
+	asm("mov ebx, [esp+16]");		// aReal into edx:ebx
+	asm("mov edx, [esp+20]");
+	asm("call %a0": : "i"(&ConvertTReal64ToTRealX));
+	asm("pop eax");					// eax=this
+	asm("mov [eax], ebx");			// store result
+	asm("mov [eax+4], edx");
+	asm("mov [eax+8], ecx");
+	asm("xor eax, eax");			// error code=KErrNone initially
+	asm("cmp ecx, 0xFFFF0000");		// check for infinity/NaN
+	asm("jb short trealxsettreal64a");	// if neither, return KErrNone
+	asm("mov eax, -9");				// eax=KErrOverflow
+	asm("cmp edx, 0x80000000");		// check for infinity
+	asm("jne short trealxsettreal64b");	// branch if NaN
+	asm("test ebx, ebx");
+	asm("je short trealxsettreal64a");	// if infinity, return KErrOverflow
+	asm("trealxsettreal64b:");
+	asm("mov eax, -6");				// if NaN, return KErrArgument
+	asm("trealxsettreal64a:");
+	asm("pop ebx");
+	asm("pop ecx");
+	THISCALL_EPILOG2()
+	}
+
+
+
+
+LOCAL_C __NAKED__ void __6TRealXf()
+	{
+	// common function for float to TRealX
+	THISCALL_PROLOG1()
+	asm("push ebx");					// save ebx
+	asm("push ecx");					// save this
+	asm("mov edx, [esp+12]");			// aReal into edx
+	asm("call %a0": : "i"(&ConvertTReal32ToTRealX));
+	asm("pop eax");						// eax=this
+	asm("mov [eax], ebx");				// store result
+	asm("mov [eax+4], edx");
+	asm("mov [eax+8], ecx");
+	asm("pop ebx");
+	asm("mov ecx,eax");
+	THISCALL_EPILOG1()
+	}
+
+
+
+
+__NAKED__ EXPORT_C TRealX::TRealX(TReal32 /*aReal*/)
+/**
+Constructs an extended precision object from
+a single precision floating point number.
+
+@param aReal The single precision floating point value.
+*/
+	{
+	// on entry, ecx=this and aReal is in [esp+4]
+	// on exit, eax=this
+	asm("jmp %a0": : "i"(&__6TRealXf));
+	}
+
+
+
+
+__NAKED__ EXPORT_C TRealX& TRealX::operator=(TReal32 /*aReal*/)
+/**
+Assigns the specified single precision floating point number to
+this extended precision object.
+
+@param aReal The single precision floating point value.
+
+@return A reference to this extended precision object.
+*/
+	{
+	// on entry, ecx=this and aReal is in [esp+4]
+	// on exit, eax=this
+	asm("jmp %a0": : "i"(&__6TRealXf));
+	}
+
+
+
+
+LOCAL_C __NAKED__ void __6TRealXd()
+	{
+	// common function for double to TRealX
+	THISCALL_PROLOG2()
+	asm("push ebx");				// save ebx
+	asm("push ecx");				// save this
+	asm("mov ebx, [esp+12]");		// aReal into edx:ebx
+	asm("mov edx, [esp+16]");
+	asm("call %a0": : "i"(&ConvertTReal64ToTRealX));
+	asm("pop eax");					// eax=this
+	asm("mov [eax], ebx");			// store result
+	asm("mov [eax+4], edx");
+	asm("mov [eax+8], ecx");
+	asm("pop ebx");
+	asm("mov ecx,eax");
+	THISCALL_EPILOG2()
+	}
+
+
+
+
+__NAKED__ EXPORT_C TRealX::TRealX(TReal64 /*aReal*/)
+/**
+Constructs an extended precision object from
+a double precision floating point number.
+
+@param aReal The double precision floating point value.
+*/
+	{
+	// on entry, ecx=this and aReal is in [esp+4] (mant low) and [esp+8] (sign/exp/mant high)
+	// on exit, eax=this
+	asm("jmp %a0": : "i"(&__6TRealXd));
+	}
+
+
+
+
+__NAKED__ EXPORT_C TRealX& TRealX::operator=(TReal64 /*aReal*/)
+/**
+Assigns the specified double precision floating point number to
+this extended precision object.
+
+@param aReal The double precision floating point value.
+
+@return A reference to this extended precision object.
+*/
+	{
+	// on entry, ecx=this and aReal is in [esp+4] (mant low) and [esp+8] (sign/exp/mant high)
+	// on exit, eax=this
+	asm("jmp %a0": : "i"(&__6TRealXd));
+	}
+
+
+
+
+__NAKED__ EXPORT_C TRealX::operator TInt() const
+/**
+Gets the extended precision value as a signed integer value.
+
+The operator asm("returns:");
+
+1. zero , if the extended precision value is not a number
+
+2. 0x7FFFFFFF, if the value is positive and too big to fit into a TInt.
+
+3. 0x80000000, if the value is negative and too big to fit into a TInt.
+*/
+	{
+	// on entry ecx=this, return value in eax
+	THISCALL_PROLOG0()
+	asm("push ecx");
+	asm("mov edx, [ecx]");			// edx=mantissa low
+	asm("mov eax, [ecx+4]");		// eax=mantissa high
+	asm("mov ecx, [ecx+8]");		// ecx=exponent/sign
+	asm("ror ecx, 16");				// exponent into cx
+	asm("cmp cx, 0xFFFF");
+	asm("jz short trealxtoint1");	// branch if exp=FFFF
+	asm("mov dx, cx");
+	asm("mov cx, 0x801E");
+	asm("sub cx, dx");				// cx=number of right shifts needed to convert mantissa to int
+	asm("jbe short trealxtoint2");	// if exp>=801E, saturate result
+	asm("cmp cx, 31");				// more than 31 shifts needed?
+	asm("ja short trealxtoint0");	// if so, underflow to zero
+	asm("shr eax, cl");				// else ABS[result]=eax>>cl
+	asm("test ecx, 0x10000");		// test sign
+	asm("jz short trealxtoint3");	// skip if +
+	asm("neg eax");
+	asm("trealxtoint3:");
+	asm("pop ecx");
+	THISCALL_EPILOG0()
+	asm("trealxtoint1:");			// come here if exponent=FFFF
+	asm("cmp eax, 0x80000000");		// check for infinity
+	asm("jnz short trealxtoint0");	// if NaN, return 0
+	asm("test edx, edx");
+	asm("jnz short trealxtoint0");	// if NaN, return 0
+	asm("trealxtoint2:");			// come here if argument too big for 32-bit integer
+	asm("mov eax, 0x7FFFFFFF");
+	asm("shr ecx, 17");				// sign bit into carry flag
+	asm("adc eax, 0");				// eax=7FFFFFFF if +, 80000000 if -
+	asm("pop ecx");					
+	THISCALL_EPILOG0()				// return saturated value
+	asm("trealxtoint0:");			// come here if INT{argument}=0 or NaN
+	asm("xor eax, eax");			// return 0
+	asm("pop ecx");
+	THISCALL_EPILOG0()
+	}
+
+
+
+
+__NAKED__ EXPORT_C TRealX::operator TUint() const
+/**
+Returns the extended precision value as an unsigned signed integer value.
+
+The operator asm("returns:");
+
+1. zero, if the extended precision value is not a number
+
+2. 0xFFFFFFFF, if the value is positive and too big to fit into a TUint.
+
+3. zero, if the value is negative and too big to fit into a TUint.
+*/
+	{
+	// on entry ecx=this, return value in eax
+	THISCALL_PROLOG0()
+	asm("push ecx");
+	asm("mov edx, [ecx]");				// edx=mantissa low
+	asm("mov eax, [ecx+4]");			// eax=mantissa high
+	asm("mov ecx, [ecx+8]");			// ecx=exponent/sign
+	asm("ror ecx, 16");					// exponent into cx
+	asm("cmp cx, 0xFFFF");
+	asm("jz short trealxtouint1");		// branch if exp=FFFF
+	asm("mov dx, cx");
+	asm("mov cx, 0x801E");
+	asm("sub cx, dx");					// cx=number of right shifts needed to convert mantissa to int
+	asm("jb short trealxtouint2");		// if exp>801E, saturate result
+	asm("cmp cx, 31");					// more than 31 shifts needed?
+	asm("ja short trealxtouint0");		// if so, underflow to zero
+	asm("test ecx, 0x10000");			// test sign
+	asm("jnz short trealxtouint0");		// if -, return 0
+	asm("shr eax, cl");					// else result=eax>>cl
+	asm("pop ecx");
+	THISCALL_EPILOG0()
+	asm("trealxtouint1:");				// come here if exponent=FFFF
+	asm("cmp eax, 0x80000000");			// check for infinity
+	asm("jnz short trealxtouint0");		// if NaN, return 0
+	asm("test edx, edx");
+	asm("jnz short trealxtouint0");		// if NaN, return 0
+	asm("trealxtouint2:");				// come here if argument too big for 32-bit integer
+	asm("mov eax, 0xFFFFFFFF");
+	asm("shr ecx, 17");					// sign bit into carry flag
+	asm("adc eax, 0");					// eax=FFFFFFFF if +, 0 if -
+	asm("pop ecx");			
+	THISCALL_EPILOG0()					// return saturated value
+	asm("trealxtouint0:");				// come here if INT{argument}=0 or NaN
+	asm("xor eax, eax");				// return 0
+	asm("pop ecx");
+	THISCALL_EPILOG0()
+	}
+
+
+
+
+LOCAL_C __NAKED__ void ConvertTRealXToTInt64(void)
+	{
+	// Convert TRealX in ecx,edx:ebx to TInt64 in edx:ebx
+	asm("ror ecx, 16");					// exponent into cx
+	asm("cmp cx, 0xFFFF");
+	asm("jz short trealxtoint64a");		// branch if exp=FFFF
+	asm("mov ax, cx");
+	asm("mov cx, 0x803E");
+	asm("sub cx, ax");					// cx=number of right shifts needed to convert mantissa to int
+	asm("jbe short trealxtoint64b");	// if exp>=803E, saturate result
+	asm("cmp cx, 63");					// more than 63 shifts needed?
+	asm("ja short trealxtoint64z");		// if so, underflow to zero
+	asm("cmp cl, 31");					// more than 31 shifts needed?
+	asm("jbe short trealxtoint64d");	// branch if not
+	asm("sub cl, 32");					// cl=shift count - 32
+	asm("mov ebx, edx");				// shift right by 32
+	asm("xor edx, edx");
+	asm("trealxtoint64d:");
+	asm("shrd ebx, edx, cl");			// shift edx:ebx right by cl to give ABS{result}
+	asm("shr edx, cl");
+	asm("test ecx, 0x10000");			// test sign
+	asm("jz short trealxtoint64c");		// skip if +
+	asm("neg edx");						// if -, negate
+	asm("neg ebx");
+	asm("sbb edx, 0");
+	asm("trealxtoint64c:");
+	asm("ret");
+	asm("trealxtoint64a:");				// come here if exponent=FFFF
+	asm("cmp edx, 0x80000000");			// check for infinity
+	asm("jnz short trealxtoint64z");	// if NaN, return 0
+	asm("test ebx, ebx");			
+	asm("jnz short trealxtoint64z");	// if NaN, return 0
+	asm("trealxtoint64b:");				// come here if argument too big for 32-bit integer
+	asm("mov edx, 0x7FFFFFFF");
+	asm("mov ebx, 0xFFFFFFFF");
+	asm("shr ecx, 17");					// sign bit into carry flag
+	asm("adc ebx, 0");					// edx:ebx=7FFFFFFF FFFFFFFF if +,
+	asm("adc edx, 0");					// or 80000000 00000000 if -
+	asm("ret");							// return saturated value
+	asm("trealxtoint64z:");				// come here if INT{argument}=0 or NaN
+	asm("xor edx, edx");				// return 0
+	asm("xor ebx, ebx");
+	asm("ret");
+	}
+
+
+
+
+/**
+Returns the extended precision value as a 64 bit integer value.
+
+The operator asm("returns:");
+
+1. zero, if the extended precision value is not a number
+
+2. 0x7FFFFFFF FFFFFFFF, if the value is positive and too big to fit
+into a TInt64
+
+3. 0x80000000 00000000, if the value is negative and too big to fit
+into a TInt.
+*/
+__NAKED__ EXPORT_C TRealX::operator TInt64() const
+	{
+	// on entry, ecx=this, return value in edx:eax
+	THISCALL_PROLOG0()
+	asm("push ecx");
+	asm("push ebx");
+	asm("mov ebx, [ecx]");				// get TRealX value into ecx,edx:ebx
+	asm("mov edx, [ecx+4]");
+	asm("mov ecx, [ecx+8]");
+	asm("call %a0": : "i"(&ConvertTRealXToTInt64));
+	asm("mov eax, ebx");				// result low into eax
+	asm("pop ebx");
+	asm("pop ecx");
+	THISCALL_EPILOG0()
+	}
+
+
+
+
+LOCAL_C __NAKED__ void TRealXGetTReal32(void)
+	{
+	// Convert TRealX in ecx,edx:ebx to TReal32 in edx
+	// Return error code in eax
+	asm("cmp ecx, 0xFFFF0000");				// check for infinity/NaN
+	asm("jnc short trealxgettreal32a");
+	asm("xor eax, eax");
+	asm("ror ecx, 16");						// exponent into cx
+	asm("sub cx, 0x7F80");					// cx=result exponent if normalised
+	asm("jbe short trealxgettreal32b");		// jump if denormal, zero or underflow
+	asm("cmp cx, 0xFF");					// check if overflow
+	asm("jb short trealxgettreal32c");		// jump if not
+	asm("trealxgettreal32d:");				// come here if overflow
+	asm("xor edx, edx");					// set mantissa=0 to generate infinity
+	asm("ror ecx, 16");						// ecx back to normal format
+	asm("trealxgettreal32a:");				// come here if infinity or NaN
+	asm("shr edx, 7");
+	asm("or edx, 0xFF000000");				// set exponent to FF
+	asm("shr ecx, 1");						// sign bit -> carry
+	asm("rcr edx, 1");						// sign bit -> MSB of result
+	asm("mov eax, edx");
+	asm("shl eax, 9");						// test for infinity or NaN
+	asm("mov eax, -9");						// eax=KErrOverflow
+	asm("jz short trealxgettreal32e");
+	asm("mov eax, -6");						// if NaN, eax=KErrArgument
+	asm("trealxgettreal32e:");
+	asm("ret");
+	asm("trealxgettreal32b:");				// come here if exponent<=7F80
+	asm("cmp cx, -24");						// check for zero or total underflow
+	asm("jle short trealxgettreal32z");
+	asm("neg cl");
+	asm("inc cl");							// cl=number of right shifts to form denormal mantissa
+	asm("shrd eax, ebx, cl");				// shift mantissa right into eax
+	asm("shrd ebx, edx, cl");
+	asm("shr edx, cl");
+	asm("or edx, 0x80000000");				// set top bit to ensure correct rounding up
+	asm("xor cl, cl");						// cl=result exponent=0
+	asm("trealxgettreal32c:");				// come here if result normalised
+	asm("cmp dl, 0x80");					// check rounding bits
+	asm("ja short trealxgettreal32f");		// branch to round up
+	asm("jb short trealxgettreal32g");		// branch to round down
+	asm("test ebx, ebx");
+	asm("jnz short trealxgettreal32f");		// branch to round up
+	asm("test eax, eax");
+	asm("jnz short trealxgettreal32f");		// branch to round up
+	asm("test ecx, 0x01000000");			// check rounded-down flag
+	asm("jnz short trealxgettreal32f");		// branch to round up
+	asm("test ecx, 0x02000000");			// check rounded-up flag
+	asm("jnz short trealxgettreal32g");		// branch to round down
+	asm("test dh, 1");						// else round to even
+	asm("jz short trealxgettreal32g");		// branch to round down if LSB=0
+	asm("trealxgettreal32f:");				// come here to round up
+	asm("add edx, 0x100");					// increment mantissa
+	asm("jnc short trealxgettreal32g");
+	asm("rcr edx, 1");
+	asm("inc cl");							// if carry, increment exponent
+	asm("cmp cl, 0xFF");					// and check for overflow
+	asm("jz short trealxgettreal32d");		// branch out if overflow
+	asm("trealxgettreal32g:");				// come here to round down
+	asm("xor dl, dl");
+	asm("add edx, edx");					// shift out integer bit
+	asm("mov dl, cl");
+	asm("ror edx, 8");						// exponent->edx bits 24-31, mantissa in 23-1
+	asm("test edx, edx");					// check if underflow
+	asm("jz short trealxgettreal32h");		// branch out if underflow
+	asm("shr ecx, 17");						// sign bit->carry
+	asm("rcr edx, 1");						// ->edx bit 31, exp->edx bits 23-30, mant->edx bits 22-0
+	asm("xor eax, eax");					// return KErrNone
+	asm("ret");
+	asm("trealxgettreal32z:");				// come here if zero or underflow
+	asm("xor eax, eax");
+	asm("cmp cx, 0x8080");					// check for zero
+	asm("jz short trealxgettreal32y");		// if zero, return KErrNone
+	asm("trealxgettreal32h:");				// come here if underflow after rounding
+	asm("mov eax, -10");					// eax=KErrUnderflow
+	asm("trealxgettreal32y:");
+	asm("xor edx, edx");
+	asm("shr ecx, 17");
+	asm("rcr edx, 1");						// sign bit into edx bit 31, rest of edx=0
+	asm("ret");
+	}
+
+
+
+
+LOCAL_C __NAKED__ void TRealXGetTReal64(void)
+	{
+	// Convert TRealX in ecx,edx:ebx to TReal64 in edx:ebx
+	// Return error code in eax
+	// edi, esi also modified
+	asm("ror ecx, 16");						// exponent into cx
+	asm("cmp cx, 0xFFFF");					// check for infinity/NaN
+	asm("jnc short trealxgettreal64a");
+	asm("xor eax, eax");
+	asm("xor edi, edi");
+	asm("sub cx, 0x7C00");					// cx=result exponent if normalised
+	asm("jbe short trealxgettreal64b");		// jump if denormal, zero or underflow
+	asm("cmp cx, 0x07FF");					// check if overflow
+	asm("jb short trealxgettreal64c");		// jump if not
+	asm("trealxgettreal64d:");				// come here if overflow
+	asm("xor edx, edx");					// set mantissa=0 to generate infinity
+	asm("xor ebx, ebx");
+	asm("trealxgettreal64a:");				// come here if infinity or NaN
+	asm("mov cl, 10");
+	asm("shrd ebx, edx, cl");
+	asm("shr edx, cl");
+	asm("or edx, 0xFFE00000");				// set exponent to 7FF
+	asm("shr ecx, 17");						// sign bit -> carry
+	asm("rcr edx, 1");						// sign bit -> MSB of result
+	asm("rcr ebx, 1");
+	asm("mov eax, edx");
+	asm("shl eax, 12");						// test for infinity or NaN
+	asm("mov eax, -9");						// eax=KErrOverflow
+	asm("jnz short trealxgettreal64n");
+	asm("test ebx, ebx");
+	asm("jz short trealxgettreal64e");
+	asm("trealxgettreal64n:");
+	asm("mov eax, -6");						// if NaN, eax=KErrArgument
+	asm("trealxgettreal64e:");
+	asm("ret");
+	asm("trealxgettreal64b:");				// come here if exponent<=7C00
+	asm("cmp cx, -53");						// check for zero or total underflow
+	asm("jle short trealxgettreal64z");
+	asm("neg cl");
+	asm("inc cl");							// cl=number of right shifts to form denormal mantissa
+	asm("cmp cl, 32");
+	asm("jb trealxgettreal64x");
+	asm("mov eax, ebx");					// if >=32 shifts, do 32 shifts and decrement count by 32
+	asm("mov ebx, edx");
+	asm("xor edx, edx");
+	asm("trealxgettreal64x:");
+	asm("shrd edi, eax, cl");
+	asm("shrd eax, ebx, cl");				// shift mantissa right into eax
+	asm("shrd ebx, edx, cl");
+	asm("shr edx, cl");
+	asm("or edx, 0x80000000");				// set top bit to ensure correct rounding up
+	asm("xor cx, cx");						// cx=result exponent=0
+	asm("trealxgettreal64c:");				// come here if result normalised
+	asm("mov esi, ebx");
+	asm("and esi, 0x7FF");					// esi=rounding bits
+	asm("cmp esi, 0x400");					// check rounding bits
+	asm("ja short trealxgettreal64f");		// branch to round up
+	asm("jb short trealxgettreal64g");		// branch to round down
+	asm("test eax, eax");
+	asm("jnz short trealxgettreal64f");		// branch to round up
+	asm("test edi, edi");
+	asm("jnz short trealxgettreal64f");		// branch to round up
+	asm("test ecx, 0x01000000");			// check rounded-down flag
+	asm("jnz short trealxgettreal64f");		// branch to round up
+	asm("test ecx, 0x02000000");			// check rounded-up flag
+	asm("jnz short trealxgettreal64g");		// branch to round down
+	asm("test ebx, 0x800");					// else round to even
+	asm("jz short trealxgettreal64g");		// branch to round down if LSB=0
+	asm("trealxgettreal64f:");				// come here to round up
+	asm("add ebx, 0x800");					// increment mantissa
+	asm("adc edx, 0");
+	asm("jnc short trealxgettreal64g");
+	asm("rcr edx, 1");
+	asm("inc cx");							// if carry, increment exponent
+	asm("cmp cx, 0x7FF");					// and check for overflow
+	asm("jz short trealxgettreal64d");		// branch out if overflow
+	asm("trealxgettreal64g:");				// come here to round down
+	asm("xor bl, bl");						// clear rounding bits
+	asm("and bh, 0xF8");
+	asm("mov di, cx");						// save exponent
+	asm("mov cl, 10");
+	asm("and edx, 0x7FFFFFFF");				// clear integer bit
+	asm("shrd ebx, edx, cl");				// shift mantissa right by 10
+	asm("shr edx, cl");
+	asm("shl edi, 21");						// exponent into edi bits 21-31
+	asm("or edx, edi");						// into edx bits 21-31
+	asm("test edx, edx");					// check if underflow
+	asm("jnz short trealxgettreal64i");
+	asm("test ebx, ebx");
+	asm("jz short trealxgettreal64h");		// branch out if underflow
+	asm("trealxgettreal64i:");
+	asm("shr ecx, 17");						// sign bit->carry
+	asm("rcr edx, 1");						// ->edx bit 31, exp->edx bits 20-30, mant->edx bits 20-0
+	asm("rcr ebx, 1");
+	asm("xor eax, eax");					// return KErrNone
+	asm("ret");
+	asm("trealxgettreal64z:");				// come here if zero or underflow
+	asm("xor eax, eax");
+	asm("cmp cx, 0x8400");					// check for zero
+	asm("jz short trealxgettreal64y");		// if zero, return KErrNone
+	asm("trealxgettreal64h:");				// come here if underflow after rounding
+	asm("mov eax, -10");					// eax=KErrUnderflow
+	asm("trealxgettreal64y:");
+	asm("xor edx, edx");
+	asm("xor ebx, ebx");
+	asm("shr ecx, 17");
+	asm("rcr edx, 1");						// sign bit into edx bit 31, rest of edx=0, ebx=0
+	asm("ret");
+	}
+
+
+
+
+__NAKED__ EXPORT_C TRealX::operator TReal32() const
+/**
+Returns the extended precision value as
+a single precision floating point value.
+*/
+	{
+	// On entry, ecx=this
+	// On exit, TReal32 value on top of FPU stack
+	THISCALL_PROLOG0()
+	asm("push ecx");
+	asm("push ebx");
+	asm("mov ebx, [ecx]");					// *this into ecx,edx:ebx
+	asm("mov edx, [ecx+4]");
+	asm("mov ecx, [ecx+8]");
+	asm("call %a0": : "i"(&TRealXGetTReal32));	// Convert to TReal32 in edx
+	asm("push edx");						// push TReal32 onto stack
+	asm("fld dword ptr [esp]");				// push TReal32 onto FPU stack
+	asm("pop edx");
+	asm("pop ebx");
+	asm("pop ecx");
+	THISCALL_EPILOG0()
+	}
+
+
+
+
+__NAKED__ EXPORT_C TRealX::operator TReal64() const
+/**
+Returns the extended precision value as
+a double precision floating point value.
+*/
+	{
+	// On entry, ecx=this
+	// On exit, TReal64 value on top of FPU stack
+	THISCALL_PROLOG0()
+	asm("push ecx");
+	asm("push ebx");
+	asm("push esi");
+	asm("push edi");
+	asm("mov ebx, [ecx]");						// *this into ecx,edx:ebx
+	asm("mov edx, [ecx+4]");
+	asm("mov ecx, [ecx+8]");
+	asm("call %a0": : "i"(&TRealXGetTReal64));	// Convert to TReal32 in edx:ebx
+	asm("push edx");							// push TReal64 onto stack
+	asm("push ebx");
+	asm("fld qword ptr [esp]");					// push TReal64 onto FPU stack
+	asm("add esp, 8");
+	asm("pop edi");
+	asm("pop esi");
+	asm("pop ebx");
+	asm("pop ecx");
+	THISCALL_EPILOG0()
+	}
+
+
+
+
+__NAKED__ EXPORT_C TInt TRealX::GetTReal(TReal32& /*aVal*/) const
+/**
+Extracts the extended precision value as
+a single precision floating point value.
+
+@param aVal A reference to a single precision object which contains
+the result of the operation.
+
+@return KErrNone, if the operation is successful;
+KErrOverflow, if the operation results in overflow;
+KErrUnderflow, if the operation results in underflow.
+*/
+	{
+	// On entry, ecx=this, [esp+4]=address of aVal
+	// On exit, eax=return code
+	THISCALL_PROLOG1()
+	asm("push ecx");
+	asm("push ebx");
+	asm("mov ebx, [ecx]");						// *this into ecx,edx:ebx
+	asm("mov edx, [ecx+4]");
+	asm("mov ecx, [ecx+8]");
+	asm("call %a0": : "i"(&TRealXGetTReal32));
+	asm("mov ecx, [esp+12]");					// ecx=address of aVal
+	asm("mov [ecx], edx");						// store result
+	asm("pop ebx");
+	asm("pop ecx");
+	THISCALL_EPILOG1()							// return with error code in eax
+	}
+
+
+
+
+__NAKED__ EXPORT_C TInt TRealX::GetTReal(TReal64& /*aVal*/) const
+/**
+Extracts the extended precision value as
+a double precision floating point value.
+
+@param aVal A reference to a double precision object which
+contains the result of the operation.
+
+@return KErrNone, if the operation is successful;
+KErrOverflow, if the operation results in overflow;
+KErrUnderflow, if the operation results in underflow.
+*/
+	{
+	// On entry, ecx=this, [esp+4]=address of aVal
+	// On exit, eax=return code
+	THISCALL_PROLOG1()
+	asm("push ecx");
+	asm("push ebx");
+	asm("push esi");
+	asm("push edi");
+	asm("mov ebx, [ecx]");						// *this into ecx,edx:ebx
+	asm("mov edx, [ecx+4]");
+	asm("mov ecx, [ecx+8]");
+	asm("call %a0": : "i"(&TRealXGetTReal64));
+	asm("mov ecx, [esp+20]");					// ecx=address of aVal
+	asm("mov [ecx], ebx");						// store result
+	asm("mov [ecx+4], edx");
+	asm("pop edi");
+	asm("pop esi");
+	asm("pop ebx");
+	asm("pop ecx");
+	THISCALL_EPILOG1()							// return with error code in eax
+	}
+
+
+
+
+__NAKED__ EXPORT_C void TRealX::SetZero(TBool /*aNegative*/)
+/**
+Sets the value of this extended precision object to zero.
+
+@param aNegative ETrue, the value is a negative zero;
+EFalse, the value is a positive zero, this is the default.
+*/
+	{
+	THISCALL_PROLOG1()
+	asm("mov edx, [esp+4]");		// aNegative into edx
+	asm("xor eax, eax");			// eax=0
+	asm("mov [ecx], eax");
+	asm("mov [ecx+4], eax");
+	asm("test edx, edx");
+	asm("jz short setzero1");
+	asm("inc eax");					// eax=1 if aNegative!=0
+	asm("setzero1:");
+	asm("mov [ecx+8], eax");		// generate positive or negative zero
+	THISCALL_EPILOG1()
+	}
+
+
+
+
+__NAKED__ EXPORT_C void TRealX::SetNaN()
+/**
+Sets the value of this extended precision object to 'not a number'.
+*/
+	{
+	THISCALL_PROLOG0()
+	asm("xor eax, eax");			// set *this to 'real indefinite'
+	asm("mov [ecx], eax");
+	asm("mov eax, 0xC0000000");
+	asm("mov [ecx+4], eax");
+	asm("mov eax, 0xFFFF0001");
+	asm("mov [ecx+8], eax");
+	THISCALL_EPILOG0()
+	}
+
+
+
+
+__NAKED__ EXPORT_C void TRealX::SetInfinite(TBool /*aNegative*/)
+/**
+Sets the value of this extended precision object to infinity.
+
+@param aNegative ETrue, the value is a negative zero;
+EFalse, the value is a positive zero.
+*/
+	{
+	THISCALL_PROLOG1()
+	asm("mov edx, [esp+4]");			// aNegative into edx
+	asm("mov eax, 0xFFFF0000");			// exponent=FFFF, sign=0 initially
+	asm("test edx, edx");
+	asm("jz short setinf1");
+	asm("inc eax");						// sign=1 if aNegative!=0
+	asm("setinf1:");
+	asm("mov [ecx+8], eax");
+	asm("mov eax, 0x80000000");			// generate positive or negative infinity
+	asm("mov [ecx+4], eax");
+	asm("xor eax, eax");
+	asm("mov [ecx], eax");
+	THISCALL_EPILOG1()
+	}
+
+
+
+
+__NAKED__ EXPORT_C TBool TRealX::IsZero() const
+/**
+Determines whether the extended precision value is zero.
+
+@return True, if the extended precision value is zero, false, otherwise.
+*/
+	{
+	THISCALL_PROLOG0()
+	asm("mov eax, [ecx+8]");		// check exponent
+	asm("shr eax, 16");				// move exponent into ax
+	asm("jz short iszero1");		// branch if zero
+	asm("xor eax, eax");			// else return 0
+	THISCALL_EPILOG0()
+	asm("iszero1:");
+	asm("inc eax");					// if zero, return 1
+	THISCALL_EPILOG0()
+	}
+
+
+
+
+__NAKED__ EXPORT_C TBool TRealX::IsNaN() const
+/**
+Determines whether the extended precision value is 'not a number'.
+
+@return True, if the extended precision value is 'not a number',
+false, otherwise.
+*/
+	{
+	THISCALL_PROLOG0()
+	asm("mov eax, [ecx+8]");		// check exponent
+	asm("cmp eax, 0xFFFF0000");
+	asm("jc short isnan0");			// branch if not FFFF
+	asm("mov eax, [ecx+4]");
+	asm("cmp eax, 0x80000000");		// check for infinity
+	asm("jne short isnan1");
+	asm("mov eax, [ecx]");
+	asm("test eax, eax");
+	asm("jne short isnan1");
+	asm("isnan0:");
+	asm("xor eax, eax");			// return 0 if not NaN
+	THISCALL_EPILOG0()
+	asm("isnan1:");
+	asm("mov eax, 1");				// return 1 if NaN
+	THISCALL_EPILOG0()
+	}
+
+
+
+
+__NAKED__ EXPORT_C TBool TRealX::IsInfinite() const
+/**
+Determines whether the extended precision value has a finite value.
+
+@return True, if the extended precision value is finite,
+false, if the value is 'not a number' or is infinite,
+*/
+	{
+	THISCALL_PROLOG0()
+	asm("mov eax, [ecx+8]");			// check exponent
+	asm("cmp eax, 0xFFFF0000");
+	asm("jc short isinf0");				// branch if not FFFF
+	asm("mov eax, [ecx+4]");
+	asm("cmp eax, 0x80000000");			// check for infinity
+	asm("jne short isinf0");
+	asm("mov eax, [ecx]");
+	asm("test eax, eax");
+	asm("jne short isinf0");
+	asm("inc eax");						// return 1 if infinity
+	THISCALL_EPILOG0()
+	asm("isinf0:");
+	asm("xor eax, eax");				// return 0 if not infinity
+	THISCALL_EPILOG0()
+	}
+
+
+
+
+__NAKED__ EXPORT_C TBool TRealX::IsFinite() const
+/**
+Determines whether the extended precision value has a finite value.
+
+@return True, if the extended precision value is finite,
+false, if the value is 'not a number' or is infinite,
+*/
+	{
+	THISCALL_PROLOG0()
+	asm("mov eax, [ecx+8]");			// check exponent
+	asm("cmp eax, 0xFFFF0000");			// check for NaN or infinity
+	asm("jnc short isfinite0");			// branch if NaN or infinity
+	asm("mov eax, 1");					// return 1 if finite
+	THISCALL_EPILOG0()
+	asm("isfinite0:");
+	asm("xor eax, eax");				// return 0 if NaN or infinity
+	THISCALL_EPILOG0()
+	}
+
+
+
+
+__NAKED__ EXPORT_C const TRealX& TRealX::operator+=(const TRealX& /*aVal*/)
+/**
+Adds an extended precision value to this extended precision number.
+
+@param aVal The extended precision value to be added.
+
+@return A reference to this object.
+
+@panic MATHX KErrOverflow if the operation results in overflow.
+@panic MATHX KErrUnderflow if  the operation results in underflow.
+*/
+	{
+	// on entry ecx=this, [esp+4]=address of aVal
+	THISCALL_PROLOG1()
+	asm("push ebx");					// save registers
+	asm("push ebp");
+	asm("push esi");
+	asm("push edi");
+	asm("mov esi, ecx");				// this into esi
+	asm("mov ecx, [esp+20]");			// address of aVal into ecx
+	asm("mov ebx, [ecx]");				// aVal into ecx,edx:ebx
+	asm("mov edx, [ecx+4]");
+	asm("mov ecx, [ecx+8]");
+	asm("call %a0": :"i"(&TRealXAdd));	// do addition, result in ecx,edx:ebx, error code in eax
+	asm("mov [esi], ebx");				// store result in *this
+	asm("mov [esi+4], edx");
+	asm("mov [esi+8], ecx");
+	asm("test eax, eax");
+	_ASM_jn(z,TRealXPanicEax)			// panic if error
+	asm("mov eax, esi");				// return this in eax
+	asm("mov ecx, esi");				// restore registers
+	asm("pop edi");
+	asm("pop esi");
+	asm("pop ebp");
+	asm("pop ebx");
+	THISCALL_EPILOG1()
+	}
+
+
+
+
+__NAKED__ EXPORT_C const TRealX& TRealX::operator-=(const TRealX& /*aVal*/)
+/**
+Subtracts an extended precision value from this extended precision number.
+
+@param aVal The extended precision value to be subtracted.
+
+@return A reference to this object.
+
+@panic MATHX KErrOverflow if the operation results in overflow.
+@panic MATHX KErrUnderflow if  the operation results in underflow.
+*/
+	{
+	// on entry ecx=this, [esp+4]=address of aVal
+	THISCALL_PROLOG1()
+	asm("push ebx");						// save registers
+	asm("push ebp");
+	asm("push esi");
+	asm("push edi");
+	asm("mov esi, ecx");					// this into esi
+	asm("mov ecx, [esp+20]");				// address of aVal into ecx
+	asm("mov ebx, [ecx]");					// aVal into ecx,edx:ebx
+	asm("mov edx, [ecx+4]");
+	asm("mov ecx, [ecx+8]");
+	asm("call %a0": : "i"(&TRealXSubtract));	// do subtraction, result in ecx,edx:ebx, error code in eax
+	asm("mov [esi], ebx");					// store result in *this
+	asm("mov [esi+4], edx");
+	asm("mov [esi+8], ecx");
+	asm("test eax, eax");
+	_ASM_jn(z,TRealXPanicEax)				// panic if error
+	asm("mov eax, esi");					// return this in eax
+	asm("mov ecx, esi");					// restore registers
+	asm("pop edi");
+	asm("pop esi");
+	asm("pop ebp");
+	asm("pop ebx");
+	THISCALL_EPILOG1()
+	}
+
+
+
+
+__NAKED__ EXPORT_C const TRealX& TRealX::operator*=(const TRealX& /*aVal*/)
+/**
+Multiplies this extended precision number by an extended precision value.
+
+@param aVal The extended precision value to be subtracted.
+
+@return A reference to this object.
+
+@panic MATHX KErrOverflow if the operation results in overflow.
+@panic MATHX KErrUnderflow if  the operation results in underflow.
+*/
+	{
+	// on entry ecx=this, [esp+4]=address of aVal
+	THISCALL_PROLOG1()
+	asm("push ebx");					// save registers
+	asm("push ebp");
+	asm("push esi");
+	asm("push edi");
+	asm("mov esi, ecx");				// esi = this
+	asm("mov ecx, [esp+20]");			// address of aVal into ecx
+	asm("mov ebx, [ecx]");				// aVal into ecx,edx:ebx
+	asm("mov edx, [ecx+4]");
+	asm("mov ecx, [ecx+8]");
+	asm("call %a0": : "i"(&TRealXMultiply)); // do multiplication, result in ecx,edx:ebx, error code in eax
+	asm("mov [esi], ebx");				// store result in *this
+	asm("mov [esi+4], edx");
+	asm("mov [esi+8], ecx");
+	asm("test eax, eax");
+	_ASM_jn(z,TRealXPanicEax)			// panic if error
+	asm("mov eax, esi");				// return this in eax
+	asm("mov ecx, esi");				// restore registers
+	asm("pop edi");
+	asm("pop esi");
+	asm("pop ebp");
+	asm("pop ebx");
+	THISCALL_EPILOG1()
+	}
+
+
+
+
+__NAKED__ EXPORT_C const TRealX& TRealX::operator/=(const TRealX& /*aVal*/)
+/**
+Divides this extended precision number by an extended precision value.
+
+@param aVal The extended precision value to be used as the divisor.
+
+@return A reference to this object.
+
+@panic MATHX KErrOverflow if the operation results in overflow.
+@panic MATHX KErrUnderflow if  the operation results in underflow.
+@panic MATHX KErrDivideByZero if the divisor is zero.
+*/
+	{
+	// on entry ecx=this, [esp+4]=address of aVal
+	THISCALL_PROLOG1()
+	asm("push ebx");
+	asm("push ebp");
+	asm("push esi");
+	asm("push edi");
+	asm("mov esi, ecx");				// this into esi
+	asm("mov ecx, [esp+20]");			// address of aVal into ecx
+	asm("mov ebx, [ecx]");				// aVal into ecx,edx:ebx
+	asm("mov edx, [ecx+4]");
+	asm("mov ecx, [ecx+8]");
+	asm("call %a0": : "i"(&TRealXDivide));	// do division, result in ecx,edx:ebx, error code in eax
+	asm("mov [esi], ebx");				// store result in *this
+	asm("mov [esi+4], edx");
+	asm("mov [esi+8], ecx");
+	asm("test eax, eax");
+	_ASM_jn(z,TRealXPanicEax)			// panic if error
+	asm("mov eax, esi");				// return this in eax
+	asm("mov ecx, esi");				// restore registers
+	asm("pop edi");
+	asm("pop esi");
+	asm("pop ebp");
+	asm("pop ebx");
+	THISCALL_EPILOG1()
+	}
+
+
+
+
+__NAKED__ EXPORT_C const TRealX& TRealX::operator%=(const TRealX& /*aVal*/)
+/**
+Modulo-divides this extended precision number by an extended precision value.
+
+@param aVal The extended precision value to be used as the divisor.
+
+@return A reference to this object.
+
+@panic MATHX KErrTotalLossOfPrecision panic if precision is lost.
+@panic MATHX KErrUnderflow if  the operation results in underflow.
+*/
+	{
+	// on entry ecx=this, [esp+4]=address of aVal
+	THISCALL_PROLOG1()
+	asm("push ebx");
+	asm("push ebp");
+	asm("push esi");
+	asm("push edi");
+	asm("mov esi, ecx");				// this into esi
+	asm("mov ecx, [esp+20]");			// address of aVal into ecx
+	asm("mov ebx, [ecx]");				// aVal into ecx,edx:ebx
+	asm("mov edx, [ecx+4]");
+	asm("mov ecx, [ecx+8]");
+	asm("call %a0": : "i"(&TRealXModulo));	// do modulo, result in ecx,edx:ebx, error code in eax
+	asm("mov [esi], ebx");				// store result in *this
+	asm("mov [esi+4], edx");
+	asm("mov [esi+8], ecx");
+	asm("test eax, eax");
+	_ASM_jn(z,TRealXPanicEax)			// panic if error
+	asm("mov eax, esi");				// return this in eax
+	asm("mov ecx, esi");				// restore registers
+	asm("pop edi");
+	asm("pop esi");
+	asm("pop ebp");
+	asm("pop ebx");
+	THISCALL_EPILOG1()
+	}
+
+
+
+
+__NAKED__ EXPORT_C TInt TRealX::AddEq(const TRealX& /*aVal*/)
+/**
+Adds an extended precision value to this extended precision number.
+
+@param aVal The extended precision value to be added.
+
+@return KErrNone, if the operation is successful;
+KErrOverflow,if the operation results in overflow;
+KErrUnderflow, if the operation results in underflow.
+*/
+	{
+	// on entry ecx=this, [esp+4]=address of aVal
+	THISCALL_PROLOG1()
+	asm("push ebx");					// save registers
+	asm("push ebp");
+	asm("push esi");
+	asm("push edi");
+	asm("mov esi, ecx");				// this into esi
+	asm("mov ecx, [esp+20]");			// address of aVal into ecx
+	asm("mov ebx, [ecx]");				// aVal into ecx,edx:ebx
+	asm("mov edx, [ecx+4]");
+	asm("mov ecx, [ecx+8]");
+	asm("call %a0": :"i"(&TRealXAdd));	// do addition, result in ecx,edx:ebx, error code in eax
+	asm("mov [esi], ebx");				// store result
+	asm("mov [esi+4], edx");
+	asm("mov [esi+8], ecx");
+	asm("mov ecx, esi");				// restore registers
+	asm("pop edi");
+	asm("pop esi");
+	asm("pop ebp");
+	asm("pop ebx");
+	THISCALL_EPILOG1()					// return with error code in eax
+	}
+
+
+
+
+__NAKED__ EXPORT_C TInt TRealX::SubEq(const TRealX& /*aVal*/)
+/**
+Subtracts an extended precision value from this extended precision number.
+
+@param aVal The extended precision value to be subtracted.
+
+@return KErrNone, if the operation is successful;
+KErrOverflow, if the operation results in overflow;
+KErrUnderflow, if the operation results in underflow.
+*/
+	{
+	// on entry ecx=this, [esp+4]=address of aVal
+	THISCALL_PROLOG1()
+	asm("push ebx");					// save registers
+	asm("push ebp");
+	asm("push esi");
+	asm("push edi");
+	asm("mov esi, ecx");				// this into esi
+	asm("mov ecx, [esp+20]");			// address of aVal into ecx
+	asm("mov ebx, [ecx]");				// aVal into ecx,edx:ebx
+	asm("mov edx, [ecx+4]");
+	asm("mov ecx, [ecx+8]");
+	asm("call %a0": : "i"(&TRealXSubtract));	// do subtraction, result in ecx,edx:ebx, error code in eax
+	asm("mov [esi], ebx");				// store result
+	asm("mov [esi+4], edx");
+	asm("mov [esi+8], ecx");
+	asm("mov ecx, esi");				// restore registers
+	asm("pop edi");
+	asm("pop esi");
+	asm("pop ebp");
+	asm("pop ebx");
+	THISCALL_EPILOG1()					// return with error code in eax
+	}
+
+
+
+
+__NAKED__ EXPORT_C TInt TRealX::MultEq(const TRealX& /*aVal*/)
+/**
+Multiplies this extended precision number by an extended precision value.
+
+@param aVal The extended precision value to be used as the multiplier.
+
+@return KErrNone, if the operation is successful;
+KErrOverflow, if the operation results in overflow;
+KErrUnderflow, if the operation results in underflow
+*/
+	{
+	// on entry ecx=this, [esp+4]=address of aVal
+	THISCALL_PROLOG1()
+	asm("push ebx");					// save registers
+	asm("push ebp");
+	asm("push esi");
+	asm("push edi");
+	asm("mov esi, ecx");				// this into esi
+	asm("mov ecx, [esp+20]");			// address of aVal into ecx
+	asm("mov ebx, [ecx]");				// aVal into ecx,edx:ebx
+	asm("mov edx, [ecx+4]");
+	asm("mov ecx, [ecx+8]");
+	asm("call %a0": : "i"(&TRealXMultiply));	// do multiplication, result in ecx,edx:ebx, error code in eax
+	asm("mov [esi], ebx");				// store result
+	asm("mov [esi+4], edx");
+	asm("mov [esi+8], ecx");
+	asm("mov ecx, esi");				// restore registers
+	asm("pop edi");
+	asm("pop esi");
+	asm("pop ebp");
+	asm("pop ebx");
+	THISCALL_EPILOG1()					// return with error code in eax
+	}
+
+
+
+
+__NAKED__ EXPORT_C TInt TRealX::DivEq(const TRealX& /*aVal*/)
+/**
+Divides this extended precision number by an extended precision value.
+
+@param aVal The extended precision value to be used as the divisor.
+
+@return KErrNone, if the operation is successful;
+KErrOverflow, if the operation results in overflow;
+KErrUnderflow, if the operation results in underflow;
+KErrDivideByZero, if the divisor is zero.
+*/
+	{
+	// on entry ecx=this, [esp+4]=address of aVal
+	THISCALL_PROLOG1()
+	asm("push ebx");						// save registers
+	asm("push ebp");
+	asm("push esi");
+	asm("push edi");
+	asm("mov esi, ecx");					// this into esi
+	asm("mov ecx, [esp+20]");				// address of aVal into ecx
+	asm("mov ebx, [ecx]");					// aVal into ecx,edx:ebx
+	asm("mov edx, [ecx+4]");
+	asm("mov ecx, [ecx+8]");
+	asm("call %a0": : "i"(&TRealXDivide));	// do division, result in ecx,edx:ebx, error code in eax
+	asm("mov [esi], ebx");					// store result
+	asm("mov [esi+4], edx");
+	asm("mov [esi+8], ecx");
+	asm("mov ecx, esi");					// restore registers
+	asm("pop edi");
+	asm("pop esi");
+	asm("pop ebp");
+	asm("pop ebx");
+	THISCALL_EPILOG1()						// return with error code in eax
+	}
+
+
+
+
+__NAKED__ EXPORT_C TInt TRealX::ModEq(const TRealX& /*aVal*/)
+/**
+Modulo-divides this extended precision number by an extended precision value.
+
+@param aVal The extended precision value to be used as the divisor.
+
+@return KErrNone, if the operation is successful;
+KErrTotalLossOfPrecision, if precision is lost;
+KErrUnderflow, if the operation results in underflow.
+*/
+	{
+	// on entry ecx=this, [esp+4]=address of aVal
+	THISCALL_PROLOG1()
+	asm("push ebx");					// save registers
+	asm("push ebp");
+	asm("push esi");
+	asm("push edi");
+	asm("mov esi, ecx");				// this into esi
+	asm("mov ecx, [esp+20]");			// address of aVal into ecx
+	asm("mov ebx, [ecx]");				// aVal into ecx,edx:ebx
+	asm("mov edx, [ecx+4]");
+	asm("mov ecx, [ecx+8]");
+	asm("call %a0": : "i"(&TRealXModulo));	// do modulo, result in ecx,edx:ebx, error code in eax
+	asm("mov [esi], ebx");				// store result
+	asm("mov [esi+4], edx");
+	asm("mov [esi+8], ecx");
+	asm("mov ecx, esi");				// restore registers
+	asm("pop edi");
+	asm("pop esi");
+	asm("pop ebp");
+	asm("pop ebx");
+	THISCALL_EPILOG1()					// return with error code in eax
+	}
+
+
+
+
+__NAKED__ EXPORT_C TRealX TRealX::operator+() const
+/**
+Returns this extended precision number unchanged.
+
+Note that this may also be referred to as a unary plus operator.
+
+@return The extended precision number.
+*/
+	{
+	THISCALL_PROLOG0_BIGRETVAL()
+	asm("mov eax, [esp+4]");			// eax=address to write return value
+	asm("mov edx, [ecx]");
+	asm("mov [eax], edx");
+	asm("mov edx, [ecx+4]");
+	asm("mov [eax+4], edx");
+	asm("mov edx, [ecx+8]");
+	asm("mov [eax+8], edx");			// return address of return value in eax
+	THISCALL_EPILOG0_BIGRETVAL()
+	}
+
+
+
+
+__NAKED__ EXPORT_C TRealX TRealX::operator-() const
+/**
+Negates this extended precision number.
+
+This may also be referred to as a unary minus operator.
+
+@return The negative of the extended precision number.
+*/
+	{
+	THISCALL_PROLOG0_BIGRETVAL()		
+	asm("mov eax, [esp+4]");			// eax=address to write return value
+	asm("mov edx, [ecx]");
+	asm("mov [eax], edx");
+	asm("mov edx, [ecx+4]");
+	asm("mov [eax+4], edx");
+	asm("mov edx, [ecx+8]");
+	asm("xor dl, 1");					// change sign bit
+	asm("mov [eax+8], edx");			
+	THISCALL_EPILOG0_BIGRETVAL()		// return address of return value in eax
+	}
+
+
+
+
+__NAKED__ EXPORT_C TRealX& TRealX::operator++()
+/**
+Increments this extended precision number by one,
+and then returns a reference to it.
+
+This is also referred to as a prefix operator.
+
+@return A reference to this object.
+
+@panic MATHX KErrOverflow if the operation results in overflow.
+@panic MATHX KErrUnderflow if  the operation results in underflow.
+*/
+	{
+	// pre-increment
+	// on entry ecx=this, return this in eax
+	THISCALL_PROLOG0()
+	asm("push ebx");					// save registers
+	asm("push ebp");
+	asm("push esi");
+	asm("push edi");
+	asm("mov esi, ecx");				// this into esi
+	asm("mov ecx, 0x7FFF0000");			// set ecx,edx:ebx to 1.0
+	asm("mov edx, 0x80000000");
+	asm("xor ebx, ebx");
+	asm("call %a0": :"i"(&TRealXAdd));	// add 1 to *this
+	asm("mov [esi], ebx");				// store result
+	asm("mov [esi+4], edx");
+	asm("mov [esi+8], ecx");
+	asm("test eax, eax");				// check error code
+	_ASM_jn(z,TRealXPanicEax)			// panic if error
+	asm("mov eax, esi");				// else return this in eax
+	asm("mov ecx, esi");
+	asm("pop edi");
+	asm("pop esi");
+	asm("pop ebp");
+	asm("pop ebx");
+	THISCALL_EPILOG0()
+	}
+
+
+
+
+__NAKED__ EXPORT_C TRealX TRealX::operator++(TInt)
+/**
+Returns this extended precision number before incrementing it by one.
+
+This is also referred to as a postfix operator.
+
+@return A reference to this object.
+
+@panic MATHX KErrOverflow if the operation results in overflow.
+@panic MATHX KErrUnderflow if  the operation results in underflow.
+*/
+	{
+	// post-increment
+	// on entry ecx=this, [esp+4]=address of return value, [esp+8]=dummy int
+	THISCALL_PROLOG1_BIGRETVAL()
+	asm("push ebx");					// save registers
+	asm("push ebp");
+	asm("push esi");
+	asm("push edi");
+	asm("mov esi, ecx");				// this into esi
+	asm("mov edi, [esp+20]");			// address of return value into edi
+	asm("mov eax, [ecx]");				// copy initial value of *this into [edi]
+	asm("mov [edi], eax");
+	asm("mov eax, [ecx+4]");
+	asm("mov [edi+4], eax");
+	asm("mov eax, [ecx+8]");
+	asm("mov [edi+8], eax");
+	asm("mov ecx, 0x7FFF0000");			// set ecx,edx:ebx to 1.0
+	asm("mov edx, 0x80000000");
+	asm("xor ebx, ebx");
+	asm("call %a0": :"i"(&TRealXAdd));	// add 1 to *this
+	asm("mov [esi], ebx");				// store result in *this
+	asm("mov [esi+4], edx");
+	asm("mov [esi+8], ecx");
+	asm("test eax, eax");				// check error code
+	_ASM_jn(z,TRealXPanicEax)			// panic if error
+	asm("mov eax, [esp+20]");			// address of return value into eax
+	asm("mov ecx, esi");
+	asm("pop edi");
+	asm("pop esi");
+	asm("pop ebp");
+	asm("pop ebx");
+	THISCALL_EPILOG1_BIGRETVAL()
+	}
+
+
+
+
+__NAKED__ EXPORT_C TRealX& TRealX::operator--()
+/**
+Decrements this extended precision number by one,
+and then returns a reference to it.
+
+This is also referred to as a prefix operator.
+
+@return A reference to this object.
+
+@panic MATHX KErrOverflow if the operation results in overflow.
+@panic MATHX KErrUnderflow if  the operation results in underflow.
+*/
+	{
+	// pre-decrement
+	// on entry ecx=this, return this in eax
+	THISCALL_PROLOG0()
+	asm("push ebx");					// save registers
+	asm("push ebp");
+	asm("push esi");
+	asm("push edi");
+	asm("mov esi, ecx");				// this into esi
+	asm("mov ecx, 0x7FFF0001");			// set ecx,edx:ebx to -1.0
+	asm("mov edx, 0x80000000");
+	asm("xor ebx, ebx");
+	asm("call %a0": :"i"(&TRealXAdd));	// add -1 to *this
+	asm("mov [esi], ebx");				// store result
+	asm("mov [esi+4], edx");
+	asm("mov [esi+8], ecx");
+	asm("test eax, eax");				// check error code
+	_ASM_jn(z,TRealXPanicEax)			// panic if error
+	asm("mov eax, esi");				// else return this in eax
+	asm("mov ecx, esi");
+	asm("pop edi");
+	asm("pop esi");
+	asm("pop ebp");
+	asm("pop ebx");
+	THISCALL_EPILOG0()
+	}
+
+
+
+
+__NAKED__ EXPORT_C TRealX TRealX::operator--(TInt)
+/**
+Returns this extended precision number before decrementing it by one.
+
+This is also referred to as a postfix operator.
+
+@return A reference to this object.
+
+@panic MATHX KErrOverflow if the operation results in overflow.
+@panic MATHX KErrUnderflow if  the operation results in underflow.
+*/
+	{
+	// post-decrement
+	// on entry ecx=this, [esp+4]=address of return value, [esp+8]=dummy int	
+	THISCALL_PROLOG1_BIGRETVAL()
+	asm("push ebx");					// save registers
+	asm("push ebp");
+	asm("push esi");
+	asm("push edi");
+	asm("mov esi, ecx");				// this into esi
+	asm("mov edi, [esp+20]");			// address of return value into edi
+	asm("mov eax, [ecx]");				// copy initial value of *this into [edi]
+	asm("mov [edi], eax");
+	asm("mov eax, [ecx+4]");
+	asm("mov [edi+4], eax");
+	asm("mov eax, [ecx+8]");
+	asm("mov [edi+8], eax");
+	asm("mov ecx, 0x7FFF0001");			// set ecx,edx:ebx to -1.0
+	asm("mov edx, 0x80000000");
+	asm("xor ebx, ebx");
+	asm("call %a0": :"i"(&TRealXAdd));	// add -1 to *this
+	asm("mov [esi], ebx");				// store result in *this
+	asm("mov [esi+4], edx");
+	asm("mov [esi+8], ecx");
+	asm("test eax, eax");				// check error code
+	_ASM_jn(z,TRealXPanicEax)			// panic if error
+	asm("mov eax, [esp+20]");			// address of return value into eax
+	asm("mov ecx, esi");
+	asm("pop edi");
+	asm("pop esi");
+	asm("pop ebp");
+	asm("pop ebx");
+	THISCALL_EPILOG1_BIGRETVAL()
+	}
+
+
+
+
+__NAKED__ EXPORT_C TRealX TRealX::operator+(const TRealX& /*aVal*/) const
+/**
+Adds an extended precision value to this extended precision number.
+
+@param aVal The extended precision value to be added.
+
+@return An extended precision object containing the result.
+
+@panic MATHX KErrOverflow if the operation results in overflow.
+@panic MATHX KErrUnderflow if  the operation results in underflow.
+*/
+	{
+	// on entry ecx=this, [esp+4]=address of return value, [esp+8]=address of aVal
+	THISCALL_PROLOG1_BIGRETVAL()
+	asm("push ecx");					// save registers
+	asm("push ebx");
+	asm("push ebp");
+	asm("push esi");
+	asm("push edi");
+	asm("mov esi, ecx");				// this into esi
+	asm("mov ecx, [esp+28]");			// address of aVal into ecx
+	asm("mov ebx, [ecx]");				// aVal into ecx,edx:ebx
+	asm("mov edx, [ecx+4]");
+	asm("mov ecx, [ecx+8]");
+	asm("call %a0": :"i"(&TRealXAdd));	// do addition, result in ecx,edx:ebx, error code in eax
+	asm("mov esi, [esp+24]");			// esi=address of return value
+	asm("mov [esi], ebx");				// store result
+	asm("mov [esi+4], edx");
+	asm("mov [esi+8], ecx");
+	asm("test eax, eax");
+	_ASM_jn(z,TRealXPanicEax)			// panic if error
+	asm("mov eax, esi");				// return address of return value in eax
+	asm("pop edi");						// restore registers
+	asm("pop esi");
+	asm("pop ebp");
+	asm("pop ebx");
+	asm("pop ecx");
+	THISCALL_EPILOG1_BIGRETVAL()
+	}
+
+
+
+
+__NAKED__ EXPORT_C TRealX TRealX::operator-(const TRealX& /*aVal*/) const
+/**
+Subtracts an extended precision value from this extended precision number.
+
+@param aVal The extended precision value to be subtracted.
+
+@return An extended precision object containing the result.
+
+@panic MATHX KErrOverflow if the operation results in overflow.
+@panic MATHX KErrUnderflow if  the operation results in underflow.
+*/
+	{
+	// on entry ecx=this, [esp+4]=address of return value, [esp+8]=address of aVal
+	THISCALL_PROLOG1_BIGRETVAL()
+	asm("push ecx");					// save registers
+	asm("push ebx");
+	asm("push ebp");
+	asm("push esi");
+	asm("push edi");
+	asm("mov esi, ecx");				// this into esi
+	asm("mov ecx, [esp+28]");			// address of aVal into ecx
+	asm("mov ebx, [ecx]");				// aVal into ecx,edx:ebx
+	asm("mov edx, [ecx+4]");
+	asm("mov ecx, [ecx+8]");
+	asm("call %a0": : "i"(&TRealXSubtract)); // do subtraction, result in ecx,edx:ebx, error code in eax
+	asm("mov esi, [esp+24]");			// esi=address of return value
+	asm("mov [esi], ebx");				// store result
+	asm("mov [esi+4], edx");
+	asm("mov [esi+8], ecx");
+	asm("test eax, eax");
+	_ASM_jn(z,TRealXPanicEax)			// panic if error
+	asm("mov eax, esi");				// return address of return value in eax
+	asm("pop edi");						// restore registers
+	asm("pop esi");
+	asm("pop ebp");
+	asm("pop ebx");
+	asm("pop ecx");
+	THISCALL_EPILOG1_BIGRETVAL()
+	}
+
+
+
+
+__NAKED__ EXPORT_C TRealX TRealX::operator*(const TRealX& /*aVal*/) const
+/**
+Multiplies this extended precision number by an extended precision value.
+
+@param aVal The extended precision value to be used as the multiplier.
+
+@return An extended precision object containing the result.
+
+@panic MATHX KErrOverflow if the operation results in overflow.
+@panic MATHX KErrUnderflow if  the operation results in underflow.
+*/
+	{
+	// on entry ecx=this, [esp+4]=address of return value, [esp+8]=address of aVal
+	THISCALL_PROLOG1_BIGRETVAL()
+	asm("push ecx");					// save registers
+	asm("push ebx");
+	asm("push ebp");
+	asm("push esi");
+	asm("push edi");
+	asm("mov esi, ecx");				// this into esi
+	asm("mov ecx, [esp+28]");			// address of aVal into ecx
+	asm("mov ebx, [ecx]");				// aVal into ecx,edx:ebx
+	asm("mov edx, [ecx+4]");
+	asm("mov ecx, [ecx+8]");
+	asm("call %a0": : "i"(&TRealXMultiply)); // do multiplication, result in ecx,edx:ebx, error code in eax
+	asm("mov esi, [esp+24]");			// esi=address of return value
+	asm("mov [esi], ebx");				// store result
+	asm("mov [esi+4], edx");
+	asm("mov [esi+8], ecx");
+	asm("test eax, eax");
+	_ASM_jn(z,TRealXPanicEax)			// panic if error
+	asm("mov eax, esi");				// return address of return value in eax
+	asm("pop edi");						// restore registers
+	asm("pop esi");
+	asm("pop ebp");
+	asm("pop ebx");
+	asm("pop ecx");
+	THISCALL_EPILOG1_BIGRETVAL()
+	}
+
+
+
+
+__NAKED__ EXPORT_C TRealX TRealX::operator/(const TRealX& /*aVal*/) const
+/**
+Divides this extended precision number by an extended precision value.
+
+@param aVal The extended precision value to be used as the divisor.
+
+@return An extended precision object containing the result.
+
+@panic MATHX KErrOverflow if the operation results in overflow.
+@panic MATHX KErrUnderflow if  the operation results in underflow.
+@panic MATHX KErrDivideByZero if the divisor is zero.
+*/
+	{
+	// on entry ecx=this, [esp+4]=address of return value, [esp+8]=address of aVal
+	THISCALL_PROLOG1_BIGRETVAL()
+	asm("push ecx");					// save registers
+	asm("push ebx");
+	asm("push ebp");
+	asm("push esi");
+	asm("push edi");
+	asm("mov esi, ecx");				// this into esi
+	asm("mov ecx, [esp+28]");			// address of aVal into ecx
+	asm("mov ebx, [ecx]");				// aVal into ecx,edx:ebx
+	asm("mov edx, [ecx+4]");
+	asm("mov ecx, [ecx+8]");
+	asm("call %a0": : "i"(&TRealXDivide)); // do division, result in ecx,edx:ebx, error code in eax
+	asm("mov esi, [esp+24]");			// esi=address of return value
+	asm("mov [esi], ebx");				// store result
+	asm("mov [esi+4], edx");
+	asm("mov [esi+8], ecx");
+	asm("test eax, eax");
+	_ASM_jn(z,TRealXPanicEax)			// panic if error
+	asm("mov eax, esi");				// return address of return value in eax
+	asm("pop edi");						// restore registers
+	asm("pop esi");
+	asm("pop ebp");
+	asm("pop ebx");
+	asm("pop ecx");
+	THISCALL_EPILOG1_BIGRETVAL()
+	}
+
+
+
+
+__NAKED__ EXPORT_C TRealX TRealX::operator%(const TRealX& /*aVal*/) const
+/**
+Modulo-divides this extended precision number by an extended precision value.
+
+@param aVal The extended precision value to be used as the divisor.
+
+@return An extended precision object containing the result.
+
+@panic MATHX KErrTotalLossOfPrecision if precision is lost.
+@panic MATHX KErrUnderflow if the operation results in underflow.
+*/
+	{
+	// on entry ecx=this, [esp+4]=address of return value, [esp+8]=address of aVal
+	THISCALL_PROLOG1_BIGRETVAL()
+	asm("push ecx");					// save registers
+	asm("push ebx");
+	asm("push ebp");
+	asm("push esi");
+	asm("push edi");
+	asm("mov esi, ecx");				// this into esi
+	asm("mov ecx, [esp+28]");			// address of aVal into ecx
+	asm("mov ebx, [ecx]");				// aVal into ecx,edx:ebx
+	asm("mov edx, [ecx+4]");
+	asm("mov ecx, [ecx+8]");
+	asm("call %a0": : "i"(&TRealXModulo)); // do modulo, result in ecx,edx:ebx, error code in eax
+	asm("mov esi, [esp+24]");			// esi=address of return value
+	asm("mov [esi], ebx");				// store result
+	asm("mov [esi+4], edx");
+	asm("mov [esi+8], ecx");
+	asm("test eax, eax");
+	_ASM_jn(z,TRealXPanicEax)			// panic if error
+	asm("mov eax, esi");				// return address of return value in eax
+	asm("pop edi");						// restore registers
+	asm("pop esi");
+	asm("pop ebp");
+	asm("pop ebx");
+	asm("pop ecx");
+	THISCALL_EPILOG1_BIGRETVAL()
+	}
+
+
+
+
+__NAKED__ EXPORT_C TInt TRealX::Add(TRealX& /*aResult*/, const TRealX& /*aVal*/) const
+/**
+Adds an extended precision value to this extended precision number.
+
+@param aResult On return, a reference to an extended precision object
+containing the result of the operation.
+@param aVal    The extended precision value to be added.
+
+@return KErrNone, if the operation is successful;
+KErrOverflow, if the operation results in overflow;
+KErrUnderflow, if the operation results in underflow.
+*/
+	{
+	// on entry ecx=this, [esp+4]=address of aResult, [esp+8]=address of aVal
+	THISCALL_PROLOG2()
+	asm("push ecx");					// save registers
+	asm("push ebx");
+	asm("push ebp");
+	asm("push esi");
+	asm("push edi");
+	asm("mov esi, ecx");				// this into esi
+	asm("mov ecx, [esp+28]");			// address of aVal into ecx
+	asm("mov ebx, [ecx]");				// aVal into ecx,edx:ebx
+	asm("mov edx, [ecx+4]");
+	asm("mov ecx, [ecx+8]");
+	asm("call %a0": :"i"(&TRealXAdd));	// do addition, result in ecx,edx:ebx, error code in eax
+	asm("mov esi, [esp+24]");			// esi=address of aResult
+	asm("mov [esi], ebx");				// store result
+	asm("mov [esi+4], edx");
+	asm("mov [esi+8], ecx");
+	asm("pop edi");						// restore registers
+	asm("pop esi");
+	asm("pop ebp");
+	asm("pop ebx");
+	asm("pop ecx");
+	THISCALL_EPILOG2()					// return with error code in eax
+	}
+
+
+
+
+__NAKED__ EXPORT_C TInt TRealX::Sub(TRealX& /*aResult*/, const TRealX& /*aVal*/) const
+/**
+Subtracts an extended precision value from this extended precision number.
+
+@param aResult On return, a reference to an extended precision object
+containing the result of the operation.
+@param aVal    The extended precision value to be subtracted.
+
+@return KErrNone, if the operation is successful;
+KErrOverflow, if the operation results in overflow;
+KErrUnderflow, if the operation results in underflow.
+*/
+	{
+	// on entry ecx=this, [esp+4]=address of aResult, [esp+8]=address of aVal
+	THISCALL_PROLOG2()
+	asm("push ecx");					// save registers
+	asm("push ebx");
+	asm("push ebp");
+	asm("push esi");
+	asm("push edi");
+	asm("mov esi, ecx");				// this into esi
+	asm("mov ecx, [esp+28]");			// address of aVal into ecx
+	asm("mov ebx, [ecx]");				// aVal into ecx,edx:ebx
+	asm("mov edx, [ecx+4]");
+	asm("mov ecx, [ecx+8]");
+	asm("call %a0": : "i"(&TRealXSubtract));	// do subtraction, result in ecx,edx:ebx, error code in eax
+	asm("mov esi, [esp+24]");			// esi=address of aResult
+	asm("mov [esi], ebx");				// store result
+	asm("mov [esi+4], edx");			
+	asm("mov [esi+8], ecx");
+	asm("pop edi");						// restore registers
+	asm("pop esi");
+	asm("pop ebp");
+	asm("pop ebx");
+	asm("pop ecx");
+	THISCALL_EPILOG2()					// return with error code in eax
+	}
+
+
+
+
+__NAKED__ EXPORT_C TInt TRealX::Mult(TRealX& /*aResult*/, const TRealX& /*aVal*/) const
+/**
+Multiplies this extended precision number by an extended precision value.
+
+@param aResult On return, a reference to an extended precision object
+containing the result of the operation.
+@param aVal    The extended precision value to be used as the multiplier.
+
+@return KErrNone, if the operation is successful;
+KErrOverflow, if the operation results in overflow;
+KErrUnderflow, if the operation results in underflow.
+*/
+	{
+	// on entry ecx=this, [esp+4]=address of aResult, [esp+8]=address of aVal
+	THISCALL_PROLOG2()
+	asm("push ecx");					// save registers
+	asm("push ebx");
+	asm("push ebp");
+	asm("push esi");
+	asm("push edi");
+	asm("mov esi, ecx");				// this into esi
+	asm("mov ecx, [esp+28]");			// address of aVal into ecx
+	asm("mov ebx, [ecx]");				// aVal into ecx,edx:ebx
+	asm("mov edx, [ecx+4]");
+	asm("mov ecx, [ecx+8]");
+	asm("call %a0": : "i"(&TRealXMultiply)); // do multiplication, result in ecx,edx:ebx, error code in eax
+	asm("mov esi, [esp+24]");			// esi=address of aResult
+	asm("mov [esi], ebx");				// store result
+	asm("mov [esi+4], edx");
+	asm("mov [esi+8], ecx");
+	asm("pop edi");						// restore registers
+	asm("pop esi");
+	asm("pop ebp");
+	asm("pop ebx");
+	asm("pop ecx");
+	THISCALL_EPILOG2()					// return with error code in eax
+	}
+
+
+
+__NAKED__ EXPORT_C TInt TRealX::Div(TRealX& /*aResult*/, const TRealX& /*aVal*/) const
+/**
+Divides this extended precision number by an extended precision value.
+
+@param aResult On return, a reference to an extended precision object
+containing the result of the operation.
+@param aVal    The extended precision value to be used as the divisor.
+
+@return KErrNone, if the operation is successful;
+KErrOverflow, if the operation results in overflow;
+KErrUnderflow, if the operation results in underflow;
+KErrDivideByZero, if the divisor is zero.
+*/
+	{
+	// on entry ecx=this, [esp+4]=address of aResult, [esp+8]=address of aVal
+	THISCALL_PROLOG2()
+	asm("push ecx");					// save registers
+	asm("push ebx");
+	asm("push ebp");
+	asm("push esi");
+	asm("push edi");
+	asm("mov esi, ecx");				// this into esi
+	asm("mov ecx, [esp+28]");			// address of aVal into ecx
+	asm("mov ebx, [ecx]");				// aVal into ecx,edx:ebx
+	asm("mov edx, [ecx+4]");
+	asm("mov ecx, [ecx+8]");
+	asm("call %a0": : "i"(&TRealXDivide)); // do division, result in ecx,edx:ebx, error code in eax
+	asm("mov esi, [esp+24]");			// esi=address of aResult
+	asm("mov [esi], ebx");				// store result
+	asm("mov [esi+4], edx");
+	asm("mov [esi+8], ecx");
+	asm("pop edi");						// restore registers
+	asm("pop esi");
+	asm("pop ebp");
+	asm("pop ebx");
+	asm("pop ecx");
+	THISCALL_EPILOG2()					// return with error code in eax
+	}
+
+
+
+
+__NAKED__ EXPORT_C TInt TRealX::Mod(TRealX& /*aResult*/, const TRealX& /*aVal*/) const
+/**
+Modulo-divides this extended precision number by an extended precision value.
+
+@param aResult On return, a reference to an extended precision object
+containing the result of the operation.
+
+@param aVal    The extended precision value to be used as the divisor.
+
+@return KErrNone, if the operation is successful;
+KErrTotalLossOfPrecision, if precision is lost;
+KErrUnderflow, if the operation results in underflow.
+*/
+	{
+	// on entry ecx=this, [esp+4]=address of aResult, [esp+8]=address of aVal
+	THISCALL_PROLOG2()
+	asm("push ecx");					// save registers
+	asm("push ebx");
+	asm("push ebp");
+	asm("push esi");
+	asm("push edi");
+	asm("mov esi, ecx");				// this into esi
+	asm("mov ecx, [esp+28]");			// address of aVal into ecx
+	asm("mov ebx, [ecx]");				// aVal into ecx,edx:ebx
+	asm("mov edx, [ecx+4]");
+	asm("mov ecx, [ecx+8]");
+	asm("call %a0": : "i"(&TRealXModulo)); // do modulo, result in ecx,edx:ebx, error code in eax
+	asm("mov esi, [esp+24]");			// esi=address of aResult
+	asm("mov [esi], ebx");				// store result
+	asm("mov [esi+4], edx");
+	asm("mov [esi+8], ecx");
+	asm("pop edi");						// restore registers
+	asm("pop esi");
+	asm("pop ebp");
+	asm("pop ebx");
+	asm("pop ecx");
+	THISCALL_EPILOG2()					// return with error code in eax
+	}
+
+// Compare TRealX in ecx,edx:ebx (op1) to TRealX at [esi] (op2)
+// Return 1 if op1<op2
+// Return 2 if op1=op2
+// Return 4 if op1>op2
+// Return 8 if unordered
+// Return value in eax
+LOCAL_C __NAKED__ void TRealXCompare(void)
+	{
+	asm("cmp ecx, 0xFFFF0000");		// check if op1=NaN or infinity
+	asm("jc short fpcmp1");			// branch if not
+	asm("cmp edx, 0x80000000");		// check for infinity
+	asm("jnz short fpcmpunord");	// branch if NaN
+	asm("test ebx, ebx");
+	asm("jz short fpcmp1");			// if infinity, process normally
+	asm("fpcmpunord:");				// come here if unordered
+	asm("mov eax, 8");				// return 8
+	asm("ret");
+	asm("fpcmp1:");					// op1 is not a NaN
+	asm("mov eax, [esi+8]");		// get op2 into eax,edi:ebp
+	asm("mov edi, [esi+4]");
+	asm("mov ebp, [esi]");
+	asm("cmp eax, 0xFFFF0000");		// check for NaN or infinity
+	asm("jc short fpcmp2");			// branch if neither
+	asm("cmp edi, 0x80000000");		// check for infinity
+	asm("jnz short fpcmpunord");	// branch if NaN
+	asm("test ebp, ebp");
+	asm("jnz short fpcmpunord");
+	asm("fpcmp2:");					// neither operand is a NaN
+	asm("cmp ecx, 0x10000");		// check if op1=0
+	asm("jc short fpcmpop1z");		// branch if it is
+	asm("cmp eax, 0x10000");		// check if op2=0
+	asm("jc short fpcmp4");			// branch if it is
+	asm("xor al, cl");				// check if signs the same
+	asm("test al, 1");
+	asm("jnz short fpcmp4");		// branch if different
+	asm("push ecx");
+	asm("shr ecx, 16");				// op1 exponent into cx
+	asm("shr eax, 16");				// op2 exponent into ax
+	asm("cmp ecx, eax");			// compare exponents
+	asm("pop ecx");
+	asm("ja short fpcmp4");			// if op1 exp > op2 exp op1>op2 if +ve
+	asm("jb short fpcmp5");			// if op1 exp < op2 exp op1<op2 if +ve
+	asm("cmp edx, edi");			// else compare mantissa high words
+	asm("ja short fpcmp4");
+	asm("jb short fpcmp5");
+	asm("cmp ebx, ebp");			// if equal compare mantissa low words
+	asm("ja short fpcmp4");
+	asm("jb short fpcmp5");
+	asm("fpcmp0:");
+	asm("mov eax, 2");				// numbers exactly equal
+	asm("ret");
+	asm("fpcmp4:");					// come here if ABS{op1}>ABS{op2} or if signs different
+									// or if op2 zero, op1 nonzero
+	asm("mov eax, 4");				// return 4 if +ve
+	asm("test cl, 1");				// check sign
+	asm("jz short fpcmp4a");		// skip if +
+	asm("mov al, 1");				// return 1 if -ve
+	asm("fpcmp4a:");
+	asm("ret");
+	asm("fpcmp5:");					// come here if ABS{op1}<ABS{op2}
+	asm("mov eax, 1");				// return 1 if +ve
+	asm("test cl, 1");				// check sign
+	asm("jz short fpcmp5a");		// skip if +
+	asm("mov al, 4");				// return 4 if -ve
+	asm("fpcmp5a:");
+	asm("ret");
+	asm("fpcmpop1z:");				// come here if op1=0
+	asm("cmp eax, 0x10000");		// check if op2 also zero
+	asm("jc short fpcmp0");			// if so, they are equal
+	asm("test al, 1");				// test sign of op 2
+	asm("mov eax, 4");				// if -, return 4
+	asm("jnz short fpcmpop1z2n");	// skip if -
+	asm("mov al, 1");				// else return 1
+	asm("fpcmpop1z2n:");
+	asm("ret");
+	}
+
+
+
+
+__NAKED__ EXPORT_C TRealX::TRealXOrder TRealX::Compare(const TRealX& /*aVal*/) const
+/**
+*/
+	{
+	// On entry ecx=this, [esp+4]=address of aVal
+	THISCALL_PROLOG1()
+	asm("push ecx");					// save registers
+	asm("push ebx");
+	asm("push ebp");
+	asm("push esi");
+	asm("push edi");
+	asm("mov esi, [esp+24]");			// address of aVal into esi
+	asm("mov ebx, [ecx]");				// *this into ecx,edx:ebx
+	asm("mov edx, [ecx+4]");
+	asm("mov ecx, [ecx+8]");
+	asm("call %a0": : "i"(&TRealXCompare)); // result in eax
+	asm("pop edi");
+	asm("pop esi");
+	asm("pop ebp");
+	asm("pop ebx");
+	asm("pop ecx");
+	THISCALL_EPILOG1()
+	}
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32/euser/epoc/x86/uc_realx.cpp	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,28 @@
+// Copyright (c) 1997-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32\euser\epoc\x86\uc_realx.cpp
+// 
+//
+
+#include "u32std.h"
+
+
+
+
+void TRealXPanic(TInt aErr)
+	{
+	User::Panic(_L("MATHX"),aErr);
+	}
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32/euser/epoc/x86/uc_seh.cpp	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,30 @@
+// Copyright (c) 2004-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32\euser\epoc\x86\uc_seh.cpp
+// 
+//
+
+#include <e32cmn.h>
+
+EXPORT_C TWin32SEHTrap::TWin32SEHTrap()
+	{
+	}
+
+EXPORT_C void TWin32SEHTrap::Trap()
+	{
+	}
+
+EXPORT_C void TWin32SEHTrap::UnTrap()
+	{
+	}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32/euser/epoc/x86/uc_trp.cpp	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,49 @@
+// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32\euser\epoc\x86\uc_trp.cpp
+// 
+//
+
+#include <u32exec.h>
+#include <e32panic.h>
+
+GLREF_C void Panic(TCdtPanic);
+
+#ifndef __LEAVE_EQUALS_THROW__
+
+void DoLeave(TTrap*);
+
+void __stdcall DoTrap(TTrap* aFrame)
+	{
+	TTrapHandler* pH=Exec::PushTrapFrame(aFrame);
+	if (pH)
+		pH->Trap();
+	}
+
+EXPORT_C void User::Leave(TInt aReason)
+//
+// Leave to the current control region.
+//
+	{
+	TTrap* pF=Exec::PopTrapFrame();
+	if (!pF)
+		::Panic(EUserLeaveWithoutTrap);
+	*pF->iResult=aReason;
+	TTrapHandler* pH=pF->iHandler;
+	if (pH)
+		pH->Leave(aReason);
+	DoLeave(pF);
+	}
+
+#endif // !__LEAVE_EQUALS_THROW__
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32/euser/epoc/x86/uc_utl.cia	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,270 @@
+// Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32\euser\epoc\x86\uc_utl.cia
+// 
+//
+
+#include <u32exec.h>
+#include <e32base.h>
+#include <e32rom.h>
+#include <e32svr.h>
+#include <e32hashtab.h>
+
+
+// Dummy so we can use same DEF file as WINS
+EXPORT_C void BootEpoc(TBool)
+	{
+	}
+
+
+EXPORT_C __NAKED__ void RFastLock::Wait()
+	{
+	THISCALL_PROLOG0()
+	asm("lock sub dword ptr [ecx+4], 1");
+	asm("jnc fast_lock_wait_sem");
+	THISCALL_EPILOG0()
+	asm("fast_lock_wait_sem:");
+	asm("mov eax, %0": : "i"(EExecSemaphoreWait));
+	asm("mov ecx, [ecx]");
+	asm("xor edx, edx");
+	asm("int 0x21");
+	THISCALL_EPILOG0()
+	}
+
+EXPORT_C __NAKED__ void RFastLock::Signal()
+	{
+	THISCALL_PROLOG0()
+	asm("lock add dword ptr [ecx+4], 1");
+	asm("jne fast_lock_signal_sem");
+	THISCALL_EPILOG0()
+	asm("fast_lock_signal_sem:");
+	asm("mov eax, %0": : "i"(EExecSemaphoreSignal1));
+	asm("mov ecx, [ecx]");
+	asm("int 0x21");
+	THISCALL_EPILOG0()
+	}
+
+#ifdef __MEM_MACHINE_CODED__
+__NAKED__ EXPORT_C void Mem::Swap( TAny* /*aPtr1*/, TAny* /*aPtr2*/, TInt /*aLength*/ )
+/**
+Swaps a number of bytes of data between two specified locations.
+
+The source and target areas can overlap.
+
+@param aPtr1   A pointer to the first location taking part in the swap. 
+@param aPtr2   A pointer to second location taking part in the swap. 
+@param aLength The number of bytes to be swapped between the two locations. 
+               This value must not be negative.
+
+@panic USER 94 In debug builds only, if aLength is negative.
+*/
+
+//
+//	Swap the contents of *aPtr1 with *aPtr2.
+//	NB We assume ES=DS on entry.
+//
+	{
+	asm("push esi");
+	asm("push edi");
+	asm("mov edi,[esp+12]");// aPtr1 address into edi
+	asm("mov esi,[esp+16]");// aPtr2 address into esi
+	asm("mov ecx,[esp+20]");// byte count into ecx
+	asm("pushfd");
+
+	asm("test ecx,ecx");	//
+	asm("jz short memswap0");// if length=0, nothing to do
+	asm("cld");				// go forwards through array
+	asm("cmp ecx,7");		// if length<7 don't bother with alignment check
+	asm("jc short memswap1");//
+	asm("mov edx,ecx");		// length into edx
+	// number of bytes to align aPtr1 = 4-(edi mod 4)
+	asm("mov ecx,4");		
+	asm("sub ecx,edi");		//
+	asm("and ecx,3");		// into ecx
+	asm("jz short memswap2");// if aligned, proceed with dword swap
+	asm("sub edx,ecx");		// subtract number of bytes from length
+	asm("memswap3:");
+	asm("mov al,[edi]");	// al = *aPtr1
+	asm("mov ah,[esi]");	// ah = *aPtr2
+	asm("mov [esi],al");	// *aPtr2=al
+	asm("mov [edi],ah");	// *aPtr1=ah
+	asm("inc esi");			// aPtr2++
+	asm("inc edi");			// aPtr1++
+	asm("dec ecx");			//
+	asm("jnz short memswap3");// loop ecx times - edi is now dword aligned
+	asm("memswap2:");
+	asm("push ebx");		// preserve ebx
+	asm("mov ecx,edx");		// length back into ecx
+	asm("mov ah,cl");		// save lower two bits of dword count in ah bits 3,2
+	asm("add ecx,12");		// divide dword count by 4, rounding to next higher integer
+	asm("shr ecx,4");		// this gives loop count for unfolded loop
+	asm("shl ah,4");		// lower two bits of dword count into ah bits 7,6
+	asm("sahf");			// and into SF,ZF
+	asm("jns short memswap8");// branch if lower two bits of dword count = 0 or 1
+	asm("jz short memswap5");// if lower two bits = 3, miss out first unfolding of loop
+	asm("jnz short memswap6");	// if lower two bits = 2, miss out first two unfoldings
+	asm("memswap8:");
+	asm("jz short memswap7");// if lower two bits = 1, miss out first three unfoldings
+	asm("memswap4:");
+	asm("mov eax,[edi]");	// eax = *aPtr1
+	asm("mov ebx,[esi]");	// ebx = *aPtr2
+	asm("mov [esi],eax");	// *aPtr2=eax
+	asm("mov [edi],ebx");	// *aPtr1=ebx
+	asm("add edi,4");		// aPtr1++
+	asm("add esi,4");		// aPtr2++
+	asm("memswap5:");
+	asm("mov eax,[edi]");	// eax = *aPtr1
+	asm("mov ebx,[esi]");	// ebx = *aPtr2
+	asm("mov [esi],eax");	// *aPtr2=eax
+	asm("mov [edi],ebx");	// *aPtr1=ebx
+	asm("add edi,4");		// aPtr1++
+	asm("add esi,4");		// aPtr2++
+	asm("memswap6:");
+	asm("mov eax,[edi]");	// eax = *aPtr1
+	asm("mov ebx,[esi]");	// ebx = *aPtr2
+	asm("mov [esi],eax");	// *aPtr2=eax
+	asm("mov [edi],ebx");	// *aPtr1=ebx
+	asm("add edi,4");		// aPtr1++
+	asm("add esi,4");		// aPtr2++
+	asm("memswap7:");
+	asm("mov eax,[edi]");	// eax = *aPtr1
+	asm("mov ebx,[esi]");	// ebx = *aPtr2
+	asm("mov [esi],eax");	// *aPtr2=eax
+	asm("mov [edi],ebx");	// *aPtr1=ebx
+	asm("add edi,4");		// aPtr1++
+	asm("add esi,4");		// aPtr2++
+	asm("dec ecx");
+	asm("jnz short memswap4");	// loop ecx times to do main part of swap
+	asm("mov ecx,edx");		// length back into ecx
+	asm("pop ebx");			// restore ebx
+	asm("and ecx,3");		// number of remaining bytes to move
+	asm("jz short memswap0");// if zero, we are finished
+	asm("memswap1:");		// *** come here for small swap
+	asm("mov al,[edi]");	// al = *aPtr1
+	asm("mov ah,[esi]");	// ah = *aPtr2
+	asm("mov [esi],al");	// *aPtr2=al
+	asm("mov [edi],ah");	// *aPtr1=ah
+	asm("inc esi");			// aPtr2++
+	asm("inc edi");			// aPtr1++
+	asm("dec ecx");			//
+	asm("jnz short memswap1");	// loop ecx times - edi is now dword aligned
+
+	asm("memswap0:");
+	asm("popfd");
+	asm("pop edi");
+	asm("pop esi");
+	asm("ret");
+	}
+#endif
+
+// Hash an 8 bit string at aPtr, length aLen bytes.
+__NAKED__ TUint32 DefaultStringHash(const TUint8* /*aPtr*/, TInt /*aLen*/)
+	{
+	asm("push esi");
+	asm("mov esi, [esp+8]");
+	asm("mov ecx, [esp+12]");
+	asm("xor eax, eax");
+	asm("sub ecx, 4");
+	asm("jb lt4");
+	asm("ge4:");
+	asm("xor eax, [esi]");
+	asm("add esi, 4");
+	asm("mov edx, 0x9E3779B9");
+	asm("mul edx");
+	asm("sub ecx, 4");
+	asm("jae ge4");
+	asm("lt4:");
+	asm("add ecx, 4");
+	asm("jz done");
+	asm("xor edx, edx");
+	asm("cmp ecx, 2");
+	asm("jbe le2");
+	asm("mov dl, [esi+2]");
+	asm("shl edx, 16");
+	asm("le2:");
+	asm("cmp ecx, 2");
+	asm("jb onemore");
+	asm("mov dh, [esi+1]");
+	asm("onemore:");
+	asm("mov dl, [esi]");
+	asm("xor eax, edx");
+	asm("mov edx, 0x9E3779B9");
+	asm("mul edx");
+	asm("done:");
+	asm("pop esi");
+	asm("ret");
+	}
+
+// Hash a 16 bit string at aPtr, length aLen bytes.
+__NAKED__ TUint32 DefaultWStringHash(const TUint16* /*aPtr*/, TInt /*aLen*/)
+	{
+	asm("push esi");
+	asm("mov esi, [esp+8]");
+	asm("mov ecx, [esp+12]");
+	asm("xor eax, eax");
+	asm("sub ecx, 8");
+	asm("jb lt8");
+	asm("ge8:");
+	asm("mov edx, [esi+4]");
+	asm("xor eax, [esi]");
+	asm("add esi, 8");
+	asm("rol edx, 8");
+	asm("xor eax, edx");
+	asm("mov edx, 0x9E3779B9");
+	asm("mul edx");
+	asm("sub ecx, 8");
+	asm("jae ge8");
+	asm("lt8:");
+	asm("add ecx, 8");
+	asm("jz done_defwstrhash");
+	asm("xor edx, edx");
+	asm("cmp ecx, 4");
+	asm("jbe le4");
+	asm("mov dx, [esi+4]");
+	asm("rol edx, 8");
+	asm("xor eax, edx");
+	asm("xor edx, edx");
+	asm("le4:");
+	asm("cmp ecx, 4");
+	asm("jb onemore_defwstrhash");
+	asm("mov dx, [esi+2]");
+	asm("shl edx, 16");
+	asm("onemore_defwstrhash:");
+	asm("mov dx, [esi]");
+	asm("xor eax, edx");
+	asm("mov edx, 0x9E3779B9");
+	asm("mul edx");
+	asm("done_defwstrhash:");
+	asm("pop esi");
+	asm("ret");
+	}
+
+
+/**
+@publishedAll
+@released
+
+Calculate a 32 bit hash from a 32 bit integer.
+
+@param	aInt	The integer to be hashed.
+@return			The calculated 32 bit hash value.
+*/
+EXPORT_C __NAKED__ TUint32 DefaultHash::Integer(const TInt& /*aInt*/)
+	{
+	asm("mov edx, [esp+4]");
+	asm("mov eax, 0x9E3779B9");
+	asm("mul dword ptr [edx]");
+	asm("ret");
+	}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32/euser/epoc/x86/uc_utl.cpp	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,38 @@
+// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32\euser\epoc\x86\uc_utl.cpp
+// 
+//
+
+#include <u32std.h>
+#include <e32panic.h>
+#include "us_std.h"
+
+EXPORT_C void EmptyFunction()
+ //Function with an empty body 
+	{
+	}
+
+#ifdef __GCC32__
+
+extern "C" EXPORT_C  int __cxa_pure_virtual()
+//
+// Gets called for any unreplaced pure virtual methods.
+//
+	{
+	Panic(EPureVirtualCalled);
+	return 0;
+	}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32/euser/maths/um_asin.cpp	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,183 @@
+// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32\euser\maths\um_asin.cpp
+// Arc sin.
+// 
+//
+
+#include "um_std.h"
+
+#if defined(__USE_VFP_MATH) && !defined(__CPU_HAS_VFP)
+#error	__USE_VFP_MATH was defined but not __CPU_HAS_VFP - impossible combination, check variant.mmh 
+#endif
+
+#ifndef __USE_VFP_MATH
+
+LOCAL_D const TUint32 ArcsinCoeffs[] =
+	{
+	0x00000000,0x80000000,0x7FFF0000,	// polynomial approximation to arcsin(x)
+	0xAA893CD8,0xAAAAAAAA,0x7FFC0000,	// for -0.5<=x<=0.5
+	0xD07ED410,0x99999999,0x7FFB0000,
+	0xB6C64A72,0xB6DB6D94,0x7FFA0000,
+	0xF5527DD4,0xF8E3995C,0x7FF90000,
+	0xA87499FB,0xB744B969,0x7FF90000,
+	0x2E8953AD,0x8E392B24,0x7FF90000,
+	0xFEDBB4E4,0xE3481C4A,0x7FF80000,
+	0x4A32ED70,0xC89998E1,0x7FF80000,
+	0x848A2B53,0xCCAE4AE5,0x7FF70000,
+	0x09C1F387,0xA587A043,0x7FF90000,
+	0x722B9041,0x8C9BD20B,0x7FF90001,
+	0xC88B75CC,0x850CE779,0x7FFA0000
+	};
+
+LOCAL_D const TUint32 Onedata[] = {0x00000000,0x80000000,0x7FFF0000};		// 1.0
+LOCAL_D const TUint32 Halfdata[] = {0x00000000,0x80000000,0x7FFE0000};		// 0.5
+LOCAL_D const TUint32 Pidata[] = {0x2168C235,0xC90FDAA2,0x80000000};		// pi
+LOCAL_D const TUint32 PiBy2data[] = {0x2168C235,0xC90FDAA2,0x7FFF0000};		// pi/2
+
+LOCAL_C TInt CalcArcsinArccos(TReal& aTrg, TRealX& x, TBool aCos)
+	{
+	//	Calculate arcsin (if aCos false) or arccos (if aCos true) of x
+	//	and write result to aTrg.
+	//	Algorithm (arcsin):
+	//		If x>0.5, replace x with Sqrt((1-x)/2)
+	//			( use identity cos(x)=2(cos(x/2))^2-1 )
+	//		Use polynomial approximation for arcsin(x), 0<=x<=0.5
+	//		If original x>0.5, replace result y with pi/2-2y
+
+	const TRealX One = *(const TRealX*)Onedata;
+	const TRealX Half = *(const TRealX*)Halfdata;
+	const TRealX Pi = *(const TRealX*)Pidata;
+	const TRealX PiBy2 = *(const TRealX*)PiBy2data;
+
+	TInt sign=x.iSign&1;
+	x.iSign=0;
+	if (x<=One)
+		{
+		TBool big=(x>Half);
+		if (big)
+			{
+			x=One-x;
+			if (x.iExp>1)
+				x.iExp--;
+			TReal temp;
+			Math::Sqrt(temp, (TReal)x);
+			x=temp;
+			}
+		TRealX y;
+		Math::PolyX(y,x*x,12,(const TRealX*)ArcsinCoeffs);
+		y*=x;
+		if (big)
+			{
+			if (y.iExp)
+				y.iExp++;
+			if (aCos)
+				{
+				if (sign)
+					y=Pi-y;
+				}
+			else
+				{
+				y=PiBy2-y;
+				y.iSign=TInt8(sign);
+				}
+			}
+		else
+			{
+			y.iSign=TInt8(sign);
+			if (aCos)
+				y=PiBy2-y;
+			}
+		return y.GetTReal(aTrg);
+		}
+	return KErrArgument;
+	}
+
+
+
+
+EXPORT_C TInt Math::ASin(TReal& aTrg, const TReal& aSrc)
+/**
+Calculates the principal value of the inverse sine of a number.
+
+@param aTrg A reference containing the result in radians,
+            a value between -pi/2 and +pi/2. 
+@param aSrc The argument of the arcsin function, a value
+            between -1 and +1 inclusive.
+
+@return KErrNone if successful, otherwise another of the system-wide
+        error codes.
+*/
+	{
+	TRealX x;
+	TInt r=x.Set(aSrc);
+	if (r==KErrNone)
+		r=CalcArcsinArccos(aTrg,x,EFalse);
+	if (r==KErrNone)
+		return r;
+	SetNaN(aTrg);
+	return KErrArgument;
+	}
+
+
+
+
+EXPORT_C TInt Math::ACos(TReal& aTrg, const TReal& aSrc)
+/**
+Calculates the principal value of the inverse cosine of a number.
+
+@param aTrg A reference containing the result in radians,
+            a value between 0 and pi. 
+@param aSrc The argument of the arccos function, a value
+            between -1 and +1 inclusive. 
+
+@return KErrNone if successful, otherwise another of the system-wide
+        error codes.
+*/
+	{
+	TRealX x;
+	TInt r=x.Set(aSrc);
+	if (r==KErrNone)
+		r=CalcArcsinArccos(aTrg,x,ETrue);
+	if (r==KErrNone)
+		return r;
+	SetNaN(aTrg);
+	return KErrArgument;
+	}
+
+#else // __USE_VFP_MATH
+
+// definitions come from RVCT math library
+extern "C" TReal asin(TReal);
+extern "C" TReal acos(TReal);
+
+EXPORT_C TInt Math::ASin(TReal& aTrg, const TReal& aSrc)
+	{
+	aTrg = asin(aSrc);
+	if (Math::IsFinite(aTrg))
+		return KErrNone;
+	SetNaN(aTrg);
+	return KErrArgument;
+	}
+
+EXPORT_C TInt Math::ACos(TReal& aTrg, const TReal& aSrc)
+	{
+	aTrg = acos(aSrc);
+	if (Math::IsFinite(aTrg))
+		return KErrNone;
+	SetNaN(aTrg);
+	return KErrArgument;
+	}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32/euser/maths/um_atan.cpp	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,267 @@
+// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32\euser\maths\um_atan.cpp
+// Floating point arc tangent
+// 
+//
+
+#include "um_std.h"
+
+#if defined(__USE_VFP_MATH) && !defined(__CPU_HAS_VFP)
+#error	__USE_VFP_MATH was defined but not __CPU_HAS_VFP - impossible combination, check variant.mmh 
+#endif
+
+#ifndef __USE_VFP_MATH
+
+LOCAL_D const TUint32 ArctanCoeffs[] =
+	{
+	0x00000000,0x80000000,0x7FFF0000,	// polynomial approximation to arctan(x)
+	0xAA84D6EE,0xAAAAAAAA,0x7FFD0001,	// for -(sqr2-1) <= x <= (sqr2-1)
+	0x89C77453,0xCCCCCCCC,0x7FFC0000,
+	0xEBC0261C,0x9249247B,0x7FFC0001,
+	0x940BC4DB,0xE38E3121,0x7FFB0000,
+	0x141C32F1,0xBA2DBF36,0x7FFB0001,
+	0xA90615E7,0x9D7C807E,0x7FFB0000,
+	0x1C632E93,0x87F6A873,0x7FFB0001,
+	0x310FCFFD,0xE8BE5D0A,0x7FFA0000,
+	0x92289F15,0xB17B930B,0x7FFA0001,
+	0x546FE7CE,0xABDE562D,0x7FF90000
+	};
+
+LOCAL_D const TUint32 Sqr2m1data[] = {0xE7799211,0xD413CCCF,0x7FFD0000};		// sqr2-1
+LOCAL_D const TUint32 Sqr2p1data[] = {0xFCEF3242,0x9A827999,0x80000000};		// sqr2+1
+LOCAL_D const TUint32 Onedata[] = {0x00000000,0x80000000,0x7FFF0000};			// 1.0
+LOCAL_D const TUint32 PiBy8data[] = {0x2168C235,0xC90FDAA2,0x7FFD0000};			// pi/8
+LOCAL_D const TUint32 PiBy2data[] = {0x2168C235,0xC90FDAA2,0x7FFF0000};			// pi/2
+LOCAL_D const TUint32 ThreePiBy8data[] = {0x990E91A8,0x96CBE3F9,0x7FFF0000};	// 3*pi/8
+
+LOCAL_C void Arctan(TRealX& y, TRealX& x)
+	{
+	// Calculate arctan(x), write result to y
+	// Algorithm:
+	//		If x>1, replace x with 1/x and subtract result from pi/2
+	//			( use identity tan(pi/2-x)=1/tan(x) )
+	//		If x>sqr(2)-1, replace x with (x-(sqr(2)-1))/(1-(sqr2-1)x)
+	//			( use identity tan(x-a)=(tanx-tana)/(1-tana.tanx)
+	//			  where a=pi/8, tan a = sqr2-1
+	//			and add pi/8 to result
+	//		Use polynomial approximation to calculate arctan(x) for
+	//		x in the interval [0,sqr2-1]
+
+	const TRealX& Sqr2m1 = *(const TRealX*)Sqr2m1data;
+	const TRealX& Sqr2p1 = *(const TRealX*)Sqr2p1data;
+	const TRealX& One = *(const TRealX*)Onedata;
+	const TRealX& PiBy8 = *(const TRealX*)PiBy8data;
+	const TRealX& PiBy2 = *(const TRealX*)PiBy2data;
+	const TRealX& ThreePiBy8 = *(const TRealX*)ThreePiBy8data;
+
+	TInt section=0;
+	TInt8 sign=x.iSign;
+	x.iSign=0;
+	if (x>Sqr2p1)
+		{
+		x=One/x;
+		section=3;
+		}
+	else if (x>One)
+		{
+		x=(One-Sqr2m1*x)/(x+Sqr2m1);
+		section=2;
+		}
+	else if (x>Sqr2m1)
+		{
+		x=(x-Sqr2m1)/(One+Sqr2m1*x);
+		section=1;
+		}
+	Math::PolyX(y,x*x,10,(const TRealX*)ArctanCoeffs);
+	y*=x;
+	if (section==1)
+		y+=PiBy8;
+	else if (section==2)
+		y=ThreePiBy8-y;
+	else if (section==3)
+		y=PiBy2-y;
+	y.iSign=sign;
+	}
+
+
+
+
+EXPORT_C TInt Math::ATan(TReal& aTrg, const TReal& aSrc)
+/**
+Calculates the principal value of the inverse tangent of a number.
+
+@param aTrg A reference containing the result in radians,
+            a value between -pi/2 and +pi/2.
+@param aSrc The argument of the arctan function,
+            a value between +infinity and +infinity.
+
+@return KErrNone if successful, otherwise another of
+        the system-wide error codes. 
+*/
+	{
+	TRealX x;
+	TInt r=x.Set(aSrc);
+	if (r==KErrNone)
+		{
+		TRealX y;
+		Arctan(y,x);
+		return y.GetTReal(aTrg);
+		}
+	if (r==KErrArgument)
+		{
+		SetNaN(aTrg);
+		return KErrArgument;
+		}
+	aTrg=KPiBy2;		// arctan(+/- infinity) = +/- pi/2
+	if (x.iSign&1)
+		aTrg=-aTrg;
+	return KErrNone;
+	}
+
+LOCAL_D const TUint32 Pidata[] = {0x2168C235,0xC90FDAA2,0x80000000};
+LOCAL_D const TUint32 PiBy4data[] = {0x2168C235,0xC90FDAA2,0x7FFE0000};
+LOCAL_D const TUint32 MinusPiBy4data[] = {0x2168C235,0xC90FDAA2,0x7FFE0001};
+LOCAL_D const TUint32 ThreePiBy4data[] = {0x990E91A8,0x96CBE3F9,0x80000000};
+LOCAL_D const TUint32 MinusThreePiBy4data[] = {0x990E91A8,0x96CBE3F9,0x80000001};
+LOCAL_D const TUint32 Zerodata[] = {0x00000000,0x00000000,0x00000000};
+
+
+
+
+EXPORT_C TInt Math::ATan(TReal &aTrg,const TReal &aY,const TReal &aX)
+/**
+Calculates the angle between the x-axis and a line drawn from the origin
+to a point represented by its (x,y) co-ordinates.
+
+The co-ordinates are passed as arguments to the function.
+This function returns the same result as arctan(y/x), but:
+
+1. it adds +/-pi to the result, if x is negative
+
+2. it sets the result to +/-pi/2, if x is zero but y is non-zero.
+
+@param aTrg A reference containing the result in radians,
+            a value between -pi exclusive and +pi inclusive.
+@param aY   The y argument of the arctan(y/x) function. 
+@param aX   The x argument of the arctan(y/x) function.
+
+@return KErrNone if successful, otherwise another of
+        the system-wide error codes. 
+*/
+	{
+	const TRealX& Zero=*(const TRealX*)Zerodata;
+	const TRealX& Pi=*(const TRealX*)Pidata;
+	const TRealX& PiBy4=*(const TRealX*)PiBy4data;
+	const TRealX& MinusPiBy4=*(const TRealX*)MinusPiBy4data;
+	const TRealX& ThreePiBy4=*(const TRealX*)ThreePiBy4data;
+	const TRealX& MinusThreePiBy4=*(const TRealX*)MinusThreePiBy4data;
+
+	TRealX x, y;
+	TInt rx=x.Set(aX);
+	TInt ry=y.Set(aY);
+	if (rx!=KErrArgument && ry!=KErrArgument)
+		{
+		if (x.iExp==0)
+			x.iSign=0;
+		TRealX q;
+		TInt rq=y.Div(q,x);
+		if (rq!=KErrArgument)
+			{
+			TRealX arg;
+			Arctan(arg,q);
+			if (x<Zero)
+				{
+				if (y>=Zero)
+					arg+=Pi;
+				else
+					arg-=Pi;
+				}
+			aTrg=arg;
+			return KErrNone;
+			}
+		if (!x.IsZero())
+			{
+			// Both x and y must be infinite
+			TInt quadrant=((y.iSign & 1)<<1) + (x.iSign&1);
+			TRealX arg;
+			if (quadrant==0)
+				arg=PiBy4;
+			else if (quadrant==1)
+				arg=ThreePiBy4;
+			else if (quadrant==3)
+				arg=MinusThreePiBy4;
+			else
+				arg=MinusPiBy4;
+			aTrg=(TReal)arg;
+			return KErrNone;
+			}
+		}
+	SetNaN(aTrg);
+	return KErrArgument;
+	}
+
+#else // __USE_VFP_MATH
+
+LOCAL_D const TUint32 PiBy4data[] = {0x54442D18,0x3FE921FB};
+LOCAL_D const TUint32 MinusPiBy4data[] = {0x54442D18,0xBFE921FB};
+LOCAL_D const TUint32 ThreePiBy4data[] = {0x7F3321D2,0x4002D97C};
+LOCAL_D const TUint32 MinusThreePiBy4data[] = {0x7F3321D2,0xC002D97C};
+
+// definitions come from RVCT math library
+extern "C" TReal atan(TReal);
+extern "C" TReal atan2(TReal,TReal);
+
+EXPORT_C TInt Math::ATan(TReal& aTrg, const TReal& aSrc)
+	{
+	aTrg = atan(aSrc);
+	if (Math::IsFinite(aTrg))
+		return KErrNone;
+	SetNaN(aTrg);
+	return KErrArgument;
+	}
+
+EXPORT_C TInt Math::ATan(TReal &aTrg,const TReal &aY,const TReal &aX)
+	{
+	aTrg = atan2(aY,aX);
+	if (Math::IsFinite(aTrg))
+		return KErrNone;
+	
+	// Return is a NaN, but ARM implementation returns NaN for atan(inf/inf)
+	// whereas implementation above returns multiples of pi/4 - fix up here
+	SReal64 *pY=(SReal64 *)&aY;
+	SReal64 *pX=(SReal64 *)&aX;
+	
+	if (   pY->msm==0 && pY->lsm==0 && pY->exp==KTReal64SpecialExponent
+		&& pX->msm==0 && pX->lsm==0 && pX->exp==KTReal64SpecialExponent)
+		{
+		TInt quadrant=((pY->sign)<<1) + (pX->sign);
+		if (quadrant==0)
+			aTrg=*(const TReal*)PiBy4data;
+		else if (quadrant==1)
+			aTrg=*(const TReal*)ThreePiBy4data;
+		else if (quadrant==3)
+			aTrg=*(const TReal*)MinusThreePiBy4data;
+		else
+			aTrg=*(const TReal*)MinusPiBy4data;
+		return KErrNone;
+		}
+
+	// If we get here then the args weren't inf/inf so one of them must've
+	// been a NaN to start with
+	SetNaN(aTrg);
+	return KErrArgument;
+	}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32/euser/maths/um_dtor.cpp	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,346 @@
+// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32\euser\maths\um_dtor.cpp
+// 
+//
+
+#include "um_std.h"
+
+
+void TLex8::Scndig(TInt &aSig,TInt &aExp,TInt64 &aDl)
+//
+// Scans a decimal digit field and accumulates the value to a TInt64 at aDl
+// Used before decimal point - do not drop trailing zeros.
+//
+	{
+
+	FOREVER
+		{
+		if (iNext>=iEnd)
+			break;
+		TChar c=Peek();
+		if (!c.IsDigit())
+			break;
+		else
+			c=Get();
+		if (aSig<KMaxPrecision+2)		
+			{
+			aDl *= 10;				// Multiply accumulator by 10
+			aDl+=((TUint)c)-'0';	// Add current digit
+			aSig++;
+			}
+		else
+			aExp++;
+		}														  
+	}
+
+void TLex8::ScndigAfterPoint(TInt &aSig,TInt64 &aDl)
+//
+// Scans a decimal digit field and accumulates the value to a TInt64 at aDl
+// Used after decimal point - drops trailing zeros.
+//
+// Could be improved with change to header file!!
+	{
+	TInt trailing=0;	// no of trailing zeros
+	TInt leading=0;		// no of leading zeros
+	TInt n;
+	TChar c;
+	
+	if (aDl==0)		
+		//	if no significance before decimal point need extra digit to lead to full significance
+		leading++;	
+
+	FOREVER
+		{
+		if (iNext>=iEnd)
+			break;
+		c=Peek();
+		if (!c.IsDigit())
+			break;
+		else
+			{
+			c=Get();
+			if (c=='0')
+				{
+				if (aDl!=0)		// possible trailing zeros
+					trailing++;	
+				else			// if aDl==0 multiplying by 10 and adding 0 has no effect  
+					{
+					leading++;
+					aSig++;		// leading zeros have significance
+					}
+				}	
+			else if ((aSig<KMaxPrecision+2+leading && !trailing) || (trailing && aSig+trailing+1<KMaxPrecision+2))
+				{
+				// first multiply, taking account of preceeding zeros
+				for (n=trailing; n>=0; n--)
+					{
+					aDl *= 10;			// Multiply accumulator by 10
+					}
+				// now add current digit
+				aDl+=((TUint)c)-'0';
+				// now update significant digits used
+				aSig+=trailing+1;
+				trailing=0;
+				}
+			}
+		}
+	}	
+
+void TLex16::Scndig(TInt &aSig,TInt &aExp,TInt64 &aDl)
+//
+// Scans a decimal digit field and accumulates the value to a TInt64 at aDl
+//
+	{
+
+	FOREVER
+		{
+		TChar c=Peek();
+		if (!c.IsDigit())
+			break;
+		else
+			c=Get();
+		if (aSig<KMaxPrecision+2)	
+			{
+			aDl *= 10;				// Multiply accumulator by 10
+			aDl+=((TUint)c)-'0';	// Add current digit
+			aSig++;
+			}
+		else
+			aExp++;
+		}														  
+	}
+
+EXPORT_C TInt TLex8::Val(TReal32& aVal)
+//
+// Convert a 32 bit real.
+//
+	{
+	TRealX x;
+	TInt r=Val(x);
+	if (r==KErrNone)
+		r=x.GetTReal(aVal);
+	return r;
+	}
+
+EXPORT_C TInt TLex8::Val(TReal32& aVal, TChar aPoint)
+//
+// Convert a 32 bit real.
+//
+	{
+	TRealX x;
+	TInt r=Val(x,aPoint);
+	if (r==KErrNone)
+		r=x.GetTReal(aVal);
+	return r;
+	}
+
+EXPORT_C TInt TLex8::Val(TReal64& aVal)
+//
+// Convert a 64 bit real.
+//
+	{
+	TRealX x;
+	TInt r=Val(x);
+	if (r==KErrNone)
+		r=x.GetTReal(aVal);
+	return r;
+	}
+
+EXPORT_C TInt TLex8::Val(TReal64& aVal, TChar aPoint)
+//
+// Convert a 64 bit real.
+//
+	{
+	TRealX x;
+	TInt r=Val(x,aPoint);
+	if (r==KErrNone)
+		r=x.GetTReal(aVal);
+	return r;
+	}
+
+TInt TLex8::Val(TRealX& aVal)
+//
+// Convert an extended real. Use the locale decimal point.
+//
+	{
+	TLocale locale;
+	return(Val(aVal,locale.DecimalSeparator()));
+	}
+
+TInt TLex8::Val(TRealX& aVal, TChar aPoint)
+//
+// Convert an extended real.
+//
+	{
+
+	TLexMark8 start(iNext);
+	if (iNext>=iEnd)
+		return(KErrGeneral);
+	TInt64 n(0);
+	TBool minus=EFalse;
+	if (Peek()=='-')
+		{
+		Inc();
+		minus=ETrue;
+		}
+	else if (Peek()=='+')
+		Inc();
+	TInt digflg=Peek().IsDigit();
+	while (Peek()=='0')		// Skip leading zeros
+		Inc();
+	TInt nsig=0;
+	TInt nskip=0;
+	Scndig(nsig,nskip,n);
+	TInt nint=nsig;
+	TInt nfract=0;
+	if (Peek()==aPoint)
+		{
+		Inc();
+		if (!digflg)
+			digflg=Peek().IsDigit();
+		ScndigAfterPoint(nsig,n);	// skip trailing zeros
+		nfract=nsig-nint;
+		}
+	if (!digflg)
+		{
+		UnGetToMark(start);
+		return(KErrGeneral);	// Not a number
+		}
+	TInt nexp=0;
+	TInt r;
+	if (Peek()=='E' || Peek()=='e')
+		{
+		TLexMark8 rollback(iNext);
+		Inc();
+		r=Val(nexp);
+		if (r!=KErrNone)
+			{
+			if (r==KErrOverflow)
+				{
+				aVal.SetInfinite(minus);
+				return r;
+				}
+			else
+				{
+				//it wasn't a number after the 'e', so rollback to the 'e'
+				UnGetToMark(rollback);
+				}
+			}
+		}
+
+	if (n == 0)
+		{
+		aVal.SetZero();
+		return KErrNone;
+		}
+
+	aVal=minus?-n:n;
+	nexp+=nskip-nfract;
+	r=Math::MultPow10X(aVal,nexp);
+	return r;
+	}
+
+EXPORT_C TInt TLex16::Val(TReal32& aVal)
+//
+// Convert a 32 bit real.
+//
+	{
+	TRealX x;
+	TInt r=Val(x);
+	if (r==KErrNone)
+		r=x.GetTReal(aVal);
+	return r;
+	}
+
+EXPORT_C TInt TLex16::Val(TReal32& aVal, TChar aPoint)
+//
+// Convert a 32 bit real.
+//
+	{
+	TRealX x;
+	TInt r=Val(x,aPoint);
+	if (r==KErrNone)
+		r=x.GetTReal(aVal);
+	return r;
+	}
+
+EXPORT_C TInt TLex16::Val(TReal64& aVal)
+//
+// Convert a 64 bit real.
+//
+	{
+	TRealX x;
+	TInt r=Val(x);
+	if (r==KErrNone)
+		r=x.GetTReal(aVal);
+	return r;
+	}
+
+EXPORT_C TInt TLex16::Val(TReal64& aVal, TChar aPoint)
+//
+// Convert a 64 bit real.
+//
+	{
+	TRealX x;
+	TInt r=Val(x,aPoint);
+	if (r==KErrNone)
+		r=x.GetTReal(aVal);
+	return r;
+	}
+
+TInt TLex16::Val(TRealX& aVal)
+//
+// Convert an extended real. Use the locale decimal point.
+//
+	{
+	TLocale locale;
+	return(Val(aVal,locale.DecimalSeparator()));
+	}
+
+TInt TLex16::Val(TRealX& aVal, TChar aPoint)
+//
+// Convert a 64 bit real
+//
+	{
+	
+	HBufC8 *temp=HBufC8::New(iEnd-iNext);
+	if (temp==NULL)
+		return(KErrNoMemory);
+	TPtr8 tdes(temp->Des());
+
+//	for (TUint8 *p=(TUint8*)iNext; p<(TUint8*)iEnd; p+=2)
+//		tdes.Append(*p);
+
+	for (const TText* p = (TText*)iNext; p < (TText*)iEnd; p++)
+		{
+		TChar c = *p;
+		if (c == aPoint)
+			c = '.';
+		else if (c == '.')
+			c = ' ';
+		else if (c > 255)
+			c = ' ';
+		tdes.Append((TUint8)c);
+		}
+	aPoint = '.';
+
+	TLex8 lex(tdes);
+	lex.Mark();
+	TInt r=lex.Val(aVal,aPoint);
+	User::Free(temp);
+	if (r==KErrNone)
+		Inc(lex.TokenLength());
+	return r;
+	}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32/euser/maths/um_exp.cpp	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,149 @@
+// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32\euser\maths\um_exp.cpp
+// Floating point exponentiation
+// 
+//
+
+#include "um_std.h"
+
+#if defined(__USE_VFP_MATH) && !defined(__CPU_HAS_VFP)
+#error	__USE_VFP_MATH was defined but not __CPU_HAS_VFP - impossible combination, check variant.mmh 
+#endif
+
+#ifndef __USE_VFP_MATH
+
+LOCAL_D const TUint32 ExpCoeffs[] =
+	{
+	0x00000000,0x80000000,0x7FFF0000,	// polynomial approximation to 2^(x/8)
+	0xD1CF79AC,0xB17217F7,0x7FFB0000,	// for 0<=x<=1
+	0x1591EF2B,0xF5FDEFFC,0x7FF60000,
+	0x23B940A9,0xE35846B9,0x7FF10000,
+	0xDD73C23F,0x9D955ADE,0x7FEC0000,
+	0x8728EBE7,0xAEC4616C,0x7FE60000,
+	0xAF177130,0xA1646F7D,0x7FE00000,
+	0xC44EAC22,0x8542C46E,0x7FDA0000
+	};
+
+LOCAL_D const TUint32 TwoToNover8[] =
+	{
+	0xEA8BD6E7,0x8B95C1E3,0x7FFF0000,	// 2^0.125
+	0x8DB8A96F,0x9837F051,0x7FFF0000,	// 2^0.250
+	0xB15138EA,0xA5FED6A9,0x7FFF0000,	// 2^0.375
+	0xF9DE6484,0xB504F333,0x7FFF0000,	// 2^0.500
+	0x5506DADD,0xC5672A11,0x7FFF0000,	// 2^0.625
+	0xD69D6AF4,0xD744FCCA,0x7FFF0000,	// 2^0.750
+	0xDD24392F,0xEAC0C6E7,0x7FFF0000	// 2^0.875
+	};
+
+LOCAL_D const TUint32 EightLog2edata[] = {0x5C17F0BC,0xB8AA3B29,0x80020000};	// 8/ln2
+
+
+
+
+EXPORT_C TInt Math::Exp(TReal& aTrg, const TReal& aSrc)
+/**
+Calculates the value of e to the power of x.
+
+@param aTrg A reference containing the result. 
+@param aSrc The power to which e is to be raised. 
+
+@return KErrNone if successful, otherwise another of
+        the system-wide error codes. 
+*/	
+	{
+	// Calculate exp(aSrc) and write result to aTrg
+	// Algorithm:
+	//		Let x=aSrc/ln2 and calculate 2^x
+	//		2^x = 2^int(x).2^frac(x)
+	//		2^int(x) just adds int(x) to the final result exponent
+	//		Reduce frac(x) to the range [0,0.125] (modulo 0.125)
+	//		Use polynomial to calculate 2^x for 0<=x<=0.125
+	//		Multiply by 2^(n/8) for n=0,1,2,3,4,5,6,7 to give 2^frac(x)
+
+	const TRealX& EightLog2e=*(const TRealX*)EightLog2edata;
+
+	TRealX x;
+	TRealX y;
+	TInt r=x.Set(aSrc);
+	if (r==KErrNone)
+		{
+		x*=EightLog2e;
+		TInt n=(TInt)x;
+		if (n<16384 && n>-16384)
+			{
+			if (x.iSign&1)
+				n--;
+			x-=TRealX(n);
+			PolyX(y,x,7,(const TRealX*)ExpCoeffs);
+			y.iExp=TUint16(TInt(y.iExp)+(n>>3));
+			n&=7;
+			if (n)
+				y*= (*(const TRealX*)(TwoToNover8+3*n-3));
+			return y.GetTReal(aTrg);
+			}
+		else
+			{
+			if (n<0)
+				{
+				SetZero(aTrg);
+				r=KErrUnderflow;
+				}
+			else
+				{
+				SetInfinite(aTrg,0);
+				r=KErrOverflow;
+				}
+			return r;
+			}
+		}
+	else
+		{
+		if (r==KErrArgument)
+			SetNaN(aTrg);
+		if (r==KErrOverflow)
+			{
+			if (x.iSign&1)
+				{
+				SetZero(aTrg);
+				r=KErrUnderflow;
+				}
+			else
+				{
+				SetInfinite(aTrg,0);
+				}
+			}
+		return r;
+		}
+	}
+
+#else // __USE_VFP_MATH
+
+// definitions come from RVCT math library
+extern "C" TReal exp(TReal);
+
+EXPORT_C TInt Math::Exp(TReal& aTrg, const TReal& aSrc)
+	{
+	aTrg = exp(aSrc);
+	if (Math::IsZero(aTrg))
+		return KErrUnderflow;
+	if (Math::IsFinite(aTrg))
+		return KErrNone;
+	if (Math::IsInfinite(aTrg))
+		return KErrOverflow;
+	SetNaN(aTrg);
+	return KErrArgument;
+	}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32/euser/maths/um_frac.cpp	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,105 @@
+// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32\euser\maths\um_frac.cpp
+// Writes the fractional part of aTrg to aSrc
+// 
+//
+
+#include "um_std.h"
+
+#if defined(__USE_VFP_MATH) && !defined(__CPU_HAS_VFP)
+#error	__USE_VFP_MATH was defined but not __CPU_HAS_VFP - impossible combination, check variant.mmh 
+#endif
+
+#ifndef __USE_VFP_MATH
+
+#ifndef __REALS_MACHINE_CODED__
+EXPORT_C TInt Math::Frac(TReal &aTrg,const TReal &aSrc)
+/**
+Calculates the fractional part of a number.
+
+The fractional part is that after a decimal point.
+Truncation is toward zero, so that
+Frac(2.4)=0.4, Frac(2)=0, Frac(-1)=0, Frac(-1.4)=0.4.
+
+@param aTrg A reference containing the result.
+@param aSrc The number whose fractional part is required. 
+
+@return KErrNone if successful, otherwise another of
+        the system-wide error codes.
+*/
+	{
+	TRealX f;
+	TInt ret=f.Set(aSrc);
+	if (ret!=KErrNone)
+		{
+		if (ret==KErrArgument)
+			SetNaN(aTrg);
+		if (ret==KErrOverflow)
+			SetZero(aTrg,f.iSign&1);
+		return(ret);
+		}
+	TInt intbits=f.iExp-0x7FFE;
+	if (intbits<=0)	 // aSrc is already a fraction
+		{
+		aTrg=aSrc;
+		return(KErrNone);
+		}
+	if (intbits>KMantissaBits)
+		{
+		SetZero(aTrg,f.iSign&1);
+		return(KErrNone);
+		}
+
+	// calculate integer part and subtract
+	// this means that the subtraction normalises the result
+	TRealX g=f;
+
+	TUint64 mask = ~(UI64LIT(0));
+	mask <<= (64 - intbits);
+
+	g.iMantHi &= static_cast<TUint32>(mask >> 32);
+	g.iMantLo &= static_cast<TUint32>(mask);
+
+	f-=g;
+	f.GetTReal(aTrg);
+	return(KErrNone);
+	}
+
+#endif //__REALS_MACHINE_CODED__
+
+#else // __USE_VFP_MATH
+
+// definitions come from RVCT math library
+extern "C" TReal modf(TReal,TReal*);
+
+EXPORT_C TInt Math::Frac(TReal& aTrg, const TReal& aSrc)
+	{
+	if (Math::IsNaN(aSrc))
+		{
+		SetNaN(aTrg);
+		return KErrArgument;
+		}
+	if (Math::IsInfinite(aSrc))
+		{
+		SetZero(aTrg);
+		return KErrOverflow;
+		}
+
+	TReal temp;
+	aTrg = modf(aSrc,&temp);
+	return KErrNone;
+	}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32/euser/maths/um_int.cpp	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,281 @@
+// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32\euser\maths\um_int.cpp
+// Writes the integer part aTrg to aSrc (aSrc is either TReal,TInt16 orTInt32)
+// 
+//
+
+#include "um_std.h"
+
+#if defined(__USE_VFP_MATH) && !defined(__CPU_HAS_VFP)
+#error	__USE_VFP_MATH was defined but not __CPU_HAS_VFP - impossible combination, check variant.mmh 
+#endif
+
+#ifndef __USE_VFP_MATH
+
+#ifndef __REALS_MACHINE_CODED__
+EXPORT_C TInt Math::Int(TReal &aTrg,const TReal &aSrc)
+/**
+Calculates the integer part of a number.
+
+The integer part is that before a decimal point.
+Truncation is toward zero, so that
+int(2.4)=2, int(2)=2, int(-1)=-1, int(-1.4)=-1, int(-1.999)=-1.
+
+
+@param aTrg A reference containing the result. 
+@param aSrc The number whose integer part is required. 
+
+@return KErrNone if successful, otherwise another of
+        the system-wide error codes. 
+*/
+	{
+	TRealX f;
+	TInt ret=f.Set(aSrc);
+	if (ret!=KErrNone)
+		{
+		aTrg=aSrc;
+		return(ret);
+		}
+	TInt intbits=f.iExp-0x7FFE;	// number of integer bits in mantissa
+	if (intbits<=0)
+		{
+		SetZero(aTrg,f.iSign&1); // no integer part
+		return(KErrNone);
+		}
+	if (intbits>=KMantissaBits)
+		{
+		aTrg=aSrc; // fractional part is outside range of significance
+		return(KErrNone);
+		}
+
+	TUint64 mask = ~(UI64LIT(0));
+	mask <<= (64 - intbits);
+
+	f.iMantHi &= static_cast<TUint32>(mask >> 32);
+	f.iMantLo &= static_cast<TUint32>(mask);
+
+	f.GetTReal(aTrg);
+	return(KErrNone);
+	}
+
+
+
+
+EXPORT_C TInt Math::Int(TInt16 &aTrg,const TReal &aSrc)
+/**
+Calculates the integer part of a number.
+
+The integer part is that before a decimal point.
+Truncation is toward zero, so that
+int(2.4)=2, int(2)=2, int(-1)=-1, int(-1.4)=-1, int(-1.999)=-1.
+
+This function is suitable when the result is known to be small enough
+for a 16-bit signed integer.
+
+@param aTrg A reference containing the result. 
+@param aSrc The number whose integer part is required.
+
+@return KErrNone if successful, otherwise another of
+        the system-wide error codes.
+*/
+//
+// If the integer part of aSrc is in the range -32768 to +32767
+// inclusive, write the integer part to the TInt16 at aTrg
+// Negative numbers are rounded towards zero.
+// If an overflow or underflow occurs, aTrg is set to the max/min value
+//
+	{
+	TRealX f;
+	TInt ret=f.Set(aSrc);
+
+	if (ret==KErrArgument)
+		{
+		aTrg=0;
+		return(ret);
+		}
+
+	TInt intbits=f.iExp-0x7FFE;	// number of integer bits in mantissa
+
+	if (intbits<=0)
+		{
+		aTrg=0;
+		return(KErrNone);
+		}
+
+	if (intbits>16)
+		{
+		aTrg=(TInt16)((f.iSign&1) ? KMinTInt16 : KMaxTInt16);
+		return((f.iSign&1) ? KErrUnderflow : KErrOverflow);
+		}
+
+	TUint val = f.iMantHi >> (32 - intbits);
+
+	if ((f.iSign&1)==0 && val>(TUint)KMaxTInt16)
+		{
+		aTrg=TInt16(KMaxTInt16);
+		return(KErrOverflow);
+		}
+
+	if ((f.iSign&1) && val>(TUint)(KMaxTInt16+1))
+		{
+		aTrg=TInt16(KMinTInt16);
+		return(KErrUnderflow);
+		}
+
+	aTrg = (f.iSign&1) ? (TInt16)(-(TInt)val) : (TInt16)val;
+
+	return(KErrNone);
+	} 
+
+
+
+
+EXPORT_C TInt Math::Int(TInt32 &aTrg,const TReal &aSrc)
+/**
+Calculates the integer part of a number.
+
+The integer part is that before a decimal point.
+Truncation is toward zero, so that
+int(2.4)=2, int(2)=2, int(-1)=-1, int(-1.4)=-1, int(-1.999)=-1.
+
+This function is suitable when the result is known to be small enough
+for a 32-bit signed integer.
+
+@param aTrg A reference containing the result. 
+@param aSrc The number whose integer part is required.
+
+@return KErrNone if successful, otherwise another of
+        the system-wide error codes.
+*/
+//													 
+// If the integer part of the float is in the range -2147483648 to +2147483647
+// inclusive, write the integer part to the TInt32 at aTrg
+// Negative numbers are rounded towards zero.
+// If an overflow or underflow occurs, aTrg is set to the max/min value
+//
+	{
+	TRealX f;
+	TInt ret=f.Set(aSrc);
+
+	if (ret==KErrArgument)
+		{
+		aTrg=0;
+		return(ret);
+		}
+
+	TInt intbits=f.iExp-0x7FFE;	// number of integer bits in mantissa
+
+	if (intbits<=0)
+		{
+		aTrg=0;
+		return(KErrNone);
+		}
+
+	if (intbits>32)
+		{
+		aTrg=((f.iSign&1) ? KMinTInt32 : KMaxTInt32);
+		return((f.iSign&1) ? KErrUnderflow : KErrOverflow);
+		}
+
+	TUint val = f.iMantHi >> (32 - intbits);
+
+	if ((f.iSign&1)==0 && val>(TUint)KMaxTInt32)
+		{
+		aTrg=KMaxTInt32;
+		return(KErrOverflow);
+		}
+
+	if ((f.iSign&1) && val>((TUint)KMaxTInt32+1))
+		{
+		aTrg=KMinTInt32;
+		return(KErrUnderflow);
+		}
+
+	aTrg=(f.iSign&1) ? -(TInt32)val : val;
+
+	return(KErrNone);
+	}
+
+#endif //__REALS_MACHINE_CODED__
+
+#else // __USE_VFP_MATH
+
+// definitions come from RVCT math library
+extern "C" TReal modf(TReal,TReal*);
+
+EXPORT_C TInt Math::Int(TReal& aTrg, const TReal& aSrc)
+	{
+	if (Math::IsNaN(aSrc))
+		{
+		SetNaN(aTrg);
+		return KErrArgument;
+		}
+	if (Math::IsInfinite(aSrc))
+		{
+		aTrg=aSrc;
+		return KErrOverflow;
+		}
+
+	modf(aSrc,&aTrg);
+	return KErrNone;
+	}
+
+EXPORT_C TInt Math::Int(TInt32& aTrg, const TReal& aSrc)
+	{
+	TReal aIntPart;
+	TInt r = Math::Int(aIntPart,aSrc);
+	if (r==KErrArgument)
+		{
+		aTrg = 0;
+		return r;
+		}
+	if (aIntPart>KMaxTInt32)
+		{
+		aTrg = KMaxTInt32;
+		return KErrOverflow;
+		}
+	if (aIntPart<KMinTInt32)
+		{
+		aTrg = KMinTInt32;
+		return KErrUnderflow;
+		}
+	aTrg = aIntPart;
+	return KErrNone;
+	}
+
+EXPORT_C TInt Math::Int(TInt16& aTrg, const TReal& aSrc)
+	{
+	TReal aIntPart;
+	TInt r = Math::Int(aIntPart,aSrc);
+	if (r==KErrArgument)
+		{
+		aTrg = 0;
+		return r;
+		}
+	if (aIntPart>KMaxTInt16)
+		{
+		aTrg = KMaxTInt16;
+		return KErrOverflow;
+		}
+	if (aIntPart<KMinTInt16)
+		{
+		aTrg = KMinTInt16;
+		return KErrUnderflow;
+		}
+	aTrg = aIntPart;
+	return KErrNone;
+	}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32/euser/maths/um_ln.cpp	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,143 @@
+// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32\euser\maths\um_ln.cpp
+// Natural log.
+// 
+//
+
+#include "um_std.h"
+
+#if defined(__USE_VFP_MATH) && !defined(__CPU_HAS_VFP)
+#error	__USE_VFP_MATH was defined but not __CPU_HAS_VFP - impossible combination, check variant.mmh 
+#endif
+
+
+#ifndef __USE_VFP_MATH
+
+LOCAL_D const TUint32 ArtanhCoeffs[] =
+	{
+	0x5C17F0BC,0xB8AA3B29,0x80010000,	// polynomial approximation to (4/ln2)artanh(x)
+	0xD02489EE,0xF6384EE1,0x7FFF0000,	// for |x| <= (sqr2-1)/(sqr2+1)
+	0x7008CA5F,0x93BB6287,0x7FFF0000,
+	0xE32D1D6B,0xD30BB16D,0x7FFE0000,
+	0x461D071E,0xA4257CE2,0x7FFE0000,
+	0xC3B0EC87,0x8650D459,0x7FFE0000,
+	0x53BEC0CD,0xE23137E3,0x7FFD0000,
+	0xC523F21B,0xDAF79221,0x7FFD0000
+	};
+
+LOCAL_D const TUint32 Ln2By2data[] = {0xD1CF79AC,0xB17217F7,0x7FFD0000};	// (ln2)/2
+LOCAL_D const TUint32 Sqr2data[] = {0xF9DE6484,0xB504F333,0x7FFF0000};		// sqr2
+LOCAL_D const TUint32 Sqr2Invdata[] = {0xF9DE6484,0xB504F333,0x7FFE0000};	// 1/sqr2
+LOCAL_D const TUint32 Onedata[] = {0x00000000,0x80000000,0x7FFF0000};		// 1.0
+
+
+
+
+EXPORT_C TInt Math::Ln(TReal& aTrg, const TReal& aSrc)
+/**
+Calculates the natural logarithm of a number.
+
+@param aTrg A reference containing the result. 
+@param aSrc The number whose natural logarithm is required.
+
+@return KErrNone if successful, otherwise another of
+        the system-wide error codes. 
+*/
+	{
+	// Calculate ln(aSrc) and write to aTrg
+	// Algorithm:
+	//		Calculate log2(aSrc) and multiply by ln2
+	//		log2(aSrc)=log2(2^e.m) e=exponent of aSrc, m=mantissa 1<=m<2
+	//		log2(aSrc)=e+log2(m)
+	//		If e=-1 (0.5<=aSrc<1), let x=aSrc else let x=mantissa(aSrc)
+	//		If x>Sqr2, replace x with x/Sqr2
+	//		If x<Sqr2/2, replace x with x*Sqr2
+	//		Replace x with (x-1)/(x+1)
+	//		Use polynomial to calculate artanh(x) for |x| <= (sqr2-1)/(sqr2+1)
+	//			( use identity ln(x) = 2artanh((x-1)/(x+1)) )
+
+	TRealX x;
+	const TRealX& Ln2By2=*(const TRealX*)Ln2By2data;
+	const TRealX& Sqr2=*(const TRealX*)Sqr2data;
+	const TRealX& Sqr2Inv=*(const TRealX*)Sqr2Invdata;
+	const TRealX& One=*(const TRealX*)Onedata;
+
+	TInt r=x.Set(aSrc);
+	if (r==KErrNone)
+		{
+		if (x.iExp==0)
+			{
+			SetInfinite(aTrg,1);
+			return KErrOverflow;
+			}
+		if (x.iSign&1)
+			{
+			SetNaN(aTrg);
+			return KErrArgument;
+			}
+		TInt n=(x.iExp-0x7FFF)<<1;
+		x.iExp=0x7FFF;
+		if (n!=-2)
+			{
+			if (x>Sqr2)
+				{
+				x*=Sqr2Inv;
+				n++;
+				}
+			}
+		else 
+			{
+			n=0;
+			x.iExp=0x7FFE;
+			if (x<Sqr2Inv)
+				{
+				x*=Sqr2;
+				n--;
+				}
+			}
+		x=(x-One)/(x+One);	// ln(x)=2artanh((x-1)/(x+1))
+		TRealX y;
+		PolyX(y,x*x,7,(const TRealX*)ArtanhCoeffs);
+		y*=x;
+		y+=TRealX(n);
+		y*=Ln2By2;
+		return y.GetTReal(aTrg);
+		}
+	if (r==KErrArgument || (r==KErrOverflow && (x.iSign&1)))
+		{
+		SetNaN(aTrg);
+		return KErrArgument;
+		}
+	SetInfinite(aTrg,0);
+	return KErrOverflow;
+	}
+
+#else // __USE_VFP_MATH
+
+// definitions come from RVCT math library
+extern "C" TReal log(TReal);
+
+EXPORT_C TInt Math::Ln(TReal& aTrg, const TReal& aSrc)
+	{
+	aTrg = log(aSrc);
+	if (Math::IsFinite(aTrg))
+		return KErrNone;
+	if (Math::IsInfinite(aTrg))
+		return KErrOverflow;
+	SetNaN(aTrg);
+	return KErrArgument;
+	}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32/euser/maths/um_log.cpp	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,66 @@
+// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32\euser\maths\um_log.cpp
+// Floating point base 10 logarithm
+// 
+//
+
+#include "um_std.h"
+
+#if defined(__USE_VFP_MATH) && !defined(__CPU_HAS_VFP)
+#error	__USE_VFP_MATH was defined but not __CPU_HAS_VFP - impossible combination, check variant.mmh 
+#endif
+
+
+#ifndef __USE_VFP_MATH
+
+EXPORT_C TInt Math::Log(TReal &aTrg,const TReal &aSrc)
+/**
+Calculates the logarithm to base 10 of a number.
+
+@param aTrg  A reference containing the result. 
+@param aSrc  The number whose logarithm is required. 
+ 
+@return KErrNone if successful, otherwise another of
+        the system-wide error codes. 
+*/
+//
+// Base 10 log routine. See Software manual by W.J.Cody & W.Waite
+//
+	{
+
+	TInt ret=Math::Ln(aTrg,aSrc);
+	if (ret!=KErrNone)
+		return(ret);    	
+	aTrg*=KRln10;
+	return(ret);
+	}
+
+#else // __USE_VFP_MATH
+
+// definitions come from RVCT math library
+extern "C" TReal log10(TReal);
+
+EXPORT_C TInt Math::Log(TReal& aTrg, const TReal& aSrc)
+	{
+	aTrg = log10(aSrc);
+	if (Math::IsFinite(aTrg))
+		return KErrNone;
+	if (Math::IsInfinite(aTrg))
+		return KErrOverflow;
+	SetNaN(aTrg);
+	return KErrArgument;
+	}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32/euser/maths/um_mod.cpp	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,122 @@
+// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32\euser\maths\um_mod.cpp
+// Writes the remainder of aSrc/aModulus to aTrg
+// 
+//
+
+#include "um_std.h"
+
+#if defined(__USE_VFP_MATH) && !defined(__CPU_HAS_VFP)
+#error	__USE_VFP_MATH was defined but not __CPU_HAS_VFP - impossible combination, check variant.mmh 
+#endif
+
+#ifndef __USE_VFP_MATH
+
+EXPORT_C TInt Math::Mod(TReal &aTrg,const TReal &aSrc,const TReal &aModulus)
+/**
+Calculates the modulo remainder.
+
+This is the value of p mod q, the modulo remainder when dividing p by q.
+The result is given by p - q int (p/q):
+it has the same sign as p:
+thus, 5 mod 3 = 2, -5 mod 3 = -2.
+No error is raised if non-integer arguments are passed.
+
+@param aTrg      A reference containing the result.
+@param aSrc      The p argument to the mod function.
+@param aModulus  The q argument to the mod function.
+
+@return KErrNone if successful, otherwise another of
+        the system-wide error codes. 
+*/
+//
+// Floating point modulo arithmetic.
+//
+	{
+
+	TRealX f1,f2;
+	TInt r=f1.Set(aSrc);
+	if (r!=KErrNone)
+		{
+		SetNaN(aTrg);
+		return KErrArgument;
+		}
+	r=f2.Set(aModulus);
+	if (r==KErrArgument || f2.IsZero())
+		{
+		SetNaN(aTrg);
+		return KErrArgument;
+		}
+	if (r==KErrOverflow)
+		{
+		aTrg=aSrc;
+		return KErrNone;
+		}
+	if ((TInt(f1.iExp)-TInt(f2.iExp))>KMantissaBits)
+		{
+		SetZero(aTrg);
+		return KErrTotalLossOfPrecision;
+		}
+	f1.ModEq(f2);
+	return f1.GetTReal(aTrg);
+	}
+
+#else // __USE_VFP_MATH
+
+// definitions come from RVCT math library
+extern "C" TReal fmod(TReal,TReal);
+
+EXPORT_C TInt Math::Mod(TReal& aTrg, const TReal& aSrc, const TReal &aModulus)
+	{
+	SReal64 *pSrc=(SReal64 *)&aSrc;
+	SReal64 *pModulus=(SReal64 *)&aModulus;
+	
+	if (pSrc->exp==0 || pModulus->exp==0 || pSrc->exp==KSpecialExponent || pModulus->exp==KSpecialExponent)
+		{
+		TRealX f1,f2;
+		TInt r=f1.Set(aSrc);
+		if (r!=KErrNone)
+			{
+			SetNaN(aTrg);
+			return KErrArgument;
+			}
+		r=f2.Set(aModulus);
+		if (r==KErrArgument || f2.IsZero())
+			{
+			SetNaN(aTrg);
+			return KErrArgument;
+			}
+		if (r==KErrOverflow)
+			{
+			aTrg=aSrc;
+			return KErrNone;
+			}
+		if ((TInt(f1.iExp)-TInt(f2.iExp))>KMantissaBits)
+			{
+			SetZero(aTrg);
+			return KErrTotalLossOfPrecision;
+			}
+		}
+	else if ((pSrc->exp - pModulus->exp) > KMantissaBits)
+		{
+		SetZero(aTrg);
+		return KErrTotalLossOfPrecision;
+		}
+
+	aTrg = fmod(aSrc,aModulus);
+	return KErrNone;
+	}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32/euser/maths/um_pow.cpp	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,374 @@
+// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32\euser\maths\um_pow.cpp
+// Raise to the power.
+// 
+//
+
+#include "um_std.h"
+
+#if defined(__USE_VFP_MATH) && !defined(__CPU_HAS_VFP)
+#error	__USE_VFP_MATH was defined but not __CPU_HAS_VFP - impossible combination, check variant.mmh 
+#endif
+
+
+#ifndef __USE_VFP_MATH
+
+LOCAL_D const TUint32 ArtanhCoeffs[] =
+	{
+	0x5C17F0BC,0xB8AA3B29,0x80010000,	// polynomial approximation to (4/ln2)artanh(x)
+	0xD01FDDD8,0xF6384EE1,0x7FFF0000,	// for |x| <= (sqr2-1)/(sqr2+1)
+	0x7D0DDC69,0x93BB6287,0x7FFF0000,
+	0x6564D4F5,0xD30BB153,0x7FFE0000,
+	0x1546C858,0xA4258A33,0x7FFE0000,
+	0xCCE50DA9,0x864D28DF,0x7FFE0000,
+	0x8E1A5DBB,0xE35271A0,0x7FFD0000,
+	0xF5A67D92,0xC3A36B08,0x7FFD0000,
+	0x62D53E02,0xC4A1FFAC,0x7FFD0000
+	};
+
+LOCAL_D const TUint32 TwoToxCoeffs[] =
+	{
+	0x00000000,0x80000000,0x7FFF0000,	// polynomial approximation to 2^(x/8) for
+	0xD1CF79AC,0xB17217F7,0x7FFB0000,	// 0<=x<=1
+	0x162CF72B,0xF5FDEFFC,0x7FF60000,
+	0x23EC0D04,0xE35846B8,0x7FF10000,
+	0xBDB408D7,0x9D955B7E,0x7FEC0000,
+	0xFDD8A678,0xAEC3FE73,0x7FE60000,
+	0xBD6E3950,0xA184E90A,0x7FE00000,
+	0xC1054DA3,0xFFB259D8,0x7FD90000,
+	0x70893DE4,0xB8BEDE2F,0x7FD30000
+	};
+
+LOCAL_D const TUint32 TwoToNover8[] =
+	{
+	0xEA8BD6E7,0x8B95C1E3,0x7FFF0000,	// 2^0.125
+	0x8DB8A96F,0x9837F051,0x7FFF0000,	// 2^0.250
+	0xB15138EA,0xA5FED6A9,0x7FFF0000,	// 2^0.375
+	0xF9DE6484,0xB504F333,0x7FFF0000,	// 2^0.500
+	0x5506DADD,0xC5672A11,0x7FFF0000,	// 2^0.625
+	0xD69D6AF4,0xD744FCCA,0x7FFF0000,	// 2^0.750
+	0xDD24392F,0xEAC0C6E7,0x7FFF0000	// 2^0.875
+	};
+
+LOCAL_D const TUint32 Sqr2data[] = {0xF9DE6484,0xB504F333,0x7FFF0000};		// sqr2
+LOCAL_D const TUint32 Sqr2Invdata[] = {0xF9DE6484,0xB504F333,0x7FFE0000};	// 1/sqr2
+LOCAL_D const TUint32 Onedata[] = {0x00000000,0x80000000,0x7FFF0000};		// 1.0
+
+LOCAL_C void Log2(TRealX& y, TRealX& x)
+	{
+	// Calculate log2(x) and write to y
+	// Result to 64-bit precision to allow accurate powers
+	// Algorithm:
+	//		log2(aSrc)=log2(2^e.m) e=exponent of aSrc, m=mantissa 1<=m<2
+	//		log2(aSrc)=e+log2(m)
+	//		If e=-1 (0.5<=aSrc<1), let x=aSrc else let x=mantissa(aSrc)
+	//		If x>Sqr2, replace x with x/Sqr2
+	//		If x<Sqr2/2, replace x with x*Sqr2
+	//		Replace x with (x-1)/(x+1)
+	//		Use polynomial to calculate artanh(x) for |x| <= (sqr2-1)/(sqr2+1)
+	//			( use identity ln(x) = 2artanh((x-1)/(x+1)) )
+
+	const TRealX& Sqr2=*(const TRealX*)Sqr2data;
+	const TRealX& Sqr2Inv=*(const TRealX*)Sqr2Invdata;
+	const TRealX& One=*(const TRealX*)Onedata;
+
+	TInt n=(x.iExp-0x7FFF)<<1;
+	x.iExp=0x7FFF;
+	if (n!=-2)
+		{
+		if (x>Sqr2)
+			{
+			x*=Sqr2Inv;
+			n++;
+			}
+		}
+	else 
+		{
+		n=0;
+		x.iExp=0x7FFE;
+		if (x<Sqr2Inv)
+			{
+			x*=Sqr2;
+			n--;
+			}
+		}
+	x=(x-One)/(x+One);	// ln(x)=2artanh((x-1)/(x+1))
+	Math::PolyX(y,x*x,8,(const TRealX*)ArtanhCoeffs);
+	y*=x;
+	y+=TRealX(n);
+	if (y.iExp>1)
+		y.iExp--;
+	else
+		y.iExp=0;
+	}
+
+LOCAL_C TInt TwoTox(TRealX& y, TRealX& x)
+	{
+	// Calculate 2^x and write result to y. Result to 64 bit precision.
+	// Algorithm:
+	//		2^x = 2^int(x).2^frac(x)
+	//		2^int(x) just adds int(x) to the final result exponent
+	//		Reduce frac(x) to the range [0,0.125] (modulo 0.125)
+	//		Use polynomial to calculate 2^x for 0<=x<=0.125
+	//		Multiply by 2^(n/8) for n=0,1,2,3,4,5,6,7 to give 2^frac(x)
+
+	if (x.iExp)
+		x.iExp+=3;
+	TInt n=(TInt)x;
+	if (n<16384 && n>-16384)
+		{
+		if (x.iSign&1)
+			n--;
+		x-=TRealX(n);
+		Math::PolyX(y,x,8,(const TRealX*)TwoToxCoeffs);
+		y.iExp=TUint16(TInt(y.iExp)+(n>>3));
+		n&=7;
+		if (n)
+			y*= (*(const TRealX*)(TwoToNover8+3*n-3));
+		return KErrNone;
+		}
+	else
+		{
+		if (n<0)
+			{
+			y.SetZero();
+			return KErrUnderflow;
+			}
+		else
+			{
+			y.SetInfinite(0);
+			return KErrOverflow;
+			}
+		}
+	}
+
+
+
+
+EXPORT_C TInt Math::Pow(TReal &aTrg,const TReal &aSrc,const TReal &aPower)
+/**
+Calculates the value of x raised to the power of y.
+
+The behaviour conforms to that specified for pow() in the
+ISO C Standard ISO/IEC 9899 (Annex F), although floating-point exceptions
+are not supported.
+
+@param aTrg   A reference containing the result.
+@param aSrc   The x argument of the function.
+@param aPower The y argument of the function.
+
+@return KErrNone if successful;
+		KErrOverflow if the result is +/- infinity;
+	   	KErrUnderflow if the result is too small to be represented;
+		KErrArgument if the result is not a number (NaN).
+*/
+//
+// Evaluates aSrc raised to the power aPower and places the result in aTrg.
+// For non-special values algorithm is aTrg=2^(aPower*log2(aSrc))
+//
+	{
+	TRealX x,p;
+
+	TInt ret2=p.Set(aPower);
+	// pow(x, +/-0) -> 1 for any x, even a NaN
+	if (p.IsZero())
+		{
+		aTrg=1.0;
+		return KErrNone;
+		}
+
+	TInt ret1=x.Set(aSrc);
+	if (ret1==KErrArgument || ret2==KErrArgument)
+		{
+		// pow(+1, y) -> 1 for any y, even a NaN
+		// XXX First test should not be necessary, but on WINS
+		//     aSrc == 1.0 is true when aSrc is NaN.
+		if (ret1 != KErrArgument && aSrc == 1.0)
+			{
+			aTrg=aSrc;
+			return KErrNone;
+			}
+		SetNaN(aTrg);
+		return KErrArgument;
+		}
+
+	// Infinite power
+	if (ret2==KErrOverflow)
+		{
+		// figure out which of these cases we have:
+		//
+		// pow(x, -INF) -> +INF for |x| < 1  } flag = 0
+		// pow(x, +INF) -> +INF for |x| > 1  }
+		// pow(x, -INF) -> +0 for |x| > 1      } flag = 1
+		// pow(x, +INF) -> +0 for |x| < 1      }
+		//
+		// flag = 2 => |x| == 1.0
+		//
+		TInt flag=2;
+		if (Abs(aSrc)>1.0)
+			flag=p.iSign&1;
+		if (Abs(aSrc)<1.0)
+			flag=1-(p.iSign&1);
+		if (flag==0)
+			{
+			SetInfinite(aTrg,0);
+			return KErrOverflow;
+			}
+		if (flag==1)
+			{
+			SetZero(aTrg,0);
+			return KErrNone;
+			}
+		if (Abs(aSrc)==1.0)
+			{
+			// pow(-1, +/-INF) -> 1
+			aTrg=1.0;
+			return KErrNone;
+			}
+		// This should never happen (i.e. aSrc is NaN, which
+		// should be taken care of above)
+		SetNaN(aTrg);
+		return KErrArgument;
+		}
+
+	// Negative Base raised to a power
+	TInt odd=1;
+	if (x.iSign & 1)
+		{
+		TReal pint;
+		Math::Int(pint,aPower);
+		if (aPower-pint) // Checks that if aSrc is less than zero, then aPower is integral
+			{
+			// pow(-INF, y) -> +0 for y < 0 and not an odd integer
+			// pow(-INF, y) -> +INF for y > 0 and not an odd integer
+			// Since we're here, aPower is not integral, so can't be odd, either
+			if (ret1 == KErrOverflow)
+				{
+				if (aPower < 0)
+					{
+					SetZero(aTrg);
+					return KErrNone;
+					}
+				else
+					{
+					SetInfinite(aTrg,0);
+					return KErrOverflow;
+					}
+				}
+			SetNaN(aTrg);
+			return KErrArgument;
+			}
+		TReal powerby2=aPower*0.5;
+		Math::Int(pint,powerby2);
+		if (powerby2-pint)
+			odd=(-1);
+		x.iSign=0;
+		}
+
+	// Zero or infinity raised to a power
+	if (x.IsZero() || ret1==KErrOverflow)
+		{
+		if (x.IsZero() && p.IsZero())
+			{
+			aTrg=1.0;
+			return KErrNone;
+			}
+		TInt sign=(odd==-1 ? 1 : 0);
+		if ((x.IsZero() && (p.iSign&1)==0) || (ret1==KErrOverflow && (p.iSign&1)))
+			{
+			SetZero(aTrg,sign);				
+			return KErrNone;
+			}
+		else
+			{
+			SetInfinite(aTrg,sign);
+			return KErrOverflow;
+			}
+		}
+
+	TRealX y;
+	Log2(y,x);
+	x=y*p;			// this cannot overflow or underflow
+	TInt r=TwoTox(y,x);
+	if (odd<0)
+		y.iSign=1;
+	TInt r2=y.GetTReal(aTrg);
+	return (r==KErrNone)?r2:r;
+	}
+
+#else // __USE_VFP_MATH
+
+// definitions come from RVCT math library
+extern "C" TReal pow(TReal,TReal);
+
+EXPORT_C TInt Math::Pow(TReal &aTrg,const TReal &aSrc,const TReal &aPower)
+	{
+	aTrg = pow(aSrc,aPower);
+	if (Math::IsZero(aTrg) && !Math::IsZero(aSrc) && !Math::IsInfinite(aSrc) && !Math::IsInfinite(aPower))
+		return KErrUnderflow;
+	if (Math::IsFinite(aTrg))
+		return KErrNone;
+	if (Math::IsZero(aPower))	// pow(x, +/-0) -> 1 for any x, even a NaN
+		{
+		aTrg = 1.0;
+		return KErrNone;
+		}
+	if (Math::IsInfinite(aTrg))
+		return KErrOverflow;
+	if (aSrc==1.0)				// pow(+1, y) -> 1 for any y, even a NaN
+		{
+		aTrg=aSrc;
+		return KErrNone;
+		}
+	if (Math::IsInfinite(aPower))
+		{
+		if (aSrc == -1.0)		// pow(-1, +/-INF) -> 1
+			{
+			aTrg = 1.0;
+			return KErrNone;
+			}
+		if (((Abs(aSrc) < 1) && (aPower < 0)) ||	// pow(x, -INF) -> +INF for |x| < 1
+		    ((Abs(aSrc) > 1) && (aPower > 0)))		// pow(x, +INF) -> +INF for |x| > 1
+			{
+			SetInfinite(aTrg,0);
+			return KErrOverflow;
+			}
+		}
+	// pow(-INF, y) -> +INF for y > 0 and not an odd integer
+	if (Math::IsInfinite(aSrc) && (aSrc < 0) && (aPower > 0))
+		{
+		TBool odd = EFalse;
+		TReal pint;
+		Math::Int(pint, aPower);
+		if (aPower == pint)
+			{
+			TReal halfPower = aPower * 0.5;
+			Math::Int(pint, halfPower);
+			if (halfPower != pint)
+				odd = ETrue;
+			}
+		if (odd == EFalse)
+			{
+			SetInfinite(aTrg,0);
+			return KErrOverflow;
+			}
+		}
+
+	// Otherwise...
+	SetNaN(aTrg);
+	return KErrArgument;
+	}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32/euser/maths/um_pow10.cpp	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,265 @@
+// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32\euser\maths\um_pow10.cpp
+// Return a power of 10 as a TReal
+// 
+//
+
+#include "um_std.h"
+
+#if defined(__USE_VFP_MATH) && !defined(__CPU_HAS_VFP)
+#error	__USE_VFP_MATH was defined but not __CPU_HAS_VFP - impossible combination, check variant.mmh 
+#endif
+
+
+// Tables of powers of 10
+LOCAL_D const TUint32 PositivePowersOfTen[] =
+	{
+// Positive powers 1-31
+	0x00000000,0xA0000000,0x80020000,
+	0x00000000,0xC8000000,0x80050000,
+	0x00000000,0xFA000000,0x80080000,
+	0x00000000,0x9C400000,0x800C0000,
+	0x00000000,0xC3500000,0x800F0000,
+	0x00000000,0xF4240000,0x80120000,
+	0x00000000,0x98968000,0x80160000,
+	0x00000000,0xBEBC2000,0x80190000,
+	0x00000000,0xEE6B2800,0x801C0000,
+	0x00000000,0x9502F900,0x80200000,
+	0x00000000,0xBA43B740,0x80230000,
+	0x00000000,0xE8D4A510,0x80260000,
+	0x00000000,0x9184E72A,0x802A0000,
+	0x80000000,0xB5E620F4,0x802D0000,
+	0xA0000000,0xE35FA931,0x80300000,
+	0x04000000,0x8E1BC9BF,0x80340000,
+	0xC5000000,0xB1A2BC2E,0x80370000,
+	0x76400000,0xDE0B6B3A,0x803A0000,
+	0x89E80000,0x8AC72304,0x803E0000,
+	0xAC620000,0xAD78EBC5,0x80410000,
+	0x177A8000,0xD8D726B7,0x80440000,
+	0x6EAC9000,0x87867832,0x80480000,
+	0x0A57B400,0xA968163F,0x804B0000,
+	0xCCEDA100,0xD3C21BCE,0x804E0000,
+	0x401484A0,0x84595161,0x80520000,
+	0x9019A5C8,0xA56FA5B9,0x80550000,
+	0xF4200F3A,0xCECB8F27,0x80580000,
+	0xF8940984,0x813F3978,0x805C0000,
+	0x36B90BE5,0xA18F07D7,0x805F0000,
+	0x04674EDF,0xC9F2C9CD,0x80620000,
+	0x45812296,0xFC6F7C40,0x80650000,
+
+// Positive powers 32-31*32 in steps of 32
+	0x2B70B59E,0x9DC5ADA8,0x80690000,
+	0xFFCFA6D5,0xC2781F49,0x80D30000,
+	0xC59B14A3,0xEFB3AB16,0x813D0000,
+	0x80E98CE0,0x93BA47C9,0x81A80000,
+	0x7FE617AA,0xB616A12B,0x82120000,
+	0x3927556B,0xE070F78D,0x827C0000,
+	0xE33CC930,0x8A5296FF,0x82E70000,
+	0x9DF9DE8E,0xAA7EEBFB,0x83510000,
+	0x5C6A2F8C,0xD226FC19,0x83BB0000,
+	0xF2CCE376,0x81842F29,0x84260000,
+	0xDB900AD2,0x9FA42700,0x84900000,
+	0xAEF8AA17,0xC4C5E310,0x84FA0000,
+	0xE9B09C59,0xF28A9C07,0x85640000,
+	0xEBF7F3D4,0x957A4AE1,0x85CF0000,
+	0x0795A262,0xB83ED8DC,0x86390000,
+	0xA60E91C7,0xE319A0AE,0x86A30000,
+	0x432D7BC3,0x8BF61451,0x870E0000,
+	0x6B6795FD,0xAC83FB89,0x87780000,
+	0xB8FA79B0,0xD4A44FB4,0x87E20000,
+	0xE54A9D1D,0x830CF791,0x884D0000,
+	0xADE24964,0xA1884B69,0x88B70000,
+	0x1F8F01CC,0xC71AA36A,0x89210000,
+	0x437028F3,0xF56A298F,0x898B0000,
+	0xCD00A68C,0x973F9CA8,0x89F60000,
+	0xD7CC9ECD,0xBA6D9B40,0x8A600000,
+	0x8D737F0E,0xE5CA5A0B,0x8ACA0000,
+	0x1346BDA5,0x8D9E89D1,0x8B350000,
+	0xE3D5DBEA,0xAE8F2B2C,0x8B9F0000,
+	0x5A0C1B30,0xD7293020,0x8C090000,
+	0x0D2ECFD2,0x849A672A,0x8C740000,
+	0x41FA93DE,0xA3722C13,0x8CDE0000,
+
+// Positive powers 1024-8*1024 in steps of 1024
+	0x81750C17,0xC9767586,0x8D480000,
+	0xC53D5DE5,0x9E8B3B5D,0x9A920000,
+	0xD88B5A8B,0xF9895D25,0xA7DB0000,
+	0x8A20979B,0xC4605202,0xB5250000,
+	0xFED3AB23,0x9A8A7EF0,0xC26F0000,
+	0x73A56037,0xF33C80E8,0xCFB80000,
+	0x61889066,0xBF6B0EC4,0xDD020000,
+	0x7FAF211A,0x96A3A1D1,0xEA4C0000
+	};
+
+LOCAL_D const TUint32 NegativePowersOfTen[] =
+	{
+// Negative powers 1-31
+	0xCCCCCCCD,0xCCCCCCCC,0x7FFB0000,
+	0x70A3D70A,0xA3D70A3D,0x7FF80000,
+	0x8D4FDF3B,0x83126E97,0x7FF50000,
+	0xE219652C,0xD1B71758,0x7FF10000,
+	0x1B478423,0xA7C5AC47,0x7FEE0000,
+	0xAF6C69B6,0x8637BD05,0x7FEB0000,
+	0xE57A42BC,0xD6BF94D5,0x7FE70000,
+	0x8461CEFD,0xABCC7711,0x7FE40000,
+	0x36B4A597,0x89705F41,0x7FE10000,
+	0xBDEDD5BF,0xDBE6FECE,0x7FDD0000,
+	0xCB24AAFF,0xAFEBFF0B,0x7FDA0000,
+	0x6F5088CC,0x8CBCCC09,0x7FD70000,
+	0x4BB40E13,0xE12E1342,0x7FD30000,
+	0x095CD80F,0xB424DC35,0x7FD00000,
+	0x3AB0ACD9,0x901D7CF7,0x7FCD0000,
+	0xC44DE15B,0xE69594BE,0x7FC90000,
+	0x36A4B449,0xB877AA32,0x7FC60000,
+	0x921D5D07,0x9392EE8E,0x7FC30000,
+	0xB69561A5,0xEC1E4A7D,0x7FBF0000,
+	0x92111AEB,0xBCE50864,0x7FBC0000,
+	0x74DA7BEF,0x971DA050,0x7FB90000,
+	0xBAF72CB1,0xF1C90080,0x7FB50000,
+	0x95928A27,0xC16D9A00,0x7FB20000,
+	0x44753B53,0x9ABE14CD,0x7FAF0000,
+	0xD3EEC551,0xF79687AE,0x7FAB0000,
+	0x76589DDB,0xC6120625,0x7FA80000,
+	0x91E07E48,0x9E74D1B7,0x7FA50000,
+	0x8300CA0E,0xFD87B5F2,0x7FA10000,
+	0x359A3B3E,0xCAD2F7F5,0x7F9E0000,
+	0x5E14FC32,0xA2425FF7,0x7F9B0000,
+	0x4B43FCF5,0x81CEB32C,0x7F980000,
+
+// Negative powers 32-31*32 in steps of 32
+	0x453994BA,0xCFB11EAD,0x7F940000,
+	0xA539E9A5,0xA87FEA27,0x7F2A0000,
+	0xFD75539B,0x88B402F7,0x7EC00000,
+	0x64BCE4A1,0xDDD0467C,0x7E550000,
+	0xDB73A093,0xB3F4E093,0x7DEB0000,
+	0x5423CC06,0x91FF8377,0x7D810000,
+	0x4A314EBE,0xECE53CEC,0x7D160000,
+	0x637A193A,0xC0314325,0x7CAC0000,
+	0x836AC577,0x9BECCE62,0x7C420000,
+	0x478238D1,0xFD00B897,0x7BD70000,
+	0x46F34F7D,0xCD42A113,0x7B6D0000,
+	0xB11B0858,0xA686E3E8,0x7B030000,
+	0x3FFC68A6,0x871A4981,0x7A990000,
+	0xB6074245,0xDB377599,0x7A2E0000,
+	0x79007736,0xB1D983B4,0x79C40000,
+	0xDB23D21C,0x9049EE32,0x795A0000,
+	0x467F9466,0xEA1F3806,0x78EF0000,
+	0xEE5092C7,0xBDF139F0,0x78850000,
+	0xB4730DD0,0x9A197865,0x781B0000,
+	0x8871347D,0xFA0A6CDB,0x77B00000,
+	0x3C8736FC,0xCADB6D31,0x77460000,
+	0x52EB8375,0xA493C750,0x76DC0000,
+	0x774FB85E,0x85855C0F,0x76720000,
+	0x505DE96B,0xD8A66D4A,0x76070000,
+	0xCB39A7B1,0xAFC47766,0x759D0000,
+	0xA9B05AC8,0x8E997872,0x75330000,
+	0xFDC06462,0xE761832E,0x74C80000,
+	0xBB827F2D,0xBBB7EF38,0x745E0000,
+	0xE1F045DD,0x984B9B19,0x73F40000,
+	0x3613F568,0xF71D01E0,0x73890000,
+	0x3F64789E,0xC87B6D2F,0x731F0000,
+
+// Negative powers 1024-8*1024 in steps of 1024
+	0xDA57C0BE,0xA2A682A5,0x72B50000,
+	0x34362DE4,0xCEAE534F,0x656B0000,
+	0x91575A88,0x8350BF3C,0x58220000,
+	0xD2CE9FDE,0xA6DD04C8,0x4AD80000,
+	0x0DA5D8E8,0xD408CB01,0x3D8E0000,
+	0x22EB58E9,0x86B77A60,0x30450000,
+	0x4779611E,0xAB2F7655,0x22FB0000,
+	0x686DA869,0xD986C20B,0x15B10000
+	};
+
+TInt Math::MultPow10X(TRealX& aTrg, TInt aPower)
+	{
+	if (aTrg.IsZero())
+		return KErrNone;
+	if (!aTrg.IsFinite())
+		{
+		if (aTrg.IsNaN())
+			return KErrArgument;
+		return KErrOverflow;
+		}
+	if (aPower==0)
+		return KErrNone;
+	// smallest non-zero TRealX is 2^-32766=2.83E-9864
+	// largest TRealX is 2^32768=1.42E+9864
+	// Therefore aPower>=19728 guarantees an overflow
+	// and aPower<=-19728 guarantees an underflow
+	if (aPower>=19728)
+		{
+		aTrg.SetInfinite(aTrg.iSign);
+		return KErrOverflow;
+		}
+	if (aPower<=-19728)
+		{
+		aTrg.SetZero(aTrg.iSign);
+		return KErrUnderflow;
+		}
+	const TRealX* powTab;
+	if (aPower>0)
+		powTab=(const TRealX*)PositivePowersOfTen;
+	else
+		{
+		aPower=-aPower;
+		powTab=(const TRealX*)NegativePowersOfTen;
+		}
+	TInt r=KErrNone;
+	while(aPower>=8192)
+		{
+		aPower-=8192;
+		r=aTrg.MultEq(powTab[31+31+7]);
+		if (r!=KErrNone)
+			return r;
+		}
+	TInt bottom5=aPower & 0x1f;
+	TInt middle5=(aPower>>5)&0x1f;
+	TInt top3=(aPower>>10);
+	if (top3)
+		r=aTrg.MultEq(powTab[31+31+top3-1]);
+	if (r==KErrNone && middle5)
+		r=aTrg.MultEq(powTab[31+middle5-1]);
+	if (r==KErrNone && bottom5)
+		r=aTrg.MultEq(powTab[bottom5-1]);
+	return r;
+	}
+
+
+
+
+EXPORT_C TInt Math::Pow10(TReal &aTrg,const TInt aExp)
+/**
+Calculates the value of 10 to the power of x.
+
+@param aTrg A reference containing the result. 
+@param aExp The power to which 10 is to be raised.
+
+@return KErrNone if successful, otherwise another of
+        the system-wide error codes.
+*/
+//
+// Write the binary floating point representation of a power of 10 to aSrc
+// Returns KErrNone if OK or a negative error number otherwise.
+//
+	{
+#ifndef __USE_VFP_MATH
+	TRealX x=1;
+	TInt r=Math::MultPow10X(x,aExp);
+	TInt s=x.GetTReal(aTrg);
+	return (r==KErrNone)?s:r;
+#else // __USE_VFP_MATH
+	return Math::Pow(aTrg,10,aExp);
+#endif
+	}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32/euser/maths/um_rand.cpp	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,64 @@
+// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32\euser\maths\um_rand.cpp
+// 
+//
+
+#include "um_std.h"
+
+
+
+
+EXPORT_C TInt Math::Rand(TInt64 &aSeed)
+/**
+Generates a stream of uniformly distributed pseudo-random integers
+in the range, 0 to KMaxTInt.
+
+For each stream of pseudo-random numbers you wish to generate, you should
+pass the reference to the same 64-bit seed on each call to this function.
+You should not change the seed between calls.
+
+@param aSeed A reference to a 64-bit seed, which is updated
+             as a result of the call.
+
+@return The next pseudo-random number in the sequence. 
+*/
+	{
+
+	aSeed*=214013;
+    aSeed+=2531011;
+    return(((TInt)(aSeed>>16))&0x7fffffff);
+	}
+
+
+
+
+EXPORT_C TReal Math::FRand(TInt64& aSeed) __SOFTFP
+/**
+Generates a stream of uniformly distributed pseudo-random real numbers
+in the range, 0 to 1.
+
+@param aSeed A reference to a 64-bit seed, which is updated
+             as a result of the call.
+
+@return The next pseudo-random number in the sequence. 
+*/
+	{
+	TUint low = (TUint)Math::Rand(aSeed);
+	TUint high = (TUint)Math::Rand(aSeed)&0x7FFFFFFF;	// make sure TInt64 is positive
+	TRealX f((static_cast<TInt64>(high) << 32) | low);	// construct TRealX 0<=f<2^63
+	if (f.iExp)
+		f.iExp-=63;						// Scale f to range 0<=f<1
+    return(TReal(f));
+	}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32/euser/maths/um_rtod.cpp	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,1073 @@
+// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32\euser\maths\um_rtod.cpp
+// 
+//
+
+#include "um_std.h"
+
+#include <e32debug.h>
+
+#define KNeedsRounding 0x1000
+#if (KRealFormatTypeFlagsMask| KRealFormatTypesMask) & KNeedsRounding 
+	#error KNeedsRounding already uses 0x1000
+#endif
+
+const TInt KMinThreeDigitExponent=100;
+
+_LIT8(KLit8Plus,"+");
+_LIT8(KLit8Minus,"-");
+_LIT8(KLit8Zero,"0");
+_LIT8(KLit8Inf,"Inf");
+_LIT8(KLit8Nan,"NaN");
+
+LOCAL_C TInt round(const TText8* aBuf, const TInt aLen)
+//
+// Round number in buffer depending on digit at aBuf[aLen]. 
+// Return value is carry from most significant digit.
+//
+	{
+	__ASSERT_DEBUG(aLen>=0,Panic(EMathUnexpectedError1));
+	TText8* pB=(TText8*)aBuf+aLen;
+	if (*pB<'5')
+		return 0;	// round down
+	while(--pB>=aBuf)
+		{
+		TText8 d=*pB;
+		if (d<'9')
+			{
+			++d;
+			*pB=d;
+			return 0;
+			}
+		*pB='0';
+		}
+	// carry propagates to exponent
+	*++pB='1';
+	if (aLen>0)
+		pB[aLen]='0';
+	return 1;
+	}
+
+TUint mult10(TUint64& a)
+//
+// Multiply a 64-bit binary fraction in a (MSB=2^-1) by 10
+// Return the fractional part in a, the integer part in the return value.
+//
+	{
+	const TUint64 ten = 10;
+	TUint64 high;
+	Math::UMul64(a, ten, high, a);
+	return static_cast<TUint>(high);
+	}
+
+LOCAL_C TInt fDigLim(TDes8& aTrg, const TReal& aSrc, TInt& aExp, const TBool aLimit)
+//
+// Convert the TReal at address aSrc to a decimal form suitable for use by a
+// formatting routine. Writes the result into the descriptor at aTrg and the
+// exponent in aExp. Returns the length of the string or a negative error number.
+//
+// AnnW, November 1996 - changed to handle all numbers in TReal64/96 range.
+//
+// The first character in aBuf is one of:
+//
+// '0' - indicates that aSrc is exactly zero.
+//
+// '+' - indicates a positive number and is followed by between 1 and KMaxPrecision
+// decimal digits representing a mantissa in the range 0.1 to less than 1.0 which 
+// corresponds to the decimal exponent returned in aExp.
+//
+// '-' - indicates a negative mantissa and is otherwise the same as for '+'.
+//
+// If aLimit is ETrue then the format is limited to KPrecisionLimit significant digits
+// 
+	{
+	
+	TRealX x;
+	TInt r=x.Set(aSrc);
+
+	if (x.IsZero())
+		{
+		aTrg=KLit8Zero();
+		return 1;
+		}
+	else	// sets sign in all cases, including specials
+		aTrg=(x.iSign ? KLit8Minus() : KLit8Plus());
+		
+	if (r!=KErrNone)
+		return r;
+
+	x.iSign=0;
+	TInt e=TInt(x.iExp)-0x7fff;		// 2^e<=Abs(x)<2^(e+1)
+	e*=19728;						// log10(2)*65536 = 19728.301796...
+									// max error due to omission of fractional part is 9889 (towards zero)
+	e-=9889;						// account for error, e may be too small by up to 19778
+									// Now have 10^(e/65536)<=Abs(x)<4.007*10^(e/65536)
+	e>>=16;							// Divide by 65536 - this always rounds towards -infinity
+									// Now have 10^e<=Abs(x)<40.07*10^e
+	e+=1;							// Now have 0.1<=Abs(x)/10^e<4.07
+	Math::MultPow10X(x,-e);			// x*=10^-e so now 0.1<=x<4.07
+	if (x.iExp>=0x7fff)
+		{
+		++e;
+		Math::MultPow10X(x,-1);		// if x>=1, multiply x by 10^-1 and increment e
+		}
+
+	TUint64 mantissa = MAKE_TUINT64(x.iMantHi, x.iMantLo);
+
+	if (x.iExp<0x7ffe)
+		mantissa >>= (0x7ffe - x.iExp);	// shift to make exponent 0x7ffe, i.e. mantissa in range 0.1<=m<1
+
+	TInt prec=aLimit?KPrecisionLimit:KMaxPrecision;
+
+	while ( mantissa && (aTrg.Length() < (prec + 2)) )
+		{
+		TUint d = mult10(mantissa);
+		aTrg.Append(d+'0');
+		}
+	if (aTrg.Length()>=prec+2)
+		{
+		e+=round(aTrg.Ptr()+1,prec);
+		aTrg.SetLength(prec+1);
+		}
+	aExp=e;
+	return aTrg.Length();
+	}
+
+LOCAL_C TInt doExponent(TDes8* This, TDes8& aDigBuf, const TInt afDigLimSize, TInt aExp,
+	const TInt aNumPlcs, const TInt aNumSpace, const TText aPoint, const TUint flags)
+//
+// Convert the intermediate number represented in aDigBuf into its exponential representation
+// and place into aTrg.
+// This representation ensures that numbers are displayed to aNumDecPlcs+1 significant figures,
+// but this is NOT a constant value in KTRealFormatGeneral mode. 
+//
+// AnnW, November 1996 - changed to be able to take three-figure exponents if allowed by flags.
+// 
+	{
+
+	TInt err;
+	TInt expSpace;
+	TInt useSigFigs=flags & KUseSigFigs;
+	TInt nDig=(useSigFigs ? Min(aNumPlcs,afDigLimSize) : aNumPlcs+1);	
+	TInt threeDigitExp=flags & KAllowThreeDigitExp;
+
+	if ((flags & KNeedsRounding) && afDigLimSize>nDig)
+		aExp+=round(aDigBuf.Ptr()+1,nDig);	
+
+	if (useSigFigs)			// discard trailing zeros
+		{
+		while(nDig>1 && aDigBuf[nDig]=='0')
+			{
+			nDig--;
+			}
+		}
+	
+	if (aDigBuf[0]!='0')
+	// 100.5 is stored in aDigBuf as +1005 with and exp of 3, but it is to be displayed
+	// as 1.005 so exp must be decremented to 2
+		aExp--;
+
+	// Added by AnnW
+	if (threeDigitExp)
+		{
+		expSpace=(Abs(aExp)>=KMinThreeDigitExponent)?5:4;
+		}
+	else
+		{
+		err=(aExp<=-KMinThreeDigitExponent ? KErrUnderflow : (aExp>=KMinThreeDigitExponent ? KErrOverflow : KErrNone));
+		if (err!=KErrNone)
+			return(err);
+		expSpace=4;
+		}
+	
+	// Check that number will fit in aNumSpace
+	if (aNumSpace<(expSpace+nDig+(nDig>1?1:0)))
+	// exponent + significant figures + point(if necessary)
+		return(KErrGeneral);
+	// end of added
+
+	if (aDigBuf[0]=='0')  // number to be converted is 0
+		{
+		This->Append('0');
+		if (nDig>1 && !useSigFigs)
+			{
+			This->Append(aPoint);
+			This->AppendFill('0',aNumPlcs);
+			}
+		}
+	else
+		{
+		This->Append(TChar(aDigBuf[1]));
+		if (nDig>1)
+			{
+			This->Append(aPoint);
+			for (TInt ii=2; ii<=nDig; ii++)
+				{
+				if (!useSigFigs)
+					// pad with zeros
+					This->Append(TChar(ii<aDigBuf.Length() ? aDigBuf[ii]:'0'));
+				else
+					// do not pad with zeros
+					This->Append(TChar(aDigBuf[ii]));
+				}
+			}
+		}
+	
+	This->Append('E');
+	if (aExp<0) 
+		{
+		aExp=-aExp;
+		This->Append('-');
+		}
+	else
+		This->Append('+');
+
+	// Added by AnnW
+	TInt tempExp;
+	if (threeDigitExp && aExp>99)		
+		{								
+		This->Append(aExp/100+'0');
+		tempExp=aExp%100;
+		}								
+	else								
+		tempExp = aExp;				
+	// end of added
+
+	This->Append(tempExp/10+'0'); 
+	This->Append(tempExp%10+'0');
+	return(KErrNone);
+	}
+
+LOCAL_C TInt doFixed(TDes8 *This,TDes8 &aDigBuf,const TInt afDigLimSize,TInt aExp,const TInt aNumDecPlcs,
+				const TInt aNumSpace,const TRealFormat &aFormat,const TUint flags)
+//
+// Convert the intermediate number represented in aDigBuf into its fixed representation and
+// place into aTrg
+//
+// AnnW, November 1996 - changed to allow extra space to be left for potential sign, so that
+// positive and negative numbers of the same exponent are displayed to the same precision.
+//
+	{
+
+	TInt err;
+	TInt doNotUseTriads=flags & KDoNotUseTriads;
+	TInt newNumSpace=aNumSpace;
+	// To allow positive and negative numbers with the same exponent to	have the same number of 
+	// significant figures.
+	if ((flags & KExtraSpaceForSign) && (aDigBuf[0]!='-'))
+		newNumSpace--;
+
+	TInt roundOffset = aNumDecPlcs+aExp;
+	if (roundOffset>=0 && afDigLimSize>roundOffset && (flags & KNeedsRounding))
+		aExp+=round(aDigBuf.Ptr()+1,roundOffset);
+
+	if (newNumSpace<((aExp>0?aExp:1)+(aNumDecPlcs?aNumDecPlcs+1:0)+(!doNotUseTriads && aFormat.iTriLen && (aExp>(TInt)aFormat.iTriLen)?(aExp-1)/3:0)))
+	// exponent +ve and space < space needed for (digits before point + point + decimal places + triads)
+		{
+		err=(aExp>0 ? KErrOverflow : KErrGeneral);
+		return(err);
+		}
+
+	if (aExp<=0) // hence number is of the form 0.NNNN
+		{
+		This->Append('0');
+		if (aNumDecPlcs)
+			{
+			aExp=-aExp;
+			TInt nDig=aNumDecPlcs-aExp;	// number of digits required from aDigBuf
+			This->Append(aFormat.iPoint);
+			if (aExp>aNumDecPlcs)	 
+				aExp=aNumDecPlcs;
+			This->AppendFill('0',aExp);
+			if (nDig>0)	 
+				{
+				for (TInt ii=1; ii<nDig+1; ii++)
+					This->Append(TChar(ii<aDigBuf.Length() ? aDigBuf[ii]:'0'));
+				}
+			}
+		else	// no decimal places
+			{
+			if (aDigBuf[0]=='-')
+				{
+				This->Delete(0,2);	// delete -0 from This
+				This->Append('0');
+				}
+			}
+		}
+	else  // aExp > 0 hence number is of the form NNNN.NNNN
+		{
+		for (TInt jj=1,ii=aExp; ii; ii--,jj++)
+			{
+			if (!doNotUseTriads && aFormat.iTriLen && aExp>(TInt)aFormat.iTriLen && !(ii%3) && ii!=aExp)
+				This->Append(aFormat.iTriad);
+			This->Append(TChar(jj>=aDigBuf.Length() ? '0' : aDigBuf[jj]));
+			}
+		if (aNumDecPlcs>0)
+			{
+			This->Append(aFormat.iPoint);
+			for (TInt ii=aExp+1; ii<aNumDecPlcs+aExp+1; ii++)
+				This->Append(TChar(ii<aDigBuf.Length() ? aDigBuf[ii] : '0'));
+			}
+		}
+
+	return(KErrNone);
+	}
+
+LOCAL_C TInt doNoExponent(TDes8 *This, TDes8 &aDigBuf,const TInt afDigLimSize,TInt aExp,
+	const TInt aMaxSigFigs,const TInt aNumSpace, const TRealFormat &aFormat,const TUint flags)
+//
+// Added by AnnW, November 1996
+// Convert the intermediate number represented in aDigBuf into its no exponent representation
+// and place into aTrg
+// Changed April 1997 - If there is not enough space for the number of s.f., zeros, points, triads,
+// etc, then the number of significant figs is reduced to fit.  Overflow if too big to fit and 
+// underflow if no significance can be seen.
+//
+	{
+
+	TInt doNotUseTriads=flags & KDoNotUseTriads;
+	TInt numSpace=aNumSpace;
+	if ((flags & KExtraSpaceForSign) && (aDigBuf[0]!='-'))
+		numSpace--;
+
+	TInt nTriadSeps=(!doNotUseTriads && aFormat.iTriLen && (aExp>(TInt)aFormat.iTriLen))?(aExp-1)/3:0;
+	TInt maxDig=Min(aMaxSigFigs,afDigLimSize);
+	TInt maxSpace=numSpace-(aExp<=0?(2-aExp):((aExp<maxDig?1:aExp-maxDig)+nTriadSeps));
+	TInt nDig=Min(maxSpace,maxDig);
+	if (afDigLimSize>nDig && nDig<15 && nDig>=0 && (flags & KNeedsRounding) && round(aDigBuf.Ptr()+1,nDig)) 
+		aExp++;
+		
+	if (aDigBuf[0]=='0')	// do zero first (numSpace>=0 so OK)
+		This->Append('0');
+	else
+		{
+		// check for overflow/underflow
+		if ((aExp+nTriadSeps)>numSpace)
+			return(KErrOverflow);
+		if (nDig<=0)
+			return(KErrUnderflow);
+
+		if ((flags&(TUint)KRealFormatTypesMask)!=(TUint)KRealFormatCalculator && aExp>aMaxSigFigs)
+			return(KErrOverflow);
+		
+		TInt nDecPlcs=nDig-aExp;
+		while(nDecPlcs>0 && aDigBuf[nDig]=='0')
+			{ // discard trailing zeros (already done in calculator)
+			nDecPlcs--;
+			nDig--;
+			}
+		
+		if (aExp<=0) // hence number is of the form 0.NNNN
+			{
+			This->Append('0');
+			aExp=-aExp;
+			// if (nDecPlcs<=0) do nothing	
+			if (nDecPlcs>0)	 
+				{
+				This->Append(aFormat.iPoint);
+				This->AppendFill('0',aExp);
+				for (TInt ii=1; ii<=nDig; ii++)
+					This->Append(TChar(aDigBuf[ii]));
+				}
+			}
+		else  // aExp > 0 hence number is of the form NNNN.NNNN
+			{
+			for (TInt jj=1,ii=aExp; ii; ii--,jj++)
+				{
+				if (!doNotUseTriads && aFormat.iTriLen && aExp>(TInt)aFormat.iTriLen && !(ii%3) && ii!=aExp)
+					This->Append(aFormat.iTriad);
+				This->Append(TChar(jj<=nDig ? aDigBuf[jj] : '0'));
+				}
+			if (nDecPlcs>0)	
+				{
+				This->Append(aFormat.iPoint);
+				for (TInt ii=aExp+1; ii<=nDig; ii++)
+					This->Append(TChar(aDigBuf[ii]));	
+				}
+			}
+		}
+
+	return(KErrNone);
+	}
+
+LOCAL_C TInt doGeneral(TDes8 *This,TReal aSrc,TDes8 &aDigBuf,const TInt afDigLimSize,TInt aExp,
+			TInt aNumDecPlcs,const TInt aNumSpace,const TRealFormat &aFormat,TUint flags) __SOFTFP
+//
+// Convert the intermediate number represented in aDigBuf into either its fixed representation or
+// its exponential representation as appropriate and place the result in aTrg
+// 
+// Annw, November 1996 - changed to allow space for sign in fixed mode, three-figure exponent.
+	{
+
+	TBool rounded=((flags & KNeedsRounding)==0);
+	TInt nDig=aDigBuf.Length()-1;	 // no of digits without sign
+	TInt type;
+
+	// Set up tempNumSpace to allow for leaving one space free for +ve nos in fixed format
+	TInt fixedNumSpace=aNumSpace;
+	if ((flags & KExtraSpaceForSign) && (aDigBuf[0]!='-'))
+		fixedNumSpace--;
+	if (fixedNumSpace<=0)
+		return(KErrGeneral);
+
+	FOREVER
+		{
+		// If aNumSpace < 5 cannot use exponential format, i.e. not enough space for XE+NN.
+		// If the exponent >= -3 (i.e. aExp >= -2), it is always more (or equally) efficient
+		// to use non-exponential format for negative exponents, i.e. XE-03 takes same no of
+		// spaces as 0.00X, and for positive exponents use fixed form as far as possible. 
+		
+		// for Java do not used fixed format for exponents >=7  
+		// expMax=Min(fixedNumSpace,7)
+		// and replace "fixednumSpace" with "expMax" in next line
+
+		if (aNumSpace<5 || (aExp>=-2 && aExp<=fixedNumSpace))
+			{
+			type=KRealFormatFixed;
+
+			// if there is at least one digit before decimal point or no. is zero
+			if (aExp>0 || !aSrc)
+				{
+				if (nDig!=aExp)
+				// nDig is the number of digits which will be used
+				// a decimal point needed if exponent < digits in digbuf and numspace < nDig,
+				// so nDig is one less than otherwise
+				nDig=((nDig-aExp)>0 && fixedNumSpace>aExp)?Min(fixedNumSpace-1,nDig):Min(fixedNumSpace,nDig);
+				aNumDecPlcs=nDig-aExp;
+				}
+		 	else
+				{
+				// need space for "0." and to avoid white spaces
+				aNumDecPlcs=Min(fixedNumSpace-2,nDig-aExp); 
+				// need space for "0.0...0" before any digits used
+				nDig=aNumDecPlcs+aExp; 
+				if (nDig<0)
+					return KErrGeneral;
+				}
+			}
+		else
+			{
+			type=KRealFormatExponent;		// Do NOT use significant figures
+			// Need to allow space for exponent
+			TInt tempNumSpace=aNumSpace-4;	// 4 = E+NN
+			if ((flags & KAllowThreeDigitExp) && (Abs(aExp-1)>=100))
+				tempNumSpace--;				// 5 = E+NNN			
+			// if more than one digit available and enough digits to fill space, need to reduce
+			// number of digits to allow for '.'
+			if (((nDig=Min(tempNumSpace,nDig))>1) && nDig==tempNumSpace) 
+				nDig--; 
+			// in any case, aNumDecPlcs is one less that the number of digits,
+			// i.e. one digit before the point
+			aNumDecPlcs=nDig-1;
+			}
+		// if too many digbuf chars to fit then we need to round
+		// round() returns 1 if had to carry from msdigit
+		if ((afDigLimSize>nDig && !rounded) && ((rounded=round(aDigBuf.Ptr()+1,nDig))!=0))
+			aExp++;
+		else
+			break;
+		}		
+	while(aNumDecPlcs>0 && aDigBuf[nDig]=='0')
+		{ // discard trailing zeros
+		aNumDecPlcs--;
+		nDig--;
+		}	
+	flags=flags & ~KNeedsRounding;
+	
+	if (type==KRealFormatExponent)
+		return(doExponent(This,aDigBuf,afDigLimSize,aExp,aNumDecPlcs,aNumSpace,(TText)aFormat.iPoint,flags));
+	return(doFixed(This,aDigBuf,afDigLimSize,aExp,aNumDecPlcs,aNumSpace,aFormat,flags));
+	}
+
+ LOCAL_C TInt doCalculator(TDes8 *This,TDes8 &aDigBuf,const TInt afDigLimSize,TInt aExp,
+			TInt aMaxSigFigs,const TInt aMaxSpace,const TRealFormat &aFormat, TUint flags)
+//
+// Added by AnnW, November 1996
+// Convert the intermediate number represented in aDigBuf into either its no exponent or its 
+// exponential representation with a fixed number of significant figures and place the result 
+// in aTrg
+// 
+	{
+
+	TBool threeDigExp=((flags & KAllowThreeDigitExp)!=0);
+
+	// first check that enough space has been allowed for all the possible characters
+	// point + sign + all sig figs + exponent
+	if (aMaxSpace<(2+aMaxSigFigs+(threeDigExp?5:4)))
+		return(KErrGeneral);
+
+	// now discard trailing zeros
+	TInt nDig=afDigLimSize;
+	while(nDig>1 && aDigBuf[nDig]=='0')
+		{
+		nDig--;
+		}
+
+	TInt maxDig=Min(aMaxSigFigs,nDig);	// max digs available
+	TBool rounded=((flags & KNeedsRounding)==0);
+	TInt type;	
+	TBool useNoExp;
+
+	FOREVER
+		{
+		useNoExp=ETrue;
+		nDig=maxDig;
+		
+		// use no exponent for all numbers which will not use > aMaxSigFigs digits
+		if (aExp>aMaxSigFigs || (aExp<=0 && (1-aExp+nDig)>aMaxSigFigs))
+			useNoExp=EFalse;
+		
+		if (useNoExp)
+			type=KRealFormatNoExponent;
+		else
+			{
+			type=KRealFormatExponent;
+			threeDigExp=((Abs(aExp-1)>=KMinThreeDigitExponent && threeDigExp)!=0);
+			TInt temp=aMaxSpace-(threeDigExp?5:4);
+			nDig=Min(maxDig,temp-((temp>1 && maxDig>1)?1:0));
+			}
+			
+		// if too many digbuf chars to fit then we need to round
+		// round() returns 1 if had to carry from msdigit
+		if ((afDigLimSize>nDig && !rounded) && ((rounded=round(aDigBuf.Ptr()+1,nDig))!=0))
+			{
+			aExp++;
+			maxDig=1;
+			}
+		else
+			break;
+		}
+ 
+	TInt numSpace=aMaxSpace-(aDigBuf[0]=='-'?1:0);
+	flags=flags & ~KNeedsRounding;
+
+	if (type==KRealFormatExponent)
+		return(doExponent(This,aDigBuf,afDigLimSize,aExp,nDig,numSpace,(TText)aFormat.iPoint,flags));
+	else
+		{
+		flags|=KExtraSpaceForSign;
+		return(doNoExponent(This,aDigBuf,afDigLimSize,aExp,nDig,numSpace,aFormat,flags));
+		}
+	}
+
+TInt ProcessErrors(TDes8* aDes, TInt anError)
+	{
+	if (anError==KErrNone)
+		return aDes->Length();
+	if (anError==KErrUnderflow)
+		aDes->Append(TChar('0'));
+	if (anError==KErrOverflow)
+		aDes->Append(KLit8Inf());
+	if (anError==KErrArgument)
+		aDes->Append(KLit8Nan());
+	return anError;
+	}
+
+LOCAL_C TInt rtob(TDes8 *This,TReal aVal,const TRealFormat &aFormat) __SOFTFP
+//
+// Converts the real at aSrc. Returns the length of the converted string or an error number
+// if the buffer is too small, the number is out of range or there is insufficient KMaxPrecision
+// to represent the number.
+//
+// The conversion format is interpreted as follows:
+// KRealFormatFixed - ndec decimal places (including zero), negative values with a leading minus 
+// sign, triad separators are available and a space may be left in front of positive numbers to 
+// allow negative positve numbers to be given to the same precision.
+// KRealFormatExponent - exponent notation specifying either decimal places or significant
+// figures in the mantissa and a signed exponent given to a maximum of two or three digits,
+// and no triad separator.
+// KTRealFormatGeneral - converts either as fixed or exponent to make best use of the available
+// width. The number of decimal spaces is chosen automatically as a function of width
+// (ndec is ignored),  no triad.
+// KRealFormatNoExponent - as KRealForamtFixed, but specifying maximum significant figures and
+// not introducing trailing zeros.
+// KRealFormatCalculator - as KRealFormatGeneral, but behaves as a conventional calculator. A
+// maximum number of significant figures is specified and the number is displayed without an
+// exponent whenever possible, with no trailing zeros and no triads.
+// 
+// If an error value other than KErrGeneral is returned the real is converted to some string:
+// "+/-Inf" if the error is KErrOverflow, "NaN" if the error is KErrArgument or "0" if it is 
+// KErrUnderflow.
+//
+	{
+	if (aFormat.iWidth>This->MaxLength())
+		return(KErrGeneral);	 
+	TBuf8<0x20> digbuf;
+	TInt exp=0;
+	TInt numspace=aFormat.iWidth;
+	TInt maxspace=numspace;
+	TInt ret=fDigLim(digbuf,aVal,exp,((aFormat.iType & KGeneralLimit)!=0)); 
+	digbuf.ZeroTerminate();
+	TInt type, flags;
+
+	if (digbuf[0]=='0')
+		exp=0;
+	else 
+		{
+		if (digbuf[0]=='-' && ret!=KErrArgument)	// NaN has no sign
+			{
+			This->Append('-');
+			numspace--;
+			}
+		if (ret<0)
+			return ProcessErrors(This, ret);
+		else
+			ret--;
+		}
+
+	//Added by AnnW
+	if (numspace<=0)
+		return(KErrGeneral);
+	if (aFormat.iType & ~KRealFormatTypesMask & ~KRealFormatTypeFlagsMask)
+		return(KErrGeneral);
+	type=aFormat.iType & KRealFormatTypesMask;
+	flags=((aFormat.iType & KRealFormatTypeFlagsMask)| KNeedsRounding);
+	// end of added
+
+	switch(type)
+		{
+	case KRealFormatFixed:
+		flags=flags & ~KUseSigFigs;	// if flag is NOT set and iTriLen!=0, uses triads
+		ret=doFixed(This,digbuf,ret,exp,aFormat.iPlaces,numspace,aFormat,flags);
+		break;
+	case KRealFormatExponent:
+		ret=doExponent(This,digbuf,ret,exp,aFormat.iPlaces,numspace,(TText)aFormat.iPoint,flags);
+		break;
+	case KRealFormatGeneral:
+		flags=(flags & ~KUseSigFigs) | KDoNotUseTriads;
+		ret=doGeneral(This,aVal,digbuf,ret,exp,aFormat.iPlaces,numspace,aFormat,flags);
+		break;
+	case KRealFormatNoExponent:
+		flags=flags | KUseSigFigs;	// if flag is NOT set and iTriLen!=0, uses triads	
+		ret=doNoExponent(This,digbuf,ret,exp,aFormat.iPlaces,numspace,aFormat,flags);
+		break;
+	case KRealFormatCalculator:
+		flags=(flags | KUseSigFigs) | KDoNotUseTriads | KRealFormatCalculator;
+		ret=doCalculator(This,digbuf,ret,exp,aFormat.iPlaces,maxspace,aFormat,flags);
+		break;
+	default:
+		return(KErrGeneral);
+		}
+	return ProcessErrors(This, ret);
+	}
+
+
+
+	  
+EXPORT_C TRealFormat::TRealFormat()
+/**
+Default constructor.
+
+The public data members of the constructed object are assigned
+the following values:
+
+TRealFormat::iType   - set to KRealFormatGeneral
+
+TRealFormat::iWidth  - set to KDefaultRealWidth
+
+TRealFormat::iPlaces - set to 0
+
+TRealFormat::iPoint  - set to the decimal separator character defined in
+                       a TLocale object and returned by the DecimalSeparator()
+                       member function of that class.
+
+TRealFormat::iTriad  - set to the character used to delimit groups of three
+                       digits in the integer portion of a number; the character
+                       is defined in a TLocale object and returned by the
+                       ThousandsSeparator() member function of that class.
+
+TRealFormat::iTriLen - set to 1
+
+@see TLocale::DecimalSeparator
+@see TLocale::ThousandsSeparator
+*/
+	{
+
+	iType=KRealFormatGeneral;
+	iWidth=KDefaultRealWidth;
+	iPlaces=0;
+	TLocale locale;
+	iPoint=locale.DecimalSeparator();
+	iTriad=locale.ThousandsSeparator();
+	iTriLen=1;
+	}
+
+
+
+
+EXPORT_C TRealFormat::TRealFormat(TInt aWidth)
+/**
+Constructs the object taking the width of the character representation.
+
+The remaining public data members of the constructed object are assigned
+the following values:
+
+TRealFormat::iType   - set to KRealFormatGeneral
+
+TRealFormat::iWidth  - set to the aWidth argument
+
+TRealFormat::iPlaces - set to 0
+
+TRealFormat::iPoint  - set to the decimal separator character defined in
+                       a TLocale object and returned by the DecimalSeparator()
+                       member function of that class.
+
+TRealFormat::iTriad  - set to the character used to delimit groups of three
+                       digits in the integer portion of a number; the character
+                       is defined in a TLocale object and returned by the
+                       ThousandsSeparator() member function of that class.
+
+TRealFormat::iTriLen - set to 1
+
+@param aWidth The width of the character representation of the real number.
+
+@see TLocale::DecimalSeparator
+@see TLocale::ThousandsSeparator
+*/
+	{
+
+	iType=KRealFormatGeneral;
+	iWidth=aWidth;
+	iPlaces=0;
+	TLocale locale;
+	iPoint=locale.DecimalSeparator();
+	iTriad=locale.ThousandsSeparator();
+	iTriLen=1;
+	}
+
+
+
+
+EXPORT_C TRealFormat::TRealFormat(TInt aWidth,TInt aDecimals)
+/**
+Constructs the object taking the width of the character representation
+and a value which is interpreted as the number of digits to follow
+the decimal point.
+
+The remaining public data members of the constructed object are assigned
+the following values:
+
+TRealFormat::iType   - set to KRealFormatFixed
+
+TRealFormat::iWidth  - set to the aWidth argument
+
+TRealFormat::iPlaces - set to the aDecimals argument
+
+TRealFormat::iPoint  - set to the decimal separator character defined in
+                       a TLocale object and returned by the DecimalSeparator()
+                       member function of that class.
+
+TRealFormat::iTriad  - set to the character used to delimit groups of three
+                       digits in the integer portion of a number; the character
+                       is defined in a TLocale object and returned by the
+                       ThousandsSeparator() member function of that class.
+
+TRealFormat::iTriLen - set to 1
+
+Note that if the iType data member is changed after construction, aDecimalPlaces
+may be interpreted as the number of significant digits. For more information,
+see KRealFormatFixed and the other format types, and KExtraSpaceForSign and the
+other format flags.
+
+@param aWidth    The width of the character representation of the real number.
+@param aDecimals The number of digits to follow the decimal point.
+
+@see TLocale::DecimalSeparator() 
+@see TLocale::ThousandsSeparator() 
+@see KRealFormatFixed 
+@see KExtraSpaceForSign 
+*/
+	{
+
+	iType=KRealFormatFixed;
+	iWidth=aWidth;
+	iPlaces=aDecimals;
+	TLocale locale;
+	iPoint=locale.DecimalSeparator();
+	iTriad=locale.ThousandsSeparator();
+	iTriLen=1;
+	}
+
+
+
+					
+EXPORT_C TInt Math::Round(TReal &aTrg,const TReal &aSrc,TInt aDecimalPlaces)
+/**
+Rounds to a specified number of decimal places.
+
+The function rounds a number to a given number, n, of decimal places.
+Rounding may be thought of as multiplying the number by 10 to the power of n,
+rounding to the nearest integer, and then dividing the result by 10 to
+the power of n and returning that as the answer.
+
+In the process of rounding, numbers ending with .5 are rounded away from zero,
+so that 1.5 becomes 2, 2.5 becomes 3, -1.5 becomes -2, etc.
+
+@param aTrg           A reference containing the result. 
+@param aSrc           The number to be rounded. 
+@param aDecimalPlaces The number of decimal places to round to: must be
+                      zero or positive.
+
+@return KErrNone if successful, otherwise another of the system-wide error codes. 
+*/
+	{
+
+	if (aSrc==0.0)
+		{
+		aTrg=aSrc;
+		return(KErrNone);
+		}
+	TInt ret,exp;
+	TBuf8<0x20> rbuf;
+	if ((ret=fDigLim(rbuf,aSrc,exp,EFalse))<0) 
+		return(ret);
+	if ((exp+aDecimalPlaces)<0)
+		{ // Number too small to be rounded
+		aTrg=0;
+		return(KErrNone);
+		}    
+	if ((ret-2)<(exp+aDecimalPlaces))	//ret is the string length, including prefixed +/-		
+		{ // Rounding will have no effect
+		aTrg=aSrc;
+		return(KErrNone);
+		}       
+	if ((ret=round(rbuf.Ptr()+1,exp+aDecimalPlaces))!=KErrNone)
+		exp++;
+ 	rbuf.Insert(1,TPtrC8((TText8*)".",1));
+	rbuf.SetLength(exp+aDecimalPlaces+2);
+	if (!(exp+aDecimalPlaces))
+		rbuf.Append('0');
+//	rbuf.AppendFormat(TPtrC8((TText8*)"%c%d",4),'E',exp);
+	rbuf.Append(TChar('E'));
+	rbuf.AppendNum(exp);
+	return(((TLex8)rbuf).Val(aTrg,(TChar)'.'));
+	}        
+
+EXPORT_C TInt TDes8::Num(TReal aVal,const TRealFormat &aFormat) __SOFTFP
+/**
+Converts the specified floating point number into a character representation 
+and copies the conversion into this descriptor, replacing any existing data.
+
+The length of this descriptor is set to reflect the new data.
+	
+The character representation of the real number is dictated by the specified 
+format.
+
+Note that the function leaves if the iType data member of the specified
+TRealFormat object has both an invalid character representation format
+(i.e. the format type) and invalid format flags.	        
+
+@param aVal    The floating point number to be converted. 
+@param aFormat The format of the conversion. 
+
+@return If the conversion is successful, the length of this descriptor. If 
+        the conversion fails, a negative value indicating the cause of failure.
+        In addition, extra information on the cause of the failure may be
+        appended onto this descriptor. The possible values and their meaning
+        are:
+        
+        1.KErrArgument - the supplied floating point number is not a valid
+          number. The three characters NaN are appended to this descriptor.
+          
+        2.KErrOverflow - the number is too large to represent.
+        2.1 For positive overflow, the three characters Inf are appended 
+            to this descriptor.
+        2.2 For negative overflow, the four characters -Inf are appended 
+	        to this descriptor.
+	        
+	    3.KErrUnderflow - the number is too small to represent.
+	    3.1 For positive underflow, the three characters Inf are appended
+	        to this descriptor. 
+        3.2	For negative underflow, the four characters -Inf are appended
+            to this descriptor. 
+	    
+	    4.KErrGeneral - the conversion cannot be completed. There are a
+	      number of possible reasons for this, but the two most common
+	      are:
+	    4.1 the maximum number of characters necessary to represent the number,
+	        as defined in the TRealFormat object, is greater than the maximum
+	        length of this descriptor
+	    4.2 the character representation format (i.e. the format type), as
+	        defined in the TRealFormat object is not recognised.
+	        
+@see TRealFormat::iType
+*/
+	{
+
+	Zero();
+	return(rtob(this,aVal,aFormat));
+	}
+
+EXPORT_C TInt TDes8::AppendNum(TReal aVal,const TRealFormat &aFormat) __SOFTFP
+/**
+Converts the specified floating point number into a character representation 
+and appends the conversion onto the end of this descriptor's data.
+
+The length of this descriptor is incremented to reflect the new content.
+	
+The character representation of the real number is dictated by the specified 
+format.
+	
+@param aVal    The floating point number to be converted. 
+@param aFormat The format of the conversion. 
+
+@return If the conversion is successful, the length of this descriptor. If 
+        the conversion fails, a negative value indicating the cause of failure.
+        In addition, extra information on the cause of the failure may be
+        appended onto this descriptor. The possible values and their meaning
+        are:
+        
+        1.KErrArgument - the supplied floating point number is not a valid
+          number. The three characters NaN are appended to this descriptor.
+          
+        2.KErrOverflow - the number is too large to represent.
+        2.1 For positive overflow, the three characters Inf are appended 
+            to this descriptor.
+        2.2 For negative overflow, the four characters -Inf are appended 
+	        to this descriptor.
+	        
+	    3.KErrUnderflow - the number is too small to represent.
+	    3.1 For positive underflow, the three characters Inf are appended
+	        to this descriptor. 
+        3.2	For negative underflow, the four characters -Inf are appended
+            to this descriptor. 
+	    
+	    4.KErrGeneral - the conversion cannot be completed. There are a
+	      number of possible reasons for this, but the two most common
+	      are:
+	    4.1 the maximum number of characters necessary to represent the number,
+	        as defined in the TRealFormat object, is greater than the maximum
+	        length of this descriptor
+	    4.2 the character representation format (i.e. the format type), as
+	        defined in the TRealFormat object is not recognised
+*/
+	{
+
+	return(rtob(this,aVal,aFormat));
+	}
+
+EXPORT_C TInt TDes16::Num(TReal aVal,const TRealFormat &aFormat) __SOFTFP
+/**
+Converts the specified floating point number into a character representation 
+and copies the conversion into this descriptor, replacing any existing data.
+
+The length of this descriptor is set to reflect the new data.
+	
+The character representation of the real number is dictated by the specified 
+format.
+
+Note that the function leaves if the iType data member of the specified
+TRealFormat object has both an invalid character representation format
+(i.e. the format type) and invalid format flags.	        
+
+@param aVal    The floating point number to be converted. 
+@param aFormat The format of the conversion. 
+
+@return If the conversion is successful, the length of this descriptor. If 
+        the conversion fails, a negative value indicating the cause of failure.
+        In addition, extra information on the cause of the failure may be
+        appended onto this descriptor. The possible values and their meaning
+        are:
+        
+        1.KErrArgument - the supplied floating point number is not a valid
+          number. The three characters NaN are appended to this descriptor.
+          
+        2.KErrOverflow - the number is too large to represent.
+        2.1 For positive overflow, the three characters Inf are appended 
+            to this descriptor.
+        2.2 For negative overflow, the four characters -Inf are appended 
+	        to this descriptor.
+	        
+	    3.KErrUnderflow - the number is too small to represent.
+	    3.1 For positive underflow, the three characters Inf are appended
+	        to this descriptor. 
+        3.2	For negative underflow, the four characters -Inf are appended
+            to this descriptor. 
+	    
+	    4.KErrGeneral - the conversion cannot be completed. There are a
+	      number of possible reasons for this, but the two most common
+	      are:
+	    4.1 the maximum number of characters necessary to represent the number,
+	        as defined in the TRealFormat object, is greater than the maximum
+	        length of this descriptor
+	    4.2 the character representation format (i.e. the format type), as
+	        defined in the TRealFormat object is not recognised.
+	        
+@see TRealFormat::iType
+*/
+	{
+
+	Zero();
+	return (AppendNum(aVal,aFormat));
+	}
+
+EXPORT_C TInt TDes16::AppendNum(TReal aVal,const TRealFormat &aFormat) __SOFTFP
+/**
+Converts the specified floating point number into a character representation 
+and appends the conversion onto the end of this descriptor's data.
+
+The length of this descriptor is incremented to reflect the new content.
+	
+The character representation of the real number is dictated by the specified 
+format.
+	
+@param aVal    The floating point number to be converted. 
+@param aFormat The format of the conversion. 
+
+@return If the conversion is successful, the length of this descriptor. If 
+        the conversion fails, a negative value indicating the cause of failure.
+        In addition, extra information on the cause of the failure may be
+        appended onto this descriptor. The possible values and their meaning
+        are:
+        
+        1.KErrArgument - the supplied floating point number is not a valid
+          number. The three characters NaN are appended to this descriptor.
+          
+        2.KErrOverflow - the number is too large to represent.
+        2.1 For positive overflow, the three characters Inf are appended 
+            to this descriptor.
+        2.2 For negative overflow, the four characters -Inf are appended 
+	        to this descriptor.
+	        
+	    3.KErrUnderflow - the number is too small to represent.
+	    3.1 For positive underflow, the three characters Inf are appended
+	        to this descriptor. 
+        3.2	For negative underflow, the four characters -Inf are appended
+            to this descriptor. 
+	    
+	    4.KErrGeneral - the conversion cannot be completed. There are a
+	      number of possible reasons for this, but the two most common
+	      are:
+	    4.1 the maximum number of characters necessary to represent the number,
+	        as defined in the TRealFormat object, is greater than the maximum
+	        length of this descriptor
+	    4.2 the character representation format (i.e. the format type), as
+	        defined in the TRealFormat object is not recognised
+*/
+	{
+
+	HBufC8 *temp=HBufC8::New(MaxLength());
+	if (temp==NULL)
+		return(KErrNoMemory);
+	TPtr8 p(temp->Des());
+	TInt ret=rtob(&p,aVal,aFormat);
+	const TText8 *pTemp=temp->Ptr();
+	for (TInt ii=temp->Length();ii>0;ii--)
+		Append(*pTemp++);
+	if (ret>0)
+		ret=Length();
+	User::Free(temp);
+	return (ret);
+	}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32/euser/maths/um_sin.cpp	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,190 @@
+// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32\euser\maths\um_sin.cpp
+// Floating point sine and cosine functions
+// 
+//
+
+#include "um_std.h"
+
+#if defined(__USE_VFP_MATH) && !defined(__CPU_HAS_VFP)
+#error	__USE_VFP_MATH was defined but not __CPU_HAS_VFP - impossible combination, check variant.mmh 
+#endif
+
+
+#ifndef __USE_VFP_MATH
+
+LOCAL_D const TUint32 SinCoeffs[] =
+	{
+	0x2168C235,0xC90FDAA2,0x80000000,	// polynomial approximation to sin(pi*x)
+	0x2DF200BF,0xA55DE731,0x80010001,	// for |x| <= 0.25
+	0xAC273AA1,0xA335E33B,0x80000000,
+	0x5AB23F44,0x99696671,0x7FFE0001,
+	0xD585EAFE,0xA83C17D9,0x7FFB0000,
+	0xA30DE7AD,0xF1802BAC,0x7FF70001,
+	0xF57FD821,0xF1F6A1C9,0x7FF30000
+	};
+
+LOCAL_D const TUint32 CosCoeffs[] =
+	{
+	0x00000000,0x80000000,0x7FFF0000,	// polynomial approximation to cos(pi*x)
+	0xF22EF286,0x9DE9E64D,0x80010001,	// for |x| <= 0.25
+	0xDAD59F90,0x81E0F840,0x80010000,
+	0xE4E45144,0xAAE9E3F1,0x7FFF0001,
+	0x3232D733,0xF0FA8342,0x7FFC0000,
+	0x03E16BB8,0xD368F6A3,0x7FF90001,
+	0x712FD084,0xFCE66DE2,0x7FF50000,
+	0x9E5353EE,0xD94951B0,0x7FF10001
+	};
+
+LOCAL_D const TUint32 PiInvdata[] = {0x4E44152A,0xA2F9836E,0x7FFD0000};			// 1/pi
+LOCAL_D const TUint32 Halfdata[] = {0x00000000,0x80000000,0x7FFE0000};			// 0.5
+LOCAL_D const TUint32 Onedata[] = {0x00000000,0x80000000,0x7FFF0000};			// 1.0
+
+LOCAL_C TInt CalcSinCos(TReal& aTrg, TRealX& aSrc, TBool aCos)
+	{
+	// Calculate sin(aSrc) if aCos=false or cos(aSrc) if aCos=true
+	// and write result to aTrg.
+	// Algorithm:
+	//		Divide aSrc by pi and throw away integer part, but change sign
+	//			of result if integer part odd. Replace aSrc with remainder.
+	//			( use identities	sin(x+n*pi)=(-1)^n*sin(x)
+	//								cos(x+n*pi)=(-1)^n*cos(x) )
+	//		If aSrc>=0.5 replace aSrc with 1-aSrc, and change sign of result
+	//			if cos required.
+	//			( use identities sin(pi-x)=sin(x), cos(pi-x)=-cos(x) )
+	//		If aSrc>=0.25 replace aSrc with 0.5-aSrc and swap sin and cos
+	//			( use identities sin(pi/2-x)=cos(x), cos(pi/2-x)=sin(x) )
+	//		Use polynomial approximation to evaluate sin(pi*x) or cos(pi*x)
+	//		for |x|<=0.25
+
+	const TRealX& One = *(const TRealX*)Onedata;
+	const TRealX& Half = *(const TRealX*)Halfdata;
+	const TRealX& PiInv = *(const TRealX*)PiInvdata;
+
+	TRealX y;
+	aSrc*=PiInv;
+	TInt n=(TInt)aSrc;
+	if (n<KMaxTInt && n>KMinTInt)
+		{
+		aSrc-=TRealX(n);
+		TInt sign=0;
+		if (!aCos)
+			sign=aSrc.iSign & 1;
+		sign^=n;
+		aSrc.iSign=0;
+		if (aSrc.iExp>=0x7FFE)			// if remainder>=pi/2
+			{
+			aSrc=One-aSrc;
+			if (aCos)
+				sign^=1;
+			}
+		if (aSrc.iExp>=0x7FFD)			// if remainder>=pi/4
+			{
+			aSrc=Half-aSrc;				// take complementary angle
+			aCos=!aCos;					// and swap sin and cos
+			}
+		if (aCos)
+			Math::PolyX(y,aSrc*aSrc,7,(const TRealX*)CosCoeffs);
+		else
+			{
+			Math::PolyX(y,aSrc*aSrc,6,(const TRealX*)SinCoeffs);
+			y*=aSrc;
+			}
+		if (sign & 1)
+			y=-y;
+		return y.GetTReal(aTrg);
+		}
+	return KErrArgument;
+	}
+
+
+
+
+EXPORT_C TInt Math::Sin(TReal& aTrg, const TReal& aSrc)
+/**
+Calculates the sine of a number.
+
+@param aTrg A reference containing the result. 
+@param aSrc The argument of the sin function in radians.
+
+@return KErrNone if successful, otherwise another of
+        the system-wide error codes.
+*/
+	{
+	TRealX x;
+	TInt r=x.Set(aSrc);
+	if (r==KErrNone)
+		r=CalcSinCos(aTrg,x,EFalse);
+	if (r==KErrNone)
+		return r;
+	SetNaN(aTrg);
+	return KErrArgument;
+	}
+
+
+
+
+EXPORT_C TInt Math::Cos(TReal& aTrg, const TReal& aSrc)
+/**
+Calculates the cosine of a number.
+
+@param aTrg A reference containing the result. 
+@param aSrc The argument of the cos function in radians
+
+@return KErrNone if successful, otherwise another of
+        the system-wide error codes.
+*/
+	{
+	TRealX x;
+	TInt r=x.Set(aSrc);
+	if (r==KErrNone)
+		r=CalcSinCos(aTrg,x,ETrue);
+	if (r==KErrNone)
+		return r;
+	SetNaN(aTrg);
+	return KErrArgument;
+	}
+
+#else // __USE_VFP_MATH
+
+// definitions come from RVCT math library
+extern "C" TReal sin(TReal);
+extern "C" TReal cos(TReal);
+
+EXPORT_C TInt Math::Sin(TReal& aTrg, const TReal& aSrc)
+	{
+	if (aSrc<KMaxTInt && aSrc>KMinTInt)
+		{
+		aTrg = sin(aSrc);
+		if (Math::IsFinite(aTrg))
+			return KErrNone;
+		}
+	SetNaN(aTrg);
+	return KErrArgument;
+	}
+
+EXPORT_C TInt Math::Cos(TReal& aTrg, const TReal& aSrc)
+	{
+	if (aSrc<KMaxTInt && aSrc>KMinTInt)
+		{
+		aTrg = cos(aSrc);
+		if (Math::IsFinite(aTrg))
+			return KErrNone;
+		}
+	SetNaN(aTrg);
+	return KErrArgument;
+	}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32/euser/maths/um_spec.cpp	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,159 @@
+// Copyright (c) 1997-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32\euser\maths\um_spec.cpp
+// Functions to check for  and set special values
+// 
+//
+//
+
+
+#include "um_std.h"
+
+
+
+
+#ifndef __REALS_MACHINE_CODED__
+EXPORT_C TBool Math::IsZero(const TReal &aVal)
+/**
+Determines whether a value is zero.
+
+@param aVal A reference to the value to be checked.
+
+@return True, if aVal is zero; false, otherwise.
+*/
+	{
+
+	SReal64 *pS=(SReal64 *)&aVal;
+
+	if (pS->msm==0U && pS->lsm==0U && pS->exp==(unsigned)KTReal64ZeroExponent)
+		return TRUE;
+	else
+		return FALSE;
+	}
+
+
+
+
+EXPORT_C TBool Math::IsNaN(const TReal &aVal)
+/**
+Determines whether a value is not a number.
+
+@param aVal A reference to the value to be checked.
+
+@return True, if aVal is not a number; false, otherwise.
+*/
+	{
+
+	SReal64 *pS=(SReal64 *)&aVal;
+
+	if (pS->exp==(unsigned)KTReal64SpecialExponent && (pS->msm|pS->lsm)!= 0U)
+		return TRUE;
+	else
+		return FALSE;
+	}
+
+
+
+
+EXPORT_C TBool Math::IsInfinite(const TReal &aVal)
+/**
+Determines whether a value is infinite.
+
+@param aVal A reference to the value to be checked.
+
+@return True, if aVal is infinite; false, otherwise.
+*/
+	{
+
+	SReal64 *pS=(SReal64 *)&aVal;
+
+	if (pS->msm==0U && pS->lsm==0U && pS->exp==(unsigned)KTReal64SpecialExponent)
+		return TRUE;
+	else
+		return FALSE;
+	}
+
+
+
+
+EXPORT_C TBool Math::IsFinite(const TReal &aVal)
+/**
+Determines whether a value is finite.
+
+In this context, a value is finite if it is a valid number and
+is not infinite.
+
+@param aVal A reference to the value to be checked.
+
+@return True, if aVal is finite; false, otherwise.
+*/
+	{
+
+	SReal64 *pS=(SReal64 *)&aVal;
+
+	if (pS->exp!=(unsigned)KTReal64SpecialExponent)
+		return TRUE;
+	else
+		return FALSE;
+	}
+
+
+
+
+EXPORT_C void Math::SetZero(TReal &aVal,TInt aSign)
+//
+// Constructs zeros, assuming default sign is positive
+//
+	{
+
+	SReal64 *pS=(SReal64 *)&aVal;
+	pS->sign=aSign;
+	pS->exp=KTReal64ZeroExponent;
+	pS->msm=0;
+	pS->lsm=0;
+	}
+
+
+
+
+EXPORT_C void Math::SetNaN(TReal &aVal)
+//
+// Constructs NaN (+ve sign for Java)
+//
+	{
+
+	SReal64 *pS=(SReal64 *)&aVal;
+	pS->sign=0;
+	pS->exp=KTReal64SpecialExponent;
+	pS->msm=0xfffffu;
+	pS->lsm=0xffffffffu;
+	}
+
+
+
+
+EXPORT_C void Math::SetInfinite(TReal &aVal,TInt aSign)
+//
+// Constructs infinities
+//
+	{
+
+	SReal64 *pS=(SReal64 *)&aVal;
+	pS->sign=aSign;
+	pS->exp=KTReal64SpecialExponent;
+	pS->msm=0;
+	pS->lsm=0;
+	}
+#endif
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32/euser/maths/um_sqrt.cpp	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,90 @@
+// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32\euser\maths\um_sqrt.cpp
+// Square root.
+// 
+//
+
+#include "um_std.h"
+
+#if defined(__USE_VFP_MATH) && !defined(__CPU_HAS_VFP)
+#error	__USE_VFP_MATH was defined but not __CPU_HAS_VFP - impossible combination, check variant.mmh 
+#endif
+
+
+#ifndef __USE_VFP_MATH
+
+#ifndef __REALS_MACHINE_CODED__
+LOCAL_D const TUint32 KConstAdata[] = {0x00000000,0xD5A9A805,0x7FFD0000};
+LOCAL_D const TUint32 KConstBdata[] = {0x00000000,0x9714B9CB,0x7FFE0000};
+LOCAL_D const TUint32 Sqr2Invdata[] = {0xF9DE6484,0xB504F333,0x7FFE0000};		// 1/sqr2
+
+
+
+
+EXPORT_C TInt Math::Sqrt(TReal& aTrg,const TReal &aSrc)
+/**
+Calculates the square root of a number.
+
+@param aTrg A reference containing the result. 
+@param aSrc The number whose square-root is required.
+
+@return KErrNone if successful, otherwise another of
+        the system-wide error codes. 
+*/
+//
+// Fast sqrt routine. See Software manual by W.J.Cody & W.Waite Chapter 4.
+//
+	{
+	const TRealX& KConstA=*(const TRealX*)KConstAdata;
+	const TRealX& KConstB=*(const TRealX*)KConstBdata;
+	const TRealX& Sqr2Inv=*(const TRealX*)Sqr2Invdata;
+
+	TRealX x;
+	TInt r=x.Set(aSrc);
+	if (x.IsZero())
+		{
+		aTrg=aSrc;
+		return(KErrNone);
+		}   
+	if (r==KErrArgument || x.iSign&1)
+		{
+		SetNaN(aTrg);
+		return(KErrArgument);
+		}
+	if (r==KErrOverflow)	// positive infinity
+		{
+		aTrg=aSrc;
+		return(r);
+		}
+	TInt n=x.iExp-0x7FFE;
+	x.iExp=0x7FFE;
+	TRealX y=KConstB*x+KConstA;
+	y=y+(x/y);
+	y.iExp--;
+	y=y+(x/y);
+	y.iExp--;
+	y=y+(x/y);
+	y.iExp--;
+	if (n&1)
+		{
+		y*=Sqr2Inv;
+		n++;
+		}
+	y.iExp=TUint16(TInt(y.iExp)+(n>>1));
+	return y.GetTReal(aTrg);
+	}
+#endif
+
+#endif // !__USE_VFP_MATH - VFP version is in assembler
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32/euser/maths/um_std.h	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,60 @@
+// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32\euser\maths\um_std.h
+// 
+//
+
+#include <e32std.h>
+#include <e32math.h>
+#include <u32exec.h>
+
+struct SReal32
+    {
+    unsigned man:23;
+    unsigned exp:8;
+    unsigned sign:1;
+    };
+
+#if defined(__DOUBLE_WORDS_SWAPPED__)
+struct SReal64
+    {
+    unsigned msm:20;
+    unsigned exp:11;
+    unsigned sign:1;
+    TUint lsm;
+    };
+#define DVAL(m0,m1,m2,m3,e)     {(TUint)((m0<<16)|m1),e+KExponentBias,0,(TUint)((m2<<16)|m3)}
+#else
+struct SReal64
+    {
+    TUint lsm;
+    unsigned msm:20;
+    unsigned exp:11;
+    unsigned sign:1;
+    };
+#define DVAL(m0,m1,m2,m3,e)     {(TUint)((m2<<16)|m3),(TUint)((m0<<16)|m1),e+KExponentBias,0}
+#endif
+
+enum TMathPanic
+    {
+	EMathDivideByZero,
+	EMathOverflow,
+	EMathUnderflow,
+	EMathBadOperand,
+    EMathUnknownError,
+	EMathUnexpectedError1
+    };
+
+GLREF_C void Panic(TMathPanic aPanic);
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32/euser/maths/um_tan.cpp	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,132 @@
+// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32\euser\maths\um_tan.cpp
+// Tangent.
+// 
+//
+
+#include "um_std.h"
+
+#if defined(__USE_VFP_MATH) && !defined(__CPU_HAS_VFP)
+#error	__USE_VFP_MATH was defined but not __CPU_HAS_VFP - impossible combination, check variant.mmh 
+#endif
+
+
+#ifndef __USE_VFP_MATH
+
+LOCAL_D const TUint32 TanCoeffs[] =
+	{
+	0x2168C235,0xC90FDAA2,0x7FFF0000,	// polynomial approximation to tan((pi/2)*x)
+	0x2DF4707D,0xA55DE731,0x7FFF0000,	// for |x|<=0.25
+	0xA9A1A71A,0xA335E33B,0x7FFF0000,
+	0x0BB9E431,0xA2FFFCDD,0x7FFF0000,
+	0x3E523A39,0xA2FA3863,0x7FFF0000,
+	0x8A35C401,0xA2F9D38B,0x7FFF0000,
+	0x91269411,0xA2F16003,0x7FFF0000,
+	0xDA32CC78,0xA3A93B13,0x7FFF0000,
+	0x4FB88317,0x9A146197,0x7FFF0000,
+	0x0D787ECE,0xE131DEE5,0x7FFF0000
+	};
+
+LOCAL_D const TUint32 Onedata[] = {0x00000000,0x80000000,0x7FFF0000};		// 1.0
+LOCAL_D const TUint32 Halfdata[] = {0x00000000,0x80000000,0x7FFE0000};		// 0.5
+LOCAL_D const TUint32 PiBy2Invdata[] = {0x4E44152A,0xA2F9836E,0x7FFE0000};	// 2/pi
+
+
+
+
+EXPORT_C TInt Math::Tan(TReal& aTrg, const TReal& aSrc)
+/**
+Calculates the tangent of a number.
+
+@param aTrg A reference containing the result.
+@param aSrc The argument of the tan function in radians. 
+
+@return KErrNone if successful, otherwise another of
+        the system-wide error codes. 
+*/
+	{
+	// Calculate tan(aSrc) and write result to aTrg.
+	// Algorithm:
+	//		Let x=aSrc/(pi/2). Throw away integer part, but if integer part odd
+	//			then replace final result y with -1/y
+	//			( use identities tan(x+n*pi)=tan(x), tan(x+pi/2)=-1/tan(x) )
+	//		Replace x with fractional part after division.
+	//		If x>=0.5, replace x with 1-x and replace result y with 1/y
+	//			( use identity tan(pi/2-x)=1/tan(x) )
+	//		If x>=0.25, replace x with 0.5-x and replace result y with (1-y)/(1+y)
+	//			( use identity tan(pi/4-x)=(1-tan(x))/(1+tan(x)) )
+	//		Use polynomial approximation to calculate tan(pi*x/2) for |x|<=0.25
+
+	const TRealX& One = *(const TRealX*)Onedata;
+	const TRealX& Half = *(const TRealX*)Halfdata;
+	const TRealX& PiBy2Inv = *(const TRealX*)PiBy2Invdata;
+
+	TRealX x;
+	TInt r=x.Set(aSrc);
+	if (r==KErrNone)
+		{
+		TInt8 sign=x.iSign;
+		x.iSign=0;
+		x*=PiBy2Inv;
+		TInt n=(TInt)x;
+		if (n<KMaxTInt && n>KMinTInt)
+			{
+			TInt flags=(n&1)<<1;
+			x-=TRealX(n);
+			if (x.iExp>=0x7FFE)
+				{
+				x=One-x;
+				flags^=2;
+				}
+			if (x.iExp>=0x7FFD)
+				{
+				x=Half-x;
+				flags^=1;
+				}
+			TRealX y;
+			PolyX(y,x*x,9,(const TRealX*)TanCoeffs);
+			y*=x;
+			if (flags==3)
+				y=(One+y)/(One-y);
+			else if (flags==2)
+				y=One/y;
+			else if (flags==1)
+				y=(One-y)/(One+y);
+			y.iSign=TInt8(sign ^ (n&1));
+			return y.GetTReal(aTrg);
+			}
+		}
+	SetNaN(aTrg);
+	return KErrArgument;
+	}
+
+#else // __USE_VFP_MATH
+
+// definitions come from RVCT math library
+extern "C" TReal tan(TReal);
+
+EXPORT_C TInt Math::Tan(TReal& aTrg, const TReal& aSrc)
+	{
+	if (aSrc<KMaxTInt && aSrc>KMinTInt)
+		{
+		aTrg = tan(aSrc);
+		if (Math::IsFinite(aTrg))
+			return KErrNone;
+		}
+	SetNaN(aTrg);
+	return KErrArgument;
+	}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32/euser/maths/um_utl.cpp	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,110 @@
+// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32\euser\maths\um_utl.cpp
+// 
+//
+
+#include "um_std.h"
+
+#if defined(__USE_VFP_MATH) && !defined(__CPU_HAS_VFP)
+#error	__USE_VFP_MATH was defined but not __CPU_HAS_VFP - impossible combination, check variant.mmh 
+#endif
+
+GLDEF_C void Panic(TMathPanic aPanic)
+//
+// Panic the process with USER-Math as the category.
+//
+	{
+
+	User::Panic(_L("USER-Math"),aPanic);
+	}
+
+
+
+#ifdef __USE_VFP_MATH
+extern "C" void __set_errno(TInt errno)
+	{
+	// Do nothing, we don't have an errno to set as we use
+	// return values instead - return values are recosntructed
+	// from the results/inputs, not from this
+	}
+
+extern "C" IMPORT_C TReal __ARM_scalbn(TReal,TInt);
+extern "C" TReal scalbn(TReal x,TInt n)
+	{
+	return __ARM_scalbn(x,n);
+	}
+#endif
+
+
+
+#ifndef __REALS_MACHINE_CODED__
+EXPORT_C TReal Math::Poly(TReal aX,const SPoly *aPoly)
+/**
+Evaluates the polynomial:
+{a[n]X^n + a[n-1]X^(n-1) + ... + a[2]X^2 + a[1]X^1 + a[0]}.
+
+
+@param aX    The value of the x-variable 
+@param aPoly A pointer to the structure containing the set of coefficients
+             in the order: a[0], a[1], ..., a[n-1], a[n].
+
+@return The result of the evaluation.
+*/
+//
+// Evaluate a power series in x for a P_POLY coefficient table.
+// Changed to use TRealX throughout the calculation
+//
+	{
+
+	const TReal *pR=(&aPoly->c[aPoly->num-1]);
+	TRealX r(*pR);
+	TRealX x(aX);
+	while (pR>&aPoly->c[0])
+		{
+		r*=x;
+		r+=*--pR;
+		}
+	return(TReal(r));
+	}
+
+
+
+
+EXPORT_C void Math::PolyX(TRealX& aY, const TRealX& aX, TInt aDegree, const TRealX *aCoeff)
+/**
+Evaluates the polynomial:
+{a[n]X^n + a[n-1]X^(n-1) + ... + a[2]X^2 + a[1]X^1 + a[0]}.
+
+@param aY      A reference containing the result. 
+@param aX      The value of the x-variable. 
+@param aDegree The degree of the polynomial (the highest power of x
+               which is present).
+@param aCoeff  A pointer to a contiguous set of TRealX values containing
+               the coefficients.
+               They must be in the order: a[0], a[1], ..., a[n-1], a[n].
+*/
+	{
+    // Evaluate a polynomial with TRealX argument and TRealX coefficients.
+    // Return a TRealX result.
+
+	const TRealX *pC=aCoeff+aDegree;
+	aY=*pC;
+	while(aDegree--)
+		{
+		aY*=aX;
+		aY+=*--pC;
+		}
+	}
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32/euser/unicode/collate.cpp	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,1103 @@
+// Copyright (c) 1997-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// The Unicode collation system.
+// 
+//
+
+#include "collateimp.h"
+#include "foldtable.inl"
+
+#include <collate.h>
+#include <unicode.h>
+#include "u32std.h"
+
+// maximum size of string which has its own sort key
+static const TInt KKeyedStringBufferSize = 8;
+
+// Creates a one or two collation keys sequence corresponding to the input character.
+// Returns the number of keys output.
+static TInt CreateDefaultCollationKeySequence(TInt aChar, TCollationKey* aBuffer)
+	{
+	if (aChar >= 0x3400 && aChar <= 0x9FFF)	// CJK
+		{
+		aBuffer[0].iLow = (TUint32)aChar << 16 | 0x0105;
+		aBuffer[0].iHigh = aChar;
+		return 1;//Collation key sequence consists of 1 key
+		}
+	aBuffer[0].iLow = 0xFF800000 | ((aChar << 1) & 0x3F0000) | 0x0104;	// no stop bit
+	aBuffer[0].iHigh = 1;
+	aBuffer[1].iLow = (aChar << 16) | 0x80000105;		// stop bit
+	aBuffer[1].iHigh = 0;
+	return 2;//Collation key sequence consists of 2 keys
+	}
+
+// Finds a character's key in the main index, or returns -1 if it is not there
+static TInt FindCollationKeyIndex(TInt aChar, const TCollationKeyTable& aTable)
+	{
+	TInt n = aTable.iIndices;
+	const TUint32 *base = aTable.iIndex;
+	const TUint32 *p = base;
+
+	while (n > 0)
+		{
+		TInt pivot = n / 2;
+		p += pivot;
+		TInt c = *p >> 16;
+		if (aChar == c)		// found it
+			return *p & 0xFFFF;
+		if (aChar < c)		// it's before
+			n = pivot;
+		else					// it's after
+			{
+			base = p + 1;
+			n -= pivot + 1;
+			}
+		p = base;
+		}
+	return -1;
+	}
+
+static void ProcessKeys(TUint32& aKey1, TUint32& aKey2, TUint aFlags)
+	{
+	if (aFlags & TCollationMethod::EFoldCase)
+		{
+		static const TUint case_fold_table[21] =
+			{ 0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x2, 0x3, 0x4, 0x5, 0x6,
+			  0xD, 0xE, 0xF, 0x10, 0x11, 0x12, 0x13, 0x14 };
+		aKey1 = case_fold_table[aKey1];
+		aKey2 = case_fold_table[aKey2];
+		}					
+	if (aFlags & TCollationMethod::ESwapCase)
+		{
+		static const TUint case_swap_table[21] =
+			{ 0, 0x1, 0x8, 0x9, 0xA, 0xB, 0xC, 0x7, 0x2, 0x3, 0x4, 0x5, 0x6,
+			  0xD, 0xE, 0xF, 0x10, 0x11, 0x12, 0x13, 0x14 };
+		aKey1 = case_swap_table[aKey1];
+		aKey2 = case_swap_table[aKey2];
+		}
+	if (aFlags & TCollationMethod::ESwapKana)
+		{
+		static const TUint kana_swap_table[21] =
+			{ 0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xA, 0xB, 0xC,
+			  0x13, 0x14, 0xD, 0xE, 0xF, 0x10, 0x11, 0x12 };
+		aKey1 = kana_swap_table[aKey1];
+		aKey2 = kana_swap_table[aKey2];
+		}
+	}
+
+// Returns the position of the character in the string, or aLength if it is not present.
+// If aChar is found but it is preceded by aEscapeChar (aEscapeChar != 0), then the search continues.
+static TInt FindCharacter(TInt aChar, TInt aEscapeChar, const TUint16* aString, TInt aLength)
+	{
+	TBool isEscaped = EFalse;
+	for(TInt pos=0;pos!=aLength;++pos,++aString)
+		{
+		if(isEscaped) 
+			{ 
+			isEscaped = EFalse; 
+			} 
+		else if(*aString == aEscapeChar) 
+			{ 
+			isEscaped = ETrue; 
+			} 
+		else if(*aString == aChar) 
+			{ 
+			if(!isEscaped)
+				{
+				return pos; 
+				}
+			}		
+		}
+	return aLength;
+	}
+
+/*
+The standard collation data, containing keys for all the WGL4 characters, plus
+commonly-used control characters and spaces. Generated by COLTAB.
+*/
+static const TUint32 TheKey[] = 
+	{
+	0x21e0112,0x21e0113,0x2260112,0x2260112,0x2260113,0x2740112,0x2740113,0x6c60178,
+	0x266017a,0x6c70179,0x6c60178,0x266017a,0x6c90179,0x6c60178,0x266017a,0x6cd0179,
+	0x6c80178,0x266017a,0x6c90179,0x6c80178,0x266017a,0x6cd0179,0x6ca0178,0x266017a,
+	0x6cd0179,0x6cc0178,0x266017a,0x6cd0179,0x6f70110,0x2650112,0x8050111,0x74b0110,
+	0x78d0111,0x74b0110,0x7bd0111,0x78d0110,0x7a10111,0x78d0128,0x7a10129,0x7bd0110,
+	0x2290113,0x7bd0128,0x2290113,0x7ed0128,0x8050111,0x805dd10,0x71f0111,0x805dd28,
+	0x71f0129,0x85ddd10,0x85d0111,0x8750150,0x7e50151,0x9060110,0x7ed0111,0x3,
+	0x201010b,0x202010b,0x203010b,0x204010b,0x205010b,0x206010b,0x207010b,0x208010b,
+	0x209010b,0x2090113,0x209016f,0x209020b,0x209130b,0x209160b,0x209180b,0x2091d0b,
+	0x209240b,0x209280b,0x2092a0b,0x2092f0b,0x209330b,0x209360b,0x209390b,0x2093b0b,
+	0x2093f0b,0x2096b0b,0x20b010b,0x20c010b,0x20d010b,0x20d016f,0x20e010b,0x20f010b,
+	0x210010b,0x211010b,0x214010b,0x21a010b,0x21c010b,0x21e010b,0x21f010b,0x221010b,
+	0x222010b,0x226010b,0x229010b,0x22d010b,0x22e010b,0x22f010b,0x230010b,0x231010b,
+	0x232010b,0x233010b,0x234010b,0x235010b,0x236010b,0x237010b,0x23c010b,0x23d010b,
+	0x23e010b,0x23f010b,0x240010b,0x241010b,0x242010b,0x243010b,0x25e010b,0x25f010b,
+	0x260010b,0x261010b,0x262010b,0x263010b,0x265010b,0x266010b,0x267010b,0x268010b,
+	0x269010b,0x26a010b,0x26c010b,0x26e010b,0x26f010b,0x270010b,0x274010b,0x2ac010b,
+	0x2ad010b,0x2af010b,0x2d6010b,0x2ff010b,0x300010b,0x301010b,0x302010b,0x303010b,
+	0x304010b,0x317010b,0x35c010b,0x35f010b,0x366010b,0x368010b,0x369010b,0x36a010b,
+	0x36b010b,0x36c010b,0x36d010b,0x36e010b,0x36f010b,0x370010b,0x371010b,0x372010b,
+	0x374010b,0x375010b,0x378010b,0x37c010b,0x37d010b,0x381010b,0x382010b,0x38a010b,
+	0x38c010b,0x3a2010b,0x3b9010b,0x3bb010b,0x3bc010b,0x42f010b,0x43d010b,0x44d010b,
+	0x44e010b,0x4d6010b,0x4d8010b,0x4e2010b,0x4e6010b,0x4ea010b,0x4ee010b,0x4f2010b,
+	0x4fa010b,0x502010b,0x50a010b,0x512010b,0x526010b,0x527010b,0x528010b,0x529010b,
+	0x52a010b,0x52b010b,0x52c010b,0x52d010b,0x52e010b,0x52f010b,0x530010b,0x531010b,
+	0x532010b,0x533010b,0x534010b,0x535010b,0x536010b,0x537010b,0x538010b,0x539010b,
+	0x53a010b,0x53b010b,0x53c010b,0x53d010b,0x53e010b,0x53f010b,0x540010b,0x541010b,
+	0x542010b,0x556010b,0x55a010b,0x55e010b,0x562010b,0x566010b,0x567010b,0x568010b,
+	0x569010b,0x56c010b,0x56d010b,0x576010b,0x577010b,0x578010b,0x57e010b,0x586010b,
+	0x588010b,0x590010b,0x596010b,0x597010b,0x59b010b,0x5a4010b,0x5a5010b,0x5b2010b,
+	0x5f0010b,0x5f1010b,0x5f2010b,0x5f6010b,0x5f8010b,0x616010b,0x619010b,0x61b010b,
+	0x61c010b,0x620010b,0x621010b,0x6b4010b,0x6b5010b,0x1309,0x1609,0x1809,
+	0x1d09,0x2209,0x2409,0x2809,0x2f09,0x3009,0x3309,0x3609,
+	0x3909,0x3b09,0x4109,0x2c20109,0x2c30109,0x2c40109,0x2c50109,0x2c60109,
+	0x2cd0109,0x2ce0109,0x2d10109,0x2d50109,0x2fa0109,0x6c50109,0x6c60109,0x6c60151,
+	0x6c70109,0x6c70151,0x6c80109,0x6c80151,0x6c90109,0x6ca0109,0x6cb0109,0x6cc0109,
+	0x6cd0109,0x6ce0109,0x6cf0109,0x6cf0121,0x6cf0151,0x6d30109,0x6d30121,0x6e30109,
+	0x6e30121,0x6f70109,0x6f70121,0x7030109,0x7030121,0x7070109,0x7070121,0x7170109,
+	0x7170121,0x71f0109,0x71f0121,0x74b0109,0x74b0121,0x74f0109,0x7530109,0x7530121,
+	0x7730109,0x7730121,0x77f0109,0x77f0121,0x78d0109,0x78d0121,0x7910109,0x7a10109,
+	0x7a10121,0x7b10109,0x7b10121,0x7bd0109,0x7bd0115,0x7bd0121,0x7c50109,0x7c50121,
+	0x7e50109,0x7e50121,0x7ed0109,0x7ed0121,0x7ed0151,0x8010109,0x8010121,0x8050109,
+	0x8050121,0x8050151,0x80d0109,0x80d0121,0x81d0109,0x81d0121,0x8290109,0x8290121,
+	0x8310109,0x8350109,0x8350121,0x85d0109,0x85d0121,0x85dde11,0x8750109,0x8750121,
+	0x8790109,0x8790121,0x88d0109,0x88d0121,0x8a50109,0x8a50121,0x8b10109,0x8b10121,
+	0x8b90109,0x8b90121,0x8bd0109,0x8bd0121,0x8c90109,0x8c90121,0x8e90109,0x8e90121,
+	0x9360109,0x9360121,0x9370109,0x9370121,0x9380109,0x9380121,0x9390109,0x9390121,
+	0x93a0109,0x93a0121,0x93d0109,0x93d0121,0x93e0109,0x93e0121,0x93f0109,0x93f0121,
+	0x9400109,0x9400121,0x9420109,0x9420121,0x9430109,0x9430121,0x9440109,0x9440111,
+	0x9440121,0x9450109,0x9450121,0x9460109,0x9460121,0x9470109,0x9470121,0x9480109,
+	0x9480121,0x94a0109,0x94a0121,0x94b0109,0x94b0121,0x94c0109,0x94c0121,0x94d0109,
+	0x94d0121,0x94e0109,0x94e0121,0x94f0109,0x94f0121,0x9500109,0x9500121,0x9510109,
+	0x9510121,0x95a0109,0x95a0121,0x9660109,0x9660121,0x96a0109,0x96a0121,0x96e0109,
+	0x96e0121,0x9720109,0x9720121,0x97e0109,0x97e0121,0x9820109,0x9820121,0x98a0109,
+	0x98a0121,0x98e0109,0x98e0121,0x9920109,0x9920121,0x99a0109,0x99a0121,0x99e0109,
+	0x99e0121,0x9a60109,0x9a60121,0x9aa0109,0x9aa0121,0x9ae0109,0x9ae0121,0x9b20109,
+	0x9b20121,0x9ca0109,0x9ca0121,0x9ce0109,0x9ce0121,0x9d20109,0x9d20121,0x9d60109,
+	0x9d60121,0x9e60109,0x9e60121,0x9ea0109,0x9ea0121,0x9f20109,0x9f20121,0x9fe0109,
+	0x9fe0121,0xa020109,0xa020121,0xa0a0109,0xa0a0121,0xa120109,0xa120121,0xa160109,
+	0xa160121,0xa260109,0xa260121,0xa2a0109,0xa2a0121,0xa460109,0xa460121,0xa4e0109,
+	0xa4e0121,0xa660109,0xa660121,0xa6a0109,0xa6a0121,0xa6e0109,0xa6e0121,0xa720109,
+	0xa720121,0xa760109,0xa760121,0xa7a0109,0xa7a0121,0xa820109,0xa820121,0xa860109,
+	0xa860121,0xa8a0109,0xa8a0121,
+	};
+
+static const TUint32 TheIndex[] = 
+	{
+	0x37,0x10037,0x20037,0x30037,0x40037,0x50037,0x60037,0x70037,
+	0x80037,0x90038,0xa0039,0xb003a,0xc003b,0xd003c,0xe0037,0xf0037,
+	0x100037,0x110037,0x120037,0x130037,0x140037,0x150037,0x160037,0x170037,
+	0x180037,0x190037,0x1a0037,0x1b0037,0x1c0037,0x1d0037,0x1e0037,0x1f0037,
+	0x200040,0x21005d,0x22006a,0x230080,0x24010d,0x250081,0x26007f,0x270063,
+	0x280070,0x290071,0x2a007b,0x2b0096,0x2c005a,0x2d0053,0x2e0061,0x2f007c,
+	0x300115,0x310116,0x320118,0x33011a,0x34011c,0x35011d,0x36011e,0x37011f,
+	0x380120,0x390121,0x3a005c,0x3b005b,0x3c009a,0x3d009b,0x3e009c,0x3f005f,
+	0x40007a,0x410123,0x420128,0x43012a,0x44012c,0x450132,0x460134,0x470137,
+	0x480139,0x49013d,0x4a0140,0x4b0142,0x4c0145,0x4d0149,0x4e014b,0x4f0150,
+	0x500155,0x510157,0x52015a,0x53015c,0x54015f,0x550163,0x560165,0x570167,
+	0x580169,0x59016b,0x5a016d,0x5b0072,0x5c007e,0x5d0073,0x5e0047,0x5f0043,
+	0x600045,0x610122,0x620127,0x630129,0x64012b,0x650131,0x660133,0x670136,
+	0x680138,0x69013c,0x6a013f,0x6b0141,0x6c0143,0x6d0148,0x6e014a,0x6f014f,
+	0x700154,0x710156,0x720159,0x73015b,0x74015e,0x750162,0x760164,0x770166,
+	0x780168,0x79016a,0x7a016c,0x7b0074,0x7c009e,0x7d0075,0x7e00a0,0xa00042,
+	0xa1005e,0xa2010c,0xa3010e,0xa4010b,0xa5010f,0xa6009f,0xa70076,0xa80049,
+	0xa90078,0xaa0124,0xab006e,0xac009d,0xad0052,0xae0079,0xaf004f,0xb0008a,
+	0xb10097,0xb20119,0xb3011b,0xb40044,0xb50187,0xb60077,0xb70062,0xb8004d,
+	0xb90117,0xba0151,0xbb006f,0xbc000a,0xbd0007,0xbe0010,0xbf0060,0xc60126,
+	0xd00130,0xd70099,0xd80153,0xde016f,0xdf0031,0xe60125,0xf0012f,0xf70098,
+	0xf80152,0xfe016e,0x110012e,0x111012d,0x126013b,0x127013a,0x131013e,0x1320025,
+	0x1330023,0x1380158,0x13f0029,0x1400027,0x1410147,0x1420146,0x1490035,0x14a014e,
+	0x14b014d,0x152002f,0x153002d,0x1660161,0x1670160,0x17f015d,0x1920135,0x2c60087,
+	0x2c70088,0x2c90089,0x2d80046,0x2d9004c,0x2da0048,0x2db004e,0x2dd004b,0x30000fe,
+	0x30100fd,0x3020100,0x3030105,0x3040109,0x30600ff,0x3070106,0x3080103,0x30a0102,
+	0x30b0104,0x30c0101,0x30d010a,0x3270107,0x3280108,0x3840044,0x385004a,0x3870062,
+	0x3910171,0x3920173,0x3930175,0x3940177,0x3950179,0x396017b,0x397017d,0x398017f,
+	0x3990181,0x39a0183,0x39b0185,0x39c0188,0x39d018a,0x39e018c,0x39f018e,0x3a00190,
+	0x3a10192,0x3a30194,0x3a40196,0x3a50198,0x3a6019a,0x3a7019c,0x3a8019e,0x3a901a0,
+	0x3b10170,0x3b20172,0x3b30174,0x3b40176,0x3b50178,0x3b6017a,0x3b7017c,0x3b8017e,
+	0x3b90180,0x3ba0182,0x3bb0184,0x3bc0186,0x3bd0189,0x3be018b,0x3bf018d,0x3c0018f,
+	0x3c10191,0x3c20193,0x3c30193,0x3c40195,0x3c50197,0x3c60199,0x3c7019b,0x3c8019d,
+	0x3c9019f,0x40201ae,0x40401b2,0x40501b8,0x40601bc,0x40801be,0x40901c4,0x40a01ca,
+	0x40b01d6,0x40f01e2,0x41001a2,0x41101a4,0x41201a6,0x41301a8,0x41401ac,0x41501b0,
+	0x41601b4,0x41701b6,0x41801ba,0x41a01c0,0x41b01c2,0x41c01c6,0x41d01c8,0x41e01cc,
+	0x41f01ce,0x42001d0,0x42101d2,0x42201d4,0x42301d8,0x42401da,0x42501dc,0x42601de,
+	0x42701e0,0x42801e4,0x42901e6,0x42a01e8,0x42b01ea,0x42c01ec,0x42d01ee,0x42e01f0,
+	0x42f01f2,0x43001a1,0x43101a3,0x43201a5,0x43301a7,0x43401ab,0x43501af,0x43601b3,
+	0x43701b5,0x43801b9,0x43a01bf,0x43b01c1,0x43c01c5,0x43d01c7,0x43e01cb,0x43f01cd,
+	0x44001cf,0x44101d1,0x44201d3,0x44301d7,0x44401d9,0x44501db,0x44601dd,0x44701df,
+	0x44801e3,0x44901e5,0x44a01e7,0x44b01e9,0x44c01eb,0x44d01ed,0x44e01ef,0x44f01f1,
+	0x45201ad,0x45401b1,0x45501b7,0x45601bb,0x45801bd,0x45901c3,0x45a01c9,0x45b01d5,
+	0x45f01e1,0x49001aa,0x49101a9,0x20000041,0x20010041,0x20020041,0x20030041,0x20040041,
+	0x20050041,0x20060041,0x20070042,0x20080041,0x20090041,0x200a0041,0x200b003f,0x200c0037,
+	0x200d0037,0x200e0037,0x200f0037,0x20100054,0x20110055,0x20120056,0x20130057,0x20140058,
+	0x20150059,0x20170051,0x20180064,0x20190065,0x201a0066,0x201b0067,0x201c006b,0x201d006c,
+	0x201e006d,0x20200083,0x20210084,0x20220085,0x20260002,0x2028003d,0x2029003e,0x202a0037,
+	0x202b0037,0x202c0037,0x202d0037,0x202e0037,0x20300082,0x20320086,0x20330005,0x20390068,
+	0x203a0069,0x203c0000,0x203e0050,0x2044007d,0x207f014c,0x20a30110,0x20a40111,0x20a70112,
+	0x20ac0113,0x2105001c,0x21130144,0x2116002b,0x21220033,0x212601a0,0x212e0114,0x215b000d,
+	0x215c0013,0x215d0016,0x215e0019,0x2190008b,0x2191008d,0x2192008c,0x2193008e,0x2194008f,
+	0x21950090,0x21a80091,0x22020092,0x22060093,0x220f0094,0x22110095,0x221200a1,0x221500a2,
+	0x221900a3,0x221a00a4,0x221e00a5,0x221f00a6,0x222900a7,0x222b00a8,0x224800a9,0x226100aa,
+	0x226400ab,0x226500ac,0x230200ad,0x231000ae,0x232000af,0x232100b0,0x250000b1,0x250200b2,
+	0x250c00b3,0x251000b4,0x251400b5,0x251800b6,0x251c00b7,0x252400b8,0x252c00b9,0x253400ba,
+	0x253c00bb,0x255000bc,0x255100bd,0x255200be,0x255300bf,0x255400c0,0x255500c1,0x255600c2,
+	0x255700c3,0x255800c4,0x255900c5,0x255a00c6,0x255b00c7,0x255c00c8,0x255d00c9,0x255e00ca,
+	0x255f00cb,0x256000cc,0x256100cd,0x256200ce,0x256300cf,0x256400d0,0x256500d1,0x256600d2,
+	0x256700d3,0x256800d4,0x256900d5,0x256a00d6,0x256b00d7,0x256c00d8,0x258000d9,0x258400da,
+	0x258800db,0x258c00dc,0x259000dd,0x259100de,0x259200df,0x259300e0,0x25a000e1,0x25a100e2,
+	0x25aa00e3,0x25ab00e4,0x25ac00e5,0x25b200e6,0x25ba00e7,0x25bc00e8,0x25c400e9,0x25ca00ea,
+	0x25cb00eb,0x25cf00ec,0x25d800ed,0x25d900ee,0x25e600ef,0x263a00f0,0x263b00f1,0x263c00f2,
+	0x264000f3,0x264200f4,0x266000f5,0x266300f6,0x266500f7,0x266600f8,0x266a00f9,0x266b00fa,
+	0xfb01001f,0xfb020021,0xfeff0037,0xfffc00fb,0xfffd00fc,
+	};
+
+static const TCollationKeyTable TheStandardTable = 
+	{ TheKey, TheIndex, 517, NULL, NULL, 0 };
+
+const TCollationKeyTable* StandardCollationMethod()
+	{
+	return &TheStandardTable;
+	};
+
+inline void Increment(TUint16 const *& aPointer,TBool aNarrow)
+	{
+	aPointer =  aNarrow ? (const TUint16*)(((const TUint8*)aPointer) + 1) : aPointer + 1;
+	}
+
+/////////////////////////////////////////////////////////////////////////////////////////////////
+// TCollationValueIterator
+/////////////////////////////////////////////////////////////////////////////////////////////////
+
+/**
+Initializes TCollationValueIterator object with a new character sequence.
+@param aSourceIt An iterator used to access the input character (non-normalized or 
+                 normalized) sequence.
+@internalComponent
+*/
+void TCollationValueIterator::SetSourceIt(TUTF32Iterator& aSourceIt)
+	{
+    iCurrentKeyPos = 0;
+	iKey.iKeys = 0;
+    iDecompStrIt.Set(aSourceIt);
+	}
+
+/**
+Gets current raw key.
+Note: the method may move the iterator one or more positions forward if there are no produced
+      collation keys.
+@param aKey A reference to a TCollationKey object, initialized with the
+            current collation key after the call, if there is available key.
+@return ETrue Successfull call, aKey initialized with the current collation key,
+        EFalse - the iteration has come to the end.
+@internalComponent
+*/
+TBool TCollationValueIterator::GetCurrentKey(TCollationKey& aKey)
+	{
+    ASSERT(iCurrentKeyPos <= iKey.iKeys);
+	if(!ProduceCollationKeys())
+        {
+        return EFalse;
+        }
+	aKey = iKey.iKey[iCurrentKeyPos];
+	return ETrue;
+	}
+
+/**
+Gets current key at the specified level.
+Note: the method may move the iterator one or more positions forward if there are no produced
+      collation keys.
+@param aLevel Desired level of the collation key: 0..3
+@param aKey A reference to TUint32 where the retrieved key will be stored.
+@return ETrue Success, EFalse - end of the iteration.
+@internalComponent
+*/
+TBool TCollationValueIterator::GetCurrentKey(TInt aLevel, TUint32& aKey)
+	{
+	TCollationKey rawKey;
+	if(GetCurrentKey(rawKey))
+        {
+	    //Key values are ignored if their ignore bit is set and the level is less than 3: in other words, the
+	    //actual Unicode value is never ignored. This does NOT conform to the system of alternate weightings
+	    //described in Unicode Technical Report 10, and will probably have to be changed.
+        aKey = (aLevel < 3 && (rawKey.iLow & TCollationKeyTable::EIgnoreFlag) && !IgnoringNone()) ? 0 : rawKey.Level(aLevel);
+        return ETrue;
+        }
+    return EFalse;
+	}
+
+/**
+The method iterates through the controlled character sequence and tries to find first non-zero
+corresponding collation key at the specified level.
+@param aLevel Desired level of the collation key: 0..3
+@return Non-zero collation key value or 0 if the iteration has come to the end.
+@internalComponent
+*/
+TUint32 TCollationValueIterator::GetNextNonZeroKey(TInt aLevel)
+	{
+    TUint32 key = 0;
+	while(GetCurrentKey(aLevel, key) && key == 0)
+		{
+		Increment();
+		}
+	return key;
+	}
+
+/**
+The method determines wheter the specified as a parameter character matches current iterator's
+character.
+If there is a match, the iterator will be moved one position forward.
+Note: the method may move the iterator one or more positions forward if there are no produced
+      collation keys.
+@param aMatch The character to compare with the current iterator's character.
+@return ETrue The characters match, EFalse otherwise (or the iteration has come to the end).
+@internalComponent
+*/
+TBool TCollationValueIterator::MatchChar(TChar aMatch)
+	{
+    TUint32 key;
+    if(GetCurrentKey(3, key))
+        {
+	    // Find a match for the quaternary key.. will probably be the unicode value
+	    // This is a bit poor.
+	    if(aMatch == key)
+		    {
+		    Increment();
+		    return ETrue;
+		    }
+        }
+	return EFalse;
+	}
+
+/**
+Note: the method may move the iterator one or more positions forward if there are no produced
+      collation keys.
+@return The method returns ETrue if the iterator is at a combining character, EFalse otherwise
+        (or the iterator has come to the end)
+@internalComponent
+*/
+TBool TCollationValueIterator::AtCombiningCharacter()
+	{
+	TCollationKey rawKey;
+	if(!GetCurrentKey(rawKey))
+        {
+		return EFalse;		// iteration ended
+        }
+	return rawKey.IsStarter() ? (TBool)EFalse : (TBool)ETrue;
+	}
+
+/**
+Skips the following combining characters if they are.
+Note: the method may move the iterator one or more positions forward.
+@return The number of skipped combining characters.
+@internalComponent
+*/
+TInt TCollationValueIterator::SkipCombiningCharacters()
+	{
+	TInt count;
+	for(count=0;AtCombiningCharacter();++count)
+        {
+		Increment();
+        }
+	return count;
+	}
+
+/**
+Moves the iterator one step forward making the next collation key available for getting
+using GetCurrentKey().
+@return ETrue Successfull call, there is a collation key available.
+        EFalse - the iteration has come to the end.
+@internalComponent
+@see TCollationValueIterator::GetCurrentKey()
+*/
+TBool TCollationValueIterator::Increment()
+	{
+	ASSERT(iCurrentKeyPos <= iKey.iKeys);
+	if(!ProduceCollationKeys())
+        {
+        return EFalse;
+        }
+	++iCurrentKeyPos;
+	return ETrue;
+	}
+
+/**
+Returns the position in the underlying string of the iteration,
+if this is well defined. It is not well defined if either we are
+half way through keys defined as a string in the collation table
+or if we are half way through a canonically reordered sequence.
+@return The position in the underlying string if this is well
+	defined, or 0 if it is not.
+*/
+const TText16* TCollationValueIterator::CurrentPositionIfAtCharacter()
+	{
+	if (!ProduceCollationKeys())
+		return iCurrentPosition;
+	return iCurrentKeyPos == 0? iCurrentPosition : 0;
+	}
+
+/**
+Produces the longest possible collation keys sequence using the decomposed character sequence,
+pointed by iDecompStrIt iterator. But this will happen only if all keys from iKey array are 
+consumed.
+@return ETrue Successfull call, iKey initialized with the produced collation keys sequence,
+        EFalse - the iteration has come to the end.
+@internalComponent
+*/
+TBool TCollationValueIterator::ProduceCollationKeys()
+	{
+    //iKey.iKeys represents the keys count in iKey array, so load more keys, only if all 
+    //collation keys are already consumed.
+    if(iCurrentKeyPos == iKey.iKeys)
+        {
+		iCurrentPosition = iDecompStrIt.CurrentPositionIfAtCharacter();
+		if(iDecompStrIt.AtEnd())
+            {//No more characters in the input decomposed canonical string
+			return EFalse;
+            }
+        //Try to get the next collation key sequence. There should be at least one key.
+		GetNextRawKeySequence();
+	    ASSERT(iKey.iKeys > 0);
+        iCurrentKeyPos = 0;
+        }
+	return ETrue;
+	}
+
+/**
+Consume zero or more characters from the input and convert them into zero or more collation keys.
+@internalComponent
+*/
+void TCollationValueIterator::GetNextRawKeySequence()
+	{
+    //Store the first character combining class type for later use.
+    TChar firstChar = iDecompStrIt.Get(0);
+    TBool combining = !::IsBaseCharacter(firstChar);
+	// Initialise.
+	iKey.iCharactersConsumed = 0;
+	iKey.iKeys = 0;
+	// See if the override table has a key for the current collation unit.
+	if(iMethod.iOverrideTable)
+        {
+		GetKeyFromTable(iMethod.iOverrideTable);
+        }
+	// If not, try the main table.
+	if(iKey.iCharactersConsumed == 0)
+        {
+		GetKeyFromTable(iMethod.iMainTable);
+        }
+	//If no key was found use a default value depending on the current character.
+	//For CJK characters:
+	//the Unicode value itself as the primary key and 1 as the secondary and tertiary keys;
+	//the lower 16 bits end up as 0x0105 because the bottom two bits are used for the ignorable bit,
+	//which is clear, and the stop bit, which is set.
+	//For other characters:
+	//Return two keys containing the 21 bits of the character code (anything from 0 to 0x10FFFF), as
+	//explained in Unicode Technical Report 10.
+	if(iKey.iCharactersConsumed == 0)
+		{
+		iKey.iCharactersConsumed = 1;
+		iDecompStrIt.Next(1);
+        iKey.iKeys = ::CreateDefaultCollationKeySequence(firstChar, iKey.iKey);
+		}
+	if(!combining)
+        {
+		iKey.iKey[0].iHigh |= (TUint32)TCollationKey::KFlagIsStarter;
+        }
+	}
+
+/**
+Search for the string aText.
+Put the key index in aIndex if found, otherwise set aIndex to -1.
+If the sought string might be a prefix to a key in the table set aPossiblePrefix to TRUE.
+@internalComponent
+*/
+static void GetStringKey(const TCollationKeyTable* aTable,const TText* aText,TInt aLength,
+						 TInt& aIndex,TBool& aPossiblePrefix)
+	{
+	aIndex = -1;
+	aPossiblePrefix = EFalse;
+	TInt n =	aTable->iStringIndices;
+	const TUint32* base = aTable->iStringIndex;
+	const TUint32* p = base;
+	TInt pivot;
+	while (n > 0)
+		{
+		pivot = n / 2;
+		p += pivot;
+		TUint16 string_index = (TUint16)(*p >> 16);
+		const TText* cur_text = aTable->iString + string_index + 1;
+		TInt cur_length = aTable->iString[string_index];
+		TInt order = TUnicode::Compare(aText,aLength,cur_text,cur_length);
+		if (order == 0) // found it
+			{
+			aIndex = *p & 0xFFFF;
+			aPossiblePrefix = ETrue;
+			break;
+			}
+		if (order < 1 && !aPossiblePrefix)
+			{
+			if (aLength < cur_length && TUnicode::Compare(aText,aLength,cur_text,aLength) == 0)
+				aPossiblePrefix = ETrue;
+			n = pivot;
+			}
+		else
+			{
+			base = p + 1;
+			n -= pivot + 1;
+			}
+		p = base;
+		}
+	}
+
+/**
+Consumes output from iDecompStrIt, produces list of keys in iKey.
+@param aTable A const pointer to the collation key table used by the method.
+@internalComponent
+*/
+void TCollationValueIterator::GetKeyFromTable(const TCollationKeyTable* aTable)
+	{
+    ASSERT(aTable != NULL);
+	iKey.iCharactersConsumed = 0;
+	iKey.iKeys = 0;
+
+	TInt cur_char = iDecompStrIt.Get(0);
+    if (0xFFFF < cur_char)
+        // Supplementary character: we can't handle these yet.
+        return;
+
+	// Find the longest matching string.
+	TInt index = -1;
+	if(aTable->iStringIndices > 0)
+		{
+		TInt moved = 0;
+		TText text[KKeyedStringBufferSize];
+		text[0] = static_cast <TText> (cur_char);
+		TBool possible_prefix = ETrue;
+		for(TInt i = 1; (i < KKeyedStringBufferSize) && possible_prefix; i++)
+			{
+			++moved;
+			TInt c = iDecompStrIt.Get(i);//get the next character
+			if(c == -1)
+                {
+				break;
+                }
+			text[i] = static_cast <TText> (c);
+			TInt cur_index = -1;
+            ::GetStringKey(aTable, text, i + 1, cur_index, possible_prefix);
+			if(cur_index != -1)
+				{
+				index = cur_index;
+				iKey.iCharactersConsumed = i + 1;
+				}
+			}
+		if (iKey.iCharactersConsumed < moved)
+			{
+			moved = 0;
+			}
+		while (moved != iKey.iCharactersConsumed)
+			{
+			++moved;
+			}
+        if(moved > 0)
+            {
+		    iDecompStrIt.Next(moved);//adjust the iterator start position
+            }
+		}
+
+	// Now search the main index.
+	if(index == -1)
+		{
+        index = ::FindCollationKeyIndex(cur_char, *aTable);
+		if(0 <= index)
+			{
+			iKey.iCharactersConsumed = 1;
+		    iDecompStrIt.Next(1);//adjust the iterator start position
+			}
+		}
+
+	// Fill in the key or keys.
+	if(index != -1)
+		{
+		const TUint32* p = &aTable->iKey[index];
+		TCollationKey* q = iKey.iKey;
+		iKey.iKeys = 0;
+		while(iKey.iKeys < TKeyInfo::EMaxKeys)
+			{
+			q->iLow = *p;
+			q->iHigh = cur_char;
+			iKey.iKeys++;
+			if(*p & 1)
+                {
+				break;
+                }
+			q++;
+			p++;
+			}
+		}
+	}
+
+/////////////////////////////////////////////////////////////////////////////////////////////////
+// TCollate
+/////////////////////////////////////////////////////////////////////////////////////////////////
+
+/**
+Construct a TCollate object based on the collation method specified
+within aCharSet, if any. If there is none, or aCharSet is null, the
+standard collation method will be used. 
+aMask and aFlags provide a method for overriding the flags in the collation method: 
+Each flag set to 1 in aMask is a flag that will be overridden and set to the
+corresponding flag value in aFlags.
+Ownership of aCharSet is not passed.
+@param aCharSet Locale-specific character attribute and collation data
+@param aMask Provides a method for overriding the flags in the collation method
+@param aFlags Provides a method for overriding the flags in the collation method
+@internalComponent
+*/
+TCollate::TCollate(const LCharSet* aCharSet, TUint aMask, TUint aFlags)
+	{
+	iMethod.iMainTable = NULL;
+	iMethod.iOverrideTable = NULL;
+	iMethod.iFlags = 0;
+	if (aCharSet && aCharSet->iCollationDataSet && aCharSet->iCollationDataSet->iMethod)
+        {
+		iMethod = aCharSet->iCollationDataSet->iMethod[0];
+        }
+	if (iMethod.iMainTable == NULL)
+        {
+		iMethod.iMainTable = &TheStandardTable;
+        }
+	if (aMask)
+		{
+		iMethod.iFlags &= ~aMask;
+		iMethod.iFlags |= (aMask & aFlags);
+		}
+	}
+
+/**
+Construct a TCollate object based on an already constructed
+TCollationMethod specified in aMethod. 
+Ownership is not passed.
+@param aMethod Collation keys table
+@internalComponent
+*/
+TCollate::TCollate(const TCollationMethod& aMethod) :
+	iMethod(aMethod)
+	{
+	if(!iMethod.iMainTable)
+        {
+		iMethod.iMainTable = &TheStandardTable;
+        }
+	}
+
+/**
+Compare the string beginning at aString1 of length aLength1 against the
+string beginning at aString2 of length aLength2. 
+
+@param aString1 First string to compare
+@param aLength1 Length of aString1
+@param aString2 Second string to compare
+@param aLength2 Length of aString2
+@param aMaxLevel Determines the tightness of the collation. At level 0, only
+                 character identities are distinguished. At level 1 accents are
+                 distinguished as well. At level 2 case is distinguished as well. At
+                 level 3 all non canonically equivalent Unicode characters are considered 
+                 different. By default aMaxLevel is 3.
+@return EStringsIdentical The strings are identical.
+        ELeftComparesLessAndIsNotPrefix For example: aString1 = "aaa", aString2 = "zzzz".
+        ELeftIsPrefixOfRight For example: aString1 = "abc", aString2 = "abcd".
+        ERightIsPrefixOfLeft For example: aString1 = "abcd", aString2 = "abc".
+        ERightComparesLessAndIsNotPrefix For example: aString1 = "zzzz", aString2 = "aaa".
+@internalComponent
+*/
+TCollate::TComparisonResult TCollate::Compare(const TUint16 *aString1, TInt aLength1,
+                                              const TUint16 *aString2, TInt aLength2,
+                                              TInt aMaxLevel) const
+	{
+    TUTF32Iterator itL(aString1, aString1 + aLength1);
+    TUTF32Iterator itR(aString2, aString2 + aLength2);
+	return CompareKeySequences(itL, itR, aMaxLevel, 0, 0);
+	}
+
+/**
+Find the string beginning at aString2 of length aLength2 in the string
+beginning at aString1 of length aLength1.
+
+@param aString1 String to search
+@param aLength1 Length of aString1
+@param aString2 String to search for
+@param aLength2 Length of aString2
+@param aMaxLevel Determines the tightness of the collation. At level 0, only
+                 character identities are distinguished. At level 1 accents are
+                 distinguished as well. At level 2 case is distinguishes as well. At
+                 level 3 all valid different Unicode characters are considered different.
+@param aString2WildChar Wild card character which may be specified for aString2. By default
+                 wild card character is not specified and not used.
+@return KErrNotFound aString2 not found in aString1. 
+        Non-negative value telling the position in aString1 where the first occurrence of 
+        aString2 was found.
+@internalComponent
+*/
+TInt TCollate::Find(const TUint16 *aString1, TInt aLength1,
+                    const TUint16 *aString2, TInt aLength2,
+                    TInt aMaxLevel, TUint aString2WildChar) const
+	{
+	TInt dummy(0);
+	return Find(aString1, aLength1, aString2,aLength2, dummy, aMaxLevel,aString2WildChar );
+	}
+
+/**
+Find the string beginning at aString2 of length aLength2 in the string
+beginning at aString1 of length aLength1.
+
+@param aString1 String to search
+@param aLength1 Length of aString1
+@param aString2 String to search for
+@param aLength2 Length of aString2
+@param aLengthFound A refernce to the length of the match found in the candidate string
+@param aMaxLevel Determines the tightness of the collation. At level 0, only
+                 character identities are distinguished. At level 1 accents are
+                 distinguished as well. At level 2 case is distinguishes as well. At
+                 level 3 all valid different Unicode characters are considered different.
+@param aString2WildChar Wild card character which may be specified for aString2. By default
+                 wild card character is not specified and not used.
+@return KErrNotFound aString2 not found in aString1. 
+        Non-negative value telling the position in aString1 where the first occurrence of 
+        aString2 was found.
+@internalComponent
+*/
+TInt TCollate::Find(const TUint16 *aString1, TInt aLength1,
+                    const TUint16 *aString2, TInt aLength2,
+                    TInt &aLengthFound, TInt aMaxLevel, TUint aString2WildChar) const
+	{
+    TUTF32Iterator itL(aString1, aString1 + aLength1);
+    TUTF32Iterator itR(aString2, aString2 + aLength2);
+	return FindKeySequence(itL, itR, aMaxLevel, aString2WildChar, 0, aLengthFound);
+	}
+	
+/**
+Match the pattern defined by aSearchTerm with aCandidate. 
+Return the index in aCandidate of the start of the first pattern matched - 
+that is, the first character in aSearchTerm after all wild-sequence characters
+have been matched. Return KErrNotFound if there is no match.
+
+For example, if aCandidate is "abcdefghijkl", the following values of aSearchTerm yield the 
+following results:
+"abc*" gives 0
+"abc" gives KErrNotFound
+"xyz" gives KErrNotFound
+"*def" gives KErrNotFound
+"*def*" gives 3
+"*d?f*" gives 3
+"a*kl" gives 0
+"*d*kl" gives 4
+
+To match a pattern anywhere in aCandidate, aSearchTerm must both start and end 
+with aString2WildSequenceChar
+
+@param aCandidate String to search
+@param aCandidateLength Length of aCandidate
+@param aSearchTerm String to search for
+@param aSearchTermLength Length of aSearchTerm
+@param aMaxLevel Determines the tightness of the collation. At level 0, only
+                 character identities are distinguished. At level 1 accents are
+                 distinguished as well. At level 2 case is distinguishes as well. At
+                 level 3 all valid different Unicode characters are considered different.
+@param aWildChar Wild card character which may be specified for aSearchTerm. By default
+                 the wild card character used is '?'.
+@param aWildSequenceChar Wild card sequence character which may be specified for aSearchTerm.
+                 Its default value is '*'.
+@param aEscapeChar Escape character. If it is non-zero and precdes aWildChar and aWildSequenceChar characters in
+                 aCandidate string, then these characters should be treated as normal characters.
+@return The index in aCandidate of the start of the first pattern matched.
+
+@internalComponent.
+*/
+TInt TCollate::Match(const TUint16 *aCandidate, TInt aCandidateLength,
+                     const TUint16 *aSearchTerm,TInt aSearchTermLength, 
+                     TInt aMaxLevel, TUint aWildChar, TUint aWildSequenceChar,
+                     TUint aEscapeChar) const
+	{
+	ASSERT(0 <= aSearchTermLength);
+	ASSERT(0 <= aCandidateLength);
+
+	if(aMaxLevel == 3 && (iMethod.iFlags & TCollationMethod::EFoldCase))
+        {
+		aMaxLevel = 2;
+        }
+
+    TUTF32Iterator candidate(aCandidate, aCandidate + aCandidateLength);
+    TUTF32Iterator searchTerm(aSearchTerm, aSearchTerm + aSearchTermLength);
+
+	TInt firstMatch = KErrNotFound;
+    TInt segEnd = ::FindCharacter(aWildSequenceChar, aEscapeChar, aSearchTerm, aSearchTermLength);
+
+	// Is there any prefix that the candidate string must have?
+    // aSearchTerm looks like "abc*...". Then segEnd will be 3 (the position of '*').
+    // Check that aCandidate begins with "abc" too.
+	if(segEnd != 0 || aSearchTermLength == 0)
+		{
+		searchTerm = TUTF32Iterator(aSearchTerm, aSearchTerm + segEnd);
+		TComparisonResult order = CompareKeySequences(candidate, searchTerm, aMaxLevel, aWildChar, aEscapeChar);
+		if(order != ERightIsPrefixOfLeft && order != EStringsIdentical)
+            {
+			return KErrNotFound;
+            }
+		if(aSearchTermLength == segEnd)
+            {
+			return order == EStringsIdentical ? 0 : KErrNotFound;
+            }
+		firstMatch = 0;
+		}
+
+	// search for all remaining segments
+    // For example: aSearchTerm = "abc*def*ghi", aCandidate = "abc...".
+    // aCandidate was already searched for "abc" and segEnd = 3. 
+    // Search aCandidate for the remaining segments: "def" and "ghi".
+	while(aSearchTermLength != (segEnd + 1))
+		{
+		++segEnd;
+		aSearchTermLength -= segEnd;
+		aSearchTerm += segEnd;
+        segEnd = ::FindCharacter(aWildSequenceChar, aEscapeChar, aSearchTerm, aSearchTermLength);
+		searchTerm = TUTF32Iterator(aSearchTerm, aSearchTerm + segEnd);//searchTerm holds the next aSearchTerm segment
+        //We will store here the current position of candidate string.
+        const TUint16* candidateCurrentPos = candidate.CurrentPosition();		
+        TInt dummy(0);
+        TInt match = FindKeySequence(candidate, searchTerm, aMaxLevel, aWildChar, aEscapeChar, dummy);	
+		if (match < 0)
+            {
+			return KErrNotFound;
+            }
+		if (aSearchTermLength == segEnd)
+			{
+			candidate.SetStart(candidateCurrentPos + match);
+   			TComparisonResult order = CompareKeySequences(candidate, searchTerm, aMaxLevel, aWildChar, aEscapeChar);
+			if (order == EStringsIdentical)
+				return firstMatch < 0 ? (match + candidateCurrentPos - aCandidate): firstMatch;
+			while (match >= 0)
+				{
+				// We are at the very end of the search term, so this segment must
+				// match the end of the candidate string.
+				candidate.SetStart(candidateCurrentPos + match + 1);
+	            candidateCurrentPos = candidate.CurrentPosition();
+				match = FindKeySequence(candidate, searchTerm, aMaxLevel, aWildChar, aEscapeChar, dummy);
+				candidate.SetStart(candidateCurrentPos + match);
+				order = CompareKeySequences(candidate, searchTerm, aMaxLevel, aWildChar, aEscapeChar);
+				if (order == EStringsIdentical)
+					return firstMatch < 0 ? (match + candidateCurrentPos - aCandidate): firstMatch;
+				}
+			return KErrNotFound;
+			}
+        //Initialize the first match position, if not initialized yet
+		if (firstMatch < 0 && segEnd != 0)
+            {
+			firstMatch = match;
+            }
+		}
+	return firstMatch < 0 ? aCandidateLength : firstMatch;
+	}
+
+/**
+Compare values output from the iterators. After the comparison, if
+ERightIsPrefixOfLeft or EStringsIdentical is returned, then aLeft
+will be pointing at the next character (at MaxLevel) after the match.
+If right is shown to be a prefix of left, this means that it has been
+checked at all requested levels. If it is reported that the right is a
+prefix of the left, then this will mean also that there are no unmatched
+combining characters on the left.
+
+@internalComponent
+*/
+TCollate::TComparisonResult TCollate::CompareKeySequences(TUTF32Iterator& aLeft, TUTF32Iterator& aRight,
+                                                          TInt aMaxLevel, TInt aRightStringWildChar, TInt aEscapeChar) const
+	{
+	// Clamp the maximum level of the comparison.
+	if(aMaxLevel < 0)
+        {
+		aMaxLevel = 0;
+        }
+	if(aMaxLevel > 3)
+        {
+		aMaxLevel = 3;
+        }
+	//Case folding forces the maximum level to 2. Case folding could only be done at level 3, which
+	//makes use of the actual Unicode values, if we had access to a case conversion table appropriate for
+	//the collation method.
+	if(aMaxLevel == 3 && (iMethod.iFlags & TCollationMethod::EFoldCase))
+        {
+		aMaxLevel = 2;
+        }
+    TCollationValueIterator itL(iMethod);
+    TCollationValueIterator itR(iMethod);
+	// Perform the comparison.
+	TComparisonResult order = EStringsIdentical;
+	TComparisonResult accumulatedOrder = EStringsIdentical;
+	const TText16* endOfLeft = 0;
+	for (int cur_level = 0; cur_level <= aMaxLevel; cur_level++)
+		{
+	    itL.SetSourceIt(aLeft);
+	    itR.SetSourceIt(aRight);
+
+		for (;;)
+			{
+			TUint32 c2 = itR.GetNextNonZeroKey(cur_level);
+			if (c2 == 0)
+				{
+				TUint32 more = itL.GetNextNonZeroKey(cur_level);
+				if (cur_level == 0)
+					endOfLeft = itL.CurrentPositionIfAtCharacter();
+   				if (more == 0)
+                   {//No non-zero keys at all
+					order = EStringsIdentical;
+					}
+				else if (!(TCollationMethod::EIgnoreCombining & iMethod.iFlags)
+					&& itL.AtCombiningCharacter())
+					{
+					order = ERightComparesLessAndIsNotPrefix;
+					}
+				else
+					{
+					order = ERightIsPrefixOfLeft;
+					}
+				break;
+				}
+			TUint32 c1 = itL.GetNextNonZeroKey(cur_level);
+			if (c1 == 0)
+				{
+				order = ELeftIsPrefixOfRight;
+				break;
+				}
+				
+			itL.Increment();
+			if(cur_level == 0 && aEscapeChar != 0 && itR.MatchChar(aEscapeChar)) 
+				{//Escape character found. Get the next key.
+				c2 = itR.GetNextNonZeroKey(cur_level);
+				itR.Increment();
+				}
+			else
+				{
+				if(aRightStringWildChar && itR.MatchChar(aRightStringWildChar))
+					{
+					itL.SkipCombiningCharacters();
+					itR.SkipCombiningCharacters();
+					c1 = c2;
+					}
+				else
+	                {
+					itR.Increment();
+	                }
+				}
+
+			// Has an order been determined by key difference?
+			if (c1 != c2)
+				{
+				// Fold to lower case, or switch ordering for case or kana syllabary if necessary.
+				if (cur_level == 2 && (c1 <= (0x14 * 4) && c2 <= (0x14 * 4)))
+					{
+					// Divide keys by 4 to get them back into the range 0..63
+					// because keys returned by GetKey are masked but not shifted.
+					c1 /= 4;
+					c2 /= 4;
+					ProcessKeys(c1, c2, iMethod.iFlags);
+					}
+				if (c1 != c2) // test equality again because case folding might have made them equal
+					{
+					order = c1 > c2 ? ERightComparesLessAndIsNotPrefix : ELeftComparesLessAndIsNotPrefix;
+					TBool backwards = cur_level == 1 && (iMethod.iFlags & TCollationMethod::EAccentsBackwards);
+					if (order && !backwards)
+                        {
+						break;
+                        }
+					}
+				}
+			}
+		if (accumulatedOrder != order && order != EStringsIdentical)
+			{
+			if (accumulatedOrder == ERightIsPrefixOfLeft)
+				{
+				return ERightComparesLessAndIsNotPrefix;
+				}
+			else if (accumulatedOrder == ELeftIsPrefixOfRight)
+				{
+				return ELeftComparesLessAndIsNotPrefix;
+				}
+			else
+				{
+				// accumulatedOrder == EStringsIdentical
+				if (order == ELeftComparesLessAndIsNotPrefix || order == ERightComparesLessAndIsNotPrefix)
+					{
+					return order;
+					}
+				}
+			accumulatedOrder = order;
+			}
+		}
+
+	if (accumulatedOrder == EStringsIdentical || accumulatedOrder == ERightIsPrefixOfLeft)
+		{
+		if (endOfLeft)
+			{
+			aLeft.SetStart(endOfLeft);
+			}
+		else if (accumulatedOrder == ERightIsPrefixOfLeft)
+			{
+			accumulatedOrder = ERightComparesLessAndIsNotPrefix;
+			}
+		}
+	return accumulatedOrder;
+	}
+
+/**
+Finds search term inside candidate string. Returns KErrNotFound if there
+is no match, returns the offset into the candidate string at which the
+search term was found. If a string was found, the search term iterator is left
+pointing at the end of the search term, and the candidate iterator is
+left pointing just after the matched keys. aMatchPos returns where in
+the candidate string the match was found.
+
+@internalComponent
+*/
+TInt TCollate::FindKeySequence(TUTF32Iterator& aCandidate, TUTF32Iterator& aSearchTerm, 
+                               TInt aMaxLevel, TInt aWildChar, TInt aEscapeChar, TInt& aLengthFound) const
+	{
+    TInt matchOffset = 0;
+    //Save the start of the candidate string
+    const TText* candidateStart = aCandidate.CurrentPosition();
+    //Create copies of aCandidate and aSearchTerm
+    TUTF32Iterator candidateCopy(aCandidate);
+    TUTF32Iterator searchTermCopy(aSearchTerm);
+    aLengthFound = KErrNotFound;
+    //Do the search
+	for(;;)
+		{
+		TComparisonResult order = CompareKeySequences(aCandidate, aSearchTerm, aMaxLevel, aWildChar, aEscapeChar);
+		if(order == ELeftIsPrefixOfRight)
+            {
+			return KErrNotFound;
+            }
+		if(order == ERightIsPrefixOfLeft || order == EStringsIdentical)
+			{
+			aLengthFound = (aCandidate.CurrentPosition() - candidateStart) - matchOffset;
+			return matchOffset;
+			}
+
+        aCandidate = candidateCopy;
+		aCandidate.Next();
+        ::SkipCombiningCharacters(aCandidate);
+        candidateCopy = aCandidate;
+
+		matchOffset = aCandidate.CurrentPosition() - candidateStart;
+
+		aSearchTerm = searchTermCopy;
+		}
+	}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32/euser/unicode/collateimp.h	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,163 @@
+// Copyright (c) 2000-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+// Some internals of the Unicode collation system.
+#ifndef __COLLATEIMP_H__
+#define __COLLATEIMP_H__
+
+#include <e32std.h>
+#include "collate.h"
+#include "compareimp.h"
+
+//Forward declarations
+struct TCollationKeyTable;
+
+//External declarations
+const TCollationKeyTable* StandardCollationMethod();
+
+/**
+@internalComponent
+*/
+struct TCollationKey
+	{
+	enum { KHighValue = 0x00FFFFFF, KFlagIsStarter = 0x80000000 };
+	TUint32 Level(TInt aLevel) const
+		{
+		static const TUint32 mask[3] = { 0xFFFF0000, 0xFF00, 0xFC };
+		return aLevel == 3 ? iHigh & KHighValue : iLow & mask[aLevel];
+		}
+	TBool IsStarter() const
+        { 
+        return (TBool)(iHigh & (TUint32)KFlagIsStarter);
+        }
+    
+    enum {KLevel0KeySize=2, KLevel1KeySize=1,KLevel2KeySize=1,KLevel3KeySize=3 };
+        
+	static TInt MaxSizePerKey(TInt aLevel)
+		{
+		if (aLevel==0)
+			return KLevel0KeySize;
+		if (aLevel==1 || aLevel==2)
+			return KLevel1KeySize;
+		return KLevel3KeySize;			
+		}
+
+	void AppendToDescriptor(TPtr8 aLevelBuffer,TInt aLevel) const
+		{
+		TBuf8<4> buffer;
+		switch (aLevel)
+			{
+			//for each level need to check for zero key
+			//i.e. only append non zero key
+			case 0:
+				{
+				if (((iLow>>16)&0xFFFF)!=0)
+					{
+					buffer.SetLength(KLevel0KeySize);
+					buffer[0]=(TUint8)((iLow>>24)&0xFF);
+					buffer[1]=(TUint8)((iLow>>16)&0xFF);
+					}
+				break;
+				}
+			case 1:
+				{
+				if (((iLow>>8)&0xFF)!=0)
+					{
+					buffer.SetLength(KLevel1KeySize);
+					buffer[0]=(TUint8)((iLow>>8)&0xFF);
+					}
+				break;
+				}
+			case 2:
+				{
+				if ((iLow&0xFC)!=0)
+					{
+					buffer.SetLength(KLevel2KeySize);
+					buffer[0]=(TUint8)(iLow&0xFC);
+					}
+				break;
+				}
+			case 3:
+				{
+				if ((iHigh&0xFFFFFF)!=0)
+					{
+					buffer.SetLength(KLevel3KeySize);
+					buffer[0]=(TUint8)((iHigh>>16)&0xFF);
+					buffer[1]=(TUint8)((iHigh>>8)&0xFF);
+					buffer[2]=(TUint8)(iHigh&0xFF);
+					}
+				break;
+				}
+			}
+			aLevelBuffer.Append(buffer);
+		}
+ 
+	TUint32 iLow;				// primary, secondary and tertiary keys
+	TUint32 iHigh;				// quaternary key; usually the Unicode value
+	};
+
+/**
+@internalComponent
+*/
+struct TKeyInfo
+	{
+	enum { EMaxKeys = 8 };
+
+	TCollationKey iKey[EMaxKeys];	// the keys
+	TInt iKeys;						// the number of keys returned
+	TInt iCharactersConsumed;		// number of characters consumed from the input to generate the keys
+	};
+
+/**
+Steps through a decomposed unicode string (using iDecompStrIt iterator), 
+outputting raw collation keys.
+Every Increment() call will move to the next collation key (from iKey array), if available.
+Every GetCurrentKey() call will retrieve current collation key, if available.
+@internalComponent
+*/
+class TCollationValueIterator
+	{
+public:
+	inline TCollationValueIterator(const TCollationMethod& aMethod);
+	void SetSourceIt(TUTF32Iterator& aSourceIt);
+	TBool GetCurrentKey(TCollationKey& aKey);
+    TBool GetCurrentKey(TInt aLevel, TUint32& aKey);
+    TUint32 GetNextNonZeroKey(TInt aLevel);
+    TBool MatchChar(TChar aMatch);
+    TBool AtCombiningCharacter();
+    TInt SkipCombiningCharacters();
+	TBool Increment();
+	inline TBool IgnoringNone() const;
+	inline const TCollationMethod& CollationMethod() const;
+	const TText16* CurrentPositionIfAtCharacter();
+
+private:
+	TBool ProduceCollationKeys();
+	void GetNextRawKeySequence();
+	void GetKeyFromTable(const TCollationKeyTable* aTable);
+
+private:
+	TCanonicalDecompositionIteratorCached iDecompStrIt;//Used to iterate through the canonically decomposed input string
+	// Current position in the underlying iterator (if well defined)
+	// of the start of the keys stored in iKey.
+	const TText16* iCurrentPosition;
+	const TCollationMethod& iMethod;//Current (locale dependend) collation method
+	TKeyInfo iKey;//Each ProduceCollationKeys() call fills it with the longest possible collation keys sequence
+    TInt iCurrentKeyPos;//Current position in iKey array. Incremented/set to 0 after each Increment() call
+	};
+
+#include "collateimp.inl"
+
+#endif //__COLLATEIMP_H__
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32/euser/unicode/collateimp.inl	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,43 @@
+// Copyright (c) 2004-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+/**
+ 
+ @param aMethod Defines the collation method to be used in the iterations.
+ @internalComponent
+*/
+inline TCollationValueIterator::TCollationValueIterator(const TCollationMethod& aMethod) : 
+    iMethod(aMethod) 
+    {
+    }
+
+/**
+@return ETrue The method forbids ignoring characters, EFalse otherwise.
+@internalComponent
+*/
+inline TBool TCollationValueIterator::IgnoringNone() const 
+    { 
+    return iMethod.iFlags & TCollationMethod::EIgnoreNone; 
+    }
+
+/**
+@return A const reference to the used collation method.
+@internalComponent
+*/
+inline const TCollationMethod& TCollationValueIterator::CollationMethod() const 
+    { 
+    return iMethod; 
+    }
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32/euser/unicode/compare.cpp	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,1375 @@
+// Copyright (c) 2001-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// Folding and decomposition implementation
+// 
+//
+
+#include "folddecomp.inl"
+#include "compareimp.h"
+#include "u32std.h"
+
+#define ARRAY_LENGTH(a) (static_cast<TInt>(sizeof(a)/sizeof(a[0])))
+
+////////////////////////////////////////////////////////////////////////////////////////////
+// Global functions
+////////////////////////////////////////////////////////////////////////////////////////////
+
+/**
+@internalComponent
+*/
+TChar UTF16ToChar(const TText16* a)
+	{
+	if (0xD800 <= a[0])
+		{
+		if (a[0] < 0xE000)
+			{
+            if (a[0] < 0xDC00 && ::IsLowSurrogate(a[1]))
+				{
+                TChar c = ::PairSurrogates(a[0], a[1]);
+				if ((c & 0xFFFE) != 0xFFFE)
+					return c;
+				}
+			return 0xFFFF;
+			}
+		if (a[0] == 0xFFFE)
+			return 0xFFFF;
+		}
+	return a[0];
+	}
+
+/**
+Is a character a base character (ETrue) or a combiner (EFalse)?
+For now, we will treat all control characters as base characters.
+@internalComponent
+*/
+TBool IsBaseCharacter(TChar a)
+	{
+	if(a < 0x220)
+        {
+		// These Unicode characters are all assigned
+		// and none of them is a combining character
+		return ETrue;
+        }
+	return (a.GetCategory() & 0xFFF0) - TChar::EMarkGroup;
+	}
+
+/**
+@internalComponent
+*/
+inline TInt GetDecompositionIndex(TChar a)
+	{
+    TInt i = DecompositionHashStart(a);
+	TUint32 v = KUnicodeToIndexHash[i];
+	if (!v)
+		return -1;
+	if ((v & 0xFFFFF) != a)
+		{
+        TInt step = DecompositionHashStep(a);
+		do	{
+			i = (i + step) & KDecompositionHashBitmask;
+			v = KUnicodeToIndexHash[i];
+			if (!v)
+				return -1;
+			} while ((v & 0xFFFFF) != a);
+		}
+// it is important that this is an unsigned shift
+	return static_cast<TInt>(v >> 20);
+	}
+
+/**
+Will not work if an invalid index is passed.
+@internalComponent
+*/
+static TUTF32Iterator GetFoldedDecomposition(TInt aIndex)
+	{
+	TInt singletonIndex = aIndex - (sizeof(KNonSingletonFolds)/sizeof(KNonSingletonFolds[0])/2);
+	if (0 <= singletonIndex)
+		return TUTF32Iterator(KSingletonFolds + singletonIndex);
+	const TText* start = KNonSingletonFolds + aIndex * 2;
+	if (*start != KLongD)
+		return TUTF32Iterator(start, start + 2,
+			TUTF32Iterator::EStartsWithValidCharacter);
+	TInt longDecompIndex = start[1];
+	start = KLongDecompositions + (longDecompIndex & 0xFFF);
+	return TUTF32Iterator(start, start + (longDecompIndex >> 12) + 3,
+		TUTF32Iterator::EStartsWithValidCharacter);
+	}
+
+/**
+@internalComponent
+*/
+static TChar GetFirstFoldedChar(TChar a)
+	{
+    TInt index = ::GetDecompositionIndex(a);
+    return index < 0? a : ::GetFoldedDecomposition(index).Current();
+	}
+
+/**
+@internalComponent
+*/
+static TBool FirstFoldedCodeIsNot(TInt aNonSurrogate, TInt aFoldedNonSurrogate)
+	{
+    TInt index = ::GetDecompositionIndex(aNonSurrogate);
+	if (index < 0)
+		return aNonSurrogate - aFoldedNonSurrogate;
+	TInt singletonIndex = index - (sizeof(KNonSingletonFolds)/sizeof(KNonSingletonFolds[0])/2);
+	if (0 < singletonIndex)
+		return KSingletonFolds[singletonIndex] - aFoldedNonSurrogate;
+	const TText* start = KNonSingletonFolds + index * 2;
+	if (start[0] == KLongD)
+		start = KLongDecompositions + (start[1] & 0xFFF);
+	return *start - aFoldedNonSurrogate;
+	}
+
+/**
+@internalComponent
+*/
+static TInt GetClass(TFoldedDecompIterator& a)
+	{
+	ASSERT(!a.AtEnd());
+	a.EnterFoldedSequence();
+	TChar ch = a.Current();
+	TInt cl = ch.GetCombiningClass();
+	if (cl == 0)
+		// Assume starters have been folded from ypogegrammeni
+		cl = 240;
+	return cl;
+	}
+
+////////////////////////////////////////////////////////////////////////////////////////////
+// TUTF32Iterator
+////////////////////////////////////////////////////////////////////////////////////////////
+
+/**
+@internalComponent
+*/
+void TUTF32Iterator::Next()
+	{
+	ASSERT(iStart != iEnd);
+	while (++iStart != iEnd)
+		{
+        iCurrent = ::UTF16ToChar(iStart);
+		if (iCurrent != 0xFFFF)
+			return;
+		}
+	}
+
+/**
+Locates a base character in a string using a folded comparision. Will not find combining 
+characters, nor will it consider Korean combining Jamo to be equivalent to Hangul.
+@internalComponent
+*/
+TBool TUTF32Iterator::LocateFoldedBaseCharacter(TChar aChar)
+	{
+	// A quick shortcut for simple rejections
+	if (aChar < 0xFFFF)
+		{
+        while (iStart != iEnd && *iStart < 0xD800 && ::FirstFoldedCodeIsNot(*iStart, aChar))
+			++iStart;
+		if (iStart != iEnd)
+			{
+            iCurrent = ::UTF16ToChar(iStart);
+			if (iCurrent == 0xFFFF)
+				Next();
+			}
+		}
+	while (!AtEnd())
+		{
+        TChar foldedChar = ::GetFirstFoldedChar(iCurrent);
+		if (aChar == foldedChar)
+			return ETrue;
+		Next();
+		}
+	return EFalse;
+	}
+
+////////////////////////////////////////////////////////////////////////////////////////////
+// TFoldedDecompIterator
+////////////////////////////////////////////////////////////////////////////////////////////
+
+/**
+@internalComponent
+*/
+TFoldedDecompIterator::TFoldedDecompIterator(const TUTF32Iterator& a)
+	{
+	Set(a);
+	}
+
+/**
+@internalComponent
+*/
+TBool TFoldedDecompIterator::AtEnd() const
+	{
+	return iOriginal.AtEnd();
+	}
+
+/**
+@internalComponent
+*/
+TBool TFoldedDecompIterator::AtEndOrWildcard() const
+	{
+	// neither '?' nor '*' have decomposition sequences, so we can assume that
+	// if we are pointing at one or the other, we don't need to check if we
+	// are in a decomposition sequence or not.
+	return iOriginal.AtEnd() || iOriginal.Current() == '?' || iOriginal.Current() == '*';
+	}
+
+/**
+@internalComponent
+*/
+TBool TFoldedDecompIterator::EnterFoldedSequence()
+	{
+	ASSERT(!AtEnd());
+	return !IsInFoldedSequence() && StrictEnterFoldedSequence();
+	}
+
+/**
+Enter folded sequence, assuming that we are not already in one
+@internalComponent
+*/
+TBool TFoldedDecompIterator::StrictEnterFoldedSequence()
+	{
+	ASSERT(!AtEnd());
+	ASSERT(!IsInFoldedSequence());
+    TInt index = ::GetDecompositionIndex(iOriginal.Current());
+	if (index < 0)
+		return EFalse;
+	iFolded = ::GetFoldedDecomposition(index);
+	return ETrue;
+	}
+
+/**
+An iota might have folded from a combining ypogegrammeni.
+If the current character is a base character, this function will
+detect whether it was folded from a combining character (and
+therefore does not constitute a grapheme boundary).
+@internalComponent
+*/
+TBool TFoldedDecompIterator::CurrentIsBaseFoldedFromCombiner() const
+	{
+	if (!IsInFoldedSequence())
+		return EFalse;
+	// The only character that does this is Ypogerammeni, which folds to iota
+	if (iFolded.Current() != 0x3B9)
+		return EFalse;
+	// If the unfolded character is a combiner then it cannot contain an iota,
+	// so it must be an ypogegrammeni that has been folded to one.
+	// This will catch 0x345, the ypogegrammeni itself.
+    if (!::IsBaseCharacter(iOriginal.Current()))
+		return ETrue;
+	// Otherwise the base character will be at the start of the decomposition
+	// sequence. We will assume that it is folded from a genuine iota if and
+	// only if there is an iota at the start of the folded decomposition
+	// sequence. (In theory there might be an iota with a combining
+	// ypogegrammeni, but in practice this will not occur).
+	TInt index = ::GetDecompositionIndex(iOriginal.Current());
+	ASSERT(0 <= index);
+	TUTF32Iterator folded = ::GetFoldedDecomposition(index);
+	return folded.Current() != 0x3B9;
+	}
+
+/**
+@internalComponent
+*/
+TChar TFoldedDecompIterator::Current() const
+	{
+	ASSERT(!AtEnd());
+	return IsInFoldedSequence()? iFolded.Current() : iOriginal.Current();
+	}
+
+/** 
+Move past this code if it matches unfolded or folded 
+@internalComponent
+*/
+TBool TFoldedDecompIterator::Match(TChar aCode)
+	{
+	ASSERT(!AtEnd());
+	if (!IsInFoldedSequence())
+		{
+		if (aCode == iOriginal.Current())
+			{
+			iOriginal.Next();
+			return ETrue;
+			}
+		if (!StrictEnterFoldedSequence())
+			return EFalse;
+		}
+	ASSERT(IsInFoldedSequence());
+	if (aCode == iFolded.Current())
+		{
+		iFolded.Next();
+		if (iFolded.AtEnd())
+			iOriginal.Next();
+		return ETrue;
+		}
+	return EFalse;
+	}
+
+/** 
+Move this and argument past matching character. 
+@internalComponent
+*/
+TBool TFoldedDecompIterator::Match(TFoldedDecompIterator& aThat)
+	{
+	ASSERT(!AtEnd());
+	if (!IsInFoldedSequence())
+		{
+		if ( aThat.Match(iOriginal.Current()) )
+			{
+			iOriginal.Next();
+			return ETrue;
+			}
+		if (!StrictEnterFoldedSequence())
+			return EFalse;
+		}
+	ASSERT(IsInFoldedSequence());
+	if ( aThat.Match(iFolded.Current()) )
+		{
+		iFolded.Next();
+		if (iFolded.AtEnd())
+			iOriginal.Next();
+		return ETrue;
+		}
+	return EFalse;
+	}
+
+/** 
+@internalComponent
+*/
+void TFoldedDecompIterator::Next()
+	{
+	ASSERT(!AtEnd());
+	if (IsInFoldedSequence())
+		{
+		iFolded.Next();
+		if (IsInFoldedSequence())
+			return;
+		}
+	iOriginal.Next();
+	}
+
+////////////////////////////////////////////////////////////////////////////////////////////
+// TFoldedSortedDecompIterator
+////////////////////////////////////////////////////////////////////////////////////////////
+
+/**
+Set this iterator to iterate over the next combining characters.
+Iotas in folded sequences are assumed to be character class 240
+(combining ypogegrammeni). Next() must be used once before
+the first call to Current(), as long as AtEnd() returns false.
+@param aBase Sets the start of the iteration. This value is advanced to the
+             end of the iteration.
+@return The number of codes in the iteration.
+@internalComponent
+*/
+TInt TFoldedSortedDecompIterator::Set(TFoldedDecompIterator &aBase)
+	{
+	iStart = aBase;
+	TInt length = 0;
+	iCurrentClass = 256;
+
+	const TUnicodeDataSet* charDataSet = GetLocaleCharSet()->iCharDataSet;
+
+	// Find the next starter (i.e. character with combining class 0).
+	// We must not count iota folded from ypogegrammeni.
+	// Ypogegrammeni has combining class 240.
+	// Iota has combining class 0.
+	// Also we will be searching for the character with the smallest
+	// combining class to start at.
+	while (!aBase.AtEnd())
+		{
+		aBase.EnterFoldedSequence();
+		TChar ch = aBase.Current();
+		TInt cl = TUnicode(TUint(ch)).GetCombiningClass(charDataSet);
+		if (cl == 0)
+			{
+			if (aBase.CurrentIsBaseFoldedFromCombiner())
+				cl = 240;
+			else
+				break;
+			}
+		if (cl < iCurrentClass)
+			{
+			iCurrentClass = cl;
+			iCurrent = aBase;
+			iCurrentCount = length;
+			}
+		++length;
+		aBase.Next();
+		}
+	iRemaining = length;
+	iLength = length;
+	ASSERT(iLength == 0 || iCurrentClass < 256);
+	return length;
+	}
+
+/** 
+Set this iterator so that AtEnd() returns ETrue. 
+@internalComponent
+*/
+void TFoldedSortedDecompIterator::Set()
+	{
+	iRemaining = 0;
+	}
+
+/** 
+@internalComponent
+*/
+TBool TFoldedSortedDecompIterator::AtEnd() const
+	{
+	return iRemaining == 0;
+	}
+
+/** 
+@internalComponent
+*/
+TChar TFoldedSortedDecompIterator::Current() const
+	{
+	ASSERT(!AtEnd());
+	return iCurrent.Current();
+	}
+
+/** 
+@internalComponent
+*/
+void TFoldedSortedDecompIterator::Next()
+	{
+	ASSERT(!AtEnd());
+	--iRemaining;
+	while (++iCurrentCount != iLength)
+		{
+		iCurrent.Next();
+        if (::GetClass(iCurrent) == iCurrentClass)
+			return;
+		}
+	// We have not found any more of the same class, so we will look
+	// for the smallest one larger.
+	TInt minClass = 256;
+	TFoldedDecompIterator searcher(iStart);
+	TInt searchCount = 0;
+	while (searchCount != iLength)
+		{
+        TInt cl = ::GetClass(searcher);
+		if (iCurrentClass < cl && cl < minClass)
+			{
+			minClass = cl;
+			iCurrentCount = searchCount;
+			iCurrent = searcher;
+			}
+		++searchCount;
+		searcher.Next();
+		}
+	iCurrentClass = minClass;
+	ASSERT(minClass < 256 || AtEnd());
+	}
+
+////////////////////////////////////////////////////////////////////////////////////////////
+// TFoldedCanonicalIterator
+////////////////////////////////////////////////////////////////////////////////////////////
+
+/** 
+@internalComponent
+*/
+TFoldedCanonicalIterator::TFoldedCanonicalIterator(const TUTF32Iterator& a)
+	{
+	iBase.Set(a);
+	iSorted.Set();
+    if(!iBase.AtEnd())
+        {
+	    iBase.EnterFoldedSequence();
+	    if (iBase.Current().GetCombiningClass() != 0 || iBase.CurrentIsBaseFoldedFromCombiner())
+            {
+		    iSorted.Set(iBase);
+            }
+        }
+	}
+
+/** 
+@internalComponent
+*/
+TBool TFoldedCanonicalIterator::AtEnd() const
+	{
+	return iSorted.AtEnd() && iBase.AtEnd();
+	}
+
+/** 
+@internalComponent
+*/
+TChar TFoldedCanonicalIterator::Current() const
+	{
+	ASSERT(!iBase.AtEnd() || !iSorted.AtEnd());
+	return iSorted.AtEnd()? iBase.Current() : iSorted.Current();
+	}
+
+/** 
+@internalComponent
+*/
+void TFoldedCanonicalIterator::Next(const TUnicodeDataSet* aCharDataSet)
+	{
+	ASSERT(!iBase.AtEnd() || !iSorted.AtEnd());
+	if (!iSorted.AtEnd())
+		{
+		iSorted.Next();
+		return;
+		}
+	iBase.Next();
+    if(!iBase.AtEnd())
+        {
+	    iBase.EnterFoldedSequence();
+ 	    if (TUnicode(TUint(iBase.Current())).GetCombiningClass(aCharDataSet) != 0 || iBase.CurrentIsBaseFoldedFromCombiner())
+           {
+		    iSorted.Set(iBase);
+            }
+        }
+	}
+
+////////////////////////////////////////////////////////////////////////////////////////////
+// Folding - Global functions and structures
+////////////////////////////////////////////////////////////////////////////////////////////
+
+/** 
+@internalComponent
+*/
+struct TEndTester 
+    { 
+    typedef enum {EGenuine, EWildcard} TType;
+
+    inline TEndTester(TType aType) :
+        iType(aType)
+        {
+        }
+
+    inline TBool operator()(const TFoldedDecompIterator& a) const
+        {
+        return iType == EGenuine ? a.AtEnd() : a.AtEndOrWildcard();
+        } 
+
+private:
+    TType iType;
+
+    };
+
+/**
+Consumes as much of aCandidate as matches aSearchTerm up to the next '?' or
+'*' wildcard or the end of aSearchTerm.
+It is assumed that the search term begins with a base character.
+Returns true if and only if the whole search term was matched
+with a whole number of UTF16s in the candidate string.
+On return of ETrue the candidate string iterator will have consumed the
+matching characters the search term will have had all its matching characters
+consumed.
+@internalComponent
+*/
+TBool ConsumeFoldedMatch(TUTF32Iterator& aCandidateString, TUTF32Iterator& aSearchTerm,
+                         const TEndTester& aEndTester)
+	{
+	TBool assumeBase = ETrue;
+	TFoldedDecompIterator st(aSearchTerm);
+	TFoldedDecompIterator cs(aCandidateString);
+	while (!aEndTester(st))
+		{
+		if (cs.AtEnd())
+			return EFalse;
+		if (st.Match(cs))
+			{
+			assumeBase = EFalse;
+			if (aEndTester(st))
+				{
+                // We have a match...
+                if (cs.IsInFoldedSequence())
+                    // but it was against only part of a character
+                    // in the original string, so we fail.
+                    return EFalse;
+				aCandidateString = cs.BaseIterator();
+				aSearchTerm = st.BaseIterator();
+				return ETrue;
+				}
+			continue;
+			}
+		// did not match. We need to re-order canonically.
+		if (assumeBase)
+			// The first characters did not match.. do not bother
+			// to re-order.
+			return EFalse;
+		TFoldedSortedDecompIterator csc;
+		TInt cscLength = csc.Set(cs);
+		if (cscLength < 2)
+			// If there are less than two characters to be reordered,
+			// there is no hope of getting a match by re-ordering
+			return EFalse;
+		TFoldedSortedDecompIterator stc;
+		if (cscLength != stc.Set(st))
+			// if the strings have differing numbers of characters,
+			// there can be no match
+			return EFalse;
+		while (!stc.AtEnd())
+			{
+			ASSERT(!csc.AtEnd());
+			if (stc.Current() != csc.Current())
+				// well, we tried.
+				return EFalse;
+			stc.Next();
+			csc.Next();
+			}
+		}
+	// If the candidate string is in a folded sequence, then
+	// we should not accept the match, as we require all matches
+	// to be for a whole number of characters in the original string.
+	if (cs.IsInFoldedSequence())
+		return EFalse;
+	aCandidateString = cs.BaseIterator();
+	aSearchTerm = st.BaseIterator();
+	return ETrue;
+	}
+
+/** 
+@internalComponent
+*/
+TBool ConsumeFoldedMatchWholeGraphemes(TUTF32Iterator& aCandidateString, TUTF32Iterator& aSearchTerm, 
+                                       const TEndTester& aEndTester)
+	{
+    if (!::ConsumeFoldedMatch(aCandidateString, aSearchTerm, aEndTester))
+		return EFalse;
+    return aCandidateString.AtEnd() || ::IsBaseCharacter(aCandidateString.Current());
+	}
+
+/** 
+@internalComponent
+*/
+static TBool ConsumeGrapheme(TUTF32Iterator& a)
+	{
+	if (a.AtEnd())
+		return EFalse;
+	a.Next();
+    while (!a.AtEnd() && !::IsBaseCharacter(a.Current()))
+		a.Next();
+	return ETrue;
+	}
+
+/** 
+@internalComponent
+*/
+TBool MatchSectionFolded(TUTF32Iterator& aCandidateString, TUTF32Iterator& aSearchTerm)
+	{
+    TEndTester endTester(TEndTester::EWildcard);
+    while(::ConsumeFoldedMatchWholeGraphemes(aCandidateString, aSearchTerm, endTester))
+		{
+		if (aSearchTerm.AtEnd() || aSearchTerm.Current() == '*')
+			return ETrue;
+		ASSERT(aSearchTerm.Current() == '?');
+		aSearchTerm.Next();
+        if (!::ConsumeGrapheme(aCandidateString))
+			return EFalse;
+		}
+	return EFalse;
+	}
+
+/** 
+@internalComponent
+*/
+TBool FindMatchSectionFolded(TUTF32Iterator& aCandidateString, TUTF32Iterator& aSearchTerm)
+	{
+	// match as many graphemes as there are leading ?s
+	while (!aSearchTerm.AtEnd()
+		&& aSearchTerm.Current() != '*' && aSearchTerm.Current() == '?')
+		{
+        if (!::ConsumeGrapheme(aCandidateString))
+			return EFalse;
+		aSearchTerm.Next();
+		}
+	if (aSearchTerm.AtEnd() || aSearchTerm.Current() == '*')
+		return ETrue;
+    TChar firstCharOfSearchTerm = ::GetFirstFoldedChar(aSearchTerm.Current());
+	TUTF32Iterator savedST(aSearchTerm);
+	while (aCandidateString.LocateFoldedBaseCharacter(firstCharOfSearchTerm))
+		{
+		TUTF32Iterator savedCS = aCandidateString;
+		if (::MatchSectionFolded(aCandidateString, aSearchTerm))
+			return ETrue;
+		aSearchTerm = savedST;
+		aCandidateString = savedCS;
+		aCandidateString.Next();
+		}
+	return EFalse;
+	}
+
+/** 
+@internalComponent
+*/
+TBool MatchStringFolded(const TText16* aCandidateStringStart, const TText16* aCandidateStringEnd,
+                        const TText16* aSearchTermStart, const TText16* aSearchTermEnd)
+	{
+	TUTF32Iterator candidate(aCandidateStringStart, aCandidateStringEnd);
+	TUTF32Iterator searchTerm(aSearchTermStart, aSearchTermEnd);
+	// First section of search term must match exactly at the start of the
+	// candidate string.
+	if (!::MatchSectionFolded(candidate, searchTerm))
+		return EFalse;
+
+	// If there was only one section, it must match the whole candidate string.
+	if (searchTerm.AtEnd())
+		return candidate.AtEnd();
+
+	while (!searchTerm.AtEnd())
+		{
+		searchTerm.Next();
+		if (!::FindMatchSectionFolded(candidate, searchTerm))
+			return EFalse;
+		}
+
+	// The last section must match exactly at the end of the candidate string.
+	if (candidate.AtEnd())	// shortcut
+		return ETrue;
+	const TText16* searchTermLastSection = aSearchTermEnd;
+	while (searchTermLastSection != aSearchTermStart
+		&& searchTermLastSection[-1] != '*')
+		--searchTermLastSection;
+	if (searchTermLastSection == aSearchTermEnd)
+		// last section is null, so trivially matches
+		return ETrue;
+	// Count graphemes by counting the number of base characters.
+	// The first one is assumed to start a grapheme.
+	TInt graphemeCount = 1;
+	for (const TText16* s = searchTermLastSection + 1; s != aSearchTermEnd; ++s)
+		{
+        if (::IsBaseCharacter(*s))
+			++graphemeCount;
+		}
+	// Count this many graphemes back in the candidate string
+	const TText16* candidateLastSection = aCandidateStringEnd;
+	while (graphemeCount != 0
+		&& candidateLastSection != aCandidateStringStart)
+		{
+        if (::IsBaseCharacter(*--candidateLastSection))
+			--graphemeCount;
+		}
+	TUTF32Iterator last(candidateLastSection, aCandidateStringEnd);
+	TUTF32Iterator st(searchTermLastSection, aSearchTermEnd);
+	return ::MatchSectionFolded(last, st);
+	}
+
+/** 
+Implementation of MatchF
+(slow if there is a match: MatchStringFolded is better, but does not return
+the position of the match)
+@internalComponent
+*/
+TInt LocateMatchStringFolded(const TText16* aCandidateStringStart, const TText16* aCandidateStringEnd,
+                             const TText16* aSearchTermStart, const TText16* aSearchTermEnd)
+	{
+	// Quick shortcut for simple non-match
+	if (aSearchTermStart != aSearchTermEnd && *aSearchTermStart != '*')
+		{
+		if (aCandidateStringStart == aCandidateStringEnd)
+			return KErrNotFound;
+		// We won't bother with non-characters and surrogate pairs.
+		if (*aSearchTermStart != '?'
+			&& *aSearchTermStart < 0xD800
+			&& *aCandidateStringStart < 0xD800
+            && ::GetFirstFoldedChar(*aSearchTermStart) != ::GetFirstFoldedChar(*aCandidateStringStart))
+			return KErrNotFound;
+		}
+    if (!::MatchStringFolded(aCandidateStringStart, aCandidateStringEnd,
+		aSearchTermStart, aSearchTermEnd))
+		return KErrNotFound;
+	// find where it matches
+	while (aSearchTermStart != aSearchTermEnd && *aSearchTermStart == '*')
+		++aSearchTermStart;
+	const TText16* end = aSearchTermStart;
+	while (end != aSearchTermEnd && *end != '*')
+		++end;
+	// To preserve existing behaviour, a search term consisting of nothing
+	// but stars is considered to match at 0.
+	if (end == aSearchTermStart)
+		return 0;
+	for (const TText16* csSection = aCandidateStringStart;
+		csSection <= aCandidateStringEnd; ++csSection)
+		{
+		TUTF32Iterator cs(csSection, aCandidateStringEnd);
+		TUTF32Iterator st(aSearchTermStart, end);
+        if (::MatchSectionFolded(cs, st))
+			{
+			// If this match must match exactly at the end, we must keep
+			// going.
+			// This could be a lot faster, with some optimizations.
+			if (end == aSearchTermEnd)
+				{
+				if (!cs.AtEnd())
+					continue;
+				}
+			return csSection - aCandidateStringStart;
+			}
+		}
+	// this should never happen!
+	ASSERT(0);
+	return KErrNotFound;
+	}
+
+/** 
+Implementation of FindF
+@internalComponent
+*/
+TInt FindFolded(TUTF32Iterator& aCandidateString, TUTF32Iterator& aSearchTerm)
+	{
+    //Empty aSearchTerm string? - Then return 0 - keep the new implementation functionally 
+    //compatible with the old one.
+    if(aSearchTerm.Length() == 0)
+        {
+        return 0;
+        }
+	const TText16* candidateStartPosition = aCandidateString.CurrentPosition();
+    TChar firstCharOfSearchTerm = ::GetFirstFoldedChar(aSearchTerm.Current());
+	TUTF32Iterator savedST(aSearchTerm);
+	while (aCandidateString.LocateFoldedBaseCharacter(firstCharOfSearchTerm))
+		{
+		TUTF32Iterator savedCS = aCandidateString;
+        TEndTester endTester(TEndTester::EGenuine);
+        if (::ConsumeFoldedMatchWholeGraphemes(aCandidateString, aSearchTerm, endTester))
+			return savedCS.CurrentPosition() - candidateStartPosition;
+		aSearchTerm = savedST;
+		aCandidateString = savedCS;
+		aCandidateString.Next();
+		}
+	return KErrNotFound;
+	}
+
+/** 
+Implementation of boolean CompareF
+@internalComponent
+*/
+TBool EqualsFolded(TUTF32Iterator& aLeft, TUTF32Iterator& aRight)
+	{
+    TEndTester endTester(TEndTester::EGenuine);
+    if (::ConsumeFoldedMatchWholeGraphemes(aLeft, aRight, endTester))
+		return aLeft.AtEnd();
+	return EFalse;
+	}
+
+/** 
+Implementation of tri-state CompareF
+@internalComponent
+*/
+TInt CompareFolded(const TUTF32Iterator& aLeft, const TUTF32Iterator& aRight)
+	{
+	TFoldedCanonicalIterator left(aLeft);
+	TFoldedCanonicalIterator right(aRight);
+
+	const TUnicodeDataSet* charDataSet = GetLocaleCharSet()->iCharDataSet;
+
+	while (!left.AtEnd())
+		{
+		if (right.AtEnd())
+			return 1;
+		TChar cr = right.Current();
+		TChar cl = left.Current();
+		if (cr != cl)
+			return cl - cr;
+        right.Next(charDataSet);
+        left.Next(charDataSet);
+		}
+	return right.AtEnd()? 0 : -1;
+	}
+
+////////////////////////////////////////////////////////////////////////////////////////////
+// Composition/Decomposition - Global functions and structures
+////////////////////////////////////////////////////////////////////////////////////////////
+
+/** 
+@internalComponent
+*/
+static TUTF32Iterator IndexToNonSingletonDecomposition(TInt aIndex)
+	{
+	const TText* start = KNonSingletonDecompositions + aIndex * 2;
+	if (*start != KLongD)
+		return TUTF32Iterator(start, start + 2, TUTF32Iterator::EStartsWithValidCharacter);
+	TInt longDecompIndex = start[1];
+	start = KLongDecompositions + (longDecompIndex & 0xFFF);
+	return TUTF32Iterator(start, start + (longDecompIndex >> 12) + 3, TUTF32Iterator::EStartsWithValidCharacter);
+	}
+
+/** 
+Come up with a decomposition for the current value pointed at by the iterator
+@internalComponent
+*/
+static TBool Decompose(const TUTF32Iterator& aUTF32It, TUTF32Iterator& aOutIt)
+	{
+    TInt index = ::GetDecompositionIndex(aUTF32It.Current());
+	TInt singletonIndex = index - (sizeof(KNonSingletonFolds)/sizeof(KNonSingletonFolds[0])/2);
+	const TInt SizeOfSingletonTable = sizeof(KSingletonDecompositions)/sizeof(KSingletonDecompositions[0])/2;
+	if(index < 0 || SizeOfSingletonTable <= singletonIndex)
+        {
+        aOutIt = aUTF32It.CurrentAsIterator();
+		return EFalse;//There is not any valid decomposition
+        }
+	if(0 <= singletonIndex)
+        {
+		aOutIt = TUTF32Iterator(KSingletonDecompositions + singletonIndex);
+        }
+    else
+        {
+        aOutIt = ::IndexToNonSingletonDecomposition(index);
+        }
+    return ETrue;//Valid decomposition
+	}
+
+/** 
+@internalComponent
+*/
+static TUTF32Iterator CharToUTF32Iterator(TChar aChar, TDes16& aBuf)
+	{
+	aBuf.Zero();
+	if (aChar < 0x10000)
+		aBuf.Append(aChar);
+	else
+		{
+		aBuf.Append((aChar >> 10) + 0xD7C0);
+		aBuf.Append((aChar & 0x3FF) + 0xDC00);
+		}
+	const TText16* t = aBuf.Ptr();
+	return TUTF32Iterator(t, t + aBuf.Length());
+	}
+
+/** 
+@internalComponent
+*/
+TBool DecomposeChar(TChar aCh, TPtrC16& aResult)
+    {
+    aResult.Set(NULL, 0);
+    TBuf16<2> srcBuf;
+    TUTF32Iterator it = ::CharToUTF32Iterator(aCh, srcBuf);
+    TBool res = ::Decompose(it, it);
+    if(res)
+        {
+        aResult.Set(it.CurrentPosition(), it.Length());
+        }
+    return res;
+    }
+
+/** 
+Turn an index into the hash table known to point to a non-singleton
+decomposition into that decomposition.
+@internalComponent
+*/
+static TUTF32Iterator HashIndexToDecomposition(TInt aIndex)
+	{
+	TUint32 v = KUnicodeToIndexHash[aIndex];
+	ASSERT(v != 0);
+	TInt index = static_cast<TInt>(v >> 20);
+	ASSERT(index < ARRAY_LENGTH(KNonSingletonDecompositions)/2);
+    return ::IndexToNonSingletonDecomposition(index);
+	}
+
+/**
+Takes a start and (one past the) end index into KCompostionMapping
+and a number of UTF16 characters (aLengthSoFar). All of the compositions
+within the range must have their first aLengthSoFar UTF16 characters
+matching.
+
+On entry, if aStart == aEnd then there is no possibility of a match so return
+immediately with EFalse. To continue, aStart must be strictly less than aEnd.
+
+Afterwards, aStart and aEnd will be narrowed to all those compositions
+where the aLengthSoFar'th UTF16 character matches aNextCharacter.
+No further compositions existing is indicated by aStart == aEnd.
+
+@return ETrue if the composition at aStart is exactly of length aLengthSoFar + 1.
+@internalComponent
+*/
+static TBool RefineComposition(TInt& aStart, TInt& aEnd, TInt aLengthSoFar, TInt aNextCharacter)
+	{
+	if (aStart == aEnd)
+		return EFalse;
+	ASSERT((TUint)aStart < (TUint)aEnd);
+ 	ASSERT((TUint)aEnd <= (TUint)ARRAY_LENGTH(KCompositionMapping));
+    TUTF32Iterator startIterator(::HashIndexToDecomposition(KCompositionMapping[aStart]));
+	if (startIterator.Length() == aLengthSoFar)
+		++aStart;
+
+	// Find a single example of a decomposition that is suitable
+	TInt mid;
+	TUTF32Iterator midIt;
+	for (;;)
+		{
+		if (aStart == aEnd)
+			return EFalse;
+		mid = aStart + ((aEnd - aStart) >> 1);
+        midIt = ::HashIndexToDecomposition(KCompositionMapping[mid]);
+		ASSERT(aLengthSoFar < midIt.Length());
+		TInt midItChar = midIt[aLengthSoFar];
+		if (midItChar < aNextCharacter)
+			aStart = mid + 1;
+		else if (aNextCharacter < midItChar)
+			aEnd = mid;
+		else
+			{
+			startIterator = midIt;
+			break;
+			}
+		}
+
+	// FInd the first decomposition that does not match
+	TInt start2 = mid + 1;
+	while (start2 != aEnd)
+		{
+		ASSERT(start2 < aEnd);
+		TInt mid2 = start2 + ((aEnd - start2) >> 1);
+        midIt = ::HashIndexToDecomposition(KCompositionMapping[mid2]);
+		ASSERT(aLengthSoFar < midIt.Length());
+		TInt midItChar = midIt[aLengthSoFar];
+		ASSERT(aNextCharacter <= midItChar);
+		if (aNextCharacter < midItChar)
+			aEnd = mid2;
+		else
+			start2 = mid2 + 1;
+		}
+
+	// Find the first decomposition that matches
+	while (aStart != mid)
+		{
+		ASSERT(aStart < mid);
+		TInt mid2 = aStart + ((mid - aStart) >> 1);
+        midIt = ::HashIndexToDecomposition(KCompositionMapping[mid2]);
+		ASSERT(aLengthSoFar < midIt.Length());
+		TInt midItChar = midIt[aLengthSoFar];
+		ASSERT(midItChar <= aNextCharacter);
+		if (midItChar < aNextCharacter)
+			aStart = mid2 + 1;
+		else
+			{
+			startIterator = midIt;
+			mid = mid2;
+			}
+		}
+
+	return startIterator.Length() == (aLengthSoFar + 1);
+	}
+
+/** 
+@internalComponent
+*/
+static TBool RefineCompositionUTF32(TInt& aStart, TInt& aEnd, TInt& aLengthSoFar, TChar aChar)
+	{
+	if (aChar < 0x10000)
+        return ::RefineComposition(aStart, aEnd, aLengthSoFar++, aChar);
+    ::RefineComposition(aStart, aEnd, aLengthSoFar++, (aChar >> 10) + 0xD7C0);
+	if (aStart == aEnd)
+		return EFalse;
+    return ::RefineComposition(aStart, aEnd, aLengthSoFar++, (aChar & 0x3FF) + 0xDC00);
+	}
+
+/**
+Combine as many of the characters presented as possible into a single
+character.
+@return The number of characters successfully combined.
+@param aCombined If a nonzero value is returned, this contains
+            the character that is that number of characters from the start of
+            aDes combined.
+@internalComponent
+*/
+TInt CombineAsMuchAsPossible(const TDesC16& aDes, TChar& aCombined)
+	{
+	TInt start = 0;
+	TInt end = sizeof(KCompositionMapping)/sizeof(KCompositionMapping[0]);
+	TInt length = 0;
+	TInt bestIndex = 0;
+	TInt bestLength = 0;
+	const TText16* ptr = aDes.Ptr();
+	TUTF32Iterator input(ptr, ptr + aDes.Length());
+	while (!input.AtEnd())
+		{
+        if (::RefineCompositionUTF32(start, end, length, input.Current()))
+			{
+			bestIndex = start;
+			bestLength = length;
+			}
+		input.Next();
+		}
+	if (bestLength == 0)
+		return 0;
+	aCombined = KUnicodeToIndexHash[KCompositionMapping[bestIndex]] & 0xFFFFF;
+	return bestLength;
+	}
+
+//////////////////////////////////////////////////////////////////////////////////////////////
+// COLLATION
+//////////////////////////////////////////////////////////////////////////////////////////////
+
+//////////////////////////////////////////////////////////////////////////////////////////////
+// TDecompositionIterator class
+
+/** 
+@internalComponent
+*/
+void TDecompositionIterator::Set(const TUTF32Iterator& a)
+	{
+	iBase = a;
+	if (!iBase.AtEnd())
+        {
+        (void)::Decompose(iBase, iDecomposition);
+        }
+	}
+
+/** 
+@internalComponent
+*/
+TDecompositionIterator::TDecompositionIterator(const TUTF32Iterator& a)
+	{
+	Set(a);
+	}
+
+/** 
+@internalComponent
+*/
+TBool TDecompositionIterator::AtEnd() const
+	{
+	return iBase.AtEnd();
+	}
+
+/** 
+@internalComponent
+*/
+TChar TDecompositionIterator::Current() const
+	{
+	return iDecomposition.Current();
+	}
+
+/** 
+@internalComponent
+*/
+void TDecompositionIterator::Next()
+	{
+	ASSERT(!iBase.AtEnd() && !iDecomposition.AtEnd());
+	iDecomposition.Next();
+	if (!iDecomposition.AtEnd())
+		return;
+	iBase.Next();
+	if (!iBase.AtEnd())
+        {
+        (void)::Decompose(iBase, iDecomposition);
+        }
+	}
+
+/** 
+@internalComponent
+*/
+const TText16* TDecompositionIterator::CurrentPosition() const
+	{
+	return iBase.CurrentPosition();
+	}
+
+/** 
+Find out the length and minimum combining class of
+the current run of characters of nonzero combining class.
+aMinClass and aMinClassPos are not written to if the return
+value is 0.
+aEndOfRun is written to with the final position of the iteration
+if 0 is returned and aEndOfRun is non-null
+@internalComponent
+*/
+static TInt ReorderingRun(TInt& aMinClass, TDecompositionIterator& aMinClassPos,
+                          const TDecompositionIterator& aStart, TBool* aOpenSequence, 
+                          TInt aMaxDisallowedClass = 0, TDecompositionIterator* aEndOfRun = 0)
+	{
+	TInt comclass = aStart.AtEnd()? 0 : aStart.Current().GetCombiningClass();
+	if (comclass == 0)
+		{
+		if (aEndOfRun)
+			*aEndOfRun = aStart;
+		if (aOpenSequence)
+			*aOpenSequence = aStart.AtEnd();
+		return 0;
+		}
+	aMinClass = 256;
+	TDecompositionIterator i = aStart;
+	TInt count = 0;
+	while (comclass != 0)
+		{
+		if (aMaxDisallowedClass < comclass)
+			{
+			if (comclass < aMinClass)
+				{
+				aMinClass = comclass;
+				aMinClassPos = i;
+				}
+			++count;
+			}
+		i.Next();
+		comclass = i.AtEnd()? 0 : i.Current().GetCombiningClass();
+		}
+	if (count == 0 && aEndOfRun)
+		*aEndOfRun = i;
+	if (aOpenSequence)
+		*aOpenSequence = i.AtEnd();
+	return count;
+	}
+
+//////////////////////////////////////////////////////////////////////////////////////////////
+// TCanonicalDecompositionIterator class
+
+/** 
+@internalComponent
+*/
+void TCanonicalDecompositionIterator::Set(const TUTF32Iterator& a)
+	{
+	iBase.Set(a);
+	iLastPosition = 0;
+	if (ReorderingRun(iCurrentCombiningClass, iCurrent, iBase, &iInOpenSequence) < 2)
+		iCurrentCombiningClass = 0;
+	}
+
+/** 
+@internalComponent
+*/
+TBool TCanonicalDecompositionIterator::AtEnd() const
+	{
+	return iBase.AtEnd();
+	}
+
+/** 
+@internalComponent
+*/
+TChar TCanonicalDecompositionIterator::Current() const
+	{
+	return iCurrentCombiningClass? iCurrent.Current() : iBase.Current();
+	}
+
+/** 
+@internalComponent
+*/
+void TCanonicalDecompositionIterator::Next()
+	{
+	iLastPosition = iBase.CurrentPosition();
+	if (iCurrentCombiningClass == 0)
+		{
+		iBase.Next();
+		if (ReorderingRun(iCurrentCombiningClass, iCurrent, iBase, &iInOpenSequence) < 2)
+			iCurrentCombiningClass = 0;
+		return;
+		}
+	// Find the next character in the run with the same combining class
+	iCurrent.Next();
+	TInt curclass = iCurrent.AtEnd()? 0 : iCurrent.Current().GetCombiningClass();
+	while (curclass != 0)
+		{
+		if (curclass == iCurrentCombiningClass)
+			// success
+			return;
+		iCurrent.Next();
+		curclass = iCurrent.AtEnd()? 0 : iCurrent.Current().GetCombiningClass();
+		}
+	// There are none left in the current class. Find out what the next one is.
+	if (0 == ReorderingRun(iCurrentCombiningClass, iCurrent, iBase, 0, iCurrentCombiningClass, &iBase))
+		iCurrentCombiningClass = 0;
+	}
+
+/** 
+@internalComponent
+*/
+const TText16* TCanonicalDecompositionIterator::CurrentPositionIfAtCharacter() const
+	{
+	if (iCurrentCombiningClass != 0)
+		return 0;
+	const TText16* p = iBase.CurrentPosition();
+	return iLastPosition == p? 0 : p;
+	}
+
+/** 
+@internalComponent
+*/
+TBool TCanonicalDecompositionIterator::IsInOpenSequence() const
+	{
+	return iInOpenSequence;
+	}
+
+//////////////////////////////////////////////////////////////////////////////////////////////
+// TCanonicalDecompositionIteratorCached class
+
+/** 
+@internalComponent
+*/
+void TCanonicalDecompositionIteratorCached::Set(const TUTF32Iterator& a)
+	{
+	iBase.Set(a);
+	iCacheStart = 0;
+	iCacheSize = 0;
+	}
+
+/** 
+@internalComponent
+*/
+TBool TCanonicalDecompositionIteratorCached::AtEnd() const
+	{
+	return iCacheSize == 0 && iBase.AtEnd();
+	}
+
+/** 
+@internalComponent
+*/
+void TCanonicalDecompositionIteratorCached::Next(TInt aOffset)
+	{
+	ASSERT(0 <= aOffset);
+	ASSERT(0 <= iCacheSize);
+	ASSERT(0 != iCacheSize || !iBase.AtEnd());
+	if (aOffset <= iCacheSize)
+		{
+		iCacheSize -= aOffset;
+		iCacheStart = (iCacheStart + aOffset) & (KMaxLookAhead - 1);
+		return;
+		}
+	aOffset -= iCacheSize;
+	iCacheSize = 0;
+	while (aOffset != 0)
+		{
+		iBase.Next();
+		--aOffset;
+		}
+	}
+
+/** 
+Get the character at the position of the iterator plus aOffset steps.
+Returns -1 if we are looking too far ahead.
+@internalComponent
+*/
+TChar TCanonicalDecompositionIteratorCached::Get(TInt aOffset)
+	{
+	// should be assert debug: there is a chance this could go off with
+	// bad collation tables
+	ASSERT(aOffset <= KMaxLookAhead);
+	while (iCacheSize <= aOffset)
+		{
+		if (iBase.AtEnd())
+			return TChar(static_cast <TUint> (-1));
+		TInt cachePos = (iCacheStart + iCacheSize) & (KMaxLookAhead - 1);
+		iCache[cachePos].iChar = iBase.Current();
+		iCache[cachePos].iPos = iBase.CurrentPositionIfAtCharacter();
+		++iCacheSize;
+		iBase.Next();
+		}
+	return iCacheSize == aOffset? iBase.Current() : iCache[(iCacheStart + aOffset) & (KMaxLookAhead - 1)].iChar;
+	}
+
+/** 
+If the current position in the original string is representable
+as a pointer into it and we know what it is, return it.
+@internalComponent
+*/
+const TText16* TCanonicalDecompositionIteratorCached::CurrentPositionIfAtCharacter() const
+	{
+	if(iCacheSize == 0)
+		{
+		return iBase.CurrentPositionIfAtCharacter();
+		}
+	return iCache[iCacheStart & (KMaxLookAhead - 1)].iPos;
+	}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32/euser/unicode/compareimp.h	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,241 @@
+// Copyright (c) 2002-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// Folding and decomposition implementation
+// 
+//
+
+#ifndef __COMPAREIMP_H__
+#define __COMPAREIMP_H__
+
+#include <e32std.h>
+#include <unicode.h>
+
+//Forward declarations
+class TUTF32Iterator;
+
+//////////////////////////////////////////////////////////////////////////////////////////////
+// Global functions
+//////////////////////////////////////////////////////////////////////////////////////////////
+
+TChar UTF16ToChar(const TText16* a);
+TBool IsBaseCharacter(TChar);
+
+TBool MatchSectionFolded(TUTF32Iterator& aCandidateString, TUTF32Iterator& aSearchTerm);
+
+TBool FindMatchSectionFolded(TUTF32Iterator& aCandidateString, TUTF32Iterator& aSearchTerm);
+
+TBool MatchStringFolded(const TText16* aCandidateStringStart, const TText16* aCandidateStringEnd,
+                        const TText16* aSearchTermStart, const TText16* aSearchTermEnd);
+
+TInt LocateMatchStringFolded(const TText16* aCandidateStringStart, const TText16* aCandidateStringEnd,
+                             const TText16* aSearchTermStart, const TText16* aSearchTermEnd);
+
+TInt FindFolded(TUTF32Iterator& aCandidateString, TUTF32Iterator& aSearchTerm);
+
+TInt CompareFolded(const TUTF32Iterator& aLeft, const TUTF32Iterator& aRight);
+
+TInt CombineAsMuchAsPossible(const TDesC16& aDes, TChar& aCombined);
+
+TBool DecomposeChar(TChar aCh, TPtrC16& aResult);
+
+inline void SkipCombiningCharacters(TUTF32Iterator& aUTF32It);
+
+/**
+Converts UTF16 into UTF32, ignoring non-characters and
+unpaired surrogates and combining paired surrogates.
+@internalComponent
+*/
+class TUTF32Iterator
+	{
+public:
+	enum TStartsWithValidCharacter { EStartsWithValidCharacter };
+	inline TUTF32Iterator();
+	inline explicit TUTF32Iterator(const TText16* aSingleton);
+	inline TUTF32Iterator(const TText16* aStart, const TText16* aEnd);
+	inline TUTF32Iterator(const TText16* aStart, const TText16* aEnd, TStartsWithValidCharacter);
+
+	inline TUTF32Iterator CurrentAsIterator() const;
+	inline TBool AtEnd() const;
+	void Next();
+	inline TChar Current() const;
+	TBool LocateFoldedBaseCharacter(TChar aChar);
+	inline const TText16* CurrentPosition() const;
+	inline TInt Length() const;
+	inline TInt operator[](TInt) const;
+	inline void SetStart(const TText16*);
+private:
+	const TText16* iStart;
+	const TText16* iEnd;
+	TChar iCurrent;
+	};
+
+//////////////////////////////////////////////////////////////////////////////////////////////
+// FOLDING
+//////////////////////////////////////////////////////////////////////////////////////////////
+
+/**
+@internalComponent
+*/
+class TFoldedDecompIterator
+	{
+public:
+	inline TFoldedDecompIterator();
+	explicit TFoldedDecompIterator(const TUTF32Iterator&);
+	inline void Set(const TUTF32Iterator&);
+	TBool AtEnd() const;
+	TBool AtEndOrWildcard() const;
+	TBool EnterFoldedSequence();
+	TBool StrictEnterFoldedSequence();
+	inline TBool IsInFoldedSequence() const;
+	TBool CurrentIsBaseFoldedFromCombiner() const;
+	TChar Current() const;
+	TBool Match(TChar aCode);
+	TBool Match(TFoldedDecompIterator& aThat);
+	void Next();
+	inline TUTF32Iterator BaseIterator() const;
+private:
+	TUTF32Iterator iOriginal;
+	TUTF32Iterator iFolded;
+	};
+
+/**
+Sorts sequences of combining characters with non-zero combining classes into
+order of their combining classes.
+@internalComponent
+*/
+class TFoldedSortedDecompIterator
+	{
+public:
+	inline TFoldedSortedDecompIterator();
+	TInt Set(TFoldedDecompIterator &aBase);
+	void Set();
+	TBool AtEnd() const;
+	TChar Current() const;
+	void Next();
+
+private:
+	TFoldedDecompIterator iStart; // Starting code.	
+	TInt iLength; // Length in decomposed codes.
+	TFoldedDecompIterator iCurrent; // Current code.
+	TInt iCurrentCount; // Number of decomposed codes iCurrent is past iStart
+	TInt iCurrentClass; // Current class being searched for.
+	TInt iRemaining; // Number of Next()s left
+	};
+
+/**
+Iterator that outputs canonically decomposed folded strings.
+This is much slower than using the matching functions, so should only
+be used where an ordering is required.
+@internalComponent
+*/
+class TFoldedCanonicalIterator
+	{
+public:
+	TFoldedCanonicalIterator(const TUTF32Iterator&);
+	TBool AtEnd() const;
+	TChar Current() const;
+	void Next(const TUnicodeDataSet* aCharDataSet);
+private:
+	TFoldedDecompIterator iBase;
+	TFoldedSortedDecompIterator iSorted;
+	};
+
+
+//////////////////////////////////////////////////////////////////////////////////////////////
+// COLLATION
+//////////////////////////////////////////////////////////////////////////////////////////////
+
+/**
+@internalComponent
+*/
+class TDecompositionIterator
+	{
+public:
+	inline TDecompositionIterator();
+	void Set(const TUTF32Iterator&);
+	explicit TDecompositionIterator(const TUTF32Iterator&);
+	TBool AtEnd() const;
+	TChar Current() const;
+	void Next();
+	const TText16* CurrentPosition() const;
+private:
+	TUTF32Iterator iBase;
+	TUTF32Iterator iDecomposition;
+	};
+
+/**
+@internalComponent
+*/
+class TCanonicalDecompositionIterator
+	{
+public:
+	inline TCanonicalDecompositionIterator();
+	void Set(const TUTF32Iterator&);
+	TBool AtEnd() const;
+	TChar Current() const;
+	void Next();
+	const TText16* CurrentPositionIfAtCharacter() const;
+	TBool IsInOpenSequence() const;
+private:
+	TDecompositionIterator iBase;
+	// iBase.CurrentPosition() before the last move
+	const TText16* iLastPosition;
+	// If iCurrent is active, iCurrentCombiningClass
+	// is nonzero, and represents the combining class
+	// of the character it points to.
+	TInt iCurrentCombiningClass;
+	// contains true if more characters added to the end may change
+	// the characters currently being output
+	TBool iInOpenSequence;
+	// Iterator that looks for characters to be sorted.
+	TDecompositionIterator iCurrent;
+	};
+
+/**
+Iterator that gives the canonically decomposed form of
+its input, and allows a limited amount of look-ahead (i.e.
+peeking further into the decomposition without moving
+the iterator)
+@internalComponent
+*/
+class TCanonicalDecompositionIteratorCached
+	{
+public:
+	void Set(const TUTF32Iterator&);
+	TBool AtEnd() const;
+	// Advance aOffset characters.
+	void Next(TInt aOffset);
+	// Get the character at the position of the iterator plus aOffset steps.
+	// Returns FFFF if we are looking too far ahead.
+	TChar Get(TInt aOffset);
+	// If the current position in the original string is representable
+	// as a pointer into it and we know what it is, return it.
+	const TText16* CurrentPositionIfAtCharacter() const;
+private:
+	// KMaxLookAhead must be a power of 2
+	enum { KMaxLookAhead = 8 };
+	TCanonicalDecompositionIterator iBase;
+	struct TCache
+		{
+		TChar iChar;
+		const TText16* iPos;
+		};
+	TCache iCache[KMaxLookAhead + 1];
+	TInt iCacheStart;
+	TInt iCacheSize;
+	};
+
+#include "compareimp.inl"
+
+#endif //__COMPAREIMP_H__
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32/euser/unicode/compareimp.inl	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,252 @@
+// Copyright (c) 2004-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+/**
+ @internalComponent
+*/
+inline TBool IsSurrogate(TText a) 
+	{ 
+	return 0xD800 == (a & 0xF800); 
+	}
+
+/**
+@internalComponent
+*/
+inline TBool IsHighSurrogate(TText a) 
+	{ 
+	return 0xD800 == (a & 0xFC00); 
+	}
+
+/**
+@internalComponent
+*/
+inline TBool IsLowSurrogate(TText a) 
+	{ 
+	return 0xDC00 == (a & 0xFC00); 
+	}
+
+/**
+@internalComponent
+*/
+inline TChar PairSurrogates(TText aHigh, TText aLow)
+	{
+	return ((aHigh - 0xd7f7) << 10) + aLow;
+	}
+
+inline void SkipCombiningCharacters(TUTF32Iterator& aUTF32It)
+	{
+	while(!aUTF32It.AtEnd() && !::IsBaseCharacter(aUTF32It.Current()))
+		{
+		aUTF32It.Next();
+		}
+	}
+
+////////////////////////////////////////////////////////////////////////////////////////////
+// TUTF32Iterator
+////////////////////////////////////////////////////////////////////////////////////////////
+
+/**
+@internalComponent
+*/
+inline TUTF32Iterator::TUTF32Iterator() : 
+	iStart(0), 
+	iEnd(0) 
+	{
+	}
+
+/**
+@internalComponent
+*/
+inline TUTF32Iterator::TUTF32Iterator(const TText16* aSingleton) : 
+	iStart(aSingleton), 
+	iEnd(aSingleton + 1), 
+	iCurrent(*aSingleton)
+	{
+	ASSERT((iCurrent & 0xFFFE) != 0xFFFE);
+	ASSERT(!::IsSurrogate(*aSingleton));
+	}
+
+/**
+@internalComponent
+*/
+inline TUTF32Iterator::TUTF32Iterator(const TText16* aStart, const TText16* aEnd) : 
+	iEnd(aEnd)
+	{
+	SetStart(aStart);
+	}
+
+/**
+Sets the iteration to begin at aStart.
+@param aStart New starting point of iteration.
+@internalComponent
+*/
+inline void TUTF32Iterator::SetStart(const TText16* aStart)
+	{
+	iStart = aStart;
+	if(iStart != iEnd)
+		{
+		if(::IsSurrogate(iEnd[-1]))
+			{
+			--iEnd;
+			if(iStart == iEnd)
+				{
+				return;
+				}
+			}
+		iCurrent = ::UTF16ToChar(iStart);
+		if(iCurrent == 0xFFFF)
+			{
+			Next();
+			}
+		}
+	}
+
+/**
+@internalComponent
+*/
+inline TUTF32Iterator::TUTF32Iterator(const TText16* aStart, const TText16* aEnd, TStartsWithValidCharacter) : 
+	iStart(aStart), 
+	iEnd(aEnd)
+	{
+	ASSERT(iStart < iEnd);
+	if(::IsSurrogate(iEnd[-1]))
+		{
+		--iEnd;
+		}
+	iCurrent = ::UTF16ToChar(iStart);
+	ASSERT(iCurrent != 0xFFFF);
+	}
+
+/**
+@internalComponent
+*/
+inline TUTF32Iterator TUTF32Iterator::CurrentAsIterator() const
+	{
+	TUTF32Iterator retval(*this);
+	ASSERT(iStart != iEnd);
+	retval.iEnd = iStart + 1;
+	return retval;
+	}
+
+/**
+@internalComponent
+*/
+inline TBool TUTF32Iterator::AtEnd() const
+	{
+	return iEnd == iStart;
+	}
+
+/**
+@internalComponent
+*/
+inline TChar TUTF32Iterator::Current() const
+	{
+	ASSERT(iStart != iEnd);
+	ASSERT(iCurrent != 0xFFFF);
+	return iCurrent;
+	}
+
+/**
+@internalComponent
+*/
+inline const TText16* TUTF32Iterator::CurrentPosition() const
+	{
+	return iStart;
+	}
+
+/**
+@internalComponent
+*/
+inline TInt TUTF32Iterator::Length() const
+	{
+	return iEnd - iStart;
+	}
+
+/**
+@internalComponent
+*/
+inline TInt TUTF32Iterator::operator[](TInt a) const
+	{
+	return iStart[a];
+	}
+
+////////////////////////////////////////////////////////////////////////////////////////////
+// TFoldedDecompIterator
+////////////////////////////////////////////////////////////////////////////////////////////
+
+/**
+@internalComponent
+*/
+inline TFoldedDecompIterator::TFoldedDecompIterator() 
+	{
+	}
+
+/**
+@internalComponent
+*/
+inline TUTF32Iterator TFoldedDecompIterator::BaseIterator() const 
+	{ 
+	return iOriginal; 
+	}
+
+/**
+@internalComponent
+*/
+inline void TFoldedDecompIterator::Set(const TUTF32Iterator& a)
+	{
+	iOriginal = a;
+	}
+
+/**
+@internalComponent
+*/
+inline TBool TFoldedDecompIterator::IsInFoldedSequence() const
+	{
+	return !iFolded.AtEnd();
+	}
+
+////////////////////////////////////////////////////////////////////////////////////////////
+// TFoldedSortedDecompIterator
+////////////////////////////////////////////////////////////////////////////////////////////
+
+/**
+@internalComponent
+*/
+inline TFoldedSortedDecompIterator::TFoldedSortedDecompIterator() 
+	{
+	}
+
+////////////////////////////////////////////////////////////////////////////////////////////
+// TDecompositionIterator
+////////////////////////////////////////////////////////////////////////////////////////////
+
+/**
+@internalComponent
+*/
+inline TDecompositionIterator::TDecompositionIterator() 
+	{
+	}
+
+////////////////////////////////////////////////////////////////////////////////////////////
+// TCanonicalDecompositionIterator
+////////////////////////////////////////////////////////////////////////////////////////////
+
+/**
+@internalComponent
+*/
+inline TCanonicalDecompositionIterator::TCanonicalDecompositionIterator() 
+	{
+	}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32/euser/unicode/folddecomp.inl	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,1462 @@
+// Copyright (c) 2001-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// Fold and decomposition tables.
+// These tables are linked in the following way:
+// KUnicodeToIndexHash is a hash table using double hashing for
+// conflict resolution. The functions DecompositionHashStart and
+// DecompositionHashStep give the start and step values for accessing
+// the table. The first probe is at DecompositionHashStart and each
+// subsequent probe is offset by DecompositionHashStep. Probes
+// continue until either 0 is found (indicating that the Unicode value
+// sought has no decompostion (i.e. decomposes to itself) or a value
+// is found that has the sought Unicode value in its lower 20 bits.
+// In this latter case, the upper 12 bits contain an index into
+// one of the following tables, according to the following rules:
+// If the Index is less than the length of KNonSingletonFolds / 2,
+// it is an index into KNonSingletonFolds or
+// KNonSingletonDecompositions (depending on whether you want to
+// fold or not -- both tables are indexed the same). If the Index is
+// greater than the length of KNonSingletonFolds / 2, then it is an
+// index into KSingletonFolds or KSingletonDecompositions (depending
+// on whether you want to fold or not). Now, KSingletonDecompositions
+// is shorter than KSingletonFolds, so if you have an Index greater than
+// the length of KSingletonDecompositions plus half the length of
+// KNonSingletonFolds, you have a character that has a fold but no
+// decomposition.
+// In summary:
+// Let Knsf be the length of KNonSingletonFolds / 2,
+// let Ksd be the length of KSingletonDecompositions and
+// let Ksf be the length of KSingletonFolds.
+// Now if you want to fold a character and you have found
+// its index 'i' from the KUnicodeToIndexHash, then;
+// if (i < Knsf) then look up
+// KNonSingletonFolds[i * 2] and KNonSingletonFolds[i * 2 + 1]
+// else look up KSingletonFolds[i - Knsf]
+// Or if you want to decompose the same character, then;
+// if (i < Knsf) then look up KNonSingletonDecompositions[i * 2]
+// and tKNonSingletonDecompositions[i * 2 + 1]
+// else if (Knsf <= i < Knsf + Ksd) look up KSingletonDecompositions[i - Knsf]
+// else there is no decomposition for this character.
+// Your index into KSingletonDecompositions or KSingletonFolds
+// yields a single value which is the decomposition or fold.
+// The KNonSingletonFolds and KNonSingletonDecomposition
+// tables are made up of pairs of values. Each pair is either a pair
+// of Unicode values that constitute the fold or decomposition, or
+// the first value is KLongD and the second has its top 4 bits as the
+// length of the decomposition (or folded decomposition) minus 3,
+// and its bottom 12 bits as the index into KLongDecompositions
+// of where you can find this decomposition.
+// KLongDecompositions simply contains UTF-16 (Unicode) for
+// all the decomposed and folded sequences longer than 4 bytes long.
+// 
+//
+
+// Hash table mapping unicode values to indices into the other tables
+const unsigned long KUnicodeToIndexHash[4096] =
+	{
+	0x3f702000, 0x3f802001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x33f01026, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x51f00041, 0x52000042, 0x52100043, 0x52200044, 0x52300045, 0x52400046, 0x52500047,
+	0x52600048, 0x52700049, 0x5280004a, 0x5290004b, 0x3700304c, 0x52a0004c, 0x3710304e, 0x52b0004d,
+	0x37203050, 0x52c0004e, 0x37303052, 0x52d0004f, 0x37403054, 0x52e00050, 0x37503056, 0x52f00051,
+	0x37603058, 0x53000052, 0x3770305a, 0x53100053, 0x3780305c, 0x53200054, 0x3790305e, 0x53300055,
+	0x37a03060, 0x53400056, 0x37b03062, 0x53500057, 0x53600058, 0x37c03065, 0x53700059, 0x37d03067,
+	0x5380005a, 0x37e03069, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x37f03070, 0x38003071, 0x00000000, 0x38103073, 0x38203074, 0x00000000, 0x38303076, 0x38403077,
+	0x00000000, 0x38503079, 0x3860307a, 0x00000000, 0x3870307c, 0x3880307d, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x36f03094, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x3890309e, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x38b030ac, 0x00000000, 0x38c030ae, 0x00000000,
+	0x38d030b0, 0x00000000, 0x38e030b2, 0x00000000, 0x38f030b4, 0x539000b5, 0x390030b6, 0x00000000,
+	0x391030b8, 0x00000000, 0x392030ba, 0x00000000, 0x393030bc, 0x00000000, 0x394030be, 0x00000000,
+	0x003000c0, 0x004000c1, 0x005000c2, 0x00a000c3, 0x013000c4, 0x016000c5, 0x53a000c6, 0x028000c7,
+	0x030000c8, 0x031000c9, 0x032000ca, 0x03d000cb, 0x058000cc, 0x059000cd, 0x05a000ce, 0x05f000cf,
+	0x39a030d0, 0x07a000d1, 0x081000d2, 0x082000d3, 0x083000d4, 0x088000d5, 0x092000d6, 0x39f030d7,
+	0x53b000d0, 0x0bf000d9, 0x0c0000da, 0x0c1000db, 0x0c7000dc, 0x0e8000dd, 0x53c000d8, 0x53d000de,
+	0x0f6000e0, 0x0f7000e1, 0x0f8000e2, 0x0fd000e3, 0x106000e4, 0x109000e5, 0x00000000, 0x11a000e7,
+	0x122000e8, 0x123000e9, 0x124000ea, 0x12f000eb, 0x14b000ec, 0x14c000ed, 0x14d000ee, 0x151000ef,
+	0x00000000, 0x16d000f1, 0x174000f2, 0x175000f3, 0x176000f4, 0x17b000f5, 0x185000f6, 0x3a4030f7,
+	0x3a5030f8, 0x1b3000f9, 0x1b4000fa, 0x1b5000fb, 0x1bb000fc, 0x1dd000fd, 0x3a8030fe, 0x1e2000ff,
+	0x00b00100, 0x0fe00101, 0x00c00102, 0x0ff00103, 0x02000104, 0x11200105, 0x02400106, 0x11600107,
+	0x02500108, 0x11700109, 0x0260010a, 0x1180010b, 0x0270010c, 0x1190010d, 0x02b0010e, 0x11d0010f,
+	0x53e00110, 0x00000000, 0x03800112, 0x12a00113, 0x03b00114, 0x12d00115, 0x03c00116, 0x12e00117,
+	0x04600118, 0x13800119, 0x03f0011a, 0x1310011b, 0x04b0011c, 0x13d0011d, 0x04d0011e, 0x13f0011f,
+	0x04e00120, 0x14000121, 0x05000122, 0x14200123, 0x05100124, 0x14300125, 0x3f902126, 0x53f00126,
+	0x05b00128, 0x14e00129, 0x05c0012a, 0x0170212b, 0x05d0012c, 0x14f0012b, 0x0660012e, 0x1500012d,
+	0x05e00130, 0x1580012f, 0x54000131, 0x54100132, 0x06800134, 0x15a00135, 0x06c00136, 0x15f00137,
+	0x00000000, 0x06e00139, 0x1610013a, 0x0720013b, 0x1650013c, 0x06f0013d, 0x1620013e, 0x5420013f,
+	0x00000000, 0x54300141, 0x00000000, 0x07900143, 0x16c00144, 0x07e00145, 0x17100146, 0x07c00147,
+	0x16f00148, 0x00000000, 0x5440014a, 0x00000000, 0x08c0014c, 0x17f0014d, 0x08f0014e, 0x1820014f,
+	0x09500150, 0x18800151, 0x54500152, 0x00000000, 0x0a500154, 0x19800155, 0x0ac00156, 0x19f00157,
+	0x0a700158, 0x19a00159, 0x0ae0015a, 0x1a10015b, 0x0b00015c, 0x1a30015d, 0x0b70015e, 0x1aa0015f,
+	0x0b200160, 0x1a500161, 0x0bc00162, 0x1b000163, 0x0b900164, 0x1ad00165, 0x54600166, 0x62a02167,
+	0x0c200168, 0x1b600169, 0x0c40016a, 0x1b80016b, 0x0c60016c, 0x1ba0016d, 0x0cd0016e, 0x1c10016f,
+	0x0ce00170, 0x1c200171, 0x0da00172, 0x1ce00173, 0x0e100174, 0x1d500175, 0x0e900176, 0x1de00177,
+	0x0ed00178, 0x0f000179, 0x1e60017a, 0x0f20017b, 0x1e80017c, 0x0f30017d, 0x1e90017e, 0x5470017f,
+	0x00000000, 0x54800181, 0x54900182, 0x00000000, 0x54a00184, 0x00000000, 0x54b00186, 0x54c00187,
+	0x00000000, 0x54d00189, 0x54e0018a, 0x54f0018b, 0x00000000, 0x00000000, 0x5500018e, 0x5510018f,
+	0x55200190, 0x55300191, 0x00000000, 0x55400193, 0x55500194, 0x00000000, 0x55600196, 0x55700197,
+	0x55800198, 0x00000000, 0x3460219a, 0x3470219b, 0x5590019c, 0x55a0019d, 0x00000000, 0x55b0019f,
+	0x099001a0, 0x18c001a1, 0x55c001a2, 0x00000000, 0x55d001a4, 0x4d90f9dc, 0x55e001a6, 0x55f001a7,
+	0x00000000, 0x4550f958, 0x560001a9, 0x00000000, 0x561001ac, 0x00000000, 0x348021ae, 0x0d2001af,
+	0x1c6001b0, 0x562001ae, 0x563001b1, 0x564001b2, 0x565001b3, 0x566001b5, 0x00000000, 0x567001b7,
+	0x568001b8, 0x00000000, 0x00000000, 0x00000000, 0x569001bc, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x4da0f9dd, 0x56a001c4, 0x56b001c5, 0x56c001c7,
+	0x4560f959, 0x56d001c8, 0x56e001ca, 0x56f001cb, 0x00000000, 0x019001cd, 0x10b001ce, 0x062001cf,
+	0x154001d0, 0x096001d1, 0x189001d2, 0x0cf001d3, 0x1c3001d4, 0x0ca001d5, 0x1be001d6, 0x0c9001d7,
+	0x1bd001d8, 0x0cb001d9, 0x1bf001da, 0x0c8001db, 0x1bc001dc, 0x00000000, 0x014001de, 0x107001df,
+	0x012001e0, 0x105001e1, 0x1f2001e2, 0x1f5001e3, 0x570001e4, 0x00000000, 0x04f001e6, 0x141001e7,
+	0x06a001e8, 0x15d001e9, 0x0a1001ea, 0x194001eb, 0x0a2001ec, 0x195001ed, 0x1f8001ee, 0x1f9001ef,
+	0x15b001f0, 0x571001f1, 0x572001f2, 0x00000000, 0x04a001f4, 0x13c001f5, 0x573001f6, 0x574001f7,
+	0x078001f8, 0x16b001f9, 0x018001fa, 0x10a001fb, 0x1f1001fc, 0x1f4001fd, 0x1f3001fe, 0x1f6001ff,
+	0x01a00200, 0x10c00201, 0x01b00202, 0x10d00203, 0x04000204, 0x13200205, 0x04100206, 0x13300207,
+	0x06300208, 0x15500209, 0x0640020a, 0x1560020b, 0x0970020c, 0x18a0020d, 0x0980020e, 0x18b0020f,
+	0x0a800210, 0x19b00211, 0x0a900212, 0x19c00213, 0x0d000214, 0x1c400215, 0x0d100216, 0x1c500217,
+	0x0b600218, 0x1a900219, 0x0bb0021a, 0x1af0021b, 0x5750021c, 0x00000000, 0x0540021e, 0x1460021f,
+	0x00000000, 0x00000000, 0x57600222, 0x00000000, 0x34f02224, 0x4590f95c, 0x01100226, 0x10400227,
+	0x04400228, 0x13600229, 0x0930022a, 0x1860022b, 0x08a0022c, 0x17d0022d, 0x0900022e, 0x1830022f,
+	0x09100230, 0x18400231, 0x0eb00232, 0x1e000233, 0x57700224, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x35102241, 0x00000000, 0x00000000, 0x35202244, 0x00000000, 0x00000000, 0x35302247,
+	0x00000000, 0x35402249, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00102260, 0x00000000, 0x35602262, 0x45b0f95e, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x3550226d, 0x0000226e, 0x0020226f,
+	0x35702270, 0x35802271, 0x00000000, 0x00000000, 0x35902274, 0x35a02275, 0x00000000, 0x00000000,
+	0x35b02278, 0x35c02279, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x35d02280, 0x35e02281, 0x45c0f95f, 0x00000000, 0x36102284, 0x36202285, 0x00000000, 0x00000000,
+	0x36302288, 0x36402289, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x367022ac, 0x368022ad, 0x369022ae, 0x36a022af,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x35f022e0, 0x360022e1, 0x365022e2, 0x366022e3, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x36b022ea, 0x36c022eb, 0x36d022ec, 0x36e022ed, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x3fb02329, 0x3fc0232a, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x3ef00340, 0x3f000341, 0x00000000, 0x3f100343, 0x3a900344, 0x57800345, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x3f200374, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x3f30037e, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x1ee00385, 0x1fc00386, 0x3f400387,
+	0x21100388, 0x21b00389, 0x22f0038a, 0x00000000, 0x23d0038c, 0x00000000, 0x2470038e, 0x2500038f,
+	0x2a600390, 0x57900391, 0x57a00392, 0x57b00393, 0x57c00394, 0x57d00395, 0x57e00396, 0x57f00397,
+	0x58000398, 0x58100399, 0x5820039a, 0x5830039b, 0x5840039c, 0x5850039d, 0x5860039e, 0x5870039f,
+	0x588003a0, 0x589003a1, 0x00000000, 0x58a003a3, 0x58b003a4, 0x58c003a5, 0x58d003a6, 0x58e003a7,
+	0x58f003a8, 0x590003a9, 0x232003aa, 0x24a003ab, 0x266003ac, 0x27e003ad, 0x288003ae, 0x29f003af,
+	0x2c3003b0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x591003c2, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x2a3003ca, 0x2c1003cb, 0x2b3003cc, 0x2bd003cd, 0x2d2003ce, 0x00000000,
+	0x592003d0, 0x593003d1, 0x00000000, 0x2e7003d3, 0x2e8003d4, 0x594003d5, 0x595003d6, 0x00000000,
+	0x00000000, 0x00000000, 0x596003da, 0x00000000, 0x597003dc, 0x00000000, 0x598003de, 0x00000000,
+	0x599003e0, 0x00000000, 0x59a003e2, 0x00000000, 0x59b003e4, 0x00000000, 0x59c003e6, 0x00000000,
+	0x59d003e8, 0x00000000, 0x59e003ea, 0x00000000, 0x59f003ec, 0x00000000, 0x5a0003ee, 0x00000000,
+	0x5a1003f0, 0x5a2003f1, 0x5a3003f2, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x2ed00400, 0x2ef00401, 0x5a400402, 0x2ec00403, 0x5a500404, 0x5a600405, 0x5a700406, 0x2e900407,
+	0x5a800408, 0x5a900409, 0x5aa0040a, 0x5ab0040b, 0x2f70040c, 0x2f30040d, 0x2fa0040e, 0x5ac0040f,
+	0x5ad00410, 0x5ae00411, 0x45a0f95d, 0x5af00412, 0x5b000413, 0x5b100414, 0x5b200415, 0x5b300416,
+	0x5b400417, 0x2f500419, 0x5b500418, 0x5b60041a, 0x5b70041b, 0x5b80041c, 0x5b90041d, 0x5ba0041e,
+	0x5bb0041f, 0x5bc00420, 0x5bd00421, 0x5be00422, 0x5bf00423, 0x5c000424, 0x5c100425, 0x5c200426,
+	0x5c300427, 0x5c400428, 0x5c500429, 0x5c60042a, 0x5c70042b, 0x5c80042c, 0x5c90042d, 0x5ca0042e,
+	0x5cb0042f, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x30b00439, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x30300450, 0x30500451, 0x00000000, 0x30200453, 0x00000000, 0x00000000, 0x00000000, 0x31600457,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x30d0045c, 0x3090045d, 0x3100045e, 0x00000000,
+	0x5cc00460, 0x00000000, 0x5cd00462, 0x00000000, 0x5ce00464, 0x00000000, 0x5cf00466, 0x00000000,
+	0x5d000468, 0x00000000, 0x5d10046a, 0x00000000, 0x5d20046c, 0x00000000, 0x5d30046e, 0x00000000,
+	0x5d400470, 0x00000000, 0x5d500472, 0x00000000, 0x5d600474, 0x00000000, 0x31700476, 0x31800477,
+	0x5d700478, 0x00000000, 0x5d80047a, 0x00000000, 0x5d90047c, 0x00000000, 0x5da0047e, 0x00000000,
+	0x5db00480, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x5dc0048c, 0x00000000, 0x5dd0048e, 0x00000000,
+	0x5de00490, 0x00000000, 0x5df00492, 0x00000000, 0x5e000494, 0x00000000, 0x5e100496, 0x00000000,
+	0x5e200498, 0x00000000, 0x5e30049a, 0x00000000, 0x5e40049c, 0x00000000, 0x5e50049e, 0x00000000,
+	0x5e6004a0, 0x00000000, 0x5e7004a2, 0x00000000, 0x5e8004a4, 0x00000000, 0x5e9004a6, 0x00000000,
+	0x5ea004a8, 0x00000000, 0x5eb004aa, 0x00000000, 0x5ec004ac, 0x00000000, 0x5ed004ae, 0x00000000,
+	0x5ee004b0, 0x00000000, 0x5ef004b2, 0x00000000, 0x5f0004b4, 0x00000000, 0x5f1004b6, 0x634024b7,
+	0x5f2004b8, 0x636024b9, 0x5f3004ba, 0x638024bb, 0x5f4004bc, 0x63a024bd, 0x5f5004be, 0x63c024bf,
+	0x63d024c0, 0x2f0004c1, 0x306004c2, 0x5f6004c3, 0x641024c4, 0x642024c5, 0x643024c6, 0x5f7004c7,
+	0x645024c8, 0x646024c9, 0x647024ca, 0x5f8004cb, 0x649024cc, 0x64a024cd, 0x64b024ce, 0x64c024cf,
+	0x2ea004d0, 0x300004d1, 0x2eb004d2, 0x301004d3, 0x5f9004d4, 0x00000000, 0x2ee004d6, 0x304004d7,
+	0x5fa004d8, 0x00000000, 0x319004da, 0x31a004db, 0x2f1004dc, 0x307004dd, 0x2f2004de, 0x308004df,
+	0x5fb004e0, 0x00000000, 0x2f4004e2, 0x30a004e3, 0x2f6004e4, 0x30c004e5, 0x2f8004e6, 0x30e004e7,
+	0x5fc004e8, 0x00000000, 0x31b004ea, 0x31c004eb, 0x2ff004ec, 0x315004ed, 0x2f9004ee, 0x30f004ef,
+	0x2fb004f0, 0x311004f1, 0x2fc004f2, 0x312004f3, 0x2fd004f4, 0x313004f5, 0x00000000, 0x00000000,
+	0x2fe004f8, 0x314004f9, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x64d0ff21, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x64e0ff22,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x5fd00531, 0x5fe00532, 0x5ff00533, 0x60000534, 0x60100535, 0x60200536, 0x60300537,
+	0x60400538, 0x60500539, 0x6060053a, 0x6070053b, 0x6080053c, 0x6090053d, 0x60a0053e, 0x60b0053f,
+	0x60c00540, 0x395030c0, 0x60d00541, 0x60e00542, 0x60f00543, 0x61000544, 0x61100545, 0x61200546,
+	0x61300547, 0x61400548, 0x61500549, 0x6160054a, 0x6170054b, 0x6180054c, 0x6190054d, 0x396030c2,
+	0x61a0054e, 0x61b0054f, 0x61c00550, 0x61d00551, 0x61e00552, 0x61f00553, 0x62000554, 0x62100555,
+	0x62200556, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x6500ff24, 0x00000000, 0x00000000,
+	0x00000000, 0x4c80f9cb, 0x00000000, 0x00000000, 0x397030c5, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x398030c7, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x6510ff25, 0x00000000, 0x00000000, 0x00000000,
+	0x399030c9, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x6520ff26, 0x00000000, 0x00000000, 0x4c90f9cc, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x39b030d1, 0x00000000, 0x6530ff27, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x39c030d3, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x39d030d4, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x3fa0212a, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x6540ff28, 0x00000000, 0x39e030d6, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x3a0030d9, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x3a1030da,
+	0x6550ff29, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x3a2030dc, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x3a3030dd, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x6560ff2a,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x31e00622, 0x31f00623, 0x32100624, 0x32000625, 0x32200626, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x6570ff2b, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x6580ff2c, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x65d0ff31, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x6590ff2d, 0x00000000, 0x00000000, 0x3eb0fb4b,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x65a0ff2e, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x38a030f4, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x65b0ff2f, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x325006c0, 0x00000000, 0x323006c2, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x3a6030f9, 0x65c0ff30, 0x00000000, 0x324006d3, 0x00000000, 0x00000000, 0x00000000, 0x3a7030fa,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x62302160, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x62402161, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x62502162, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x3ec0fb4c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x62702164, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x62802165, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x62902166,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x62b02168, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x62c02169, 0x65e0ff32,
+	0x00000000, 0x00000000, 0x00000000, 0x62d0216a, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x62e0216b, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x62f0216c, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x6300216d, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x6310216e,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x6320216f, 0x00000000, 0x65f0ff33, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x3ff0f902,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x6600ff34, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x6610ff35, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x6620ff36, 0x00000000, 0x00000000, 0x00000000, 0x633024b6,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x635024b8, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x637024ba, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x6630ff37, 0x00000000, 0x00000000, 0x639024bc, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x63b024be,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x63e024c1, 0x00000000,
+	0x00000000, 0x6640ff38, 0x00000000, 0x63f024c2, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x640024c3, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x4040f907, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x644024c7, 0x00000000, 0x00000000, 0x00000000,
+	0x6650ff39, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x648024cb, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x6660ff3a,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x4090f90c, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x50d0fa15, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x3fd0f900, 0x3fe0f901, 0x349021cd, 0x4000f903, 0x4010f904, 0x4020f905, 0x4030f906, 0x34b021ce,
+	0x4050f908, 0x4060f909, 0x4070f90a, 0x4080f90b, 0x34a021cf, 0x40a0f90d, 0x40b0f90e, 0x40c0f90f,
+	0x40d0f910, 0x40e0f911, 0x40f0f912, 0x4100f913, 0x4110f914, 0x4120f915, 0x4130f916, 0x4140f917,
+	0x4150f918, 0x4160f919, 0x4170f91a, 0x4180f91b, 0x4190f91c, 0x41a0f91d, 0x41b0f91e, 0x41c0f91f,
+	0x41d0f920, 0x41e0f921, 0x41f0f922, 0x4200f923, 0x4210f924, 0x4220f925, 0x4230f926, 0x4240f927,
+	0x4250f928, 0x32600929, 0x4270f92a, 0x4280f92b, 0x4290f92c, 0x42a0f92d, 0x42b0f92e, 0x42c0f92f,
+	0x42d0f930, 0x32700931, 0x42f0f932, 0x4300f933, 0x32800934, 0x4320f935, 0x4330f936, 0x4340f937,
+	0x4350f938, 0x4360f939, 0x4370f93a, 0x4380f93b, 0x4390f93c, 0x43a0f93d, 0x43b0f93e, 0x43c0f93f,
+	0x43d0f940, 0x43e0f941, 0x43f0f942, 0x4400f943, 0x4410f944, 0x4420f945, 0x4430f946, 0x4440f947,
+	0x4450f948, 0x4460f949, 0x4470f94a, 0x4480f94b, 0x4490f94c, 0x44a0f94d, 0x44b0f94e, 0x44c0f94f,
+	0x44d0f950, 0x44e0f951, 0x44f0f952, 0x4500f953, 0x4510f954, 0x4520f955, 0x4530f956, 0x4540f957,
+	0x3aa00958, 0x3ab00959, 0x3ac0095a, 0x3ad0095b, 0x3ae0095c, 0x3af0095d, 0x3b00095e, 0x3b10095f,
+	0x45d0f960, 0x45e0f961, 0x45f0f962, 0x4600f963, 0x4610f964, 0x4620f965, 0x4630f966, 0x4640f967,
+	0x4650f968, 0x4660f969, 0x4670f96a, 0x4680f96b, 0x4690f96c, 0x46a0f96d, 0x46b0f96e, 0x46c0f96f,
+	0x46d0f970, 0x46e0f971, 0x46f0f972, 0x4700f973, 0x4710f974, 0x4720f975, 0x4730f976, 0x4740f977,
+	0x4750f978, 0x4760f979, 0x4770f97a, 0x4780f97b, 0x4790f97c, 0x47a0f97d, 0x47b0f97e, 0x47c0f97f,
+	0x47d0f980, 0x47e0f981, 0x47f0f982, 0x4800f983, 0x4810f984, 0x4820f985, 0x4830f986, 0x4840f987,
+	0x4850f988, 0x4860f989, 0x4870f98a, 0x4880f98b, 0x4890f98c, 0x48a0f98d, 0x48b0f98e, 0x48c0f98f,
+	0x48d0f990, 0x48e0f991, 0x48f0f992, 0x4900f993, 0x4910f994, 0x4920f995, 0x4930f996, 0x4940f997,
+	0x4950f998, 0x4960f999, 0x4970f99a, 0x4980f99b, 0x4990f99c, 0x49a0f99d, 0x49b0f99e, 0x49c0f99f,
+	0x49d0f9a0, 0x49e0f9a1, 0x49f0f9a2, 0x4a00f9a3, 0x4a10f9a4, 0x4a20f9a5, 0x4a30f9a6, 0x4a40f9a7,
+	0x4a50f9a8, 0x4a60f9a9, 0x4a70f9aa, 0x4a80f9ab, 0x4a90f9ac, 0x4aa0f9ad, 0x4ab0f9ae, 0x4ac0f9af,
+	0x4ad0f9b0, 0x4ae0f9b1, 0x4af0f9b2, 0x4b00f9b3, 0x4b10f9b4, 0x4b20f9b5, 0x4b30f9b6, 0x4b40f9b7,
+	0x4b50f9b8, 0x4b60f9b9, 0x4b70f9ba, 0x4b80f9bb, 0x4b90f9bc, 0x4ba0f9bd, 0x4bb0f9be, 0x4bc0f9bf,
+	0x4bd0f9c0, 0x4be0f9c1, 0x4bf0f9c2, 0x4c00f9c3, 0x4c10f9c4, 0x4c20f9c5, 0x4c30f9c6, 0x4c40f9c7,
+	0x4c50f9c8, 0x4c60f9c9, 0x4c70f9ca, 0x329009cb, 0x32a009cc, 0x4ca0f9cd, 0x4cb0f9ce, 0x4cc0f9cf,
+	0x4cd0f9d0, 0x4ce0f9d1, 0x4cf0f9d2, 0x4d00f9d3, 0x4d10f9d4, 0x4d20f9d5, 0x4d30f9d6, 0x4d40f9d7,
+	0x4d50f9d8, 0x4d60f9d9, 0x4d70f9da, 0x4d80f9db, 0x3b2009dc, 0x3b3009dd, 0x4db0f9de, 0x3b4009df,
+	0x4dd0f9e0, 0x4de0f9e1, 0x4df0f9e2, 0x4e00f9e3, 0x4e10f9e4, 0x4e20f9e5, 0x4e30f9e6, 0x4e40f9e7,
+	0x4e50f9e8, 0x4e60f9e9, 0x4e70f9ea, 0x4e80f9eb, 0x4e90f9ec, 0x4ea0f9ed, 0x4eb0f9ee, 0x4ec0f9ef,
+	0x4ed0f9f0, 0x4ee0f9f1, 0x4ef0f9f2, 0x4f00f9f3, 0x4f10f9f4, 0x4f20f9f5, 0x4f30f9f6, 0x4f40f9f7,
+	0x4f50f9f8, 0x4f60f9f9, 0x4f70f9fa, 0x4f80f9fb, 0x4f90f9fc, 0x4fa0f9fd, 0x4fb0f9fe, 0x4fc0f9ff,
+	0x4fd0fa00, 0x4fe0fa01, 0x4ff0fa02, 0x5000fa03, 0x5010fa04, 0x5020fa05, 0x5030fa06, 0x5040fa07,
+	0x5050fa08, 0x5060fa09, 0x5070fa0a, 0x5080fa0b, 0x5090fa0c, 0x50a0fa0d, 0x00000000, 0x00000000,
+	0x50b0fa10, 0x00000000, 0x50c0fa12, 0x00000000, 0x00000000, 0x34c02204, 0x50e0fa16, 0x50f0fa17,
+	0x5100fa18, 0x5110fa19, 0x5120fa1a, 0x5130fa1b, 0x5140fa1c, 0x5150fa1d, 0x5160fa1e, 0x00000000,
+	0x5170fa20, 0x00000000, 0x5180fa22, 0x00000000, 0x00000000, 0x4dc0f9df, 0x51a0fa26, 0x00000000,
+	0x00000000, 0x00000000, 0x51b0fa2a, 0x51c0fa2b, 0x51d0fa2c, 0x51e0fa2d, 0x34d02209, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x3b500a33, 0x00000000, 0x00000000, 0x3b600a36, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x34e0220c, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x3b700a59, 0x3b800a5a, 0x3b900a5b, 0x00000000, 0x00000000, 0x3ba00a5e, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x4570f95a, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x5190fa25, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x4580f95b, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x35002226,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x31d0fb1d, 0x00000000, 0x3ce0fb1f,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x3cf0fb2a, 0x3d00fb2b, 0x3d10fb2c, 0x3d20fb2d, 0x3d30fb2e, 0x3d40fb2f,
+	0x3d50fb30, 0x3d60fb31, 0x3d70fb32, 0x3d80fb33, 0x3d90fb34, 0x3da0fb35, 0x3db0fb36, 0x00000000,
+	0x3dc0fb38, 0x3dd0fb39, 0x3de0fb3a, 0x3df0fb3b, 0x3e00fb3c, 0x00000000, 0x3e10fb3e, 0x00000000,
+	0x3e20fb40, 0x3e30fb41, 0x00000000, 0x3e40fb43, 0x3e50fb44, 0x00000000, 0x3e60fb46, 0x3e70fb47,
+	0x32c00b48, 0x3e90fb49, 0x3ea0fb4a, 0x32b00b4b, 0x32d00b4c, 0x3ed0fb4d, 0x3ee0fb4e, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x64f0ff23, 0x00000000, 0x00000000, 0x3bb00b5c, 0x3bc00b5d, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x32e00b94, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x32f00bca, 0x33100bcb, 0x33000bcc, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x4260f929, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x33200c48, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x62602163, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x33300cc0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x33600cc7,
+	0x33700cc8, 0x00000000, 0x33400cca, 0x33500ccb, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x42e0f931, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x33800d4a, 0x33a00d4b, 0x33900d4c, 0x4310f934, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x3f501fbe, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x3e80fb48, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x33b00dda, 0x00000000, 0x33c00ddc, 0x33d00ddd, 0x33e00dde, 0x3f601fef,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x01f01e00, 0x11101e01, 0x02101e02, 0x11301e03, 0x02201e04, 0x11401e05, 0x02301e06, 0x11501e07,
+	0x02901e08, 0x11b01e09, 0x02a01e0a, 0x11c01e0b, 0x02c01e0c, 0x11e01e0d, 0x02f01e0e, 0x12101e0f,
+	0x02d01e10, 0x11f01e11, 0x02e01e12, 0x12001e13, 0x03901e14, 0x12b01e15, 0x03a01e16, 0x12c01e17,
+	0x04701e18, 0x13901e19, 0x04801e1a, 0x13a01e1b, 0x04501e1c, 0x13701e1d, 0x04901e1e, 0x13b01e1f,
+	0x04c01e20, 0x13e01e21, 0x05201e22, 0x14401e23, 0x05501e24, 0x14701e25, 0x05301e26, 0x14501e27,
+	0x05601e28, 0x14801e29, 0x05701e2a, 0x14901e2b, 0x06701e2c, 0x15901e2d, 0x06001e2e, 0x15201e2f,
+	0x06901e30, 0x15c01e31, 0x06b01e32, 0x15e01e33, 0x06d01e34, 0x16001e35, 0x07001e36, 0x16301e37,
+	0x07101e38, 0x16401e39, 0x07401e3a, 0x16701e3b, 0x07301e3c, 0x16601e3d, 0x07501e3e, 0x16801e3f,
+	0x07601e40, 0x16901e41, 0x07701e42, 0x16a01e43, 0x07b01e44, 0x16e01e45, 0x07d01e46, 0x17001e47,
+	0x08001e48, 0x17301e49, 0x07f01e4a, 0x17201e4b, 0x08901e4c, 0x17c01e4d, 0x08b01e4e, 0x17e01e4f,
+	0x08d01e50, 0x18001e51, 0x08e01e52, 0x18101e53, 0x0a301e54, 0x19601e55, 0x0a401e56, 0x19701e57,
+	0x0a601e58, 0x19901e59, 0x0aa01e5a, 0x19d01e5b, 0x0ab01e5c, 0x19e01e5d, 0x0ad01e5e, 0x1a001e5f,
+	0x0b101e60, 0x1a401e61, 0x0b401e62, 0x1a701e63, 0x0af01e64, 0x1a201e65, 0x0b301e66, 0x1a601e67,
+	0x0b501e68, 0x1a801e69, 0x0b801e6a, 0x1ab01e6b, 0x0ba01e6c, 0x1ae01e6d, 0x0be01e6e, 0x1b201e6f,
+	0x0bd01e70, 0x1b101e71, 0x0d901e72, 0x1cd01e73, 0x0dc01e74, 0x1d001e75, 0x0db01e76, 0x1cf01e77,
+	0x0c301e78, 0x1b701e79, 0x0c501e7a, 0x1b901e7b, 0x0dd01e7c, 0x1d101e7d, 0x0de01e7e, 0x1d201e7f,
+	0x0df01e80, 0x1d301e81, 0x0e001e82, 0x1d401e83, 0x0e301e84, 0x1d701e85, 0x0e201e86, 0x1d601e87,
+	0x0e401e88, 0x1d901e89, 0x0e501e8a, 0x1da01e8b, 0x0e601e8c, 0x1db01e8d, 0x0ec01e8e, 0x1e101e8f,
+	0x0f101e90, 0x1e701e91, 0x0f401e92, 0x1ea01e93, 0x0f501e94, 0x1eb01e95, 0x14a01e96, 0x1ac01e97,
+	0x1d801e98, 0x1e401e99, 0x00000000, 0x1f701e9b, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x01c01ea0, 0x10e01ea1, 0x01501ea2, 0x10801ea3, 0x00701ea4, 0x0fa01ea5, 0x00601ea6, 0x0f901ea7,
+	0x00901ea8, 0x0fc01ea9, 0x00801eaa, 0x0fb01eab, 0x01d01eac, 0x10f01ead, 0x00e01eae, 0x10101eaf,
+	0x00d01eb0, 0x10001eb1, 0x01001eb2, 0x10301eb3, 0x00f01eb4, 0x10201eb5, 0x01e01eb6, 0x11001eb7,
+	0x04201eb8, 0x13401eb9, 0x03e01eba, 0x13001ebb, 0x03701ebc, 0x12901ebd, 0x03401ebe, 0x12601ebf,
+	0x03301ec0, 0x12501ec1, 0x03601ec2, 0x12801ec3, 0x03501ec4, 0x12701ec5, 0x04301ec6, 0x13501ec7,
+	0x06101ec8, 0x15301ec9, 0x06501eca, 0x15701ecb, 0x09f01ecc, 0x19201ecd, 0x09401ece, 0x18701ecf,
+	0x08501ed0, 0x17801ed1, 0x08401ed2, 0x17701ed3, 0x08701ed4, 0x17a01ed5, 0x08601ed6, 0x17901ed7,
+	0x0a001ed8, 0x19301ed9, 0x09b01eda, 0x18e01edb, 0x09a01edc, 0x18d01edd, 0x09d01ede, 0x19001edf,
+	0x09c01ee0, 0x18f01ee1, 0x09e01ee2, 0x19101ee3, 0x0d801ee4, 0x1cc01ee5, 0x0cc01ee6, 0x1c001ee7,
+	0x0d401ee8, 0x1c801ee9, 0x0d301eea, 0x1c701eeb, 0x0d601eec, 0x1ca01eed, 0x0d501eee, 0x1c901eef,
+	0x0d701ef0, 0x1cb01ef1, 0x0e701ef2, 0x1dc01ef3, 0x0ef01ef4, 0x1e501ef5, 0x0ee01ef6, 0x1e301ef7,
+	0x0ea01ef8, 0x1df01ef9, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x26a01f00, 0x27201f01, 0x26b01f02, 0x27301f03, 0x26d01f04, 0x27501f05, 0x26f01f06, 0x27701f07,
+	0x1ff01f08, 0x20701f09, 0x20001f0a, 0x20801f0b, 0x20201f0c, 0x20a01f0d, 0x20401f0e, 0x20c01f0f,
+	0x28001f10, 0x28301f11, 0x28101f12, 0x28401f13, 0x28201f14, 0x28501f15, 0x00000000, 0x00000000,
+	0x21301f18, 0x21601f19, 0x21401f1a, 0x21701f1b, 0x21501f1c, 0x21801f1d, 0x00000000, 0x00000000,
+	0x28b01f20, 0x29301f21, 0x28c01f22, 0x29401f23, 0x28e01f24, 0x29601f25, 0x29001f26, 0x29801f27,
+	0x21c01f28, 0x22401f29, 0x21d01f2a, 0x22501f2b, 0x21f01f2c, 0x22701f2d, 0x22101f2e, 0x22901f2f,
+	0x2a801f30, 0x2ac01f31, 0x2a901f32, 0x2ad01f33, 0x2aa01f34, 0x2ae01f35, 0x2ab01f36, 0x2af01f37,
+	0x23301f38, 0x23701f39, 0x23401f3a, 0x23801f3b, 0x23501f3c, 0x23901f3d, 0x23601f3e, 0x23a01f3f,
+	0x2b401f40, 0x2b701f41, 0x2b501f42, 0x2b801f43, 0x2b601f44, 0x2b901f45, 0x3bd00f43, 0x00000000,
+	0x23e01f48, 0x24101f49, 0x23f01f4a, 0x24201f4b, 0x24001f4c, 0x24301f4d, 0x3be00f4d, 0x00000000,
+	0x2c601f50, 0x2ca01f51, 0x2c701f52, 0x2cb01f53, 0x2c801f54, 0x2cc01f55, 0x2c901f56, 0x2cd01f57,
+	0x3bf00f52, 0x24b01f59, 0x3c000f57, 0x24c01f5b, 0x3c100f5c, 0x24d01f5d, 0x00000000, 0x24e01f5f,
+	0x2d401f60, 0x2dc01f61, 0x2d501f62, 0x2dd01f63, 0x2d701f64, 0x2df01f65, 0x2d901f66, 0x2e101f67,
+	0x25201f68, 0x25a01f69, 0x25301f6a, 0x25b01f6b, 0x25501f6c, 0x25d01f6d, 0x25701f6e, 0x25f01f6f,
+	0x26301f70, 0x26501f71, 0x27d01f72, 0x27f01f73, 0x28601f74, 0x28901f75, 0x29e01f76, 0x2a001f77,
+	0x2b101f78, 0x2b201f79, 0x2bc01f7a, 0x2be01f7b, 0x2cf01f7c, 0x2d101f7d, 0x3c200f69, 0x3c300f73,
+	0x27101f80, 0x27901f81, 0x26c01f82, 0x27401f83, 0x26e01f84, 0x27601f85, 0x27001f86, 0x27801f87,
+	0x20601f88, 0x20e01f89, 0x20101f8a, 0x20901f8b, 0x20301f8c, 0x20b01f8d, 0x20501f8e, 0x20d01f8f,
+	0x29201f90, 0x29a01f91, 0x28d01f92, 0x29501f93, 0x28f01f94, 0x29701f95, 0x29101f96, 0x29901f97,
+	0x22301f98, 0x22b01f99, 0x21e01f9a, 0x22601f9b, 0x22001f9c, 0x22801f9d, 0x22201f9e, 0x22a01f9f,
+	0x2db01fa0, 0x2e301fa1, 0x2d601fa2, 0x2de01fa3, 0x2d801fa4, 0x2e001fa5, 0x2da01fa6, 0x2e201fa7,
+	0x25901fa8, 0x26101fa9, 0x25401faa, 0x25c01fab, 0x25601fac, 0x25e01fad, 0x25801fae, 0x26001faf,
+	0x26901fb0, 0x26801fb1, 0x26401fb2, 0x27c01fb3, 0x26701fb4, 0x3c400f75, 0x27a01fb6, 0x27b01fb7,
+	0x1fe01fb8, 0x1fd01fb9, 0x1fa01fba, 0x1fb01fbb, 0x20f01fbc, 0x3c500f76, 0x3c600f78, 0x3c700f81,
+	0x3c800f93, 0x1ef01fc1, 0x28701fc2, 0x29d01fc3, 0x28a01fc4, 0x3c900f9d, 0x29b01fc6, 0x29c01fc7,
+	0x21001fc8, 0x21201fc9, 0x21901fca, 0x21a01fcb, 0x22c01fcc, 0x34001fcd, 0x34101fce, 0x34201fcf,
+	0x2a201fd0, 0x2a101fd1, 0x2a401fd2, 0x2a501fd3, 0x3ca00fa2, 0x3cb00fa7, 0x2b001fd6, 0x2a701fd7,
+	0x23101fd8, 0x23001fd9, 0x22d01fda, 0x22e01fdb, 0x3cc00fac, 0x34301fdd, 0x34401fde, 0x34501fdf,
+	0x2c001fe0, 0x2bf01fe1, 0x2c201fe2, 0x2c401fe3, 0x2ba01fe4, 0x2bb01fe5, 0x2ce01fe6, 0x2c501fe7,
+	0x24901fe8, 0x24801fe9, 0x24501fea, 0x24601feb, 0x24401fec, 0x1ec01fed, 0x1ed01fee, 0x3cd00fb9,
+	0x00000000, 0x00000000, 0x2d001ff2, 0x2e601ff3, 0x2d301ff4, 0x00000000, 0x2e401ff6, 0x2e501ff7,
+	0x23b01ff8, 0x23c01ff9, 0x24f01ffa, 0x25101ffb, 0x26201ffc, 0x1f001ffd, 0x00000000, 0x00000000
+	};
+
+// Hash table access functions
+const int KDecompositionHashBitmask = 0xfff;
+
+inline int DecompositionHashStart(long a)
+	{
+	return a & 0xfff;
+	}
+
+inline int DecompositionHashStep(long a)
+	{
+	a *= a >> 12;
+	return ((a<<1) + 1) & 0xfff;
+	}
+
+// Table mapping KNonSingletonDecompositions to the hash table entry that
+// indexes it
+const unsigned short KCompositionMapping[] =
+	{
+	0x026e, 0x0260, 0x026f, 0x00c0, 0x00c1, 0x00c2, 0x0ea6, 0x0ea4,
+	0x0eaa, 0x0ea8, 0x00c3, 0x0100, 0x0102, 0x0eb0, 0x0eae, 0x0eb4,
+	0x0eb2, 0x0226, 0x01e0, 0x00c4, 0x01de, 0x0ea2, 0x00c5, 0x012b,
+	0x01fa, 0x01cd, 0x0200, 0x0202, 0x0ea0, 0x0eac, 0x0eb6, 0x0e00,
+	0x0104, 0x0e02, 0x0e04, 0x0e06, 0x0106, 0x0108, 0x010a, 0x010c,
+	0x00c7, 0x0e08, 0x0e0a, 0x010e, 0x0e0c, 0x0e10, 0x0e12, 0x0e0e,
+	0x00c8, 0x00c9, 0x00ca, 0x0ec0, 0x0ebe, 0x0ec4, 0x0ec2, 0x0ebc,
+	0x0112, 0x0e14, 0x0e16, 0x0114, 0x0116, 0x00cb, 0x0eba, 0x011a,
+	0x0204, 0x0206, 0x0eb8, 0x0ec6, 0x0228, 0x0e1c, 0x0118, 0x0e18,
+	0x0e1a, 0x0e1e, 0x01f4, 0x011c, 0x0e20, 0x011e, 0x0120, 0x01e6,
+	0x0122, 0x0124, 0x0e22, 0x0e26, 0x021e, 0x0e24, 0x0e28, 0x0e2a,
+	0x00cc, 0x00cd, 0x00ce, 0x0128, 0x012a, 0x012c, 0x0130, 0x00cf,
+	0x0e2e, 0x0ec8, 0x01cf, 0x0208, 0x020a, 0x0eca, 0x012e, 0x0e2c,
+	0x0134, 0x0e30, 0x01e8, 0x0e32, 0x0136, 0x0e34, 0x0139, 0x013d,
+	0x0e36, 0x0e38, 0x013b, 0x0e3c, 0x0e3a, 0x0e3e, 0x0e40, 0x0e42,
+	0x01f8, 0x0143, 0x00d1, 0x0e44, 0x0147, 0x0e46, 0x0145, 0x0e4a,
+	0x0e48, 0x00d2, 0x00d3, 0x00d4, 0x0ed2, 0x0ed0, 0x0ed6, 0x0ed4,
+	0x00d5, 0x0e4c, 0x022c, 0x0e4e, 0x014c, 0x0e50, 0x0e52, 0x014e,
+	0x022e, 0x0230, 0x00d6, 0x022a, 0x0ece, 0x0150, 0x01d1, 0x020c,
+	0x020e, 0x01a0, 0x0edc, 0x0eda, 0x0ee0, 0x0ede, 0x0ee2, 0x0ecc,
+	0x0ed8, 0x01ea, 0x01ec, 0x0e54, 0x0e56, 0x0154, 0x0e58, 0x0158,
+	0x0210, 0x0212, 0x0e5a, 0x0e5c, 0x0156, 0x0e5e, 0x015a, 0x0e64,
+	0x015c, 0x0e60, 0x0160, 0x0e66, 0x0e62, 0x0e68, 0x0218, 0x015e,
+	0x0e6a, 0x0164, 0x0e6c, 0x021a, 0x0162, 0x0e70, 0x0e6e, 0x00d9,
+	0x00da, 0x00db, 0x0168, 0x0e78, 0x016a, 0x0e7a, 0x016c, 0x00dc,
+	0x01db, 0x01d7, 0x01d5, 0x01d9, 0x0ee6, 0x016e, 0x0170, 0x01d3,
+	0x0214, 0x0216, 0x01af, 0x0eea, 0x0ee8, 0x0eee, 0x0eec, 0x0ef0,
+	0x0ee4, 0x0e72, 0x0172, 0x0e76, 0x0e74, 0x0e7c, 0x0e7e, 0x0e80,
+	0x0e82, 0x0174, 0x0e86, 0x0e84, 0x0e88, 0x0e8a, 0x0e8c, 0x0ef2,
+	0x00dd, 0x0176, 0x0ef8, 0x0232, 0x0e8e, 0x0178, 0x0ef6, 0x0ef4,
+	0x0179, 0x0e90, 0x017b, 0x017d, 0x0e92, 0x0e94, 0x00e0, 0x00e1,
+	0x00e2, 0x0ea7, 0x0ea5, 0x0eab, 0x0ea9, 0x00e3, 0x0101, 0x0103,
+	0x0eb1, 0x0eaf, 0x0eb5, 0x0eb3, 0x0227, 0x01e1, 0x00e4, 0x01df,
+	0x0ea3, 0x00e5, 0x01fb, 0x01ce, 0x0201, 0x0203, 0x0ea1, 0x0ead,
+	0x0eb7, 0x0e01, 0x0105, 0x0e03, 0x0e05, 0x0e07, 0x0107, 0x0109,
+	0x010b, 0x010d, 0x00e7, 0x0e09, 0x0e0b, 0x010f, 0x0e0d, 0x0e11,
+	0x0e13, 0x0e0f, 0x00e8, 0x00e9, 0x00ea, 0x0ec1, 0x0ebf, 0x0ec5,
+	0x0ec3, 0x0ebd, 0x0113, 0x0e15, 0x0e17, 0x0115, 0x0117, 0x00eb,
+	0x0ebb, 0x011b, 0x0205, 0x0207, 0x0eb9, 0x0ec7, 0x0229, 0x0e1d,
+	0x0119, 0x0e19, 0x0e1b, 0x0e1f, 0x01f5, 0x011d, 0x0e21, 0x011f,
+	0x0121, 0x01e7, 0x0123, 0x0125, 0x0e23, 0x0e27, 0x021f, 0x0e25,
+	0x0e29, 0x0e2b, 0x0e96, 0x00ec, 0x00ed, 0x00ee, 0x0129, 0x012d,
+	0x012f, 0x00ef, 0x0e2f, 0x0ec9, 0x01d0, 0x0209, 0x020b, 0x0ecb,
+	0x0131, 0x0e2d, 0x0135, 0x01f0, 0x0e31, 0x01e9, 0x0e33, 0x0137,
+	0x0e35, 0x013a, 0x013e, 0x0e37, 0x0e39, 0x013c, 0x0e3d, 0x0e3b,
+	0x0e3f, 0x0e41, 0x0e43, 0x01f9, 0x0144, 0x00f1, 0x0e45, 0x0148,
+	0x0e47, 0x0146, 0x0e4b, 0x0e49, 0x00f2, 0x00f3, 0x00f4, 0x0ed3,
+	0x0ed1, 0x0ed7, 0x0ed5, 0x00f5, 0x0e4d, 0x022d, 0x0e4f, 0x014d,
+	0x0e51, 0x0e53, 0x014f, 0x022f, 0x0231, 0x00f6, 0x022b, 0x0ecf,
+	0x0151, 0x01d2, 0x020d, 0x020f, 0x01a1, 0x0edd, 0x0edb, 0x0ee1,
+	0x0edf, 0x0ee3, 0x0ecd, 0x0ed9, 0x01eb, 0x01ed, 0x0e55, 0x0e57,
+	0x0155, 0x0e59, 0x0159, 0x0211, 0x0213, 0x0e5b, 0x0e5d, 0x0157,
+	0x0e5f, 0x015b, 0x0e65, 0x015d, 0x0e61, 0x0161, 0x0e67, 0x0e63,
+	0x0e69, 0x0219, 0x015f, 0x0e6b, 0x0e97, 0x0165, 0x0e6d, 0x021b,
+	0x0163, 0x0e71, 0x0e6f, 0x00f9, 0x00fa, 0x00fb, 0x0169, 0x0e79,
+	0x016b, 0x0e7b, 0x016d, 0x00fc, 0x01dc, 0x01d8, 0x01d6, 0x01da,
+	0x0ee7, 0x016f, 0x0171, 0x01d4, 0x0215, 0x0217, 0x01b0, 0x0eeb,
+	0x0ee9, 0x0eef, 0x0eed, 0x0ef1, 0x0ee5, 0x0e73, 0x0173, 0x0e77,
+	0x0e75, 0x0e7d, 0x0e7f, 0x0e81, 0x0e83, 0x0175, 0x0e87, 0x0e85,
+	0x0e98, 0x0e89, 0x0e8b, 0x0e8d, 0x0ef3, 0x00fd, 0x0177, 0x0ef9,
+	0x0233, 0x0e8f, 0x00ff, 0x0ef7, 0x0e99, 0x0ef5, 0x017a, 0x0e91,
+	0x017c, 0x017e, 0x0e93, 0x0e95, 0x0fed, 0x0fee, 0x0385, 0x0fc1,
+	0x0ffd, 0x01fc, 0x01e2, 0x01fe, 0x01fd, 0x01e3, 0x01ff, 0x0e9b,
+	0x01ee, 0x01ef, 0x0fba, 0x0fbb, 0x0386, 0x0fb9, 0x0fb8, 0x0f08,
+	0x0f0a, 0x0f8a, 0x0f0c, 0x0f8c, 0x0f0e, 0x0f8e, 0x0f88, 0x0f09,
+	0x0f0b, 0x0f8b, 0x0f0d, 0x0f8d, 0x0f0f, 0x0f8f, 0x0f89, 0x0fbc,
+	0x0fc8, 0x0388, 0x0fc9, 0x0f18, 0x0f1a, 0x0f1c, 0x0f19, 0x0f1b,
+	0x0f1d, 0x0fca, 0x0fcb, 0x0389, 0x0f28, 0x0f2a, 0x0f9a, 0x0f2c,
+	0x0f9c, 0x0f2e, 0x0f9e, 0x0f98, 0x0f29, 0x0f2b, 0x0f9b, 0x0f2d,
+	0x0f9d, 0x0f2f, 0x0f9f, 0x0f99, 0x0fcc, 0x0fda, 0x0fdb, 0x038a,
+	0x0fd9, 0x0fd8, 0x03aa, 0x0f38, 0x0f3a, 0x0f3c, 0x0f3e, 0x0f39,
+	0x0f3b, 0x0f3d, 0x0f3f, 0x0ff8, 0x0ff9, 0x038c, 0x0f48, 0x0f4a,
+	0x0f4c, 0x0f49, 0x0f4b, 0x0f4d, 0x0fec, 0x0fea, 0x0feb, 0x038e,
+	0x0fe9, 0x0fe8, 0x03ab, 0x0f59, 0x0f5b, 0x0f5d, 0x0f5f, 0x0ffa,
+	0x038f, 0x0ffb, 0x0f68, 0x0f6a, 0x0faa, 0x0f6c, 0x0fac, 0x0f6e,
+	0x0fae, 0x0fa8, 0x0f69, 0x0f6b, 0x0fab, 0x0f6d, 0x0fad, 0x0f6f,
+	0x0faf, 0x0fa9, 0x0ffc, 0x0f70, 0x0fb2, 0x0f71, 0x03ac, 0x0fb4,
+	0x0fb1, 0x0fb0, 0x0f00, 0x0f02, 0x0f82, 0x0f04, 0x0f84, 0x0f06,
+	0x0f86, 0x0f80, 0x0f01, 0x0f03, 0x0f83, 0x0f05, 0x0f85, 0x0f07,
+	0x0f87, 0x0f81, 0x0fb6, 0x0fb7, 0x0fb3, 0x0f72, 0x03ad, 0x0f73,
+	0x0f10, 0x0f12, 0x0f14, 0x0f11, 0x0f13, 0x0f15, 0x0f74, 0x0fc2,
+	0x03ae, 0x0f75, 0x0fc4, 0x0f20, 0x0f22, 0x0f92, 0x0f24, 0x0f94,
+	0x0f26, 0x0f96, 0x0f90, 0x0f21, 0x0f23, 0x0f93, 0x0f25, 0x0f95,
+	0x0f27, 0x0f97, 0x0f91, 0x0fc6, 0x0fc7, 0x0fc3, 0x0f76, 0x03af,
+	0x0f77, 0x0fd1, 0x0fd0, 0x03ca, 0x0fd2, 0x0fd3, 0x0390, 0x0fd7,
+	0x0f30, 0x0f32, 0x0f34, 0x0f36, 0x0f31, 0x0f33, 0x0f35, 0x0f37,
+	0x0fd6, 0x0f78, 0x0f79, 0x03cc, 0x0f40, 0x0f42, 0x0f44, 0x0f41,
+	0x0f43, 0x0f45, 0x0fe4, 0x0fe5, 0x0f7a, 0x03cd, 0x0f7b, 0x0fe1,
+	0x0fe0, 0x03cb, 0x0fe2, 0x03b0, 0x0fe3, 0x0fe7, 0x0f50, 0x0f52,
+	0x0f54, 0x0f56, 0x0f51, 0x0f53, 0x0f55, 0x0f57, 0x0fe6, 0x0f7c,
+	0x0ff2, 0x0f7d, 0x03ce, 0x0ff4, 0x0f60, 0x0f62, 0x0fa2, 0x0f64,
+	0x0fa4, 0x0f66, 0x0fa6, 0x0fa0, 0x0f61, 0x0f63, 0x0fa3, 0x0f65,
+	0x0fa5, 0x0f67, 0x0fa7, 0x0fa1, 0x0ff6, 0x0ff7, 0x0ff3, 0x03d3,
+	0x03d4, 0x0407, 0x04d0, 0x04d2, 0x0403, 0x0400, 0x04d6, 0x0401,
+	0x04c1, 0x04dc, 0x04de, 0x040d, 0x04e2, 0x0419, 0x04e4, 0x040c,
+	0x04e6, 0x04ee, 0x040e, 0x04f0, 0x04f2, 0x04f4, 0x04f8, 0x04ec,
+	0x04d1, 0x04d3, 0x0453, 0x0450, 0x04d7, 0x0451, 0x04c2, 0x04dd,
+	0x04df, 0x045d, 0x04e3, 0x0439, 0x04e5, 0x045c, 0x04e7, 0x04ef,
+	0x045e, 0x04f1, 0x04f3, 0x04f5, 0x04f9, 0x04ed, 0x0457, 0x0476,
+	0x0477, 0x04da, 0x04db, 0x04ea, 0x04eb, 0x0b1d, 0x0622, 0x0623,
+	0x0625, 0x0624, 0x0626, 0x06c2, 0x06d3, 0x06c0, 0x0929, 0x0931,
+	0x0934, 0x09cb, 0x09cc, 0x0b4b, 0x0b48, 0x0b4c, 0x0b94, 0x0bca,
+	0x0bcc, 0x0bcb, 0x0c48, 0x0cc0, 0x0cca, 0x0ccb, 0x0cc7, 0x0cc8,
+	0x0d4a, 0x0d4c, 0x0d4b, 0x0dda, 0x0ddc, 0x0ddd, 0x0dde, 0x0026,
+	0x0fcd, 0x0fce, 0x0fcf, 0x0fdd, 0x0fde, 0x0fdf, 0x019a, 0x019b,
+	0x01ae, 0x0902, 0x090c, 0x0907, 0x0a15, 0x0a2e, 0x0a3d, 0x0224,
+	0x0abf, 0x0241, 0x0244, 0x0247, 0x0249, 0x026d, 0x0262, 0x0270,
+	0x0271, 0x0274, 0x0275, 0x0278, 0x0279, 0x0280, 0x0281, 0x02e0,
+	0x02e1, 0x0284, 0x0285, 0x0288, 0x0289, 0x02e2, 0x02e3, 0x02ac,
+	0x02ad, 0x02ae, 0x02af, 0x02ea, 0x02eb, 0x02ec, 0x02ed, 0x0094,
+	0x004c, 0x004e, 0x0050, 0x0052, 0x0054, 0x0056, 0x0058, 0x005a,
+	0x005c, 0x005e, 0x0060, 0x0062, 0x0065, 0x0067, 0x0069, 0x0070,
+	0x0071, 0x0073, 0x0074, 0x0076, 0x0077, 0x0079, 0x007a, 0x007c,
+	0x007d, 0x009e, 0x06ad, 0x00ac, 0x00ae, 0x00b0, 0x00b2, 0x00b4,
+	0x00b6, 0x00b8, 0x00ba, 0x00bc, 0x00be, 0x0541, 0x054f, 0x0564,
+	0x0572, 0x0580, 0x00d0, 0x05b8, 0x05c6, 0x05cd, 0x05db, 0x00d7,
+	0x05f0, 0x05f7, 0x0605, 0x060c, 0x00f7, 0x00f8, 0x06d0, 0x06d7,
+	0x00fe
+	};
+
+// Table containing all the decomposition and folding strings longer
+// than 2 UTF16 characters
+const unsigned short KLongDecompositions[] =
+	{
+	0x0397, 0x0313, 0x0300, 0x0345, 0x03B1, 0x0313, 0x0300, 0x0345,
+	0x0397, 0x0314, 0x0300, 0x0345, 0x03C9, 0x0313, 0x0300, 0x0345,
+	0x0391, 0x0314, 0x0342, 0x0345, 0x03B7, 0x0313, 0x0342, 0x0345,
+	0x0397, 0x0314, 0x0301, 0x0345, 0x03B7, 0x0314, 0x0342, 0x0345,
+	0x03A9, 0x0313, 0x0342, 0x0345, 0x03B1, 0x0313, 0x0301, 0x0345,
+	0x03B1, 0x0314, 0x0300, 0x0345, 0x03B1, 0x0314, 0x0301, 0x0345,
+	0x0391, 0x0313, 0x0342, 0x0345, 0x03A9, 0x0314, 0x0342, 0x0345,
+	0x0397, 0x0313, 0x0301, 0x0345, 0x03C9, 0x0314, 0x0342, 0x0345,
+	0x03C9, 0x0313, 0x0342, 0x0345, 0x0397, 0x0314, 0x0342, 0x0345,
+	0x0397, 0x0313, 0x0342, 0x0345, 0x03B7, 0x0314, 0x0301, 0x0345,
+	0x0391, 0x0314, 0x0301, 0x0345, 0x03A9, 0x0314, 0x0301, 0x0345,
+	0x03B7, 0x0313, 0x0301, 0x0345, 0x03B7, 0x0314, 0x0300, 0x0345,
+	0x0391, 0x0313, 0x0301, 0x0345, 0x0391, 0x0314, 0x0300, 0x0345,
+	0x03B1, 0x0314, 0x0342, 0x0345, 0x03A9, 0x0313, 0x0301, 0x0345,
+	0x03A9, 0x0314, 0x0300, 0x0345, 0x03B7, 0x0313, 0x0300, 0x0345,
+	0x03C9, 0x0314, 0x0301, 0x0345, 0x0391, 0x0313, 0x0300, 0x0345,
+	0x03B1, 0x0313, 0x0342, 0x0345, 0x03A9, 0x0313, 0x0300, 0x0345,
+	0x03C9, 0x0313, 0x0301, 0x0345, 0x03C9, 0x0314, 0x0300, 0x0345,
+	0x03C5, 0x0313, 0x0342, 0x039F, 0x0314, 0x0301, 0x0075, 0x031B,
+	0x0309, 0x0041, 0x0306, 0x0309, 0x0061, 0x0302, 0x0309, 0x0043,
+	0x0327, 0x0301, 0x03B1, 0x0313, 0x0345, 0x0045, 0x0302, 0x0300,
+	0x006F, 0x0304, 0x0300, 0x0045, 0x0302, 0x0301, 0x006F, 0x0304,
+	0x0301, 0x0399, 0x0314, 0x0300, 0x03B5, 0x0314, 0x0300, 0x0045,
+	0x0302, 0x0303, 0x0399, 0x0314, 0x0301, 0x03B5, 0x0314, 0x0301,
+	0x004F, 0x0308, 0x0304, 0x0DD9, 0x0DCF, 0x0DCA, 0x0045, 0x0302,
+	0x0309, 0x03A9, 0x0313, 0x0345, 0x039F, 0x0313, 0x0300, 0x03B7,
+	0x0301, 0x0345, 0x03B1, 0x0342, 0x0345, 0x039F, 0x0313, 0x0301,
+	0x0049, 0x0308, 0x0301, 0x004C, 0x0323, 0x0304, 0x006F, 0x0303,
+	0x0301, 0x0399, 0x0313, 0x0300, 0x05E9, 0x05BC, 0x05C1, 0x03B5,
+	0x0313, 0x0300, 0x05E9, 0x05BC, 0x05C2, 0x0399, 0x0313, 0x0301,
+	0x03B5, 0x0313, 0x0301, 0x006F, 0x0303, 0x0304, 0x004F, 0x0307,
+	0x0304, 0x0055, 0x0304, 0x0308, 0x0061, 0x0323, 0x0302, 0x006F,
+	0x0303, 0x0308, 0x0061, 0x0323, 0x0306, 0x03B7, 0x0300, 0x0345,
+	0x03B9, 0x0308, 0x0342, 0x03C9, 0x0301, 0x0345, 0x0073, 0x0301,
+	0x0307, 0x0075, 0x031B, 0x0323, 0x0055, 0x0303, 0x0301, 0x006F,
+	0x0302, 0x0300, 0x006F, 0x0302, 0x0301, 0x0045, 0x0323, 0x0302,
+	0x006F, 0x0302, 0x0303, 0x0391, 0x0314, 0x0345, 0x03B9, 0x0314,
+	0x0342, 0x006F, 0x031B, 0x0300, 0x006F, 0x031B, 0x0301, 0x006F,
+	0x0302, 0x0309, 0x006F, 0x031B, 0x0303, 0x03C5, 0x0308, 0x0300,
+	0x03A5, 0x0314, 0x0342, 0x03C5, 0x0308, 0x0301, 0x006F, 0x031B,
+	0x0309, 0x0075, 0x0308, 0x0300, 0x03C9, 0x0300, 0x0345, 0x0075,
+	0x0308, 0x0301, 0x0073, 0x0323, 0x0307, 0x0075, 0x0308, 0x0304,
+	0x03C5, 0x0314, 0x0300, 0x03C5, 0x0314, 0x0301, 0x0391, 0x0313,
+	0x0345, 0x004F, 0x0328, 0x0304, 0x03B9, 0x0313, 0x0342, 0x0055,
+	0x031B, 0x0300, 0x0061, 0x0308, 0x0304, 0x0041, 0x0302, 0x0300,
+	0x0055, 0x031B, 0x0301, 0x0041, 0x0302, 0x0301, 0x0395, 0x0314,
+	0x0300, 0x0395, 0x0314, 0x0301, 0x0055, 0x031B, 0x0303, 0x0041,
+	0x0302, 0x0303, 0x0072, 0x0323, 0x0304, 0x0075, 0x0308, 0x030C,
+	0x0CC6, 0x0CC2, 0x0CD5, 0x0073, 0x030C, 0x0307, 0x0041, 0x0302,
+	0x0309, 0x0055, 0x031B, 0x0309, 0x0065, 0x0304, 0x0300, 0x0065,
+	0x0304, 0x0301, 0x03B7, 0x0314, 0x0345, 0x0061, 0x030A, 0x0301,
+	0x03C5, 0x0314, 0x0342, 0x004F, 0x0304, 0x0300, 0x03C5, 0x0313,
+	0x0300, 0x004F, 0x0304, 0x0301, 0x03C5, 0x0313, 0x0301, 0x006F,
+	0x0323, 0x0302, 0x0065, 0x0327, 0x0306, 0x0061, 0x0307, 0x0304,
+	0x0395, 0x0313, 0x0300, 0x0395, 0x0313, 0x0301, 0x03B7, 0x0313,
+	0x0345, 0x006F, 0x031B, 0x0323, 0x004F, 0x0303, 0x0301, 0x0061,
+	0x0306, 0x0300, 0x0061, 0x0306, 0x0301, 0x004F, 0x0303, 0x0304,
+	0x0061, 0x0306, 0x0303, 0x03C9, 0x0314, 0x0345, 0x004F, 0x0303,
+	0x0308, 0x0041, 0x0323, 0x0302, 0x03B1, 0x0301, 0x0345, 0x0399,
+	0x0314, 0x0342, 0x0061, 0x0306, 0x0309, 0x03B1, 0x0314, 0x0345,
+	0x0041, 0x0323, 0x0306, 0x03B7, 0x0342, 0x0345, 0x0063, 0x0327,
+	0x0301, 0x004F, 0x031B, 0x0323, 0x0053, 0x0301, 0x0307, 0x0065,
+	0x0302, 0x0300, 0x006F, 0x0328, 0x0304, 0x0065, 0x0302, 0x0301,
+	0x0075, 0x031B, 0x0300, 0x0065, 0x0302, 0x0303, 0x0055, 0x031B,
+	0x0323, 0x006F, 0x0308, 0x0304, 0x004F, 0x0302, 0x0300, 0x004F,
+	0x0302, 0x0301, 0x03BF, 0x0314, 0x0300, 0x03BF, 0x0314, 0x0301,
+	0x004F, 0x0302, 0x0303, 0x03B9, 0x0308, 0x0300, 0x0041, 0x0306,
+	0x0300, 0x0061, 0x0302, 0x0300, 0x03B9, 0x0308, 0x0301, 0x0065,
+	0x0302, 0x0309, 0x03C9, 0x0313, 0x0345, 0x004F, 0x031B, 0x0300,
+	0x004F, 0x031B, 0x0301, 0x03B1, 0x0300, 0x0345, 0x004F, 0x0302,
+	0x0309, 0x004F, 0x031B, 0x0303, 0x0399, 0x0313, 0x0342, 0x0075,
+	0x031B, 0x0301, 0x0069, 0x0308, 0x0301, 0x006C, 0x0323, 0x0304,
+	0x004F, 0x031B, 0x0309, 0x0041, 0x0306, 0x0301, 0x03B9, 0x0314,
+	0x0300, 0x0061, 0x0302, 0x0301, 0x03B9, 0x0314, 0x0301, 0x0055,
+	0x0308, 0x0300, 0x03C9, 0x0342, 0x0345, 0x0053, 0x0323, 0x0307,
+	0x0055, 0x0308, 0x0301, 0x0055, 0x0308, 0x0304, 0x0075, 0x031B,
+	0x0303, 0x0041, 0x0306, 0x0303, 0x006F, 0x0307, 0x0304, 0x03A5,
+	0x0314, 0x0300, 0x03A5, 0x0314, 0x0301, 0x03BF, 0x0313, 0x0300,
+	0x0075, 0x0304, 0x0308, 0x03BF, 0x0313, 0x0301, 0x0397, 0x0314,
+	0x0345, 0x0041, 0x0308, 0x0304, 0x0061, 0x0302, 0x0303, 0x0052,
+	0x0323, 0x0304, 0x0053, 0x030C, 0x0307, 0x0055, 0x0308, 0x030C,
+	0x03A9, 0x0314, 0x0345, 0x03B9, 0x0313, 0x0300, 0x03C5, 0x0308,
+	0x0342, 0x039F, 0x0314, 0x0300, 0x03B9, 0x0313, 0x0301, 0x0075,
+	0x0303, 0x0301, 0x0045, 0x0304, 0x0300, 0x0045, 0x0304, 0x0301,
+	0x0065, 0x0323, 0x0302, 0x0041, 0x030A, 0x0301, 0x0045, 0x0327,
+	0x0306, 0x004F, 0x0323, 0x0302, 0x0397, 0x0313, 0x0345, 0x0041,
+	0x0307, 0x0304
+	};
+
+// Table containing decompositions longer than one UTF16 character.
+// The top of the table contains all compositions, sorted lexicographically.
+// Any decompositions of length 2 are in the table as a pair of values,
+// decompositions longer than that are represented by a KLongD followed by
+// a value whose top four bits indicate the length of the decomposition minus
+// three and whose bottom 12 bits indicate an index into the KLongDecompositions
+// array where the decomposition starts.
+const long KLongD = 0;
+const unsigned short KNonSingletonDecompositions[] =
+	{
+	0x003C, 0x0338, 0x003D, 0x0338, 0x003E, 0x0338, 0x0041, 0x0300,
+	0x0041, 0x0301, 0x0041, 0x0302, KLongD, 0x0165, KLongD, 0x016B,
+	KLongD, 0x0177, KLongD, 0x0186, 0x0041, 0x0303, 0x0041, 0x0304,
+	0x0041, 0x0306, KLongD, 0x0216, KLongD, 0x0243, KLongD, 0x0261,
+	KLongD, 0x0099, 0x0041, 0x0307, KLongD, 0x02AF, 0x0041, 0x0308,
+	KLongD, 0x0279, 0x0041, 0x0309, 0x0041, 0x030A, 0x0041, 0x030A,
+	KLongD, 0x02A3, 0x0041, 0x030C, 0x0041, 0x030F, 0x0041, 0x0311,
+	0x0041, 0x0323, KLongD, 0x01D1, KLongD, 0x01E0, 0x0041, 0x0325,
+	0x0041, 0x0328, 0x0042, 0x0307, 0x0042, 0x0323, 0x0042, 0x0331,
+	0x0043, 0x0301, 0x0043, 0x0302, 0x0043, 0x0307, 0x0043, 0x030C,
+	0x0043, 0x0327, KLongD, 0x009F, 0x0044, 0x0307, 0x0044, 0x030C,
+	0x0044, 0x0323, 0x0044, 0x0327, 0x0044, 0x032D, 0x0044, 0x0331,
+	0x0045, 0x0300, 0x0045, 0x0301, 0x0045, 0x0302, KLongD, 0x00A5,
+	KLongD, 0x00AB, KLongD, 0x00B7, KLongD, 0x00C6, 0x0045, 0x0303,
+	0x0045, 0x0304, KLongD, 0x029A, KLongD, 0x029D, 0x0045, 0x0306,
+	0x0045, 0x0307, 0x0045, 0x0308, 0x0045, 0x0309, 0x0045, 0x030C,
+	0x0045, 0x030F, 0x0045, 0x0311, 0x0045, 0x0323, KLongD, 0x011D,
+	0x0045, 0x0327, KLongD, 0x02A6, 0x0045, 0x0328, 0x0045, 0x032D,
+	0x0045, 0x0330, 0x0046, 0x0307, 0x0047, 0x0301, 0x0047, 0x0302,
+	0x0047, 0x0304, 0x0047, 0x0306, 0x0047, 0x0307, 0x0047, 0x030C,
+	0x0047, 0x0327, 0x0048, 0x0302, 0x0048, 0x0307, 0x0048, 0x0308,
+	0x0048, 0x030C, 0x0048, 0x0323, 0x0048, 0x0327, 0x0048, 0x032E,
+	0x0049, 0x0300, 0x0049, 0x0301, 0x0049, 0x0302, 0x0049, 0x0303,
+	0x0049, 0x0304, 0x0049, 0x0306, 0x0049, 0x0307, 0x0049, 0x0308,
+	KLongD, 0x00D8, 0x0049, 0x0309, 0x0049, 0x030C, 0x0049, 0x030F,
+	0x0049, 0x0311, 0x0049, 0x0323, 0x0049, 0x0328, 0x0049, 0x0330,
+	0x004A, 0x0302, 0x004B, 0x0301, 0x004B, 0x030C, 0x004B, 0x0323,
+	0x004B, 0x0327, 0x004B, 0x0331, 0x004C, 0x0301, 0x004C, 0x030C,
+	0x004C, 0x0323, KLongD, 0x00DB, 0x004C, 0x0327, 0x004C, 0x032D,
+	0x004C, 0x0331, 0x004D, 0x0301, 0x004D, 0x0307, 0x004D, 0x0323,
+	0x004E, 0x0300, 0x004E, 0x0301, 0x004E, 0x0303, 0x004E, 0x0307,
+	0x004E, 0x030C, 0x004E, 0x0323, 0x004E, 0x0327, 0x004E, 0x032D,
+	0x004E, 0x0331, 0x004F, 0x0300, 0x004F, 0x0301, 0x004F, 0x0302,
+	KLongD, 0x0204, KLongD, 0x0207, KLongD, 0x0210, KLongD, 0x022E,
+	0x004F, 0x0303, KLongD, 0x01BC, KLongD, 0x01C5, KLongD, 0x01CE,
+	0x004F, 0x0304, KLongD, 0x019B, KLongD, 0x01A1, 0x004F, 0x0306,
+	0x004F, 0x0307, KLongD, 0x00F6, 0x004F, 0x0308, KLongD, 0x00C0,
+	0x004F, 0x0309, 0x004F, 0x030B, 0x004F, 0x030C, 0x004F, 0x030F,
+	0x004F, 0x0311, 0x004F, 0x031B, KLongD, 0x0225, KLongD, 0x0228,
+	KLongD, 0x0231, KLongD, 0x0240, KLongD, 0x01E9, 0x004F, 0x0323,
+	KLongD, 0x02A9, 0x004F, 0x0328, KLongD, 0x0159, 0x0050, 0x0301,
+	0x0050, 0x0307, 0x0052, 0x0301, 0x0052, 0x0307, 0x0052, 0x030C,
+	0x0052, 0x030F, 0x0052, 0x0311, 0x0052, 0x0323, KLongD, 0x027F,
+	0x0052, 0x0327, 0x0052, 0x0331, 0x0053, 0x0301, KLongD, 0x01EC,
+	0x0053, 0x0302, 0x0053, 0x0307, 0x0053, 0x030C, KLongD, 0x0282,
+	0x0053, 0x0323, KLongD, 0x0255, 0x0053, 0x0326, 0x0053, 0x0327,
+	0x0054, 0x0307, 0x0054, 0x030C, 0x0054, 0x0323, 0x0054, 0x0326,
+	0x0054, 0x0327, 0x0054, 0x032D, 0x0054, 0x0331, 0x0055, 0x0300,
+	0x0055, 0x0301, 0x0055, 0x0302, 0x0055, 0x0303, KLongD, 0x0114,
+	0x0055, 0x0304, KLongD, 0x00F9, 0x0055, 0x0306, 0x0055, 0x0308,
+	KLongD, 0x024F, KLongD, 0x0258, KLongD, 0x025B, KLongD, 0x0285,
+	0x0055, 0x0309, 0x0055, 0x030A, 0x0055, 0x030B, 0x0055, 0x030C,
+	0x0055, 0x030F, 0x0055, 0x0311, 0x0055, 0x031B, KLongD, 0x015F,
+	KLongD, 0x0168, KLongD, 0x0174, KLongD, 0x0189, KLongD, 0x01FE,
+	0x0055, 0x0323, 0x0055, 0x0324, 0x0055, 0x0328, 0x0055, 0x032D,
+	0x0055, 0x0330, 0x0056, 0x0303, 0x0056, 0x0323, 0x0057, 0x0300,
+	0x0057, 0x0301, 0x0057, 0x0302, 0x0057, 0x0307, 0x0057, 0x0308,
+	0x0057, 0x0323, 0x0058, 0x0307, 0x0058, 0x0308, 0x0059, 0x0300,
+	0x0059, 0x0301, 0x0059, 0x0302, 0x0059, 0x0303, 0x0059, 0x0304,
+	0x0059, 0x0307, 0x0059, 0x0308, 0x0059, 0x0309, 0x0059, 0x0323,
+	0x005A, 0x0301, 0x005A, 0x0302, 0x005A, 0x0307, 0x005A, 0x030C,
+	0x005A, 0x0323, 0x005A, 0x0331, 0x0061, 0x0300, 0x0061, 0x0301,
+	0x0061, 0x0302, KLongD, 0x0219, KLongD, 0x0249, KLongD, 0x027C,
+	KLongD, 0x009C, 0x0061, 0x0303, 0x0061, 0x0304, 0x0061, 0x0306,
+	KLongD, 0x01BF, KLongD, 0x01C2, KLongD, 0x01C8, KLongD, 0x01DA,
+	0x0061, 0x0307, KLongD, 0x01AD, 0x0061, 0x0308, KLongD, 0x0162,
+	0x0061, 0x0309, 0x0061, 0x030A, KLongD, 0x0195, 0x0061, 0x030C,
+	0x0061, 0x030F, 0x0061, 0x0311, 0x0061, 0x0323, KLongD, 0x00FC,
+	KLongD, 0x0102, 0x0061, 0x0325, 0x0061, 0x0328, 0x0062, 0x0307,
+	0x0062, 0x0323, 0x0062, 0x0331, 0x0063, 0x0301, 0x0063, 0x0302,
+	0x0063, 0x0307, 0x0063, 0x030C, 0x0063, 0x0327, KLongD, 0x01E6,
+	0x0064, 0x0307, 0x0064, 0x030C, 0x0064, 0x0323, 0x0064, 0x0327,
+	0x0064, 0x032D, 0x0064, 0x0331, 0x0065, 0x0300, 0x0065, 0x0301,
+	0x0065, 0x0302, KLongD, 0x01EF, KLongD, 0x01F5, KLongD, 0x01FB,
+	KLongD, 0x021F, 0x0065, 0x0303, 0x0065, 0x0304, KLongD, 0x018C,
+	KLongD, 0x018F, 0x0065, 0x0306, 0x0065, 0x0307, 0x0065, 0x0308,
+	0x0065, 0x0309, 0x0065, 0x030C, 0x0065, 0x030F, 0x0065, 0x0311,
+	0x0065, 0x0323, KLongD, 0x02A0, 0x0065, 0x0327, KLongD, 0x01AA,
+	0x0065, 0x0328, 0x0065, 0x032D, 0x0065, 0x0330, 0x0066, 0x0307,
+	0x0067, 0x0301, 0x0067, 0x0302, 0x0067, 0x0304, 0x0067, 0x0306,
+	0x0067, 0x0307, 0x0067, 0x030C, 0x0067, 0x0327, 0x0068, 0x0302,
+	0x0068, 0x0307, 0x0068, 0x0308, 0x0068, 0x030C, 0x0068, 0x0323,
+	0x0068, 0x0327, 0x0068, 0x032E, 0x0068, 0x0331, 0x0069, 0x0300,
+	0x0069, 0x0301, 0x0069, 0x0302, 0x0069, 0x0303, 0x0069, 0x0304,
+	0x0069, 0x0306, 0x0069, 0x0308, KLongD, 0x023A, 0x0069, 0x0309,
+	0x0069, 0x030C, 0x0069, 0x030F, 0x0069, 0x0311, 0x0069, 0x0323,
+	0x0069, 0x0328, 0x0069, 0x0330, 0x006A, 0x0302, 0x006A, 0x030C,
+	0x006B, 0x0301, 0x006B, 0x030C, 0x006B, 0x0323, 0x006B, 0x0327,
+	0x006B, 0x0331, 0x006C, 0x0301, 0x006C, 0x030C, 0x006C, 0x0323,
+	KLongD, 0x023D, 0x006C, 0x0327, 0x006C, 0x032D, 0x006C, 0x0331,
+	0x006D, 0x0301, 0x006D, 0x0307, 0x006D, 0x0323, 0x006E, 0x0300,
+	0x006E, 0x0301, 0x006E, 0x0303, 0x006E, 0x0307, 0x006E, 0x030C,
+	0x006E, 0x0323, 0x006E, 0x0327, 0x006E, 0x032D, 0x006E, 0x0331,
+	0x006F, 0x0300, 0x006F, 0x0301, 0x006F, 0x0302, KLongD, 0x0117,
+	KLongD, 0x011A, KLongD, 0x0120, KLongD, 0x012F, 0x006F, 0x0303,
+	KLongD, 0x00DE, KLongD, 0x00F3, KLongD, 0x00FF, 0x006F, 0x0304,
+	KLongD, 0x00A8, KLongD, 0x00AE, 0x006F, 0x0306, 0x006F, 0x0307,
+	KLongD, 0x0264, 0x006F, 0x0308, KLongD, 0x0201, 0x006F, 0x0309,
+	0x006F, 0x030B, 0x006F, 0x030C, 0x006F, 0x030F, 0x006F, 0x0311,
+	0x006F, 0x031B, KLongD, 0x0129, KLongD, 0x012C, KLongD, 0x0132,
+	KLongD, 0x013E, KLongD, 0x01B9, 0x006F, 0x0323, KLongD, 0x01A7,
+	0x006F, 0x0328, KLongD, 0x01F2, 0x0070, 0x0301, 0x0070, 0x0307,
+	0x0072, 0x0301, 0x0072, 0x0307, 0x0072, 0x030C, 0x0072, 0x030F,
+	0x0072, 0x0311, 0x0072, 0x0323, KLongD, 0x017A, 0x0072, 0x0327,
+	0x0072, 0x0331, 0x0073, 0x0301, KLongD, 0x010E, 0x0073, 0x0302,
+	0x0073, 0x0307, 0x0073, 0x030C, KLongD, 0x0183, 0x0073, 0x0323,
+	KLongD, 0x014A, 0x0073, 0x0326, 0x0073, 0x0327, 0x0074, 0x0307,
+	0x0074, 0x0308, 0x0074, 0x030C, 0x0074, 0x0323, 0x0074, 0x0326,
+	0x0074, 0x0327, 0x0074, 0x032D, 0x0074, 0x0331, 0x0075, 0x0300,
+	0x0075, 0x0301, 0x0075, 0x0302, 0x0075, 0x0303, KLongD, 0x0297,
+	0x0075, 0x0304, KLongD, 0x0270, 0x0075, 0x0306, 0x0075, 0x0308,
+	KLongD, 0x0141, KLongD, 0x0147, KLongD, 0x014D, KLongD, 0x017D,
+	0x0075, 0x0309, 0x0075, 0x030A, 0x0075, 0x030B, 0x0075, 0x030C,
+	0x0075, 0x030F, 0x0075, 0x0311, 0x0075, 0x031B, KLongD, 0x01F8,
+	KLongD, 0x0237, KLongD, 0x025E, KLongD, 0x0096, KLongD, 0x0111,
+	0x0075, 0x0323, 0x0075, 0x0324, 0x0075, 0x0328, 0x0075, 0x032D,
+	0x0075, 0x0330, 0x0076, 0x0303, 0x0076, 0x0323, 0x0077, 0x0300,
+	0x0077, 0x0301, 0x0077, 0x0302, 0x0077, 0x0307, 0x0077, 0x0308,
+	0x0077, 0x030A, 0x0077, 0x0323, 0x0078, 0x0307, 0x0078, 0x0308,
+	0x0079, 0x0300, 0x0079, 0x0301, 0x0079, 0x0302, 0x0079, 0x0303,
+	0x0079, 0x0304, 0x0079, 0x0307, 0x0079, 0x0308, 0x0079, 0x0309,
+	0x0079, 0x030A, 0x0079, 0x0323, 0x007A, 0x0301, 0x007A, 0x0302,
+	0x007A, 0x0307, 0x007A, 0x030C, 0x007A, 0x0323, 0x007A, 0x0331,
+	0x00A8, 0x0300, 0x00A8, 0x0301, 0x00A8, 0x0301, 0x00A8, 0x0342,
+	0x00B4, 0xFFFF, 0x00C6, 0x0301, 0x00C6, 0x0304, 0x00D8, 0x0301,
+	0x00E6, 0x0301, 0x00E6, 0x0304, 0x00F8, 0x0301, 0x017F, 0x0307,
+	0x01B7, 0x030C, 0x0292, 0x030C, 0x0391, 0x0300, 0x0391, 0x0301,
+	0x0391, 0x0301, 0x0391, 0x0304, 0x0391, 0x0306, 0x0391, 0x0313,
+	KLongD, 0x007C, KLongD, 0x107C, KLongD, 0x0060, KLongD, 0x1060,
+	KLongD, 0x0030, KLongD, 0x1030, KLongD, 0x0156, 0x0391, 0x0314,
+	KLongD, 0x0064, KLongD, 0x1064, KLongD, 0x0050, KLongD, 0x1050,
+	KLongD, 0x0010, KLongD, 0x1010, KLongD, 0x0123, 0x0391, 0x0345,
+	0x0395, 0x0300, 0x0395, 0x0301, 0x0395, 0x0301, 0x0395, 0x0313,
+	KLongD, 0x01B0, KLongD, 0x01B3, 0x0395, 0x0314, KLongD, 0x016E,
+	KLongD, 0x0171, 0x0397, 0x0300, 0x0397, 0x0301, 0x0397, 0x0301,
+	0x0397, 0x0313, KLongD, 0x0000, KLongD, 0x1000, KLongD, 0x0038,
+	KLongD, 0x1038, KLongD, 0x0048, KLongD, 0x1048, KLongD, 0x02AC,
+	0x0397, 0x0314, KLongD, 0x0008, KLongD, 0x1008, KLongD, 0x0018,
+	KLongD, 0x1018, KLongD, 0x0044, KLongD, 0x1044, KLongD, 0x0276,
+	0x0397, 0x0345, 0x0399, 0x0300, 0x0399, 0x0301, 0x0399, 0x0301,
+	0x0399, 0x0304, 0x0399, 0x0306, 0x0399, 0x0308, 0x0399, 0x0313,
+	KLongD, 0x00E1, KLongD, 0x00ED, KLongD, 0x0234, 0x0399, 0x0314,
+	KLongD, 0x00B1, KLongD, 0x00BA, KLongD, 0x01D7, 0x039F, 0x0300,
+	0x039F, 0x0301, 0x039F, 0x0301, 0x039F, 0x0313, KLongD, 0x00CC,
+	KLongD, 0x00D5, 0x039F, 0x0314, KLongD, 0x0291, KLongD, 0x0093,
+	0x03A1, 0x0314, 0x03A5, 0x0300, 0x03A5, 0x0301, 0x03A5, 0x0301,
+	0x03A5, 0x0304, 0x03A5, 0x0306, 0x03A5, 0x0308, 0x03A5, 0x0314,
+	KLongD, 0x0267, KLongD, 0x026A, KLongD, 0x0138, 0x03A9, 0x0300,
+	0x03A9, 0x0301, 0x03A9, 0x0301, 0x03A9, 0x0313, KLongD, 0x0084,
+	KLongD, 0x1084, KLongD, 0x006C, KLongD, 0x106C, KLongD, 0x0020,
+	KLongD, 0x1020, KLongD, 0x00C9, 0x03A9, 0x0314, KLongD, 0x0070,
+	KLongD, 0x1070, KLongD, 0x0054, KLongD, 0x1054, KLongD, 0x0034,
+	KLongD, 0x1034, KLongD, 0x0288, 0x03A9, 0x0345, 0x03B1, 0x0300,
+	KLongD, 0x022B, 0x03B1, 0x0301, 0x03B1, 0x0301, KLongD, 0x01D4,
+	0x03B1, 0x0304, 0x03B1, 0x0306, 0x03B1, 0x0313, KLongD, 0x0004,
+	KLongD, 0x1004, KLongD, 0x0024, KLongD, 0x1024, KLongD, 0x0080,
+	KLongD, 0x1080, KLongD, 0x00A2, 0x03B1, 0x0314, KLongD, 0x0028,
+	KLongD, 0x1028, KLongD, 0x002C, KLongD, 0x102C, KLongD, 0x0068,
+	KLongD, 0x1068, KLongD, 0x01DD, 0x03B1, 0x0342, KLongD, 0x00D2,
+	0x03B1, 0x0345, 0x03B5, 0x0300, 0x03B5, 0x0301, 0x03B5, 0x0301,
+	0x03B5, 0x0313, KLongD, 0x00E7, KLongD, 0x00F0, 0x03B5, 0x0314,
+	KLongD, 0x00B4, KLongD, 0x00BD, 0x03B7, 0x0300, KLongD, 0x0105,
+	0x03B7, 0x0301, 0x03B7, 0x0301, KLongD, 0x00CF, 0x03B7, 0x0313,
+	KLongD, 0x0074, KLongD, 0x1074, KLongD, 0x0058, KLongD, 0x1058,
+	KLongD, 0x0014, KLongD, 0x1014, KLongD, 0x01B6, 0x03B7, 0x0314,
+	KLongD, 0x005C, KLongD, 0x105C, KLongD, 0x004C, KLongD, 0x104C,
+	KLongD, 0x001C, KLongD, 0x101C, KLongD, 0x0192, 0x03B7, 0x0342,
+	KLongD, 0x01E3, 0x03B7, 0x0345, 0x03B9, 0x0300, 0x03B9, 0x0301,
+	0x03B9, 0x0301, 0x03B9, 0x0304, 0x03B9, 0x0306, 0x03B9, 0x0308,
+	KLongD, 0x0213, KLongD, 0x021C, KLongD, 0x021C, KLongD, 0x0108,
+	0x03B9, 0x0313, KLongD, 0x028B, KLongD, 0x0294, KLongD, 0x015C,
+	0x03B9, 0x0314, KLongD, 0x0246, KLongD, 0x024C, KLongD, 0x0126,
+	0x03B9, 0x0342, 0x03BF, 0x0300, 0x03BF, 0x0301, 0x03BF, 0x0301,
+	0x03BF, 0x0313, KLongD, 0x026D, KLongD, 0x0273, 0x03BF, 0x0314,
+	KLongD, 0x020A, KLongD, 0x020D, 0x03C1, 0x0313, 0x03C1, 0x0314,
+	0x03C5, 0x0300, 0x03C5, 0x0301, 0x03C5, 0x0301, 0x03C5, 0x0304,
+	0x03C5, 0x0306, 0x03C5, 0x0308, KLongD, 0x0135, KLongD, 0x013B,
+	KLongD, 0x013B, KLongD, 0x028E, 0x03C5, 0x0313, KLongD, 0x019E,
+	KLongD, 0x01A4, KLongD, 0x0090, 0x03C5, 0x0314, KLongD, 0x0150,
+	KLongD, 0x0153, KLongD, 0x0198, 0x03C5, 0x0342, 0x03C9, 0x0300,
+	KLongD, 0x0144, 0x03C9, 0x0301, 0x03C9, 0x0301, KLongD, 0x010B,
+	0x03C9, 0x0313, KLongD, 0x000C, KLongD, 0x100C, KLongD, 0x0088,
+	KLongD, 0x1088, KLongD, 0x0040, KLongD, 0x1040, KLongD, 0x0222,
+	0x03C9, 0x0314, KLongD, 0x008C, KLongD, 0x108C, KLongD, 0x0078,
+	KLongD, 0x1078, KLongD, 0x003C, KLongD, 0x103C, KLongD, 0x01CB,
+	0x03C9, 0x0342, KLongD, 0x0252, 0x03C9, 0x0345, 0x03D2, 0x0301,
+	0x03D2, 0x0308, 0x0406, 0x0308, 0x0410, 0x0306, 0x0410, 0x0308,
+	0x0413, 0x0301, 0x0415, 0x0300, 0x0415, 0x0306, 0x0415, 0x0308,
+	0x0416, 0x0306, 0x0416, 0x0308, 0x0417, 0x0308, 0x0418, 0x0300,
+	0x0418, 0x0304, 0x0418, 0x0306, 0x0418, 0x0308, 0x041A, 0x0301,
+	0x041E, 0x0308, 0x0423, 0x0304, 0x0423, 0x0306, 0x0423, 0x0308,
+	0x0423, 0x030B, 0x0427, 0x0308, 0x042B, 0x0308, 0x042D, 0x0308,
+	0x0430, 0x0306, 0x0430, 0x0308, 0x0433, 0x0301, 0x0435, 0x0300,
+	0x0435, 0x0306, 0x0435, 0x0308, 0x0436, 0x0306, 0x0436, 0x0308,
+	0x0437, 0x0308, 0x0438, 0x0300, 0x0438, 0x0304, 0x0438, 0x0306,
+	0x0438, 0x0308, 0x043A, 0x0301, 0x043E, 0x0308, 0x0443, 0x0304,
+	0x0443, 0x0306, 0x0443, 0x0308, 0x0443, 0x030B, 0x0447, 0x0308,
+	0x044B, 0x0308, 0x044D, 0x0308, 0x0456, 0x0308, 0x0474, 0x030F,
+	0x0475, 0x030F, 0x04D8, 0x0308, 0x04D9, 0x0308, 0x04E8, 0x0308,
+	0x04E9, 0x0308, 0x05D9, 0x05B4, 0x0627, 0x0653, 0x0627, 0x0654,
+	0x0627, 0x0655, 0x0648, 0x0654, 0x064A, 0x0654, 0x06C1, 0x0654,
+	0x06D2, 0x0654, 0x06D5, 0x0654, 0x0928, 0x093C, 0x0930, 0x093C,
+	0x0933, 0x093C, 0x09C7, 0x09BE, 0x09C7, 0x09D7, 0x0B47, 0x0B3E,
+	0x0B47, 0x0B56, 0x0B47, 0x0B57, 0x0B92, 0x0BD7, 0x0BC6, 0x0BBE,
+	0x0BC6, 0x0BD7, 0x0BC7, 0x0BBE, 0x0C46, 0x0C56, 0x0CBF, 0x0CD5,
+	0x0CC6, 0x0CC2, KLongD, 0x0180, 0x0CC6, 0x0CD5, 0x0CC6, 0x0CD6,
+	0x0D46, 0x0D3E, 0x0D46, 0x0D57, 0x0D47, 0x0D3E, 0x0DD9, 0x0DCA,
+	0x0DD9, 0x0DCF, KLongD, 0x00C3, 0x0DD9, 0x0DDF, 0x1025, 0x102E,
+	0x1FBF, 0x0300, 0x1FBF, 0x0301, 0x1FBF, 0x0342, 0x1FFE, 0x0300,
+	0x1FFE, 0x0301, 0x1FFE, 0x0342, 0x2190, 0x0338, 0x2192, 0x0338,
+	0x2194, 0x0338, 0x21D0, 0x0338, 0x21D2, 0x0338, 0x21D4, 0x0338,
+	0x2203, 0x0338, 0x2208, 0x0338, 0x220B, 0x0338, 0x2223, 0x0338,
+	0x2225, 0x0338, 0x223C, 0x0338, 0x2243, 0x0338, 0x2245, 0x0338,
+	0x2248, 0x0338, 0x224D, 0x0338, 0x2261, 0x0338, 0x2264, 0x0338,
+	0x2265, 0x0338, 0x2272, 0x0338, 0x2273, 0x0338, 0x2276, 0x0338,
+	0x2277, 0x0338, 0x227A, 0x0338, 0x227B, 0x0338, 0x227C, 0x0338,
+	0x227D, 0x0338, 0x2282, 0x0338, 0x2283, 0x0338, 0x2286, 0x0338,
+	0x2287, 0x0338, 0x2291, 0x0338, 0x2292, 0x0338, 0x22A2, 0x0338,
+	0x22A8, 0x0338, 0x22A9, 0x0338, 0x22AB, 0x0338, 0x22B2, 0x0338,
+	0x22B3, 0x0338, 0x22B4, 0x0338, 0x22B5, 0x0338, 0x3046, 0x3099,
+	0x304B, 0x3099, 0x304D, 0x3099, 0x304F, 0x3099, 0x3051, 0x3099,
+	0x3053, 0x3099, 0x3055, 0x3099, 0x3057, 0x3099, 0x3059, 0x3099,
+	0x305B, 0x3099, 0x305D, 0x3099, 0x305F, 0x3099, 0x3061, 0x3099,
+	0x3064, 0x3099, 0x3066, 0x3099, 0x3068, 0x3099, 0x306F, 0x3099,
+	0x306F, 0x309A, 0x3072, 0x3099, 0x3072, 0x309A, 0x3075, 0x3099,
+	0x3075, 0x309A, 0x3078, 0x3099, 0x3078, 0x309A, 0x307B, 0x3099,
+	0x307B, 0x309A, 0x309D, 0x3099, 0x30A6, 0x3099, 0x30AB, 0x3099,
+	0x30AD, 0x3099, 0x30AF, 0x3099, 0x30B1, 0x3099, 0x30B3, 0x3099,
+	0x30B5, 0x3099, 0x30B7, 0x3099, 0x30B9, 0x3099, 0x30BB, 0x3099,
+	0x30BD, 0x3099, 0x30BF, 0x3099, 0x30C1, 0x3099, 0x30C4, 0x3099,
+	0x30C6, 0x3099, 0x30C8, 0x3099, 0x30CF, 0x3099, 0x30CF, 0x309A,
+	0x30D2, 0x3099, 0x30D2, 0x309A, 0x30D5, 0x3099, 0x30D5, 0x309A,
+	0x30D8, 0x3099, 0x30D8, 0x309A, 0x30DB, 0x3099, 0x30DB, 0x309A,
+	0x30EF, 0x3099, 0x30F0, 0x3099, 0x30F1, 0x3099, 0x30F2, 0x3099,
+	0x30FD, 0x3099, 0x0308, 0x0301, 0x0915, 0x093C, 0x0916, 0x093C,
+	0x0917, 0x093C, 0x091C, 0x093C, 0x0921, 0x093C, 0x0922, 0x093C,
+	0x092B, 0x093C, 0x092F, 0x093C, 0x09A1, 0x09BC, 0x09A2, 0x09BC,
+	0x09AF, 0x09BC, 0x0A32, 0x0A3C, 0x0A38, 0x0A3C, 0x0A16, 0x0A3C,
+	0x0A17, 0x0A3C, 0x0A1C, 0x0A3C, 0x0A2B, 0x0A3C, 0x0B21, 0x0B3C,
+	0x0B22, 0x0B3C, 0x0F42, 0x0FB7, 0x0F4C, 0x0FB7, 0x0F51, 0x0FB7,
+	0x0F56, 0x0FB7, 0x0F5B, 0x0FB7, 0x0F40, 0x0FB5, 0x0F71, 0x0F72,
+	0x0F71, 0x0F74, 0x0FB2, 0x0F80, 0x0FB3, 0x0F80, 0x0F71, 0x0F80,
+	0x0F92, 0x0FB7, 0x0F9C, 0x0FB7, 0x0FA1, 0x0FB7, 0x0FA6, 0x0FB7,
+	0x0FAB, 0x0FB7, 0x0F90, 0x0FB5, 0x05F2, 0x05B7, 0x05E9, 0x05C1,
+	0x05E9, 0x05C2, KLongD, 0x00E4, KLongD, 0x00EA, 0x05D0, 0x05B7,
+	0x05D0, 0x05B8, 0x05D0, 0x05BC, 0x05D1, 0x05BC, 0x05D2, 0x05BC,
+	0x05D3, 0x05BC, 0x05D4, 0x05BC, 0x05D5, 0x05BC, 0x05D6, 0x05BC,
+	0x05D8, 0x05BC, 0x05D9, 0x05BC, 0x05DA, 0x05BC, 0x05DB, 0x05BC,
+	0x05DC, 0x05BC, 0x05DE, 0x05BC, 0x05E0, 0x05BC, 0x05E1, 0x05BC,
+	0x05E3, 0x05BC, 0x05E4, 0x05BC, 0x05E6, 0x05BC, 0x05E7, 0x05BC,
+	0x05E8, 0x05BC, 0x05E9, 0x05BC, 0x05EA, 0x05BC, 0x05D5, 0x05B9,
+	0x05D1, 0x05BF, 0x05DB, 0x05BF, 0x05E4, 0x05BF
+	};
+
+// Table of folded decompositions which either have more than one UTF16, or
+// their normal decompositions have more than one UTF16
+const unsigned short KNonSingletonFolds[] =
+	{
+	0x003C, 0x0338, 0x003D, 0x0338, 0x003E, 0x0338, 0x0061, 0x0300,
+	0x0061, 0x0301, 0x0061, 0x0302, KLongD, 0x0219, KLongD, 0x0249,
+	KLongD, 0x027C, KLongD, 0x009C, 0x0061, 0x0303, 0x0061, 0x0304,
+	0x0061, 0x0306, KLongD, 0x01BF, KLongD, 0x01C2, KLongD, 0x01C8,
+	KLongD, 0x01DA, 0x0061, 0x0307, KLongD, 0x01AD, 0x0061, 0x0308,
+	KLongD, 0x0162, 0x0061, 0x0309, 0x0061, 0x030A, 0x0061, 0x030A,
+	KLongD, 0x0195, 0x0061, 0x030C, 0x0061, 0x030F, 0x0061, 0x0311,
+	0x0061, 0x0323, KLongD, 0x00FC, KLongD, 0x0102, 0x0061, 0x0325,
+	0x0061, 0x0328, 0x0062, 0x0307, 0x0062, 0x0323, 0x0062, 0x0331,
+	0x0063, 0x0301, 0x0063, 0x0302, 0x0063, 0x0307, 0x0063, 0x030C,
+	0x0063, 0x0327, KLongD, 0x01E6, 0x0064, 0x0307, 0x0064, 0x030C,
+	0x0064, 0x0323, 0x0064, 0x0327, 0x0064, 0x032D, 0x0064, 0x0331,
+	0x0065, 0x0300, 0x0065, 0x0301, 0x0065, 0x0302, KLongD, 0x01EF,
+	KLongD, 0x01F5, KLongD, 0x01FB, KLongD, 0x021F, 0x0065, 0x0303,
+	0x0065, 0x0304, KLongD, 0x018C, KLongD, 0x018F, 0x0065, 0x0306,
+	0x0065, 0x0307, 0x0065, 0x0308, 0x0065, 0x0309, 0x0065, 0x030C,
+	0x0065, 0x030F, 0x0065, 0x0311, 0x0065, 0x0323, KLongD, 0x02A0,
+	0x0065, 0x0327, KLongD, 0x01AA, 0x0065, 0x0328, 0x0065, 0x032D,
+	0x0065, 0x0330, 0x0066, 0x0307, 0x0067, 0x0301, 0x0067, 0x0302,
+	0x0067, 0x0304, 0x0067, 0x0306, 0x0067, 0x0307, 0x0067, 0x030C,
+	0x0067, 0x0327, 0x0068, 0x0302, 0x0068, 0x0307, 0x0068, 0x0308,
+	0x0068, 0x030C, 0x0068, 0x0323, 0x0068, 0x0327, 0x0068, 0x032E,
+	0x0069, 0x0300, 0x0069, 0x0301, 0x0069, 0x0302, 0x0069, 0x0303,
+	0x0069, 0x0304, 0x0069, 0x0306, 0x0069, 0xFFFF, 0x0069, 0x0308,
+	KLongD, 0x023A, 0x0069, 0x0309, 0x0069, 0x030C, 0x0069, 0x030F,
+	0x0069, 0x0311, 0x0069, 0x0323, 0x0069, 0x0328, 0x0069, 0x0330,
+	0x006A, 0x0302, 0x006B, 0x0301, 0x006B, 0x030C, 0x006B, 0x0323,
+	0x006B, 0x0327, 0x006B, 0x0331, 0x006C, 0x0301, 0x006C, 0x030C,
+	0x006C, 0x0323, KLongD, 0x023D, 0x006C, 0x0327, 0x006C, 0x032D,
+	0x006C, 0x0331, 0x006D, 0x0301, 0x006D, 0x0307, 0x006D, 0x0323,
+	0x006E, 0x0300, 0x006E, 0x0301, 0x006E, 0x0303, 0x006E, 0x0307,
+	0x006E, 0x030C, 0x006E, 0x0323, 0x006E, 0x0327, 0x006E, 0x032D,
+	0x006E, 0x0331, 0x006F, 0x0300, 0x006F, 0x0301, 0x006F, 0x0302,
+	KLongD, 0x0117, KLongD, 0x011A, KLongD, 0x0120, KLongD, 0x012F,
+	0x006F, 0x0303, KLongD, 0x00DE, KLongD, 0x00F3, KLongD, 0x00FF,
+	0x006F, 0x0304, KLongD, 0x00A8, KLongD, 0x00AE, 0x006F, 0x0306,
+	0x006F, 0x0307, KLongD, 0x0264, 0x006F, 0x0308, KLongD, 0x0201,
+	0x006F, 0x0309, 0x006F, 0x030B, 0x006F, 0x030C, 0x006F, 0x030F,
+	0x006F, 0x0311, 0x006F, 0x031B, KLongD, 0x0129, KLongD, 0x012C,
+	KLongD, 0x0132, KLongD, 0x013E, KLongD, 0x01B9, 0x006F, 0x0323,
+	KLongD, 0x01A7, 0x006F, 0x0328, KLongD, 0x01F2, 0x0070, 0x0301,
+	0x0070, 0x0307, 0x0072, 0x0301, 0x0072, 0x0307, 0x0072, 0x030C,
+	0x0072, 0x030F, 0x0072, 0x0311, 0x0072, 0x0323, KLongD, 0x017A,
+	0x0072, 0x0327, 0x0072, 0x0331, 0x0073, 0x0301, KLongD, 0x010E,
+	0x0073, 0x0302, 0x0073, 0x0307, 0x0073, 0x030C, KLongD, 0x0183,
+	0x0073, 0x0323, KLongD, 0x014A, 0x0073, 0x0326, 0x0073, 0x0327,
+	0x0074, 0x0307, 0x0074, 0x030C, 0x0074, 0x0323, 0x0074, 0x0326,
+	0x0074, 0x0327, 0x0074, 0x032D, 0x0074, 0x0331, 0x0075, 0x0300,
+	0x0075, 0x0301, 0x0075, 0x0302, 0x0075, 0x0303, KLongD, 0x0297,
+	0x0075, 0x0304, KLongD, 0x0270, 0x0075, 0x0306, 0x0075, 0x0308,
+	KLongD, 0x0141, KLongD, 0x0147, KLongD, 0x014D, KLongD, 0x017D,
+	0x0075, 0x0309, 0x0075, 0x030A, 0x0075, 0x030B, 0x0075, 0x030C,
+	0x0075, 0x030F, 0x0075, 0x0311, 0x0075, 0x031B, KLongD, 0x01F8,
+	KLongD, 0x0237, KLongD, 0x025E, KLongD, 0x0096, KLongD, 0x0111,
+	0x0075, 0x0323, 0x0075, 0x0324, 0x0075, 0x0328, 0x0075, 0x032D,
+	0x0075, 0x0330, 0x0076, 0x0303, 0x0076, 0x0323, 0x0077, 0x0300,
+	0x0077, 0x0301, 0x0077, 0x0302, 0x0077, 0x0307, 0x0077, 0x0308,
+	0x0077, 0x0323, 0x0078, 0x0307, 0x0078, 0x0308, 0x0079, 0x0300,
+	0x0079, 0x0301, 0x0079, 0x0302, 0x0079, 0x0303, 0x0079, 0x0304,
+	0x0079, 0x0307, 0x0079, 0x0308, 0x0079, 0x0309, 0x0079, 0x0323,
+	0x007A, 0x0301, 0x007A, 0x0302, 0x007A, 0x0307, 0x007A, 0x030C,
+	0x007A, 0x0323, 0x007A, 0x0331, 0x0061, 0x0300, 0x0061, 0x0301,
+	0x0061, 0x0302, KLongD, 0x0219, KLongD, 0x0249, KLongD, 0x027C,
+	KLongD, 0x009C, 0x0061, 0x0303, 0x0061, 0x0304, 0x0061, 0x0306,
+	KLongD, 0x01BF, KLongD, 0x01C2, KLongD, 0x01C8, KLongD, 0x01DA,
+	0x0061, 0x0307, KLongD, 0x01AD, 0x0061, 0x0308, KLongD, 0x0162,
+	0x0061, 0x0309, 0x0061, 0x030A, KLongD, 0x0195, 0x0061, 0x030C,
+	0x0061, 0x030F, 0x0061, 0x0311, 0x0061, 0x0323, KLongD, 0x00FC,
+	KLongD, 0x0102, 0x0061, 0x0325, 0x0061, 0x0328, 0x0062, 0x0307,
+	0x0062, 0x0323, 0x0062, 0x0331, 0x0063, 0x0301, 0x0063, 0x0302,
+	0x0063, 0x0307, 0x0063, 0x030C, 0x0063, 0x0327, KLongD, 0x01E6,
+	0x0064, 0x0307, 0x0064, 0x030C, 0x0064, 0x0323, 0x0064, 0x0327,
+	0x0064, 0x032D, 0x0064, 0x0331, 0x0065, 0x0300, 0x0065, 0x0301,
+	0x0065, 0x0302, KLongD, 0x01EF, KLongD, 0x01F5, KLongD, 0x01FB,
+	KLongD, 0x021F, 0x0065, 0x0303, 0x0065, 0x0304, KLongD, 0x018C,
+	KLongD, 0x018F, 0x0065, 0x0306, 0x0065, 0x0307, 0x0065, 0x0308,
+	0x0065, 0x0309, 0x0065, 0x030C, 0x0065, 0x030F, 0x0065, 0x0311,
+	0x0065, 0x0323, KLongD, 0x02A0, 0x0065, 0x0327, KLongD, 0x01AA,
+	0x0065, 0x0328, 0x0065, 0x032D, 0x0065, 0x0330, 0x0066, 0x0307,
+	0x0067, 0x0301, 0x0067, 0x0302, 0x0067, 0x0304, 0x0067, 0x0306,
+	0x0067, 0x0307, 0x0067, 0x030C, 0x0067, 0x0327, 0x0068, 0x0302,
+	0x0068, 0x0307, 0x0068, 0x0308, 0x0068, 0x030C, 0x0068, 0x0323,
+	0x0068, 0x0327, 0x0068, 0x032E, 0x0068, 0x0331, 0x0069, 0x0300,
+	0x0069, 0x0301, 0x0069, 0x0302, 0x0069, 0x0303, 0x0069, 0x0304,
+	0x0069, 0x0306, 0x0069, 0x0308, KLongD, 0x023A, 0x0069, 0x0309,
+	0x0069, 0x030C, 0x0069, 0x030F, 0x0069, 0x0311, 0x0069, 0x0323,
+	0x0069, 0x0328, 0x0069, 0x0330, 0x006A, 0x0302, 0x006A, 0x030C,
+	0x006B, 0x0301, 0x006B, 0x030C, 0x006B, 0x0323, 0x006B, 0x0327,
+	0x006B, 0x0331, 0x006C, 0x0301, 0x006C, 0x030C, 0x006C, 0x0323,
+	KLongD, 0x023D, 0x006C, 0x0327, 0x006C, 0x032D, 0x006C, 0x0331,
+	0x006D, 0x0301, 0x006D, 0x0307, 0x006D, 0x0323, 0x006E, 0x0300,
+	0x006E, 0x0301, 0x006E, 0x0303, 0x006E, 0x0307, 0x006E, 0x030C,
+	0x006E, 0x0323, 0x006E, 0x0327, 0x006E, 0x032D, 0x006E, 0x0331,
+	0x006F, 0x0300, 0x006F, 0x0301, 0x006F, 0x0302, KLongD, 0x0117,
+	KLongD, 0x011A, KLongD, 0x0120, KLongD, 0x012F, 0x006F, 0x0303,
+	KLongD, 0x00DE, KLongD, 0x00F3, KLongD, 0x00FF, 0x006F, 0x0304,
+	KLongD, 0x00A8, KLongD, 0x00AE, 0x006F, 0x0306, 0x006F, 0x0307,
+	KLongD, 0x0264, 0x006F, 0x0308, KLongD, 0x0201, 0x006F, 0x0309,
+	0x006F, 0x030B, 0x006F, 0x030C, 0x006F, 0x030F, 0x006F, 0x0311,
+	0x006F, 0x031B, KLongD, 0x0129, KLongD, 0x012C, KLongD, 0x0132,
+	KLongD, 0x013E, KLongD, 0x01B9, 0x006F, 0x0323, KLongD, 0x01A7,
+	0x006F, 0x0328, KLongD, 0x01F2, 0x0070, 0x0301, 0x0070, 0x0307,
+	0x0072, 0x0301, 0x0072, 0x0307, 0x0072, 0x030C, 0x0072, 0x030F,
+	0x0072, 0x0311, 0x0072, 0x0323, KLongD, 0x017A, 0x0072, 0x0327,
+	0x0072, 0x0331, 0x0073, 0x0301, KLongD, 0x010E, 0x0073, 0x0302,
+	0x0073, 0x0307, 0x0073, 0x030C, KLongD, 0x0183, 0x0073, 0x0323,
+	KLongD, 0x014A, 0x0073, 0x0326, 0x0073, 0x0327, 0x0074, 0x0307,
+	0x0074, 0x0308, 0x0074, 0x030C, 0x0074, 0x0323, 0x0074, 0x0326,
+	0x0074, 0x0327, 0x0074, 0x032D, 0x0074, 0x0331, 0x0075, 0x0300,
+	0x0075, 0x0301, 0x0075, 0x0302, 0x0075, 0x0303, KLongD, 0x0297,
+	0x0075, 0x0304, KLongD, 0x0270, 0x0075, 0x0306, 0x0075, 0x0308,
+	KLongD, 0x0141, KLongD, 0x0147, KLongD, 0x014D, KLongD, 0x017D,
+	0x0075, 0x0309, 0x0075, 0x030A, 0x0075, 0x030B, 0x0075, 0x030C,
+	0x0075, 0x030F, 0x0075, 0x0311, 0x0075, 0x031B, KLongD, 0x01F8,
+	KLongD, 0x0237, KLongD, 0x025E, KLongD, 0x0096, KLongD, 0x0111,
+	0x0075, 0x0323, 0x0075, 0x0324, 0x0075, 0x0328, 0x0075, 0x032D,
+	0x0075, 0x0330, 0x0076, 0x0303, 0x0076, 0x0323, 0x0077, 0x0300,
+	0x0077, 0x0301, 0x0077, 0x0302, 0x0077, 0x0307, 0x0077, 0x0308,
+	0x0077, 0x030A, 0x0077, 0x0323, 0x0078, 0x0307, 0x0078, 0x0308,
+	0x0079, 0x0300, 0x0079, 0x0301, 0x0079, 0x0302, 0x0079, 0x0303,
+	0x0079, 0x0304, 0x0079, 0x0307, 0x0079, 0x0308, 0x0079, 0x0309,
+	0x0079, 0x030A, 0x0079, 0x0323, 0x007A, 0x0301, 0x007A, 0x0302,
+	0x007A, 0x0307, 0x007A, 0x030C, 0x007A, 0x0323, 0x007A, 0x0331,
+	0x00A8, 0x0300, 0x00A8, 0x0301, 0x00A8, 0x0301, 0x00A8, 0x0342,
+	0x00B4, 0xFFFF, 0x00E6, 0x0301, 0x00E6, 0x0304, 0x00F8, 0x0301,
+	0x00E6, 0x0301, 0x00E6, 0x0304, 0x00F8, 0x0301, 0x0073, 0x0307,
+	0x0292, 0x030C, 0x0292, 0x030C, 0x03B1, 0x0300, 0x03B1, 0x0301,
+	0x03B1, 0x0301, 0x03B1, 0x0304, 0x03B1, 0x0306, 0x03B1, 0x0313,
+	KLongD, 0x0004, KLongD, 0x1004, KLongD, 0x0024, KLongD, 0x1024,
+	KLongD, 0x0080, KLongD, 0x1080, KLongD, 0x00A2, 0x03B1, 0x0314,
+	KLongD, 0x0028, KLongD, 0x1028, KLongD, 0x002C, KLongD, 0x102C,
+	KLongD, 0x0068, KLongD, 0x1068, KLongD, 0x01DD, 0x03B1, 0x0345,
+	0x03B5, 0x0300, 0x03B5, 0x0301, 0x03B5, 0x0301, 0x03B5, 0x0313,
+	KLongD, 0x00E7, KLongD, 0x00F0, 0x03B5, 0x0314, KLongD, 0x00B4,
+	KLongD, 0x00BD, 0x03B7, 0x0300, 0x03B7, 0x0301, 0x03B7, 0x0301,
+	0x03B7, 0x0313, KLongD, 0x0074, KLongD, 0x1074, KLongD, 0x0058,
+	KLongD, 0x1058, KLongD, 0x0014, KLongD, 0x1014, KLongD, 0x01B6,
+	0x03B7, 0x0314, KLongD, 0x005C, KLongD, 0x105C, KLongD, 0x004C,
+	KLongD, 0x104C, KLongD, 0x001C, KLongD, 0x101C, KLongD, 0x0192,
+	0x03B7, 0x0345, 0x03B9, 0x0300, 0x03B9, 0x0301, 0x03B9, 0x0301,
+	0x03B9, 0x0304, 0x03B9, 0x0306, 0x03B9, 0x0308, 0x03B9, 0x0313,
+	KLongD, 0x028B, KLongD, 0x0294, KLongD, 0x015C, 0x03B9, 0x0314,
+	KLongD, 0x0246, KLongD, 0x024C, KLongD, 0x0126, 0x03BF, 0x0300,
+	0x03BF, 0x0301, 0x03BF, 0x0301, 0x03BF, 0x0313, KLongD, 0x026D,
+	KLongD, 0x0273, 0x03BF, 0x0314, KLongD, 0x020A, KLongD, 0x020D,
+	0x03C1, 0x0314, 0x03C5, 0x0300, 0x03C5, 0x0301, 0x03C5, 0x0301,
+	0x03C5, 0x0304, 0x03C5, 0x0306, 0x03C5, 0x0308, 0x03C5, 0x0314,
+	KLongD, 0x0150, KLongD, 0x0153, KLongD, 0x0198, 0x03C9, 0x0300,
+	0x03C9, 0x0301, 0x03C9, 0x0301, 0x03C9, 0x0313, KLongD, 0x000C,
+	KLongD, 0x100C, KLongD, 0x0088, KLongD, 0x1088, KLongD, 0x0040,
+	KLongD, 0x1040, KLongD, 0x0222, 0x03C9, 0x0314, KLongD, 0x008C,
+	KLongD, 0x108C, KLongD, 0x0078, KLongD, 0x1078, KLongD, 0x003C,
+	KLongD, 0x103C, KLongD, 0x01CB, 0x03C9, 0x0345, 0x03B1, 0x0300,
+	KLongD, 0x022B, 0x03B1, 0x0301, 0x03B1, 0x0301, KLongD, 0x01D4,
+	0x03B1, 0x0304, 0x03B1, 0x0306, 0x03B1, 0x0313, KLongD, 0x0004,
+	KLongD, 0x1004, KLongD, 0x0024, KLongD, 0x1024, KLongD, 0x0080,
+	KLongD, 0x1080, KLongD, 0x00A2, 0x03B1, 0x0314, KLongD, 0x0028,
+	KLongD, 0x1028, KLongD, 0x002C, KLongD, 0x102C, KLongD, 0x0068,
+	KLongD, 0x1068, KLongD, 0x01DD, 0x03B1, 0x0342, KLongD, 0x00D2,
+	0x03B1, 0x0345, 0x03B5, 0x0300, 0x03B5, 0x0301, 0x03B5, 0x0301,
+	0x03B5, 0x0313, KLongD, 0x00E7, KLongD, 0x00F0, 0x03B5, 0x0314,
+	KLongD, 0x00B4, KLongD, 0x00BD, 0x03B7, 0x0300, KLongD, 0x0105,
+	0x03B7, 0x0301, 0x03B7, 0x0301, KLongD, 0x00CF, 0x03B7, 0x0313,
+	KLongD, 0x0074, KLongD, 0x1074, KLongD, 0x0058, KLongD, 0x1058,
+	KLongD, 0x0014, KLongD, 0x1014, KLongD, 0x01B6, 0x03B7, 0x0314,
+	KLongD, 0x005C, KLongD, 0x105C, KLongD, 0x004C, KLongD, 0x104C,
+	KLongD, 0x001C, KLongD, 0x101C, KLongD, 0x0192, 0x03B7, 0x0342,
+	KLongD, 0x01E3, 0x03B7, 0x0345, 0x03B9, 0x0300, 0x03B9, 0x0301,
+	0x03B9, 0x0301, 0x03B9, 0x0304, 0x03B9, 0x0306, 0x03B9, 0x0308,
+	KLongD, 0x0213, KLongD, 0x021C, KLongD, 0x021C, KLongD, 0x0108,
+	0x03B9, 0x0313, KLongD, 0x028B, KLongD, 0x0294, KLongD, 0x015C,
+	0x03B9, 0x0314, KLongD, 0x0246, KLongD, 0x024C, KLongD, 0x0126,
+	0x03B9, 0x0342, 0x03BF, 0x0300, 0x03BF, 0x0301, 0x03BF, 0x0301,
+	0x03BF, 0x0313, KLongD, 0x026D, KLongD, 0x0273, 0x03BF, 0x0314,
+	KLongD, 0x020A, KLongD, 0x020D, 0x03C1, 0x0313, 0x03C1, 0x0314,
+	0x03C5, 0x0300, 0x03C5, 0x0301, 0x03C5, 0x0301, 0x03C5, 0x0304,
+	0x03C5, 0x0306, 0x03C5, 0x0308, KLongD, 0x0135, KLongD, 0x013B,
+	KLongD, 0x013B, KLongD, 0x028E, 0x03C5, 0x0313, KLongD, 0x019E,
+	KLongD, 0x01A4, KLongD, 0x0090, 0x03C5, 0x0314, KLongD, 0x0150,
+	KLongD, 0x0153, KLongD, 0x0198, 0x03C5, 0x0342, 0x03C9, 0x0300,
+	KLongD, 0x0144, 0x03C9, 0x0301, 0x03C9, 0x0301, KLongD, 0x010B,
+	0x03C9, 0x0313, KLongD, 0x000C, KLongD, 0x100C, KLongD, 0x0088,
+	KLongD, 0x1088, KLongD, 0x0040, KLongD, 0x1040, KLongD, 0x0222,
+	0x03C9, 0x0314, KLongD, 0x008C, KLongD, 0x108C, KLongD, 0x0078,
+	KLongD, 0x1078, KLongD, 0x003C, KLongD, 0x103C, KLongD, 0x01CB,
+	0x03C9, 0x0342, KLongD, 0x0252, 0x03C9, 0x0345, 0x03D2, 0x0301,
+	0x03D2, 0x0308, 0x0456, 0x0308, 0x0430, 0x0306, 0x0430, 0x0308,
+	0x0433, 0x0301, 0x0435, 0x0300, 0x0435, 0x0306, 0x0435, 0x0308,
+	0x0436, 0x0306, 0x0436, 0x0308, 0x0437, 0x0308, 0x0438, 0x0300,
+	0x0438, 0x0304, 0x0438, 0x0306, 0x0438, 0x0308, 0x043A, 0x0301,
+	0x043E, 0x0308, 0x0443, 0x0304, 0x0443, 0x0306, 0x0443, 0x0308,
+	0x0443, 0x030B, 0x0447, 0x0308, 0x044B, 0x0308, 0x044D, 0x0308,
+	0x0430, 0x0306, 0x0430, 0x0308, 0x0433, 0x0301, 0x0435, 0x0300,
+	0x0435, 0x0306, 0x0435, 0x0308, 0x0436, 0x0306, 0x0436, 0x0308,
+	0x0437, 0x0308, 0x0438, 0x0300, 0x0438, 0x0304, 0x0438, 0x0306,
+	0x0438, 0x0308, 0x043A, 0x0301, 0x043E, 0x0308, 0x0443, 0x0304,
+	0x0443, 0x0306, 0x0443, 0x0308, 0x0443, 0x030B, 0x0447, 0x0308,
+	0x044B, 0x0308, 0x044D, 0x0308, 0x0456, 0x0308, 0x0475, 0x030F,
+	0x0475, 0x030F, 0x04D9, 0x0308, 0x04D9, 0x0308, 0x04E9, 0x0308,
+	0x04E9, 0x0308, 0x05D9, 0x05B4, 0x0627, 0x0653, 0x0627, 0x0654,
+	0x0627, 0x0655, 0x0648, 0x0654, 0x064A, 0x0654, 0x06C1, 0x0654,
+	0x06D2, 0x0654, 0x06D5, 0x0654, 0x0928, 0x093C, 0x0930, 0x093C,
+	0x0933, 0x093C, 0x09C7, 0x09BE, 0x09C7, 0x09D7, 0x0B47, 0x0B3E,
+	0x0B47, 0x0B56, 0x0B47, 0x0B57, 0x0B92, 0x0BD7, 0x0BC6, 0x0BBE,
+	0x0BC6, 0x0BD7, 0x0BC7, 0x0BBE, 0x0C46, 0x0C56, 0x0CBF, 0x0CD5,
+	0x0CC6, 0x0CC2, KLongD, 0x0180, 0x0CC6, 0x0CD5, 0x0CC6, 0x0CD6,
+	0x0D46, 0x0D3E, 0x0D46, 0x0D57, 0x0D47, 0x0D3E, 0x0DD9, 0x0DCA,
+	0x0DD9, 0x0DCF, KLongD, 0x00C3, 0x0DD9, 0x0DDF, 0x1025, 0x102E,
+	0x1FBF, 0x0300, 0x1FBF, 0x0301, 0x1FBF, 0x0342, 0x1FFE, 0x0300,
+	0x1FFE, 0x0301, 0x1FFE, 0x0342, 0x2190, 0x0338, 0x2192, 0x0338,
+	0x2194, 0x0338, 0x21D0, 0x0338, 0x21D2, 0x0338, 0x21D4, 0x0338,
+	0x2203, 0x0338, 0x2208, 0x0338, 0x220B, 0x0338, 0x2223, 0x0338,
+	0x2225, 0x0338, 0x223C, 0x0338, 0x2243, 0x0338, 0x2245, 0x0338,
+	0x2248, 0x0338, 0x224D, 0x0338, 0x2261, 0x0338, 0x2264, 0x0338,
+	0x2265, 0x0338, 0x2272, 0x0338, 0x2273, 0x0338, 0x2276, 0x0338,
+	0x2277, 0x0338, 0x227A, 0x0338, 0x227B, 0x0338, 0x227C, 0x0338,
+	0x227D, 0x0338, 0x2282, 0x0338, 0x2283, 0x0338, 0x2286, 0x0338,
+	0x2287, 0x0338, 0x2291, 0x0338, 0x2292, 0x0338, 0x22A2, 0x0338,
+	0x22A8, 0x0338, 0x22A9, 0x0338, 0x22AB, 0x0338, 0x22B2, 0x0338,
+	0x22B3, 0x0338, 0x22B4, 0x0338, 0x22B5, 0x0338, 0x3046, 0x3099,
+	0x304B, 0x3099, 0x304D, 0x3099, 0x304F, 0x3099, 0x3051, 0x3099,
+	0x3053, 0x3099, 0x3055, 0x3099, 0x3057, 0x3099, 0x3059, 0x3099,
+	0x305B, 0x3099, 0x305D, 0x3099, 0x305F, 0x3099, 0x3061, 0x3099,
+	0x3064, 0x3099, 0x3066, 0x3099, 0x3068, 0x3099, 0x306F, 0x3099,
+	0x306F, 0x309A, 0x3072, 0x3099, 0x3072, 0x309A, 0x3075, 0x3099,
+	0x3075, 0x309A, 0x3078, 0x3099, 0x3078, 0x309A, 0x307B, 0x3099,
+	0x307B, 0x309A, 0x309D, 0x3099, 0x30A6, 0x3099, 0x30AB, 0x3099,
+	0x30AD, 0x3099, 0x30AF, 0x3099, 0x30B1, 0x3099, 0x30B3, 0x3099,
+	0x30B5, 0x3099, 0x30B7, 0x3099, 0x30B9, 0x3099, 0x30BB, 0x3099,
+	0x30BD, 0x3099, 0x30BF, 0x3099, 0x30C1, 0x3099, 0x30C4, 0x3099,
+	0x30C6, 0x3099, 0x30C8, 0x3099, 0x30CF, 0x3099, 0x30CF, 0x309A,
+	0x30D2, 0x3099, 0x30D2, 0x309A, 0x30D5, 0x3099, 0x30D5, 0x309A,
+	0x30D8, 0x3099, 0x30D8, 0x309A, 0x30DB, 0x3099, 0x30DB, 0x309A,
+	0x30EF, 0x3099, 0x30F0, 0x3099, 0x30F1, 0x3099, 0x30F2, 0x3099,
+	0x30FD, 0x3099, 0x0308, 0x0301, 0x0915, 0x093C, 0x0916, 0x093C,
+	0x0917, 0x093C, 0x091C, 0x093C, 0x0921, 0x093C, 0x0922, 0x093C,
+	0x092B, 0x093C, 0x092F, 0x093C, 0x09A1, 0x09BC, 0x09A2, 0x09BC,
+	0x09AF, 0x09BC, 0x0A32, 0x0A3C, 0x0A38, 0x0A3C, 0x0A16, 0x0A3C,
+	0x0A17, 0x0A3C, 0x0A1C, 0x0A3C, 0x0A2B, 0x0A3C, 0x0B21, 0x0B3C,
+	0x0B22, 0x0B3C, 0x0F42, 0x0FB7, 0x0F4C, 0x0FB7, 0x0F51, 0x0FB7,
+	0x0F56, 0x0FB7, 0x0F5B, 0x0FB7, 0x0F40, 0x0FB5, 0x0F71, 0x0F72,
+	0x0F71, 0x0F74, 0x0FB2, 0x0F80, 0x0FB3, 0x0F80, 0x0F71, 0x0F80,
+	0x0F92, 0x0FB7, 0x0F9C, 0x0FB7, 0x0FA1, 0x0FB7, 0x0FA6, 0x0FB7,
+	0x0FAB, 0x0FB7, 0x0F90, 0x0FB5, 0x05F2, 0x05B7, 0x05E9, 0x05C1,
+	0x05E9, 0x05C2, KLongD, 0x00E4, KLongD, 0x00EA, 0x05D0, 0x05B7,
+	0x05D0, 0x05B8, 0x05D0, 0x05BC, 0x05D1, 0x05BC, 0x05D2, 0x05BC,
+	0x05D3, 0x05BC, 0x05D4, 0x05BC, 0x05D5, 0x05BC, 0x05D6, 0x05BC,
+	0x05D8, 0x05BC, 0x05D9, 0x05BC, 0x05DA, 0x05BC, 0x05DB, 0x05BC,
+	0x05DC, 0x05BC, 0x05DE, 0x05BC, 0x05E0, 0x05BC, 0x05E1, 0x05BC,
+	0x05E3, 0x05BC, 0x05E4, 0x05BC, 0x05E6, 0x05BC, 0x05E7, 0x05BC,
+	0x05E8, 0x05BC, 0x05E9, 0x05BC, 0x05EA, 0x05BC, 0x05D5, 0x05B9,
+	0x05D1, 0x05BF, 0x05DB, 0x05BF, 0x05E4, 0x05BF
+	};
+
+// Table of singleton decompositions and characters with singleton folds
+const unsigned short KSingletonDecompositions[] =
+	{
+	0x0300, 0x0301, 0x0313, 0x02B9, 0x003B, 0x00B7, 0x03B9, 0x0060,
+	0x2002, 0x2003, 0x03A9, 0x004B, 0x3008, 0x3009, 0x8C48, 0x66F4,
+	0x8ECA, 0x8CC8, 0x6ED1, 0x4E32, 0x53E5, 0x9F9C, 0x9F9C, 0x5951,
+	0x91D1, 0x5587, 0x5948, 0x61F6, 0x7669, 0x7F85, 0x863F, 0x87BA,
+	0x88F8, 0x908F, 0x6A02, 0x6D1B, 0x70D9, 0x73DE, 0x843D, 0x916A,
+	0x99F1, 0x4E82, 0x5375, 0x6B04, 0x721B, 0x862D, 0x9E1E, 0x5D50,
+	0x6FEB, 0x85CD, 0x8964, 0x62C9, 0x81D8, 0x881F, 0x5ECA, 0x6717,
+	0x6D6A, 0x72FC, 0x90CE, 0x4F86, 0x51B7, 0x52DE, 0x64C4, 0x6AD3,
+	0x7210, 0x76E7, 0x8001, 0x8606, 0x865C, 0x8DEF, 0x9732, 0x9B6F,
+	0x9DFA, 0x788C, 0x797F, 0x7DA0, 0x83C9, 0x9304, 0x9E7F, 0x8AD6,
+	0x58DF, 0x5F04, 0x7C60, 0x807E, 0x7262, 0x78CA, 0x8CC2, 0x96F7,
+	0x58D8, 0x5C62, 0x6A13, 0x6DDA, 0x6F0F, 0x7D2F, 0x7E37, 0x96FB,
+	0x52D2, 0x808B, 0x51DC, 0x51CC, 0x7A1C, 0x7DBE, 0x83F1, 0x9675,
+	0x8B80, 0x62CF, 0x6A02, 0x8AFE, 0x4E39, 0x5BE7, 0x6012, 0x7387,
+	0x7570, 0x5317, 0x78FB, 0x4FBF, 0x5FA9, 0x4E0D, 0x6CCC, 0x6578,
+	0x7D22, 0x53C3, 0x585E, 0x7701, 0x8449, 0x8AAA, 0x6BBA, 0x8FB0,
+	0x6C88, 0x62FE, 0x82E5, 0x63A0, 0x7565, 0x4EAE, 0x5169, 0x51C9,
+	0x6881, 0x7CE7, 0x826F, 0x8AD2, 0x91CF, 0x52F5, 0x5442, 0x5973,
+	0x5EEC, 0x65C5, 0x6FFE, 0x792A, 0x95AD, 0x9A6A, 0x9E97, 0x9ECE,
+	0x529B, 0x66C6, 0x6B77, 0x8F62, 0x5E74, 0x6190, 0x6200, 0x649A,
+	0x6F23, 0x7149, 0x7489, 0x79CA, 0x7DF4, 0x806F, 0x8F26, 0x84EE,
+	0x9023, 0x934A, 0x5217, 0x52A3, 0x54BD, 0x70C8, 0x88C2, 0x8AAA,
+	0x5EC9, 0x5FF5, 0x637B, 0x6BAE, 0x7C3E, 0x7375, 0x4EE4, 0x56F9,
+	0x5BE7, 0x5DBA, 0x601C, 0x73B2, 0x7469, 0x7F9A, 0x8046, 0x9234,
+	0x96F6, 0x9748, 0x9818, 0x4F8B, 0x79AE, 0x91B4, 0x96B8, 0x60E1,
+	0x4E86, 0x50DA, 0x5BEE, 0x5C3F, 0x6599, 0x6A02, 0x71CE, 0x7642,
+	0x84FC, 0x907C, 0x9F8D, 0x6688, 0x962E, 0x5289, 0x677B, 0x67F3,
+	0x6D41, 0x6E9C, 0x7409, 0x7559, 0x786B, 0x7D10, 0x985E, 0x516D,
+	0x622E, 0x9678, 0x502B, 0x5D19, 0x6DEA, 0x8F2A, 0x5F8B, 0x6144,
+	0x6817, 0x7387, 0x9686, 0x5229, 0x540F, 0x5C65, 0x6613, 0x674E,
+	0x68A8, 0x6CE5, 0x7406, 0x75E2, 0x7F79, 0x88CF, 0x88E1, 0x91CC,
+	0x96E2, 0x533F, 0x6EBA, 0x541D, 0x71D0, 0x7498, 0x85FA, 0x96A3,
+	0x9C57, 0x9E9F, 0x6797, 0x6DCB, 0x81E8, 0x7ACB, 0x7B20, 0x7C92,
+	0x72C0, 0x7099, 0x8B58, 0x4EC0, 0x8336, 0x523A, 0x5207, 0x5EA6,
+	0x62D3, 0x7CD6, 0x5B85, 0x6D1E, 0x66B4, 0x8F3B, 0x884C, 0x964D,
+	0x898B, 0x5ED3, 0x5140, 0x55C0, 0x585A, 0x6674, 0x51DE, 0x732A,
+	0x76CA, 0x793C, 0x795E, 0x7965, 0x798F, 0x9756, 0x7CBE, 0x7FBD,
+	0x8612, 0x8AF8, 0x9038, 0x90FD, 0x98EF, 0x98FC, 0x9928, 0x9DB4
+	};
+
+// Table of singleton folds
+const unsigned short KSingletonFolds[] =
+	{
+	0x0300, 0x0301, 0x0313, 0x02B9, 0x003B, 0x00B7, 0x03B9, 0x0060,
+	0x2002, 0x2003, 0x03C9, 0x006B, 0x3008, 0x3009, 0x8C48, 0x66F4,
+	0x8ECA, 0x8CC8, 0x6ED1, 0x4E32, 0x53E5, 0x9F9C, 0x9F9C, 0x5951,
+	0x91D1, 0x5587, 0x5948, 0x61F6, 0x7669, 0x7F85, 0x863F, 0x87BA,
+	0x88F8, 0x908F, 0x6A02, 0x6D1B, 0x70D9, 0x73DE, 0x843D, 0x916A,
+	0x99F1, 0x4E82, 0x5375, 0x6B04, 0x721B, 0x862D, 0x9E1E, 0x5D50,
+	0x6FEB, 0x85CD, 0x8964, 0x62C9, 0x81D8, 0x881F, 0x5ECA, 0x6717,
+	0x6D6A, 0x72FC, 0x90CE, 0x4F86, 0x51B7, 0x52DE, 0x64C4, 0x6AD3,
+	0x7210, 0x76E7, 0x8001, 0x8606, 0x865C, 0x8DEF, 0x9732, 0x9B6F,
+	0x9DFA, 0x788C, 0x797F, 0x7DA0, 0x83C9, 0x9304, 0x9E7F, 0x8AD6,
+	0x58DF, 0x5F04, 0x7C60, 0x807E, 0x7262, 0x78CA, 0x8CC2, 0x96F7,
+	0x58D8, 0x5C62, 0x6A13, 0x6DDA, 0x6F0F, 0x7D2F, 0x7E37, 0x96FB,
+	0x52D2, 0x808B, 0x51DC, 0x51CC, 0x7A1C, 0x7DBE, 0x83F1, 0x9675,
+	0x8B80, 0x62CF, 0x6A02, 0x8AFE, 0x4E39, 0x5BE7, 0x6012, 0x7387,
+	0x7570, 0x5317, 0x78FB, 0x4FBF, 0x5FA9, 0x4E0D, 0x6CCC, 0x6578,
+	0x7D22, 0x53C3, 0x585E, 0x7701, 0x8449, 0x8AAA, 0x6BBA, 0x8FB0,
+	0x6C88, 0x62FE, 0x82E5, 0x63A0, 0x7565, 0x4EAE, 0x5169, 0x51C9,
+	0x6881, 0x7CE7, 0x826F, 0x8AD2, 0x91CF, 0x52F5, 0x5442, 0x5973,
+	0x5EEC, 0x65C5, 0x6FFE, 0x792A, 0x95AD, 0x9A6A, 0x9E97, 0x9ECE,
+	0x529B, 0x66C6, 0x6B77, 0x8F62, 0x5E74, 0x6190, 0x6200, 0x649A,
+	0x6F23, 0x7149, 0x7489, 0x79CA, 0x7DF4, 0x806F, 0x8F26, 0x84EE,
+	0x9023, 0x934A, 0x5217, 0x52A3, 0x54BD, 0x70C8, 0x88C2, 0x8AAA,
+	0x5EC9, 0x5FF5, 0x637B, 0x6BAE, 0x7C3E, 0x7375, 0x4EE4, 0x56F9,
+	0x5BE7, 0x5DBA, 0x601C, 0x73B2, 0x7469, 0x7F9A, 0x8046, 0x9234,
+	0x96F6, 0x9748, 0x9818, 0x4F8B, 0x79AE, 0x91B4, 0x96B8, 0x60E1,
+	0x4E86, 0x50DA, 0x5BEE, 0x5C3F, 0x6599, 0x6A02, 0x71CE, 0x7642,
+	0x84FC, 0x907C, 0x9F8D, 0x6688, 0x962E, 0x5289, 0x677B, 0x67F3,
+	0x6D41, 0x6E9C, 0x7409, 0x7559, 0x786B, 0x7D10, 0x985E, 0x516D,
+	0x622E, 0x9678, 0x502B, 0x5D19, 0x6DEA, 0x8F2A, 0x5F8B, 0x6144,
+	0x6817, 0x7387, 0x9686, 0x5229, 0x540F, 0x5C65, 0x6613, 0x674E,
+	0x68A8, 0x6CE5, 0x7406, 0x75E2, 0x7F79, 0x88CF, 0x88E1, 0x91CC,
+	0x96E2, 0x533F, 0x6EBA, 0x541D, 0x71D0, 0x7498, 0x85FA, 0x96A3,
+	0x9C57, 0x9E9F, 0x6797, 0x6DCB, 0x81E8, 0x7ACB, 0x7B20, 0x7C92,
+	0x72C0, 0x7099, 0x8B58, 0x4EC0, 0x8336, 0x523A, 0x5207, 0x5EA6,
+	0x62D3, 0x7CD6, 0x5B85, 0x6D1E, 0x66B4, 0x8F3B, 0x884C, 0x964D,
+	0x898B, 0x5ED3, 0x5140, 0x55C0, 0x585A, 0x6674, 0x51DE, 0x732A,
+	0x76CA, 0x793C, 0x795E, 0x7965, 0x798F, 0x9756, 0x7CBE, 0x7FBD,
+	0x8612, 0x8AF8, 0x9038, 0x90FD, 0x98EF, 0x98FC, 0x9928, 0x9DB4,
+	0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068,
+	0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F, 0x0070,
+	0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078,
+	0x0079, 0x007A, 0x03BC, 0x00E6, 0x00F0, 0x00F8, 0x00FE, 0x0111,
+	0x0127, 0x0069, 0x0133, 0x0140, 0x0142, 0x014B, 0x0153, 0x0167,
+	0x0073, 0x0253, 0x0183, 0x0185, 0x0254, 0x0188, 0x0256, 0x0257,
+	0x018C, 0x01DD, 0x0259, 0x025B, 0x0192, 0x0260, 0x0263, 0x0269,
+	0x0268, 0x0199, 0x026F, 0x0272, 0x0275, 0x01A3, 0x01A5, 0x0280,
+	0x01A8, 0x0283, 0x01AD, 0x0288, 0x028A, 0x028B, 0x01B4, 0x01B6,
+	0x0292, 0x01B9, 0x01BD, 0x01C6, 0x01C6, 0x01C9, 0x01C9, 0x01CC,
+	0x01CC, 0x01E5, 0x01F3, 0x01F3, 0x0195, 0x01BF, 0x021D, 0x0223,
+	0x0225, 0x03B9, 0x03B1, 0x03B2, 0x03B3, 0x03B4, 0x03B5, 0x03B6,
+	0x03B7, 0x03B8, 0x03B9, 0x03BA, 0x03BB, 0x03BC, 0x03BD, 0x03BE,
+	0x03BF, 0x03C0, 0x03C1, 0x03C3, 0x03C4, 0x03C5, 0x03C6, 0x03C7,
+	0x03C8, 0x03C9, 0x03C3, 0x03B2, 0x03B8, 0x03C6, 0x03C0, 0x03DB,
+	0x03DD, 0x03DF, 0x03E1, 0x03E3, 0x03E5, 0x03E7, 0x03E9, 0x03EB,
+	0x03ED, 0x03EF, 0x03BA, 0x03C1, 0x03C3, 0x0452, 0x0454, 0x0455,
+	0x0456, 0x0458, 0x0459, 0x045A, 0x045B, 0x045F, 0x0430, 0x0431,
+	0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, 0x0438, 0x043A,
+	0x043B, 0x043C, 0x043D, 0x043E, 0x043F, 0x0440, 0x0441, 0x0442,
+	0x0443, 0x0444, 0x0445, 0x0446, 0x0447, 0x0448, 0x0449, 0x044A,
+	0x044B, 0x044C, 0x044D, 0x044E, 0x044F, 0x0461, 0x0463, 0x0465,
+	0x0467, 0x0469, 0x046B, 0x046D, 0x046F, 0x0471, 0x0473, 0x0475,
+	0x0479, 0x047B, 0x047D, 0x047F, 0x0481, 0x048D, 0x048F, 0x0491,
+	0x0493, 0x0495, 0x0497, 0x0499, 0x049B, 0x049D, 0x049F, 0x04A1,
+	0x04A3, 0x04A5, 0x04A7, 0x04A9, 0x04AB, 0x04AD, 0x04AF, 0x04B1,
+	0x04B3, 0x04B5, 0x04B7, 0x04B9, 0x04BB, 0x04BD, 0x04BF, 0x04C4,
+	0x04C8, 0x04CC, 0x04D5, 0x04D9, 0x04E1, 0x04E9, 0x0561, 0x0562,
+	0x0563, 0x0564, 0x0565, 0x0566, 0x0567, 0x0568, 0x0569, 0x056A,
+	0x056B, 0x056C, 0x056D, 0x056E, 0x056F, 0x0570, 0x0571, 0x0572,
+	0x0573, 0x0574, 0x0575, 0x0576, 0x0577, 0x0578, 0x0579, 0x057A,
+	0x057B, 0x057C, 0x057D, 0x057E, 0x057F, 0x0580, 0x0581, 0x0582,
+	0x0583, 0x0584, 0x0585, 0x0586, 0x2170, 0x2171, 0x2172, 0x2173,
+	0x2174, 0x2175, 0x2176, 0x2177, 0x2178, 0x2179, 0x217A, 0x217B,
+	0x217C, 0x217D, 0x217E, 0x217F, 0x24D0, 0x24D1, 0x24D2, 0x24D3,
+	0x24D4, 0x24D5, 0x24D6, 0x24D7, 0x24D8, 0x24D9, 0x24DA, 0x24DB,
+	0x24DC, 0x24DD, 0x24DE, 0x24DF, 0x24E0, 0x24E1, 0x24E2, 0x24E3,
+	0x24E4, 0x24E5, 0x24E6, 0x24E7, 0x24E8, 0x24E9, 0xFF41, 0xFF42,
+	0xFF43, 0xFF44, 0xFF45, 0xFF46, 0xFF47, 0xFF48, 0xFF49, 0xFF4A,
+	0xFF4B, 0xFF4C, 0xFF4D, 0xFF4E, 0xFF4F, 0xFF50, 0xFF51, 0xFF52,
+	0xFF53, 0xFF54, 0xFF55, 0xFF56, 0xFF57, 0xFF58, 0xFF59, 0xFF5A
+	};
+
+// Total size: 31438 bytes
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32/euser/unicode/foldtable.inl	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,127 @@
+// Copyright (c) 1998-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32\euser\unicode\foldtable.inl
+// Use the bits from 12 up from your character to index CaseFoldTable0.
+// Use the result of this plus bits 8-11 to index CaseFoldTable1.
+// Use the result of this plus bits 4-7 to index CaseFoldTable2.
+// Use the result of this plus bits 0-3 to index CaseFoldTable3.
+// Add the result of this to your character to fold it.
+// 
+//
+
+static const short CaseFoldTable3[] =
+	{
+	0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0,
+	32, 32, 32, 32, 32, 32, 32, 32,
+	32, 32, 32, 32, 32, 32, 32, 0,
+	0, 0, 0, 0, -128, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 775, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 32,
+	0, 0, 0, 0, 0, 0, 0, 0,
+	0, 32, 0, 0, 0, 0, 0, 0,
+	0, 32, 0, 0, 0, 0, 0, 32,
+	0, 1, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0,
+	0, 1, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, -200, 1, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0,
+	0, 1, 0, 0, 0, 0, 0, 0,
+	0, 0, 1, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, -268, 0, 210, 1, 0, 1,
+	0, 206, 1, 0, 205, 205, 1, 0,
+	0, 79, 202, 203, 1, 0, 205, 207,
+	0, 211, 209, 1, 0, 0, 0, 211,
+	213, 0, 214, 0, 0, 1, 0, 1,
+	0, 218, 1, 0, 218, 0, 0, 1,
+	0, 218, 0, 217, 217, 1, 0, 1,
+	0, 219, 1, 0, 0, 0, 1, 0,
+	0, 0, 0, 2, 1, 0, 2, 1,
+	0, 2, 1, 0, 0, 0, 0, 2,
+	1, 0, 0, 0, -97, -56, 0, 0,
+	0, 0, 0, 0, 0, 0, 1, 0,
+	1, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 116, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 32,
+	32, 0, 32, 32, 32, 32, 32, 32,
+	32, 0, 0, 0, 0, 0, 0, -30,
+	-25, 0, 0, 0, -15, -22, 0, 0,
+	0, 1, 0, 1, 0, 1, 0, 1,
+	0, 1, 0, 1, 0, 1, 0, 1,
+	0, -54, -48, -47, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0,
+	0, 80, 0, 80, 80, 80, 0, 80,
+	80, 80, 80, 0, 0, 0, 80, 32,
+	32, 32, 32, 32, 32, 32, 32, 32,
+	0, 32, 32, 32, 32, 32, 32, 32,
+	32, 32, 32, 32, 32, 32, 32, 32,
+	32, 1, 0, 1, 0, 1, 0, 0,
+	0, 1, 0, 1, 0, 1, 0, 1,
+	0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 1, 0, 1, 0, 0,
+	0, 1, 0, 0, 0, 1, 0, 0,
+	0, 1, 0, 0, 0, 0, 1, 0,
+	0, 0, 1, 0, 0, 0, 0, 0,
+	0, 0, 1, 0, 0, 0, 0, 0,
+	0, 0, 48, 48, 48, 48, 48, 48,
+	48, 48, 48, 48, 48, 48, 48, 48,
+	48, 48, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0,
+	-7173, 0, 0, 0, 0, 0, 0, -7517,
+	0, 0, 0, -8383, 0, 0, 0, 0,
+	0, 16, 16, 16, 16, 16, 16, 16,
+	16, 16, 16, 16, 16, 16, 16, 16,
+	16, 0, 0, 0, 0, 0, 0, 26,
+	26, 26, 26, 26, 26, 26, 26, 26,
+	26, 26, 26, 26, 26, 26, 26
+	};
+
+static const unsigned short CaseFoldTable2[] =
+	{
+	0, 0, 0, 0, 15, 20, 0, 0,
+	0, 0, 36, 47, 57, 73, 0, 0,
+	89, 99, 114, 128, 136, 99, 139, 155,
+	171, 187, 202, 215, 0, 134, 230, 0,
+	93, 244, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 255,
+	0, 0, 0, 0, 15, 271, 0, 136,
+	287, 297, 313, 327, 343, 353, 0, 0,
+	0, 297, 369, 383, 297, 297, 297, 398,
+	410, 418, 0, 0, 0, 433, 434, 443,
+	0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0,
+	450, 0, 0, 0, 0, 465, 0, 0,
+	0, 481, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 497, 503, 0,
+	0, 0, 15, 20, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0
+	};
+
+static const unsigned char CaseFoldTable1[] =
+	{
+	0, 15, 31, 43, 59, 74, 80, 80,
+	80, 80, 80, 80, 80, 80, 80, 80,
+	80, 80, 80, 80, 80, 85, 80, 99,
+	80, 80, 106, 80, 80, 80, 80, 80,
+	80, 80, 80, 80, 80, 80, 80, 80,
+	80, 80, 80, 120
+	};
+
+static const unsigned char CaseFoldTable0[] =
+	{
+	0, 6, 22, 27, 27, 27, 27, 27,
+	27, 27, 27, 27, 27, 27, 27, 28
+	};
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32/euser/unicode/unicode.cpp	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,369 @@
+// Copyright (c) 1997-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32\euser\unicode\unicode.cpp
+// The implementation of the base-level Unicode character classification functions. These are members of
+// a class called TUnicode that contains a Unicode value.
+// 
+//
+
+#include <unicode.h>
+#include "compareimp.h"
+
+static const TUnicodeData TheDefaultUnicodeData =
+	{ TChar::ECnCategory, TChar::EOtherNeutral, 0, 0, 0, TUnicodeData::ENonNumeric };
+
+// Fill in a TChar::TCharInfo structure with category information about the character.
+void TUnicode::GetInfo(TChar::TCharInfo& aInfo,const TUnicodeDataSet *aOverridingDataSet) const
+	{
+	const TUnicodeData& data = GetData(aOverridingDataSet);
+	aInfo.iCategory = (TChar::TCategory)data.iCategory;
+	aInfo.iBdCategory = (TChar::TBdCategory)data.iBdCategory;
+	aInfo.iCombiningClass = data.iCombiningClass;
+	aInfo.iLowerCase = iCode;
+	aInfo.iUpperCase = iCode;
+	aInfo.iTitleCase = iCode;
+	if (data.iFlags & TUnicodeData::EHasLowerCase)
+		aInfo.iLowerCase = GetLowerCase(data);
+	if (data.iFlags & TUnicodeData::EHasUpperCase)
+		aInfo.iUpperCase = GetUpperCase(data);
+	if (data.iFlags & TUnicodeData::EHasTitleCase)
+		aInfo.iTitleCase = GetTitleCase(data);
+	aInfo.iMirrored = data.iFlags & TUnicodeData::EMirrored;
+	if (data.iFlags & TUnicodeData::ENumericFlags)
+		aInfo.iNumericValue = GetNumericValue(data);
+	else
+		aInfo.iNumericValue = -1;
+	}
+
+/*
+Get the data describing a character. If "aOverridingDataSet" is non-null, look in that
+data set before searching the standard data set.
+*/
+const TUnicodeData& TUnicode::GetData(const TUnicodeDataSet *aOverridingDataSet) const
+	{
+	const TUnicodeData *result = NULL;
+	if (aOverridingDataSet)
+		result = GetDataFromDataSet(*aOverridingDataSet);
+	if (result == NULL)
+		{
+		if (0xFFFF < iCode)
+			// for now we have no data for values above U+FFFF
+			return TheDefaultUnicodeData;
+		int index = TheStandardUnicodeDataSet.iIndex1[iCode >> 4];
+		if (index & 0x8000) // high bit set means all values in block have the same value, and it's in the index
+			index &= ~0x8000;
+		else
+			index = TheStandardUnicodeDataSet.iIndex2[index + (iCode & 0x000F)];
+		return TheStandardUnicodeDataSet.iData[index];
+		}
+
+	return *result;
+	}
+
+/*
+Given a character data set, get the data referring to this character.
+Return NULL if no data is available in this data set.
+*/
+const TUnicodeData *TUnicode::GetDataFromDataSet(const TUnicodeDataSet& aDataSet) const
+	{
+	// Perform a binary chop to find the range containing this character.
+	TInt n = aDataSet.iRanges;
+	const TUnicodeDataRange *base = aDataSet.iRange;
+	const TUnicodeDataRange *last = base + n - 1;
+	const TUnicodeDataRange *r = base;
+
+	while (n > 1)
+		{
+		TInt pivot = n / 2;
+		r += pivot;
+		if (iCode < r->iRangeStart)									// it's before this range
+			n = pivot;
+		else if (r < last && iCode >= r[1].iRangeStart)				// it's after this range
+			{
+			base = r + 1;
+			n -= pivot + 1;
+			}
+		else														// it's in this range
+			break;
+		r = base;
+		}
+
+	if (r->iIndex >= 0)
+		return &aDataSet.iData[r->iIndex];		// index >= 0: data available
+	else
+		return NULL;							// index < 0: no data available
+	}
+
+EXPORT_C TChar::TCategory TUnicode::GetCategory(const TUnicodeDataSet *aOverridingDataSet) const
+	{
+	return (TChar::TCategory)GetData(aOverridingDataSet).iCategory;
+	}
+
+TChar::TBdCategory TUnicode::GetBdCategory(const TUnicodeDataSet *aOverridingDataSet) const
+	{
+	return (TChar::TBdCategory)GetData(aOverridingDataSet).iBdCategory;
+	}
+
+TInt TUnicode::GetCombiningClass(const TUnicodeDataSet *aOverridingDataSet) const
+	{
+	return GetData(aOverridingDataSet).iCombiningClass;
+	}
+
+EXPORT_C TUint TUnicode::GetLowerCase(const TUnicodeDataSet *aOverridingDataSet) const
+	{
+	return GetLowerCase(GetData(aOverridingDataSet));
+	}
+
+EXPORT_C TUint TUnicode::GetUpperCase(const TUnicodeDataSet *aOverridingDataSet) const
+	{
+	return GetUpperCase(GetData(aOverridingDataSet));
+	}
+
+TUint TUnicode::GetLowerCase(const TUnicodeData& aData) const
+	{
+	if (aData.iFlags & TUnicodeData::EHasLowerCase)
+		return iCode + aData.iCaseOffset;
+	else
+		return iCode;
+	}
+
+TUint TUnicode::GetUpperCase(const TUnicodeData& aData) const
+	{
+	if (aData.iFlags & TUnicodeData::EHasUpperCase)
+		return iCode - aData.iCaseOffset;
+	else
+		return iCode;
+	}
+
+TUint TUnicode::GetTitleCase(const TUnicodeDataSet *aOverridingDataSet) const
+	{
+	return GetTitleCase(GetData(aOverridingDataSet));
+	}
+
+TUint TUnicode::GetTitleCase(const TUnicodeData& aData) const
+	{
+	// Handle the very few characters with distinct title case variants.
+	if (aData.iFlags & TUnicodeData::EHasTitleCase)
+		{
+		// If the character has no upper case variant add one to get the title case form.
+		if (!(aData.iFlags & TUnicodeData::EHasUpperCase))
+			return iCode + 1;
+		// If the character has no lower case variant subtract one to get the title case form.
+		if (!(aData.iFlags & TUnicodeData::EHasLowerCase))
+			return iCode - 1;
+		// Both upper and lower case forms exist so the character itself must be title case.
+		return iCode;
+		}
+
+	// All other characters have title case forms that are the same as their upper case forms.
+	return GetUpperCase(aData);
+	}
+
+TBool TUnicode::IsMirrored(const TUnicodeDataSet *aOverridingDataSet) const
+	{
+	return GetData(aOverridingDataSet).iFlags & TUnicodeData::EMirrored;
+	}
+
+TInt TUnicode::GetNumericValue(const TUnicodeDataSet *aOverridingDataSet) const
+	{
+	return GetNumericValue(GetData(aOverridingDataSet));
+	}
+
+/*
+Return the integer numeric value of this character.
+Return -1 if the character is not numeric, or -2 if it has a fractional value.
+*/
+TInt TUnicode::GetNumericValue(const TUnicodeData& aData) const
+	{
+	switch (aData.iFlags & TUnicodeData::ENumericFlags)
+		{
+		case TUnicodeData::ENonNumeric: return -1;
+		case TUnicodeData::ESmallNumeric: return (iCode + aData.iDigitOffset) & 0xFF;
+		case TUnicodeData::EFiveHundred: return 500;
+		case TUnicodeData::EOneThousand: return 1000;
+		case TUnicodeData::EFiveThousand: return 5000;
+		case TUnicodeData::ETenThousand: return 10000;
+		case TUnicodeData::EHundredThousand: return 100000;
+		case TUnicodeData::EFraction: return -2;
+		default: return -1; // we should never come here
+		}
+	}
+
+struct TWidthInfo
+	{
+	TUint iStart;
+	TUint iEnd;
+	TChar::TCjkWidth iWidth;
+	};
+
+static const TWidthInfo TheWidthInfoTable[] =
+	{
+	{ 0x0020, 0x007F, TChar::ENarrow },
+	{ 0x00A2, 0x00A4, TChar::ENarrow },
+	{ 0x00A5, 0x00A7, TChar::ENarrow },
+	{ 0x00AF, 0x00B0, TChar::ENarrow },
+	{ 0x00B1, 0x1100, TChar::ENeutralWidth },
+	{ 0x1100, 0x1160, TChar::EWide },
+	{ 0x1160, 0x2E80, TChar::ENeutralWidth },
+	{ 0x2E80, 0xD7A4, TChar::EWide },
+	{ 0xF900, 0xFA2E, TChar::EWide },
+	{ 0xFE30, 0xFE6C, TChar::EWide },
+	{ 0xFF01, 0xFF5F, TChar::EFullWidth },
+	{ 0xFF61, 0xFFDD, TChar::EHalfWidth },
+	{ 0xFFE0, 0xFFE7, TChar::EFullWidth },
+	{ 0xFFE8, 0xFFEF, TChar::EHalfWidth }
+	};
+
+const TInt TheWidthInfos = sizeof(TheWidthInfoTable) / sizeof(TheWidthInfoTable[0]);
+
+/*
+Get the notional width used by East Asian encoding systems. No check is made that the character is assigned.
+No separate 'ambiguous width' is returned; ambiguous characters are treated as neutral except for those
+in the CJK range, which are treated as wide. This is a big simplification, but the cost of an exhaustive table
+is too great to justify at the moment.
+*/
+TChar::TCjkWidth TUnicode::GetCjkWidth() const
+	{
+	const TWidthInfo* w = TheWidthInfoTable;
+	for (int i = 0; i < TheWidthInfos; i++, w++)
+		if (iCode >= w->iStart && iCode < w->iEnd)
+			return w->iWidth;
+	return TChar::ENeutralWidth;
+	}
+
+/*
+Convert a Unicode character into a form most likely to be equal to another character, while
+still preserving the essential meaning of the character. Possible folding operations include
+converting to lower case (TChar::EFoldCase), stripping accents (TChar::EFoldAccents) and others.
+The flag value has a default, TChar::EFoldStandard, which performs the folding operations done
+by calling Fold functions with no flags argument, and there is also TChar::EFoldAll,
+which performs all possible folding operations.
+
+Note that the difference between folding and collation is that folding is
+	*	character-based
+	*	biased towards yielding equality where possible
+while collation is
+	*	string-based
+	*	designed to yield a non-equal ordering
+
+Typically, folding will be used when searching for a match, while collation will be used when
+sorting a list.
+*/
+EXPORT_C TUint TUnicode::Fold(TInt aFlags,const TUnicodeDataSet *aOverridingDataSet) const
+	{
+	TUint result = iCode;
+
+	/*
+	Fold CJK width variants. This only applies to characters 0xFF00 and above so we can use
+	a built-in table.
+	*/
+	if (result >= 0xFF00 && (aFlags & TChar::EFoldWidth))
+		result = CjkWidthFoldTable[result & 0xFF];
+
+	/*
+	If the character is <= 0x00FF and the flags include folding case and stripping accents,
+	and there is no overriding character data, we can use the built-in fold table.
+	*/
+	const TUnicodeData* data = NULL;
+	if (aOverridingDataSet)
+		data = GetDataFromDataSet(*aOverridingDataSet);
+	if (data == NULL && result < 256 &&
+		(aFlags & (TChar::EFoldCase | TChar::EFoldAccents)) == (TChar::EFoldCase | TChar::EFoldAccents))
+		return FoldTable[result];
+
+	/*
+	Other characters have to be dealt with laboriously.
+	The first operations are those that, if successful, tell us that nothing more
+	need be done. If a value is folded to a space or a digit or converted to Katakana
+	it cannot have anything else done to it.
+	*/
+	if (aFlags & TChar::EFoldKana)
+		{
+		if ((result >= 0x3041 && result <= 0x3094) || result == 0x309D || result == 0x309E)
+			return result += 0x0060;
+		}
+	if (data == NULL)
+		data = &GetData(NULL);
+	if (aFlags & TChar::EFoldSpaces)
+		{
+		if (data->iCategory == TChar::EZsCategory)
+			return 0x0020;
+		}
+	if (aFlags & TChar::EFoldDigits)
+		{
+		TInt n = GetNumericValue(*data);
+		if (n >= 0 && n <= 9)
+			return 0x0030 + n;
+		}
+
+	/*
+	The final operations are the relatively rare and expensive ones (after the special
+	case dealt with above) of accent removal and case conversion.
+	*/
+	if ((aFlags & TChar::EFoldAccents) && (result < 0x2000))
+		{
+		/*
+		Throw away characters other than the first if all are accents. For the moment these
+		are defined as characters in the range 0x0300..0x0361. This definition may need
+		to be modified; or I may decide to store a flag in the decomposition table indicating
+		whether or not the decomposition consists of base + accent(s).
+		*/
+		TPtrC16 decomposition;
+		if (::DecomposeChar(iCode, decomposition))
+			{
+			TBool all_accents = TRUE;			
+			for (TInt i = 1; all_accents && i < decomposition.Length(); ++i)
+				{
+				if (decomposition[i] < 0x0300 || decomposition[i] > 0x0361)
+					all_accents = FALSE;
+				}
+			if (all_accents)
+				result = decomposition[0];
+			}
+		}
+
+	if (aFlags & TChar::EFoldCase)
+		{
+		if (aOverridingDataSet == NULL && result < 256)
+			result = FoldTable[result];
+		else
+			result = TUnicode(result).GetLowerCase(aOverridingDataSet);
+		}
+	
+	return result;
+	}
+
+/*
+Compare two Unicode strings naively by Unicode value. This is NOT the same as a comparison
+of null-terminated strings; the strings can contain null characters (Unicode 0x0000) and they
+compare greater than no character. This means that the string { 0x0001 0x0000 } always comes
+after the string { 0x0001 }.
+
+This function exists to make it easier to search tables of Unicode strings (like the composition
+buffer) using the binary chop method. It is also used by READTYPE when sorting the compose table.
+
+The return values are: 0 for equality, < 0 if aString1 < aString2, > 0 if aString1 > aString2.
+*/
+TInt TUnicode::Compare(const TUint16 *aString1,TInt aLength1,const TUint16 *aString2,TInt aLength2)
+	{
+	for (TInt i = 0; i < aLength1 || i < aLength2; i++, aString1++, aString2++)
+		{
+		TInt x = i < aLength1 ? *aString1 : -1;
+		TInt y = i < aLength2 ? *aString2 : -1;
+		if (x != y)
+			return x - y;
+		}
+	return 0;
+	}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32/euser/unicode/unitable.cpp	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,1357 @@
+// Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// Unicode character information tables.
+// Written by the READTYPE program.
+// Please read the 'Unicode Character Data and Line Break data Update History.doc' file for detailed history of updates to this file.
+// This file was generated by the READTYPE tool using unicodedata-3.0.0_IndicCharsFrom_5.0.txt on 09/04/2007
+// The contents of this file were generated automatically. Please do not edit this manually.
+// This description has been added/edited manually.
+// 
+//
+
+#include <unicode.h>
+
+const TUint16 TheTrieIndex1[4096] = 
+	{
+	0x0000,0x000e,0x001e,0x002e,0x003d,0x0042,0x0052,0x0057,0x0066,0x8000,0x0076,0x0086,0x8011,0x0096,0x8014,0x00a6,
+	0x00b6,0x00b6,0x00b6,0x00c6,0x00d0,0x00b6,0x00b6,0x00da,0x00ea,0x00fa,0x010a,0x011a,0x012a,0x0138,0x00b6,0x0148,
+	0x00b6,0x00b6,0x0158,0x0164,0x803e,0x0174,0x0184,0x0194,0x01a4,0x01b2,0x01b5,0x01c5,0x01d3,0x01d3,0x01e3,0x803e,
+	0x804d,0x01f3,0x0202,0x020e,0x021b,0x803e,0x022b,0x0237,0x0246,0x0256,0x0264,0x0274,0x0282,0x0292,0x00b6,0x02a2,
+	0x8066,0x8011,0x8011,0x8014,0x8014,0x8065,0x00b6,0x00b6,0x02b2,0x00b6,0x00b6,0x00b6,0x02c2,0x00b6,0x00b6,0x02d2,
+	0x803e,0x803e,0x803e,0x02e1,0x8069,0x02ea,0x02fa,0x806b,0x0303,0x0312,0x0320,0x0330,0x0340,0x807f,0x0350,0x0360,
+	0x0365,0x0372,0x0382,0x0387,0x0397,0x03a7,0x03b7,0x03c7,0x8081,0x8081,0x8081,0x8081,0x8081,0x03d3,0x03e2,0x03f2,
+	0x0402,0x0412,0x0385,0x0422,0x0431,0x803e,0x803e,0x803e,0x8081,0x8081,0x0441,0x0450,0x803e,0x803e,0x803e,0x803e,
+	0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,
+	0x045f,0x8036,0x8036,0x0465,0x0474,0x0484,0x0492,0x04a2,0x04b2,0x04be,0x04c5,0x04d4,0x04e3,0x04f2,0x0501,0x0511,
+	0x0520,0x04be,0x04c5,0x052f,0x053e,0x054c,0x055b,0x056b,0x057a,0x0586,0x04c5,0x0595,0x05a4,0x05b4,0x0501,0x05c3,
+	0x04b2,0x04be,0x04c5,0x05d3,0x05e1,0x05ef,0x05fe,0x060e,0x061c,0x062b,0x063b,0x0649,0x0659,0x0667,0x0671,0x0681,
+	0x0690,0x069c,0x04c5,0x06a8,0x06b7,0x06c5,0x05fe,0x803e,0x06d3,0x069c,0x04c5,0x06dc,0x06ec,0x06fa,0x0501,0x0709,
+	0x06d3,0x069c,0x04c5,0x0649,0x0719,0x0667,0x05fe,0x803e,0x0727,0x0730,0x8036,0x073e,0x074e,0x075d,0x803e,0x076d,
+	0x077c,0x8036,0x8036,0x078b,0x079b,0x07ab,0x803e,0x803e,0x07ba,0x07c8,0x07d8,0x07e7,0x07f7,0x0807,0x803e,0x803e,
+	0x0817,0x0824,0x0834,0x0840,0x0580,0x8036,0x0850,0x085f,0x086f,0x087f,0x8092,0x0888,0x0896,0x803e,0x803e,0x803e,
+	0x8036,0x8036,0x08a6,0x08b5,0x08c5,0x08d5,0x803e,0x803e,0x803e,0x803e,0x8061,0x8061,0x08e5,0x8036,0x8036,0x08f5,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x0905,0x8036,0x8036,0x8036,0x8036,0x090c,0x8036,0x8036,0x8036,0x8036,0x0914,
+	0x0581,0x8036,0x8036,0x8036,0x0924,0x0924,0x8036,0x8036,0x0924,0x8036,0x0934,0x0942,0x0942,0x0581,0x0934,0x8036,
+	0x0934,0x0942,0x8036,0x8036,0x0581,0x0850,0x0951,0x095f,0x803e,0x803e,0x8036,0x8036,0x8036,0x8036,0x8036,0x096f,
+	0x077c,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x097f,0x098e,0x099e,0x09a3,0x8036,0x8036,0x8036,0x8036,0x09b3,0x09c2,
+	0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x8036,0x8036,0x8036,0x09d2,0x09e0,0x09ee,0x09fe,0x803e,
+	0x0a0e,0x0a1e,0x8036,0x8036,0x0a2e,0x8036,0x8036,0x0a36,0x8036,0x8036,0x0a46,0x803e,0x803e,0x803e,0x803e,0x803e,
+	0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,
+	0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,
+	0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,
+	0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,
+	0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,
+	0x00b6,0x00b6,0x00b6,0x00b6,0x00b6,0x00b6,0x00b6,0x00b6,0x00b6,0x0a56,0x00b6,0x00b6,0x00b6,0x00b6,0x00b6,0x015e,
+	0x0a66,0x0a76,0x0a66,0x0a66,0x0a76,0x0a86,0x0a66,0x0a96,0x0aa6,0x0aa6,0x0aa6,0x0ab6,0x0ac5,0x0ad5,0x0ae5,0x0af5,
+	0x0b05,0x0b15,0x0b25,0x0b35,0x0b44,0x803e,0x0b52,0x0b62,0x0b72,0x803e,0x8007,0x803e,0x803e,0x0b82,0x0b91,0x803e,
+	0x0ba1,0x0bb1,0x0bbf,0x0bcf,0x803e,0x0bdc,0x0bec,0x0bfc,0x0c0c,0x0c1c,0x0c2c,0x8016,0x0c3b,0x0c4b,0x8016,0x0c57,
+	0x0c67,0x0c76,0x0c81,0x0c8d,0x0c98,0x0ca6,0x0cb5,0x800f,0x0cc3,0x0cd2,0x0ce0,0x0ce7,0x0cf7,0x0d03,0x0d09,0x0d19,
+	0x0d29,0x8016,0x0d33,0x0d3e,0x8067,0x8067,0x8067,0x0d44,0x8016,0x0d51,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,
+	0x8016,0x8016,0x0c54,0x803e,0x0c50,0x803e,0x80f2,0x0d61,0x0d69,0x0d71,0x8067,0x0d7d,0x80f5,0x80f6,0x0d8d,0x803e,
+	0x8016,0x8016,0x8016,0x8016,0x8016,0x8016,0x8016,0x8016,0x8016,0x0c55,0x8016,0x0c33,0x0c39,0x8016,0x8016,0x0c53,
+	0x8016,0x0d9d,0x8016,0x8016,0x8016,0x8016,0x0da6,0x0db6,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,
+	0x0dc5,0x8016,0x0dd1,0x8016,0x0dda,0x0de9,0x0df0,0x0dfa,0x0e0a,0x0e16,0x8016,0x0e1d,0x803e,0x803e,0x803e,0x803e,
+	0x8016,0x8016,0x8016,0x8016,0x8016,0x8016,0x8016,0x8016,0x8016,0x8016,0x8016,0x8016,0x8016,0x8016,0x8016,0x8016,
+	0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,
+	0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,
+	0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,
+	0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,
+	0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,
+	0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x8016,0x0e22,0x8016,0x8016,0x8016,0x8016,0x8016,0x0c57,
+	0x8016,0x8016,0x8016,0x8016,0x8016,0x8016,0x8016,0x8016,0x8016,0x8016,0x8016,0x8016,0x8016,0x0c55,0x803e,0x0e2d,
+	0x0e3d,0x0e4b,0x0e5b,0x0e6b,0x077c,0x8036,0x8036,0x8036,0x8036,0x0e7b,0x077c,0x8036,0x8036,0x8036,0x8036,0x0e8b,
+	0x0778,0x8036,0x0e9b,0x077c,0x8036,0x8036,0x8036,0x8036,0x0934,0x0eab,0x8036,0x0a36,0x803e,0x803e,0x803e,0x803e,
+	0x8067,0x0eb1,0x0ec1,0x8067,0x0ecd,0x803e,0x8067,0x0edd,0x0eed,0x8067,0x8067,0x0efc,0x0f0c,0x8067,0x8067,0x0f1c,
+	0x8067,0x8067,0x8067,0x8067,0x8067,0x8067,0x8067,0x0f11,0x8067,0x8067,0x8067,0x8067,0x8067,0x0f1d,0x8067,0x0f1c,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x0f2d,0x803e,0x803e,0x803e,0x803e,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x0f2d,0x803e,0x803e,0x803e,0x803e,0x803e,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x0e9b,0x8016,0x0f3d,0x0dd5,0x0f4c,0x803e,0x803e,0x803e,
+	0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,
+	0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,
+	0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,
+	0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,
+	0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,
+	0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,
+	0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x0f5c,0x803e,0x803e,0x803e,0x803e,0x803e,
+	0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,
+	0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,
+	0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,
+	0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,
+	0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,
+	0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,
+	0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,
+	0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,
+	0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,
+	0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,
+	0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,
+	0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,
+	0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,
+	0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,
+	0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,
+	0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,
+	0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,
+	0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,
+	0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,
+	0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,
+	0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,
+	0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,
+	0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,
+	0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,
+	0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,
+	0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,
+	0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,
+	0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,
+	0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,
+	0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,
+	0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,
+	0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,
+	0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,
+	0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,
+	0x8036,0x8036,0x0f6c,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,
+	0x0f7c,0x0f89,0x0f98,0x0fa2,0x0fb2,0x8081,0x8081,0x8081,0x8081,0x8081,0x8081,0x0fc2,0x803e,0x0fcf,0x8081,0x8081,
+	0x8081,0x8081,0x8081,0x8081,0x8081,0x8081,0x8081,0x8081,0x8081,0x8081,0x8081,0x8081,0x8081,0x8081,0x8081,0x8081,
+	0x8081,0x8081,0x8081,0x0fd2,0x803e,0x8081,0x8081,0x8081,0x8081,0x0fd0,0x8081,0x8081,0x0fe2,0x803e,0x803e,0x0386,
+	0x803e,0x803e,0x0ff2,0x1002,0x100e,0x101e,0x102e,0x103e,0x8081,0x8081,0x8081,0x8081,0x8081,0x8081,0x8081,0x1044,
+	0x1054,0x1064,0x003d,0x1074,0x0052,0x1084,0x1093,0x10a3,0x8036,0x10a5,0x8036,0x0934,0x10b5,0x10bd,0x10cd,0x10dc
+	};
+const TUint16 TheTrieIndex2[4332] = 
+	{
+	0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0001,0x0002,0x0001,0x0003,0x0002,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0002,0x0002,0x0002,0x0001,0x0004,0x0005,
+	0x0005,0x0006,0x0007,0x0006,0x0005,0x0005,0x0008,0x0009,0x0005,0x000a,0x000b,0x000c,0x000b,0x000d,0x000e,0x000e,0x000e,0x000e,0x000e,0x000e,0x000e,0x000e,0x000e,0x000e,0x000b,0x0005,0x000f,0x0010,0x000f,0x0005,0x0011,0x0011,
+	0x0011,0x0011,0x0011,0x0011,0x0011,0x0011,0x0011,0x0011,0x0011,0x0011,0x0011,0x0011,0x0011,0x0008,0x0005,0x0009,0x0012,0x0013,0x0012,0x0014,0x0014,0x0014,0x0014,0x0014,0x0014,0x0014,0x0014,0x0014,0x0014,0x0014,0x0014,0x0014,
+	0x0014,0x0014,0x0008,0x0010,0x0009,0x0010,0x0000,0x0000,0x0000,0x0000,0x0000,0x0002,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0015,0x0005,0x0007,0x0007,0x0007,0x0007,0x0016,0x0016,0x0012,0x0016,
+	0x0017,0x0018,0x0010,0x0019,0x0016,0x0012,0x001a,0x000a,0x001b,0x001b,0x0012,0x001c,0x0016,0x0005,0x0012,0x001d,0x0017,0x001e,0x001f,0x001f,0x001f,0x0005,0x0011,0x0011,0x0011,0x0011,0x0011,0x0011,0x0011,0x0010,0x0011,0x0011,
+	0x0011,0x0011,0x0011,0x0011,0x0011,0x0017,0x0014,0x0014,0x0014,0x0014,0x0014,0x0014,0x0014,0x0010,0x0014,0x0014,0x0014,0x0014,0x0014,0x0014,0x0014,0x0020,0x0021,0x0022,0x0021,0x0022,0x0021,0x0022,0x0021,0x0022,0x0021,0x0022,
+	0x0021,0x0022,0x0021,0x0022,0x0021,0x0022,0x0023,0x0024,0x0021,0x0022,0x0021,0x0022,0x0021,0x0022,0x0017,0x0021,0x0022,0x0021,0x0022,0x0021,0x0022,0x0021,0x0022,0x0021,0x0022,0x0017,0x0021,0x0022,0x0021,0x0022,0x0021,0x0022,
+	0x0021,0x0022,0x0025,0x0021,0x0022,0x0021,0x0022,0x0021,0x0022,0x0026,0x0017,0x0027,0x0021,0x0022,0x0021,0x0022,0x0028,0x0021,0x0022,0x0029,0x0029,0x0021,0x0022,0x0017,0x002a,0x002b,0x002c,0x0021,0x0022,0x0029,0x002d,0x002e,
+	0x002f,0x0030,0x0021,0x0022,0x0017,0x0017,0x002f,0x0031,0x0017,0x0032,0x0021,0x0022,0x0021,0x0022,0x0021,0x0022,0x0033,0x0021,0x0022,0x0033,0x0017,0x0017,0x0021,0x0022,0x0033,0x0021,0x0022,0x0034,0x0034,0x0021,0x0022,0x0021,
+	0x0022,0x0035,0x0021,0x0022,0x0017,0x0036,0x0021,0x0022,0x0017,0x0037,0x0036,0x0036,0x0036,0x0036,0x0038,0x0039,0x003a,0x0038,0x0039,0x003a,0x0038,0x0039,0x003a,0x0021,0x0022,0x0021,0x0022,0x0021,0x0022,0x0021,0x0022,0x0021,
+	0x0022,0x0021,0x0022,0x0021,0x0022,0x003b,0x0021,0x0022,0x0017,0x0038,0x0039,0x003a,0x0021,0x0022,0x003c,0x003d,0x0021,0x0022,0x0021,0x0022,0x0021,0x0022,0x0021,0x0022,0x003e,0x003e,0x0021,0x0022,0x0021,0x0022,0x0021,0x0022,
+	0x0021,0x0022,0x0021,0x0022,0x0021,0x0022,0x0021,0x0022,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x0017,0x0017,0x0017,0x003f,0x0040,0x0017,0x0041,0x0041,0x0017,0x0042,0x0017,0x0043,
+	0x0017,0x0017,0x0017,0x0017,0x0041,0x0017,0x0017,0x0044,0x0017,0x0017,0x0017,0x0017,0x0045,0x0046,0x0017,0x0017,0x0017,0x0017,0x0017,0x0046,0x0017,0x0017,0x0047,0x0017,0x0017,0x0048,0x0017,0x0017,0x0017,0x0017,0x0017,0x0017,
+	0x0017,0x0017,0x0017,0x0017,0x0049,0x0017,0x0017,0x0049,0x0017,0x0017,0x0017,0x0017,0x0049,0x0017,0x004a,0x004a,0x0017,0x0017,0x0017,0x0017,0x004b,0x0017,0x0017,0x0017,0x0017,0x0017,0x0017,0x0017,0x0017,0x0017,0x0017,0x0017,
+	0x0017,0x0017,0x0017,0x003e,0x003e,0x004c,0x004c,0x004c,0x004c,0x004c,0x004c,0x004c,0x004c,0x004c,0x0012,0x0012,0x004c,0x004c,0x004c,0x004c,0x004c,0x0012,0x0012,0x0012,0x0012,0x0012,0x0012,0x0012,0x0012,0x0012,0x0012,0x0012,
+	0x0012,0x0012,0x0012,0x004c,0x004c,0x004c,0x004c,0x004c,0x0012,0x0012,0x0012,0x0012,0x0012,0x0012,0x0012,0x0012,0x0012,0x004c,0x003e,0x004d,0x004d,0x004d,0x004d,0x004d,0x004e,0x004f,0x004f,0x004f,0x004f,0x004e,0x0050,0x004f,
+	0x004f,0x004f,0x004f,0x0051,0x0051,0x004f,0x004f,0x004f,0x004f,0x0051,0x0051,0x004f,0x004f,0x004f,0x004f,0x004f,0x004f,0x004f,0x0052,0x0052,0x0052,0x0052,0x0052,0x004f,0x004f,0x004f,0x004f,0x004d,0x004d,0x004d,0x004d,0x004d,
+	0x0053,0x004d,0x004f,0x004f,0x004f,0x004d,0x004d,0x004d,0x004f,0x004f,0x003e,0x0054,0x0054,0x0055,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x0012,0x0012,0x003e,0x003e,0x003e,
+	0x003e,0x004c,0x003e,0x003e,0x003e,0x0005,0x003e,0x003e,0x003e,0x003e,0x0012,0x0012,0x0056,0x0005,0x0057,0x0057,0x0057,0x003e,0x0058,0x003e,0x0059,0x0059,0x0017,0x0011,0x0011,0x0011,0x0011,0x0011,0x0011,0x0011,0x0011,0x0011,
+	0x0011,0x0011,0x0011,0x0011,0x0011,0x0011,0x003e,0x0011,0x0011,0x0011,0x0011,0x0011,0x0011,0x0011,0x0011,0x0011,0x005a,0x005b,0x005b,0x005b,0x0017,0x0014,0x0014,0x0014,0x0014,0x0014,0x0014,0x0014,0x0014,0x0014,0x0014,0x0014,
+	0x0014,0x0014,0x0014,0x0014,0x005c,0x0014,0x0014,0x0014,0x0014,0x0014,0x0014,0x0014,0x0014,0x0014,0x005d,0x005e,0x005e,0x003e,0x005f,0x0060,0x0061,0x0061,0x0061,0x0062,0x0063,0x0017,0x003e,0x003e,0x0021,0x0022,0x0021,0x0022,
+	0x0021,0x0022,0x0064,0x0065,0x003b,0x0017,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x0021,0x0022,0x0067,0x004d,0x004d,0x004d,0x004d,0x003e,0x0068,0x0068,0x003e,0x003e,0x0021,0x0022,
+	0x0021,0x0022,0x0061,0x0021,0x0022,0x0021,0x0022,0x003e,0x003e,0x0021,0x0022,0x003e,0x003e,0x0021,0x0022,0x003e,0x003e,0x003e,0x0021,0x0022,0x0021,0x0022,0x0021,0x0022,0x003e,0x003e,0x0021,0x0022,0x003e,0x003e,0x003e,0x003e,
+	0x003e,0x003e,0x0069,0x0069,0x0069,0x0069,0x0069,0x0069,0x0069,0x0069,0x0069,0x0069,0x0069,0x0069,0x0069,0x0069,0x0069,0x003e,0x003e,0x004c,0x006a,0x006a,0x006a,0x006a,0x006a,0x006a,0x003e,0x006b,0x006b,0x006b,0x006b,0x006b,
+	0x006b,0x006b,0x006b,0x006b,0x006b,0x006b,0x006b,0x006b,0x006b,0x006b,0x0017,0x003e,0x006a,0x0019,0x003e,0x003e,0x003e,0x003e,0x003e,0x004f,0x004d,0x004d,0x004d,0x004d,0x004f,0x004d,0x004d,0x004d,0x006c,0x004f,0x004d,0x004d,
+	0x004d,0x004d,0x003e,0x004f,0x004f,0x004f,0x004f,0x004f,0x004d,0x004d,0x004f,0x004d,0x004d,0x006c,0x006d,0x004d,0x006e,0x006f,0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077,0x003e,0x0078,0x0079,0x007a,0x007b,0x007c,
+	0x007b,0x007d,0x007e,0x007b,0x004d,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x007f,0x007f,0x007f,0x007f,0x007f,0x007f,0x007f,0x007f,0x007f,0x007f,0x007f,0x003e,0x003e,0x003e,0x003e,0x003e,
+	0x007f,0x007f,0x007f,0x007b,0x007b,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x000b,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x0080,0x003e,0x003e,
+	0x003e,0x0080,0x003e,0x0081,0x0081,0x0081,0x0081,0x0081,0x0081,0x0081,0x0081,0x0081,0x0081,0x0081,0x0081,0x0081,0x0081,0x0081,0x003e,0x003e,0x003e,0x003e,0x003e,0x0082,0x0081,0x0081,0x0081,0x0081,0x0081,0x0081,0x0081,0x0081,
+	0x0081,0x0081,0x0083,0x0084,0x0085,0x0086,0x0087,0x0088,0x0089,0x008a,0x004d,0x004d,0x004f,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x008b,0x008b,0x008b,0x008b,0x008b,0x008b,0x008b,0x008b,0x008b,
+	0x008b,0x0006,0x008c,0x008c,0x0080,0x003e,0x003e,0x008d,0x0081,0x0081,0x0081,0x0081,0x0081,0x0081,0x0081,0x0081,0x0081,0x0081,0x0081,0x0081,0x0081,0x0081,0x0081,0x0080,0x0081,0x004d,0x004d,0x004d,0x004d,0x004d,0x004d,0x004d,
+	0x0068,0x0068,0x004d,0x004d,0x004d,0x004f,0x004d,0x0082,0x0082,0x004d,0x004d,0x0016,0x004f,0x004d,0x004d,0x004f,0x003e,0x003e,0x008e,0x008e,0x008e,0x008e,0x008e,0x008e,0x008e,0x008e,0x008e,0x008e,0x0081,0x0081,0x0081,0x008f,
+	0x008f,0x003e,0x0080,0x0080,0x0080,0x0080,0x0080,0x0080,0x0080,0x0080,0x0080,0x0080,0x0080,0x0080,0x0080,0x0080,0x003e,0x0090,0x0081,0x0091,0x0081,0x0081,0x0081,0x0081,0x0081,0x0081,0x0081,0x0081,0x0081,0x0081,0x0081,0x0081,
+	0x0081,0x0081,0x004d,0x004f,0x004d,0x004d,0x004f,0x004d,0x004d,0x004f,0x004f,0x004f,0x004d,0x004f,0x004f,0x004d,0x004f,0x004d,0x004d,0x004f,0x004d,0x004f,0x004d,0x004f,0x004d,0x004f,0x004d,0x004d,0x003e,0x003e,0x003e,0x003e,
+	0x003e,0x0081,0x0081,0x0081,0x0081,0x0081,0x0081,0x0092,0x0092,0x0092,0x0092,0x0092,0x0092,0x0092,0x0092,0x0092,0x0092,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,
+	0x0092,0x0092,0x0093,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x003e,0x003e,0x0094,0x0036,0x0093,0x0093,0x0092,0x0092,0x0092,0x0092,0x0092,0x0092,0x0092,0x0092,0x0093,0x0093,0x0093,
+	0x0093,0x0095,0x003e,0x003e,0x0036,0x004d,0x004f,0x004d,0x004d,0x003e,0x003e,0x003e,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0092,0x0092,0x006a,0x006a,0x0096,0x0096,0x0096,0x0096,0x0096,0x0096,0x0096,0x0096,
+	0x0096,0x0096,0x006a,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x0036,0x0036,0x0036,0x0036,0x0036,0x003e,0x0092,0x0093,0x0093,0x003e,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x003e,
+	0x003e,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x003e,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x003e,0x0036,0x003e,0x003e,0x003e,0x0036,0x0036,0x0036,0x0036,0x003e,0x003e,
+	0x0094,0x0036,0x0093,0x0093,0x0092,0x0092,0x0092,0x0092,0x003e,0x003e,0x0093,0x0093,0x003e,0x003e,0x0093,0x0093,0x0095,0x0036,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x0093,0x003e,0x003e,0x003e,0x003e,0x0036,0x0036,
+	0x003e,0x0036,0x0036,0x0092,0x0092,0x003e,0x003e,0x0097,0x0097,0x0097,0x0097,0x0097,0x0097,0x0097,0x0097,0x0097,0x0097,0x0036,0x0036,0x0007,0x0007,0x0098,0x0098,0x0098,0x0098,0x0099,0x009a,0x0067,0x003e,0x003e,0x003e,0x003e,
+	0x003e,0x0092,0x0092,0x0093,0x003e,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x003e,0x003e,0x003e,0x003e,0x0036,0x003e,0x0036,0x0036,0x003e,0x0036,0x0036,0x003e,0x0036,0x0036,0x003e,0x003e,0x0094,0x003e,0x0093,0x0093,0x0092,
+	0x0092,0x003e,0x003e,0x003e,0x003e,0x0092,0x0092,0x003e,0x003e,0x0092,0x0092,0x0095,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x0036,0x0036,0x0036,0x0036,0x003e,0x0036,0x003e,0x003e,0x003e,0x003e,0x003e,
+	0x003e,0x0096,0x0096,0x0096,0x0096,0x0096,0x0096,0x0096,0x0096,0x0096,0x0096,0x0092,0x0092,0x0036,0x0036,0x0036,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x0092,0x0092,0x0093,0x003e,0x0036,
+	0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x003e,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x003e,0x0036,0x0036,0x003e,0x0036,0x0036,0x0036,0x0036,0x0036,0x003e,
+	0x003e,0x0094,0x0036,0x0093,0x0093,0x0092,0x0092,0x0092,0x0092,0x0092,0x003e,0x0092,0x0092,0x0093,0x003e,0x0093,0x0093,0x0095,0x003e,0x003e,0x0036,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,
+	0x003e,0x003e,0x003e,0x003e,0x0007,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x0036,0x003e,0x0036,0x0036,0x003e,0x0036,0x0036,0x0036,0x0036,0x0036,0x003e,0x003e,0x0094,
+	0x0036,0x0093,0x0092,0x0092,0x0092,0x003e,0x003e,0x003e,0x0093,0x0093,0x003e,0x003e,0x0093,0x0093,0x0095,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x0092,0x0093,0x003e,0x003e,0x003e,0x003e,0x0036,0x0036,0x003e,0x0036,0x0036,
+	0x003e,0x003e,0x003e,0x003e,0x0096,0x0096,0x0096,0x0096,0x0096,0x0096,0x0096,0x0096,0x0096,0x0096,0x0067,0x0036,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x0092,0x0036,
+	0x003e,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x003e,0x003e,0x003e,0x0036,0x0036,0x003e,0x0036,0x0036,0x0036,0x0036,0x003e,0x003e,0x003e,0x0036,0x0036,0x003e,0x0036,0x003e,0x0036,0x0036,0x003e,0x003e,0x003e,0x0036,0x0036,
+	0x003e,0x003e,0x003e,0x0036,0x0036,0x0036,0x003e,0x003e,0x003e,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x003e,0x003e,0x003e,0x003e,0x0093,0x0093,0x0092,0x0093,0x0093,0x003e,0x003e,0x003e,0x0093,
+	0x0093,0x0093,0x003e,0x0093,0x0093,0x0093,0x0095,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x0093,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x0097,0x0097,0x0097,0x0097,0x0097,0x0097,0x0097,0x0097,0x0097,
+	0x0097,0x009b,0x009c,0x009d,0x0016,0x0016,0x0016,0x0016,0x0016,0x0016,0x0007,0x0016,0x003e,0x003e,0x003e,0x003e,0x003e,0x0093,0x0093,0x0093,0x003e,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x003e,0x0036,0x0036,
+	0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x003e,0x0036,0x0036,0x0036,0x0036,0x0036,0x003e,0x003e,0x003e,0x003e,0x0092,0x0092,0x0093,0x0093,0x0093,0x0093,0x003e,0x0092,0x0092,0x0092,
+	0x003e,0x0092,0x0092,0x0092,0x0095,0x003e,0x003e,0x003e,0x003e,0x003e,0x009e,0x009f,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x0093,0x0093,0x003e,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,
+	0x003e,0x0036,0x0036,0x0036,0x0036,0x0036,0x003e,0x003e,0x0094,0x0036,0x0093,0x00a0,0x0093,0x0093,0x0093,0x0093,0x0093,0x003e,0x00a0,0x0093,0x0093,0x003e,0x0093,0x0093,0x0092,0x0095,0x003e,0x003e,0x003e,0x003e,0x003e,0x0093,
+	0x0093,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x0036,0x003e,0x0016,0x0016,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x0093,0x0092,0x0092,0x0092,0x003e,0x003e,0x0093,
+	0x0093,0x0093,0x003e,0x0093,0x0093,0x0093,0x0095,0x003e,0x003e,0x0093,0x0093,0x003e,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x003e,0x003e,0x003e,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,
+	0x003e,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x003e,0x0036,0x003e,0x003e,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x003e,0x003e,0x003e,0x0095,0x003e,0x003e,0x003e,0x003e,0x0093,0x0093,0x0092,
+	0x0092,0x0092,0x003e,0x0092,0x003e,0x0093,0x0093,0x0093,0x0093,0x0093,0x0093,0x0093,0x0093,0x003e,0x003e,0x0093,0x0093,0x006a,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x0036,0x0036,0x0036,
+	0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0092,0x0036,0x0036,0x0092,0x0092,0x0092,0x0092,0x00a1,0x00a1,0x0095,0x003e,0x003e,0x003e,0x003e,0x0007,0x0036,0x0036,0x0036,0x0036,0x0036,
+	0x0036,0x004c,0x0092,0x00a2,0x00a2,0x00a2,0x00a2,0x0092,0x0092,0x0092,0x006a,0x00a3,0x00a3,0x00a3,0x00a3,0x00a3,0x00a3,0x00a3,0x00a3,0x00a3,0x00a3,0x006a,0x006a,0x003e,0x003e,0x003e,0x003e,0x0036,0x0036,0x003e,0x0036,0x003e,
+	0x003e,0x0036,0x0036,0x003e,0x0036,0x003e,0x003e,0x0036,0x003e,0x003e,0x003e,0x003e,0x0036,0x0036,0x0036,0x0036,0x003e,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x003e,0x0036,0x0036,0x0036,0x003e,0x0036,0x003e,0x0036,
+	0x003e,0x003e,0x0036,0x0036,0x003e,0x0036,0x0036,0x0036,0x0092,0x0036,0x0036,0x0092,0x0092,0x0092,0x0092,0x00a4,0x00a4,0x003e,0x0092,0x0092,0x0036,0x003e,0x003e,0x0036,0x0036,0x0036,0x0036,0x0036,0x003e,0x004c,0x003e,0x00a5,
+	0x00a5,0x00a5,0x00a5,0x0092,0x0092,0x003e,0x003e,0x00a6,0x00a6,0x00a6,0x00a6,0x00a6,0x00a6,0x00a6,0x00a6,0x00a6,0x00a6,0x003e,0x003e,0x0036,0x0036,0x003e,0x003e,0x0036,0x0067,0x0067,0x0067,0x006a,0x006a,0x006a,0x006a,0x006a,
+	0x006a,0x006a,0x006a,0x006a,0x006a,0x006a,0x006a,0x0067,0x0067,0x0067,0x0067,0x0067,0x004f,0x004f,0x0067,0x0067,0x0067,0x0067,0x0067,0x0067,0x00a7,0x00a7,0x00a7,0x00a7,0x00a7,0x00a7,0x00a7,0x00a7,0x00a7,0x00a7,0x0099,0x0099,
+	0x0099,0x0099,0x0099,0x0099,0x0067,0x004f,0x0067,0x004f,0x0067,0x0050,0x00a8,0x00a9,0x00a8,0x00a9,0x0093,0x0093,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x003e,0x003e,0x003e,0x003e,0x003e,
+	0x00aa,0x00ab,0x0092,0x00ac,0x0092,0x0092,0x0092,0x0092,0x0092,0x00ab,0x00ab,0x00ab,0x00ab,0x0092,0x0093,0x00ab,0x0092,0x004d,0x004d,0x0095,0x006a,0x004d,0x004d,0x0036,0x0036,0x0036,0x0036,0x003e,0x003e,0x003e,0x003e,0x0092,
+	0x0092,0x0092,0x0092,0x0092,0x0092,0x0092,0x0092,0x003e,0x0092,0x0092,0x0092,0x0092,0x0092,0x0092,0x0092,0x0092,0x0092,0x0092,0x0092,0x0092,0x0092,0x003e,0x0067,0x0067,0x0067,0x0067,0x0067,0x0067,0x004f,0x0067,0x0067,0x0067,
+	0x0067,0x0067,0x0067,0x003e,0x003e,0x0067,0x0036,0x0036,0x003e,0x0036,0x0036,0x0036,0x0036,0x0036,0x003e,0x0036,0x0036,0x003e,0x0093,0x0092,0x0092,0x0092,0x0093,0x0092,0x003e,0x003e,0x003e,0x0092,0x0094,0x0093,0x0095,0x003e,
+	0x003e,0x003e,0x003e,0x003e,0x003e,0x00ad,0x00ad,0x00ad,0x00ad,0x00ad,0x00ad,0x00ad,0x00ad,0x00ad,0x00ad,0x006a,0x006a,0x006a,0x006a,0x006a,0x006a,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0093,0x0093,0x0092,0x0092,0x003e,
+	0x003e,0x003e,0x003e,0x003e,0x003e,0x0061,0x0061,0x0061,0x0061,0x0061,0x0061,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x003e,0x003e,0x003e,0x003e,
+	0x006a,0x003e,0x003e,0x003e,0x003e,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x003e,0x003e,0x003e,0x003e,0x003e,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x003e,0x003e,
+	0x003e,0x003e,0x003e,0x003e,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x003e,0x0036,0x003e,0x0036,0x0036,0x0036,0x0036,0x003e,0x003e,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,
+	0x0036,0x0036,0x0036,0x003e,0x0036,0x0036,0x0036,0x0036,0x003e,0x003e,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x003e,0x006a,0x006a,0x006a,0x006a,0x006a,0x006a,0x006a,0x006a,0x00ae,0x00ae,0x00ae,0x00ae,0x00ae,0x00ae,
+	0x00ae,0x00af,0x00b0,0x00b1,0x00b2,0x00b3,0x00b4,0x00b5,0x00b6,0x00b7,0x00b8,0x00b9,0x003e,0x003e,0x003e,0x0036,0x0036,0x0036,0x0036,0x0036,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x0036,
+	0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x006a,0x006a,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x0004,0x0036,
+	0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x00a8,0x00a9,0x003e,0x003e,0x003e,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x006a,0x006a,
+	0x006a,0x00ba,0x00ba,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x0036,0x0036,0x0036,0x0036,0x0093,0x0093,0x0093,0x0092,0x0092,0x0092,0x0092,0x0092,0x0092,0x0092,
+	0x0093,0x0093,0x0093,0x0093,0x0093,0x0093,0x0092,0x0093,0x0093,0x0092,0x0092,0x0092,0x0092,0x0092,0x0092,0x0092,0x0095,0x0092,0x006a,0x006a,0x006a,0x006a,0x006a,0x006a,0x006a,0x0007,0x006a,0x003e,0x003e,0x003e,0x00bb,0x00bb,
+	0x00bb,0x00bb,0x00bb,0x00bb,0x00bb,0x00bb,0x00bb,0x00bb,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x0005,0x0005,0x0005,0x0005,0x0005,0x0005,0x0019,0x0005,0x0005,0x0005,0x0005,0x0090,0x0090,0x0090,0x0090,0x003e,0x00bc,0x00bc,
+	0x00bc,0x00bc,0x00bc,0x00bc,0x00bc,0x00bc,0x00bc,0x00bc,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x0036,0x0036,0x0036,0x004c,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x003e,0x003e,
+	0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x006d,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x0021,0x0022,0x0021,0x0022,0x0021,0x0022,0x0017,0x0017,0x0017,0x0017,
+	0x0017,0x00bd,0x003e,0x003e,0x003e,0x003e,0x00be,0x00be,0x00be,0x00be,0x00be,0x00be,0x00be,0x00be,0x00bf,0x00bf,0x00bf,0x00bf,0x00bf,0x00bf,0x00bf,0x00bf,0x00be,0x00be,0x00be,0x00be,0x00be,0x00be,0x003e,0x003e,0x00bf,0x00bf,
+	0x00bf,0x00bf,0x00bf,0x00bf,0x003e,0x003e,0x0017,0x00be,0x0017,0x00be,0x0017,0x00be,0x0017,0x00be,0x003e,0x00bf,0x003e,0x00bf,0x003e,0x00bf,0x003e,0x00bf,0x00c0,0x00c0,0x00c1,0x00c1,0x00c1,0x00c1,0x00c2,0x00c2,0x00c3,0x00c3,
+	0x00c4,0x00c4,0x00c5,0x00c5,0x003e,0x003e,0x00be,0x00be,0x00be,0x00be,0x00be,0x00be,0x00be,0x00be,0x00c6,0x00c6,0x00c6,0x00c6,0x00c6,0x00c6,0x00c6,0x00c6,0x00be,0x00be,0x0017,0x00c7,0x0017,0x003e,0x0017,0x0017,0x00bf,0x00bf,
+	0x00c8,0x00c8,0x00c9,0x0012,0x00ca,0x0012,0x0012,0x0017,0x00c7,0x0017,0x003e,0x0017,0x0017,0x00cb,0x00cb,0x00cb,0x00cb,0x00c9,0x0012,0x0012,0x0012,0x00be,0x00be,0x0017,0x0017,0x003e,0x003e,0x0017,0x0017,0x00bf,0x00bf,0x00cc,
+	0x00cc,0x003e,0x0012,0x0012,0x0012,0x00be,0x00be,0x0017,0x0017,0x0017,0x00cd,0x0017,0x0017,0x00bf,0x00bf,0x00ce,0x00ce,0x00cf,0x0012,0x0012,0x0012,0x003e,0x003e,0x0017,0x00c7,0x0017,0x003e,0x0017,0x0017,0x00d0,0x00d0,0x00d1,
+	0x00d1,0x00c9,0x0012,0x0012,0x003e,0x0004,0x0004,0x0004,0x0004,0x0004,0x0004,0x0004,0x0004,0x0004,0x0004,0x0004,0x00d2,0x0090,0x0090,0x00d3,0x00d4,0x0019,0x0019,0x0019,0x0019,0x0019,0x0019,0x0005,0x0005,0x00d5,0x00d6,0x00a8,
+	0x00d5,0x00d5,0x00d6,0x00a8,0x00d5,0x0005,0x0005,0x0005,0x0005,0x0005,0x0005,0x0005,0x0005,0x00d7,0x00d8,0x00d9,0x00da,0x00db,0x00dc,0x00dd,0x0004,0x0006,0x0006,0x0006,0x0006,0x0006,0x0005,0x0005,0x0005,0x0005,0x0018,0x001e,
+	0x0005,0x0005,0x0005,0x0005,0x0013,0x0005,0x0005,0x0005,0x0010,0x0008,0x0009,0x003e,0x0005,0x0005,0x0005,0x0005,0x0005,0x0005,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x0090,0x0090,0x0090,0x0090,
+	0x0090,0x0090,0x00de,0x003e,0x003e,0x003e,0x00de,0x00de,0x00de,0x00de,0x00de,0x00de,0x000a,0x000a,0x0010,0x0008,0x0009,0x0017,0x00df,0x00df,0x00df,0x00df,0x00df,0x00df,0x00df,0x00df,0x00df,0x00df,0x000a,0x000a,0x0010,0x0008,
+	0x0009,0x003e,0x004d,0x004d,0x0052,0x0052,0x004d,0x004d,0x004d,0x004d,0x0052,0x0052,0x0052,0x004d,0x004d,0x0068,0x0068,0x0068,0x004d,0x0068,0x0068,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,
+	0x003e,0x0016,0x0016,0x0061,0x0016,0x0016,0x0016,0x0016,0x0061,0x0016,0x0016,0x0017,0x0061,0x0061,0x0061,0x0017,0x0017,0x0061,0x0061,0x0061,0x0017,0x0016,0x0061,0x0016,0x0016,0x0016,0x0061,0x0061,0x0061,0x0061,0x0061,0x0016,
+	0x0016,0x0016,0x0016,0x0061,0x0016,0x00e0,0x0016,0x0061,0x0016,0x00e1,0x00e2,0x0061,0x0061,0x001a,0x0017,0x0061,0x0061,0x0016,0x0061,0x0017,0x0036,0x0036,0x0036,0x0036,0x0017,0x0016,0x003e,0x003e,0x003e,0x003e,0x003e,0x001f,
+	0x001f,0x001f,0x001f,0x001f,0x001f,0x001f,0x001f,0x001f,0x001f,0x001f,0x001f,0x00e3,0x00e4,0x00e4,0x00e4,0x00e4,0x00e4,0x00e4,0x00e4,0x00e4,0x00e4,0x00e4,0x00e4,0x00e4,0x00e5,0x00e6,0x00e7,0x00e8,0x00e9,0x00e9,0x00e9,0x00e9,
+	0x00e9,0x00e9,0x00e9,0x00e9,0x00e9,0x00e9,0x00e9,0x00e9,0x00ea,0x00eb,0x00ec,0x00ed,0x00ee,0x00ef,0x00f0,0x00f1,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x0010,0x0010,0x0010,0x0010,
+	0x0010,0x0016,0x0016,0x0016,0x0016,0x0016,0x0010,0x0010,0x0016,0x0016,0x0016,0x0016,0x0010,0x0016,0x0016,0x0010,0x0016,0x0016,0x0010,0x0016,0x0016,0x0016,0x0016,0x0016,0x0016,0x0016,0x0010,0x0016,0x0016,0x0016,0x0016,0x0016,
+	0x0016,0x0016,0x0016,0x0016,0x0016,0x0016,0x0016,0x0016,0x0016,0x0010,0x0010,0x0016,0x0016,0x0010,0x0016,0x0010,0x0016,0x0016,0x0016,0x0016,0x0016,0x0016,0x0016,0x0016,0x0016,0x0016,0x0016,0x003e,0x003e,0x003e,0x003e,0x003e,
+	0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x0010,0x000f,0x000f,0x000f,0x000f,0x0010,0x0010,0x0010,0x000f,0x000f,0x000f,0x000f,0x000f,0x000f,0x0010,0x0010,0x000f,0x000a,0x000a,0x0010,0x000f,0x000f,0x0010,0x0010,0x0010,
+	0x000f,0x000f,0x000f,0x000f,0x0010,0x000f,0x0010,0x000f,0x0010,0x0010,0x0010,0x0010,0x000f,0x000f,0x000f,0x000f,0x000f,0x0010,0x0010,0x0010,0x0010,0x0010,0x000f,0x0010,0x000f,0x000f,0x000f,0x000f,0x000f,0x000f,0x000f,0x000f,
+	0x000f,0x000f,0x000f,0x000f,0x000f,0x0010,0x0010,0x0010,0x000f,0x000f,0x000f,0x000f,0x0010,0x0010,0x0010,0x0010,0x0010,0x0010,0x0010,0x0010,0x0010,0x000f,0x0010,0x000f,0x0010,0x000f,0x000f,0x000f,0x000f,0x000f,0x000f,0x000f,
+	0x000f,0x0010,0x0010,0x000f,0x000f,0x000f,0x000f,0x000f,0x000f,0x000f,0x000f,0x000f,0x000f,0x000f,0x000f,0x000f,0x0010,0x0010,0x000f,0x000f,0x000f,0x0010,0x0010,0x0010,0x0010,0x0010,0x000f,0x0010,0x0010,0x0010,0x0010,0x0010,
+	0x0010,0x0010,0x000f,0x000f,0x0010,0x0010,0x000f,0x000f,0x000f,0x000f,0x000f,0x000f,0x000f,0x000f,0x000f,0x000f,0x0010,0x0010,0x0010,0x0010,0x0010,0x000f,0x000f,0x0010,0x0010,0x0010,0x0010,0x0010,0x0010,0x0010,0x0010,0x0010,
+	0x000f,0x000f,0x000f,0x000f,0x000f,0x0010,0x0010,0x0010,0x0010,0x000f,0x000f,0x000f,0x000f,0x000f,0x000f,0x000f,0x000f,0x000f,0x000f,0x000f,0x000f,0x000f,0x000f,0x0010,0x0010,0x000f,0x000f,0x003e,0x003e,0x003e,0x003e,0x003e,
+	0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x0016,0x0016,0x0016,0x0016,0x0016,0x0016,0x0016,0x0016,0x000f,0x000f,0x000f,0x000f,0x0016,0x0016,0x0016,0x0016,0x0016,0x0016,0x0016,0x0008,0x0009,0x0016,0x0016,
+	0x0016,0x0016,0x0016,0x0016,0x0067,0x0067,0x0067,0x0067,0x0067,0x0067,0x0067,0x0067,0x0067,0x0067,0x0067,0x0016,0x003e,0x0016,0x0016,0x0016,0x0016,0x0016,0x0067,0x0016,0x0016,0x0016,0x0016,0x0016,0x003e,0x003e,0x003e,0x003e,
+	0x003e,0x00f2,0x00f2,0x00f2,0x00f2,0x00f3,0x00f3,0x00f3,0x00f3,0x00f3,0x00f3,0x00f3,0x00f3,0x00f3,0x00f3,0x00f3,0x00f3,0x00f4,0x00f4,0x00f4,0x00f4,0x00f4,0x00f4,0x00f4,0x00f4,0x00f4,0x00f4,0x00f4,0x00f4,0x0067,0x0067,0x0067,
+	0x0067,0x0067,0x0067,0x00f5,0x00f5,0x00f5,0x00f5,0x00f5,0x00f5,0x00f5,0x00f5,0x00f5,0x00f5,0x00f6,0x00f6,0x00f6,0x00f6,0x00f6,0x00f6,0x00f6,0x00f6,0x00f6,0x00f6,0x00f7,0x003e,0x003e,0x003e,0x003e,0x003e,0x0016,0x0016,0x0016,
+	0x0016,0x003e,0x003e,0x003e,0x003e,0x003e,0x0016,0x0016,0x0016,0x0016,0x0016,0x0016,0x0016,0x0016,0x0016,0x0016,0x0016,0x0016,0x0016,0x0016,0x0016,0x0010,0x0016,0x0016,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,
+	0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x0016,0x0016,0x0016,0x0016,0x003e,0x0016,0x0016,0x0016,0x0016,0x003e,0x003e,0x0016,0x0016,0x0016,0x0016,0x0016,0x0016,0x0016,0x0016,0x003e,0x0016,0x0016,0x0016,0x0016,0x0016,0x0016,
+	0x0016,0x0016,0x0016,0x0016,0x0016,0x0016,0x003e,0x0016,0x003e,0x0016,0x0016,0x0016,0x003e,0x003e,0x003e,0x0016,0x003e,0x0016,0x0016,0x0016,0x0016,0x0016,0x0016,0x0016,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,
+	0x00f8,0x00f8,0x00f8,0x00f8,0x00f8,0x00f8,0x00f8,0x00f8,0x00f8,0x00f8,0x00f9,0x00f9,0x00f9,0x00f9,0x00f9,0x00f9,0x00f9,0x00f9,0x00f9,0x00f9,0x00fa,0x00fa,0x00fa,0x00fa,0x00fa,0x00fa,0x0016,0x003e,0x003e,0x003e,0x0016,0x0016,
+	0x0016,0x0016,0x0016,0x0016,0x0016,0x0016,0x0016,0x0016,0x0016,0x0016,0x0016,0x0016,0x003e,0x0016,0x0016,0x0016,0x0016,0x0016,0x0016,0x0016,0x0016,0x0016,0x0016,0x0016,0x0016,0x003e,0x003e,0x003e,0x003e,0x0004,0x0005,0x0005,
+	0x0005,0x0016,0x004c,0x0036,0x00fb,0x0008,0x0009,0x0008,0x0009,0x0008,0x0009,0x0008,0x0009,0x0016,0x0016,0x0008,0x0009,0x0008,0x0009,0x0008,0x0009,0x0008,0x0009,0x0019,0x00a8,0x00a9,0x00a9,0x0016,0x00fc,0x00fc,0x00fc,0x00fc,
+	0x00fc,0x00fc,0x00fc,0x00fc,0x00fc,0x00fd,0x006d,0x004e,0x006c,0x00fe,0x00fe,0x0019,0x004c,0x004c,0x004c,0x004c,0x004c,0x0016,0x0016,0x00ff,0x0100,0x0101,0x003e,0x003e,0x003e,0x0016,0x0016,0x0036,0x0036,0x0036,0x0036,0x0036,
+	0x003e,0x003e,0x003e,0x003e,0x0102,0x0102,0x0012,0x0012,0x004c,0x004c,0x003e,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0013,0x004c,0x004c,0x004c,0x003e,0x0036,0x0036,0x0036,0x0036,0x0036,
+	0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x003e,0x003e,0x003e,0x0067,0x0067,0x0099,0x0099,0x0099,0x0099,0x0067,0x0067,0x0067,0x0067,0x0067,0x0067,0x0067,0x0067,0x0067,0x0067,0x0067,0x0067,0x0067,0x003e,0x003e,
+	0x003e,0x0099,0x0099,0x0099,0x0099,0x0099,0x0099,0x0099,0x0099,0x0099,0x0099,0x0067,0x0067,0x0067,0x0067,0x0067,0x0067,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x0067,0x0067,0x0067,
+	0x0067,0x0067,0x0067,0x0067,0x0067,0x0067,0x0067,0x0067,0x0067,0x003e,0x003e,0x003e,0x0067,0x0103,0x0103,0x0103,0x0103,0x0103,0x0103,0x0103,0x0103,0x0103,0x0103,0x0067,0x0067,0x0067,0x0067,0x0067,0x0067,0x003e,0x003e,0x003e,
+	0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x0067,0x0067,0x0067,0x0067,0x0067,0x0067,0x0067,0x0067,0x0067,0x0067,0x0067,0x0067,0x003e,0x003e,0x003e,0x003e,0x0067,0x0067,0x0067,0x0067,
+	0x0067,0x0067,0x0067,0x0067,0x0067,0x0067,0x0067,0x0067,0x0067,0x0067,0x0067,0x003e,0x003e,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x0016,0x0016,0x003e,
+	0x003e,0x0016,0x0016,0x0016,0x0016,0x0016,0x0016,0x0016,0x0016,0x0016,0x0016,0x0016,0x0016,0x003e,0x0016,0x0016,0x0016,0x003e,0x0016,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x0036,0x0036,0x0036,0x0036,
+	0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x003e,0x003e,0x0017,0x0017,0x0017,0x0017,
+	0x0017,0x0017,0x0017,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x0017,0x0017,0x0017,0x0017,0x0017,0x003e,0x003e,0x003e,0x003e,0x003e,0x007f,0x0106,0x007f,0x007f,0x007f,0x007f,0x007f,0x007f,0x007f,0x007f,
+	0x007f,0x000a,0x007f,0x007f,0x007f,0x007f,0x007f,0x007f,0x007f,0x003e,0x007f,0x007f,0x007f,0x007f,0x007f,0x003e,0x007f,0x003e,0x007f,0x007f,0x003e,0x007f,0x007f,0x003e,0x007f,0x007f,0x007f,0x007f,0x007f,0x007f,0x007f,0x007f,
+	0x007f,0x007f,0x0081,0x0081,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x0081,0x0081,0x0081,0x0081,0x0081,0x0081,0x0081,0x0081,0x0081,0x0081,0x0081,0x0081,0x0081,0x0081,
+	0x00a8,0x00a9,0x0081,0x0081,0x0081,0x0081,0x0081,0x0081,0x0081,0x0081,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x004d,0x004d,0x004d,0x004d,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,
+	0x003e,0x003e,0x0005,0x0019,0x0019,0x0013,0x0013,0x00a8,0x00a9,0x00a8,0x00a9,0x00a8,0x00a9,0x00a8,0x00a9,0x00a8,0x00a9,0x00a8,0x00a9,0x003e,0x003e,0x003e,0x003e,0x0005,0x0005,0x0005,0x0005,0x0013,0x0013,0x0013,0x000b,0x0005,
+	0x000b,0x003e,0x0005,0x000b,0x0005,0x0005,0x0019,0x00a8,0x00a9,0x00a8,0x00a9,0x00a8,0x00a9,0x0006,0x0005,0x0005,0x000a,0x000c,0x0010,0x0010,0x0010,0x003e,0x0005,0x0007,0x0006,0x0005,0x003e,0x003e,0x003e,0x003e,0x0081,0x0081,
+	0x0081,0x003e,0x0081,0x003e,0x0081,0x0081,0x0081,0x0081,0x0081,0x0081,0x0081,0x0081,0x0081,0x0081,0x0081,0x0081,0x0081,0x003e,0x003e,0x0090,0x003e,0x0005,0x0005,0x0006,0x0007,0x0006,0x0005,0x0005,0x00a8,0x00a9,0x0005,0x000a,
+	0x000b,0x000c,0x000b,0x000d,0x0107,0x0107,0x0107,0x0107,0x0107,0x0107,0x0107,0x0107,0x0107,0x0107,0x000b,0x0005,0x0010,0x0010,0x0010,0x0005,0x0011,0x0011,0x0011,0x0011,0x0011,0x0011,0x0011,0x0011,0x0011,0x0011,0x0011,0x00a8,
+	0x0005,0x00a9,0x0012,0x0013,0x0014,0x0014,0x0014,0x0014,0x0014,0x0014,0x0014,0x0014,0x0014,0x0014,0x0014,0x00a8,0x0010,0x00a9,0x0010,0x003e,0x0005,0x00a8,0x00a9,0x0005,0x0013,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,
+	0x0036,0x0036,0x0036,0x004c,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x004c,0x004c,0x003e,0x003e,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x003e,0x003e,0x0036,
+	0x0036,0x0036,0x0036,0x0036,0x0036,0x003e,0x003e,0x0036,0x0036,0x0036,0x003e,0x003e,0x003e,0x0007,0x0007,0x0010,0x0012,0x0016,0x0007,0x0007,0x003e,0x0016,0x0010,0x0010,0x0010,0x0010,0x0016,0x0016,0x003e,0x003e,0x003e,0x003e,
+	0x003e,0x003e,0x003e,0x003e,0x003e,0x0090,0x0090,0x0090,0x0016,0x0016,0x003e,0x003e
+	};
+static const TUnicodeData TheUnicodeData[] =
+	{ // 264 entries
+	{ 128, 14, 0, 0, 0, 0 },
+	{ 128, 16, 0, 0, 0, 0 },
+	{ 128, 15, 0, 0, 0, 0 },
+	{ 128, 17, 0, 0, 0, 0 },
+	{ 112, 17, 0, 0, 0, 0 },
+	{ 86, 18, 0, 0, 0, 0 },
+	{ 86, 10, 0, 0, 0, 0 },
+	{ 97, 10, 0, 0, 0, 0 },
+	{ 82, 18, 0, 0, 0, 8 },
+	{ 83, 18, 0, 0, 0, 8 },
+	{ 96, 10, 0, 0, 0, 0 },
+	{ 86, 12, 0, 0, 0, 0 },
+	{ 81, 10, 0, 0, 0, 0 },
+	{ 86, 9, 0, 0, 0, 0 },
+	{ 64, 8, 0, -48, 0, 16 },
+	{ 96, 18, 0, 0, 0, 8 },
+	{ 96, 18, 0, 0, 0, 0 },
+	{ 0, 0, 0, 0, 32, 1 },
+	{ 98, 18, 0, 0, 0, 0 },
+	{ 80, 18, 0, 0, 0, 0 },
+	{ 1, 0, 0, 0, 32, 2 },
+	{ 112, 12, 0, 0, 0, 0 },
+	{ 99, 18, 0, 0, 0, 0 },
+	{ 1, 0, 0, 0, 0, 0 },
+	{ 84, 18, 0, 0, 0, 8 },
+	{ 81, 18, 0, 0, 0, 0 },
+	{ 99, 10, 0, 0, 0, 0 },
+	{ 66, 8, 0, 80, 0, 16 },
+	{ 1, 0, 0, 0, -743, 2 },
+	{ 66, 8, 0, 72, 0, 16 },
+	{ 85, 18, 0, 0, 0, 8 },
+	{ 66, 18, 0, 0, 0, 112 },
+	{ 1, 0, 0, 0, -121, 2 },
+	{ 0, 0, 0, 0, 1, 1 },
+	{ 1, 0, 0, 0, 1, 2 },
+	{ 0, 0, 0, 0, -199, 1 },
+	{ 1, 0, 0, 0, 232, 2 },
+	{ 0, 0, 0, 0, -121, 1 },
+	{ 1, 0, 0, 0, 300, 2 },
+	{ 0, 0, 0, 0, 210, 1 },
+	{ 0, 0, 0, 0, 206, 1 },
+	{ 0, 0, 0, 0, 205, 1 },
+	{ 0, 0, 0, 0, 79, 1 },
+	{ 0, 0, 0, 0, 202, 1 },
+	{ 0, 0, 0, 0, 203, 1 },
+	{ 0, 0, 0, 0, 207, 1 },
+	{ 1, 0, 0, 0, -97, 2 },
+	{ 0, 0, 0, 0, 211, 1 },
+	{ 0, 0, 0, 0, 209, 1 },
+	{ 0, 0, 0, 0, 213, 1 },
+	{ 0, 0, 0, 0, 214, 1 },
+	{ 0, 0, 0, 0, 218, 1 },
+	{ 0, 0, 0, 0, 217, 1 },
+	{ 0, 0, 0, 0, 219, 1 },
+	{ 16, 0, 0, 0, 0, 0 },
+	{ 1, 0, 0, 0, -56, 2 },
+	{ 0, 0, 0, 0, 2, 5 },
+	{ 2, 0, 0, 0, 1, 7 },
+	{ 1, 0, 0, 0, 2, 6 },
+	{ 1, 0, 0, 0, 79, 2 },
+	{ 0, 0, 0, 0, -97, 1 },
+	{ 0, 0, 0, 0, -56, 1 },
+	{ 242, 0, 0, 0, 0, 0 },
+	{ 1, 0, 0, 0, 210, 2 },
+	{ 1, 0, 0, 0, 206, 2 },
+	{ 1, 0, 0, 0, 205, 2 },
+	{ 1, 0, 0, 0, 202, 2 },
+	{ 1, 0, 0, 0, 203, 2 },
+	{ 1, 0, 0, 0, 207, 2 },
+	{ 1, 0, 0, 0, 209, 2 },
+	{ 1, 0, 0, 0, 211, 2 },
+	{ 1, 0, 0, 0, 213, 2 },
+	{ 1, 0, 0, 0, 214, 2 },
+	{ 1, 0, 0, 0, 218, 2 },
+	{ 1, 0, 0, 0, 217, 2 },
+	{ 1, 0, 0, 0, 219, 2 },
+	{ 32, 0, 0, 0, 0, 0 },
+	{ 48, 13, 230, 0, 0, 0 },
+	{ 48, 13, 232, 0, 0, 0 },
+	{ 48, 13, 220, 0, 0, 0 },
+	{ 48, 13, 216, 0, 0, 0 },
+	{ 48, 13, 202, 0, 0, 0 },
+	{ 48, 13, 1, 0, 0, 0 },
+	{ 48, 13, 240, 0, -84, 2 },
+	{ 48, 13, 234, 0, 0, 0 },
+	{ 48, 13, 233, 0, 0, 0 },
+	{ 0, 0, 0, 0, 38, 1 },
+	{ 0, 0, 0, 0, 37, 1 },
+	{ 0, 0, 0, 0, 64, 1 },
+	{ 0, 0, 0, 0, 63, 1 },
+	{ 1, 0, 0, 0, 38, 2 },
+	{ 1, 0, 0, 0, 37, 2 },
+	{ 1, 0, 0, 0, 31, 2 },
+	{ 1, 0, 0, 0, 64, 2 },
+	{ 1, 0, 0, 0, 63, 2 },
+	{ 1, 0, 0, 0, 62, 2 },
+	{ 1, 0, 0, 0, 57, 2 },
+	{ 0, 0, 0, 0, 0, 0 },
+	{ 1, 0, 0, 0, 47, 2 },
+	{ 1, 0, 0, 0, 54, 2 },
+	{ 1, 0, 0, 0, 86, 2 },
+	{ 1, 0, 0, 0, 80, 2 },
+	{ 0, 0, 0, 0, 80, 1 },
+	{ 99, 0, 0, 0, 0, 0 },
+	{ 50, 13, 0, 0, 0, 0 },
+	{ 0, 0, 0, 0, 48, 1 },
+	{ 86, 0, 0, 0, 0, 0 },
+	{ 1, 0, 0, 0, 48, 2 },
+	{ 48, 13, 222, 0, 0, 0 },
+	{ 48, 13, 228, 0, 0, 0 },
+	{ 48, 13, 10, 0, 0, 0 },
+	{ 48, 13, 11, 0, 0, 0 },
+	{ 48, 13, 12, 0, 0, 0 },
+	{ 48, 13, 13, 0, 0, 0 },
+	{ 48, 13, 14, 0, 0, 0 },
+	{ 48, 13, 15, 0, 0, 0 },
+	{ 48, 13, 16, 0, 0, 0 },
+	{ 48, 13, 17, 0, 0, 0 },
+	{ 48, 13, 18, 0, 0, 0 },
+	{ 48, 13, 19, 0, 0, 0 },
+	{ 48, 13, 20, 0, 0, 0 },
+	{ 48, 13, 21, 0, 0, 0 },
+	{ 48, 13, 22, 0, 0, 0 },
+	{ 86, 3, 0, 0, 0, 0 },
+	{ 48, 13, 23, 0, 0, 0 },
+	{ 48, 13, 24, 0, 0, 0 },
+	{ 48, 13, 25, 0, 0, 0 },
+	{ 16, 3, 0, 0, 0, 0 },
+	{ 86, 4, 0, 0, 0, 0 },
+	{ 16, 4, 0, 0, 0, 0 },
+	{ 32, 4, 0, 0, 0, 0 },
+	{ 48, 13, 27, 0, 0, 0 },
+	{ 48, 13, 28, 0, 0, 0 },
+	{ 48, 13, 29, 0, 0, 0 },
+	{ 48, 13, 30, 0, 0, 0 },
+	{ 48, 13, 31, 0, 0, 0 },
+	{ 48, 13, 32, 0, 0, 0 },
+	{ 48, 13, 33, 0, 0, 0 },
+	{ 48, 13, 34, 0, 0, 0 },
+	{ 64, 11, 0, -96, 0, 16 },
+	{ 86, 11, 0, 0, 0, 0 },
+	{ 48, 13, 35, 0, 0, 0 },
+	{ 64, 8, 0, 16, 0, 16 },
+	{ 99, 4, 0, 0, 0, 0 },
+	{ 129, 14, 0, 0, 0, 0 },
+	{ 48, 13, 36, 0, 0, 0 },
+	{ 48, 13, 0, 0, 0, 0 },
+	{ 49, 0, 0, 0, 0, 0 },
+	{ 48, 13, 7, 0, 0, 0 },
+	{ 48, 13, 9, 0, 0, 0 },
+	{ 64, 0, 0, -102, 0, 16 },
+	{ 64, 0, 0, 26, 0, 16 },
+	{ 66, 0, 0, 13, 0, 16 },
+	{ 66, 0, 0, 0, 0, 0 },
+	{ 66, 0, 0, 23, 0, 16 },
+	{ 66, 0, 0, 26, 0, 16 },
+	{ 66, 0, 0, 115, 0, 16 },
+	{ 66, 0, 0, 0, 0, 48 },
+	{ 48, 13, 84, 0, 0, 0 },
+	{ 48, 13, 91, 0, 0, 0 },
+	{ 48, 0, 0, 0, 0, 0 },
+	{ 48, 13, 103, 0, 0, 0 },
+	{ 48, 13, 107, 0, 0, 0 },
+	{ 64, 0, 0, -80, 0, 16 },
+	{ 48, 13, 118, 0, 0, 0 },
+	{ 48, 13, 122, 0, 0, 0 },
+	{ 64, 0, 0, 48, 0, 16 },
+	{ 64, 0, 0, -32, 0, 16 },
+	{ 82, 18, 0, 0, 0, 0 },
+	{ 83, 18, 0, 0, 0, 0 },
+	{ 48, 13, 129, 0, 0, 0 },
+	{ 48, 13, 130, 0, 0, 0 },
+	{ 48, 13, 132, 0, 0, 0 },
+	{ 64, 0, 0, -64, 0, 16 },
+	{ 64, 0, 0, -104, 0, 16 },
+	{ 66, 0, 0, -104, 0, 16 },
+	{ 66, 0, 0, -95, 0, 16 },
+	{ 66, 0, 0, -86, 0, 16 },
+	{ 66, 0, 0, -77, 0, 16 },
+	{ 66, 0, 0, -68, 0, 16 },
+	{ 66, 0, 0, -59, 0, 16 },
+	{ 66, 0, 0, -50, 0, 16 },
+	{ 66, 0, 0, -41, 0, 16 },
+	{ 66, 0, 0, -32, 0, 16 },
+	{ 66, 0, 0, -23, 0, 16 },
+	{ 66, 0, 0, 0, 0, 80 },
+	{ 66, 0, 0, 35, 0, 16 },
+	{ 64, 0, 0, 32, 0, 16 },
+	{ 64, 0, 0, -16, 0, 16 },
+	{ 1, 0, 0, 0, 59, 2 },
+	{ 1, 0, 0, 0, -8, 2 },
+	{ 0, 0, 0, 0, -8, 1 },
+	{ 1, 0, 0, 0, -74, 2 },
+	{ 1, 0, 0, 0, -86, 2 },
+	{ 1, 0, 0, 0, -100, 2 },
+	{ 1, 0, 0, 0, -128, 2 },
+	{ 1, 0, 0, 0, -112, 2 },
+	{ 1, 0, 0, 0, -126, 2 },
+	{ 2, 0, 0, 0, -8, 1 },
+	{ 1, 0, 0, 0, -9, 2 },
+	{ 0, 0, 0, 0, -74, 1 },
+	{ 2, 0, 0, 0, -9, 1 },
+	{ 1, 0, 0, 0, 7205, 2 },
+	{ 0, 0, 0, 0, -86, 1 },
+	{ 0, 0, 0, 0, -100, 1 },
+	{ 1, 0, 0, 0, -7, 2 },
+	{ 0, 0, 0, 0, -112, 1 },
+	{ 0, 0, 0, 0, -7, 1 },
+	{ 0, 0, 0, 0, -128, 1 },
+	{ 0, 0, 0, 0, -126, 1 },
+	{ 112, 14, 0, 0, 0, 0 },
+	{ 129, 0, 0, 0, 0, 0 },
+	{ 129, 3, 0, 0, 0, 0 },
+	{ 84, 18, 0, 0, 0, 0 },
+	{ 85, 18, 0, 0, 0, 0 },
+	{ 113, 17, 0, 0, 0, 0 },
+	{ 114, 15, 0, 0, 0, 0 },
+	{ 129, 1, 0, 0, 0, 0 },
+	{ 129, 5, 0, 0, 0, 0 },
+	{ 129, 7, 0, 0, 0, 0 },
+	{ 129, 2, 0, 0, 0, 0 },
+	{ 129, 6, 0, 0, 0, 0 },
+	{ 66, 8, 0, -112, 0, 16 },
+	{ 66, 8, 0, -128, 0, 16 },
+	{ 0, 0, 0, 0, -7517, 1 },
+	{ 0, 0, 0, 0, -8383, 1 },
+	{ 0, 0, 0, 0, -8262, 1 },
+	{ 66, 18, 0, -94, 0, 16 },
+	{ 65, 0, 0, -95, 16, 17 },
+	{ 65, 0, 0, -58, 16, 17 },
+	{ 65, 0, 0, -9, 16, 17 },
+	{ 65, 0, 0, 0, 16, 33 },
+	{ 65, 0, 0, 0, 16, 49 },
+	{ 65, 0, 0, -111, 16, 18 },
+	{ 65, 0, 0, -74, 16, 18 },
+	{ 65, 0, 0, -25, 16, 18 },
+	{ 65, 0, 0, 0, 16, 34 },
+	{ 65, 0, 0, 0, 16, 50 },
+	{ 65, 0, 0, 0, 0, 48 },
+	{ 65, 0, 0, 0, 0, 64 },
+	{ 65, 0, 0, 0, 0, 80 },
+	{ 65, 0, 0, 0, 0, 0 },
+	{ 66, 8, 0, -95, 0, 16 },
+	{ 66, 8, 0, -115, 0, 16 },
+	{ 66, 8, 0, 121, 0, 16 },
+	{ 99, 0, 0, 0, 26, 1 },
+	{ 99, 0, 0, 0, 26, 2 },
+	{ 66, 8, 0, 22, 0, 16 },
+	{ 66, 18, 0, -117, 0, 16 },
+	{ 66, 18, 0, -127, 0, 16 },
+	{ 66, 18, 0, 119, 0, 16 },
+	{ 65, 0, 0, -7, 0, 16 },
+	{ 65, 0, 0, -32, 0, 16 },
+	{ 48, 13, 218, 0, 0, 0 },
+	{ 48, 13, 224, 0, 0, 0 },
+	{ 65, 0, 0, -46, 0, 16 },
+	{ 65, 0, 0, -37, 0, 16 },
+	{ 65, 0, 0, -28, 0, 16 },
+	{ 48, 13, 8, 0, 0, 0 },
+	{ 66, 0, 0, -127, 0, 16 },
+	{ 240, 0, 0, 0, 0, 0 },
+	{ 241, 0, 0, 0, 0, 0 },
+	{ 48, 13, 26, 0, 0, 0 },
+	{ 64, 8, 0, -16, 0, 16 }
+	};
+
+const TStandardUnicodeDataSet TheStandardUnicodeDataSet =
+	{
+	TheTrieIndex1,
+	TheTrieIndex2,
+	TheUnicodeData
+	};
+
+const TUint16 TheUnicodeCompositionBuffer[] = 
+	{ // 4921 entries
+	0x00c0,0x0002,0x0041,0x0300,0x00c1,0x0002,0x0041,0x0301,
+	0x00c2,0x0002,0x0041,0x0302,0x00c3,0x0002,0x0041,0x0303,
+	0x00c4,0x0002,0x0041,0x0308,0x00c5,0x0002,0x0041,0x030a,
+	0x00c7,0x0002,0x0043,0x0327,0x00c8,0x0002,0x0045,0x0300,
+	0x00c9,0x0002,0x0045,0x0301,0x00ca,0x0002,0x0045,0x0302,
+	0x00cb,0x0002,0x0045,0x0308,0x00cc,0x0002,0x0049,0x0300,
+	0x00cd,0x0002,0x0049,0x0301,0x00ce,0x0002,0x0049,0x0302,
+	0x00cf,0x0002,0x0049,0x0308,0x00d1,0x0002,0x004e,0x0303,
+	0x00d2,0x0002,0x004f,0x0300,0x00d3,0x0002,0x004f,0x0301,
+	0x00d4,0x0002,0x004f,0x0302,0x00d5,0x0002,0x004f,0x0303,
+	0x00d6,0x0002,0x004f,0x0308,0x00d9,0x0002,0x0055,0x0300,
+	0x00da,0x0002,0x0055,0x0301,0x00db,0x0002,0x0055,0x0302,
+	0x00dc,0x0002,0x0055,0x0308,0x00dd,0x0002,0x0059,0x0301,
+	0x00e0,0x0002,0x0061,0x0300,0x00e1,0x0002,0x0061,0x0301,
+	0x00e2,0x0002,0x0061,0x0302,0x00e3,0x0002,0x0061,0x0303,
+	0x00e4,0x0002,0x0061,0x0308,0x00e5,0x0002,0x0061,0x030a,
+	0x00e7,0x0002,0x0063,0x0327,0x00e8,0x0002,0x0065,0x0300,
+	0x00e9,0x0002,0x0065,0x0301,0x00ea,0x0002,0x0065,0x0302,
+	0x00eb,0x0002,0x0065,0x0308,0x00ec,0x0002,0x0069,0x0300,
+	0x00ed,0x0002,0x0069,0x0301,0x00ee,0x0002,0x0069,0x0302,
+	0x00ef,0x0002,0x0069,0x0308,0x00f1,0x0002,0x006e,0x0303,
+	0x00f2,0x0002,0x006f,0x0300,0x00f3,0x0002,0x006f,0x0301,
+	0x00f4,0x0002,0x006f,0x0302,0x00f5,0x0002,0x006f,0x0303,
+	0x00f6,0x0002,0x006f,0x0308,0x00f9,0x0002,0x0075,0x0300,
+	0x00fa,0x0002,0x0075,0x0301,0x00fb,0x0002,0x0075,0x0302,
+	0x00fc,0x0002,0x0075,0x0308,0x00fd,0x0002,0x0079,0x0301,
+	0x00ff,0x0002,0x0079,0x0308,0x0100,0x0002,0x0041,0x0304,
+	0x0101,0x0002,0x0061,0x0304,0x0102,0x0002,0x0041,0x0306,
+	0x0103,0x0002,0x0061,0x0306,0x0104,0x0002,0x0041,0x0328,
+	0x0105,0x0002,0x0061,0x0328,0x0106,0x0002,0x0043,0x0301,
+	0x0107,0x0002,0x0063,0x0301,0x0108,0x0002,0x0043,0x0302,
+	0x0109,0x0002,0x0063,0x0302,0x010a,0x0002,0x0043,0x0307,
+	0x010b,0x0002,0x0063,0x0307,0x010c,0x0002,0x0043,0x030c,
+	0x010d,0x0002,0x0063,0x030c,0x010e,0x0002,0x0044,0x030c,
+	0x010f,0x0002,0x0064,0x030c,0x0112,0x0002,0x0045,0x0304,
+	0x0113,0x0002,0x0065,0x0304,0x0114,0x0002,0x0045,0x0306,
+	0x0115,0x0002,0x0065,0x0306,0x0116,0x0002,0x0045,0x0307,
+	0x0117,0x0002,0x0065,0x0307,0x0118,0x0002,0x0045,0x0328,
+	0x0119,0x0002,0x0065,0x0328,0x011a,0x0002,0x0045,0x030c,
+	0x011b,0x0002,0x0065,0x030c,0x011c,0x0002,0x0047,0x0302,
+	0x011d,0x0002,0x0067,0x0302,0x011e,0x0002,0x0047,0x0306,
+	0x011f,0x0002,0x0067,0x0306,0x0120,0x0002,0x0047,0x0307,
+	0x0121,0x0002,0x0067,0x0307,0x0122,0x0002,0x0047,0x0327,
+	0x0123,0x0002,0x0067,0x0327,0x0124,0x0002,0x0048,0x0302,
+	0x0125,0x0002,0x0068,0x0302,0x0128,0x0002,0x0049,0x0303,
+	0x0129,0x0002,0x0069,0x0303,0x012a,0x0002,0x0049,0x0304,
+	0x012b,0x0002,0x0069,0x0304,0x012c,0x0002,0x0049,0x0306,
+	0x012d,0x0002,0x0069,0x0306,0x012e,0x0002,0x0049,0x0328,
+	0x012f,0x0002,0x0069,0x0328,0x0130,0x0002,0x0049,0x0307,
+	0x0134,0x0002,0x004a,0x0302,0x0135,0x0002,0x006a,0x0302,
+	0x0136,0x0002,0x004b,0x0327,0x0137,0x0002,0x006b,0x0327,
+	0x0139,0x0002,0x004c,0x0301,0x013a,0x0002,0x006c,0x0301,
+	0x013b,0x0002,0x004c,0x0327,0x013c,0x0002,0x006c,0x0327,
+	0x013d,0x0002,0x004c,0x030c,0x013e,0x0002,0x006c,0x030c,
+	0x0143,0x0002,0x004e,0x0301,0x0144,0x0002,0x006e,0x0301,
+	0x0145,0x0002,0x004e,0x0327,0x0146,0x0002,0x006e,0x0327,
+	0x0147,0x0002,0x004e,0x030c,0x0148,0x0002,0x006e,0x030c,
+	0x014c,0x0002,0x004f,0x0304,0x014d,0x0002,0x006f,0x0304,
+	0x014e,0x0002,0x004f,0x0306,0x014f,0x0002,0x006f,0x0306,
+	0x0150,0x0002,0x004f,0x030b,0x0151,0x0002,0x006f,0x030b,
+	0x0154,0x0002,0x0052,0x0301,0x0155,0x0002,0x0072,0x0301,
+	0x0156,0x0002,0x0052,0x0327,0x0157,0x0002,0x0072,0x0327,
+	0x0158,0x0002,0x0052,0x030c,0x0159,0x0002,0x0072,0x030c,
+	0x015a,0x0002,0x0053,0x0301,0x015b,0x0002,0x0073,0x0301,
+	0x015c,0x0002,0x0053,0x0302,0x015d,0x0002,0x0073,0x0302,
+	0x015e,0x0002,0x0053,0x0327,0x015f,0x0002,0x0073,0x0327,
+	0x0160,0x0002,0x0053,0x030c,0x0161,0x0002,0x0073,0x030c,
+	0x0162,0x0002,0x0054,0x0327,0x0163,0x0002,0x0074,0x0327,
+	0x0164,0x0002,0x0054,0x030c,0x0165,0x0002,0x0074,0x030c,
+	0x0168,0x0002,0x0055,0x0303,0x0169,0x0002,0x0075,0x0303,
+	0x016a,0x0002,0x0055,0x0304,0x016b,0x0002,0x0075,0x0304,
+	0x016c,0x0002,0x0055,0x0306,0x016d,0x0002,0x0075,0x0306,
+	0x016e,0x0002,0x0055,0x030a,0x016f,0x0002,0x0075,0x030a,
+	0x0170,0x0002,0x0055,0x030b,0x0171,0x0002,0x0075,0x030b,
+	0x0172,0x0002,0x0055,0x0328,0x0173,0x0002,0x0075,0x0328,
+	0x0174,0x0002,0x0057,0x0302,0x0175,0x0002,0x0077,0x0302,
+	0x0176,0x0002,0x0059,0x0302,0x0177,0x0002,0x0079,0x0302,
+	0x0178,0x0002,0x0059,0x0308,0x0179,0x0002,0x005a,0x0301,
+	0x017a,0x0002,0x007a,0x0301,0x017b,0x0002,0x005a,0x0307,
+	0x017c,0x0002,0x007a,0x0307,0x017d,0x0002,0x005a,0x030c,
+	0x017e,0x0002,0x007a,0x030c,0x01a0,0x0002,0x004f,0x031b,
+	0x01a1,0x0002,0x006f,0x031b,0x01af,0x0002,0x0055,0x031b,
+	0x01b0,0x0002,0x0075,0x031b,0x01cd,0x0002,0x0041,0x030c,
+	0x01ce,0x0002,0x0061,0x030c,0x01cf,0x0002,0x0049,0x030c,
+	0x01d0,0x0002,0x0069,0x030c,0x01d1,0x0002,0x004f,0x030c,
+	0x01d2,0x0002,0x006f,0x030c,0x01d3,0x0002,0x0055,0x030c,
+	0x01d4,0x0002,0x0075,0x030c,0x01d5,0x0002,0x00dc,0x0304,
+	0x01d6,0x0002,0x00fc,0x0304,0x01d7,0x0002,0x00dc,0x0301,
+	0x01d8,0x0002,0x00fc,0x0301,0x01d9,0x0002,0x00dc,0x030c,
+	0x01da,0x0002,0x00fc,0x030c,0x01db,0x0002,0x00dc,0x0300,
+	0x01dc,0x0002,0x00fc,0x0300,0x01de,0x0002,0x00c4,0x0304,
+	0x01df,0x0002,0x00e4,0x0304,0x01e0,0x0002,0x0226,0x0304,
+	0x01e1,0x0002,0x0227,0x0304,0x01e2,0x0002,0x00c6,0x0304,
+	0x01e3,0x0002,0x00e6,0x0304,0x01e6,0x0002,0x0047,0x030c,
+	0x01e7,0x0002,0x0067,0x030c,0x01e8,0x0002,0x004b,0x030c,
+	0x01e9,0x0002,0x006b,0x030c,0x01ea,0x0002,0x004f,0x0328,
+	0x01eb,0x0002,0x006f,0x0328,0x01ec,0x0002,0x01ea,0x0304,
+	0x01ed,0x0002,0x01eb,0x0304,0x01ee,0x0002,0x01b7,0x030c,
+	0x01ef,0x0002,0x0292,0x030c,0x01f0,0x0002,0x006a,0x030c,
+	0x01f4,0x0002,0x0047,0x0301,0x01f5,0x0002,0x0067,0x0301,
+	0x01f8,0x0002,0x004e,0x0300,0x01f9,0x0002,0x006e,0x0300,
+	0x01fa,0x0002,0x00c5,0x0301,0x01fb,0x0002,0x00e5,0x0301,
+	0x01fc,0x0002,0x00c6,0x0301,0x01fd,0x0002,0x00e6,0x0301,
+	0x01fe,0x0002,0x00d8,0x0301,0x01ff,0x0002,0x00f8,0x0301,
+	0x0200,0x0002,0x0041,0x030f,0x0201,0x0002,0x0061,0x030f,
+	0x0202,0x0002,0x0041,0x0311,0x0203,0x0002,0x0061,0x0311,
+	0x0204,0x0002,0x0045,0x030f,0x0205,0x0002,0x0065,0x030f,
+	0x0206,0x0002,0x0045,0x0311,0x0207,0x0002,0x0065,0x0311,
+	0x0208,0x0002,0x0049,0x030f,0x0209,0x0002,0x0069,0x030f,
+	0x020a,0x0002,0x0049,0x0311,0x020b,0x0002,0x0069,0x0311,
+	0x020c,0x0002,0x004f,0x030f,0x020d,0x0002,0x006f,0x030f,
+	0x020e,0x0002,0x004f,0x0311,0x020f,0x0002,0x006f,0x0311,
+	0x0210,0x0002,0x0052,0x030f,0x0211,0x0002,0x0072,0x030f,
+	0x0212,0x0002,0x0052,0x0311,0x0213,0x0002,0x0072,0x0311,
+	0x0214,0x0002,0x0055,0x030f,0x0215,0x0002,0x0075,0x030f,
+	0x0216,0x0002,0x0055,0x0311,0x0217,0x0002,0x0075,0x0311,
+	0x0218,0x0002,0x0053,0x0326,0x0219,0x0002,0x0073,0x0326,
+	0x021a,0x0002,0x0054,0x0326,0x021b,0x0002,0x0074,0x0326,
+	0x021e,0x0002,0x0048,0x030c,0x021f,0x0002,0x0068,0x030c,
+	0x0226,0x0002,0x0041,0x0307,0x0227,0x0002,0x0061,0x0307,
+	0x0228,0x0002,0x0045,0x0327,0x0229,0x0002,0x0065,0x0327,
+	0x022a,0x0002,0x00d6,0x0304,0x022b,0x0002,0x00f6,0x0304,
+	0x022c,0x0002,0x00d5,0x0304,0x022d,0x0002,0x00f5,0x0304,
+	0x022e,0x0002,0x004f,0x0307,0x022f,0x0002,0x006f,0x0307,
+	0x0230,0x0002,0x022e,0x0304,0x0231,0x0002,0x022f,0x0304,
+	0x0232,0x0002,0x0059,0x0304,0x0233,0x0002,0x0079,0x0304,
+	0x0340,0x0001,0x0300,0x0341,0x0001,0x0301,0x0343,0x0001,
+	0x0313,0x0344,0x0002,0x0308,0x0301,0x0374,0x0001,0x02b9,
+	0x037e,0x0001,0x003b,0x0385,0x0002,0x00a8,0x0301,0x0386,
+	0x0002,0x0391,0x0301,0x0387,0x0001,0x00b7,0x0388,0x0002,
+	0x0395,0x0301,0x0389,0x0002,0x0397,0x0301,0x038a,0x0002,
+	0x0399,0x0301,0x038c,0x0002,0x039f,0x0301,0x038e,0x0002,
+	0x03a5,0x0301,0x038f,0x0002,0x03a9,0x0301,0x0390,0x0002,
+	0x03ca,0x0301,0x03aa,0x0002,0x0399,0x0308,0x03ab,0x0002,
+	0x03a5,0x0308,0x03ac,0x0002,0x03b1,0x0301,0x03ad,0x0002,
+	0x03b5,0x0301,0x03ae,0x0002,0x03b7,0x0301,0x03af,0x0002,
+	0x03b9,0x0301,0x03b0,0x0002,0x03cb,0x0301,0x03ca,0x0002,
+	0x03b9,0x0308,0x03cb,0x0002,0x03c5,0x0308,0x03cc,0x0002,
+	0x03bf,0x0301,0x03cd,0x0002,0x03c5,0x0301,0x03ce,0x0002,
+	0x03c9,0x0301,0x03d3,0x0002,0x03d2,0x0301,0x03d4,0x0002,
+	0x03d2,0x0308,0x0400,0x0002,0x0415,0x0300,0x0401,0x0002,
+	0x0415,0x0308,0x0403,0x0002,0x0413,0x0301,0x0407,0x0002,
+	0x0406,0x0308,0x040c,0x0002,0x041a,0x0301,0x040d,0x0002,
+	0x0418,0x0300,0x040e,0x0002,0x0423,0x0306,0x0419,0x0002,
+	0x0418,0x0306,0x0439,0x0002,0x0438,0x0306,0x0450,0x0002,
+	0x0435,0x0300,0x0451,0x0002,0x0435,0x0308,0x0453,0x0002,
+	0x0433,0x0301,0x0457,0x0002,0x0456,0x0308,0x045c,0x0002,
+	0x043a,0x0301,0x045d,0x0002,0x0438,0x0300,0x045e,0x0002,
+	0x0443,0x0306,0x0476,0x0002,0x0474,0x030f,0x0477,0x0002,
+	0x0475,0x030f,0x04c1,0x0002,0x0416,0x0306,0x04c2,0x0002,
+	0x0436,0x0306,0x04d0,0x0002,0x0410,0x0306,0x04d1,0x0002,
+	0x0430,0x0306,0x04d2,0x0002,0x0410,0x0308,0x04d3,0x0002,
+	0x0430,0x0308,0x04d6,0x0002,0x0415,0x0306,0x04d7,0x0002,
+	0x0435,0x0306,0x04da,0x0002,0x04d8,0x0308,0x04db,0x0002,
+	0x04d9,0x0308,0x04dc,0x0002,0x0416,0x0308,0x04dd,0x0002,
+	0x0436,0x0308,0x04de,0x0002,0x0417,0x0308,0x04df,0x0002,
+	0x0437,0x0308,0x04e2,0x0002,0x0418,0x0304,0x04e3,0x0002,
+	0x0438,0x0304,0x04e4,0x0002,0x0418,0x0308,0x04e5,0x0002,
+	0x0438,0x0308,0x04e6,0x0002,0x041e,0x0308,0x04e7,0x0002,
+	0x043e,0x0308,0x04ea,0x0002,0x04e8,0x0308,0x04eb,0x0002,
+	0x04e9,0x0308,0x04ec,0x0002,0x042d,0x0308,0x04ed,0x0002,
+	0x044d,0x0308,0x04ee,0x0002,0x0423,0x0304,0x04ef,0x0002,
+	0x0443,0x0304,0x04f0,0x0002,0x0423,0x0308,0x04f1,0x0002,
+	0x0443,0x0308,0x04f2,0x0002,0x0423,0x030b,0x04f3,0x0002,
+	0x0443,0x030b,0x04f4,0x0002,0x0427,0x0308,0x04f5,0x0002,
+	0x0447,0x0308,0x04f8,0x0002,0x042b,0x0308,0x04f9,0x0002,
+	0x044b,0x0308,0x0622,0x0002,0x0627,0x0653,0x0623,0x0002,
+	0x0627,0x0654,0x0624,0x0002,0x0648,0x0654,0x0625,0x0002,
+	0x0627,0x0655,0x0626,0x0002,0x064a,0x0654,0x06c0,0x0002,
+	0x06d5,0x0654,0x06c2,0x0002,0x06c1,0x0654,0x06d3,0x0002,
+	0x06d2,0x0654,0x0929,0x0002,0x0928,0x093c,0x0931,0x0002,
+	0x0930,0x093c,0x0934,0x0002,0x0933,0x093c,0x0958,0x0002,
+	0x0915,0x093c,0x0959,0x0002,0x0916,0x093c,0x095a,0x0002,
+	0x0917,0x093c,0x095b,0x0002,0x091c,0x093c,0x095c,0x0002,
+	0x0921,0x093c,0x095d,0x0002,0x0922,0x093c,0x095e,0x0002,
+	0x092b,0x093c,0x095f,0x0002,0x092f,0x093c,0x09cb,0x0002,
+	0x09c7,0x09be,0x09cc,0x0002,0x09c7,0x09d7,0x09dc,0x0002,
+	0x09a1,0x09bc,0x09dd,0x0002,0x09a2,0x09bc,0x09df,0x0002,
+	0x09af,0x09bc,0x0a33,0x0002,0x0a32,0x0a3c,0x0a36,0x0002,
+	0x0a38,0x0a3c,0x0a59,0x0002,0x0a16,0x0a3c,0x0a5a,0x0002,
+	0x0a17,0x0a3c,0x0a5b,0x0002,0x0a1c,0x0a3c,0x0a5e,0x0002,
+	0x0a2b,0x0a3c,0x0b48,0x0002,0x0b47,0x0b56,0x0b4b,0x0002,
+	0x0b47,0x0b3e,0x0b4c,0x0002,0x0b47,0x0b57,0x0b5c,0x0002,
+	0x0b21,0x0b3c,0x0b5d,0x0002,0x0b22,0x0b3c,0x0b94,0x0002,
+	0x0b92,0x0bd7,0x0bca,0x0002,0x0bc6,0x0bbe,0x0bcb,0x0002,
+	0x0bc7,0x0bbe,0x0bcc,0x0002,0x0bc6,0x0bd7,0x0c48,0x0002,
+	0x0c46,0x0c56,0x0cc0,0x0002,0x0cbf,0x0cd5,0x0cc7,0x0002,
+	0x0cc6,0x0cd5,0x0cc8,0x0002,0x0cc6,0x0cd6,0x0cca,0x0002,
+	0x0cc6,0x0cc2,0x0ccb,0x0002,0x0cca,0x0cd5,0x0d4a,0x0002,
+	0x0d46,0x0d3e,0x0d4b,0x0002,0x0d47,0x0d3e,0x0d4c,0x0002,
+	0x0d46,0x0d57,0x0dda,0x0002,0x0dd9,0x0dca,0x0ddc,0x0002,
+	0x0dd9,0x0dcf,0x0ddd,0x0002,0x0ddc,0x0dca,0x0dde,0x0002,
+	0x0dd9,0x0ddf,0x0f43,0x0002,0x0f42,0x0fb7,0x0f4d,0x0002,
+	0x0f4c,0x0fb7,0x0f52,0x0002,0x0f51,0x0fb7,0x0f57,0x0002,
+	0x0f56,0x0fb7,0x0f5c,0x0002,0x0f5b,0x0fb7,0x0f69,0x0002,
+	0x0f40,0x0fb5,0x0f73,0x0002,0x0f71,0x0f72,0x0f75,0x0002,
+	0x0f71,0x0f74,0x0f76,0x0002,0x0fb2,0x0f80,0x0f78,0x0002,
+	0x0fb3,0x0f80,0x0f81,0x0002,0x0f71,0x0f80,0x0f93,0x0002,
+	0x0f92,0x0fb7,0x0f9d,0x0002,0x0f9c,0x0fb7,0x0fa2,0x0002,
+	0x0fa1,0x0fb7,0x0fa7,0x0002,0x0fa6,0x0fb7,0x0fac,0x0002,
+	0x0fab,0x0fb7,0x0fb9,0x0002,0x0f90,0x0fb5,0x1026,0x0002,
+	0x1025,0x102e,0x1e00,0x0002,0x0041,0x0325,0x1e01,0x0002,
+	0x0061,0x0325,0x1e02,0x0002,0x0042,0x0307,0x1e03,0x0002,
+	0x0062,0x0307,0x1e04,0x0002,0x0042,0x0323,0x1e05,0x0002,
+	0x0062,0x0323,0x1e06,0x0002,0x0042,0x0331,0x1e07,0x0002,
+	0x0062,0x0331,0x1e08,0x0002,0x00c7,0x0301,0x1e09,0x0002,
+	0x00e7,0x0301,0x1e0a,0x0002,0x0044,0x0307,0x1e0b,0x0002,
+	0x0064,0x0307,0x1e0c,0x0002,0x0044,0x0323,0x1e0d,0x0002,
+	0x0064,0x0323,0x1e0e,0x0002,0x0044,0x0331,0x1e0f,0x0002,
+	0x0064,0x0331,0x1e10,0x0002,0x0044,0x0327,0x1e11,0x0002,
+	0x0064,0x0327,0x1e12,0x0002,0x0044,0x032d,0x1e13,0x0002,
+	0x0064,0x032d,0x1e14,0x0002,0x0112,0x0300,0x1e15,0x0002,
+	0x0113,0x0300,0x1e16,0x0002,0x0112,0x0301,0x1e17,0x0002,
+	0x0113,0x0301,0x1e18,0x0002,0x0045,0x032d,0x1e19,0x0002,
+	0x0065,0x032d,0x1e1a,0x0002,0x0045,0x0330,0x1e1b,0x0002,
+	0x0065,0x0330,0x1e1c,0x0002,0x0228,0x0306,0x1e1d,0x0002,
+	0x0229,0x0306,0x1e1e,0x0002,0x0046,0x0307,0x1e1f,0x0002,
+	0x0066,0x0307,0x1e20,0x0002,0x0047,0x0304,0x1e21,0x0002,
+	0x0067,0x0304,0x1e22,0x0002,0x0048,0x0307,0x1e23,0x0002,
+	0x0068,0x0307,0x1e24,0x0002,0x0048,0x0323,0x1e25,0x0002,
+	0x0068,0x0323,0x1e26,0x0002,0x0048,0x0308,0x1e27,0x0002,
+	0x0068,0x0308,0x1e28,0x0002,0x0048,0x0327,0x1e29,0x0002,
+	0x0068,0x0327,0x1e2a,0x0002,0x0048,0x032e,0x1e2b,0x0002,
+	0x0068,0x032e,0x1e2c,0x0002,0x0049,0x0330,0x1e2d,0x0002,
+	0x0069,0x0330,0x1e2e,0x0002,0x00cf,0x0301,0x1e2f,0x0002,
+	0x00ef,0x0301,0x1e30,0x0002,0x004b,0x0301,0x1e31,0x0002,
+	0x006b,0x0301,0x1e32,0x0002,0x004b,0x0323,0x1e33,0x0002,
+	0x006b,0x0323,0x1e34,0x0002,0x004b,0x0331,0x1e35,0x0002,
+	0x006b,0x0331,0x1e36,0x0002,0x004c,0x0323,0x1e37,0x0002,
+	0x006c,0x0323,0x1e38,0x0002,0x1e36,0x0304,0x1e39,0x0002,
+	0x1e37,0x0304,0x1e3a,0x0002,0x004c,0x0331,0x1e3b,0x0002,
+	0x006c,0x0331,0x1e3c,0x0002,0x004c,0x032d,0x1e3d,0x0002,
+	0x006c,0x032d,0x1e3e,0x0002,0x004d,0x0301,0x1e3f,0x0002,
+	0x006d,0x0301,0x1e40,0x0002,0x004d,0x0307,0x1e41,0x0002,
+	0x006d,0x0307,0x1e42,0x0002,0x004d,0x0323,0x1e43,0x0002,
+	0x006d,0x0323,0x1e44,0x0002,0x004e,0x0307,0x1e45,0x0002,
+	0x006e,0x0307,0x1e46,0x0002,0x004e,0x0323,0x1e47,0x0002,
+	0x006e,0x0323,0x1e48,0x0002,0x004e,0x0331,0x1e49,0x0002,
+	0x006e,0x0331,0x1e4a,0x0002,0x004e,0x032d,0x1e4b,0x0002,
+	0x006e,0x032d,0x1e4c,0x0002,0x00d5,0x0301,0x1e4d,0x0002,
+	0x00f5,0x0301,0x1e4e,0x0002,0x00d5,0x0308,0x1e4f,0x0002,
+	0x00f5,0x0308,0x1e50,0x0002,0x014c,0x0300,0x1e51,0x0002,
+	0x014d,0x0300,0x1e52,0x0002,0x014c,0x0301,0x1e53,0x0002,
+	0x014d,0x0301,0x1e54,0x0002,0x0050,0x0301,0x1e55,0x0002,
+	0x0070,0x0301,0x1e56,0x0002,0x0050,0x0307,0x1e57,0x0002,
+	0x0070,0x0307,0x1e58,0x0002,0x0052,0x0307,0x1e59,0x0002,
+	0x0072,0x0307,0x1e5a,0x0002,0x0052,0x0323,0x1e5b,0x0002,
+	0x0072,0x0323,0x1e5c,0x0002,0x1e5a,0x0304,0x1e5d,0x0002,
+	0x1e5b,0x0304,0x1e5e,0x0002,0x0052,0x0331,0x1e5f,0x0002,
+	0x0072,0x0331,0x1e60,0x0002,0x0053,0x0307,0x1e61,0x0002,
+	0x0073,0x0307,0x1e62,0x0002,0x0053,0x0323,0x1e63,0x0002,
+	0x0073,0x0323,0x1e64,0x0002,0x015a,0x0307,0x1e65,0x0002,
+	0x015b,0x0307,0x1e66,0x0002,0x0160,0x0307,0x1e67,0x0002,
+	0x0161,0x0307,0x1e68,0x0002,0x1e62,0x0307,0x1e69,0x0002,
+	0x1e63,0x0307,0x1e6a,0x0002,0x0054,0x0307,0x1e6b,0x0002,
+	0x0074,0x0307,0x1e6c,0x0002,0x0054,0x0323,0x1e6d,0x0002,
+	0x0074,0x0323,0x1e6e,0x0002,0x0054,0x0331,0x1e6f,0x0002,
+	0x0074,0x0331,0x1e70,0x0002,0x0054,0x032d,0x1e71,0x0002,
+	0x0074,0x032d,0x1e72,0x0002,0x0055,0x0324,0x1e73,0x0002,
+	0x0075,0x0324,0x1e74,0x0002,0x0055,0x0330,0x1e75,0x0002,
+	0x0075,0x0330,0x1e76,0x0002,0x0055,0x032d,0x1e77,0x0002,
+	0x0075,0x032d,0x1e78,0x0002,0x0168,0x0301,0x1e79,0x0002,
+	0x0169,0x0301,0x1e7a,0x0002,0x016a,0x0308,0x1e7b,0x0002,
+	0x016b,0x0308,0x1e7c,0x0002,0x0056,0x0303,0x1e7d,0x0002,
+	0x0076,0x0303,0x1e7e,0x0002,0x0056,0x0323,0x1e7f,0x0002,
+	0x0076,0x0323,0x1e80,0x0002,0x0057,0x0300,0x1e81,0x0002,
+	0x0077,0x0300,0x1e82,0x0002,0x0057,0x0301,0x1e83,0x0002,
+	0x0077,0x0301,0x1e84,0x0002,0x0057,0x0308,0x1e85,0x0002,
+	0x0077,0x0308,0x1e86,0x0002,0x0057,0x0307,0x1e87,0x0002,
+	0x0077,0x0307,0x1e88,0x0002,0x0057,0x0323,0x1e89,0x0002,
+	0x0077,0x0323,0x1e8a,0x0002,0x0058,0x0307,0x1e8b,0x0002,
+	0x0078,0x0307,0x1e8c,0x0002,0x0058,0x0308,0x1e8d,0x0002,
+	0x0078,0x0308,0x1e8e,0x0002,0x0059,0x0307,0x1e8f,0x0002,
+	0x0079,0x0307,0x1e90,0x0002,0x005a,0x0302,0x1e91,0x0002,
+	0x007a,0x0302,0x1e92,0x0002,0x005a,0x0323,0x1e93,0x0002,
+	0x007a,0x0323,0x1e94,0x0002,0x005a,0x0331,0x1e95,0x0002,
+	0x007a,0x0331,0x1e96,0x0002,0x0068,0x0331,0x1e97,0x0002,
+	0x0074,0x0308,0x1e98,0x0002,0x0077,0x030a,0x1e99,0x0002,
+	0x0079,0x030a,0x1e9b,0x0002,0x017f,0x0307,0x1ea0,0x0002,
+	0x0041,0x0323,0x1ea1,0x0002,0x0061,0x0323,0x1ea2,0x0002,
+	0x0041,0x0309,0x1ea3,0x0002,0x0061,0x0309,0x1ea4,0x0002,
+	0x00c2,0x0301,0x1ea5,0x0002,0x00e2,0x0301,0x1ea6,0x0002,
+	0x00c2,0x0300,0x1ea7,0x0002,0x00e2,0x0300,0x1ea8,0x0002,
+	0x00c2,0x0309,0x1ea9,0x0002,0x00e2,0x0309,0x1eaa,0x0002,
+	0x00c2,0x0303,0x1eab,0x0002,0x00e2,0x0303,0x1eac,0x0002,
+	0x1ea0,0x0302,0x1ead,0x0002,0x1ea1,0x0302,0x1eae,0x0002,
+	0x0102,0x0301,0x1eaf,0x0002,0x0103,0x0301,0x1eb0,0x0002,
+	0x0102,0x0300,0x1eb1,0x0002,0x0103,0x0300,0x1eb2,0x0002,
+	0x0102,0x0309,0x1eb3,0x0002,0x0103,0x0309,0x1eb4,0x0002,
+	0x0102,0x0303,0x1eb5,0x0002,0x0103,0x0303,0x1eb6,0x0002,
+	0x1ea0,0x0306,0x1eb7,0x0002,0x1ea1,0x0306,0x1eb8,0x0002,
+	0x0045,0x0323,0x1eb9,0x0002,0x0065,0x0323,0x1eba,0x0002,
+	0x0045,0x0309,0x1ebb,0x0002,0x0065,0x0309,0x1ebc,0x0002,
+	0x0045,0x0303,0x1ebd,0x0002,0x0065,0x0303,0x1ebe,0x0002,
+	0x00ca,0x0301,0x1ebf,0x0002,0x00ea,0x0301,0x1ec0,0x0002,
+	0x00ca,0x0300,0x1ec1,0x0002,0x00ea,0x0300,0x1ec2,0x0002,
+	0x00ca,0x0309,0x1ec3,0x0002,0x00ea,0x0309,0x1ec4,0x0002,
+	0x00ca,0x0303,0x1ec5,0x0002,0x00ea,0x0303,0x1ec6,0x0002,
+	0x1eb8,0x0302,0x1ec7,0x0002,0x1eb9,0x0302,0x1ec8,0x0002,
+	0x0049,0x0309,0x1ec9,0x0002,0x0069,0x0309,0x1eca,0x0002,
+	0x0049,0x0323,0x1ecb,0x0002,0x0069,0x0323,0x1ecc,0x0002,
+	0x004f,0x0323,0x1ecd,0x0002,0x006f,0x0323,0x1ece,0x0002,
+	0x004f,0x0309,0x1ecf,0x0002,0x006f,0x0309,0x1ed0,0x0002,
+	0x00d4,0x0301,0x1ed1,0x0002,0x00f4,0x0301,0x1ed2,0x0002,
+	0x00d4,0x0300,0x1ed3,0x0002,0x00f4,0x0300,0x1ed4,0x0002,
+	0x00d4,0x0309,0x1ed5,0x0002,0x00f4,0x0309,0x1ed6,0x0002,
+	0x00d4,0x0303,0x1ed7,0x0002,0x00f4,0x0303,0x1ed8,0x0002,
+	0x1ecc,0x0302,0x1ed9,0x0002,0x1ecd,0x0302,0x1eda,0x0002,
+	0x01a0,0x0301,0x1edb,0x0002,0x01a1,0x0301,0x1edc,0x0002,
+	0x01a0,0x0300,0x1edd,0x0002,0x01a1,0x0300,0x1ede,0x0002,
+	0x01a0,0x0309,0x1edf,0x0002,0x01a1,0x0309,0x1ee0,0x0002,
+	0x01a0,0x0303,0x1ee1,0x0002,0x01a1,0x0303,0x1ee2,0x0002,
+	0x01a0,0x0323,0x1ee3,0x0002,0x01a1,0x0323,0x1ee4,0x0002,
+	0x0055,0x0323,0x1ee5,0x0002,0x0075,0x0323,0x1ee6,0x0002,
+	0x0055,0x0309,0x1ee7,0x0002,0x0075,0x0309,0x1ee8,0x0002,
+	0x01af,0x0301,0x1ee9,0x0002,0x01b0,0x0301,0x1eea,0x0002,
+	0x01af,0x0300,0x1eeb,0x0002,0x01b0,0x0300,0x1eec,0x0002,
+	0x01af,0x0309,0x1eed,0x0002,0x01b0,0x0309,0x1eee,0x0002,
+	0x01af,0x0303,0x1eef,0x0002,0x01b0,0x0303,0x1ef0,0x0002,
+	0x01af,0x0323,0x1ef1,0x0002,0x01b0,0x0323,0x1ef2,0x0002,
+	0x0059,0x0300,0x1ef3,0x0002,0x0079,0x0300,0x1ef4,0x0002,
+	0x0059,0x0323,0x1ef5,0x0002,0x0079,0x0323,0x1ef6,0x0002,
+	0x0059,0x0309,0x1ef7,0x0002,0x0079,0x0309,0x1ef8,0x0002,
+	0x0059,0x0303,0x1ef9,0x0002,0x0079,0x0303,0x1f00,0x0002,
+	0x03b1,0x0313,0x1f01,0x0002,0x03b1,0x0314,0x1f02,0x0002,
+	0x1f00,0x0300,0x1f03,0x0002,0x1f01,0x0300,0x1f04,0x0002,
+	0x1f00,0x0301,0x1f05,0x0002,0x1f01,0x0301,0x1f06,0x0002,
+	0x1f00,0x0342,0x1f07,0x0002,0x1f01,0x0342,0x1f08,0x0002,
+	0x0391,0x0313,0x1f09,0x0002,0x0391,0x0314,0x1f0a,0x0002,
+	0x1f08,0x0300,0x1f0b,0x0002,0x1f09,0x0300,0x1f0c,0x0002,
+	0x1f08,0x0301,0x1f0d,0x0002,0x1f09,0x0301,0x1f0e,0x0002,
+	0x1f08,0x0342,0x1f0f,0x0002,0x1f09,0x0342,0x1f10,0x0002,
+	0x03b5,0x0313,0x1f11,0x0002,0x03b5,0x0314,0x1f12,0x0002,
+	0x1f10,0x0300,0x1f13,0x0002,0x1f11,0x0300,0x1f14,0x0002,
+	0x1f10,0x0301,0x1f15,0x0002,0x1f11,0x0301,0x1f18,0x0002,
+	0x0395,0x0313,0x1f19,0x0002,0x0395,0x0314,0x1f1a,0x0002,
+	0x1f18,0x0300,0x1f1b,0x0002,0x1f19,0x0300,0x1f1c,0x0002,
+	0x1f18,0x0301,0x1f1d,0x0002,0x1f19,0x0301,0x1f20,0x0002,
+	0x03b7,0x0313,0x1f21,0x0002,0x03b7,0x0314,0x1f22,0x0002,
+	0x1f20,0x0300,0x1f23,0x0002,0x1f21,0x0300,0x1f24,0x0002,
+	0x1f20,0x0301,0x1f25,0x0002,0x1f21,0x0301,0x1f26,0x0002,
+	0x1f20,0x0342,0x1f27,0x0002,0x1f21,0x0342,0x1f28,0x0002,
+	0x0397,0x0313,0x1f29,0x0002,0x0397,0x0314,0x1f2a,0x0002,
+	0x1f28,0x0300,0x1f2b,0x0002,0x1f29,0x0300,0x1f2c,0x0002,
+	0x1f28,0x0301,0x1f2d,0x0002,0x1f29,0x0301,0x1f2e,0x0002,
+	0x1f28,0x0342,0x1f2f,0x0002,0x1f29,0x0342,0x1f30,0x0002,
+	0x03b9,0x0313,0x1f31,0x0002,0x03b9,0x0314,0x1f32,0x0002,
+	0x1f30,0x0300,0x1f33,0x0002,0x1f31,0x0300,0x1f34,0x0002,
+	0x1f30,0x0301,0x1f35,0x0002,0x1f31,0x0301,0x1f36,0x0002,
+	0x1f30,0x0342,0x1f37,0x0002,0x1f31,0x0342,0x1f38,0x0002,
+	0x0399,0x0313,0x1f39,0x0002,0x0399,0x0314,0x1f3a,0x0002,
+	0x1f38,0x0300,0x1f3b,0x0002,0x1f39,0x0300,0x1f3c,0x0002,
+	0x1f38,0x0301,0x1f3d,0x0002,0x1f39,0x0301,0x1f3e,0x0002,
+	0x1f38,0x0342,0x1f3f,0x0002,0x1f39,0x0342,0x1f40,0x0002,
+	0x03bf,0x0313,0x1f41,0x0002,0x03bf,0x0314,0x1f42,0x0002,
+	0x1f40,0x0300,0x1f43,0x0002,0x1f41,0x0300,0x1f44,0x0002,
+	0x1f40,0x0301,0x1f45,0x0002,0x1f41,0x0301,0x1f48,0x0002,
+	0x039f,0x0313,0x1f49,0x0002,0x039f,0x0314,0x1f4a,0x0002,
+	0x1f48,0x0300,0x1f4b,0x0002,0x1f49,0x0300,0x1f4c,0x0002,
+	0x1f48,0x0301,0x1f4d,0x0002,0x1f49,0x0301,0x1f50,0x0002,
+	0x03c5,0x0313,0x1f51,0x0002,0x03c5,0x0314,0x1f52,0x0002,
+	0x1f50,0x0300,0x1f53,0x0002,0x1f51,0x0300,0x1f54,0x0002,
+	0x1f50,0x0301,0x1f55,0x0002,0x1f51,0x0301,0x1f56,0x0002,
+	0x1f50,0x0342,0x1f57,0x0002,0x1f51,0x0342,0x1f59,0x0002,
+	0x03a5,0x0314,0x1f5b,0x0002,0x1f59,0x0300,0x1f5d,0x0002,
+	0x1f59,0x0301,0x1f5f,0x0002,0x1f59,0x0342,0x1f60,0x0002,
+	0x03c9,0x0313,0x1f61,0x0002,0x03c9,0x0314,0x1f62,0x0002,
+	0x1f60,0x0300,0x1f63,0x0002,0x1f61,0x0300,0x1f64,0x0002,
+	0x1f60,0x0301,0x1f65,0x0002,0x1f61,0x0301,0x1f66,0x0002,
+	0x1f60,0x0342,0x1f67,0x0002,0x1f61,0x0342,0x1f68,0x0002,
+	0x03a9,0x0313,0x1f69,0x0002,0x03a9,0x0314,0x1f6a,0x0002,
+	0x1f68,0x0300,0x1f6b,0x0002,0x1f69,0x0300,0x1f6c,0x0002,
+	0x1f68,0x0301,0x1f6d,0x0002,0x1f69,0x0301,0x1f6e,0x0002,
+	0x1f68,0x0342,0x1f6f,0x0002,0x1f69,0x0342,0x1f70,0x0002,
+	0x03b1,0x0300,0x1f71,0x0001,0x03ac,0x1f72,0x0002,0x03b5,
+	0x0300,0x1f73,0x0001,0x03ad,0x1f74,0x0002,0x03b7,0x0300,
+	0x1f75,0x0001,0x03ae,0x1f76,0x0002,0x03b9,0x0300,0x1f77,
+	0x0001,0x03af,0x1f78,0x0002,0x03bf,0x0300,0x1f79,0x0001,
+	0x03cc,0x1f7a,0x0002,0x03c5,0x0300,0x1f7b,0x0001,0x03cd,
+	0x1f7c,0x0002,0x03c9,0x0300,0x1f7d,0x0001,0x03ce,0x1f80,
+	0x0002,0x1f00,0x0345,0x1f81,0x0002,0x1f01,0x0345,0x1f82,
+	0x0002,0x1f02,0x0345,0x1f83,0x0002,0x1f03,0x0345,0x1f84,
+	0x0002,0x1f04,0x0345,0x1f85,0x0002,0x1f05,0x0345,0x1f86,
+	0x0002,0x1f06,0x0345,0x1f87,0x0002,0x1f07,0x0345,0x1f88,
+	0x0002,0x1f08,0x0345,0x1f89,0x0002,0x1f09,0x0345,0x1f8a,
+	0x0002,0x1f0a,0x0345,0x1f8b,0x0002,0x1f0b,0x0345,0x1f8c,
+	0x0002,0x1f0c,0x0345,0x1f8d,0x0002,0x1f0d,0x0345,0x1f8e,
+	0x0002,0x1f0e,0x0345,0x1f8f,0x0002,0x1f0f,0x0345,0x1f90,
+	0x0002,0x1f20,0x0345,0x1f91,0x0002,0x1f21,0x0345,0x1f92,
+	0x0002,0x1f22,0x0345,0x1f93,0x0002,0x1f23,0x0345,0x1f94,
+	0x0002,0x1f24,0x0345,0x1f95,0x0002,0x1f25,0x0345,0x1f96,
+	0x0002,0x1f26,0x0345,0x1f97,0x0002,0x1f27,0x0345,0x1f98,
+	0x0002,0x1f28,0x0345,0x1f99,0x0002,0x1f29,0x0345,0x1f9a,
+	0x0002,0x1f2a,0x0345,0x1f9b,0x0002,0x1f2b,0x0345,0x1f9c,
+	0x0002,0x1f2c,0x0345,0x1f9d,0x0002,0x1f2d,0x0345,0x1f9e,
+	0x0002,0x1f2e,0x0345,0x1f9f,0x0002,0x1f2f,0x0345,0x1fa0,
+	0x0002,0x1f60,0x0345,0x1fa1,0x0002,0x1f61,0x0345,0x1fa2,
+	0x0002,0x1f62,0x0345,0x1fa3,0x0002,0x1f63,0x0345,0x1fa4,
+	0x0002,0x1f64,0x0345,0x1fa5,0x0002,0x1f65,0x0345,0x1fa6,
+	0x0002,0x1f66,0x0345,0x1fa7,0x0002,0x1f67,0x0345,0x1fa8,
+	0x0002,0x1f68,0x0345,0x1fa9,0x0002,0x1f69,0x0345,0x1faa,
+	0x0002,0x1f6a,0x0345,0x1fab,0x0002,0x1f6b,0x0345,0x1fac,
+	0x0002,0x1f6c,0x0345,0x1fad,0x0002,0x1f6d,0x0345,0x1fae,
+	0x0002,0x1f6e,0x0345,0x1faf,0x0002,0x1f6f,0x0345,0x1fb0,
+	0x0002,0x03b1,0x0306,0x1fb1,0x0002,0x03b1,0x0304,0x1fb2,
+	0x0002,0x1f70,0x0345,0x1fb3,0x0002,0x03b1,0x0345,0x1fb4,
+	0x0002,0x03ac,0x0345,0x1fb6,0x0002,0x03b1,0x0342,0x1fb7,
+	0x0002,0x1fb6,0x0345,0x1fb8,0x0002,0x0391,0x0306,0x1fb9,
+	0x0002,0x0391,0x0304,0x1fba,0x0002,0x0391,0x0300,0x1fbb,
+	0x0001,0x0386,0x1fbc,0x0002,0x0391,0x0345,0x1fbe,0x0001,
+	0x03b9,0x1fc1,0x0002,0x00a8,0x0342,0x1fc2,0x0002,0x1f74,
+	0x0345,0x1fc3,0x0002,0x03b7,0x0345,0x1fc4,0x0002,0x03ae,
+	0x0345,0x1fc6,0x0002,0x03b7,0x0342,0x1fc7,0x0002,0x1fc6,
+	0x0345,0x1fc8,0x0002,0x0395,0x0300,0x1fc9,0x0001,0x0388,
+	0x1fca,0x0002,0x0397,0x0300,0x1fcb,0x0001,0x0389,0x1fcc,
+	0x0002,0x0397,0x0345,0x1fcd,0x0002,0x1fbf,0x0300,0x1fce,
+	0x0002,0x1fbf,0x0301,0x1fcf,0x0002,0x1fbf,0x0342,0x1fd0,
+	0x0002,0x03b9,0x0306,0x1fd1,0x0002,0x03b9,0x0304,0x1fd2,
+	0x0002,0x03ca,0x0300,0x1fd3,0x0001,0x0390,0x1fd6,0x0002,
+	0x03b9,0x0342,0x1fd7,0x0002,0x03ca,0x0342,0x1fd8,0x0002,
+	0x0399,0x0306,0x1fd9,0x0002,0x0399,0x0304,0x1fda,0x0002,
+	0x0399,0x0300,0x1fdb,0x0001,0x038a,0x1fdd,0x0002,0x1ffe,
+	0x0300,0x1fde,0x0002,0x1ffe,0x0301,0x1fdf,0x0002,0x1ffe,
+	0x0342,0x1fe0,0x0002,0x03c5,0x0306,0x1fe1,0x0002,0x03c5,
+	0x0304,0x1fe2,0x0002,0x03cb,0x0300,0x1fe3,0x0001,0x03b0,
+	0x1fe4,0x0002,0x03c1,0x0313,0x1fe5,0x0002,0x03c1,0x0314,
+	0x1fe6,0x0002,0x03c5,0x0342,0x1fe7,0x0002,0x03cb,0x0342,
+	0x1fe8,0x0002,0x03a5,0x0306,0x1fe9,0x0002,0x03a5,0x0304,
+	0x1fea,0x0002,0x03a5,0x0300,0x1feb,0x0001,0x038e,0x1fec,
+	0x0002,0x03a1,0x0314,0x1fed,0x0002,0x00a8,0x0300,0x1fee,
+	0x0001,0x0385,0x1fef,0x0001,0x0060,0x1ff2,0x0002,0x1f7c,
+	0x0345,0x1ff3,0x0002,0x03c9,0x0345,0x1ff4,0x0002,0x03ce,
+	0x0345,0x1ff6,0x0002,0x03c9,0x0342,0x1ff7,0x0002,0x1ff6,
+	0x0345,0x1ff8,0x0002,0x039f,0x0300,0x1ff9,0x0001,0x038c,
+	0x1ffa,0x0002,0x03a9,0x0300,0x1ffb,0x0001,0x038f,0x1ffc,
+	0x0002,0x03a9,0x0345,0x1ffd,0x0001,0x00b4,0x2000,0x0001,
+	0x2002,0x2001,0x0001,0x2003,0x2126,0x0001,0x03a9,0x212a,
+	0x0001,0x004b,0x212b,0x0001,0x00c5,0x219a,0x0002,0x2190,
+	0x0338,0x219b,0x0002,0x2192,0x0338,0x21ae,0x0002,0x2194,
+	0x0338,0x21cd,0x0002,0x21d0,0x0338,0x21ce,0x0002,0x21d4,
+	0x0338,0x21cf,0x0002,0x21d2,0x0338,0x2204,0x0002,0x2203,
+	0x0338,0x2209,0x0002,0x2208,0x0338,0x220c,0x0002,0x220b,
+	0x0338,0x2224,0x0002,0x2223,0x0338,0x2226,0x0002,0x2225,
+	0x0338,0x2241,0x0002,0x223c,0x0338,0x2244,0x0002,0x2243,
+	0x0338,0x2247,0x0002,0x2245,0x0338,0x2249,0x0002,0x2248,
+	0x0338,0x2260,0x0002,0x003d,0x0338,0x2262,0x0002,0x2261,
+	0x0338,0x226d,0x0002,0x224d,0x0338,0x226e,0x0002,0x003c,
+	0x0338,0x226f,0x0002,0x003e,0x0338,0x2270,0x0002,0x2264,
+	0x0338,0x2271,0x0002,0x2265,0x0338,0x2274,0x0002,0x2272,
+	0x0338,0x2275,0x0002,0x2273,0x0338,0x2278,0x0002,0x2276,
+	0x0338,0x2279,0x0002,0x2277,0x0338,0x2280,0x0002,0x227a,
+	0x0338,0x2281,0x0002,0x227b,0x0338,0x2284,0x0002,0x2282,
+	0x0338,0x2285,0x0002,0x2283,0x0338,0x2288,0x0002,0x2286,
+	0x0338,0x2289,0x0002,0x2287,0x0338,0x22ac,0x0002,0x22a2,
+	0x0338,0x22ad,0x0002,0x22a8,0x0338,0x22ae,0x0002,0x22a9,
+	0x0338,0x22af,0x0002,0x22ab,0x0338,0x22e0,0x0002,0x227c,
+	0x0338,0x22e1,0x0002,0x227d,0x0338,0x22e2,0x0002,0x2291,
+	0x0338,0x22e3,0x0002,0x2292,0x0338,0x22ea,0x0002,0x22b2,
+	0x0338,0x22eb,0x0002,0x22b3,0x0338,0x22ec,0x0002,0x22b4,
+	0x0338,0x22ed,0x0002,0x22b5,0x0338,0x2329,0x0001,0x3008,
+	0x232a,0x0001,0x3009,0x304c,0x0002,0x304b,0x3099,0x304e,
+	0x0002,0x304d,0x3099,0x3050,0x0002,0x304f,0x3099,0x3052,
+	0x0002,0x3051,0x3099,0x3054,0x0002,0x3053,0x3099,0x3056,
+	0x0002,0x3055,0x3099,0x3058,0x0002,0x3057,0x3099,0x305a,
+	0x0002,0x3059,0x3099,0x305c,0x0002,0x305b,0x3099,0x305e,
+	0x0002,0x305d,0x3099,0x3060,0x0002,0x305f,0x3099,0x3062,
+	0x0002,0x3061,0x3099,0x3065,0x0002,0x3064,0x3099,0x3067,
+	0x0002,0x3066,0x3099,0x3069,0x0002,0x3068,0x3099,0x3070,
+	0x0002,0x306f,0x3099,0x3071,0x0002,0x306f,0x309a,0x3073,
+	0x0002,0x3072,0x3099,0x3074,0x0002,0x3072,0x309a,0x3076,
+	0x0002,0x3075,0x3099,0x3077,0x0002,0x3075,0x309a,0x3079,
+	0x0002,0x3078,0x3099,0x307a,0x0002,0x3078,0x309a,0x307c,
+	0x0002,0x307b,0x3099,0x307d,0x0002,0x307b,0x309a,0x3094,
+	0x0002,0x3046,0x3099,0x309e,0x0002,0x309d,0x3099,0x30ac,
+	0x0002,0x30ab,0x3099,0x30ae,0x0002,0x30ad,0x3099,0x30b0,
+	0x0002,0x30af,0x3099,0x30b2,0x0002,0x30b1,0x3099,0x30b4,
+	0x0002,0x30b3,0x3099,0x30b6,0x0002,0x30b5,0x3099,0x30b8,
+	0x0002,0x30b7,0x3099,0x30ba,0x0002,0x30b9,0x3099,0x30bc,
+	0x0002,0x30bb,0x3099,0x30be,0x0002,0x30bd,0x3099,0x30c0,
+	0x0002,0x30bf,0x3099,0x30c2,0x0002,0x30c1,0x3099,0x30c5,
+	0x0002,0x30c4,0x3099,0x30c7,0x0002,0x30c6,0x3099,0x30c9,
+	0x0002,0x30c8,0x3099,0x30d0,0x0002,0x30cf,0x3099,0x30d1,
+	0x0002,0x30cf,0x309a,0x30d3,0x0002,0x30d2,0x3099,0x30d4,
+	0x0002,0x30d2,0x309a,0x30d6,0x0002,0x30d5,0x3099,0x30d7,
+	0x0002,0x30d5,0x309a,0x30d9,0x0002,0x30d8,0x3099,0x30da,
+	0x0002,0x30d8,0x309a,0x30dc,0x0002,0x30db,0x3099,0x30dd,
+	0x0002,0x30db,0x309a,0x30f4,0x0002,0x30a6,0x3099,0x30f7,
+	0x0002,0x30ef,0x3099,0x30f8,0x0002,0x30f0,0x3099,0x30f9,
+	0x0002,0x30f1,0x3099,0x30fa,0x0002,0x30f2,0x3099,0x30fe,
+	0x0002,0x30fd,0x3099,0xf900,0x0001,0x8c48,0xf901,0x0001,
+	0x66f4,0xf902,0x0001,0x8eca,0xf903,0x0001,0x8cc8,0xf904,
+	0x0001,0x6ed1,0xf905,0x0001,0x4e32,0xf906,0x0001,0x53e5,
+	0xf907,0x0001,0x9f9c,0xf908,0x0001,0x9f9c,0xf909,0x0001,
+	0x5951,0xf90a,0x0001,0x91d1,0xf90b,0x0001,0x5587,0xf90c,
+	0x0001,0x5948,0xf90d,0x0001,0x61f6,0xf90e,0x0001,0x7669,
+	0xf90f,0x0001,0x7f85,0xf910,0x0001,0x863f,0xf911,0x0001,
+	0x87ba,0xf912,0x0001,0x88f8,0xf913,0x0001,0x908f,0xf914,
+	0x0001,0x6a02,0xf915,0x0001,0x6d1b,0xf916,0x0001,0x70d9,
+	0xf917,0x0001,0x73de,0xf918,0x0001,0x843d,0xf919,0x0001,
+	0x916a,0xf91a,0x0001,0x99f1,0xf91b,0x0001,0x4e82,0xf91c,
+	0x0001,0x5375,0xf91d,0x0001,0x6b04,0xf91e,0x0001,0x721b,
+	0xf91f,0x0001,0x862d,0xf920,0x0001,0x9e1e,0xf921,0x0001,
+	0x5d50,0xf922,0x0001,0x6feb,0xf923,0x0001,0x85cd,0xf924,
+	0x0001,0x8964,0xf925,0x0001,0x62c9,0xf926,0x0001,0x81d8,
+	0xf927,0x0001,0x881f,0xf928,0x0001,0x5eca,0xf929,0x0001,
+	0x6717,0xf92a,0x0001,0x6d6a,0xf92b,0x0001,0x72fc,0xf92c,
+	0x0001,0x90ce,0xf92d,0x0001,0x4f86,0xf92e,0x0001,0x51b7,
+	0xf92f,0x0001,0x52de,0xf930,0x0001,0x64c4,0xf931,0x0001,
+	0x6ad3,0xf932,0x0001,0x7210,0xf933,0x0001,0x76e7,0xf934,
+	0x0001,0x8001,0xf935,0x0001,0x8606,0xf936,0x0001,0x865c,
+	0xf937,0x0001,0x8def,0xf938,0x0001,0x9732,0xf939,0x0001,
+	0x9b6f,0xf93a,0x0001,0x9dfa,0xf93b,0x0001,0x788c,0xf93c,
+	0x0001,0x797f,0xf93d,0x0001,0x7da0,0xf93e,0x0001,0x83c9,
+	0xf93f,0x0001,0x9304,0xf940,0x0001,0x9e7f,0xf941,0x0001,
+	0x8ad6,0xf942,0x0001,0x58df,0xf943,0x0001,0x5f04,0xf944,
+	0x0001,0x7c60,0xf945,0x0001,0x807e,0xf946,0x0001,0x7262,
+	0xf947,0x0001,0x78ca,0xf948,0x0001,0x8cc2,0xf949,0x0001,
+	0x96f7,0xf94a,0x0001,0x58d8,0xf94b,0x0001,0x5c62,0xf94c,
+	0x0001,0x6a13,0xf94d,0x0001,0x6dda,0xf94e,0x0001,0x6f0f,
+	0xf94f,0x0001,0x7d2f,0xf950,0x0001,0x7e37,0xf951,0x0001,
+	0x96fb,0xf952,0x0001,0x52d2,0xf953,0x0001,0x808b,0xf954,
+	0x0001,0x51dc,0xf955,0x0001,0x51cc,0xf956,0x0001,0x7a1c,
+	0xf957,0x0001,0x7dbe,0xf958,0x0001,0x83f1,0xf959,0x0001,
+	0x9675,0xf95a,0x0001,0x8b80,0xf95b,0x0001,0x62cf,0xf95c,
+	0x0001,0x6a02,0xf95d,0x0001,0x8afe,0xf95e,0x0001,0x4e39,
+	0xf95f,0x0001,0x5be7,0xf960,0x0001,0x6012,0xf961,0x0001,
+	0x7387,0xf962,0x0001,0x7570,0xf963,0x0001,0x5317,0xf964,
+	0x0001,0x78fb,0xf965,0x0001,0x4fbf,0xf966,0x0001,0x5fa9,
+	0xf967,0x0001,0x4e0d,0xf968,0x0001,0x6ccc,0xf969,0x0001,
+	0x6578,0xf96a,0x0001,0x7d22,0xf96b,0x0001,0x53c3,0xf96c,
+	0x0001,0x585e,0xf96d,0x0001,0x7701,0xf96e,0x0001,0x8449,
+	0xf96f,0x0001,0x8aaa,0xf970,0x0001,0x6bba,0xf971,0x0001,
+	0x8fb0,0xf972,0x0001,0x6c88,0xf973,0x0001,0x62fe,0xf974,
+	0x0001,0x82e5,0xf975,0x0001,0x63a0,0xf976,0x0001,0x7565,
+	0xf977,0x0001,0x4eae,0xf978,0x0001,0x5169,0xf979,0x0001,
+	0x51c9,0xf97a,0x0001,0x6881,0xf97b,0x0001,0x7ce7,0xf97c,
+	0x0001,0x826f,0xf97d,0x0001,0x8ad2,0xf97e,0x0001,0x91cf,
+	0xf97f,0x0001,0x52f5,0xf980,0x0001,0x5442,0xf981,0x0001,
+	0x5973,0xf982,0x0001,0x5eec,0xf983,0x0001,0x65c5,0xf984,
+	0x0001,0x6ffe,0xf985,0x0001,0x792a,0xf986,0x0001,0x95ad,
+	0xf987,0x0001,0x9a6a,0xf988,0x0001,0x9e97,0xf989,0x0001,
+	0x9ece,0xf98a,0x0001,0x529b,0xf98b,0x0001,0x66c6,0xf98c,
+	0x0001,0x6b77,0xf98d,0x0001,0x8f62,0xf98e,0x0001,0x5e74,
+	0xf98f,0x0001,0x6190,0xf990,0x0001,0x6200,0xf991,0x0001,
+	0x649a,0xf992,0x0001,0x6f23,0xf993,0x0001,0x7149,0xf994,
+	0x0001,0x7489,0xf995,0x0001,0x79ca,0xf996,0x0001,0x7df4,
+	0xf997,0x0001,0x806f,0xf998,0x0001,0x8f26,0xf999,0x0001,
+	0x84ee,0xf99a,0x0001,0x9023,0xf99b,0x0001,0x934a,0xf99c,
+	0x0001,0x5217,0xf99d,0x0001,0x52a3,0xf99e,0x0001,0x54bd,
+	0xf99f,0x0001,0x70c8,0xf9a0,0x0001,0x88c2,0xf9a1,0x0001,
+	0x8aaa,0xf9a2,0x0001,0x5ec9,0xf9a3,0x0001,0x5ff5,0xf9a4,
+	0x0001,0x637b,0xf9a5,0x0001,0x6bae,0xf9a6,0x0001,0x7c3e,
+	0xf9a7,0x0001,0x7375,0xf9a8,0x0001,0x4ee4,0xf9a9,0x0001,
+	0x56f9,0xf9aa,0x0001,0x5be7,0xf9ab,0x0001,0x5dba,0xf9ac,
+	0x0001,0x601c,0xf9ad,0x0001,0x73b2,0xf9ae,0x0001,0x7469,
+	0xf9af,0x0001,0x7f9a,0xf9b0,0x0001,0x8046,0xf9b1,0x0001,
+	0x9234,0xf9b2,0x0001,0x96f6,0xf9b3,0x0001,0x9748,0xf9b4,
+	0x0001,0x9818,0xf9b5,0x0001,0x4f8b,0xf9b6,0x0001,0x79ae,
+	0xf9b7,0x0001,0x91b4,0xf9b8,0x0001,0x96b8,0xf9b9,0x0001,
+	0x60e1,0xf9ba,0x0001,0x4e86,0xf9bb,0x0001,0x50da,0xf9bc,
+	0x0001,0x5bee,0xf9bd,0x0001,0x5c3f,0xf9be,0x0001,0x6599,
+	0xf9bf,0x0001,0x6a02,0xf9c0,0x0001,0x71ce,0xf9c1,0x0001,
+	0x7642,0xf9c2,0x0001,0x84fc,0xf9c3,0x0001,0x907c,0xf9c4,
+	0x0001,0x9f8d,0xf9c5,0x0001,0x6688,0xf9c6,0x0001,0x962e,
+	0xf9c7,0x0001,0x5289,0xf9c8,0x0001,0x677b,0xf9c9,0x0001,
+	0x67f3,0xf9ca,0x0001,0x6d41,0xf9cb,0x0001,0x6e9c,0xf9cc,
+	0x0001,0x7409,0xf9cd,0x0001,0x7559,0xf9ce,0x0001,0x786b,
+	0xf9cf,0x0001,0x7d10,0xf9d0,0x0001,0x985e,0xf9d1,0x0001,
+	0x516d,0xf9d2,0x0001,0x622e,0xf9d3,0x0001,0x9678,0xf9d4,
+	0x0001,0x502b,0xf9d5,0x0001,0x5d19,0xf9d6,0x0001,0x6dea,
+	0xf9d7,0x0001,0x8f2a,0xf9d8,0x0001,0x5f8b,0xf9d9,0x0001,
+	0x6144,0xf9da,0x0001,0x6817,0xf9db,0x0001,0x7387,0xf9dc,
+	0x0001,0x9686,0xf9dd,0x0001,0x5229,0xf9de,0x0001,0x540f,
+	0xf9df,0x0001,0x5c65,0xf9e0,0x0001,0x6613,0xf9e1,0x0001,
+	0x674e,0xf9e2,0x0001,0x68a8,0xf9e3,0x0001,0x6ce5,0xf9e4,
+	0x0001,0x7406,0xf9e5,0x0001,0x75e2,0xf9e6,0x0001,0x7f79,
+	0xf9e7,0x0001,0x88cf,0xf9e8,0x0001,0x88e1,0xf9e9,0x0001,
+	0x91cc,0xf9ea,0x0001,0x96e2,0xf9eb,0x0001,0x533f,0xf9ec,
+	0x0001,0x6eba,0xf9ed,0x0001,0x541d,0xf9ee,0x0001,0x71d0,
+	0xf9ef,0x0001,0x7498,0xf9f0,0x0001,0x85fa,0xf9f1,0x0001,
+	0x96a3,0xf9f2,0x0001,0x9c57,0xf9f3,0x0001,0x9e9f,0xf9f4,
+	0x0001,0x6797,0xf9f5,0x0001,0x6dcb,0xf9f6,0x0001,0x81e8,
+	0xf9f7,0x0001,0x7acb,0xf9f8,0x0001,0x7b20,0xf9f9,0x0001,
+	0x7c92,0xf9fa,0x0001,0x72c0,0xf9fb,0x0001,0x7099,0xf9fc,
+	0x0001,0x8b58,0xf9fd,0x0001,0x4ec0,0xf9fe,0x0001,0x8336,
+	0xf9ff,0x0001,0x523a,0xfa00,0x0001,0x5207,0xfa01,0x0001,
+	0x5ea6,0xfa02,0x0001,0x62d3,0xfa03,0x0001,0x7cd6,0xfa04,
+	0x0001,0x5b85,0xfa05,0x0001,0x6d1e,0xfa06,0x0001,0x66b4,
+	0xfa07,0x0001,0x8f3b,0xfa08,0x0001,0x884c,0xfa09,0x0001,
+	0x964d,0xfa0a,0x0001,0x898b,0xfa0b,0x0001,0x5ed3,0xfa0c,
+	0x0001,0x5140,0xfa0d,0x0001,0x55c0,0xfa10,0x0001,0x585a,
+	0xfa12,0x0001,0x6674,0xfa15,0x0001,0x51de,0xfa16,0x0001,
+	0x732a,0xfa17,0x0001,0x76ca,0xfa18,0x0001,0x793c,0xfa19,
+	0x0001,0x795e,0xfa1a,0x0001,0x7965,0xfa1b,0x0001,0x798f,
+	0xfa1c,0x0001,0x9756,0xfa1d,0x0001,0x7cbe,0xfa1e,0x0001,
+	0x7fbd,0xfa20,0x0001,0x8612,0xfa22,0x0001,0x8af8,0xfa25,
+	0x0001,0x9038,0xfa26,0x0001,0x90fd,0xfa2a,0x0001,0x98ef,
+	0xfa2b,0x0001,0x98fc,0xfa2c,0x0001,0x9928,0xfa2d,0x0001,
+	0x9db4,0xfb1d,0x0002,0x05d9,0x05b4,0xfb1f,0x0002,0x05f2,
+	0x05b7,0xfb2a,0x0002,0x05e9,0x05c1,0xfb2b,0x0002,0x05e9,
+	0x05c2,0xfb2c,0x0002,0xfb49,0x05c1,0xfb2d,0x0002,0xfb49,
+	0x05c2,0xfb2e,0x0002,0x05d0,0x05b7,0xfb2f,0x0002,0x05d0,
+	0x05b8,0xfb30,0x0002,0x05d0,0x05bc,0xfb31,0x0002,0x05d1,
+	0x05bc,0xfb32,0x0002,0x05d2,0x05bc,0xfb33,0x0002,0x05d3,
+	0x05bc,0xfb34,0x0002,0x05d4,0x05bc,0xfb35,0x0002,0x05d5,
+	0x05bc,0xfb36,0x0002,0x05d6,0x05bc,0xfb38,0x0002,0x05d8,
+	0x05bc,0xfb39,0x0002,0x05d9,0x05bc,0xfb3a,0x0002,0x05da,
+	0x05bc,0xfb3b,0x0002,0x05db,0x05bc,0xfb3c,0x0002,0x05dc,
+	0x05bc,0xfb3e,0x0002,0x05de,0x05bc,0xfb40,0x0002,0x05e0,
+	0x05bc,0xfb41,0x0002,0x05e1,0x05bc,0xfb43,0x0002,0x05e3,
+	0x05bc,0xfb44,0x0002,0x05e4,0x05bc,0xfb46,0x0002,0x05e6,
+	0x05bc,0xfb47,0x0002,0x05e7,0x05bc,0xfb48,0x0002,0x05e8,
+	0x05bc,0xfb49,0x0002,0x05e9,0x05bc,0xfb4a,0x0002,0x05ea,
+	0x05bc,0xfb4b,0x0002,0x05d5,0x05b9,0xfb4c,0x0002,0x05d1,
+	0x05bf,0xfb4d,0x0002,0x05db,0x05bf,0xfb4e,0x0002,0x05e4,
+	0x05bf
+	};
+
+const TUint16 TUnicode::FoldTable[256] = 
+	{
+	0x0000,0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007,0x0008,0x0009,0x000a,0x000b,0x000c,0x000d,0x000e,0x000f,
+	0x0010,0x0011,0x0012,0x0013,0x0014,0x0015,0x0016,0x0017,0x0018,0x0019,0x001a,0x001b,0x001c,0x001d,0x001e,0x001f,
+	0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027,0x0028,0x0029,0x002a,0x002b,0x002c,0x002d,0x002e,0x002f,
+	0x0030,0x0031,0x0032,0x0033,0x0034,0x0035,0x0036,0x0037,0x0038,0x0039,0x003a,0x003b,0x003c,0x003d,0x003e,0x003f,
+	0x0040,0x0061,0x0062,0x0063,0x0064,0x0065,0x0066,0x0067,0x0068,0x0069,0x006a,0x006b,0x006c,0x006d,0x006e,0x006f,
+	0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077,0x0078,0x0079,0x007a,0x005b,0x005c,0x005d,0x005e,0x005f,
+	0x0060,0x0061,0x0062,0x0063,0x0064,0x0065,0x0066,0x0067,0x0068,0x0069,0x006a,0x006b,0x006c,0x006d,0x006e,0x006f,
+	0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077,0x0078,0x0079,0x007a,0x007b,0x007c,0x007d,0x007e,0x007f,
+	0x0080,0x0081,0x0082,0x0083,0x0084,0x0085,0x0086,0x0087,0x0088,0x0089,0x008a,0x008b,0x008c,0x008d,0x008e,0x008f,
+	0x0090,0x0091,0x0092,0x0093,0x0094,0x0095,0x0096,0x0097,0x0098,0x0099,0x009a,0x009b,0x009c,0x009d,0x009e,0x009f,
+	0x0020,0x00a1,0x00a2,0x00a3,0x00a4,0x00a5,0x00a6,0x00a7,0x00a8,0x00a9,0x00aa,0x00ab,0x00ac,0x00ad,0x00ae,0x00af,
+	0x00b0,0x00b1,0x00b2,0x00b3,0x00b4,0x00b5,0x00b6,0x00b7,0x00b8,0x00b9,0x00ba,0x00bb,0x00bc,0x00bd,0x00be,0x00bf,
+	0x0061,0x0061,0x0061,0x0061,0x0061,0x0061,0x00e6,0x0063,0x0065,0x0065,0x0065,0x0065,0x0069,0x0069,0x0069,0x0069,
+	0x00f0,0x006e,0x006f,0x006f,0x006f,0x006f,0x006f,0x00d7,0x00f8,0x0075,0x0075,0x0075,0x0075,0x0079,0x00fe,0x00df,
+	0x0061,0x0061,0x0061,0x0061,0x0061,0x0061,0x00e6,0x0063,0x0065,0x0065,0x0065,0x0065,0x0069,0x0069,0x0069,0x0069,
+	0x00f0,0x006e,0x006f,0x006f,0x006f,0x006f,0x006f,0x00f7,0x00f8,0x0075,0x0075,0x0075,0x0075,0x0079,0x00fe,0x0079
+	};
+const TUint16 TUnicode::CjkWidthFoldTable[256] = 
+	{
+	0xff00,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027,0x0028,0x0029,0x002a,0x002b,0x002c,0x002d,0x002e,0x002f,
+	0x0030,0x0031,0x0032,0x0033,0x0034,0x0035,0x0036,0x0037,0x0038,0x0039,0x003a,0x003b,0x003c,0x003d,0x003e,0x003f,
+	0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046,0x0047,0x0048,0x0049,0x004a,0x004b,0x004c,0x004d,0x004e,0x004f,
+	0x0050,0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057,0x0058,0x0059,0x005a,0x005b,0x005c,0x005d,0x005e,0x005f,
+	0x0060,0x0061,0x0062,0x0063,0x0064,0x0065,0x0066,0x0067,0x0068,0x0069,0x006a,0x006b,0x006c,0x006d,0x006e,0x006f,
+	0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077,0x0078,0x0079,0x007a,0x007b,0x007c,0x007d,0x007e,0xff5f,
+	0xff60,0x3002,0x300c,0x300d,0x3001,0x30fb,0x30f2,0x30a1,0x30a3,0x30a5,0x30a7,0x30a9,0x30e3,0x30e5,0x30e7,0x30c3,
+	0x30fc,0x30a2,0x30a4,0x30a6,0x30a8,0x30aa,0x30ab,0x30ad,0x30af,0x30b1,0x30b3,0x30b5,0x30b7,0x30b9,0x30bb,0x30bd,
+	0x30bf,0x30c1,0x30c4,0x30c6,0x30c8,0x30ca,0x30cb,0x30cc,0x30cd,0x30ce,0x30cf,0x30d2,0x30d5,0x30d8,0x30db,0x30de,
+	0x30df,0x30e0,0x30e1,0x30e2,0x30e4,0x30e6,0x30e8,0x30e9,0x30ea,0x30eb,0x30ec,0x30ed,0x30ef,0x30f3,0x3099,0x309a,
+	0x3164,0x3131,0x3132,0x3133,0x3134,0x3135,0x3136,0x3137,0x3138,0x3139,0x313a,0x313b,0x313c,0x313d,0x313e,0x313f,
+	0x3140,0x3141,0x3142,0x3143,0x3144,0x3145,0x3146,0x3147,0x3148,0x3149,0x314a,0x314b,0x314c,0x314d,0x314e,0xffbf,
+	0xffc0,0xffc1,0x314f,0x3150,0x3151,0x3152,0x3153,0x3154,0xffc8,0xffc9,0x3155,0x3156,0x3157,0x3158,0x3159,0x315a,
+	0xffd0,0xffd1,0x315b,0x315c,0x315d,0x315e,0x315f,0x3160,0xffd8,0xffd9,0x3161,0x3162,0x3163,0xffdd,0xffde,0xffdf,
+	0x00a2,0x00a3,0x00ac,0x00af,0x00a6,0x00a5,0x20a9,0xffe7,0x2502,0x2190,0x2191,0x2192,0x2193,0x25a0,0x25cb,0xffef,
+	0xfff0,0xfff1,0xfff2,0xfff3,0xfff4,0xfff5,0xfff6,0xfff7,0xfff8,0xfff9,0xfffa,0xfffb,0xfffc,0xfffd,0xfffe,0xffff
+	};
+
+// The tables and structures contain 35090 bytes of data.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32/euser/us_data.h	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,76 @@
+// Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32\euser\us_data.h
+// Defines accessor functions for thread local data, either using Exec calls or the thread ID
+// register if available
+// 
+//
+
+#ifndef __US_DATA_H__
+#define __US_DATA_H__
+
+#include "us_std.h"
+
+#ifdef __USERSIDE_THREAD_DATA__
+
+TLocalThreadData* LocalThreadData();
+
+#ifndef __TOOLS2__
+inline RAllocator* GetHeap()
+	{
+	return LocalThreadData()->iHeap;
+	}
+#endif // __TOOLS2__
+
+inline CActiveScheduler* GetActiveScheduler()
+	{
+	return LocalThreadData()->iScheduler;
+	}
+
+inline void SetActiveScheduler(CActiveScheduler* aS)
+	{
+	LocalThreadData()->iScheduler = aS;
+	}
+
+inline TTrapHandler* GetTrapHandler()
+	{
+	return LocalThreadData()->iTrapHandler;
+	}
+
+#else
+
+inline RAllocator* GetHeap()
+	{
+	return Exec::Heap();
+	}
+
+inline CActiveScheduler* GetActiveScheduler()
+	{
+	return Exec::ActiveScheduler();
+	}
+
+inline void SetActiveScheduler(CActiveScheduler* aS)
+	{
+	Exec::SetActiveScheduler(aS);
+	}
+
+inline TTrapHandler* GetTrapHandler()
+	{
+	return Exec::TrapHandler();
+	}
+
+#endif
+
+#endif
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32/euser/us_decode.cpp	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,399 @@
+// Copyright (c) 1998-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32\euser\us_decode.cpp
+// 
+//
+
+#include <e32huffman.h>
+#include <e32base.h>
+#include <e32panic.h>
+#include <cpudefs.h>
+
+const TInt KHuffTerminate=0x0001;
+const TUint32 KBranch1=sizeof(TUint32)<<16;
+_LIT(KCat,"Huffman");
+
+TUint32* HuffmanSubTree(TUint32* aPtr,const TUint32* aValue,TUint32** aLevel)
+//
+// write the subtree below aPtr and return the head
+//
+	{
+	TUint32* l=*aLevel++;
+	if (l>aValue)
+		{
+		TUint32* sub0=HuffmanSubTree(aPtr,aValue,aLevel);	// 0-tree first
+		aPtr=HuffmanSubTree(sub0,aValue-(aPtr-sub0)-1,aLevel);			// 1-tree
+		TInt branch0=(TUint8*)sub0-(TUint8*)(aPtr-1);
+		*--aPtr=KBranch1|branch0;
+		}
+	else if (l==aValue)
+		{
+		TUint term0=*aValue--;						// 0-term
+		aPtr=HuffmanSubTree(aPtr,aValue,aLevel);			// 1-tree
+		*--aPtr=KBranch1|(term0>>16);
+		}
+	else	// l<iNext
+		{
+		TUint term0=*aValue--;						// 0-term
+		TUint term1=*aValue--;
+		*--aPtr=(term1>>16<<16)|(term0>>16);
+		}
+	return aPtr;
+	}
+
+/** Create a canonical Huffman decoding tree
+
+	This generates the huffman decoding tree used by TBitInput::HuffmanL() to read huffman
+	encoded data. The input is table of code lengths, as generated by Huffman::HuffmanL()
+	and must represent a valid huffman code.
+	
+	@param aHuffman The table of code lengths as generated by Huffman::HuffmanL()
+	@param aNumCodes The number of codes in the table
+	@param aDecodeTree The space for the decoding tree. This must be the same
+		size as the code-length table, and can safely be the same memory
+	@param  aSymbolBase the base value for the output 'symbols' from the decoding tree, by default
+		this is zero.
+
+	@panic "USER ???" If the provided code is not a valid Huffman coding
+
+	@see IsValid()
+	@see HuffmanL()
+*/
+EXPORT_C void Huffman::Decoding(const TUint32 aHuffman[],TInt aNumCodes,TUint32 aDecodeTree[],TInt aSymbolBase)
+	{
+	__ASSERT_ALWAYS(IsValid(aHuffman,aNumCodes),User::Panic(KCat,EHuffmanInvalidCoding));
+//
+	TFixedArray<TInt,KMaxCodeLength> counts;
+	counts.Reset();
+	TInt codes=0;
+	TInt ii;
+	for (ii=0;ii<aNumCodes;++ii)
+		{
+		TInt len=aHuffman[ii];
+		aDecodeTree[ii]=len;
+		if (--len>=0)
+			{
+			++counts[len];
+			++codes;
+			}
+		}
+//
+	TFixedArray<TUint32*,KMaxCodeLength> level;
+	TUint32* lit=aDecodeTree+codes;
+	for (ii=0;ii<KMaxCodeLength;++ii)
+		{
+		level[ii]=lit;
+		lit-=counts[ii];
+		}
+	aSymbolBase=(aSymbolBase<<17)+(KHuffTerminate<<16);
+	for (ii=0;ii<aNumCodes;++ii)
+		{
+		TUint len=TUint8(aDecodeTree[ii]);
+		if (len)
+			*--level[len-1]|=(ii<<17)+aSymbolBase;
+		}
+	if (codes==1)	// codes==1 special case: incomplete tree
+		{
+		TUint term=aDecodeTree[0]>>16;
+		aDecodeTree[0]=term|(term<<16); // 0- and 1-terminate at root
+		}
+	else if (codes>1)
+		HuffmanSubTree(aDecodeTree+codes-1,aDecodeTree+codes-1,&level[0]);
+	}
+
+// The decoding tree for the externalised code
+const TUint32 HuffmanDecoding[]=
+	{
+	0x0004006c,
+	0x00040064,
+	0x0004005c,
+	0x00040050,
+	0x00040044,
+	0x0004003c,
+	0x00040034,
+	0x00040021,
+	0x00040023,
+	0x00040025,
+	0x00040027,
+	0x00040029,
+	0x00040014,
+	0x0004000c,
+	0x00040035,
+	0x00390037,
+	0x00330031,
+	0x0004002b,
+	0x002f002d,
+	0x001f001d,
+	0x001b0019,
+	0x00040013,
+	0x00170015,
+	0x0004000d,
+	0x0011000f,
+	0x000b0009,
+	0x00070003,
+	0x00050001
+	};
+
+/** Restore a canonical huffman encoding from a bit stream
+
+	The encoding must have been stored using Huffman::ExternalizeL(). The resulting
+	code-length table can be used to create an encoding table using Huffman::Encoding()
+	or a decoding tree using Huffman::Decoding().
+	
+	@param aInput The input stream with the encoding
+	@param aHuffman The internalized code-length table is placed here
+	@param aNumCodes The number of huffman codes in the table
+
+	@leave TBitInput::HuffmanL()
+
+	@see ExternalizeL()
+*/
+EXPORT_C void Huffman::InternalizeL(TBitInput& aInput,TUint32 aHuffman[],TInt aNumCodes)
+// See ExternalizeL for a description of the format
+	{
+	// initialise move-to-front list
+	TFixedArray<TUint8,Huffman::KMetaCodes> list;
+	for (TInt i=0;i<list.Count();++i)
+		list[i]=TUint8(i);
+	TInt last=0;
+	// extract codes, reverse rle-0 and mtf encoding in one pass
+	TUint32* p=aHuffman;
+	const TUint32* end=aHuffman+aNumCodes;
+	TUint rl=0;
+	while (p+rl<end)
+		{
+		TInt c=aInput.HuffmanL(HuffmanDecoding);
+		// c is now 0..28
+		if (c<2)
+			{
+			// one of the zero codes used by RLE-0
+			// update he run-length
+			rl+=rl+c+1;
+			}
+		else
+			{
+			if(rl >= TUint(end-p))
+				User::Leave(KErrCorrupt);
+			while (rl>0)
+				{
+				*p++=last;
+				--rl;
+				}
+			--c; // c is now 1..27
+			list[0]=TUint8(last);
+			last=list[c];
+			Mem::Copy(&list[1],&list[0],c);
+			*p++=last;
+			}
+		}
+
+	while (p<end)
+		*p++=last;
+
+	}
+
+// bit-stream input class
+
+inline TUint reverse(TUint aVal)
+//
+// Reverse the byte-order of a 32 bit value
+// This generates optimal ARM code (4 instructions)
+//
+	{
+	TUint v=(aVal<<16)|(aVal>>16);
+	v^=aVal;
+	v&=0xff00ffff;
+	aVal=(aVal>>8)|(aVal<<24);
+	return aVal^(v>>8);
+	}
+
+/** Construct a bit stream input object
+
+	Following construction the bit stream is ready for reading bits, but will
+	immediately call UnderflowL() as the input buffer is empty.
+*/
+EXPORT_C TBitInput::TBitInput()
+	:iCount(0),iRemain(0)
+	{}
+
+/** Construct a bit stream input object over a buffer
+
+	Following construction the bit stream is ready for reading bits from
+	the specified buffer.
+
+	@param aPtr The address of the buffer containing the bit stream
+	@param aLength The length of the bitstream in bits
+	@param aOffset The bit offset from the start of the buffer to the bit stream (defaults to zero)
+*/
+EXPORT_C TBitInput::TBitInput(const TUint8* aPtr, TInt aLength, TInt aOffset)
+	{
+	Set(aPtr,aLength,aOffset);
+	}
+
+/** Set the memory buffer to use for input
+
+	Bits will be read from this buffer until it is empty, at which point
+	UnderflowL() will be called.
+	
+	@param aPtr The address of the buffer containing the bit stream
+	@param aLength The length of the bitstream in bits
+	@param aOffset The bit offset from the start of the buffer to the bit stream (defaults to zero)
+*/
+EXPORT_C void TBitInput::Set(const TUint8* aPtr, TInt aLength, TInt aOffset)
+	{
+	TUint p=(TUint)aPtr;
+	p+=aOffset>>3;			// nearest byte to the specified bit offset
+	aOffset&=7;				// bit offset within the byte
+	const TUint32* ptr=(const TUint32*)(p&~3);	// word containing this byte
+	aOffset+=(p&3)<<3;		// bit offset within the word
+	if (aLength==0)
+		iCount=0;
+	else
+		{
+		// read the first few bits of the stream
+		iBits=reverse(*ptr++)<<aOffset;
+		aOffset=32-aOffset;
+		aLength-=aOffset;
+		if (aLength<0)
+			aOffset+=aLength;
+		iCount=aOffset;
+		}
+	iRemain=aLength;
+	iPtr=ptr;
+	}
+
+#ifndef __HUFFMAN_MACHINE_CODED__
+
+/** Read a single bit from the input
+
+	Return the next bit in the input stream. This will call UnderflowL() if
+	there are no more bits available.
+
+	@return The next bit in the stream
+
+	@leave "UnderflowL()" It the bit stream is exhausted more UnderflowL is called
+		to get more data
+*/
+EXPORT_C TUint TBitInput::ReadL()
+	{
+	TInt c=iCount;
+	TUint bits=iBits;
+	if (--c<0)
+		return ReadL(1);
+	iCount=c;
+	iBits=bits<<1;
+	return bits>>31;
+	}
+
+/** Read a multi-bit value from the input
+
+	Return the next few bits as an unsigned integer. The last bit read is
+	the least significant bit of the returned value, and the value is
+	zero extended to return a 32-bit result.
+
+	A read of zero bits will always reaturn zero.
+	
+	This will call UnderflowL() if there are not enough bits available.
+
+	@param aSize The number of bits to read
+
+	@return The bits read from the stream
+
+	@leave "UnderflowL()" It the bit stream is exhausted more UnderflowL is called
+		to get more data
+*/
+EXPORT_C TUint TBitInput::ReadL(TInt aSize)
+	{
+	if (!aSize)
+		return 0;
+	TUint val=0;
+	TUint bits=iBits;
+	iCount-=aSize;
+	while (iCount<0)
+		{
+		// need more bits
+#ifdef __CPU_X86
+		// X86 does not allow shift-by-32
+		if (iCount+aSize!=0)
+			val|=bits>>(32-(iCount+aSize))<<(-iCount);	// scrub low order bits
+#else
+		val|=bits>>(32-(iCount+aSize))<<(-iCount);	// scrub low order bits
+#endif
+		aSize=-iCount;	// bits still required
+		if (iRemain>0)
+			{
+			bits=reverse(*iPtr++);
+			iCount+=32;
+			iRemain-=32;
+			if (iRemain<0)
+				iCount+=iRemain;
+			}
+		else
+			{
+			UnderflowL();
+			bits=iBits;
+			iCount-=aSize;
+			}
+		}
+#ifdef __CPU_X86
+	// X86 does not allow shift-by-32
+	iBits=aSize==32?0:bits<<aSize;
+#else
+	iBits=bits<<aSize;
+#endif
+	return val|(bits>>(32-aSize));
+	}
+
+/** Read and decode a Huffman Code
+
+	Interpret the next bits in the input as a Huffman code in the specified
+	decoding. The decoding tree should be the output from Huffman::Decoding().
+
+	@param aTree The huffman decoding tree
+
+	@return The symbol that was decoded
+	
+	@leave "UnderflowL()" It the bit stream is exhausted more UnderflowL is called
+		to get more data
+*/
+EXPORT_C TUint TBitInput::HuffmanL(const TUint32* aTree)
+	{
+	TUint huff=0;
+	do
+		{
+		aTree=PtrAdd(aTree,huff>>16);
+		huff=*aTree;
+		if (ReadL()==0)
+			huff<<=16;
+		} while ((huff&0x10000u)==0);
+	return huff>>17;
+	}
+
+#endif
+
+/** Handle an empty input buffer
+
+	This virtual function is called when the input buffer is empty and
+	more bits are required. It should reset the input buffer with more
+	data using Set().
+
+	A derived class can replace this to read the data from a file
+	(for example) before reseting the input buffer.
+
+	@leave KErrUnderflow The default implementation leaves
+*/
+void TBitInput::UnderflowL()
+	{
+	User::Leave(KErrUnderflow);
+	}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32/euser/us_des.cpp	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,871 @@
+// Copyright (c) 1994-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32\euser\us_des.cpp
+// 
+//
+
+#include "us_std.h"
+
+// Terrible hack. Surely we should use VA_START instead of the below?
+#if defined(__EABI__) || (defined(__X86__) && defined(__GCC32__))
+#define EABI_STYLE_VA_LISTS
+#endif
+
+const TInt KNoPrecision=-1;
+const TInt KDefaultPrecision=6;
+const TInt KMaxRealWidth=0x20;
+
+// TFormatedText8 and TFormatedText16
+
+class TFormatedText8
+	{
+public:
+	TBuf8<0x40> iBuffer;
+	const TUint8* iText;
+	TInt iTextLength;
+	TInt iWidth;
+	TAlign iJustify;
+	TChar iFill;
+	};
+
+class TFormatedText16
+	{
+public:
+	TBuf16<0x40> iBuffer;
+	const TUint16* iText;
+	TInt iTextLength;
+	TInt iWidth;
+	TAlign iJustify;
+	TChar iFill;
+	};
+
+// TPanicker8 and TPanicker16
+
+class TPanicker8
+	{
+public:
+	static inline void Panic_BadFormatDescriptor() {Panic(ETDes8BadFormatDescriptor);}
+	static inline void Panic_BadFormatParams() {Panic(ETDes8BadFormatParams);}
+	};
+
+class TPanicker16
+	{
+public:
+	static inline void Panic_BadFormatDescriptor() {Panic(ETDes16BadFormatDescriptor);}
+	static inline void Panic_BadFormatParams() {Panic(ETDes16BadFormatParams);}
+	};
+
+// TFormatDirective
+
+class TFormatDirective // basically a sort of array of parameters where the size of each parameter is stored (no more than 4 parameters are possible per format-directive) - it also knows whether the format directive it represents has an explicit index, and if so, what that index is
+	{
+public:
+	inline TFormatDirective() :iSizesOfParametersInBytes(0), iFormatDirectiveIndex(EImplicitFormatDirectiveIndex) {}
+	void AppendParameter(TInt aSizeOfParameterInBytes,TInt aParameterAlignment);
+	inline void FormatDirectiveHasExplicitIndex(TInt aFormatDirectiveIndex) {iFormatDirectiveIndex=aFormatDirectiveIndex;}
+private:
+	friend class TParameterManager;
+private:
+	enum {EImplicitFormatDirectiveIndex=-1};
+	enum
+		{
+		EShiftToNumberOfParameters=28,
+		ENumberOfBitsPerParameter=5,
+		EMaskForSingleParameter=(1<<ENumberOfBitsPerParameter)-1,
+		EMaskForAlignmentShift=3,
+		EMaskForParameterSize=EMaskForSingleParameter&~EMaskForAlignmentShift,
+		EMaximumNumberOfParameters=EShiftToNumberOfParameters/ENumberOfBitsPerParameter
+		};
+private: // these functions are used by the TParameterManager class
+	inline TInt NumberOfParameters() const {return iSizesOfParametersInBytes>>EShiftToNumberOfParameters;}
+	TInt SizeOfParameter(TInt aIndex) const;
+	TUint8* CalculateDataPointer(const TUint8* aDataPtr,TInt aIndex) const;
+private:
+	TUint iSizesOfParametersInBytes; // a compactly stored array
+	TInt iFormatDirectiveIndex;
+	};
+
+void TFormatDirective::AppendParameter(TInt aSizeOfParameterInBytes, TInt aParameterAlignment)
+	{
+	const TInt numberOfParameters=NumberOfParameters();
+	__ASSERT_DEBUG(numberOfParameters<EMaximumNumberOfParameters, Panic(ENumberOfParametersExceedsMaximum));
+	__ASSERT_DEBUG((aSizeOfParameterInBytes&EMaskForParameterSize)==aSizeOfParameterInBytes, Panic(ESizeOfParameterTooBig));
+	iSizesOfParametersInBytes+=(1<<EShiftToNumberOfParameters); // increment the count
+
+	switch(aParameterAlignment)
+		{
+	case 4:
+		// aSizeOfParameterInBytes |= 0;
+		break;
+	case 8:
+		aSizeOfParameterInBytes |= 1;
+		break;
+	default:
+		__ASSERT_DEBUG(0, Panic(EUnexpectedError3));
+		}
+
+	iSizesOfParametersInBytes|=(aSizeOfParameterInBytes<<(numberOfParameters*ENumberOfBitsPerParameter)); // store aSizeOfParameterInBytes
+	}
+
+TInt TFormatDirective::SizeOfParameter(TInt aIndex) const
+	{
+	__ASSERT_DEBUG(aIndex<NumberOfParameters(), Panic(EParameterIndexOutOfRange1));
+	return (iSizesOfParametersInBytes>>(aIndex*ENumberOfBitsPerParameter))&EMaskForParameterSize;
+	}
+
+TUint8* TFormatDirective::CalculateDataPointer(const TUint8* aDataPtr,TInt aIndex) const
+	{
+	TInt numParams = NumberOfParameters();
+	__ASSERT_DEBUG(aIndex<=numParams, Panic(EParameterIndexOutOfRange1));
+	TInt paramInfo = iSizesOfParametersInBytes;
+	while(numParams--)
+		{
+		TInt alignMask = (4<<(paramInfo&EMaskForAlignmentShift))-1;
+		aDataPtr = (TUint8*)(((TInt)aDataPtr+alignMask)&~alignMask);
+		if(!aIndex--)
+			break;
+		aDataPtr += paramInfo&EMaskForParameterSize;
+		paramInfo >>= ENumberOfBitsPerParameter;
+		}
+	return const_cast<TUint8*>(aDataPtr);
+	}
+
+// TParameterManager
+
+class TParameterManager
+	{
+public:
+	TParameterManager();
+	void AddFormatDirective(const TFormatDirective& aFormatDirective);
+	TInt PrepareToExtractNextParameter(VA_LIST aList); // returns either KErrNone or KErrNotReady
+	void PrepareToExtractParameters(VA_LIST aList);
+	TInt ExtractParameter(TAny* aTarget, TInt aSizeOfParameterInBytes, TInt aFormatDirectiveIndex, TInt aParameterIndexWithinFormatDirective, const TFormatDirective* aNextFormatDirective);
+private:
+	enum
+		{
+		EMaximumNumberOfFormatDirectives=40,
+		ENumberOfBytesInBitArray=(EMaximumNumberOfFormatDirectives+7)/8
+		};
+private:
+	inline TBool FormatDirectiveIsSet(TInt aIndex) const {return iFormatDirectivesSet[aIndex/8]&(1<<(aIndex%8));}
+	inline void MarkFormatDirectiveAsSet(TInt aIndex) {iFormatDirectivesSet[aIndex/8]|=(1<<(aIndex%8)); __ASSERT_DEBUG(FormatDirectiveIsSet(aIndex), Panic(EFormatDirectiveAlreadySet1));}
+private:
+	TInt iNumberOfFormatDirectives;
+	TFixedArray<TUint8, ENumberOfBytesInBitArray> iFormatDirectivesSet;
+	TFixedArray<TFormatDirective, EMaximumNumberOfFormatDirectives> iFormatDirectives;
+	TFixedArray<const TUint8*, EMaximumNumberOfFormatDirectives> iFormatDirectiveDataPointers;
+	};
+
+TParameterManager::TParameterManager()
+	:iNumberOfFormatDirectives(0)
+	{
+	TInt i;
+	for (i=0; i<ENumberOfBytesInBitArray; ++i)
+		{
+		iFormatDirectivesSet[i]=0;
+		}
+	for (i=0; i<EMaximumNumberOfFormatDirectives; ++i)
+		{
+		iFormatDirectiveDataPointers[i]=NULL;
+		}
+	}
+
+void TParameterManager::AddFormatDirective(const TFormatDirective& aFormatDirective)
+	{
+	__ASSERT_ALWAYS(iNumberOfFormatDirectives<EMaximumNumberOfFormatDirectives, Panic(ENumberOfFormatDirectivesExceedsMaximum));
+	const TInt index=(aFormatDirective.iFormatDirectiveIndex>=0)? aFormatDirective.iFormatDirectiveIndex: iNumberOfFormatDirectives;
+	__ASSERT_ALWAYS(!FormatDirectiveIsSet(index), Panic(EFormatDirectiveAlreadySet2));
+	MarkFormatDirectiveAsSet(index);
+	iFormatDirectives[index]=aFormatDirective;
+	++iNumberOfFormatDirectives;
+	}
+
+TInt TParameterManager::PrepareToExtractNextParameter(VA_LIST aList)
+	{
+	if (iNumberOfFormatDirectives==0)
+		{
+#ifdef EABI_STYLE_VA_LISTS
+		// NB under the EABI we are passing va_list (a struct) by value. 
+		// We could extract the pointer using aList.__ap under RVCT, but I don't believe the EABI 
+		// extends to the name of the field. So I think the 'nasty' cast is likely to be more
+		// portable.
+		const TUint8 ** aL = (const TUint8**)&aList;
+		iFormatDirectiveDataPointers[iNumberOfFormatDirectives] = aL[0];
+#else
+		// The horrible cast is there because you can't assume aList is of 'array' type   
+		iFormatDirectiveDataPointers[iNumberOfFormatDirectives] = (const TUint8*)(*(TInt*)aList);
+#endif
+		}
+	else
+		{
+		const TInt previousFormatDirective=iNumberOfFormatDirectives-1;
+		const TUint8* dataPointer=iFormatDirectiveDataPointers[previousFormatDirective];
+		if ((dataPointer==NULL) || !FormatDirectiveIsSet(previousFormatDirective))
+			{
+			return KErrNotReady;
+			}
+		const TFormatDirective& formatDirective=iFormatDirectives[previousFormatDirective];
+		dataPointer = formatDirective.CalculateDataPointer(dataPointer,formatDirective.NumberOfParameters());
+		iFormatDirectiveDataPointers[iNumberOfFormatDirectives]=dataPointer;
+		}
+	return KErrNone;
+	}
+
+void TParameterManager::PrepareToExtractParameters(VA_LIST aList)
+	{
+#ifdef EABI_STYLE_VA_LISTS
+	// NB under the EABI we are passing va_list (a struct) by value. 
+	// We could extract the pointer using aList.__ap under RVCT, but I don't believe the EABI 
+	// extends to the name of the field. So I think the 'nasty' cast is likely to be more
+	// portable.
+	const TUint8 ** aL = (const TUint8**)&aList;
+	const TUint8* dataPointer = aL[0];
+#else
+	// The horrible cast is there because you can't assume aList is of 'array' type   
+	const TUint8* dataPointer = (const TUint8*)(*(TInt*)aList);
+#endif
+	if (iNumberOfFormatDirectives>0)
+		{
+		for (TInt i=0; ; ++i)
+			{
+			__ASSERT_ALWAYS(FormatDirectiveIsSet(i), Panic(EFormatDirectiveNotYetSet));
+			__ASSERT_DEBUG((iFormatDirectiveDataPointers[i]==NULL) || (iFormatDirectiveDataPointers[i]==dataPointer), Panic(EBadFormatDirectiveDataPointer));
+			iFormatDirectiveDataPointers[i]=dataPointer;
+			if (i+1>=iNumberOfFormatDirectives)
+				{
+				break;
+				}
+			const TFormatDirective& formatDirective=iFormatDirectives[i];
+			dataPointer = formatDirective.CalculateDataPointer(dataPointer,formatDirective.NumberOfParameters());
+			}
+		}
+	}
+
+TInt TParameterManager::ExtractParameter(TAny* aTarget, TInt aSizeOfParameterInBytes, TInt aFormatDirectiveIndex, TInt aParameterIndexWithinFormatDirective, const TFormatDirective* aNextFormatDirective)
+	{
+	__ASSERT_DEBUG(aFormatDirectiveIndex<EMaximumNumberOfFormatDirectives, Panic(EFormatDirectiveIndexOutOfRange));
+	const TFormatDirective* formatDirective=NULL;
+	if (aFormatDirectiveIndex<iNumberOfFormatDirectives)
+		{
+		if (!FormatDirectiveIsSet(aFormatDirectiveIndex))
+			{
+			return KErrNotReady;
+			}
+		formatDirective=&iFormatDirectives[aFormatDirectiveIndex];
+		}
+	else
+		{
+		__ASSERT_DEBUG(aNextFormatDirective!=NULL, Panic(ENotOnFirstPassOfFormatDescriptor1)); // the above condition (aFormatDirectiveIndex>=iNumberOfFormatDirectives) can only be the case on a first pass of the format descriptor, so assert that we're on the first pass
+		if (aFormatDirectiveIndex>iNumberOfFormatDirectives)
+			{
+			return KErrNotReady;
+			}
+		formatDirective=aNextFormatDirective;
+		}
+	__ASSERT_DEBUG(aSizeOfParameterInBytes==formatDirective->SizeOfParameter(aParameterIndexWithinFormatDirective), Panic(EInconsistentSizeOfParameter));
+	const TUint8* dataPointer=iFormatDirectiveDataPointers[aFormatDirectiveIndex];
+	if (dataPointer==NULL)
+		{
+		__ASSERT_DEBUG(aNextFormatDirective!=NULL, Panic(ENotOnFirstPassOfFormatDescriptor2)); // the above condition (dataPointer==NULL) can only be the case on a first pass of the format descriptor, so assert that we're on the first pass
+		return KErrNotReady;
+		}
+	__ASSERT_DEBUG(aParameterIndexWithinFormatDirective<formatDirective->NumberOfParameters(), Panic(EParameterIndexOutOfRange2));
+	dataPointer = formatDirective->CalculateDataPointer(dataPointer,aParameterIndexWithinFormatDirective);
+	Mem::Copy(aTarget, dataPointer, aSizeOfParameterInBytes);
+	return KErrNone;
+	}
+
+// TParameterHandler
+
+class TParameterHandler
+	{
+public:
+	enum TAction
+		{
+		EParameterNotExtracted,
+		EParameterExtracted
+		};
+public:
+	inline TParameterHandler(TInt aImplicitFormatDirectiveIndex, TParameterManager& aParameterManager, TFormatDirective& aFormatDirective) :iFormatDirectiveIndex(aImplicitFormatDirectiveIndex), iParameterIndex(0), iFormatDirective(&aFormatDirective), iParameterManager(aParameterManager) {} // for the first pass
+	inline TParameterHandler(TInt aImplicitFormatDirectiveIndex, TParameterManager& aParameterManager) :iFormatDirectiveIndex(aImplicitFormatDirectiveIndex), iParameterIndex(0), iFormatDirective(NULL), iParameterManager(aParameterManager) {} // for the second pass
+	TAction HandleParameter(TAny* aTarget, TInt aSizeOfParameterInBytes, TInt aParameterAlignment=4);
+	void FormatDirectiveHasExplicitIndex(TInt aFormatDirectiveIndex);
+private:
+	TInt iFormatDirectiveIndex;
+	TInt iParameterIndex;
+	TFormatDirective* iFormatDirective;
+	TParameterManager& iParameterManager;
+	};
+
+TParameterHandler::TAction TParameterHandler::HandleParameter(TAny* aTarget, TInt aSizeOfParameterInBytes, TInt aParameterAlignment)
+// Increments iParameterIndex each time it is called.
+// This is conceptually a sort of virtual function (i.e. it's behaviour depends on the way the object was constructed), although it is not implemented like that.
+	{
+	__ASSERT_DEBUG(aTarget!=NULL, Panic(ENullTargetPointer));
+	__ASSERT_DEBUG(aSizeOfParameterInBytes>=0, Panic(ENegativeSizeOfParameter));
+	const TUint machineWordAlignmentConstant=sizeof(TUint)-1;
+	aSizeOfParameterInBytes+=machineWordAlignmentConstant;
+	aSizeOfParameterInBytes&=~machineWordAlignmentConstant;
+
+	if (iFormatDirective!=NULL)
+		{
+		iFormatDirective->AppendParameter(aSizeOfParameterInBytes,aParameterAlignment);
+		}
+	const TInt error=iParameterManager.ExtractParameter(aTarget, aSizeOfParameterInBytes, iFormatDirectiveIndex, iParameterIndex, iFormatDirective);
+#if defined(_DEBUG)
+	if (iFormatDirective==NULL) // if we're on the second pass...
+		{
+		__ASSERT_DEBUG(error==KErrNone, Panic(EErrorOnSecondPassOfFormatDescriptor));
+		}
+	else
+		{
+		__ASSERT_DEBUG(error==KErrNone || error==KErrNotReady, Panic(EUnexpectedError1));
+		}
+#endif
+	++iParameterIndex;
+	return (error==KErrNone)? EParameterExtracted: EParameterNotExtracted;
+	}
+
+void TParameterHandler::FormatDirectiveHasExplicitIndex(TInt aFormatDirectiveIndex)
+	{
+	if (iFormatDirective!=NULL)
+		{
+		iFormatDirective->FormatDirectiveHasExplicitIndex(aFormatDirectiveIndex);
+		}
+	iFormatDirectiveIndex=aFormatDirectiveIndex;
+	}
+
+template <class XDesC, class XFormatedText, class XLex, class XPanicker, TInt XItemSize>
+void HandleFormatDirective(TParameterHandler& aParameterHandler, XFormatedText& aFormatedText, XLex& aFmt)
+//
+// Handle a single format directive, i.e. sequence starting with a '%', (although the initial '%' will have been consumed by this point).
+//
+	{
+
+// Determine alignment of various types on the stack. The FOFF approach 
+// does not work for GCC 3.4.4 on X86 so we use hardcoded constants instead.
+#if defined(__GCC32__) && defined(__X86__) 
+	const TInt KAlignTReal = 4;
+	const TInt KAlignTRealX = 4;
+	const TInt KAlignTInt64 = 4;
+#else
+	struct TReal_align {char c; TReal a;};
+	const TInt KAlignTReal = _FOFF(TReal_align,a);
+ #ifndef __VC32__ // MSVC generates an internal compiler error with the following code
+	struct TRealX_align {char c; TRealX a;};
+	const TInt KAlignTRealX = _FOFF(TRealX_align,a);
+
+	struct TInt64_align {char c; TInt64 a;};
+	const TInt KAlignTInt64 = _FOFF(TInt64_align,a);
+ #else
+	const TInt KAlignTRealX = 4;	// Hard code value for MSVC
+	const TInt KAlignTInt64 = 4;	// Hard code value for MSVC
+ #endif
+#endif
+
+	aFormatedText.iJustify=ERight; // Default is justify right
+	aFormatedText.iFill=KNoChar; // Default fill character is space
+	// After a % may come +,-,= or space
+	if (aFmt.Eos())
+		XPanicker::Panic_BadFormatDescriptor();
+	TChar c=aFmt.Get();
+
+	if (c=='$')
+		{
+		TInt formatDirectiveIndex;
+		if (aFmt.Val(formatDirectiveIndex)!=0)
+			XPanicker::Panic_BadFormatDescriptor();
+		aParameterHandler.FormatDirectiveHasExplicitIndex(formatDirectiveIndex-1);
+		if (aFmt.Get()!='$')
+			XPanicker::Panic_BadFormatDescriptor();
+		c=aFmt.Get();
+		}
+
+	switch (c)
+		{
+	case ' ':
+		aFormatedText.iFill=' ';
+		break;
+	case '-':
+		aFormatedText.iJustify=ELeft;
+		goto getFill;
+	case '=':
+		aFormatedText.iJustify=ECenter;
+		goto getFill;
+	case '+':
+getFill:
+		if (aFmt.Eos())
+			XPanicker::Panic_BadFormatDescriptor();
+		if (!aFmt.Peek().IsDigit())
+			{
+			aFormatedText.iFill=aFmt.Get(); // assigning aFormatedText.iFill to something other than KNoChar is necessary as the aParameterHandler.HandleParameter call a couple of lines below will not necessarily set its first parameter (i.e. aFormatedText.iFill) - aFormatedText.iFill is tested against KNoChar ten or so lines below
+			if (aFormatedText.iFill=='*') // If*  take it from the arguments
+				aParameterHandler.HandleParameter(&aFormatedText.iFill, sizeof(TUint));
+			}
+		break;
+	default:
+		aFmt.UnGet();
+		}
+
+	aFormatedText.iWidth=KDefaultJustifyWidth; // Default width is whatever the conversion takes
+	if (aFmt.Peek().IsDigit())
+		{
+		// If it starts with 0 and the fill character has not been
+		// specified then the fill character will be a 0
+		// For compatibility with standard C libraries
+		if (aFmt.Peek()=='0' && aFormatedText.iFill==KNoChar)
+			{
+			aFormatedText.iFill='0';
+			aFmt.Inc();
+			}
+		if (aFmt.Peek()!='*')
+			if (aFmt.Val(aFormatedText.iWidth)) // Convert field width value
+				XPanicker::Panic_BadFormatDescriptor();
+		}
+	if (aFmt.Peek()=='*' && aFormatedText.iWidth==KDefaultJustifyWidth) // If a * then get width from arguments
+		{
+		aParameterHandler.HandleParameter(&aFormatedText.iWidth, sizeof(TInt));
+		aFmt.Inc();
+		}
+	// Get precision setting if given
+	TInt precision=KNoPrecision;
+	if (aFmt.Peek()=='.')
+		{
+		aFmt.Inc();
+		if (aFmt.Peek()=='*')
+			{
+			aParameterHandler.HandleParameter(&precision, sizeof(TInt));
+			aFmt.Inc();
+			}
+		else if (aFmt.Val(precision))
+			XPanicker::Panic_BadFormatDescriptor();
+		}
+	if (aFormatedText.iFill==KNoChar) // If still default fill character make it space
+		aFormatedText.iFill=' ';
+	if (aFmt.Eos())
+		XPanicker::Panic_BadFormatDescriptor();
+	TChar selector;
+	TBool lng=EFalse;
+	TCharUC f=aFmt.Peek();
+	if (f=='L') // If l set selector for longs
+		{
+		aFmt.Inc();
+		lng=ETrue;
+		}
+	selector=aFmt.Get(); // Get the selector in upper case
+	aFormatedText.iText=aFormatedText.iBuffer.Ptr();
+	aFormatedText.iTextLength=1;
+	TRadix radix=EDecimal;
+	TUint uVal=0;
+	TReal rVal=0;
+	TRealX rValX=0;
+	TInt realFormatType=KRealFormatFixed;
+	switch (selector)
+		{
+	case 'S': // String conversion
+		{
+		const XDesC* pB;
+		if (aParameterHandler.HandleParameter(&pB, sizeof(const TAny*))==TParameterHandler::EParameterExtracted)
+			{
+			__ASSERT_DEBUG(pB!=0,XPanicker::Panic_BadFormatParams());
+			aFormatedText.iTextLength=pB->Length();
+			if (precision!=KNoPrecision && precision<aFormatedText.iTextLength)
+				aFormatedText.iTextLength=precision;
+			aFormatedText.iText=pB->Ptr();
+			}
+		}
+		break;
+	case 's':
+		if (aParameterHandler.HandleParameter(&aFormatedText.iText, sizeof(const TAny*))==TParameterHandler::EParameterExtracted)
+			{
+			__ASSERT_DEBUG(aFormatedText.iText!=0,XPanicker::Panic_BadFormatParams());
+			if (precision!=KNoPrecision)
+				aFormatedText.iTextLength=precision;
+			else
+				aFormatedText.iTextLength=User::StringLength(aFormatedText.iText);
+			}
+		break;
+	case 'O':
+	case 'o':
+		radix=EOctal;
+		goto lConv;
+	case 'X':
+	case 'x':
+		radix=EHex;
+		goto lConv;
+	case 'B': // Binary conversion
+	case 'b':
+		radix=EBinary;
+	case 'U':
+	case 'u':
+lConv:
+		if (lng)
+			{
+			TInt64 uVal64 = 0;
+			if (aParameterHandler.HandleParameter(&uVal64, sizeof(TInt64), KAlignTInt64)==TParameterHandler::EParameterExtracted)
+				{
+				if (selector=='X')
+					aFormatedText.iBuffer.NumUC(uVal64,radix);
+				else
+					aFormatedText.iBuffer.Num(uVal64,radix);
+				}
+			}
+		else
+			{
+			if (aParameterHandler.HandleParameter(&uVal, sizeof(TUint))==TParameterHandler::EParameterExtracted)
+				{
+				if (selector=='X')
+					aFormatedText.iBuffer.NumUC(uVal,radix);
+				else
+					aFormatedText.iBuffer.Num(uVal,radix);
+				}
+			}
+		aFormatedText.iTextLength=aFormatedText.iBuffer.Length();
+		break;
+	case 'D': // Decimal conversion
+	case 'd':
+	case 'I':
+	case 'i':
+		if (lng)
+			{
+			TInt64 iVal64=0;
+			if (aParameterHandler.HandleParameter(&iVal64, sizeof(TInt64),KAlignTInt64)==TParameterHandler::EParameterExtracted)
+				{
+				aFormatedText.iBuffer.Num(iVal64);
+				}
+			}
+		else
+			{
+			TInt iVal=0;
+			if (aParameterHandler.HandleParameter(&iVal, sizeof(TInt))==TParameterHandler::EParameterExtracted)
+				{
+				aFormatedText.iBuffer.Num(iVal);
+				}
+			}
+		aFormatedText.iTextLength=aFormatedText.iBuffer.Length();
+		break;
+	case 'P': // Padded conversion
+	case 'p':
+		aFormatedText.iTextLength=0;
+		break;
+	case 'C':
+	case 'c': // Ascii character conversion
+		if (aParameterHandler.HandleParameter(&uVal, sizeof(TUint))==TParameterHandler::EParameterExtracted)
+			{
+			aFormatedText.iBuffer.Append(uVal);
+			}
+		break;
+	case 'W': // SLONG binary lsb first conversion
+	case 'M': // SLONG binary msb first conversion
+		if (aParameterHandler.HandleParameter(&uVal, sizeof(TUint))!=TParameterHandler::EParameterExtracted)
+			{
+			break;
+			}
+		aFormatedText.iTextLength=4/XItemSize;
+		goto doBinary;
+	case 'w': // SWORD binary lsb first conversion
+	case 'm': // SWORD binary msb first conversion
+		if (aParameterHandler.HandleParameter(&uVal, sizeof(TUint))!=TParameterHandler::EParameterExtracted)
+			{
+			break;
+			}
+		aFormatedText.iTextLength=2/XItemSize;
+		//goto doBinary;
+doBinary:
+		{
+		TUint8* pC;
+		TInt increment;
+		if (selector=='m' || selector=='M')
+			{
+			pC=((TUint8*)(aFormatedText.iText+aFormatedText.iTextLength))-1;
+			increment=(-1);
+			}
+		else
+			{
+			pC=(TUint8*)aFormatedText.iText;
+			increment=1;
+			}
+		for (TInt k=aFormatedText.iTextLength*sizeof(*aFormatedText.iText);k>0;--k)
+			{
+			*pC=(TUint8)uVal;
+			pC+=increment;
+			uVal>>=8;
+			}
+		}
+		break;
+	case 'F': // TRealX conversion
+		if (aParameterHandler.HandleParameter(&rValX, sizeof(TRealX), KAlignTRealX)!=TParameterHandler::EParameterExtracted)
+			{
+			break;
+			}
+		rVal=rValX;
+		goto doReal;
+	case 'f': // TReal conversion
+		if (aParameterHandler.HandleParameter(&rVal, sizeof(TReal), KAlignTReal)!=TParameterHandler::EParameterExtracted)
+			{
+			break;
+			}
+		goto doReal;
+	case 'E':
+		if (aParameterHandler.HandleParameter(&rValX, sizeof(TRealX), KAlignTRealX)!=TParameterHandler::EParameterExtracted)
+			{
+			break;
+			}
+		rVal=rValX;
+		realFormatType=KRealFormatExponent|KAllowThreeDigitExp; 	// AnnW - changed from EExponent
+		goto doReal;
+	case 'e':
+		if (aParameterHandler.HandleParameter(&rVal, sizeof(TReal), KAlignTReal)!=TParameterHandler::EParameterExtracted)
+			{
+			break;
+			}
+		realFormatType=KRealFormatExponent|KAllowThreeDigitExp; 	// AnnW - changed from EExponent
+		//goto doReal;
+doReal:
+		{
+		if (precision==KNoPrecision)
+			precision=KDefaultPrecision;
+		TRealFormat realFormat(KMaxRealWidth, precision);
+		realFormat.iType=realFormatType;
+		aFormatedText.iTextLength=aFormatedText.iBuffer.Num(rVal, realFormat);
+		if (aFormatedText.iTextLength<0)
+			{
+			if (aFormatedText.iTextLength==KErrGeneral)
+				XPanicker::Panic_BadFormatDescriptor();
+			else
+				aFormatedText.iTextLength=aFormatedText.iBuffer.Length();
+			}
+		if (aFormatedText.iWidth!=KDefaultJustifyWidth && aFormatedText.iTextLength>aFormatedText.iWidth)
+			aFormatedText.iWidth=aFormatedText.iTextLength;
+		}
+		break;
+	case 'G':
+		if (aParameterHandler.HandleParameter(&rValX, sizeof(TRealX), KAlignTRealX)!=TParameterHandler::EParameterExtracted)
+			{
+			break;
+			}
+		rVal=rValX;
+		goto doGReal;
+	case 'g':
+		if (aParameterHandler.HandleParameter(&rVal, sizeof(TReal), KAlignTReal)!=TParameterHandler::EParameterExtracted)
+			{
+			break;
+			}
+		//goto doGReal;
+doGReal:
+		{
+		if (precision==KNoPrecision)
+			precision=KDefaultPrecision;
+
+		// aFormatedText.iBuffer must be >= KMaxRealWidth
+		TRealFormat realFormat(KMaxRealWidth, precision);	// Changed from 'width' to KMaxRealWidth
+		realFormat.iType=KRealFormatGeneral|KAllowThreeDigitExp;	// AnnW - changed from EGeneral
+		aFormatedText.iTextLength=aFormatedText.iBuffer.Num(rVal, realFormat);
+		if (aFormatedText.iTextLength<0)
+			{
+			// Doesn't fit in given width
+			realFormat.iWidth=KDefaultRealWidth;
+			aFormatedText.iTextLength=aFormatedText.iBuffer.Num(rVal, realFormat);
+			}
+		if (aFormatedText.iTextLength<0)
+			{
+			if (aFormatedText.iTextLength==KErrGeneral)
+				XPanicker::Panic_BadFormatDescriptor();
+			else
+				aFormatedText.iTextLength=aFormatedText.iBuffer.Length();
+			}
+		if (aFormatedText.iWidth!=KDefaultJustifyWidth && aFormatedText.iTextLength>aFormatedText.iWidth)
+			aFormatedText.iWidth=aFormatedText.iTextLength;
+		}
+		break;
+	default: // Not recognized - output % something
+		XPanicker::Panic_BadFormatDescriptor();
+		}
+	// Justify result of conversion
+	if (aFormatedText.iWidth==KDefaultJustifyWidth)
+		aFormatedText.iWidth=aFormatedText.iTextLength;
+	if (aFormatedText.iTextLength>aFormatedText.iWidth)
+		aFormatedText.iTextLength=aFormatedText.iWidth;
+	}
+
+template <class XDes, class XDesOverflow, class XDesC, class XFormatedText, class XLex, class XPanicker, TInt XItemSize>
+void DoAppendFormatList(XDes& aThis,const XDesC& aFormat,VA_LIST aList,XDesOverflow* aOverflowHandler)
+//
+// Convert the argument list, using the format descriptor.
+//
+	{
+
+	const TInt overflowLength=aOverflowHandler? aThis.MaxLength(): KMaxTInt;
+	const TInt originalLength=aThis.Length();
+	TBool needSecondPass=EFalse;
+	TParameterManager parameterManager;
+	XLex format(aFormat);
+	TInt implicitFormatDirectiveIndex=0;
+	FOREVER
+		{
+		if (format.Eos())
+			{
+			break;
+			}
+		const TChar character=format.Get();
+		if (character!='%')
+			{
+			if (!needSecondPass)
+				{
+				if (aThis.Length()>=overflowLength)
+					{
+					aOverflowHandler->Overflow(aThis);
+					return;
+					}
+				aThis.Append(character);
+				}
+			}
+		else if (format.Peek()=='%')
+			{
+			if (!needSecondPass)
+				{
+				if (aThis.Length()>=overflowLength)
+					{
+					aOverflowHandler->Overflow(aThis);
+					return;
+					}
+				aThis.Append(character);
+				}
+			format.Inc();
+			}
+		else
+			{
+			TFormatDirective formatDirective;
+			TParameterHandler parameterHandler(implicitFormatDirectiveIndex, parameterManager, formatDirective);
+			XFormatedText formatedText;
+			const TInt error=parameterManager.PrepareToExtractNextParameter(aList);
+			if (error!=KErrNone)
+				{
+				__ASSERT_DEBUG(error==KErrNotReady, Panic(EUnexpectedError2));
+				needSecondPass=ETrue;
+				}
+			HandleFormatDirective<XDesC, XFormatedText, XLex, XPanicker, XItemSize>(parameterHandler, formatedText, format);
+			parameterManager.AddFormatDirective(formatDirective);
+			if (!needSecondPass)
+				{
+				if ((aThis.Length()+formatedText.iWidth)>overflowLength)
+					{
+					aOverflowHandler->Overflow(aThis);
+					return;
+					}
+				aThis.AppendJustify(formatedText.iText, formatedText.iTextLength, formatedText.iWidth, formatedText.iJustify, formatedText.iFill);
+				}
+			++implicitFormatDirectiveIndex;
+			}
+		}
+	if (needSecondPass)
+		{
+		aThis.SetLength(originalLength);
+		parameterManager.PrepareToExtractParameters(aList);
+		format=aFormat;
+		implicitFormatDirectiveIndex=0;
+		FOREVER
+			{
+			if (format.Eos())
+				{
+				break;
+				}
+			const TChar character=format.Get();
+			if (character!='%')
+				{
+				if (aThis.Length()>=overflowLength)
+					{
+					aOverflowHandler->Overflow(aThis);
+					return;
+					}
+				aThis.Append(character);
+				}
+			else if (format.Peek()=='%')
+				{
+				if (aThis.Length()>=overflowLength)
+					{
+					aOverflowHandler->Overflow(aThis);
+					return;
+					}
+				aThis.Append(character);
+				format.Inc();
+				}
+			else
+				{
+				TParameterHandler parameterHandler(implicitFormatDirectiveIndex, parameterManager);
+				XFormatedText formatedText;
+				HandleFormatDirective<XDesC, XFormatedText, XLex, XPanicker, XItemSize>(parameterHandler, formatedText, format);
+				if ((aThis.Length()+formatedText.iWidth)>overflowLength)
+					{
+					aOverflowHandler->Overflow(aThis);
+					return;
+					}
+				aThis.AppendJustify(formatedText.iText, formatedText.iTextLength, formatedText.iWidth, formatedText.iJustify, formatedText.iFill);
+				++implicitFormatDirectiveIndex;
+				}
+			}
+		}
+	}
+
+
+
+
+/**
+Formats and appends text onto the end of this descriptor's data.
+	
+The length of this descriptor is incremented to reflect the new content.
+	
+The behaviour of this function is the same as
+AppendFormat(TRefByValue<const TDesC8> aFmt,TDes8Overflow *aOverflowHandler,...).
+In practice, it is better and easier to use AppendFormat(), passing a variable number of 
+arguments as required by the format string.
+	
+@param aFormat          The descriptor containing the format string.
+@param aList            A pointer to an argument list.
+@param aOverflowHandler If supplied, a pointer to the overflow handler.
+
+@see TDes8::AppendFormat
+@see VA_LIST 
+*/
+EXPORT_C void TDes8::AppendFormatList(const TDesC8 &aFormat,VA_LIST aList,TDes8Overflow *aOverflowHandler)
+	{
+
+	DoAppendFormatList<TDes8, TDes8Overflow, TDesC8, TFormatedText8, TLex8, TPanicker8, sizeof(TUint8)>(*this,aFormat,aList,aOverflowHandler);
+	}
+
+
+
+/**
+Formats and appends text onto the end of this descriptor's data.
+	
+The length of this descriptor is incremented to reflect the new content.
+	
+The behaviour of this function is the same as
+AppendFormat(TRefByValue<const TDesC16> aFmt,TDes16Overflow *aOverflowHandler,...).
+In practice, it is better and easier to use AppendFormat(), passing a variable number of 
+arguments as required by the format string.
+	
+@param aFormat          The descriptor containing the format string.
+@param aList            A pointer to an argument list.
+@param aOverflowHandler If supplied, a pointer to the overflow handler.
+
+@see TDes16::AppendFormat
+@see VA_LIST 
+*/
+EXPORT_C void TDes16::AppendFormatList(const TDesC16 &aFormat,VA_LIST aList,TDes16Overflow *aOverflowHandler)
+	{
+
+	DoAppendFormatList<TDes16, TDes16Overflow, TDesC16, TFormatedText16, TLex16, TPanicker16, sizeof(TUint16)>(*this,aFormat,aList,aOverflowHandler);
+	}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32/euser/us_encode.cpp	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,477 @@
+// Copyright (c) 1998-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32\euser\us_encode.cpp
+// 
+//
+
+#include <e32huffman.h>
+#include <e32base.h>
+#include <e32panic.h>
+
+_LIT(KCat,"Huffman");
+// local definitions used for Huffman code generation
+typedef TUint16 THuff;		/** @internal */
+const THuff KLeaf=0x8000;	/** @internal */
+struct TNode
+/** @internal */
+	{
+	TUint iCount;
+	THuff iLeft;
+	THuff iRight;
+	};
+
+/** recursive function to calculate the code lengths from the node tree
+
+	@internalComponent
+*/
+void HuffmanLengthsL(TUint32* aLengths,const TNode* aNodes,TInt aNode,TInt aLen)
+	{
+	if (++aLen>Huffman::KMaxCodeLength)
+		User::Leave(KErrOverflow);
+
+	const TNode& node=aNodes[aNode];
+	TUint x=node.iLeft;
+	if (x&KLeaf)
+		aLengths[x&~KLeaf]=aLen;
+	else
+		HuffmanLengthsL(aLengths,aNodes,x,aLen);
+	x=node.iRight;
+	if (x&KLeaf)
+		aLengths[x&~KLeaf]=aLen;
+	else
+		HuffmanLengthsL(aLengths,aNodes,x,aLen);
+	}
+
+/**	Insert the {aCount,aValue} pair into the already sorted array of nodes
+
+	@internalComponent
+*/
+void InsertInOrder(TNode* aNodes, TInt aSize, TUint aCount, TInt aVal)
+	{
+	// Uses Insertion sort following a binary search...
+	TInt l=0, r=aSize;
+	while (l < r)
+		{
+		TInt m = (l+r) >> 1;
+		if (aNodes[m].iCount<aCount)
+			r=m;
+		else
+			l=m+1;
+		}
+	Mem::Copy(aNodes+l+1,aNodes+l,sizeof(TNode)*(aSize-l));
+	aNodes[l].iCount=aCount;
+	aNodes[l].iRight=TUint16(aVal);
+	}
+
+/** Generate a Huffman code
+
+	This generates a Huffman code for a given set of code frequencies. The output
+	is a table of code lengths which can be used to build canonincal encoding tables
+	or decoding trees for use with the TBitInput and TBitOutput classes.
+
+	Entries in the table with a frequency of zero will have a zero code length
+	and thus no associated huffman encoding. If each such symbol should have a
+	maximum length encoding, they must be given at least a frequency of 1.
+
+	For an alphabet of n symbols, this algorithm has a transient memory overhead
+	of 8n, and a time complexity of O(n*log(n)).
+
+	@param aFrequency The table of code frequencies
+	@param aNumCodes The number of codes in the table
+	@param aHuffman The table for the output code-length table. This must be
+		the same size as the frequency table, and can safely be the same table
+
+	@leave KErrNoMemory If memory used for code generation cannot be allocated
+
+  	@panic "USER ???" If the number of codes exceeds Huffman::KMaxCodes
+*/
+EXPORT_C void Huffman::HuffmanL(const TUint32 aFrequency[],TInt aNumCodes,TUint32 aHuffman[])
+	{
+	__ASSERT_ALWAYS(TUint(aNumCodes)<=TUint(KMaxCodes),User::Panic(KCat,EHuffmanTooManyCodes));
+
+	// Sort the values into decreasing order of frequency
+	//
+	TNode* nodes = new(ELeave) TNode[aNumCodes];
+	CleanupArrayDeletePushL(nodes);
+	TInt lCount=0;
+
+	for (TInt ii=0;ii<aNumCodes;++ii)
+		{
+		TInt c=aFrequency[ii];
+		if (c!=0)
+			InsertInOrder(nodes,lCount++,c,ii|KLeaf);
+		}
+
+	// default code length is zero
+	Mem::FillZ(aHuffman,aNumCodes*sizeof(TUint32));
+
+	if (lCount==0)
+		{
+		// no codes with frequency>0. No code has a length
+		}
+	else if (lCount==1)
+		{
+		// special case for a single value (always encode as "0")
+		aHuffman[nodes[0].iRight&~KLeaf]=1;
+		}
+	else
+		{
+		// Huffman algorithm: pair off least frequent nodes and reorder
+		//
+		do
+			{
+			--lCount;
+			TUint c=nodes[lCount].iCount + nodes[lCount-1].iCount;
+			nodes[lCount].iLeft=nodes[lCount-1].iRight;
+			// re-order the leaves now to reflect new combined frequency 'c'
+			InsertInOrder(nodes,lCount-1,c,lCount);
+			} while (lCount>1);
+		// generate code lengths in aHuffman[]
+		HuffmanLengthsL(aHuffman,nodes,1,0);
+		}
+	CleanupStack::PopAndDestroy(nodes);
+
+	__ASSERT_DEBUG(IsValid(aHuffman,aNumCodes),User::Panic(KCat,EHuffmanInvalidCoding));
+	}
+
+/** Validate a Huffman encoding
+
+	This verifies that a Huffman coding described by the code lengths is valid.
+	In particular, it ensures that no code exceeds the maximum length and
+	that it is possible to generate a canonical coding for the specified lengths.
+	
+	@param aHuffman The table of code lengths as generated by Huffman::HuffmanL()
+	@param aNumCodes The number of codes in the table
+
+	@return True if the code is valid, otherwise false
+*/
+EXPORT_C TBool Huffman::IsValid(const TUint32 aHuffman[],TInt aNumCodes)
+	{
+	// The code is valid if one of the following holds:
+	// (a) the code exactly fills the 'code space'
+	// (b) there is only a single symbol with code length 1
+	// (c) there are no encoded symbols
+	//
+	TUint remain=1<<KMaxCodeLength;
+	TInt totlen=0;
+	for (const TUint32* p=aHuffman+aNumCodes; p>aHuffman;)
+		{
+		TInt len=*--p;
+		if (len>0)
+			{
+			totlen+=len;
+			if (len>KMaxCodeLength)
+				return EFalse;
+			TUint c=1<<(KMaxCodeLength-len);
+			if (c>remain)
+				return EFalse;
+			remain-=c;
+			}
+		}
+
+	return remain==0 || totlen<=1;
+	}
+
+/** Create a canonical Huffman encoding table
+
+	This generates the huffman codes used by TBitOutput::HuffmanL() to write huffman
+	encoded data. The input is table of code lengths, as generated by Huffman::HuffmanL()
+	and must represent a valid huffman code.
+	
+	@param aHuffman The table of code lengths as generated by Huffman::HuffmanL()
+	@param aNumCodes The number of codes in the table
+	@param aEncodeTable The table for the output huffman codes. This must be
+		the same size as the code-length table, and can safely be the same table
+
+	@panic "USER ???" If the provided code is not a valid Huffman coding
+	
+	@see IsValid()
+	@see HuffmanL()
+*/
+EXPORT_C void Huffman::Encoding(const TUint32 aHuffman[],TInt aNumCodes,TUint32 aEncodeTable[])
+	{
+	__ASSERT_ALWAYS(IsValid(aHuffman,aNumCodes),User::Panic(KCat,EHuffmanInvalidCoding));
+
+	TFixedArray<TInt,KMaxCodeLength> lenCount;
+	lenCount.Reset();
+
+	TInt ii;
+	for (ii=0;ii<aNumCodes;++ii)
+		{
+		TInt len=aHuffman[ii]-1;
+		if (len>=0)
+			++lenCount[len];
+		}
+
+	TFixedArray<TUint,KMaxCodeLength> nextCode;
+	TUint code=0;
+	for (ii=0;ii<KMaxCodeLength;++ii)
+		{
+		code<<=1;
+		nextCode[ii]=code;
+		code+=lenCount[ii];
+		}
+
+	for (ii=0;ii<aNumCodes;++ii)
+		{
+		TInt len=aHuffman[ii];
+		if (len==0)
+			aEncodeTable[ii]=0;
+		else
+			{
+			aEncodeTable[ii] = (nextCode[len-1]<<(KMaxCodeLength-len))|(len<<KMaxCodeLength);
+			++nextCode[len-1];
+			}
+		}
+	}
+
+/** the encoding table for the externalised code
+	@internalComponent
+*/
+const TUint32 HuffmanEncoding[]=
+	{
+	0x10000000,
+	0x1c000000,
+	0x12000000,
+	0x1d000000,
+	0x26000000,
+	0x26800000,
+	0x2f000000,
+	0x37400000,
+	0x37600000,
+	0x37800000,
+	0x3fa00000,
+	0x3fb00000,
+	0x3fc00000,
+	0x3fd00000,
+	0x47e00000,
+	0x47e80000,
+	0x47f00000,
+	0x4ff80000,
+	0x57fc0000,
+	0x5ffe0000,
+	0x67ff0000,
+	0x77ff8000,
+	0x7fffa000,
+	0x7fffb000,
+	0x7fffc000,
+	0x7fffd000,
+	0x7fffe000,
+	0x87fff000,
+	0x87fff800
+	};
+
+/** encode 0a as '0' and 0b as '1', return number of symbols created
+
+	@internalComponent
+*/
+void EncodeRunLengthL(TBitOutput& aOutput, TInt aLength)
+	{
+	if (aLength>0)
+		{
+		EncodeRunLengthL(aOutput,(aLength-1)>>1);
+		aOutput.HuffmanL(HuffmanEncoding[1-(aLength&1)]);
+		}
+	}
+
+/** Store a canonical huffman encoding in compact form
+
+	As the encoding is canonical, only the code lengths of each code needs to be saved.
+
+	Due to the nature of code length tables, these can usually be stored very compactly
+	by encoding the encoding itself, hence the use of the bit output stream.
+	
+	@param aOutput The output stream for the encoding
+	@param aHuffman The table of code lengths as generated by Huffman::HuffmanL()
+	@param aNumCodes The number of huffman codes in the table
+
+	@leave TBitOutput::HuffmanL()
+*/
+EXPORT_C void Huffman::ExternalizeL(TBitOutput& aOutput,const TUint32 aHuffman[],TInt aNumCodes)
+	{
+	// We assume that the code length table is generated by the huffman generator,
+	// in which case the maxmimum code length is 27 bits.
+	//
+	// We apply three transformations to the data:
+	// 1. the data goes through a move-to-front coder
+	// 2. apply a rle-0 coder which replace runs of '0' with streams of '0a' and '0b'
+	// 3. encode the result using a predefined (average) huffman coding
+	//
+	// This can be done in a single pass over the data, avoiding the need for additional
+	// memory.
+	//
+	// initialise the list for the MTF coder
+	TFixedArray<TUint8,Huffman::KMetaCodes> list;
+	TInt i;
+	for (i=0;i<list.Count();++i)
+		list[i]=TUint8(i);
+	TInt last=0;
+
+	TInt rl=0;
+	const TUint32* p32=aHuffman;
+	const TUint32* e32=p32+aNumCodes;
+	while (p32<e32)
+		{
+		TInt c=*p32++;
+		if (c==last)
+			++rl;	// repeat of last symbol
+		else
+			{
+			// encode run-length
+			EncodeRunLengthL(aOutput,rl);
+			rl=0;
+			// find code in MTF list
+			TInt j;
+			for (j=1;list[j]!=c;++j)
+				;
+			// store this code
+			aOutput.HuffmanL(HuffmanEncoding[j+1]);
+			// adjust list for MTF algorithm
+			while (--j>0)
+				list[j+1]=list[j];
+			list[1]=TUint8(last);
+			last=c;
+			}
+		}
+	// encod any remaining run-length
+	EncodeRunLengthL(aOutput,rl);
+	}
+
+
+/** Construct a bit stream output object
+
+	Following construction the bit stream is ready for writing bits, but will first call
+	OverflowL() as the output buffer is 'full'. A derived class can detect this state as
+	Ptr() will return null.
+*/
+EXPORT_C TBitOutput::TBitOutput()
+	:iCode(0),iBits(-8),iPtr(0),iEnd(0)
+	{}
+
+/** Construct a bit stream output object over a buffer
+
+	Data will be written to the buffer until it is full, at which point OverflowL() will
+	be called. This should handle the data and then can Set() again to reset the buffer
+	for further output.
+	
+	@param aBuf The buffer for output
+	@param aSize The size of the buffer in bytes
+*/
+EXPORT_C TBitOutput::TBitOutput(TUint8* aBuf,TInt aSize)
+	:iCode(0),iBits(-8),iPtr(aBuf),iEnd(aBuf+aSize)
+	{}
+
+/** Write a huffman code
+
+	This expects a huffman code value as generated by Huffman::Encoding()
+
+	@param aHuffCode The huffman code write to the stream
+
+	@leave OverflowL() If the output buffer is full, OverflowL() is called
+*/
+EXPORT_C void TBitOutput::HuffmanL(TUint aHuffCode)
+	{
+	DoWriteL(aHuffCode<<(32-Huffman::KMaxCodeLength),aHuffCode>>Huffman::KMaxCodeLength);
+	}
+
+/** Write an arbitrary integer value
+
+	Write an unsigned integer using the number of bits specified. Only
+	the low order bits of the value are written to the output, most
+	significant bit first.
+
+	@param aValue The value to write to the stream
+	@param aLength The number of bits to output
+
+	@leave OverflowL() If the output buffer is full, OverflowL() is called
+*/
+EXPORT_C void TBitOutput::WriteL(TUint aValue,TInt aLength)
+	{
+	if (aLength)
+		DoWriteL(aValue<<=32-aLength,aLength);
+	}
+
+/** Pad the bitstream to the next byte boundary
+
+	Terminate the bitstream by padding the last byte with the requested value.
+	Following this operation the bitstream can continue to be used, the data will
+	start at the next byte.
+
+	@param aPadding The bit value to pad the final byte with
+
+	@leave OverflowL() If the output buffer is full, OverflowL() is called
+*/
+EXPORT_C void TBitOutput::PadL(TUint aPadding)
+	{
+	if (iBits>-8)
+		WriteL(aPadding?0xffffffffu:0,-iBits);
+	}
+
+/** Write the higher order bits to the stream
+	
+	@internalComponent
+*/
+void TBitOutput::DoWriteL(TUint aBits,TInt aSize)
+	{
+	if (aSize>25)
+		{
+		// cannot process >25 bits in a single pass
+		// so do the top 8 bits first
+		ASSERT(aSize<=32);
+		DoWriteL(aBits&0xff000000u,8);
+		aBits<<=8;
+		aSize-=8;
+		}
+
+	TInt bits=iBits;
+	TUint code=iCode|(aBits>>(bits+8));
+	bits+=aSize;
+	if (bits>=0)
+		{
+		TUint8* p=iPtr;
+		do
+			{
+			if (p==iEnd)
+				{
+				// run out of buffer space so invoke the overflow handler
+				iPtr=p;
+				OverflowL();
+				p=iPtr;
+				ASSERT(p!=iEnd);
+				}
+			*p++=TUint8(code>>24);
+			code<<=8;
+			bits-=8;
+			} while (bits>=0);
+		iPtr=p;
+		}
+	iCode=code;
+	iBits=bits;
+	}
+
+/** Handle a full output buffer
+
+	This virtual function is called when the output buffer is full. It should deal
+	with the data in the buffer before reseting the buffer using Set(), allowing
+	further data to be written.
+
+	A derived class can replace this to write the data to a file (for example)
+	before marking the buffer as empty.
+
+	@leave KErrOverflow The default implementation leaves
+*/
+void TBitOutput::OverflowL()
+	{
+	User::Leave(KErrOverflow);
+	}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32/euser/us_exec.cpp	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,6664 @@
+// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32\euser\us_exec.cpp
+// 
+//
+
+#include "us_std.h"
+#include "us_data.h"
+#include <e32kpan.h>
+#include <unicode.h>
+#include <videodriver.h>
+#include "compareimp.h"
+
+#ifdef __VC32__
+  #pragma setlocale("english")
+#endif
+
+#ifdef __TOOLS2__
+#include <stdlib.h>
+
+extern TInt gAllocCount;
+extern TInt gAllocFailRate;
+extern RAllocator::TAllocFail gAllocFailType;
+
+#endif
+
+_LIT(KLitSpace, " ");
+_LIT(KLitOpeningBracket, "(");
+_LIT(KLitMinusSign, "-");
+_LIT(KLitZeroPad, "0");
+
+// Private use area ranges of printable/non-printable characters.
+// This is a sorted list of numbers indicating the ranges in which characters
+// are printable and non-printable. The elements 0, 2, 4... are the first
+// characters of printable ranges and The elements 1, 3, 5... are the first
+// characters of non-printable ranges
+// We will assume that anything in the End User Sub-area is printable.
+static const TInt PUAPrintableRanges[] =
+	{
+	0xE000, 0xF6D9,		// End user area + unassigned corporate use area
+	0xF6DB, 0xF6DC,		// Replacement for character not in font
+	0xF6DE, 0xF700,		// various EIKON and Agenda symbols
+	0x10000, KMaxTInt	// everything else printable
+	};
+
+static TBool IsPUAPrintable(TInt aChar)
+	{
+	if (0x110000 <= aChar)
+		return 0;	// non-characters not printable
+	TInt i = 0;
+	while (PUAPrintableRanges[i] <= aChar)
+		++i;
+	return i & 1;
+	}
+
+
+
+#ifndef __TOOLS2__
+EXPORT_C TBool User::JustInTime()
+/**
+Tests whether just-in-time debugging is on or off.
+
+The function is used by the Kernel, on the Emulator, to decide whether to do
+just-in-time debugging for panics. The function applies to the current process.
+
+Unless overridden by calling User::SetJustInTime(EFalse), just-in-time debugging 
+is on by default.
+
+@return True, if just-in-time debugging is on. False otherwise.
+@see RProcess::JustInTime
+*/
+	{
+
+	return RProcess().JustInTime();
+	}
+
+
+
+
+EXPORT_C void User::SetJustInTime(const TBool aBoolean)
+/**
+Sets just-in-time debugging for this process on or off.
+
+While the function can be called by code running on both the Emulator and ARM,
+it only has an effect on the Emulator. Turning just-in-time debugging off
+prevents the debug Emulator closing down when a panic occurs.
+
+By default, just-in-time debugging is on.
+
+Note that the emulator handles panics in the nomal manner, i.e. by killing 
+the thread.
+
+@param aBoolean ETrue, if just-in-time debugging is to be set on. EFalse, 
+                if just-in-time debugging is to be set off.
+                EFalse causes _asm 3 calls to be disabled.
+@see RProcess::SetJustInTime
+*/
+	{
+
+	RProcess().SetJustInTime(aBoolean);
+	}
+#endif // __TOOLS2__
+
+extern const LCharSet* GetLocaleDefaultCharSet();
+extern const LCharSet* GetLocalePreferredCharSet();
+
+// Convert to folded.
+EXPORT_C TUint User::Fold(TUint aChar)
+/**
+@deprecated
+
+Folds the specified character.
+
+Folding converts the character to a form which can be used in tolerant
+comparisons without control over the operations performed. Tolerant comparisons
+are those which ignore character differences like case and accents.
+
+The result of folding a character depends on the locale and on whether this 
+is a UNICODE build or not.
+
+Note that for a non-UNICODE build, if the binary value of the character aChar
+is greater than or equal to 0x100, then the character returned is the same as
+the character passed to the function.
+
+@param aChar The character to be folded.
+
+@return The folded character.
+
+@see TChar::Fold()
+*/
+	{
+	// ASCII chars excluding 'i's can be handled by naive folding
+	if (aChar < 0x80 && aChar != 'I')
+		return (aChar >= 'A' && aChar <= 'Z') ? (aChar | 0x0020) : aChar;
+	else
+		return TUnicode(aChar).Fold(TChar::EFoldStandard,GetLocaleCharSet()->iCharDataSet);
+	}
+
+
+
+
+// Convert to a folded version, specifying the folding methods.
+EXPORT_C TUint User::Fold(TUint aChar,TInt aFlags)
+/**
+Folds the character according to a specified folding method.
+
+@param aChar  The character to be folded.
+@param aFlags A set of flags defining the folding method. They are:
+
+              TChar::EFoldCase, convert characters to their lower case form,
+              if any;
+              
+              TChar::EFoldAccents, strip accents;
+              
+              TChar::EFoldDigits, convert digits representing values 0..9 to
+              characters '0'..'9';
+              
+              TChar::EFoldSpaces, convert all spaces (ordinary, fixed-width,
+              ideographic, etc.) to ' ';
+              
+              TChar::EFoldKana, convert hiragana to katakana;
+              
+              TChar::EFoldWidth, fold full width and half width variants to
+              their standard forms;
+              
+              TChar::EFoldAll, use all of the above folding methods.
+              
+@return The folded character.
+@see TChar::Fold()
+*/
+	{
+	return TUnicode(aChar).Fold(aFlags,GetLocaleCharSet()->iCharDataSet);
+	}
+
+
+
+
+// Convert to collated.
+EXPORT_C TUint User::Collate(TUint aChar)
+/**
+Converts the character to its collated form.
+
+Collating is the process of removing differences between characters that are 
+deemed unimportant for the purposes of ordering characters. The result of 
+the conversion depends on the locale and on whether this is a UNICODE build 
+or not.
+
+Note that for a non UNICODE build, if the binary value of the character aChar
+is greater than or equal to 0x100, then the character returned is the same as
+the character passed to the function.
+
+@param aChar The character to be folded.
+
+@return The converted character.
+*/
+	{
+	return TUnicode(aChar).Fold(TChar::EFoldStandard,GetLocaleCharSet()->iCharDataSet);
+	}
+
+
+
+
+// Convert to lower case.
+EXPORT_C TUint User::LowerCase(TUint aChar)
+/**
+Converts the specified character to lower case.
+
+The result of the conversion depends on the locale and on whether this is
+a UNICODE build or not.
+
+Note that for a non-UNICODE build, if the binary value of the character
+aChar is greater than or equal to 0x100, then the character returned is
+the same as the character passed to the function.
+
+@param aChar The character to be converted to lower case.
+
+@return The lower case character.
+*/
+	{
+	// ASCII chars excluding 'i's can be handled by naive folding
+	if (aChar < 0x80 && aChar != 'I')
+		return (aChar >= 'A' && aChar <= 'Z') ? (aChar | 0x0020) : aChar;
+	else
+		return TUnicode(aChar).GetLowerCase(GetLocaleCharSet()->iCharDataSet);
+	}
+
+
+
+
+// Convert to upper case.
+EXPORT_C TUint User::UpperCase(TUint aChar)
+/**
+Converts a specified character to upper case.
+
+The result of the conversion depends on the locale and on whether this is
+a UNICODE build or not.
+
+Note that for a non UNICODE build, if the binary value of the character aChar
+is greater than or equal to 0x100, then the character returned is the same as
+the character passed to the function.
+
+@param aChar The character to be converted to upper case.
+
+@return The upper case character.
+*/
+	{
+	// ASCII chars excluding 'i's can be handled by naive folding
+	if (aChar < 0x80 && aChar != 'i')
+		return (aChar >= 'a' && aChar <= 'z') ? (aChar & ~0x0020) : aChar;
+	else
+		return TUnicode(aChar).GetUpperCase(GetLocaleCharSet()->iCharDataSet);
+	}
+
+
+
+
+// Return the title case version of a character, which is the case of composite characters like Dz.
+EXPORT_C TUint User::TitleCase(TUint aChar)
+/**
+Converts a specified character to its title case version.
+
+@param aChar The character to be converted.
+
+@return The converted character.
+*/
+	{
+	return TUnicode(aChar).GetTitleCase(GetLocaleCharSet()->iCharDataSet);
+	}
+
+
+
+
+EXPORT_C TUint TChar::GetUpperCase() const
+/**
+Gets the character value after conversion to uppercase or the character's 
+own value, if no uppercase form exists.
+
+The character object itself is not changed.
+
+@return The character value after conversion to uppercase.
+*/
+	{
+	return User::UpperCase(iChar);
+	}
+
+
+
+
+EXPORT_C TUint TChar::GetLowerCase() const
+/**
+Gets the character value after conversion to lowercase or the character's 
+own value, if no lowercase form exists.
+
+The character object itself is not changed.
+
+@return The character value after conversion to lowercase.
+*/
+	{
+	return User::LowerCase(iChar);
+	}
+
+
+
+
+EXPORT_C TUint TChar::GetTitleCase() const
+/**
+Gets the character value after conversion to titlecase or the character's 
+own value, if no titlecase form exists.
+
+The titlecase form of a character is identical to its uppercase form unless 
+a specific titlecase form exists.
+
+@return The value of the character value after conversion to titlecase form.
+*/
+	{
+	return User::TitleCase(iChar);
+	}
+
+
+
+
+EXPORT_C TBool TChar::IsLower() const
+/**
+Tests whether the character is lowercase.
+
+@return True, if the character is lowercase; false, otherwise.
+*/
+	{
+	return GetCategory() == TChar::ELlCategory;
+	}
+
+
+
+
+EXPORT_C TBool TChar::IsUpper() const
+/**
+Tests whether the character is uppercase.
+
+@return True, if the character is uppercase; false, otherwise.
+*/
+	{
+	return GetCategory() == TChar::ELuCategory;
+	}
+
+
+
+// Return TRUE if the character is title case, which is the case of composite characters like Dz.
+EXPORT_C TBool TChar::IsTitle() const
+/**
+Tests whether this character is in titlecase.
+
+@return True, if this character is in titlecase; false, otherwise.
+*/
+	{
+	return GetCategory() == TChar::ELtCategory;
+	}
+
+
+
+
+EXPORT_C TBool TChar::IsAlpha() const
+/**
+Tests whether the character is alphabetic.
+
+For Unicode, the function returns TRUE for all letters, including those from 
+syllabaries and ideographic scripts. The function returns FALSE for letter-like 
+characters that are in fact diacritics. Specifically, the function returns 
+TRUE for categories: ELuCategory, ELtCategory, ELlCategory, and ELoCategory; 
+it returns FALSE for all other categories including ELmCategory.
+
+@return True, if the character is alphabetic; false, otherwise.
+
+@see TChar::IsAlphaDigit()
+@see TChar::TCategory
+*/
+	{
+	return GetCategory() <= TChar::EMaxLetterOrLetterModifierCategory;
+	}
+
+
+
+
+EXPORT_C TBool TChar::IsDigit() const
+/**
+Tests whether the character is a standard decimal digit.
+
+For Unicode, this function returns TRUE only
+for the digits '0'...'9' (U+0030...U+0039), 
+not for other digits in scripts like Arabic, Tamil, etc.
+
+@return True, if the character is a standard decimal digit; false, otherwise.
+
+@see TChar::GetCategory()
+@see TChar::GetNumericValue
+*/
+	{
+	return iChar >= '0' && iChar <= '9'; // standard decimal digits only
+	}
+
+
+
+
+EXPORT_C TBool TChar::IsAlphaDigit() const
+/**
+Tests whether the character is alphabetic or a decimal digit.
+
+It is identical to (IsAlpha()||IsDigit()).
+
+@return True, if the character is alphabetic or a decimal digit; false, otherwise.
+
+@see TChar::IsAlpha()
+@see TChar::IsDigit()
+*/
+	{
+	TInt cat = (TInt)GetCategory();
+	return cat <= TChar::EMaxLetterOrLetterModifierCategory ||
+		   (iChar < 256 && cat == TChar::ENdCategory);	// accept any letter, but accept only standard digits
+	}
+
+
+
+
+EXPORT_C TBool TChar::IsHexDigit() const
+/** 
+Tests whether the character is a hexadecimal digit (0-9, a-f, A-F).
+
+@return True, if the character is a hexadecimal digit; false, otherwise.
+*/
+	{
+	/*
+	The following code will actually run faster than the non-Unicode version, which needs
+	to call the Exec function.
+	*/
+	return iChar <= 'f' && iChar >= '0' &&
+		   (iChar <= '9' || iChar >= 'a' || (iChar >= 'A' && iChar <= 'F'));	// only standard hex digits will do
+	}
+
+
+
+
+EXPORT_C TBool TChar::IsSpace() const
+/**
+Tests whether the character is a white space character.
+
+White space includes spaces, tabs and separators.
+
+For Unicode, the function returns TRUE for all characters in the categories: 
+EZsCategory, EZlCategory and EZpCategory, and also for the characters 0x0009 
+(horizontal tab), 0x000A (linefeed), 0x000B (vertical tab), 0x000C (form feed), 
+and 0x000D (carriage return).
+
+@return True, if the character is white space; false, otherwise.
+
+@see TChar::TCategory
+*/
+	{
+	/*
+	The Unicode characters 0009 .. 000D (tab, linefeed, vertical tab, formfeed, carriage return)
+	have the category Cc (control); however, we want to avoid breaking traditional programs
+	by getting IsSpace() to return TRUE for them.
+	*/
+	return (iChar <= 0x000D && iChar >= 0x0009) ||
+		   (GetCategory() & 0xF0) == TChar::ESeparatorGroup;
+	}
+
+
+
+
+EXPORT_C TBool TChar::IsPunctuation() const
+/**
+Tests whether the character is a punctuation character.
+
+For Unicode, punctuation characters are any character in the categories:
+EPcCategory, EPdCategory, EPsCategory, EPeCategory, EPiCategory,
+EPfCategory, EPoCategory.
+
+@return True, if the character is punctuation; false, otherwise.
+
+@see TChar::TCategory
+*/
+	{
+	return (GetCategory() & 0xF0) == TChar::EPunctuationGroup;
+	}
+
+
+
+
+EXPORT_C TBool TChar::IsGraph() const
+/**
+Tests whether the character is a graphic character.
+
+For Unicode, graphic characters include printable characters but not the space 
+character. Specifically, graphic characters are any character except those 
+in categories: EZsCategory,EZlCategory,EZpCategory, ECcCategory,ECfCategory,
+ECsCategory, ECoCategory, and ,ECnCategory.
+
+Note that for ISO Latin-1, all alphanumeric and punctuation characters are 
+graphic.
+
+@return True, if the character is a graphic character; false, otherwise.
+
+@see TChar::TCategory
+*/
+	{
+	TUint type = TUnicode(iChar).GetCategory(0);
+	return type <= TChar::EMaxGraphicCategory ||
+		(type == TChar::ECoCategory && IsPUAPrintable(iChar));
+	}
+
+
+
+
+EXPORT_C TBool TChar::IsPrint() const
+/**
+Tests whether the character is a printable character.
+
+For Unicode, printable characters are any character except those in categories: 
+ECcCategory, ECfCategory, ECsCategory, ECoCategory and ECnCategory.
+
+Note that for ISO Latin-1, all alphanumeric and punctuation characters, plus 
+space, are printable.
+
+@return True, if the character is printable; false, otherwise.
+
+@see TChar::TCategory
+*/
+	{
+	TUint type = TUnicode(iChar).GetCategory(0);
+	return type <= TChar::EMaxPrintableCategory ||
+		(type == TChar::ECoCategory && IsPUAPrintable(iChar));
+	}
+
+
+
+
+EXPORT_C TBool TChar::IsControl() const
+/**
+Tests whether the character is a control character.
+
+For Unicode, the function returns TRUE for all characters in the categories: 
+ECcCategory, ECfCategory, ECsCategory, ECoCategory and ECnCategoryCc.
+
+@return True, if the character is a control character; false, otherwise.
+
+@see TChar::TCategory
+*/
+	{
+	return GetCategory() == TChar::ECcCategory;
+	}
+
+
+
+
+EXPORT_C TBool TChar::IsAssigned() const
+/**
+Tests whether this character has an assigned meaning in the Unicode encoding.
+
+All characters outside the range 0x0000 - 0xFFFF are unassigned and there 
+are also many unassigned characters within the Unicode range.
+
+Locales can change the assigned/unassigned status of characters. This means 
+that the precise behaviour of this function is locale-dependent.
+
+@return True, if this character has an assigned meaning; false, otherwise.
+*/
+	{
+	return GetCategory() <= TChar::EMaxAssignedCategory;
+	}
+
+
+
+
+EXPORT_C void TChar::GetInfo(TCharInfo& aInfo) const
+/** 
+Gets this character;s standard category information. 
+
+This includes everything except its CJK width and decomposition, if any.
+
+@param aInfo On return, contains the character's standard category information.
+*/
+	{
+	TUnicode(iChar).GetInfo(aInfo,GetLocaleCharSet()->iCharDataSet);
+	}
+
+
+
+
+EXPORT_C TChar::TCategory TChar::GetCategory() const
+/**
+Gets this character's Unicode category.
+
+@return This character's Unicode category.
+*/
+	{
+	//for unicode non private user area just use the default charset
+	if (iChar>=0xE000 && iChar<=0xF8FF)
+		return TUnicode(iChar).GetCategory(GetLocaleCharSet()->iCharDataSet);
+	else
+		return TUnicode(iChar).GetCategory(GetLocaleDefaultCharSet()->iCharDataSet);
+	}
+
+
+
+
+EXPORT_C TChar::TBdCategory TChar::GetBdCategory() const
+/**
+Gets the bi-directional category of a character.
+
+For more information on the bi-directional algorithm, see Unicode Technical 
+Report No. 9 available at: http://www.unicode.org/unicode/reports/tr9/.
+
+@return The character's bi-directional category.
+*/
+	{
+	return TUnicode(iChar).GetBdCategory(GetLocaleCharSet()->iCharDataSet);
+	}
+
+
+
+
+EXPORT_C TInt TChar::GetCombiningClass() const
+/**
+Gets this character's combining class.
+
+Note that diacritics and other combining characters have non-zero combining 
+classes.
+
+@return The combining class.
+*/
+	{
+	//for unicode non private user area just use the default charset
+	if (iChar>=0xE000 && iChar<=0xF8FF)
+		return TUnicode(iChar).GetCombiningClass(GetLocaleCharSet()->iCharDataSet);
+	else
+		return TUnicode(iChar).GetCombiningClass(GetLocaleDefaultCharSet()->iCharDataSet);
+	}
+
+
+
+
+EXPORT_C TBool TChar::IsMirrored() const
+/**
+Tests whether this character has the mirrored property.
+
+Mirrored characters, like ( ) [ ] < >, change direction according to the
+directionality of the surrounding characters. For example, an opening
+parenthesis 'faces right' in Hebrew or Arabic, and to say that 2 < 3 you would
+have to say that 3 > 2, where the '>' is, in this example, a less-than sign to
+be read right-to-left.
+
+@return True, if this character has the mirrored property; false, otherwise.
+*/
+	{
+	return TUnicode(iChar).IsMirrored(GetLocaleCharSet()->iCharDataSet);
+	}
+
+
+
+
+EXPORT_C TInt TChar::GetNumericValue() const
+/**
+Gets the integer numeric value of this character.
+
+Numeric values need not be in the range 0..9; the Unicode character set
+includes various other numeric characters such as the Roman and Tamil numerals
+for 500, 1000, etc.
+
+@return The numeric value: -1 if the character has no integer numeric 
+        value,-2 if the character has a fractional numeric value.
+*/
+	{
+	return TUnicode(iChar).GetNumericValue(GetLocaleCharSet()->iCharDataSet);
+	}
+
+
+
+
+EXPORT_C TChar::TCjkWidth TChar::GetCjkWidth() const
+/**
+Gets the Chinese, Japanese, Korean (CJK) notional width.
+
+Some display systems used in East Asia display characters on a grid of
+fixed-width character cells like the standard MSDOS display mode.
+
+Some characters, e.g. the Japanese katakana syllabary, take up a single
+character cell and some characters, e.g., kanji, Chinese characters used in
+Japanese, take up two. These are called half-width and full-width characters.
+This property is fixed and cannot be overridden for particular locales.
+
+For more information on returned widths, see Unicode Technical Report 11 on 
+East Asian Width available at: http://www.unicode.org/unicode/reports/tr11/
+
+@return The notional width of an east Asian character.
+*/
+	{
+	return TUnicode(iChar).GetCjkWidth();
+	}
+
+
+
+
+/**
+Composes a string of Unicode characters to produce a single character result.
+
+For example, 0061 ('a') and 030A (combining ring above) compose to give 00E5 
+('a' with ring above).
+
+A canonical decomposition is a relationship between a string of characters -  
+usually a base character and one or more diacritics - and a composed character. 
+The Unicode standard requires that compliant software treats composed
+characters identically with their canonical decompositions. The mappings used
+by these functions are fixed and cannot be overridden for particular locales.
+
+@param aResult If successful, the composed character value. If unsuccessful, 
+               this value contains 0xFFFF.
+@param aSource String of source Unicode characters.
+
+@return True, if the compose operation is successful in combining the entire
+		sequence of characters in the descriptor into a single compound
+		character; false, otherwise.
+*/
+
+EXPORT_C TBool TChar::Compose(TUint& aResult,const TDesC16& aSource)
+	{
+	aResult = 0xFFFF;
+	if(aSource.Length() > 0)
+		{
+		TChar combined;
+		if(::CombineAsMuchAsPossible(aSource, combined) == aSource.Length())
+			{
+			aResult = (TUint)combined;
+			return ETrue;
+			}
+		}
+	return EFalse;
+	}
+
+
+
+
+/**
+Maps this character to its maximal canonical decomposition.
+
+For example, 01E1 ('a' with dot above and macron) decomposes into 0061 ('a') 
+0307 (dot) and 0304 (macron).
+
+Note that this function is used during collation, as performed by
+the Mem::CompareC() function, to convert the compared strings to their maximal
+canonical decompositions.
+
+@param aResult If successful, the descriptor represents the canonical decomposition 
+               of this character. If unsuccessful, the descriptor is empty.
+               
+@return True if decomposition is successful; false, otherwise.
+
+@see Mem::CompareC()
+@see TChar::Compose()
+*/
+EXPORT_C TBool TChar::Decompose(TPtrC16& aResult) const
+	{
+	return ::DecomposeChar(iChar, aResult);
+	}
+
+
+
+#ifndef __TOOLS2__
+EXPORT_C TInt TFindChunk::Next(TFullName &aResult)
+/**
+Finds the full name of the next chunk which matches the match pattern.
+
+@param aResult A reference to a TBuf descriptor with a defined maximum length. 
+               If a matching chunk is found, its full name is set into
+               this descriptor.
+               If no matching chunk is found, the descriptor length is set
+               to zero.
+               
+@return KErrNone, if a matching chunk is found;
+        KErrNotFound otherwise.
+*/
+	{
+	return NextObject(aResult,EChunk);
+	}
+
+
+
+
+
+EXPORT_C TUint8 * RChunk::Base() const
+/**
+Gets a pointer to the base of the chunk's reserved region.
+
+@return A pointer to the base of the chunk's reserved region.
+*/
+	{
+
+	return(Exec::ChunkBase(iHandle));
+	}
+
+
+
+
+EXPORT_C TInt RChunk::Size() const
+/**
+Gets the current size of this chunk's committed region.
+
+@return The size of the chunk's committed region.
+*/
+	{
+
+	return(Exec::ChunkSize(iHandle));
+	}
+
+
+
+
+EXPORT_C TInt RChunk::Bottom() const
+/**
+Gets the offset of the bottom of the double ended chunk's committed region 
+from the base of the chunk's reserved region.
+
+Note that the lowest valid address in a double ended chunk is the sum of the 
+base of the chunk's reserved region plus the value of Bottom().
+
+@return The offset of the bottom of the chunk's committed region from the 
+        base of the chunk's reserved region.
+*/
+	{
+
+	return(Exec::ChunkBottom(iHandle));
+	}
+
+
+
+
+EXPORT_C TInt RChunk::Top() const
+/**
+Gets the offset of the top of the double ended chunk's committed region 
+from the base of the chunk's reserved region.
+
+Note that the highest valid address in a double ended chunk is the the sum 
+of the base of the chunk's reserved region plus the value of Top() - 1.
+
+@return The offset of the top of the chunk's committed region from the base 
+        of the chunk's reserved region.
+*/
+	{
+
+	return(Exec::ChunkTop(iHandle));
+	}
+
+
+
+
+EXPORT_C TInt RChunk::MaxSize() const
+/**
+Gets the maximum size of this chunk.
+
+This maximum size of this chunk is set when the chunk is created.
+
+@return The maximum size of this chunk.
+*/
+	{
+
+	return(Exec::ChunkMaxSize(iHandle));
+	}
+
+
+
+/**
+Finds the full name of the next LDD factory object which matches the match pattern.
+
+@param aResult A reference to a TBuf descriptor with a defined maximum length. 
+               If a matching LDD factory object is found, its full name is set into
+               this descriptor.
+               If no matching LDD factory object is found, the descriptor length is set
+               to zero.
+               
+@return KErrNone, if a matching LDD factory object is found;
+        KErrNotFound otherwise.
+*/
+EXPORT_C TInt TFindLogicalDevice::Next(TFullName &aResult)
+	{
+	return NextObject(aResult,ELogicalDevice);
+	}
+
+/**
+Finds the full name of the next PDD factory object which matches the match pattern.
+
+@param aResult A reference to a TBuf descriptor with a defined maximum length. 
+               If a matching PDD factory object is found, its full name is set into
+               this descriptor.
+               If no matching PDD factory object is found, the descriptor length is set
+               to zero.
+               
+@return KErrNone, if a matching PDD factory object is found;
+        KErrNotFound otherwise.
+*/
+EXPORT_C TInt TFindPhysicalDevice::Next(TFullName &aResult)
+	{
+	return NextObject(aResult,EPhysicalDevice);
+	}
+
+/**
+Gets the device capabilities.
+
+@param aDes	A descriptor into which capability's information is to be written.
+*/
+EXPORT_C void RDevice::GetCaps(TDes8 &aDes) const
+	{
+
+	Exec::LogicalDeviceGetCaps(iHandle,aDes);
+	}
+
+/**
+Checks if a device supports a particular version.
+
+@param aVer	The requested device version.
+
+@return	ETrue if supported, EFalse if not.
+*/
+EXPORT_C TBool RDevice::QueryVersionSupported(const TVersion &aVer) const
+	{
+
+	return(Exec::LogicalDeviceQueryVersionSupported(iHandle,aVer));
+	}
+
+/**
+Checks if a specified unit number, additional info and a specific PDD is supported.
+
+@param aUnit			The requested unit number.
+@param aPhysicalDevice	The requested PDD name.
+@param anInfo			The additional information.
+
+@return ETrue if supported, EFalse if not. 
+*/
+EXPORT_C TBool RDevice::IsAvailable(TInt aUnit, const TDesC* aPhysicalDevice, const TDesC8* anInfo) const
+	{
+	TInt r;
+	if(aPhysicalDevice)
+		{
+		TBuf8<KMaxKernelName> physicalDevice;
+		physicalDevice.Copy(*aPhysicalDevice);
+		r = Exec::LogicalDeviceIsAvailable(iHandle,aUnit,(TDesC8*)&physicalDevice,anInfo);
+		}
+	else
+		r = Exec::LogicalDeviceIsAvailable(iHandle,aUnit,(TDesC8*)NULL,anInfo);
+
+	return r;
+	}
+
+
+/**
+Queues an asynchronous request for the device driver, taking no parameters.
+ 
+The request is handled on the kernel-side by the logical channel's
+DLogicalChannelBase::Request().
+
+Outstanding requests can be cancelled by calling DoCancel().
+
+@param aReqNo   A number identifying the request to the logical channel. 
+@param aStatus  The request status object for this request.     
+*/
+EXPORT_C void RBusLogicalChannel::DoRequest(TInt aReqNo,TRequestStatus &aStatus)
+	{
+
+	TAny *a[2];
+	a[0]=NULL;
+	a[1]=NULL;
+	aStatus=KRequestPending;
+	Exec::ChannelRequest(iHandle,~aReqNo,&aStatus,&a[0]);
+	}
+
+
+
+
+/**
+Queues an asynchronous request for the device driver, taking one parameter.
+ 
+The request is handled on the kernel-side by the logical channel's
+DLogicalChannelBase::Request().
+
+Outstanding requests can be cancelled by calling DoCancel().
+
+@param aReqNo   A number identifying the request to the logical channel. 
+@param aStatus  The request status object for this request.
+@param a1       A 32-bit value passed to the kernel-side. Its meaning depends
+                on the device driver requirements.           
+*/
+EXPORT_C void RBusLogicalChannel::DoRequest(TInt aReqNo,TRequestStatus &aStatus,TAny *a1)
+	{
+
+	TAny *a[2];
+	a[0]=a1;
+	a[1]=NULL;
+	aStatus=KRequestPending;
+	Exec::ChannelRequest(iHandle,~aReqNo,&aStatus,&a[0]);
+	}
+
+
+
+
+/**
+Queues an asynchronous request for the device driver, taking two parameters.
+ 
+The request is handled on the kernel-side by the logical channel's
+DLogicalChannelBase::Request().
+
+Outstanding requests can be cancelled by calling DoCancel().
+
+@param aReqNo   A number identifying the request to the logical channel. 
+@param aStatus  The request status object for this request.
+@param a1       A 32-bit value passed to the kernel-side. Its meaning depends
+                on the device driver requirements.           
+@param a2       A 32-bit value passed to the kernel-side. Its meaning depends
+                on the device driver requirements.           
+*/
+EXPORT_C void RBusLogicalChannel::DoRequest(TInt aReqNo,TRequestStatus &aStatus,TAny *a1,TAny *a2)
+	{
+
+	TAny *a[2];
+	a[0]=a1;
+	a[1]=a2;
+	aStatus=KRequestPending;
+	Exec::ChannelRequest(iHandle,~aReqNo,&aStatus,&a[0]);
+	}
+
+
+
+
+/**
+Cancels one or more outstanding asynchronous requests.
+
+All outstanding requests complete with KErrCancel.
+
+@param aRequestMask A set of bits identifying the requests to be cancelled.
+                    Each bit can be used to identify a separate outstanding
+                    request. It is up to the driver to define how the bits map
+                    to those outstanding requests.
+*/
+EXPORT_C void RBusLogicalChannel::DoCancel(TUint aRequestMask)
+	{
+
+	Exec::ChannelRequest(iHandle,KMaxTInt,(TAny*)aRequestMask,0);
+	}
+
+
+
+
+/**
+Makes a synchronous request to the device driver, taking no parameters.
+
+This function does not return until the request has completed, successfully
+or otherwise.
+
+@param aFunction A number identifying the request.
+
+@return KErrNone, if successful; otherwise one of the other system-wide
+        error codes.
+        The value returned depends on the implementation of the device driver.
+*/
+EXPORT_C TInt RBusLogicalChannel::DoControl(TInt aFunction)
+	{
+
+	return Exec::ChannelRequest(iHandle,aFunction,NULL,NULL);
+	}
+
+
+
+
+/**
+Makes a synchronous request to the device driver, taking one parameter.
+
+This function does not return until the request has completed, successfully
+or otherwise.
+
+@param aFunction A number identifying the request.
+@param a1        A 32-bit value passed to the kernel-side. Its meaning depends
+                 on the device driver requirements.           
+
+@return KErrNone, if successful; otherwise one of the other system-wide
+        error codes.
+        The value returned depends on the implementation of the device driver.
+*/
+EXPORT_C TInt RBusLogicalChannel::DoControl(TInt aFunction,TAny *a1)
+	{
+
+	return Exec::ChannelRequest(iHandle,aFunction,a1,NULL);
+	}
+
+
+
+
+/**
+Makes a synchronous request to the device driver, taking two parameters.
+
+This function does not return until the request has completed, successfully
+or otherwise.
+
+@param aFunction A number identifying the request.
+@param a1        A 32-bit value passed to the kernel-side. Its meaning depends
+                 on the device driver requirements.           
+@param a2        A 32-bit value passed to the kernel-side. Its meaning depends
+                 on the device driver requirements.           
+
+@return KErrNone, if successful; otherwise one of the other system-wide
+        error codes.
+        The value returned depends on the implementation of the device driver.
+*/
+EXPORT_C TInt RBusLogicalChannel::DoControl(TInt aFunction,TAny *a1,TAny *a2)
+	{
+
+	return Exec::ChannelRequest(iHandle,aFunction,a1,a2);
+	}
+
+
+
+
+EXPORT_C void User::WaitForAnyRequest()
+/**
+Waits for any asynchronous request to complete.
+
+The current thread waits on its request semaphore.
+
+The function completes, and control returns to the caller when the current 
+thread's request semaphore is signalled by any of the service providers which 
+handle these asynchronous requests.
+
+The request status of all outstanding asynchronous requests must be examined 
+to determine which request is complete.
+
+@see TRequestStatus
+*/
+	{
+
+	Exec::WaitForAnyRequest();
+	}
+#endif // __TOOLS2__
+
+
+
+EXPORT_C void User::WaitForRequest(TRequestStatus &aStatus)
+/**
+Waits for a specific asynchronous request to complete.
+
+The current thread waits on its request semaphore.
+
+The function completes and control returns to the caller when the current 
+thread's request semaphore is signalled by the service provider handling the 
+request associated with aStatus. Before signalling, the service provider sets 
+an appropriate value in aStatus, other than KRequestPending.
+
+Note that if other asynchronous requests complete before the one associated
+with aStatus, the request semaphore is adjusted so that knowledge of their
+completion is not lost. In this a case, a subsequent call to
+User::WaitForAnyRequest() or User::WaitForRequest() will complete and return
+immediately.
+
+@param aStatus A reference to the request status object associated with the 
+               specific asynchronous request.
+               
+@see KRequestPending
+*/
+	{
+#ifndef __TOOLS2__
+	TInt i=(-1);
+	do
+		{
+		i++;
+		Exec::WaitForAnyRequest();
+		} while (aStatus==KRequestPending);
+	if (i)
+		Exec::RequestSignal(i);
+#else
+	// There's been no need to implement an active scheduler yet for TOOLS2
+#endif // __TOOLS2__
+	}
+
+
+
+#ifndef __TOOLS2__
+EXPORT_C void User::WaitForRequest(TRequestStatus &aStatus1,TRequestStatus &aStatus2)
+/**
+Waits for either of two specific asynchronous requests to complete.
+
+The current thread waits on its request semaphore.
+
+The function completes and control returns to the caller when the current 
+thread's request semaphore is signalled by either the service provider handling 
+the request associated with aStatus1 or the service provider handling the 
+request associated with aStatus2. Before signalling, the completing service 
+provider sets an appropriate value in the status object, other
+than KRequestPending.
+
+Note that if other asynchronous requests complete before the ones associated
+with aStatus1 and aStatus2, the request semaphore is adjusted so that knowledge
+of their completion is not lost. In this a case, a subsequent call to
+User::WaitForAnyRequest() or User::WaitForRequest() will complete and return
+immediately.
+
+@param aStatus1 A reference to the request status object associated with the 
+                first specific asynchronous request.
+@param aStatus2 A reference to the request status object associated with the 
+                second specific asynchronous request.
+
+@see KRequestPending                
+*/
+	{
+
+	TInt i=(-1);
+	do
+		{
+		i++;
+		Exec::WaitForAnyRequest();
+		} while (aStatus1==KRequestPending && aStatus2==KRequestPending);
+	if (i)
+		Exec::RequestSignal(i);
+	}
+
+
+
+
+EXPORT_C void User::WaitForNRequest(TRequestStatus * aStatusArray[], TInt aNum)
+/**
+ Waits for any one of  specific asynchronous requests to complete.
+  
+The current thread waits on its request semaphore.
+ 
+The function completes and control returns to the caller when the current 
+thread's request semaphore is signalled by either the service provider handling 
+the request associated with aStatus1 or the service provider handling the 
+request associated with aStatus2. Before signalling, the completing service 
+provider sets an appropriate value in the status object, other
+than KRequestPending.
+ 
+Note that if other asynchronous requests complete before the ones associated
+with aStatusArray the request semaphore is adjusted so that knowledge
+of their completion is not lost. In this a case, a subsequent call to
+User::WaitForAnyRequest() or User::WaitForRequest() will complete and return
+immediately. 
+@param aStatArray[] A reference to the request status object associated with the 
+                    first specific asynchronous request.
+@param TInt aNum    
+*/
+	{
+     	TRequestStatus* aptr;
+     	TBool m = ETrue;
+     	TInt i = (-1);
+     	do
+		{
+	 	i++;
+        	Exec::WaitForAnyRequest();
+        	for(TInt j = 0; j<aNum; j++)
+        		{
+         		aptr =  aStatusArray[j];
+         		if(aptr)
+         			{
+         			if(aptr->Int()!= KRequestPending)
+         				{	
+         				m = EFalse;	
+         				break;
+         				}
+         			}
+        		}
+     		}while(m);
+	if(i)
+		Exec::RequestSignal(i);	
+	}
+
+
+
+
+EXPORT_C TInt TFindLibrary::Next(TFullName &aResult)
+/**
+Finds the next DLL whose full name matches the match pattern.
+
+If a DLL with a matching name is found, the function copies the full name of
+the DLL into the descriptor aResult.
+
+@param aResult A buffer for the fullname of the DLL. This is a template
+               specialisation of TBuf defining a modifiable buffer descriptor
+               taking a maximum length of KMaxFullName.
+               If no matching DLL is found, the descriptor length is
+               set to zero. 
+               
+@return KErrNone, if a matching DLL is found;
+        KErrNotFound, otherwise.
+*/
+	{
+	return NextObject(aResult,ELibrary);
+	}
+
+
+
+
+EXPORT_C TLibraryFunction RLibrary::Lookup(TInt anOrdinal) const
+/**
+Gets a pointer to the function at the specified ordinal within this DLL.
+
+@param anOrdinal The ordinal of the required function in this DLL.
+                 This value must be positive.
+
+@return A pointer to the function at position anOrdinal in this DLL.
+        The value is NULL if there is no function at that ordinal. 
+        
+@panic USER 116 if anOrdinal is negative
+*/
+	{
+	__ASSERT_ALWAYS(anOrdinal>=0,Panic(EBadLookupOrdinal));
+	return (Exec::LibraryLookup(iHandle,anOrdinal));
+	}
+
+
+
+EXPORT_C TFileName RLibrary::FileName() const
+/**
+Gets the name of the DLL's file.
+
+@return The DLL's filname.
+*/
+	{
+
+	TFileName n;
+	TPtr8 n8(((TUint8*)n.Ptr()) + KMaxFileName, KMaxFileName);
+	Exec::LibraryFileName(iHandle,n8);
+	n.Copy(n8);
+	return(n);
+	}
+
+
+
+
+EXPORT_C TUidType RLibrary::Type() const
+/**
+Gets this DLL's UID type.
+
+The UID type is a property of a Symbian OS file; for a DLL, its value is set
+during the building of that DLL.
+
+@return The UID type of this DLL. Note that the first TUid component of
+        the TUidType has the value KDynamicLibraryUid.
+*/
+	{
+
+	TUidType u;
+	Exec::LibraryType(iHandle,u);
+	return(u);
+	}
+
+
+
+
+EXPORT_C TInt RLibrary::GetRamSizes(TInt& aCodeSize, TInt& aConstDataSize)
+/**
+Gets the current size of the code and the const data for this DLL.
+
+This function can be called on a RAM loaded DLL or a ROM based DLL.
+
+@param aCodeSize      The current size of the code for a RAM loaded DLL.
+                      This is zero for a ROM based DLL.
+
+@param aConstDataSize The current size of the const data for a RAM loaded DLL.
+                      This is zero for a ROM based DLL.
+
+@return KErrNone if successful, otherwise one of the system-wide error codes. 
+*/
+	{
+	TModuleMemoryInfo info;
+	TInt r=Exec::LibraryGetMemoryInfo(iHandle,info);
+	if (r==KErrNone)
+		{
+		aCodeSize=info.iCodeSize;
+		aConstDataSize=info.iConstDataSize;
+		}
+	return r;
+	}
+
+
+
+
+/**
+Sets the home time to a specified time value.
+
+@param aTime A reference to a time representation object containing the time 
+             value.
+             
+@return KErrNone if successful or one of the system-wide error codes.
+
+@deprecated Set the time using User::SetUTCTime if the UTC time is known;
+			otherwise, use the timezone server to set the time.
+
+@capability WriteDeviceData
+*/
+EXPORT_C TInt User::SetHomeTime(const TTime &aTime)
+	{
+	return(Exec::SetUTCTimeAndOffset(aTime.Int64(),0,ETimeSetTime|ETimeSetLocalTime,0));
+	}
+
+/**
+Sets the secure home time to a specified time value.
+
+@param aTime A reference to a time representation object containing the 
+			 secure time value.
+             
+@return KErrNone if successful or one of the system-wide error codes.
+
+@capability TCB
+@capability WriteDeviceData
+*/
+EXPORT_C TInt User::SetHomeTimeSecure(const TTime &aTime)
+	{
+	return(Exec::SetUTCTimeAndOffset(aTime.Int64(),0,ETimeSetTime|ETimeSetLocalTime|ETimeSetSecure,0));
+	}
+
+
+
+/**
+Sets the UTC time to a specified time value.
+
+@param aUTCTime A reference to a time representation object containing the time 
+                value.
+             
+@return KErrNone if successful or one of the system-wide error codes.
+
+@capability WriteDeviceData
+*/
+EXPORT_C TInt User::SetUTCTime(const TTime &aUTCTime)
+	{
+	return(Exec::SetUTCTimeAndOffset(aUTCTime.Int64(),0,ETimeSetTime,0));
+	}
+
+/**
+Sets the secure UTC time to a specified time value.
+
+@param aUTCTime A reference to a time representation object containing the secure time 
+                value.
+             
+@return KErrNone if successful or one of the system-wide error codes.
+
+@capability TCB
+@capability WriteDeviceData
+*/
+EXPORT_C TInt User::SetUTCTimeSecure(const TTime &aUTCTime)
+	{
+	return(Exec::SetUTCTimeAndOffset(aUTCTime.Int64(),0,ETimeSetTime|ETimeSetSecure,0));
+	}
+
+/**
+Gets the UTC offset - the difference between UTC and the current local time
+due to any time zones and daylight savings time that may be in effect. A positive
+offset indicates a time ahead of UTC, a negative offset indicates a time behind UTC.
+
+@return The UTC offset, in seconds.
+*/
+EXPORT_C TTimeIntervalSeconds User::UTCOffset()
+	{
+	return(TTimeIntervalSeconds(Exec::UTCOffset()));
+	}
+
+
+/**
+Sets the UTC offset to the given number of seconds. This should include both time
+zone differences and the effect of any applicable daylight savings time.
+A positive offset indicates a time ahead of UTC, a negative offset indicates a time
+behind UTC.
+
+@param aOffset The UTC offset, in seconds.
+
+@capability WriteDeviceData
+*/
+EXPORT_C void User::SetUTCOffset(TTimeIntervalSeconds aOffset)
+	{
+	Exec::SetUTCTimeAndOffset(0,aOffset.Int(),ETimeSetOffset,0);
+	}
+
+
+/**
+Sets the UTC time and UTC offset to the specified values, atomically. This is equivalent
+to calling both SetUTCTime and SetUTCOffset, but without the possibility of an incorrect
+time being observed between the two calls. If the operation is not successful, an error
+code will be returned and both the time and offset will be left unchanged.
+
+@param aUTCTime A reference to a time representation object containing the time 
+                value.
+@param aOffset The UTC offset, in seconds.
+             
+@return KErrNone if successful or one of the system-wide error codes.
+
+@capability WriteDeviceData
+*/
+EXPORT_C TInt User::SetUTCTimeAndOffset(const TTime &aUTCTime, TTimeIntervalSeconds aOffset)
+	{
+	return(Exec::SetUTCTimeAndOffset(aUTCTime.Int64(),aOffset.Int(),ETimeSetTime|ETimeSetOffset,0));
+	}
+#endif // __TOOLS2__
+
+/**
+Gets the current tick count.
+
+The period between ticks is usually 1/64 second, but may be hardware dependent.
+
+@return The machine dependent tick count.
+*/
+EXPORT_C TUint User::TickCount()
+	{
+
+	return(Exec::TickCount());
+	}
+
+
+
+#ifndef __TOOLS2__
+
+EXPORT_C TTimeIntervalSeconds User::InactivityTime()
+/**
+Gets the time since the last user activity.
+
+@return The time interval.
+*/
+	{
+
+	return TTimeIntervalSeconds(Exec::UserInactivityTime());
+	}
+
+
+
+
+/**
+Resets all user inactivity timers.
+*/
+EXPORT_C void User::ResetInactivityTime()
+	{
+	Exec::ResetInactivityTime();
+	}
+#endif // __TOOLS2__
+
+
+
+/**
+Gets the nanokernel tick count.
+
+This is the current value of the machine's millisecond tick counter.
+
+On the emulator the resolution defaults to 5 milliseconds; however
+you can change it to N milliseconds when you launch the emulator
+from the command line by specifying -Dtimerresolution=N as a parameter
+to epoc.exe, for example:
+@code
+epoc.exe -Dtimerresolution=3
+@endcode
+
+On most hardware the resolution is about 1 millisecond.
+
+You can get the nanokernel tick period in microseconds by calling
+into the Hardware Abstraction Layer:
+
+@code
+TInt nanokernel_tick_period;
+HAL::Get(HAL::ENanoTickPeriod, nanokernel_tick_period);
+@endcode
+
+@return The nanokernel tick count.
+*/
+EXPORT_C TUint32 User::NTickCount()
+	{
+
+	return Exec::NTickCount();
+	}
+
+
+
+#ifndef __TOOLS2__
+
+/**
+Gets the fast counter.
+
+This is the current value of the machine's high resolution timer.  If a high
+resolution timer is not available, it uses the millisecond timer instead.
+
+The freqency of this counter can be determined by reading the HAL attribute
+EFastCounterFrequency.
+
+@return The fast counter value.
+*/
+EXPORT_C TUint32 User::FastCounter()
+	{
+
+	return Exec::FastCounter();
+	}
+
+
+
+
+EXPORT_C TTimerLockSpec User::LockPeriod()
+/**
+Returns which of the periods the clock is currently in.
+
+@return The fraction of a second at which the timer completes.
+*/
+	{
+
+	return(Exec::LockPeriod());
+	}
+
+
+
+
+EXPORT_C TName RHandleBase::Name() const
+/**
+Gets the name of the handle.
+
+@return The name of the handle.
+*/
+	{
+
+	TName n;
+	TPtr8 n8(((TUint8*)n.Ptr()) + KMaxName, KMaxName);
+	Exec::HandleName(iHandle,n8);
+	n.Copy(n8);
+	return(n);
+	}
+
+
+
+
+EXPORT_C TFullName RHandleBase::FullName() const
+/**
+Gets the full name of the handle.
+
+Note: This method is stack consuming (it takes 512 bytes on stack to execute).
+For an alternative way to obtain the full name of the object, see RHandleBase::FullName(TDes& aName) const.
+
+@see RHandleBase::FullName(TDes& aName) const
+@return The full name of the handle.
+*/
+	{
+
+	TFullName n;
+	TPtr8 n8(((TUint8*)n.Ptr()) + KMaxFullName, KMaxFullName);
+	Exec::HandleFullName(iHandle,n8);
+	n.Copy(n8);
+	return(n);
+	}
+
+
+
+
+EXPORT_C void RHandleBase::FullName(TDes& aName) const
+/**
+Gets the full name of the handle.
+
+@param aName On return, contains the full name of the handle.
+
+@panic KERN-EXEC 35, If full name of the handler is longer that the maximum length of aName descriptor.
+					 To avoid this, the maximum length of aName should be at least KMaxFullName.
+@see KMaxFullName
+*/
+	{
+
+	// Kernel will copy string in n8, whose data lives in the upper half of aName desciptor data
+	TPtr8 n8(((TUint8*)aName.Ptr()) + aName.MaxLength(), aName.MaxLength());
+	Exec::HandleFullName(iHandle,n8);
+	aName.Copy(n8); // Expands 8bit descriptor into 16bit unicode descriptor.
+	}
+
+
+
+
+EXPORT_C void RHandleBase::HandleInfo(THandleInfo* anInfo)
+/**
+Gets information about the handle.
+
+@param anInfo A pointer to a THandleInfo object supplied by the caller;
+              on return, contains the handle information. 
+*/
+	{
+
+	Exec::HandleInfo(iHandle,anInfo);
+	}
+
+EXPORT_C TInt RHandleBase::BTraceId() const
+/**
+Returns a unique object identifier for use with BTrace
+*/
+	{
+	return Exec::GetBTraceId(iHandle);
+	}
+
+
+
+EXPORT_C TUint RHandleBase::Attributes() const
+//
+// Get handle attributes
+//
+	{
+
+	return Exec::HandleAttributes(iHandle);
+	}
+#endif // __TOOLS2__
+
+
+
+EXPORT_C TInt User::AllocLen(const TAny *aCell)
+/**
+Gets the length of the specified allocated heap cell.
+
+The cell is assumed to be in the current thread's heap.
+
+@param aCell A pointer to the allocated cell whose length
+             is to be fetched.
+
+@return The length of the allocated cell.
+*/
+	{
+#ifndef __TOOLS2__
+	return(GetHeap()->AllocLen(aCell));
+#else
+	TUint8* p = ((TUint8*)aCell) - sizeof(TInt);
+	return *((TInt*)p);
+#endif // __TOOLS2__
+	}
+
+
+
+
+EXPORT_C TAny* User::Alloc(TInt aSize)
+/**
+Allocates a cell of specified size from the current thread's heap.
+
+If there is insufficient memory available on the heap from which to allocate a cell 
+of the required size, the function returns NULL.
+
+The resulting size of the allocated cell may be rounded up to a value greater 
+than aSize, but is guaranteed to be not less than aSize.
+
+@param aSize The size of the cell to be allocated from the current thread's 
+             heap.
+             
+@return A pointer to the allocated cell. NULL, if there is insufficient memory 
+        available.
+        
+@panic USER 47, if the maximum unsigned value of aSize is greater
+                than or equal to KMaxTInt/2. For example,
+                calling Alloc(-1) raises this panic.
+*/
+	{
+#ifndef __TOOLS2__
+	return(GetHeap()->Alloc(aSize));
+#else
+#ifdef _DEBUG
+	// Simulate heap failure
+	gAllocCount++;
+	switch (gAllocFailType)
+		{
+		case RAllocator::EFailNext:
+			if (gAllocCount == gAllocFailRate)
+				return NULL;
+			break;
+		case RAllocator::EDeterministic:
+			if (gAllocCount % gAllocFailRate == 0)
+				return NULL;
+			break;
+		default:
+			break;
+		}
+#endif // _DEBUG
+	TUint8* p = (TUint8*)malloc(aSize + sizeof(TInt));
+	if ( p == NULL ) {
+		return NULL;
+	}
+	*((TInt*)p) = aSize;
+	return p + sizeof(TInt);
+#endif // __TOOLS2__
+	}
+
+
+
+
+EXPORT_C TAny* User::AllocL(TInt aSize)
+/**
+Allocates a cell of specified size from the current thread's heap, and leaves 
+if there is insufficient memory in the heap.
+
+The resulting size of the allocated cell may be rounded up to a value greater 
+than aSize, but is guaranteed to be not less than aSize.
+
+@param aSize The size of the cell to be allocated from the current thread's 
+             heap.
+
+@return A pointer to the allocated cell.
+
+@panic USER 47, if the maximum unsigned value of aSize is greater
+                than or equal to KMaxTInt/2. For example,
+                calling Alloc(-1) raises this panic.
+*/
+	{
+#ifndef __TOOLS2__
+	return(GetHeap()->AllocL(aSize));
+#else
+		TAny* p = User::Alloc(aSize);
+	if (!p)
+		User::LeaveNoMemory();
+	return p;
+#endif // __TOOLS2__
+	}
+
+
+
+
+EXPORT_C TAny *User::AllocLC(TInt aSize)
+/**
+Allocates a cell of specified size from the current thread's default heap, and,
+if successful, places a pointer to the cell onto the cleanup stack.
+
+The function leaves if there is insufficient memory in the heap.
+
+The resulting size of the allocated cell may be rounded up to a value greater 
+than aSize, but is guaranteed to be not less than aSize.
+
+@param aSize The size of the cell to be allocated from the current thread's
+             default heap.
+             
+@return A pointer to the allocated cell.
+
+@panic USER 47, if the maximum unsigned value of aSize is greater
+                than or equal to KMaxTInt/2. For example,
+                calling Alloc(-1) raises this panic.
+*/
+	{
+#ifndef __TOOLS2__
+	return(GetHeap()->AllocLC(aSize));
+#else
+	TAny* p = User::AllocL(aSize);
+	CleanupStack::PushL(p);
+	return p;
+#endif // __TOOLS2__
+	}
+
+
+
+
+EXPORT_C TAny* User::AllocZ(TInt aSize)
+/**
+Allocates a cell of specified size from the current thread's default heap,
+and clears it to binary zeroes.
+
+If there is insufficient memory available on the heap from which to allocate a cell 
+of the required size, the function returns NULL.
+
+The resulting size of the allocated cell may be rounded up to a value greater 
+than aSize, but is guaranteed to be not less than aSize.
+
+@param aSize The size of the cell to be allocated from the current thread's 
+             default heap.
+             
+@return A pointer to the allocated cell. NULL, if there is insufficient memory 
+        available.
+        
+@panic USER 47, if the maximum unsigned value of aSize is greater
+                than or equal to KMaxTInt/2. For example,
+                calling Alloc(-1) raises this panic.
+*/
+	{
+#ifndef __TOOLS2__
+	return GetHeap()->AllocZ(aSize);
+#else
+	TAny* p = User::Alloc(aSize);
+	if (p)
+		memset(p, '\0', aSize);
+	return p;
+#endif // __TOOLS2__
+	}
+
+
+
+
+EXPORT_C TAny* User::AllocZL(TInt aSize)
+/**
+Allocates a cell of specified size from the current thread's default heap,
+clears it to binary zeroes, and leaves if there is insufficient memory in
+the heap.
+
+The resulting size of the allocated cell may be rounded up to a value greater 
+than aSize, but is guaranteed to be not less than aSize.
+
+@param aSize The size of the cell to be allocated from the current thread's 
+             heap.
+
+@return A pointer to the allocated cell.
+
+@panic USER 47, if the maximum unsigned value of aSize is greater
+                than or equal to KMaxTInt/2. For example,
+                calling Alloc(-1) raises this panic.
+*/
+	{
+#ifndef __TOOLS2__
+	return GetHeap()->AllocZL(aSize);
+#else
+	TAny* p = User::AllocZ(aSize);
+	if (!p)
+		User::LeaveNoMemory();
+	return p;
+#endif // __TOOLS2__
+	}
+
+
+
+EXPORT_C TInt User::Available(TInt &aBiggestBlock)
+/**
+Gets the total free space currently available on the current thread's 
+default heap, and the space available in the largest free block.
+
+The space available represents the total space which can be allocated.
+
+Note that compressing the heap may reduce the total free space available and the space 
+available in the largest free block.
+
+@param aBiggestBlock On return, contains the space available in the largest
+                     free block on the current thread's default heap.
+                     
+@return The total free space currently available on the current thread's heap.
+*/
+	{
+#ifndef __TOOLS2__
+	return(GetHeap()->Available(aBiggestBlock));
+#else
+	aBiggestBlock = 0x100000;
+	return 0x40000000;
+#endif // __TOOLS2__
+	}
+
+
+
+#ifndef __TOOLS2__
+EXPORT_C void User::Check()
+/**
+Checks the validity of the current thread's default heap.
+
+The function walks through the list of allocated cells and the list of free
+cells checking that the heap is consistent and complete.
+
+@panic USER 47 if any corruption is found, specifically	a bad allocated
+               heap cell size.
+@panic USER 48 if any corruption is found, specifically a bad allocated
+               heap cell address.
+@panic USER 49 if any corruption is found, specifically a bad free heap
+               cell address.
+*/
+	{
+
+	GetHeap()->Check();
+	}
+#endif // __TOOLS2__
+
+
+
+EXPORT_C void User::Free(TAny *aCell)
+/**
+Frees the specified cell and returns it to the current thread's default heap.
+
+@param aCell A pointer to a valid cell to be freed. If NULL this function 
+             call will be ignored.
+             
+@panic USER 42, if aCell is not NULL and does not point to a valid cell.
+*/
+	{
+#ifndef __TOOLS2__
+	if (aCell)
+		GetHeap()->Free(aCell);
+#else
+	if (aCell)
+		{
+		TUint8* p = ((TUint8*)aCell) - sizeof(TInt);
+		free(p);
+		}
+#endif // __TOOLS2__
+	}
+
+
+
+
+EXPORT_C void User::FreeZ(TAny * &aCell)
+/**
+Frees the specified cell, returns it to the current thread's default heap, and resets 
+the pointer to NULL.
+
+@param aCell A reference to a pointer to a valid cell to be freed. If NULL 
+             this function call will be ignored.
+             
+@panic USER 42, if aCell is not NULL and does not point to a valid cell.             
+*/
+	{
+#ifndef __TOOLS2__
+	if (aCell)
+		GetHeap()->FreeZ(aCell);
+#else
+	User::Free(aCell);
+	aCell = NULL;
+#endif // __TOOLS2__
+	}
+
+
+
+
+EXPORT_C TAny* User::ReAlloc(TAny* aCell, TInt aSize, TInt aMode)
+/**
+Increases or decreases the size of an existing cell in the current
+thread's heap.
+
+If the cell is being decreased in size, then it is guaranteed not to move,
+and the function returns the pointer originally passed in aCell. Note that the
+length of the cell will be the same if the difference between the old size
+and the new size is smaller than the minimum cell size.
+
+If the cell is being increased in size, i.e. aSize is bigger than its
+current size, then the function tries to grow the cell in place.
+If successful, then the function returns the pointer originally
+passed in aCell. If unsuccessful, then:
+-# if the cell cannot be moved, i.e. aMode has the ENeverMove bit set, then
+   the function returns NULL.
+-# if the cell can be moved, i.e. aMode does not have the ENeverMove bit set,
+   then the function tries to allocate a new replacement cell, and, if
+   successful, returns a pointer to the new cell; if unsuccessful, it
+   returns NULL.
+
+Note that in debug mode, the function returns NULL if the cell cannot be grown
+in place, regardless of whether the ENeverMove bit is set.
+
+If the reallocated cell is at a different location from the original cell, then
+the content of the original cell is copied to the reallocated cell.
+
+If the supplied pointer, aCell is NULL, then the function attempts to allocate
+a new cell, but only if the cell can be moved, i.e. aMode does not have
+the ENeverMove bit set.
+
+Note the following general points:
+- If reallocation fails, the content of the original cell is preserved.
+- The resulting size of the re-allocated cell may be rounded up to a value
+  greater than aSize, but is guaranteed to be not less than aSize.
+ 
+@param aCell A pointer to the cell to be reallocated. This may be NULL.
+
+@param aSize The new size of the cell. This may be bigger or smaller than the
+             size of the original cell. The value can also be zero, but this is
+             interpreted as a request for a cell of minimum size; the net
+             effect is the same as if the caller had explicitly requested
+             a cell of minimum size.
+             Note that the minimum size of a heap cell is device dependent.
+             
+@param aMode Flags controlling the reallocation. The only bit which has any
+             effect on this function is that defined by the enumeration
+             ENeverMove of the enum RAllocator::TReAllocMode.
+             If this is set, then any successful reallocation guarantees not
+             to have changed the start address of the cell.
+             By default, this parameter is zero.
+
+@return A pointer to the reallocated cell. This may be the same as the original
+        pointer supplied through aCell. NULL if there is insufficient memory to
+        reallocate the cell, or to grow it in place.
+
+@panic USER 42, if aCell is not NULL, and does not point to a valid cell.
+@panic USER 47, if the maximum unsigned value of aSize is greater
+                than or equal to KMaxTInt/2. For example,
+                calling ReAlloc(someptr,-1) raises this panic.
+
+@see RAllocator::TReAllocMode
+*/
+	{
+#ifndef __TOOLS2__
+	return GetHeap()->ReAlloc(aCell, aSize, aMode);
+#else
+	if (!aCell)
+		return User::Alloc(aSize);
+	else
+		{
+#ifdef _DEBUG
+		// Simulate heap failure
+		gAllocCount++;
+		switch (gAllocFailType)
+			{
+			case RAllocator::EFailNext:
+				if (gAllocCount == gAllocFailRate)
+					return NULL;
+				break;
+			case RAllocator::EDeterministic:
+				if (gAllocCount % gAllocFailRate == 0)
+					return NULL;
+				break;
+			default:
+				break;
+			}
+#endif // _DEBUG
+		TUint8* o = ((TUint8*)aCell) - sizeof(TInt);
+		TUint8* n = (TUint8*)realloc(o, aSize + sizeof(TInt));
+		if (n)
+			{
+			*((TInt*)n) = aSize;
+			return n + sizeof(TInt);
+			}
+		}
+	return NULL;
+#endif // __TOOLS2__
+	}
+
+
+
+
+EXPORT_C TAny* User::ReAllocL(TAny* aCell, TInt aSize, TInt aMode)
+/**
+Increases or decreases the size of an existing cell, and leaves 
+if there is insufficient memory in the current thread's default heap.
+
+If the cell is being decreased in size, then it is guaranteed not to move,
+and the function returns the pointer originally passed in aCell. Note that the
+length of the cell will be the same if the difference between the old size
+and the new size is smaller than the minimum cell size.
+
+If the cell is being increased in size, i.e. aSize is bigger than its
+current size, then the function tries to grow the cell in place.
+If successful, then the function returns the pointer originally
+passed in aCell. If unsuccessful, then:
+-# if the cell cannot be moved, i.e. aMode has the ENeverMove bit set, then
+   the function leaves.
+-# if the cell can be moved, i.e. aMode does not have the ENeverMove bit set,
+   then the function tries to allocate a new replacement cell, and, if
+   successful, returns a pointer to the new cell; if unsuccessful, it
+   leaves.
+
+Note that in debug mode, the function leaves if the cell cannot be grown
+in place, regardless of whether the ENeverMove bit is set.
+
+If the reallocated cell is at a different location from the original cell, then
+the content of the original cell is copied to the reallocated cell.
+
+If the supplied pointer, aCell is NULL, then the function attempts to allocate
+a new cell, but only if the cell can be moved, i.e. aMode does not have
+the ENeverMove bit set.
+
+Note the following general points:
+- If reallocation fails, the content of the original cell is preserved.
+- The resulting size of the re-allocated cell may be rounded up to a value
+  greater than aSize, but is guaranteed to be not less than aSize.
+
+@param aCell A pointer to the cell to be reallocated. This may be NULL.
+
+@param aSize The new size of the cell. This may be bigger or smaller than the
+             size of the original cell. The value can also be zero, but this is
+             interpreted as a request for a cell of minimum size; the net
+             effect is the same as if the caller had explicitly requested
+             a cell of minimum size.
+             Note that the minimum size of a heap cell is device dependent.
+             
+@param aMode Flags controlling the reallocation. The only bit which has any
+             effect on this function is that defined by the enumeration
+             ENeverMove of the enum RAllocator::TReAllocMode.
+             If this is set, then any successful reallocation guarantees not
+             to have changed the start address of the cell.
+             By default, this parameter is zero.
+
+@return A pointer to the reallocated cell. This may be the same as the original
+        pointer supplied through aCell.
+
+@panic USER 42, if aCell is not NULL, and does not point to a valid cell.
+@panic USER 47, if the maximum unsigned value of aSize is greater
+                than or equal to KMaxTInt/2. For example,
+                calling ReAlloc(someptr,-1) raises this panic.
+
+@see RAllocator::TReAllocMode
+*/
+	{
+#ifndef __TOOLS2__
+	return GetHeap()->ReAllocL(aCell, aSize, aMode);
+#else
+	TAny* p = ReAlloc(aCell, aSize, aMode);
+	if (!p)
+		User::LeaveNoMemory();
+	return p;
+#endif // __TOOLS2__
+	}
+
+
+
+#ifndef __TOOLS2__
+EXPORT_C RAllocator& User::Allocator()
+/**
+Gets the current thread's default current heap.
+
+@return The current heap.
+*/
+	{
+
+	return *GetHeap();
+	}		
+
+
+
+
+EXPORT_C TInt User::AllocSize(TInt &aTotalAllocSize)
+/**
+Gets the total number of cells allocated on the current thread's default heap, 
+and the total space allocated to them.
+
+@param aTotalAllocSize On return, contains the total space allocated to
+                       the cells.
+                       
+@return The number of cells currently allocated on the current thread's heap.
+*/
+	{
+
+	return(GetHeap()->AllocSize(aTotalAllocSize));
+	}
+
+
+
+
+EXPORT_C TInt User::CountAllocCells()
+/**
+Gets the total number of cells allocated on the current thread's default heap.
+
+
+@return The number of cells allocated on the current thread's default user heap.
+*/
+	{
+	return(GetHeap()->Count());
+	}  
+
+
+
+
+EXPORT_C TInt User::CountAllocCells(TInt &aFreeCount)
+/**
+Gets the the total number of cells allocated, and the number of free cells, 
+on the current thread's default heap.
+
+@param aFreeCount On return, contains the number of free cells 
+                  on the current thread's default heap.
+
+@return The number of cells allocated on the current thread's default heap.
+*/
+	{
+
+	return(GetHeap()->Count(aFreeCount));
+	}
+
+
+
+
+EXPORT_C RAllocator* User::SwitchAllocator(RAllocator* aA)
+/**
+Changes the current thread's heap.
+	
+@param aA A pointer to the new heap handle.
+
+@return A pointer to the old heap handle.
+*/
+	{
+	
+#ifdef __USERSIDE_THREAD_DATA__
+	// Just cache the pointer user-side.  We still need to let the kernel know what's going on so
+	// the heap can be cleaned up correctly later.
+	LocalThreadData()->iHeap=aA;
+#endif
+	return Exec::HeapSwitch(aA);
+	}
+#endif // __TOOLS2__
+
+// The suffix table
+const TText16* const __DefaultDateSuffixTable[KMaxSuffixes] =
+	{
+	_S16("st"),_S16("nd"),_S16("rd"),_S16("th"),_S16("th"),
+	_S16("th"),_S16("th"),_S16("th"),_S16("th"),_S16("th"),
+	_S16("th"),_S16("th"),_S16("th"),_S16("th"),_S16("th"),
+	_S16("th"),_S16("th"),_S16("th"),_S16("th"),_S16("th"),
+	_S16("st"),_S16("nd"),_S16("rd"),_S16("th"),_S16("th"),
+	_S16("th"),_S16("th"),_S16("th"),_S16("th"),_S16("th"),
+	_S16("st")
+	};
+
+// The day names
+const TText16* const __DefaultDayTable[KMaxDays] =
+	{
+	_S16("Monday"),
+	_S16("Tuesday"),
+	_S16("Wednesday"),
+	_S16("Thursday"),
+	_S16("Friday"),
+	_S16("Saturday"),
+	_S16("Sunday")
+	};
+
+// The abbreviated day names
+const TText16* const __DefaultDayAbbTable[KMaxDays] =
+	{
+	_S16("Mon"),
+	_S16("Tue"),
+	_S16("Wed"),
+	_S16("Thu"),
+	_S16("Fri"),
+	_S16("Sat"),
+	_S16("Sun")
+	};
+
+// The month names
+const TText16* const __DefaultMonthTable[KMaxMonths] =
+	{
+	_S16("January"),
+	_S16("February"),
+	_S16("March"),
+	_S16("April"),
+	_S16("May"),
+	_S16("June"),
+	_S16("July"),
+	_S16("August"),
+	_S16("September"),
+	_S16("October"),
+	_S16("November"),
+	_S16("December")
+	};
+
+// The abbreviated month names
+const TText16* const __DefaultMonthAbbTable[KMaxMonths] =
+	{
+	_S16("Jan"),
+	_S16("Feb"),
+	_S16("Mar"),
+	_S16("Apr"),
+	_S16("May"),
+	_S16("Jun"),
+	_S16("Jul"),
+	_S16("Aug"),
+	_S16("Sep"),
+	_S16("Oct"),
+	_S16("Nov"),
+	_S16("Dec")
+	};
+
+// The am/pm strings
+const TText16* const __DefaultAmPmTable[KMaxAmPms] =
+	{
+	_S16("am"),
+	_S16("pm")
+	};
+
+const TText16* const __DefaultLMsgTable[ELocaleMessages_LastMsg] =
+	{
+// Fileserver
+	_S16("Retry"),								// Button 1
+	_S16("Stop"),									// Button 2
+	_S16("Put the disk back"),					// Put the card back - line1
+	_S16("or data will be lost"),					// Put the card back - line2
+	_S16("Batteries too low"),					// Low power - line1
+	_S16("Cannot complete write to disk"),		// Low power - line2
+	_S16("Disk error - cannot complete write"),	// Disk error - line1
+	_S16("Retry or data will be lost"),			// Disk error - line2
+// SoundDriver
+	_S16("Chimes"),								// Chimes
+	_S16("Rings"),								// Rings
+	_S16("Signal"),								// Signal
+// MediaDriver diskname (max 16 chars)
+	_S16("Internal"),								// Internal
+	_S16("External(01)"),							// External(01)
+	_S16("External(02)"),							// External(02)
+	_S16("External(03)"),							// External(03)
+	_S16("External(04)"),							// External(04)
+	_S16("External(05)"),							// External(05)
+	_S16("External(06)"),							// External(06)
+	_S16("External(07)"),							// External(07)
+	_S16("External(08)"),							// External(08)
+// MediaDriver socketname (max 16 chars)
+	_S16("Socket(01)"),							// Socket(01)
+	_S16("Socket(02)"),							// Socket(02)
+	_S16("Socket(03)"),							// Socket(03)
+	_S16("Socket(04)")							// Socket(04)
+	};
+
+#ifdef __TOOLS2__
+TPckgBuf<TExtendedLocale> gLocale;
+// gLocale.iLocale set, does not guarantee gLocale's other members are loaded.
+TBool gLocaleSet = EFalse;
+// gLocale set, all members of gLoacle loaded except iLocale, which is not guaranteed loaded or not.
+TBool gLocaleExSet = EFalse;
+#endif
+
+LOCAL_C void LocaleLanguageGet(SLocaleLanguage& locale)
+	{
+#ifndef __TOOLS2__
+	TPckg<SLocaleLanguage> localeLanguageBuf(locale);
+	TInt r = RProperty::Get(KUidSystemCategory, KLocaleLanguageKey, localeLanguageBuf);
+	__ASSERT_DEBUG(r == KErrNone || r == KErrNotFound, Panic(EBadLocaleParameter));
+#else
+	TInt r = KErrNone;
+	if (gLocaleExSet)
+		{
+		SLocaleLanguage* languageSettings = gLocale().GetLanguageSettings();
+		memcpy(&locale, (void*)languageSettings, sizeof(SLocaleLanguage));
+		}
+	else
+		r = KErrNotFound;
+#endif // __TOOLS2__
+	
+	if(r == KErrNotFound)
+		{
+		locale.iLanguage			= ELangEnglish;
+		locale.iDateSuffixTable		= (const TText16*)__DefaultDateSuffixTable;
+		locale.iDayTable			= (const TText16*)__DefaultDayTable;
+		locale.iDayAbbTable			= (const TText16*)__DefaultDayAbbTable;
+		locale.iMonthTable			= (const TText16*)__DefaultMonthTable;
+		locale.iMonthAbbTable		= (const TText16*)__DefaultMonthAbbTable;
+		locale.iAmPmTable			= (const TText16*)__DefaultAmPmTable;
+		locale.iMsgTable			= (const TText16* const*)__DefaultLMsgTable;
+		}
+	}
+
+LOCAL_C void LocaleSettingsGet(SLocaleLocaleSettings& locale)
+	{
+#ifndef __TOOLS2__
+	TPckg<SLocaleLocaleSettings> localeSettingsBuf(locale);
+	TInt r = RProperty::Get(KUidSystemCategory, KLocaleDataExtraKey, localeSettingsBuf);
+	__ASSERT_DEBUG(r == KErrNone || r == KErrNotFound, Panic(EBadLocaleParameter));
+#else
+	TInt r = KErrNone;
+	if (gLocaleExSet)
+		{
+		SLocaleLocaleSettings* extraSettings = gLocale().GetLocaleExtraSettings();
+		memcpy(&locale, extraSettings, sizeof(SLocaleLocaleSettings));
+		}
+	else
+		r = KErrNotFound;
+#endif // __TOOLS2__
+	
+	if(r == KErrNotFound)
+		{
+		Mem::Copy(&locale.iCurrencySymbol[0], _S16("\x00a3"), sizeof(TText16) << 2);
+		locale.iLocaleExtraSettingsDllPtr = NULL;
+		}
+	}
+
+LOCAL_C void LocaleTimeDateFormatGet(SLocaleTimeDateFormat& locale)
+	{
+#ifndef __TOOLS2__
+	TPckg<SLocaleTimeDateFormat> localeTimeDateFormatBuf(locale);
+	TInt r = RProperty::Get(KUidSystemCategory, KLocaleTimeDateFormatKey, localeTimeDateFormatBuf);
+	__ASSERT_DEBUG(r == KErrNone || r == KErrNotFound, Panic(EBadLocaleParameter));
+#else
+	TInt r = KErrNone;
+	if (gLocaleExSet)
+		{
+		SLocaleTimeDateFormat* timeDateFormat = gLocale().GetLocaleTimeDateFormat();
+		memcpy(&locale, timeDateFormat, sizeof(SLocaleTimeDateFormat));
+		}
+	else
+		r = KErrNotFound;
+#endif // __TOOLS2__
+	if(r == KErrNotFound)
+		{
+		Mem::Copy(&locale.iShortDateFormatSpec[0], _S16("%F%*D/%*M/%Y"), sizeof(TText16) * 13);
+		Mem::Copy(&locale.iLongDateFormatSpec[0], _S16("%F%*D%X %N %Y"), sizeof(TText16) * 14);
+		Mem::Copy(&locale.iTimeFormatSpec[0], _S16("%F%*I:%T:%S %*A"), sizeof(TText16) * 16);
+		locale.iLocaleTimeDateFormatDllPtr = NULL;
+		}
+	}
+
+EXPORT_C void TDayName::Set(TDay aDay)
+/**
+Re-retrieves the current locale's text for the specified day of the week.
+
+@param aDay Identifies the day of the week.
+
+@panic USER 184, if the specified day is outside the permitted range.
+*/
+	{
+	
+	__ASSERT_ALWAYS(aDay>=EMonday && aDay<=ESunday,Panic(EBadLocaleParameter));
+	SLocaleLanguage localeLanguage;
+	LocaleLanguageGet(localeLanguage);
+	Copy((reinterpret_cast<const TText* const*>(localeLanguage.iDayTable))[aDay]);
+	}
+
+
+
+
+EXPORT_C void TDayNameAbb::Set(TDay aDay)
+/**
+Re-retrieves the current locale's abbreviated text for the specified day of 
+the week.
+
+@param aDay Identifies the day of the week.
+
+@panic USER 184, if the specified day is outside the permitted range.
+*/
+	{
+
+	__ASSERT_ALWAYS(aDay>=EMonday && aDay<=ESunday,Panic(EBadLocaleParameter));
+	SLocaleLanguage localeLanguage;
+	LocaleLanguageGet(localeLanguage);
+	Copy((reinterpret_cast<const TText* const*>(localeLanguage.iDayAbbTable))[aDay]);
+	}
+
+
+
+
+EXPORT_C void TMonthName::Set(TMonth aMonth)
+/**
+Re-retrieves the current locale's text for the specified month.
+
+@param aMonth Identifies the month.
+
+@panic USER 184, if the specified month is outside the permitted range.
+*/
+	{
+
+	__ASSERT_ALWAYS(aMonth>=EJanuary && aMonth<=EDecember,Panic(EBadLocaleParameter));
+	SLocaleLanguage localeLanguage;
+	LocaleLanguageGet(localeLanguage);
+	Copy((reinterpret_cast<const TText* const*>(localeLanguage.iMonthTable))[aMonth]);
+	}
+
+
+
+
+EXPORT_C void TMonthNameAbb::Set(TMonth aMonth)
+/**
+Re-retrieves the current locale's abbreviated text for the specified month.
+
+@param aMonth Identifies the month.
+
+@panic USER 184, if the specified month is outside the permitted range.
+*/
+	{
+
+	__ASSERT_ALWAYS(aMonth>=EJanuary && aMonth<=EDecember,Panic(EBadLocaleParameter));
+	SLocaleLanguage localeLanguage;
+	LocaleLanguageGet(localeLanguage);
+	Copy((reinterpret_cast<const TText* const*>(localeLanguage.iMonthAbbTable))[aMonth]);
+	}
+
+
+
+
+EXPORT_C void TDateSuffix::Set(TInt aSuffix)
+/**
+Re-retrieves the current locale's date suffix text for the specified day of 
+the month.
+
+@param aSuffix A value identifying the day of the month. The value can 
+               range from 0 to 30 so that the first day of the month is
+               identified by 0, the second day by 1 etc.
+                   
+@panic USER 69, if aDateSuffix is outside the range 0 to 30.
+*/
+	{
+
+	__ASSERT_ALWAYS(aSuffix>=0 && aSuffix<KMaxSuffixes,Panic(ETLoclSuffixOutOfRange));
+	SLocaleLanguage localeLanguage;
+	LocaleLanguageGet(localeLanguage);
+	Copy((reinterpret_cast<const TText* const*>(localeLanguage.iDateSuffixTable))[aSuffix]);
+	}
+
+
+
+
+EXPORT_C void TAmPmName::Set(TAmPm aSelector)
+/**
+Re-retrieves the current locale's text for identifying time before or after 
+noon as identified by the specified selector.
+
+@param aSelector The am/pm selector.
+
+@panic USER 69, if aDateSuffix is outside the range 0 to 30.
+*/
+	{
+
+	__ASSERT_ALWAYS(aSelector==EAm || aSelector==EPm,Panic(ETLoclSuffixOutOfRange));
+	SLocaleLanguage localeLanguage;
+	LocaleLanguageGet(localeLanguage);
+	Copy((reinterpret_cast<const TText* const*>(localeLanguage.iAmPmTable))[aSelector]);
+	}
+
+
+
+
+EXPORT_C void TCurrencySymbol::Set()
+/**
+Re-retrieves the current locale's currency symbol(s).
+*/
+	{
+	SLocaleLocaleSettings locale;
+	LocaleSettingsGet(locale);
+	Copy(&locale.iCurrencySymbol[0]);
+	}
+
+
+
+
+EXPORT_C void TShortDateFormatSpec::Set()
+/**
+Sets the contents of the short date format specification from the system-wide 
+settings.
+*/
+	{
+	SLocaleTimeDateFormat locale;
+	LocaleTimeDateFormatGet(locale);
+	Copy(&locale.iShortDateFormatSpec[0]);
+	}
+
+
+
+
+EXPORT_C void TLongDateFormatSpec::Set()
+/**
+Sets the contents of the long date format specification from the system-wide 
+settings.
+*/
+	{
+	SLocaleTimeDateFormat locale;
+	LocaleTimeDateFormatGet(locale);
+	Copy(&locale.iLongDateFormatSpec[0]);
+	}
+
+
+
+
+EXPORT_C void TTimeFormatSpec::Set()
+/**
+Sets the contents of the time string format specification from the system-wide
+settings.
+*/
+	{
+	SLocaleTimeDateFormat locale;
+	LocaleTimeDateFormatGet(locale);
+	Copy(&locale.iTimeFormatSpec[0]);
+	}
+
+
+
+EXPORT_C TInt User::SetCurrencySymbol(const TDesC& aSymbol)
+/**
+Sets the system wide currency symbol.
+
+On successful return from this function, a call to the Set() member function 
+of a TCurrencySymbol object fetches the new currency symbol.
+
+@capability WriteDeviceData
+
+@param aSymbol A reference to the descriptor containing the currency symbol 
+               to be set.
+               
+@return KErrNone if successful, otherwise one of the other system wide error codes.
+
+@panic USER 119, if the length of aSymbol is greater than KMaxCurrencySymbol. 
+
+@see TCurrencySymbol
+@see TCurrencySymbol::Set()
+@see KMaxCurrencySymbol
+*/
+	{
+
+	TExtendedLocale locale;
+	return locale.SetCurrencySymbol(aSymbol);
+	}
+
+
+
+EXPORT_C TLanguage User::Language()
+/**
+Gets the language of the current locale.
+
+@return One of the TLanguage enumerators identifying the language of the
+        current locale.
+*/
+	{
+
+	SLocaleLanguage localeLanguage;
+	LocaleLanguageGet(localeLanguage);
+	return localeLanguage.iLanguage;
+	}
+
+
+
+
+EXPORT_C TLocale::TLocale()
+/**
+Default constructor.
+
+It constructs the object with the system's locale settings.
+
+A single copy of the locale information is maintained by the system. This 
+copy may be refreshed under application control with TLocale::Refresh(), and 
+the settings may be saved to the system with TLocale::Set(). However, the 
+settings are never updated by the system apart from under application control. 
+This enables applications to guarantee that consistent locale information 
+is used.
+
+@see TLocale::Refresh()
+@see TLocale::Set()
+*/
+	{
+
+	Refresh();
+	}
+
+
+const TUint8 __DefaultDateSeparator[KMaxDateSeparators] = { 0, '/', '/', 0 };
+const TUint8 __DefaultTimeSeparator[KMaxTimeSeparators] = { 0, ':', ':', 0 };
+
+void TLocale::SetDefaults()
+	{
+	iCountryCode = 44;
+	iUniversalTimeOffset = 0;
+	iDateFormat = EDateEuropean;
+	iTimeFormat = ETime12;
+	iCurrencySymbolPosition = ELocaleBefore;
+	iCurrencySpaceBetween = EFalse;
+	iCurrencyDecimalPlaces = 2;
+	iNegativeCurrencyFormat = TNegativeCurrencyFormat(EFalse);
+	iCurrencyTriadsAllowed = ETrue;
+	iThousandsSeparator = ',';
+	iDecimalSeparator = '.';
+	TInt i=0;
+	for(; i<KMaxDateSeparators; i++)
+		iDateSeparator[i] = __DefaultDateSeparator[i];
+	for(i=0; i<KMaxTimeSeparators; i++)
+		iTimeSeparator[i] = __DefaultTimeSeparator[i];
+	iAmPmSymbolPosition = ELocaleAfter;
+	iAmPmSpaceBetween = ETrue;
+	iHomeDaylightSavingZone = EDstEuropean;
+	iWorkDays = 0x1f;
+	iStartOfWeek = EMonday;
+	iClockFormat = EClockAnalog;
+	iUnitsGeneral = EUnitsImperial;
+	iUnitsDistanceLong =  EUnitsImperial;
+	iUnitsDistanceShort =  EUnitsImperial;
+	iExtraNegativeCurrencyFormatFlags = 0;
+	iLanguageDowngrade[0] = ELangNone;
+	iLanguageDowngrade[1] = ELangNone;
+	iLanguageDowngrade[2] = ELangNone;
+	iDigitType = EDigitTypeWestern;
+	iDeviceTimeState = TDeviceTimeState(EDeviceUserTime);
+	}
+
+EXPORT_C void TLocale::Refresh()
+/**
+Refreshes the contents of this object with the system's locale settings.
+*/
+	{
+
+#ifndef __TOOLS2__	
+	TPckg<TLocale> localeDataBuf(*this);
+	TInt r = RProperty::Get(KUidSystemCategory, KLocaleDataKey, localeDataBuf);
+	__ASSERT_DEBUG(r == KErrNone || r == KErrNotFound, Panic(EBadLocaleParameter));
+	if(r == KErrNone)
+		{
+		iUniversalTimeOffset = Exec::UTCOffset();
+		iDaylightSaving = 0;
+		}
+	else if(r == KErrNotFound)
+			{
+			SetDefaults();
+			}
+#else
+	
+	if (gLocaleSet)
+		{
+		TLocale* loc = gLocale().GetLocale();
+		memcpy(this, (void*)loc, sizeof(TLocale));
+		}
+	else
+		{
+		SetDefaults();
+		}
+	
+#endif // __TOOLS2__
+	}
+
+
+EXPORT_C TInt TLocale::Set() const
+/**
+Transfers the locale settings from this object to the system. Note that
+the timezone offset and daylight savings flags are ignored as setting these
+through TLocale is no longer supported.
+
+After this function has been called, other applications may use the new
+settings for newly-constructed TLocale objects,
+or if they use TLocale::Refresh(), to refresh their settings from
+the system copy.
+
+@capability WriteDeviceData
+
+@return KErrNone if successful, otherwise one of the other system wide error codes.
+
+@see TLocale::Refresh()
+*/
+	{
+#ifndef __TOOLS2__
+	TPckg<TLocale> localeDataBuf(*this);
+	TInt r = RProperty::Set(KUidSystemCategory, KLocaleDataKey, localeDataBuf);
+	if(r == KErrNone)
+		{
+		Exec::NotifyChanges(EChangesLocale);
+		}
+	return r;
+#else
+	TLocale* loc = gLocale().GetLocale();
+	memcpy((void*)loc, this, sizeof(TLocale));
+	gLocaleSet = ETrue;
+	return KErrNone;
+#endif
+	}
+
+
+#ifdef __TOOLS2__
+RLoader gLocaleLoader;
+#endif
+
+TInt TExtendedLocale::DoLoadLocale(const TDesC& aLocaleDllName, TLibraryFunction* aExportList)
+	{
+#ifndef __TOOLS2__
+	RLoader loader;
+	TInt r = loader.LoadLocale(aLocaleDllName, aExportList);
+	return r;
+#else
+	gLocaleLoader.Free();
+	TInt r = gLocaleLoader.LoadLocale(aLocaleDllName, aExportList);
+	return r;
+#endif
+	}
+
+void TExtendedLocale::DoUpdateLanguageSettings(TLibraryFunction* aExportList)
+	{
+	iLanguageSettings.iLanguage = (TLanguage)aExportList[FnLanguage]();
+	iLanguageSettings.iDateSuffixTable = (const TText*)aExportList[FnDateSuffixTable]();
+	iLanguageSettings.iDayTable = (const TText*)aExportList[FnDayTable]();
+	iLanguageSettings.iDayAbbTable = (const TText*)aExportList[FnDayAbbTable]();
+	iLanguageSettings.iMonthTable = (const TText*)aExportList[FnMonthTable]();
+	iLanguageSettings.iMonthAbbTable = (const TText*)aExportList[FnMonthAbbTable]();
+	iLanguageSettings.iAmPmTable = (const TText*)aExportList[FnAmPmTable]();
+	iLanguageSettings.iMsgTable = (const TText16* const*)aExportList[FnMsgTable]();
+	}
+
+void TExtendedLocale::DoUpdateLocaleSettings(TLibraryFunction* aExportList)
+	{
+	Mem::Copy(&iLocaleExtraSettings.iCurrencySymbol[0], (const TAny*)aExportList[FnCurrencySymbol](), sizeof(TText) * (KMaxCurrencySymbol+1));
+	iLocaleExtraSettings.iLocaleExtraSettingsDllPtr = (TAny*)aExportList[FnDateSuffixTable]();
+	}
+
+void TExtendedLocale::DoUpdateTimeDateFormat(TLibraryFunction* aExportList)
+	{
+	Mem::Copy(&iLocaleTimeDateFormat.iShortDateFormatSpec[0], (const TAny*)aExportList[FnShortDateFormatSpec](), sizeof(TText) * (KMaxShortDateFormatSpec+1));
+	Mem::Copy(&iLocaleTimeDateFormat.iLongDateFormatSpec[0], (const TAny*)aExportList[FnLongDateFormatSpec](), sizeof(TText) * (KMaxLongDateFormatSpec+1)) ;
+	Mem::Copy(&iLocaleTimeDateFormat.iTimeFormatSpec[0], (const TAny*)aExportList[FnTimeFormatSpec](), sizeof(TText) * (KMaxTimeFormatSpec+1));
+	iLocaleTimeDateFormat.iLocaleTimeDateFormatDllPtr = (TAny*)aExportList[FnDateSuffixTable]();
+	}
+
+/**
+Default constructor.
+
+It constructs an empty object
+
+This is an empty copy of TExtendedLocale. To get the system locale you can
+use TExtendedLocale::LoadSystemSettings. The current settings may be saved to the system
+with TLocale::SaveSystemSettings().
+
+@see TExtendedLocale::LoadSystemSettings
+@see TExtendedLocale::SaveSystemSettings
+*/
+EXPORT_C TExtendedLocale::TExtendedLocale()
+	: iLocale(0)
+	{
+	Mem::FillZ(&iLanguageSettings, sizeof(TExtendedLocale) - sizeof(TLocale));
+	}
+
+/**
+Load system wide locale settings
+
+It initialises this TExtendedLocale with the system wide locale settings.
+The settings stored in the TExtendedLocale are overwritten with the system
+wide locale.
+
+@see TExtendedLocale::SaveSystemSettings
+*/
+EXPORT_C void TExtendedLocale::LoadSystemSettings()
+	{
+	LocaleLanguageGet(iLanguageSettings);
+	LocaleSettingsGet(iLocaleExtraSettings);
+	LocaleTimeDateFormatGet(iLocaleTimeDateFormat);
+	iDefaultCharSet = GetLocaleCharSet();
+	iPreferredCharSet = GetLocalePreferredCharSet();
+	iLocale.Refresh();
+	}
+
+#ifndef __TOOLS2__
+/**
+Make the current locale information system wide
+
+It overwrites the system wide locale information with the locale information
+stored in this TExtendedLocale.
+This will generate a notification for system locale changes.
+In case of an error, the locale might be in an unconsistent state.
+
+@capability WriteDeviceData
+
+@return KErrNone if successful, otherwise one of the other system wide error codes.
+*/
+EXPORT_C TInt TExtendedLocale::SaveSystemSettings()
+	{
+
+	TPckg<SLocaleLanguage> localeLanguageBuf(iLanguageSettings);
+	TInt r = RProperty::Set(KUidSystemCategory, KLocaleLanguageKey, localeLanguageBuf);
+	if(r != KErrNone)
+		return r;
+
+	TPckg<SLocaleLocaleSettings> localeSettingsBuf(iLocaleExtraSettings);
+	r = RProperty::Set(KUidSystemCategory, KLocaleDataExtraKey, localeSettingsBuf);
+	if(r != KErrNone)
+		return r;
+
+	TPckg<SLocaleTimeDateFormat> localeTimeDateFormatBuf(iLocaleTimeDateFormat);
+	r = RProperty::Set(KUidSystemCategory, KLocaleTimeDateFormatKey, localeTimeDateFormatBuf);
+	if(r != KErrNone)
+		return r;
+
+	r = Exec::SetGlobalUserData(ELocaleDefaultCharSet, (TInt)iDefaultCharSet);
+	if(r != KErrNone)
+		return r;
+
+	r = Exec::SetGlobalUserData(ELocalePreferredCharSet, (TInt)iPreferredCharSet);
+
+	if(r == KErrNone)
+		{
+		iLocale.Set();
+		}
+
+	return r;
+	}
+#endif // __TOOLS2__
+
+
+/**
+Loads a locale Dll and get the locale information
+
+It loads a locale DLL and it initialises the contents of this TExtendedLocale
+with the locale information stored in the DLL. The locale information is only
+stored in this TExtendedLocale. If you want to set the system wide settings with
+the locale information in the DLL, you can call TExtendedLocale::SaveSystemSettings
+after calling this function.
+
+@param aLocaleDllName The name of the locale DLL to be loaded
+@return KErrNone if successful, system wide error if not
+
+@see TExtendedLocale::SaveSystemSettings 
+*/
+EXPORT_C TInt TExtendedLocale::LoadLocale(const TDesC& aLocaleDllName)
+	{
+	TLibraryFunction data[KNumLocaleExports];
+	TInt r = DoLoadLocale(aLocaleDllName, &data[0]);
+	if(r == KErrNone)
+		{
+		iLocale.iExtraNegativeCurrencyFormatFlags=0x80000000;
+	  	iLocale.iLanguageDowngrade[0] = ELangNone;
+		iLocale.iLanguageDowngrade[1] = ELangNone;
+  		iLocale.iLanguageDowngrade[2] = ELangNone;
+	  	iLocale.iDigitType = EDigitTypeWestern;
+
+		typedef void (*TLibFn)(TLocale*);
+		((TLibFn)data[FnLocaleData])(&iLocale);
+
+		//Locale daylightsavings unchanged - we have travelled through space, not time
+		if (iLocale.iExtraNegativeCurrencyFormatFlags&0x80000000)
+			iLocale.iExtraNegativeCurrencyFormatFlags=0;		
+		
+		DoUpdateLanguageSettings(&data[0]);
+		DoUpdateLocaleSettings(&data[0]);
+		DoUpdateTimeDateFormat(&data[0]);
+
+		iPreferredCharSet = (const LCharSet*)data[FnCharSet]();
+		iDefaultCharSet = iPreferredCharSet;
+		gLocaleSet = ETrue;
+		gLocaleExSet = ETrue;
+		}
+	return r;
+	}
+
+/**
+Loads a DLL and get some locale information
+
+It loads the specified locale DLL and depending on the aAspectGroup it overwrites
+locale information in this TExtendedLocale with the locale information stored in the
+DLL. aAspectGroup is a bitmap of TLocaleAspect values specifying what to be overwritten.
+The locale information is only stored in this TExtendedLocale. If you want to set the
+system wide settings with the locale information in the DLL, you can call
+TExtendedLocale::SaveSystemSettings after calling this function.
+
+@param aAspectGroup A bitmap of TLocaleAspect values specifying what to be overwritten in
+					this TExtendedLocale. (eg.: ELocaleLanguageSettings | ELocaleTimeDateSettings)
+@param aLocaleDllName The name of the locale DLL to be loaded
+
+@return KErrNone if the method is successful, a system wide error code if not
+
+@see TLocaleAspect
+@see TExtendedLocale::SaveSystemSettings
+*/
+EXPORT_C TInt TExtendedLocale::LoadLocaleAspect(TUint aAspectGroup, const TDesC& aLocaleDllName)
+	{
+	TLibraryFunction data[KNumLocaleExports];
+	TInt r = DoLoadLocale(aLocaleDllName, &data[0]);
+	if(r == KErrNone)
+		{
+		if(aAspectGroup & ELocaleLanguageSettings)
+			{
+			DoUpdateLanguageSettings(&data[0]);
+			}
+		if(aAspectGroup & ELocaleCollateSetting)
+			{
+			iPreferredCharSet = (const LCharSet*)data[FnCharSet]();
+			iDefaultCharSet = iPreferredCharSet;
+			}
+		if(aAspectGroup & ELocaleLocaleSettings)
+			{
+			DoUpdateLocaleSettings(&data[0]);
+			}
+		if(aAspectGroup & ELocaleTimeDateSettings)
+			{
+			DoUpdateTimeDateFormat(&data[0]);
+			}
+		}
+	return r;
+	}
+
+/**
+Sets the currency symbol
+
+It sets the currency symbol. The maximum lenght for the currency symbol is
+KMaxCurrencySymbol. Trying to pass a descriptor longer than that, will result
+in a panic.
+
+@param aSymbol The new currency symbol
+
+@panic USER 119, if the length of aSymbol is greater than KMaxCurrencySymbol.
+
+@capability WriteDeviceData
+
+@return KErrNone if successful, otherwise one of the other system wide error codes.
+*/
+EXPORT_C TInt TExtendedLocale::SetCurrencySymbol(const TDesC &aSymbol)
+	{
+	__ASSERT_ALWAYS(aSymbol.Length()<=KMaxCurrencySymbol,::Panic(ECurrencySymbolOverflow));
+	
+	LocaleSettingsGet(iLocaleExtraSettings);
+	Mem::Copy(&iLocaleExtraSettings.iCurrencySymbol[0], aSymbol.Ptr(), aSymbol.Length() << 1);
+	iLocaleExtraSettings.iCurrencySymbol[aSymbol.Length()] = 0;
+#ifndef __TOOLS2__
+	TInt r = RProperty::Set(KUidSystemCategory, KLocaleDataExtraKey, TPckg<SLocaleLocaleSettings>(iLocaleExtraSettings));
+	return r;
+#else
+	return KErrNone;
+#endif
+	}
+
+
+#ifndef __TOOLS2__
+/**
+Returns the name of the DLL containing the given bits of locale information
+
+Given the bits of locale information specified in aLocaleDataSet, it returns the name
+of the locale DLL storing the information. TExtendedLocale can contain information from
+different DLLs.
+
+@param aLocaleDataSet The TLocaleAspect specifying a group of locale properties
+@param aDllName The descriptor that will contain the name of DLL containing the specifying
+				bits of locale information (valid if the method is successful)
+
+@return KErrNone if successful, system wide error otherwise
+*/
+EXPORT_C TInt TExtendedLocale::GetLocaleDllName(TLocaleAspect aLocaleDataSet, TDes& aDllName)
+	{
+ 	TBuf8<KMaxFullName> buf;
+	TAny* ptr = 0;
+	switch(aLocaleDataSet)
+		{
+		case ELocaleLanguageSettings:
+			ptr = (TAny*)iLanguageSettings.iDateSuffixTable;
+			break;
+		case ELocaleCollateSetting:
+			ptr = (TAny*)iPreferredCharSet;
+			break;
+		case ELocaleLocaleSettings:
+			ptr = (TAny*)iLocaleExtraSettings.iLocaleExtraSettingsDllPtr;
+			break;
+		case ELocaleTimeDateSettings:
+			ptr = (TAny*)iLocaleTimeDateFormat.iLocaleTimeDateFormatDllPtr;
+			break;
+		}
+ 	TInt r = Exec::GetModuleNameFromAddress(ptr, buf);
+ 	if (r == KErrNone)
+		{
+ 		aDllName.Copy(buf);
+ 		}
+ 	return r;
+	}
+#endif // __TOOLS2__
+
+/**
+Get the Currency Symbol from SLocaleLocaleSettings object
+
+@return TPtrC Pointer holding the Currency Symbol
+*/
+EXPORT_C TPtrC TExtendedLocale::GetCurrencySymbol()
+	{
+	TPtrC outCurrencySymbolPtr(iLocaleExtraSettings.iCurrencySymbol);
+	return outCurrencySymbolPtr;
+	}
+	
+/**
+Get the Long Date Format from SLocaleTimeDateFormat object
+
+@return TPtrC Pointer holding the Long Date Format
+*/
+EXPORT_C TPtrC TExtendedLocale::GetLongDateFormatSpec()
+	{
+	TPtrC outLongDateFormatPtr(iLocaleTimeDateFormat.iLongDateFormatSpec);
+	return outLongDateFormatPtr;
+	}
+	
+/**
+Get the Short Date Format from SLocaleTimeDateFormat object
+
+@return TPtrC Pointer holding the Short Date Format
+*/
+EXPORT_C TPtrC TExtendedLocale::GetShortDateFormatSpec()
+	{
+	TPtrC outShortDateFormatPtr(iLocaleTimeDateFormat.iShortDateFormatSpec);
+	return outShortDateFormatPtr;
+	}
+	
+/**
+Get the Time Format from SLocaleTimeDateFormat object
+
+@return TPtrC Pointer holding the Time Format
+*/
+EXPORT_C TPtrC TExtendedLocale::GetTimeFormatSpec()
+	{
+	TPtrC outTimeFormatPtr(iLocaleTimeDateFormat.iTimeFormatSpec);
+	return outTimeFormatPtr;
+	}
+
+#ifndef __TOOLS2__
+EXPORT_C TInt UserSvr::LocalePropertiesSetDefaults()
+	{
+	_LIT_SECURITY_POLICY_C1(KLocaleWritePolicy,ECapabilityWriteDeviceData);
+	_LIT_SECURITY_POLICY_PASS(KLocaleReadPolicy);
+
+	TInt r = RProperty::Define(KUidSystemCategory, KLocaleLanguageKey, RProperty::EByteArray, KLocaleReadPolicy, KLocaleWritePolicy, sizeof(TPckg<SLocaleLanguage>));
+	if(r != KErrNone && r != KErrAlreadyExists)
+		return r;
+	
+	SLocaleLanguage localeLanguage;
+	localeLanguage.iLanguage			= ELangEnglish;
+	localeLanguage.iDateSuffixTable		= (const TText16*)__DefaultDateSuffixTable;
+	localeLanguage.iDayTable			= (const TText16*)__DefaultDayTable;
+	localeLanguage.iDayAbbTable			= (const TText16*)__DefaultDayAbbTable;
+	localeLanguage.iMonthTable			= (const TText16*)__DefaultMonthTable;
+	localeLanguage.iMonthAbbTable		= (const TText16*)__DefaultMonthAbbTable;
+	localeLanguage.iAmPmTable			= (const TText16*)__DefaultAmPmTable;
+	localeLanguage.iMsgTable			= (const TText16* const*)__DefaultLMsgTable;
+	r = RProperty::Set(KUidSystemCategory, KLocaleLanguageKey, TPckg<SLocaleLanguage>(localeLanguage));
+	if(r != KErrNone)
+		return r;
+
+	r = RProperty::Define(KUidSystemCategory, KLocaleDataKey, RProperty::EByteArray, KLocaleReadPolicy, KLocaleWritePolicy, sizeof(TPckg<TLocale>));
+	if(r != KErrNone && r != KErrAlreadyExists)
+		return r;
+
+	TLocale locale(0);
+	locale.SetDefaults();
+
+	r = RProperty::Set(KUidSystemCategory, KLocaleDataKey, TPckg<TLocale>(locale));
+	if(r != KErrNone)
+		return r;
+
+	r = RProperty::Define(KUidSystemCategory, KLocaleDataExtraKey, RProperty::EByteArray, KLocaleReadPolicy, KLocaleWritePolicy, sizeof(TPckg<SLocaleLocaleSettings>));
+	if(r != KErrNone && r != KErrAlreadyExists)
+		return r;
+
+	SLocaleLocaleSettings localeSettings;
+	Mem::Copy(&localeSettings.iCurrencySymbol[0], _S16("\x00a3"), sizeof(TText16) * 2);
+
+	r = RProperty::Set(KUidSystemCategory, KLocaleDataExtraKey, TPckg<SLocaleLocaleSettings>(localeSettings));
+	if(r != KErrNone)
+		return r;
+
+	r = RProperty::Define(KUidSystemCategory, KLocaleTimeDateFormatKey, RProperty::EByteArray, KLocaleReadPolicy, KLocaleWritePolicy, sizeof(TPckg<SLocaleLocaleSettings>));
+	if(r != KErrNone && r != KErrAlreadyExists)
+		return r;
+
+	SLocaleTimeDateFormat localeTimeDateFormat;
+	Mem::Copy(&localeTimeDateFormat.iShortDateFormatSpec[0], _S16("%F%*D/%*M/%Y"), sizeof(TText16) * 13);
+	Mem::Copy(&localeTimeDateFormat.iLongDateFormatSpec[0], _S16("%F%*D%X %N %Y"), sizeof(TText16) * 14);
+	Mem::Copy(&localeTimeDateFormat.iTimeFormatSpec[0], _S16("%F%*I:%T:%S %*A"), sizeof(TText16) * 16);
+
+	r = RProperty::Set(KUidSystemCategory, KLocaleTimeDateFormatKey, TPckg<SLocaleTimeDateFormat>(localeTimeDateFormat));
+	if(r != KErrNone)
+		return r;
+
+	TInt charSet = (TInt)GetLocaleDefaultCharSet();
+	r = Exec::SetGlobalUserData(ELocaleDefaultCharSet, charSet);
+	if(r != KErrNone)
+		return r;
+
+	r = Exec::SetGlobalUserData(ELocalePreferredCharSet, charSet);
+
+	return r;
+	}
+#endif // __TOOLS2__
+
+// TOverflowHandler class created to handle the descriptor overflow in TLoacle::FormatCurrency
+NONSHARABLE_CLASS(TOverflowHandler) : public TDesOverflow
+	{
+	void Overflow(TDes& aDes);
+	};
+
+void TOverflowHandler::Overflow(TDes&)
+	{
+	Panic(ETDes16Overflow);
+	}
+
+
+
+
+EXPORT_C void TLocale::FormatCurrency(TDes& aText, TInt aAmount)
+/**
+Renders a currency value as text, based on the locale's currency and numeric 
+format settings. 
+
+These settings include the currency symbol, the symbol's position and the 
+way negative values are formatted.
+
+@param aText   On return, contains the currency value as text, formatted
+               according to the locale's currency format settings.
+@param aAmount The currency value to be formatted.
+
+@panic USER 11, if aText is not long enough to hold the formatted value.
+*/
+	{
+	TOverflowHandler overflowHandler;
+	FormatCurrency(aText,overflowHandler,aAmount);   
+	}
+
+
+
+
+EXPORT_C void TLocale::FormatCurrency(TDes& aText, TInt64 aAmount)
+/**
+Renders a currency value as text, based on the locale's currency and numeric 
+format settings. 
+
+These settings include the currency symbol, the symbol's position and the 
+way negative values are formatted.
+
+@param aText   On return, contains the currency value as text, formatted
+               according to the locale's currency format settings.
+@param aAmount The currency value to be formatted.
+
+@panic USER 11, if aText is not long enough to hold the formatted value.
+*/
+	{
+	TOverflowHandler overflowHandler;
+	FormatCurrency(aText,overflowHandler, aAmount);
+	}
+
+
+
+
+EXPORT_C void TLocale::FormatCurrency(TDes& aText, TDesOverflow& aOverflowHandler, TInt aAmount)
+/**
+Renders a currency value as text, based on the locale's currency and numeric 
+format settings. 
+
+These settings include the currency symbol, the symbol's position and the 
+way negative values are formatted. If aText is not long enough to hold the 
+formatted currency value, the overflow handler's Overflow() function is called.
+
+@param aText            On return, contains the currency value as text,
+                        formatted according to the locale's currency format
+                        settings.
+@param aOverflowHandler An object derived from TDesOverflow which handles
+                        descriptor overflows.
+@param aAmount          The currency value to be formatted.
+*/
+	{
+	TInt64 aLongerInt(aAmount);
+	FormatCurrency(aText, aOverflowHandler, aLongerInt); 
+	}
+
+
+
+
+EXPORT_C void TLocale::FormatCurrency(TDes& aText, TDesOverflow& aOverflowHandler, TInt64 aAmount)
+/**
+Renders a currency value as text, based on the locale's currency and numeric 
+format settings. 
+
+These settings include the currency symbol, the symbol's position and the 
+way negative values are formatted. If aText is not long enough to hold the 
+formatted currency value, the overflow handler's Overflow() function is called.
+
+@param aText            On return, contains the currency value as text,
+                        formatted according to the locale's currency format
+                        settings.
+@param aOverflowHandler An object derived from TDesOverflow which handles
+                        descriptor  overflows.
+@param aAmount          The currency value to be formatted.
+*/
+	{
+	// aAmount is in cents (or equivalent) rather than dollars (or equivalent)
+	const TBool amountIsNegative=(aAmount<0);
+	if (amountIsNegative)
+		{
+		aAmount=-aAmount;
+		}
+	aText.Num(aAmount, EDecimal);
+	const TInt currencyDecimalPlaces=CurrencyDecimalPlaces();
+	TInt positionOfDecimalSeparator=aText.Length();
+	if (currencyDecimalPlaces>0)
+		{
+		while (positionOfDecimalSeparator <= currencyDecimalPlaces)
+			{
+			if (aText.Length() == aText.MaxLength())
+				{
+				aOverflowHandler.Overflow(aText);
+				return;
+				}
+			aText.Insert(0,KLitZeroPad);
+			++positionOfDecimalSeparator;
+			}
+		positionOfDecimalSeparator=aText.Length();
+		positionOfDecimalSeparator-=currencyDecimalPlaces;
+		TBuf<1> decimalSeparator;
+		decimalSeparator.Append(DecimalSeparator());
+		if (aText.Length() == aText.MaxLength())
+			{
+			aOverflowHandler.Overflow(aText);
+			return;
+			}
+		aText.Insert(positionOfDecimalSeparator, decimalSeparator);
+		}
+	if (CurrencyTriadsAllowed())
+		{
+		TBuf<1> thousandsSeparator;
+		thousandsSeparator.Append(ThousandsSeparator());
+		TInt numberOfThousandsSeparator = positionOfDecimalSeparator/3;
+		if ((aText.Length()+numberOfThousandsSeparator) > aText.MaxLength())
+			{
+			aOverflowHandler.Overflow(aText);
+			return;
+			}
+		for (TInt i=positionOfDecimalSeparator-3; i>0; i-=3)
+			{
+			aText.Insert(i, thousandsSeparator);
+			}
+		}
+	TInt positionToInsertCurrencySymbol = 0; 
+	switch (CurrencySymbolPosition())
+		{
+		case ELocaleBefore:
+			{
+			if ((amountIsNegative) && (NegativeCurrencySymbolOpposite()))
+				{
+				positionToInsertCurrencySymbol=aText.Length();
+				}
+			else
+				positionToInsertCurrencySymbol=0;
+			}
+			break;
+		case ELocaleAfter:
+			{
+			if ((amountIsNegative) && (NegativeCurrencySymbolOpposite()))
+				{
+				positionToInsertCurrencySymbol=0;
+				}
+			else
+				positionToInsertCurrencySymbol=aText.Length();
+			}
+			break;
+		default:
+			Panic(ETRegionOutOfRange);
+			break;
+		}
+	if (CurrencySpaceBetween())
+		{
+		if (aText.Length() == aText.MaxLength())
+			{
+			aOverflowHandler.Overflow(aText);
+			return;
+			}
+		if ((amountIsNegative) && (NegativeLoseSpace()))
+			{
+			// don't add the space
+			}
+		else
+			{
+			aText.Insert(positionToInsertCurrencySymbol, KLitSpace); 
+			if (positionToInsertCurrencySymbol>0)
+				{
+				++positionToInsertCurrencySymbol;
+				}
+			}
+		}
+	TCurrencySymbol theCurrencySymbol;
+	if ((aText.Length()+theCurrencySymbol.Length()) > aText.MaxLength())
+		{
+		aOverflowHandler.Overflow(aText);
+		return;
+		}
+	aText.Insert(positionToInsertCurrencySymbol,theCurrencySymbol);
+	if (amountIsNegative)
+		{
+		TInt positionToInsertInterveningMinusSign = 0;
+		if ((CurrencySpaceBetween()) && !(NegativeLoseSpace()))
+			{
+			if (positionToInsertCurrencySymbol>0)
+				{
+				positionToInsertInterveningMinusSign = positionToInsertCurrencySymbol-1;
+				}
+			else
+				{
+				positionToInsertInterveningMinusSign = theCurrencySymbol.Length()+1;
+				}
+			}
+		else
+			{
+			if (positionToInsertCurrencySymbol>0)
+				{
+				positionToInsertInterveningMinusSign = positionToInsertCurrencySymbol;
+				}
+			else
+				{
+				positionToInsertInterveningMinusSign = theCurrencySymbol.Length();
+				}
+			}
+		switch (NegativeCurrencyFormat())
+			{
+			case EInBrackets:
+				{
+				if ((aText.Length()+2) > aText.MaxLength())
+					{
+					aOverflowHandler.Overflow(aText);
+					return;
+					}
+				aText.Insert(0, KLitOpeningBracket);
+				aText.Append(')');
+				}
+				break;
+			case ELeadingMinusSign:
+				{
+				if (aText.Length() == aText.MaxLength())
+					{
+					aOverflowHandler.Overflow(aText);
+					return;
+					}
+				aText.Insert(0, KLitMinusSign);
+				}
+				break;
+			case ETrailingMinusSign:
+				{
+				if (aText.Length() == aText.MaxLength())
+					{
+					aOverflowHandler.Overflow(aText);
+					return;
+					}
+				aText.Append(KLitMinusSign);
+				}
+				break;
+			case EInterveningMinusSign:
+				{
+				if (aText.Length() == aText.MaxLength())
+					{
+					aOverflowHandler.Overflow(aText);
+					return;
+					}
+				aText.Insert(positionToInsertInterveningMinusSign, KLitMinusSign);
+				}
+				break;
+			default:
+				Panic(ETRegionOutOfRange);
+				break;
+			}
+		}
+	}
+
+
+EXPORT_C void TLocaleMessageText::Set(TLocaleMessage aMsgNo)
+//
+// Get some text from Locale
+//
+	{
+	if(TUint(aMsgNo) < ELocaleMessages_LastMsg)
+		{
+		SLocaleLanguage localeLanguage;
+		LocaleLanguageGet(localeLanguage);
+		Copy((reinterpret_cast<const TText* const*>(localeLanguage.iMsgTable))[aMsgNo]);
+		}
+	else
+		SetLength(0);
+	}
+
+
+
+#ifndef __TOOLS2__
+EXPORT_C TInt TFindServer::Next(TFullName &aResult)
+/**
+Gets the full name of the next server which matches the match pattern.
+
+@param aResult A reference to a descriptor with a defined maximum length.
+               If a matching server is found, its full name is set into
+               this descriptor. If no matching server is found,
+               the descriptor length is set to zero.
+               
+@return KErrNone if a matching server is found, KErrNotFound otherwise.
+*/
+	{
+	return NextObject(aResult,EServer);
+	}
+
+
+
+
+EXPORT_C void RServer2::Receive(RMessage2& aMessage, TRequestStatus &aStatus)
+//
+// Receive a message from the server asynchronously.
+//
+	{
+
+	aStatus=KRequestPending;
+	Exec::ServerReceive(iHandle, aStatus, &aMessage);
+	}
+
+EXPORT_C void RServer2::Cancel()
+//
+// Cancel a pending message receive.
+//
+	{
+
+	Exec::ServerCancel(iHandle);
+	}
+
+
+
+
+EXPORT_C TInt TFindMutex::Next(TFullName &aResult)
+/**
+Finds the next global mutex whose full name matches the match pattern.
+
+If a global mutex with a matching name is found, the function copies its full 
+name into the specified descriptor. It also saves the find-handle associated 
+with the global mutex into the TFindHandleBase part of this object.
+
+@param aResult A reference to a descriptor with a defined maximum length. 
+               If a matching global mutex is found, its full name is set
+               into this descriptor. 
+               If no matching global mutex is found, the descriptor length
+               is set to zero.
+               
+@return KErrNone if a matching global mutex is found;
+        KErrNotFound otherwise.
+*/
+	{
+	return NextObject(aResult,EMutex);
+	}
+
+
+
+
+/**
+Acquire the mutex, waiting for it to become free if necessary.
+
+This function checks if the mutex is currently held. If not the mutex is marked
+as held by the current thread and the call returns immediately. If the mutex is
+held by another thread the current thread will suspend until the mutex becomes
+free. If the mutex is already held by the current thread a count is maintained
+of how many times the thread has acquired the mutex.
+*/
+EXPORT_C void RMutex::Wait()
+	{
+
+	Exec::MutexWait(iHandle);
+	}
+
+
+
+
+/**
+Release the mutex.
+
+This function decrements the count of how many times the current thread has
+acquired this mutex. If the count is now zero the mutex is marked as free and,
+if any other threads are waiting for the mutex to become free, the highest
+priority among those is made ready to run. However the mutex is not marked as
+held by any thread - the thread which has just been awakened must actually run
+in order to acquire the mutex.
+
+@pre The mutex must previously have been acquired by the current thread calling
+Wait().
+
+@panic KERN-EXEC 1 If the mutex has not previously been acquired by the current
+thread calling Wait().
+*/
+EXPORT_C void RMutex::Signal()
+	{
+
+	Exec::MutexSignal(iHandle);
+	}
+
+
+
+/**
+Test if this mutex is held by the current thread.
+@return True if the current thread has waited on the mutex, false otherwise.
+*/
+EXPORT_C TBool RMutex::IsHeld()
+	{
+	return Exec::MutexIsHeld(iHandle);
+	}
+
+
+/** Wait on a condition variable
+
+This call releases the specified mutex then atomically blocks the current
+thread on this condition variable. The atomicity here is with respect to the
+condition variable and mutex concerned. Specifically if the condition variable
+is signalled at any time after the mutex is released then this thread will be
+awakened. Once the thread has awakened it will reacquire the specified mutex
+before this call returns (except in the case where the condition variable has
+been deleted).
+
+The usage pattern for this is as follows:
+
+@code
+	mutex.Wait();
+	while(!CONDITION)
+		condvar.Wait(mutex);
+	STATEMENTS;
+	mutex.Signal();
+@endcode
+
+where CONDITION is an arbitrary condition involving any number of user-side
+variables whose integrity is protected by the mutex.
+
+It is necessary to loop while testing the condition because there is **no** guarantee
+that the condition has been satisfied when the condition variable is signalled.
+Different threads may be waiting on different conditions or the condition may
+have already been absorbed by another thread. All that can be said is that the
+thread will awaken whenever something happens which **might** affect the condition.
+
+It needs to be stressed that if:
+
+@code
+condvar.Wait(mutex);
+@endcode
+
+completes, it does not necessarily mean that the condition is yet satisfied, hence the necessity for the loop.
+
+@param	aMutex		The mutex to be released and reacquired.
+@return	KErrNone	if the condition variable has been signalled.
+		KErrInUse	if another thread is already waiting on this condition
+					variable in conjunction with a different mutex.
+		KErrGeneral	if the condition variable is deleted.
+
+@pre	The specified mutex is held by the current thread.
+@post	The specified mutex is held by the current thread unless the return
+		value is KErrGeneral in which case the condition variable no longer
+		exists.
+
+@panic	KERN-EXEC 0 if either the condition variable or mutex handles are not
+		valid.
+@panic	KERN-EXEC 54 if the current thread does not hold the specified mutex.
+
+@see	RCondVar::Signal()
+@see	RCondVar::Broadcast()
+*/
+EXPORT_C TInt RCondVar::Wait(RMutex& aMutex)
+	{
+	return Exec::CondVarWait(iHandle, aMutex.Handle(), 0);
+	}
+
+
+
+/** Wait on a condition variable with timeout
+
+This is the same as RCondVar::Wait(RMutex) except that there is a time limit on
+how long the current thread will block while waiting for the condition variable.
+
+@param	aMutex		The mutex to be released and reacquired.
+@param	aTimeout	The maximum time to wait in microseconds.
+					0 means no maximum.
+@return	KErrNone	if the condition variable has been signalled.
+		KErrInUse	if another thread is already waiting on this condition
+					variable in conjunction with a different mutex.
+		KErrGeneral	if the condition variable is deleted.
+		KErrTimedOut if the timeout expired before the condition variable was
+					signalled.
+
+@pre	The specified mutex is held by the current thread.
+@post	The specified mutex is held by the current thread unless the return
+		value is KErrGeneral in which case the condition variable no longer
+		exists.
+
+@panic	KERN-EXEC 0 if either the condition variable or mutex handles are not
+		valid.
+@panic	KERN-EXEC 54 if the current thread does not hold the specified mutex.
+
+@see	RCondVar::Wait(RMutex)
+*/
+EXPORT_C TInt RCondVar::TimedWait(RMutex& aMutex, TInt aTimeout)
+	{
+	return Exec::CondVarWait(iHandle, aMutex.Handle(), aTimeout);
+	}
+
+
+/** Signal a condition variable
+
+This unblocks a single thread which is currently blocked on the condition
+variable. The highest priority waiting thread which is not explicitly suspended
+will be the one unblocked. If there are no threads currently waiting this call
+does nothing.
+
+It is not required that any mutex is held when calling this function but it is
+recommended that the mutex associated with the condition variable is held since
+otherwise a race condition can result from the condition variable being signalled
+just after the waiting thread testing the condition and before it calls Wait().
+
+*/
+EXPORT_C void RCondVar::Signal()
+	{
+	Exec::CondVarSignal(iHandle);
+	}
+
+
+
+/** Broadcast to a condition variable
+
+This unblocks all threads which are currently blocked on the condition
+variable. If there are no threads currently waiting this call does nothing.
+
+It is not required that any mutex is held when calling this function but it is
+recommended that the mutex associated with the condition variable is held since
+otherwise a race condition can result from the condition variable being signalled
+just after the waiting thread testing the condition and before it calls Wait().
+
+*/
+EXPORT_C void RCondVar::Broadcast()
+	{
+	Exec::CondVarBroadcast(iHandle);
+	}
+
+
+
+
+EXPORT_C TInt TFindProcess::Next(TFullName &aResult)
+/**
+Gets the full name of the next process which matches the match pattern.
+
+@param aResult A reference to a TBuf descriptor with a defined maximum length.
+               If a matching process is found, its full name is set into
+               this descriptor. If no matching process is found, the descriptor
+               length is set to zero.
+
+@return KErrNone if successful, otherwise one of the other  system-wide error
+        codes.
+*/
+	{
+	return NextObject(aResult,EProcess);
+	}
+
+
+
+
+EXPORT_C TUidType RProcess::Type() const
+/**
+Gets the Uid type associated with the process. 
+
+@return A reference to a TUidType object containing the process type.
+*/
+	{
+
+	TUidType u;
+	Exec::ProcessType(iHandle,u);
+	return(u);
+	}
+
+
+
+
+EXPORT_C TProcessId RProcess::Id() const
+/**
+Gets the Id of this process.
+
+@return The Id of this process.
+*/
+	{
+
+	return TProcessId( (TUint)Exec::ProcessId(iHandle) );
+	}
+
+
+
+
+EXPORT_C void RProcess::Resume()
+/**
+Makes the first thread in the process eligible for execution.
+
+@panic KERN-EXEC 32 if the process is not yet fully loaded.
+
+@see RThread::Resume()
+*/
+	{
+
+	Exec::ProcessResume(iHandle);
+	}
+
+
+
+EXPORT_C TFileName RProcess::FileName() const
+/**
+Gets a copy of the full path name of the loaded executable on which this 
+process is based.
+
+This is the file name which is passed to the Create() member function of this 
+RProcess.
+
+@return A TBuf descriptor with a defined maximum length containing the full 
+        path name of the file.
+        
+@see RProcess::Create()
+*/
+	{
+
+	TFileName n;
+	TPtr8 n8(((TUint8*)n.Ptr()) + KMaxFileName, KMaxFileName);
+	Exec::ProcessFileName(iHandle,n8);
+	n.Copy(n8);
+	return(n);
+	}
+#endif // __TOOLS2__
+
+
+
+EXPORT_C void User::CommandLine(TDes &aCommand)
+/**
+Gets a copy of the data which is passed as an argument to the thread function
+of the current process's main thread when it is first scheduled to run.
+
+@param aCommand A modifiable descriptor supplied by the caller into which the
+                argument data is put. The descriptor must be big enough to
+                contain the expected data, otherwise the function raises
+                a panic.
+
+@see User::CommandLineLength()
+*/
+	{
+	TPtr8 aCommand8((TUint8*)aCommand.Ptr(),aCommand.MaxLength()<<1);
+	Exec::ProcessCommandLine(KCurrentProcessHandle,aCommand8);
+	aCommand.SetLength(aCommand8.Length()>>1);
+	}
+
+
+
+
+EXPORT_C TInt User::CommandLineLength()
+/**
+Gets the length of the data which is passed as an argument to the thread
+function of the current process's main thread when it is first scheduled
+to run.
+
+@return The length of the argument data.
+*/
+	{
+	return Exec::ProcessCommandLineLength(KCurrentProcessHandle);
+	}
+
+
+
+#ifndef __TOOLS2__
+EXPORT_C TExitType RProcess::ExitType() const
+/**
+Tests whether the process has ended and, if it has ended, return how it ended.
+
+This information allows the caller to distinguish between normal termination 
+and a panic.
+
+@return An enumeration whose enumerators describe how the process has ended.
+*/
+	{
+
+	return(Exec::ProcessExitType(iHandle));
+	}
+
+
+
+
+EXPORT_C TInt RProcess::ExitReason() const
+/** 
+Gets the specific reason associated with the end of this process.
+
+The reason number together with the category name is a way of distinguishing
+between different causes of process termination.
+
+If the process has panicked, this value is the panic number. If the process 
+has ended as a result of a call to Kill(), then the value is the one supplied 
+by Kill().
+
+If the process has not ended, then the returned value is zero.
+
+@return The reason associated with the end of the process.
+
+@see RProcess::Kill()
+*/
+	{
+
+	return(Exec::ProcessExitReason(iHandle));
+	}
+
+
+
+
+EXPORT_C TExitCategoryName RProcess::ExitCategory() const
+/**
+Gets the name of the category associated with the end of the process.
+
+The category name together with the reason number is a way of distinguishing
+between different causes of process termination.
+
+If the process has panicked, the category name is the panic category name; 
+for example, E32USER-CBase or KERN-EXEC. If the process has ended as a result 
+of a call to Kill(), then the category name is Kill.
+
+If the process has not ended, then the category name is empty, i.e. the length 
+of the category name is zero.
+
+@return A descriptor with a defined maximum length containing the 
+        name of the category associated with the end of the process.
+        
+@see RProcess::Kill()
+*/
+	{
+
+	TExitCategoryName n;
+	TPtr8 n8(((TUint8*)n.Ptr()) + KMaxExitCategoryName, KMaxExitCategoryName);
+	Exec::ProcessExitCategory(iHandle,n8);
+	n.Copy(n8);
+	return(n);
+	}
+
+
+
+
+EXPORT_C TProcessPriority RProcess::Priority() const
+/**
+Gets the priority of this process.
+
+@return One of the TProcessPriority enumerator values.
+*/
+	{
+
+	return(Exec::ProcessPriority(iHandle));
+	}
+
+
+
+
+EXPORT_C void RProcess::SetPriority(TProcessPriority aPriority) const
+/**
+Sets the priority of this process to one of the values defined by theTProcessPriority 
+enumeration. The priority can be set to one of the four values:
+
+EPriorityLow
+
+EPriorityBackground
+
+EPriorityForeground
+
+EPriorityHigh
+
+The absolute priority of all threads owned by the process (and all threads 
+owned by those threads etc.) are re-calculated.
+
+Notes:
+
+The priority values EPriorityWindowServer, EPriorityFileServer, EPriorityRealTimeServer 
+and EPrioritySupervisor are internal to Symbian OS and any attempt to explicitly 
+set any of these priority values causes a KERN-EXEC 14 panic to be raised.
+
+Any attempt to set the priority of a process which is protected and is different 
+from the process owning the thread which invokes this function, causes a KERN-EXEC 
+1 panic to be raised.
+
+A process can set its own priority whether it is protected or not.
+
+@param aPriority The priority value.
+*/
+	{
+
+	Exec::ProcessSetPriority(iHandle,aPriority);
+	}
+
+
+
+
+/**
+Tests whether "Just In Time" debugging is enabled or not for this process.
+
+@return True, when "Just In Time" debugging is enabled. False otherwise.
+@see RProcess::SetJustInTime
+*/
+
+EXPORT_C TBool RProcess::JustInTime() const
+	{
+
+	return (Exec::ProcessFlags(iHandle) & KProcessFlagJustInTime) != 0;
+	}
+
+
+/**
+Enables or disables "Just In Time" debugging for this process.
+This will only have an effect when running on the emulator.
+
+"Just In Time" debugging catches a thread just before it executes a panic
+or exception routine.  Capturing a thread early, before it is terminated, 
+allows the developer to more closely inspect what went wrong, before the 
+kernel removes the thread.  In some cases, the developer can modify context,
+program counter, and variables to recover the thread.  This is only possible
+on the emulator.
+
+By default, "Just In Time" debugging is enabled.
+
+@param aBoolean ETrue, to enable just-in-time debugging.
+				EFalse, to disable just-in-time debugging.
+*/
+EXPORT_C void RProcess::SetJustInTime(TBool aState) const
+	{
+
+	TUint32 set = aState ? KProcessFlagJustInTime : 0;
+	Exec::ProcessSetFlags(iHandle, KProcessFlagJustInTime, set);
+	}
+
+
+
+
+EXPORT_C TInt RProcess::SecureApi(TInt /*aState*/)
+	{
+	return ESecureApiOn;
+	}
+
+EXPORT_C TInt RProcess::DataCaging(TInt /*aState*/)
+	{
+	return EDataCagingOn;
+	}
+
+
+
+EXPORT_C TInt RProcess::GetMemoryInfo(TModuleMemoryInfo& aInfo) const
+/**
+Gets the size and base address of the code and various data
+sections of the process.
+
+The run addresses are also returned.
+
+@param aInfo On successful return, contains the base address and size of the 
+             sections.
+             
+@return KErrNone, if successful; otherwise one of the other system wide error 
+        codes.
+*/
+	{
+
+	return Exec::ProcessGetMemoryInfo(iHandle,aInfo);
+	}
+	
+
+EXPORT_C TAny* RProcess::ExeExportData(void)
+/**
+Retrieves pointer to named symbol export data from the current process, i.e. the
+process calling this function.
+             
+@return Pointer to export data when it is present, NULL if export data not found
+@internalTechnology
+@released
+*/
+	{
+
+	return Exec::ProcessExeExportData();
+	}
+
+
+
+EXPORT_C TInt TFindSemaphore::Next(TFullName &aResult)
+/**
+Finds the next global semaphore whose full name matches the match pattern.
+
+If a global semaphore with a matching name is found, the function copies its 
+full name into the descriptor aResult. It also saves the find-handle associated 
+with the global semaphore into the TFindHandleBase part of this TFindSemaphore 
+object.
+
+@param aResult A reference to a TBuf descriptor with a defined maximum length. 
+               If a matching global semaphore is found, its full name is set
+               into this descriptor. 
+               If no matching global semaphore is found, the descriptor length
+               is set to zero. 
+               
+@return KErrNone if a matching global semaphore is found;
+        KErrNotFound otherwise.
+*/
+	{
+	return NextObject(aResult,ESemaphore);
+	}
+
+
+
+
+EXPORT_C void RSemaphore::Wait()
+/**
+Waits for a signal on the semaphore.
+
+The function decrements the semaphore count by one and returns immediately 
+if it is zero or positive.
+
+If the semaphore count is negative after being decremented, the calling thread is 
+added to a queue of threads maintained by this semaphore.
+
+The thread waits until the semaphore is signalled. More than one thread can 
+be waiting on a particular semaphore at a time. When there are multiple threads 
+waiting on a semaphore, they are released in priority order.
+
+If the semaphore is deleted, all threads waiting on that semaphore are released.
+*/
+	{
+
+	Exec::SemaphoreWait(iHandle, 0);
+	}
+
+
+
+
+EXPORT_C TInt RSemaphore::Wait(TInt aTimeout)
+/**
+Waits for a signal on the semaphore, or a timeout.
+
+@param aTimeout The timeout value in micoseconds
+
+@return KErrNone if the wait has completed normally;
+        KErrGeneral if the semaphore is being reset, i.e the semaphore
+        is about to  be deleted.
+        KErrArgument if aTimeout is negative;
+        otherwise one of the other system wide error codes indicating that
+        the timeout has expired.
+*/
+	{
+
+	return Exec::SemaphoreWait(iHandle, aTimeout);
+	}
+
+
+
+
+EXPORT_C void RSemaphore::Signal()
+/**
+Signals the semaphore once.
+
+The function increments the semaphore count by one. If the count was negative 
+before being incremented, the highest priority thread waiting on the semaphore's queue 
+of threads is removed from that queue and, provided that it is not suspended 
+for any other reason, is marked as ready to run.
+*/
+	{
+
+	Exec::SemaphoreSignal1(iHandle);
+	}
+
+
+
+
+EXPORT_C void RSemaphore::Signal(TInt aCount)
+/**
+Signals the semaphore one or more times.
+
+The function increments the semaphore count. If the count was negative 
+before being incremented, the highest priority thread waiting on the semaphore's queue 
+of threads is removed from that queue and, provided that it is not suspended 
+for any other reason, is marked as ready to run.
+
+@param aCount The number of times the semaphore is to be signalled.
+*/
+	{
+
+	__ASSERT_ALWAYS(aCount>=0,Panic(ESemSignalCountNegative));
+	Exec::SemaphoreSignalN(iHandle,aCount);
+	}
+
+
+
+
+EXPORT_C RCriticalSection::RCriticalSection()
+	: iBlocked(1)
+/**
+Default constructor.
+*/
+	{}
+
+
+
+
+EXPORT_C void RCriticalSection::Close()
+/**
+Closes the handle to the critical section.
+
+As a critical section object is implemented using a semaphore, this has the 
+effect of closing the handle to the semaphore.
+*/
+	{
+
+	RSemaphore::Close();
+	}
+
+
+
+
+EXPORT_C void RCriticalSection::Wait()
+/**
+Waits for the critical section to become free.
+
+If no other thread is in the critical section, control returns immediately 
+and the current thread can continue into the section.
+
+If another thread is already in the critical section, the current thread is 
+marked as waiting (on a semaphore); the current thread is added to a queue
+of threads maintained by this critical section.
+*/
+	{
+
+	if (User::LockedDec(iBlocked)!=1)
+		RSemaphore::Wait();
+	}
+
+
+
+
+EXPORT_C void RCriticalSection::Signal()
+/**
+Signals an exit from the critical section.
+
+A thread calls this function when it exits from the critical section.
+The first eligible thread waiting on the critical section's queue of threads
+is removed from that queue and, provided that it is not suspended for any other
+reason, is marked as ready to run. That thread will, therefore, be the next to
+proceed into the critical section.
+*/
+	{
+
+	__ASSERT_ALWAYS(iBlocked<1,Panic(ECriticalSectionStraySignal));
+	if (User::LockedInc(iBlocked)<0)
+		RSemaphore::Signal();
+	}
+
+
+
+
+EXPORT_C TInt TFindThread::Next(TFullName &aResult)
+/**
+Gets the full name of the next global thread which matches the match pattern.
+
+@param aResult A reference to a TBuf descriptor with a defined maximum length.
+               If a matching global thread is found, its full name is set into
+               this descriptor. If no matching global thread is found,
+               the descriptor length is set to zero.
+
+@return KErrNone if successful, otherwise one of the other system-wide error
+                 codes.
+*/
+	{
+	return NextObject(aResult,EThread);
+	}
+
+
+
+
+EXPORT_C TThreadId RThread::Id() const
+/**
+Gets the Id of this thread.
+
+@return The Id of this thread.
+*/
+	{
+
+	return TThreadId( (TUint)Exec::ThreadId(iHandle) );
+	}
+#endif
+
+
+
+EXPORT_C void RThread::HandleCount(TInt& aProcessHandleCount, TInt& aThreadHandleCount) const
+/**
+Gets the number of handles open in this thread, and the number of handles open 
+in the process which owns this thread.
+
+@param aProcessHandleCount On return, contains the number of handles open in
+                           the process which owns this thread.
+@param aThreadHandleCount  On return, contains the number of handles open in
+                           this thread.
+*/
+	{
+#ifndef __TOOLS2__
+	Exec::HandleCount(iHandle,aProcessHandleCount,aThreadHandleCount);
+#else
+	aProcessHandleCount = aThreadHandleCount = 0;
+#endif // __TOOLS2__
+	}
+
+
+
+#ifndef __TOOLS2__
+EXPORT_C TExceptionHandler User::ExceptionHandler()
+/**
+Gets a pointer to the exception handler for the current thread.
+
+@return A pointer to the exception handler.
+*/
+	{
+	return(Exec::ExceptionHandler(KCurrentThreadHandle));
+	}
+
+
+
+
+EXPORT_C TInt User::SetExceptionHandler(TExceptionHandler aHandler,TUint32 aMask)
+/**
+Sets a new exception handler for the current thread. Note that the handler is not
+guaranteed to receive floating point exceptions (KExceptionFpe) when a hardware
+floating point implementation is in use - see User::SetFloatingPointMode for
+hardware floating point modes and whether they cause user-trappable exceptions.
+
+@param aHandler The new exception handler.
+@param aMask    One or more flags defining the exception categories which
+                the handler can handle.
+
+@return KErrNone if successful, otherwise another of the system-wide error codes.
+
+@see KExceptionAbort
+@see KExceptionKill
+@see KExceptionUserInterrupt
+@see KExceptionFpe
+@see KExceptionFault
+@see KExceptionInteger
+@see KExceptionDebug
+*/
+	{
+	return(Exec::SetExceptionHandler(KCurrentThreadHandle, aHandler, aMask));
+	}
+
+
+
+
+EXPORT_C void User::ModifyExceptionMask(TUint32 aClearMask, TUint32 aSetMask)
+/**
+Changes the set of exceptions which the current thread's exception
+handler can deal with.
+
+aClearMask is the set of flags defining the set of exceptions which the
+exception handler no longer deals with, while aSetMask is the set of flags
+defining the new set of exceptions to be set.
+
+Flag clearing is done before flag setting.
+
+@param  aClearMask One or more flags defining the exceptions which the current
+                   exception handler no longer deals with.
+@param  aSetMask   One or more flags defining the new set of exceptions which
+                   the current exception handler is to deal with.
+*/
+	{
+	Exec::ModifyExceptionMask(KCurrentThreadHandle, aClearMask, aSetMask);
+	}
+
+
+
+
+_LIT(KLitUserExec, "USER-EXEC");
+EXPORT_C TInt User::RaiseException(TExcType aType)
+/**
+Raises an exception of a specified type on the current thread.
+
+If the thread has an exception handler to handle this type of exception,
+then it is called.
+
+If the thread has no exception handler to handle this type of exception, then
+the function raises a USER-EXEC 3 panic.
+
+Note that exception handlers are executed in the context of the thread on which
+the exception is raised; control returns to the point of the exception. 
+
+@param aType The type of exception.
+
+@return KErrNone if successful, otherwise another of the system-wide
+        error codes.
+*/
+	{
+	if (Exec::IsExceptionHandled(KCurrentThreadHandle,aType,ETrue))
+		{
+		Exec::ThreadSetFlags(KCurrentThreadHandle, 0, KThreadFlagLastChance);
+		TUint32 type = aType;
+		User::HandleException(&type);
+		}
+	else
+		User::Panic(KLitUserExec, ECausedException);
+	return KErrNone;
+	}
+
+
+
+
+EXPORT_C TBool User::IsExceptionHandled(TExcType aType)
+/**
+Tests whether the specified exception type can be handled by the
+current thread.
+
+@param aType The type of exception.
+
+@return True, if the thread has an exception handler which can handle
+        an exception of type aType.
+        False, if the thread has no exception handler or the thread has
+        an exception handler which cannot handle the exception defined
+        by aType.
+*/
+	{
+	return (Exec::IsExceptionHandled(KCurrentThreadHandle,aType,EFalse));
+	}
+
+
+
+
+EXPORT_C void RThread::Context(TDes8 &aDes) const
+/**
+Gets the register contents of this thread.
+
+@param aDes On return, contains the register contents, starting with R0.
+*/
+	{
+
+	Exec::ThreadContext(iHandle,aDes);
+	}
+
+
+
+
+EXPORT_C void RThread::Resume() const
+/**
+Makes the thread eligible for execution.
+
+After a thread is created, it is put into a suspended state; the thread is 
+not eligible to run until Resume() is called.
+
+This function must also be called to resume execution of this thread after 
+it has been explicitly suspended by a call to Suspend().
+
+Note that when a thread is created, it is given the priority EPriorityNormal 
+by default. The fact that a thread is initially put into a suspended state 
+means that the thread priority can be changed by calling the thread's
+SetPriority() member function before the thread is started by a call to Resume().
+*/
+	{
+
+	Exec::ThreadResume(iHandle);
+	}
+
+
+
+
+EXPORT_C void RThread::Suspend() const
+/**
+Suspends execution of this thread.
+
+The thread is not scheduled to run until a subsequent call to Resume() is made.
+*/
+	{
+
+	Exec::ThreadSuspend(iHandle);
+	}
+
+
+
+
+EXPORT_C TThreadPriority RThread::Priority() const
+/**
+Gets the priority of this thread.
+
+@return The priority.
+*/
+	{
+
+	return(Exec::ThreadPriority(iHandle));
+	}
+
+
+
+
+EXPORT_C void RThread::SetProcessPriority(TProcessPriority aPriority) const
+/**
+Sets the priority of the process which owns this thread to one of the values 
+defined by the TProcessPriority enumeration.
+
+The priority can be set to one of the four values:
+
+EPriorityLow
+
+EPriorityBackground
+
+EPriorityForeground
+
+EPriorityHigh
+
+The absolute priority of all threads owned by the process (and all threads 
+owned by those threads etc.) are re-calculated.
+
+Note:
+
+The use of the priority values EPriorityWindowServer, EPriorityFileServer, 
+EPriorityRealTimeServer and EPrioritySupervisor is restricted to Symbian OS, 
+and any attempt to explicitly set any of these priority values raises a KERN-EXEC 
+14 panic.
+
+@param aPriority The priority value.
+
+@deprecated Not allowed on threads in a different process.
+			Replace with RProcess::SetPriority or RMessagePtr2::SetProcessPriority
+*/
+	{
+
+	Exec::ThreadSetProcessPriority(iHandle,aPriority);
+	}
+
+
+
+
+EXPORT_C TProcessPriority RThread::ProcessPriority() const
+/**
+Gets the priority of the process which owns this thread.
+
+@return The process priority.
+*/
+	{
+
+	return(Exec::ThreadProcessPriority(iHandle));
+	}
+
+
+
+
+EXPORT_C void RThread::SetPriority(TThreadPriority aPriority) const
+/**
+Sets the priority of the thread to one of the values defined by
+the TThreadPriority enumeration. 
+
+The resulting absolute priority of the thread depends on the value of aPriority 
+and the priority of the owning process.
+
+Use of the priority value EPriorityNull is restricted to Symbian OS, and any 
+attempt to explicitly set this value causes a KERN-EXEC 14 panic to be raised.
+
+@param aPriority The priority value.
+
+@capability ProtServ if aPriority is EPriorityAbsoluteRealTime1 or higher
+
+@panic KERN-EXEC 14, if aPriority is invalid or set to EPriorityNull
+@panic KERN-EXEC 46, if aPriority is EPriorityAbsoluteRealTime1 or higher
+                     and calling process does not have ProtServ capability
+*/
+	{
+
+	Exec::ThreadSetPriority(iHandle,aPriority);
+	}
+
+
+
+
+EXPORT_C User::TCritical User::Critical(RThread aThread)
+/**
+Gets the critical state associated with the specified thread.
+
+@param aThread The thread whose critical state is to be retrieved.
+
+@return The critical state.
+
+@see User::SetCritical()
+*/
+	{
+	TUint32 flags = Exec::ThreadFlags(aThread.Handle());
+	if (flags & KThreadFlagSystemPermanent)
+		return ESystemPermanent;
+	if (flags & KThreadFlagSystemCritical)
+		return ESystemCritical;
+	if (flags & KThreadFlagProcessPermanent)
+		return EProcessPermanent;
+	if (flags & KThreadFlagProcessCritical)
+		return EProcessCritical;
+	return ENotCritical;
+	}
+
+
+
+
+EXPORT_C User::TCritical User::Critical()
+/**
+Gets the critical state associated with the current thread.
+
+@return The critical state.
+	
+@see User::SetCritical()
+*/
+	{
+	RThread me;
+	return User::Critical(me);
+	}
+
+
+
+
+/**
+Sets up or changes the effect that termination of the current
+thread has, either on its owning process, or on the whole system.
+
+The precise effect of thread termination is defined by 
+the following specific values of the TCritical enum:
+- ENotCritical
+- EProcessCritical
+- EProcessPermanent
+- ESystemCritical
+- ESystemPermanent
+
+Notes:
+-# The enum value EAllThreadsCritical cannot be set using this function. It is
+associated with a process, not a thread, and, if appropriate, should be set
+using User::SetProcessCritical().
+-# The states associated with ENotCritical, EProcessCritical,
+EProcessPermanent, ESystemCritical and ESystemPermanent
+are all mutually exclusive, i.e. the thread can only be in one of these states
+at any one time
+
+@param aCritical The state to be set. 
+
+@return KErrNone, if successful;
+        KErrArgument, if EAllThreadsCritical is passed - this is a 
+        state associated with a process, and
+        you use User::SetProcessCritical() to set it.
+
+@capability ProtServ if aCritical==ESystemCritical or ESystemPermanent
+
+@see User::Critical()
+@see User::ProcessCritical()
+@see User::SetProcessCritical()
+*/
+EXPORT_C TInt User::SetCritical(TCritical aCritical)
+	{
+	const TUint32 clear =	KThreadFlagSystemPermanent | KThreadFlagSystemCritical |
+							KThreadFlagProcessPermanent | KThreadFlagProcessCritical;
+	TUint32 set;
+	switch (aCritical)
+		{
+		case ENotCritical:		set = 0;							break;
+		case EProcessCritical:	set = KThreadFlagProcessCritical;	break;
+		case EProcessPermanent:	set = KThreadFlagProcessPermanent;	break;
+		case ESystemCritical:	set = KThreadFlagSystemCritical;	break;
+		case ESystemPermanent:	set = KThreadFlagSystemPermanent;	break;
+		default:													return KErrArgument;
+		}
+	Exec::ThreadSetFlags(KCurrentThreadHandle, clear, set);
+	return KErrNone;
+	}
+
+
+
+
+EXPORT_C TInt User::SetRealtimeState(TRealtimeState aState)
+	{
+	const TUint32 clear =	KThreadFlagRealtime | KThreadFlagRealtimeTest;
+	TUint32 set;
+	switch (aState)
+		{
+		case ERealtimeStateOff:		set = 0;											break;
+		case ERealtimeStateOn:		set = KThreadFlagRealtime;							break;
+		case ERealtimeStateWarn:	set = KThreadFlagRealtime|KThreadFlagRealtimeTest;	break;
+		default:																		return KErrArgument;
+		}
+	Exec::ThreadSetFlags(KCurrentThreadHandle, clear, set);
+	return KErrNone;
+	}
+
+
+
+
+EXPORT_C User::TCritical User::ProcessCritical(RProcess aProcess)
+/**
+Gets the critical state associated with the specified process.
+
+@param aProcess The process whose critical state is to be retrieved.
+
+@return The critical state.
+
+@see User::SetProcessCritical()
+*/
+	{
+	TUint32 flags = Exec::ProcessFlags(aProcess.Handle());
+	if (flags & KProcessFlagSystemPermanent)
+		return ESystemPermanent;
+	if (flags & KProcessFlagSystemCritical)
+		return ESystemCritical;
+	if (flags & (KThreadFlagProcessPermanent | KThreadFlagProcessCritical))
+		return EAllThreadsCritical;
+	return ENotCritical;
+	}
+
+
+
+
+EXPORT_C User::TCritical User::ProcessCritical()
+/**
+Gets the critical state associated with the current process.
+
+@return The critical state.
+	
+@see User::SetProcessCritical()
+*/
+	{
+	RProcess me;
+	return User::ProcessCritical(me);
+	}
+
+
+
+
+EXPORT_C TInt User::SetProcessCritical(TCritical aCritical)
+/**
+Sets up or changes the effect that termination of subsequently created threads
+will have, either on the owning process, or on the whole system.
+
+It is important to note that we are not referring to threads that have already
+been created, but threads that will be created subsequent to a call to this function.
+
+The precise effect of thread termination is defined by the following specific
+values of the TCritical enum: 
+- ENotCritical
+- EAllThreadsCritical
+- ESystemCritical
+- ESystemPermanent
+
+Notes:
+-# The enum values EProcessCritical and EProcessPermanent cannot be set using
+this function. They are states associated with
+a thread, not a process, and, if appropriate, should be set
+using User::SetCritical().
+-# The states associated with ENotCritical, EAllThreadsCritical,
+ESystemCritical and ESystemPermanent are all mutually exclusive, i.e. the
+process can only be in one of these states at any one time.
+
+@param aCritical The state to be set. 
+
+@return KErrNone, if successful;
+        KErrArgument, if either EProcessCritical or EProcessPermanent
+        is passed - these are states associated with a thread, and
+        you use User::SetCritical() to set them.
+
+@capability ProtServ if aCritical==ESystemCritical or ESystemPermanent
+
+@see User::ProcessCritical()
+@see User::SetCritical()
+@see User::Critical()
+*/
+	{
+	const TUint32 clear =	KProcessFlagSystemPermanent | KProcessFlagSystemCritical |
+							KThreadFlagProcessPermanent | KThreadFlagProcessCritical;
+	TUint32 set;
+	switch (aCritical)
+		{
+		case ENotCritical:			set = 0;							break;
+		case EAllThreadsCritical:	set = KThreadFlagProcessCritical;	break;
+		case ESystemCritical:		set = KProcessFlagSystemCritical;	break;
+		case ESystemPermanent:		set = KProcessFlagSystemPermanent|KProcessFlagSystemCritical;	break;
+		default:														return KErrArgument;
+		}
+	Exec::ProcessSetFlags(KCurrentProcessHandle, clear, set);
+	return KErrNone;
+	}
+
+
+
+
+EXPORT_C TBool User::PriorityControl()
+/**
+Tests whether the current process allows other processes to switch its priority 
+between 'foreground' and 'background'.
+
+@return True, if the current process allows other processes to switch its priority;
+        false, otherwise.
+*/
+	{
+	return Exec::ProcessFlags(KCurrentProcessHandle) & KProcessFlagPriorityControl;
+	}
+
+
+
+
+EXPORT_C void User::SetPriorityControl(TBool aEnable)
+/**
+Allows the current process to choose to have its priority switched by another
+process between 'foreground' and 'background'.
+
+By default a process does not allow this.
+
+@param aEnable If ETrue, allows other processes to switch the current process's
+               priority.
+               If EFalse, prevents other processes from switching the current
+               process's priority.
+*/
+	{
+	TUint32 set = aEnable ? KProcessFlagPriorityControl : 0;
+	Exec::ProcessSetFlags(KCurrentProcessHandle, KProcessFlagPriorityControl, set);
+	}
+
+
+
+EXPORT_C TInt RThread::RequestCount() const
+/**
+Gets this thread's request semaphore count.
+
+The request semaphore is created when a thread is created, and is used to 
+support asynchronous requests.
+
+A negative value implies that this thread is waiting for at least
+one asynchronous request to complete.
+
+@return This thread's request semaphore count.
+*/
+	{
+
+	return(Exec::ThreadRequestCount(iHandle));
+	}
+
+
+
+
+EXPORT_C TExitType RThread::ExitType() const
+/**
+Tests whether the thread has ended and, if it has ended, return how it ended.
+
+This information allows the caller to distinguish between normal termination 
+and a panic.
+
+@return An enumeration whose enumerators describe how the thread has ended.
+*/
+	{
+
+	return(Exec::ThreadExitType(iHandle));
+	}
+
+
+
+
+EXPORT_C TInt RThread::ExitReason() const
+/**
+Gets the specific reason associated with the end of this thread.
+
+The reason number together with the category name is a way of distinguishing 
+between different causes of thread termination.
+
+If the thread has panicked, this value is the panic number. If the thread 
+has ended as a result of a call to Kill(), then the value is the one supplied 
+by Kill().
+
+If the thread is still alive, then the returned value is zero.
+
+@return The reason associated with the end of the thread.
+*/
+	{
+
+	return(Exec::ThreadExitReason(iHandle));
+	}
+
+
+
+
+EXPORT_C TExitCategoryName RThread::ExitCategory() const
+/**
+Gets the name of the category associated with the end of the thread.
+
+The category name together with the reason number is a way of distinguishing
+between different causes of thread termination.
+
+If the thread has panicked, the category name is the panic category name; 
+for example, E32USER-CBase or KERN-EXEC. If the thread has ended as a result 
+of call to Kill(), then the category name is Kill.
+
+If the thread has not ended, then the category name is empty, i.e. the length 
+of the category name is zero.
+
+@return A TBuf descriptor with a defined maximum length containing the name 
+        of the category associated with the end of the thread.
+
+@see TBuf
+*/
+	{
+	TExitCategoryName n;
+	TPtr8 n8(((TUint8*)n.Ptr()) + KMaxExitCategoryName, KMaxExitCategoryName);
+	Exec::ThreadExitCategory(iHandle,n8);
+	n.Copy(n8);
+	return(n);
+	}
+
+
+
+
+EXPORT_C TInt RThread::StackInfo(TThreadStackInfo& aInfo) const
+/**
+Gets information about a thread's user mode stack.
+
+@param aInfo The TThreadStackInfo object to write the stack infomation to.
+
+@return KErrNone, if sucessful;
+		KErrGeneral, if the thread doesn't have a user mode stack,
+		or it has terminated.
+
+@see TThreadStackInfo
+*/
+	{
+	return(Exec::ThreadStackInfo(iHandle,aInfo));
+	}
+
+
+
+
+EXPORT_C TInt RThread::GetCpuTime(TTimeIntervalMicroSeconds& aCpuTime) const
+/**
+Gets the CPU usage for this thread.
+
+This function is not supported on version 8.0b or 8.1b, and returns
+KErrNotSupported.  From 9.1 onwards it may be supported if the kernel has been
+compiled with the MONITOR_THREAD_CPU_TIME macro defined.
+
+@param aCpuTime A reference to a time interval object supplied by the caller. 
+                                
+@return KErrNone - if thread CPU time is available.
+
+        KErrNotSupported - if this feature is not supported on this
+        version or build of the OS.
+*/
+	{
+	return Exec::ThreadGetCpuTime(iHandle, (TInt64&)aCpuTime.Int64());
+	}
+#endif // __TOOLS2__
+
+
+
+EXPORT_C void User::After(TTimeIntervalMicroSeconds32 aInterval)
+/**
+Suspends the current thread until a specified time interval has expired.
+
+The resolution of the timer depends on the hardware, but is normally 
+1 Symbian OS tick (approximately 1/64 second).
+
+@param aInterval The time interval for which the current thread is to be 
+                  suspended, in microseconds.
+                  
+@panic USER 86, if the time interval is negative.
+*/
+	{
+
+	__ASSERT_ALWAYS(aInterval.Int()>=0,::Panic(EExecAfterTimeNegative));
+	TRequestStatus s=KRequestPending;
+	Exec::After(aInterval.Int(),s);
+	User::WaitForRequest(s);
+	}
+
+
+
+
+EXPORT_C void User::AfterHighRes(TTimeIntervalMicroSeconds32 aInterval)
+/**
+Suspends the current thread until a specified time interval has expired to
+a resolution of 1ms .
+
+@param aInterval The time interval for which the current thread is to be 
+                  suspended, in microseconds.
+                  
+@panic USER 86, if the time interval is negative.
+*/
+	{
+
+	__ASSERT_ALWAYS(aInterval.Int()>=0,::Panic(EExecAfterTimeNegative));
+	TRequestStatus s=KRequestPending;
+	Exec::AfterHighRes(aInterval.Int(),s);
+	User::WaitForRequest(s);
+	}
+
+
+
+#ifndef __TOOLS2__
+EXPORT_C TInt User::At(const TTime &aTime)
+/**
+Suspends the current thread until the specified absolute time, in the current time zone.
+
+If the machine is off at that time, the machine will be turned on again.
+
+@param aTime The absolute time, in the current time zone, until which the current thread is to
+             be suspended.
+
+@return On completion, contains the status of the request to suspend the
+        current thread:
+
+        KErrNone - suspension of the current thread completed normally at 
+        the requested time.
+
+        KErrAbort - suspension of the current thread was aborted 
+        because the system time changed.
+
+        KErrUnderflow - the requested completion time is in the past.
+
+        KErrOverFlow - the requested completion time is too far in the future.
+*/
+	{
+
+	TRequestStatus s=KRequestPending;
+	TInt64 time=aTime.Int64();
+	time -= ((TInt64)User::UTCOffset().Int()) * 1000000;
+	Exec::At(time,s);
+	User::WaitForRequest(s);
+	return(s.Int());
+	}
+
+
+
+
+EXPORT_C void RTimer::Cancel()
+/**
+Cancels any outstanding request for a timer event.
+
+Any outstanding timer event completes with KErrCancel.
+*/
+	{
+
+	Exec::TimerCancel(iHandle);
+	}
+
+
+
+
+EXPORT_C void RTimer::After(TRequestStatus &aStatus,TTimeIntervalMicroSeconds32 aInterval)
+//
+// Request a relative timer.
+//
+/**
+Requests an event after the specified interval.
+
+The counter for this type of request stops during power-down.
+A 5 second timer will complete late if, for example, the machine is turned off
+2 seconds after the request is made.
+
+@param aStatus    On completion, contains the status of the request.
+                  This is KErrNone if the timer completed normally at the
+                  requested time, otherwise another of the
+                  system-wide error codes.
+
+@param aInterval  The time interval, in microseconds, after which an event
+                  is to occur.
+
+@panic USER 87, if aInterval is negative.
+@panic KERN-EXEC 15, if this function is called while a request for a timer
+       event is still outstanding.
+*/
+	{
+
+	__ASSERT_ALWAYS(aInterval.Int()>=0,::Panic(ERTimerAfterTimeNegative));
+	aStatus=KRequestPending;
+	Exec::TimerAfter(iHandle,aStatus,aInterval.Int());
+	}
+
+
+
+
+EXPORT_C void RTimer::AfterTicks(TRequestStatus& aStatus, TInt aTicks)
+//
+// Request a relative timer in system ticks.
+//
+/**
+Requests an event after the specified interval.
+
+The counter for this type of request stops during power-down.
+A 5 tick timer will complete late if, for example, the machine is turned off
+2 ticks after the request is made.
+
+@param aStatus    On completion, contains the status of the request.
+                  This is KErrNone if the timer completed normally at the
+                  requested time, otherwise another of the
+                  system-wide error codes.
+
+@param aTicks     The time interval, in system ticks, after which an event
+                  is to occur.
+
+@panic USER 87, if aTicks is negative.
+@panic KERN-EXEC 15, if this function is called while a request for a timer
+       event is still outstanding.
+*/
+	{
+	__ASSERT_ALWAYS(aTicks >= 0, ::Panic(ERTimerAfterTimeNegative));
+	aStatus = KRequestPending;
+	Exec::TimerAfter(iHandle, aStatus, -aTicks);
+	}
+
+
+
+
+EXPORT_C void RTimer::HighRes(TRequestStatus &aStatus,TTimeIntervalMicroSeconds32 aInterval)
+//
+// Request a relative timer to a resolution of 1ms.
+//
+/**
+Requests an event after the specified interval to a resolution of 1ms. 
+The "HighRes timer" counter stops during power-down (the same as "after timer"). 
+
+@param aStatus    On completion, contains the status of the request.
+                  This is KErrNone if the timer completed normally at the
+                  requested time, otherwise another of the
+                  system-wide error codes.
+
+@param aInterval  The time interval, in microseconds, after which an event
+                  is to occur.
+
+@panic USER 87, if aInterval is negative.
+@panic KERN-EXEC 15, if this function is called while a request for a timer
+       event is still outstanding.
+*/
+	{
+
+	__ASSERT_ALWAYS(aInterval.Int()>=0,::Panic(ERTimerAfterTimeNegative));
+	aStatus=KRequestPending;
+	Exec::TimerHighRes(iHandle,aStatus,aInterval.Int());
+	}
+
+
+
+
+EXPORT_C void RTimer::At(TRequestStatus &aStatus,const TTime &aTime)
+//
+// Request an absolute timer.
+//
+/**
+Requests an event at a given system time (in the current time zone).
+
+If the machine is off at that time, it is automatically turned on.
+
+@param aStatus On completion, contains the status of the request:
+               KErrNone, the timer completed normally at the requested time;
+               KErrCancel, the timer was cancelled;
+               KErrAbort, the timer was aborted because the system time changed;
+               KErrUnderflow, the requested completion time is in the past;
+               KErrOverFlow, the requested completion time is too far in the future;
+@param aTime   The time at which the timer will expire.
+
+@panic KERN-EXEC 15, if this function is called while a request for a timer
+       event is still outstanding.
+*/
+	{
+
+	aStatus=KRequestPending;
+	TInt64 time=aTime.Int64();
+	time -= ((TInt64)User::UTCOffset().Int()) * 1000000;
+	Exec::TimerAt(iHandle,aStatus,time);
+	}
+
+
+
+
+EXPORT_C void RTimer::AtUTC(TRequestStatus &aStatus,const TTime &aUTCTime)
+//
+// Request an absolute timer in UTC time.
+//
+/**
+Requests an event at a given UTC time.
+
+If the machine is off at that time, it is automatically turned on.
+
+@param aStatus On completion, contains the status of the request:
+               KErrNone, the timer completed normally at the requested time;
+               KErrCancel, the timer was cancelled;
+               KErrAbort, the timer was aborted because the system time changed;
+               KErrUnderflow, the requested completion time is in the past;
+               KErrOverFlow, the requested completion time is too far in the future;
+@param aTime   The time at which the timer will expire.
+
+@panic KERN-EXEC 15, if this function is called while a request for a timer
+       event is still outstanding.
+*/
+	{
+
+	aStatus=KRequestPending;
+	Exec::TimerAt(iHandle,aStatus,aUTCTime.Int64());
+	}
+
+
+
+
+EXPORT_C void RTimer::Lock(TRequestStatus &aStatus,TTimerLockSpec aLock)
+//
+// Request an absolute timer.
+//
+/**
+Requests an event on a specified second fraction.
+
+@param aStatus On completion, contains the status of the request:
+               KErrGeneral, the first time this is called;
+               KErrNone, the timer completed normally at the requested time;
+               KErrCancel, the timer was cancelled;
+               KErrAbort, the timer was aborted because the system time changed;
+               KErrUnderflow, the requested completion time is in the past;
+               KErrOverFlow, the requested completion time is too far in the future.
+@param aLock   The fraction of a second at which the timer completes.
+
+@panic KERN-EXEC 15, if this function is called while a request for a timer
+       event is still outstanding.
+*/
+	{
+	aStatus=KRequestPending;
+	Exec::TimerLock(iHandle,aStatus,aLock);
+	}
+
+
+/**
+Requests an event to be triggered when aSeconds is exactly, (ie not greater or 
+less than), the time elapsed (to the nearest second) since the last user activity.
+If the event trigger time has been "missed", instead of triggering late,
+the timer waits for the next user activity, to try and satisfy the condition.
+
+That is to say, if there was user activity within the last aSeconds,
+the event will be triggered after aSeconds of continuous inactivity following that activity.
+Otherwise, if there has been no such activity within this time, an event is
+triggered after aSeconds of continuous inactivity following the next user activity
+in the future.
+
+It follows from this, that you can request an event directly after the next
+user activity by supplying a time interval of zero.
+
+
+@param aStatus  On completion, contains the status of the request:
+                KErrNone, the timer completed normally;
+                KErrCancel, the timer was cancelled;
+                KErrArgument, if aSeconds is less then zero;
+                KErrOverflow, if aSecond reaches its limit (which is platform specific but greater then one and a half day).
+@param aSeconds The time interval in seconds.
+
+@panic KERN-EXEC 15, if this function is called while a request for a timer
+       event is still outstanding.
+*/
+EXPORT_C void RTimer::Inactivity(TRequestStatus &aStatus, TTimeIntervalSeconds aSeconds)
+	{
+	aStatus=KRequestPending;
+	Exec::TimerInactivity(iHandle, aStatus, aSeconds.Int());
+	}
+
+
+
+
+EXPORT_C TInt RChangeNotifier::Logon(TRequestStatus& aStatus) const
+/**
+Issues a request for notification when changes occur in the environment. 
+
+A switch in locale, or crossing over past midnight, are examples of changes
+that are reported.
+
+When a change in the environment occurs, the request completes and the 
+TRquestStatus object will contain one or more of the bit values defined
+by the TChanges enum.
+
+Alternatively, if an outstanding request is cancelled by a call to
+this handle's LogonCancel() member function, then the request completes
+with a KErrCancel.
+
+Note that if this is the first notification request after creation of
+the change notifier, then this request completes immediately.
+
+@param aStatus A reference to the request status object.
+
+@return KErrInUse, if there is an outstanding request; KErrNone otherwise.
+
+@see TChanges
+@see RChangeNotifier::Logon()
+*/
+	{
+	
+	aStatus=KRequestPending;
+	return(Exec::ChangeNotifierLogon(iHandle,aStatus));
+	}
+
+
+
+
+EXPORT_C TInt RChangeNotifier::LogonCancel() const
+/**
+Cancels an outstanding change notification request.
+
+@return KErrGeneral, if there is no outstanding request; KErrNone otherwise.
+
+@see RChangeNotifier::Logon()
+*/
+	{
+	
+	return(Exec::ChangeNotifierLogoff(iHandle));
+	}
+
+
+
+
+EXPORT_C void UserSvr::CaptureEventHook()
+//
+// Capture the event hook
+//
+	{
+
+	Exec::CaptureEventHook();
+	}
+
+EXPORT_C void UserSvr::ReleaseEventHook()
+//
+// Release the event hook
+//
+	{
+
+	Exec::ReleaseEventHook();
+	}
+
+EXPORT_C void UserSvr::RequestEvent(TRawEventBuf &anEvent,TRequestStatus &aStatus)
+//
+// Request the next event.
+//
+	{
+
+	aStatus=KRequestPending;
+	Exec::RequestEvent(anEvent,aStatus);
+	}
+
+EXPORT_C void UserSvr::RequestEventCancel()
+//
+// Cancel the event request.
+//
+	{
+
+	Exec::RequestEventCancel();
+	}
+
+/**
+Add an event to the queue.
+
+@param anEvent The raw hardware event to be added to the event queue.
+@return KErrNone, if successful; KErrPermissionDenied, if the caller has 
+insufficient capability; otherwise, one of the other system-wide error codes.
+
+@capability SwEvent
+@capability PowerMgmt for ESwitchOff, ERestartSystem, ECaseOpen and ECaseClose
+*/
+EXPORT_C TInt UserSvr::AddEvent(const TRawEvent& anEvent)
+	{
+
+    return(Exec::AddEvent(anEvent));
+	}
+
+EXPORT_C void UserSvr::ScreenInfo(TDes8 &anInfo)
+//
+// Get the screen info.
+//
+	{
+
+	Exec::HalFunction(EHalGroupDisplay,EDisplayHalScreenInfo,(TAny*)&anInfo,NULL);
+	}
+
+#ifdef __USERSIDE_THREAD_DATA__
+
+EXPORT_C TAny* UserSvr::DllTls(TInt aHandle)
+//
+// Return the value of the Thread Local Storage variable.
+//
+	{
+	return LocalThreadData()->DllTls(aHandle, KDllUid_Default);
+	}
+
+EXPORT_C TAny* UserSvr::DllTls(TInt aHandle, TInt aDllUid)
+//
+// Return the value of the Thread Local Storage variable.
+//
+	{
+	return LocalThreadData()->DllTls(aHandle, aDllUid);
+	}
+
+#else
+
+EXPORT_C TAny* UserSvr::DllTls(TInt aHandle)
+//
+// Return the value of the Thread Local Storage variable.
+//
+	{
+
+	return Exec::DllTls(aHandle, KDllUid_Default);
+	}
+
+EXPORT_C TAny* UserSvr::DllTls(TInt aHandle, TInt aDllUid)
+//
+// Return the value of the Thread Local Storage variable.
+//
+	{
+
+	return Exec::DllTls(aHandle, aDllUid);
+	}
+
+#endif
+
+EXPORT_C void UserSvr::DllFileName(TInt aHandle, TDes& aFileName)
+//
+// Return the filename of this dll
+//
+	{
+	TBuf8<KMaxFileName> n8;
+	Exec::DllFileName(aHandle, n8);
+	aFileName.Copy(n8);
+	}
+
+EXPORT_C TBool UserSvr::TestBootSequence()
+//
+// Is the machine being booted by the test department?
+//
+    {
+
+	return Exec::HalFunction(EHalGroupPower,EPowerHalTestBootSequence,NULL,NULL);
+    }
+
+/**
+Register whether the W/S takes care of turning the screen on
+*/
+EXPORT_C void UserSvr::WsRegisterSwitchOnScreenHandling(TBool aState)
+    {
+
+	Exec::HalFunction(EHalGroupDisplay,EDisplayHalWsRegisterSwitchOnScreenHandling,(TAny*)aState,NULL);
+    }
+
+EXPORT_C void UserSvr::WsSwitchOnScreen()
+//
+// W/S switch on the screen
+//
+    {
+
+	Exec::HalFunction(EHalGroupDisplay,EDisplayHalWsSwitchOnScreen,NULL,NULL);
+    }
+
+
+EXPORT_C TUint32 UserSvr::DebugMask()
+/**
+Return the kernel debug mask at index 0
+*/
+    {
+	return Exec::DebugMask();
+    }
+
+
+EXPORT_C TUint32 UserSvr::DebugMask(TUint aIndex)
+/**
+Return the kernel debug mask at the given index position
+
+@param aIndex An index of which 32 bit mask word is to be accessed
+*/
+    {
+	return Exec::DebugMaskIndex(aIndex);
+    }
+#endif // __TOOLS2__
+
+
+EXPORT_C TTrapHandler *User::TrapHandler()
+/**
+Gets a pointer to the current thread's trap handler.
+
+Note that TTrapHandler is an abstract base class; a trap handler must be
+implemented as a derived class.
+
+@return A pointer to the current thread's trap handler, if any. NULL, if no 
+        pre-existing trap handler is set.
+*/
+	{
+
+	return GetTrapHandler();
+	}
+
+
+
+
+EXPORT_C TTrapHandler *User::SetTrapHandler(TTrapHandler *aHandler)
+/**
+Sets the current thread's trap handler and returns a pointer to any pre-existing 
+trap handler.
+
+Pass a NULL pointer to this function to clear the trap handler.
+
+The trap handler works with the TRAP mechanism to handle the effects of a 
+leave.
+
+Note that TTrapHandler is an abstract base class; a trap handler must be
+implemented as a derived class.
+
+@param aHandler A pointer to the trap handler which is to be installed as 
+                the current thread's trap handler.
+                
+@return A pointer to the current thread's pre-existing trap handler, if any. 
+        NULL, if no pre-existing trap handler is set.
+        
+@see TRAP
+@see TRAPD
+*/
+	{
+
+	TTrapHandler* prev;
+#if defined(__USERSIDE_THREAD_DATA__) && defined(__LEAVE_EQUALS_THROW__)
+	prev = LocalThreadData()->iTrapHandler;
+#else
+	prev = Exec::SetTrapHandler(aHandler);
+#endif
+#ifdef __USERSIDE_THREAD_DATA__
+	LocalThreadData()->iTrapHandler = aHandler;
+#endif
+	return prev;	
+	}
+
+#ifndef __LEAVE_EQUALS_THROW__
+EXPORT_C TTrapHandler* User::MarkCleanupStack()
+/**
+If there's a TTrapHandler installed marks the cleanup stack and returns 
+the TTrapHandler for subsequent use in UnMarkCleanupStack. 
+
+Only intended for use in the defintion of TRAP and TRAPD and only when 
+User::Leave is defined in terms of THROW.
+
+@return A pointer to the current thread's pre-existing trap handler, if any. 
+        NULL, if no pre-existing trap handler is set.
+
+@see TRAP
+@see TRAPD
+*/
+	{ 
+	return (TTrapHandler*)0; 
+	}
+
+
+EXPORT_C void User::UnMarkCleanupStack(TTrapHandler* /*aHandler*/)
+/**
+If passed a non-null TTrapHandler unmarks the cleanup stack.
+
+Only intended for use in the defintion of TRAP and TRAPD and only when 
+User::Leave is defined in terms of THROW.
+
+@see TRAP
+@see TRAPD
+*/
+	{}
+
+#else
+
+EXPORT_C TTrapHandler* User::MarkCleanupStack()
+/**
+If there's a TTrapHandler installed marks the cleanup stack and returns 
+the TTrapHandler for subsequent use in UnMarkCleanupStack. 
+
+Only intended for use in the defintion of TRAP and TRAPD and only when 
+User::Leave is defined in terms of THROW.
+
+@return A pointer to the current thread's pre-existing trap handler, if any. 
+        NULL, if no pre-existing trap handler is set.
+
+@see TRAP
+@see TRAPD
+*/
+	{
+
+	TTrapHandler* pH = GetTrapHandler();
+	if (pH)
+		pH->Trap();
+	return pH;
+	}
+
+EXPORT_C void User::UnMarkCleanupStack(TTrapHandler* aHandler)
+/**
+If passed a non-null TTrapHandler unmarks the cleanup stack.
+
+Only intended for use in the defintion of TRAP and TRAPD and only when 
+User::Leave is defined in terms of THROW.
+
+@see TRAP
+@see TRAPD
+*/
+	{
+
+	if (aHandler)
+		aHandler->UnTrap();
+	}
+
+#endif
+
+#ifndef __TOOLS2__
+EXPORT_C TInt User::Beep(TInt aFrequency,TTimeIntervalMicroSeconds32 aDuration)
+/**
+Makes a beep tone with a specified frequency and duration.
+
+This function should not be used. It exists to maintain compatibility with
+older versions of Symban OS.
+*/
+	{
+
+	return Exec::HalFunction(EHalGroupSound,ESoundHalBeep,(TAny*)aFrequency,(TAny*)aDuration.Int());
+	}
+
+
+
+
+// Unused, exists only for BC reasons
+EXPORT_C TInt UserSvr::HalGet(TInt, TAny*)
+	{
+	return KErrNotSupported;
+	}
+
+// Unused, exists only for BC reasons
+EXPORT_C TInt UserSvr::HalSet(TInt, TAny*)
+	{
+	return KErrNotSupported;
+	}
+
+EXPORT_C TInt UserSvr::HalFunction(TInt aGroup, TInt aFunction, TAny* a1, TAny* a2)
+	{
+
+	return Exec::HalFunction(aGroup, aFunction, a1, a2);
+	}
+
+EXPORT_C TInt UserSvr::HalFunction(TInt aGroup, TInt aFunction, TAny* a1, TAny* a2, TInt aDeviceNumber)
+	{
+
+	return Exec::HalFunction(aGroup | (aDeviceNumber<<16), aFunction, a1, a2);
+	}
+
+/**
+@capability WriteDeviceData
+*/
+EXPORT_C TInt UserSvr::SetMemoryThresholds(TInt aLowThreshold, TInt aGoodThreshold)
+	{
+	return Exec::SetMemoryThresholds(aLowThreshold,aGoodThreshold);
+	}
+
+/**
+@deprecated
+@internalAll
+@return EFalse
+*/
+EXPORT_C TBool UserSvr::IpcV1Available()
+	{
+	return EFalse;
+	}
+
+
+
+EXPORT_C void User::SetDebugMask(TUint32 aVal)
+/**
+Sets the debug mask.
+
+@param aVal A set of bit values as defined in nk_trace.h
+*/
+	{
+	Exec::SetDebugMask(aVal);
+	}
+
+EXPORT_C void User::SetDebugMask(TUint32 aVal, TUint aIndex)
+/**
+Sets the debug mask at the given index
+
+@param aVal A set of bit values as defined in nk_trace.h
+@param aIndex An index of which 32 bit mask word is to be accessed
+*/
+	{
+	Exec::SetDebugMaskIndex(aVal, aIndex);
+	}
+
+
+/**
+Gets machine information.
+
+@publishedPartner
+@deprecated Use HAL::Get() from the HAL library instead.
+*/
+EXPORT_C TInt UserHal::MachineInfo(TDes8& anInfo)
+    {
+	TInt bufLength=anInfo.MaxLength();
+	__ASSERT_ALWAYS(bufLength==sizeof(TMachineInfoV2) || bufLength==sizeof(TMachineInfoV1),Panic(ETDes8BadDescriptorType));
+
+	// assemble a TMachineInfoV1 buffer
+	TMachineInfoV2* info=&((TMachineInfoV2Buf&)anInfo)();
+	// Variant stuff
+	TVariantInfoV01Buf infoBuf;
+	TInt r = Exec::HalFunction(EHalGroupVariant, EVariantHalVariantInfo, (TAny*)&infoBuf, NULL);
+	if (KErrNone != r) return r;			// must always be implemented!
+	TVariantInfoV01& variantInfo = infoBuf();
+
+	info->iRomVersion=variantInfo.iRomVersion;
+	info->iMachineUniqueId=variantInfo.iMachineUniqueId;
+	info->iLedCapabilities=variantInfo.iLedCapabilities;
+	info->iProcessorClockInKHz=variantInfo.iProcessorClockInKHz;
+	info->iSpeedFactor=variantInfo.iSpeedFactor;
+
+	// Video driver stuff
+	TVideoInfoV01Buf vidinfoBuf;
+	r = Exec::HalFunction(EHalGroupDisplay, EDisplayHalCurrentModeInfo, (TAny*)&vidinfoBuf, NULL);
+	if (KErrNone == r)
+		{
+		TVideoInfoV01& vidinfo = vidinfoBuf();
+		info->iDisplaySizeInPixels=vidinfo.iSizeInPixels;
+		info->iPhysicalScreenSize=vidinfo.iSizeInTwips;
+		}
+	else								// no display driver
+		{
+		info->iDisplaySizeInPixels.iWidth=0;
+		info->iDisplaySizeInPixels.iHeight=0;
+		info->iPhysicalScreenSize.iWidth=0;
+		info->iPhysicalScreenSize.iHeight=0;
+		}
+	TInt colors = 0;
+	r = Exec::HalFunction(EHalGroupDisplay, EDisplayHalColors, &colors, NULL);
+	info->iMaximumDisplayColors=(KErrNone == r)?colors:0;
+	TInt val;
+	info->iBacklightPresent= (KErrNone == Exec::HalFunction(EHalGroupDisplay, EDisplayHalBacklightOn, &val, NULL));
+
+	// Pointing device stuff
+	TDigitiserInfoV01Buf xyinfoBuf;
+	r = Exec::HalFunction(EHalGroupDigitiser, EDigitiserHalXYInfo, (TAny*)&xyinfoBuf, NULL);
+	if (KErrNone == r)
+		{
+		info->iXYInputType=EXYInputPointer;					// XY is Digitiser
+		TDigitiserInfoV01& xyinfo = xyinfoBuf();
+		info->iXYInputSizeInPixels=xyinfo.iDigitiserSize;
+		info->iOffsetToDisplayInPixels=xyinfo.iOffsetToDisplay;
+		}
+	else
+		{
+		TMouseInfoV01Buf mouseinfoBuf;
+		r = Exec::HalFunction(EHalGroupMouse, EMouseHalMouseInfo, (TAny*)&mouseinfoBuf, NULL);
+		if (KErrNone == r)
+			{
+			info->iXYInputType=EXYInputMouse;				// XY is Mouse
+			TMouseInfoV01& mouseinfo = mouseinfoBuf();
+			info->iXYInputSizeInPixels=mouseinfo.iMouseAreaSize;
+			info->iOffsetToDisplayInPixels=mouseinfo.iOffsetToDisplay;
+			}
+		else
+			{
+			info->iXYInputType=EXYInputNone;				// no XY
+			info->iXYInputSizeInPixels.iWidth=0;
+			info->iXYInputSizeInPixels.iHeight=0;
+			info->iOffsetToDisplayInPixels.iX=0;
+			info->iOffsetToDisplayInPixels.iY=0;
+			}
+		}
+
+	// Keyboard stuff
+	TKeyboardInfoV01Buf kbdinfoBuf;
+	info->iKeyboardPresent= (KErrNone == Exec::HalFunction(EHalGroupKeyboard, EKeyboardHalKeyboardInfo, (TAny*)&kbdinfoBuf, NULL));
+
+	// Unused, obsolete parameters
+	info->iKeyboardId=0;
+	info->iDisplayId=0;
+	if(bufLength==sizeof(TMachineInfoV2))
+		{
+		// assemble a TMachineInfoV2 buffer
+		info->iLanguageIndex=0;
+		info->iKeyboardIndex=0;
+		}
+
+	anInfo.SetLength(bufLength);
+
+    return KErrNone;
+    }
+
+/**
+Gets memory information.
+
+@see HAL::Get()
+
+@publishedPartner
+@deprecated Use HAL::Get() from the HAL library instead with attributes EMemoryRAM, EMemoryRAMFree or EMemoryROM.
+*/
+EXPORT_C TInt UserHal::MemoryInfo(TDes8& anInfo)
+    {
+    return Exec::HalFunction(EHalGroupKernel,EKernelHalMemoryInfo,(TAny*)&anInfo,NULL);
+    }
+
+/**
+Gets ROM configuration information.
+
+@publishedPartner
+@deprecated No replacement.
+*/
+EXPORT_C TInt UserHal::RomInfo(TDes8& anInfo)
+    {
+    return Exec::HalFunction(EHalGroupKernel,EKernelHalRomInfo,(TAny*)&anInfo,NULL);
+    }
+
+
+
+
+/**
+Gets drive information.
+
+@param anInfo A package buffer (TPckgBuf) containing a TDriveInfoV1 structure.
+              On return, this structure will contain the drive information.
+	
+@return KErrNone 
+
+@see TDriveInfoV1Buf
+@see TDriveInfoV1
+@see TPckgBuf
+*/
+EXPORT_C TInt UserHal::DriveInfo(TDes8& anInfo)
+    {
+	TDriveInfoV1Buf8 anInfo8;
+    TInt r = Exec::HalFunction(EHalGroupMedia,EMediaHalDriveInfo,(TAny*)&anInfo8,NULL);
+	TDriveInfoV18& driveInfo8 = anInfo8();
+	TDriveInfoV1* driveInfo = NULL;
+	switch(((SBuf8*)&anInfo)->length>>KShiftDesType8) //type
+		{
+		case EPtr:
+			 driveInfo = &((TPckg<TDriveInfoV1>&)anInfo)();
+			 break;
+		case EBuf:		
+			 driveInfo = &((TDriveInfoV1Buf&)anInfo)();
+			 break;
+		default:
+			__ASSERT_ALWAYS(EFalse,Panic(ETDes8BadDescriptorType));
+		}
+
+	// A compile time assert to make sure that this function is examined if TDriveInfoV1
+	// structure changes
+	extern int TDriveInfoV1_structure_assert[(
+		_FOFF(TDriveInfoV1,iRegisteredDriveBitmask)+4 == sizeof(TDriveInfoV1)
+		&&
+		sizeof(TDriveInfoV1) == 816
+		)?1:-1];
+	(void)TDriveInfoV1_structure_assert;
+
+	// Set length to size of old EKA1 TDriveInfoV1 (Will Panic if not big enough)
+	TInt len = (TUint)_FOFF(TDriveInfoV1,iRegisteredDriveBitmask);
+	anInfo.SetLength(len);
+
+	// Fill in info for old EKA1 TDriveInfoV1
+	driveInfo->iTotalSupportedDrives = driveInfo8.iTotalSupportedDrives;
+	driveInfo->iTotalSockets = driveInfo8.iTotalSockets;
+	driveInfo->iRuggedFileSystem = driveInfo8.iRuggedFileSystem;
+	TInt index;
+	for(index=0;index<KMaxLocalDrives;index++)
+		driveInfo->iDriveName[index].Copy(driveInfo8.iDriveName[index]);
+	for(index=0;index<KMaxPBusSockets;index++)
+		driveInfo->iSocketName[index].Copy(driveInfo8.iSocketName[index]);
+
+	// If anInfo is big enough then set new EKA2 members of TDriveInfoV1
+	if((TUint)anInfo.MaxLength()>=(TUint)sizeof(TDriveInfoV1))
+		{
+		anInfo.SetLength(sizeof(TDriveInfoV1));
+		driveInfo->iRegisteredDriveBitmask = driveInfo8.iRegisteredDriveBitmask;
+		}
+	return r;
+    }
+
+
+
+
+/**
+Gets the startup reason.
+
+@see HAL::Get() 
+
+@publishedPartner
+@deprecated Use HAL::Get() from the HAL library instead with attributes ESystemStartupReason.
+*/
+EXPORT_C TInt UserHal::StartupReason(TMachineStartupType& aReason)
+    {
+    return Exec::HalFunction(EHalGroupKernel,EKernelHalStartupReason,(TAny*)&aReason,NULL);
+    }
+
+
+
+
+/**
+Gets the reason why the kernel last faulted.
+
+@param aReason An integer that, on return, contains the reason code describing
+               why the kernel faulted. This is the fault number passed 
+               in a call to Kern::Fault().
+
+@return KErrNone
+
+@see Kern::Fault()
+*/
+EXPORT_C TInt UserHal::FaultReason(TInt &aReason)
+	{
+
+	return Exec::HalFunction(EHalGroupKernel,EKernelHalFaultReason,(TAny *)&aReason,NULL);
+	}
+
+
+
+
+/**
+Gets the exception Id that describes the type of fault when
+the kernel last faulted.
+
+The Id is the value contained in TArmExcInfo::iExcCode.
+ 
+@param anId An integer that, on return, contains the exception Id.
+
+@return KErrNone
+
+@see TArmExcInfo::iExcCode
+@see TArmExcInfo
+*/
+EXPORT_C TInt UserHal::ExceptionId(TInt &anId)
+	{
+
+	return Exec::HalFunction(EHalGroupKernel,EKernelHalExceptionId, (TAny *)&anId, NULL);
+	}
+
+
+
+/**
+Gets the available exception information that describes the last kernel fault.
+
+@param aInfo A TExcInfo structure that, on return, contains the available
+             exception information.
+             
+@return KErrNone
+
+@see TExcInfo        
+*/
+EXPORT_C TInt UserHal::ExceptionInfo(TExcInfo &aInfo)
+	{
+
+	return Exec::HalFunction(EHalGroupKernel,EKernelHalExceptionInfo, (TAny *)&aInfo, NULL);
+	}
+
+
+
+
+/**
+Gets the page size for this device.
+
+@param anId An integer that, on return, contains the page size, in bytes,
+            for this device.
+
+@return KErrNone
+*/
+EXPORT_C TInt UserHal::PageSizeInBytes(TInt& aSize)
+    {
+
+    return Exec::HalFunction(EHalGroupKernel,EKernelHalPageSizeInBytes,(TAny*)&aSize,NULL);
+    }
+
+
+
+
+/**
+Switches the  device off.
+
+@return KErrNone, if successful; KErrPermissionDenied, if the calling process
+        has insufficient capability.
+
+@capability PowerMgmt
+*/
+EXPORT_C TInt UserHal::SwitchOff()
+    {
+	if(!RProcess().HasCapability(ECapabilityPowerMgmt,__PLATSEC_DIAGNOSTIC_STRING("Checked by UserHal::SwitchOff")))
+		return KErrPermissionDenied;
+	TInt r = Power::EnableWakeupEvents(EPwStandby);
+	if(r!=KErrNone)
+		return r;
+	TRequestStatus s;
+	Power::RequestWakeupEventNotification(s);
+	Power::PowerDown();
+	User::WaitForRequest(s);
+	return s.Int();
+//	return Exec::HalFunction(EHalGroupPower,EPowerHalSwitchOff,NULL,NULL);
+	}
+
+
+
+
+/**
+Sets the calibration data for the digitiser (i.e. XY) input device.
+
+@param aCalibration The calibration data.
+
+@return KErrNone, if successful; KErrPermissionDenied, if the calling process
+        has insufficient capability.
+
+@see TDigitizerCalibration
+
+@capability WriteDeviceData
+*/
+EXPORT_C TInt UserHal::SetXYInputCalibration(const TDigitizerCalibration& aCalibration)
+    {
+    return Exec::HalFunction(EHalGroupDigitiser,EDigitiserHalSetXYInputCalibration,(TAny*)&aCalibration,NULL);
+    }
+
+
+
+
+/**
+Gets the points on the display that the user should point to in order
+to calibrate the digitiser (i.e. XY) input device.
+
+@param aCalibration A TDigitizerCalibration object that, on return, contains
+       the appropriate information.
+       
+@return KerrNone, if successful; otherwise one of the other system wide
+        error codes. 
+*/
+EXPORT_C TInt UserHal::CalibrationPoints(TDigitizerCalibration& aCalibration)
+    {
+
+    return Exec::HalFunction(EHalGroupDigitiser,EDigitiserHalCalibrationPoints,(TAny*)&aCalibration,NULL);
+    }
+
+
+
+
+/**
+Gets the platform tick period.
+
+@param aTime The tick period in microseconds.
+
+@return KErrNone, if successful; otherwise one of the other system wide
+        error codes.
+*/
+EXPORT_C TInt UserHal::TickPeriod(TTimeIntervalMicroSeconds32 &aTime)
+    {
+
+    return Exec::HalFunction(EHalGroupKernel,EKernelHalTickPeriod,(TAny*)&aTime,NULL);
+    }
+
+
+
+/**
+Saves the current digitiser (i.e. XY) input device calibration data.
+
+@return KErrNone, if successful; otherwise one of the other system wide
+        error codes, e.g. KErrNotSupported.
+*/
+EXPORT_C TInt UserHal::SaveXYInputCalibration()
+    {
+
+    return Exec::HalFunction(EHalGroupDigitiser,EDigitiserHalSaveXYInputCalibration,NULL,NULL);
+    }
+
+
+
+
+/**
+Restores the digitiser (i.e. XY) input device calibration data.
+
+@param aType A TDigitizerCalibration object that, on return, contains
+       the calibration data.
+
+@return KErrNone, if successful; KErrPermissionDenied, if the calling process
+        has insufficient capability; otherwise one of the other system wide
+        error codes, e.g. KErrNotSupported.
+
+@capability WriteDeviceData
+*/
+EXPORT_C TInt UserHal::RestoreXYInputCalibration(TDigitizerCalibrationType aType)
+    {
+    return Exec::HalFunction(EHalGroupDigitiser,EDigitiserHalRestoreXYInputCalibration,(TAny*)aType,NULL);
+	}
+
+
+
+
+/**
+Gets the machine configuration.
+
+@param aConfig On return contains the machine configuration data.
+@param aSize   On return, contains the size of the data.
+
+@return KErrNone, if sucessful, otherwise one of the other system-wide
+        error codes.
+
+@capability ReadDeviceData
+*/
+EXPORT_C TInt User::MachineConfiguration(TDes8& aConfig,TInt& aSize)
+    {
+	return(Exec::MachineConfiguration(aConfig,aSize));
+    }
+#endif // __TOOLS2__
+
+
+
+EXPORT_C TInt RDebug::Print(TRefByValue<const TDesC> aFmt,...)
+//
+// Print to the comms port
+//
+    {
+
+	TestOverflowTruncate overflow;
+	VA_LIST list;
+	VA_START(list,aFmt);
+	TBuf<0x100> buf;
+	buf.AppendFormatList(aFmt,list,&overflow);
+#ifdef _UNICODE
+	TPtr8 p(buf.Collapse());
+	Exec::DebugPrint((TAny*)&p, 0);
+#else
+	Exec::DebugPrint((TAny*)&buf, 0);
+#endif
+	return 0;
+    }
+
+class TestOverflowTruncate8 : public TDes8Overflow
+	{
+public:
+	virtual void Overflow(TDes8& /*aDes*/) {}
+	};
+
+EXPORT_C void RDebug::Printf(const char* aFmt, ...)
+//
+// Print to the comms port
+//
+    {
+
+	TestOverflowTruncate8 overflow;
+	VA_LIST list;
+	VA_START(list,aFmt);
+	TPtrC8 fmt((const TText8*)aFmt);
+	TBuf8<0x100> buf;
+	buf.AppendFormatList(fmt,list,&overflow);
+	Exec::DebugPrint((TAny*)&buf, 0);
+    }
+
+EXPORT_C void RDebug::RawPrint(const TDesC8& aDes)
+	{
+	Exec::DebugPrint((TAny*)&aDes, 1);
+	}
+
+EXPORT_C void RDebug::RawPrint(const TDesC16& aDes)
+//
+// Print to the comms port
+//
+    {
+	TBuf8<0x100> aDes8;
+	if(aDes.Length()>0x100)
+		{
+		TPtrC ptr(aDes.Ptr(), 0x100);
+		aDes8.Copy(ptr);
+		}
+	else
+		aDes8.Copy(aDes);
+	Exec::DebugPrint((TAny*)&aDes8, 1);
+	}
+
+EXPORT_C TUint32 Math::Random()
+/**
+Gets 32 random bits from the kernel's random pool.
+
+@return The 32 random bits.
+*/
+	{
+
+	return Exec::MathRandom();
+	}
+
+
+#ifndef __TOOLS2__
+EXPORT_C void User::IMB_Range(TAny* aStart, TAny* aEnd)
+/**
+Does the necessary preparations to guarantee correct execution of code in the 
+specified virtual address range.
+
+The function assumes that this code has been loaded or modified by user code.
+Calling this function against uncommitted memory region is considered as S/W
+bug and may generate exception on some memory models.
+
+The specified addresses are associated with a user writable code chunk as 
+created by RChunk::CreateLocalCode().
+
+The function cleans the data cache to ensure that written data has been
+committed to main memory and then flushes the instruction cache and branch
+target buffer (BTB) to ensure that the code is loaded from main memory when
+it is executed. 
+The Kernel uses the size of the range specified to decide whether to clean/flush 
+line-by-line or to simply clean/flush the entire cache.
+
+@param aStart The start virtual address of the region.
+@param aEnd   The end virtual address of the region. This location is not within 
+              the region.
+              
+@see RChunk::CreateLocalCode()
+@see UserHeap::ChunkHeap()
+*/
+	{
+
+	Exec::IMB_Range(aStart,(TUint32)aEnd-(TUint32)aStart);
+	}
+
+
+
+
+/**
+Sets the specified handle into the specified environment data slot
+for this process.
+
+The APPARC framework (class CApaApplication etc.) uses some of the slots internally,
+so programs that use this framework should ensure that they only use slots available
+for public use.
+
+@param aSlot   An index that identifies the environment data slot.
+               This is a value relative to zero;
+               i.e. 0 is the first item/slot.
+               This can range from 0 to 15.
+@param aHandle The handle to be passed to this process.
+
+@return KErrNone, always.
+
+@panic KERN-EXEC 46 if this function is called by a thread running
+                    in a process that is not the creator of this process, or
+                    the handle is not local.
+@panic KERN-EXEC 51 if aSlot is negative or is greater than or equal to
+                    the value of KArgIndex. 
+@panic KERN-EXEC 52 if the specified slot is already in use.
+
+@see CApaApplication
+@see CApaCommandLine::EnvironmentSlotForPublicUse()
+*/
+EXPORT_C TInt RProcess::SetParameter(TInt aSlot, RHandleBase aHandle)
+	{
+	return Exec::ProcessSetHandleParameter(iHandle, aSlot, aHandle.Handle());
+	}
+
+
+
+
+/**
+Sets the specified 16-bit descriptor data into the specified environment
+data slot for this process.
+
+The APPARC framework (class CApaApplication etc.) uses some of the slots internally,
+so programs that use this framework should ensure that they only use slots available
+for public use.
+
+@param aSlot   An index that identifies the environment data slot.
+               This is a value relative to zero;
+               i.e. 0 is the first item/slot.
+               This can range from 0 to 15.
+@param aDes    The 16-bit descriptor containing data be passed to this process.
+
+@return KErrNone, if successful, otherwise one of the other system
+        wide error codes.
+
+@panic KERN-EXEC 46 if this function is called by a thread running
+                    in a process that is not the creator of this process.
+@panic KERN-EXEC 51 if aSlot is negative or is greater than or equal to
+                    the value of KArgIndex. 
+@panic KERN-EXEC 52 if the specified slot is already in use.
+@panic KERN-EXEC 53 if the length of data passed is negative.
+
+@see CApaApplication
+@see CApaCommandLine::EnvironmentSlotForPublicUse()
+*/
+EXPORT_C TInt RProcess::SetParameter(TInt aSlot, const TDesC16& aDes)
+	{
+	return Exec::ProcessSetDataParameter(iHandle, aSlot, (const TUint8*)aDes.Ptr(), 2*aDes.Length());
+	}
+
+
+
+
+/**
+Sets the specified 8-bit descriptor data into the specified environment
+data slot for this process.
+
+The APPARC framework (class CApaApplication etc.) uses some of the slots internally,
+so programs that use this framework should ensure that they only use slots available
+for public use.
+
+@param aSlot   An index that identifies the environment data slot.
+               This is a value relative to zero;
+               i.e. 0 is the first item/slot.
+               This can range from 0 to 15.
+@param aDes    The 8-bit descriptor containing data be passed to this process.
+
+@return KErrNone, if successful, otherwise one of the other system
+        wide error codes.
+
+@panic KERN-EXEC 46 if this function is called by a thread running
+                    in a process that is not the creator of this process.
+@panic KERN-EXEC 51 if aSlot is negative or is greater than or equal to
+                    the value of KArgIndex. 
+@panic KERN-EXEC 52 if the specified slot is already in use.
+@panic KERN-EXEC 53 if the length of data passed is negative.
+
+@see CApaApplication
+@see CApaCommandLine::EnvironmentSlotForPublicUse()
+*/
+EXPORT_C TInt RProcess::SetParameter(TInt aSlot, const TDesC8& aDes)
+	{
+	return Exec::ProcessSetDataParameter(iHandle, aSlot, aDes.Ptr(), aDes.Length());
+	}
+
+
+
+
+/**
+Sets the specfied sub-session into the specified environment
+data slot for this process.
+
+The APPARC framework (class CApaApplication etc.) uses some of the slots internally,
+so programs that use this framework should ensure that they only use slots available
+for public use.
+
+@param aSlot    An index that identifies the environment data slot.
+                This is a value relative to zero;
+                i.e. 0 is the first item/slot.
+                This can range from 0 to 15.
+@param aSession The sub-session.
+
+@return KErrNone, if successful, otherwise one of the other system
+        wide error codes.
+
+@panic KERN-EXEC 46 if this function is called by a thread running
+                    in a process that is not the creator of this process.
+@panic KERN-EXEC 51 if aSlot is negative or is greater than or equal to
+                    the value of KArgIndex. 
+@panic KERN-EXEC 52 if the specified slot is already in use.
+@panic KERN-EXEC 53 if the length of data passed is negative.
+
+@see CApaApplication
+@see CApaCommandLine::EnvironmentSlotForPublicUse()
+*/
+EXPORT_C TInt RProcess::SetParameter(TInt aSlot, const RSubSessionBase& aSession)
+	{
+	TInt handle = aSession.SubSessionHandle();
+	return Exec::ProcessSetDataParameter(iHandle, aSlot, (const TUint8*)&handle, sizeof(handle));
+	}
+
+
+
+
+/**
+Sets the specfied integer value into the specified environment
+data slot for this process.
+
+The APPARC framework (class CApaApplication etc.) uses some of the slots internally,
+so programs that use this framework should ensure that they only use slots available
+for public use.
+
+@param aSlot   An index that identifies the environment data slot.
+               This is a value relative to zero;
+               i.e. 0 is the first item/slot.
+               This can range from 0 to 15.
+@param aData   The integer value.
+
+@return KErrNone, if successful, otherwise one of the other system
+        wide error codes.
+
+@panic KERN-EXEC 46 if this function is called by a thread running
+                    in a process that is not the creator of this process.
+@panic KERN-EXEC 51 if aSlot is negative or is greater than or equal to
+                    the value of KArgIndex. 
+@panic KERN-EXEC 52 if the specified slot is already in use.
+@panic KERN-EXEC 53 if the length of data passed is negative.
+
+@see CApaApplication
+@see CApaCommandLine::EnvironmentSlotForPublicUse()
+*/
+EXPORT_C TInt RProcess::SetParameter(TInt aSlot, TInt aData)
+	{
+	return Exec::ProcessSetDataParameter(iHandle, aSlot, (TUint8*)&aData, sizeof(aData));
+	}
+
+
+
+
+EXPORT_C TInt User::GetTIntParameter(TInt aSlot,  TInt& aData)
+/**
+Gets the specified environment data item belonging to the
+current process; this is assumed to be a 32 bit value.
+
+Environment data may be stored in the process and is passed to a child process
+on creation of that child process.
+
+On successful return from this function, the data item is deleted from
+the process. 
+
+@param aSlot An index that identifies the data item.
+             This is an index whose value is relative to zero;
+             i.e. 0 is the first item/slot.
+             This can range from 0 to 15, i.e. there are 16 slots. 
+
+@param aData On sucessful return, contains the environment data item.
+
+@return KErrNone, if successful;
+        KErrNotFound, if there is no data; 
+        KErrArgument, if the data is not binary data, or the data item in the
+                      process is longer than 32 bits.
+                      
+@panic KERN-EXEC 51, if aSlot is negative or is greater than or equal to 16.                                   
+*/
+	{
+	TInt ret = Exec::ProcessGetDataParameter(aSlot, (TUint8*)&aData, sizeof(TInt));
+	if (ret < 0)
+		return ret;
+	return KErrNone;
+	}
+
+
+
+
+EXPORT_C TInt User::ParameterLength(TInt aSlot)
+/**
+Gets the length of the specified item of environment data belonging to the
+current process.
+
+Environment data may be stored in the process and is passed to a child process
+on creation of that child process.
+
+@param aSlot An index that identifies the data item whose length is to be
+             retrieved. This is an index whose value is relative to zero;
+             i.e. 0 is the first item/slot.
+             This can range from 0 to 15, i.e. there are 16 slots.  
+             
+@return KErrNotFound, if there is no data; 
+        KErrArgument, if the data is not binary data;
+        The length of the data item.
+             
+@panic KERN-EXEC 51, if aSlot is negative or is greater than or equal to 16.             
+*/
+	{
+	TInt ret = Exec::ProcessDataParameterLength(aSlot);
+	return ret;
+	}
+
+
+
+
+EXPORT_C TInt User::GetDesParameter(TInt aSlot, TDes8& aDes)
+/**
+Gets the specified environment data item belonging to the
+current process; this is assumed to be an 8-bit descriptor.
+
+Environment data may be stored in the process and is passed to a child process
+on creation of that child process.
+
+On successful return from this function, the data item is deleted from
+the process. 
+
+@param aSlot An index that identifies the data item.
+             This is an index whose value is relative to zero;
+             i.e. 0 is the first item/slot.
+             This can range from 0 to 15, i.e. there are 16 slots. 
+
+@param aDes  On sucessful return, contains the environment data item; the
+             length of the descriptor is set to the length of the data item.
+
+@return KErrNone, if successful;
+        KErrNotFound, if there is no data; 
+        KErrArgument, if the data is not binary data, or the data item in the
+                      process is longer than the maximum length of aDes.
+                      
+@panic KERN-EXEC 51, if aSlot is negative or is greater than or equal to 16.                                   
+*/
+	{
+	TInt ret = Exec::ProcessGetDataParameter(aSlot, (TUint8*)aDes.Ptr(), aDes.MaxLength());
+	if (ret < 0)
+		return ret;
+	aDes.SetLength(ret);
+	return KErrNone;
+	}
+
+
+
+
+EXPORT_C TInt User::GetDesParameter(TInt aSlot, TDes16& aDes)
+/**
+Gets the specified environment data item belonging to the
+current process; this is assumed to be an 16-bit descriptor.
+
+Environment data may be stored in the process and is passed to a child process
+on creation of that child process.
+
+On successful return from this function, the data item is deleted from
+the process. 
+
+@param aSlot An index that identifies the data item.
+             This is an index whose value is relative to zero;
+             i.e. 0 is the first item/slot.
+             This can range from 0 to 15, i.e. there are 16 slots. 
+
+@param aDes  On sucessful return, contains the environment data item; the
+             length of the descriptor is set to the length of the data item.
+
+@return KErrNone, if successful;
+        KErrNotFound, if there is no data; 
+        KErrArgument, if the data is not binary data, or the data item in the
+                      process is longer than the maximum length of aDes.
+                      
+@panic KERN-EXEC 51, if aSlot is negative or is greater than or equal to 16.                                   
+*/
+	{
+	TInt ret = Exec::ProcessGetDataParameter(aSlot, (TUint8*)aDes.Ptr(), 2*aDes.MaxLength());
+	if (ret < 0)
+		return ret;
+	aDes.SetLength(ret/2);
+	return KErrNone;
+	}
+
+/**
+Gets the linear address of the exception descriptor for the code module in which
+a specified code address resides.
+
+@param	aCodeAddress The code address in question.
+@return	The address of the exception descriptor, or zero if there is none.
+
+*/
+EXPORT_C TLinAddr UserSvr::ExceptionDescriptor(TLinAddr aCodeAddress)
+	{
+	return Exec::ExceptionDescriptor(aCodeAddress);
+	}
+
+EXPORT_C TInt User::SetFloatingPointMode(TFloatingPointMode aMode, TFloatingPointRoundingMode aRoundingMode)
+/**
+Sets the hardware floating point mode for the current thread. This does not affect
+software floating point calculations. The rounding mode can also be set. New threads created
+by this thread will inherit the mode, thus to set the mode for a whole process, call this
+method before you create any new threads.
+
+@param aMode         The floating point calculation mode to use.
+@param aRoundingMode The floating point rounding mode to use, defaults to nearest.
+
+@return KErrNone if successful, KErrNotSupported if the hardware does not support the
+        chosen mode, or there is no floating point hardware present.
+
+@see TFloatingPointMode
+@see TFloatingPointRoundingMode
+*/
+	{
+	return(Exec::SetFloatingPointMode(aMode, aRoundingMode));
+	}
+
+
+EXPORT_C TUint32 E32Loader::PagingPolicy()
+/**
+	Accessor function returns the code paging policy, as defined at ROM build time.
+
+	@return					Paging policy only.  This function applies
+							EKernelConfigPagingPolicyMask to the config flags
+							before returning the value.
+ */
+	{
+	return Exec::KernelConfigFlags() & EKernelConfigPagingPolicyMask;
+	}
+
+
+/** Queue a notifier to detect system idle
+
+@internalTechnology
+@prototype
+*/
+EXPORT_C void User::NotifyOnIdle(TRequestStatus& aStatus)
+	{
+	aStatus = KRequestPending;
+	Exec::NotifyOnIdle(&aStatus);
+	}
+
+
+/** Cancel a miscellaneous notification requested by this thread
+
+Cancels a currently outstanding notification for system idle or object
+deletion.
+
+@internalTechnology
+@prototype
+*/
+EXPORT_C void User::CancelMiscNotifier(TRequestStatus& aStatus)
+	{
+	Exec::CancelMiscNotifier(&aStatus);
+	}
+
+
+/** Queue a notifier to detect destruction of this object
+
+To cancel the notifier, use User::CancelMiscNotifier().
+
+@internalTechnology
+@prototype
+*/
+EXPORT_C void RHandleBase::NotifyDestruction(TRequestStatus& aStatus)
+	{
+	aStatus = KRequestPending;
+	Exec::NotifyObjectDestruction(iHandle, &aStatus);
+	}
+
+#else // __TOOLS2__
+
+#ifdef _DEBUG
+// The following are for simulating heap failure
+TInt gAllocCount = 0;
+TInt gAllocFailRate = 0;
+RAllocator::TAllocFail gAllocFailType = RAllocator::ENone;
+#endif
+
+EXPORT_C void User::__DbgMarkStart(TBool aKernel)
+	{
+	}
+
+EXPORT_C TUint32 User::__DbgMarkEnd(TBool aKernel, TInt aCount)
+	{
+	return 0;
+	}
+
+EXPORT_C void User::__DbgSetAllocFail(TBool aKernel, RAllocator::TAllocFail aFail, TInt aRate)
+	{
+#ifdef _DEBUG
+	gAllocFailType = aFail;
+
+	switch (gAllocFailType)
+		{
+		case RAllocator::EFailNext:
+			gAllocFailRate = gAllocCount + aRate;
+			break;
+		case RAllocator::EDeterministic:
+			gAllocCount = 0;
+			gAllocFailRate = aRate;
+			break;
+		default:
+			break;
+		}
+#endif
+	}
+
+EXPORT_C void User::__DbgMarkCheck(int, int, int, unsigned char const*, int)
+	{
+	}
+
+EXPORT_C void RHandleBase::Close()
+	{
+	}
+
+#endif // __TOOLS2__
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32/euser/us_func.cpp	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,2072 @@
+// Copyright (c) 1994-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32\euser\us_func.cpp
+// 
+//
+
+#ifdef __TOOLS2__
+#include <stdlib.h>
+#include <stdio.h>
+#endif
+
+#include "us_std.h"
+//#define __DEBUG_IMAGE__ 1
+#if defined(__DEBUG_IMAGE__) && defined (__EPOC32__)
+#include "e32svr.h" 
+#define __IF_DEBUG(t) {RDebug debug;debug.t;}
+#else
+#define __IF_DEBUG(t)
+#endif
+#ifdef _UNICODE
+#include <collate.h>
+#include "compareimp.h"
+#endif
+
+#include "us_data.h"
+
+typedef union
+	{
+	TAny *tany;
+	TText8 *ttext8;
+	TText16 *ttext16;
+	TDesC8 *tdesc8;
+	TDesC16 *tdesc16;
+	TInt8 *tint8;
+	TInt16 *tint16;
+	TInt32 *tint32;
+	TInt64 *tint64;
+	TInt *tint;
+	TUint8 *tuint8;
+	TUint16 *tuint16;
+	TUint32 *tuint32;
+	TUint *tuint;
+	} UPTR;
+
+const TUint crcTab[256] =
+    {
+	0x0000,0x1021,0x2042,0x3063,0x4084,0x50a5,0x60c6,0x70e7,0x8108,0x9129,0xa14a,
+	0xb16b,0xc18c,0xd1ad,0xe1ce,0xf1ef,0x1231,0x0210,0x3273,0x2252,0x52b5,0x4294,
+	0x72f7,0x62d6,0x9339,0x8318,0xb37b,0xa35a,0xd3bd,0xc39c,0xf3ff,0xe3de,0x2462,
+	0x3443,0x0420,0x1401,0x64e6,0x74c7,0x44a4,0x5485,0xa56a,0xb54b,0x8528,0x9509,
+	0xe5ee,0xf5cf,0xc5ac,0xd58d,0x3653,0x2672,0x1611,0x0630,0x76d7,0x66f6,0x5695,
+	0x46b4,0xb75b,0xa77a,0x9719,0x8738,0xf7df,0xe7fe,0xd79d,0xc7bc,0x48c4,0x58e5,
+	0x6886,0x78a7,0x0840,0x1861,0x2802,0x3823,0xc9cc,0xd9ed,0xe98e,0xf9af,0x8948,
+	0x9969,0xa90a,0xb92b,0x5af5,0x4ad4,0x7ab7,0x6a96,0x1a71,0x0a50,0x3a33,0x2a12,
+	0xdbfd,0xcbdc,0xfbbf,0xeb9e,0x9b79,0x8b58,0xbb3b,0xab1a,0x6ca6,0x7c87,0x4ce4,
+	0x5cc5,0x2c22,0x3c03,0x0c60,0x1c41,0xedae,0xfd8f,0xcdec,0xddcd,0xad2a,0xbd0b,
+	0x8d68,0x9d49,0x7e97,0x6eb6,0x5ed5,0x4ef4,0x3e13,0x2e32,0x1e51,0x0e70,0xff9f,
+	0xefbe,0xdfdd,0xcffc,0xbf1b,0xaf3a,0x9f59,0x8f78,0x9188,0x81a9,0xb1ca,0xa1eb,
+	0xd10c,0xc12d,0xf14e,0xe16f,0x1080,0x00a1,0x30c2,0x20e3,0x5004,0x4025,0x7046,
+	0x6067,0x83b9,0x9398,0xa3fb,0xb3da,0xc33d,0xd31c,0xe37f,0xf35e,0x02b1,0x1290,
+	0x22f3,0x32d2,0x4235,0x5214,0x6277,0x7256,0xb5ea,0xa5cb,0x95a8,0x8589,0xf56e,
+	0xe54f,0xd52c,0xc50d,0x34e2,0x24c3,0x14a0,0x0481,0x7466,0x6447,0x5424,0x4405,
+	0xa7db,0xb7fa,0x8799,0x97b8,0xe75f,0xf77e,0xc71d,0xd73c,0x26d3,0x36f2,0x0691,
+	0x16b0,0x6657,0x7676,0x4615,0x5634,0xd94c,0xc96d,0xf90e,0xe92f,0x99c8,0x89e9,
+	0xb98a,0xa9ab,0x5844,0x4865,0x7806,0x6827,0x18c0,0x08e1,0x3882,0x28a3,0xcb7d,
+	0xdb5c,0xeb3f,0xfb1e,0x8bf9,0x9bd8,0xabbb,0xbb9a,0x4a75,0x5a54,0x6a37,0x7a16,
+	0x0af1,0x1ad0,0x2ab3,0x3a92,0xfd2e,0xed0f,0xdd6c,0xcd4d,0xbdaa,0xad8b,0x9de8,
+	0x8dc9,0x7c26,0x6c07,0x5c64,0x4c45,0x3ca2,0x2c83,0x1ce0,0x0cc1,0xef1f,0xff3e,
+	0xcf5d,0xdf7c,0xaf9b,0xbfba,0x8fd9,0x9ff8,0x6e17,0x7e36,0x4e55,0x5e74,0x2e93,
+	0x3eb2,0x0ed1,0x1ef0
+    };
+
+const TInt KQDepth=150; // Maximum queue depth
+
+LOCAL_C TUint checkSum(const TAny *aPtr)
+//
+// Checksum every other byte
+//
+	{
+
+	const TUint8* pB=(const TUint8*)aPtr;
+	const TUint8* pE=pB+(KMaxCheckedUid*sizeof(TUid));
+	TUint8 buf[(KMaxCheckedUid*sizeof(TUid))>>1];
+	TUint8* pT=(&buf[0]);
+	while (pB<pE)
+		{
+		*pT++=(*pB);
+		pB+=2;
+		}
+	TUint16 crc=0;
+	Mem::Crc(crc,&buf[0],(KMaxCheckedUid*sizeof(TUid))>>1);
+	return(crc);
+	}
+	
+LOCAL_C TInt partit(TInt n,TInt m,const TKey &aKey,const TSwap &aSwap)
+//
+// Partition n elements of array stating from element m, 
+// return element no. of partition point. 
+//
+	{
+
+	TInt i=m-1;
+	TInt j=i+n;
+	TInt pivlin=j;
+	aSwap.Swap((j+m)>>1,j);
+	while (i<j) 
+		{
+		for (i++;aKey.Compare(i,pivlin)<0;i++)
+			{
+			}
+		for (--j;j>i;j--)
+			{
+			if (aKey.Compare(j,pivlin)<=0)
+				break;
+			}
+		if (i<j)
+			aSwap.Swap(i,j);
+		}
+	aSwap.Swap(i,m+n-1);
+	return(i);
+	}
+
+#ifdef __TOOLS2__
+extern TPckgBuf<TExtendedLocale> gLocale;
+extern TBool gLocalSet;
+#endif
+
+static const TCollationMethod TheCollationMethod[] =
+	{
+		{
+		KUidBasicCollationMethod,				// this is the standard unlocalised method
+		NULL,									// null means use the standard table
+		NULL,									// there's no override table
+		0										// the flags are standard
+		}
+	};
+
+static const TCollationDataSet TheCollationDataSet =
+	{
+	TheCollationMethod,
+	1
+	};
+
+// The one and only locale character set object.
+const LCharSet TheCharSet =
+	{
+	NULL,
+	&TheCollationDataSet
+	};
+
+const LCharSet* GetLocaleDefaultCharSet()
+	{
+	return &TheCharSet;
+	}
+
+const LCharSet* GetLocaleCharSet()
+	{
+#ifndef __TOOLS2__
+	const LCharSet* charSet = (const LCharSet*)Exec::GetGlobalUserData(ELocaleDefaultCharSet);
+#else
+	const LCharSet* charSet = gLocale().GetDefaultCharSet();
+#endif // __TOOLS2__
+	if(charSet)
+		return charSet;
+	return &TheCharSet;
+	}
+
+const LCharSet* GetLocalePreferredCharSet()
+	{
+#ifndef __TOOLS2__
+	const LCharSet* charSet = (const LCharSet*)Exec::GetGlobalUserData(ELocalePreferredCharSet);
+#else
+	const LCharSet* charSet = gLocale().GetPreferredCharSet();
+#endif // __TOOLS2__
+	if(charSet)
+		return charSet;
+	return &TheCharSet;
+	}
+
+EXPORT_C TCollationMethod TExtendedLocale::GetPreferredCollationMethod(TInt aIndex)
+/**
+Get the preferred collation method for the preferred charset.
+
+Note that some charsets may contain more than one collation
+method (e.g "dictionary" v "phonebook" ordering) so an optional
+index parameter can be used to select between them.
+
+@param aIndex Optional parameter specifying the index of the collation 
+              method in the locale to get. This is the responsibility of 
+			  the caller to make sure that the index is less than the total 
+			  number of collation methods in the preferred charset in this locale.
+
+@return TCollationMethod representing the requested collation method.
+
+@panic USER 185 In both debug and release builds, if either the current charset 
+       is not set up or aIndex is greater than or equal to the total number of 
+	   collation methods in the preferred charset in this locale.
+
+@see TCollationMethod
+*/
+	{
+	__ASSERT_ALWAYS(iPreferredCharSet && (TUint(aIndex)<=TUint(iPreferredCharSet->iCollationDataSet->iMethods)), Panic(EBadLocaleParameter));
+	return iPreferredCharSet->iCollationDataSet->iMethod[aIndex];
+	}
+
+extern const TUint8 __FoldCollTab8[256];
+
+EXPORT_C TInt Mem::CompareF(const TUint8 *aLeft,TInt aLeftL,const TUint8 *aRight,TInt aRightL)
+/**
+Compares a block of data at one specified location with a block of data at 
+another specified location, using the standard folding method appropriate 
+to the current locale.
+
+@param aLeft   A pointer to the first (or left) block of 8 bit data to be
+               compared.
+@param aLeftL  The length of the first (or left) block of data to be compared, 
+               i.e. the number of bytes.
+@param aRight  A pointer to the second (or right) block of 8 bit data to be 
+               compared.
+@param aRightL The length of the second (or right) block of data to be
+               compared, i.e. the number of bytes.
+
+@return Positive, if the first (or left) block of data is greater than the 
+        second (or right) block of data.
+        Negative, if the first (or left) block of data is less than the second
+        (or right) block of data.
+        Zero, if both the first (or left) and second (or right) blocks of data
+        have the same length and the same content. 
+        
+@see Mem::Compare
+*/
+	{
+
+	__ASSERT_DEBUG(aLeftL>=0,Panic(EMemLeftNegative));
+	__ASSERT_DEBUG(aRightL>=0,Panic(EMemRightNegative));
+	const TUint8 *pE=aLeft+Min(aLeftL,aRightL);
+	const TUint8* table=__FoldCollTab8;
+    while (aLeft<pE)
+		{
+		TUint l=*aLeft++;
+		TUint r=*aRight++;
+		l = table[l];
+		r = table[r];
+		TInt d=l-r;
+		if (d!=0)
+		    return(d);
+		}
+    return(aLeftL-aRightL);
+	}
+
+
+
+
+EXPORT_C TInt Mem::CompareC(const TUint8 *aLeft,TInt aLeftL,const TUint8 *aRight,TInt aRightL)
+/**
+Compares a block of data at one specified location with a block of data at 
+another specified location using the standard collation method appropriate 
+to the current locale.
+
+@param aLeft   A pointer to the first (or left) block of 8 bit data to be
+               compared.
+@param aLeftL  The length of the first (or left) block of data to be compared 
+               i.e. the number of bytes.
+@param aRight  A pointer to the second (or right) block of 8 bit data to be 
+               compared.
+@param aRightL The length of the second (or right) block of data to be compared 
+               i.e. the number of bytes.
+
+@return Positive, if the first (or left) block of data is greater than the 
+        second (or right) block of data.
+        Negative, if the first (or left) block of data is less than the second
+        (or right) block of data.
+        Zero, if both the first (or left) and second (or right) blocks of data
+        have the same length and the same content.
+        
+@see Mem::Compare
+@deprecated
+*/
+	{
+	return Mem::CompareF(aLeft, aLeftL, aRight, aRightL);
+	}
+
+
+
+
+EXPORT_C TInt Mem::Compare(const TUint16 *aLeft,TInt aLeftL,const TUint16 *aRight,TInt aRightL)
+/**
+Compares a block of data at one specified location with a block of data at 
+another specified location.
+
+The comparison proceeds on a double-byte for double-byte basis, the result 
+of the comparison is based on the difference of the first pair of bytes to 
+disagree.
+
+The data at the two locations are equal if they have the same length and content. 
+Where the lengths are different and the shorter section of data is the same 
+as the first part of the longer section of data, the shorter is considered 
+to be less than the longer.
+
+@param aLeft   A pointer to the first (or left) block of 16 bit data to be
+               compared.
+@param aLeftL  The length of the first (or left) block of data to be compared 
+               i.e. the number of double-bytes. 
+@param aRight  A pointer to the second (or right) block of 16 bit data to be 
+               compared.
+@param aRightL The length of the second (or right) block of data to be compared 
+               i.e. the number of double-bytes.
+
+@return Positive, if the first (or left) block of data is greater than the 
+        second (or right) block of data.
+        Negative, if the first (or left) block of data is less than the second
+        (or right) block of data.
+        Zero, if both the first (or left) and second (or right) blocks of data
+        have the same length and the same content.
+*/
+	{
+
+	__ASSERT_DEBUG(aLeftL>=0,Panic(EMemLeftNegative));
+	__ASSERT_DEBUG(aRightL>=0,Panic(EMemRightNegative));
+	const TUint16 *pE=aLeft+Min(aLeftL,aRightL);
+    while (aLeft<pE)
+		{
+		TInt d=(*aLeft++)-(*aRight++);
+		if (d!=0)
+		    return(d);
+		}
+    return(aLeftL-aRightL);
+	}
+
+
+
+
+EXPORT_C TInt Mem::CompareF(const TUint16 *aLeft,TInt aLeftL,const TUint16 *aRight,TInt aRightL)
+/**
+Compares a block of data at one specified location with a block of data at 
+another specified location, using the standard folding method appropriate 
+to the current locale.
+
+@param aLeft   A pointer to the first (or left) block of 16 bit data to be
+               compared.
+@param aLeftL  The length of the first (or left) block of data to be compared 
+               i.e. the number of double-bytes.
+@param aRight  A pointer to the second (or right) block of 16 bit data to be 
+               compared.
+@param aRightL The length of the second (or right) block of data to be compared 
+               i.e the number of double-bytes.
+
+@return Positive, if the first (or left) block of data is greater than the 
+        second (or right) block of data.
+        Negative, if the first (or left) block of data is less than the second
+        (or right) block of data.
+        Zero, if both the first (or left) and second (or right) blocks of data
+        have the same length and the same content.
+        
+@see Mem::Compare
+*/
+	{
+	__ASSERT_DEBUG(aLeftL >= 0,Panic(EMemLeftNegative));
+	__ASSERT_DEBUG(aRightL >= 0,Panic(EMemRightNegative));
+
+	const TText16* aLeftEnd = aLeft + aLeftL;
+	const TText16* aRightEnd = aRight + aRightL;
+	
+	const TUint8* table=__FoldCollTab8;
+
+	while (aLeft != aLeftEnd)
+		{
+		if (aRight == aRightEnd)
+			return 1;
+
+		TUint l = *aLeft;
+		TUint r = *aRight;
+
+		// check if character is Ascii, if so treat as Ascii
+		if (l < 128 && r < 128)
+			{
+			l = table[l];
+			r = table[r];
+
+			if (r != l)
+				return l-r;
+			
+			aLeft++;
+			aRight++;
+			}
+		// covers Unicode characters...
+		else
+			{
+			TUTF32Iterator leftIt(aLeft, aLeftEnd);
+			TUTF32Iterator rightIt(aRight, aRightEnd);
+			return ::CompareFolded(leftIt, rightIt);
+			}
+		}
+
+	return aRight == aRightEnd? 0:-1;
+	}
+	
+
+
+
+
+EXPORT_C TInt Mem::CompareC(const TUint16 *aLeft,TInt aLeftL,const TUint16 *aRight,TInt aRightL)
+/**
+Compares a block of data at one specified location with a block of data at 
+another specified location using the standard collation method appropriate 
+to the current locale.
+
+@param aLeft   A pointer to the first (or left) block of 16 bit data to be
+               compared.
+@param aLeftL  The length of the first (or left) block of data to be compared 
+               i.e. the number of double-bytes).
+@param aRight  A pointer to the second (or right) block of 16 bit data to be 
+               compared.
+@param aRightL The length of the second (or right) block of data to be compared 
+               i.e. the number of double-bytes. 
+               
+@return Positive, if the first (or left) block of data is greater than the 
+        second (or right) block of data.
+        Negative, if the first (or left) block of data is less than the second
+        (or right) block of data.
+        Zero, if both the first (or left) and second (or right) blocks of data
+        have the same length and the same content. 
+        
+@see Mem::Compare
+*/
+	{
+	__ASSERT_DEBUG(aLeftL>=0,Panic(EMemLeftNegative));
+	__ASSERT_DEBUG(aRightL>=0,Panic(EMemRightNegative));
+#ifdef _UNICODE
+	TCollate c(GetLocaleCharSet());
+	return c.Compare(aLeft,aLeftL,aRight,aRightL);
+#else
+	const TUint16 *pE=aLeft+Min(aLeftL,aRightL);
+    while (aLeft<pE)
+		{
+		TInt d=User::Collate(*aLeft++)-User::Collate(*aRight++);
+		if (d!=0)
+		    return(d);
+		}
+    return(aLeftL-aRightL);
+#endif
+	}
+
+
+
+
+#ifdef _UNICODE
+EXPORT_C TInt Mem::CompareC(const TUint16* aLeft,TInt aLeftL,const TUint16* aRight,TInt aRightL,
+							TInt aMaxLevel,const TCollationMethod* aCollationMethod)
+/**
+Compares a block of data at one location with a block of data at another location 
+using the specified collation method and collating to the specified maximum 
+collation level.
+
+If no collation method is supplied, a default method, appropriate to the current 
+locale, is used.
+
+This function is only defined for 16 bit (Unicode) build variants. This means 
+that the function is not defined for 8 bit build variants, even when an explicit 
+16 bit descriptor is used.
+
+@param aLeft            A pointer to the first (or left) block of 16 bit data
+                        to be compared.
+@param aLeftL           The length of the first (or left) block of data to be
+                        compared. This is the number of double-bytes. 
+@param aRight           A pointer to the second (or right) block of 16 bit data
+                        to be compared.
+@param aRightL          The length of the second (or right) block of data to be
+                        compared. This is the number of double-bytes. 
+@param aMaxLevel        The maximum collation level. 
+@param aCollationMethod A pointer to the collation method or NULL. 
+
+@return Positive, if this descriptor is greater than the specified descriptor. 
+        Negative, if this descriptor is less than the specified descriptor.
+        Zero, if both descriptors have the same length and their contents
+        are the same.
+*/
+	{
+	__ASSERT_DEBUG(aLeftL>=0,Panic(EMemLeftNegative));
+	__ASSERT_DEBUG(aRightL>=0,Panic(EMemRightNegative));
+	if (aCollationMethod == NULL)
+		{
+		TCollate c(GetLocaleCharSet());
+		return c.Compare(aLeft,aLeftL,aRight,aRightL,aMaxLevel);
+		}
+	else
+		{
+		TCollate c(*aCollationMethod);
+		return c.Compare(aLeft,aLeftL,aRight,aRightL,aMaxLevel);
+		}
+	}
+#endif
+
+
+
+
+#ifdef _UNICODE
+EXPORT_C TInt Mem::CollationMethods()
+/**
+Gets the number of collation methods in this locale.
+
+This function is only defined for 16 bit (Unicode) build variants. This means 
+that the function is not defined for 8 bit build variants, even when an
+explicit 16 bit descriptor is used.
+
+@return The number of collation methods.
+*/
+	{
+	return GetLocaleCharSet()->iCollationDataSet->iMethods;
+	}
+#endif
+
+
+
+
+#ifdef _UNICODE
+EXPORT_C TUint Mem::CollationMethodId(TInt aIndex)
+/**
+Gets the Uid associated with the specified collation method.
+
+This function is only defined for 16 bit (Unicode) build variants. This means 
+that the function is not defined for 8 bit build variants, even when an
+explicit 16 bit descriptor is used.
+
+@param aIndex An index into the set of collation methods in thie locale. This 
+              value is relative to zero; i.e. a zero value refers to the first
+              collation method. This value must not be negative, and must be
+              less than the total number of collation methods in this locale.
+
+@return The Uid of the collation method.
+
+@panic USER 132 In debug builds only, if aIndex is negative or is greater than
+       or equal to the total number of collation methods in this locale.
+*/
+	{
+	const TCollationDataSet* s = GetLocaleCharSet()->iCollationDataSet;
+	__ASSERT_DEBUG(aIndex >= 0 && aIndex < s->iMethods,Panic(EBadCollationRulesIndex));
+	return s->iMethod[aIndex].iId;
+	}
+#endif
+
+
+
+
+#ifdef _UNICODE
+EXPORT_C const TCollationMethod* Mem::CollationMethodByIndex(TInt aIndex)
+/**
+Gets the collation method identified by the specified index.
+
+This function is only defined for 16 bit (Unicode) build variants. This means 
+that the function is not defined for 8 bit build variants, even when an
+explicit 16 bit descriptor is used.
+
+@param aIndex An index into the set of collation methods in this locale. This 
+              value is relative to zero; i.e. a zero value refers to the first
+              collation method. This value must not be negative, and must be
+              less than the total number of collation methods in this locale.
+              
+@return A pointer to the collation method.
+
+@panic USER 132 In debug builds only, if aIndex is negative or is greater than
+       or equal to the total number of collation methods in this locale.
+*/
+	{
+	const TCollationDataSet* s = GetLocaleCharSet()->iCollationDataSet;
+	__ASSERT_DEBUG(aIndex >= 0 && aIndex < s->iMethods,Panic(EBadCollationRulesIndex));
+	return &s->iMethod[aIndex];
+	}
+#endif
+
+
+
+
+#ifdef _UNICODE
+EXPORT_C const TCollationMethod* Mem::CollationMethodById(TUint aId)
+/**
+Gets the collation method identified by the specified Uid.
+
+This function is only defined for 16 bit (Unicode) build variants. This means 
+that the function is not defined for 8 bit build variants, even when an
+explicit 16 bit descriptor is used.
+
+@param aId The Uid of a collation method in the set of collation methods in 
+           this locale. 
+           
+@return A pointer to the collation method.
+*/
+	{
+	const TCollationDataSet* set = GetLocaleCharSet()->iCollationDataSet;
+	const TCollationMethod* method = set->iMethod;
+	const TCollationMethod* m = method;
+	int methods = set->iMethods;
+	for (int i = 0; i < methods; i++, m++)
+		if (m->iId == aId)
+			{
+			method = m;
+			break;
+			}
+	return method;
+	}
+#endif
+
+#ifdef _UNICODE
+EXPORT_C const TCollationMethod* Mem::GetDefaultMatchingTable()
+/**
+Gets the collation method specific for matching purpose.
+
+This function is only defined for 16 bit (Unicode) build variants. This means 
+that the function is not defined for 8 bit build variants, even when an
+explicit 16 bit descriptor is used.
+
+@return A pointer to the collation method
+*/
+	{
+	const TCollationDataSet* set=GetLocaleCharSet()->iCollationDataSet;
+	const TCollationMethod* method=set->iMethod;
+	const TCollationMethod* m= method;
+	int methods = set->iMethods;
+	for (; methods-->0; m++)
+		if (m->iFlags & TCollationMethod::EMatchingTable)
+			{
+			method=m;
+			break;
+			}
+	return method;
+	}
+#endif
+
+
+#if !defined(__MEM_MACHINE_CODED__)
+EXPORT_C void Mem::Swap(TAny *aPtr1,TAny *aPtr2,TInt aLength)
+/**
+Swaps a number of bytes of data between two specified locations.
+
+The source and target areas can overlap.
+
+@param aPtr1   A pointer to the first location taking part in the swap. 
+@param aPtr2   A pointer to second location taking part in the swap. 
+@param aLength The number of bytes to be swapped between the two locations. 
+               This value must not be negative.
+
+@panic USER 94 In debug builds only, if aLength is negative.
+*/
+	{
+
+	__ASSERT_DEBUG(aLength>=0,Panic(EMemSwapLengthNegative));
+	if (aPtr1==aPtr2)
+		return;
+	TUint8 *pT=(TUint8 *)aPtr1;
+	TUint8 *pE=pT+aLength;
+	TUint8 *pS=(TUint8 *)aPtr2;
+	while (pT<pE)
+		{
+		TUint b=(*pT);
+		*pT++=(*pS);
+		*pS++=(TUint8)b;
+		}
+	}
+#endif
+
+
+
+
+EXPORT_C void Mem::Crc(TUint16& aCrc,const TAny* aPtr,TInt aLength)
+/**
+Performs a CCITT CRC checksum on the specified data.
+
+On return from this function, the referenced 16 bit integer contains the checksummed 
+value.
+
+@param aCrc    A reference to a 16 bit integer to contain the checksummed value. 
+@param aPtr    A pointer to the start of the data to be checksummed. 
+@param aLength The length of the data to be checksummed.
+*/
+	{
+
+	const TUint8* pB=(const TUint8*)aPtr;
+	const TUint8* pE=pB+aLength;
+	TUint crc=aCrc;
+    while (pB<pE)
+		crc=(crc<<8)^crcTab[((crc>>8)^*pB++)&0xff];
+	aCrc=(TUint16)crc;
+	}
+
+
+
+
+EXPORT_C TInt User::StringLength(const TUint8 *aString)
+/**
+Gets the length of a C style, null terminated, string of single-byte valued 
+characters.
+
+The length does not include the null terminator.
+
+@param aString A pointer to the single byte valued, null terminated, string.
+
+@return The length of the string.
+*/
+	{
+
+	const TUint8 *pS=aString;
+	while (*pS)
+		pS++;
+	return(pS-aString);
+	}
+
+
+
+
+EXPORT_C TInt User::StringLength(const TUint16 *aString)
+/**
+Gets the length of a C style, null terminated, string of double-byte valued 
+characters.
+
+The length does not include the null terminator.
+
+@param aString A pointer to the double-byte valued, null terminated, string.
+
+@return The length of the string.
+*/
+	{
+
+	const TUint16 *pS=aString;
+	while (*pS)
+		pS++;
+	return(pS-aString);
+	}
+
+#ifdef __TOOLS2__
+
+TPanicHandler gPanicHandler = NULL;
+
+EXPORT_C void User::Panic(const TDesC &aCategory,TInt aReason)
+	{
+	if (gPanicHandler != NULL) 
+		{
+		TRAPD(r, (*gPanicHandler)(aCategory, aReason));		
+		return;
+		}
+	TBuf8<17> cat;
+	cat.Copy(aCategory.Left(16));
+	fprintf(stderr, "PANIC - %s: %d\n", cat.PtrZ(), aReason);
+	exit(2);
+	}
+
+#else
+EXPORT_C void User::Panic(const TDesC &aCategory,TInt aReason)
+/**
+Panics the current thread, specifying a category name and panic number.
+
+Keep the length of the category name small; it is limited to 16 characters.
+
+@param aCategory A reference to the descriptor containing the text that defines 
+                 the category for this panic.
+@param aReason   The panic number.
+*/
+	{
+
+	__IF_DEBUG(Print(_L("User::Panic %S %d\n"),&aCategory,aReason));
+	TPtrC cat16(aCategory.Ptr(),Min(KMaxExitCategoryName,aCategory.Length()));
+	TBuf8<KMaxExitCategoryName> cat;
+	cat.Copy(cat16);
+	ExitCurrentThread(EExitPanic,aReason,&cat);
+	}
+
+
+
+
+void CallStaticEntryPoints(TBool aInit)
+	{
+	TLinAddr ep[KMaxLibraryEntryPoints];
+	TInt numEps=KMaxLibraryEntryPoints;
+	TInt r=E32Loader::StaticCallList(numEps, ep);
+	if (r!=KErrNone)
+		return;
+	if (aInit)
+		{
+		for (TInt i=0; i<numEps-1; ++i)	// last EP is always process entry point
+			{
+			TLibraryEntry f=(TLibraryEntry)ep[i];
+			(*f)(KModuleEntryReasonProcessAttach);
+			}
+		}
+	else
+		{
+		for (TInt i=numEps-2; i>=0; --i)	// last EP is always process entry point
+			{
+			TLibraryEntry f=(TLibraryEntry)ep[i];
+			(*f)(KModuleEntryReasonProcessDetach);
+			}
+		}
+	}
+
+
+
+
+EXPORT_C void User::InitProcess()
+/**
+@internalAll
+*/
+	{
+	CallStaticEntryPoints(ETrue);
+	}
+
+
+
+
+EXPORT_C void User::Exit(TInt aReason)
+/**
+Terminates the current thread, specifying a reason.
+All child threads are terminated and all resources are cleaned up.
+
+If the current thread is the main thread in a process, the process is also 
+terminated.
+
+@param aReason The reason code.
+*/
+	{
+	// Notify kernel that thread is exiting
+	TBool lastThread = Exec::UserThreadExiting(aReason);
+	if (lastThread)
+		{
+		// Call global destructors if we're the last thread in the process
+		TGlobalDestructorFunc func = (TGlobalDestructorFunc)UserSvr::DllTls(KGlobalDestructorTlsKey, KDllUid_Special);
+		if (func)
+			{
+			func();
+			CallStaticEntryPoints(EFalse);
+			}
+		}
+	
+	FOREVER
+		{
+		TInt h=Exec::LastThreadHandle();
+		if (h==0)
+			break;
+		if (Exec::HandleClose(h)>0)
+			RHandleBase::DoExtendedClose();
+		}
+
+#ifdef __USERSIDE_THREAD_DATA__
+	LocalThreadData()->Close();
+#endif
+	
+	ExitCurrentThread(EExitKill,aReason,NULL);
+	}
+#endif // __TOOLS2__
+
+
+
+EXPORT_C TInt User::QuickSort(TInt aCount,const TKey &aKey,const TSwap &aSwap)
+//
+// Routine sorts a set of records into the order defined by the key aKey.
+// There are aCount records to sort, each record is numbered, the first is
+// record 0, the last record aCount-1.
+// Each time the quicksort algorithm needs to compare two records it calls
+//     aKey.Compare(TInt n,TInt m).
+// where n and m (both type TUint) are the record no.s of the two records to compare.
+// The compare routine should return
+//     >0 if record(n) > record(m)
+//      0 if record(n) == record(m)
+//     <0 if record(n) < record(m)
+// Each time the quicksort algorithm needs to exchange two records it calls
+//     aSwap.Swap(n,m)
+// where n and m (both type TUint) are the record numbers of the two records to 
+// exchange.
+// The swap routine should exchange the positions of records n and m so that
+// the value of record m becomes the former value of record n and visa versa.
+//
+/**
+Quick sorts array elements.
+
+It is used by the standard Symbian OS arrays having 
+CArrayFixBase, CArrayVarBase or CArrayPakBase in their class hierarchy in 
+the implementation of their sort functions. The function can be used by other 
+arrays. 
+
+The function returns KErrNone if the operation is successful otherwise it 
+returns KErrGeneral.
+
+@param aCount The number of elements in the array.
+@param aKey   A reference to a suitably initialised TKey derived object.
+@param aSwap  A reference to a suitably initialised TSwap derived object.
+
+@return KErrNone if the operation is successful; KErrGeneral otherwise.
+
+@panic USER 96, if aCount is negative.
+*/
+	{
+	TInt *parts_sp; // Stack pointer for partitions todo
+	TInt m; // First element of partition
+	TInt n; // No. of elements in partition
+	TInt d1,d2; // Temporary variables
+	TInt division_point; // Seperation point of partitions
+	TInt parts_todo[KQDepth]; // Stack pairs are <n,base>
+
+	__ASSERT_ALWAYS(aCount>=0,::Panic(ESortCountNegative));
+	if (aCount<=1) 
+		return(KErrNone); // Discard trivial sorts
+	parts_sp=(&parts_todo[0]); // Reset partitions to do stack
+	m=0; // Initial limits, first element
+	n=aCount; // No_elm elements to do
+	do  {
+		while (n>1 && parts_sp<(&parts_todo[KQDepth-2]))
+			{
+			division_point=partit(n,m,aKey,aSwap);
+			d1=division_point-m;
+			d2=m+n-division_point-1;
+			if (d1<d2)
+				{
+				// Less elements in first partition, do it first
+				// Stack bigger partition for later
+				*(parts_sp++)=d2;
+				*(parts_sp++)=division_point+1;
+				n=d1;
+				}
+			else
+				{
+				// Less elements in second partition,do it first
+				// Stack bigger partition for later
+				*(parts_sp++)=d1;
+				*(parts_sp++)=m;                      
+				n=d2;
+				m=division_point+1;
+				}
+			}
+		if (parts_sp>=&parts_todo[KQDepth-2]) 
+			return(KErrGeneral); // Stack overflow
+		m=(*(--parts_sp));
+		n=(*(--parts_sp)); // Unstack next partit to do
+		} while (parts_sp>=(&parts_todo[0])); // Stop on stack underflow
+	return(KErrNone);
+	}
+
+
+
+
+EXPORT_C TInt User::BinarySearch(TInt aCount,const TKey &aKey,TInt &aPos)
+//
+// Perform a binary search on any array. aKey.Compare() will be
+// called to lexically compare a record in the array with the
+// value being searched for. The second index to aKey.Compare() will
+// always be KIndexPtr, meaning the value being compared. The result
+// returned will be 0 if a match is found and >0 if no match is found.
+// The index of the matching record or the index of the record logically
+// following the value being searched for will be returned in aPos.
+//
+/**
+Performs a binary search for an array element containing a specified key.
+
+It can be used on any kind of array where elements can be identified by key. 
+It is used by the standard Symbian OS arrays having CArrayFix, CArrayVar or 
+CArrayPak in their class hierarchy in the implementation of the various
+functions for inserting, deleting and finding elements by key. The function
+can be used by other arrays. 
+
+The function returns a zero value if the search is successful and a non-zero 
+value otherwise.
+
+If the search is successful, the function puts the position (i.e. the index) 
+of the element into aPos. If the search is unsuccessful, then the function 
+puts into aPos the position of the first element in the array whose key is 
+greater than the search key.
+
+If the array is empty, i.e. aCount is zero, then the search is unsuccessful 
+and aPos is not defined.
+
+@param aCount The number of elements in the array.
+@param aKey   A reference to a suitably initialised TKey derived object.
+              In particular, the object will have been initialised with
+              a pointer to a sample element containing the search key.
+@param aPos   If the element is found, the reference is set to the position of 
+              that element within the array. The position is relative to zero,
+              (i.e. the first element in the array is at position 0).
+              If the element is not found and the array is not empty, then
+              the reference is set to the position of the first element in
+              the array with a key which is greater than the search key. 
+              If the element is not found and the array is empty, then the
+              reference is undefined.
+
+@return Zero, if the element with the specified key is found. Non-zero, if 
+the element with the specified key is not found.
+
+@panic USER 97, if aCount is negative.
+*/
+	{
+
+	__ASSERT_ALWAYS(aCount>=0,::Panic(EBinarySearchCountNegative));
+    TInt mid=0;
+    TInt r=(-1);
+    if (aCount)
+        {
+        TInt low=0;
+        TInt high=aCount-1;
+        while (low<=high)
+            {
+            mid=(low+high)>>1;
+            if ((r=aKey.Compare(mid,KIndexPtr))==0)
+                break;
+            if (r<0)
+                low=mid+1;
+            else
+                high=mid-1;
+            }
+        }
+	if (r<0)
+		mid++;
+    aPos=mid;
+    return(r);
+	}
+
+
+
+
+EXPORT_C TVersion User::Version()
+/**
+Retrieves the E32 component version number, which is the kernel architecture version number.  
+For example for EKA2 the major part of the version number will be 2.
+
+@return  The E32 component version number.
+*/
+	{
+
+	return(TVersion(KE32MajorVersionNumber,KE32MinorVersionNumber,KE32BuildVersionNumber));
+	}
+
+
+
+
+EXPORT_C void User::Invariant()
+/**
+Panics the current thread with a USER 0 panic.
+
+Typically, this is called when a test for a class invariant fails, i.e. when
+a test which checks that the internal data of an object is
+self-consistent, fails.
+
+Such tests are almost always done in debug builds, commonly using
+the __ASSERT_DEBUG macro.
+*/
+	{
+
+	::Panic(EInvariantFalse);
+	}
+
+
+
+
+EXPORT_C TBool User::QueryVersionSupported(const TVersion &aCurrent,const TVersion &aRequested)
+/**
+Compares two version objects and returns true if the test version is less 
+than the current version.
+
+Version information is encapsulated by a TVersion type object and consists
+of a major version number, a minor version number and a build number.
+
+The function returns true if one of the following conditions is true:
+
+1. the test major version is strictly less than the current major version
+
+2. the test major version is equal to the current major version and the test 
+   minor version is less than or equal to the current minor version
+
+If neither condition is true, the function returns false.
+
+@param aCurrent   A reference to the current version against which aRequested 
+                  is compared.
+@param aRequested A reference to the test version to be compared
+                  against aCurrent.
+                  
+@return True, if one or both conditions are true. False otherwise.
+*/
+	{
+
+	if (aRequested.iMajor<aCurrent.iMajor || (aRequested.iMajor==aCurrent.iMajor && aRequested.iMinor<=aCurrent.iMinor))
+		return(ETrue);
+	return(EFalse);
+	}
+
+
+
+
+EXPORT_C TKey::TKey()
+/**
+Protected default constructor.
+
+This constructor prevents TKey objects from being constructed directly.
+*/
+	{}
+
+
+
+
+EXPORT_C TKey::TKey(TInt anOffset,TKeyCmpText aType)
+	: iKeyOffset(anOffset),iCmpType(ECmpCollated16+aType+1)
+/**
+Constructs the characteristics of a descriptor type key.
+
+This constructor should be called by the corresponding derived class
+constructor that takes the same arguments. Typically, the derived class
+constructor calls this constructor in its constructor initialization list.
+
+No length value is passed as this is implied by the type of key.
+
+Note that the constructor sets the offset value into the protected data member 
+iKeyOffset.
+
+@param anOffset The offset of the key from the start of an array element.
+@param aType    An enumeration which defines the type of comparison to be made 
+                between two descriptor keys.
+                
+@panic USER 98, if anOffset is negative.
+                
+@see TKeyCmpText
+*/
+	{
+
+	__ASSERT_ALWAYS(iKeyOffset>=0,Panic(EKeyOffsetNegative));
+	}
+
+
+
+
+EXPORT_C TKey::TKey(TInt anOffset,TKeyCmpText aType,TInt aLength)
+	: iKeyOffset(anOffset),iKeyLength(aLength),iCmpType(aType)
+/**
+Constructs the characteristics of a text key.
+
+This constructor should be called by the corresponding derived class
+constructor that takes the same arguments. Typically, the derived class
+constructor calls this constructor in its constructor initialization list.
+
+Note that the constructor sets the offset value into the protected data member 
+iKeyOffset.
+
+@param anOffset The offset of the key from the start of an array element.
+@param aType    An enumeration which defines the type of comparison to be made 
+                between two text keys.
+@param aLength  The length of the text key.
+
+@panic USER 98, if anOffset is negative.
+
+@see TKeyCmpText
+*/
+	{
+
+	__ASSERT_ALWAYS(iKeyOffset>=0,Panic(EKeyOffsetNegative));
+	}
+
+
+
+
+EXPORT_C TKey::TKey(TInt anOffset,TKeyCmpNumeric aType)
+	: iKeyOffset(anOffset),iCmpType(aType)
+/**
+Constructs the characteristics of a numeric key.
+
+This constructor should be called by the corresponding derived class
+constructor that takes the same arguments. Typically, the derived class
+constructor calls this constructor in its constructor initialization list.
+
+No length value is passed as this is implied by the type of key.
+
+Note that the constructor sets the offset value into the protected data member 
+iKeyOffset.
+
+@param anOffset The offset of the key from the start of an array element.
+@param aType    An enumeration which defines the type of the numeric key.
+
+@panic USER 98, if anOffset is negative.
+
+@see TKeyCmpNumeric
+*/
+	{
+
+	__ASSERT_ALWAYS(iKeyOffset>=0,Panic(EKeyOffsetNegative));
+	}
+
+
+
+
+EXPORT_C TInt TKey::Compare(TInt aLeft,TInt aRight) const
+/**
+Compares the keys of two array elements.
+
+This function is called by User::BinarySearch() and User::QuickSort().
+
+The position of the elements are identified by the specified index values. 
+The default implementation uses the At() virtual function to convert the index 
+values into pointers to the elements themselves.
+
+The default implementation also uses:
+
+1. the TDesC comparison functions to compare descriptor type keys
+
+2. the Mem functions to compare text type keys
+
+3. numeric comparison for numeric type keys.
+
+@param aLeft  The index of an array element participating in the comparison, 
+              designated the left element.
+@param aRight The index of an array element participating in the comparison, 
+              designated the right element.
+              
+@return Zero, if the two keys are equal;
+        negative, if the left key is less than the right key;
+        positive, if the left key is greater than the right key.
+        
+@see User::BinarySearch()
+@see User::QuickSort()
+@see TDesC
+@see Mem
+*/
+	{
+
+	UPTR left;
+	left.tany=At(aLeft);
+	UPTR right;
+	right.tany=At(aRight);
+	TInt r=(-1);
+	switch (iCmpType)
+		{
+#if !defined(_UNICODE)
+	case ECmpNormal:
+#endif
+	case ECmpNormal8:
+		r=Mem::Compare(left.ttext8,iKeyLength,right.ttext8,iKeyLength);
+		break;
+#if defined(_UNICODE)
+	case ECmpNormal:
+#endif
+	case ECmpNormal16:
+		r=Mem::Compare(left.ttext16,iKeyLength,right.ttext16,iKeyLength);
+		break;
+#if !defined(_UNICODE)
+	case ECmpFolded:
+#endif
+	case ECmpFolded8:
+		r=Mem::CompareF(left.ttext8,iKeyLength,right.ttext8,iKeyLength);
+		break;
+#if defined(_UNICODE)
+	case ECmpFolded:
+#endif
+	case ECmpFolded16:
+		r=Mem::CompareF(left.ttext16,iKeyLength,right.ttext16,iKeyLength);
+		break;
+#if !defined(_UNICODE)
+	case ECmpCollated:
+#endif
+	case ECmpCollated8:
+		r=Mem::CompareC(left.ttext8,iKeyLength,right.ttext8,iKeyLength);
+		break;
+#if defined(_UNICODE)
+	case ECmpCollated:
+#endif
+	case ECmpCollated16:
+		r=Mem::CompareC(left.ttext16,iKeyLength,right.ttext16,iKeyLength);
+		break;
+#if !defined(_UNICODE)
+	case ECmpCollated16+ECmpNormal+1:
+#endif
+	case ECmpCollated16+ECmpNormal8+1:
+		r=left.tdesc8->Compare(*right.tdesc8);
+		break;
+#if defined(_UNICODE)
+	case ECmpCollated16+ECmpNormal+1:
+#endif
+	case ECmpCollated16+ECmpNormal16+1:
+		r=left.tdesc16->Compare(*right.tdesc16);
+		break;
+#if !defined(_UNICODE)
+	case ECmpCollated16+ECmpFolded+1:
+#endif
+	case ECmpCollated16+ECmpFolded8+1:
+		r=left.tdesc8->CompareF(*right.tdesc8);
+		break;
+#if defined(_UNICODE)
+	case ECmpCollated16+ECmpFolded+1:
+#endif
+	case ECmpCollated16+ECmpFolded16+1:
+		r=left.tdesc16->CompareF(*right.tdesc16);
+		break;
+#if !defined(_UNICODE)
+	case ECmpCollated16+ECmpCollated+1:
+#endif
+	case ECmpCollated16+ECmpCollated8+1:
+		r=left.tdesc8->CompareC(*right.tdesc8);
+		break;
+#if defined(_UNICODE)
+	case ECmpCollated16+ECmpCollated+1:
+#endif
+	case ECmpCollated16+ECmpCollated16+1:
+		r=left.tdesc16->CompareC(*right.tdesc16);
+		break;
+	case ECmpTInt:
+		if (*left.tint==*right.tint)
+			r=0;
+		else if (*left.tint>*right.tint)
+			r=1;
+		break;	   
+	case ECmpTUint:
+		if (*left.tuint==*right.tuint)
+			r=0;
+		else if (*left.tuint>*right.tuint)
+			r=1;
+		break;	   
+	case ECmpTInt8:
+		if (*left.tint8==*right.tint8)
+			r=0;
+		else if (*left.tint8>*right.tint8)
+			r=1;
+		break;	   
+	case ECmpTUint8:
+		if (*left.tuint8==*right.tuint8)
+			r=0;
+		else if (*left.tuint8>*right.tuint8)
+			r=1;
+		break;
+	case ECmpTInt16:
+		if (*left.tint16==*right.tint16)
+			r=0;
+		else if (*left.tint16>*right.tint16)
+			r=1;
+		break;	   
+	case ECmpTUint16:
+		if (*left.tuint16==*right.tuint16)
+			r=0;
+		else if (*left.tuint16>*right.tuint16)
+			r=1;
+		break;
+	case ECmpTInt32:
+		if (*left.tint32==*right.tint32) 
+			r=0;
+		else if (*left.tint32>*right.tint32) 
+			r=1;
+		break;	   
+	case ECmpTUint32:
+		if (*left.tuint32==*right.tuint32)
+			r=0;
+		else if (*left.tuint32>*right.tuint32)
+			r=1;
+		break;
+	case ECmpTInt64:
+		if (*left.tint64==*right.tint64) 
+			r=0;
+		else if (*left.tint64>*right.tint64) 
+			r=1;
+		break;	   
+		}
+	return(r);
+	}
+
+
+
+
+EXPORT_C TAny* TKey::At(TInt /*anIndex*/) const
+/**
+Gets a pointer to the key of a specified array element.
+	
+The default implementation raises a USER 35 panic.
+	
+The function is called by TKey::Compare() to compare the keys of two elements.
+	
+The implementation provided by a derived class must convert the index to a 
+pointer to the key within the corresponding element. The implementation depends 
+on the design of the array but, as general rule, use the index value to get 
+a pointer to the corresponding element and then add the TKey protected data 
+member iKeyOffset to this pointer to get a pointer to the key itself.
+	
+By convention, the index value is relative to zero; i.e. a zero value refers 
+to the first element in the array. By this convention, the index can take 
+any value between zero and the number of elements within the array minus one.
+	
+The function must also handle the special index value KIndexPtr. When this 
+value is passed, the function should return a pointer to the key within the 
+sample element. A pointer to the sample element is held in the protected data 
+member iPtr and can be set up using SetPtr().
+	
+The implementation of this function also assumes that the derived class has 
+a pointer to the array itself or has a function for finding it.
+	
+@param anIndex The index of the array element or the special index value KIndexPtr.
+
+@return An untyped pointer to the key within the specified array element or 
+        an untyped pointer to the key within the sample element, if KIndexPtr
+        is passed as an argument.
+
+@panic USER 35, if no replacement function has been provided by a derived class.
+        
+@see TKey::Compare
+@see TKey::SetPtr
+@see KIndexPtr
+*/
+	{
+
+	Panic(ETFuncTKeyVirtualAt);
+	return(NULL);
+	}
+
+
+
+
+EXPORT_C TSwap::TSwap()
+/**
+Default constructor.
+
+The constructor has an empty implementation.
+*/
+	{}
+
+
+
+
+EXPORT_C void TSwap::Swap(TInt /*aLeft*/,TInt /*aRight*/) const
+/**
+Swaps two elements of an array.
+	
+This function is called by User::QuickSort().
+	
+The default implementation raises a USER 36 panic.
+	
+In general, the class must provide a way of translating the indexes representing 
+the two elements into pointers to the elements themselves. The Mem::Swap() 
+utility function can then be used to swap the two elements. This implies that 
+the derived class must contain a pointer to the array itself and have access 
+to other information about the array, such as the length of elements.
+	
+By convention, the index value is relative to zero; i.e. a zero value refers 
+to the first element in the array.
+	
+@param aLeft  The index of an array element participating in the swap
+@param aRight The index of an array element participating in the swap
+
+@panic USER 36, if no replacement function has been provided by a derived class.
+
+@see User::QuickSort
+@see Mem::Swap
+*/
+	{
+
+	Panic(ETFuncTSwapVirtualSwap);
+	}
+
+
+
+
+EXPORT_C TVersion::TVersion()
+/**
+Default constructor.
+
+It sets the major, minor and build numbers to zero.
+*/
+	: iMajor(0),iMinor(0),iBuild(0)
+	{}
+
+
+
+
+EXPORT_C TVersion::TVersion(TInt aMajor,TInt aMinor,TInt aBuild)
+/**
+Constructs the object with the specified major version number, the minor
+version number and the build number.
+
+Note that the constructor does not check that the values passed are within
+the specified ranges. As the parameters are TInt types, care must be taken to
+ensure that values passed do not exceed the specified maxima, otherwise they
+will be interpreted as negative values.
+
+@param aMajor The major version number. This must be a number in the
+              range 0 to 127.
+@param aMinor The minor version number. This must be a number in the
+              range 0 to 99.
+@param aBuild The build number. This must be a number in the range 0 to 32,767.
+
+*/
+	: iMajor((TInt8)aMajor),iMinor((TInt8)aMinor),iBuild((TInt16)aBuild)
+	{}
+
+
+
+
+EXPORT_C TVersionName TVersion::Name() const
+/**
+Gets a descriptor buffer containing the formatted character representation
+of the version information.
+
+The general format of the representation is: xxx.yy(zzzzz)
+
+where:
+
+1. xxx is the major version number; depending on the value, this may have
+   a length of one, two or three characters.
+
+2. yy is the minor version number; this is always two characters, padded
+   with a leading zero, if necessary. 
+
+3. zzzzz is the build number; depending on the value, this may have a length
+   of one to 5 characters.
+
+Note that if the object is constructed with values that exceed the permitted
+range, they will appear negative in their formatted character representation.
+
+@return A buffer descriptor containing the formatted character representation.
+*/
+	{
+
+	TVersionName v;
+	v.AppendNum(iMajor);
+	v.Append(TChar('.'));
+	v.AppendNumFixedWidth(iMinor,EDecimal,2);
+	v.Append(TChar('('));
+	v.AppendNum(iBuild);
+	v.Append(TChar(')'));
+//	v.Format(_L("%d.%02d(%d)"),iMajor,iMinor,iBuild);
+	return(v);
+	}
+
+
+
+
+/**
+Signals the current thread that the asynchronous request associated with the 
+specified request status object is complete.
+
+This function is used to complete an asynchronous request originating in the 
+same thread as the code that is currently executing. If a request originates 
+in another thread, then executing code must use RThread::RequestComplete() 
+to signal the completion of that request.
+
+The request is completed with the completion code passed in aReason. This 
+value is copied into the request status, pointed to by aStatus, before 
+signalling the current thread's request semaphore.
+
+The meaning of the completion code passed in aReason is a matter of convention 
+to be decided between the service requester and the service provider.
+
+@param aStatus A reference to a pointer to the request status object. This 
+               is a pointer into the current thread's address space. 
+               On return, the pointer to the request status is set to NULL.
+               Note that setting the pointer to NULL is a convenience, 
+               not all servers need it, and is done before 
+               the function returns.
+               
+@param aReason The completion code of this request.
+
+@see  RThread::RequestComplete
+*/
+EXPORT_C void User::RequestComplete(TRequestStatus * &aStatus,TInt aReason)
+	{
+#ifndef __TOOLS2__
+	*aStatus=KRequestPending;
+	RThread().RequestComplete(aStatus,aReason);
+#else
+	*aStatus = aReason;
+#endif // __TOOLS2__
+	}
+
+
+
+EXPORT_C TLdrInfo::TLdrInfo()
+//
+// Constructor
+//
+	{
+	memclr(this, sizeof(TLdrInfo));
+	iRequestedVersion = KModuleVersionWild;
+	}
+
+EXPORT_C TPtrC8 TCodeSegCreateInfo::RootName() const
+	{
+	return iFileName.Mid(iRootNameOffset,iRootNameLength);
+	}
+
+EXPORT_C TBool TUid::operator==(const TUid& aUid) const
+/**
+Compares two UIDs for equality.
+
+@param aUid The UID to be compared with this UID.
+
+@return True, if the two UIDs are equal; false otherwise. 
+*/
+	{
+
+	return(iUid==aUid.iUid);
+	}
+
+
+
+
+EXPORT_C TBool TUid::operator!=(const TUid& aUid) const
+/**
+Compares two UIDs for inequality.
+
+@param aUid The UID to be compared with this UID.
+
+@return True, if the two UIDs are unequal; false otherwise. 
+*/
+	{
+
+	return(iUid!=aUid.iUid);
+	}
+
+
+
+
+EXPORT_C TUidName TUid::Name() const
+/**
+Generates and returns the standard text form of the UID.
+
+The resulting text has the form:
+
+@code
+[12345678]
+@endcode
+
+The function always generates 10 characters, where the first and last characters 
+are open and close square brackets enclosing exactly 8 hexadecimal digits 
+(padded to the left with zeroes, if necessary).
+
+@return A modifiable descriptor containing the standard text format of the 
+        UID.
+*/
+	{
+
+	TUidName n;
+	n.Append(TChar('['));
+	n.AppendNumFixedWidth(iUid,EHex,8);
+	n.Append(TChar(']'));
+//	n.Format(_L("[%08x]"),iUid);
+	return(n);
+	}
+
+
+
+
+EXPORT_C TUidType::TUidType()
+/**
+Default constructor.
+
+Creates a UID type, and sets all three component UIDs to KNullUid.
+*/
+    {
+
+	Mem::FillZ(this,sizeof(TUidType));
+    }
+
+
+
+
+EXPORT_C TUidType::TUidType(TUid aUid1)
+/**
+Constructor that creates a UID type and sets the UID1 component
+to the specified value.
+
+The UID2 and UID3 components are set to KNullUid.
+
+@param aUid1 Value for UID1.
+*/
+    {
+
+
+	Mem::FillZ(this,sizeof(TUidType));
+    iUid[0]=aUid1;
+    }
+
+
+
+
+EXPORT_C TUidType::TUidType(TUid aUid1,TUid aUid2)
+/**
+Constructor that creates a UID type and sets the UID1 and UID2 components
+to the specified values. 
+
+The UID3 component is set to KNullUid.
+
+@param aUid1 Value for UID1. 
+@param aUid2 Value for UID2.
+*/
+    {
+
+    iUid[0]=aUid1;
+    iUid[1]=aUid2;
+    iUid[2]=KNullUid;
+    }
+
+
+
+
+EXPORT_C TUidType::TUidType(TUid aUid1,TUid aUid2,TUid aUid3)
+/**
+Constructor that creates a UID type and sets all three UID components
+to the specified values.
+
+@param aUid1 Value for UID1.
+@param aUid2 Value for UID2.
+@param aUid3 Value for UID3.
+*/
+    {
+
+
+    iUid[0]=aUid1;
+    iUid[1]=aUid2;
+    iUid[2]=aUid3;
+    }
+
+
+
+
+EXPORT_C TBool TUidType::operator==(const TUidType& aUidType) const
+/**
+Compares this UID type for equality with the specified UID type.
+
+@param aUidType The UID type to be compared. 
+
+@return True, if each component UID is equal to the corresponding component 
+        UID in the specified UID type; false, otherwise.
+*/
+    {
+
+    return(iUid[0]==aUidType.iUid[0] &&
+           iUid[1]==aUidType.iUid[1] &&
+           iUid[2]==aUidType.iUid[2]);
+    }
+
+
+
+
+EXPORT_C TBool TUidType::operator!=(const TUidType& aUidType) const
+/** 
+Compares this UID type for inequality with the specified UID type.
+
+@param aUidType The UID type to be compared.
+
+@return True, if any component UID is not equal to the corresponding component 
+UID in the specified UID type; false otherwise.
+*/
+    {
+
+
+    return(!(*this==aUidType));
+    }
+
+
+
+
+EXPORT_C const TUid& TUidType::operator[](TInt aIndex) const
+/**
+Gets the UID component as identified by the specified index.
+
+@param aIndex Index value indicating which UID component to return.
+               0 specifies UID1,
+               1 specifies UID2,
+               2 specifies UID3.
+
+@return A reference to the required UID component.
+
+@panic USER 37 if aIndex is not in the range 0 to 2, inclusive.
+*/
+    {
+
+	__ASSERT_ALWAYS(aIndex>=0 && aIndex<KMaxCheckedUid,Panic(ETFuncUidTypeBadIndex));
+	return(iUid[aIndex]);
+    }
+
+
+
+
+EXPORT_C TUid TUidType::MostDerived() const
+/**
+Gets the most derived UID.
+
+Taking the three UID components as a hierarchy with UID1 being the most general, 
+UID2 being more specific than UID1 and UID3 being more specific than UID2, 
+then the function returns:
+
+UID3, if UID3 is not KNullUid.
+
+UID2, if UID2 is not KNullUid.
+
+UID1, otherwise
+
+@return The most derived UID.
+
+@see KNullUid
+*/
+    {
+
+    if (iUid[2]!=KNullUid)
+        return(iUid[2]);
+    if (iUid[1]!=KNullUid)
+        return(iUid[1]);
+    return(iUid[0]);
+    }
+
+
+
+
+EXPORT_C TBool TUidType::IsPresent(TUid aUid) const
+/**
+Tests if any of the component UIDs are equal to the specified UID.
+
+@param aUid The UID to be tested.
+
+@return True, if any one of the component UIDs are the same as the specified 
+        UID; false, if none of the component UIDs are the same.
+*/
+    {
+
+	return(iUid[0]==aUid || iUid[1]==aUid || iUid[2]==aUid);
+    }
+
+
+
+
+EXPORT_C TBool TUidType::IsValid() const
+/**
+Tests the object for a valid (non-KNullUid) UID type.
+
+@return True, if at least one of the component UIDs is not KNullUid; false, 
+        if all component UIDs are KNullUid.
+
+@see KNullUid
+*/
+    {
+
+    return(MostDerived()!=KNullUid);
+    }
+
+
+
+
+EXPORT_C TCheckedUid::TCheckedUid()
+/**
+Default constructor.
+
+Initialises the object to binary zeroes.
+*/
+	{
+
+	Mem::FillZ(this,sizeof(TCheckedUid));
+	}
+
+
+
+
+EXPORT_C TCheckedUid::TCheckedUid(const TUidType& aUidType)
+/**
+Constructor taking an existing Uid type.
+
+The constructor calculates a checksum.
+
+@param aUidType The Uid type to be packaged.
+*/
+	{
+
+    Set(aUidType);
+    }
+
+
+
+
+EXPORT_C TCheckedUid::TCheckedUid(const TDesC8& aPtr)
+/**
+Constructor taking an existing TCheckedUid object encapsulated within
+a descriptor.
+
+The checksum is recalculated and must match the checksum value passed in the 
+encapsulated TCheckedUid object, otherwise the content of this object is reset 
+to binary zeroes.
+
+@param aPtr A pointer to a descriptor containing an existing TCheckedUid object. 
+                        
+@panic USER 38 If the length of the descriptor is not the same as the size 
+       of a TCheckedUid object.
+*/
+	{
+
+	Set(aPtr);
+	}
+
+
+
+
+EXPORT_C void TCheckedUid::Set(const TUidType& aUidType)
+/**
+Sets the specified Uid type to be packaged, and recalculates the checksum.
+
+@param aUidType The Uid type to be packaged.
+*/
+	{
+
+    iType=aUidType;
+    iCheck=Check();
+    }
+
+
+
+
+EXPORT_C void TCheckedUid::Set(const TDesC8& aPtr)
+/**
+Sets an existing TCheckedUid object encapsulated within a descriptor.
+
+The checksum is recalculated and must match the checksum value passed in the 
+encapsulated TCheckedUid object, otherwise the content of this object is reset 
+to binary zeroes.
+
+@param aPtr A pointer to a descriptor containing an existing
+            TCheckedUid object.
+
+@panic USER 38 If the length of the descriptor is not the same as the size 
+       of a TCheckedUid object.
+*/
+	{
+
+	__ASSERT_ALWAYS(aPtr.Length()==sizeof(TCheckedUid),Panic(ETFuncCheckedUidBadSet));
+	Mem::Move(this,aPtr.Ptr(),sizeof(TCheckedUid));
+	if (iCheck!=Check())
+		Mem::FillZ(this,sizeof(TCheckedUid));
+	}
+
+
+
+
+EXPORT_C TPtrC8 TCheckedUid::Des() const
+/**
+Gets a pointer descriptor to represent this object's data.
+
+@return The pointer descriptor for this object's data. The descriptor's length
+        is the same as the length of a TCheckedUid object.
+*/
+	{
+
+	return(TPtrC8((const TUint8*)this,sizeof(TCheckedUid)));
+	}
+
+
+
+
+EXPORT_C TUint TCheckedUid::Check() const
+/**
+Calculates the checksum of the UIDs.
+
+@return The checksum.
+*/
+	{
+
+	return((checkSum(((TUint8*)this)+1)<<16)|checkSum(this));
+	}
+
+#ifndef __TOOLS2__
+EXPORT_C TInt User::InfoPrint(const TDesC& aDes)
+/**
+Invokes the notifier server to display a text message on the screen for a short 
+time. 
+
+@param aDes A reference to the descriptor containing the text to be sent to 
+            the notifier server.
+            
+@return KErrNone if successful, otherwise one of the system-wide error codes.
+
+@see RNotifier
+*/
+	{
+
+	RNotifier notif;
+	TInt r=notif.Connect();
+	if (r!=KErrNone)
+		return(KErrGeneral);
+	r=notif.InfoPrint(aDes);
+	notif.Close();
+	return(r);
+	}
+#endif // __TOOLS2__
+
+static const TUint32 CrcTab32[256] =
+	{
+	0x00000000, 0x77073096, 0xee0e612c, 0x990951ba,
+	0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3,
+	0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,
+	0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91,
+	0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de,
+	0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,
+	0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec,
+	0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5,
+	0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172,
+	0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b,
+	0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940,
+	0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,
+	0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116,
+	0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f,
+	0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
+	0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d,
+	0x76dc4190, 0x01db7106, 0x98d220bc, 0xefd5102a,
+	0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433,
+	0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818,
+	0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01,
+	0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e,
+	0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457,
+	0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea, 0xfcb9887c,
+	0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,
+	0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2,
+	0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb,
+	0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0,
+	0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9,
+	0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086,
+	0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
+	0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4,
+	0x59b33d17, 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad,
+	0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a,
+	0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683,
+	0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8,
+	0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1,
+	0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe,
+	0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7,
+	0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc,
+	0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5,
+	0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252,
+	0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,
+	0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60,
+	0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79,
+	0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
+	0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f,
+	0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04,
+	0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d,
+	0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a,
+	0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713,
+	0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38,
+	0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21,
+	0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8, 0x1fda836e,
+	0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,
+	0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c,
+	0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45,
+	0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2,
+	0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db,
+	0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0,
+	0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
+	0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6,
+	0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf,
+	0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94,
+	0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d
+	};
+
+/**
+Performs a CCITT CRC-32 checksum on the specified data.
+
+On return from this function, the referenced 32 bit integer contains the CRC
+value.
+
+@param aCrc		A reference to a 32 bit integer to contain the CRC value. 
+@param aPtr		A pointer to the start of the data to be checksummed. 
+@param aLength	The length of the data to be checksummed.
+*/
+EXPORT_C void Mem::Crc32(TUint32& aCrc, const TAny* aPtr, TInt aLength)
+	{
+	const TUint8* p = (const TUint8*)aPtr;
+	const TUint8* q = p + aLength;
+	TUint32 crc = aCrc;
+	while (p < q)
+		crc = (crc >> 8) ^ CrcTab32[(crc ^ *p++) & 0xff];
+	aCrc = crc;
+	}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32/euser/us_graph.cpp	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,1392 @@
+// Copyright (c) 1994-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32\euser\us_graph.cpp
+// 
+//
+
+#include "us_std.h"
+
+
+
+
+EXPORT_C TBool TPoint::operator==(const TPoint& aPoint) const
+/**
+Compares two points for equality.
+
+For two points to be equal, both their x and y co-ordinate values must be 
+equal.
+
+@param aPoint The point to be compared with this point.
+
+@return True, if the two points are equal; false, otherwise.
+*/
+	{
+
+	return(iX==aPoint.iX && iY==aPoint.iY);
+	}
+
+
+
+
+EXPORT_C TBool TPoint::operator!=(const TPoint& aPoint) const
+/**
+Compares two points for inequality.
+
+For two points to be unequal, either their x or their y co-ordinate values 
+must be different.
+
+@param aPoint The point to be compared with this point.
+
+@return True, if the two points are unequal; false, otherwise.
+*/
+	{
+
+	return(iX!=aPoint.iX || iY!=aPoint.iY);
+	}
+
+
+
+
+EXPORT_C TPoint& TPoint::operator-=(const TPoint& aPoint)
+/**
+TPoint subtraction assignment operator.
+
+The operator subtracts the specified point from this point, and assigns the 
+result back to this point.
+
+@param aPoint The point to be subtracted.
+
+@return A reference to this point object.
+*/
+	{
+
+	iX-=aPoint.iX;
+	iY-=aPoint.iY;
+	return(*this);
+	}
+
+
+
+
+EXPORT_C TPoint& TPoint::operator-=(const TSize& aSize)
+/**
+TSize subtraction assignment operator.
+
+The operator subtracts the specified TSize from this point, and assigns the 
+result back to this point.
+
+The operation proceeds by:
+
+1. subtracting the width value of the TSize from the x co-ordinate value
+
+2. subtracting the height value of the TSize from the y co-ordinate value
+
+@param aSize The TSize to be subtracted.
+
+@return A reference to this point object.
+*/
+	{
+
+	iX-=aSize.iWidth;
+	iY-=aSize.iHeight;
+	return(*this);
+	}
+
+
+
+
+EXPORT_C TPoint& TPoint::operator+=(const TPoint& aPoint)
+/**
+TPoint addition assignment operator. 
+
+The operator adds the specified point to this point, and assigns the result 
+back to this point.
+
+@param aPoint The point to be added.
+
+@return A reference to this point object.
+*/
+	{
+
+	iX+=aPoint.iX;
+	iY+=aPoint.iY;
+	return(*this);
+	}
+
+
+
+
+EXPORT_C TPoint& TPoint::operator+=(const TSize& aSize)
+/**
+TSize addition assignment operator. 
+
+The operator adds the specified TSize to this point, and assigns the result 
+back to this point.
+
+The operation proceeds by:
+
+1. adding the width value of the TSize to the x co-ordinate value
+
+2. adding the height value of the TSize to the y co-ordinate value
+
+@param aSize The TSize to be added to this point. 
+
+@return A reference to this point object.
+*/
+	{
+
+	iX+=aSize.iWidth;
+	iY+=aSize.iHeight;
+	return(*this);
+	}
+
+
+
+
+EXPORT_C TPoint TPoint::operator-(const TPoint& aPoint) const
+/**
+TPoint subtraction operator.
+
+The operator subtracts the specified point from this point, and returns the 
+resulting value.
+
+@param aPoint The point to be subtracted from this point. 
+
+@return The result of the operation.
+*/
+	{
+
+	TPoint ret=* this;
+	ret-= aPoint;
+	return(ret);
+	}
+
+
+
+
+EXPORT_C TPoint TPoint::operator-(const TSize& aSize) const
+/**
+TSize subtraction operator. 
+
+The operator subtracts the specified TSize from this point, and returns the 
+resulting value.
+
+The operation proceeds by:
+
+1. subtracting the width value of the TSize from the x co-ordinate value
+
+2. subtracting the height value of the TSize from the y co-ordinate value.
+
+@param aSize The TSize to be subtracted.
+
+@return The result of the operation.
+*/
+	{
+
+	TPoint ret=* this;
+	ret-= aSize;
+	return(ret);
+	}
+
+
+
+
+EXPORT_C TPoint TPoint::operator+(const TPoint& aPoint) const
+/**
+The operator adds the specified point to this point, and returns the resulting 
+value.
+
+@param aPoint The point to be added to this point.
+
+@return The result of the operation.
+*/
+	{
+
+	TPoint ret=* this;
+	ret+= aPoint;
+	return(ret);
+	}
+
+
+
+
+EXPORT_C TPoint TPoint::operator+(const TSize& aSize) const
+/**
+TSize addition operator. 
+
+The operator adds the specified TSize to this point, and returns the resulting 
+value.
+
+The operation proceeds by:
+
+1. adding the width value of the TSize to the x co-ordinate value
+
+2. adding the height value of the TSize to the y co-ordinate value.
+
+@param aSize The TSize to be added to this TPoint. 
+
+@return The result of the operation.
+*/
+	{
+
+	TPoint ret=* this;
+	ret+= aSize;
+	return(ret);
+	}
+
+
+
+
+EXPORT_C TPoint TPoint::operator-() const
+/**
+Unary minus operator.
+
+The operator returns the negation of this point.
+
+@return The result of the operation.
+*/
+	{
+
+	return TPoint(-iX,-iY);
+	}
+
+
+
+
+EXPORT_C void TPoint::SetXY(TInt aX,TInt aY)
+/**
+Sets the x and y co-ordinates for this point.
+
+@param aX The value to assign to the x co-ordinate. 
+@param aY The value to assign to the y co-ordinate.
+*/
+	{
+
+	iX=aX;
+	iY=aY;
+	}
+
+
+
+
+EXPORT_C TSize TPoint::AsSize() const
+/**
+Gets the size of the rectangle whose top left hand corner is the origin of 
+the screen co-ordinates and whose bottom right hand corner is this point.
+
+@return The co-ordinates of this point converted to a size.
+*/
+	{
+	return(TSize(iX,iY));
+	}
+
+
+
+
+
+EXPORT_C TBool TPoint3D::operator==(const TPoint3D& aPoint3D) const
+/**
+Compares two 3D points(TPoint3D) for equality.
+
+For two TPoint3D to be equal, their x , y and zco-ordinate values must be 
+equal.
+
+@param aPoint3D The point to be compared with this point.
+
+@return True, if the two points are equal; false, otherwise.
+*/
+	{
+	return(iX==aPoint3D.iX && iY==aPoint3D.iY && iZ==aPoint3D.iZ);
+	}
+
+
+
+
+EXPORT_C TBool TPoint3D::operator!=(const TPoint3D& aPoint3D) const
+/**
+Compares two 3D points for inequality.
+
+For two points to be unequal, their x  or y or z co-ordinate values 
+must be different.
+
+@param aPoint3D The point to be compared with this point.
+
+@return True, if the two points are unequal; false, otherwise.
+*/
+	{
+	return(iX!=aPoint3D.iX || iY!=aPoint3D.iY || iZ!=aPoint3D.iZ);
+	}
+
+
+
+
+
+
+EXPORT_C TPoint3D& TPoint3D::operator-=(const TPoint3D& aPoint3D)
+/**
+TPoint3D subtraction assignment operator.
+
+The operator subtracts the specified point from this point, and assigns the 
+result back to this point.
+
+@param aPoint The point to be subtracted.
+
+@return A reference to this point object.
+*/
+	{
+	iX-=aPoint3D.iX;
+	iY-=aPoint3D.iY;
+	iZ-=aPoint3D.iZ;
+	return(*this);
+	}
+
+
+
+EXPORT_C TPoint3D& TPoint3D::operator-=(const TPoint& aPoint)
+
+/**
+TPoint subtraction assignment operator.
+
+The operator subtracts the specified TPoint from this point(TPoint3D), and assigns the 
+result back to this point.
+
+The operation proceeds by
+subtracting x and y cordinates of the TPoin to this point and no changes  to the Z-coordinatete value
+
+@param aPoint The aPoint to be subtracted.
+
+@return A reference to this point object.
+*/
+	{
+	iX-=aPoint.iX;
+	iY-=aPoint.iY;
+	//No Changes to the z co-ordinate
+	return(*this);
+	}
+
+
+
+EXPORT_C TPoint3D& TPoint3D::operator+=(const TPoint3D& aPoint3D)
+/**
+TPoint3D addition assignment operator. 
+
+The operator adds the specified point to this point, and assigns the result 
+back to this point.
+
+@param aPoint3D The point to be added.
+
+@return A reference to this point object.
+*/
+	{
+	iX+=aPoint3D.iX;
+	iY+=aPoint3D.iY;
+	iZ+=aPoint3D.iZ;
+	return(*this);
+	}
+
+EXPORT_C TPoint3D& TPoint3D::operator+=(const TPoint& aPoint)
+/**
+TPoint addition assignment operator. 
+
+The operator adds the specified TPoint to this point, and assigns the result 
+back to this point.
+
+The operation proceeds by:
+adding  x and y cordinates of the TPoin to this point and no changes  to the Z-coordinatete value
+
+@param aPoint The TPoint to be added to this point. 
+
+@return A reference to this point object.
+*/
+	{
+
+	iX+=aPoint.iX;
+	iY+=aPoint.iY;
+	//No Changes to the z co-ordinate
+	return(*this);
+	}
+EXPORT_C TPoint3D TPoint3D::operator-(const TPoint3D& aPoint3D) const
+/**
+TPoint3D subtraction operator.
+
+The operator subtracts the specified point from this point, and returns the 
+resulting value.
+
+@param aPoint3D The point to be subtracted from this point. 
+
+@return the point(TPoint3D) which is the  result of the operation.
+*/
+	{
+
+	TPoint3D ret=* this;
+	ret-= aPoint3D;
+	return(ret);
+	}
+
+
+
+EXPORT_C TPoint3D TPoint3D::operator-(const TPoint& aPoint) const
+/**
+TPoint subtraction operator. 
+
+The operator subtracts the specified TPoint from this point, and returns the 
+resulting value.
+
+@param aPoint The TPoint to be subtracted.
+
+@return the point(TPoint3D) which is the  result of the operation.
+*/
+	{
+
+	TPoint3D ret=* this;
+	ret-= aPoint;
+	return(ret);
+	}
+
+
+EXPORT_C TPoint3D TPoint3D::operator+(const TPoint3D& aPoint3D) const
+/**
+The operator adds the specified point to this point, and returns the resulting 
+value.
+
+@param aPoint3D The point to be added to this point.
+
+@return the point(TPoint3D) which is the  result of the operation.
+*/
+	{
+
+	TPoint3D ret=* this;
+	ret+= aPoint3D;
+	return(ret);
+	}
+
+EXPORT_C TPoint3D TPoint3D::operator+(const TPoint& aPoint) const
+/**
+TPoint addition operator. 
+
+The operator adds the specified TPoint to this point, and returns the resulting 
+value.
+
+@param aSize The TSize to be added to this TPoint. 
+
+@return the point(TPoint3D) which is the  result of the operation.
+*/
+	{
+
+	TPoint3D ret=* this;
+	ret+= aPoint;
+	return(ret);
+	}
+
+
+EXPORT_C TPoint3D TPoint3D::operator-() const
+/**
+Unary minus operator.
+
+The operator returns the negation of this point.
+
+@return the point(TPoint3D) which is the  result of Unary minus operation.
+*/
+	{
+	return TPoint3D(-iX,-iY,-iZ);
+	}
+
+
+
+EXPORT_C void TPoint3D::SetXYZ(TInt aX,TInt aY,TInt aZ)
+/**
+Sets the x , y and z co-ordinates for this point.
+
+@param aX The value to assign to the x co-ordinate. 
+@param aY The value to assign to the y co-ordinate.
+@param aZ The value to assign to the z co-ordinate.
+*/
+	{
+	iX=aX;
+	iY=aY;
+	iZ=aZ;
+	}
+
+EXPORT_C void TPoint3D::SetPoint(const TPoint& aPoint)
+/*
+TPoint3D from TPoint, sets the Z co-ordinate to  Zero
+@param aPoint The TPoint to add to this point 
+*/
+	{
+	iX=aPoint.iX;
+	iY=aPoint.iY;
+	iZ=0;
+	}
+	
+
+EXPORT_C TPoint TPoint3D::AsPoint() const
+/**
+Gets Tpoint from Tpoint3D
+@return TPoint from X and Y cordinates of Tpoint3D
+*/
+	{
+	return(TPoint(iX,iY));
+	}
+
+
+
+
+
+
+EXPORT_C TBool TSize::operator==(const TSize& aSize) const
+/**
+Compares this TSize with the specified TSize for equality. 
+
+For two TSizes to be equal, both their width and height values must be equal.
+
+@param aSize The TSize to be compared with this TSize.
+
+@return True, if the two TSize are equal; false, otherwise.
+*/
+	{
+	return(iWidth==aSize.iWidth && iHeight==aSize.iHeight);
+	}
+
+
+
+
+EXPORT_C TBool TSize::operator!=(const TSize& aSize) const
+/**
+Compares two TSize for inequality.
+
+For two TSize to be unequal, either their width or height values must be different.
+
+@param aSize The TSize to be compared with this TSize. 
+
+@return True, if the two TSize are unequal; false, otherwise.
+*/
+	{
+	return(iWidth!=aSize.iWidth || iHeight!=aSize.iHeight);
+	}
+
+
+
+
+EXPORT_C TSize& TSize::operator-=(const TSize& aSize)
+/**
+TSize subtraction assignment operator.
+
+The operator subtracts the specified TSize from this TSize, and assigns the 
+result back to this TSize.
+
+@param aSize The TSize to be subtracted. 
+
+@return A reference to this TSize object.
+*/
+	{
+	iWidth-=aSize.iWidth;iHeight-=aSize.iHeight;return(*this);
+	}
+
+
+
+
+EXPORT_C TSize& TSize::operator-=(const TPoint& aPoint)
+/**
+TPoint subtraction assignment operator.
+
+The operator subtracts the specified point from this TSize, and assigns the 
+result back to this TSize.
+
+The operation proceeds by:
+
+1. subtracting the point's x co-ordinate value from the width
+
+2. subtracting the point's y co-ordinate value from the height.
+
+@param aPoint The point to be subtracted.
+
+@return A reference to this size object.
+*/
+	{
+	iWidth-=aPoint.iX;iHeight-=aPoint.iY;return(*this);
+	}
+
+
+
+
+EXPORT_C TSize& TSize::operator+=(const TSize& aSize)
+/**
+TSize addition assignment operator.
+
+The operator adds the specified TSize to this TSize, and assigns the result 
+back to this TSize.
+
+@param aSize The TSize to be added.
+
+@return A reference to this size object.
+*/
+	{
+	iWidth+=aSize.iWidth;iHeight+=aSize.iHeight;return(*this);
+	}
+
+
+
+
+EXPORT_C TSize& TSize::operator+=(const TPoint& aPoint)
+/**
+TPoint addition assignment operator.
+
+The operator adds the specified point to this TSize, and assigns the result 
+back to this TSize.
+
+The operation proceeds by:
+
+1. adding the point's x co-ordinate value to the width
+
+2. adding the point's y co-ordinate value to the height.
+
+@param aPoint The point to be added.
+
+@return A reference to this size object.
+*/
+	{
+	iWidth+=aPoint.iX;iHeight+=aPoint.iY;return(*this);
+	}
+
+
+
+
+EXPORT_C TSize TSize::operator-(const TSize& aSize) const
+/**
+TSize subtraction operator.
+
+This operator subtracts the specified TSize from this TSize, and returns the 
+resulting value.
+
+@param aSize The TSize to be subtracted from this Tsize.
+
+@return The result of the operation.
+*/
+	{
+	TSize ret=* this; ret-= aSize ;return(ret);
+	}
+
+
+
+
+EXPORT_C TSize TSize::operator-(const TPoint& aPoint) const
+/**
+TPoint subtraction operator.
+
+This operator subtracts the specified point from this TSize, and returns the 
+resulting value.
+
+The operation proceeds by:
+
+1. subtracting the x co-ordinate value from the width
+
+2. subtracting the y co-ordinate value from the height
+
+@param aPoint The point to be subtracted.
+
+@return The result of the operation.
+*/
+	{
+	TSize ret=* this; ret-= aPoint ;return(ret);
+	}
+
+
+
+
+EXPORT_C TSize TSize::operator+(const TSize& aSize) const
+/**
+TSize addition operator.
+
+This operator adds the specified TSize to this TSize, and returns the resulting 
+value.
+
+@param aSize The TSize to be added to this Tsize. 
+
+@return The result of the operation.
+*/
+	{
+	TSize ret=* this; ret+= aSize ;return(ret);
+	}
+
+
+
+
+EXPORT_C TSize TSize::operator+(const TPoint& aPoint) const
+/**
+TPoint addition operator.
+
+This operator adds the specified point to this TSize, and returns the resulting 
+value.
+
+The operation proceeds by:
+
+1. adding the x co-ordinate value to the width
+
+2. adding the y co-ordinate value to the height
+
+@param aPoint The point to be added to this TSize. 
+
+@return The result of the operation.
+*/
+	{
+	TSize ret=* this; ret+= aPoint ;return(ret);
+	}
+
+
+
+
+EXPORT_C TSize TSize::operator-() const
+/**
+Unary minus operator.
+
+The operator returns the negation of this TSize.
+
+@return The result of the operation.
+*/
+	{
+
+	return TSize(-iWidth,-iHeight);
+	}
+
+
+
+
+EXPORT_C void TSize::SetSize(TInt aWidth,TInt aHeight)
+/**
+Sets the width and height.
+
+@param aWidth The width value. 
+@param aHeight The height value.
+*/
+	{
+	iWidth=aWidth;iHeight=aHeight;
+	}
+
+
+
+
+EXPORT_C TPoint TSize::AsPoint() const
+/**
+Gets a TPoint object whose co-ordinates are the width and height of this TSize.
+
+@return The co-ordinates of this TSize converted to a point.
+*/
+	{
+	return(TPoint(iWidth,iHeight));
+	}
+
+
+
+
+EXPORT_C TRect::TRect()	: iTl(0,0),iBr(0,0)
+/**
+Constructs a default rectangle.
+
+This initialises the co-ordinates of its top 
+left and bottom right corners to (0,0).
+*/
+	{}
+	
+	
+	
+	
+EXPORT_C TRect::TRect(TInt aAx,TInt aAy,TInt aBx,TInt aBy) : iTl(aAx,aAy),iBr(aBx,aBy)
+/**
+Constructs the rectangle, initialising its top left and bottom right hand corners 
+with four TInt values.
+
+@param aAx The horizontal co-ordinate of the left hand side of the rectangle. 
+@param aAy The vertical co-ordinate of the top of the rectangle. 
+@param aBx The horizontal co-ordinate of the right hand side of the rectangle. 
+@param aBy The vertical co-ordinate of the bottom of the rectangle.
+*/
+	{}
+	
+	
+	
+	
+EXPORT_C TRect::TRect(const TPoint& aPointA,const TPoint& aPointB) : iTl(aPointA),iBr(aPointB)
+/**
+Constructs the rectangle with two TPoints, corresponding to its top left and 
+bottom right hand corners.
+
+@param aPointA The co-ordinates of the rectangle's top left hand corner. 
+@param aPointB The co-ordinates of the rectangle's bottom right hand corner.
+*/
+	{}
+	
+	
+	
+	
+EXPORT_C TRect::TRect(const TPoint& aPoint,const TSize& aSize) : iTl(aPoint),iBr(aPoint+aSize)
+/**
+Constructs the rectangle with a TPoint for its top left corner, and a TSize 
+for its width and height.
+
+@param aPoint The rectangle's top left hand corner. 
+@param aSize  The rectangle's width and height.
+*/
+	{}
+	
+	
+	
+	
+EXPORT_C TRect::TRect(const TSize& aSize) : iTl(0,0), iBr(aSize.iWidth, aSize.iHeight)
+/**
+Constructs the rectangle with a TSize.
+
+The co-ordinates of its top left hand corner are initialised to (0,0) and
+its width and height are initialised to the values contained in the argument.
+
+@param aSize The width and height of the rectangle.
+*/
+	{}
+	
+	
+	
+
+EXPORT_C void TRect::SetRect(TInt aTlX,TInt aTlY,TInt aBrX,TInt aBrY)
+/**
+Sets the rectangle's position using four TInts.
+	
+@param aTlX The horizontal co-ordinate of the left hand side of the rectangle. 
+@param aTlY The vertical co-ordinate of the top of the rectangle. 
+@param aBrX The horizontal co-ordinate of the right hand side of the rectangle. 
+@param aBrY The vertical co-ordinate of the bottom of the rectangle.
+*/
+	{
+	iTl.iX=aTlX;iTl.iY=aTlY;iBr.iX=aBrX;iBr.iY=aBrY;
+	}
+	
+	
+	
+
+EXPORT_C void TRect::SetRect(const TPoint& aPointTL,const TPoint& aPointBR)
+/**
+Sets the rectangle's position using two TPoints.
+
+@param aPointTL The co-ordinates of the rectangle's top left hand corner. 
+@param aPointBR The co-ordinates of the rectangle's bottom right hand corner.
+*/
+	{
+	iTl=aPointTL;iBr=aPointBR;
+	}
+
+
+
+
+EXPORT_C void TRect::SetRect(const TPoint& aTL,const TSize& aSize)
+/**
+Sets the rectangle's position using a TPoint and a TSize.
+	
+@param aTL    The co-ordinates of the rectangle's top left hand corner. 
+@param aSize  The rectangle's width and height.
+*/
+	{
+	iTl=aTL;iBr=aTL+aSize;
+	}
+
+
+
+
+EXPORT_C void TRect::Shrink(TInt aDx,TInt aDy)
+/**
+Shrinks a rectangle using specified horizontal and vertical offsets. 
+
+The offset values are added to the co-ordinates of its top left hand corner, 
+and the same values are subtracted from the co-ordinates of its bottom right 
+hand corner. The co-ordinates of the centre of the rectangle remain unchanged. 
+If either value is negative, the rectangle expands in the corresponding direction.
+
+@param aDx The number of pixels by which to move the left and right hand sides 
+           of the rectangle. A positive value reduces the width, a negative
+           value increases it. 
+@param aDy The number of pixels by which to move the top and bottom of the 
+           rectangle. A positive value reduces the height, a negative value
+           increases it.
+*/
+	{
+	Adjust(aDx,aDy);
+	}
+
+
+
+
+EXPORT_C void TRect::Shrink(const TSize& aSize)
+/**
+Shrinks a rectangle using a specified TSize offset.
+
+The rectangle shrinks by twice the value of the height and width specified 
+in the TSize. The co-ordinates of the centre of the rectangle remain unchanged. 
+If either value is negative, the rectangle expands in the
+corresponding direction.
+
+@param aSize The number of pixels by which to move the left and right hand 
+             sides of the rectangle (by aSize.iWidth) and the top and bottom
+             (by aSize.iHeight).
+*/
+	{
+	Adjust(aSize.iWidth,aSize.iHeight);
+	}
+
+
+
+
+EXPORT_C void TRect::Resize(const TSize& aSize)
+/**
+Resizes a rectangle by adding a TSize offset.
+
+The offset is added to the co-ordinates of its bottom right hand corner. If 
+either value in the TSize is negative, the rectangle shrinks in the
+corresponding direction. The co-ordinates of the rectangle's top left hand
+corner are unaffected.
+
+@param aSize The number of pixels by which to move the rectangle; the right 
+             hand side by aSize.iWidth and the bottom by aSize.iHeight.
+*/
+	{
+	iBr+=aSize;
+	}
+
+
+
+
+EXPORT_C void TRect::Resize(TInt aDx, TInt aDy)
+/**
+Resizes a rectangle by adding a horizontal and vertical offset.
+
+The offset is added to the co-ordinates of its bottom right hand corner. If 
+either value is negative, the rectangle shrinks in the corresponding direction.
+The co-ordinates of the rectangle's top left hand corner are unaffected.
+
+@param aDx The number of pixels by which to move the right hand side of the 
+           rectangle. 
+@param aDy The number of pixels by which to move the bottom of the rectangle.
+*/
+	{
+	iBr.iX+=aDx;iBr.iY+=aDy;
+	}
+
+
+
+
+EXPORT_C TBool TRect::operator==(const TRect &aRect) const
+/**
+Compares two rectangles for equality.
+
+For two rectangles to be equal, the co-ordinates of both their top left and 
+bottom right hand corners must be equal.
+
+@param aRect The rectangle to compare with this rectangle.
+
+@return True, if the rectangles have the same co-ordinates; false, otherwise.
+*/
+	{
+
+	return(iTl==aRect.iTl && iBr==aRect.iBr);
+	}
+
+
+
+
+EXPORT_C TBool TRect::operator!=(const TRect &aRect) const
+/**
+Compares two rectangles for inequality.
+
+Two rectangles are unequal if any of their co-ordinates differ.
+
+@param aRect The rectangle to compare with this rectangle.
+@return True, if the rectangles do not have the same co-ordinates; false, if 
+        all co-ordinates are equal.
+*/
+	{
+
+	return(iTl!=aRect.iTl || iBr!=aRect.iBr);
+	}
+
+
+
+
+EXPORT_C void TRect::Move(const TPoint &aOffset)
+/**
+Moves the rectangle by adding a TPoint offset.
+
+The offset is added to the co-ordinates of both its top left and bottom right 
+hand corners. The size of the rectangle is unchanged.
+
+@param aOffset The number of pixels to move the rectangle; horizontally by 
+               aOffset.iX and vertically by aOffset.iY.
+*/
+	{
+
+	iTl+=aOffset;
+	iBr+=aOffset;
+	}
+
+
+
+
+EXPORT_C void TRect::Move(TInt aDx,TInt aDy)
+/**
+Moves the rectangle by adding an x, y offset.
+
+The offset is added to the co-ordinates of both its top left and bottom right 
+hand corners. The size of the rectangle is unchanged.
+
+@param aDx The number of pixels to move the rectangle horizontally. If negative, 
+           the rectangle moves leftwards. 
+@param aDy The number of pixels to move the rectangle vertically. If negative, 
+           the rectangle moves upwards.
+*/
+	{
+
+	iTl.iX+=aDx;
+	iTl.iY+=aDy;
+	iBr.iX+=aDx;
+	iBr.iY+=aDy;
+	}
+
+
+
+
+// private function, hence not exported
+void TRect::Adjust(TInt aDx,TInt aDy)
+//
+// Adjust by a delta.
+//
+	{
+
+	iTl.iX+=aDx;
+	iTl.iY+=aDy;
+	iBr.iX-=aDx;
+	iBr.iY-=aDy;
+	}
+
+
+
+
+EXPORT_C void TRect::Grow(TInt aDx,TInt aDy)
+//
+// Grow by a delta.
+//
+/**
+Grows the rectangle using the specified horizontal and vertical offsets.
+
+The offset values are subtracted from the co-ordinates of its top left hand 
+corner, and the same values are added to the co-ordinates of its bottom right 
+hand corner. The co-ordinates of the centre of the rectangle remain unchanged. 
+If either value is negative, the rectangle shrinks in the corresponding direction.
+
+@param aDx The number of pixels by which to move the left and right hand sides 
+           of the rectangle. A positive value increases the width, a negative
+           value reduces it. 
+@param aDy The number of pixels by which to move the top and bottom of the 
+           rectangle. A positive value increases the height, a negative
+           value reduces it.
+*/
+	{
+
+	iTl.iX-=aDx;
+	iTl.iY-=aDy;
+	iBr.iX+=aDx;
+	iBr.iY+=aDy;
+	}
+
+
+
+
+EXPORT_C void TRect::Grow(const TSize &aSize)
+//
+// Grow by a size.
+//
+/**
+Grows a rectangle using the specified TSize offset.
+
+The rectangle grows by twice the value of the height and width specified in 
+the TSize. The co-ordinates of the centre of the rectangle remain unchanged. 
+If either value is negative, the rectangle shrinks in the
+corresponding direction.
+
+@param aSize The number of pixels by which to move the left and right hand 
+             sides of the rectangle (by aSize.iWidth) and the top and bottom
+             (by aSize.iHeight).
+*/
+	{
+
+	iTl-=aSize;
+	iBr+=aSize;
+	}
+
+
+
+
+EXPORT_C void TRect::BoundingRect(const TRect &aRect)
+//
+// Union of this and aRect, a union is defined as the minimum rectangle that encloses
+// both source rectangles
+//
+/** 
+Gets the minimal rectangle which bounds both this rectangle and the specified 
+rectangle, and assigns it to this rectangle.
+
+@param aRect The rectangle to use with this rectangle to get the minimal bounding 
+             rectangle.
+*/
+	{
+
+	if (iTl.iX>aRect.iTl.iX)
+		iTl.iX=aRect.iTl.iX;
+	if (iTl.iY>aRect.iTl.iY)
+		iTl.iY=aRect.iTl.iY;
+	if (iBr.iX<aRect.iBr.iX)
+		iBr.iX=aRect.iBr.iX;
+	if (iBr.iY<aRect.iBr.iY)
+		iBr.iY=aRect.iBr.iY;
+	}
+
+
+
+
+EXPORT_C TBool TRect::IsEmpty() const
+//
+// True if the rectangle is empty.
+//
+/**
+Tests whether the rectangle is empty.
+
+@return True, if empty; false, if not.
+*/
+	{
+
+	return(iTl.iX>=iBr.iX || iTl.iY>=iBr.iY);
+	}
+
+
+
+
+EXPORT_C void TRect::Intersection(const TRect &aRect)
+//
+// Intersect this with aRect.
+//
+/**
+Gets the area of intersection between this rectangle and the specified
+rectangle, and assigns it to this rectangle.
+
+It is usual to call TRect::Intersects() first to verify whether the two rectangles 
+intersect. If the two rectangles do not intersect, then, on return, this rectangle 
+is set to be empty.
+
+@param aRect The rectangle to be used with this rectangle to get the area
+             of intersection.
+             
+@see TRect::Intersects             
+*/
+	{
+
+	if (iTl.iX<aRect.iTl.iX)
+		iTl.iX=aRect.iTl.iX;
+	if (iTl.iY<aRect.iTl.iY)
+		iTl.iY=aRect.iTl.iY;
+	if (iBr.iX>aRect.iBr.iX)
+		iBr.iX=aRect.iBr.iX;
+	if (iBr.iY>aRect.iBr.iY)
+		iBr.iY=aRect.iBr.iY;
+	}
+
+
+
+
+EXPORT_C TBool TRect::Intersects(const TRect &aRect) const
+//
+// If aRect Intersects with this return True.
+//
+/**
+Tests whether this rectangle overlaps with the specified rectangle.
+
+Two rectangles overlap if any point is located within both rectangles. There 
+is no intersection if two adjacent sides touch without overlapping, or if 
+either rectangle is empty.
+
+@param aRect The rectangle to compare with this rectangle for an intersection. 
+
+@return True, if the two rectangles overlap; false, if there is no overlap.
+*/
+	{
+
+	return(!(IsEmpty() || aRect.IsEmpty() || iBr.iX<=aRect.iTl.iX || iBr.iY<=aRect.iTl.iY || iTl.iX>=aRect.iBr.iX || iTl.iY>=aRect.iBr.iY));
+	}
+
+
+
+
+EXPORT_C void TRect::Normalize()
+//
+// Make the conditions top left bottom right true.
+//
+/**
+Ensures that the rectangle's width and height have positive values.
+
+For example, if the rectangle's co-ordinates are such that the top is below 
+the bottom, or the right hand side is to the left of the left hand side, normalisation 
+swaps the co-ordinates of the top and bottom or of the left and right.
+*/
+	{
+
+	if (iTl.iX>iBr.iX)
+		{
+		TInt temp=iTl.iX;
+		iTl.iX=iBr.iX;
+		iBr.iX=temp;
+		}
+	if (iTl.iY>iBr.iY)
+		{
+		TInt temp=iTl.iY;
+		iTl.iY=iBr.iY;
+		iBr.iY=temp;
+		}
+	}
+
+
+
+
+EXPORT_C TBool TRect::Contains(const TPoint &aPoint) const
+/**
+Tests whether a point is located within the rectangle.
+
+Note that a point located on the top or left hand side of the rectangle is 
+within the rectangle. A point located on the right hand side or bottom is 
+considered to be outside the rectangle.
+
+@param aPoint The point to be tested.
+
+@return True, if the point is within the rectangle; false, otherwise.
+*/
+	{
+	if (aPoint.iX<iTl.iX || aPoint.iX>=iBr.iX || aPoint.iY<iTl.iY || aPoint.iY>=iBr.iY)
+		return(EFalse);
+	return(ETrue);
+	}
+
+
+
+
+EXPORT_C TSize TRect::Size() const
+/**
+Gets the size of the rectangle.
+
+@return The size of the rectangle.
+*/
+	{
+	return((iBr-iTl).AsSize());
+	}
+
+
+
+
+EXPORT_C TInt TRect::Width() const
+/**
+Gets the width of the rectangle.
+
+@return The width of the rectangle.
+*/
+	{
+	return(iBr.iX-iTl.iX);
+	}
+
+
+
+
+EXPORT_C TInt TRect::Height() const
+/**
+Gets the height of the rectangle.
+
+@return The height of the rectangle.
+*/
+	{
+	return(iBr.iY-iTl.iY);
+	}
+
+
+
+
+EXPORT_C TBool TRect::IsNormalized() const
+/**
+Tests whether the rectangle is normalised.
+
+A rectangle is normalised when its width and height are both zero or greater.
+
+@return True, if normalised; false, if not.
+*/
+	{
+	return((iBr.iX>=iTl.iX) && (iBr.iY>=iTl.iY));
+	}
+
+
+
+
+EXPORT_C TPoint TRect::Center() const
+/**
+Gets the point at the centre of the rectangle.
+
+@return The point at the centre of the rectangle.
+*/
+	{
+	return(TPoint((iTl.iX+iBr.iX)/2,(iTl.iY+iBr.iY)/2));
+	}
+
+
+
+
+EXPORT_C void TRect::SetSize(const TSize &aSize)
+/**
+Sets the size of the rectangle.
+
+Only the co-ordinates of the bottom right hand corner of the rectangle are 
+affected.
+
+@param aSize The new width is aSize.iWidth. The new height is aSize.iHeight.
+*/
+	{
+	iBr=iTl+aSize;
+	}
+
+
+
+
+EXPORT_C void TRect::SetWidth(TInt aWidth)
+/**
+Sets the width of the rectangle.
+
+Only the position of the rectangle's right hand side is affected.
+
+@param aWidth The new width of the rectangle.
+*/
+	{
+	iBr.iX=iTl.iX+aWidth;
+	}
+
+
+
+
+EXPORT_C void TRect::SetHeight(TInt aHeight)
+/**
+Sets the height of the rectangle.
+
+Only the position of the bottom of the rectangle is affected.
+
+@param aHeight The new height of the rectangle.
+*/
+	{
+	iBr.iY=iTl.iY+aHeight;
+	}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32/euser/us_htab.cpp	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,669 @@
+// Copyright (c) 2005-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32/euser/us_htab.cpp
+// 
+//
+
+#include "us_std.h"
+#include <e32hashtab.h>
+
+const TUint KDefaultIndexBits = 4;
+const TUint KMaxIndexBits = 28;
+
+extern TUint32 DefaultIntegerHash(const TAny*);
+extern TUint32 DefaultStringHash(const TUint8*, TInt);
+extern TUint32 DefaultWStringHash(const TUint16*, TInt);
+
+#define	_DEBUG_HASH_TABLE
+#ifndef	_DEBUG
+#undef	_DEBUG_HASH_TABLE
+#endif
+
+#define __PANIC(x) Panic(x)
+
+EXPORT_C RHashTableBase::RHashTableBase(TGeneralHashFunction32 aHash, TGeneralIdentityRelation aId, TInt aElementSize, TInt aKeyOffset)
+	:	iHashFunc(aHash),
+		iIdFunc(aId),
+		iIndexBits(TUint8(KDefaultIndexBits)),
+		iGeneration(EGen0),
+		iPad0(0),
+		iElements(0),
+		iCount(0),
+		iPad1(0),
+		iPad2(0)
+	{
+	__ASSERT_ALWAYS(aHash!=NULL, __PANIC(EHashTableNoHashFunc));
+	__ASSERT_ALWAYS(aId!=NULL, __PANIC(EHashTableNoIdentityRelation));
+	__ASSERT_ALWAYS(aElementSize>0, __PANIC(EHashTableBadElementSize));
+	__ASSERT_ALWAYS(aKeyOffset==0 || TUint(aKeyOffset-4)<(TUint)Min(252,aElementSize-4), __PANIC(EHashTableBadKeyOffset));
+	iElementSize = aElementSize;
+	iKeyOffset = (TUint8)aKeyOffset;	// 0 means ptr at offset 4
+	iEmptyCount = 0;
+	SetThresholds();
+	}
+
+void RHashTableBase::SetThresholds()
+	{
+	TUint32 max = 1u << iIndexBits;
+	if (iIndexBits == KMaxIndexBits)
+		iUpperThreshold = KMaxTUint;
+	else
+		iUpperThreshold = (max>>1) + (max>>2);	// 3/4 of max
+	if (iIndexBits == KDefaultIndexBits)
+		iLowerThreshold = 0;
+	else
+		iLowerThreshold = max >> 2;				// 1/4 of max
+
+	// clean table if <1/8 of entries empty
+	iCleanThreshold = max>>3;
+	}
+
+EXPORT_C void RHashTableBase::Close()
+	{
+	User::Free(iElements);
+	new (this) RHashTableBase(iHashFunc, iIdFunc, iElementSize, iKeyOffset);
+	}
+
+EXPORT_C TInt RHashTableBase::Count() const
+	{
+	return (TInt)iCount;
+	}
+
+EXPORT_C TAny* RHashTableBase::Find(const TAny* aKey, TInt aOffset) const
+	{
+	if (!iElements)
+		return NULL;
+	TUint32 hash = (*iHashFunc)(aKey);
+	TUint32 ix = hash >> (32 - iIndexBits);		// top bits of hash used as initial index
+	hash = (hash &~ EStateMask) | iGeneration;
+	TUint32 mask = (1u << iIndexBits) - 1;		// iIndexBits 1's
+	TUint32 step = (hash >> 1) & mask;			// iIndexBits-1 LSBs of hash followed by 1
+	FOREVER
+		{
+		const SElement* e = ElementC(ix);
+		if (e->iHash==hash && (*iIdFunc)(aKey, GetKey(e)))
+			{
+			if (aOffset >= 0)
+				return ((TUint8*)e) + aOffset;
+			return *(TAny**)((TUint8*)e - aOffset);
+			}
+		if (e->IsEmpty())
+			break;
+		ix = (ix + step) & mask;
+		}
+	return NULL;
+	}
+
+EXPORT_C TAny* RHashTableBase::FindL(const TAny* aKey, TInt aOffset) const
+	{
+	TAny* p = Find(aKey, aOffset);
+	if (!p)
+		User::Leave(KErrNotFound);
+	return p;
+	}
+
+TInt RHashTableBase::Insert(const TAny* aKey, TAny*& aElement)
+	{
+	TInt r = KErrNone;
+	TUint32 max = 1u << iIndexBits;
+	if (!iElements)
+		{
+		iElements = User::AllocZ(max * iElementSize);
+		if (!iElements)
+			return KErrNoMemory;
+		iEmptyCount = max;
+		}
+	else if (iCount > iUpperThreshold)
+		{
+		r = ExpandTable(iIndexBits+1);
+		if (iEmptyCount>1)
+			r = KErrNone;	// doesn't matter if expand fails unless there is only one empty slot left
+		max = 1u << iIndexBits;
+		}
+	else if (iEmptyCount < iCleanThreshold)
+		ReformTable(iIndexBits);
+
+	TUint32 hash = (*iHashFunc)(aKey);
+	TUint32 ix = hash >> (32 - iIndexBits);
+	TUint32 mask = max - 1;
+	hash = (hash &~ EStateMask) | iGeneration;
+	TUint32 step = (hash >> 1) & mask;			// iIndexBits-1 LSBs of hash followed by 1
+	SElement* e = 0;
+	SElement* d = 0;
+	FOREVER
+		{
+		e = Element(ix);
+		if (e->IsEmpty())
+			break;
+		if (e->IsDeleted())
+			{
+			if (!d)
+				d = e;
+			}
+		else if (e->iHash==hash && (*iIdFunc)(aKey, GetKey(e)))
+			{
+			aElement = e;
+			return KErrNone;	// duplicate so always succeed
+			}
+		ix = (ix + step) & mask;
+		}
+	if (d)
+		e = d;		// if we can reuse a deleted slot, always succeed
+	else
+		{
+		if (r!=KErrNone)
+			return r;	// new slot needed - if we failed to expand, fail the request here
+		--iEmptyCount;
+		}
+	e->iHash = hash;
+	aElement = e;
+	++iCount;
+	return KErrNone;
+	}
+
+EXPORT_C TInt RHashTableBase::PtrInsert(const TAny* aKey, const TAny* aValue)
+	{
+	const TAny** e;
+	TInt r = Insert(aKey, (TAny*&)e);
+	if (r==KErrNone)
+		{
+		e[1] = aKey;
+		if (iElementSize>=12)
+			e[2] = aValue;
+		}
+	return r;
+	}
+
+EXPORT_C void RHashTableBase::PtrInsertL(const TAny* aKey, const TAny* aValue)
+	{
+	const TAny** e;
+	User::LeaveIfError(Insert(aKey, (TAny*&)e));
+	e[1] = aKey;
+	if (iElementSize>=12)
+		e[2] = aValue;
+	}
+
+EXPORT_C TInt RHashTableBase::ValueInsert(const TAny* aKey, TInt aKeySize, const TAny* aValue, TInt aValueOffset, TInt aValueSize)
+	{
+	TUint8* e;
+	TInt r = Insert(aKey, (TAny*&)e);
+	if (r==KErrNone)
+		{
+		memcpy(e+iKeyOffset, aKey, aKeySize);
+		if (aValue)
+			memcpy(e+aValueOffset, aValue, aValueSize);
+		}
+	return r;
+	}
+
+EXPORT_C void RHashTableBase::ValueInsertL(const TAny* aKey, TInt aKeySize, const TAny* aValue, TInt aValueOffset, TInt aValueSize)
+	{
+	TUint8* e;
+	User::LeaveIfError(Insert(aKey, (TAny*&)e));
+	memcpy(e+iKeyOffset, aKey, aKeySize);
+	if (aValue)
+		memcpy(e+aValueOffset, aValue, aValueSize);
+	}
+
+EXPORT_C TInt RHashTableBase::Remove(const TAny* aKey)
+	{
+	SElement* e = (SElement*)Find(aKey);
+	if (!e)
+		return KErrNotFound;
+	e->SetDeleted();
+	if (--iCount == 0)
+		{
+		Close();
+		return KErrNone;
+		}
+	if (iCount < iLowerThreshold)
+		ShrinkTable();
+	return KErrNone;
+	}
+
+void RHashTableBase::ReformTable(TUint aNewIndexBits)
+	{
+	if (!iElements)
+		return;
+	TUint32 max = 1u << iIndexBits;
+	TUint32 newmax = 1u << aNewIndexBits;
+	TUint32 newmask = newmax - 1;
+	TUint32 ix = 0;
+	TUint32 newsh = 32 - aNewIndexBits;
+	iGeneration ^= 1;	// change generation so we know which entries have been updated
+	for (; ix < max; ++ix)
+		{
+		SElement* e = Element(ix);
+		if (e->IsEmpty())
+			continue;		// skip empty entries
+		if (e->IsDeleted())
+			{
+			e->SetEmpty();	// mark deleted entries as empty
+			continue;
+			}
+		if ((e->iHash & EStateMask) == iGeneration)	// entry has been processed so leave it alone
+			continue;
+		TUint32 pos = e->iHash >> newsh;
+		if (pos == ix)
+			{
+			e->iHash ^= 1;		// entry is in first position for its hash so leave it there
+			continue;
+			}
+		TUint32 step = (e->iHash >> 1) & newmask;
+		FOREVER
+			{
+			SElement* d = Element(pos);
+			if (d->IsEmptyOrDeleted())
+				{
+				memcpy(d, e, iElementSize);
+				d->iHash &= ~EStateMask;
+				d->iHash |= iGeneration;	// mark it as processed
+				e->SetEmpty();				// remove old entry
+				break;
+				}
+			if ((d->iHash & EStateMask) != iGeneration)
+				{
+				if (pos == ix)
+					{
+					e->iHash ^= 1;		// entry is already in correct position so leave it there
+					break;
+					}
+				if ((d->iHash >> newsh) == pos)
+					{
+					// candidate for replacement is in correct position so leave it and look elsewhere
+					d->iHash ^= 1;
+					}
+				else
+					{
+					Mem::Swap(d, e, iElementSize);	// switch entries
+					d->iHash ^= 1;		// mark entry as processed
+					--ix;				// process current position again
+					break;
+					}
+				}
+			pos = (pos + step) & newmask;
+			}
+		}
+	iIndexBits = (TUint8)aNewIndexBits;
+	iEmptyCount = newmax - iCount;
+	SetThresholds();
+#ifdef _DEBUG_HASH_TABLE
+	VerifyReform();
+#endif
+	}
+
+#ifdef _DEBUG_HASH_TABLE
+void RHashTableBase::VerifyReform()
+	{
+	TUint32 dcount;
+	ConsistencyCheck(&dcount);
+	__ASSERT_ALWAYS(dcount==0, __PANIC(EHashTableDeletedEntryAfterReform));
+	}
+#endif
+
+EXPORT_C void RHashTableBase::ConsistencyCheck(TUint32* aDeleted, TUint32* aComparisons, TUint32 aChainLimit, TUint32* aChainInfo)
+	{
+#ifdef _DEBUG_HASH_TABLE
+	TUint32 count = 0;
+	TUint32 dcount = 0;
+	TUint32 ecount = 0;
+	TUint32 max = 1u << iIndexBits;
+	TUint32 mask = max - 1;
+	TUint32 sh = 32 - iIndexBits;
+	TUint32 ix = 0;
+	TUint32 cmp = 0;
+	if (aChainInfo)
+		memclr(aChainInfo, aChainLimit*sizeof(TUint32));
+	if (iElements)
+		{
+		for (ix = 0; ix < max; ++ix)
+			{
+			SElement* e = Element(ix);
+			if (e->IsEmpty())
+				{
+				++ecount;
+				continue;
+				}
+			if (e->IsDeleted())
+				{
+				++dcount;
+				continue;
+				}
+			++count;
+			__ASSERT_ALWAYS((e->iHash & EStateMask) == iGeneration, __PANIC(EHashTableBadGeneration));
+			TUint32 hash = (*iHashFunc)(GetKey(e));
+			hash = (hash &~ EStateMask) | iGeneration;
+			__ASSERT_ALWAYS(e->iHash == hash, __PANIC(EHashTableBadHash));
+
+			TUint32 pos = hash >> sh;
+			TUint32 step = (hash >> 1) & mask;
+			SElement* f = 0;
+			TUint32 cl = 0;
+			FOREVER
+				{
+				f = Element(pos);
+				if (f->IsEmpty())
+					{
+					f = 0;
+					break;
+					}
+				++cl;
+				if (!f->IsDeleted() && f->iHash==hash)
+					{
+					++cmp;
+					if (e==f || (*iIdFunc)(GetKey(e), GetKey(f)))
+						break;
+					}
+				pos = (pos + step) & mask;
+				}
+			__ASSERT_ALWAYS(e==f, __PANIC(EHashTableEntryLost));
+			if (aChainInfo && cl<aChainLimit)
+				++aChainInfo[cl];
+			}
+		}
+	if (aDeleted)
+		*aDeleted = dcount;
+	if (aComparisons)
+		*aComparisons = cmp;
+	__ASSERT_ALWAYS(iCount==count, __PANIC(EHashTableCountWrong));
+	__ASSERT_ALWAYS(iEmptyCount==ecount, __PANIC(EHashTableEmptyCountWrong));
+#else
+	if (aDeleted)
+		*aDeleted = KMaxTUint;
+	if (aComparisons)
+		*aComparisons = KMaxTUint;
+	if (aChainInfo)
+		memclr(aChainInfo, aChainLimit*sizeof(TUint32));
+#endif
+	}
+
+void RHashTableBase::ShrinkTable()
+	{
+	ReformTable(iIndexBits - 1);
+	TUint32 max = 1u << iIndexBits;
+	iElements = User::ReAlloc(iElements, max * iElementSize);
+	}
+
+TInt RHashTableBase::ExpandTable(TInt aNewIndexBits)
+	{
+	TUint32 newmax = 1u << aNewIndexBits;
+	if (!iElements)
+		{
+		iElements = User::AllocZ(newmax * iElementSize);
+		if (!iElements)
+			return KErrNoMemory;
+		iIndexBits = (TUint8)aNewIndexBits;
+		iEmptyCount = newmax;
+		SetThresholds();
+		return KErrNone;
+		}
+	TUint32 max = 1u << iIndexBits;
+	TAny* p = User::ReAlloc(iElements, newmax * iElementSize);
+	if (!p)
+		return KErrNoMemory;
+	iElements = p;
+	memclr(Element(max), (newmax-max)*iElementSize);
+	ReformTable(aNewIndexBits);
+	return KErrNone;
+	}
+
+EXPORT_C TInt RHashTableBase::Reserve(TInt aCount)
+	{
+	__ASSERT_ALWAYS((TUint)aCount<0x40000000u, __PANIC(EHashTableBadReserveCount));
+	TInt new_ixb = iIndexBits;
+	TUint grow_threshold = iUpperThreshold;
+	while (TUint(aCount) > grow_threshold)
+		{
+		grow_threshold <<= 1;
+		++new_ixb;
+		}
+	// Expand the table if it isn't large enough to fit aCount elements in it
+	// or if the table hasn't yet been created, create it with ExpandTable
+	if (new_ixb > TInt(iIndexBits) || !iElements)
+		{
+		return ExpandTable(new_ixb);
+		}
+	return KErrNone;
+	}
+
+EXPORT_C void RHashTableBase::ReserveL(TInt aCount)
+	{
+	User::LeaveIfError(Reserve(aCount));
+	}
+
+EXPORT_C THashTableIterBase::THashTableIterBase(const RHashTableBase& aTable)
+	:	iTbl(aTable), iIndex(-1), iPad1(0), iPad2(0)
+	{
+	}
+
+EXPORT_C void THashTableIterBase::Reset()
+	{
+	iIndex = -1;
+	}
+
+EXPORT_C const TAny* THashTableIterBase::Next(TInt aOffset)
+	{
+	TInt max = 1 << iTbl.iIndexBits;
+	if (!iTbl.iElements)
+		return NULL;
+	__ASSERT_DEBUG(iIndex>=-1 && iIndex<=max, __PANIC(EHashTableIterNextBadIndex));
+	if (iIndex < max)
+		++iIndex;
+	for(; iIndex < max; ++iIndex)
+		{
+		const RHashTableBase::SElement* e = iTbl.ElementC(iIndex);
+		if (!e->IsEmptyOrDeleted())
+			{
+			if (aOffset >= 0)
+				return (TUint8*)e + aOffset;
+			return *(const TAny**)((TUint8*)e - aOffset);
+			}
+		}
+	return NULL;
+	}
+
+EXPORT_C const TAny* THashTableIterBase::Current(TInt aOffset) const
+	{
+	TInt max = 1 << iTbl.iIndexBits;
+	if (!iTbl.iElements || iIndex<0 || iIndex>=max)
+		return NULL;
+	const RHashTableBase::SElement* e = iTbl.ElementC(iIndex);
+	__ASSERT_DEBUG(!e->IsEmptyOrDeleted(), __PANIC(EHashTableIterCurrentBadIndex));
+	if (aOffset >= 0)
+		return (TUint8*)e + aOffset;
+	return *(const TAny**)((TUint8*)e - aOffset);
+	}
+
+EXPORT_C void THashTableIterBase::RemoveCurrent()
+	{
+	TInt max = 1 << iTbl.iIndexBits;
+	if (!iTbl.iElements || iIndex<0 || iIndex>=max)
+		return;
+	RHashTableBase& tbl = (RHashTableBase&)iTbl;
+	RHashTableBase::SElement* e = tbl.Element(iIndex);
+	__ASSERT_DEBUG(!e->IsEmptyOrDeleted(), __PANIC(EHashTableIterCurrentBadIndex));
+
+	// mark entry as deleted but don't shrink the array since that will mess up the iteration
+	e->SetDeleted();
+	if (--tbl.iCount == 0)
+		{
+		memclr(tbl.iElements, max * tbl.iElementSize);
+		tbl.iEmptyCount = max;
+		tbl.iGeneration = RHashTableBase::EGen0;
+		}
+	}
+
+/**
+@publishedAll
+@released
+
+Calculate a 32 bit hash from an 8 bit descriptor.
+
+@param	aDes	The descriptor to be hashed.
+@return			The calculated 32 bit hash value.
+*/
+EXPORT_C TUint32 DefaultHash::Des8(const TDesC8& aDes)
+	{
+	return DefaultStringHash(aDes.Ptr(), aDes.Length());
+	}
+
+
+/**
+@publishedAll
+@released
+
+Calculate a 32 bit hash from a 16 bit descriptor.
+
+@param	aDes	The descriptor to be hashed.
+@return			The calculated 32 bit hash value.
+*/
+EXPORT_C TUint32 DefaultHash::Des16(const TDesC16& aDes)
+	{
+	return DefaultWStringHash(aDes.Ptr(), aDes.Size());
+	}
+
+
+/**
+@publishedAll
+@released
+
+Calculate a 32 bit hash from a TInt pointer.
+
+@param	aPtr	The TInt pointer to be hashed.
+@return			The calculated 32 bit hash value.
+*/
+EXPORT_C TUint32 DefaultHash::IntegerPtr(TInt* const& aPtr)
+	{
+	return Integer((TInt)aPtr);
+	}
+
+/**
+@publishedAll
+@released
+
+Calculate a 32 bit hash from a TDesC8 pointer.
+
+@param	aPtr	The TDesC8 pointer to be hashed.
+@return			The calculated 32 bit hash value.
+*/
+EXPORT_C TUint32 DefaultHash::Des8Ptr(TDesC8* const& aPtr)
+	{
+	return Integer((TInt)aPtr);
+	}
+
+/**
+@publishedAll
+@released
+
+Calculate a 32 bit hash from a TDesC16 pointer.
+
+@param	aPtr	The TDesC16 pointer to be hashed.
+@return			The calculated 32 bit hash value.
+*/
+EXPORT_C TUint32 DefaultHash::Des16Ptr(TDesC16* const& aPtr)
+	{
+	return Integer((TInt)aPtr);
+	}
+
+/**
+@publishedAll
+@released
+
+Compare two integers for equality.
+
+@param	aA	The first integer to be compared
+@param	aB	The second integer to be compared
+@return		ETrue if the arguments are equal, EFalse otherwise.
+*/
+EXPORT_C TBool DefaultIdentity::Integer(const TInt& aA, const TInt& aB)
+	{
+	return aA == aB;
+	}
+
+
+/**
+@publishedAll
+@released
+
+Compare two 8 bit descriptors for exact binary equality.
+
+@param	aA	The first integer to be compared
+@param	aB	The second integer to be compared
+@return		ETrue if the arguments are identical, EFalse otherwise.
+*/
+EXPORT_C TBool DefaultIdentity::Des8(const TDesC8& aA, const TDesC8& aB)
+	{
+	return aA == aB;
+	}
+
+
+/**
+@publishedAll
+@released
+
+Compare two 16 bit descriptors for exact binary equality.
+
+@param	aA	The first integer to be compared
+@param	aB	The second integer to be compared
+@return		ETrue if the arguments are identical, EFalse otherwise.
+*/
+EXPORT_C TBool DefaultIdentity::Des16(const TDesC16& aA, const TDesC16& aB)
+	{
+	return aA == aB;
+	}
+
+/**
+@publishedAll
+@released
+
+Compare two TInt pointers for equality.
+
+@param	aA	The first pointer to be compared
+@param	aB	The second pointer to be compared
+@return		ETrue if the arguments are equal, EFalse otherwise.
+*/
+EXPORT_C TBool DefaultIdentity::IntegerPtr(TInt* const& aA,TInt* const& aB)
+	{
+	return aA == aB;
+	}
+
+/**
+@publishedAll
+@released
+
+Compare two TDesC8 pointers for equality.
+
+@param	aA	The first pointer to be compared
+@param	aB	The second pointer to be compared
+@return		ETrue if the arguments are equal, EFalse otherwise.
+*/
+EXPORT_C TBool DefaultIdentity::Des8Ptr(TDesC8* const& aA,TDesC8* const& aB)
+	{
+	return aA == aB;
+	}
+
+/**
+@publishedAll
+@released
+
+Compare two TDesC16 pointers for equality.
+
+@param	aA	The first pointer to be compared
+@param	aB	The second pointer to be compared
+@return		ETrue if the arguments are equal, EFalse otherwise.
+*/
+EXPORT_C TBool DefaultIdentity::Des16Ptr(TDesC16* const& aA,TDesC16* const& aB)
+	{
+	return aA == aB;
+	}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32/euser/us_lex16.cpp	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,896 @@
+// Copyright (c) 1994-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32\euser\us_lex16.cpp
+// 
+//
+
+#include "us_std.h"
+
+
+
+
+EXPORT_C TLex16::TLex16()
+	: iNext(NULL),iBuf(NULL),iEnd(NULL),iMark(NULL)
+/** 
+Default cosntructor.
+
+Constructs a TLex16, initialising its members to NULL.
+*/
+	{}
+
+
+
+
+EXPORT_C void TLex16::Assign(const TUint16 *aString)
+/**
+Assigns a string to this object from another string.
+
+@param aString A pointer to a string to be assigned.
+*/
+	{
+
+	iMark.iPtr=iNext=iBuf=aString;
+	iEnd=iBuf+User::StringLength(aString);
+	}
+
+
+
+
+EXPORT_C void TLex16::Assign(const TDesC16 &aDes)
+/**
+Assigns a string to this object from a descriptor.
+
+@param aDes The descriptor to be assigned.
+*/
+	{
+
+	iMark.iPtr=iNext=iBuf=aDes.Ptr();
+	iEnd=iBuf+aDes.Length();
+	}
+
+
+
+
+EXPORT_C void TLex16::UnGet()
+/**
+Decrements the next character position, allowing the previously "got" character 
+to be re-read.
+
+@panic USER 64, if the previous character is before the start of the string.
+*/
+	{
+
+	__ASSERT_ALWAYS(iNext>iBuf,Panic(ETLex16UnGetUnderflow));
+	iNext--;
+	}
+
+
+
+
+EXPORT_C void TLex16::UnGetToMark(const TLexMark16 aMark)
+/**
+Sets the next character position to the supplied extraction mark position.
+
+@param aMark Mark to copy to the next character position.
+
+@panic USER 68, if the extraction mark is before the start or beyond the end
+       of the string.
+*/
+	{
+
+	ValidateMark(aMark);
+	iNext=aMark.iPtr;
+	}
+
+
+
+
+EXPORT_C void TLex16::Inc(TInt aNumber)
+/**
+Increments the next character position by aNumber.
+
+@param aNumber The number of characters to increment the next character
+               position by.
+
+@panic USER 65, if the increment puts the next character position before the
+                start or beyond the end of the string.               
+*/
+	{
+
+	iNext+=aNumber;
+	__ASSERT_ALWAYS(iNext>=iBuf && iNext<=iEnd,Panic(ETLex16IncOutOfRange));
+	}
+
+
+
+
+EXPORT_C void TLex16::Inc()
+/**
+Increments to the next character position.
+
+@panic USER 65, if the increment puts the next character position before the
+                start or beyond the end of the string.               
+*/
+	{
+
+	if (!Eos())
+		iNext++;
+	__ASSERT_ALWAYS(iNext<=iEnd,Panic(ETLex16IncOutOfRange));
+	}
+
+
+
+
+EXPORT_C TChar TLex16::Get()
+/**
+Gets the next character in the string and increments the next
+character position.
+
+@return Next character to be read. 0 if at the end of the string.
+*/
+	{
+
+	if (Eos())
+		return(0);
+	return(*iNext++);
+	}
+
+
+
+
+EXPORT_C TChar TLex16::Peek() const
+/**
+Shows the next character to be returned by Get().
+
+@return Character to be returned by the next call to Get(). 0 if at the end of the 
+        string.
+        
+@see TLex16::Get        
+*/
+	{
+
+	if (Eos())
+		return(0);
+	return(*iNext);
+	}
+
+
+
+
+EXPORT_C void TLex16::SkipSpace()
+/**
+Moves the next character position past any white space (space or separator). 
+
+Stops if at the end of string.
+*/
+	{
+
+	while (!Eos() && Peek().IsSpace())
+		iNext++;
+	}
+
+
+
+
+EXPORT_C void TLex16::SkipAndMark(TInt aNumber,TLexMark16& aMark)
+/**
+Moves the next character position a specified number of characters and copies 
+it to the specified extraction mark.
+
+@param aNumber Number of characters to skip.
+@param aMark   On return, set to the next character position.
+
+@panic USER 66, if the skip moves the next character position either to before
+       the start or beyond the end of the string.
+*/
+	{
+
+	iNext+=aNumber;
+	__ASSERT_ALWAYS(iNext>=iBuf && iNext<=iEnd,Panic(ETLex16SkipOutOfRange));
+	Mark(aMark);
+	}
+
+
+
+
+EXPORT_C void TLex16::SkipSpaceAndMark(TLexMark16& aMark)
+/**
+Moves the next character position past any white space and copies it to the 
+specified extraction mark.
+
+Stops if at the end of the string.
+
+@param aMark On return, contains a reference to the next character position.
+*/
+	{
+
+	SkipSpace();
+	Mark(aMark);
+	}
+
+
+
+
+EXPORT_C void TLex16::SkipCharacters()
+/**
+Moves the next character position to the next white space (space or separator). 
+
+Stops if at the end of the string.
+*/
+	{
+
+	while (!Eos() && !Peek().IsSpace())
+		iNext++;
+	}
+
+
+
+
+EXPORT_C TInt TLex16::TokenLength(const TLexMark16 aMark) const
+/**
+Gets the length of the token starting at the specified extraction mark.
+
+@param aMark Extraction mark indicating the start of the token.
+
+@return Length of the token.
+
+@panic USER 68, if the specified mark is before the start or beyond the end
+       of the string.       
+*/
+	{
+
+	ValidateMark(aMark);
+	return (iNext-aMark.iPtr);
+	}
+
+
+
+
+EXPORT_C TPtrC16 TLex16::MarkedToken(const TLexMark16 aMark) const
+/**
+Extracts the token, starting at the specified mark
+
+@param aMark Extraction mark indicating the start of the token.
+
+@return Extracted token.
+
+@panic USER 68, if the specified mark is before the start or beyond the end
+       of the string.       
+*/
+	{
+
+	return(TPtrC16(aMark.iPtr,TokenLength(aMark)));
+	}
+
+
+
+
+EXPORT_C TPtrC16 TLex16::MarkedToken() const
+//
+// Extract the internally marked token
+// there is the assumption here that iMark is always valid
+/**
+Extracts the marked token.
+
+Note that the function assumes that the current extraction mark is valid.
+
+@return Extracted token. 
+
+@panic USER 68, if the specified mark is before the start or beyond the end
+       of the string.       
+*/
+	{
+
+	return(TPtrC16(iMark.iPtr,TokenLength()));
+	}
+
+
+
+
+EXPORT_C TPtrC16 TLex16::NextToken()
+/**
+Strips any white space and extracts the next token.
+
+@return Extracted token.
+*/
+	{
+	TLexMark16 mark;
+
+	SkipSpaceAndMark(mark);
+	SkipCharacters();
+	return(TPtrC16(mark.iPtr,iNext-mark.iPtr));
+	}
+
+
+
+
+EXPORT_C TPtrC16 TLex16::Remainder() const
+/**
+Gets a descriptor containing all the text from the next character position 
+to the end of the string.
+
+@return Text from the next character position onwards.
+
+@panic USER 17, if the value of (next character position - extraction mark) is
+       negative.
+*/
+	{
+
+	return(TPtrC16(iNext,iEnd-iNext));
+	}
+
+
+
+
+EXPORT_C TPtrC16 TLex16::RemainderFromMark(const TLexMark16 aMark) const
+/**
+Gets a descriptor containing all the text from the specified extraction mark 
+to the end of the string.
+
+@param aMark Extraction mark indicating where remaining text starts.
+
+@return Text from the specified extraction mark onwards.
+
+@panic USER 17, if the value of (next character position - extraction mark) is
+       negative.
+@panic USER 68, if the specified mark is before the start or beyond the end
+       of the string.
+*/
+	{
+
+	ValidateMark(aMark);
+	return(TPtrC16(aMark.iPtr,iEnd-aMark.iPtr));
+	}
+
+
+
+
+EXPORT_C TPtrC16 TLex16::RemainderFromMark() const
+//
+// Return the remainder from iMark
+// There is an assumption here that the internal mark will always be valid
+//
+/**
+Gets a descriptor containing all the text from the extraction mark to the end 
+of the string.
+
+The function assumes that the current extraction mark is valid.
+
+@return Text from the extraction mark onwards.
+*/
+	{
+
+	return(TPtrC16(iMark.iPtr,iEnd-iMark.iPtr));
+	}
+
+
+
+
+EXPORT_C TInt TLex16::Offset() const
+//
+// Return the offset from iNext to the lex start.
+//
+/**
+Gets the offset of the next character position from the start of the string.
+
+@return Offset of next character position.
+*/
+	{
+
+	return((TUint)(iNext-iBuf));
+	}
+
+
+
+
+EXPORT_C TInt TLex16::MarkedOffset(const TLexMark16 aMark) const
+/**
+Gets the offset of the specified extraction mark from the start of the string.
+
+@param aMark Extraction mark.
+
+@return The offset of the extraction mark.
+
+@panic USER 68, if the specified mark is before the start or beyond the end
+       of the string.
+*/
+	{
+
+	ValidateMark(aMark);
+	return((TUint)(aMark.iPtr-iBuf));
+	}
+
+
+
+
+EXPORT_C TInt TLex16::BoundedVal(TUint32 &aVal,TRadix aRadix,TUint aLimit)
+/**
+Parses the string to extract a 32-bit unsigned integer, using the
+specified radix, and checks that it is within the specified limit.
+
+The specified radix is one of binary, octal, decimal, or hexadecimal.
+
+@param aVal   On return, contains the extracted integer.
+@param aRadix The radix to use when converting the number.
+@param aLimit The upper limit.
+
+@return KErrNone if successful.
+        KErrGeneral if the next character position is initially at the end of the string
+        or no valid characters found initially.
+        KErrOverflow if there is sign overflow, i.e. converted value greater than limit.
+        If error codes KErrGeneral or KErrOverflow are returned, the object's
+        members are left unaltered.
+*/
+	{
+
+	TUint l=aLimit/aRadix;
+	TUint v=0;
+	TUint d=0;
+	TLexMark16 mark(iNext);
+	while (!Eos())
+		{
+		TChar c=Peek();
+		if (!c.IsHexDigit())
+			break;
+		c=Get();
+		if (c.IsAlpha())
+			{
+			c.UpperCase();
+			c-=('A'-10);
+			}
+		else
+			c-='0';
+		if (c>=(TUint)aRadix)
+			{
+			iNext--;
+			break;
+			}
+		if (v>l)
+			{
+			UnGetToMark(mark);
+			return(KErrOverflow);
+			}
+		TUint o=v;
+		v*=aRadix;
+		v+=c;
+		if (o>v)
+			{
+			UnGetToMark(mark);
+			return(KErrOverflow);
+			}
+		d++;
+		}
+	if (d==0)
+		{
+		UnGetToMark(mark);
+		return(KErrGeneral);
+		}
+	if (v>aLimit)
+		{
+		UnGetToMark(mark);
+		return(KErrOverflow);
+		}
+	aVal=v;
+	return(KErrNone);
+	}
+
+
+
+
+EXPORT_C TInt TLex16::BoundedVal(TInt32 &aVal,TInt aLimit)
+/**
+Parses the string to extract a 32-bit signed integer, and checks that it is
+within the specified limit.
+
+@param aVal   On return, contains the extracted integer.
+@param aLimit The upper limit.
+
+@return KErrNone if successful.
+        KErrGeneral if the next character position is initially at the end of the string
+        or no valid characters found initially.
+        KErrOverflow if there is sign overflow, i.e. converted value greater than limit.
+        If error codes KErrGeneral or KErrOverflow are returned, the object's
+        members are left unaltered.
+*/
+	{
+
+	if (Eos())
+		return(KErrGeneral);
+	TUint lim=aLimit;
+	TLexMark16 mark(iNext);
+	TUint s=FALSE;
+	TChar c=Peek();
+	if (c=='-')
+		{
+		lim++;
+		s++;
+		Inc();
+		}
+	else if (c=='+')
+		Inc();
+	TUint32 v;
+	TInt r=BoundedVal(v,EDecimal,lim);
+	if (r==KErrNone)
+		{
+		if (v>lim)
+			r=KErrOverflow;
+		else if (s)
+			aVal=(-((TInt32)v));
+		else
+			aVal=v;
+		}
+	if (r!=KErrNone)
+		UnGetToMark(mark);
+	return(r);
+	}
+
+
+
+
+EXPORT_C TInt TLex16::BoundedVal(TInt64& aVal, TRadix aRadix, const TInt64& aLimit)
+/**
+Parses the string to extract a 64-bit signed integer, using the
+specified radix, and checks that it is within the specified limit.
+
+The specified radix is one of binary, octal, decimal, or hexadecimal.
+
+@param aVal   On return, contains the extracted integer.
+@param aRadix The radix to use when converting the number.
+@param aLimit The upper limit.
+
+@return KErrNone if successful.
+        KErrGeneral if the next character position is initially at the end of the string
+        or no valid characters found initially.
+        KErrOverflow if there is sign overflow, i.e. converted value greater than limit.
+        If error codes KErrGeneral or KErrOverflow are returned, the object's
+        members are left unaltered.
+*/
+	{
+	TUint64 rad = aRadix;
+	TUint64 lim = static_cast<TUint64>(aLimit);
+
+	lim /= rad;
+
+	TUint64 v = 0;
+	TUint digit=0;
+	TLexMark16 mark(iNext);
+	while (!Eos())
+		{
+		TChar c=Peek(); 
+		if (!c.IsHexDigit())
+			break;	  
+		c=Get(); 
+		if (c.IsAlpha())
+			{
+			c.UpperCase();
+			c-=('A'-10);
+			}
+		else
+			c-='0';
+		if (c >= rad)
+			{
+			iNext--;
+			break;
+			}
+		if (v > lim)
+			{
+			UnGetToMark(mark);
+			return(KErrOverflow);
+			}
+		TUint64 old = v;
+		v*=rad;
+		v+=c;
+		if (old > v)
+			{
+			UnGetToMark(mark);
+			return(KErrOverflow);
+			}
+		digit++;
+		}
+	if (digit==0)
+		{
+		UnGetToMark(mark);
+		return(KErrGeneral);
+		}
+	if (v > static_cast<TUint64>(aLimit))
+		{
+		UnGetToMark(mark);
+		return(KErrOverflow);
+		}
+	aVal = static_cast<TInt64>(v);
+	return(KErrNone);
+	}
+
+
+
+
+EXPORT_C TInt TLex16::BoundedVal(TInt64& aVal, const TInt64& aLimit)
+/**
+Parses the string to extract a 64-bit signed integer, and checks that it
+is within the specified limit.
+
+@param aVal   On return, contains the extracted integer.
+@param aLimit The upper limit.
+
+@return KErrNone if successful.
+        KErrGeneral if the next character position is initially at the end of the string
+        or no valid characters found initially.
+        KErrOverflow if there is sign overflow, i.e. converted value greater than limit.
+        If error codes KErrGeneral or KErrOverflow are returned, the object's
+        members are left unaltered.
+*/
+	{
+
+	if (Eos())
+		return(KErrGeneral);
+	TInt64 lim = aLimit;
+	TLexMark16 mark(iNext);
+	TBool s=EFalse;
+	TChar c=Peek();
+	if (c=='-')
+		{
+		lim++;
+		s++;
+		Inc();
+		}
+	else if (c=='+')
+		Inc();
+	TInt64 v;
+	TInt r=BoundedVal(v,EDecimal,lim);
+	if (r==KErrNone)
+		{
+		if (v>lim)
+			r=KErrOverflow;
+		else if (s)
+			aVal=(-v);
+		else
+			aVal=v;
+		}
+	if (r!=KErrNone)
+		UnGetToMark(mark);
+	return(r);
+	}
+
+
+
+
+EXPORT_C TInt TLex16::Val(TInt8 &aVal)
+/**
+Parses the string to extract a signed 8-bit integer.
+
+@param aVal On return, contains the extracted integer.
+
+@return KErrNone if successful.
+        KErrGeneral if the next character position is initially at the end of the string
+        or no valid characters found initially.
+        KErrOverflow if there is sign overflow, i.e. converted value greater than limit.
+        If error codes KErrGeneral or KErrOverflow are returned, the object's
+        members are left unaltered.
+*/
+	{
+
+	TInt32 v;
+	TInt r=BoundedVal(v,0x7fu);
+	if (r==KErrNone)
+		aVal=(TInt8)v;
+	return(r);
+	}
+
+
+
+
+EXPORT_C TInt TLex16::Val(TInt16 &aVal)
+/**
+Parses the string to extract a signed 16-bit integer.
+
+@param aVal On return, contains the extracted integer.
+
+@return KErrNone if successful.
+        KErrGeneral if the next character position is initially at the end of the string
+        or no valid characters found initially.
+        KErrOverflow if there is sign overflow, i.e. converted value greater than limit.
+        If error codes KErrGeneral or KErrOverflow are returned, the object's
+        members are left unaltered.
+*/
+	{
+
+	TInt32 v;
+	TInt r=BoundedVal(v,0x7fffu);
+	if (r==KErrNone)
+		aVal=(TInt16)v;
+	return(r);
+	}
+
+
+
+
+EXPORT_C TInt TLex16::Val(TInt32 &aVal)
+/**
+Parses the string to extract a signed 32-bit integer.
+
+@param aVal On return, contains the extracted integer.
+
+@return KErrNone if successful.
+        KErrGeneral if the next character position is initially at the end of the string
+        or no valid characters found initially.
+        KErrOverflow if there is sign overflow, i.e. converted value greater than limit.
+        If error codes KErrGeneral or KErrOverflow are returned, the object's
+        members are left unaltered.
+*/
+	{
+
+	TInt32 v;
+	TInt r=BoundedVal(v,0x7fffffffu);
+	if (r==KErrNone)
+		aVal=v;
+	return(r);
+	}
+
+
+
+
+EXPORT_C TInt TLex16::Val(TInt64& aVal)
+/**
+Parses the string to extract a signed 64-bit integer.
+
+@param aVal On return, contains the extracted integer.
+
+@return KErrNone if successful.
+        KErrGeneral if the next character position is initially at the end of the string
+        or no valid characters found initially.
+        KErrOverflow if there is sign overflow, i.e. converted value greater than limit.
+        If error codes KErrGeneral or KErrOverflow are returned, the object's
+        members are left unaltered.
+*/
+	{
+
+	TChar c=Peek();
+	if (c=='-' || c=='+')
+		Inc();
+	TInt r;
+	if (c=='-')
+		{
+		r=BoundedVal(aVal, EDecimal, UI64LIT(0x8000000000000000));
+		if (r==KErrNone)
+			aVal=-aVal;
+		}
+	else
+		r=BoundedVal(aVal, UI64LIT(0x7fffffffffffffff));
+	return(r);
+	}
+
+
+
+
+EXPORT_C TInt TLex16::Val(TUint8 &aVal,TRadix aRadix)
+/**
+Parses the string to extract an 8-bit unsigned integer, using the
+specified radix.
+
+The specified radix is one of binary, octal, decimal, or hexadecimal.
+
+@param aVal   On return, contains the extracted integer.
+@param aRadix The radix to use when converting the number.
+
+@return KErrNone if successful.
+        KErrGeneral if the next character position is initially at the end of the string
+        or no valid characters found initially.
+        KErrOverflow if there is sign overflow, i.e. converted value greater than limit.
+        If error codes KErrGeneral or KErrOverflow are returned, the object's
+        members are left unaltered.
+*/
+	{
+
+	TUint32 v;
+	TInt r=BoundedVal(v,aRadix,0xffu);
+	if (r==KErrNone)
+		aVal=(TUint8)v;
+	return(r);
+	}
+
+
+
+
+EXPORT_C TInt TLex16::Val(TUint16 &aVal,TRadix aRadix)
+/**
+Parses the string to extract a 16-bit unsigned integer, using the
+specified radix.
+
+The specified radix is one of binary, octal, decimal, or hexadecimal.
+
+@param aVal   On return, contains the extracted integer.
+@param aRadix The radix to use when converting the number.
+
+@return KErrNone if successful.
+        KErrGeneral if the next character position is initially at the end of the string
+        or no valid characters found initially.
+        KErrOverflow if there is sign overflow, i.e. converted value greater than limit.
+        If error codes KErrGeneral or KErrOverflow are returned, the object's
+        members are left unaltered.
+*/
+	{
+
+	TUint32 v;
+	TInt r=BoundedVal(v,aRadix,0xffffu);
+	if (r==KErrNone)
+		aVal=(TUint16)v;
+	return(r);
+	}
+
+
+
+
+EXPORT_C TInt TLex16::Val(TUint32 &aVal,TRadix aRadix)
+/**
+Parses the string to extract a 32-bit unsigned integer, using the
+specified radix.
+
+The specified radix is one of binary, octal, decimal, or hexadecimal.
+
+@param aVal   On return, contains the extracted integer.
+@param aRadix The radix to use when converting the number.
+
+@return KErrNone if successful.
+        KErrGeneral if the next character position is initially at the end of the string
+        or no valid characters found initially.
+        KErrOverflow if there is sign overflow, i.e. converted value greater than limit.
+        If error codes KErrGeneral or KErrOverflow are returned, the object's
+        members are left unaltered.
+*/
+	{
+
+	TUint32 v;
+	TInt r=BoundedVal(v,aRadix,0xffffffffu);
+	if (r==KErrNone)
+		aVal=v;
+	return(r);
+	}
+
+
+
+
+EXPORT_C TInt TLex16::Val(TInt64& aVal, TRadix aRadix)
+/**
+Parses the string to extract a 64-bit integer (treated as unsigned), using the
+specified radix.
+
+The specified radix is one of binary, octal, decimal, or hexadecimal.
+
+@param aVal   On return, contains the extracted integer.
+@param aRadix The radix to use when converting the number.
+
+@return KErrNone if successful.
+        KErrGeneral if the next character position is initially at the end of the string
+        or no valid characters found initially.
+        KErrOverflow if there is sign overflow, i.e. converted value greater than limit.
+        If error codes KErrGeneral or KErrOverflow are returned, the object's
+        members are left unaltered.
+*/
+	{
+
+	return BoundedVal(aVal,aRadix,TInt64(UI64LIT(0xffffffffffffffff)));
+	}
+
+
+
+
+void TLex16::ValidateMark(const TLexMark16 aMark) const
+//
+// Asserts that the mark is valid for this lex
+//
+	{
+	__ASSERT_ALWAYS(aMark.iPtr>=iBuf && aMark.iPtr<=iEnd,Panic(ETLex16MarkOutOfRange));
+	}
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32/euser/us_lex8.cpp	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,881 @@
+// Copyright (c) 1994-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32\euser\us_lex8.cpp
+// 
+//
+
+#include "us_std.h"
+
+
+
+
+EXPORT_C TLex8::TLex8()
+	: iNext(NULL),iBuf(NULL),iEnd(NULL),iMark(NULL)
+/**
+Default constructor.
+
+Constructs a TLex8, initialising its members to NULL.
+*/
+	{}
+
+
+
+
+EXPORT_C void TLex8::Assign(const TUint8 *aString)
+/**
+Assigns a string to this object from another string.
+
+@param aString A pointer to a string to be assigned.
+*/
+	{
+
+	iMark.iPtr=iNext=iBuf=aString;
+	iEnd=iBuf+User::StringLength(aString);
+	}
+
+
+
+
+EXPORT_C void TLex8::Assign(const TDesC8 &aDes)
+/**
+Assigns a string to this object from a descriptor.
+
+@param aDes The descriptor to be assigned.
+*/
+	{
+
+	iMark.iPtr=iNext=iBuf=aDes.Ptr();
+	iEnd=iBuf+aDes.Length();
+	}
+
+
+
+
+EXPORT_C void TLex8::UnGet()
+/**
+Decrements the next character position, allowing a previously "got" character 
+to be re-read.
+
+@panic USER 59, if the previous character is before the start of the string.
+*/
+	{
+
+	__ASSERT_ALWAYS(iNext>iBuf,Panic(ETLex8UnGetUnderflow));
+	iNext--;
+	}
+
+
+
+
+EXPORT_C void TLex8::UnGetToMark(const TLexMark8 aMark)
+/**
+Sets the next character position to the supplied extraction mark position.
+
+@param aMark Mark to copy to the next character position.
+
+@panic USER 63, if the extraction mark is before the start or beyond the end
+       of the string.
+*/
+	{
+
+	ValidateMark(aMark);
+	iNext=aMark.iPtr;
+	}
+
+
+
+
+EXPORT_C void TLex8::Inc(TInt aNumber)
+/**
+Increments the next character position by aNumber.
+
+@param aNumber The number of characters to increment the next character position 
+               by. 
+               
+@panic USER 60, if the increment puts the next character position before the
+                start or beyond the end of the string.
+*/
+	{
+
+	iNext+=aNumber;
+	__ASSERT_ALWAYS(iNext>=iBuf && iNext<=iEnd,Panic(ETLex8IncOutOfRange));
+	}
+
+
+
+
+EXPORT_C void TLex8::Inc()
+/**
+Increments to the next character position.
+ 
+@panic USER 60, if the increment puts the next character position beyond the
+       end of the string.
+*/
+	{
+
+	if (!Eos())
+		iNext++;
+	__ASSERT_ALWAYS(iNext<=iEnd,Panic(ETLex8IncOutOfRange));
+	}
+
+
+
+
+EXPORT_C TChar TLex8::Get()
+/**
+Gets the next character in the string, and increments the next
+character position.
+
+@return Next character to be read.0 if at the end of the string.
+*/
+	{
+
+	if (Eos())
+		return(0);
+	return(*iNext++);
+	}
+
+
+
+
+EXPORT_C TChar TLex8::Peek() const
+/**
+Shows the next character to be returned by Get().
+
+@return Character to be returned by the next call to Get(). 0 if at the
+        end of the string.
+      
+@see TLex8::Get
+*/
+	{
+
+	if (Eos())
+		return(0);
+	return(*iNext);
+	}
+
+
+
+
+EXPORT_C void TLex8::SkipSpace()
+/** 
+Moves the next character position past any white space (space or separator).
+ 
+Stops if at the end of string.
+*/
+	{
+
+	while (!Eos() && Peek().IsSpace())
+		iNext++;
+	}
+
+
+
+
+EXPORT_C void TLex8::SkipAndMark(TInt aNumber,TLexMark8& aMark)
+/**
+Moves the next character position a specified number of characters and copies 
+it to the specified extraction mark.
+
+@param aNumber Number of characters to skip.  
+@param aMark   On return, set to the next character position. 
+
+@panic USER 61, if the skip moves the next character position either to before
+       the start or beyond the end of the string.
+*/
+	{
+
+	iNext+=aNumber;
+	__ASSERT_ALWAYS(iNext>=iBuf && iNext<=iEnd,Panic(ETLex8SkipOutOfRange));
+	Mark(aMark);
+	}
+
+
+
+
+EXPORT_C void TLex8::SkipSpaceAndMark(TLexMark8& aMark)
+/**
+Moves the next character position past any white space and copies it to the 
+specified extraction mark.
+
+Stops if at the end of the string.
+
+@param aMark On return, contains a reference to the next character position.
+*/
+	{
+
+	SkipSpace();
+	Mark(aMark);
+	}
+
+
+
+
+EXPORT_C void TLex8::SkipCharacters()
+/**
+Moves the next character position to the next white space (space or separator). 
+
+Stops if at the end of the string.
+*/
+	{
+
+	while (!Eos() && !Peek().IsSpace())
+		iNext++;
+	}
+
+
+
+
+EXPORT_C TInt TLex8::TokenLength(const TLexMark8 aMark) const
+/**
+Gets the length of the token starting at the specified extraction mark.
+
+@param aMark Extraction mark indicating the start of the token.
+
+@return Length of the token.
+
+@panic USER 63, if the specified mark is before the start or beyond the end
+       of the string.
+*/
+	{
+
+	ValidateMark(aMark);
+	return (iNext-aMark.iPtr);
+	}
+
+
+
+
+EXPORT_C TPtrC8 TLex8::MarkedToken(const TLexMark8 aMark) const
+/**
+Extracts the token, starting at the specified mark
+
+@param aMark Extraction mark indicating the start of the token.
+
+@return Extracted token.
+
+@panic USER 63, if the specified mark is before the start or beyond the end
+       of the string.
+*/
+	{
+
+	return(TPtrC8(aMark.iPtr,TokenLength(aMark)));
+	}
+
+
+
+
+EXPORT_C TPtrC8 TLex8::MarkedToken() const
+//
+// Extract the internally marked token
+// there is the assumption here that iMark is always valid
+/**
+Extracts the marked token.
+
+Note that the function assumes that the current extraction mark is valid.
+
+@return Extracted token.
+
+@panic USER 63, if the specified mark is before the start or beyond the end
+       of the string.
+*/
+	{
+
+	return(TPtrC8(iMark.iPtr,TokenLength()));
+	}
+
+
+
+
+EXPORT_C TPtrC8 TLex8::NextToken()
+/**
+Strips any white space and extracts the next token.
+
+@return Extracted token.
+*/
+	{
+	TLexMark8 mark;
+
+	SkipSpaceAndMark(mark);
+	SkipCharacters();
+	return(TPtrC8(mark.iPtr,TokenLength(mark)));
+	}
+
+
+
+
+EXPORT_C TPtrC8 TLex8::Remainder() const
+/**
+Gets a descriptor containing all the text from the next character position 
+to the end of the string.
+
+@return Text from the next character position onwards.
+
+@panic USER 29, if the value of (next character position - extraction mark) is
+       negative.
+*/
+	{
+
+	return(TPtrC8(iNext,iEnd-iNext));
+	}
+
+
+
+
+EXPORT_C TPtrC8 TLex8::RemainderFromMark(const TLexMark8 aMark) const
+/**
+Gets a descriptor containing all the text from the specified extraction mark 
+to the end of the string.
+
+@param aMark Extraction mark indicating where remaining text starts.
+
+@return Text from the specified extraction mark onwards.
+
+@panic USER 29, if the value of (next character position - extraction mark) is
+       negative.
+@panic USER 63, if the specified mark is before the start or beyond the end
+       of the string.
+*/
+	{
+
+	ValidateMark(aMark);
+	return(TPtrC8(aMark.iPtr,iEnd-aMark.iPtr));
+	}
+
+
+
+
+EXPORT_C TPtrC8 TLex8::RemainderFromMark() const
+//
+// Return the remainder from iMark
+// There is an assumption here that the internal mark will always be valid
+//
+/**
+Gets a descriptor containing all the text from the current extraction mark to the end 
+of the string.
+
+The function assumes that the current extraction mark is valid.
+
+@return Text from the extraction mark onwards.
+*/
+	{
+	
+	return(TPtrC8(iMark.iPtr,iEnd-iMark.iPtr));
+	}
+
+
+
+
+EXPORT_C TInt TLex8::Offset() const
+//
+// Return the offset from iNext to the lex start.
+//
+/**
+Gets the offset of the next character position from the start of the string.
+
+@return Offset of next character position.
+*/
+	{
+
+	return((TUint)(iNext-iBuf));
+	}
+
+
+
+
+EXPORT_C TInt TLex8::MarkedOffset(const TLexMark8 aMark) const
+/**
+Gets the offset of the specified extraction mark from the start of the string.
+
+@param aMark Extraction mark. 
+ 
+@return The offset of the extraction mark.
+
+@panic USER 63, if the specified mark is before the start or beyond the end
+       of the string.
+*/
+	{
+
+	ValidateMark(aMark);
+	return((TUint)(aMark.iPtr-iBuf));
+	}
+
+
+
+
+EXPORT_C TInt TLex8::BoundedVal(TUint32 &aVal,TRadix aRadix,TUint aLimit)
+/**
+Parses the string to extract a 32-bit unsigned integer, using the
+specified radix, and checks that it is within the specified limit.
+
+The specified radix is one of binary, octal, decimal, or hexadecimal.
+
+@param aVal   On return, contains the extracted integer.
+@param aRadix The radix to use when converting the number.
+@param aLimit The upper limit.
+
+@return KErrNone if successful.
+        KErrGeneral if the next character position is initially at the end of the string
+        or no valid characters found initially.
+        KErrOverflow if there is sign overflow, i.e. converted value greater than limit.
+        If error codes KErrGeneral or KErrOverflow are returned, the object's
+        members are left unaltered.
+*/
+	{
+
+	TUint l=aLimit/aRadix;
+	TUint v=0;
+	TUint d=0;
+	TLexMark8 mark(iNext);
+	while (!Eos())
+		{
+		TChar c=Peek(); 
+		if (!c.IsHexDigit())
+			break; 
+		c=Get(); 
+		if (c.IsAlpha())
+			{
+			c.UpperCase();
+			c-=('A'-10);
+			}
+		else
+			c-='0';
+		if (c>=(TUint)aRadix)
+			{
+			iNext--;
+			break;
+			}
+		if (v>l)
+			{
+			UnGetToMark(mark);
+			return(KErrOverflow);
+			}
+		TUint o=v;
+		v*=aRadix;
+		v+=c;
+		if (o>v)
+			{
+			UnGetToMark(mark);
+			return(KErrOverflow);
+			}
+		d++;
+		}
+	if (d==0)
+		{
+		UnGetToMark(mark);
+		return(KErrGeneral);
+		}
+	if (v>aLimit)
+		{
+		UnGetToMark(mark);
+		return(KErrOverflow);
+		}
+	aVal=v;
+	return(KErrNone);
+	}
+
+
+
+
+EXPORT_C TInt TLex8::BoundedVal(TInt32 &aVal,TInt aLimit)
+/**
+Parses the string to extract a 32-bit signed integer, and checks that it is
+within the specified limit.
+
+@param aVal   On return, contains the extracted integer.
+@param aLimit The upper limit.
+
+@return KErrNone if successful.
+        KErrGeneral if the next character position is initially at the end of the string
+        or no valid characters found initially.
+        KErrOverflow if there is sign overflow, i.e. converted value greater than limit.
+        If error codes KErrGeneral or KErrOverflow are returned, the object's
+        members are left unaltered.
+*/
+	{
+
+	if (Eos())
+		return(KErrGeneral);
+	TUint lim=aLimit;
+	TLexMark8 mark(iNext);
+	TUint s=FALSE;
+	TChar c=Peek();
+	if (c=='-')
+		{
+		lim++;
+		s++;
+		Inc();
+		}
+	else if (c=='+')
+		Inc();
+	TUint32 v;
+	TInt r=BoundedVal(v,EDecimal,lim);
+	if (r==KErrNone)
+		{
+		if (v>lim)
+			r=KErrOverflow;
+		else if (s)
+			aVal=(-((TInt32)v));
+		else
+			aVal=v;
+		}
+	if (r!=KErrNone)
+		UnGetToMark(mark);
+	return(r);
+	}
+
+
+
+
+EXPORT_C TInt TLex8::BoundedVal(TInt64& aVal, TRadix aRadix, const TInt64& aLimit)
+/**
+Parses the string to extract a 64-bit signed integer, using the
+specified radix, and checks that it is within the specified limit.
+
+The specified radix is one of binary, octal, decimal, or hexadecimal.
+
+@param aVal   On return, contains the extracted integer.
+@param aRadix The radix to use when converting the number.
+@param aLimit The upper limit.
+
+@return KErrNone if successful.
+        KErrGeneral if the next character position is initially at the end of the string
+        or no valid characters found initially.
+        KErrOverflow if there is sign overflow, i.e. converted value greater than limit.
+        If error codes KErrGeneral or KErrOverflow are returned, the object's
+        members are left unaltered.
+*/
+	{
+	TUint64 rad = aRadix;
+	TUint64 lim = static_cast<TUint64>(aLimit);
+
+	lim /= rad;
+
+	TUint64 v = 0;
+	TUint digit=0;
+	TLexMark8 mark(iNext);
+	while (!Eos())
+		{
+		TChar c=Peek(); 
+		if (!c.IsHexDigit())
+			break;	  
+		c=Get(); 
+		if (c.IsAlpha())
+			{
+			c.UpperCase();
+			c-=('A'-10);
+			}
+		else
+			c-='0';
+		if (c >= rad)
+			{
+			iNext--;
+			break;
+			}
+		if (v > lim)
+			{
+			UnGetToMark(mark);
+			return(KErrOverflow);
+			}
+		TUint64 old = v;
+		v*=rad;
+		v+=c;
+		if (old > v)
+			{
+			UnGetToMark(mark);
+			return(KErrOverflow);
+			}
+		digit++;
+		}
+	if (digit==0)
+		{
+		UnGetToMark(mark);
+		return(KErrGeneral);
+		}
+	if (v > static_cast<TUint64>(aLimit))
+		{
+		UnGetToMark(mark);
+		return(KErrOverflow);
+		}
+	aVal = static_cast<TInt64>(v);
+	return(KErrNone);
+	}
+
+
+
+
+EXPORT_C TInt TLex8::BoundedVal(TInt64& aVal, const TInt64& aLimit)
+/**
+Parses the string to extract a 64-bit signed integer, and checks that it
+is within the specified limit.
+
+@param aVal   On return, contains the extracted integer.
+@param aLimit The upper limit.
+
+@return KErrNone if successful.
+        KErrGeneral if the next character position is initially at the end of the string
+        or no valid characters found initially.
+        KErrOverflow if there is sign overflow, i.e. converted value greater than limit.
+        If error codes KErrGeneral or KErrOverflow are returned, the object's
+        members are left unaltered.
+*/
+	{
+
+	if (Eos())
+		return(KErrGeneral);
+	TInt64 lim = aLimit;
+	TLexMark8 mark(iNext);
+	TBool s=EFalse;
+	TChar c=Peek();
+	if (c=='-')
+		{
+		lim++;
+		s++;
+		Inc();
+		}
+	else if (c=='+')
+		Inc();
+	TInt64 v;
+	TInt r=BoundedVal(v,EDecimal,lim);
+	if (r==KErrNone)
+		{
+		if (v>lim)
+			r=KErrOverflow;
+		else if (s)
+			aVal=(-v);
+		else
+			aVal=v;
+		}
+	if (r!=KErrNone)
+		UnGetToMark(mark);
+	return(r);
+	}
+
+
+
+
+EXPORT_C TInt TLex8::Val(TInt8 &aVal)
+/**
+Parses the string to extract a signed 8-bit integer.
+
+@param aVal On return, contains the extracted integer.
+
+@return KErrNone if successful.
+        KErrGeneral if the next character position is initially at the end of the string
+        or no valid characters found initially.
+        KErrOverflow if there is sign overflow, i.e. converted value greater than limit.
+        If error codes KErrGeneral or KErrOverflow are returned, the object's
+        members are left unaltered.
+*/
+	{
+
+	TInt32 v;
+	TInt r=BoundedVal(v,0x7fu);
+	if (r==KErrNone)
+		aVal=(TInt8)v;
+	return(r);
+	}
+
+
+
+
+EXPORT_C TInt TLex8::Val(TInt16 &aVal)
+/**
+Parses the string to extract a signed 16-bit integer.
+
+@param aVal On return, contains the extracted integer.
+
+@return KErrNone if successful.
+        KErrGeneral if the next character position is initially at the end of the string
+        or no valid characters found initially.
+        KErrOverflow if there is sign overflow, i.e. converted value greater than limit.
+        If error codes KErrGeneral or KErrOverflow are returned, the object's
+        members are left unaltered.
+*/
+	{
+
+	TInt32 v;
+	TInt r=BoundedVal(v,0x7fffu);
+	if (r==KErrNone)
+		aVal=(TInt16)v;
+	return(r);
+	}
+
+
+
+
+EXPORT_C TInt TLex8::Val(TInt32 &aVal)
+/**
+Parses the string to extract a signed 32-bit integer.
+
+@param aVal On return, contains the extracted integer.
+
+@return KErrNone if successful.
+        KErrGeneral if the next character position is initially at the end of the string
+        or no valid characters found initially.
+        KErrOverflow if there is sign overflow, i.e. converted value greater than limit.
+        If error codes KErrGeneral or KErrOverflow are returned, the object's
+        members are left unaltered.
+*/
+	{
+
+	TInt32 v;
+	TInt r=BoundedVal(v,0x7fffffffu);
+	if (r==KErrNone)
+		aVal=v;
+	return(r);
+	}
+
+
+
+EXPORT_C TInt TLex8::Val(TInt64& aVal)
+/**
+Parses the string to extract a signed 64-bit integer.
+
+@param aVal On return, contains the extracted integer.
+
+@return KErrNone if successful.
+        KErrGeneral if the next character position is initially at the end of the string
+        or no valid characters found initially.
+        KErrOverflow if there is sign overflow, i.e. converted value greater than limit.
+        If error codes KErrGeneral or KErrOverflow are returned, the object's
+        members are left unaltered.
+*/
+	{
+
+	TChar c=Peek();
+	if (c=='-' || c=='+')
+		Inc();
+	TInt r;
+	if (c=='-')
+		{
+		r=BoundedVal(aVal, EDecimal, UI64LIT(0x8000000000000000));
+		if (r==KErrNone)
+			aVal=-aVal;
+		}
+	else
+		r=BoundedVal(aVal, UI64LIT(0x7fffffffffffffff));
+	return(r);
+	}
+
+
+
+
+EXPORT_C TInt TLex8::Val(TUint8 &aVal,TRadix aRadix)
+/**
+Parses the string to extract an 8-bit unsigned integer, using the
+specified radix.
+
+The specified radix is one of binary, octal, decimal, or hexadecimal.
+
+@param aVal   On return, contains the extracted integer.
+@param aRadix The radix to use when converting the number.
+
+@return KErrNone if successful.
+        KErrGeneral if the next character position is initially at the end of the string
+        or no valid characters found initially.
+        KErrOverflow if there is sign overflow, i.e. converted value greater than limit.
+        If error codes KErrGeneral or KErrOverflow are returned, the object's
+        members are left unaltered.
+*/
+	{
+
+	TUint32 v;
+	TInt r=BoundedVal(v,aRadix,0xffu);
+	if (r==KErrNone)
+		aVal=(TUint8)v;
+	return(r);
+	}
+
+EXPORT_C TInt TLex8::Val(TUint16 &aVal,TRadix aRadix)
+/**
+Parses the string to extract a 16-bit unsigned integer, using the
+specified radix.
+
+The specified radix is one of binary, octal, decimal, or hexadecimal.
+
+@param aVal   On return, contains the extracted integer.
+@param aRadix The radix to use when converting the number.
+
+@return KErrNone if successful.
+        KErrGeneral if the next character position is initially at the end of the string
+        or no valid characters found initially.
+        KErrOverflow if there is sign overflow, i.e. converted value greater than limit.
+        If error codes KErrGeneral or KErrOverflow are returned, the object's
+        members are left unaltered.
+*/
+	{
+
+	TUint32 v;
+	TInt r=BoundedVal(v,aRadix,0xffffu);
+	if (r==KErrNone)
+		aVal=(TUint16)v;
+	return(r);
+	}
+
+EXPORT_C TInt TLex8::Val(TUint32 &aVal,TRadix aRadix)
+/**
+Parses the string to extract a 32-bit unsigned integer, using the
+specified radix.
+
+The specified radix is one of binary, octal, decimal, or hexadecimal.
+
+@param aVal   On return, contains the extracted integer.
+@param aRadix The radix to use when converting the number.
+
+@return KErrNone if successful.
+        KErrGeneral if the next character position is initially at the end of the string
+        or no valid characters found initially.
+        KErrOverflow if there is sign overflow, i.e. converted value greater than limit.
+        If error codes KErrGeneral or KErrOverflow are returned, the object's
+        members are left unaltered.
+*/
+	{
+
+	TUint32 v;
+	TInt r=BoundedVal(v,aRadix,0xffffffffu);
+	if (r==KErrNone)
+		aVal=v;
+	return(r);
+	}
+
+EXPORT_C TInt TLex8::Val(TInt64& aVal, TRadix aRadix)
+/**
+Parses the string to extract a 64-bit integer (treated as unsigned), using the
+specified radix.
+
+The specified radix is one of binary, octal, decimal, or hexadecimal.
+
+@param aVal   On return, contains the extracted integer.
+@param aRadix The radix to use when converting the number.
+
+@return KErrNone if successful.
+        KErrGeneral if the next character position is initially at the end of the string
+        or no valid characters found initially.
+        KErrOverflow if there is sign overflow, i.e. converted value greater than limit.
+        If error codes KErrGeneral or KErrOverflow are returned, the object's
+        members are left unaltered.
+*/
+	{
+
+	return BoundedVal(aVal,aRadix,TInt64(UI64LIT(0xffffffffffffffff)));
+	}
+
+void TLex8::ValidateMark(const TLexMark8 aMark) const
+//
+// Asserts that the mark is valid for this lex
+//
+	{
+	__ASSERT_ALWAYS(aMark.iPtr>=iBuf && aMark.iPtr<=iEnd,Panic(ETLex8MarkOutOfRange));
+	}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32/euser/us_loc.cpp	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,285 @@
+// Copyright (c) 1994-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32\euser\us_loc.cpp
+// 
+//
+
+#include "us_std.h"
+
+EXPORT_C TDayName::TDayName()
+/**
+Default constructor.
+
+It constructs this object and initialises it with the current locale's text for 
+Monday.
+*/
+	{
+
+	Set(EMonday);
+	}
+
+
+
+
+EXPORT_C TDayName::TDayName(TDay aDay)
+/**
+Constructs this object and initialises it with the current locale's text for 
+the specified day of the week.
+
+@param aDay Identifies the day of the week.
+*/
+	{
+
+	Set(aDay);
+	}
+
+
+
+
+EXPORT_C TDayNameAbb::TDayNameAbb()
+/**
+Default constructor.
+
+It constructs this object and initialises it with the current locale's
+abbreviated text for Monday.
+*/
+	{
+
+	Set(EMonday);
+	}
+
+
+
+
+EXPORT_C TDayNameAbb::TDayNameAbb(TDay aDay)
+/**
+Constructs this object and initialises it with the current locale's abbreviated 
+text for the specified day of the week.
+
+@param aDay An enumerator identifying the day of the week.
+*/
+	{
+
+	Set(aDay);
+	}
+
+
+
+
+EXPORT_C TMonthName::TMonthName()
+/**
+Default constructor.
+
+Constructs the object and initialises it with the current locale's text for 
+January.
+*/
+	{
+
+	Set(EJanuary);
+	}
+
+
+
+
+EXPORT_C TMonthName::TMonthName(TMonth aMonth)
+/**
+Constructs this object and initialises it with the current locale's text for 
+the specified month.
+
+@param aMonth Identifies the month.
+*/
+	{
+
+	Set(aMonth);
+	}
+
+
+
+
+EXPORT_C TMonthNameAbb::TMonthNameAbb()
+/**
+Default constructor.
+
+It constructs this object and initialises it with the current locale's abbreviated 
+text for January.
+*/
+	{
+
+	Set(EJanuary);
+	}
+
+
+
+
+EXPORT_C TMonthNameAbb::TMonthNameAbb(TMonth aMonth)
+/**
+Constructs this object and initialises it with the current locale's abbreviated 
+text for the specified month.
+
+@param aMonth Identifies the month.
+*/
+	{
+
+	Set(aMonth);
+	}
+
+
+
+
+EXPORT_C TDateSuffix::TDateSuffix()
+/**
+Default constructor.
+
+It constructs this object and initialises it with the current locale's date
+suffix text for the first day of the month.
+*/
+	{
+
+	Set(0);
+	}
+
+
+
+
+EXPORT_C TDateSuffix::TDateSuffix(TInt aDateSuffix)
+/**
+Constructs this object and initialises it with the current locale's date suffix 
+text for the specified day of the month.
+
+@param aDateSuffix A value identifying the day of the month. The value can 
+                   range from 0 to 30 so that the first day of the month is
+                   identified by 0, the second day by 1 etc.
+                   
+@panic USER 69, if aDateSuffix is outside the range 0 to 30.
+*/
+	{
+
+	Set(aDateSuffix);
+	}
+
+
+
+
+EXPORT_C TAmPmName::TAmPmName()
+/**
+Default constructor.
+
+It constructs this object and initialises it with the current locale's text for 
+identifying time before noon.
+*/
+	{
+
+	Set(EAm);
+	}
+
+
+
+
+EXPORT_C TAmPmName::TAmPmName(TAmPm aSelector)
+/**
+Constructs this object and initialises it with the current locale's text for 
+identifying time before or after noon as identified by the specified selector.
+
+@param aSelector The am/pm selector.
+*/
+	{
+
+	Set(aSelector);
+	}
+
+
+
+
+EXPORT_C TCurrencySymbol::TCurrencySymbol()
+/**
+Default constructor.
+
+It constructs this object and initialises it with the current locale's currency 
+symbol(s).
+*/
+	{
+
+	Set();
+	}
+
+
+
+
+EXPORT_C TShortDateFormatSpec::TShortDateFormatSpec()
+/**
+Default constructor.
+
+Performs construction by calling Set().
+
+@see TShortDateFormatSpec::Set
+*/
+	{
+
+	Set();
+	}
+
+
+
+
+EXPORT_C TLongDateFormatSpec::TLongDateFormatSpec()
+/**
+Default constructor.
+
+Performs construction by calling Set().
+
+@see TLongDateFormatSpec::Set
+*/
+	{
+
+	Set();
+	}
+
+
+
+
+EXPORT_C TTimeFormatSpec::TTimeFormatSpec()
+/**
+Default constructor.
+
+Performs construction by calling Set().
+
+@see TTimeFormatSpec::Set
+*/
+	{
+
+	Set();
+	}
+
+
+
+
+EXPORT_C TLocaleMessageText::TLocaleMessageText()
+//
+// Default Constructor
+//
+	{}
+
+
+
+
+EXPORT_C TLocaleMessageText::TLocaleMessageText(TLocaleMessage aMsgNo)
+//
+// Constructor
+//
+	{
+
+	Set(aMsgNo);
+	}
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32/euser/us_parse.cpp	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,620 @@
+// Copyright (c) 1996-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32\euser\us_parse.cpp
+// 
+//
+
+#include "us_std.h"
+
+class TStringToDateTime
+	{
+public:
+	TStringToDateTime(const TDesC& aDes,TInt aCenturyOffset);
+	TInt Parse(TTime& aTime);
+	enum {ETimePresent=1,EDatePresent};
+private:
+// tokens
+	enum {EDec=-12,ENov,EOct,ESep,EAug,EJul,EJun,EMay,EApr,EMar,EFeb,EJan};
+	enum {ETokenAm=-19,ETokenPm};
+	enum TDateSeparators{ESlash=-39,EDash,EComma,ESpace,EDateLocale1,EDateLocale2};
+	enum TTimeSeparators{EColon=-49,EDot,ETimeLocale1,ETimeLocale2};
+	enum TDecimalSeparators{EDecimalLocale=-59};
+	enum {EErrorToken=-99,ENullToken=-100};
+//
+	enum {ENumberOfDateSep=6,ENumberOfTimeSep=4,EMaxTokens=27};
+	enum {EFirstDateSep=ESlash,ELastDateSep=EDateLocale2,EFirstTimeSep=EColon,ELastTimeSep=ETimeLocale2};
+private:
+	TInt NextToken(TInt& aTokenLen);
+	void StripSpaceTokens();
+	TInt CrackTokenFormula();
+	TInt GetDate(TInt aFormulaPos,TInt& aTokenCount);
+	TInt GetTime(TInt aFormulaPos,TInt& aTokenCount);
+//	
+	TInt GetSeparatorToken(TChar aChar) const;	
+	TBool IsTimeSeparator(TChar  aChar) const;
+	TBool IsDateSeparator(TChar  aChar) const;
+	TBool IsDecimalSeparator(TChar  aChar) const;
+	TBool IsSeparator(TChar aChar) const;
+	TBool IsSeparator(TInt aToken) const;
+	inline TBool IsTimeSeparator(TInt aToken) const;
+	inline TBool IsDateSeparator(TInt aToken) const;
+	TBool IsDecimalSeparator(TInt aToken) const;
+	inline TBool IsAmPm(TInt aToken) const;
+	inline TBool IsAlphaMonth(TInt aToken) const;
+private:
+	TLex iLex;
+	TInt iCenturyOffset;
+	TDateFormat iDateFormat;
+	TChar iTimeSepChars[ENumberOfTimeSep];
+	TChar iDateSepChars[ENumberOfDateSep];
+	TChar iDecSepChar;
+	TDateTime iDateTime;
+	TInt iCount;
+	TInt iFormula[EMaxTokens];// 27 max possible with valid des (including spaces):" 10 : 00 : 00 . 000000 pm 6 / 12 / 99 "
+	TUint8 iTokenLen[EMaxTokens];
+	};
+
+inline TBool TStringToDateTime::IsTimeSeparator(TInt aToken) const
+	{
+	return(aToken >= EFirstTimeSep && aToken <=ELastTimeSep);
+	}
+inline TBool TStringToDateTime::IsDateSeparator(TInt aToken) const
+	{
+	return(aToken>=EFirstDateSep && aToken<=ELastDateSep);
+	}
+inline TBool TStringToDateTime::IsAmPm(TInt aToken) const
+	{
+	return(aToken==ETokenAm || aToken==ETokenPm);
+	}
+inline TBool TStringToDateTime::IsAlphaMonth(TInt aToken) const
+	{
+	return (aToken>=EDec && aToken<=EJan);
+	}
+
+inline TBool TStringToDateTime::IsDecimalSeparator(TChar aChar) const
+	{
+	return(aChar==iDecSepChar);
+	}
+inline TBool TStringToDateTime::IsDecimalSeparator(TInt aToken) const
+	{
+	return(aToken==EDecimalLocale);
+	}
+
+TStringToDateTime::TStringToDateTime(const TDesC& aDes,TInt aCenturyOffset)
+	: iLex(aDes),iCenturyOffset(aCenturyOffset),iDateTime(0,EJanuary,0,0,0,0,0)
+	{
+
+	__ASSERT_ALWAYS(aCenturyOffset>=0 && aCenturyOffset<100,Panic(ETTimeValueOutOfRange));
+	TLocale locale;
+	iDateFormat=locale.DateFormat();
+	
+	iTimeSepChars[0]=':';
+	iTimeSepChars[1]='.';
+	iTimeSepChars[2]=locale.TimeSeparator(1);
+	iTimeSepChars[3]=locale.TimeSeparator(2);
+
+	iDateSepChars[0]='/';
+	iDateSepChars[1]='-';
+	iDateSepChars[2]=',';
+	iDateSepChars[3]=' ';
+	iDateSepChars[4]=locale.DateSeparator(1);
+	iDateSepChars[5]=locale.DateSeparator(2);
+	iDecSepChar = locale.DecimalSeparator();
+	}
+
+TBool TStringToDateTime::IsTimeSeparator(TChar aChar) const
+	{
+
+	for (TInt ii=0;ii<ENumberOfTimeSep;++ii)
+		if (aChar==iTimeSepChars[ii])
+			return ETrue;
+	return(EFalse);
+	}
+
+TBool TStringToDateTime::IsDateSeparator(TChar aChar) const
+	{
+
+	for (TInt ii=0;ii<ENumberOfDateSep;++ii)
+		if (aChar==iDateSepChars[ii])
+			return ETrue;
+	return(EFalse);
+	}
+
+TBool TStringToDateTime::IsSeparator(TChar  aChar) const
+	{
+
+	return(IsTimeSeparator(aChar) || IsDateSeparator(aChar) || IsDecimalSeparator(aChar));
+	}
+
+TBool TStringToDateTime::IsSeparator(TInt aToken) const
+	{
+
+	return(IsTimeSeparator(aToken) || IsDateSeparator(aToken));
+	}
+
+TInt TStringToDateTime::GetSeparatorToken(TChar aChar) const
+	{
+
+	TInt ii=0;
+	for (ii=0;ii<ENumberOfDateSep;++ii)
+		if (aChar == iDateSepChars[ii])
+			return(EFirstDateSep+ii);
+	for (ii=0;ii<ENumberOfTimeSep;++ii)
+		if (aChar == iTimeSepChars[ii])
+			return(EFirstTimeSep+ii);
+	if (aChar == iDecSepChar)
+		return(EDecimalLocale);
+	return(ENullToken);
+	}
+
+void TStringToDateTime::StripSpaceTokens()
+// Removes excess space tokens from the formula
+// The end of the formula is marked with a Null token
+	{
+
+	TInt t = 0;
+	for (TInt s = 0 ; s < iCount ; ++s)
+		{
+		if (iFormula[s]==ESpace &&
+			(IsSeparator(iFormula[s-1]) || s == iCount-1 || IsSeparator(iFormula[s+1]) || IsAmPm(iFormula[s+1])))
+			continue;// Skip unwanted space token
+		iFormula[t]=iFormula[s];
+		iTokenLen[t]=iTokenLen[s];
+		++t;
+		}
+	iCount=t;
+	iFormula[t]=ENullToken;
+	}
+
+TInt TStringToDateTime::CrackTokenFormula()
+	{
+
+	if (iCount==0)
+		return KErrArgument;// Nothing to read
+	TInt token0=iFormula[0];
+	TInt token1=iFormula[1];
+	TInt numberOfTokens;
+	TInt dummy=0;
+	TInt error;
+	if (IsDateSeparator(token1) || IsAlphaMonth(token0))
+		{// Assume formula is a Date or DateTime
+		if ((error=GetDate(0,numberOfTokens))!=EDatePresent)
+			return error;
+		numberOfTokens+=1;// Space char between the Date & Time
+		return(GetTime(numberOfTokens,dummy));
+		}
+	else if (IsTimeSeparator(token1) || IsAmPm(token1))
+		{// Assume formula is a Time or TimeDate
+		if ((error=GetTime(0,numberOfTokens))!=ETimePresent)
+			return error;
+		numberOfTokens+=1;// Space char between the Time & Date
+		return(GetDate(numberOfTokens,dummy));
+		}
+	else
+		return(KErrArgument);
+	}
+
+TInt TStringToDateTime::GetDate(TInt aOffset,TInt& aTokenCount)
+	// if aOffset == 0  then Date or DateTime format
+	// if aOffset != 0  then TimeDate format
+	{
+
+	TInt relativeCount=iCount;
+	if (aOffset!=0)// aFormat==ETimeDate
+		{
+		relativeCount-=aOffset;
+		if (relativeCount<=-1)
+			return(ETimePresent);
+		}
+	TInt numberOfDateFields=0;
+	if (relativeCount==3)
+		numberOfDateFields=2;
+	else if (relativeCount==5)
+		numberOfDateFields=3;
+	else if (aOffset==0)
+		{// DateTime
+		if (IsTimeSeparator(iFormula[5]) || IsAmPm(iFormula[5]))
+			numberOfDateFields=2;
+		else
+			numberOfDateFields=3;
+		}
+	else// (aOffset!=0)
+		{// Date
+		if (relativeCount==3)
+			numberOfDateFields=2;
+		else if (relativeCount==5)
+			numberOfDateFields=3;
+		else
+			return(KErrArgument);
+		}
+
+	if (!IsDateSeparator(iFormula[1+aOffset])) 
+		return(KErrArgument);
+	if (numberOfDateFields==2)
+		{
+		if (aOffset!=0 && relativeCount!=3)// ie TimeDate
+			return(KErrArgument);
+		}
+	if (numberOfDateFields==3)
+		{
+		if (aOffset!=0 && relativeCount!=5)// ie TimeDate
+			return(KErrArgument);
+		if (!IsDateSeparator(iFormula[3+aOffset]))
+			return(KErrArgument);
+		}
+
+	// A month will always be in the first two fields // DMY MDY YMD
+	TBool alphaMonth=(IsAlphaMonth(iFormula[0+aOffset]) || IsAlphaMonth(iFormula[2+aOffset]) );
+	
+	TInt dayIndex;
+	TInt monthIndex;
+	TInt yearIndex=4;// Reset if Japanese
+
+	if (iDateFormat==EDateJapanese)
+		{// 1996 feb 3
+		if (numberOfDateFields==2)
+			{
+			monthIndex=0;
+			dayIndex=2;
+			}
+		else
+			{
+			yearIndex=0;
+			monthIndex=2;
+			dayIndex=4;
+			}
+		}
+	else if (IsAlphaMonth(iFormula[0+aOffset])
+		|| (!alphaMonth && iDateFormat==EDateAmerican))// Amer Euro 
+		{// feb 3 1996 valid Amer or Euro format // 2 3 1996 Amer
+		monthIndex=0;
+		dayIndex=2;
+		}		
+	else
+		{// 3 feb 1996 valid Amer or Euro format // 3 2 1996 Euro
+		__ASSERT_DEBUG(
+			IsAlphaMonth(iFormula[2+aOffset]) || 
+			(!alphaMonth && iDateFormat==EDateEuropean),User::Invariant());
+		monthIndex=2;
+		dayIndex=0;
+		}
+	
+	TTime timeNow;
+	timeNow.HomeTime();
+	TDateTime now=timeNow.DateTime();
+	TInt currentCentury=((now.Year()/100)*100);// Integer arithmetic
+	TInt currentTwoDigitYear=now.Year()-currentCentury;
+
+	TInt year=0;
+	if (numberOfDateFields==3)// then year value exists
+		{
+		year=iFormula[yearIndex+aOffset];
+		if (year<0)// ie a token has been returned as a year
+			return(KErrArgument);
+		else if (iTokenLen[yearIndex+aOffset]<=2)
+			{
+			if (currentTwoDigitYear>=iCenturyOffset)
+				{
+				if (year>=00 && year<iCenturyOffset) 
+					year+=currentCentury+100;// next century
+				else
+					year+=currentCentury;
+				}
+			else
+				{
+				if (year>=00 && year<iCenturyOffset) 
+					year+=currentCentury;
+				else
+					year+=currentCentury-100;// last century
+				}
+			}
+		}
+
+	TInt month=iFormula[monthIndex+aOffset];
+	if (IsAlphaMonth(month))
+		month=-month;// alphaMonth is -ve enum token
+	month-=1;// months start at zero
+
+	TInt error;// Set Year, Month and Day
+	if ((error=iDateTime.SetYear(year))==KErrNone)
+		if ((error=iDateTime.SetMonth((TMonth)month))==KErrNone)
+			error=iDateTime.SetDay(iFormula[dayIndex+aOffset]-1);
+	if (error!=KErrNone)
+		return(error);
+
+
+	if (numberOfDateFields==2)
+		aTokenCount=3;
+	else if (numberOfDateFields==3)
+		aTokenCount=5;
+	
+	if (aOffset!=0)
+		return(EDatePresent|ETimePresent);
+	return(EDatePresent);
+	}
+
+TInt TStringToDateTime::GetTime(TInt aOffset,TInt& aTokenCount)
+	// aFormulaPos == 0  Time format or TimeDate format with Time first
+	// aFormulaPos != 0  Date preceeds Time i.e. DateTime format
+	// 7 formats 10:00:00.012345 // 10:00:00.012345pm // 10:00:00pm // 10:00:00 // 10:00pm // 10:00 // 10pm
+	// offset and relativeCount allow this function to check times 
+	// when both the Time(10:00pm) and DateTime(3-feb-69 10:00pm) formats are used.
+	{
+
+	TInt relativeCount=iCount;
+	if (aOffset!=0)// DateTime // else format==Time
+		{
+		relativeCount-=aOffset;
+		if (relativeCount<=-1)
+			return(EDatePresent);
+		}
+	TInt fields=0;
+
+	if (IsTimeSeparator(iFormula[1+aOffset]) && IsTimeSeparator(iFormula[3+aOffset])&& 
+		 (IsTimeSeparator(iFormula[5+aOffset]) || IsDecimalSeparator(iFormula[5+aOffset])))
+		{
+		fields=4;// 10:00:00.000000 (am)
+		aTokenCount=7; 
+		if (IsAmPm(iFormula[7+aOffset]))
+			aTokenCount+=1;
+		}
+	else if (IsTimeSeparator(iFormula[1+aOffset]) && IsTimeSeparator(iFormula[3+aOffset]))
+		{
+		fields=3;// 10:00:00 (am)
+		aTokenCount=5; 
+		if (IsAmPm(iFormula[5+aOffset]))
+			aTokenCount+=1;
+		}
+	else if (IsTimeSeparator(iFormula[1+aOffset]))
+		{
+		fields=2;// 10:00 (am)
+		aTokenCount=3;
+		if (IsAmPm(iFormula[3+aOffset]))
+			aTokenCount+=1;
+		}
+	else if (IsAmPm(iFormula[1+aOffset]))
+		{
+		fields=1;// 10am
+		aTokenCount=2;
+		}
+	if (fields==0 || (fields==4 && relativeCount==6) || (fields==3 && relativeCount==4) || (fields==2 && relativeCount==2))
+		return(KErrArgument);// Colon\DecimalPoint in wrong place 10:00:00. || 10:00: || 10:
+	
+	TInt error;
+	if ((error=iDateTime.SetHour(iFormula[0+aOffset]))!=KErrNone)
+		return error;
+	if (fields==2)
+		error=iDateTime.SetMinute(iFormula[2+aOffset]);
+	else if (fields==3)
+		{
+		if ((error=iDateTime.SetMinute(iFormula[2+aOffset]))==KErrNone)
+			error=iDateTime.SetSecond(iFormula[4+aOffset]);
+		}
+	else if (fields==4)
+		{
+		if ((error=iDateTime.SetMinute(iFormula[2+aOffset]))==KErrNone)
+			 if ((error=iDateTime.SetSecond(iFormula[4+aOffset]))==KErrNone)
+				 error = iDateTime.SetMicroSecond(iFormula[6+aOffset]);
+		}
+	if (error!=KErrNone)
+		return(error);
+
+	TInt ampmIndex=2*fields-1;
+	if (iFormula[ampmIndex+aOffset]==ETokenAm && iDateTime.Hour()==12)
+		error=iDateTime.SetHour(00);// 12am->00 hrs. Ignore 13am
+	else if (iFormula[ampmIndex+aOffset]==ETokenPm && iDateTime.Hour()<12)
+		error=iDateTime.SetHour(iDateTime.Hour()+12);
+	if (error!=KErrNone)
+		return(error);
+
+	if (aOffset!=0)
+		return(ETimePresent|EDatePresent);
+	return(ETimePresent);
+	}
+
+TInt TStringToDateTime::NextToken(TInt& aTokenLen)
+	{
+	if (iLex.Eos())
+		return ENullToken;
+
+	TChar ch=iLex.Peek();
+
+	if (ch.IsDigit())
+		{
+		iLex.Mark();
+		do iLex.Inc(); while (iLex.Peek().IsDigit());
+
+		TPtrC des=iLex.MarkedToken();
+
+		TInt digit;
+		TLex lex(des);
+		if (lex.Val(digit)!=KErrNone)
+			return(EErrorToken);
+		aTokenLen = des.Length();
+		return(digit);
+		}
+	else if (IsSeparator(ch))
+		{
+		iLex.Inc();
+		iLex.SkipSpace();
+		aTokenLen = 1;
+		return(GetSeparatorToken(ch));
+		}
+	else
+		{
+		iLex.Mark();
+		do iLex.Inc(); while (iLex.Peek().IsAlpha() || iLex.Peek().IsDigit());
+
+		TPtrC des=iLex.MarkedToken();
+		aTokenLen = des.Length();
+
+		for (TInt month=EJanuary; month<=EDecember; ++month)
+			{
+			// Abbreviated month name
+			TMonthNameAbb nameAbb((TMonth)month);
+			if (nameAbb.CompareF(des)==0)
+				return(-(month+1)); // All values negative
+
+			// Full month name
+			TMonthName name((TMonth)month);
+			if (name.CompareF(des)==0)
+				return(-(month+1)); // All values negative
+			}
+
+		// Substring of am or pm
+		TAmPmName am(EAm);
+		TAmPmName pm(EPm);
+			
+		if (am.FindF(des)==0)
+			return(ETokenAm);
+		else if (pm.FindF(des)==0)
+			return(ETokenPm);
+		
+		return(EErrorToken);
+		}
+	}
+
+
+TInt TStringToDateTime::Parse(TTime& aTime)
+	{
+
+	iLex.SkipSpace();
+	TInt i = 0;
+	for (;;)
+		{
+		if (i==EMaxTokens-1)	// space left to append NullToken
+			return KErrArgument;
+		TInt len;
+		TInt token=NextToken(len);// uses iLex
+		if (token==EErrorToken)
+			return KErrArgument;
+		if (token==ENullToken)
+			break;
+		iFormula[i]=token;	// append token to formula
+		iTokenLen[i]=(TUint8)Min(len, 255);
+		++i;
+		}
+	iCount=i;
+
+	StripSpaceTokens();// Uses then resets iCount
+	TInt ret=CrackTokenFormula();
+	if (ret<0)
+		return(ret);
+	if (iDateTime.Year()>9999)
+		return KErrArgument;
+	aTime=iDateTime;
+	return(ret);
+	}
+
+EXPORT_C TInt TTime::Parse(const TDesC& aDes,TInt aCenturyOffset)
+/**
+Parses a descriptor containing either or both a date and time, and sets this 
+TTime to the value of the parsed descriptor.
+	
+The descriptor may contain the date only, the time only, the date followed 
+by the time, or the time followed by the date. When both the date and time 
+are specified in the descriptor, they should be separated using one or more 
+space characters. 
+	
+Leading zeros and spaces preceding any time or date components are discarded.
+	
+Dates may be specified either with all three components (day, month and year), 
+or with just two components; for example month and day. The date suffix ("st" 
+"nd" "rd" or "th") may not be included in the descriptor.
+	
+The date and its components may take different forms:
+	
+1. The month may be represented by text or by numbers.
+	
+2  European (DD/MM/YYYY), American (MM/DD/YYYY) and Japanese (YYYY/MM/DD) date 
+   formats are supported. An exception to this ordering of date components occurs 
+   when European or American formatting is used and the month is represented 
+   by text. In this case, the month may be positioned in either the first or 
+   second field. When using Japanese date format, the month, whether text or 
+  numbers, must always be the second field.
+	
+3. The year may be two or four digits. When the year is a two digit number, (e.g. 
+   97 rather than 1997), to resolve any confusion as to which century the year 
+   falls in, the second argument determines the century. For example, if the 
+   current year is 1997, a value for aCenturyOffset of 20 means that any two 
+   digit year will resolve to a year in the range 1920 to 2019. In this case, 
+   two digit years between 00 and 19 inclusive refer to the years between 2000 
+   and 2019 and two digit years between 20 and 99 inclusive refer to the years 
+   between 1920 and 1999. By default, two digit years are in the current century 
+   (aCenturyOffset = 0).
+	
+4. Any of the following characters may be used as the date separator: /(slash) 
+   - (dash) , (comma), spaces, or either of the date separator characters specified 
+   in TLocale::SetDateSeparator() (at index 1 or 2). Other characters are illegal.
+	
+If a colon or a dot has been specified in TLocale as the date separator character, 
+neither may be used as date separators in this function.
+	
+If specified, the time must include the hour, but both minutes and seconds, 
+or seconds alone may be omitted. 
+	
+The time and its components may take different forms:
+	
+1. An am/pm time suffix may be appended to the time. If 24 hour clock format 
+   is in use, this text will be ignored. 
+	
+2. The am/pm suffix may be abbreviated to "a" or "p".
+	
+3. Any of the following characters may be used as the time separator: :(colon) 
+   .(dot) or either of the time separator characters specified in
+   TLocale::SetDateSeparator() (at index 1 or 2). Other characters are illegal.
+	
+When a character can be interpreted as either a date or time separator character, 
+this function will interpret it as a date separator.
+	
+Look out for cases in which wrongly interpreting the contents of a descriptor, 
+based on the interpretation of separator characters, causes an error. For 
+example, trying to interpret "5.6.1996" as a time is invalid and will return 
+an error of -2 because 1,996 seconds is out of range.
+	
+Notes:
+	
+1. The entire content of the descriptor must be valid and syntactically correct, 
+   or an error will be returned and the parse will fail. So, excepting whitespace, 
+   which is discarded, any trailing characters within the descriptor which do 
+   not form part of the date or time are illegal. 
+	
+2. If no time is specified in the descriptor, the hours, minutes and seconds 
+   of this TTime are all set to zero, corresponding to midnight at the start 
+   of the day specified in the date. If no date is specified, each of this TTime's 
+   date components are set to zero.
+
+@param aDes           Descriptor containing any combination of date and
+                      time as text.
+@param aCenturyOffset Offset between zero (the default) and 99. Allows a flexible 
+                      interpretation of the century for two digit year values.
+                      If less than zero, or greater than 99, a panic occurs.
+                      
+@return If equal to or greater than zero, the function completed successfully. 
+        EParseDatePresent and/or EParseTimePresent indicate whether either or both 
+        of the date or time are present.
+        If less than zero, an error code.
+        KErrGeneral indicates that the time or date value is out of range,
+        e.g. if the hour is greater than 23 or if the minute is greater
+        than 59.
+        KErrNotSupported indicates that a two field date has been entered.
+        KErrArgument indicates that the descriptor was syntactically incorrect.
+        If the function fails, this TTime object remains unchanged.
+*/
+	{
+
+	TStringToDateTime parse(aDes,aCenturyOffset);
+	return parse.Parse(*this);
+	}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32/euser/us_que.cpp	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,852 @@
+// Copyright (c) 1994-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32\euser\us_que.cpp
+//
+//
+
+#include "us_std.h"
+
+EXPORT_C void TSglQueLink::Enque(TSglQueLink* aLink)
+//
+// Enque this after aLink.
+//
+	{
+
+	iNext=aLink->iNext;
+	aLink->iNext=this;
+	}
+
+
+
+
+EXPORT_C void TDblQueLinkBase::Enque(TDblQueLinkBase* aLink)
+/**
+Inserts this link object after the specified link object.
+
+The specified link object must already be in the doubly linked list.
+
+The function cannot be used to insert a list element into the beginning or
+end of a doubly linked list; this is handled by the TDblQue::AddFirst()
+and TDblQue::AddLast() functions.
+
+@param aLink A pointer to the link object embedded within the list element
+             to which this link object is to be connected. It must not be NULL.
+
+@see TDblQue
+*/
+	{
+
+	iNext=aLink->iNext;
+	iPrev=aLink;
+	aLink->iNext->iPrev=this;
+	aLink->iNext=this;
+	}
+
+
+
+
+EXPORT_C void TDblQueLinkBase::AddBefore(TDblQueLinkBase* aLink)
+/**
+Inserts this link object before the specified link object.
+
+The specified link object must already be in the doubly linked list.
+
+The function cannot be used to insert a list element into the beginning or
+end of a doubly linked list; this is handled by the TDblQue::AddFirst()
+and TDblQue::AddLast() functions.
+
+@param aLink A pointer to the link object embedded within the list element
+             to which this link object is to be connected. It must not be NULL.
+
+@see TDblQue
+*/
+	{
+
+	iNext=aLink;
+	iPrev=aLink->iPrev;
+	aLink->iPrev->iNext=this;
+	aLink->iPrev=this;
+	}
+
+
+
+
+EXPORT_C void TDblQueLink::Deque()
+/**
+Removes this link object from the doubly linked list.
+
+In effect, this removes the list element that acts as host to this link object
+from the doubly linked list.
+
+The link object can be any in the doubly linked list.
+
+It is safe to use this method on an object which has already been removed from the list.
+
+@post iNext member is set to NULL
+*/
+	{
+
+	if (iNext)
+		{
+	    iPrev->iNext=iNext;
+		iNext->iPrev=iPrev;
+		iNext=NULL;
+		}
+	}
+
+
+
+
+EXPORT_C TSglQueBase::TSglQueBase()
+	: iHead(NULL),iLast((TSglQueLink*)&iHead),iOffset(0)
+/**
+Default constructor.
+
+It sets:
+
+1. iHead to Null.
+
+2. iLast to point to the head  of queue.
+
+3. iOffset to zero.
+
+@see iHead
+@see iLast
+@see iOffset
+*/
+	{}
+
+
+
+
+EXPORT_C TSglQueBase::TSglQueBase(TInt aOffset)
+	: iHead(NULL),iLast((TSglQueLink*)&iHead),iOffset(aOffset)
+/**
+Constructor with specified offset.
+
+It sets:
+
+1. iHead to Null
+
+2. iLast to point to the head of queue.
+
+3. iOffset to the specified value.
+
+@param aOffset The offset of a link object within an element.
+
+@panic USER 75, if aOffset is not divisible by four
+
+@see iHead
+@see iLast
+@see iOffset
+*/
+	{
+
+	__ASSERT_ALWAYS(iOffset%4==0,Panic(ESQueOffsetNotAligned));
+	}
+
+
+
+
+EXPORT_C TBool TSglQueBase::IsEmpty() const
+/**
+Tests whether the singly linked list is empty, i.e. has no list elements.
+
+@return True, if the singly linked list is empty; false, otherwise.
+*/
+	{
+
+	return(iHead==NULL);
+	}
+
+
+
+
+EXPORT_C void TSglQueBase::SetOffset(TInt aOffset)
+/**
+Sets the offset of the link object from the start of a singly linked
+list element.
+
+@param aOffset The offset of the link object from the start of a singly linked
+               list element.
+
+@panic USER 75, if aOffset is not divisible by four.
+
+@see TSglQue
+*/
+	{
+
+	__ASSERT_ALWAYS(iOffset%4==0,Panic(ESQueOffsetNotAligned));
+	iOffset=aOffset;
+	}
+
+
+
+
+
+EXPORT_C void TSglQueBase::Reset()
+/**
+Empties the singly linked list.
+
+After a call to this function, there are no elements queued from the header;
+the elements are orphaned. Special care must be taken when list elements are
+CBase derived objects, i.e. are allocated on the heap.
+*/
+	{
+
+	iHead=NULL;
+	iLast=(TSglQueLink*)&iHead;
+	}
+
+
+
+
+
+EXPORT_C void TSglQueBase::DoAddFirst(TAny* aPtr)
+/**
+Implements the insertion of a list element at the front of the singly linked
+list.
+
+This function is called by TSglQue::AddFirst().
+
+@param aPtr An untyped pointer to the element to be inserted.
+
+@see TSglQue::AddFirst
+*/
+	{
+
+	TSglQueLink* pL=PtrAdd((TSglQueLink*)aPtr,iOffset);
+	pL->Enque((TSglQueLink*)&iHead);
+	if (iLast==(TSglQueLink*)(&iHead))
+		iLast=pL;
+	}
+
+
+
+
+EXPORT_C void TSglQueBase::DoAddLast(TAny* aPtr)
+/**
+Implements the insertion of a list element at the back of the singly linked
+list.
+
+This function is called by TSglQue::AddLast().
+
+@param aPtr An untyped pointer to the element to be inserted.
+
+@see TSglQue::AddLast
+*/
+	{
+
+	TSglQueLink* pL=PtrAdd((TSglQueLink*)aPtr,iOffset);
+	pL->Enque(iLast);
+	iLast=pL;
+	}
+
+
+
+
+EXPORT_C void TSglQueBase::DoRemove(TAny* aPtr)
+/**
+Implements the removal of a list element from the singly linked list.
+
+This function is called by TSglQue::Remove().
+
+@param aPtr An untyped pointer to the element to be removed.
+
+@see TSglQue::Remove
+*/
+	{
+
+	TSglQueLink* pP=(TSglQueLink*)(&iHead);
+	TSglQueLink* pL=PtrAdd((TSglQueLink*)aPtr,iOffset);
+	TSglQueLink* pN=pP->iNext;
+	while (pN)
+		{
+		if (pN==pL)
+			{
+			pP->iNext=pN->iNext;
+			if (iLast==pL)
+				{
+				iLast=pP;
+				if (iLast==NULL)
+					iLast=(TSglQueLink*)(&iHead);
+				}
+			return;
+			}
+		pP=pN;
+		pN=pP->iNext;
+		}
+	Panic(ESQueLinkNotQueued);
+	}
+
+
+
+
+//#pragma warning( disable : 4705 )	// statement has no effect
+EXPORT_C TDblQueBase::TDblQueBase()
+	: iOffset(0)
+/**
+Default constructor.
+
+It sets:
+
+1. iHead to point to this object in both the forwards and backwards direction.
+
+2. iOffset to zero.
+
+@see iHead
+@see iOffset
+*/
+	{
+
+	iHead.iNext=iHead.iPrev=(&iHead);
+	}
+
+
+
+
+EXPORT_C TDblQueBase::TDblQueBase(TInt aOffset)
+	: iOffset(aOffset)
+/**
+Constructor with specified offset.
+
+It sets:
+
+1. iHead to point to this object in both the forwards and backwards direction.
+
+2. iOffset to the specified value.
+
+@param aOffset The offset of a link object within an element.
+
+@panic USER 78, if aOffset is not divisible by four
+
+@see iHead
+@see iOffset
+*/
+	{
+
+	__ASSERT_ALWAYS(iOffset%4==0,Panic(ETQueOffsetNotAligned));
+	iHead.iNext=iHead.iPrev=(&iHead);
+	}
+//#pragma warning( default : 4705 )
+
+
+
+
+EXPORT_C TBool TDblQueBase::IsEmpty() const
+/**
+Tests whether the doubly linked list is empty, i.e. has no list elements.
+
+@return True, if the doubly linked list is empty; false, otherwise.
+*/
+	{
+
+	return((const TDblQueLinkBase*)iHead.iNext==(&iHead));
+	}
+
+
+
+
+EXPORT_C void TDblQueBase::SetOffset(TInt aOffset)
+/**
+Sets the offset of the link object from the start of a doubly linked list element.
+
+@param aOffset The offset of the link object from the start of a doubly linked
+               list element.
+
+@panic USER 78, if aOffset is not divisible by four.
+
+@see TDblQue
+*/
+	{
+
+	__ASSERT_ALWAYS(iOffset%4==0,Panic(ETQueOffsetNotAligned));
+	iOffset=aOffset;
+	}
+
+
+
+
+EXPORT_C void TDblQueBase::Reset()
+/**
+Empties the doubly linked list.
+
+After a call to this function, there are no elements queued from the header;
+the elements are orphaned. Special care must be taken when list elements are
+CBase derived objects, i.e. are allocated on the heap.
+*/
+	{
+
+	iHead.iNext=iHead.iPrev=(&iHead);
+	}
+
+
+
+
+EXPORT_C void TDblQueBase::DoAddFirst(TAny* aPtr)
+/**
+Implements the insertion of the specified list element at the front of the
+doubly linked list.
+
+This function is called by TDblQue::AddFirst().
+
+@param aPtr An untyped pointer to the element to be inserted.
+
+@see TDblQue::AddFirst
+*/
+	{
+
+	PtrAdd((TDblQueLinkBase*)aPtr,iOffset)->Enque(&iHead);
+	}
+
+
+
+
+EXPORT_C void TDblQueBase::DoAddLast(TAny* aPtr)
+/**
+Implements the insertion of the specified list element at the back of the
+doubly linked list.
+
+This function is called by TDblQue::AddLast().
+
+@param aPtr An untyped pointer to the element to be inserted.
+
+@see TDblQue::AddLast*/
+	{
+
+	PtrAdd((TDblQueLinkBase*)aPtr,iOffset)->Enque(iHead.iPrev);
+	}
+
+
+
+
+EXPORT_C void TDblQueBase::DoAddPriority(TAny* aPtr)
+/**
+Implements the insertion of the specified list element in priority order.
+
+This function is called by TPriQue::Add().
+
+@param aPtr An untyped pointer to the element to be inserted.
+
+@see TPriQue::Add
+*/
+	{
+
+	TPriQueLink* pN=(TPriQueLink*)iHead.iNext;
+	TPriQueLink* pI=PtrAdd((TPriQueLink*)aPtr,iOffset);
+	TInt p=pI->iPriority;
+	while (pN!=(TPriQueLink*)&iHead && p<=pN->iPriority)
+		pN=(TPriQueLink*)pN->iNext;
+	pI->Enque(pN->iPrev);
+	}
+
+
+
+
+EXPORT_C TDeltaQueBase::TDeltaQueBase()
+	: iFirstDelta(NULL)
+/**
+Default constructor.
+
+It sets iFirstDelta to NULL.
+
+@see TDeltaQueBase::iFirstDelta
+*/
+	{
+	}
+
+
+
+
+EXPORT_C TDeltaQueBase::TDeltaQueBase(TInt aOffset)
+	: TDblQueBase(aOffset),iFirstDelta(NULL)
+/**
+Constructor with specified offset.
+
+It sets:
+
+1. iFirstDelta to NULL
+
+2. TDblQueBase::iOffset to the specified value, through a call to the
+   base class  constructor.
+
+@param aOffset The offset of a link object within an element.
+
+@see TDeltaQueBase::iFirstDelta
+@see TDblQueBase::iOffset
+*/
+	{
+	}
+
+
+
+
+EXPORT_C void TDeltaQueBase::Reset()
+/**
+Empties the doubly linked list, and resets the first delta pointer.
+*/
+	{
+
+	TDblQueBase::Reset();
+	iFirstDelta=NULL;
+	}
+
+
+
+
+EXPORT_C TBool TDeltaQueBase::FirstDelta(TInt& aValue)
+/**
+Gets the delta value of the first list element.
+
+@param aValue On return, contsins the delta value of the first element.
+              Note that this remains unchanged if there is no first element.
+
+@return True, if there is a first element; false, otherwise.
+*/
+    {
+    if (iFirstDelta)
+        {
+        aValue=*iFirstDelta;
+        return(ETrue);
+        }
+    return(EFalse);
+    }
+
+
+
+
+EXPORT_C TBool TDeltaQueBase::CountDown()
+/**
+Decrements the delta value of the first element by one, and returns true if
+the result is negative or zero.
+
+@return True, if the resulting delta value is negative or zero; false, if
+        the value is positive, or there is no first element.
+*/
+	{
+
+    return(CountDown(1));
+	}
+
+
+
+
+EXPORT_C TBool TDeltaQueBase::CountDown(TInt aValue)
+/**
+Decrements the delta value of the first element by the specified value, and
+returns true if the result is negative or zero.
+
+@param aValue The amount by which the delta value is to be reduced.
+
+@return True, if the resulting delta value is negative or zero; false, if the
+        value is positive, or there is no first element.
+*/
+	{
+
+	if (iFirstDelta)
+		{
+		(*iFirstDelta)-=aValue;
+		if (*iFirstDelta<=0)
+			return(ETrue);
+		}
+	return(EFalse);
+	}
+
+
+
+
+EXPORT_C void TDeltaQueBase::DoAddDelta(TAny* aPtr,TInt aDelta)
+/**
+Implements the addition of the specified list element into the list.
+
+This function is called by TDeltaQue::Add().
+
+@param aPtr   Pointer to the list element to be inserted.
+@param aDelta The 'distance' from the nominal zero point.
+
+@see TDeltaQue::Add
+*/
+	{
+
+	TDeltaQueLink* pD=(TDeltaQueLink*)iHead.iNext;
+	TDeltaQueLink* pI=PtrAdd((TDeltaQueLink*)aPtr,iOffset);
+	while (pD!=(TDeltaQueLink*)&iHead && aDelta>=pD->iDelta)
+		{
+		aDelta-=pD->iDelta;
+		pD=(TDeltaQueLink*)pD->iNext;
+		}
+	pI->iDelta=aDelta;
+	pI->Enque(pD->iPrev);
+	if (pI->iNext!=&iHead)
+		pD->iDelta-=aDelta;
+	iFirstDelta=(&((TDeltaQueLink*)iHead.iNext)->iDelta);
+	}
+
+
+
+
+EXPORT_C void TDeltaQueBase::DoRemove(TAny* aPtr)
+/**
+Implements the removal of the specified list element from the list.
+
+This function is called by TDeltaQue::Remove().
+
+@param aPtr Pointer to the list element to be removed.
+
+@see TDeltaQue::Remove
+*/
+	{
+
+	TDeltaQueLink* pI=PtrAdd((TDeltaQueLink*)aPtr,iOffset);
+	TDeltaQueLink* pN=(TDeltaQueLink*)pI->iNext;
+	if (pN!=(TDeltaQueLink*)&iHead)
+		pN->iDelta+=pI->iDelta;
+	((TDblQueLink*)pI)->Deque();
+	iFirstDelta=(iHead.iNext!=(&iHead) ? &((TDeltaQueLink*)iHead.iNext)->iDelta : NULL);
+	}
+
+
+
+
+EXPORT_C TAny* TDeltaQueBase::DoRemoveFirst()
+/**
+Implements the removal of the first list element from the linked list if its
+delta value is zero or negative.
+
+This function is called by TDeltaQue::RemoveFirst().
+
+@return A pointer to the element removed from the linked list. This is NULL,
+        if the first element has a positive delta value.
+
+@see TDeltaQue::RemoveFirst
+*/
+	{
+
+	TDeltaQueLink* pN=(TDeltaQueLink*)iHead.iNext;
+	if (pN!=(TDeltaQueLink*)&iHead && pN->iDelta<=0)
+		{
+		pN=PtrSub(pN,iOffset);
+		DoRemove(pN);
+		return(pN);
+		}
+	return(NULL);
+	}
+
+
+
+
+EXPORT_C TSglQueIterBase::TSglQueIterBase(TSglQueBase& aQue)
+//
+// Cosntructor.
+//
+	: iOffset(aQue.iOffset),iHead((TSglQueLink*)&aQue.iHead),iNext(aQue.iHead)
+	{}
+
+
+
+
+EXPORT_C void TSglQueIterBase::SetToFirst()
+/**
+Sets the iterator to point to the first element in the singly linked list.
+
+The function can be called to re-set the pointer at any time during the iterator's
+existence.
+
+The function can be called even if the list has no elements.
+*/
+	{
+
+	iNext=iHead->iNext;
+	}
+
+
+
+
+EXPORT_C void TSglQueIterBase::DoSet(TAny* aLink)
+//
+// Start the iterator at aLink.
+//
+	{
+
+	iNext=PtrAdd((TSglQueLink*)aLink,iOffset);
+	}
+
+EXPORT_C TAny* TSglQueIterBase::DoPostInc()
+//
+// Return the current pointer and increment.
+//
+	{
+
+	TAny* pN=iNext;
+	if (pN==NULL)
+		return NULL;
+	iNext=iNext->iNext;
+	return(PtrSub(pN,iOffset));
+	}
+
+EXPORT_C TAny* TSglQueIterBase::DoCurrent()
+//
+// Return the current pointer.
+//
+	{
+
+	return(iNext==NULL ? NULL : PtrSub((TAny*)iNext,iOffset));
+	}
+
+
+
+
+EXPORT_C TDblQueIterBase::TDblQueIterBase(TDblQueBase& aQue)
+	: iOffset(aQue.iOffset),iHead(&aQue.iHead),iNext(aQue.iHead.iNext)
+/**
+Constructs the iterator for the specified doubly linked list.
+
+@param aQue A reference to a doubly linked list header.
+*/
+	{}
+
+
+
+
+EXPORT_C void TDblQueIterBase::SetToFirst()
+/**
+Sets the iterator to point to the first element in the doubly linked list.
+
+The function can be called to re-set the pointer at any time during the
+iterator's  existence.
+
+The function can be called even if the list has no elements.
+*/
+	{
+
+	iNext=iHead->iNext;
+	}
+
+
+
+
+EXPORT_C void TDblQueIterBase::SetToLast()
+/**
+Sets the iterator to point to the last element in the doubly linked list. The
+function can be called to re-set the pointer at any time during the
+iterator's existence.
+
+The function can be called even if the list has no elements.
+*/
+	{
+
+	iNext=iHead->iPrev;
+	}
+
+
+
+
+EXPORT_C void TDblQueIterBase::DoSet(TAny* aLink)
+/**
+Sets the iterator to point to a specific element in the list.
+
+The function is an implementation for TDblQueIter::Set().
+
+@param aLink A pointer to the current list element.
+
+@see TDblQueIter::Set
+*/
+	{
+
+	iNext=PtrAdd((TDblQueLinkBase*)aLink,iOffset);
+	}
+
+
+
+
+EXPORT_C TAny* TDblQueIterBase::DoPostInc()
+/**
+Gets the current item and then moves to the next item.
+
+The function is an implementation for TDblQueIter::operator++().
+
+@return A pointer to the current list element.
+
+@see TDblQueIter::operator++
+*/
+	{
+
+	if (iNext==iHead)
+		return(NULL);
+	__ASSERT_DEBUG((iNext->iNext!=NULL)&&(iNext->iPrev!=NULL),Panic(ETQueLinkHasBeenRemoved));
+	TAny* p=PtrSub(iNext,iOffset);
+	iNext=iNext->iNext;
+	return(p);
+	}
+
+
+
+
+EXPORT_C TAny* TDblQueIterBase::DoPostDec()
+/**
+Gets the current item and then moves to the previous item.
+
+The function is an implementation for TDblQueIter::operator--().
+
+@return A pointer to the current list element.
+
+@see TDblQueIter::operator--
+*/
+	{
+
+	if (iNext==iHead)
+		return(NULL);
+	__ASSERT_DEBUG((iNext->iNext!=NULL)&&(iNext->iPrev!=NULL),Panic(ETQueLinkHasBeenRemoved));
+	TAny* p=PtrSub(iNext,iOffset);
+	iNext=iNext->iPrev;
+	return(p);
+	}
+
+
+
+
+EXPORT_C TAny* TDblQueIterBase::DoCurrent()
+/**
+Gets the current item in the queue.
+
+The function is an implementation for TDblQueIter::operator T*().
+
+@return A pointer to the current list element.
+
+@see TDblQueIter::operator T*
+*/
+	{
+
+	if (iNext==iHead)
+		return(NULL);
+	__ASSERT_DEBUG((iNext->iNext!=NULL)&&(iNext->iPrev!=NULL),Panic(ETQueLinkHasBeenRemoved));
+	return(PtrSub(iNext,iOffset));
+	}
+
+
+
+
+EXPORT_C void TDblQueBase::__DbgTestEmpty() const
+/**
+Tests whether the queue is empty.
+
+The function is implemented as an __ASSERT_DEBUG.
+
+@panic USER 79, if the assertion fails.
+*/
+	{
+
+	__ASSERT_DEBUG((((TDblQueLink*)iHead.iNext)!=&iHead)&&(((TDblQueLink*)iHead.iPrev)!=&iHead),Panic(ETQueQueueEmpty));
+	}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32/euser/us_regn.cpp	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,987 @@
+// Copyright (c) 1994-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32\euser\us_regn.cpp
+// Optimisation note, it may well be worth machine coding the SubRect() function
+// this is at the heart of nearly all complex region calculations.
+// 
+//
+
+
+#include "us_std.h"
+
+NONSHARABLE_CLASS(TRectKey) : public TKey
+	{
+public:
+	TRectKey(const TRect *aRectList,const TPoint &aOffset);
+	virtual TInt Compare(TInt aLeft,TInt aRight) const;
+private:
+	const TRect *iRectList;
+	TBool iDown;
+	TBool iRight;
+	};
+
+NONSHARABLE_CLASS(TRectSwap) : public TSwap
+	{
+public:
+	inline TRectSwap(TRect *aRectList);
+	virtual void Swap(TInt aLeft,TInt aRight) const;
+private:
+	TRect *iRectList;
+	};
+
+inline TRectSwap::TRectSwap(TRect *aRectList)
+	{iRectList=aRectList;}
+
+enum {ERegionBufSize=8};
+
+EXPORT_C TRegion::TRegion(TInt aAllocedRects)
+//
+// Constructor.
+//
+	: iCount(0),iError(EFalse),iAllocedRects(aAllocedRects)
+	{}
+
+
+
+
+EXPORT_C TBool TRegion::IsEmpty() const
+/**
+Tests whether the region is empty.
+
+@return True, if the region is empty and its error flag is unset;
+        false, otherwise.
+*/
+	{
+
+	return(iCount==0 && !iError);
+	}
+
+
+
+
+#ifndef __REGIONS_MACHINE_CODED__
+EXPORT_C TRect TRegion::BoundingRect() const
+/**
+Gets the minimal rectangle that bounds the entire region.
+
+@return The region's minimal bounding rectangle.
+*/
+	{
+
+	TRect bounds;
+    const TRect *pRect;
+	const TRect *pEnd;
+	if (iCount>0)
+		{
+		pRect=RectangleList();
+		bounds=(*pRect++);
+		for (pEnd=pRect+(iCount-1);pRect<pEnd;pRect++)
+			{
+			if (pRect->iTl.iX<bounds.iTl.iX)
+				bounds.iTl.iX=pRect->iTl.iX;
+			if (pRect->iTl.iY<bounds.iTl.iY)
+				bounds.iTl.iY=pRect->iTl.iY;
+			if (pRect->iBr.iX>bounds.iBr.iX)
+				bounds.iBr.iX=pRect->iBr.iX;
+			if (pRect->iBr.iY>bounds.iBr.iY)
+				bounds.iBr.iY=pRect->iBr.iY;
+			}
+		}
+	return(bounds);
+	}	
+#endif
+
+
+
+
+EXPORT_C const TRect &TRegion::operator[](TInt aIndex) const
+/**
+Gets a rectangle from the region.
+
+@param aIndex The index of a rectangle within the region's array of rectangles. 
+              Indexes are relative to zero.
+              
+@return The specified rectangle.              
+              
+@panic USER 81, if aIndex is greater than or equal to the number 
+                of rectangles in the region.
+*/
+	{
+
+	__ASSERT_ALWAYS((TUint)aIndex<(TUint)iCount,Panic(ETRegionOutOfRange));
+    return(*(RectangleList()+aIndex));
+    }
+
+
+
+
+#ifndef __REGIONS_MACHINE_CODED__
+EXPORT_C TBool TRegion::IsContainedBy(const TRect &aRect) const
+/**
+Tests whether the region is fully enclosed within the specified rectangle.
+
+@param aRect The specified rectangle.
+ 
+@return True, if the region is fully enclosed within the rectangle (their sides 
+        may touch); false, otherwise.
+*/
+	{
+
+    const TRect *pRect1;
+    const TRect *pEnd1;
+	for (pRect1=RectangleList(),pEnd1=pRect1+iCount;pRect1<pEnd1;pRect1++)
+		{
+		if (pRect1->iTl.iX<aRect.iTl.iX || pRect1->iBr.iX>aRect.iBr.iX || pRect1->iTl.iY<aRect.iTl.iY || pRect1->iBr.iY>aRect.iBr.iY)
+			return(EFalse);
+		}
+	return(ETrue);
+	}
+
+
+
+
+EXPORT_C TBool TRegion::Intersects(const TRect &aRect) const
+/**
+Tests whether where there is any intersection between this region and the specified rectangle.
+
+@param aRect The specified rectangle.
+ 
+@return True, if there is an intersection; false, otherwise.
+*/
+	{
+
+    const TRect *pRect1;
+    const TRect *pEnd1;
+	for (pRect1=RectangleList(),pEnd1=pRect1+iCount;pRect1<pEnd1;pRect1++)
+		{
+		if (aRect.Intersects(*pRect1))
+			return ETrue;
+		}
+	return EFalse;
+	}
+
+
+
+
+EXPORT_C void TRegion::Copy(const TRegion &aRegion)
+/**
+Copies another region to this region.
+
+The state of the specified region's error flag is also copied.
+
+@param aRegion The region to be copied.
+*/
+	{
+
+	if (aRegion.iError)
+		ForceError();
+	else
+		{
+		if (iError)
+			Clear();
+		if (SetListSize(aRegion.iCount))
+			{
+			iCount=aRegion.iCount;
+			Mem::Copy(RectangleListW(), aRegion.RectangleList(), sizeof(TRect)*aRegion.iCount);
+			}
+		}
+	}
+
+
+
+
+EXPORT_C void TRegion::Offset(const TPoint &aOffset)
+/**
+Moves the region by adding a TPoint offset to the co-ordinates of its corners.
+	
+The size of the region is not changed.
+	
+@param aOffset The offset by which the region is moved. The region is moved 
+               horizontally by aOffset.iX pixels and vertically by aOffset.iY pixels.
+*/
+ 	{
+
+	TRect *pR=RectangleListW();
+	const TRect *pE=pR+iCount;
+	while (pR<pE)
+		{
+		pR->Move(aOffset);
+		pR++;
+		}
+	}
+
+
+
+
+EXPORT_C void TRegion::Offset(TInt aXoffset,TInt aYoffset)
+/**
+Moves the region by adding X and Y offsets to the co-ordinates of its corners.
+	
+The size of the region is not changed.
+	
+@param aXoffset The number of pixels by which to move the region horizontally. 
+                If negative, the region moves leftwards. 
+@param aYoffset The number of pixels by which to move the region vertically. 
+                If negative, the region moves upwards.
+*/
+	{
+
+	Offset(TPoint(aXoffset,aYoffset));
+	}
+
+
+
+
+EXPORT_C TBool TRegion::Contains(const TPoint &aPoint) const
+/**
+Tests whether a point is located within the region.
+
+If the point is located on the top or left hand side of any rectangle in the 
+region, it is considered to be within that rectangle and within the region. 
+
+If the point is located on the right hand side or bottom of a rectangle, it 
+is considered to be outside that rectangle, and may be outside the region.
+
+@param aPoint The specified point. 
+
+@return True, if the point is within the region; false, otherwise.
+*/
+	{
+	const TRect *pR=RectangleList();
+	const TRect *pE=pR+iCount;
+	while (pR<pE)
+		{
+		if (pR->Contains(aPoint))
+			return(ETrue);
+		pR++;
+		}
+	return(EFalse);
+	}
+
+
+
+
+EXPORT_C void TRegion::SubRect(const TRect &aRect,TRegion *aSubtractedRegion)
+/**
+Removes a rectangle from this region.
+
+If there is no intersection between the rectangle and this region, then this 
+region is unaffected. 
+
+@param aRect             The rectangular area to be removed from this region. 
+@param aSubtractedRegion A pointer to a region. If this is supplied, the
+                         removed rectangle is added to it. By default this
+                         pointer is NULL.
+*/
+	{
+	if (aRect.IsEmpty())
+		return;
+	TRect *prect=RectangleListW();
+	TInt limit=iCount;
+	for (TInt index=0;index<limit;)
+		{
+		if (prect->iBr.iX>aRect.iTl.iX && prect->iBr.iY>aRect.iTl.iY && prect->iTl.iX<aRect.iBr.iX && prect->iTl.iY<aRect.iBr.iY)
+			{
+			TRect rect(*prect);
+			TRect inter(aRect);
+			inter.Intersection(*prect);
+			DeleteRect(prect);
+			if (inter.iBr.iY!=rect.iBr.iY)
+				AppendRect(TRect(rect.iTl.iX,inter.iBr.iY,rect.iBr.iX,rect.iBr.iY));
+			if (inter.iTl.iY!=rect.iTl.iY)
+				AppendRect(TRect(rect.iTl.iX,rect.iTl.iY,rect.iBr.iX,inter.iTl.iY));
+			if (inter.iBr.iX!=rect.iBr.iX)
+				AppendRect(TRect(inter.iBr.iX,inter.iTl.iY,rect.iBr.iX,inter.iBr.iY));
+			if (inter.iTl.iX!=rect.iTl.iX)
+				AppendRect(TRect(rect.iTl.iX,inter.iTl.iY,inter.iTl.iX,inter.iBr.iY));
+			if (iError)
+				break;
+			if (aSubtractedRegion!=NULL)
+				aSubtractedRegion->AddRect(inter);
+			prect=RectangleListW()+index;		// List might have been re-allocated so re-get the pointer
+			limit--;
+			}
+		else
+			{
+			index++;
+			prect++;
+			}
+		}
+	}
+#endif
+
+
+
+
+EXPORT_C void TRegion::Union(const TRegion &aRegion)
+/**
+Replaces this region with the union of it and the specified region.
+
+Note that if the error flag of either this region or the specified region is
+set, then this region is cleared and its error flag is set. This frees up
+allocated memory.
+
+@param aRegion The region to be joined to this region.
+*/
+	{
+	RRegionBuf<ERegionBufSize> temp;
+	temp.Copy(aRegion);
+	if (temp.iCount>iCount)
+		{
+		temp.AppendRegion(*this);
+		Copy(temp);
+		}
+	else
+		AppendRegion(temp);
+	temp.Close();
+	}
+
+
+
+
+#ifndef __REGIONS_MACHINE_CODED__
+EXPORT_C void TRegion::Intersection(const TRegion &aRegion1,const TRegion &aRegion2)
+/**
+Replaces this region with the area of intersection between two specified regions.
+	
+Notes:
+	
+1. If the error flag of either of the two specified regions is set, then this 
+   region is cleared and its error flag is set. This frees up allocated memory.
+	
+2. If this region's error flag is already set, then the function has no effect.
+	
+@param aRegion1 The first region. 
+@param aRegion2 The second region.
+*/
+    {
+	if (aRegion1.iError || aRegion2.iError)
+		ForceError();
+	else
+		{
+		iCount=0;
+		const TRect *pRect1,*pEnd1;
+		const TRect *pRect2,*pEnd2;
+		for (pRect1=aRegion1.RectangleList(),pEnd1=pRect1+aRegion1.iCount;pRect1<pEnd1;pRect1++)
+			{
+			for (pRect2=aRegion2.RectangleList(),pEnd2=pRect2+aRegion2.iCount;pRect2<pEnd2;pRect2++)
+				{
+				if (pRect1->iBr.iX>pRect2->iTl.iX && pRect1->iBr.iY>pRect2->iTl.iY && pRect1->iTl.iX<pRect2->iBr.iX && pRect1->iTl.iY<pRect2->iBr.iY)
+					{
+					TRect rect(*pRect2);
+					rect.Intersection(*pRect1);
+					AppendRect(rect);
+					}
+				}
+			}
+		}
+	}
+#endif
+
+
+
+
+EXPORT_C void TRegion::Intersect(const TRegion &aRegion)
+/**
+Replaces this region with the area of intersection between it and the specified 
+region.
+
+Note that if the error flag of either this region or the specified region is
+set, then this region is cleared and its error flag is set. This frees up
+allocated memory.
+
+@param aRegion The region to be intersected with this region.
+*/
+	{
+	if (iCount!=0)
+		{
+		RRegionBuf<ERegionBufSize> temp;
+		temp.Copy(*this);
+		Intersection(temp,aRegion);
+		temp.Close();
+		}
+	}
+
+
+
+
+EXPORT_C void TRegion::AddRect(const TRect &aRect)
+/**
+Adds a rectangle to this region.
+
+Notes:
+
+1. If this region's error flag is already set, this function has no effect.
+
+2. If the operation causes the capacity of this region to be exceeded, or if 
+   memory allocation fails, the region is cleared, freeing up any memory which 
+   has been allocated; its error flag is also set.
+
+@param aRect The rectangle to be added to this region.
+*/
+	{
+
+	if (!aRect.IsEmpty() && !iError)
+		{
+		if (IsContainedBy(aRect))
+			{
+			iCount=0;
+			AppendRect(aRect);
+			}
+		else
+			{
+			RRegionBuf<ERegionBufSize> temp(aRect);
+			AppendRegion(temp);
+			temp.Close();
+			}
+		}
+	}
+
+
+
+
+EXPORT_C void TRegion::SubRegion(const TRegion &aRegion,TRegion *aSubtractedRegion)
+/**
+Removes a region.
+
+If there is no area of intersection between the two regions, this region is 
+unaffected.
+
+@param aRegion           The region to be removed from this region.
+                         If aRegion's error flag is set, then this region is
+                         cleared, freeing up any allocated memory, and the
+                         error flag is set.
+@param aSubtractedRegion If specified, then on return contains the area removed 
+                         from this region.
+*/
+	{
+	if (iCount!=0)
+		{
+		if (aRegion.iError)
+			ForceError();
+		else
+			{
+			const TRect *pR=aRegion.RectangleList();
+			const TRect *pE=pR+aRegion.iCount;
+			while (pR<pE && !iError)
+				SubRect(*pR++,aSubtractedRegion);
+			if (iError && aSubtractedRegion)
+				aSubtractedRegion->ForceError();
+			}
+		}
+	}
+
+
+
+
+#ifndef __REGIONS_MACHINE_CODED__
+EXPORT_C void TRegion::ClipRect(const TRect &aRect)
+/**
+Clips the region to the specified rectangle.
+
+The resulting region is the area of overlap between the region and the rectangle. 
+If there is no overlap, all rectangles within this region are deleted and 
+the resulting region is empty.
+
+@param aRect The rectangle to which this region is to be clipped.
+*/
+	{
+
+	for (TInt index=0;index<iCount;)
+		{
+		TRect *r2=RectangleListW()+index;
+		if (r2->iTl.iX<aRect.iTl.iX)
+			r2->iTl.iX=aRect.iTl.iX;
+		if (r2->iTl.iY<aRect.iTl.iY)
+			r2->iTl.iY=aRect.iTl.iY;
+		if (r2->iBr.iX>aRect.iBr.iX)
+			r2->iBr.iX=aRect.iBr.iX;
+		if (r2->iBr.iY>aRect.iBr.iY)
+			r2->iBr.iY=aRect.iBr.iY;
+		if (r2->IsEmpty())
+			DeleteRect(r2);
+		else
+			index++;
+		}
+	}
+#endif
+
+
+
+
+EXPORT_C void TRegion::Clear()
+/**
+Clears this region.
+
+This frees up any memory which has been allocated and unsets the error flag.
+*/
+	{
+
+	if (iAllocedRects>=0)
+		{
+		User::Free(((RRegion *)this)->iRectangleList);
+		((RRegion *)this)->iRectangleList=NULL;
+		iAllocedRects=0;
+		}
+	iCount=0;
+	iError=EFalse;
+	}
+
+
+
+
+
+#ifndef __REGIONS_MACHINE_CODED__
+EXPORT_C void TRegion::Tidy()
+/**
+Merges all rectangles within this region which share an adjacent edge of the 
+same length.
+
+The function subsequently frees up any allocated but unused memory.
+*/
+	{
+restart:
+	if (iCount>1)
+		{
+		const TRect *pEnd1=RectangleList()+iCount-1;
+		const TRect *pEnd2=RectangleList()+iCount;
+		TRect *pRect1=RectangleListW();
+		for (;pRect1<pEnd1;pRect1++)
+			{
+			TRect *pRect2=pRect1+1;
+			for (;pRect2<pEnd2;pRect2++)
+				{
+				if (pRect1->iTl.iX==pRect2->iTl.iX && pRect1->iBr.iX==pRect2->iBr.iX)
+					{
+					if (pRect1->iBr.iY==pRect2->iTl.iY)
+						pRect1->iBr.iY=pRect2->iBr.iY;
+					else if (pRect1->iTl.iY==pRect2->iBr.iY)
+						pRect1->iTl.iY=pRect2->iTl.iY;
+					else
+						continue;
+					}
+				else if (pRect1->iTl.iY==pRect2->iTl.iY && pRect1->iBr.iY==pRect2->iBr.iY)
+					{
+					if (pRect1->iBr.iX==pRect2->iTl.iX)
+						pRect1->iBr.iX=pRect2->iBr.iX;
+					else if (pRect1->iTl.iX==pRect2->iBr.iX)
+						pRect1->iTl.iX=pRect2->iTl.iX;
+					else
+						continue;
+					}
+				else
+					continue;
+				DeleteRect(pRect2);
+				goto restart;
+				}
+			}
+		}
+	if (iAllocedRects>iCount)
+		{
+		TRect *newList=(TRect *)User::ReAlloc(((RRegion *)this)->iRectangleList,iCount*sizeof(TRect));
+		if (newList!=NULL)
+			{
+			iAllocedRects=iCount;
+			((RRegion *)this)->iRectangleList=newList;
+			}
+		}
+	}
+#endif
+
+
+
+
+EXPORT_C TInt TRegion::Sort()
+/**
+Sorts the region's array of rectangles according to their vertical position 
+on the screen.
+
+The sort uses the bottom right hand corner co-ordinates of the rectangles.
+The co-ordinates of the top and left hand sides are irrelevant 
+to the sort operation.
+
+Higher rectangles take precedence over lower ones. For rectangles at the same 
+vertical position, the leftmost takes priority.
+
+Note that the sort order may need to be different from the default if, for example, 
+a region is moved downwards so that lower non-overlapping rectangles need 
+to be redrawn (and sorted) before higher ones. In this case, use the second 
+overload of this function.
+
+@return KErrNone, if the operation is successful; KErrGeneral, otherwise.
+*/
+	{
+
+	return Sort(TPoint(-1,-1));
+	}
+
+
+
+
+EXPORT_C TInt TRegion::Sort(const TPoint &aOffset)
+//
+// Sort the region for copying to the same display.
+//
+/**
+Sorts the region's array of rectangles according to a specified sort order.
+
+The sort uses the bottom right hand co-ordinates of the rectangles.
+The co-ordinates of the top and left hand sides are irrelevant 
+to the sort operation
+
+The order of the sort is determined by whether the iX and iY members of aOffset 
+are positive, or zero or less. If aOffset.iY is greater than zero,
+lower rectangles take precedence over higher rectangles in the list order.
+Otherwise, higher rectangles take precedence. For rectangles of equal height,
+aOffset.iX becomes relevant to the sort.
+If is greater than zero, rightmost rectangles
+take precedence. Otherwise, leftmost rectangles take precedence.
+
+Note that the sort order may need to be different from the default if,
+for example, a region is moved downwards so that lower non-overlapping
+rectangles need to be redrawn (and sorted) before higher ones.
+
+@param aOffset A point whose iX and iY members determine the order of the 
+               sort. 
+
+@return KErrNone, if the operation is successful; KErrGeneral, otherwise.
+*/
+	{
+	TRectKey key(RectangleList(),aOffset);
+	TRectSwap swap(RectangleListW());
+	return(User::QuickSort(iCount,key,swap));
+	}
+
+
+
+
+EXPORT_C TRect *TRegion::RectangleListW()
+//
+// Return a writeable rectangle list.
+//
+	{
+	if (iAllocedRects>=0)
+		return(((RRegion *)this)->iRectangleList);
+	else if (iAllocedRects&ERRegionBuf)
+		return((TRect *)(this+1));
+	return((TRect *)(((RRegion *)this)+1));
+	}
+
+TBool TRegion::SetListSize(TInt aCount)
+	{
+	if (iAllocedRects<0)
+		{
+		if (aCount>(-(iAllocedRects|ERRegionBuf)))
+			{
+			if ((iAllocedRects&ERRegionBuf) ||
+				(((RRegion *)this)->iRectangleList=
+				(TRect *)User::Alloc(aCount*sizeof(TRect)))==NULL)
+				{
+				ForceError();
+				return(EFalse);
+				}
+			iAllocedRects=aCount;
+			}
+		}
+	else if (iAllocedRects<aCount)
+		{
+		TRect *newList=(TRect *)User::ReAlloc(((RRegion *)this)->iRectangleList,aCount*sizeof(TRect));
+		if (newList==NULL)
+			{
+			ForceError();
+			return(EFalse);
+			}
+		((RRegion *)this)->iRectangleList=newList;
+		iAllocedRects=aCount;
+		}
+	return(ETrue);
+	}
+
+#ifndef __REGIONS_MACHINE_CODED__
+
+EXPORT_C void TRegion::ForceError()
+/**
+Sets the error flag, and clears the region.
+
+This frees up memory allocated to the region.
+*/
+	{
+
+	Clear();
+	iError=ETrue;
+	}
+
+void TRegion::AppendRect(const TRect &aRect)
+//
+// Add a rectangle to the list.
+//
+	{
+	if (!iError)
+		{
+		TRect *prects=NULL;
+		if (iAllocedRects&ERRegionBuf)
+			{							// TRegionFix
+			if (iCount==-iAllocedRects)
+				{						// Can't expand a TRegionFix
+				ForceError();
+				return;
+				}
+			prects=(TRect *)(this+1);
+			}
+		else if (iAllocedRects<0)
+			{							// RRegionBuf
+			prects=(TRect *)(((RRegion *)this)+1);
+			if (iCount==(-(iAllocedRects|ERRegionBuf)))
+				{
+				iAllocedRects=iCount+((RRegion *)this)->iGranularity;
+				if ((((RRegion *)this)->iRectangleList=(TRect *)User::Alloc(iAllocedRects*sizeof(TRect)))==NULL)
+					{
+					ForceError();
+					return;
+					}
+				Mem::Copy(((RRegion *)this)->iRectangleList, prects, sizeof(TRect)*((RRegion *)this)->iGranularity);
+				prects=((RRegion *)this)->iRectangleList;
+				}
+			}
+		else
+			{
+			RRegion *pr=(RRegion *)this;
+			prects=pr->iRectangleList;
+			if (iAllocedRects==iCount)
+				{
+				iAllocedRects+=pr->iGranularity;
+				prects=(TRect *)User::ReAlloc(prects, iAllocedRects*sizeof(TRect));
+				if (prects==NULL)
+					{
+					ForceError();
+					return;
+					}
+				pr->iRectangleList=prects;
+				}
+			}
+		*(prects+iCount)=aRect;
+		iCount++;
+		}
+	}
+
+void TRegion::DeleteRect(TRect *aRect)
+//
+// Delete a specific rectangle in the list.
+//
+	{
+
+	iCount--;
+	Mem::Copy(aRect,aRect+1,((TUint8 *)(RectangleList()+iCount))-((TUint8 *)aRect));
+	}
+#endif
+
+void TRegion::AppendRegion(TRegion &aRegion)
+//
+// Append all the rectangles from aRegion to this.
+//
+	{
+
+	if (aRegion.iError)
+		ForceError();
+	else
+		{
+		aRegion.SubRegion(*this);
+		const TRect *pR=aRegion.RectangleList();
+		const TRect *pE=pR+aRegion.iCount;
+		while (pR<pE)
+			AppendRect(*pR++);
+		}
+	}
+
+
+
+EXPORT_C RRegion::RRegion()
+	: TRegion(0), iGranularity(EDefaultGranularity), iRectangleList(NULL)
+/**
+Default constructor.
+
+Initialises its granularity to five.
+*/
+	{}
+
+
+
+
+EXPORT_C RRegion::RRegion(TInt aGran)
+	: TRegion(0), iGranularity(aGran), iRectangleList(NULL)
+/**
+Constructs the object with the specified granularity.
+
+@param aGran The initial value for the region's granularity.
+             This value must not be negative.
+*/
+	{}
+
+
+
+
+EXPORT_C RRegion::RRegion(const TRect &aRect, TInt aGran)
+	: TRegion(0), iGranularity(aGran), iRectangleList(NULL)
+/**
+Constructs the object with the specified rectangle and granularity.
+
+The resulting region consists of the specified single rectangle.
+
+@param aRect The single rectangle with which to initialise the region 
+@param aGran The initial value for the region's granularity. By default, 
+             this is five.
+*/
+	{
+
+	if (!aRect.IsEmpty())
+		AppendRect(aRect);
+	}
+
+
+
+
+EXPORT_C RRegion::RRegion(const RRegion &aRegion)
+/**
+Copy constructor.
+
+Constructs a new region from an existing one by performing a bit-wise copy.  Both the new and
+existing regions are left containing pointers to the same data, so Close() must only be called on
+one of them.
+
+Use of this method is not reccomended.
+
+@param aRegion The region to be copied.
+*/
+	{
+
+	*this=aRegion;
+	}
+
+
+
+
+EXPORT_C RRegion::RRegion(TInt aBuf, TInt aGran)
+//
+// Constructor.
+//
+	: TRegion(aBuf), iGranularity(aGran), iRectangleList(NULL)
+	{}
+
+
+
+
+EXPORT_C RRegion::RRegion(TInt aCount,TRect* aRectangleList,TInt aGran/*=EDefaultGranularity*/)
+/**
+Constructor that takes ownership of an already created rectangle list.
+
+@param aCount         The number of rectangles in the region.
+@param aRectangleList A pointer to the set of rectangles.
+@param aGran          The region's granularity.
+*/
+	: TRegion(aCount), iGranularity(aGran), iRectangleList(aRectangleList)
+	{
+	iCount=aCount;
+	}
+
+
+
+
+EXPORT_C void RRegion::Close()
+/**
+Closes the region.
+
+Frees up any memory which has been allocated, and unsets the error flag, if 
+set. 
+
+The region can be re-used after calling this method.  Its granularity is preserved.
+*/
+	{
+
+	Clear();
+	}
+
+
+
+
+EXPORT_C void RRegion::Destroy()
+//
+// Destroy
+//
+/**
+Deletes the region.
+
+Frees all memory.
+
+Note this method will delete the RRegion object and therefore it should not be 
+invoked on RRegion objects that are not allocated on the heap.  RRegion::Close()
+should be used for RRegion objects stored on the stack.
+
+@panic USER 42 if the RRegion object is stored on the stack.
+*/
+	{
+
+	Clear();
+	delete this;
+	}
+
+
+
+
+TInt TRectKey::Compare(TInt aLeft,TInt aRight) const
+//
+// Compares two rectangles for partial ordering.
+//
+	{
+
+	if (aLeft==aRight)
+		return(0);
+	const TRect *r1=&iRectList[aLeft];
+	const TRect *r2=&iRectList[aRight];
+	if (r2->iBr.iY<=r1->iTl.iY)
+		return(iDown ? -1 : 1);
+	if (r1->iBr.iY<=r2->iTl.iY)
+		return(iDown ? 1 : -1);
+	if (r2->iBr.iX<=r1->iTl.iX)
+		return(iRight ? -1 : 1);
+	__ASSERT_DEBUG(r1->iBr.iX<=r2->iTl.iX,Panic(ETRegionInvalidRegionInSort));
+	return(iRight ? 1 : -1);
+	}
+
+void TRectSwap::Swap(TInt aLeft,TInt aRight) const
+//
+// Swap two rectangles.
+//
+	{
+
+	TRect tmp(iRectList[aLeft]);
+	iRectList[aLeft]=iRectList[aRight];
+	iRectList[aRight]=tmp;
+	}
+
+TRectKey::TRectKey(const TRect *aRectList,const TPoint &aOffset)
+//
+// Rectangle key constructor
+//
+	{
+
+	iRectList=aRectList;
+	if(aOffset.iX>0)
+		iRight=ETrue;
+	else
+		iRight=EFalse;
+	if(aOffset.iY>0)
+		iDown=ETrue;
+	else
+		iDown=EFalse;
+	}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32/euser/us_std.h	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,28 @@
+// Copyright (c) 1994-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32\euser\us_std.h
+// 
+//
+
+#include <e32std.h>
+#include <e32base.h>
+#include <e32math.h>
+#include <e32svr.h>
+#include <e32ver.h>
+#include <e32hal.h>
+#include <e32panic.h>
+#include <u32exec.h>
+
+
+GLREF_C void Panic(TCdtPanic aPanic);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32/euser/us_test.cpp	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,549 @@
+// Copyright (c) 1994-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32\euser\us_test.cpp
+// 
+//
+
+#include "us_std.h"
+#include <e32test.h>
+
+#if defined(test)
+#undef test
+#endif
+
+#include <e32svr.h> 
+
+void RTest::CheckConsoleCreated()
+	{
+	// Check that the console has been created.
+	if (iConsole == NULL)
+		{
+		TRAPD(r, iConsole = Console::NewL(iTitle, TSize(KConsFullScreen, KConsFullScreen)))
+		__ASSERT_ALWAYS(r == KErrNone, ::Panic(ERTestCreateConsole));
+		}
+	}
+
+void RTest::DisplayLevel()
+	{
+	// Display the current level string.
+	TBuf<0x100> aBuf(_L("RTEST: Level "));
+	for (TInt ii = 1; ii < iLevel; ii++)
+		{
+		if (ii > 1)
+			{
+			aBuf.AppendFormat(_L(".%02d"), iStack[ii]);
+			}
+		else
+			{
+			aBuf.AppendFormat(_L(" %03d"), iStack[ii]);
+			}
+		}
+	if (iLevel > 1)
+		{
+		aBuf.AppendFormat(_L(".%02d "), iTest);
+		}
+	else
+		{
+		aBuf.AppendFormat(_L(" %03d "), iTest);
+		}
+
+	Printf(aBuf);
+	}
+
+
+
+
+/**
+Constructor.
+
+@param aTitle           A title describing this use of RTest.
+                        This is also referred to as the console title.
+@param aThrowaway       Not used.
+@param anOtherThrowaway Not used.
+*/
+EXPORT_C RTest::RTest(const TDesC &aTitle,TInt /* aThrowaway */,const TText* /* anOtherThrowaway */)
+	: iTest(0), iLevel(0), iLogging(ETrue), iConsole(NULL), iTitle(aTitle)
+	// Constructor
+	// There is a #define test(x) test(x, __LINE__) in e32test.h to pass on line info of failing tests,
+	// This depends upon the user naming their RTest object test, but if they do this then an extra
+	// parameter aThrowaway must be added to the constructor
+	{}
+
+
+
+/**
+Constructor.
+
+@param aTitle     A title describing this use of RTest.
+                  This is also referred to as the console title.
+@param aThrowaway Not used.
+*/
+EXPORT_C RTest::RTest(const TDesC &aTitle, TInt /* athrowaway */)
+	: iTest(0), iLevel(0), iLogging(ETrue), iConsole(NULL), iTitle(aTitle)
+	// Constructor
+	// There is a #define test(x) test(x, __LINE__) in e32test.h to pass on line info of failing tests,
+	// This depends upon the user naming their RTest object test, but if they do this then an extra
+	// parameter aThrowaway must be added to the constructor
+	{}
+
+
+
+
+/**
+Constructor.
+
+@param aTitle A title describing this use of RTest.
+              This is also referred to as the console title.
+*/
+EXPORT_C RTest::RTest(const TDesC &aTitle)
+	: iTest(0), iLevel(0), iLogging(ETrue), iConsole(NULL), iTitle(aTitle)
+	// Constructor
+	{}
+
+
+
+
+/**
+Closes the console and frees any resources acquired.
+*/
+EXPORT_C void RTest::Close()
+	{
+	// Close the console.
+	delete iConsole;
+	iConsole=NULL;
+	}
+
+
+
+
+/**
+Prints out the console title and version number.
+
+The format of the text is:
+
+@code
+RTEST TITLE: XXX YYY
+Epoc/32 YYY
+@endcode
+
+where XXX is the console title, and YYY is the version number,
+formatted as described by TVersion::Name().
+
+@see TVersion::Name()
+@see RTest::Printf() 
+*/
+EXPORT_C void RTest::Title()
+	{
+	// Print out the program title and version number.
+	TVersion v(KE32MajorVersionNumber, KE32MinorVersionNumber, KE32BuildVersionNumber);
+	TBuf<16> vName=v.Name();
+	Printf(_L("RTEST TITLE: %S %S\n"), &iTitle, &vName);
+	vName=User::Version().Name();
+	Printf(_L("Epoc/32 %S\n"), &vName);
+	}
+
+
+
+
+/**
+Marks the start of a set of tests.
+
+Note that sets of tests can be nested.
+
+A call to this function must be matched by a call to RTest::End() to mark
+the end of this set of tests.
+
+@param aHeading A heading describing the set of tests; this is
+                printed at the console.
+                
+@see RTest::End()                
+*/
+EXPORT_C void RTest::Start(const TDesC &aHeading)
+	{
+	// Print out the heading and nest the level.
+	Push();
+	Next(aHeading);
+	}
+
+
+
+
+/**
+Marks the start of the next test.
+
+@param aHeading A heading describing the test; this
+                is printed at the console. This function is also
+                called by Start(), which passes the text that describes
+                the set of tests.
+                
+@see RTest::Start()                
+*/
+EXPORT_C void RTest::Next(const TDesC &aHeading)
+	{
+	// Print out the heading and nest the level.
+	iTest++;
+	iCheck = 0;
+	DisplayLevel();
+	Printf(_L("Next test - %S\n"), &aHeading);
+	}
+
+
+
+
+/**
+Checks the result of a condition and, if this is false, prints
+a failure message at the console and raises a panic.
+
+Before checking the condition passed in, the operator increments
+a check number. This is a value that is set to zero at the start of a test
+and is incremented by this operator (and by all variants of it). It identifies
+the check being made within the current test.
+This value is printed on a failure message.
+
+Typically, the operator is called, passing a test condition, for example:
+
+@code
+RTest test(... heading text...,line number... file name)
+TInt r;
+...some operation to be tested that returns a value in r...
+test(r==KErrNone);
+@endcode
+
+The failure message has the format:
+
+@code
+: FAIL : XXX failed check N in FFF at line Number: M
+RTEST: Checkpoint-fail
+@endcode
+
+where XXX is the console title, N is the check number, FFF is the filename,
+and M is the line number passed in.
+
+@param aResult   The condition being tested.
+                 This is interpreted as a true or false value.
+@param aLineNum  A line number that is printed in the failure message if
+                 the condition being tested is false.
+@param aFileName A file name that is printed in the failure message if
+                 the condition being tested is false.
+                 
+@panic USER 84 if the condition being tested is false.
+
+@see RTest::Next()
+@see RTest::Start()
+*/
+EXPORT_C void RTest::operator()(TInt aResult, TInt aLineNum, const TText* aFileName)
+	{
+	// Test a condition.
+	iCheck++;
+	if (!aResult)
+		{
+		RDebug::Printf(": FAILING : failed check at line number %d", aLineNum);
+		DisplayLevel();
+		Printf(_L(": FAIL : %S failed check %d in %s at line number %d\n"),
+			   &iTitle, iCheck, aFileName, aLineNum);
+		Panic(_L("Checkpoint-fail\n"));
+		if (!iLogging)
+			Getch();
+		}
+	}
+
+
+
+
+/**
+Checks the result of a condition and, if this is false, prints
+a failure message at the console and raises a panic.
+
+Before checking the condition passed in, the operator increments
+a check number. This is a value that is set to zero at the start of a test
+and is incremented by this operator (and by all variants of it). It identifies
+the check being made within the current test.
+This value is printed on the failure message.
+
+Typically, the operator is called, passing a test condition, for example:
+
+@code
+RTest test(... heading text...,line number)
+TInt r;
+...some operation to be tested that returns a value in r...
+test(r==KErrNone);
+@endcode
+
+The failure message has the format:
+
+@code
+: FAIL : XXX failed check N at line Number: M
+RTEST: Checkpoint-fail
+@endcode
+
+where XXX is the console title, N is the check number, and M is
+the line number passed in.
+
+@param aResult  The condition being tested.
+                This is interpreted as a true or false value.
+@param aLineNum A line number that is printed in the failure message if
+                the condition being tested is false.               
+
+@panic USER 84 if the condition being tested is false.
+
+@see RTest::Next()
+@see RTest::Start()
+*/
+EXPORT_C void RTest::operator()(TInt aResult,TInt aLineNum)
+	{
+	// Test a condition.
+	iCheck++;
+	if (!aResult)
+		{
+		RDebug::Printf(": FAILING : failed check at line Number: %d", aLineNum);
+		DisplayLevel();
+		Printf(_L(": FAIL : %S failed check %d at line Number: %d\n"), &iTitle, iCheck, aLineNum);
+		Panic(_L("Checkpoint-fail\n"));
+		if (!iLogging)
+			Getch();
+		}
+	}  
+
+
+
+
+/**
+Checks the result of a condition and, if this is false, prints
+a failure message at the console and raises a panic.
+
+Before checking the condition passed in, the operator increments
+a check number. This is a value that is set to zero at the start of a test
+and is incremented by this operator (and by all variants of it). It identifies
+the check being made within the current test.
+This value is printed on the failure message.
+
+Typically, the operator is called, passing a test condition, for example:
+
+@code
+RTest test(... heading text...)
+TInt r;
+...some operation to be tested that returns a value in r...
+test(r==KErrNone);
+@endcode
+
+The failure message has the format:
+
+@code
+: FAIL : XXX failed check N
+RTEST: Checkpoint-fail
+@endcode
+
+where XXX is the console title, and N is the check number.
+
+@param aResult The condition being tested.
+               This is interpreted as a true or false value.
+
+@panic USER 84 if the condition being tested is false.
+
+@see RTest::Next()
+@see RTest::Start()
+*/
+EXPORT_C void RTest::operator()(TInt aResult)
+	{
+	// Test a condition.
+	iCheck++;
+	if (!aResult)
+		{
+		RDebug::Printf(": FAILING : failed check\n");
+		DisplayLevel();
+		Printf(_L(": FAIL : %S failed check %d\n"), &iTitle, iCheck);
+		Panic(_L("Checkpoint-fail\n"));
+		if (!iLogging)
+			Getch();
+		}
+	}
+
+
+
+
+/**
+Ends the current set of tests.
+
+If this set of tests is not nested within another set,
+then a message reporting success is written to
+the console.
+
+@panic USER 84 if there was no matching call to RTest::Start(),
+               i.e. more calls to End() have been made than calls to Start().
+
+@see RTest::Start()
+*/
+EXPORT_C void RTest::End()
+	{
+	// End the current level of tests.
+	if (TInt(iLevel-1) < 0)
+		{
+		Panic(_L("End() without matching Start()\n"));
+		}
+
+	Pop();
+
+	if (iLevel == 0)
+		{
+		Printf(_L("RTEST: SUCCESS : %S test completed O.K.\n"), &iTitle);
+		if (!iLogging)
+			Getch();
+		}
+	}
+
+
+
+
+/**
+Prints an error message and an error code,
+and raises a USER 84 panic.
+
+@param anError The error code.
+@param aFmt    A format list.
+@param ...     A variable number of parameters.
+*/
+EXPORT_C void RTest::Panic(TInt anError,TRefByValue<const TDesC> aFmt,...)
+	{
+	// Print an error message, an error and then panic.
+	TestOverflowTruncate overflow;
+	VA_LIST list;
+	VA_START(list, aFmt);
+	TBuf<0x100> aBuf;
+	aBuf.AppendFormat(_L("RTEST: "));
+	aBuf.AppendFormatList(aFmt, list, &overflow);
+	aBuf.AppendFormat(_L(" Failed with error %d\n"), anError);
+	Printf(aBuf);
+	if (!iLogging)
+		Getch();
+	::Panic(ERTestFailed);
+	}
+
+
+
+
+/**
+Prints an error message, and raises a USER 84 panic.
+
+@param aFmt    A format list.
+@param ...     A variable number of parameters.
+*/
+EXPORT_C void RTest::Panic(TRefByValue<const TDesC> aFmt,...)
+	{
+	// Print an error message and then panic.
+	TestOverflowTruncate overflow;
+	VA_LIST list;
+	VA_START(list, aFmt);
+	TBuf<0x100> aBuf;
+	aBuf.AppendFormat(_L("RTEST: "));
+	aBuf.AppendFormatList(aFmt, list, &overflow);
+	Printf(aBuf);
+	if (!iLogging)
+		Getch();
+	::Panic(ERTestFailed);
+	}
+
+
+
+_LIT(KLitNL, "\n");
+_LIT(KLitCRNL, "\r\n");
+/**
+Prints text to the console.
+
+If the logging flag is set, the string
+is also written to the debug output as represented by an RDebug object.
+
+@param aFmt    A format list.
+@param ...     A variable number of parameters.
+
+@see RTest::SetLogged()
+@see Rtest::Logged()
+@see RDebug
+*/
+EXPORT_C void RTest::Printf(TRefByValue<const TDesC> aFmt,...)
+	{
+	// Print to a console screen.
+	TestOverflowTruncate overflow;
+	VA_LIST list;
+	VA_START(list, aFmt);
+	TBuf<0x100> buf;
+	buf.AppendFormatList(aFmt, list, &overflow);
+	CheckConsoleCreated();
+	iConsole->Write(buf);
+	
+	if (iLogging)
+		{
+		TPtrC ptr(buf);
+		TInt newline;
+		while ((newline = ptr.Locate('\n')) != KErrNotFound)
+			{
+			RDebug::RawPrint(ptr.Left(newline));
+			if (newline==0 || ptr[newline-1]!='\r')
+				RDebug::RawPrint(KLitCRNL); // bare nl, replace with crnl
+			else
+				RDebug::RawPrint(KLitNL); // crnl, already printed cr
+			if (newline+1<ptr.Length())
+				ptr.Set(ptr.Mid(newline+1));
+			else
+				return; // newline was end of string
+			}
+		RDebug::RawPrint(ptr);
+		}
+	}
+
+
+
+
+/**
+Gets an input key stroke.
+
+@return The input key code.
+*/
+EXPORT_C TKeyCode RTest::Getch()
+	{
+	// Get a key from the console.
+	CheckConsoleCreated();
+	return(iConsole->Getch());
+	}
+
+
+
+EXPORT_C TInt RTest::CloseHandleAndWaitForDestruction(RHandleBase& aH)
+	{
+#ifndef __TOOLS2__
+	TRequestStatus s;
+	aH.NotifyDestruction(s);
+	aH.Close();
+	TUint32 initial = User::NTickCount();
+	TInt r = KErrNone;
+	if (s == KErrNoMemory)
+		r = KErrNoMemory;
+	while (s == KRequestPending)
+		{
+		TUint32 now = User::NTickCount();
+		if ((now - initial) > 5000)
+			{
+			User::CancelMiscNotifier(s);
+			r = KErrTimedOut;
+			break;
+			}
+		User::AfterHighRes(1000);
+		}
+	User::WaitForRequest(s);
+	return r;
+#else
+	return KErrNone;
+#endif // __TOOLS2__
+	}
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32/euser/us_time.cpp	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,2526 @@
+// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32\euser\us_time.cpp
+// System date and time functions
+// 
+//
+
+
+#include "us_std.h"
+
+// Date and time related constants
+
+static const TInt KMinutesToMicroSeconds = 60000000;
+static const TInt KSecondsToMicroSeconds = 1000000;
+static const TInt64 KDaysToMicroSeconds = I64LIT(86400000000);
+static const TInt64 KHoursToMicroSeconds = I64LIT(3600000000);
+
+// Days in each month
+LOCAL_D const TInt8 mTab[2][12]=
+    {
+    {31,28,31,30,31,30,31,31,30,31,30,31}, // 28 days in Feb
+    {31,29,31,30,31,30,31,31,30,31,30,31}  // 29 days in Feb
+    };
+
+// Days in year before 1st of each month
+LOCAL_D const TInt cmTab[2][12]=
+	{
+	{0,31,59,90,120,151,181,212,243,273,304,334},
+	{0,31,60,91,121,152,182,213,244,274,305,335}
+	};
+
+//
+// Time::FormatL overflow handler
+//
+#if defined(_UNICODE)
+NONSHARABLE_CLASS(TTimeOverflowLeave) : public TDes16Overflow
+	{
+public:
+	virtual void Overflow(TDes16 &aDes);
+	};
+void TTimeOverflowLeave::Overflow(TDes16 &/*aDes*/)
+	{
+	User::Leave(KErrOverflow);
+	}
+#else
+NONSHARABLE_CLASS(TTimeOverflowLeave) : public TDes8Overflow
+	{
+public:
+	virtual void Overflow(TDes8 &aDes);
+	};
+void TTimeOverflowLeave::Overflow(TDes8 &/*aDes*/)
+	{
+	User::Leave(KErrOverflow);
+	}
+#endif
+//
+
+EXPORT_C TDateTime::TDateTime(TInt aYear,TMonth aMonth,TInt aDay,TInt aHour,TInt aMinute,TInt aSecond,TInt aMicroSecond)
+//
+// always panic on a bad date/time field
+//
+/**
+Constructs the TDateTime object with the seven fields which comprise a date 
+and time.
+
+@param aYear        The year. No check is made for validity.
+@param aMonth       The month. Range is EJanuary to EDecember.
+@param aDay         The day. Range is zero to number of days in month minus one.
+@param aHour        The hour. Range is 0 to 23.
+@param aMinute      The minute. Range is 0 to 59.
+@param aSecond      The second. Range is 0 to 59
+@param aMicroSecond The microsecond. Range is 0 to 999999
+
+@panic USER 3, if an attempt is made to set an invalid value for any of 
+       the fields, except for the year. No check is made upon the validity
+       of the year.
+*/
+	{
+
+	TInt ret=Set(aYear,aMonth,aDay,aHour,aMinute,aSecond,aMicroSecond);
+	__ASSERT_ALWAYS(ret==KErrNone,Panic(ETDateTimeBadDateTime));
+	}
+
+EXPORT_C TInt TDateTime::Set(TInt aYear,TMonth aMonth,TInt aDay,TInt aHour,TInt aMinute,TInt aSecond,TInt aMicroSecond)
+//
+// set the various time fields checking that each is valid
+// bomb out as soon as invalid field is set to forestall causing a panic
+//
+/**
+Sets all date and time components.
+
+Note:
+
+1. When setting the day and month, subtract one because the ranges are offset 
+   from zero. 
+
+2. If the function returns an error, only those fields preceding the field which 
+   caused the error will be changed. For example, if the hour is out of range, 
+   the year, month and day will be set, all other components will remain unchanged.
+
+@param aYear        Year. No check is made on its validity, except that if the
+                    date is set to February 29th, the year can only be set to a
+                    leap year, otherwise  an error is returned.
+@param aMonth       Month. The valid range is EJanuary to EDecember. If an
+                    attempt is made to set an invalid month, or if the current
+                    day number in the month is greater than or equal to the
+                    number of days in the new month, an error is returned.
+@param aDay         The number of the day within the month, offset from zero.
+                    If greater than or equal to the total number of days in
+                    the month,an error is returned.
+@param aHour        Hour. Range is 0 to 23.
+@param aMinute      Minute. Range is 0 to 59.
+@param aSecond      Second. Range is 0 to 59.
+@param aMicroSecond Microsecond. Range is 0 to 999999.
+
+@return KErrNone if successful, KErrGeneral if not.
+*/
+	{
+
+	iYear=aYear;
+
+	if (aMonth<EJanuary || aMonth>EDecember)
+		return KErrGeneral;
+	iMonth=aMonth;
+
+	if (aDay<0 || aDay>=Time::DaysInMonth(iYear,iMonth))
+		return KErrGeneral;
+	iDay=aDay;
+
+	if (aHour<0 || aHour>=24)
+		return KErrGeneral;
+	iHour=aHour;
+
+	if (aMinute<0 || aMinute>=60)
+		return KErrGeneral;
+	iMinute=aMinute;
+
+	if (aSecond<0 || aSecond>=60)
+		return KErrGeneral;
+	iSecond=aSecond;
+
+	if (aMicroSecond<0 || aMicroSecond>=1000000)
+		return KErrGeneral;
+	iMicroSecond=aMicroSecond;
+
+	return KErrNone;
+	}
+
+EXPORT_C TInt TDateTime::SetYear(TInt aYear)
+//
+// doesnt let you reset 29th February to non-leap year, no check on year range
+//
+/**
+Sets the year without a leap year check.
+
+No check is made on the validity of the year except that if the current date
+is February 29th, the year can only be changed to another leap year, otherwise
+an error is returned.
+
+@param aYear The year.
+
+@return KErrNone if successful, KErrGeneral if not.
+*/
+	{
+
+	if (iDay>=Time::DaysInMonth(aYear,iMonth))
+		return KErrGeneral;
+	iYear=aYear;
+	return KErrNone;
+	}
+
+EXPORT_C TInt TDateTime::SetYearLeapCheck(TInt aYear)
+//
+// lets you reset 29th February to non-leap year(moves date to 28th/Feb), no check on year range
+//
+/**
+Sets the year with a leap year check.
+
+Unlike SetYear(), if the date is the 29th February, this function allows
+the year to be set to a non-leap year. In this case, the date is reset to
+the 28th February.
+
+@param aYear The year.
+
+@return KErrNone if successful, KErrGeneral if not.
+
+@see TDateTime::SetYear
+*/
+	{
+
+	if (iDay>=Time::DaysInMonth(aYear,iMonth))
+        iDay=27;
+    iYear=aYear;
+	return KErrNone;
+	}
+
+EXPORT_C TInt TDateTime::SetMonth(TMonth aMonth)
+/**
+Sets the month component of the date/time.
+
+@param aMonth The month to be set. The range is from EJanuary to EDecember.
+              If an attempt is made to set an invalid month, or if the current
+              day number in the month is greater than or equal to the number of
+              days in the new month, an error is returned.
+              
+@return KErrNone if successful, KErrGeneral if not.
+*/
+	{
+
+	if (aMonth<EJanuary || aMonth>EDecember || iDay>=Time::DaysInMonth(iYear,aMonth))
+		return KErrGeneral;
+	iMonth=aMonth;
+	return KErrNone;
+	}
+
+EXPORT_C TInt TDateTime::SetDay(TInt aDay)
+/**
+Sets the day component of the date/time.
+
+@param aDay The number of the day within the month, offset from zero. If equal 
+            to or greater than the total number of days in the month, an error
+            is returned.
+            
+@return KErrNone if successful, KErrGeneral if not.
+*/
+	{
+
+	if (aDay<0 || aDay>=Time::DaysInMonth(iYear,iMonth))
+		return KErrGeneral;
+	iDay=aDay;
+	return KErrNone;
+	}
+
+EXPORT_C TInt TDateTime::SetHour(TInt aHour)
+/**
+Sets the hour component of the date/time.
+
+@param aHour The hour. Range is 0 to 23.
+
+@return KErrNone if successful, KErrGeneral if not.
+*/
+	{
+
+	if (aHour<0 || aHour>=24) // GC - bug fix
+		return KErrGeneral;
+	iHour=aHour;
+	return KErrNone;
+	}
+
+EXPORT_C TInt TDateTime::SetMinute(TInt aMinute)
+/**
+Sets the minute component of the date/time.
+
+@param aMinute The minute. Range is 0 to 59.
+
+@return KErrNone if successful, KErrGeneral if not.
+*/
+	{
+
+	if (aMinute<0 || aMinute>=60)
+		return KErrGeneral;
+	iMinute=aMinute;
+	return KErrNone;
+	}
+
+EXPORT_C TInt TDateTime::SetSecond(TInt aSecond)
+/**
+Sets the second component of the date/time.
+
+@param aSecond The second. Range is 0 to 59.
+
+@return KErrNone if successful, KErrGeneral if not.
+*/
+	{
+
+	if (aSecond<0 || aSecond>=60)
+		return KErrGeneral;
+	iSecond=aSecond;
+	return KErrNone;
+	}
+
+EXPORT_C TInt TDateTime::SetMicroSecond(TInt aMicroSecond)
+/**
+Sets the microsecond component of the date/time.
+
+@param aMicroSecond The microsecond. Range is 0 to 999999.
+
+@return KErrNone if successful, KErrGeneral if not.
+*/
+	{
+
+	if (aMicroSecond<0 || aMicroSecond>=1000000)
+		return KErrGeneral;
+	iMicroSecond=aMicroSecond;
+	return KErrNone;
+	}
+
+// class TTime
+
+EXPORT_C TTime::TTime(const TDesC &aString)
+/**
+Constructs a TTime object with a text string.
+
+The string consists of up to three components, any or all of which
+may be omitted:
+
+1. year, month and day, followed by a colon
+
+2. hour, minute and second, followed by a dot
+
+3. microsecond
+
+When all three components are present, the string should take the form:
+
+YYYYMMDD:HHMMSS.MMMMMM
+
+The conversion from text to time is carried out in the same manner as that 
+used in TTime::Set().
+
+For a list of the range of valid values for date and time components,
+see TDateTime::Set().
+
+@param aString Date and time string for initializing the TTime object. 
+
+@panic USER 113, if the string is syntactically incorrect, for example, if 
+                 neither a colon nor a dot is present, or if any component of
+                 the date or time is assigned an invalid value, or the year
+                 is negative.
+
+@see TTime::Set
+@see TDateTime::Set
+*/
+	{
+
+	__ASSERT_ALWAYS(Set(aString)==KErrNone,Panic(ETTimeValueOutOfRange));
+	}
+
+EXPORT_C TTime::TTime(const TDateTime &aDateTime) : iTime(Convert(aDateTime).Int64())
+/**
+Constructs a TTime object with the seven fields which comprise a date and time.
+
+@param aDateTime Date and time to which to initialise the TTime object.
+*/
+
+    {}
+
+EXPORT_C TInt TTime::Set(const TDesC &aString)
+//
+// Convert string to time. String is in the format:
+//
+// YYYYMMDD:HHMMSS.MMMMMM
+//
+// Any part may be ommitted, but either the
+// dot or colon or both must be present
+//
+/**
+Assigns a date and time contained in a descriptor to this TTime object.
+
+The string consists of up to three components, any or all of which may
+be omitted:
+
+1. year, month and day, followed by a colon 
+
+2. hour, minute and second, followed by a dot 
+
+3. microsecond
+
+When all three components are present, the string should take the form:
+
+YYYYMMDD:HHMMSS.MMMMMM
+
+If omitted, the first component is set to January 1st 0 AD nominal Gregorian. 
+If either the second or third components are omitted, they are set to zero.
+
+Notes:
+
+1. The month and day values are offset from zero.
+
+2. The only situations in which either the colon or dot may be omitted are as 
+   follows:
+   
+   2.1 If the microsecond component is omitted, the preceding dot may also
+       be omitted.
+
+   2.2 The colon can be omitted only if a dot is located at string position
+       zero (indicating that the first two components are missing), or at
+       string position six (indicating that the first component only is
+       missing).
+
+@param aString The date and time to be assigned to this TTime object.
+       
+@return KErrNone if successful,
+        KErrGeneral if the string is syntactically incorrect, for example,
+        if neither a colon nor a dot is present, or if any component of the
+        date or time is given an invalid value, or the year is negative.
+        For a list of valid values for date and time components,
+        see TDateTime::Set().
+        If an error occurs, the date and time will remain unchanged.
+*/
+	{
+
+//
+// Get position of the colon and dot separators
+//
+    TInt colon=aString.Locate(':');
+    TInt dot=aString.Locate('.');
+
+    if(colon==KErrNotFound && dot==KErrNotFound)
+        return(KErrGeneral);
+//
+// Zero parts that aren't supplied
+//
+    TInt yy=0;
+    TInt mm=0;
+    TInt dd=0;
+    TInt hr=0;
+    TInt mi=0;
+    TInt se=0;
+    TInt ms=0;
+//
+// Convert YYYYMMDD if present
+//
+    switch(colon)
+        {
+        case 0:
+       	    break;
+        case KErrNotFound:
+            if(dot!=0 && dot!=6)
+                return(KErrGeneral);
+            colon=-1;
+            break;
+        case 8:
+	   		{
+            TLex y=aString.Left(4);
+            TLex m=aString.Mid(4,2);
+            TLex d=aString.Mid(6,2);
+            y.Val(yy);
+            m.Val(mm);
+            d.Val(dd);
+	    	}
+            break;
+        default: // Colon in wrong position - return error
+            return(KErrGeneral);
+        }
+//
+// Convert HHMMSS if present
+//
+    if(dot==KErrNotFound)
+        dot=aString.Length();
+     
+    if(dot==colon+7)
+        {
+        TLex h=aString.Mid(dot-6,2);
+        TLex m=aString.Mid(dot-4,2);
+        TLex s=aString.Mid(dot-2,2);
+        h.Val(hr);
+        m.Val(mi);
+        s.Val(se);
+        }
+    else if(dot!=KErrNotFound && dot!=0 && dot!=colon+1)
+    	return(KErrGeneral);
+
+    if(dot!=KErrNotFound)
+        {
+        if(aString.Length()>dot+7)
+            return(KErrGeneral); // microseconds is more than 6 digits
+        if(dot<aString.Length())
+        	{
+        	TLex m=aString.Mid(dot+1);
+        	m.Val(ms);
+        	}
+        }
+        
+//
+// Set the time! Do not construct newtime using the values or
+// it may cause TTime::Set() to panic rather than return an error
+//
+	TDateTime newtime;
+	if(newtime.Set(yy,TMonth(mm),dd,hr,mi,se,ms)!=KErrNone)
+		return(KErrGeneral);
+    (*this)=newtime;
+	return KErrNone;
+	}
+
+EXPORT_C TInt TTime::HomeTimeSecure()
+/**
+Sets the date and time of this TTime to the secure home time. 
+Returns KErrNoSecureTime if there is no secure time source
+*/
+	{
+	TInt utOffset=0;
+	TInt r = Exec::TimeNowSecure(*(TInt64*)this,utOffset);
+    operator+=(TTimeIntervalSeconds(utOffset));
+	return r;
+	}
+
+EXPORT_C TInt TTime::UniversalTimeSecure()
+/**
+Sets the date and time of this TTime to the secure universal time.
+*/
+	{
+	TInt utOffset=0;
+	return Exec::TimeNowSecure(*(TInt64*)this,utOffset);
+	}
+
+EXPORT_C void TTime::HomeTime()
+/**
+Sets the date and time of this TTime to the home time.
+*/
+	{
+	TInt utOffset=0;
+	Exec::TimeNow(*(TInt64*)this,utOffset);
+    operator+=(TTimeIntervalSeconds(utOffset));
+	}
+
+EXPORT_C void TTime::UniversalTime()
+/**
+Sets the date and time of this TTime to the universal time.
+*/
+	{
+	TInt utOffset=0;
+	Exec::TimeNow(*(TInt64*)this,utOffset);
+	}
+
+EXPORT_C void TTime::RoundUpToNextMinute()
+/**
+Rounds this TTime up to the next minute.
+
+Both the seconds and microseconds components are set to zero.
+*/
+	{
+
+	if (iTime>0)
+		iTime+=59999999;
+//*	TInt64 remainder;
+//*	Int64().DivMod(60000000,remainder);
+//*	iTime-=remainder;	
+	iTime-=iTime%60000000;
+	}
+
+TTime TTime::Convert(const TDateTime &aDateTime)
+//
+// converts TDateTime into a TTime, doesnt check for overflows
+//
+	{
+	
+	TInt days=365*aDateTime.Year()+Time::LeapYearsUpTo(aDateTime.Year());
+	TBool isleap=Time::IsLeapYear(aDateTime.Year());
+	days+=cmTab[isleap][aDateTime.Month()];
+	days+=aDateTime.Day();
+
+	TUint sum=aDateTime.MicroSecond()+aDateTime.Second()*KSecondsToMicroSeconds+aDateTime.Minute()*KMinutesToMicroSeconds;
+	return(((TInt64(days*3)<<3)+TInt64(aDateTime.Hour()))*KHoursToMicroSeconds+TInt64(sum));
+	}
+
+EXPORT_C TTime &TTime::operator=(const TDateTime &aDateTime)
+/**
+Assigns a TDateTime object to this TTime object.
+
+@param aDateTime The date and time to assign to this TTime object.
+
+@return This TTime object.
+*/
+	{
+
+	iTime=Convert(aDateTime).Int64();
+	return(*this);
+	}
+
+EXPORT_C TDateTime TTime::DateTime() const
+//
+// converts iTime back into its TDateTime components
+//
+/**
+Converts the TTime object into a TDateTime object.
+
+This conversion must be done before the seven fields which comprise a date
+and time can be accessed.
+
+@return The components of the time, indicating year, month, day, hour, minute, 
+        second, microsecond.
+*/
+	{
+
+	TInt64 rem;
+	TInt64 daysSince0AD64(iTime);
+	
+	rem = daysSince0AD64 % KDaysToMicroSeconds;
+	daysSince0AD64 /= KDaysToMicroSeconds;
+
+	TInt daysSince0AD = static_cast<TInt>(daysSince0AD64);
+
+	TInt year;
+	TInt daysLeft;
+	if (iTime<0)
+		{ // -1 to make daysLeft +ve and assume leap year every 4 years
+		if (rem!=TInt64(0))
+			{
+			daysSince0AD--;
+			rem=iTime-TInt64(daysSince0AD)*KDaysToMicroSeconds;
+			}
+		year=(4*daysSince0AD)/((4*365)+1);
+		if ((4*daysSince0AD)%((4*365)+1))
+			year--;
+		daysLeft=daysSince0AD-((year*365)+Time::LeapYearsUpTo(year));
+		}
+	else
+		{ // after 1600 leap years less than every four years
+		year=(4*daysSince0AD)/((4*365)+1);
+		daysLeft=daysSince0AD-((year*365)+Time::LeapYearsUpTo(year));
+		TInt daysInYear=365+Time::IsLeapYear(year);
+	    while (daysLeft>=daysInYear)
+		    {
+			year++;
+	        daysLeft-=daysInYear;
+			daysInYear=365+Time::IsLeapYear(year);
+			}
+		}
+
+	TDateTime result(0,EJanuary,0,0,0,0,0);
+	result.SetYear(year);
+
+   	TBool isleap=Time::IsLeapYear(year);
+    TInt month=11;
+	const TInt* pCM=&(cmTab[isleap][11])+1;
+	while(daysLeft<*--pCM)
+		month--;
+	daysLeft-=*pCM;
+
+	result.SetMonth((TMonth)month);
+	result.SetDay(daysLeft);
+
+	TInt hour = static_cast<TInt>(rem >> 10) / 3515625;	// 3515625=KHoursToMicroSeconds/1024
+	result.SetHour(hour);
+	TUint rem32=I64LOW(rem-(TInt64(hour*3515625)<<10));
+	TUint min=rem32/KMinutesToMicroSeconds;
+	result.SetMinute((TInt)min);
+	rem32-=min*KMinutesToMicroSeconds;
+	TUint sec=rem32/KSecondsToMicroSeconds;
+	result.SetSecond((TInt)sec);
+	rem32-=sec*KSecondsToMicroSeconds;
+	result.SetMicroSecond(TInt(rem32));
+	return(result);
+	}
+
+EXPORT_C TTimeIntervalMicroSeconds TTime::MicroSecondsFrom(TTime aTime) const
+//
+// this - aTime
+//
+/**
+Calculates the number of microseconds difference between the specified TTime
+and this TTime.
+
+@param aTime The time to be compared with this TTime.
+
+@return Difference in microseconds between the two times. If the time specified 
+        in the argument is later than this TTime, this value is negative.
+*/
+	{
+
+	TInt64 difference=iTime-aTime.Int64();
+	return(difference);
+	}
+
+EXPORT_C TInt TTime::SecondsFrom(TTime aTime,TTimeIntervalSeconds &aInterval) const
+//
+// this - aTime as whole seconds
+// this function may fail if difference > no of seconds that can be represented in a TInt
+//
+/**
+Calculates the number of seconds difference between the specified TTime and
+this TTime.
+
+The difference may be positive or negative.
+
+@param aTime     The time to be compared with this TTime.
+@param aInterval On return contains the difference in seconds between the two 
+                 times. If the time specified in the first argument is later than
+                 this TTime, then this returned value is negative.
+                 
+@return Error code. KErrNone if successful. 
+                    KErrOverflow, if the calculated interval is too large for
+                    a 32-bit integer.
+*/
+	{
+	TInt64 diff;
+	if (iTime>aTime.Int64())
+		{
+		diff= TInt64(TUint64(iTime-aTime.Int64())/KSecondsToMicroSeconds);	
+		}
+	else 
+		{
+		diff= -TInt64(TUint64(aTime.Int64()-iTime)/KSecondsToMicroSeconds);
+		}	
+	if (diff>KMaxTInt || diff<KMinTInt)	
+	    return KErrOverflow; 
+	aInterval = static_cast<TInt>(diff);
+	return KErrNone;
+	}
+	
+EXPORT_C TInt TTime::MinutesFrom(TTime aTime,TTimeIntervalMinutes &aInterval) const
+//
+// iTime - aTime as whole minutes
+// function may fail if difference can't be represented as a TInt
+//
+/**
+Calculates the number of minutes difference between the specified TTime and
+this TTime.
+
+The difference may be positive or negative.
+
+@param aTime     The time to be compared with this TTime.
+@param aInterval On return contains the difference in minutes between the two 
+                 times. If the time specified in the first argument is later
+                 than this TTime, then this returned value is negative.
+                 
+@return Error code. KErrNone if successful. 
+                    KErrOverflow, if the calculated interval is too large for
+                    a 32-bit integer.
+*/
+	{
+	TInt64 diff;
+	if (iTime>aTime.Int64())
+		{
+		diff= TInt64(TUint64(iTime-aTime.Int64())/KMinutesToMicroSeconds);	
+		}
+	else 
+		{
+		diff= -TInt64(TUint64(aTime.Int64()-iTime)/KMinutesToMicroSeconds);
+		}	
+	if (diff>KMaxTInt || diff<KMinTInt)	
+	    return KErrOverflow; 
+	aInterval = static_cast<TInt>(diff);
+	return KErrNone; 
+	}
+
+EXPORT_C TInt TTime::HoursFrom(TTime aTime,TTimeIntervalHours &aInterval) const
+//
+// iTime - aTime as whole hours
+// function may fail if difference can't be represented as a TInt
+//
+/**
+Calculates the number of hours difference between the specified TTime and
+this TTime. 
+
+The difference may be positive or negative.
+
+@param aTime     The time to be compared with this TTime.
+@param aInterval On return contains the difference in hours between the two 
+                 times. If the time specified in the first argument is later
+                 than this TTime, then this returned value is negative.
+                 
+@return Error code. KErrNone if successful. 
+                    KErrOverflow, if the calculated interval is too large for
+                    a 32-bit integer.
+*/
+	{
+	TInt64 diff;
+	if (iTime>aTime.Int64())
+		{
+		diff= TInt64(TUint64(iTime-aTime.Int64())/KHoursToMicroSeconds);	
+		}
+	else 
+		{
+		diff= -TInt64(TUint64(aTime.Int64()-iTime)/KHoursToMicroSeconds);
+		}
+	if (diff>KMaxTInt || diff<KMinTInt)	
+	    return KErrOverflow; 
+	aInterval = static_cast<TInt>(diff);
+	return KErrNone;
+	}  
+
+
+EXPORT_C TTimeIntervalDays TTime::DaysFrom(TTime aTime) const
+//
+// iTime - aTime as whole days
+//
+/**
+Calculates the number of days difference between the specified TTime and
+this TTime. 
+
+The difference may be positive or negative.
+
+@param aTime  The time to be compared with this TTime.
+
+@return Difference in days between the two times. If the time specified in 
+        aTime is later than this TTime, the returned value will be negative.
+*/
+	{
+	if (iTime>aTime.Int64())
+		{
+		return TInt(TUint64(iTime-aTime.Int64())/KDaysToMicroSeconds);	
+		}
+	else 
+		{
+		return -TInt(TUint64(aTime.Int64()-iTime)/KDaysToMicroSeconds);
+		}	
+	}
+
+EXPORT_C TTimeIntervalMonths TTime::MonthsFrom(TTime aTime) const
+//
+// iTime - aTime as whole months - ie aTime must be on a later day in the month and later in that day
+// except for last days etc eg 31st October - 30 November is one month to be consistent with other
+// functions
+//
+/**
+Calculates the number of months between the specified TTime and this TTime.
+
+The result may be positive or negative.
+
+The interval in months between two TTimes is calculated by incrementing it 
+by one each time the same day number and time in the previous or following 
+month has been reached. Exceptions to this rule occur when this TTime is on 
+the last day of the month. In this case, the following rules apply:
+
+When comparing this TTime with a later time:
+
+1. if the following month is shorter, one month is deemed to separate the times 
+   when the same time on the last day of the following month is reached. In this 
+   case, the two day numbers are not the same.
+
+When comparing this TTime with an earlier time:
+
+1. if the previous month is shorter, one month is deemed to separate the times 
+   when the last microsecond of the previous month is reached (23:59:59.999999 
+   on the last day of the month).
+
+2. if the previous month is longer, one month is deemed to separate the times 
+   when the same time on the last day of previous month is reached. In this case, 
+   the two day numbers are not the same.
+
+@param aTime The time to be compared with this TTime.
+
+@return Difference in months between the two times. If the time specified in 
+        the argument is later than this TTime, the interval is negative.
+*/
+	{
+
+	TDateTime dateTimei=DateTime();
+	TDateTime dateTimea=aTime.DateTime();
+	
+	TInt monthsDifference=(dateTimei.Year()-dateTimea.Year())*12+(dateTimei.Month()-dateTimea.Month());
+
+	if (monthsDifference>0)
+		{
+		if (dateTimei.Day()<=dateTimea.Day())
+			{
+			if (iTime%KDaysToMicroSeconds<aTime.Int64()%KDaysToMicroSeconds || (dateTimei.Day()!=dateTimea.Day() && dateTimei.Day()!=DaysInMonth()-1))
+				monthsDifference--;
+			}
+		}
+	else
+		if (monthsDifference!=0)//monthsDifference<0
+			{
+			if (dateTimei.Day()>=dateTimea.Day())
+				{
+				if (iTime%KDaysToMicroSeconds>aTime.Int64()%KDaysToMicroSeconds || (dateTimei.Day()!=dateTimea.Day() && dateTimea.Day()!=aTime.DaysInMonth()-1))
+					monthsDifference++;
+				}
+			}
+
+	return(monthsDifference);			
+	}
+
+EXPORT_C TTimeIntervalYears TTime::YearsFrom(TTime aTime) const
+//
+// as above,but for twelve months
+//
+/**
+Calculates the number of years between the specified TTime and this TTime.
+
+The result may be positive or negative.
+
+Note that the interval in years between two TTimes is calculated by
+incrementing it by one each time the same day number and time in the previous
+or following year has been reached. The exception to this rule occurs when this
+TTime is the last day in February in a leap year. In this case, one year is
+deemed to have passed when the same time of day on the last day in the preceding 
+or following February has been reached.
+
+@param aTime The time to be compared with this TTime.
+
+@return Difference in years between the two times. If the time specified in 
+        the argument is later than this TTime, the interval is negative.
+*/
+	{
+
+	TTimeIntervalMonths mos= TTime::MonthsFrom(aTime);
+	TTimeIntervalYears ret=mos.Int()/12;
+	return(ret);			
+	}
+
+EXPORT_C TTime TTime::operator+(TTimeIntervalYears aYear) const
+/**
+Adds a time interval to this TTime, returning the result
+as a TTime.
+
+Note that in a leap year, when adding one year to the 29th February, the result
+is the 28th February in the following year.
+
+Note also that this TTime object is not changed.
+
+@param aYear A time interval in years. The argument is stored as a 32 bit
+             signed integer. The maximum value which it can represent is
+             2147483647. Any attempt to add more than this amount will
+             produce incorrect results.
+
+@return The new time.
+*/
+	{
+
+	return((*this)+TTimeIntervalMonths(aYear.Int()*12));
+	}
+
+EXPORT_C TTime TTime::operator+(TTimeIntervalMonths aMonth) const
+/**
+Adds a time interval to this TTime, returning the result
+as a TTime.
+
+Note that when adding one month to the last day in the month, if the following
+month is shorter, the result is the last day in the following month.
+For example, when adding one month to 31st August, the result is
+the 30th September.
+
+Note also that this TTime object is not changed.
+
+@param aMonth A time interval in months. The argument is stored as a 32 bit
+              signed integer. The maximum value which it can represent is
+              2147483647. Any attempt to add more than this amount will
+              produce incorrect results.
+
+@return The new time.
+*/
+	{
+
+	TDateTime dateTime=DateTime();
+	TInt month=dateTime.Month()+(dateTime.Year()*12)+aMonth.Int();
+	TInt day=dateTime.Day();
+	TInt year=month/12;
+	month%=12;
+	if (month<0)
+		{
+		year--;
+		month+=12;
+		}
+	TInt daysInMonth=(mTab[Time::IsLeapYear(year)][month]-1); 
+	if (day>=daysInMonth)
+		day=daysInMonth;
+	dateTime.Set(year,TMonth(month),day,dateTime.Hour(),dateTime.Minute(),dateTime.Second(),dateTime.MicroSecond());
+	return(dateTime);
+	}
+							 
+EXPORT_C TTime TTime::operator+(TTimeIntervalDays aDay) const
+/**
+Adds a time interval to this TTime, returning the result
+as a TTime.
+
+Note that this TTime object is not changed.
+
+@param aDay A time interval in days. The argument is stored as a 32 bit
+            signed integer. The maximum value which it can represent is
+            2147483647. Any attempt to add more than this amount will
+            produce incorrect results.
+
+@return The new time.
+*/
+	{ 
+
+	return(iTime+TInt64(aDay.Int())*KDaysToMicroSeconds);
+	}
+
+EXPORT_C TTime TTime::operator+(TTimeIntervalHours aHour) const
+/**
+Adds a time interval to this TTime, returning the result
+as a TTime.
+
+Note that this TTime object is not changed.
+
+@param aHour A time interval in hours. The argument is stored as a 32 bit
+             signed integer. The maximum value which it can represent is
+             2147483647. Any attempt to add more than this amount will
+             produce incorrect results.
+
+@return The new time.
+*/
+	{
+
+	return(iTime+TInt64(aHour.Int())*KHoursToMicroSeconds);
+	}
+
+EXPORT_C TTime TTime::operator+(TTimeIntervalMinutes aMinute) const
+/**
+Adds a time interval to this TTime, returning the result
+as a TTime.
+
+Note that this TTime object is not changed.
+
+@param aMinute A time interval in minutes. The argument is stored as a 32 bit
+               signed integer. The maximum value which it can represent is
+               2147483647. Any attempt to add more than this amount will
+               produce incorrect results.
+
+@return The new time.
+*/
+	{
+
+	return(iTime+TInt64(aMinute.Int())*KMinutesToMicroSeconds);
+	}
+
+EXPORT_C TTime TTime::operator+(TTimeIntervalSeconds aSecond) const
+/**
+Adds a time interval to this TTime, returning the result
+as a TTime.
+
+Note that this TTime object is not changed.
+
+@param aSecond A time interval in seconds. The argument is stored as a 32 bit
+               signed integer. The maximum value which it can represent is
+               2147483647. Any attempt to add more than this amount will
+               produce incorrect results.
+
+@return The new time.
+*/
+	{
+
+	return(iTime+TInt64(aSecond.Int())*KSecondsToMicroSeconds);
+	}
+
+ 
+EXPORT_C TTime TTime::operator+(TTimeIntervalMicroSeconds aMicroSecond) const
+/**
+Adds a time interval to this TTime, returning the result
+as a TTime.
+
+Note that this TTime object is not changed.
+
+@param aMicroSecond A time interval in microseconds.
+
+@return The new time.
+*/
+	{
+
+	return(iTime+(aMicroSecond.Int64()));
+	}
+
+EXPORT_C TTime TTime::operator+(TTimeIntervalMicroSeconds32 aMicroSecond) const
+/**
+Adds a time interval to this TTime, returning the result
+as a TTime.
+
+Note that this TTime object is not changed.
+
+@param aMicroSecond A time interval in microseconds. The argument is stored as
+                    a 32 bit signed integer. The maximum value which it can
+                    represent is 2147483647. Any attempt to add more than this
+                    amount will produce incorrect results.
+
+@return The new time.
+*/
+	{
+
+	return(iTime+aMicroSecond.Int());
+	}
+
+EXPORT_C TTime TTime::operator-(TTimeIntervalYears aYear) const
+/**
+Substracts a time interval from this TTime, returning the result
+as a TTime.
+
+Note that in a leap year, when subtracting one year from the 29th February,
+the result is 28th February in the preceding year.
+
+Note also that this TTime object is not changed.
+
+@param aYear A time interval in years. The argument is stored as
+             a 32 bit signed integer. The maximum value which it can
+             represent is 2147483647. Any attempt to subtract more than this
+             amount will produce incorrect results.
+
+@return The new time.
+*/
+	{
+
+	return((*this)-TTimeIntervalMonths(aYear.Int()*12));
+	}
+
+EXPORT_C TTime TTime::operator-(TTimeIntervalMonths aMonth) const
+/**
+Substracts a time interval from this TTime, returning the result
+as a TTime.
+
+Note that when subtracting one month from the last day in the month, if the
+preceding month is shorter, the result is the last day in the preceding month.
+For example, when subtracting 1 month from 31st October, the result is
+the 30th September.
+
+Note also that this TTime object is not changed.
+
+@param aMonth A time interval in months. The argument is stored as
+              a 32 bit signed integer. The maximum value which it can
+              represent is 2147483647. Any attempt to subtract more than this
+              amount will produce incorrect results.
+
+@return The new time.
+*/
+	{
+
+	return((*this)+TTimeIntervalMonths(aMonth.Int()*-1));
+	}
+							 
+EXPORT_C TTime TTime::operator-(TTimeIntervalDays aDay) const
+/**
+Substracts a time interval from this TTime, returning the result
+as a TTime.
+
+Note that this TTime object is not changed.
+
+@param aDay A time interval in days. The argument is stored as
+            a 32 bit signed integer. The maximum value which it can
+            represent is 2147483647. Any attempt to subtract more than this
+            amount will produce incorrect results.
+
+@return The new time.
+*/
+	{ 
+
+	return(iTime-TInt64(aDay.Int())*KDaysToMicroSeconds);
+	}
+
+EXPORT_C TTime TTime::operator-(TTimeIntervalHours aHour) const
+/**
+Substracts a time interval from this TTime, returning the result
+as a TTime.
+
+Note that this TTime object is not changed.
+
+@param aHour A time interval in hours. The argument is stored as
+             a 32 bit signed integer. The maximum value which it can
+             represent is 2147483647. Any attempt to subtract more than this
+             amount will produce incorrect results.
+
+@return The new time.
+*/
+	{
+
+	return(iTime-TInt64(aHour.Int())*KHoursToMicroSeconds);
+	}
+
+EXPORT_C TTime TTime::operator-(TTimeIntervalMinutes aMinute) const
+/**
+Substracts a time interval from this TTime, returning the result
+as a TTime.
+
+Note that this TTime object is not changed.
+
+@param aMinute A time interval in minutes. The argument is stored as
+               a 32 bit signed integer. The maximum value which it can
+               represent is 2147483647. Any attempt to subtract more than this
+               amount will produce incorrect results.
+
+@return The new time.
+*/
+	{
+
+	return(iTime-TInt64(aMinute.Int())*KMinutesToMicroSeconds);
+	}
+
+EXPORT_C TTime TTime::operator-(TTimeIntervalSeconds aSecond) const
+/**
+Substracts a time interval from this TTime, returning the result
+as a TTime.
+
+Note that this TTime object is not changed.
+
+@param aSecond A time interval in seconds. The argument is stored as
+               a 32 bit signed integer. The maximum value which it can
+               represent is 2147483647. Any attempt to subtract more than this
+               amount will produce incorrect results.
+
+@return The new time.
+*/
+	{
+
+	return(iTime-TInt64(aSecond.Int())*KSecondsToMicroSeconds);
+	}
+
+EXPORT_C TTime TTime::operator-(TTimeIntervalMicroSeconds aMicroSecond) const
+/**
+Substracts a time interval from this TTime, returning the result
+as a TTime.
+
+Note that this TTime object is not changed.
+
+@param aMicroSecond A time interval in microseconds.
+
+@return The new time.
+*/
+	{
+
+	return(iTime-(aMicroSecond.Int64()));
+	}
+
+EXPORT_C TTime TTime::operator-(TTimeIntervalMicroSeconds32 aMicroSecond) const
+/**
+Substracts a time interval from this TTime, returning the result
+as a TTime.
+
+Note that this TTime object is not changed.
+
+@param aMicroSecond A time interval in microseconds. The argument is stored as
+                    a 32 bit signed integer. The maximum value which it can
+                    represent is 2147483647. Any attempt to subtract more than
+                    this amount will produce incorrect results.
+
+@return The new time.
+*/
+	{
+
+	return(iTime-aMicroSecond.Int());
+	}
+
+EXPORT_C TTime &TTime::operator+=(TTimeIntervalYears aYear)
+/**
+Adds a time interval to this TTime, returning a reference to this TTime.
+
+@param aYear A time interval in years.
+
+@return A reference to this TTime.
+*/
+	{	
+
+	TTime tim=(*this)+aYear;
+	iTime=tim.Int64();
+	return(*this);
+	}
+
+EXPORT_C TTime &TTime::operator+=(TTimeIntervalMonths aMonth)
+/**
+Adds a time interval to this TTime, returning a reference to this TTime.
+
+@param aMonth A time interval in months.
+
+@return A reference to this TTime.
+*/
+	{
+
+	TTime tim=(*this)+aMonth;
+	iTime=tim.Int64();
+	return(*this);
+	}
+
+EXPORT_C TTime &TTime::operator+=(TTimeIntervalDays aDay)
+/**
+Adds a time interval to this TTime, returning a reference to this TTime.
+
+@param aDay A time interval in days.
+
+@return A reference to this TTime.
+*/
+	{
+
+	iTime+=TInt64(aDay.Int())*KDaysToMicroSeconds;
+	return(*this);
+	}
+
+EXPORT_C TTime &TTime::operator+=(TTimeIntervalHours aHour)
+/**
+Adds a time interval to this TTime, returning a reference to this TTime.
+
+@param aHour A time interval in hours.
+
+@return A reference to this TTime.
+*/
+	{
+
+	iTime+=TInt64(aHour.Int())*KHoursToMicroSeconds;
+	return(*this);
+	}
+
+EXPORT_C TTime &TTime::operator+=(TTimeIntervalMinutes aMinute)
+/**
+Adds a time interval to this TTime, returning a reference to this TTime.
+
+@param aMinute A time interval in minutes.
+
+@return A reference to this TTime.
+*/
+	{
+
+	iTime+=TInt64(aMinute.Int())*KMinutesToMicroSeconds;
+	return(*this);
+	}
+
+EXPORT_C TTime &TTime::operator+=(TTimeIntervalSeconds aSecond)
+/**
+Adds a time interval to this TTime, returning a reference to this TTime.
+
+@param aSecond A time interval in seconds.
+
+@return A reference to this TTime.
+*/
+	{
+
+	iTime+=TInt64(aSecond.Int())*KSecondsToMicroSeconds;
+	return(*this);
+	}
+
+EXPORT_C TTime &TTime::operator+=(TTimeIntervalMicroSeconds aMicroSecond)
+/**
+Adds a time interval to this TTime, returning a reference to this TTime.
+
+@param aMicroSecond A time interval in microseconds.
+
+@return A reference to this TTime.
+*/
+	{
+
+	iTime+=aMicroSecond.Int64();
+	return(*this);
+	}
+ 
+EXPORT_C TTime &TTime::operator+=(TTimeIntervalMicroSeconds32 aMicroSecond)
+/**
+Adds a time interval to this TTime, returning a reference to this TTime.
+
+@param aMicroSecond A time interval in microseconds, as a 32-bit integer.
+
+@return A reference to this TTime.
+*/
+	{
+
+	iTime+=aMicroSecond.Int();
+	return(*this);
+	}
+ 
+EXPORT_C TTime &TTime::operator-=(TTimeIntervalYears aYear)
+/**
+Subtracts a time interval from this TTime, returning a reference to this TTime.
+
+@param aYear A time interval in years.
+
+@return A reference to this TTime.
+*/
+	{	
+
+	TTime tim=(*this)-aYear;
+	iTime=tim.Int64();
+	return(*this);
+	}
+
+EXPORT_C TTime &TTime::operator-=(TTimeIntervalMonths aMonth)
+/**
+Subtracts a time interval from this TTime, returning a reference to this TTime.
+
+@param aMonth A time interval in months.
+
+@return A reference to this TTime.
+*/
+	{
+
+	TTime tim=(*this)-aMonth;
+	iTime=tim.Int64();
+	return(*this);
+	}
+
+EXPORT_C TTime &TTime::operator-=(TTimeIntervalDays aDay)
+/**
+Subtracts a time interval from this TTime, returning a reference to this TTime.
+
+@param aDay A time interval in days.
+
+@return A reference to this TTime.
+*/
+	{
+
+	iTime-=TInt64(aDay.Int())*KDaysToMicroSeconds;
+	return(*this);
+	}
+
+EXPORT_C TTime &TTime::operator-=(TTimeIntervalHours aHour)
+/**
+Subtracts a time interval from this TTime, returning a reference to this TTime.
+
+@param aHour A time interval in hours.
+
+@return A reference to this TTime.
+*/
+	{
+
+	iTime-=TInt64(aHour.Int())*KHoursToMicroSeconds;
+	return(*this);
+	}
+
+EXPORT_C TTime &TTime::operator-=(TTimeIntervalMinutes aMinute)
+/**
+Subtracts a time interval from this TTime, returning a reference to this TTime.
+
+@param aMinute A time interval in minutes.
+
+@return A reference to this TTime.
+*/
+	{
+
+	iTime-=TInt64(aMinute.Int())*KMinutesToMicroSeconds;
+	return(*this);
+	}
+
+EXPORT_C TTime &TTime::operator-=(TTimeIntervalSeconds aSecond)
+/**
+Subtracts a time interval from this TTime, returning a reference to this TTime.
+
+@param aSecond A time interval in seconds.
+
+@return A reference to this TTime.
+*/
+	{
+
+	iTime-=TInt64(aSecond.Int())*KSecondsToMicroSeconds;
+	return(*this);
+	}
+
+EXPORT_C TTime &TTime::operator-=(TTimeIntervalMicroSeconds aMicroSecond)
+/**
+Subtracts a time interval from this TTime, returning a reference to this TTime.
+
+@param aMicroSecond A time interval in microseconds.
+
+@return A reference to this TTime.
+*/
+	{
+
+	iTime-=aMicroSecond.Int64();
+	return(*this);
+	}
+
+EXPORT_C TTime &TTime::operator-=(TTimeIntervalMicroSeconds32 aMicroSecond)
+/**
+Subtracts a time interval from this TTime, returning a reference to this TTime.
+
+@param aMicroSecond A time interval in microseconds, as a 32-bit integer.
+
+@return A reference to this TTime.
+*/
+	{
+
+	iTime-=aMicroSecond.Int();
+	return(*this);
+	}
+ 
+EXPORT_C TInt TTime::DaysInMonth() const
+/**
+Gets the number of days in the current month.
+
+@return The number of days in the month.
+*/
+	{
+
+	TDateTime dateTime=DateTime();
+	return(Time::DaysInMonth(dateTime.Year(),dateTime.Month()));
+	}
+
+EXPORT_C TDay TTime::DayNoInWeek() const
+//
+// 1st January 0AD was a Monday
+//
+/**
+Gets the day number within the current week.
+
+This is a value in the range zero to six inclusive, and honours the 
+setting specified in TLocale::SetStartOfWeek().
+
+By default the first day in the week is Monday.
+
+@return The number of the day within the week. The range is EMonday to ESunday.
+
+@see TLocale::SetStartOfWeek
+*/
+	{
+
+
+	TInt64 fullDays=iTime/KDaysToMicroSeconds;
+	TInt day = static_cast<TInt>(fullDays) % 7;
+	if (iTime<0)
+		{
+		if (fullDays*KDaysToMicroSeconds!=iTime)
+			day+=6;
+		else
+			if (day!=0)
+				day+=7;
+		}
+	return((TDay)day);
+	}
+
+EXPORT_C TInt TTime::DayNoInMonth() const
+/**
+Gets the day number in the month.
+
+@return The day number in the month. The first day in the month is numbered 
+        zero.
+*/
+	{
+
+	return(DateTime().Day());
+	}
+
+EXPORT_C TInt TTime::DayNoInYear() const
+//
+// day number in comparison to 1st January
+//
+/**
+Gets the day number in the year. 
+
+@return The day number in the year. The first day in the year is day one.
+*/
+	{
+
+	TDateTime dateTime=DateTime();
+	TTime jan1st=TDateTime(dateTime.Year(),EJanuary,0,0,0,0,0);
+	return(DayNoInYear(jan1st));
+	}
+
+EXPORT_C TInt TTime::DayNoInYear(TTime aStartDate) const
+//
+// day number in comparison to given date, check is made to ensure first day is within a year before aDay
+//
+/**
+Gets the day number in the year when the start of the year is aStartDate. 
+
+If no start date is specified, the default is January 1st.
+
+@param aStartDate Indicates the date which is to be considered the start of 
+                  the year. Default is 1st January.
+                  
+@return The day number in the year. The first day in the year is day one.
+*/
+	{
+
+	TInt y=DateTime().Year();
+	TMonth m=aStartDate.DateTime().Month();
+	TInt d=aStartDate.DateTime().Day();
+    if (d>=Time::DaysInMonth(y,m))
+        d=27;
+    TDateTime yearStart(y,m,d,0,0,0,0);              // LEAP YEAR PROBLEMS ???
+	aStartDate=yearStart;
+	if (aStartDate>*this)
+		{
+		yearStart.SetYearLeapCheck(y-1);
+		aStartDate=yearStart;
+		}
+    return((DaysFrom(aStartDate).Int())+1) ;
+    }
+
+EXPORT_C TInt TTime::WeekNoInYear() const
+/**
+Gets the number of the current week in the year.
+
+@return Week number in the year.
+*/
+	{
+
+	return(WeekNoInYear(EFirstFourDayWeek));
+	}
+
+EXPORT_C TInt TTime::WeekNoInYear(TTime aStartDate) const
+/**
+Gets the number of the current week in the year when the year starts
+on aStartDate. 
+
+@param aStartDate If specified, indicates the date which is to be considered 
+                  the start of the year. Default is 1st January.
+                  
+@return Week number in the year.
+*/
+	{
+    
+    return(WeekNoInYear(aStartDate,EFirstFourDayWeek));
+	}
+
+EXPORT_C TInt TTime::WeekNoInYear(TFirstWeekRule aRule) const
+/**
+Finds the number of the current week in the year using the first week rule 
+specified in aRule. 
+
+@param aRule Determines how the first week in the year is to be calculated. 
+             By default EFirstFourDayWeek.
+             
+@return Week number in the year.
+*/
+	{
+	
+	TInt year=DateTime().Year();
+	TTime startDate=TDateTime(year,EJanuary,0,0,0,0,0);
+	return(WeekNoInYear(startDate,aRule));
+	}
+
+EXPORT_C TInt TTime::WeekNoInYear(TTime aStartDate,TFirstWeekRule aRule) const
+//
+// number of weeks between aTime and aStartDate according to given rule
+// the first week starts either on the week containing the first day (EFirstWeek), 
+// the first week having at least four days within the new year (EFirstFourDayWeek,
+//  default) or the first full week in the year (EFirstFullWeek)
+//
+/**
+Finds the number of the current week in the year when the year starts from 
+aStartDate and when using the start week rule aRule.
+
+@param aStartDate If specified, indicates the date which is to be considered 
+                  the start of the year. Default is 1st January.
+@param aRule      Determines how the first week in the year is to be
+                  calculated. By default EFirstFourDayWeek.
+                  
+@return Week number in the year.
+*/
+	{                    
+	TInt dayNoInWeek=DayNoInWeek();
+	TInt dayNoInYear=(DayNoInYear(aStartDate))-1;    // puts start into correct year
+	TDateTime startDateTime(aStartDate.DateTime());
+	TDateTime nextYearStartDate(startDateTime);
+	nextYearStartDate.SetYearLeapCheck(DateTime().Year());    // find start of next year
+	TTime nextYearStartTime(nextYearStartDate);            // makes sure start date for year
+	if (*this>nextYearStartTime)                           // is in the very next year
+		{
+		nextYearStartDate.SetYearLeapCheck(nextYearStartDate.Year()+1);
+		nextYearStartTime=nextYearStartDate;
+		}
+	nextYearStartTime+=TTimeIntervalMicroSeconds(KDaysToMicroSeconds-1); // avoid problems if the time is not midnight
+	TLocale local;
+	TDay startOfFirstWeek=local.StartOfWeek();
+	// calculate the day-in-week number (0 to 6) based on the locale start-of-week
+	dayNoInWeek -= startOfFirstWeek;
+	if (dayNoInWeek < 0)
+		dayNoInWeek += 7;
+	// calculate the days from the start-of-week to the start-of-next-year
+	TInt daysFrom=nextYearStartTime.DaysFrom(*this).Int()+dayNoInWeek;
+	// calculate the days from start-of-year to start-of-week (note this may be negative, but never < -6)
+	TInt days=dayNoInYear-dayNoInWeek;
+
+	// the rule allows a certain number of week-1 days to lie in the previous year
+	TInt prevyeardays;
+	switch (aRule)
+		{
+	default:
+		return -1;
+	case EFirstWeek:
+		prevyeardays = 6;
+		break;
+	case EFirstFourDayWeek:
+		prevyeardays = 3;
+		break;
+	case EFirstFullWeek:
+		prevyeardays = 0;
+		break;
+		}
+
+	// check for a week which belongs to last year
+	if (days + prevyeardays < 0)
+		{
+		// in week 52 or 53 of last year, find the week # of the first day in the week
+		startDateTime.SetYearLeapCheck(startDateTime.Year()-1);
+		return (*this-TTimeIntervalDays(dayNoInWeek)).WeekNoInYear(TTime(startDateTime),aRule);
+		}
+
+	// check for a week which belongs to next year
+	if (daysFrom <= prevyeardays)
+		return 1;
+
+	// calculate the week number, accounting for the requested week-1 rule
+	return (days + 7 + prevyeardays)/7;
+	}
+
+EXPORT_C void TTime::FormatL(TDes &aDes,const TDesC &aFormat) const
+//
+// Fill aString with current Date and Time according to given aFormat string
+//
+/**
+Puts this TTime into a descriptor and formats it according to the format string 
+specified in the second argument.
+
+Many of the formatting commands use the 
+system's locale settings for the date and time, for example the characters 
+used to separate components of the date and time and the ordering of day, 
+month and year. The list of formatting commands below is divided into two 
+sections, the first of which lists the commands which operate without reference 
+to the locale's date and time settings (see class TLocale) and the second 
+table lists the commands which do use these settings.
+
+The following formatting commands do not honour the locale-specific system 
+settings:
+
+\%\% : Include a single '%' character in the string
+
+\%* : Abbreviate following item (the following item should not be preceded 
+by a '%' character).
+
+\%C : Interpret the argument as the six digit microsecond component of the 
+time. In its abbreviated form, ('%*C') this should be followed by an integer 
+between zero and six, where the integer indicates the number of digits to display.
+
+\%D : Interpret the argument as the two digit day number in the month. Abbreviation 
+suppresses leading zero.
+
+\%E : Interpret the argument as the day name. Abbreviation is language-specific 
+(e.g. English uses the first three letters).
+
+\%F : Use this command for locale-independent ordering of date components. 
+This orders the following day/month/year component(s) (\%D, \%M, \%Y for example) 
+according to the order in which they are specified in the string. This removes 
+the need to use \%1 to \%5 (described below).
+
+\%H : Interpret the argument as the one or two digit hour component of the 
+time in 24 hour time format. Abbreviation suppresses leading zero. For locale-dependent 
+hour formatting, use \%J.
+
+\%I : Interpret the argument as the one or two digit hour component of the 
+time in 12 hour time format. The leading zero is automatically suppressed 
+so that abbreviation has no effect. For locale-dependent hour formatting, 
+use \%J.
+
+\%M : Interpret the argument as the one or two digit month number. Abbreviation 
+suppresses leading zero.
+
+\%N : Interpret the argument as the month name. Abbreviation is language specific, e.g. 
+English uses the first three letters only. When using locale-dependent formatting, 
+(that is, \%F has not previously been specified), specifying \%N causes any 
+subsequent occurrence of a month specifier in the string to insert the month 
+as text rather than in numeric form. When using locale-independent formatting, 
+specifying \%N causes the month to be inserted as text at that position, but 
+any subsequent occurrence of \%M will cause the month to be inserted in numeric 
+form.
+
+\%S : Interpret the argument as the one or two digit seconds component of the 
+time. Abbreviation suppresses leading zero.
+
+\%T : Interpret the argument as the one or two digit minutes component of the 
+time. Abbreviation suppresses leading zero.
+
+\%W : Interpret the argument as the one or two digit week number in year. Abbreviation 
+suppresses leading zero.
+
+\%X : Interpret the argument as the date suffix. Cannot be abbreviated. When 
+using locale-dependent formatting (that is, \%F has not previously been specified), 
+\%X causes all further occurrences of the day number to be displayed with the 
+date suffix. When using locale-independent formatting, a date suffix will 
+be inserted only after the occurrence of the day number which \%X follows in 
+the format string. Any further occurrence of \%D without a following \%X will 
+insert the day number without a suffix.
+
+\%Y : Interpret the argument as the four digit year number. Abbreviation suppresses 
+the first two digits.
+
+\%Z : Interpret the argument as the one, two or three digit day number in the 
+year. Abbreviation suppresses leading zeros.
+
+The following formatting commands do honour the locale-specific system settings:
+
+\%. : Interpret the argument as the decimal separator character (as set by 
+TLocale::SetDecimalSeparator()). The decimal separator is used to separate 
+seconds and microseconds, if present.
+
+\%: : Interpret the argument as one of the four time separator characters (as 
+set by TLocale::SetTimeSeparator()). Must be followed by an integer between 
+zero and three inclusive to indicate which time separator character is being 
+referred to.
+
+\%/ : Interpret the argument as one of the four date separator characters (as 
+set by TLocale::SetDateSeparator()). Must be followed by an integer between 
+zero and three inclusive to indicate which date separator character is being 
+referred to.
+
+\%1 : Interpret the argument as the first component of a three component date 
+(i.e. day, month or year) where the order has been set by TLocale::SetDateFormat(). 
+When the date format is EDateEuropean, this is the day, when EDateAmerican, 
+the month, and when EDateJapanese, the year. For more information on this 
+and the following four formatting commands, see the Notes section immediately 
+below.
+
+\%2 : Interpret the argument as the second component of a three component date 
+where the order has been set by TLocale::SetDateFormat(). When the date format 
+is EDateEuropean, this is the month, when EDateAmerican, the day and when 
+EDateJapanese, the month.
+
+\%3 : Interpret the argument as the third component of a three component date 
+where the order has been set by TLocale::SetDateFormat(). When the date format 
+is EDateEuropean, or EDateAmerican this is the year and when EDateJapanese, 
+the day.
+
+\%4 : Interpret the argument as the first component of a two component date 
+(day and month) where the order has been set by TLocale::SetDateFormat(). 
+When the date format is EDateEuropean this is the day, and when EDateAmerican 
+or EDateJapanese, the month.
+
+\%5 : Interpret the argument as the second component of a two component date 
+(day and month) where the order has been set by TLocale::SetDateFormat(). 
+When the date format is EDateEuropean this is the month, and when EDateAmerican 
+or EDateJapanese, the day.
+
+\%A : Interpret the argument as "am" or "pm" text according to the current 
+language and time of day. Unlike the \%B formatting command (described below), 
+\%A disregards the locale's 12 or 24 hour clock setting, so that when used 
+without an inserted + or - sign, am/pm text will always be displayed. Whether 
+a space is inserted between the am/pm text and the time depends on the locale-specific 
+settings. However, if abbreviated (\%*A), no space is inserted, regardless 
+of the locale's settings. The am/pm text appears before or after the time, 
+according to the position of the \%A, regardless of the locale-specific settings. 
+For example, the following ordering of formatting commands causes am/pm text 
+to be printed after the time: \%H \%T \%S \%A. Optionally, a minus or plus sign 
+may be inserted between the "%" and the "A". This operates as follows:
+
+\%-A causes am/pm text to be inserted into the descriptor only if the am/pm 
+symbol position has been set in the locale to ELocaleBefore. Cannot be abbreviated 
+using asterisk.
+
+\%+A causes am/pm text to be inserted into the descriptor only if the am/pm 
+symbol position has been set in the locale to ELocaleAfter. Cannot be abbreviated 
+using asterisk. For example, the following formatting commands will cause 
+am/pm text to be displayed after the time if the am/pm position has been set 
+in the locale to ELocaleAfter or before the time if ELocaleBefore: \%-A \%H 
+\%T \%S \%+A.
+
+\%B Interpret the argument as am or pm text according to the current language 
+and time of day. Unlike the \%A command, when using \%B, am/pm text is displayed 
+only if the clock setting in the locale is 12-hour. Whether a space is inserted 
+between the am/pm text and the time depends on the locale-specific settings. 
+However, if abbreviated (\%*B), no space is inserted, regardless of the locale's 
+settings. The am/pm text appears before or after the time, according to the 
+location of the "%B", regardless of the locale-specific settings. For example, 
+the following formatting commands cause am/pm text to be printed after the 
+time: \%H \%T \%S \%B. Optionally, a minus or plus sign may be inserted between 
+the "%" and the "B". This operates as follows:
+
+\%-B causes am/pm text to be inserted into the descriptor only if using a 12 
+hour clock and the am/pm symbol position has been set in the locale to ELocaleBefore. 
+Cannot be abbreviated using asterisk.
+
+\%+B causes am/pm text to be inserted into the descriptor only if using a 12 
+hour clock and the am/pm symbol position has been set in the locale to ELocaleAfter. 
+Cannot be abbreviated using asterisk. For example, the following formatting 
+commands cause am/pm text to be printed after the time if the am/pm position 
+has been set in the locale to ELocaleAfter or before the time if ELocaleBefore: 
+\%-B \%H \%T \%S \%+B.
+
+\%J Interpret the argument as the hour component of the time in either 12 or 
+24 hour clock format depending on the locale's clock format setting. When 
+the clock format has been set to 12 hour, leading zeros are automatically 
+suppressed so that abbreviation has no effect. Abbreviation suppresses leading 
+zero only when using a 24 hour clock.
+
+Notes:
+
+The \%1, \%2, \%3, \%4 and \%5 formatting commands are used in conjunction with 
+\%D, \%M and \%Y to format the date locale-dependently. When formatting the date 
+locale-dependently, the order of the day, month and year components within 
+the string is determined by the order of the \%1 to \%5 formatting commands, 
+not that of \%D, \%M, \%Y.
+
+When formatting the date locale-independently (that is, \%F has been specified 
+in the format string), the \%1 to \%5 formatting commands are not required, 
+and should be omitted. In this case, the order of the date components is determined 
+by the order of the \%D, \%M, \%Y format commands within aFormat.
+
+Up to four date separators and up to four time separators can be used to separate 
+the components of a date or time. When formatting a numerical date consisting 
+of the day, month and year or a time containing hours, minutes and seconds, 
+all four separators should always be specified in the format command string. 
+Usually, the leading and trailing separators should not be displayed. In this 
+case, the first and fourth separators should still be specified, but should 
+be represented by a null character.
+
+The date format follows the pattern:
+
+DateSeparator[0] DateComponent1 DateSeparator[1] DateComponent2 DateSeparator[2] 
+DateComponent3 DateSeparator[3]
+
+where the ordering of date components is determined by the locale's date format 
+setting.
+
+The time format follows the pattern:
+
+TimeSeparator[0] Hours TimeSeparator[1] Minutes TimeSeparator[2] Seconds TimeSeparator[3]
+
+If the time includes a microseconds component, the third separator should 
+occur after the microseconds, and the seconds and microseconds should be separated 
+by the decimal separator. When formatting a two component time, the following 
+rules apply:
+
+if the time consists of hours and minutes, the third time delimiter should 
+be omitted 
+
+if the time consists of minutes and seconds, the second time delimiter should 
+be omitted
+
+@param aDes    Descriptor, which,  on return contains the formatted date/time string.
+@param aFormat Format string which determines the format of the date and time.
+
+@leave KErrOverflow The date/time string is too long for the descriptor aDes.
+@leave KErrGeneral  A formatting error has occurred.
+*/
+	{
+	TLocale local;
+	FormatL(aDes,aFormat,local);
+	}
+
+EXPORT_C void TTime::FormatL(TDes &aDes,const TDesC &aFormat,const TLocale &aLocale) const
+//
+// Fill aString with current Date and Time according to given aFormat string
+//
+/**
+Puts this TTime into a descriptor and formats it according to the format string 
+specified in the second argument.
+
+Many of the formatting commands use the 
+system's locale settings for the date and time, for example the characters 
+used to separate components of the date and time and the ordering of day, 
+month and year. The list of formatting commands below is divided into two 
+sections, the first of which lists the commands which operate without reference 
+to the locale's date and time settings (see class TLocale) and the second 
+table lists the commands which do use these settings.
+
+The following formatting commands do not honour the locale-specific system 
+settings:
+
+\%\% : Include a single '%' character in the string
+
+\%* : Abbreviate following item (the following item should not be preceded 
+by a '%' character).
+
+\%C : Interpret the argument as the six digit microsecond component of the 
+time. In its abbreviated form, ('%*C') this should be followed by an integer 
+between zero and six, where the integer indicates the number of digits to display.
+
+\%D : Interpret the argument as the two digit day number in the month. Abbreviation 
+suppresses leading zero.
+
+\%E : Interpret the argument as the day name. Abbreviation is language-specific 
+(e.g. English uses the first three letters).
+
+\%F : Use this command for locale-independent ordering of date components. 
+This orders the following day/month/year component(s) (\%D, \%M, \%Y for example) 
+according to the order in which they are specified in the string. This removes 
+the need to use \%1 to \%5 (described below).
+
+\%H : Interpret the argument as the one or two digit hour component of the 
+time in 24 hour time format. Abbreviation suppresses leading zero. For locale-dependent 
+hour formatting, use \%J.
+
+\%I : Interpret the argument as the one or two digit hour component of the 
+time in 12 hour time format. The leading zero is automatically suppressed 
+so that abbreviation has no effect. For locale-dependent hour formatting, 
+use \%J.
+
+\%M : Interpret the argument as the one or two digit month number. Abbreviation 
+suppresses leading zero.
+
+\%N : Interpret the argument as the month name. Abbreviation is language specific, e.g. 
+English uses the first three letters only. When using locale-dependent formatting, 
+(that is, \%F has not previously been specified), specifying \%N causes any 
+subsequent occurrence of a month specifier in the string to insert the month 
+as text rather than in numeric form. When using locale-independent formatting, 
+specifying \%N causes the month to be inserted as text at that position, but 
+any subsequent occurrence of \%M will cause the month to be inserted in numeric 
+form.
+
+\%S : Interpret the argument as the one or two digit seconds component of the 
+time. Abbreviation suppresses leading zero.
+
+\%T : Interpret the argument as the one or two digit minutes component of the 
+time. Abbreviation suppresses leading zero.
+
+\%W : Interpret the argument as the one or two digit week number in year. Abbreviation 
+suppresses leading zero.
+
+\%X : Interpret the argument as the date suffix. Cannot be abbreviated. When 
+using locale-dependent formatting (that is, \%F has not previously been specified), 
+\%X causes all further occurrences of the day number to be displayed with the 
+date suffix. When using locale-independent formatting, a date suffix will 
+be inserted only after the occurrence of the day number which \%X follows in 
+the format string. Any further occurrence of \%D without a following \%X will 
+insert the day number without a suffix.
+
+\%Y : Interpret the argument as the four digit year number. Abbreviation suppresses 
+the first two digits.
+
+\%Z : Interpret the argument as the one, two or three digit day number in the 
+year. Abbreviation suppresses leading zeros.
+
+The following formatting commands do honour the locale-specific system settings:
+
+\%. : Interpret the argument as the decimal separator character (as set by 
+TLocale::SetDecimalSeparator()). The decimal separator is used to separate 
+seconds and microseconds, if present.
+
+\%: : Interpret the argument as one of the four time separator characters (as 
+set by TLocale::SetTimeSeparator()). Must be followed by an integer between 
+zero and three inclusive to indicate which time separator character is being 
+referred to.
+
+\%/ : Interpret the argument as one of the four date separator characters (as 
+set by TLocale::SetDateSeparator()). Must be followed by an integer between 
+zero and three inclusive to indicate which date separator character is being 
+referred to.
+
+\%1 : Interpret the argument as the first component of a three component date 
+(i.e. day, month or year) where the order has been set by TLocale::SetDateFormat(). 
+When the date format is EDateEuropean, this is the day, when EDateAmerican, 
+the month, and when EDateJapanese, the year. For more information on this 
+and the following four formatting commands, see the Notes section immediately 
+below.
+
+\%2 : Interpret the argument as the second component of a three component date 
+where the order has been set by TLocale::SetDateFormat(). When the date format 
+is EDateEuropean, this is the month, when EDateAmerican, the day and when 
+EDateJapanese, the month.
+
+\%3 : Interpret the argument as the third component of a three component date 
+where the order has been set by TLocale::SetDateFormat(). When the date format 
+is EDateEuropean, or EDateAmerican this is the year and when EDateJapanese, 
+the day.
+
+\%4 : Interpret the argument as the first component of a two component date 
+(day and month) where the order has been set by TLocale::SetDateFormat(). 
+When the date format is EDateEuropean this is the day, and when EDateAmerican 
+or EDateJapanese, the month.
+
+\%5 : Interpret the argument as the second component of a two component date 
+(day and month) where the order has been set by TLocale::SetDateFormat(). 
+When the date format is EDateEuropean this is the month, and when EDateAmerican 
+or EDateJapanese, the day.
+
+\%A : Interpret the argument as "am" or "pm" text according to the current 
+language and time of day. Unlike the \%B formatting command (described below), 
+\%A disregards the locale's 12 or 24 hour clock setting, so that when used 
+without an inserted + or - sign, am/pm text will always be displayed. Whether 
+a space is inserted between the am/pm text and the time depends on the locale-specific 
+settings. However, if abbreviated (\%*A), no space is inserted, regardless 
+of the locale's settings. The am/pm text appears before or after the time, 
+according to the position of the \%A, regardless of the locale-specific settings. 
+For example, the following ordering of formatting commands causes am/pm text 
+to be printed after the time: \%H \%T \%S \%A. Optionally, a minus or plus sign 
+may be inserted between the "%" and the "A". This operates as follows:
+
+\%-A causes am/pm text to be inserted into the descriptor only if the am/pm 
+symbol position has been set in the locale to ELocaleBefore. Cannot be abbreviated 
+using asterisk.
+
+\%+A causes am/pm text to be inserted into the descriptor only if the am/pm 
+symbol position has been set in the locale to ELocaleAfter. Cannot be abbreviated 
+using asterisk. For example, the following formatting commands will cause 
+am/pm text to be displayed after the time if the am/pm position has been set 
+in the locale to ELocaleAfter or before the time if ELocaleBefore: \%-A \%H 
+\%T \%S \%+A.
+
+\%B Interpret the argument as am or pm text according to the current language 
+and time of day. Unlike the \%A command, when using \%B, am/pm text is displayed 
+only if the clock setting in the locale is 12-hour. Whether a space is inserted 
+between the am/pm text and the time depends on the locale-specific settings. 
+However, if abbreviated (\%*B), no space is inserted, regardless of the locale's 
+settings. The am/pm text appears before or after the time, according to the 
+location of the "%B", regardless of the locale-specific settings. For example, 
+the following formatting commands cause am/pm text to be printed after the 
+time: \%H \%T \%S \%B. Optionally, a minus or plus sign may be inserted between 
+the "%" and the "B". This operates as follows:
+
+\%-B causes am/pm text to be inserted into the descriptor only if using a 12 
+hour clock and the am/pm symbol position has been set in the locale to ELocaleBefore. 
+Cannot be abbreviated using asterisk.
+
+\%+B causes am/pm text to be inserted into the descriptor only if using a 12 
+hour clock and the am/pm symbol position has been set in the locale to ELocaleAfter. 
+Cannot be abbreviated using asterisk. For example, the following formatting 
+commands cause am/pm text to be printed after the time if the am/pm position 
+has been set in the locale to ELocaleAfter or before the time if ELocaleBefore: 
+\%-B \%H \%T \%S \%+B.
+
+\%J Interpret the argument as the hour component of the time in either 12 or 
+24 hour clock format depending on the locale's clock format setting. When 
+the clock format has been set to 12 hour, leading zeros are automatically 
+suppressed so that abbreviation has no effect. Abbreviation suppresses leading 
+zero only when using a 24 hour clock.
+
+Notes:
+
+The \%1, \%2, \%3, \%4 and \%5 formatting commands are used in conjunction with 
+\%D, \%M and \%Y to format the date locale-dependently. When formatting the date 
+locale-dependently, the order of the day, month and year components within 
+the string is determined by the order of the \%1 to \%5 formatting commands, 
+not that of \%D, \%M, \%Y.
+
+When formatting the date locale-independently (that is, \%F has been specified 
+in the format string), the \%1 to \%5 formatting commands are not required, 
+and should be omitted. In this case, the order of the date components is determined 
+by the order of the \%D, \%M, \%Y format commands within aFormat.
+
+Up to four date separators and up to four time separators can be used to separate 
+the components of a date or time. When formatting a numerical date consisting 
+of the day, month and year or a time containing hours, minutes and seconds, 
+all four separators should always be specified in the format command string. 
+Usually, the leading and trailing separators should not be displayed. In this 
+case, the first and fourth separators should still be specified, but should 
+be represented by a null character.
+
+The date format follows the pattern:
+
+DateSeparator[0] DateComponent1 DateSeparator[1] DateComponent2 DateSeparator[2] 
+DateComponent3 DateSeparator[3]
+
+where the ordering of date components is determined by the locale's date format 
+setting.
+
+The time format follows the pattern:
+
+TimeSeparator[0] Hours TimeSeparator[1] Minutes TimeSeparator[2] Seconds TimeSeparator[3]
+
+If the time includes a microseconds component, the third separator should 
+occur after the microseconds, and the seconds and microseconds should be separated 
+by the decimal separator. When formatting a two component time, the following 
+rules apply:
+
+if the time consists of hours and minutes, the third time delimiter should 
+be omitted 
+
+if the time consists of minutes and seconds, the second time delimiter should 
+be omitted
+
+@param aDes    Descriptor, which,  on return contains the formatted date/time string.
+@param aFormat Format string which determines the format of the date and time.
+@param aLocale Specific locale which formatting will be based on.
+
+@leave KErrOverflow The date/time string is too long for the descriptor aDes.
+@leave KErrGeneral  A formatting error has occurred.
+*/
+	{
+
+	TDateTime dateTime=DateTime();
+	aDes.Zero(); // ensure string is empty at start
+
+ 	TLex aFmt(aFormat);
+	TBool fix=EFalse; // fixed date format
+	TBool da=EFalse; // day unabreviated
+	TBool ma=EFalse; // month unabreviated
+	TBool ya=EFalse; // year unabreviated
+	TBool suff=EFalse; // default no suffix
+	TBool mnam=EFalse; // default month as a number
+	TTimeOverflowLeave overflowLeave;
+
+   	while (!aFmt.Eos())
+		{
+		TChar ch=aFmt.Get();
+		TBool abb=EFalse;
+		const TInt NoPosSpecified=-1;
+		TInt pos=NoPosSpecified;
+		if (ch=='%')
+			ch=aFmt.Get();
+		else // not formatting,just want to add some characters to string
+			goto doAppend; 
+		if (ch=='*') // => abbreviate next field
+			{
+			abb=ETrue;
+			ch=aFmt.Get();
+			}
+		else if (ch=='+' || ch=='-') // => leading or following Am/Pm
+			{
+			pos= ((ch=='+') ? ELocaleAfter : ELocaleBefore);
+			ch=aFmt.Get();
+			if (ch!='A' && ch!='B')
+				User::Leave(KErrGeneral);
+			}
+		switch (ch)
+			{
+		case ':': // local time separator
+				{
+				if (aDes.Length()==aDes.MaxLength())
+					User::Leave(KErrOverflow);
+				ch=aFmt.Get();//Which separator?
+				if (ch<'0' || ch>='0'+KMaxTimeSeparators)
+					User::Leave(KErrGeneral);
+				ch-='0';
+				TChar separator=aLocale.TimeSeparator(ch);
+				if (separator!=0)
+					aDes.Append(separator);
+				}
+			break;
+		case '/': // local date separator
+				{
+				if (aDes.Length()==aDes.MaxLength())
+					User::Leave(KErrOverflow);
+				ch=aFmt.Get();//Which separator?
+				if (ch<'0' || ch>='0'+KMaxDateSeparators)
+					User::Leave(KErrGeneral);
+				ch-='0';
+				TChar separator=aLocale.DateSeparator(ch);
+				if (separator!=0)
+					aDes.Append(separator);
+				}
+			break;
+		case '.': // local decimal separator
+				{
+				if (aDes.Length()==aDes.MaxLength())
+					User::Leave(KErrOverflow);
+				aDes.Append(aLocale.DecimalSeparator());
+				}
+			break;
+		case '1': // 1st element of date,local order
+			switch (aLocale.DateFormat())
+				{
+			case EDateAmerican:
+				goto doMonth;
+			case EDateJapanese:
+				goto doYear;
+			default: // European
+				goto doDay;
+				}
+		case '2': // 2nd element of date,local order
+			switch (aLocale.DateFormat())
+				{
+			case EDateAmerican:
+				goto doDay;
+			default: // European and Japanese have month second
+				goto doMonth;
+				}
+		case '3': // 3rd element of date,local order
+			switch (aLocale.DateFormat())
+				{
+			case EDateJapanese:
+				goto doDay;
+			default: // European and American have year last
+				goto doYear;
+				}
+		case '4': // 1st element of date (no year),local order
+			switch (aLocale.DateFormat())
+				{
+			case EDateEuropean:
+				goto doDay;
+			default:
+				goto doMonth;
+				}
+		case '5': // 2nd element of date (no year),local order
+			switch (aLocale.DateFormat())
+				{
+			case EDateEuropean:
+				goto doMonth;
+			default:
+				goto doDay;
+				}
+		case 'A': // am/pm text
+doAmPm:
+            {
+            if (pos==NoPosSpecified || pos==aLocale.AmPmSymbolPosition())
+				{
+				TBuf<KMaxAmPmName+1> format(_S("%S"));
+				if (!abb && aLocale.AmPmSpaceBetween())
+					{
+					if (aLocale.AmPmSymbolPosition()==ELocaleBefore)
+						format.Append(' ');
+					else
+						{
+						if (aDes.Length()==aDes.MaxLength())
+							User::Leave(KErrOverflow);
+						aDes.Append(' ');
+						}
+					}
+				TAmPmName amPm((dateTime.Hour()<12) ? EAm : EPm);
+				aDes.AppendFormat(format,&overflowLeave,&amPm);
+				}
+			break;
+            }
+		case 'B': // am/pm text if local time format is 12 hour clock
+			if (aLocale.TimeFormat()==ETime24)
+				break;
+			else
+				goto doAmPm;
+		case 'C':
+			{
+			TBuf<6> digits;
+			digits.AppendFormat(_L("%06d"),dateTime.MicroSecond());
+			TUint numChars=6;	// Default length
+			if (abb)
+				{
+				ch=aFmt.Get();
+				if (ch>='0' && ch<='6')
+					{
+					numChars=ch;
+					numChars-='0';
+					}
+				}
+			if (aDes.Length()>(TInt)(aDes.MaxLength()-numChars))
+			    User::Leave(KErrOverflow);
+			aDes.Append(digits.Left(numChars));
+			}	
+			break;
+		case 'D': // day in date
+			if (abb)
+				da=ETrue;
+			if (!fix)
+				break;
+			else
+				{
+doDay:
+				aDes.AppendFormat((da||abb) ? _L("%d"):_L("%02d"),&overflowLeave,dateTime.Day()+1);
+				if (suff)
+doSuffix:
+                    {
+                    TDateSuffix day(dateTime.Day());
+					aDes.AppendFormat(_L("%S"),&overflowLeave,&day);
+                    }
+				break;
+				}
+		case 'E': // Day name
+            {
+			TDay day=DayNoInWeek();
+			if (abb)
+				{
+	            TDayNameAbb nameAbb(day);
+				aDes.AppendFormat(_L("%S"),&overflowLeave,&nameAbb);
+				}
+			else
+				{
+	            TDayName name(day);
+				aDes.AppendFormat(_L("%S"),&overflowLeave,&name);
+				}
+			break;
+            }
+		case 'F': // => user wants day,month,year order fixed
+			fix=ETrue;
+			break;
+		case 'H': // hour in 24 hour time format
+do24:
+			aDes.AppendFormat((abb) ? _L("%d"):_L("%02d"),&overflowLeave,dateTime.Hour());
+			break;
+		case 'I': // hour in 12 hour time format
+do12:
+			{
+			TInt hour=dateTime.Hour();
+			if (hour==0)
+				hour=12;
+			else if (hour>12)
+				hour-=12;
+			aDes.AppendFormat(_L("%d"),&overflowLeave,hour);
+			break;
+			}
+		case 'J': //default time format for hour
+			if (aLocale.TimeFormat()==ETime12)
+				goto do12;
+			else
+				goto do24;
+		case 'M': // month as a number (default value)
+			if (abb)
+				ma=ETrue;
+			if (fix)
+				goto doMonth;
+			break;
+		case 'N': // month as a name
+			mnam=ETrue;
+			if (abb)
+				ma=ETrue;
+			if (!fix)
+				break;
+			else
+				{
+doMonth:
+				if (mnam)
+					{
+					TMonth month=dateTime.Month();
+					if (ma || abb)
+						{
+		                TMonthNameAbb nameAbb(month);
+						aDes.AppendFormat(_L("%S"),&overflowLeave,&nameAbb);
+						}
+					else
+						{
+	                    TMonthName name(month);
+						aDes.AppendFormat(_L("%S"),&overflowLeave,&name);
+						}
+					}
+				else
+					aDes.AppendFormat((ma||abb) ? _L("%d"):_L("%02d"),&overflowLeave,dateTime.Month()+1);
+				break;
+				}
+		case 'S': // seconds
+			aDes.AppendFormat((abb) ? _L("%d"):_L("%02d"),&overflowLeave,dateTime.Second());
+			break;	
+		case 'T': // minutes	
+			aDes.AppendFormat((abb) ? _L("%d"):_L("%02d"),&overflowLeave,dateTime.Minute());
+			break;
+		case 'W': // week no in year
+			aDes.AppendFormat((abb) ? _L("%d"):_L("%02d"),&overflowLeave,WeekNoInYear());
+			break;
+		case 'X': // => wants day suffix
+			if (fix)
+				goto doSuffix;
+			else
+				{
+				suff=ETrue;
+				break;
+				}
+		case 'Y': // year
+			if (abb)
+				ya=ETrue;
+			if (!fix)
+				break;
+			else
+				{
+doYear:
+				if (ya || abb)
+					aDes.AppendFormat(_L("%02d"),&overflowLeave,((dateTime.Year())%100));
+				else
+					aDes.AppendFormat(_L("%04d"),&overflowLeave,dateTime.Year());
+				break;
+				}
+		case 'Z': // day no in year
+			aDes.AppendFormat((abb) ? _L("%d"):_L("%03d"),&overflowLeave,DayNoInYear());
+			break;
+		default:
+doAppend:
+			if (aDes.Length()==aDes.MaxLength())
+				User::Leave(KErrOverflow);
+			aDes.Append(ch);
+			break;
+			}
+		}
+	}
+
+
+
+
+EXPORT_C TTime Time::NullTTime()
+/**
+Gets a TTime with a null value.
+
+@return TTime object with a null value.
+*/
+	{
+	return UI64LIT(0x8000000000000000);
+	}
+
+EXPORT_C TTime Time::MaxTTime()
+/**
+Gets the maximum time value which can be held in a TTime object.
+
+@return The maximum TTime value.
+*/
+	{
+	return I64LIT(0x7fffffffffffffff);
+	}
+
+EXPORT_C TTime Time::MinTTime()
+/**
+Gets the minimum time value which can be held in a TTime object.
+
+@return The minimum TTime value.
+*/
+	{
+	return UI64LIT(0x8000000000000001);
+	}
+
+EXPORT_C TInt Time::DaysInMonth(TInt aYear,TMonth aMonth)
+/**
+Gets the number of days in a month.
+
+@param aYear  The year. Must be specified because of leap years.
+@param aMonth Month, from EJanuary to EDecember.
+
+@return The number of days in the month.
+*/
+	{
+
+    __ASSERT_DEBUG(aMonth<=EDecember && aMonth>=EJanuary,::Panic(ETTimeValueOutOfRange));
+    return(mTab[IsLeapYear(aYear)][aMonth]);
+	}
+
+EXPORT_C TBool Time::IsLeapYear(TInt aYear)
+//
+// up to and including 1600 leap years were every 4 years,since then leap years are every 4 years unless
+// the year falls on a century which is not divisible by 4 (ie 1900 wasnt,2000 will be)
+// for simplicity define year 0 as a leap year
+//
+/**
+Tests whether a year is a leap year.
+
+@param aYear The year of interest.
+
+@return True if leap year, False if not.
+*/
+	{
+
+	if (aYear>1600)
+    	return(!(aYear%4) && (aYear%100 || !(aYear%400)));
+	return(!(aYear%4));
+	}
+
+EXPORT_C TInt Time::LeapYearsUpTo(TInt aYear)
+//
+// from 0AD to present year according to the rule above
+//
+/**
+Gets the number of leap years between 0 AD nominal Gregorian and the specified 
+year - inclusive.
+
+@param aYear The final year in the range to search. If negative, the function 
+             will return a negative number of leap years.
+
+@return The number of leap years between 0 AD nominal Gregorian and aYear.
+*/
+	{
+
+	if (aYear<=0)
+		return(aYear/4);
+	if (aYear<=1600)
+		return(1+((aYear-1)/4));
+	TInt num=401; // 1600/4+1
+	aYear-=1601;
+	TInt century=aYear/100;
+	num+=(aYear/4-century+century/4);
+	return(num);
+	}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32/euser/us_trp.cpp	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,155 @@
+// Copyright (c) 1994-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32\euser\us_trp.cpp
+// 
+//
+
+#include "us_std.h"
+#include "us_data.h"
+
+
+
+
+EXPORT_C TTrapHandler::TTrapHandler()
+/**
+Default constructor.
+*/
+	{}
+
+
+#ifndef __LEAVE_EQUALS_THROW__
+
+EXPORT_C void TTrap::UnTrap()
+//
+// Pop the current trap frame
+//
+	{
+
+	TTrapHandler *pH=Exec::PopTrapFrame()->iHandler;
+	if (pH!=NULL)
+		pH->UnTrap();
+	}
+
+
+#else //__LEAVE_EQUALS_THROW__
+
+EXPORT_C void User::Leave(TInt aReason)
+/**
+Leaves the currently executing function, unwinds the call stack, and returns
+from the most recently entered trap harness.
+
+@param aReason The value returned from the most recent call to TRAP or TRAPD.
+               This is known as the reason code and, typically, it gives the
+               reason for the environment or user error causing this leave
+               to occur.
+              
+@see TRAP
+@see TRAPD              
+*/
+	{
+#ifdef __USERSIDE_THREAD_DATA__
+#ifndef __TOOLS2__
+	Exec::LeaveStart();
+#endif
+	TTrapHandler* pH = GetTrapHandler();
+#else
+	TTrapHandler* pH = Exec::LeaveStart();
+#endif
+	if (pH)
+		pH->Leave(aReason);	// causes things on the cleanup stack to be cleaned up
+	throw XLeaveException(aReason);
+	}
+
+#endif // !__LEAVE_EQUALS_THROW__
+
+
+// Private declaration to prevent def file branching
+#ifndef __SUPPORT_CPP_EXCEPTIONS__
+class XLeaveException
+	{
+public:
+	IMPORT_C TInt GetReason() const;
+	};
+#endif //__SUPPORT_CPP_EXCEPTIONS__
+
+#if !defined(__LEAVE_EQUALS_THROW__) || !defined(__WINS__)
+EXPORT_C TInt XLeaveException::GetReason() const
+	{
+#ifdef __SUPPORT_CPP_EXCEPTIONS__
+#ifndef __TOOLS2__
+	Exec::LeaveEnd();
+#endif
+	return iR;
+#else // !__SUPPORT_CPP_EXCEPTIONS__
+	return KErrNone;
+#endif //__SUPPORT_CPP_EXCEPTIONS__
+	}
+#endif	// !defined(__LEAVE_EQUALS_THROW__) || !defined(__WINS__)
+
+EXPORT_C void User::LeaveNoMemory()
+/**
+Leaves with the specific reason code KErrNoMemory.
+
+@see KErrNoMemory
+*/
+	{
+
+	User::Leave(KErrNoMemory);
+	}
+
+
+
+
+EXPORT_C TInt User::LeaveIfError(TInt aReason)
+/**
+Leaves or returns with a specified reason code.
+
+If the reason code is negative the function leaves, and the reason code is 
+returned through the trap harness.
+
+If the reason code is zero or positive, the function simply returns with the 
+reason value.
+
+@param aReason The reason code.
+
+@return If the function returns, the reason code which is either zero or positive.
+*/
+	{
+
+	if (aReason<0)
+		User::Leave(aReason);
+	return(aReason);
+	}
+
+
+
+
+EXPORT_C TAny * User::LeaveIfNull(TAny *aPtr)
+/**
+Leaves with the reason code KErrNoMemory, if the specified pointer is NULL. 
+
+If the pointer is not NULL, the function simply returns with the value of 
+the pointer.
+
+@param aPtr The pointer to be tested.
+
+@return If the function returns, the value of aPtr.
+*/
+	{
+
+	if (aPtr==NULL)
+		User::LeaveNoMemory();
+	return(aPtr);
+	}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32/euser/us_utl.cpp	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,77 @@
+// Copyright (c) 1994-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32\euser\us_utl.cpp
+// 
+//
+
+#include "us_std.h"
+
+
+GLDEF_C void Panic(TCdtPanic aPanic)
+//
+// Panic the process with USER as the category.
+//
+	{
+
+	User::Panic(_L("USER"),aPanic);
+	}
+
+EXPORT_C void User::PanicUnexpectedLeave()
+	{
+	::Panic(EUnexpectedLeave);
+	}
+
+EXPORT_C TFormatInfo::TFormatInfo()
+//
+// Constructor
+//
+	:iFormatIsCurrent(FALSE),i512ByteSectorsFormatted(0),iMaxBytesPerFormat(0)
+	{}
+
+#if defined(_UNICODE)
+void TestOverflowTruncate::Overflow(TDes16 &/*aDes*/)
+	{
+
+	return;
+	}
+#else
+void TestOverflowTruncate::Overflow(TDes8 &/*aDes*/)
+	{
+
+	return;
+	}
+#endif
+
+EXPORT_C void PanicTFixedArray()
+	{
+	Panic(EBadFixedArrayIndex);
+	}
+
+
+// GCC support for X86
+/*#if defined(__GCC32__) && defined(__X86__)
+extern "C" 
+{
+EXPORT_C int __cxa_pure_virtual()
+//
+// Gets called for any unreplaced pure virtual methods.
+//
+	{
+	Panic(EPureVirtualCalled);
+	return 0;
+	}
+
+
+}
+#endif*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32/include/collate.h	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,364 @@
+// Copyright (c) 1996-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32\include\collate.h
+// Definitions needed for Unicode collation.
+// Collation is the comparison of two Unicode strings to produce an ordering
+// that may be used in a dictionary or other list.
+// Collation is implemented using the Standard Unicode Collation algorithm. There
+// are four levels of comparison:
+// primary: basic character identity
+// secondary: accents and diacritics
+// tertiary: upper and lower case, and other minor attributes
+// quaternary: Unicode character value
+// Punctuation is normally ignored but can optionally be taken into account.
+// Strings are fully expanded using the standard Unicode canonical expansions before
+// they are compared. Thai and Lao vowels are swapped with the following character
+// if any.
+// EUSER contains the 'basic collation method'. This method assigns the standard Unicode collation key values
+// to the characters in the WGL4 repertoire, plus commonly used control characters and fixed-width spaces, plus
+// the CJK ideograms (for which the keys can be generated algorithmically). Other characters are collated after
+// all the characters for which keys are defined, and ordered by their Unicode values.
+// Locales can supply any number of other collation methods. They will usually supply a 'tailoring' of the standard
+// method. This is done by using the standard table as the main key table (signalled by placing NULL in
+// TCollationMethod::iMainTable) and specifying an override table (TCollationMethod::iOverrideTable).
+// Locale-specific collation data resides in ELOCL.
+// 
+//
+
+#ifndef __COLLATE_H__
+#define __COLLATE_H__
+
+#ifdef __KERNEL_MODE__
+#include <e32cmn.h>
+#else
+#include <e32std.h>
+#endif
+
+//This material is used in the Unicode build only.
+#ifdef _UNICODE
+
+/**
+Collation key table structure.
+@publishedPartner
+@released
+*/
+struct TCollationKeyTable
+	{
+public:
+	/**
+	Masks for the various parts of the elements of the iKey array.
+	*/
+	enum
+		{
+		ELevel0Mask = 0xFFFF0000,	// primary key - basic character identity
+		ELevel1Mask = 0x0000FF00,	// secondary key - accents and diacritics
+		ELevel2Mask = 0x000000FC,	// tertiary key - case, etc.
+		EIgnoreFlag = 0x2,			// if set, this key is normally ignored
+		EStopFlag = 0x1				// if set, this key is the last in a sequence representing a Unicode value or values
+		};
+
+	/**
+	An array containing all of the keys and strings of keys concatenated
+	together. Each key has EStopFlag set only if it is the last key in its
+	string. Eack key contains the keys for levels 0, 1 and 2, and a flag
+	EIgnoreFlag if the key is usually ignored (for punctuation & spaces
+	etc.).
+	*/
+	const TUint32* iKey;
+	/**
+	An array of indices into the iKey array. Each element has its high 16
+	bits indicating a Unicode value and its low 16 bits indicating an index
+	into the iKey array at which its key starts. The elements are sorted by
+	Unicode value.
+	*/
+	const TUint32* iIndex;
+	/**
+	The size of the iIndex array.
+	*/
+	TInt iIndices;
+	/**
+	Concatenated Unicode strings. Each is a strings that is to be converted
+	to keys differently from how it would be if each letter were converted
+	independently. An example is "ch" in Spanish, which sorts as though it
+	were a single letter. Each Unicode string is preceeded by a 16-bit value
+	indicating the string's length. The end of the string is not delimited.
+	*/
+	const TUint16* iString;
+	/**
+	An array of elements mapping elements of iString to elements of iIndex.
+	Each element has its high 16 bits indicating the index of the start of
+	an element of iString, and its low 16 bits indicating the corresponding
+	element in iIndex. This array is sorted on the string index.
+	*/
+	const TUint32* iStringIndex;
+	/**
+	The size of the iStringIndex array.
+	*/
+	TInt iStringIndices;
+	};
+
+/**
+Defines a collation method. 
+
+Collation means sorting pieces of text. It needs to take into account characters, 
+accents and case; spaces and punctuation are usually ignored. It differs from 
+ordinary methods of sorting in that it is locale-dependent - different 
+languages use different ordering methods. Additionally, multiple collation 
+methods may exist within the same locale.
+
+A collation method provides the collation keys and other data needed to customise 
+collation; the Mem and TDesC16 collation functions (e.g. Mem::CompareC()) 
+perform the collation. Note that these functions use the standard collation 
+method for the current locale - you only need to specify an object of class 
+TCollationMethod to customise this collation scheme. Collation methods can 
+be retrieved using member functions of the Mem class. Each one has a unique 
+identifier.
+
+A collation method specifies a main table of collation keys, and optionally 
+an overriding table that contains keys for which the values in the main table 
+are overridden. A collation key table (TCollationKeyTable) is the set of collation 
+keys: primary (basic character identity), secondary (accents and diacritics) 
+and tertiary (case). The quaternary key is the Unicode character values themselves.
+
+The simplest way to customise a collation method is to create a local copy 
+of the standard collation method and change it. For example, you could use 
+the standard method, but not ignore punctuation and spaces:
+
+@code
+TCollationMethod m = *Mem::CollationMethodByIndex(0); // get the standard method
+m.iFlags |= TCollationMethod::EIgnoreNone; // dont ignore punctuation and spaces
+@endcode
+
+@publishedPartner
+@released
+*/
+struct TCollationMethod
+	{
+	public:
+	/**
+	The UID of this collation method.
+	*/
+	TUint iId;
+	
+	/**
+	The main collation key table; if NULL, use the standard table.
+	*/
+	const TCollationKeyTable* iMainTable;
+	
+	/**
+	If non-NULL, tailoring for collation keys.
+	*/
+	const TCollationKeyTable* iOverrideTable;
+	enum
+		{
+		/**
+		Don't ignore any keys (punctuation, etc. is normally ignored).
+		*/
+		EIgnoreNone = 1,
+		
+		/**
+		Reverse the normal order for characters differing only in case
+		*/
+		ESwapCase = 2,
+		
+		/**
+		Compare secondary keys which represent accents in reverse
+		order (from right to left); this is needed for French when comparing
+		words that differ only in accents.
+		*/
+		EAccentsBackwards = 4,	
+		
+		/**
+		Reverse the normal order for characters differing only in whether they
+		are katakana or hiragana.
+		*/
+		ESwapKana = 8,
+		
+		/**
+		Fold all characters to lower case before extracting keys; needed for
+		comparison of filenames, for which case is ignored but other
+		tertiary (level-2) distinctions are not.
+		*/
+		EFoldCase = 16,
+		
+		/** Flag to indicate a collation method for matching purpose 
+		This flag is only needed if we wish to specify a particular collation method
+		to be used for matching purpose.
+		*/
+		EMatchingTable = 32,
+		
+		/** Ignore the check for adjacent combining characters.  A combining
+		character effectively changes the character it combines with to something
+		else and so a match doesn't occur.  Setting this flag will allow character
+		matching regardless of any combining characters.
+		*/
+		EIgnoreCombining = 64
+		};
+		
+	/**
+	Flags.
+	
+	@see TCollationMethod::EIgnoreNone
+	@see TCollationMethod::ESwapCase
+	@see TCollationMethod::EAccentsBackwards
+	@see TCollationMethod::ESwapKana
+	@see TCollationMethod::EFoldCase
+	*/
+	TUint iFlags;
+	};
+
+/**
+A collation data set provides any collation methods needed by a locale.
+@publishedPartner
+@released
+*/
+struct TCollationDataSet
+	{
+	public:
+	const TCollationMethod* iMethod;
+	TInt iMethods;
+	};
+
+// Collation method IDs
+
+/**
+A collation data set provides any collation methods needed by a locale.
+@internalTechnology
+@released
+*/
+const TUint KUidBasicCollationMethod = 0x10004F4E;
+
+/**
+A collation data set provides any collation methods needed by a locale.
+@internalTechnology
+@released
+*/
+const TUint KUidStandardUnicodeCollationMethod = 0x10004E96;
+
+#ifndef __KERNEL_MODE__
+
+//Forward declarations
+class TUTF32Iterator;
+struct LCharSet;
+
+/**
+Provides low-level collation functions.
+@internalComponent
+@released
+*/
+class TCollate
+	{
+public:
+	/**
+	Construct a TCollate object based on the collation method specified
+	within aCharSet, if any. If there is none, or aCharSet is null, the
+	standard collation method will be used. aMask and aFlags provide a
+	method for overriding the flags in the collation method: Each flag set
+	to 1 in aMask is a flag that will be overridden and set to the
+	corresponding flag value in aFlags. Ownership of aCharSet is not passed.
+	*/
+	TCollate(const LCharSet* aCharSet,TUint aMask = 0,TUint aFlags = 0xFFFFFFFF);
+	/**
+	Construct a TCollate object based on an already constructed
+	TCollationMethod specified in aMethod. Ownership is not passed.
+	*/
+	TCollate(const TCollationMethod& aMethod);
+
+	enum TComparisonResult
+		{
+		ELeftComparesLessAndIsNotPrefix = -2,
+		ELeftIsPrefixOfRight = -1,
+		EStringsIdentical = 0,
+		ERightIsPrefixOfLeft = 1,
+		ERightComparesLessAndIsNotPrefix = 2
+		};
+
+	/**
+	Compare the string beginning at aString1 of length aLength1 against the
+	string beginning at aString2 of length aLength2.
+	aMaxLevel determines the tightness of the collation. At level 0, only
+	character identities are distinguished. At level 1 accents are
+	distinguished as well. At level 2 case is distinguishes as well. At
+	level 3 all valid different Unicode characters are considered different.
+	*/
+	TComparisonResult Compare(const TUint16* aString1,TInt aLength1,
+							  const TUint16* aString2,TInt aLength2,
+							  TInt aMaxLevel = 3) const;
+	/**
+	Find the string beginning at aString2 of length aLength2 in the string
+	beginning at aString1 of length aLength1. aMaxLevel determines
+	the tightness of the collation, see Compare for details.
+	*/
+	TInt Find(const TUint16 *aString1,TInt aLength1,const TUint16 *aString2,TInt aLength2,
+			  TInt aMaxLevel,TUint aString2WildChar = 0) const;
+			  
+	TInt Find(const TUint16 *aString1,TInt aLength1,const TUint16 *aString2,TInt aLength2,
+		      TInt &aLengthFound,TInt aMaxLevel,TUint aString2WildChar = 0) const;
+		      
+	/**
+	Test if the string beginning at aSearchTerm of length aSearchTermLength
+	matches the string beginning at aCandidate of length aCandidateLength.
+	aMaxLevel determines the tightness of the collation, see
+	Compare for details. The search term may have wild card characters as
+	specified by aWildChar (for matching a single grapheme- i.e. character
+	and any characters that combine with it, such as accents) and
+	aWildSequenceChar (for matching any sequence of whole graphemes). The
+	return value is KErrNotFound iff the search term does not match the
+	candidate string exactly. To find a match within the candidate string,
+	the search term must begin and end with a wild sequence character. If
+	the search term does match the candidate string, 0 will be returned,
+	unless the first character of the search term is a wild sequence
+	character in which case the value returned will be the index into
+	aCandidate at which the first non-wild sequence character matched.
+	aWildSequenceChar must be a valid (non-surrogate) Unicode character
+	below FFFE.
+	*/
+	TInt Match(const TUint16 *aCandidate, TInt aCandidateLength,
+			   const TUint16 *aSearchTerm,TInt aSearchTermLength,
+			   TInt aMaxLevel, TUint aWildChar = '?', TUint aWildSequenceChar = '*', TUint aEscapeChar = 0) const;
+
+private:
+	/**
+	Compare values output from the iterators. After the comparison, if
+	ERightIsPrefixOfLeft or EStringsIdentical is returned, then aLeft and
+	aRight will be pointing at the next key (at MaxLevel) after the match.
+	If right is shown to be a prefix of left, this means that it has been
+	checked at all requested levels. If it is reported that the right is a
+	prefix of the left, then this will mean also that there are no unmatched
+	combining characters on the left.
+	*/
+	TComparisonResult CompareKeySequences(TUTF32Iterator& aLeft, TUTF32Iterator& aRight,
+										  TInt aMaxLevel, TInt aRightStringWildChar, TInt aEscapeChar) const;
+	/**
+	Finds search term inside candidate string. Returns KErrNotFound if there
+	is no match, returns the offset into the candidate string at which the
+	search term was found (note that this is the offset from the start of
+	the iteration, not from where the iteration was when the function was
+	called). If a string was found, the search term iterator is left
+	pointing at the end of the search term, and the candidate iterator is
+	left pointing just after the matched keys. aMatchPos returns where in
+	the candidate string the match was found.
+	*/
+	TInt FindKeySequence(TUTF32Iterator& aCandidate, TUTF32Iterator& aSearchTerm,
+						 TInt aMaxLevel, TInt aWildChar, TInt aEscapeChar, TInt& aLengthFound) const;
+
+private:
+	TCollationMethod iMethod;
+	};
+
+#endif	// __KERNEL_MODE__
+
+#endif // _UNICODE
+
+#endif // __COLLATE_H__
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32/include/cpudefs.h	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,599 @@
+// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32\include\cpudefs.h
+// 
+//
+
+/**
+ @file
+ @internalTechnology
+*/
+
+#ifndef __CPUDEFS_H__
+#define __CPUDEFS_H__
+
+#ifdef __ARMCC__
+#define	__ARM_ASSEMBLER_ISA__	4	// "Instruction not supported on targeted CPU :("
+#else
+#define	__ARM_ASSEMBLER_ISA__	4
+#endif
+
+// Should really have been __CPU_CORTEX_A8__ instead of __CPU_CORTEX_A8N__
+#ifdef __CPU_CORTEX_A8N__
+#undef __CPU_CORTEX_A8__
+#define __CPU_CORTEX_A8__
+#endif
+
+//
+// Supported CPUs
+//
+
+#ifdef __MARM__
+
+// FIXME: Nasty hack to get ARM SMP going
+#if defined(__SMP__) && !defined(__CPU_ARMV7)
+#undef	__CPU_ARM11MP__
+#define	__CPU_ARM11MP__
+#endif
+
+#if defined(__CPU_ARM710T__)
+	#define __CPU_ARMV4T
+
+#elif defined(__CPU_ARM720T__)
+	#define __CPU_ARMV4T
+
+#elif defined(__CPU_SA1__)
+	#define __CPU_ARMV4
+
+#elif defined(__CPU_ARM920T__)
+	#define __CPU_ARMV4T
+
+#elif defined(__CPU_ARM925T__)
+	#define __CPU_ARMV4T
+
+#elif defined(__CPU_XSCALE__)
+	#define __CPU_ARMV5T
+	#define __ENHANCED_DSP_INSTRUCTIONS
+
+#elif defined(__CPU_ARM926J__)
+	#define __CPU_ARMV5T
+	#define __ENHANCED_DSP_INSTRUCTIONS
+	#define __CPU_HAS_JAZELLE
+
+#elif defined(__CPU_ARM1136__)
+	#define __CPU_ARMV6
+
+#elif defined(__CPU_ARM1176__)
+	#define __CPU_ARMV6
+
+#elif defined(__CPU_ARM11MP__)
+	#define __CPU_ARMV6
+	#define	__CPU_ARM_HAS_WFI
+	#define	__CPU_ARM_HAS_WFE_SEV
+
+#elif defined(__CPU_CORTEX_A8__)
+	#define __CPU_ARMV7
+
+#elif defined(__CPU_CORTEX_A9__)
+	#define __CPU_ARMV7
+
+#elif defined(__CPU_GENERIC_ARM4__)
+	#define __CPU_ARMV4
+
+#else
+	// #error Unsupported CPU
+	#define __CPU_UNKNOWN
+#endif
+
+#endif  // __MARM__
+
+
+
+// Macros for emitting single bytes of machine code
+#ifdef __CW32__
+# define BYTE(x)	_asm byte x
+#elif __GCC32__
+# define BYTE(x)	asm(".byte "#x);
+#else
+# define BYTE(x)	_asm _emit x
+#endif
+
+
+// thiscall is different on GCC
+#ifdef __GCC32__
+#define THISCALL_PROLOG0() asm("mov ecx,[esp+4]");
+#define THISCALL_PROLOG1() asm("mov ecx,[esp+4] \n mov eax,[esp+8] \n mov [esp+4],eax");
+#define THISCALL_PROLOG2() asm("mov ecx,[esp+4] \n mov eax,[esp+8] \n mov [esp+4],eax \n mov eax,[esp+12] \n mov [esp+8],eax");
+#define THISCALL_PROLOG3() asm("mov ecx,[esp+4] \n mov eax,[esp+8] \n mov [esp+4],eax \n mov eax,[esp+12] \n mov [esp+8],eax \n mov eax,[esp+16] \n mov [esp+12],eax");
+#define THISCALL_PROLOG0_BIGRETVAL() asm("mov ecx,[esp+8]");
+#define THISCALL_PROLOG1_BIGRETVAL() asm("mov ecx,[esp+8] \n mov eax,[esp+12] \n mov [esp+8],eax");
+#define THISCALL_EPILOG0() asm("ret");
+#define THISCALL_EPILOG1() asm("ret");
+#define THISCALL_EPILOG2() asm("ret");
+#define THISCALL_EPILOG3() asm("ret");
+#define THISCALL_EPILOG0_BIGRETVAL() asm("ret 4");
+#define THISCALL_EPILOG1_BIGRETVAL() asm("ret 4");
+#else
+#define THISCALL_PROLOG0()
+#define THISCALL_PROLOG1()
+#define THISCALL_PROLOG2()
+#define THISCALL_PROLOG3()
+#define THISCALL_PROLOG0_BIGRETVAL() 
+#define THISCALL_PROLOG1_BIGRETVAL() 
+#define THISCALL_EPILOG0() __asm ret
+#define THISCALL_EPILOG1() __asm ret 4
+#define THISCALL_EPILOG2() __asm ret 8
+#define THISCALL_EPILOG3() __asm ret 12
+#define THISCALL_EPILOG0_BIGRETVAL() __asm ret 4
+#define THISCALL_EPILOG1_BIGRETVAL() __asm ret 8
+#endif
+
+
+// Workaround for MSVC++ 5.0 bug; MSVC incorrectly fixes up conditional jumps
+// when the destination is a C++ function.
+#if defined(__VC32__) && (_MSC_VER==1100)	// untested on MSVC++ > 5.0
+# define _ASM_j(cond,dest) _asm jn##cond short $+11 _asm jmp dest
+# define _ASM_jn(cond,dest) _asm j##cond short $+11 _asm jmp dest
+#else
+# if defined __GCC32__
+#  define _ASM_j(cond,dest) asm("j"#cond " %a0": : "i"(dest));
+#  define _ASM_jn(cond,dest) asm("jn"#cond " %a0": :"i"(dest));
+# else
+#  define _ASM_j(cond,dest) _asm j##cond dest
+#  define _ASM_jn(cond,dest) _asm jn##cond dest
+# endif
+#endif
+
+
+
+//#define __MINIMUM_MACHINE_CODE__
+
+#if defined(__WINS__)
+#define __NAKED__ __declspec( naked )
+#ifndef __MINIMUM_MACHINE_CODE__
+//#define __MEM_MACHINE_CODED__
+#endif
+#define __CPU_X86
+#endif
+
+#if defined(__X86__)
+# ifdef __GCC32__
+#  define __NAKED__	// GCC does not support naked functions on X86
+# else
+#  define __NAKED__ __declspec( naked )
+# endif
+# ifndef __MINIMUM_MACHINE_CODE__
+#  define __MEM_MACHINE_CODED__
+# endif
+# define __CPU_X86
+#endif
+
+
+#if defined(__MARM__)
+#ifndef __NAKED__ // should be defined in prefix file
+	#ifndef __GCCXML__
+        #define __NAKED__ __declspec( naked )
+    #else
+        #define __NAKED__
+    #endif
+#endif
+#ifndef __CIA__
+#undef __NAKED__
+#define __NAKED__ ____ONLY_USE_NAKED_IN_CIA____
+#endif
+	#define __CPU_ARM
+
+#if defined(__MARM_ARMV5__) && !defined(__CPU_ARMV5T)
+#define __CPU_ARMV5T
+#endif
+
+#ifndef __MINIMUM_MACHINE_CODE__
+#if !defined(__BIG_ENDIAN__)
+	#define __MEM_MACHINE_CODED__
+	#define __DES_MACHINE_CODED__
+	#define __REGIONS_MACHINE_CODED__
+	#define __DES8_MACHINE_CODED__
+	#define __DES16_MACHINE_CODED__
+	#define __HEAP_MACHINE_CODED__
+	#define __REALS_MACHINE_CODED__
+	#define __COBJECT_MACHINE_CODED__
+	#define __CACTIVESCHEDULER_MACHINE_CODED__
+	#define __CSERVER_MACHINE_CODED__
+	#define __ARRAY_MACHINE_CODED__
+	#define __HUFFMAN_MACHINE_CODED__
+#if defined(__MARM_ARM4__) || defined(__MARM_ARMI__) || defined(__MARM_THUMB__) || defined(__MARM_ARMV4__) || defined(__MARM_ARMV5__)
+	#define __DES16_MACHINE_CODED_HWORD__
+#endif
+#endif
+#endif
+#endif
+
+#ifdef __CPU_ARMV4
+	#define __CPU_64BIT_MULTIPLY
+#endif
+#ifdef __CPU_ARMV4T
+	#define __CPU_THUMB
+	#define __CPU_ARM_SUPPORTS_BX
+	#define __CPU_64BIT_MULTIPLY
+#endif
+#ifdef __CPU_ARMV5T
+	#define __CPU_THUMB
+	#define __CPU_ARM_SUPPORTS_BX
+	#define __CPU_ARM_SUPPORTS_BLX
+	#define __CPU_64BIT_MULTIPLY
+	#define __CPU_ARM_LDR_PC_SETS_TBIT
+	#define __CPU_ARM_HAS_CLZ
+	#define __CPU_ARM_HAS_PLD
+#endif
+#ifdef __ENHANCED_DSP_INSTRUCTIONS
+	#define __CPU_ARM_HAS_MCRR
+	#define __CPU_ARM_HAS_LDRD_STRD
+#endif
+#if defined(__CPU_ARMV6) || defined(__CPU_ARMV7)
+	#define __CPU_THUMB
+	#define __CPU_ARM_SUPPORTS_BX
+	#define __CPU_ARM_SUPPORTS_BLX
+	#define __CPU_64BIT_MULTIPLY
+	#define __CPU_ARM_LDR_PC_SETS_TBIT
+	#define __CPU_ARM_HAS_CLZ
+	#define __CPU_ARM_HAS_MCRR
+	#define __CPU_ARM_HAS_LDREX_STREX
+	#define __CPU_ARM_HAS_LDRD_STRD
+	#define __CPU_ARM_HAS_PLD
+	#define __CPU_ARM_HAS_CPS
+	#define __CPU_ARM_HAS_SPLIT_FSR
+#if !defined(__CPU_ARM1136__) && !defined(__CPU_ARM11MP__)
+	#define __CPU_ARM_HAS_CP15_IFAR
+#endif
+	#define	__CPU_ARM_SUPPORTS_USER_MODE_BARRIERS
+#endif
+#if defined(__CPU_ARMV7) || (defined(__CPU_ARM1136__) && defined(__CPU_ARM1136_IS_R1__)) || defined(__CPU_ARM1176__) || defined(__CPU_ARM11MP__)
+	#define __CPU_ARM_HAS_LDREX_STREX_V6K
+	#define __CPU_HAS_CP15_THREAD_ID_REG
+#endif
+#if defined(__MARM_ARM4T__) || defined(__MARM_INTERWORK__)
+	#define __SUPPORT_THUMB_INTERWORKING
+#endif
+#if defined(__CPU_ARMV7)
+#define	__CPU_ARM_HAS_WFI
+#define	__CPU_ARM_HAS_WFE_SEV
+#define __CPU_THUMB2
+#define __CPU_SUPPORT_THUMB2EE
+#endif
+
+
+// ARM CPU macros to allow Thumb/Non-thumb builds
+#ifdef __CPU_ARM
+
+#define	EXC_TRAP_CTX_SZ		10		// Nonvolatile registers + sp + pc
+
+#ifdef __SUPPORT_THUMB_INTERWORKING
+#define __JUMP(cc,r) asm("bx"#cc " "#r )
+#ifdef __CPU_ARM_LDR_PC_SETS_TBIT
+#define __POPRET(rlist) asm("ldmfd sp!, {"rlist"pc} ")
+#define __CPOPRET(cc,rlist) asm("ldm"#cc "fd sp!, {"rlist"pc} ")
+#else
+#define __POPRET(rlist) asm("ldmfd sp!, {"rlist"lr} ");\
+						asm("bx lr ")
+#define __CPOPRET(cc,rlist)	asm("ldm"#cc "fd sp!, {"rlist"lr} ");\
+							asm("bx"#cc " lr ")
+#endif
+#else
+#define __JUMP(cc,r) asm("mov"#cc " pc, "#r )
+#define __POPRET(rlist) asm("ldmfd sp!, {"rlist"pc} ")
+#define __CPOPRET(cc,rlist) asm("ldm"#cc "fd sp!, {"rlist"pc} ")
+#endif
+
+#ifdef __CPU_ARM_SUPPORTS_BLX
+#if __ARM_ASSEMBLER_ISA__ >= 5
+#define BLX(Rm)							asm("blx r" #Rm)
+#else
+#define BLX(Rm)							asm(".word %a0" : : "i" ((TInt)( 0xe12fff30 | (Rm) )))
+#endif
+#define __JUMPL(Rm) BLX(Rm)
+#else
+#ifdef __SUPPORT_THUMB_INTERWORKING
+#define __JUMPL(Rm) asm("mov lr, pc "); \
+                    asm("bx r"#Rm )
+#else
+#define __JUMPL(Rm) asm("mov lr, pc "); \
+                    asm("mov pc, r"#Rm )
+#endif
+#endif
+
+#ifdef __MARM_THUMB__
+#ifndef __ARMCC__
+#define __SWITCH_TO_ARM		asm("push {r0} ");\
+							asm("add r0, pc, #4 ");\
+							asm("bx r0 ");\
+							asm("nop ");\
+							asm(".align 2 ");\
+							asm(".code 32 ");\
+							asm("ldr r0, [sp], #4 ")
+#define __END_ARM			asm(".code 16 ")
+#else
+#define __SWITCH_TO_ARM        asm(".code 32 ");
+#define __END_ARM
+#endif
+#else
+#define __SWITCH_TO_ARM
+#define __END_ARM
+#endif
+
+#define CC_EQ	0
+#define	CC_NE	1
+#define CC_CS	2
+#define CC_CC	3
+#define CC_MI	4
+#define CC_PL	5
+#define CC_VS	6
+#define CC_VC	7
+#define CC_HI	8
+#define CC_LS	9
+#define CC_GE	10
+#define CC_LT	11
+#define CC_GT	12
+#define CC_LE	13
+#define	CC_AL	14
+
+#ifdef __CPU_ARM_HAS_CLZ
+#if __ARM_ASSEMBLER_ISA__ >= 5
+#define CLZ(Rd,Rm)		asm("clz r" #Rd ", r" #Rm)
+#else
+#define CLZ(Rd,Rm)		asm(".word %a0" : : "i" ((TInt)0xe16f0f10|((Rd)<<12)|(Rm)));
+#endif
+#define CLZcc(cc,Rd,Rm)	asm(".word %a0" : : "i" ((TInt)0x016f0f10|((cc)<<28)|((Rd)<<12)|(Rm)));
+#endif
+#ifdef __CPU_ARM_HAS_MCRR
+#define MCRR(cop,opc,Rd,Rn,CRm)			asm(".word %a0" : : "i" ((TInt)0xec400000|((Rn)<<16)|((Rd)<<12)|((cop)<<8)|((opc)<<4)|(CRm)));
+#define MCRRcc(cc,cop,opc,Rd,Rn,CRm)	asm(".word %a0" : : "i" ((TInt)0x0c400000|((cc)<<28)|((Rn)<<16)|((Rd)<<12)|((cop)<<8)|((opc)<<4)|(CRm)));
+#define MRRC(cop,opc,Rd,Rn,CRm)			asm(".word %a0" : : "i" ((TInt)0xec500000|((Rn)<<16)|((Rd)<<12)|((cop)<<8)|((opc)<<4)|(CRm)));
+#define MRRCcc(cc,cop,opc,Rd,Rn,CRm)	asm(".word %a0" : : "i" ((TInt)0x0c500000|((cc)<<28)|((Rn)<<16)|((Rd)<<12)|((cop)<<8)|((opc)<<4)|(CRm)));
+#endif
+#ifdef __CPU_ARM_HAS_LDREX_STREX
+// LDREX Rd, [Rn] 		- load from [Rn] into Rd exclusive
+// STREX Rd, Rm, [Rn] 	- store Rm into [Rn] with exclusive access; success/fail indicator into Rd
+#define LDREXcc(cc,Rd,Rn)				asm(".word %a0" : : "i" ((TInt)(0x01900f9f|((cc)<<28)|((Rd)<<12)|((Rn)<<16))));
+#define STREXcc(cc,Rd,Rm,Rn)			asm(".word %a0" : : "i" ((TInt)(0x01800f90|((cc)<<28)|((Rd)<<12)|(Rm)|((Rn)<<16))));
+#if __ARM_ASSEMBLER_ISA__ >= 6
+#define LDREX(Rd,Rn)					asm("ldrex r" #Rd ", [r" #Rn "] ")
+#define STREX(Rd,Rm,Rn)					asm("strex r" #Rd ", r" #Rm ", [r" #Rn "] ")
+#else
+#define LDREX(Rd,Rn)					asm(".word %a0" : : "i" ((TInt)(0x01900f9f|((CC_AL)<<28)|((Rd)<<12)|((Rn)<<16))));
+#define STREX(Rd,Rm,Rn)					asm(".word %a0" : : "i" ((TInt)(0x01800f90|((CC_AL)<<28)|((Rd)<<12)|(Rm)|((Rn)<<16))));
+#endif
+#endif
+#ifdef __CPU_ARM_HAS_LDREX_STREX_V6K
+// Byte, halfword, doubleword STREX/LDREX & unconditional CLREX
+#if __ARM_ASSEMBLER_ISA__ >= 6
+#define LDREXB(Rd,Rn)					asm("ldrexb r" #Rd ", [r" #Rn "] ")
+#define STREXB(Rd,Rm,Rn)				asm("strexb r" #Rd ", r" #Rm ", [r" #Rn "] ")
+#define LDREXH(Rd,Rn)					asm("ldrexh r" #Rd ", [r" #Rn "] ")
+#define STREXH(Rd,Rm,Rn)				asm("strexh r" #Rd ", r" #Rm ", [r" #Rn "] ")
+#define LDREXD(Rd,Rn)					asm("ldrexd r" #Rd ", [r" #Rn "] ")
+#define STREXD(Rd,Rm,Rn)				asm("strexd r" #Rd ", r" #Rm ", [r" #Rn "] ")
+#else
+#define LDREXB(Rd,Rn)					asm(".word %a0" : : "i" ((TInt)(0x01D00f9f|((CC_AL)<<28)|((Rd)<<12)|((Rn)<<16))));
+#define STREXB(Rd,Rm,Rn)				asm(".word %a0" : : "i" ((TInt)(0x01C00f90|((CC_AL)<<28)|((Rd)<<12)|(Rm)|((Rn)<<16))));
+#define LDREXH(Rd,Rn)					asm(".word %a0" : : "i" ((TInt)(0x01f00f9f|((CC_AL)<<28)|((Rd)<<12)|((Rn)<<16))));
+#define STREXH(Rd,Rm,Rn)				asm(".word %a0" : : "i" ((TInt)(0x01e00f90|((CC_AL)<<28)|((Rd)<<12)|(Rm)|((Rn)<<16))));
+#define LDREXD(Rd,Rn)					asm(".word %a0" : : "i" ((TInt)(0x01b00f9f|((CC_AL)<<28)|((Rd)<<12)|((Rn)<<16))));
+#define STREXD(Rd,Rm,Rn)				asm(".word %a0" : : "i" ((TInt)(0x01a00f90|((CC_AL)<<28)|((Rd)<<12)|(Rm)|((Rn)<<16))));
+#endif
+#if !defined(__CPU_ARM1136__) || defined(__CPU_ARM1136_ERRATUM_406973_FIXED)
+#define __CPU_ARM_HAS_WORKING_CLREX
+#if __ARM_ASSEMBLER_ISA__ >= 6
+#define CLREX							asm("clrex ")
+#else
+#define CLREX							asm(".word %a0" : : "i" ((TInt)(0xf57ff01f)));
+#endif
+#endif
+#endif 
+#ifdef __CPU_ARM_HAS_LDRD_STRD
+#if __ARM_ASSEMBLER_ISA__ >= 5
+#define LDRD(Rd,Rn)						asm("ldrd r" #Rd ", [r" #Rn "] ")
+#define STRD(Rd,Rn)						asm("strd r" #Rd ", [r" #Rn "] ")
+#else
+#define LDRD(Rd,Rn)						asm(".word %a0" : : "i" ((TInt)( 0xe1c000d0 | ((Rn)<<16) | ((Rd)<<12) )))
+#define STRD(Rd,Rn)						asm(".word %a0" : : "i" ((TInt)( 0xe1c000f0 | ((Rn)<<16) | ((Rd)<<12) )))
+#endif
+#define LDRD_ioff(Rd,Rn,off)			asm(".word %a0" : : "i" ((TInt)( 0xe1c000d0 | ((Rn)<<16) | ((Rd)<<12) | (((off)&0xf0)<<4) | ((off)&0x0f) )))
+#define STRD_ioff(Rd,Rn,off)			asm(".word %a0" : : "i" ((TInt)( 0xe1c000f0 | ((Rn)<<16) | ((Rd)<<12) | (((off)&0xf0)<<4) | ((off)&0x0f) )))
+#endif
+#if defined(__CPU_ARM_HAS_PLD) && !defined(__CPU_ARM926J__) && !defined(__CPU_UNKNOWN)		// PLD is a no-op on ARM926
+#if __ARM_ASSEMBLER_ISA__ >= 5
+#define PLD(Rn)							asm("pld [r" #Rn "] ")
+#else
+#define PLD(Rn)							asm(".word %a0" : : "i" ((TInt)( 0xf5d0f000 | ((Rn)<<16) )))
+#endif
+#define PLD_ioff(Rn, off)				asm(".word %a0" : : "i" ((TInt)( 0xf5d0f000 | ((Rn)<<16) | (off) )))	// preload with immediate offset
+#define PLD_noff(Rn, off)				asm(".word %a0" : : "i" ((TInt)( 0xf550f000 | ((Rn)<<16) | (off) )))	// preload with negative offset
+#else
+#define PLD(Rn)
+#define PLD_ioff(Rn, off)
+#define PLD_noff(Rn, off)
+#endif
+#ifdef __CPU_HAS_CP15_THREAD_ID_REG
+#define GET_RWRW_TID(cc,r)				asm("mrc"#cc" p15, 0, "#r", c13, c0, 2 ");
+#define GET_RWRO_TID(cc,r)				asm("mrc"#cc" p15, 0, "#r", c13, c0, 3 ");
+#define GET_RWNO_TID(cc,r)				asm("mrc"#cc" p15, 0, "#r", c13, c0, 4 ");
+#define SET_RWRW_TID(cc,r)				asm("mcr"#cc" p15, 0, "#r", c13, c0, 2 ");
+#define SET_RWRO_TID(cc,r)				asm("mcr"#cc" p15, 0, "#r", c13, c0, 3 ");
+#define SET_RWNO_TID(cc,r)				asm("mcr"#cc" p15, 0, "#r", c13, c0, 4 ");
+#endif
+
+#ifdef __CPU_SUPPORT_THUMB2EE
+#define GET_THUMB2EE_HNDLR_BASE(cc,r)	asm("mrc"#cc" p14, 6, "#r", c1, c0, 0 ")
+#define SET_THUMB2EE_HNDLR_BASE(cc,r)	asm("mcr"#cc" p14, 6, "#r", c1, c0, 0 ")
+#endif
+
+#if defined(__CPU_ARMV7)
+#define	ARM_DMB_gen(opt)				asm(".word %a0" : : "i" ((TInt)(0xf57ff050 | (opt) )) )
+#define	ARM_DSB_gen(opt)				asm(".word %a0" : : "i" ((TInt)(0xf57ff040 | (opt) )) )
+#define	ARM_ISB_gen(opt)				asm(".word %a0" : : "i" ((TInt)(0xf57ff060 | (opt) )) )
+
+#define	ARM_DMBSY	ARM_DMB_gen(0xf)	// full system DMB
+#define	ARM_DSBSY	ARM_DSB_gen(0xf)	// full system DSB
+#define	ARM_DMBST	ARM_DMB_gen(0xe)	// full system DMB, orders writes only
+#define	ARM_DSBST	ARM_DSB_gen(0xe)	// full system DSB, orders writes only
+#define	ARM_DMBSH	ARM_DMB_gen(0xb)	// DMB encompassing inner-shareable domain
+#define	ARM_DSBSH	ARM_DSB_gen(0xb)	// DMB encompassing inner-shareable domain
+#define	ARM_DMBSHST	ARM_DMB_gen(0xa)	// DMB encompassing inner-shareable domain, orders writes only
+#define	ARM_DSBSHST	ARM_DSB_gen(0xa)	// DMB encompassing inner-shareable domain, orders writes only
+
+#define	ARM_ISBSY	ARM_ISB_gen(0xf)	// full system ISB
+
+#define	ARM_NOP							asm(".word 0xe320f000 ")
+#define	ARM_YIELD						asm(".word 0xe320f001 ")
+
+#define	__DATA_MEMORY_BARRIER__(reg)	ARM_DMBSH
+#define	__DATA_MEMORY_BARRIER_Z__(reg)	asm("mov "#reg", #0"); ARM_DMBSH
+#define	__DATA_SYNC_BARRIER__(reg)		ARM_DSBSH
+#define	__DATA_SYNC_BARRIER_Z__(reg)	asm("mov "#reg", #0"); ARM_DSBSH
+#define	__INST_SYNC_BARRIER__(reg)		ARM_ISBSY
+#define	__INST_SYNC_BARRIER_Z__(reg)	asm("mov "#reg", #0"); ARM_ISBSY
+
+#elif defined(__CPU_ARM11MP__)
+
+#define	ARM_DMB(reg)					asm("mcr p15, 0, "#reg", c7, c10, 5 ")
+#define	ARM_DSB(reg)					asm("mcr p15, 0, "#reg", c7, c10, 4 ")
+#define	ARM_ISB(reg)					asm("mcr p15, 0, "#reg", c7, c5, 4 ")
+
+#define	ARM_NOP							asm(".word 0xe320f000 ")
+#define	ARM_YIELD						asm(".word 0xe320f001 ")
+
+#define	__DATA_MEMORY_BARRIER__(reg)	ARM_DMB(reg)
+#define	__DATA_MEMORY_BARRIER_Z__(reg)	asm("mov "#reg", #0"); ARM_DMB(reg)
+#define	__DATA_SYNC_BARRIER__(reg)		ARM_DSB(reg)
+#define	__DATA_SYNC_BARRIER_Z__(reg)	asm("mov "#reg", #0"); ARM_DSB(reg)
+#define	__INST_SYNC_BARRIER__(reg)		ARM_ISB(reg)
+#define	__INST_SYNC_BARRIER_Z__(reg)	asm("mov "#reg", #0"); ARM_ISB(reg)
+
+#elif defined(__CPU_ARMV6__)
+
+#define	ARM_DMB(reg)					asm("mcr p15, 0, "#reg", c7, c10, 5 ")
+#define	ARM_DSB(reg)					asm("mcr p15, 0, "#reg", c7, c10, 4 ")
+#define	ARM_ISB(reg)					asm("mcr p15, 0, "#reg", c7, c5, 4 ")
+
+#define	__DATA_MEMORY_BARRIER__(reg)	ARM_DMB(reg)
+#define	__DATA_MEMORY_BARRIER_Z__(reg)	asm("mov "#reg", #0"); ARM_DMB(reg)
+#define	__DATA_SYNC_BARRIER__(reg)		ARM_DSB(reg)
+#define	__DATA_SYNC_BARRIER_Z__(reg)	asm("mov "#reg", #0"); ARM_DSB(reg)
+#define	__INST_SYNC_BARRIER__(reg)		ARM_ISB(reg)
+#define	__INST_SYNC_BARRIER_Z__(reg)	asm("mov "#reg", #0"); ARM_ISB(reg)
+
+#else
+
+#define	__DATA_MEMORY_BARRIER__(reg)
+#define	__DATA_MEMORY_BARRIER_Z__(reg)	asm("mov "#reg", #0")
+#define	__DATA_SYNC_BARRIER__(reg)		asm("mcr p15, 0, "#reg", c7, c10, 4 ")
+#define	__DATA_SYNC_BARRIER_Z__(reg)	asm("mov "#reg", #0"); asm("mcr p15, 0, "#reg", c7, c10, 4 ")
+#define	__INST_SYNC_BARRIER__(reg)
+#define	__INST_SYNC_BARRIER_Z__(reg)	asm("mov "#reg", #0")
+
+#endif
+
+#ifdef __SMP__
+#define	__SMP_DATA_MEMORY_BARRIER__(reg)	__DATA_MEMORY_BARRIER__(reg)
+#define	__SMP_DATA_MEMORY_BARRIER_Z__(reg)	__DATA_MEMORY_BARRIER_Z__(reg)
+#define	__SMP_DATA_SYNC_BARRIER__(reg)		__DATA_SYNC_BARRIER__(reg)
+#define	__SMP_DATA_SYNC_BARRIER_Z__(reg)	__DATA_SYNC_BARRIER_Z__(reg)
+#define	__SMP_INST_SYNC_BARRIER__(reg)		__INST_SYNC_BARRIER__(reg)
+#define	__SMP_INST_SYNC_BARRIER_Z__(reg)	__INST_SYNC_BARRIER_Z__(reg)
+#else
+#define	__SMP_DATA_MEMORY_BARRIER__(reg)
+#define	__SMP_DATA_MEMORY_BARRIER_Z__(reg)	asm("mov "#reg", #0")
+#define	__SMP_DATA_SYNC_BARRIER__(reg)
+#define	__SMP_DATA_SYNC_BARRIER_Z__(reg)	asm("mov "#reg", #0")
+#define	__SMP_INST_SYNC_BARRIER__(reg)
+#define	__SMP_INST_SYNC_BARRIER_Z__(reg)	asm("mov "#reg", #0")
+#endif
+
+#ifdef	__CPU_ARM_HAS_WFI
+#define	ARM_WFIcc(cc)					asm(".word %a0" : : "i" ((TInt)(0x0320f003 | ((cc)<<28) )) )
+#define	ARM_WFI		ARM_WFIcc(CC_AL)
+#endif
+
+#ifdef	__CPU_ARM_HAS_WFE_SEV
+#define	ARM_WFEcc(cc)					asm(".word %a0" : : "i" ((TInt)(0x0320f002 | ((cc)<<28) )) )
+#if __ARM_ASSEMBLER_ISA__ >= 6
+#define	ARM_WFE		asm("wfe ")
+#else
+#define	ARM_WFE		ARM_WFEcc(CC_AL)
+#endif
+#define	ARM_SEVcc(cc)					asm(".word %a0" : : "i" ((TInt)(0x0320f004 | ((cc)<<28) )) )
+#if __ARM_ASSEMBLER_ISA__ >= 6
+#define	ARM_SEV		asm("sev ")
+#else
+#define	ARM_SEV		ARM_SEVcc(CC_AL)
+#endif
+#endif
+
+#ifndef	ARM_NOP
+#define	ARM_NOP							asm("nop ")
+#define	ARM_YIELD						asm("nop ")
+#endif
+
+// Support for throwing exceptions through ARM embedded assembler
+// Should only be needed user side
+#ifndef __EH_FRAME_ADDRESS
+#define	__EH_FRAME_ADDRESS(reg,offset)
+#define __EH_FRAME_PUSH2(reg1,reg2) 
+#define __EH_FRAME_SAVE1(reg,offset)
+#endif
+
+// StrongARM msr bug workaround: 
+// (conditional msr might cause,that the next instruction is executed twice by these processors)  
+#ifdef __CPU_SA1__
+#define __MSR_CPSR_C(cc,r)   \
+				asm("msr"#cc" cpsr_c," #r);  \
+				ARM_NOP; 		
+#else // !__CPU_SA1__
+#define __MSR_CPSR_C(cc,r) asm("msr"#cc" cpsr_c,"#r);
+#endif
+
+// Causes undefined instruction exception on both ARM and THUMB
+#define __ASM_CRASH()					asm(".word 0xe7ffdeff ")
+#if defined(__GNUC__)
+#define	__crash()						asm(".word 0xe7ffdeff " : : : "memory")
+#elif defined(__ARMCC__)
+// RVCT doesn't let us inline an undefined instruction
+// use a CDP to CP15 instead - doesn't work on THUMB but never mind
+#define	__crash()						asm("cdp p15, 0, c0, c0, c0, 0 ")
+#endif
+
+#if !defined(__CPU_ARM_HAS_LDREX_STREX_V6K)
+#if defined(__CPU_ARM_HAS_LDREX_STREX)
+#define	__ATOMIC64_USE_SLOW_EXEC__
+#else
+#define	__ATOMIC64_USE_FAST_EXEC__
+#define	__ATOMIC_USE_FAST_EXEC__
+#endif
+#endif
+
+#endif	// __CPU_ARM
+
+#ifdef	__CPU_X86
+#define	EXC_TRAP_CTX_SZ		10		// ebx, esp, ebp, esi, edi, ds, es, fs, gs, eip
+
+// Causes exception
+#if defined(__VC32__) || defined(__CW32__)
+#define	__crash()						do { _asm int 0ffh } while(0)
+#else
+#define	__crash()						asm("int 0xff " : : : "memory")
+#endif
+
+#endif	// __CPU_X86
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32/include/d32locd.h	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,604 @@
+// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32\include\d32locd.h
+// 
+//
+
+#ifndef __D32LOCD_H__
+#define __D32LOCD_H__
+#include <e32cmn.h>
+#include <partitions.h>
+
+
+/**
+@publishedPartner
+@released
+
+Local media IDs.
+
+A media ID is passed to LocDrv::RegisterMediaDevice() when registering
+a media driver with the local media subsystem.
+*/
+enum TMediaDevice { EFixedMedia0, EFixedMedia1, EFixedMedia2, EFixedMedia3,
+					EFixedMedia4, EFixedMedia5, EFixedMedia6, EFixedMedia7,
+					ERemovableMedia0, ERemovableMedia1, ERemovableMedia2, ERemovableMedia3,
+					EInvalidMedia
+				};
+
+#define __IS_REMOVABLE(aDevice) (aDevice>=ERemovableMedia0 && aDevice<=ERemovableMedia3)
+#define __IS_FIXED(aDevice) ((TUint)aDevice<=EFixedMedia7)
+#define MEDIA_DEVICE_IRAM EFixedMedia0
+#define MEDIA_DEVICE_LFFS EFixedMedia1
+#define MEDIA_DEVICE_NAND EFixedMedia2
+#define MEDIA_DEVICE_MMC ERemovableMedia0
+#define MEDIA_DEVICE_PCCARD ERemovableMedia1
+#define MEDIA_DEVICE_CSA ERemovableMedia2
+
+typedef signed int TSocket;
+
+class TLDriveAssignInfo
+/**
+No longer used
+@internalComponent
+@removed
+*/
+	{
+public:
+	TMediaDevice iDevice;
+	TInt iPriority;
+	};
+
+class TMediaDeviceAssignInfo
+/**
+No longer used
+@internalComponent
+@removed
+*/
+	{
+public:
+	TInt iFirstMedia;
+	TInt iLastMedia;	
+	};
+
+class TLocalDriveCaps
+/**
+Drives media capabilities fields
+
+@publishedPartner
+@released
+*/
+	{
+public:
+	IMPORT_C TLocalDriveCaps();
+public:
+	/**
+	Size of drive
+	
+	Note : This is the size of the partition, not the entire media.
+		   The entire media size can be obtained from TLocalDriveCapsV4::MediaSizeInBytes()
+	*/
+	TInt64 iSize;
+	/**
+	Media Type of drive
+	*/
+	TMediaType iType;
+	/**
+	Indicates state of battery if supported
+	*/
+	TBatteryState iBattery;
+	/**
+	Attributes of the drive
+	*/
+	TUint iDriveAtt;
+	/**
+	Attributes of underlying media 
+	*/
+	TUint iMediaAtt;
+	/**
+	Base address of media
+	*/
+    TUint8* iBaseAddress;
+	/**
+	Identity of the file system used for this media
+	*/
+	TUint16 iFileSystemId;
+	/**
+	Partition type of media
+	*/
+	TUint16	iPartitionType;
+	};
+typedef TPckgBuf<TLocalDriveCaps> TLocalDriveCapsBuf;
+//
+class TLocalDriveCapsV2 : public TLocalDriveCaps
+/**
+Extension to Capabilities fields mainly to support Nor flash
+
+@publishedPartner
+@released
+*/
+	{
+public:
+	/**
+	Number of hidden sectors on drive
+	*/
+	TUint iHiddenSectors;
+	/**
+	Size of erase unit on media
+	*/
+	TUint iEraseBlockSize;
+    };
+typedef TPckgBuf<TLocalDriveCapsV2> TLocalDriveCapsV2Buf;
+//
+
+
+
+/**
+Format specification for removable media
+
+@publishedPartner
+@released
+*/
+class TLDFormatInfo
+	{
+public:
+    inline TLDFormatInfo();
+public:
+
+    TInt64 iCapacity;				///< Format Capacity
+	TUint16 iSectorsPerCluster;		///< Specified sectors per cluster
+	TUint16 iSectorsPerTrack;		///< Specified sectors per track
+	TUint16 iNumberOfSides;			///< Specified number of sides
+
+	enum TFATBits {EFBDontCare, EFB12 = 12, EFB16 = 16, EFB32 = 32};
+	TFATBits iFATBits;				///< Specified bits per fat table entry
+
+	TUint16 iReservedSectors;	///< Reserved sector count, required for SD card compliance
+	
+	// Flags field. Allows the number of FAT tables to be specified: set both bits to zero to use the default.
+	enum TFlags {EOneFatTable = 0x01, ETwoFatTables = 0x02};
+	TUint8 iFlags;
+
+	TUint8 iPad;				///< Padding for offset alignment  between kernel and user code
+
+	};
+typedef TPckgBuf<TLDFormatInfo> TSpecialFormatInfoBuf;
+
+
+//
+class TLocalDriveCapsV3 : public TLocalDriveCapsV2
+/**
+Extension to Capabilities fields mainly to support removable media format specifications
+
+@publishedPartner
+@released
+*/
+	{
+public:
+	/**
+	Format specification
+	*/
+	TLDFormatInfo iFormatInfo;
+	/**
+	Set if iFormatInfo is valid
+	*/
+	TBool iExtraInfo;
+	/**
+	*/
+	TInt iMaxBytesPerFormat;
+    };
+//The following ASSERTs checks for offset of any TInt64 member be a multiple of 8 as per DEF045510
+__ASSERT_COMPILE(_FOFF(TLocalDriveCaps,iSize)%8 == 0);
+__ASSERT_COMPILE(_FOFF(TLocalDriveCapsV3,iFormatInfo.iCapacity) % 8 == 0);
+
+
+typedef TPckgBuf<TLocalDriveCapsV3> TLocalDriveCapsV3Buf;
+//
+class TLocalDriveCapsV4 : public TLocalDriveCapsV3
+/**
+Extension to Capabilities fields mainly to support Nand flash
+
+@publishedPartner
+@released
+*/
+	{
+public:
+	union
+		{
+		/**
+		Number of blocks (for NAND flash)
+		 - The entire capacity of NAND media can be calculated using:
+		   capacity = iNumOfBlocks * iNumPagesPerBlock * iNumBytesMain
+		*/
+		TInt iNumOfBlocks;
+		/**
+		Number of sectors (for other types of media)
+		 - The entire capacity of sector based media can be calculated using:
+		   capacity = iNumberOfSectors * iSectorSizeInBytes
+		*/
+		TUint32 iNumberOfSectors;
+		};
+
+	/**
+	Number of pages per block
+	*/
+	TInt iNumPagesPerBlock;
+
+	union
+		{
+		/**
+		Number of Bytes in the main array (for NAND flash)
+		 - The entire capacity of NAND media can be calculated using:
+		   capacity = iNumOfBlocks * iNumPagesPerBlock * iNumBytesMain
+		*/
+		TInt iNumBytesMain;
+		/**
+		Number of Bytes in a sector (for other types of media)
+		 - The entire capacity of sector based media can be calculated using:
+		   capacity = iNumberOfSectors * iSectorSizeInBytes
+		*/
+		TUint32 iSectorSizeInBytes;
+		};
+
+	/**
+	Number of Bytes in the spare array
+	*/
+	TInt iNumBytesSpare;
+	/**
+	Effective usable blocks
+	*/
+	TInt iEffectiveBlks;
+	/**
+	Start page of drive
+	*/
+	TInt iStartPage;
+public:
+	inline TInt64 MediaSizeInBytes();
+    };
+typedef TPckgBuf<TLocalDriveCapsV4> TLocalDriveCapsV4Buf;
+//
+#define KMaxSerialNumLength 64
+typedef TBuf8<KMaxSerialNumLength> TMediaSerialNumber;
+class TLocalDriveCapsV5 : public TLocalDriveCapsV4
+/**
+Add serial number support for certain media.
+
+@publishedPartner
+@released
+*/
+	{
+public:
+	/**
+    Serial number buffer length, 0 if not supported
+	*/
+    TUint iSerialNumLength;
+	/**
+    Serial number buffer
+	*/
+	TUint8 iSerialNum[KMaxSerialNumLength];
+	};
+typedef TPckgBuf<TLocalDriveCapsV5> TLocalDriveCapsV5Buf;
+
+//
+/**
+Extension to Capabilities fields mainly to support reporting block size 
+information of underlying media.
+    
+@publishedPartner
+@released
+*/
+class TLocalDriveCapsV6 : public TLocalDriveCapsV5
+	{
+public:
+	/**
+	Block size information of underlying media is required to assist in chosing 
+	efficient size of buffers for reading and writing.
+	This information can also be accessed through the function
+	- RFs::VolumeIOParam
+
+	These functions retrieve this blocksize information by calling the media
+	driver's Caps() function.
+	*/
+    TUint 	iBlockSize;
+    
+private:
+    /**
+    Reserved space for future use.
+    */
+    TUint32	iSpare[4];
+	};
+typedef TPckgBuf<TLocalDriveCapsV6> TLocalDriveCapsV6Buf;
+
+
+class TLocalDriveCapsV7 : public TLocalDriveCapsV6
+/**
+Add control mode, object mode, partition size for M18 NOR Flash.
+*/
+	{
+public:
+    TUint32 iWriteBufferSize;
+	TUint32 iPartitionSize;
+    TUint32 iControlModeSize;
+    TUint32 iObjectModeSize;
+	};
+
+typedef TPckgBuf<TLocalDriveCapsV7> TLocalDriveCapsV7Buf;
+
+//
+class TFormatInfo
+/**
+Format information class
+
+@publishedPartner
+@released
+*/
+	{
+public:
+	IMPORT_C TFormatInfo();
+public:
+	TBool iFormatIsCurrent;
+	TInt i512ByteSectorsFormatted; 
+	TInt iMaxBytesPerFormat;
+	};
+//
+class TErrorInfo
+/**
+@internalTechnology
+  */
+	{
+public:
+	enum TReasonCode
+		{
+		ENoError=0,			//No error
+		EBadSector=1,	//Error due to corrupt sector
+		};
+public:
+    TReasonCode iReasonCode;
+	union
+		{
+		// holds position error occurred for KErrCorrupt
+		// It numerically equals number of bytes succesfully read/written during
+		// last disk operation.
+		TInt64 iErrorPos;
+        TInt iOtherInfo;
+		};
+    };
+typedef TPckgBuf<TErrorInfo> TErrorInfoBuf;
+//
+class TLocalDriveMessageData
+/**
+@internalTechnology
+*/
+	{
+public:
+	inline TLocalDriveMessageData()
+		{}
+	inline TLocalDriveMessageData(TInt64 aPos, TInt aLength, const TAny* aPtr, TInt aHandle, TInt anOffset, TInt aFlags)
+		: iPos(aPos), iLength(aLength), iPtr(aPtr), iHandle(aHandle), iOffset(anOffset), iFlags(aFlags)
+		{}
+public:
+	TInt64 iPos;
+	TInt iLength;
+	const TAny* iPtr;
+	TInt iHandle;
+	TInt iOffset;
+	TInt iFlags;
+	};
+
+class TLocalDriveControlIOData
+/**
+Control IO data class
+
+@internalTechnology
+*/
+	{
+public:
+	inline TLocalDriveControlIOData()
+		{}
+	inline TLocalDriveControlIOData(TInt aCommand, TAny* aParam1, TAny* aParam2, TInt aHandle)
+		: iCommand(aCommand), iParam1(aParam1), iParam2(aParam2), iHandle(aHandle)
+		{}
+public:
+	TInt iCommand;
+	TAny* iParam1;
+	TAny* iParam2;
+	TInt iHandle;
+	};
+
+class TLocalDrivePasswordData
+/**
+Password store for password protected media
+
+@internalTechnology
+*/
+	{
+public:
+	TLocalDrivePasswordData(const TDesC8& aOldPasswd, const TDesC8& aNewPasswd, TBool aStorePasswd)
+		: iOldPasswd(&aOldPasswd), iNewPasswd(&aNewPasswd), iStorePasswd(aStorePasswd)
+		{}
+	TLocalDrivePasswordData()
+		: iOldPasswd(&KNullDesC8), iNewPasswd(&KNullDesC8), iStorePasswd(EFalse)
+		{}
+public:
+	const TDesC8 *iOldPasswd;
+	const TDesC8 *iNewPasswd;
+	TBool iStorePasswd;
+	};
+typedef TPckgBuf<TLocalDrivePasswordData> TLocalDrivePasswordDataPckg;
+
+
+class TPasswordStore
+/**
+@internalTechnology
+*/
+	{
+public:
+	virtual TInt Init()=0;
+	virtual TInt ReadPasswordData(TDes8 &aBuf)=0;
+	virtual TInt WritePasswordData(TDesC8 &aBuf)=0;
+	virtual TInt PasswordStoreLengthInBytes()=0;
+	enum {EMaxPasswordLength=1024}; /**< Size of the password store write buffer, which may contain multiple password mappings */
+	};
+
+class TMountInfoData
+/**
+@internalTechnology
+*/
+	{
+public:
+	TDesC8* iInfo;
+	TAny* iThread;
+	};
+
+
+const TInt KLocalDriveMajorVersion=1;
+const TInt KLocalDriveMinorVersion=0;
+const TInt KLocalDriveBuildVersion=160;
+_LIT(KLitLocalDriveLddName,"LocDrv");
+
+const TInt KLocalMessageHandle=-1;
+
+
+enum TMediaPagingStats
+	{
+	EMediaPagingStatsRomAndCode,
+	EMediaPagingStatsRom,
+	EMediaPagingStatsCode
+	};
+
+
+class RLocalDrive : public RBusLogicalChannel
+/**
+Interface class to local media
+
+@internalTechnology
+*/
+	{
+public:
+	enum TControl
+		{
+		EControlRead=0,							/**< Read request */
+		EControlWrite=1,						/**< Write request */
+		EControlCaps=2,							/**< Caps request */
+		EControlFormat=3,						/**< Format request */
+		EControlEnlarge=4,						/**< Enlarge drive request */
+		EControlReduce=5,						/**< Reduce Drive  request */
+		EControlForceMediaChange=6,				/**< Force media change request */
+		EControlMediaDevice=7,					/**< Return the media device request */
+		EControlPasswordLock=8,					/**< Password lock media request */
+		EControlPasswordUnlock=9,				/**< Password unlock media request */
+		EControlPasswordClear=10,				/**< Password clear request */
+		EControlNotifyChange=11,				/**< Notify change request */
+		EControlNotifyChangeCancel=12,			/**< Notify change cancel request */
+		EControlReadPasswordStore=13,			/**< Read password request */
+		EControlWritePasswordStore=14,			/**< Write password request */
+		EControlPasswordStoreLengthInBytes=15,	/**< Password request */
+		EControlIsRemovable=16,					/**< Query removable request */
+		EControlSetMountInfo=17,				/**< Set mount info request */
+		EControlControlIO=18,					/**< Control IO request */
+		EControlPasswordErase=19,				/**< Password erase media request */
+		EControlDeleteNotify=20,				/**< Delete notification */
+		EControlGetLastErrorInfo=21,			/**< Get last error info request */
+		};
+
+	enum TRemountFlags
+		{
+		ELocDrvRemountNotifyChange	   = 0,		/**< Notify clients of media change but don't remount */
+		ELocDrvRemountForceMediaChange = 1,		/**< Notify clients of media change and remount	*/
+		};
+
+	enum TReadWriteFlags
+		{
+		ELocDrvMetaData					= 0x80000000,	/**< Set if read/write request is for metadata */
+		ELocDrvWholeMedia				= 0x40000000	/**< Set to access whole media, rather than partition */
+		};
+
+public:
+	inline TVersion VersionRequired() const;
+	inline TInt Connect(TInt aDriveNumber, TBool& aChangedFlag);
+	inline TInt Enlarge(TInt aLength);
+	inline TInt Reduce(TInt aPos, TInt aLength);
+	inline TInt Read(TInt64 aPos, TInt aLength, const TAny* aTrg, TInt aMessageHandle, TInt aOffset, TInt aFlags);
+	inline TInt Read(TInt64 aPos, TInt aLength, const TAny* aTrg, TInt aMessageHandle, TInt anOffset);
+	inline TInt Read(TInt64 aPos, TInt aLength, TDes8& aTrg);
+	inline TInt Write(TInt64 aPos, TInt aLength, const TAny* aSrc, TInt aMessageHandle, TInt aOffset, TInt aFlags);
+	inline TInt Write(TInt64 aPos, TInt aLength, const TAny* aSrc, TInt aMessageHandle, TInt anOffset);
+	inline TInt Write(TInt64 aPos, const TDesC8& aSrc);
+	inline TInt Caps(TDes8& anInfo);
+	inline TInt Format(TInt64 aPos, TInt aLength);
+	inline TInt ForceMediaChange(TInt aMode=0);
+	inline void NotifyChange(TRequestStatus* aStatus);
+	inline void NotifyChangeCancel();
+	inline TInt SetMountInfo(const TDesC8* aInfo,TInt aMessageHandle);
+	inline TMediaDevice MediaDevice();
+	inline TInt IsRemovable(TInt& aSocketNum);
+	inline TInt ControlIO(TInt aCommand, TAny* aParam1, TAny* aParam2);
+	inline TInt Unlock(const TDesC8& aPassword, TBool aStorePassword);
+	inline TInt SetPassword(const TDesC8& aOldPassword, const TDesC8& aNewPassword, TBool aStorePassword);
+	inline TInt Clear(const TDesC8& aPassword);
+	inline TInt ErasePassword();
+	inline TInt ReadPasswordData(TDesC8& aStoreData);
+	inline TInt WritePasswordData(const TDesC8& aStoreData);
+	inline TInt PasswordStoreLengthInBytes();
+	inline TInt DeleteNotify(TInt64 aPos, TInt aLength);
+	inline TInt GetLastErrorInfo(TDesC8& aErrorInfo);
+	};
+//
+#ifndef __KERNEL_MODE__
+class TBusLocalDrive : public RLocalDrive
+/**
+@internalTechnology
+*/
+	{
+public:
+	IMPORT_C TBusLocalDrive();
+	IMPORT_C TInt Connect(TInt aDriveNumber, TBool& aChangedFlag);
+	IMPORT_C void Disconnect();
+	IMPORT_C TInt Enlarge(TInt aLength);
+	IMPORT_C TInt ReduceSize(TInt aPos, TInt aLength);
+	IMPORT_C TInt Read(TInt64 aPos,TInt aLength,const TAny* aTrg,TInt aMessageHandle,TInt aOffset,TInt aFlags);
+	IMPORT_C TInt Read(TInt64 aPos,TInt aLength,const TAny* aTrg,TInt aMessageHandle,TInt anOffset);
+	IMPORT_C TInt Read(TInt64 aPos,TInt aLength,TDes8& aTrg);
+	IMPORT_C TInt Write(TInt64 aPos,TInt aLength,const TAny* aSrc,TInt aMessageHandle,TInt aOffset,TInt aFlags);
+	IMPORT_C TInt Write(TInt64 aPos,TInt aLength,const TAny* aSrc,TInt aMessageHandle,TInt anOffset);
+	IMPORT_C TInt Write(TInt64 aPos,const TDesC8& aSrc);
+	IMPORT_C TInt Caps(TDes8& anInfo);
+	IMPORT_C TInt Format(TFormatInfo& anInfo);
+	IMPORT_C TInt Format(TInt64 aPos,TInt aLength);
+	IMPORT_C TInt SetMountInfo(const TDesC8* aMountInfo,TInt aMessageHandle);
+	IMPORT_C TInt ForceRemount(TUint aFlags=0);
+	IMPORT_C TInt ControlIO(TInt aCommand, TAny* aParam1, TAny* aParam2);
+
+	IMPORT_C TInt Unlock(const TDesC8& aPassword, TBool aStorePassword);
+	IMPORT_C TInt SetPassword(const TDesC8& aOldPassword, const TDesC8& aNewPassword, TBool aStorePassword);
+	IMPORT_C TInt Clear(const TDesC8& aPassword);
+	IMPORT_C TInt ErasePassword();
+	IMPORT_C TInt ReadPasswordData(TDes8 &aBuf);
+	IMPORT_C TInt WritePasswordData(const TDesC8 &aBuf);
+	IMPORT_C TInt PasswordStoreLengthInBytes();
+	IMPORT_C TInt DeleteNotify(TInt64 aPos, TInt aLength);
+	IMPORT_C TInt GetLastErrorInfo(TDes8& aErrorInfo);
+public:
+	inline TInt& Status() {return(iStatus);}
+private:
+	TInt CheckMount();
+private:
+	TInt iStatus;
+	};
+#endif
+
+#define _LOCKABLE_MEDIA
+
+#include <d32locd.inl>
+#endif
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32/include/d32locd.inl	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,104 @@
+// Copyright (c) 1999-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32\include\d32locd.inl
+// 
+//
+
+// class RLocalDrive
+inline TVersion RLocalDrive::VersionRequired() const
+	{ return TVersion(KLocalDriveMajorVersion,KLocalDriveMinorVersion,KLocalDriveBuildVersion); }
+/**
+@capability TCB
+*/
+inline TInt RLocalDrive::Connect(TInt aDriveNumber, TBool& aChangedFlag)
+	{ return DoCreate(KLitLocalDriveLddName,VersionRequired(),aDriveNumber,NULL,(const TDesC8*)&aChangedFlag,EOwnerProcess); }
+inline TInt RLocalDrive::Enlarge(TInt aLength)
+	{ return DoControl(EControlEnlarge, (TAny*)aLength); }
+inline TInt RLocalDrive::Reduce(TInt aPos, TInt aLength)
+	{ return DoControl(EControlReduce, (TAny*)aPos, (TAny*)aLength); }
+inline TInt RLocalDrive::Read(TInt64 aPos, TInt aLength, const TAny* aTrg, TInt aMessageHandle, TInt aOffset, TInt aFlags)
+	{ TLocalDriveMessageData d(aPos,aLength,aTrg,aMessageHandle,aOffset,aFlags); return DoControl(EControlRead, &d); }
+inline TInt RLocalDrive::Read(TInt64 aPos, TInt aLength, const TAny* aTrg, TInt aMessageHandle, TInt anOffset)
+	{ TLocalDriveMessageData d(aPos,aLength,aTrg,aMessageHandle,anOffset,0); return DoControl(EControlRead, &d); }
+inline TInt RLocalDrive::Read(TInt64 aPos, TInt aLength, TDes8& aTrg)
+	{ TLocalDriveMessageData d(aPos,aLength,&aTrg,KLocalMessageHandle,0,ELocDrvMetaData); return DoControl(EControlRead, &d); }
+inline TInt RLocalDrive::Write(TInt64 aPos, TInt aLength, const TAny* aSrc, TInt aMessageHandle, TInt aOffset, TInt aFlags)
+	{ TLocalDriveMessageData d(aPos,aLength,aSrc,aMessageHandle,aOffset,aFlags); return DoControl(EControlWrite, &d); }
+inline TInt RLocalDrive::Write(TInt64 aPos, TInt aLength, const TAny* aSrc, TInt aMessageHandle, TInt anOffset)
+	{ TLocalDriveMessageData d(aPos,aLength,aSrc,aMessageHandle,anOffset,0); return DoControl(EControlWrite, &d); }
+inline TInt RLocalDrive::Write(TInt64 aPos, const TDesC8& aSrc)
+	{ TLocalDriveMessageData d(aPos,aSrc.Length(),&aSrc,KLocalMessageHandle,0,ELocDrvMetaData); return DoControl(EControlWrite, &d); }
+inline TInt RLocalDrive::Caps(TDes8& anInfo)
+	{ return DoControl(EControlCaps, &anInfo); }
+inline TInt RLocalDrive::Format(TInt64 aPos, TInt aLength)
+	{ TLocalDriveMessageData d(aPos,aLength,NULL,KLocalMessageHandle,0,0); return DoControl(EControlFormat, &d); }
+inline TInt RLocalDrive::ForceMediaChange(TInt aMode)
+	{ return DoControl(EControlForceMediaChange, (TAny*)aMode); }
+inline void RLocalDrive::NotifyChange(TRequestStatus* aStatus)
+	{ *aStatus=KRequestPending; DoControl(EControlNotifyChange, aStatus); }
+inline void RLocalDrive::NotifyChangeCancel()
+	{ DoControl(EControlNotifyChangeCancel); }
+inline TMediaDevice RLocalDrive::MediaDevice()
+	{ return (TMediaDevice)DoControl(EControlMediaDevice); }
+inline TInt RLocalDrive::SetMountInfo(const TDesC8* aInfo,TInt aMessageHandle)
+	{ TLocalDriveMessageData d(0,0,aInfo,aMessageHandle,0,0); return DoControl(EControlSetMountInfo, &d); }
+inline TInt RLocalDrive::IsRemovable(TInt& aSocketNum)
+	{ return DoControl(EControlIsRemovable,&aSocketNum); }
+inline TInt RLocalDrive::ControlIO(TInt aCommand, TAny* aParam1, TAny* aParam2)
+	{ TLocalDriveControlIOData d(aCommand,aParam1,aParam2,KLocalMessageHandle); return DoControl(EControlControlIO,&d); }
+
+
+// RLocalDrive Password Control (Set/Lock/Unlock)
+inline TInt RLocalDrive::Unlock(const TDesC8& aPassword, TBool aStorePassword)
+	{ TLocalDrivePasswordData d((TDesC8&)aPassword, (TDesC8&)aPassword, aStorePassword); return DoControl(EControlPasswordUnlock, &d); }
+inline TInt RLocalDrive::SetPassword(const TDesC8& aOldPassword, const TDesC8& aNewPassword, TBool aStorePassword)
+	{ TLocalDrivePasswordData d((TDesC8&)aOldPassword, (TDesC8&)aNewPassword, aStorePassword); return DoControl(EControlPasswordLock, &d); }
+inline TInt RLocalDrive::Clear(const TDesC8& aPassword)
+	{ TLocalDrivePasswordData d((TDesC8&)aPassword, (TDesC8&)aPassword, EFalse); return DoControl(EControlPasswordClear, &d); }
+inline TInt RLocalDrive::ErasePassword()
+	{ return DoControl(EControlPasswordErase); }
+
+// RLocalDrive Password Store Control (Read/Write/Length)
+inline TInt RLocalDrive::ReadPasswordData(TDesC8& aStoreData)
+	{ return DoControl(EControlReadPasswordStore, (TDesC8*)&aStoreData); }
+inline TInt RLocalDrive::WritePasswordData(const TDesC8& aStoreData)
+	{ return DoControl(EControlWritePasswordStore, (TDesC8*)&aStoreData); }
+inline TInt RLocalDrive::PasswordStoreLengthInBytes()
+	{ TInt length=0; return DoControl(EControlPasswordStoreLengthInBytes, (TAny*)&length)==KErrNone?length:0; }
+
+inline TInt RLocalDrive::DeleteNotify(TInt64 aPos, TInt aLength)
+	{ TLocalDriveMessageData d(aPos,aLength,0,KLocalMessageHandle,0,0); return DoControl(EControlDeleteNotify, &d); }
+
+// Get Last Error Info
+inline TInt RLocalDrive::GetLastErrorInfo(TDesC8& aErrorInfo)
+	{ return DoControl(EControlGetLastErrorInfo, (TDesC8*)&aErrorInfo); }
+
+
+inline TLDFormatInfo::TLDFormatInfo()
+                     :iCapacity(0),iSectorsPerCluster(0),iSectorsPerTrack(0),iNumberOfSides(0),iFATBits(EFBDontCare),
+                     iReservedSectors(0), iFlags(0), iPad(0)
+    {
+    }
+
+inline TInt64 TLocalDriveCapsV4::MediaSizeInBytes()
+	{
+	//
+	// Return the actual size of the media (as opposed to the partition size)
+	//
+	// Note : We calculate including iNumPagesPerBlock to maintain compatibility with NAND flash
+	//		  where iNumberOfSectors == iNumOfBlocks and iSectorSizeInBytes == iNumBytesMain.
+	//		  The local media subsystem sets a default value of iNumPagesPerBlock == 1.
+	//
+	return(TInt64(iNumberOfSectors) * iSectorSizeInBytes * iNumPagesPerBlock);
+	}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32/include/e32base.h	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,3220 @@
+// Copyright (c) 1994-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32\include\e32base.h
+// 
+//
+
+#ifndef __E32BASE_H__
+#define __E32BASE_H__
+#include <e32std.h>
+
+/**
+ * Container Base Class
+ */
+class CBase
+/**
+@publishedAll
+@released
+
+Base class for all classes to be instantiated on the heap.
+
+By convention, all classes derived from CBase have a name beginning with the 
+letter 'C'.
+
+The class has two important features:
+
+1. A virtual destructor that allows instances of derived classes to be destroyed 
+   and properly cleaned up through a CBase* pointer. All CBase derived objects 
+   can be pushed, as CBase* pointers, onto the cleanup stack, and destroyed through 
+   a call to CleanupStack::PopAndDestroy().
+
+2. Initialisation of the CBase derived object to binary zeroes through a specific 
+   CBase::operator new() - this means that members, whose initial value should 
+   be zero, do not have to be initialised in the constructor. This allows safe 
+   destruction of a partially-constructed object.
+
+Note that using C++ arrays of CBase-derived types is not recommended, as objects 
+in the array will not be zero-initialised (as there is no operator new[] member). 
+You should use an array class such as RPointerArray instead for arrays of 
+CBase-derived types.
+
+@see CleanupStack
+*/
+	{
+public:
+	/**
+	Default constructor
+	*/
+	inline CBase()	{}
+	IMPORT_C virtual ~CBase();
+	inline TAny* operator new(TUint aSize, TAny* aBase) __NO_THROW;
+	inline TAny* operator new(TUint aSize) __NO_THROW;
+	inline TAny* operator new(TUint aSize, TLeave);
+	inline TAny* operator new(TUint aSize, TUint aExtraSize) __NO_THROW;
+	inline TAny* operator new(TUint aSize, TLeave, TUint aExtraSize);
+	IMPORT_C static void Delete(CBase* aPtr);
+protected:
+	IMPORT_C virtual TInt Extension_(TUint aExtensionId, TAny*& a0, TAny* a1);
+private:
+	CBase(const CBase&);
+	CBase& operator=(const CBase&);
+private:
+	};
+	
+	
+	
+	
+class CBufBase : public CBase
+/**
+@publishedAll
+@released
+
+Defines the interface for dynamic buffers. 
+
+The basic functions, InsertL(), Read(), Write(), Delete(), Reset() and Size(), 
+transfer data between the buffer and other places, and allow that data to 
+be deleted
+
+The ExpandL() and Resize() functions allow some operations to be carried out 
+with greater efficiency
+
+A Compress() function frees (back to the heap) any space which may have been 
+allocated, but not used
+
+Ptr() and BackPtr() allow look-up of contiguous data from any given position, 
+forward or backward
+*/
+	{
+public:
+	IMPORT_C ~CBufBase();
+	inline TInt Size() const;
+	IMPORT_C void Reset();
+	IMPORT_C void Read(TInt aPos,TDes8& aDes) const;
+	IMPORT_C void Read(TInt aPos,TDes8& aDes,TInt aLength) const;
+	IMPORT_C void Read(TInt aPos,TAny* aPtr,TInt aLength) const;
+	IMPORT_C void Write(TInt aPos,const TDesC8& aDes);
+	IMPORT_C void Write(TInt aPos,const TDesC8& aDes,TInt aLength);
+	IMPORT_C void Write(TInt aPos,const TAny* aPtr,TInt aLength);
+	IMPORT_C void InsertL(TInt aPos,const TDesC8& aDes);
+	IMPORT_C void InsertL(TInt aPos,const TDesC8& aDes,TInt aLength);
+	IMPORT_C void InsertL(TInt aPos,const TAny* aPtr,TInt aLength);
+	IMPORT_C void ExpandL(TInt aPos,TInt aLength);
+	IMPORT_C void ResizeL(TInt aSize);
+// Pure virtual
+	/**
+	Compresses the buffer so as to occupy minimal space.
+	
+	Normally, you would call this when a buffer has reached its final size,
+	or when you know it will not expand again for a while, or when an
+	out-of-memory error has occurred and your program is taking measures to
+	save space. Compression in these circumstances releases memory for other
+	programs to use, but has no adverse effect on performance.
+	
+	Derived classes provide the implementation.
+	
+	@see CBufFlat::Compress
+	@see CBufSeg::Compress
+	*/
+    virtual void Compress()=0;
+	/**
+	Deletes data from the buffer.
+	
+	Derived classes provide the implementation.
+	
+	@param aPos    Buffer position where the deletion will begin; must be in the 
+                   range zero to (Size() minus the length of the data
+                   to be deleted). 
+	@param aLength The number of bytes to be deleted; must be non-negative.
+		
+	@see CBufFlat::Delete
+	@see CBufSeg::Delete
+	*/
+	virtual void Delete(TInt aPos,TInt aLength)=0;
+	/**
+	Gets a pointer descriptor to represent the data from the specified position to  
+	the end of the contiguous region containing that byte.
+	
+	Derived classes provide the implementation.
+		
+	@param aPos Buffer position: must be in range zero to Size().
+	 
+	@return Descriptor representing the data starting at aPos, and whose length
+	        indicates the number of contiguous bytes stored in the buffer, 
+            forward from that point. The length will be non-zero unless aPos==Size().
+              	
+	@see CBufFlat::Ptr
+	@see CBufSeg::Ptr
+	*/
+	virtual TPtr8 Ptr(TInt aPos)=0;
+	/**
+	Gets a pointer descriptor to represent data from just before the specified 
+	data byte backward to the beginning of the contiguous region containing 
+	that byte.
+	
+	Derived classes provide the implementation.
+	
+	@param aPos Buffer position: must be in range zero to Size().
+	 
+	@return Descriptor representing the back contiguous region. 
+	        The address in the descriptor is the pointer to the bytes at the
+	        buffer position, unless the buffer position was at the beginning of
+	        a non-first segment in the buffer: in this case, the address is a
+	        pointer just beyond the last data byte in the previous segment.
+	        The length is the number of contiguous bytes from the address
+	        backwards to the beginning of the segment.
+		
+	@see CBufFlat::BackPtr
+	@see CBufSeg::BackPtr
+	*/
+	virtual TPtr8 BackPtr(TInt aPos)=0;
+private:
+	virtual void DoInsertL(TInt aPos,const TAny* aPtr,TInt aLength)=0;
+protected:
+	IMPORT_C CBufBase(TInt anExpandSize);
+protected:
+	TInt iSize;
+	TInt iExpandSize;
+	};
+
+
+
+
+class CBufFlat : public CBufBase
+/**
+@publishedAll
+@released
+
+Provides a flat storage dynamic buffer.
+
+This class should be used when high-speed pointer lookup is an important
+consideration, and you are reasonably confident that the insertion of
+data will not fail. 
+
+This class is an implementation of the abstract buffer interface provided 
+by CBufBase and uses a single heap cell to contain the data.
+*/
+	{
+public:
+	IMPORT_C ~CBufFlat();
+	IMPORT_C static CBufFlat* NewL(TInt anExpandSize);
+	inline TInt Capacity() const;
+	IMPORT_C void SetReserveL(TInt aSize);
+	IMPORT_C void Compress();
+	IMPORT_C void Delete(TInt aPos,TInt aLength);
+	IMPORT_C TPtr8 Ptr(TInt aPos);
+	IMPORT_C TPtr8 BackPtr(TInt aPos);
+protected:
+	IMPORT_C CBufFlat(TInt anExpandSize);
+private:
+	IMPORT_C void DoInsertL(TInt aPos,const TAny* aPtr,TInt aLength);
+private:
+	TInt iMaxSize;
+	TUint8* iPtr;
+	};
+
+
+
+
+class TBufSegLink;
+class CBufSeg : public CBufBase
+/**
+@publishedAll
+@released
+
+Provides a segmented dynamic buffer.
+
+This class should be used when the object has a long life-time and an
+unpredictable number of insertions, or there is concern about the performance
+of insertion and deletion operations into large buffers.
+
+This class is an implementation of the abstract buffer interface provided 
+by CBufBase and uses doubly-linked list of heap cells to contain the data; 
+each cell containing a segment of the buffer.
+
+Its (private) data members include an anchor for the doubly-linked list, and also a 
+reference to the buffer position used by the last operation. This reference 
+acts as a cache; if the next operation uses a similar buffer position, then 
+calculation of the pointer corresponding to its buffer position is much faster.
+*/
+	{
+public:
+	IMPORT_C ~CBufSeg();
+	IMPORT_C static CBufSeg* NewL(TInt anExpandSize);
+    IMPORT_C void Compress();
+	IMPORT_C void Delete(TInt aPos,TInt aLength);
+	IMPORT_C TPtr8 Ptr(TInt aPos);
+	IMPORT_C TPtr8 BackPtr(TInt aPos);
+protected:
+	IMPORT_C CBufSeg(TInt anExpandSize);
+	void InsertIntoSegment(TBufSegLink* aSeg,TInt anOffset,const TAny* aPtr,TInt aLength);
+	void DeleteFromSegment(TBufSegLink* aSeg,TInt anOffset,TInt aLength);
+	void FreeSegment(TBufSegLink* aSeg);
+    void SetSBO(TInt aPos);
+	void AllocSegL(TBufSegLink* aSeg,TInt aNumber);
+private:
+	IMPORT_C void DoInsertL(TInt aPos,const TAny* aPtr,TInt aLength);
+private:
+    TDblQue<TBufSegLink> iQue;
+	TBufSegLink* iSeg;
+	TInt iBase;
+	TInt iOffset;
+	};
+
+
+
+
+class TKeyArrayFix : public TKey
+/**
+@publishedAll
+@released
+
+Defines the characteristics of a key used to access the elements of arrays 
+of fixed length objects.
+
+An object of this type can represent three categories of key, depending on 
+the constructor used:
+
+1. a descriptor key 
+
+2. a text key
+
+3. a numeric key.
+
+The Sort(), InsertIsqL(), Find() and FindIsqL() member functions of the CArrayFixFlat 
+and CArrayFixSeg class hierarchies need a TKeyArrayFix object as an argument 
+to define the location and type of key within an array element.
+
+@see CArrayFixFlat
+@see CArrayFixSeg
+*/
+	{
+public:
+	IMPORT_C TKeyArrayFix(TInt anOffset,TKeyCmpText aType);
+	IMPORT_C TKeyArrayFix(TInt anOffset,TKeyCmpText aType,TInt aLength);
+	IMPORT_C TKeyArrayFix(TInt anOffset,TKeyCmpNumeric aType);
+protected:
+	IMPORT_C virtual void Set(CBufBase* aBase,TInt aRecordLength);
+	IMPORT_C TAny* At(TInt anIndex) const;
+protected:
+	TInt iRecordLength;
+	CBufBase* iBase;
+	friend class CArrayFixBase;
+	};
+
+
+
+
+typedef CBufBase*(*TBufRep)(TInt anExpandSize);
+class CArrayFixBase : public CBase
+/**
+@publishedAll
+@released
+
+Base class for arrays of fixed length objects.
+
+It provides implementation and public functions which are common to all arrays
+of this type.
+
+The class is always derived from and is never instantiated explicitly.
+*/
+	{
+public:
+	IMPORT_C ~CArrayFixBase();
+	inline TInt Count() const;
+	inline TInt Length() const;
+	IMPORT_C void Compress();
+	IMPORT_C void Reset();
+	IMPORT_C TInt Sort(TKeyArrayFix& aKey);
+	IMPORT_C TAny* At(TInt anIndex) const;
+	IMPORT_C TAny* End(TInt anIndex) const;
+	IMPORT_C TAny* Back(TInt anIndex) const;
+	IMPORT_C void Delete(TInt anIndex);
+	IMPORT_C void Delete(TInt anIndex,TInt aCount);
+	IMPORT_C TAny* ExpandL(TInt anIndex);
+	IMPORT_C TInt Find(const TAny* aPtr,TKeyArrayFix& aKey,TInt& anIndex) const;
+	IMPORT_C TInt FindIsq(const TAny* aPtr,TKeyArrayFix& aKey,TInt& anIndex) const;
+	IMPORT_C void InsertL(TInt anIndex,const TAny* aPtr);
+	IMPORT_C void InsertL(TInt anIndex,const TAny* aPtr,TInt aCount);
+	IMPORT_C TInt InsertIsqL(const TAny* aPtr,TKeyArrayFix& aKey);
+	IMPORT_C TInt InsertIsqAllowDuplicatesL(const TAny* aPtr,TKeyArrayFix& aKey);
+	IMPORT_C void ResizeL(TInt aCount,const TAny* aPtr);
+protected:
+	IMPORT_C CArrayFixBase(TBufRep aRep,TInt aRecordLength,TInt aGranularity);
+	IMPORT_C void InsertRepL(TInt anIndex,const TAny* aPtr,TInt aReplicas);
+	IMPORT_C void SetKey(TKeyArrayFix& aKey) const;
+	IMPORT_C void SetReserveFlatL(TInt aCount);
+	IMPORT_C static TInt CountR(const CBase* aPtr);
+	IMPORT_C static const TAny* AtR(const CBase* aPtr,TInt anIndex);
+private:
+	TInt iCount;
+	TInt iGranularity;
+	TInt iLength;
+	TBufRep iCreateRep;
+	CBufBase* iBase;
+	};
+
+
+
+
+template <class T>
+class CArrayFix : public CArrayFixBase
+/**
+@publishedAll
+@released
+
+A thin templated base class for arrays of fixed length objects. 
+
+The public functions provide standard array behaviour.
+
+The class is always derived from and is never instantiated explicitly.
+*/
+	{
+public:
+	inline CArrayFix(TBufRep aRep,TInt aGranularity);
+	inline const T& operator[](TInt anIndex) const;
+	inline T& operator[](TInt anIndex);
+	inline const T& At(TInt anIndex) const;
+	inline const T* End(TInt anIndex) const;
+	inline const T* Back(TInt anIndex) const;
+	inline T& At(TInt anIndex);
+	inline T* End(TInt anIndex);
+	inline T* Back(TInt anIndex);
+	inline void AppendL(const T& aRef);
+	inline void AppendL(const T* aPtr,TInt aCount);
+	inline void AppendL(const T& aRef,TInt aReplicas);
+	inline T& ExpandL(TInt anIndex);
+	inline T& ExtendL();
+	inline TInt Find(const T& aRef,TKeyArrayFix& aKey,TInt& anIndex) const;
+	inline TInt FindIsq(const T& aRef,TKeyArrayFix& aKey,TInt& anIndex) const;
+	inline void InsertL(TInt anIndex,const T& aRef);
+	inline void InsertL(TInt anIndex,const T* aPtr,TInt aCount);
+	inline void InsertL(TInt anIndex,const T& aRef,TInt aReplicas);
+	inline TInt InsertIsqL(const T& aRef,TKeyArrayFix& aKey);
+	inline TInt InsertIsqAllowDuplicatesL(const T& aRef,TKeyArrayFix& aKey);
+	inline void ResizeL(TInt aCount);
+	inline void ResizeL(TInt aCount,const T& aRef);
+	inline const TArray<T> Array() const;
+	};
+
+
+
+
+TEMPLATE_SPECIALIZATION class CArrayFix<TAny> : public CArrayFixBase
+/**
+@publishedAll
+@released
+
+A template specialisation base class for arrays of fixed length
+untyped objects.
+
+The public functions provide standard array behaviour.
+
+The class is always derived from and is never instantiated explicitly.
+*/
+	{
+public:
+	inline CArrayFix(TBufRep aRep,TInt aRecordLength,TInt aGranularity);
+	inline const TAny* At(TInt anIndex) const;
+	inline const TAny* End(TInt anIndex) const;
+	inline const TAny* Back(TInt anIndex) const;
+	inline TAny* At(TInt anIndex);
+	inline TAny* End(TInt anIndex);
+	inline TAny* Back(TInt anIndex);
+	inline void AppendL(const TAny* aPtr);
+	inline void AppendL(const TAny* aPtr,TInt aCount);
+	inline TAny* ExtendL();
+	};
+
+
+
+
+
+template <class T>
+class CArrayFixFlat : public CArrayFix<T>
+/**
+@publishedAll
+@released
+
+Array of fixed length objects contained within a flat dynamic buffer.
+
+The elements of the array are instances of the template class T.
+
+The flat dynamic buffer is an instance of a CBufFlat.
+
+The elements can be T or R type objects and must have an accessible default 
+constructor.
+
+Note that, where possible, use the RArray<class T> class as this is more
+efficient.
+
+@see CBufFlat
+@see RArray
+*/
+	{
+public:
+	inline explicit CArrayFixFlat(TInt aGranularity);
+	inline void SetReserveL(TInt aCount);
+	};
+
+
+
+
+TEMPLATE_SPECIALIZATION class CArrayFixFlat<TAny> : public CArrayFix<TAny>
+/**
+@publishedAll
+@released
+
+An array of fixed length untyped objects using a flat dynamic buffer.
+
+The array elements are contained within a CBufFlat.
+
+The class is useful for constructing an array of fixed length buffers, where 
+the length is decided at run time.
+
+This class is also useful as a data member of a base class in a thin template 
+class/base class pair where the type of the array element is not known until 
+the owning thin template class is instantiated.
+
+@see CBufFlat
+*/
+	{
+public:
+	inline CArrayFixFlat(TInt aRecordLength,TInt aGranularity);
+	inline void SetReserveL(TInt aCount);
+	};
+
+
+
+
+TEMPLATE_SPECIALIZATION class CArrayFixFlat<TInt> : public CArrayFix<TInt>
+/**
+@publishedAll
+@released
+
+Template specialisation base class for arrays of TInt types implemented in a 
+flat dynamic buffer.
+
+@see TInt 
+*/
+	{
+public:
+	IMPORT_C explicit CArrayFixFlat(TInt aGranularity);
+	IMPORT_C ~CArrayFixFlat();
+	inline void SetReserveL(TInt aCount);
+	};
+
+
+
+
+TEMPLATE_SPECIALIZATION class CArrayFixFlat<TUid> : public CArrayFix<TUid>
+/**
+@publishedAll
+@released
+
+Template specialisation base class for arrays of TUid types implemented in a 
+flat dynamic buffer.
+
+@see TUid 
+*/
+	{
+public:
+	IMPORT_C explicit CArrayFixFlat(TInt aGranularity);
+	IMPORT_C ~CArrayFixFlat();
+	inline void SetReserveL(TInt aCount);
+	};
+
+
+
+
+template <class T>
+class CArrayFixSeg : public CArrayFix<T>
+/**
+@publishedAll
+@released
+
+Array of fixed length objects contained within a segmented buffer.
+
+The elements of the array are instances of the template class T.
+
+The segmented buffer is an instance of a CBufSeg.
+
+The elements can be T or R type objects and must have an accessible default 
+constructor.
+
+@see CBufSeg
+*/
+	{
+public:
+	inline explicit CArrayFixSeg(TInt aGranularity);
+	};
+
+
+
+
+TEMPLATE_SPECIALIZATION class CArrayFixSeg<TAny> : public CArrayFix<TAny>
+/**
+@publishedAll
+@released
+
+An array of fixed length untyped objects using a segmented dynamic buffer.
+ 
+The array elements are contained within a CBufSeg.
+
+The class is useful for constructing an array of fixed length buffers, where 
+the length is decided at run time.
+
+This class is also useful as a data member of a base class in a thin template 
+class/base class pair where the type of the array element is not known until 
+the owning thin template class is instantiated.
+
+@see CBufSeg
+*/
+	{
+public:
+	inline CArrayFixSeg(TInt aRecordLength,TInt aGranularity);
+	};
+
+
+
+
+template <class T>
+class CArrayPtr : public CArrayFix<T*>
+/**
+@publishedAll
+@released
+
+A thin templated base class for arrays of pointers to objects.
+
+The public functions contribute to standard array behaviour.
+
+The class is always derived from and is never instantiated explicitly.
+*/
+	{
+public:
+	inline CArrayPtr(TBufRep aRep,TInt aGranularity);
+    void ResetAndDestroy();
+	};
+
+
+
+
+
+template <class T>
+class CArrayPtrFlat : public CArrayPtr<T>
+/**
+@publishedAll
+@released
+
+Array of pointers to objects implemented using a flat dynamic buffer.
+
+The elements of the array are pointers to instances of the template class T
+and are contained within a CBufFlat.
+
+This type of array has the full behaviour of flat arrays but, in addition, 
+the CArrayPtr<class T>::ResetAndDestroy() function offers a way of destroying 
+all of the objects whose pointers form the elements of the array, before
+resetting the array.
+
+Note that where possible, use the RPointerArray<class T> class as this is
+more efficient.
+
+@see CBufFlat
+@see CArrayPtr::ResetAndDestroy
+@see RPointerArray
+*/
+	{
+public:
+	inline explicit CArrayPtrFlat(TInt aGranularity);
+	inline void SetReserveL(TInt aCount);
+	};
+
+
+
+
+template <class T>
+class CArrayPtrSeg : public CArrayPtr<T>
+/**
+@publishedAll
+@released
+
+Array of pointers to objects implemented using a segmented dynamic buffer. 
+
+The elements of the array are pointers to instances of the template class T
+and are contained within a CBufSeg.
+
+This type of array has the full behaviour of segmented arrays but, in addition, 
+the CArrayPtr<class T>::ResetAndDestroy() function offers a way of destroying 
+all of the objects whose pointers form the elements of the array before
+resetting the array.
+
+@see CBufSeg
+@see CArrayPtr::ResetAndDestroy
+*/
+	{
+public:
+	inline explicit CArrayPtrSeg(TInt aGranularity);
+	};
+
+
+
+
+class TKeyArrayVar : public TKey
+/**
+@publishedAll
+@released
+
+Defines the characteristics of a key used to access the elements of arrays 
+of variable length objects.
+
+An object of this type can represent three categories of key, depending on 
+the constructor used:
+
+1. a descriptor key 
+
+2. a text key
+
+3. a numeric key.
+
+The Sort(), InsertIsqL(), Find() and FindIsqL() member functions of the CArrayVarFlat 
+and CArrayVarSeg class hierarchies need a TKeyArrayVar object as an argument 
+to define the location and type of key within an array element.
+
+A TKeyArrayVar object is also required for sorting a packed array. The implementation 
+of the SortL() member function of the CArrayPakFlat class constructs a temporary 
+CArrayVarFlat object which requires the TKeyArrayVar object.
+
+@see CArrayVarFlat
+@see CArrayVarSeg
+@see CArrayPakFlat
+*/
+	{
+public:
+	IMPORT_C TKeyArrayVar(TInt anOffset,TKeyCmpText aType);
+	IMPORT_C TKeyArrayVar(TInt anOffset,TKeyCmpText aType,TInt aLength);
+	IMPORT_C TKeyArrayVar(TInt anOffset,TKeyCmpNumeric aType);
+protected:
+	IMPORT_C virtual void Set(CBufBase* aBase);
+	IMPORT_C TAny* At(TInt anIndex) const;
+protected:
+	CBufBase* iBase;
+	friend class CArrayVarBase;
+	};
+
+
+
+
+
+class CArrayVarBase : public CBase
+/**
+@publishedAll
+@released
+
+An implementation base class for variable length arrays. 
+
+It provides implementation and public functions which are common to all
+variable length type arrays.
+
+The class is always derived from and is never instantiated explicitly.
+*/
+	{
+public:
+	IMPORT_C ~CArrayVarBase();
+	inline TInt Count() const;
+	IMPORT_C TInt Length(TInt anIndex) const;
+	IMPORT_C void Compress();
+	IMPORT_C void Reset();
+	IMPORT_C TInt Sort(TKeyArrayVar& aKey);
+	IMPORT_C TAny* At(TInt anIndex) const;
+	IMPORT_C void Delete(TInt anIndex);
+	IMPORT_C void Delete(TInt anIndex,TInt aCount);
+	IMPORT_C TAny* ExpandL(TInt anIndex,TInt aLength);
+	IMPORT_C TInt Find(const TAny* aPtr,TKeyArrayVar& aKey,TInt& anIndex) const;
+	IMPORT_C TInt FindIsq(const TAny* aPtr,TKeyArrayVar& aKey,TInt& anIndex) const;
+	IMPORT_C void InsertL(TInt anIndex,const TAny* aPtr,TInt aLength);
+	IMPORT_C TInt InsertIsqL(const TAny* aPtr,TInt aLength,TKeyArrayVar& aKey);
+	IMPORT_C TInt InsertIsqAllowDuplicatesL(const TAny* aPtr,TInt aLength,TKeyArrayVar& aKey);
+protected:
+	IMPORT_C CArrayVarBase(TBufRep aRep,TInt aGranularity);
+	IMPORT_C void SetKey(TKeyArrayVar& aKey) const;
+	IMPORT_C static TInt CountR(const CBase* aPtr);
+	IMPORT_C static const TAny* AtR(const CBase* aPtr,TInt anIndex);
+private:
+	TInt iCount;
+	TInt iGranularity;
+	TBufRep iCreateRep;
+	CBufBase* iBase;
+	};
+
+
+
+
+template <class T>
+class CArrayVar : public CArrayVarBase
+/**
+@publishedAll
+@released
+
+A thin templated base class for variable length arrays.
+
+The public functions provide standard array behaviour.
+
+The class is always derived from and is never instantiated explicitly.
+*/
+	{
+public:
+	inline CArrayVar(TBufRep aRep,TInt aGranularity);
+	inline const T& operator[](TInt anIndex) const;
+	inline T& operator[](TInt anIndex);
+	inline const T& At(TInt anIndex) const;
+	inline T& At(TInt anIndex);
+	inline void AppendL(const T& aRef,TInt aLength);
+	inline T& ExpandL(TInt anIndex,TInt aLength);
+	inline T& ExtendL(TInt aLength);
+	inline TInt Find(const T& aRef,TKeyArrayVar& aKey,TInt& anIndex) const;
+	inline TInt FindIsq(const T& aRef,TKeyArrayVar& aKey,TInt& anIndex) const;
+	inline void InsertL(TInt anIndex,const T& aRef,TInt aLength);
+	inline TInt InsertIsqL(const T& aRef,TInt aLength,TKeyArrayVar& aKey);
+ 	inline TInt InsertIsqAllowDuplicatesL(const T& aRef,TInt aLength,TKeyArrayVar& aKey);
+	inline const TArray<T> Array() const;
+	};
+
+
+
+
+TEMPLATE_SPECIALIZATION class CArrayVar<TAny> : public CArrayVarBase
+/**
+@publishedAll
+@released
+
+A template specialisation base class for variable length arrays.
+
+The array buffer organisation is defined at construction.
+
+The class is useful for constructing an array of variable length buffers, 
+where the length is decided at run time.
+
+This class is also useful as a data member of a base class in a thin template 
+class/base class pair, where the type of the array element is not known until 
+the owning thin template class is instantiated.
+*/
+	{
+public:
+	inline CArrayVar(TBufRep aRep,TInt aGranularity);
+	inline const TAny* At(TInt anIndex) const;
+	inline TAny* At(TInt anIndex);
+	inline void AppendL(const TAny* aPtr,TInt aLength);
+	inline TAny* ExtendL(TInt aLength);
+	};
+
+
+
+
+template <class T>
+class CArrayVarFlat : public CArrayVar<T>
+/**
+@publishedAll
+@released
+
+Array of variable length objects implemented using a flat dynamic buffer.
+
+The elements of the array are instances of the template class T and are
+contained within their own heap cells. Pointers to the elements are maintained
+within the flat dynamic buffer, a CBufFlat.
+
+The elements can be T or R type objects and must have an accessible default 
+constructor. 
+
+@see CBufFlat
+*/
+	{
+public:
+	inline explicit CArrayVarFlat(TInt aGranularity);
+	};
+
+
+
+
+template <class T>
+class CArrayVarSeg : public CArrayVar<T>
+/**
+@publishedAll
+@released
+
+Array of variable length objects implemented using a segmented dynamic buffer. 
+
+The elements of the array are instances of the template class T and are
+contained within their own heap cells. Pointers to the elements are maintained
+within a segmented dynamic buffer, a CBufSeg.
+
+The elements can be T or R type objects and must have an accessible default 
+constructor.
+
+@see CBufSeg
+*/
+	{
+public:
+	inline explicit CArrayVarSeg(TInt aGranularity);
+	};
+
+
+
+
+class TKeyArrayPak : public TKeyArrayVar
+/**
+@publishedAll
+@released
+
+Defines the characteristics of a key used to access the elements of packed 
+arrays.
+
+An object of this type can represent three categories of key, depending on 
+the constructor used:
+
+1. a descriptor key 
+
+2. a text key
+
+3. a numeric key.
+
+The InsertIsqL(), Find() and FindIsqL() member functions of the CArrayPakFlat 
+class hierarchy need a TKeyArrayPak object as an argument to define the location 
+and type of key within an array element.
+
+Note that a TKeyArrayVar object is required for sorting a packed array. The 
+implementation of the SortL() member function of the CArrayPakFlat class constructs 
+a temporary CArrayVarFlat object which requires the TKeyArrayVar object.
+
+@see CArrayVarSeg
+@see CArrayPakFlat
+@see TKeyArrayVar
+*/
+	{
+public:
+	IMPORT_C TKeyArrayPak(TInt anOffset,TKeyCmpText aType);
+	IMPORT_C TKeyArrayPak(TInt anOffset,TKeyCmpText aType,TInt aLength);
+	IMPORT_C TKeyArrayPak(TInt anOffset,TKeyCmpNumeric aType);
+protected:
+	IMPORT_C virtual void Set(CBufBase* aBase);
+	IMPORT_C TAny* At(TInt anIndex) const;
+private:
+	TInt iCacheIndex;
+	TInt iCacheOffset;
+	friend class CArrayPakBase;
+	};
+
+
+
+
+class CArrayPakBase : public CBase
+/**
+@publishedAll
+@released
+
+An implementation base class for all variable length, packed arrays.
+
+The class is always derived from and is never instantiated explicitly.
+*/
+	{
+public:
+	IMPORT_C ~CArrayPakBase();
+	inline TInt Count() const;
+	IMPORT_C TInt Length(TInt anIndex) const;
+	IMPORT_C void Compress();
+	IMPORT_C void Reset();
+	IMPORT_C void SortL(TKeyArrayVar& aKey);
+	IMPORT_C TAny* At(TInt anIndex) const;
+	IMPORT_C void Delete(TInt anIndex);
+	IMPORT_C void Delete(TInt anIndex,TInt aCount);
+	IMPORT_C TAny* ExpandL(TInt anIndex,TInt aLength);
+	IMPORT_C TInt Find(const TAny* aPtr,TKeyArrayPak& aKey,TInt& anIndex) const;
+	IMPORT_C TInt FindIsq(const TAny* aPtr,TKeyArrayPak& aKey,TInt& anIndex) const;
+	IMPORT_C void InsertL(TInt anIndex,const TAny* aPtr,TInt aLength);
+	IMPORT_C TInt InsertIsqL(const TAny* aPtr,TInt aLength,TKeyArrayPak& aKey);
+	IMPORT_C TInt InsertIsqAllowDuplicatesL(const TAny* aPtr,TInt aLength,TKeyArrayPak& aKey);
+protected:
+	IMPORT_C CArrayPakBase(TBufRep aRep,TInt aGranularity);
+	IMPORT_C void SetKey(TKeyArrayPak& aKey) const;
+	IMPORT_C TInt GetOffset(TInt anIndex) const;
+	IMPORT_C void BuildVarArrayL(CArrayVarFlat<TAny>*& aVarFlat);
+	IMPORT_C static TInt CountR(const CBase* aPtr);
+	IMPORT_C static const TAny* AtR(const CBase* aPtr,TInt anIndex);
+private:
+	TInt iCount;
+	TInt iGranularity;
+	TBufRep iCreateRep;
+	CBufBase* iBase;
+	TInt iCacheIndex;
+	TInt iCacheOffset;
+	};
+
+
+
+
+template <class T>
+class CArrayPak : public CArrayPakBase
+/**
+@publishedAll
+@released
+
+A thin templated base class for variable length, packed, arrays.
+
+The public functions provide standard array behaviour.
+
+The class is always derived from and is never instantiated explicitly.
+*/
+	{
+public:
+	inline CArrayPak(TBufRep aRep,TInt aGranularity);
+	inline const T& operator[](TInt anIndex) const;
+	inline T& operator[](TInt anIndex);
+	inline const T& At(TInt anIndex) const;
+	inline T& At(TInt anIndex);
+	inline void AppendL(const T& aRef,TInt aLength);
+	inline T& ExpandL(TInt anIndex,TInt aLength);
+	inline T& ExtendL(TInt aLength);
+	inline TInt Find(const T& aRef,TKeyArrayPak& aKey,TInt& anIndex) const;
+	inline TInt FindIsq(const T& aRef,TKeyArrayPak& aKey,TInt& anIndex) const;
+	inline void InsertL(TInt anIndex,const T& aRef,TInt aLength);
+	inline TInt InsertIsqL(const T& aRef,TInt aLength,TKeyArrayPak& aKey);
+	inline TInt InsertIsqAllowDuplicatesL(const T& aRef,TInt aLength,TKeyArrayPak& aKey);
+	inline const TArray<T> Array() const;
+	};
+
+
+
+
+TEMPLATE_SPECIALIZATION class CArrayPak<TAny> : public CArrayPakBase
+/**
+@publishedAll
+@released
+
+A template specialisation base class for variable length, packed, arrays.
+
+The array buffer organisation is defined at construction.
+
+The class is useful for constructing an array of variable length buffers, 
+where the length is decided at run time.
+
+This class is also useful as a data member of a base class in a thin template 
+class/base class pair where the type of the array element is not known until 
+the owning thin template class is instantiated.
+*/
+	{
+public:
+	inline CArrayPak(TBufRep aRep,TInt aGranularity);
+	inline const TAny* At(TInt anIndex) const;
+	inline TAny* At(TInt anIndex);
+	inline void AppendL(const TAny* aPtr,TInt aLength);
+	inline TAny* ExtendL(TInt aLength);
+	};
+
+
+
+
+template <class T>
+class CArrayPakFlat : public CArrayPak<T>
+/**
+@publishedAll
+@released
+
+Array of variable length objects packed into a flat buffer. 
+
+The elements of the array are instances of the template class T and are
+contained within a flat dynamic buffer, a CBufFlat.
+
+The elements can be T or R type objects and must have an accessible default 
+constructor.
+
+@see CBufFlat
+*/
+	{
+public:
+	inline explicit CArrayPakFlat(TInt aGranularity);
+	};
+
+
+
+
+class CObjectCon;
+class CObject : public CBase
+/**
+@publishedAll
+@released
+
+Implements reference counting to track concurrent references to itself.
+
+An object of this type arranges automatic destruction of itself when the final 
+reference is removed.
+
+A reference counting object is any object which has CObject as its base class. 
+Constructing a CObject derived type or calling its Open() member function 
+adds a reference to that object by adding one to the reference count; calling 
+its Close() member function removes a reference by subtracting one from the 
+reference count; when the last user of the object calls Close(), the reference 
+count becomes zero and the object is automatically destroyed.
+*/
+	{
+public:
+	IMPORT_C CObject();
+	IMPORT_C ~CObject();
+	IMPORT_C virtual TInt Open();
+	IMPORT_C virtual void Close();
+	IMPORT_C virtual TName Name() const;
+	IMPORT_C virtual TFullName FullName() const;
+	IMPORT_C TInt SetName(const TDesC* aName);
+	IMPORT_C void SetNameL(const TDesC* aName);
+	inline CObject* Owner() const;
+	inline void SetOwner(CObject* anOwner);
+	inline TInt AccessCount() const;
+protected:
+	IMPORT_C virtual TInt Extension_(TUint aExtensionId, TAny*& a0, TAny* a1);
+protected:
+	inline TInt UniqueID() const;
+	inline void Inc();
+	inline void Dec();
+private:
+	TInt iAccessCount;
+	CObject* iOwner;
+	CObjectCon* iContainer;
+	HBufC* iName;
+	TAny* iSpare1;
+	TAny* iSpare2;
+	friend class CObjectCon;
+	friend class CObjectIx;
+	__DECLARE_TEST;
+	};
+
+//Forward declaration of SObjectIxRec
+struct SObjectIxRec;
+	
+class CObjectIx : public CBase
+/**
+@publishedAll
+@released
+
+Generates handle numbers for reference counting objects.
+
+This is referred to as an object index.
+
+Adding a reference counting object to an object index is the way in which 
+a unique handle number can be generated for that object. A handle number is 
+the way in which an object, which is owned or managed by another thread or 
+process can be identified.
+
+@see CObject
+*/
+	{
+public:
+	enum {
+	     /**
+	     When ORd into the handle number, indicates that the reference
+	     counting object cannot be closed.
+	     */
+         ENoClose=KHandleNoClose,
+         
+         
+         /**
+         When ORed into the handle number, indicates that the handle
+         is a local handle.
+         */
+         ELocalHandle=KHandleFlagLocal
+         };
+public:
+	IMPORT_C static CObjectIx* NewL();
+	IMPORT_C ~CObjectIx();
+	IMPORT_C TInt AddL(CObject* anObj);
+	IMPORT_C void Remove(TInt aHandle);
+	IMPORT_C CObject* At(TInt aHandle,TInt aUniqueID);
+	IMPORT_C CObject* At(TInt aHandle);
+	IMPORT_C CObject* AtL(TInt aHandle,TInt aUniqueID);
+	IMPORT_C CObject* AtL(TInt aHandle);
+	IMPORT_C TInt At(const CObject* anObject) const;
+	IMPORT_C TInt Count(CObject* anObject) const;
+	IMPORT_C CObject* operator[](TInt anIndex);
+	inline TInt Count() const;
+	inline TInt ActiveCount() const;
+protected:
+	IMPORT_C CObjectIx();
+private:
+	void UpdateState();
+private:
+	TInt iNumEntries;		// Number of actual entries in the index
+	TInt iHighWaterMark;	// points to at least 1 above the highest active index
+	TInt iAllocated;		// Max entries before realloc needed
+	TInt iNextInstance;
+	SObjectIxRec *iObjects;
+	TInt iFree;				// The index of the first free slot or -1.
+	TInt iUpdateDisabled;   // If >0, disables HWM update, reorder of the free list and memory shrinking.
+	TAny* iSpare1;
+	TAny* iSpare2;
+	};
+//
+inline TBool IsLocalHandle(TInt aHandle)
+	{return(aHandle&CObjectIx::ELocalHandle);}
+inline void SetLocalHandle(TInt &aHandle)
+	{aHandle|=CObjectIx::ELocalHandle;}
+inline void UnSetLocalHandle(TInt &aHandle)
+	{aHandle&=(~CObjectIx::ELocalHandle);}
+
+
+
+
+class CObjectCon : public CBase
+/**
+@publishedAll
+@released
+
+An object container.
+
+An object container acts as a home for a set of related reference counting 
+objects.
+
+A reference counting object, a CObject type, must be added to an object
+container. Only one instance of a given reference counting object can be
+held by an object container, i.e. each object within an object container
+must be distinct.
+
+Object containers are constructed by an object container index, a CObjectConIx 
+type. 
+
+Note that this class is not intended for user derivation.
+
+@see CObject
+@see CObjectConIx
+*/
+	{
+public:
+	IMPORT_C static CObjectCon* NewL();
+	IMPORT_C ~CObjectCon();
+	IMPORT_C void Remove(CObject* anObj);
+	IMPORT_C void AddL(CObject* anObj);
+	IMPORT_C CObject* operator[](TInt anIndex);
+	IMPORT_C CObject* At(TInt aFindHandle) const;
+	IMPORT_C CObject* AtL(TInt aFindHandle) const;
+	IMPORT_C TInt CheckUniqueFullName(const CObject* anOwner,const TDesC& aName) const;
+	IMPORT_C TInt CheckUniqueFullName(const CObject* anObject) const;
+	IMPORT_C TInt FindByName(TInt& aFindHandle,const TDesC& aMatch,TName& aName) const;
+	IMPORT_C TInt FindByFullName(TInt& aFindHandle,const TDesC& aMatch,TFullName& aFullName) const;
+	inline TInt UniqueID() const;
+	inline TInt Count() const;
+protected:
+	IMPORT_C CObjectCon(TInt aUniqueID);
+	TBool NamesMatch(const CObject* anObject, const CObject* aCurrentObject) const;
+	TBool NamesMatch(const CObject* anObject, const TName& anObjectName, const CObject* aCurrentObject) const;
+public:
+    /**
+    The object container's unique Id value.
+    */
+	TInt iUniqueID;
+private:
+	TInt iCount;
+	TInt iAllocated;
+	CObject** iObjects;
+	TAny* iSpare1;
+	TAny* iSpare2;
+	friend class CObjectConIx;
+	};
+
+
+
+
+class CObjectConIx : public CBase
+/**
+@publishedAll
+@released
+
+A container for object containers
+
+This is referred to as a container index.
+
+The class provides the mechanism through which object containers, CObjectCon 
+types, are created.
+
+@see CObjectCon
+@see CObject
+*/
+	{
+#ifndef	SYMBIAN_ENABLE_SPLIT_HEADERS
+protected:
+    /**
+    @internalComponent
+    */
+	enum {ENotOwnerID};
+#endif
+	
+public:
+	IMPORT_C static CObjectConIx* NewL();
+	IMPORT_C ~CObjectConIx();
+	IMPORT_C CObjectCon* Lookup(TInt aFindHandle) const;
+	IMPORT_C CObjectCon* CreateL();
+	IMPORT_C void Remove(CObjectCon* aCon);
+protected:
+	IMPORT_C CObjectConIx();
+	IMPORT_C void CreateContainerL(CObjectCon*& anObject);
+private:
+	CObjectCon* LookupByUniqueId(TInt aUniqueId) const;
+private:
+	TInt iCount;
+	TInt iAllocated;
+	TUint16 iNextUniqueID;
+	TUint16 iUniqueIDHasWrapped;
+	CObjectCon** iContainers;
+	TAny* iSpare1;
+	TAny* iSpare2;
+	};
+
+// Forward Declaration of TCleanupStackItem
+class TCleanupStackItem;
+
+
+
+
+/**
+@publishedAll
+@released
+
+Defines a function which takes a single argument of type TAny* and returns 
+void.
+
+An argument of this type is required by the constructors of a TCleanupItem 
+object.
+*/
+typedef void (*TCleanupOperation)(TAny*);
+
+
+
+
+class TCleanupItem
+/**
+@publishedAll
+@released
+
+Encapsulates a cleanup operation and an object on which the operation
+is to be performed.
+
+The class allows cleanup to be more sophisticated than simply deleting objects,
+for example, releasing access to some shared resource.
+*/
+	{
+public:
+	inline TCleanupItem(TCleanupOperation anOperation);
+	inline TCleanupItem(TCleanupOperation anOperation,TAny* aPtr);
+private:
+	TCleanupOperation iOperation;
+	TAny* iPtr;
+	friend class TCleanupStackItem;
+	};
+
+
+
+
+class CCleanup : public CBase
+/**
+@publishedAll
+@released
+
+Implements the cleanup stack.
+
+An object of this type is created and used by the cleanup stack
+interface, CTrapCleanup.
+*/
+	{
+public:
+	IMPORT_C static CCleanup* New();
+	IMPORT_C static CCleanup* NewL();
+	IMPORT_C ~CCleanup();
+	IMPORT_C void NextLevel();
+	IMPORT_C void PreviousLevel();
+	IMPORT_C void PushL(TAny* aPtr);
+	IMPORT_C void PushL(CBase* anObject);
+	IMPORT_C void PushL(TCleanupItem anItem);
+	IMPORT_C void Pop();
+	IMPORT_C void Pop(TInt aCount);
+	IMPORT_C void PopAll();
+	IMPORT_C void PopAndDestroy();
+	IMPORT_C void PopAndDestroy(TInt aCount);
+	IMPORT_C void PopAndDestroyAll();
+	IMPORT_C void Check(TAny* aExpectedItem);
+protected:
+	IMPORT_C void DoPop(TInt aCount,TBool aDestroy);
+	IMPORT_C void DoPopAll(TBool aDestroy);
+protected:
+	IMPORT_C CCleanup();
+protected:
+	/**
+	Pointer to the bottom of the cleanup stack.
+	*/
+	TCleanupStackItem* iBase;
+	
+	
+	/**
+	Pointer to the top of the cleanup stack.
+	*/
+	TCleanupStackItem* iTop;
+	
+	
+	/**
+	Pointer to the next availaible slot in the cleanup stack.
+	*/
+	TCleanupStackItem* iNext;
+	};
+
+
+
+
+NONSHARABLE_CLASS(TCleanupTrapHandler) : public TTrapHandler
+/**
+@publishedAll
+@released
+
+Implementation for a handler to work with the TRAP mechanism.
+
+This class does not normally need to be used or accessed directly by applications 
+and third party code.
+*/
+	{
+public:
+	TCleanupTrapHandler();
+	virtual void Trap();
+	virtual void UnTrap();
+	
+	virtual void Leave(TInt aValue);
+	inline CCleanup& Cleanup();
+private:
+	CCleanup* iCleanup;
+	friend class CTrapCleanup;
+	};
+
+
+
+
+template <class T>
+class TAutoClose
+/**
+@publishedAll
+@released
+
+Automatically calls Close() on an object when that object goes out of scope.
+
+The behaviour takes advantage of the fact that the compiler automatically 
+destroys objects that go out of scope.
+*/
+	{
+public:
+	inline ~TAutoClose();
+	inline void PushL();
+	inline void Pop();
+private:
+	static void Close(TAny *aObj);
+public:
+	/**
+	An instance of the template class.
+	*/
+	T iObj;
+	};
+
+
+
+
+class CTrapCleanup : public CBase
+/**
+@publishedAll
+@released
+
+Cleanup stack interface. 
+
+The creation and destruction of a cleanup stack is done automatically by GUI 
+applications and servers.
+*/
+	{
+public:
+	IMPORT_C static CTrapCleanup* New();
+	IMPORT_C ~CTrapCleanup();
+protected:
+	IMPORT_C CTrapCleanup();
+private:
+	TCleanupTrapHandler iHandler;
+	TTrapHandler* iOldHandler;
+	};
+
+
+
+
+class CCirBufBase : public CBase
+/**
+@publishedAll
+@released
+
+Base class for circular buffers.
+
+The class is part of the implementation of circular buffers and is never
+instantiated. 
+
+The class provides member functions that form part of the interface.
+*/
+	{
+public:
+	IMPORT_C ~CCirBufBase();
+	inline TInt Count() const;
+	inline TInt Length() const;
+	IMPORT_C void SetLengthL(TInt aLength);
+	IMPORT_C void Reset();
+protected:
+	IMPORT_C CCirBufBase(TInt aSize);
+	IMPORT_C TInt DoAdd(const TUint8* aPtr);
+	IMPORT_C TInt DoAdd(const TUint8* aPtr,TInt aCount);
+	IMPORT_C TInt DoRemove(TUint8* aPtr);
+	IMPORT_C TInt DoRemove(TUint8* aPtr,TInt aCount);
+protected:
+	TInt iCount;
+	TInt iSize;
+	TInt iLength;
+	TUint8* iPtr;
+	TUint8* iPtrE;
+	TUint8* iHead;
+	TUint8* iTail;
+	};
+
+
+
+
+template <class T>
+class CCirBuf : public CCirBufBase
+/**
+@publishedAll
+@released
+
+A circular buffer containing objects of a type defined by the
+template parameter.
+*/
+	{
+public:
+	inline CCirBuf();
+#if defined(__VC32__)
+	inline ~CCirBuf() {}
+#endif
+	inline TInt Add(const T* aPtr);
+	inline TInt Add(const T* aPtr,TInt aCount);
+	inline TInt Remove(T* aPtr);
+	inline TInt Remove(T* aPtr,TInt aCount);
+	};
+
+
+
+
+class CCirBuffer : public CCirBuf<TUint8>
+/**
+@publishedAll
+@released
+
+Circular buffer of unsigned 8-bit integers. 
+
+The integer values range from 0 to 255.
+*/
+	{
+public:
+	IMPORT_C CCirBuffer();
+	IMPORT_C ~CCirBuffer();
+	IMPORT_C TInt Get();
+	IMPORT_C TInt Put(TInt aVal);
+	};
+//
+
+
+
+class CActive : public CBase
+/**
+@publishedAll
+@released
+
+The core class of the active object abstraction.
+
+It encapsulates both the issuing of a request to an asynchronous service provider 
+and the handling of completed requests. An application can have one or more 
+active objects whose processing is controlled by an active scheduler.
+*/
+	{
+public:
+
+/**
+Defines standard priorities for active objects.
+*/
+enum TPriority
+	{
+	/**
+	A low priority, useful for active objects representing
+	background processing.
+	*/
+	EPriorityIdle=-100,
+	
+	
+	/**
+	A priority higher than EPriorityIdle but lower than EPriorityStandard.
+	*/
+	EPriorityLow=-20,
+	
+	
+	/**
+	Most active objects will have this priority.
+	*/
+	EPriorityStandard=0,
+
+
+	/**
+	A priority higher than EPriorityStandard; useful for active objects
+	handling user input.
+	*/
+	EPriorityUserInput=10,
+	
+	
+	/**
+	A priority higher than EPriorityUserInput.
+	*/
+	EPriorityHigh=20,
+	};
+public:
+	IMPORT_C ~CActive();
+	IMPORT_C void Cancel();
+	IMPORT_C void Deque();
+	IMPORT_C void SetPriority(TInt aPriority);
+	inline TBool IsActive() const;
+	inline TBool IsAdded() const;
+	inline TInt Priority() const;
+protected:
+	IMPORT_C CActive(TInt aPriority);
+	IMPORT_C void SetActive();
+
+
+    /**
+    Implements cancellation of an outstanding request.
+	
+	This function is called as part of the active object's Cancel().
+	
+	It must call the appropriate cancel function offered by the active object's 
+	asynchronous service provider. The asynchronous service provider's cancel 
+	is expected to act immediately.
+	
+	DoCancel() must not wait for event completion; this is handled by Cancel().
+	
+	@see CActive::Cancel
+	*/
+	virtual void DoCancel() =0;
+
+
+	/**
+	Handles an active object's request completion event.
+	
+	A derived class must provide an implementation to handle the
+	completed request. If appropriate, it may issue another request.
+	
+	The function is called by the active scheduler when a request
+	completion event occurs, i.e. after the active scheduler's
+	WaitForAnyRequest() function completes.
+	
+	Before calling this active object's RunL() function, the active scheduler 
+	has:
+	
+	1. decided that this is the highest priority active object with
+	   a completed request
+	
+    2. marked this active object's request as complete (i.e. the request is no 
+	   longer outstanding)
+	
+	RunL() runs under a trap harness in the active scheduler. If it leaves,
+	then the active scheduler calls RunError() to handle the leave.
+	
+	Note that once the active scheduler's Start() function has been called, 
+	all user code is run under one of the program's active object's RunL() or 
+	RunError() functions.
+	
+	@see CActiveScheduler::Start
+	@see CActiveScheduler::Error
+	@see CActiveScheduler::WaitForAnyRequest
+	@see TRAPD
+	*/
+	virtual void RunL() =0;
+	IMPORT_C virtual TInt RunError(TInt aError);
+protected:
+	IMPORT_C virtual TInt Extension_(TUint aExtensionId, TAny*& a0, TAny* a1);
+public:
+	
+	/**
+	The request status associated with an asynchronous request.
+	
+	This is passed as a parameter to all asynchronous service providers.
+	
+	The active scheduler uses this to check whether the active object's request 
+	has completed.
+	
+	The function can use the completion code to judge the success or otherwise 
+	of the request.
+	*/
+	TRequestStatus iStatus;
+private:
+//	TBool iActive;
+	TPriQueLink iLink;
+	TAny* iSpare;
+	friend class CActiveScheduler;
+	friend class CServer;
+	friend class CServer2;
+	};
+
+
+
+
+class CIdle : public CActive
+/**
+@publishedAll
+@released
+
+An active object that performs low-priority processing when no higher-priority 
+active objects are ready to run.
+
+An idle time active object together with its associated callback function 
+may be used to implement potentially long running background tasks, such as 
+spreadsheet recalculation and word processor repagination.
+*/
+	{
+public:
+	IMPORT_C static CIdle* New(TInt aPriority);
+	IMPORT_C static CIdle* NewL(TInt aPriority);
+	IMPORT_C ~CIdle();
+	IMPORT_C void Start(TCallBack aCallBack);
+protected:
+	IMPORT_C CIdle(TInt aPriority);
+	IMPORT_C void RunL();
+	IMPORT_C void DoCancel();
+protected:
+	
+	/**
+	The callback object that encapsulates the background task.
+	
+	@see Start
+	*/
+	TCallBack iCallBack;
+	};
+
+
+
+
+class CAsyncOneShot : public CActive
+/**
+@publishedAll
+@released
+
+An active object that performs processing that is only performed once.
+
+The active object is intended to be given a low priority, so that it runs 
+only when no higher-priority active objects are ready to run. In addition, 
+the class ensures that the current thread cannot be closed until the active 
+object is destroyed.
+
+The class needs to be derived from to make use of its behaviour, in particular, 
+it needs to define and implement a RunL() function.
+
+NB: the constructor creates a process-relative handle to the current thread 
+and this is stored within this object. If the thread subsequently dies abnormally, 
+then this handle will not be closed, and the thread will not be destroyed 
+until the process terminates.
+
+NB: if Call() is called from a different thread (for example, to implement 
+a kind of inter-thread communication), a client-specific mechanism must be 
+used to ensure that the thread that created this object is still alive.
+
+NB: if the thread that created this object has its own heap and terminates 
+abnormally, then the handle stored within this object is lost.
+
+@see CActive::RunL
+@see CAsyncOneShot::Call
+*/
+	{
+public:
+	IMPORT_C CAsyncOneShot(TInt aPriority);
+	IMPORT_C virtual void DoCancel();
+	IMPORT_C virtual void Call();
+	IMPORT_C virtual ~CAsyncOneShot();
+	inline RThread& Thread();
+private:
+	void Setup();
+	RThread iThread;
+	};
+
+
+
+
+class CAsyncCallBack : public CAsyncOneShot
+/**
+@publishedAll
+@released
+
+An active object that performs its processing through an associated call back 
+function, and which is only performed once.
+*/
+	{
+public:
+	IMPORT_C CAsyncCallBack(TInt aPriority);
+	IMPORT_C CAsyncCallBack(const TCallBack& aCallBack, TInt aPriority);
+	IMPORT_C void Set(const TCallBack& aCallBack);
+	IMPORT_C void CallBack();
+	IMPORT_C virtual ~CAsyncCallBack();
+protected:
+	virtual void RunL();
+//
+protected:
+	/**
+	The callback object that encapsulates the callback function.
+	*/
+	TCallBack iCallBack;
+	};
+
+
+
+
+class TDeltaTimerEntry
+/**
+@publishedAll
+@released
+
+A timed event entry.
+
+An object of this type is added to a queue of timed events, as represented 
+by a CDeltaTimer object. It represents a call back function that is called 
+when the associated timed event expires.
+
+@see CDeltaTimer
+*/
+	{
+	friend class CDeltaTimer;
+public:
+	inline TDeltaTimerEntry(TCallBack& aCallback);
+	inline TDeltaTimerEntry();
+	inline void Set(TCallBack& aCallback);
+private:
+	TCallBack iCallBack; 
+	TTickCountQueLink iLink;
+	};
+	
+	
+	
+
+class CDeltaTimer : public CActive
+/**
+@publishedAll
+@released
+
+A queue of timed events.
+
+A timed event is a callback function encapsulated by a TDeltaTimerEntry object, 
+and is intended to be called when the time interval represented by the event 
+expires.
+
+The queue itself is a TDeltaQue list. A timed event entry is added into a 
+position in the queue that is determined by the time interval specified for 
+that event. Although the time interval for a timed event is specified as an 
+interval from the present moment, when added to the queue the implementation 
+treats each event as having an interval from the previous timed event (or now).
+
+CDeltaTimer is an active object, driven by an RTimer which is usually set to
+expire upon completion of the event at the head of the queue.  If the time to
+the next event is too great or an event at the head of the queue has been
+removed, the timer may be set to expire prior to the event at the head of the
+queue (if any).
+
+When the timer completes, the head of the queue is inspected to see whether
+the timed event at the head of the queue has expired.  On expiry, the callback
+function represented by that timed event is called, and the timed event entry
+is removed from the queue.  The queue then inspects further events for expiry,
+calling and removing them as necessary until either the queue is empty or there
+is an event in the future to wait for.
+
+Note that the tick period is the minimum time interval for an event and the
+granularity of all timings using the queue.  Note that in general, any event
+may be called back some time after it has expired and that specifically the
+duration of all events will at least be rounded up to a muliple of the tick
+period.
+
+
+@see TDeltaTimerEntry
+@see TDeltaQue
+@see RTimer
+*/
+	{
+public:
+	// Queue management
+	IMPORT_C virtual void Queue(TTimeIntervalMicroSeconds32 aTimeInMicroSeconds, TDeltaTimerEntry& aEntry);
+	IMPORT_C virtual void Remove(TDeltaTimerEntry& aEntry);
+	IMPORT_C TInt QueueLong(TTimeIntervalMicroSeconds aTimeInMicroSeconds, TDeltaTimerEntry& aEntry);
+
+	// Factory functions
+	IMPORT_C static CDeltaTimer* NewL(TInt aPriority);
+	IMPORT_C static CDeltaTimer* NewL(TInt aPriority, TTimeIntervalMicroSeconds32 aGranularity);
+
+	// Destructor
+	~CDeltaTimer();
+
+private:
+	// Construction
+	CDeltaTimer(TInt aPriority, TInt aTickPeriod);
+
+	// From CActive	
+	void DoCancel();
+	void RunL();
+
+	// Utility
+	void Activate(TBool aRequeueTimer = EFalse);
+
+private:	
+	/**
+	The asynchronous timer.
+	*/
+	RTimer iTimer;
+	
+	/**
+	The list of timed event entries.
+	*/
+	TTickCountQue iQueue;
+	
+	/**
+	The period of a tick count.
+	*/
+	const TInt iTickPeriod;
+	
+	/**
+	Pseudo-lock on the the queue to avoid reentrancy problems
+	*/
+	TBool iQueueBusy;
+	};
+
+
+
+
+class CTimer : public CActive
+/**
+@publishedAll
+@released
+
+Base class for a timer active object.
+
+This is an active object that uses the asynchronous services provided by RTimer, 
+to generate events. These events occur either at a specific time specified 
+as a TTime, or after an interval specified in microseconds.
+
+The RunL() virtual member function is called by the active scheduler after 
+this event occurs.
+
+To write a class derived from CTimer, first define and implement a constructor 
+through which the priority of the CTimer active object can be specified. Then 
+define and implement a suitable RunL() function to handle the completion of 
+a timer request. This function is not defined by CTimer itself and must, therefore, 
+be provided by the derived class.
+
+This class is ultimately implemented in terms of the nanokernel tick, and
+therefore the granularity of the generated events is limited to the period of
+this timer.  This is variant specific, but is usually 1 millisecond.
+
+Note that the CPeriodic and CHeartbeat classes are derived from CTimer, and 
+answer most timing needs.
+
+@see CHeartbeat
+@see CPeriodic
+@see CHeartbeat
+*/
+	{
+public:
+	IMPORT_C ~CTimer();
+	IMPORT_C void At(const TTime& aTime);
+	IMPORT_C void AtUTC(const TTime& aTimeInUTC);
+	IMPORT_C void After(TTimeIntervalMicroSeconds32 anInterval);
+	IMPORT_C void Lock(TTimerLockSpec aLock);
+	IMPORT_C void Inactivity(TTimeIntervalSeconds aSeconds);
+	IMPORT_C void HighRes(TTimeIntervalMicroSeconds32 aInterval);
+protected:
+	IMPORT_C CTimer(TInt aPriority);
+	IMPORT_C void ConstructL();
+	IMPORT_C void DoCancel();
+private:
+	RTimer iTimer;
+	};
+
+
+
+
+class CPeriodic : public CTimer
+/**
+@publishedAll
+@released
+
+Periodic timer active object. 
+
+This class generates regular timer events and handles them with a callback 
+function. The callback is specified as a parameter to Start().
+
+The callback may not be called immediately after the signal from the timer 
+request has been generated, for the following reasons:
+
+1. the RunL() of another active object may be running at the time of the signal
+
+2. other active objects may have a higher priority than the CPeriodic
+
+If timing accuracy is important to your application, you can minimise the 
+first problem by ensuring all RunL()s complete quickly, and can eliminate 
+the second by giving the CPeriodic a higher priority than any other active 
+object. Although it is generally recommended that timer-related active objects 
+have a high priority, this will not address the problem of CPeriodic timers 
+running behind, because active object scheduling is not pre-emptive.
+
+After a timer signal generated by a CPeriodic, the next signal is requested 
+just before running the callback, and this request can be delayed for the 
+same reasons that running the callback can be delayed. Therefore, a large 
+number N of periods may add up to somewhat more than N times the requested 
+period time. If absolute precision is required in tracking time, do not rely 
+on counting the number of times the callback is called: read the value of 
+the system clock every time you need it.
+
+For many applications, such precision is not required, for example, tick 
+counting is sufficiently accurate for controlling time-outs in a communications 
+program.
+
+Note that you should be familiar with CActive in order to understand
+CPeriodic behaviour, but not necessarily with CTimer.
+
+@see CHeartbeat
+*/
+	{
+public:
+	IMPORT_C static CPeriodic* New(TInt aPriority);
+	IMPORT_C static CPeriodic* NewL(TInt aPriority);
+	IMPORT_C ~CPeriodic();
+	IMPORT_C void Start(TTimeIntervalMicroSeconds32 aDelay,TTimeIntervalMicroSeconds32 anInterval,TCallBack aCallBack);
+protected:
+	IMPORT_C CPeriodic(TInt aPriority);
+	IMPORT_C void RunL();
+private:
+	TTimeIntervalMicroSeconds32 iInterval;
+	TCallBack iCallBack;
+	};
+
+
+
+
+class MBeating
+/**
+@publishedAll
+@released
+
+Heartbeat timer call-back handling interface.
+
+The interface provides a pair of functions to handle the beating and
+synchronisation of heartbeat timers.
+
+The CHeartbeat active object class uses an object implementing the MBeating 
+interface.
+
+@see CHeartbeat::Start
+*/
+	{
+public:
+	/**
+	Handles a regular heartbeat timer event.
+	
+	This type of event is one where the timer completes in synchronisation
+	with the system clock.
+	*/
+	virtual void Beat() =0;
+	
+	/**
+	Synchronises the heartbeat timer with system clock. 
+	
+	This function handles a heartbeat timer event where the timer completes out 
+	of synchronisation with the system clock, (i.e. one or more heartbeats have 
+	been missed).
+	*/
+	virtual void Synchronize() =0;
+	};
+
+
+
+
+class CHeartbeat : public CTimer
+/**
+@publishedAll
+@released
+
+Heatbeat timer.
+
+This class generates regular heartbeat events on a fixed fraction of a second. 
+It is more accurate than a CPeriodic timer, because it provides a function 
+to restore timer accuracy if it gets out of synchronisation with the system 
+clock.
+
+The protected RunL() function is called when the timer completes. The RunL() 
+function in turn calls either the MBeating::Beat() or the MBeating::Synchronize() 
+functions; MBeating is specified as a parameter to the Start() function 
+used to start the heartbeat timer.
+
+The relevant MBeating function may not be called immediately after the signal 
+from the timer request has been generated, for the following reasons:
+
+1. the RunL() of another active object may be running at the time of the signal
+
+2. other active objects may have a higher priority than the CHeartbeat
+
+If no heartbeat is missed, then the Beat() function is called.
+
+If one or more heartbeats are missed then the Synchronize() function is called. 
+It is important to bear in mind that the machine might be switched off after 
+a few beats of the heart, and then Synchronize() will be called several days 
+later. It is therefore essential that synchronisation is achieved as quickly 
+as possible, rather than trying to catch up a tick at a time. In the context 
+of an analogue clock, for instance, the clock should just redraw itself with 
+the current time - rather than moving the hands round in steps until the time 
+is correct.
+
+CHeartbeat is an active object, derived from CActive (via CTimer). You should 
+be familiar with CActive in order to understand CHeartbeat behaviour, but 
+not necessarily with CTimer.
+
+@see MBeating
+*/
+	{
+public:
+	IMPORT_C static CHeartbeat* New(TInt aPriority);
+	IMPORT_C static CHeartbeat* NewL(TInt aPriority);
+	IMPORT_C ~CHeartbeat();
+	IMPORT_C void Start(TTimerLockSpec aLock,MBeating *aBeating);
+protected:
+	IMPORT_C CHeartbeat(TInt aPriority);
+	IMPORT_C void RunL();
+private:
+	TTimerLockSpec iLock;
+	MBeating *iBeating;
+	};
+//
+
+class CServer2;
+
+
+
+
+/**
+@publishedAll
+@released
+
+Represents a session (version 2) for a client thread on the server-side.
+
+A session acts as a channel of communication between the client and the server.
+A client thread can have multiple concurrent sessions with a server.
+
+A session can be:
+- restricted to the creating thread
+- can be shared with other threads in the same process
+- can be shared by all threads in the system.
+
+A server must define and implement a derived class. In particular, 
+it must provide an implementation for the ServiceL() virtual function.
+
+(Note that this class should be used instead of CSession)
+*/
+class CSession2 : public CBase
+	{
+	friend class CServer2;
+public:
+	IMPORT_C virtual ~CSession2() =0;
+private:
+	IMPORT_C virtual void CreateL(); // Default method, does nothing
+public:
+	inline const CServer2* Server() const;
+	IMPORT_C void ResourceCountMarkStart();
+	IMPORT_C void ResourceCountMarkEnd(const RMessage2& aMessage);
+	IMPORT_C virtual TInt CountResources();
+
+    /**
+    Handles the servicing of a client request that has been passed
+    to the server.
+
+    This function must be implemented in a derived class. The details of
+    the request are contained within the message.
+
+	@param aMessage The message containing the details of the client request.
+    */
+	virtual void ServiceL(const RMessage2& aMessage) =0;
+	IMPORT_C virtual void ServiceError(const RMessage2& aMessage,TInt aError);
+protected:
+	IMPORT_C CSession2();
+	IMPORT_C virtual void Disconnect(const RMessage2& aMessage);
+	IMPORT_C virtual TInt Extension_(TUint aExtensionId, TAny*& a0, TAny* a1);
+public:
+    /**
+    @internalComponent
+    */
+	enum TPanicNo {ESesCountResourcesNotImplemented=1,ESesFoundResCountHeaven};
+
+private:
+	TInt iResourceCountMark;
+	TDblQueLink iLink;
+	const CServer2* iServer;
+	TAny* iSpare;
+	};
+
+/**
+@publishedAll
+@released
+
+Abstract base class for servers (version 2).
+
+This is an active object. It accepts requests from client threads and forwards
+them to the relevant server-side client session. It also handles the creation
+of server-side client sessions as a result of requests from client threads.
+
+A server must define and implement a derived class.
+
+(Note that this class should be used instead of CServer)
+*/
+class CServer2 : public CActive
+	{
+public:
+    /**
+    Defines the set of session types that the server can create.
+    
+    A specific session type is specified when the CServer2 object is created. 
+    */
+	enum TServerType
+		{
+		/**
+		The session is not sharable with other threads.
+		*/
+		EUnsharableSessions = EIpcSession_Unsharable,
+
+		/**
+		The session is sharable with other threads in the same process.
+		*/
+		ESharableSessions = EIpcSession_Sharable,
+
+		/**
+		The session is sharable with all other threads in the system.
+		*/
+		EGlobalSharableSessions = EIpcSession_GlobalSharable,
+		};
+public:
+	IMPORT_C virtual ~CServer2() =0;
+	IMPORT_C TInt Start(const TDesC& aName);
+	IMPORT_C void StartL(const TDesC& aName);
+	IMPORT_C void ReStart();
+	
+	/**
+	Gets a handle to the server.
+	
+	Note that the RServer2 object is classified as Symbian internal, and its
+	member functions cannot be acessed. However, the handle can be passed
+	to the RSessionBase::CreateSession() variants that take a server handle.
+	
+	@return The handle to the server.
+	*/
+	inline RServer2 Server() const { return iServer; }
+protected:
+	inline const RMessage2& Message() const;
+	IMPORT_C CServer2(TInt aPriority, TServerType aType=EUnsharableSessions);
+	IMPORT_C void DoCancel();
+	IMPORT_C void RunL();
+	IMPORT_C TInt RunError(TInt aError);
+	IMPORT_C virtual void DoConnect(const RMessage2& aMessage);
+	IMPORT_C virtual TInt Extension_(TUint aExtensionId, TAny*& a0, TAny* a1);
+private:
+    
+    /**
+    Creates a server-side session object.
+
+    The session represents a communication link between a client and a server,
+    and its creation is initiated by the client through a call to one of
+    the RSessionBase::CreateSession() variants. 
+
+    A server must provide an implementation, which as a minimum should:
+
+    - check that the version of the server is compatible with the client by
+      comparing the client supplied version number against the server's version
+      number; it should leave if there is incompatibility.
+
+    - construct and return the server side client session object.
+
+    @param aVersion The version information supplied by the client. 
+    @param aMessage Represents the details of the client request that is requesting
+                    the creation of the session.
+    
+    @return A pointer to the newly created server-side session object. 
+    
+    @see User::QueryVersionSupported()
+    */
+	IMPORT_C virtual CSession2* NewSessionL(const TVersion& aVersion,const RMessage2& aMessage) const =0;
+	void Connect(const RMessage2& aMessage);
+	void DoConnectL(const RMessage2& aMessage,CSession2* volatile& aSession);
+public:
+
+	/**
+    @internalComponent
+    */
+	enum TPanic
+		{
+		EBadMessageNumber,
+		ESessionNotConnected,
+		ESessionAlreadyConnected,
+		EClientDoesntHaveRequiredCaps,
+		};
+
+private:
+	TInt iSessionType;
+	RServer2 iServer;
+	RMessage2 iMessage;
+	TAny* iSpare;
+	TDblQue<CSession2> iSessionQ;
+	
+protected:
+	TDblQueIter<CSession2> iSessionIter;
+private:
+	void Disconnect(const RMessage2& aMessage);
+	static void BadMessage(const RMessage2& aMessage);
+	static void NotConnected(const RMessage2& aMessage);
+	friend class CPolicyServer;
+	};
+
+
+
+/**
+A security policy framework built on top of the normal CServer2 class.
+
+The two major functions of the Policy Server framework are to check a received
+message against a security policy and then to perform an action depending on
+the result of this check. The exact behaviour is defined by the contents of
+the TPolicy structure given in the constructor for CPolicyServer. 
+
+The processing performed when a server receives a message are describe below.
+This should aid understanding of the interaction of the TPolicy structure and
+virtual member functions which may be implemented by classes derived from CPolicyServer.
+
+Checking the Security Policy
+
+On receipt of a message, the message function number is used to search the
+list of ranges pointed to by TPolicy::iRanges. This yields a range
+number R, which is between 0 and TPolicy::iRangeCount-1.
+The policy index, X, for this range is then fetched from TPolicy::iElementsIndex[R].
+If the message is a Connect message, then X is fetched directly from TPolicy::iOnConnect
+instead.
+
+The further action taken is determined by the value of X.
+-	If X==TSpecialCase::EAlwaysPass,
+	the message is processed as normal; either by passing it to the ServiceL()
+	method of a session, or, in the case of a connection message, a new session
+	is created.
+-	If X==TSpecialCase::ENotSupported,
+	the message is completed with KErrNotSupported.
+-	If X==TSpecialCase::ECustomCheck,
+	a call to the virtual function CustomSecurityCheckL() is made. The implementation
+	of this method must return one of the TCustomResult enumerations which determine
+	what further action is to be taken:
+	-	TCustomResult::EPass 
+		The message is processed as normal; either by passing it to the ServiceL()
+		method of a session, or, in the case of a connection message, a new session
+		is created.
+	-	TCustomResult::EFail 
+		This causes CheckFailedL() to be called with the action specified by the
+		aAction reference given to CustomSecurityCheckL() (This defaults to
+		TFailureAction::EFailClient.)
+	-	TCustomResult::EAsync 
+		The derived class is responsible for further processing of the message,
+		the Policy Server framework will do nothing more with it.
+-	If X < TSpecialCase::ESpecialCaseHardLimit,
+		X is taken as an index into the array of TPolicyElement objects pointed
+		to by TPolicy::iElements. The platform security attributes of the process
+		which sent the message being processed are checked against the security
+		policy specified in this TPolicyElement. If the process possesses all of
+		the attributes specified then the message processed as normal. Otherwise,
+		CheckFailedL() is called with the action value specified in the TPolicyElement .
+
+Handling Policy Check Failure
+
+The CheckFailedL() method is called when a security check has failed. It performs
+an action according to the aAction value given to it:
+
+-	If aAction==TFailureAction::EFailClient, the message is completed with
+	KErrPermissionDenied.
+-	If aAction==TFailureAction::EPanicClient, the client thread is panicked.
+-	If aAction < 0 a call to the virtual function CustomFailureActionL() is made.
+	The implementation of this method must return one of the TCustomResult
+	enumerations which determine what further action is to be taken:
+	-	TCustomResult::EPass 
+		The message is processed as normal; either by passing it to the ServiceL()
+		method of a session, or, in the case of a connection message, a new session
+		is created.
+	-	TCustomResult::EFail 
+		The message is completed with KErrPermissionDenied.
+	-	TCustomResult::EAsync 
+		The derived class is responsible for further processing of the message,
+		the Policy Server framework will do nothing more with it.
+
+@publishedAll
+@released
+*/
+class CPolicyServer : public CServer2
+	{
+public:
+	/** Enumeration specifying action to take if a security check fails.
+	Values >= 0 are handled by CheckFailedL().  Values < 0 are specific to the
+	derived implementation of the policy server and will result in a call to
+	CustomFailureActionL() if a security check fails.  Attempts to use undefined
+	values >= 0 will result in a panic in CheckFailedL().
+	*/
+	enum TFailureAction
+		{
+		EFailClient	= 0,	/**< Complete message with KErrPermissionDenied */
+		EPanicClient= 1,	/**< Panic client */
+		};
+
+	/** Enumeration of acceptable return codes from both of
+	CustomSecurityCheckL() and CustomFailureActionL().  Results of EPass or EFail
+	are handled by the CPolicyServer framework.  No other action is required on
+	the part of the derived implementation.  However, results of EAsync imply
+	that the derived implementation will call the appropriate function once the
+	result is known.  See CustomSecurityCheckL() and CustomFailureActionL for
+	more information.
+	*/
+	enum TCustomResult
+		{
+		EPass = 0,	/**< Security check passed. */
+		EFail = 1,	/**< Security check failed. */
+		EAsync = 2,	/**< Security checking will be performed asynchronously. */
+		};
+
+	/** Class specifying a security check and the action to take
+
+	If iAction is >=0 it must be a member of TFailureAction
+	If iAction is <0 it is assumed to specify a custom action specific to the
+	derived implementation.  In this case, CustomFailureActionL must be implemented
+	by the derived class.
+	*/
+	class TPolicyElement
+		{
+	public:
+		/** Security policy to check against the client which sent a message.
+
+		This class can specify a security policy consisting of either:
+
+		-#	A check for between 0 and 7 capabilities
+		-#	A check for a given Secure ID along with 0-3 capabilities
+		-#	A check for a given Vendor ID along with 0-3 capabilities
+
+		This member should only be initialised by one of the following macros:
+
+		-	_INIT_SECURITY_POLICY_PASS
+		-	_INIT_SECURITY_POLICY_FAIL
+		-	_INIT_SECURITY_POLICY_C1
+		-	_INIT_SECURITY_POLICY_C2
+		-	_INIT_SECURITY_POLICY_C3
+		-	_INIT_SECURITY_POLICY_C4
+		-	_INIT_SECURITY_POLICY_C5
+		-	_INIT_SECURITY_POLICY_C6
+		-	_INIT_SECURITY_POLICY_C7
+		-	_INIT_SECURITY_POLICY_S0
+		-	_INIT_SECURITY_POLICY_S1
+		-	_INIT_SECURITY_POLICY_S2
+		-	_INIT_SECURITY_POLICY_S3
+		-	_INIT_SECURITY_POLICY_V0
+		-	_INIT_SECURITY_POLICY_V1
+		-	_INIT_SECURITY_POLICY_V2
+		-	_INIT_SECURITY_POLICY_V3
+
+		@see TPolicy
+		*/
+		TStaticSecurityPolicy	 	iPolicy;
+
+		/** Action to take on failure. Either a value from TFailureAction
+			or a negative value which has meaning to the CustomFailureActionL()
+			method of a derived class.
+		*/
+		TInt						iAction;	
+		};
+
+	/** Special case values which can be used instead of a policy element index
+		contained in the array TPolicy::iElementsIndex
+	*/
+	enum TSpecialCase 
+		{
+		/** Indicates a custom check should be made by calling CustomSecurityCheckL() */
+		ECustomCheck 			=255u,
+
+		/** Indicates that message is requesting an unsupported function.
+			The message is completed with KErrNotSupported. */
+		ENotSupported			=254u,
+
+		/** Indicates that the message is requesting an unrestricted function
+			and therefore should be processed without any further checks. */
+		EAlwaysPass				=253u, 
+
+		ESpecialCaseLimit 		=252u, 		/**< @internalTechnology */
+		ESpecialCaseHardLimit	=250u		/**< @internalTechnology */
+		};
+
+	/** Object specifying which security checks to perform on each request
+	number and what action to take if the check fails.  
+
+	Explanations of each of the members of this class are detailed below.
+
+	As explained in CPolicyServer::CPolicyServer, it is important that the
+	instance of this class (CPolicyServer::TPolicy) given to the policy
+	server constructor, exists for the lifetime of the server. For this
+	reason, as well as code size considerations, it is recommended that
+	the TPolicy instance is const static data.
+	The following code segment shows the recommended way of doing this.
+	Further detail on what each of these statements means is given below.
+
+	@code
+	const TUint myRangeCount = 4;
+	const TInt myRanges[myRangeCount] = 
+		{
+		0, //range is 0-2 inclusive
+		3, //range is 3-6 inclusive
+		7, //range is 7
+		8, //range is 8-KMaxTInt inclusive
+		};
+	const TUint8 myElementsIndex[myRangeCount] = 
+		{
+		1, 								//applies to 0th range (req num: 0-2)
+		CPolicyServer::ECustomCheck, 	//applies to 1st range (req num: 3-6)
+		0, 								//applies to 2nd range (req num: 7)
+		CPolicyServer::ENotSupported,	//applies to 3rd range (req num: 8-KMaxTInt)
+		};
+	const CPolicyServer::TPolicyElement myElements[] = 
+		{
+		{_INIT_SECURITY_POLICY_C1(ECapabilityDiskAdmin), CPolicyServer::EFailClient},
+		{_INIT_SECURITY_POLICY_C1(ECapabilityLocation), CMyPolicyServer::EQueryUser},
+		}
+	const CPolicySErver::TPolicy myPolicy =
+		{
+		CPolicyServer::EAlwaysPass, //specifies all connect attempts should pass
+		myRangeCount,					
+		myRanges,
+		myElementsIndex,
+		myElements,
+		}
+	@endcode
+	*/
+	class TPolicy
+		{
+	public:
+		/** The index into iElements, or an allowed value of TSpecialCase,
+		that is used to check a connection attempt . */
+		TUint8 iOnConnect;
+
+		/** Number of ranges in the iRanges array. */
+		TUint16 iRangeCount;
+
+		/** A pointer to an array of ordered ranges of request numbers.  Each
+		element in this array refers to the starting request number of a range.
+		The range of the previous element is up to and including the current
+		element minus 1.  Thus an array like:
+		@code
+		const TInt myRanges[4] = {0, 3, 7, 8};
+		@endcode
+		means that:
+		- the 0th range is 0-2 (inclusive).
+		- the 1st range is 3-6 (inclusive).
+		- the 2nd range is solely request number 7.
+		- the 3rd range is 8-KMaxTInt (inclusive).
+
+		Note that the all possible request numbers must be accounted for.  This
+		implies that the first element must be 0.  It also implies that the
+		last range goes from the that element to KMaxTint.  Finally, each
+		element must be strictly greater than the previous element.  As the
+		first element is 0, this clearly implies that iRanges must not contain
+		negative elements. 
+		*/
+		const TInt* iRanges;
+
+		/** A pointer to an array of TUint8 values specifying the appropriate action
+		to take for each range in iRanges.  For example, the 0th element of
+		iElementsIndex specifies the appropriate action to take for the 0th
+		range in iRanges.  As such, iElementsIndex must have precisely the same
+		number of elements as iRanges.  
+	
+		The following rules apply to the value of each element in iElementsIndex:
+		-#	Each value must be a valid index into iElements (that is, less than
+			the number of elements in iElements) OR a valid value from
+			TSpecialCase. 
+		-#	Elements' values need not follow any special ordering.
+		-#	Elements may repeat values.
+		
+		Continuing the example from iRanges:
+		@code
+		const TInt myRanges[4] = {0, 3, 7, 8};
+		const TUInt8 myElementsIndex[4] = {
+			1, 
+			CPolicyServer::ECustomCheck, 
+			0, 
+			CPolicyServer::ENotSupported
+			};
+		@endcode
+		This means that:
+		-#	Requests within the first range of myRanges (request numbers 0-2)
+			will be checked against the policy specified by the 1st element of
+			iElements.
+		-#	Requests with the the second range of myRanges (request numbers
+			3-6) require a custom check to determine if they are allowed.  This requires
+			derived server implementations to implement CustomSecurityCheckL()
+		-#	Requests within the third range of myRanges (request number 7) will
+			be checked against the policy specified by the 0th element of iElements.
+		-#	Requests within the fourth range of myRanges (request numbers
+			8-KMaxTInt) will automatically be completed with KErrNotSupported by
+			the policy server framework.
+		*/
+		const TUint8* iElementsIndex;
+
+		/** A pointer to an array of distinct policy elements.
+
+		Continuing with the previous examples:
+		@code
+		const TInt myRanges[4] = {0, 3, 7, 8};
+		const TUInt8 myElementsIndex[4] = {
+			1, 
+			CPolicyServer::ECustomCheck, 
+			0, 
+			CPolicyServer::ENotSupported
+			};
+		const TPolicyElement iElements[] = {
+			{_INIT_SECURITY_POLICY_C1(ECapabilityDiskAdmin), CPolicyServer::EFailClient},
+			{_INIT_SECURITY_POLICY_C1(ECapabilityLocation), CMyPolicyServer::EQueryUser}
+			}
+		@endcode
+
+		The instantiation of iElements specifies that:
+		-#	Request numbers 0-2 require the Location capability.  As the
+			iAction member of the 1st element specifies a custom action
+			(represented by the negative number, CMyPolicyServer::EQueryUser),
+			requests without Location will passed to the reimplementation of
+			CustomFailureActionL.
+		-#	Request number 7 requires the DiskAdmin capability.  Requestors
+			without DiskAdmin will have their request completed with
+			KErrPermissionDenied.
+		*/
+		const TPolicyElement* iElements;	
+		};
+
+public:
+	/** Process an accepted message which has passed its policy check.
+
+	The message is either passed to the ServiceL() method of a session,
+	or, in the case of a connection message, a new session is created.
+		
+	This is called by RunL() to process a message which has passed its security
+	check.  If the server implementation returns EAsync from either
+	CustomSecurityCheckL() or CustomFailureActionL(), then it is the responsibility
+	of the derived server implementation to call ProcessL at a later point if
+	the messages passes the asynchronous check.
+
+	This function should only ever be called by derived implementations if
+	asynchronous security checks are in use.
+	*/
+	IMPORT_C void ProcessL(const RMessage2& aMsg);
+
+	/** Called when a security check has failed.  
+
+	The aAction parameter determines the action taken:
+	-	If aAction==TFailureAction::EFailClient, the message is completed with
+		KErrPermissionDenied.
+	-	If aAction==TFailureAction::EPanicClient, the client thread is panicked.
+	-	If aAction < 0 a call to the virtual function CustomFailureActionL() is made.
+
+	This function should only ever be called by derived implementations if
+	asynchronous security checks are in use. 
+
+	@param	aMsg	 The message which failed its check.
+	@param	aAction	 The action to take. (See description.)
+	@param 	aMissing A list of the security attributes that were missing from
+					 the checked process.  
+	*/
+	IMPORT_C void CheckFailedL(const RMessage2& aMsg, TInt aAction, const TSecurityInfo& aMissing);
+
+	/** Called if a leave occurs during processing of a message.  The
+	underlying framework ensures that leaves which occur during
+	CSession2::ServiceL are passed to CSession2::ServiceError.  Leaves occuring
+	prior to this (ie. during CustomSecurityCheckL() or CustomFailureActionL() ) are
+	completed with the leave code.
+
+	This function should only ever be called by derived implementations if
+	asynchronous security checks are in use.  In this case the RunError() of
+	that other active object must call ProcessError().
+
+	@param	aMsg		The message being processed when the leave occurred.
+	@param	aError		The leave code.
+	*/
+	IMPORT_C void ProcessError(const RMessage2& aMsg, TInt aError);
+
+protected:
+	/** Construct a policy server
+
+	@param aPriority	Active object priority for this server
+	@param aPolicy		Reference to a policy object describing the security checks
+						required for each message type.  The server does not make a
+						copy of policy, and therefore this object must exist for the
+						lifetime of the server.  It is recommended that aPolicy
+						is in const static data.
+	@param aType		Type of session sharing supported by this server
+	*/
+	IMPORT_C CPolicyServer(TInt aPriority, const TPolicy& aPolicy, TServerType aType=EUnsharableSessions);
+
+	/** Performs a custom security check.
+	Derived server classes must implement this function if any element in
+	iElementsIndex has the value CPolicyServer::ECustomCheck.
+	Similarly, if CPolicyServer::ECustomCheck is not used, then this function
+	can be safely ignored.
+
+	If CPolicyServer::ECustomCheck is used, there are two further cases to consider:
+	-#	The custom security check can synchronously decide if the message
+		should pass.  In this case, the derived implementation must simply return
+		either EPass or EFail depending on the result of the security check.
+	-#	The custom security check needs to use asynchronous methods in order
+		to determine whether the message should procceed.  In this case, these
+		asysnchronous methods should be started and then the EAsync value returned.
+		Furthermore, implmentations returning EAsync commit to the following:
+		-	If the security check eventually passes, ProcessL() must be called with
+			the appropriate message.
+		-	If the security check eventually fails, CheckFailedL() must be called
+			with that message.
+		-	Pending messages on a given session need to be completed and discarded
+			if the session is closed.
+
+		IMPORTANT NOTE. When processing a message asynchronously, a copy must be
+		made of the RMessage2 object. Saving a refernece or pointer to the original
+		message will produce unpredictable defects. This is because the object will
+		be reused for the next message that the server receives.
+		
+	In both cases, synchronous and asynchronous, the derived implementation has the
+	option of updating the aAction and/or aMissing parameters if that is
+	appropriate.
+
+	@param	aMsg The message to check.
+	@param	aAction A reference to the action to take if the security check
+			fails. This is either a value from TFailureAction or a negative
+			value which has meaning to the CustomFailureActionL() method of
+			a derived class.
+			The policy server framework gives this value a default of
+			EFailClient.  If a derived implementation wishes a
+			different value, then it should change this.
+	@param 	aMissing A reference to the list of security attributes missing
+			from the checked process.  The policy server initialises this
+			object to zero (that is a sid of 0, a vid of 0, and no capabilities).
+			If derived implementations wish to take advantage of a list of
+			missing attributes in their implementation of CustomFailureActionL(),
+			then they should set those missing attributes here in
+			CustomSecurityCheckL().
+	@return A value from TCustomResult.  
+	@panic CBase 95 If the default implementation is called.
+	*/
+	IMPORT_C virtual TCustomResult CustomSecurityCheckL(const RMessage2& aMsg, TInt& aAction, TSecurityInfo& aMissing);
+
+	/** Performs a custom action after the failure of a security check.
+	Derived server classes must implement this function if the aAction value
+	passed to CheckFailedL() is less than zero.  This can happened if the policy
+	specified a negative number in the iAction member of any of the
+	TPolicyElements, or, if the derived CustomSecurityCheckL() modified the
+	value of aAction prior to returning.
+	
+	If negative aAction values are used, there are two further cases to consider:
+	-#	The custom security check can synchronously decide if the message
+		should pass.  In this case, the derived implementation must simply return
+		either EPass or EFail depending on the result of the security check.
+	-#	The custom security check needs to use asynchronous methods in order
+		to determine whether the message should still proceed.  In this case, these
+		asysnchronous methods should be started and then the EAsync value returned.
+		Furthermore, implmentations returning EAsync commit to the following:
+		-	If the security check eventually passes, ProcessL() must be called with
+			the appropriate message.
+		-	If the security check eventually fails, or if a fatal error condition occurs, 
+			including if the previously mentioned call to ProcessL() leaves; 
+			then CPolicyServer::ProcessError() should be called passing the message and 
+			relevant error code.
+		-	Pending messages on a given session need to be completed and discarded 
+			if the session is closed.
+
+		IMPORTANT NOTE. When processing a message asynchronously, a copy must be
+		made of the RMessage2 object. Saving a refernece or pointer to the original
+		message will produce unpredictable defects. This is because the object will
+		be reused for the next message that the server receives.
+
+	The default implementation of this function panics the server.
+
+	@param	aMsg The message to check
+	@param	aAction The custom failure action requested.
+					This is either a value from TFailureAction or a negative
+					value which has meaning to the CustomFailureActionL() method of
+					a derived class.
+	@param 	aMissing A const reference to the list of security attributes missing
+			from the checked process.  There are two cases to consider:
+			(a) If this message was checked (and failed) by a static policy
+				applied by the policy server framework, aMissing will contain a
+				list of the security attributes that caused the policy to fail.  An
+				completely zeroed aMissing implies that an always fail policy was
+				encountered.
+			(b) If this message was failed by a custom security check, then
+				aMissing will be zeroed unless the CustomSecurityCheckL() method
+				filled it in.
+	@return A value from TCustomResult.  
+	@panic CBase 95 If the default implementation is called.
+	*/
+	IMPORT_C virtual TCustomResult CustomFailureActionL(const RMessage2& aMsg, TInt aAction, const TSecurityInfo& aMissing);
+
+protected:
+	IMPORT_C virtual TInt Extension_(TUint aExtensionId, TAny*& a0, TAny* a1);
+private:
+	IMPORT_C virtual void RunL();
+	IMPORT_C virtual TInt RunError(TInt aError);
+	const CPolicyServer::TPolicyElement* FindPolicyElement(TInt aFn, TUint& aSpecialCase) const;
+private:
+	const TPolicy& iPolicy;
+
+	};
+
+
+
+class CActiveScheduler : public CBase
+/**
+@publishedAll
+@released
+
+Controls the handling of asynchronous requests as represented by
+active objects.
+
+An active scheduler is used to schedule the sequence in which active object request
+completion events are handled by a single event-handling thread.
+
+An active scheduler can be instantiated and used directly if either:
+
+- the RunL() function of all of its active objects is guaranteed not to leave, or
+
+- each of its active objects implements a suitable RunError() function to provide suitable cleanup
+
+If any of the active scheduler's active objects does not provide a RunError()
+function, then a CActiveScheduler derived class must be defined and an implementation
+of the Error() function provided to perform the cleanup required.
+
+There is one active scheduler per thread and the static functions provided by the
+class always refer to the current active scheduler.
+
+@see CActiveScheduler::Error
+@see CActive 
+@see CActiveSchedulerWait
+*/
+	{
+	friend class CActiveSchedulerWait;
+public:
+	struct TLoop;
+	typedef TLoop* TLoopOwner;
+public:
+	IMPORT_C CActiveScheduler();
+	IMPORT_C ~CActiveScheduler();
+	IMPORT_C static void Install(CActiveScheduler* aScheduler);
+	IMPORT_C static CActiveScheduler* Current();
+	IMPORT_C static void Add(CActive* aActive);
+	IMPORT_C static void Start();
+	IMPORT_C static void Stop();
+	IMPORT_C static TBool RunIfReady(TInt& aError, TInt aMinimumPriority);
+	IMPORT_C static CActiveScheduler* Replace(CActiveScheduler* aNewActiveScheduler);
+	IMPORT_C virtual void WaitForAnyRequest();
+	IMPORT_C virtual void Error(TInt aError) const;
+	IMPORT_C void Halt(TInt aExitCode) const;
+	IMPORT_C TInt StackDepth() const;
+private:
+	class TCleanupBundle
+	{
+		public:
+		CCleanup* iCleanupPtr;
+		TInt iDummyInt;
+	};
+private:
+	static void Start(TLoopOwner* aOwner);
+	IMPORT_C virtual void OnStarting();
+	IMPORT_C virtual void OnStopping();
+	IMPORT_C virtual void Reserved_1();
+	IMPORT_C virtual void Reserved_2();
+	void Run(TLoopOwner* const volatile& aLoop);
+	void DoRunL(TLoopOwner* const volatile& aLoop, CActive* volatile & aCurrentObj, TCleanupBundle* aCleanupBundle);
+protected:
+	IMPORT_C virtual TInt Extension_(TUint aExtensionId, TAny*& a0, TAny* a1);
+protected:
+	inline TInt Level() const;	// deprecated
+private:
+	TLoop* iStack;
+	TPriQue<CActive> iActiveQ;
+	TAny* iSpare;
+	};
+
+
+
+
+class CActiveSchedulerWait : public CBase
+/**
+@publishedAll
+@released
+
+Controls a single scheduling loop in the current active scheduler.
+
+This class provides better control of nested wait loops in the active
+scheduler.
+
+Note that a CActiveSchedulerWait object can be used as a data member
+inside other CBase derived classes.
+
+@see CActiveScheduler
+*/
+	{
+public:
+	IMPORT_C CActiveSchedulerWait();
+	IMPORT_C ~CActiveSchedulerWait();
+	IMPORT_C void Start();
+	IMPORT_C void AsyncStop();
+	IMPORT_C void AsyncStop(const TCallBack& aCallMeWhenStopped);
+	inline TBool IsStarted() const;
+	IMPORT_C TBool CanStopNow() const;
+private:
+	CActiveScheduler::TLoopOwner iLoop;
+	};
+
+
+
+
+class CleanupStack
+/**
+@publishedAll
+@released
+
+A collection of static functions that are used to add resources to and remove 
+resources from the cleanup stack.
+*/
+	{
+public:
+	IMPORT_C static void PushL(TAny* aPtr);
+	IMPORT_C static void PushL(CBase* aPtr);
+	IMPORT_C static void PushL(TCleanupItem anItem);
+	IMPORT_C static void Pop();
+	IMPORT_C static void Pop(TInt aCount);
+	IMPORT_C static void PopAndDestroy();
+	IMPORT_C static void PopAndDestroy(TInt aCount);
+	IMPORT_C static void Check(TAny* aExpectedItem);
+	inline static void Pop(TAny* aExpectedItem);
+	inline static void Pop(TInt aCount, TAny* aLastExpectedItem);
+	inline static void PopAndDestroy(TAny* aExpectedItem);
+	inline static void PopAndDestroy(TInt aCount, TAny* aLastExpectedItem);
+	};
+
+
+
+
+/**
+@publishedAll
+@released
+
+A utility class used by the templated function CleanupDeletePushL() to create 
+a TCleanupItem item that will perform a delete type operation on
+the class T type object.
+
+@see CleanupDeletePushL()
+*/
+template <class T>
+class CleanupDelete
+	{
+public:
+	inline static void PushL(T* aPtr);
+private:
+	static void Delete(TAny *aPtr);
+	};
+	
+	
+
+	
+/**
+@publishedAll
+@released
+
+Constructs and pushes a TCleanupItem object onto the cleanup stack.
+
+The TCleanupItem encapsulates:
+
+- the pointer aPtr to the object of type class T which is to be cleaned up
+
+- an associated cleanup operation.
+
+The cleanup operation is the private static function Delete() of the templated
+class CleanupDelete, and is called as a result of a subsequent call
+to CleanupStack::PopAndDestroy().
+
+CleanupDelete::Delete() is passed a pointer to the class T object to be cleaned
+up, and the function implements cleanup by deleting the passed object.
+
+An example of its use:
+
+@code
+...
+CTestOne* one = new (ELeave) CTestOne;
+CleanupDeletePushL(one);
+...
+CleanupStack::PopAndDestroy(); // <--- results in "one" being deleted.
+...
+@endcode
+
+@param aPtr A pointer to a templated class T type object for which the cleanup item is being created. 
+
+@see TCleanupItem
+@see CleanupDelete
+@see CleanupStack::PopAndDestroy()
+*/
+template <class T>
+inline void CleanupDeletePushL(T* aPtr);
+
+
+
+
+/**
+@publishedAll
+@released
+
+A utility class used by the templated function CleanupArrayDeletePushL() to 
+create a TCleanupItem item that will perform a delete type operation on an 
+array of class T type objects.
+
+@see CleanupArrayDeletePushL()
+*/
+template <class T>
+class CleanupArrayDelete
+	{
+public:
+	inline static void PushL(T* aPtr);
+private:
+	static void ArrayDelete(TAny *aPtr);
+	};
+
+
+
+
+/**
+@publishedAll
+@released
+
+Constructs and pushes a TCleanupItem object onto the cleanup stack.
+
+The TCleanupItem encapsulates:
+
+- the pointer aPtr to an array of type class T objects to be cleaned up
+
+- an associated cleanup operation.
+
+The cleanup operation is the private static function ArrayDelete() of the
+templated class CleanupArrayDelete, and is called as a result of
+a subsequent call to CleanupStack::PopAndDestroy().
+
+CleanupArrayDelete::ArrayDelete() is passed a pointer to the array of class T
+objects to be cleaned up, and the function implements cleanup by deleting
+the passed array using the delete [] operator.
+
+An example of its use:
+
+@code
+...
+RTestOne* one = new (ELeave) RTestOne [KSomeArraySize];
+CleanupArrayDeletePushL(one);
+... // Do something with the object.........
+CleanupStack::PopAndDestroy(); // <--- results in the array "one" being deleted.
+...
+@endcode
+
+@param aPtr A pointer to an array of class T type objects for which
+            the cleanup item is being created.
+
+@see TCleanupItem
+@see CleanupArrayDelete
+@see CleanupStack::PopAndDestroy()
+*/
+template <class T>
+inline void CleanupArrayDeletePushL(T* aPtr);
+
+
+
+
+/**
+@publishedAll
+@released
+
+A utility class used by the templated function CleanupClosePushL() to create 
+a TCleanupItem item that will perform a close type operation on
+the class T type object.
+
+@see CleanupClosePushL()
+*/
+template <class T>
+class CleanupClose
+	{
+public:
+	inline static void PushL(T& aRef);
+private:
+	static void Close(TAny *aPtr);
+	};
+	
+	
+
+	
+/**
+@publishedAll
+@released
+
+Constructs and pushes a TCleanupItem object onto the cleanup stack.
+
+The TCleanupItem encapsulates:
+
+1. a reference aRef to the object of type class T which is to be cleaned up
+
+2. an associated cleanup operation.
+
+The cleanup operation is the private static function Close() of the templated
+class CleanupClose and is invoked as a result of a subsequent call to
+CleanupStack::PopAndDestroy().
+
+CleanupClose::Close() is passed a pointer to the class T object to be cleaned
+up, and the function implements cleanup by calling Close() on the passed object.
+The class T object must, therefore, define and implement (or inherit)  a Close()
+member function.
+
+An example of its use:
+
+@code
+class RTestTwo;
+	{
+public :
+    ...
+	IMPORT_C void Close();
+	...
+	}
+...
+RTestTwo two;
+CleanupClosePushL(two);
+...
+CleanupStack::PopAndDestroy(); // <--- results in Close() being called on "two".
+......
+@endcode
+
+In practice, this type of cleanup operation is commonly applied to handles
+to resources; if such handles are constructed on the program stack, then it is
+important that such handles are closed.
+
+@param aRef A reference to a class T type object for which the cleanup item
+            is being created.
+
+@see TCleanupItem
+@see CleanupClose
+@see CleanupStack::PopAndDestroy()
+*/
+template <class T>
+inline void CleanupClosePushL(T& aRef);
+
+
+
+
+/**
+@publishedAll
+@released
+
+A utility class used by the templated function CleanupReleasePushL() to create 
+a TCleanupItem item that will perform a release type operation on
+the class T type object.
+
+@see CleanupReleasePushL()
+*/
+template <class T>
+class CleanupRelease
+	{
+public:
+	inline static void PushL(T& aRef);
+private:
+	static void Release(TAny *aPtr);
+	};
+	
+	
+
+	
+/**
+@publishedAll
+@released
+
+Constructs and pushes a TCleanupItem object onto the cleanup stack.
+
+The TCleanupItem encapsulates:
+
+1. a reference aRef to the object of type class T which is to be cleaned up
+
+2. an associated cleanup operation.
+
+The cleanup operation is the private static function Release() of the
+templated class CleanupRelease and is invoked as a result of
+a subsequent call to CleanupStack::PopAndDestroy().
+
+CleanupRelease::Release() is passed a pointer to the class T object to be cleaned
+up, and the function implements cleanup by calling Release() on the passed object.
+The class T object must, therefore, define and implement (or inherit) a Release()
+member function.
+
+An example of its use:
+
+@code
+class RTestThree;
+	{
+public :
+    ...
+	IMPORT_C void Release();
+	...
+	}
+...
+RTestThree three;
+CleanupReleasePushL(three);
+...
+CleanupStack::PopAndDestroy(); // <--- results in Release() being called on "three".
+......
+@endcode
+
+@param aRef A reference to a class T type object for which the cleanup item 
+            is being created.
+
+@see TCleanupItem
+@see CleanupRelease
+@see CleanupStack::PopAndDestroy()
+*/
+template <class T>
+inline void CleanupReleasePushL(T& aRef);
+
+
+
+
+class CConsoleBase;
+
+/**
+@publishedPartner
+@released
+*/
+class Console
+	{
+public:
+	IMPORT_C static CConsoleBase* NewL(const TDesC& aTitle,TSize aSize);
+	};
+
+#include <e32base.inl>
+
+#ifndef SYMBIAN_ENABLE_SPLIT_HEADERS
+#include <e32base_private.h>
+#endif
+
+#endif //__E32BASE_H__
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32/include/e32base.inl	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,3199 @@
+// Copyright (c) 1994-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32\include\e32base.inl
+// 
+//
+
+// Class CBase
+inline TAny* CBase::operator new(TUint aSize, TAny* aBase) __NO_THROW
+/**
+Initialises the object to binary zeroes.
+
+@param aSize The size of the derived class. This parameter is specified
+             implicitly by C++ in all circumstances in which a derived
+			 class is allocated.
+@param aBase Indicates a base address which is returned as the object's
+             address. 
+
+@return A pointer to the base address.
+*/
+	{ Mem::FillZ(aBase, aSize); return aBase; }
+
+
+
+
+inline TAny* CBase::operator new(TUint aSize) __NO_THROW
+/**
+Allocates the object from the heap and then initialises its contents
+to binary zeroes.
+
+@param aSize The size of the derived class. This parameter is specified
+             implicitly by C++ in all circumstances in which a derived class
+			 is allocated.
+
+@return      A pointer to the allocated object; NULL if memory could not
+             be allocated.
+*/
+	{ return User::AllocZ(aSize); }
+
+
+
+
+inline TAny* CBase::operator new(TUint aSize, TLeave)
+/**
+Allocates the object from the heap and then initialises its contents
+to binary zeroes.
+
+@param aSize  The size of the derived class. This parameter is specified
+              implicitly by C++ in all circumstances in which a derived class
+			  is allocated.
+
+@return       A pointer to the allocated object; the TLeave parameter indicates
+              that the operation leaves if allocation fails with out-of-memory.
+*/
+	{ return User::AllocZL(aSize); }
+
+
+
+
+inline TAny* CBase::operator new(TUint aSize, TUint aExtraSize) __NO_THROW
+/**
+Allocates the object from the heap and then initialises its contents
+to binary zeroes.
+
+Use of this overload is rare.
+
+@param aSize  The size of the derived class. This parameter is specified
+              implicitly by C++ in all circumstances in which a derived class
+			  is allocated.
+
+@param aExtraSize Indicates additional size beyond the end of the base class.
+
+@return      A pointer to the allocated object; NULL if memory could not
+             be allocated.
+*/
+	{ return User::AllocZ(aSize + aExtraSize); }
+
+
+
+
+inline TAny* CBase::operator new(TUint aSize, TLeave, TUint aExtraSize)
+/**
+Allocates the object from the heap and then initialises its contents
+to binary zeroes.
+
+Use of this overload is rare.
+
+@param aSize  The size of the derived class. This parameter is specified
+              implicitly by C++ in all circumstances in which a derived class
+			  is allocated.
+
+@param aExtraSize Indicates additional size beyond the end of the base class.
+
+@return      A pointer to the allocated object; the TLeave parameter indicates
+              that the operation leaves if allocation fails with out-of-memory.
+*/
+	{ return User::AllocZL(aSize + aExtraSize); }
+
+
+
+
+// Class CBufBase
+inline TInt CBufBase::Size() const
+/**
+Gets the number of data bytes in the buffer.
+
+Note that the number of heap bytes used by the buffer may be greater than its
+size, because there is typically extra room to allow for expansion. Use the
+Compress() function to reduce the extra allocation as much as possible.
+
+@return The number of data bytes in the buffer.
+*/
+	{return(iSize);}
+
+
+
+
+// Class CBufFlat
+inline TInt CBufFlat::Capacity() const
+/**
+Gets the size to which the buffer may expand without re-allocation.
+
+@return The size of the allocated cell associated with the buffer. This is 
+        the maximum size the buffer may be expanded to without re-allocation.
+*/
+	{return(iMaxSize);}
+
+
+
+
+// Class CArrayFixBase
+inline TInt CArrayFixBase::Count() const
+/**
+Gets the number of elements held in the array.
+
+@return The number of array elements
+*/
+	{return(iCount);}
+
+
+
+
+inline TInt CArrayFixBase::Length() const
+/**
+Gets the length of an element.
+
+@return The length of an element of type class T.
+*/
+	{return(iLength);}
+
+
+
+
+// Template class CArrayFix
+template <class T>
+inline CArrayFix<T>::CArrayFix(TBufRep aRep,TInt aGranularity)
+	: CArrayFixBase(aRep,sizeof(T),aGranularity)
+/**
+@internalComponent
+*/
+	{}
+
+
+
+
+template <class T>
+inline const T &CArrayFix<T>::operator[](TInt anIndex) const
+/**
+Gets a const reference to the element located at the specified position 
+within the array.
+
+Note that if a pointer to the returned referenced class T object is taken,
+be aware that the pointer value becomes invalid once elements have been added
+to, or removed from the array. Always refresh the pointer.
+
+@param anIndex The position of the element within the array. The position 
+               is relative to zero; i.e. zero implies the first element in
+			   the array.
+			   
+@return A const reference to the required element.
+
+@panic E32USER-CBase 21, if anIndex is negative or greater than or equal to the
+                         number of objects currently within the array.
+*/
+	{return(*((const T *)CArrayFixBase::At(anIndex)));}
+
+
+
+
+template <class T>
+inline T &CArrayFix<T>::operator[](TInt anIndex)
+/**
+Gets a non-const reference to the element located at the specified position 
+within the array.
+
+Note that if a pointer to the returned referenced class T object is taken,
+be aware that the pointer value becomes invalid once elements have been added
+to, or removed from the array. Always refresh the pointer.
+
+@param anIndex The position of the element within the array. The position 
+               is relative to zero; i.e. zero implies the first element in
+			   the array.
+			   
+@return A non-const reference to the required element.
+
+@panic E32USER-CBase 21, if anIndex is negative or greater than or equal to the
+                         number of objects currently within the array.
+*/
+	{return(*((T *)CArrayFixBase::At(anIndex)));}
+
+
+
+
+template <class T>
+inline const T &CArrayFix<T>::At(TInt anIndex) const
+/** 
+Gets a const reference to the element located at the specified position 
+within the array.
+
+Note that if a pointer to the returned referenced class T object is taken,
+be aware that the pointer value becomes invalid once elements have been added
+to, or removed from the array. Always refresh the pointer.
+
+@param anIndex The position of the element within the array. The position 
+               is relative to zero; i.e. zero implies the first element in
+			   the array.
+			   
+@return A const reference to the required element.
+
+@panic E32USER-CBase 21, if anIndex is negative or greater than or equal to the
+                         number of objects currently within the array.
+*/
+	{return(*((const T *)CArrayFixBase::At(anIndex)));}
+
+
+
+
+template <class T>
+inline const T *CArrayFix<T>::End(TInt anIndex) const
+/**
+Gets a pointer to the (const) first byte following the end of the 
+contiguous region containing the element at the specified position within
+the array.
+
+For arrays implemented using flat buffers, the pointer always points to the 
+first byte following the end of the buffer.
+
+For arrays implemented using segmented buffers, the pointer always points 
+to the first byte following the end of the segment which contains the element.
+
+@param anIndex The position of the element within the array. The position 
+               is relative to zero; i.e. zero implies the first element
+			   in the array.
+			   
+@return A pointer to the constant byte following the end of the contiguous 
+        region. 
+
+@panic E32USER-CBase 21, if anIndex is negative or greater than or equal to the
+                         number of objects currently within the array.
+*/
+	{return((const T *)CArrayFixBase::End(anIndex));}
+
+
+
+
+template <class T>
+inline const T *CArrayFix<T>::Back(TInt anIndex) const
+/**
+Gets a pointer to the (const) beginning of a contiguous region.
+
+For arrays implemented using flat buffers, the function always returns a
+pointer to the beginning of the buffer.
+
+For arrays implemented using segmented buffers, the function returns a pointer 
+to the beginning of the segment for all elements in that segment except the 
+first. If the element at position anIndex is the first in a segment, then 
+the function returns a pointer the beginning of the previous segment.
+
+For the first element in the array, the function returns a NULL pointer.
+
+@param anIndex The position of the element within the array. The position 
+               is relative to zero; i.e. zero implies the first element
+			   in the array.
+			   
+@return A pointer to the (const) beginning of the contiguous region.
+
+@panic E32USER-CBase 21, if anIndex is negative or greater than or equal to the
+                         number of objects currently within the array.
+*/
+	{return((const T *)CArrayFixBase::Back(anIndex));}
+
+
+
+
+template <class T>
+inline T &CArrayFix<T>::At(TInt anIndex)
+/**
+Gets a non-const reference to the element located at the specified position 
+within the array.
+
+Note that if a pointer to the returned referenced class T object is taken,
+be aware that the pointer value becomes invalid once elements have been added
+to, or removed from the array. Always refresh the pointer.
+
+@param anIndex The position of the element within the array. The position 
+               is relative to zero; i.e. zero implies the first element in
+			   the array.
+			   
+@return A non-const reference to the required element.
+
+@panic E32USER-CBase 21, if anIndex is negative or greater than or equal to the
+                         number of objects currently within the array.
+*/
+	{return(*((T *)CArrayFixBase::At(anIndex)));}
+
+
+
+
+template <class T>
+inline T *CArrayFix<T>::End(TInt anIndex)
+/**
+Gets a pointer to the first byte following the end of the contiguous region 
+containing the element at the specified position within the array.
+
+For arrays implemented using flat buffers, the pointer always points to the 
+first byte following the end of the buffer.
+
+For arrays implemented using segmented buffers, the pointer always points 
+to the first byte following the end of the segment which contains the element.
+
+@param anIndex The position of the element within the array. The position 
+               is relative to zero; i.e. zero implies the first element
+			   in the array.
+			   
+@return A pointer to the byte following the end of the contiguous region.
+
+@panic E32USER-CBase 21, if anIndex is negative or greater than or equal to the
+                         number of objects currently within the array.
+*/
+	{return(((T *)CArrayFixBase::End(anIndex)));}
+
+
+
+
+template <class T>
+inline T *CArrayFix<T>::Back(TInt anIndex)
+/**
+Gets a pointer to the beginning of a contiguous region.
+
+For arrays implemented using flat buffers, the function always returns a pointer 
+to the beginning of the buffer.
+
+For arrays implemented using segmented buffers, the function returns a pointer 
+to the beginning of the segment for all elements in that segment except the 
+first. If the element at position anIndex is the first in a segment, then 
+the function returns a pointer the beginning of the previous segment.
+
+For the first element in the array, the function returns a NULL pointer.
+
+@param anIndex The position of the element within the array. The position 
+               is relative to zero; i.e. zero implies the first element
+			   in the array.
+			   
+@return A pointer to the beginning of the contiguous region.
+
+@panic E32USER-CBase 21, if anIndex is negative or greater than or equal to the
+                         number of objects currently within the array.
+*/
+	{return(((T *)CArrayFixBase::Back(anIndex)));}
+
+
+
+
+template <class T>
+inline void CArrayFix<T>::AppendL(const T &aRef)
+/**
+Appends a single element onto the end of the array.
+
+@param aRef A reference to the class T element to be appended.
+
+@leave KErrNoMemory The function may attempt to expand the array buffer. If 
+       there is insufficient memory available, the function leaves, in which
+	   case the array is left in the state it was in before the call.
+*/
+	{CArrayFixBase::InsertL(Count(),&aRef);}
+
+
+
+
+template <class T>
+inline void CArrayFix<T>::AppendL(const T *aPtr,TInt aCount)
+/**
+Appends one or more elements onto the end of the array.
+
+@param aPtr   A pointer to a contiguous set of type <class T> objects to be
+              appended.
+@param aCount The number of contiguous objects of type <class T> located at 
+              aPtr to be appended.
+			  
+@leave KErrNoMemory The function may attempt to expand the array buffer. If 
+       there is insufficient memory available, the function leaves, in which
+	   case the array is left in the state it was in before the call.
+
+@panic E32USER-CBase 23, if aCount is negative.
+*/
+	{CArrayFixBase::InsertL(Count(),aPtr,aCount);}
+
+
+
+
+template <class T>
+inline void CArrayFix<T>::AppendL(const T &aRef,TInt aReplicas)
+/**
+Appends replicated copies of an element onto the end of the array.
+
+@param aRef      A reference to the <class T> object to be replicated and appended.
+@param aReplicas The number of copies of the aRef element to be appended. 
+
+@leave KErrNoMemory The function may attempt to expand the array buffer. If 
+       there is insufficient memory available, the function leaves, in which
+	   case the array is left in the state it was in before the call.
+
+@panic E32USER-CBase 28 if aReplicas is negative.
+*/
+	{CArrayFixBase::InsertRepL(Count(),&aRef,aReplicas);}
+
+
+
+
+template <class T>
+inline T &CArrayFix<T>::ExpandL(TInt anIndex)
+/**
+Expands the array by one element at the specified position.
+
+It:
+
+1. expands the array by one element at the specified position
+
+2. constructs a new element at that position
+
+3. returns a reference to the new element.
+
+All existing elements from position anIndex to the end of the array are moved 
+up, so that the element originally at position anIndex is now at position 
+anIndex + 1 etc.
+
+The new element of type class T is constructed at position anIndex, using 
+the default constructor of that class.
+
+@param anIndex The position within the array where the array is to be expanded 
+               and the new class T object is to be constructed. 
+
+@leave KErrNoMemory The function may attempt to expand the array buffer. If 
+       there is insufficient memory available, the function leaves, in which
+	   case the array is left in the state it was in before the call.
+
+@return A reference to the newly constructed class T object at position 
+        anIndex within the array.
+
+@panic E32USER-CBase 21 if anIndex is negative or greater than the number
+                        of elements currently in the array.
+*/
+	{return(*new(CArrayFixBase::ExpandL(anIndex)) T);}
+
+
+
+
+template <class T>
+inline T &CArrayFix<T>::ExtendL()
+/**
+Expands the array by one element at the end of the array.
+
+It:
+
+1. expands the array by one element at the end of the array, i.e. at position 
+   CArrayFixBase::Count()
+
+2. constructs a new element at that position
+
+3. returns a reference to the new element.
+
+The new element of type class T is constructed at the end of the array, 
+using the default constructor of that class.
+
+@leave KErrNoMemory The function may attempt to expand the array buffer. If 
+       there is insufficient memory available, the function leaves, in which
+	   case the array is left in the state it was in before the call.
+
+@return A reference to the newly constructed class T object at the end of 
+        the array.
+
+@see CArrayFixBase::Count
+*/
+	{return(*new(CArrayFixBase::ExpandL(Count())) T);}
+
+
+
+
+template <class T>
+inline TInt CArrayFix<T>::Find(const T &aRef,TKeyArrayFix &aKey,TInt &anIndex) const
+/**
+Finds the position of an element within the array, based on the matching of
+keys, using a sequential search.
+
+The array is searched sequentially for an element whose key matches the key of the
+supplied class T object. The search starts with the first element in the array.
+
+Note that where an array has elements with duplicate keys, the function only
+supplies the position of the first element in the array with that key.
+
+@param aRef    A reference to an object of type class T whose key is used
+               for comparison.
+@param aKey    A reference to a key object defining the properties of the key.
+@param anIndex A reference to a TInt supplied by the caller. On return, if the
+               element is found, the reference is set to the position of that
+			   element within the array. The position is relative to zero, 
+			   (i.e. the first element in the array is at position 0).
+			   If the element is not found and the array is not empty, then
+			   the value of the reference is set to the number of elements in
+			   the array. 
+			   If the element is not found and the array is empty, then the
+			   reference is set to zero.
+
+@return Zero, if the element with the specified key is found. 
+        Non-zero, if the element with the specified key is not found.
+*/
+	{return(CArrayFixBase::Find(&aRef,aKey,anIndex));}
+
+
+
+
+template <class T>
+inline TInt CArrayFix<T>::FindIsq(const T &aRef,TKeyArrayFix &aKey,TInt &anIndex) const
+/**
+Finds the position of an element within the array, based on the matching of 
+keys, using a binary search technique.
+
+The array is searched, using a binary search technique, for an element whose 
+key matches the key of the supplied class T object.
+
+The array must be in key order.
+
+Note that where an array has elements with duplicate keys, the function cannot
+guarantee which element, with the given key value, it will return, except that
+it will find one of them.
+
+@param aRef    A reference to an object of type class T whose key is used 
+               for comparison. 
+@param aKey    A reference to a key object defining the properties of the key.
+@param anIndex A reference to a TInt supplied by the caller. On return, if the
+               element is found, the reference is set to the position of that
+			   element within the array. The position is relative to zero,
+			   (i.e. the first element in the array is at position 0).
+			   If the element is not found and the array is not empty, then the
+			   reference is set to the position of the first element in the
+			   array with a key which is greater than the key of the 
+               object aRef.
+			   If the element is not found and the array is empty, then the 
+               reference is set to zero.
+
+@return Zero, if the element with the specified key is found.
+        Non-zero, if the element with the specified key is not found.
+*/
+	{return(CArrayFixBase::FindIsq(&aRef,aKey,anIndex));}
+
+
+
+
+template <class T>
+inline void CArrayFix<T>::InsertL(TInt anIndex,const T &aRef)
+/**
+Inserts an element into the array at the specified position.
+
+Note that passing a value of anIndex which is the same as the current number
+of elements in the array, has the effect of appending the element.
+
+@param anIndex The position within the array where the element is to be
+               inserted. The position is relative to zero, i.e. zero implies
+			   that elements are inserted at the beginning of the array. 
+			   
+@param aRef    A reference to the class T object to be inserted into the array 
+               at position anIndex.
+
+@leave KErrNoMemory The function may attempt to expand the array buffer. If 
+       there is insufficient memory available, the function leaves, in which
+	   case the array is left in the state it was in before the call.
+
+@panic E32USER-CBase 21 if anIndex is negative, or is greater than the number
+       of elements currently in the array.
+*/
+	{CArrayFixBase::InsertL(anIndex,&aRef);}
+
+
+
+
+template <class T>
+inline void CArrayFix<T>::InsertL(TInt anIndex,const T *aPtr,TInt aCount)
+/**
+Inserts one or more elements into the array at the specified position.
+
+The objects to be added must all be contiguous.
+
+Note that passing a value of anIndex which is the same as the current number
+of elements in the array, has the effect of appending the element.
+
+@param anIndex The position within the array where the elements are to be 
+               inserted. The position is relative to zero, i.e. zero implies
+			   that elements are inserted at the beginning of the array.
+			   
+@param aPtr    A pointer to the first of the contiguous elements of type 
+               class T to be inserted into the array at position anIndex.
+
+@param aCount  The number of contiguous elements of type class T located at 
+               aPtr to be inserted into the array. 
+
+@leave KErrNoMemory The function may attempt to expand the array buffer. If 
+       there is insufficient memory available, the function leaves, in which
+	   case the array is left in the state it was in before the call.
+
+@panic E32USER-CBase 21  if anIndex is negative or is greater than the number
+                         of elements currently in the array.
+@panic E32USER-CBase 23  if aCount is negative.
+*/
+	{CArrayFixBase::InsertL(anIndex,aPtr,aCount);}
+
+
+
+
+template <class T>
+inline void CArrayFix<T>::InsertL(TInt anIndex,const T &aRef,TInt aReplicas)
+/**
+Inserts replicated copies of an element into the array at the specified
+position.
+
+Note that passing a value of anIndex which is the same as the current number
+of elements in the array, has the effect of appending the element.
+
+
+@param anIndex   The position within the array where elements are to be
+                 inserted. The position is relative to zero, i.e. zero implies
+				 that elements are inserted at the beginning of the array.
+				 
+@param aRef      A reference to the class T object to be replicated and
+                 inserted into the array at position anIndex. 
+
+@param aReplicas The number of copies of the aRef element to be inserted into 
+                 the array.
+				 
+@leave KErrNoMemory The function may attempt to expand the array buffer. If 
+       there is insufficient memory available, the function leaves, in which
+	   case the array is left in the state it was in before the call.
+	   
+@panic E32USER-CBase 21, if anIndex is negative or is greater than the number
+                         of elements currently in the array.
+@panic E32USER-CBase 28, if aReplicas is negative.
+*/
+	{CArrayFixBase::InsertRepL(anIndex,&aRef,aReplicas);}
+
+
+
+
+template <class T>
+inline TInt CArrayFix<T>::InsertIsqL(const T &aRef,TKeyArrayFix &aKey)
+/**
+Inserts a single element into the array at a position determined by a key.
+
+The array MUST already be in key sequence (as defined by the key), otherwise 
+the position of the new element is unpredictable, or duplicates may occur.
+
+Elements with duplicate keys are not permitted.
+
+@param aRef A reference to the element of type <class T> to be inserted into 
+            the array.
+@param aKey A reference to a key object defining the properties of the key. 
+
+@return The position within the array of the newly inserted element. 
+
+@leave KErrAlreadyExists An element with the same key already exists within 
+       the array. NB the array MUST already be in key sequence, otherwise
+	   the function may insert a duplicate and fail to leave with
+	   this value.
+@leave KErrNoMemory The function may attempt to expand the array buffer. If 
+       there is insufficient memory available, the function leaves, in which
+	   case the array is left in the state it was in before the call.
+*/
+	{return(CArrayFixBase::InsertIsqL(&aRef,aKey));}
+
+
+
+
+template <class T>
+inline TInt CArrayFix<T>::InsertIsqAllowDuplicatesL(const T &aRef,TKeyArrayFix &aKey)
+/**
+Inserts a single element into the array at a position determined by a key, 
+allowing duplicates.
+
+The array MUST already be in key sequence (as defined by the key), otherwise 
+the position of the new element is unpredictable.
+
+If the new element's key is a duplicate of an existing element's key, then 
+the new element is positioned after the existing element.
+
+@param aRef A reference to the element of type <class T> to be inserted into 
+            the array.
+@param aKey A reference to a key object defining the properties of the key. 
+
+@return The position within the array of the newly inserted element.
+
+@leave KErrNoMemory The function may attempt to expand the array buffer. If 
+       there is insufficient memory available, the function leaves, in which
+	   case the array is left in the state it was in before the call.
+*/
+	{return(CArrayFixBase::InsertIsqAllowDuplicatesL(&aRef,aKey));}
+
+
+
+
+template <class T>
+inline void CArrayFix<T>::ResizeL(TInt aCount)
+/**
+Changes the size of the array so that it contains the specified number
+of elements.
+
+The following describes the effects of calling this function:
+
+1. If aCount is less than the current number of elements in the array, then the 
+   array is shrunk. The elements at positions aCount and above are discarded. 
+   The array buffer is not compressed.
+
+2. If aCount is greater than the current number of elements in the array, then 
+   the array is extended.
+
+3. New elements are replicated copies of an object of type <class T>,
+   constructed using the default constructor of that class.
+
+The new elements are positioned after the existing elements in the array.
+
+The function may attempt to expand the array buffer. If there is insufficient 
+memory available, the function leaves. The leave code is one of the system 
+wide error codes. If the function leaves, the array is left in the state it 
+was in before the call.
+
+@param aCount The number of elements the array is to contain after the resizing 
+              operation. 
+			  
+@panic E32USER-CBase 24, if aCount is negative.
+*/
+	{TUint8 b[sizeof(T)]; new(&b[0]) T; CArrayFixBase::ResizeL(aCount,&b[0]);}
+
+
+
+
+template <class T>
+inline void CArrayFix<T>::ResizeL(TInt aCount,const T &aRef)
+/**
+Changes the size of the array so that it contains the specified number
+of elements.
+
+The following describes the effects of calling this function:
+
+1. If aCount is less than the current number of elements in the array, then the 
+   array is shrunk. The elements at positions aCount and above are discarded. 
+   The array buffer is not compressed.
+
+2. If aCount is greater than the current number of elements in the array, then 
+   the array is extended.
+
+3. New elements are replicated copies of aRef.
+
+The new elements are positioned after the existing elements in the array.
+
+The function may attempt to expand the array buffer. If there is insufficient 
+memory available, the function leaves. The leave code is one of the system 
+wide error codes. If the function leaves, the array is left in the state it 
+was in before the call.
+
+@param aCount The number of elements the array is to contain after the resizing 
+              operation.
+
+@param aRef   A reference to an object of type <class T>, copies of which are
+              used as the new elements of the array, if the array is extended.
+
+@panic E32USER-CBase 24, if aCount is negative.
+*/
+	{CArrayFixBase::ResizeL(aCount,&aRef);}
+
+
+
+
+template <class T>
+inline const TArray<T> CArrayFix<T>::Array() const
+/**
+Constructs and returns a TArray<T> object.
+
+@return A TArray<T> object representing this array.
+*/
+	{return(TArray<T>(CountR,AtR,this));}
+
+
+
+
+inline CArrayFix<TAny>::CArrayFix(TBufRep aRep,TInt aRecordLength,TInt aGranularity)
+	: CArrayFixBase(aRep,aRecordLength,aGranularity)
+/**
+@internalComponent
+*/
+	{}
+
+
+
+
+inline const TAny *CArrayFix<TAny>::At(TInt anIndex) const
+/**
+Gets a pointer to the untyped element located at the specified position 
+within the array.
+	
+@param anIndex The position of the element within the array. The position 
+	           is relative to zero; i.e. zero implies the first element in the
+			   array. 
+			   
+@return A pointer to the untyped element located at position anIndex within 
+	    the array. 
+
+@panic E32User-CBase 21, if anIndex is negative or is greater than or equal
+       to the number of objects currently within the array.
+*/
+	{return(CArrayFixBase::At(anIndex));}
+
+
+
+
+inline const TAny *CArrayFix<TAny>::End(TInt anIndex) const
+/**
+Gets a pointer to the first byte following the end of the contiguous region 
+containing the element at the specfied position within the array.
+	
+For flat buffers, the pointer always points to the first byte following the 
+end of the buffer.
+	
+For segmented buffers, the pointer always points to the first byte following 
+the end of the segment which contains the element.
+	
+@param anIndex The position of the element within the array. The position 
+	           is relative to zero; i.e. zero implies the first element in
+			   the array.
+
+@return A pointer to the byte following the end of the contiguous region.
+
+@panic E32USER-CBase 21, if anIndex is negative or greater than or equal to
+       the number of objects currently within the array.
+*/
+	{return(CArrayFixBase::End(anIndex));}
+
+
+
+
+inline const TAny *CArrayFix<TAny>::Back(TInt anIndex) const
+/**
+Gets a pointer to the beginning of a contiguous region.
+	
+For flat buffers, the function always returns a pointer to the beginning of 
+the buffer.
+	
+For segmented buffers, the function returns a pointer to the beginning of 
+the segment for all elements in that segment except the first. If the element 
+at the specified position is the first in a segment, then the function returns 
+a pointer the beginning of the previous segment.
+	
+For the first element in the array, the function returns a NULL pointer.
+	
+@param anIndex The position of the element within the array. The position 
+               is relative to zero; i.e. zero implies the first element in the array.
+	
+@return A pointer to the beginning of the contiguous region.
+
+@panic E32User-CBase 21, if anIndex is negative or is greater than or equal to
+       the number of objects currently within the array.
+*/
+	{return(CArrayFixBase::Back(anIndex));}
+
+
+
+
+inline TAny *CArrayFix<TAny>::At(TInt anIndex)
+/**
+Gets a pointer to the untyped element located at the specified position 
+within the array.
+	
+@param anIndex The position of the element within the array. The position 
+	           is relative to zero; i.e. zero implies the first element in the
+			   array. 
+			   
+@return A pointer to the untyped element located at position anIndex within 
+	    the array. 
+
+@panic E32User-CBase 21, if anIndex is negative or is greater than or equal
+       to the number of objects currently within the array.
+*/
+	{return(CArrayFixBase::At(anIndex));}
+
+
+
+
+inline TAny *CArrayFix<TAny>::End(TInt anIndex)
+/**
+Gets a pointer to the first byte following the end of the contiguous region 
+containing the element at the specfied position within the array.
+	
+For flat buffers, the pointer always points to the first byte following the 
+end of the buffer.
+	
+For segmented buffers, the pointer always points to the first byte following 
+the end of the segment which contains the element.
+	
+@param anIndex The position of the element within the array. The position 
+	           is relative to zero; i.e. zero implies the first element in
+			   the array.
+
+@return A pointer to the byte following the end of the contiguous region.
+
+@panic E32USER-CBase 21, if anIndex is negative or greater than or equal to
+       the number of objects currently within the array.
+*/
+	{return(CArrayFixBase::End(anIndex));}
+
+
+
+
+inline TAny *CArrayFix<TAny>::Back(TInt anIndex)
+/**
+Gets a pointer to the beginning of a contiguous region.
+	
+For flat buffers, the function always returns a pointer to the beginning of 
+the buffer.
+	
+For segmented buffers, the function returns a pointer to the beginning of 
+the segment for all elements in that segment except the first. If the element 
+at the specified position is the first in a segment, then the function returns 
+a pointer the beginning of the previous segment.
+	
+For the first element in the array, the function returns a NULL pointer.
+	
+@param anIndex The position of the element within the array. The position 
+               is relative to zero; i.e. zero implies the first element in the array.
+	
+@return A pointer to the beginning of the contiguous region.
+
+@panic E32User-CBase 21, if anIndex is negative or is greater than or equal to
+       the number of objects currently within the array.
+*/
+	{return(CArrayFixBase::Back(anIndex));}
+
+
+
+
+inline void CArrayFix<TAny>::AppendL(const TAny *aPtr)
+/**
+Appends the specified untyped element onto the end of the array.
+	
+@param aPtr A pointer to an untyped element to be appended. 
+
+@leave KErrNoMemory The function may attempt to expand the array buffer. If 
+	   there is insufficient memory available, the function leaves, in which
+	   case the array is left in the state it was in before the call. 
+*/
+	{CArrayFixBase::InsertL(Count(),aPtr);}
+
+
+
+
+inline void CArrayFix<TAny>::AppendL(const TAny *aPtr,TInt aCount)
+/**
+Appends one or more untyped elements onto the end of the array.
+	
+@param aPtr   A pointer to the first of the contiguous untyped elements to be 
+	          appended. 
+@param aCount The number of contiguous elements located at aPtr to be appended. 
+
+@leave KErrNoMemory The function may attempt to expand the array buffer. If 
+       there is insufficient memory available, the function leaves, in which
+	   case the array is left in the state it was in before the call. 
+@panic E32USER-CBase 23, if aCount is negative.
+*/
+	{CArrayFixBase::InsertL(Count(),aPtr,aCount);}
+
+
+
+
+inline TAny *CArrayFix<TAny>::ExtendL()
+/**
+Expands the array by the length of one element at the end of the array and 
+returns a pointer to this new location.
+	
+As elements are untyped, no construction is possible and the content of the 
+new location remains undefined.
+
+@return A pointer to the new element location at the end of the array.
+
+@leave KErrNoMemory The function may attempt to expand the array buffer. If 
+	   there is insufficient memory available, the function leaves, in which
+	   case the array is left in the state it was in before the call. 
+*/
+	{return(CArrayFixBase::ExpandL(Count()));}
+
+
+
+
+// Template class CArrayFixFlat
+template <class T>
+inline CArrayFixFlat<T>::CArrayFixFlat(TInt aGranularity)
+	: CArrayFix<T>((TBufRep)CBufFlat::NewL,aGranularity)
+/**
+Constructs a flat array of fixed length objects with the specified granularity.
+
+The length of all array elements is the length of the class passed as the 
+template parameter. The length must be non-zero.
+
+Note that no memory is allocated to the array buffer by this constructor.
+
+@param aGranularity The granularity of the array. 
+  
+@panic E32USER-CBase 17, if the length of the class implied by the template parameter is zero.
+
+@panic E32USER-CBase 18, if aGranularity is not positive.
+*/
+	{}
+
+
+
+
+template <class T>
+inline void CArrayFixFlat<T>::SetReserveL(TInt aCount)
+/**
+Reserves space in the array buffer.
+
+If necessary, the array buffer is allocated or re-allocated so that it can
+accommodate the specified number of elements.
+
+After a successful call to this function, elements can be added to the array 
+and the process is guaranteed not to fail for lack of memory - provided the 
+total number of elements does not exceed the number specified in this function.
+
+This function does not increase the number of elements in the array; i.e. 
+the member function CArrayFixBase::Count() returns the same value both before 
+and after a call to CArrayFixFlat::SetReserveL().
+
+@param aCount The total number of elements for which space is to be reserved. 
+	
+@panic E32USER-CBase 27, if aCount is less than the current number of elements
+                         in the array.
+*/
+	{this->SetReserveFlatL(aCount);}
+
+
+
+
+inline CArrayFixFlat<TAny>::CArrayFixFlat(TInt aRecordLength,TInt aGranularity)
+	: CArrayFix<TAny>((TBufRep)CBufFlat::NewL,aRecordLength,aGranularity)
+/**
+Constructs a flat array of fixed length objects with the specified granularity 
+to contain elements of the specified length.
+	
+Note that no memory is allocated to the array buffer by this constructor.
+	
+@param aRecordLength The length of the elements of this fixed length array. 
+@param aGranularity  The granularity of the array.
+	
+@panic E32USER-CBase 17, if aRecordLength is not positive.
+@panic E32USER-CBase 18, if aGranularity is  not positive.
+*/
+	{}
+
+
+
+
+inline void CArrayFixFlat<TAny>::SetReserveL(TInt aCount)
+/**
+Reserves space in the array buffer.
+
+If necessary, the array buffer is allocated or re-allocated so that it can
+accommodate the specified number of elements.
+	
+After a successful call to this function, elements can be added to the array 
+and the process is guaranteed not to fail for lack of memory - provided the 
+total number of elements does not exceed the specified number.
+	
+This function does not increase the number of elements in the array; i.e. 
+the member function CArrayFixBase::Count() returns the same value both before 
+and after a call to this function.
+	
+@param aCount The total number of elements for which space is to be reserved. 
+
+@panic E32USER-CBase 27, if aCount is less than the current number of elements
+                         in the array.
+*/
+	{SetReserveFlatL(aCount);}
+
+
+
+
+inline void CArrayFixFlat<TInt>::SetReserveL(TInt aCount)
+/**
+Reserves space in the array buffer.
+	
+If necessary, the array buffer is allocated or re-allocated so that it can 
+accommodate the specified number of TInt elements.
+	
+After a successful call to this function, elements can be added to the array 
+and the process is guaranteed not to fail for lack of memory - provided the 
+total number of elements does not exceed the specified number.
+	
+This function does not increase the number of elements in the array; i.e. 
+the member function CArrayFixBase::Count() returns the same value both before 
+and after a call to this function.
+	
+@param aCount The total number of elements for which space is to be reserved. 
+
+@panic E32USER-CBase 27, if aCount is less than the current number of elements
+                         in the array.
+*/
+	{SetReserveFlatL(aCount);}
+
+
+
+
+inline void CArrayFixFlat<TUid>::SetReserveL(TInt aCount)
+/**
+Reserves space in the array buffer.
+	
+If necessary, the array buffer is allocated or re-allocated so that it can 
+accommodate the specified number of TUid elements.
+	
+After a successful call to this function, elements can be added to the array 
+and the process is guaranteed not to fail for lack of memory - provided the 
+total number of elements does not exceed the specified number.
+	
+This function does not increase the number of elements in the array; i.e. 
+the member function CArrayFixBase::Count() returns the same value both before 
+and after a call to this function.
+	
+@param aCount The total number of elements for which space is to be reserved. 
+
+@panic E32USER-CBase 27, if aCount is less than the current number of elements
+                         in the array.
+*/
+	{SetReserveFlatL(aCount);}
+
+
+
+
+// Template class CArrayFixSeg
+template <class T>
+inline CArrayFixSeg<T>::CArrayFixSeg(TInt aGranularity)
+	: CArrayFix<T>((TBufRep)CBufSeg::NewL,aGranularity)
+/**
+Constructs a segmented array of fixed length objects with the specified
+granularity.
+
+The length of all array elements is the length of the class passed as the 
+template parameter. The length must be non-zero.
+
+Note that no memory is allocated to the array buffer by this constructor.
+
+@param aGranularity The granularity of the array. 
+
+@panic E32USER-CBase 17, if the length of the class implied by the template
+                         parameter is zero.
+@panic E32USER-CBase 18, if aGranularity is not positive.
+*/
+	{}
+
+
+
+
+inline CArrayFixSeg<TAny>::CArrayFixSeg(TInt aRecordLength,TInt aGranularity)
+	: CArrayFix<TAny>((TBufRep)CBufSeg::NewL,aRecordLength,aGranularity)
+/**
+Constructs a segmented array of fixed length objects with the specified
+granularity to contain elements of the specified length.
+	
+Note that no memory is allocated to the array buffer by this constructor.
+	
+@param aRecordLength The length of the elements of this array.
+
+@param aGranularity The granularity of the array.
+
+@panic E32USER-CBase 17, if aRecordLength is not positive.
+@panic E32USER-CBase 18, if aGranularity is not positive.
+*/
+	{}
+
+
+
+
+// Template class CArrayPtr
+template <class T>
+inline CArrayPtr<T>::CArrayPtr(TBufRep aRep,TInt aGranularity)
+	: CArrayFix<T*>(aRep,aGranularity)
+/**
+@internalComponent
+*/
+	{}
+
+
+
+
+template <class T>
+void CArrayPtr<T>::ResetAndDestroy()
+/**
+Destroys all objects whose pointers form the elements of the array, before 
+resetting the array.
+
+The destructor of each class T object is called before the objects themselves 
+are destroyed.
+
+If the array is not empty, this member function must be called before the 
+array is deleted to prevent the CBase derived objects from being orphaned 
+on the heap.
+
+Note that each call to this function results in a small, but non-trivial,
+amount of code being generated.
+*/
+	{
+	for (TInt i=0;i<this->Count();++i)
+		delete this->At(i);
+	this->Reset();
+	}
+
+
+
+
+// Template class CArrayPtrFlat
+template <class T>
+inline CArrayPtrFlat<T>::CArrayPtrFlat(TInt aGranularity)
+	: CArrayPtr<T>((TBufRep)CBufFlat::NewL,aGranularity)
+/** 
+Constructs a flat array of pointers with specified granularity.
+
+Note that no memory is allocated to the array buffer by this constructor.
+
+@param aGranularity The granularity of the array. 
+
+@panic E32USER-CBase 18, if aGranularity is not positive.
+*/
+	{}
+
+
+
+
+template <class T>
+inline void CArrayPtrFlat<T>::SetReserveL(TInt aCount)
+/**
+Reserves space in the array buffer.
+
+If necessary, the array buffer is allocated or re-allocated so that it can
+accommodate the specified number of elements.
+
+After a successful call to this function, elements can be added to the array 
+and the process is guaranteed not to fail for lack of memory - provided the 
+total number of elements does not exceed the specified number.
+
+This function does not increase the number of elements in the array; i.e. 
+the member function CArrayFixBase::Count() returns the same value both before 
+and after a call to this function.
+
+@param aCount The total number of elements for which space is to be reserved. 
+
+@panic E32USER-CBase 27, if aCount is less than the current number of elements
+       in the array.
+*/
+	{this->SetReserveFlatL(aCount);}
+
+
+
+
+// Template class CArrayPtrSeg
+template <class T>
+inline CArrayPtrSeg<T>::CArrayPtrSeg(TInt aGranularity)
+	: CArrayPtr<T>((TBufRep)CBufSeg::NewL,aGranularity)
+/**
+Constructs a segmented array of pointers with specified granularity.
+
+Note that no memory is allocated to the array buffer by this constructor.
+
+@param aGranularity The granularity of the array. 
+
+@panic E32USER-CBase 18, if aGranularity is not positive.
+*/
+	{}
+
+
+
+
+// Class CArrayVarBase
+inline TInt CArrayVarBase::Count() const
+/**
+Gets the number of elements held in the array.
+
+@return The number of array elements.
+*/
+	{return(iCount);}
+
+
+
+
+// Template class CArrayVar
+template <class T>
+inline CArrayVar<T>::CArrayVar(TBufRep aRep,TInt aGranularity)
+	: CArrayVarBase(aRep,aGranularity)
+/**
+@internalComponent
+*/
+	{}
+
+
+
+
+template <class T>
+inline const T &CArrayVar<T>::operator[](TInt anIndex) const
+/** 
+Gets a reference to the const element located at the specified position 
+within the array.
+
+The compiler uses this variant of the function if the returned reference is 
+used in an expression where it cannot be modified.
+
+@param anIndex The position of the element within the array, relative to zero; 
+               i.e. zero implies the first element.
+			   
+@return A const reference to the element located at position anIndex within 
+        the array. 
+
+@panic E32USER-CBase 21, if anIndex is negative or greater than or equal to the
+       number of objects currently within the array.
+*/
+	{return(*((const T *)CArrayVarBase::At(anIndex)));}
+
+
+
+
+template <class T>
+inline T &CArrayVar<T>::operator[](TInt anIndex)
+/**
+Gets a reference to the element located at the specified position within 
+the array.
+
+The compiler uses this variant of the function if the returned reference is 
+used in an expression where it can be modified.
+
+@param anIndex The position of the element within the array, relative to zero; 
+               i.e. zero implies the first element.
+
+
+@return A reference to the non-const element located at position anIndex within 
+        the array.
+
+@panic E32USER-CBase 21, if anIndex is negative or greater than or equal to the
+       number of objects currently within the array.
+*/
+	{return(*((T *)CArrayVarBase::At(anIndex)));}
+
+
+
+
+template <class T>
+inline const T &CArrayVar<T>::At(TInt anIndex) const
+/** 
+Gets a reference to the const element located at the specified position 
+within the array.
+
+The compiler uses this variant of the function if the returned reference is 
+used in an expression where it cannot be modified.
+
+@param anIndex The position of the element within the array, relative to zero; 
+               i.e. zero implies the first element.
+			   
+@return A const reference to the element located at position anIndex within 
+        the array. 
+
+@panic E32USER-CBase 21, if anIndex is negative or greater than or equal to the
+       number of objects currently within the array.
+*/
+	{return(*((const T *)CArrayVarBase::At(anIndex)));}
+
+
+
+template <class T>
+inline T &CArrayVar<T>::At(TInt anIndex)
+/**
+Gets a reference to the element located at the specified position within 
+the array.
+
+The compiler uses this variant of the function if the returned reference is 
+used in an expression where it can be modified.
+
+@param anIndex The position of the element within the array, relative to zero; 
+               i.e. zero implies the first element.
+
+@return A reference to the non-const element located at position anIndex within 
+        the array.
+
+@panic E32USER-CBase 21, if anIndex is negative or greater than or equal to the
+       number of objects currently within the array.
+*/
+	{return(*((T *)CArrayVarBase::At(anIndex)));}
+
+
+
+
+template <class T>
+inline void CArrayVar<T>::AppendL(const T &aRef,TInt aLength)
+/**
+Appends an element of a specified length onto the array.
+
+@param aRef    A reference to the <class T> element to be appended.
+@param aLength The length of the element to be appended.
+
+@leave KErrNoMemory The function always attempts to allocate a cell to
+       contain the new element and may also attempt to expand the array buffer.
+	   If there is insufficient memory available, the function leaves, in which
+	   case, the array is left in the state it was in before the call.
+
+@panic E32USER-CBase 30, if aLength is negative.
+*/
+	{CArrayVarBase::InsertL(Count(),&aRef,aLength);}
+
+
+
+
+template <class T>
+inline T &CArrayVar<T>::ExpandL(TInt anIndex,TInt aLength)
+/**
+Expands the array by one element of specified length at the specified position. 
+
+It:
+
+1. expands the array by one element position anIndex
+
+2. constructs a new element of specified length at that position
+
+3. returns a reference to the new element.
+
+All existing elements from position anIndex to the end of the array are moved 
+up, so that the element originally at position anIndex is now at position 
+anIndex + 1 etc.
+
+The new element of type <class T> and length aLength is constructed at position 
+anIndex, using the default constructor of that class.
+
+@param anIndex The position within the array where the array is to be expanded 
+               and the new <class T> object is to be constructed.
+			   
+@param aLength The length of the new element. 
+
+@return A reference to the newly constructed <class T> object at position 
+        anIndex within the array.
+
+@leave KErrNoMemory The function always attempts to allocate a cell to contain 
+       the new element and may also attempt to expand the array buffer. If there 
+       is insufficient memory available, the function leaves, in which case, the 
+       array is left in the state it was in before the call.
+
+@panic E32USER-CBase 21, if anIndex is negative or is greater than the number
+       of elements currently in the array.
+@panic E32USER-CBase 30, if aLength is negative.
+*/
+	{return(*new(CArrayVarBase::ExpandL(anIndex,aLength)) T);}
+
+
+
+
+template <class T>
+inline T &CArrayVar<T>::ExtendL(TInt aLength)
+/**
+Expands the array by one element of specified length at the end of the array. 
+
+It:
+
+1. expands the array by one element at the end of the array, i.e. at position 
+   CArrayVarBase::Count()
+
+2. constructs a new element of specified length at that position.
+
+3. returns a reference to the new element.
+
+The new element of type <class T> is constructed at the end of the array, 
+using the default constructor of that class.
+
+@param aLength The length of the new element.
+
+@return A reference to the newly constructed <class T> object at the end of 
+        the array.
+
+@leave KErrNoMemory The function always attempts to allocate a cell to contain 
+       the new element and may also attempt to expand the array buffer. If there 
+       is insufficient memory available, the function leaves, in which case, the 
+       array is left in the state it was in before the call.
+  
+@panic E32USER-CBase 30, if aLength is negative.
+*/
+	{return(*new(CArrayVarBase::ExpandL(Count(),aLength)) T);}
+
+
+
+
+template <class T>
+inline TInt CArrayVar<T>::Find(const T &aRef,TKeyArrayVar &aKey,TInt &anIndex) const
+/**
+Finds the position of an element within the array, based on the matching of 
+keys, using a sequential search.
+
+The array is searched sequentially for an element whose key matches the key 
+of the supplied object. The search starts with the first element in the array.
+
+Note that where an array has elements with duplicate keys, the function only
+supplies the position of the first element in the array with that key.
+
+@param aRef    A reference to an object of type <class T> whose key is used 
+               for comparison.
+@param aKey    A reference to a key object defining the properties of the key.
+@param anIndex A TInt supplied by the caller. On return, if the element is
+               found, this is set to the position of that element
+			   within the array. The position is relative to zero, (i.e. 
+               the first element in the array is at position 0).
+			   If the element is not found or the array is empty, then
+			   this is undefined.
+
+@return Zero, if the element with the specified key is found. Non-zero, if 
+        the element with the specified key is not found.
+*/
+	{return(CArrayVarBase::Find(&aRef,aKey,anIndex));}
+
+
+
+
+template <class T>
+inline TInt CArrayVar<T>::FindIsq(const T &aRef,TKeyArrayVar &aKey,TInt &anIndex) const
+/**
+Finds the position of an element within the array, based on the matching of 
+keys, using a binary search technique.
+
+The array is searched, using a binary search technique, for an element whose 
+key matches the key of the supplied <class T> object.
+
+The array must be in key order.
+
+Note that where an array has elements with duplicate keys, the function cannot
+guarantee which element, with the given key value, it will return, except that
+it will find one of them.
+
+@param aRef    A reference to an object of type <class T> whose key is used 
+               for comparison.
+@param aKey    A reference to a key object defining the properties of the key.
+@param anIndex A TInt supplied by the caller. On return, if the element is
+               found, this is set to the position  of that element within
+			   the array. The position is relative to zero, (i.e. 
+               the first element in the array is at position zero).
+			   If the element is not found and the array is not empty, then
+			   this is set to the position of the first element in the array
+			   with a key which is greater than the key of the object aRef.
+			   If the element is not found and the array is empty, then 
+               this is undefined.
+
+@return Zero, if the element with the specified key is found or the array is 
+        empty. Non-zero, if the element with the specified key is not found.
+*/
+	{return(CArrayVarBase::FindIsq(&aRef,aKey,anIndex));}
+
+
+
+
+template <class T>
+inline void CArrayVar<T>::InsertL(TInt anIndex,const T &aRef,TInt aLength)
+/**
+Inserts an element of a specified length into the array at the specified
+position.
+
+Note that passing a value of anIndex which is the same as the current number
+of elements in the array, has the effect of appending that element.
+
+@param anIndex The position within the array where the element is to be
+               inserted. The position is relative to zero, i.e. zero implies
+			   that elements are inserted at the beginning of the array.
+@param aRef    A reference to the <class T> object to be inserted into
+               the array.
+@param aLength The length of the element to be inserted into the array. 
+
+@leave KErrNoMemory The function always attempts to allocate a cell to contain 
+       the new element and may also attempt to expand the array buffer. If
+	   there is insufficient memory available, the function leaves, in which
+	   case, the array is left in the state it was in before the call.
+
+@panic E32USER-CBase 21, if anIndex is negative or is greater than the number
+       of objects currently in the array.
+@panic E32USER-CBase 30, if aLength is is negative.
+*/
+	{CArrayVarBase::InsertL(anIndex,&aRef,aLength);}
+
+
+
+
+template <class T>
+inline TInt CArrayVar<T>::InsertIsqL(const T &aRef,TInt aLength,TKeyArrayVar &aKey)
+/**
+Inserts a single element of a specified length into the array at a position 
+determined by a key.
+
+The array MUST already be in key sequence (as defined by the key), otherwise 
+the position of the new element is unpredictable, or duplicates may occur.
+
+Elements with duplicate keys are not permitted.
+
+@param aRef    A reference to the element of type <class T> to be inserted into 
+               the array.
+@param aLength The length of the new element of type <class T> to be inserted 
+               into the array.
+@param aKey    A reference to a key object defining the properties of the key.
+
+@return The position within the array of the newly inserted element.
+
+@leave KErrAlreadyExists An element with the same key already exists within 
+       the array. NB the array MUST already be in key sequence, otherwise
+	   the function may insert a duplicate and fail to leave with
+	   this value.
+@leave KErrNoMemory The function always attempts to allocate a cell to contain 
+       the new element and may also attempt to expand the array buffer. If
+	   there is insufficient memory available, the function leaves, in which
+	   case, the array is left in the state it was in before the call.
+*/
+	{return(CArrayVarBase::InsertIsqL(&aRef,aLength,aKey));}
+
+
+
+
+template <class T>
+inline TInt CArrayVar<T>::InsertIsqAllowDuplicatesL(const T &aRef,TInt aLength,TKeyArrayVar &aKey)
+/**
+Inserts a single element of a specified length into the array at a position 
+determined by a key, allowing duplicates.
+
+The array MUST already be in key sequence, otherwise the position of the 
+new element is unpredictable.
+
+Elements with duplicate keys are permitted. If the new element's key is a 
+duplicate of an existing element's key, then the new element is positioned 
+after the existing element.
+
+@param aRef    A reference to the element of type <class T> to be inserted
+               into the array.
+@param aLength The length of the new element to be inserted into the array. 
+@param aKey    A reference to a key object defining the properties of the key. 
+
+@return The position within the array of the newly inserted element.
+
+@leave KErrNoMemory The function always attempts to allocate a cell to contain 
+       the new element and may also attempt to expand the array buffer. If
+	   there is insufficient memory available, the function leaves, in which
+	   case, the array is left in the state it was in before the call.
+*/
+	{return(CArrayVarBase::InsertIsqAllowDuplicatesL(&aRef,aLength,aKey));}
+
+
+
+
+template <class T>
+inline const TArray<T> CArrayVar<T>::Array() const
+/**
+Constructs and returns a TArray<T> object.
+
+@return A TArray<T> object for this array.
+*/
+	{return(TArray<T>(CountR,AtR,this));}
+
+
+
+
+inline const TAny *CArrayVar<TAny>::At(TInt anIndex) const
+/**
+Returns a pointer to the untyped element located at the specified position 
+within the array.
+	
+The compiler uses this variant of the function if the returned pointer is 
+used in an expression where it cannot be modified.
+	
+@param anIndex The position of the element within the array, relative to zero; 
+	           i.e. zero implies the first element.
+
+@return A pointer to the const element located at position anIndex within the 
+        array.
+
+@panic E32USER-CBase 21, if anIndex is negative or greater than or equal to the
+       number of objects currently within the array.
+*/
+	{return(CArrayVarBase::At(anIndex));}
+
+
+
+
+inline CArrayVar<TAny>::CArrayVar(TBufRep aRep,TInt aGranularity)
+	: CArrayVarBase(aRep,aGranularity)
+/**
+Constructs a variable array with the specified granularity and buffer
+organization.
+	
+Note that no memory is allocated to the array buffer by this constructor.
+	
+@param aRep         A pointer to a function used to expand the array buffer.
+                    The organisation of the array buffer is implied by the
+					choice of this function.
+			        For a flat array buffer, pass (TBufRep)CBufFlat::NewL.
+			        For a segmented array buffer, pass (TBufRep)CBufSeg::NewL. 
+@param aGranularity The granularity of the array. 
+
+@panic E32USER-CBase 19, if aGranularity is not positive.
+*/
+	{}
+
+
+
+
+inline TAny *CArrayVar<TAny>::At(TInt anIndex)
+/**
+Returns a pointer to the untyped element located at the specified position 
+within the array.
+	
+The compiler uses this variant of the function if the returned pointer is 
+used in an expression where it can be modified.
+	
+@param anIndex The position of the element within the array, relative to zero; 
+	           i.e. zero implies the first element.
+
+@return A pointer to the non-const element located at position anIndex within the 
+        array.
+
+@panic E32USER-CBase 21, if anIndex is negative or greater than or equal to the
+       number of objects currently within the array.
+*/
+	{return(CArrayVarBase::At(anIndex));}
+
+
+
+
+inline void CArrayVar<TAny>::AppendL(const TAny *aPtr,TInt aLength)
+/**
+Appends an untyped element of specified length onto the end of the array.
+	
+@param aPtr    A pointer to an untyped element to be appended. 
+@param aLength The length of the untyped element.
+*/
+	{CArrayVarBase::InsertL(Count(),aPtr,aLength);}
+
+
+
+
+inline TAny *CArrayVar<TAny>::ExtendL(TInt aLength)
+/**
+Extends the array by one element of specified length at the end of the array,
+i.e. at position CArrayVarBase::Count(), and returns a pointer to the new
+element location.
+
+As elements are untyped, no construction is possible and the content of the
+new location remains undefined.
+
+Note that the function always attempts to allocate a cell to contain the new
+element and may also attempt to expand the array buffer. If there is
+insufficient memory available, the function leaves.
+The leave code is one of the system wide error codes.
+If the function leaves, the array is left in the state it was in before
+the call. 
+
+@param aLength The length of the new element.
+
+@return A pointer to the new element location at the end of the array. 
+*/
+	{return(CArrayVarBase::ExpandL(Count(),aLength));}
+
+
+
+
+// Template class CArrayVarFlat
+template <class T>
+inline CArrayVarFlat<T>::CArrayVarFlat(TInt aGranularity)
+	: CArrayVar<T>((TBufRep)CBufFlat::NewL,aGranularity)
+/**
+Constructs a variable flat array with specified granularity.
+
+Note that no memory is allocated to the array buffer by this constructor.
+
+@param aGranularity The granularity of the array. 
+
+@panic E32USER-CBase 19, if aGranularity is not positive.
+*/
+	{}
+
+
+
+
+// Template class CArrayVarSeg
+template <class T>
+inline CArrayVarSeg<T>::CArrayVarSeg(TInt aGranularity)
+	: CArrayVar<T>((TBufRep)CBufSeg::NewL,aGranularity)
+/**
+Constructs a variable segmented array with specified granularity.
+
+Note that no memory is allocated to the array buffer by this constructor.
+
+@param aGranularity The granularity of the array.
+
+@panic E32USER-CBase 19, if aGranularity is not positive.
+*/
+	{}
+
+
+
+
+// Class CArrayPakBase
+inline TInt CArrayPakBase::Count() const
+/**
+Gets the number of elements held in the array.
+
+@return The number of array elements.
+*/
+	{return(iCount);}
+
+
+
+
+// Template class CArrayPak
+template <class T>
+inline CArrayPak<T>::CArrayPak(TBufRep aRep,TInt aGranularity)
+	: CArrayPakBase(aRep,aGranularity)
+/**
+@internalComponent
+*/
+	{}
+
+
+
+
+template <class T>
+inline const T &CArrayPak<T>::operator[](TInt anIndex) const
+/**
+Gets a reference to the element located at the specified position within the 
+array.
+
+The compiler uses this variant of the function when the returned reference 
+is used in an expression where it cannot be modified.
+
+@param anIndex The position of the element within the array. The position 
+               is relative to zero; i.e. zero implies the first element in
+			   the array.  
+		
+@return A const reference to the element located at position anIndex within 
+        the array.
+
+@panic E32USER-CBase 21, if anIndex is negative or greater than or equal to
+       number of objects currently within the array.
+*/
+	{return(*((const T *)CArrayPakBase::At(anIndex)));}
+
+
+
+
+template <class T>
+inline T &CArrayPak<T>::operator[](TInt anIndex)
+/**
+Gets a reference to the element located at the specified position within the 
+array.
+
+The compiler uses this variant of the function when the returned reference 
+is used in an expression where it can be modified.
+
+@param anIndex The position of the element within the array. The position 
+               is relative to zero; i.e. zero implies the first element in
+			   the array.  
+		
+@return A non-const reference to the element located at position anIndex within 
+        the array.
+
+@panic E32USER-CBase 21, if anIndex is negative or greater than or equal to
+       number of objects currently within the array.
+*/
+	{return(*((T *)CArrayPakBase::At(anIndex)));}
+
+
+
+
+template <class T>
+inline const T &CArrayPak<T>::At(TInt anIndex) const
+/**
+Gets a reference to the element located at the specified position within the 
+array.
+
+The compiler uses this variant of the function when the returned reference 
+is used in an expression where it cannot be modified.
+
+@param anIndex The position of the element within the array. The position 
+               is relative to zero; i.e. zero implies the first element in
+			   the array.  
+		
+@return A const reference to the element located at position anIndex within 
+        the array.
+
+@panic E32USER-CBase 21, if anIndex is negative or greater than or equal to
+       number of objects currently within the array.
+*/
+	{return(*((const T *)CArrayPakBase::At(anIndex)));}
+
+
+
+
+template <class T>
+inline T &CArrayPak<T>::At(TInt anIndex)
+/**
+Gets a reference to the element located at the specified position within the 
+array.
+
+The compiler uses this variant of the function when the returned reference 
+is used in an expression where it can be modified.
+
+@param anIndex The position of the element within the array. The position 
+               is relative to zero; i.e. zero implies the first element in
+			   the array.  
+		
+@return A non-const reference to the element located at position anIndex within 
+        the array.
+
+@panic E32USER-CBase 21, if anIndex is negative or greater than or equal to
+       number of objects currently within the array.
+*/
+	{return(*((T *)CArrayPakBase::At(anIndex)));}
+
+
+
+
+template <class T>
+inline void CArrayPak<T>::AppendL(const T &aRef,TInt aLength)
+/**
+Appends an element of a specified length onto the array.
+
+@param aRef    A reference to the class T element to be appended.
+@param aLength The length of the element to be appended.
+
+@leave KErrNoMemory The function attempted to allocate from the heap and there 
+       is insufficient memory available. In this case, the array is left in
+	   the state it was in before the call.
+
+@panic E32USER-CBase 30, if aLength is negative.
+*/
+	{CArrayPakBase::InsertL(Count(),&aRef,aLength);}
+
+
+
+
+template <class T>
+inline T &CArrayPak<T>::ExpandL(TInt anIndex,TInt aLength)
+/**
+Expands the array by one element of specified length at the specified position. 
+
+It:
+
+1. expands the array by one element at the specified position.
+
+2. constructs a new element of specified length at that position.
+
+3. returns a reference to the new element.
+
+All existing elements from position anIndex to the end of the array are moved 
+up, so that the element originally at position anIndex is now at position 
+anIndex + 1 etc.
+
+The new element of type <class T> and length aLength is constructed at position 
+anIndex, using the default constructor of that class.
+
+@param anIndex The position within the array where the array is to be expanded 
+               and the new <class T> object is to be constructed. 
+@param aLength The length of the new element.
+
+@return A reference to the newly constructed <class T> object at position 
+        anIndex within the array.
+
+@leave KErrNoMemory The function attempted to allocate from the heap and there 
+       is insufficient memory available. In this case, the array is left in the
+	   state it was in before the call.
+
+@panic E32USER-CBase 21, if anIndex is negative or greater than the number of
+       elements currently in the array.
+@panic E32USER-CBase 30, if aLength is negative.
+*/
+	{return(*new(CArrayPakBase::ExpandL(anIndex,aLength)) T);}
+
+
+
+
+template <class T>
+inline T &CArrayPak<T>::ExtendL(TInt aLength)
+/**
+Expands the array by one element of specified length at the end of the array. 
+
+It:
+
+1. expands the array by one element at the end of the array, i.e. at position 
+   CArrayPakbase::Count().
+
+2. constructs a new element of length aLength at that position.
+
+3. returns a reference to the new element.
+
+The new element of type <class T> is constructed at the end of the array, 
+using the default constructor of that class.
+
+@param aLength The length of the new element.
+
+@return A reference to the newly constructed <class T> object at the end of 
+        the array.
+
+@leave KErrNoMemory The function attempted to allocate from the heap and there 
+       is insufficient memory available. In this case, the array is left in the
+	   state it was in before the call.
+
+@panic E32USER-CBase 30, if aLength is negative.
+*/
+	{return(*new(CArrayPakBase::ExpandL(Count(),aLength)) T);}
+
+
+
+
+template <class T>
+inline TInt CArrayPak<T>::Find(const T &aRef,TKeyArrayPak &aKey,TInt &anIndex) const
+/**
+Finds the position of an element within the array, based on the matching of 
+keys, using a sequential search.
+
+The array is searched sequentially for an element whose key matches the key 
+of the supplied <class T> object. The search starts with the first element 
+in the array.
+
+Note that where an array has elements with duplicate keys, the function only
+supplies the position of the first element in the array with that key.
+
+@param aRef    A reference to an object of type <class T> whose key is used 
+               for comparison.
+@param aKey    A reference to a key object defining the properties of the key.
+@param anIndex A reference to a TInt supplied by the caller. On return, if the
+               element is found, this is set to the position 
+               of that element within the array. The position is relative to zero, (i.e. 
+               the first element in the array is at position 0).
+			   If the element is not found or the array is empty, then this is undefined.
+
+@return Zero, if the element with the specified key is found. Non-zero, if 
+        the element with the specified key is not found.
+*/
+	{return(CArrayPakBase::Find(&aRef,aKey,anIndex));}
+
+
+
+
+template <class T>
+inline TInt CArrayPak<T>::FindIsq(const T &aRef,TKeyArrayPak &aKey,TInt &anIndex) const
+/**
+Finds the position of an element within the array, based on the matching of 
+keys, using a binary search technique.
+
+The array is searched, using a binary search technique, for an element whose 
+key matches the key of the supplied <class T> object.
+
+The array must be in key order.
+
+Note that where an array has elements with duplicate keys, the function cannot
+guarantee which element, with the given key value, it will return, except that it
+will find one of them.
+
+@param aRef    A reference to an object of type <class T> whose key is used 
+               for comparison.
+@param aKey    A reference to a key object defining the properties of the key.
+@param anIndex A reference to a TInt supplied by the caller. On return, if the
+               element is found, this is set to the position of that element
+			   within the array. The position is relative to zero, (i.e. 
+               the first element in the array is at position 0).
+			   If the element is not found and the array is not empty, then
+			   this is set to the position of the first element in the array
+			   with a key which is greater than the key of the object aRef.
+			   If the element is not found and the array is empty, then this 
+               is undefined.
+
+@return Zero, if the element with the specified key is found or the array is 
+        empty.
+		Non-zero, if the element with the specified key is not found.
+*/
+	{return(CArrayPakBase::FindIsq(&aRef,aKey,anIndex));}
+
+
+
+
+template <class T>
+inline void CArrayPak<T>::InsertL(TInt anIndex,const T &aRef,TInt aLength)
+/** 
+Inserts an element of a specified length into the array at the specified
+position.
+
+@param anIndex The position within the array where the element is to be
+               inserted. The position is relative to zero, i.e. zero implies
+			   that elements are inserted at the beginning of the array.
+@param aRef    A reference to the class T object to be inserted into
+               the array.
+@param aLength The length of the element to be inserted into the array.
+
+@leave KErrNoMemory The function attempted to expand the array buffer and there
+       is insufficient memory available. In this case, the array is left in the
+	   state it was in before the call.
+
+@panic E32USER-CBase 21, if anIndex is negative or greater than the number of
+       objects currently in the array.
+@panic E32USER-CBase 30, if aLength is negative.
+*/
+	{CArrayPakBase::InsertL(anIndex,&aRef,aLength);}
+
+
+
+
+template <class T>
+inline TInt CArrayPak<T>::InsertIsqL(const T &aRef,TInt aLength,TKeyArrayPak &aKey)
+/**
+Inserts a single element of a specified length into the array at a position 
+determined by a key.
+
+The array MUST already be in key sequence (as defined by the key), otherwise 
+the position of the new element is unpredictable, or duplicates may occur.
+
+Elements with duplicate keys are not permitted.
+
+@param aRef    A reference to the element of type <class T> to be inserted into 
+               the array.
+@param aLength The length of the new element of type <class T> to be inserted 
+               into the array.
+@param aKey    A reference to a key object defining the properties of the key.
+
+@return The position within the array of the newly inserted element.
+
+@leave KErrAlreadyExists An element with the same key already exists within 
+       the array. NB the array MUST already be in key sequence, otherwise
+	   the function may insert a duplicate and fail to leave with
+	   this value.
+@leave KErrNoMemory The function attempted to expand the array buffer and there 
+       is insufficient memory available. In this case, the array is left in the
+	   state it was in before the call.
+*/
+	{return(CArrayPakBase::InsertIsqL(&aRef,aLength,aKey));}
+
+
+
+
+template <class T>
+inline TInt CArrayPak<T>::InsertIsqAllowDuplicatesL(const T &aRef,TInt aLength,TKeyArrayPak &aKey)
+/**
+Inserts a single element of a specified length into the array at a position 
+determined by a key, allowing duplicates.
+
+The array MUST already be in key sequence, otherwise the position of the 
+new element is unpredictable.
+
+Elements with duplicate keys are permitted. If the new element's key is a 
+duplicate of an existing element's key, then the new element is positioned 
+after the existing element.
+
+@param aRef    A reference to the element of type <class T> to be inserted into
+               the array.
+@param aLength The length of the new element to be inserted into the array.
+@param aKey    A reference to a key object defining the properties of the key.
+
+@return The position within the array of the newly inserted element. 
+
+@leave KErrNoMemory The function attempted to expand the array buffer and there 
+       is insufficient memory available. In this case, the array is left in the
+	   state it was in before the call.
+*/
+	{return(CArrayPakBase::InsertIsqAllowDuplicatesL(&aRef,aLength,aKey));}
+
+
+
+
+template <class T>
+inline const TArray<T> CArrayPak<T>::Array() const
+/**
+Constructs and returns a TArray<T> object.
+
+@return A Tarray<T> object for this array.
+*/
+	{return(TArray<T>(CountR,AtR,this));}
+
+
+
+
+inline CArrayPak<TAny>::CArrayPak(TBufRep aRep,TInt aGranularity)
+	: CArrayPakBase(aRep,aGranularity)
+/**
+Constructs a variable array with the specified granularity and
+buffer organisation.
+	
+Note that no memory is allocated to the array buffer by this constructor.
+	
+@param aRep         A pointer to a function used to expand the array buffer. 
+                    The organisation of the array buffer is implied by the
+					choice of this function.
+	                For a flat array buffer, pass (TBufRep)CBufFlat::NewL.
+			        For a segmented array buffer, pass (TBufRep)CBufSeg::NewL. 
+@param aGranularity The granularity of the array. 
+
+@panic E32USER-CBase 19, if aGranularity is not positive.
+*/
+	{}
+
+
+
+
+inline const TAny *CArrayPak<TAny>::At(TInt anIndex) const
+/**
+Gets a pointer to the untyped element located at the specified position 
+within the array.
+	
+The compiler uses this variant of the function if the returned reference is 
+used in an expression where that reference cannot be modified.
+	
+@param anIndex The position of the element within the array, relative to zero; 
+               i.e. zero implies the first element.
+
+@return A pointer to the const element located at position anIndex within 
+	    the array.
+
+@panic E32USER-CBase 21, if anIndex is negative or greater than or equal to
+       the number of objects currently within the array.
+*/
+	{return(CArrayPakBase::At(anIndex));}
+
+
+
+
+inline TAny *CArrayPak<TAny>::At(TInt anIndex)
+/**
+Gets a pointer to the untyped element located at the specified position 
+within the array.
+	
+The compiler uses this variant of the function if the returned reference is 
+used in an expression where that reference can be modified.
+	
+@param anIndex The position of the element within the array, relative to zero; 
+               i.e. zero implies the first element.
+
+@return A pointer to the non-const element located at position anIndex within 
+	    the array.
+
+@panic E32USER-CBase 21, if anIndex is negative or greater than or equal to
+       the number of objects currently within the array.
+*/
+	{return(CArrayPakBase::At(anIndex));}
+
+
+
+
+inline void CArrayPak<TAny>::AppendL(const TAny *aPtr,TInt aLength)
+/**
+Appends the untyped element of the specified length onto the end of the array.
+	
+@param aPtr    A pointer to an untyped element to be appended. 
+@param aLength The length of the untyped element. 
+
+@leave KErrNoMemory The function attempted to expand the array buffer and there 
+       is insufficient memory available. In this case, the array is left in the
+	   state it was in before the call.
+*/
+	{CArrayPakBase::InsertL(Count(),aPtr,aLength);}
+
+
+
+
+inline TAny *CArrayPak<TAny>::ExtendL(TInt aLength)
+/**
+Expands the array by one element of the specified length at the end of
+the array, and returns a pointer to this new location.
+
+As elements are untyped, no construction is possible and the content of
+the new location remains undefined.
+
+@param aLength  The length of the new element.
+
+@return A pointer to the new element location at the end of the array.
+
+@leave KErrNoMemory The function attempted to expand the array buffer and there
+       is insufficient memory available. In this case, the array is left in the
+	   state it was in before the call.
+*/
+	{return(CArrayPakBase::ExpandL(Count(),aLength));}
+
+
+
+
+// Template class CArrayPakFlat
+template <class T>
+inline CArrayPakFlat<T>::CArrayPakFlat(TInt aGranularity)
+	: CArrayPak<T>((TBufRep)CBufFlat::NewL,aGranularity)
+/**
+Constructs a packed flat array with specified granularity.
+
+Note that no memory is allocated to the array buffer by this  constructor.
+
+@param aGranularity The granularity of the array.
+
+@panic E32USER-CBase 20, if aGranularity is not positive.
+*/
+	{}
+
+
+
+
+// Class CObject
+inline TInt CObject::UniqueID() const
+/**
+Gets this reference counting object's unique ID.
+
+The unique ID is an integer which is a property of the object container. It 
+forms part of the identity of all reference counting objects and is the same 
+value for all reference counting objects held within the same object container.
+
+@return This reference counting object's unique ID.
+
+@see CObjectCon
+*/
+	{return(iContainer->UniqueID());}
+
+
+
+
+inline TInt CObject::AccessCount() const
+/**
+Gets the number of open references to this reference counting object.
+
+@return The number of open references.
+*/
+	{return(iAccessCount);}
+
+
+
+
+inline void CObject::Inc()
+/**
+Adds one to the reference count.
+
+This function is called by the default implementation of the Open() member 
+function of this class.
+
+@see CObject::Open
+*/
+	{iAccessCount++;}
+
+
+
+
+inline void CObject::Dec()
+/**
+Subtracts one from the reference count.
+
+This function is called by the default implementation of the Close() member 
+function of this class.
+
+@see CObject::Close
+*/
+	{iAccessCount--;}
+
+
+
+
+inline CObject * CObject::Owner() const
+/**
+Gets a pointer to the reference counting object which owns this
+reference counting object.
+
+@return A pointer to the owning reference counting object. This is NULL, if 
+        there is no owner.
+*/
+	{return(iOwner);}
+
+
+
+
+inline void CObject::SetOwner(CObject *anOwner)
+/**
+Sets the owner of this reference counting object.
+
+If this reference counting object already has an owner, then all knowledge 
+of that owner is lost.
+
+@param anOwner A pointer to the reference counting object which is to be the 
+               new owner of this reference counting object.
+*/
+	{iOwner=anOwner;}
+
+
+
+
+// class CObjectIx
+inline TInt CObjectIx::Count() const
+/**
+Gets the number greater then the last slot number used to hold valid CObject pointer.
+The input argument of CObject* CObjectIx::operator[]() must be less then the number returned by this method.
+
+@return The number greater then the last used slot.
+
+@see CObjectIx::ActiveCount
+@see CObjectIx::operator[]
+*/
+	{return iHighWaterMark;}
+
+
+
+
+inline TInt CObjectIx::ActiveCount() const
+/**
+Gets the current number of reference counting objects held by this
+object index.
+
+@return The current number.
+*/
+	{return iNumEntries;}
+
+
+
+// class CObjectCon
+inline TInt CObjectCon::UniqueID() const
+/**
+Gets this object container's unique ID.
+
+@return The unique ID value.
+*/
+	{return iUniqueID;}
+
+
+
+
+inline TInt CObjectCon::Count() const
+/**
+Gets the number of reference counting objects in this object container.
+
+@return The number of objects.
+*/
+	{return iCount;}
+
+
+
+
+
+// class CCirBufBase
+inline TInt CCirBufBase::Count() const
+/**
+Gets the current number of objects in this circular buffer.
+
+@return The number of objects in this circular buffer.
+        This value can never be greater than the maximum capacity.
+*/
+	{return(iCount);}
+
+
+
+
+inline TInt CCirBufBase::Length() const
+/**
+Gets the maximum capacity of this circular buffer.
+
+The capacity is the maximum number of elements that the buffer can hold.
+
+Use SetLengthL() to change the capacity of the circular buffer.
+
+@return The maximum capacity of this circular buffer.
+
+@see CCirBufBase::SetLengthL
+*/
+	{return(iLength);}
+
+
+
+
+// Template class CCirBuf
+template <class T>
+inline CCirBuf<T>::CCirBuf()
+	: CCirBufBase(sizeof(T))
+/**
+Default C++ constructor.
+
+The size of each object in the buffer is fixed and is the length of the class 
+passed as the template parameter. 
+
+@panic E32USER-CBase 72, if the length of the template class is zero.
+*/
+	{}
+
+
+
+
+template <class T>
+inline TInt CCirBuf<T>::Add(const T *aPtr)
+/**
+Adds a single object to the circular buffer.
+
+The object is of type class T and is only added if there is space available.
+
+@param aPtr A pointer to the object of type class T to be added to the circular 
+            buffer.
+
+@return 1 if the object is successfully added. 0 if the object cannot be added 
+        because the circular buffer is full.
+
+@panic E32USER-CBase 74, if a call to CCirBufBase::SetLengthL() has not been
+                         made before calling this function.
+
+@see CCirBufBase::SetLengthL
+*/
+	{return(DoAdd((const TUint8 *)aPtr));}
+
+
+
+
+template <class T>
+inline TInt CCirBuf<T>::Add(const T *aPtr,TInt aCount)
+/**
+Adds multiple objects to the circular buffer.
+
+The function attempts to add aCount objects of type class T. The objects are
+only added if there is space available.
+
+@param aPtr   A pointer to a set of contiguous objects of type class T to be 
+              added to the circular buffer.
+
+@param aCount The number of objects to be added to the circular buffer.
+
+@return The number of objects successfully added to the buffer. This value 
+        may be less than the number requested and can range from 0 to aCount. 
+
+@panic E32USER-CBase 74, if a call to CCirBufBase::SetLengthL() has not been
+                         made before calling this function.
+@panic E32USER-CBase 75, if aCount is not a positive value. 
+
+@see CCirBufBase::SetLengthL
+*/
+	{return(DoAdd((const TUint8 *)aPtr,aCount));}
+
+
+
+
+template <class T>
+inline TInt CCirBuf<T>::Remove(T *aPtr)
+/**
+Removes a single object from the circular buffer.
+
+An object can only be removed if there are objects in the buffer.
+
+A binary copy of the object is made to aPtr.
+
+@param aPtr A pointer to an object of type class T supplied by the caller.
+
+@return 1 if an object is successfully removed. 0 if an object cannot be removed 
+        because the circular buffer is empty.
+*/
+	{return(DoRemove((TUint8 *)aPtr));}
+
+
+
+
+template <class T>
+inline TInt CCirBuf<T>::Remove(T *aPtr,TInt aCount)
+/**
+Removes multiple objects from the circular buffer.
+
+The function attempts to remove aCount objects of type class T.
+Objects can only be removed if there are objects in the buffer
+
+A binary copy of the objects is made to aPtr.
+
+@param aPtr   A pointer to contiguous memory able to hold aCount class T objects, 
+              supplied by the caller. 
+
+@param aCount The number of objects to be removed from the circular buffer.
+
+@return The number of objects successfully removed from the buffer. This value
+        may be less than the number requested, and can range from 0 to aCount.
+
+@panic E32USER-CBase 76, if aCount is not a positive value.
+*/
+	{return(DoRemove((TUint8 *)aPtr,aCount));}
+
+
+
+
+// Class CActive
+inline TBool CActive::IsActive() const
+/**
+Determines whether the active object has a request outstanding.
+
+A request is outstanding when:
+
+1. it has been issued
+
+2. it has not been cancelled
+
+3. it servicing has not yet begun.
+
+@return True, if a request is outstanding; false, otherwise.
+*/
+	{return(iStatus.iFlags&TRequestStatus::EActive);}
+
+
+
+
+inline TBool CActive::IsAdded() const
+/**
+Determines whether the active object has been added to the active scheduler's 
+list of active objects.
+
+If the active object has not been added to a scheduler, it cannot handle the 
+completion of any request. No request should be issued until the active object 
+has been added to a scheduler because completion of that request generates 
+what appears to be a stray signal.
+
+Use the active object function Deque() to remove the active object from the 
+scheduler.
+
+@return True, if the active object has been added to an active scheduler; 
+        false, otherwise. 
+
+@see CActive::Deque
+*/
+	{return(iLink.iNext!=NULL);}
+
+
+
+
+inline TInt CActive::Priority() const
+/**
+Gets the priority of the active object.
+
+@return The active object's priority value.
+*/
+	{return iLink.iPriority;}
+
+
+
+
+// class CDeltaTimer
+inline TDeltaTimerEntry::TDeltaTimerEntry(TCallBack& aCallback)
+/**
+Constructor specifying a general callback.
+
+@param aCallback The callback to be called when this timed event entry expires.
+*/
+	{iCallBack=aCallback;}
+
+
+
+
+inline TDeltaTimerEntry::TDeltaTimerEntry()
+/**
+Default constructor.
+*/
+	{}
+
+
+
+
+inline void TDeltaTimerEntry::Set(TCallBack& aCallback)
+/**
+Sets the specified callback.
+
+@param aCallback The callback to be called when this timed event entry expires.
+*/
+	{iCallBack=aCallback;}
+
+
+
+
+/**
+Gets a reference to the server's current message.
+
+@return The current message that contains the client request details.
+*/
+inline const RMessage2 &CServer2::Message() const
+	{return iMessage;}
+
+
+
+	
+/**
+Gets the server active object that handles messages for this session.
+
+This is the instance of the CServer2 derived class that created
+this session object.
+
+@return The server active object.
+*/
+inline const CServer2 *CSession2::Server() const
+	{return iServer;}
+
+
+
+
+// Class CAsyncOneShot
+inline RThread& CAsyncOneShot::Thread()
+/**
+Gets a handle to the current thread.
+
+@return The handle to the current thread.
+*/
+	{ return iThread; }
+
+
+
+
+// Class CActiveScheduler
+inline TInt CActiveScheduler::Level() const
+/**
+@deprecated Use the StackDepth() function instead.
+
+Gets the scheduler's level of nestedness.
+
+@return The level of nestedness.
+
+@see StackDepth()
+*/
+	{return StackDepth();}
+
+
+
+
+// Class CActiveSchedulerWait
+inline TBool CActiveSchedulerWait::IsStarted() const
+/**
+Reports whether this CActiveSchedulerWait object is currently started.
+
+Note: a CActiveSchedulerWait object itself becomes "stopped" as
+soon as AsyncStop() is called, and can be started again immediately if
+required (but this would start a new nested level of the scheduler).
+
+@return True if the scheduling loop is active; false, otherwise.
+
+@see CActiveSchedulerWait::Start
+@see CActiveSchedulerWait::AsyncStop
+*/
+	{return iLoop != NULL;}
+
+
+
+
+// Class CleanupStack
+#ifdef _DEBUG
+inline void CleanupStack::Pop(TAny* aExpectedItem)
+/**
+Pops an object from the top of the cleanup stack.
+
+The function has two modes of operation, depending on whether it is part of 
+a debug build or a release build.
+
+1. In a debug build, the function checks that the specified item is at the top 
+   of the cleanup stack before attempting to pop it; an E32USER-CBase 90 panic 
+   is raised if the check fails.
+
+2  In a release build, the function just pops the object which is at the top 
+   of the cleanup stack; no checking is done.
+
+@param aExpectedItem A pointer to the item expected to be at the top of the 
+                     cleanup stack. In a release build, this parameter
+					 is not used.
+*/
+	{ CleanupStack::Check(aExpectedItem); CleanupStack::Pop(); }
+
+
+
+
+inline void CleanupStack::Pop(TInt aCount, TAny* aLastExpectedItem)
+/**
+Pops the specified number of objects from the top of the cleanup stack.
+
+The function has two modes of operation, depending on whether it is part of 
+a debug build or a release build.
+
+1. In a debug build, the function pops (aCount-1) items from the cleanup stack, 
+   and then checks that the specified item is the next one on the cleanup stack 
+   before attempting to pop it; an E32USER-CBase 90 panic is raised if the
+   check fails.
+
+2. In a release build, the function just pops aCount items from the cleanup stack; 
+   no checking is done.
+
+@param aCount            The number of items top be popped from
+                         the cleanup stack.
+@param aLastExpectedItem A pointer to the item expected to be at the top of 
+                         the cleanup stack, after (aCount-1) items have been
+						 popped. In a release build, this parameter is
+						 not used.
+*/
+	{
+	if (--aCount)
+		CleanupStack::Pop(aCount);
+	CleanupStack::Check(aLastExpectedItem);
+	CleanupStack::Pop();
+	}
+
+
+
+
+inline void CleanupStack::PopAndDestroy(TAny* aExpectedItem)
+/**
+Pops an object from the top of the cleanup stack, and cleans it up.
+
+The function has two modes of operation, depending on whether it is part of 
+a debug build or a release build.
+
+1. In a debug build, the function checks that the specified item is at the top 
+   of the cleanup stack before attempting to pop and clean it up;
+   an E32USER-CBase 90 panic is raised if the check fails.
+
+2. In a release build, the function just pops and cleans up the object at 
+   the top of the cleanup stack; no checking is done.
+
+@param aExpectedItem A pointer to the item expected to be at the top of the 
+                     cleanup stack. In a release build, this parameter is
+					 not used.
+*/
+	{ CleanupStack::Check(aExpectedItem); CleanupStack::PopAndDestroy(); }
+
+
+
+
+inline void CleanupStack::PopAndDestroy(TInt aCount, TAny* aLastExpectedItem)
+/**
+Pops the specified number of objects from the top of the cleanup stack, and 
+cleans them up.
+
+The function has two modes of operation, depending on whether it is part of 
+a debug build or a release build.
+
+1. In a debug build, the function pops and cleans up (aCount-1) items from the 
+   cleanup stack, and then checks that the specified item is the next one on 
+   the cleanup stack before attempting to pop it and clean it up;
+   an E32USER-CBase  90 panic is raised if the check fails.
+
+2. In a release build, the function just pops and cleans up aCount items from 
+   the cleanup stack; no checking is done.
+
+@param aCount            The number of items top be popped from the
+                         cleanup stack, and cleaned up.
+@param aLastExpectedItem A pointer to the item expected to be at the top of 
+                         the cleanup stack, after (aCount-1) items have been
+						 popped and cleaned up. In a release build, this 
+						 parameter is not used.
+*/
+	{
+	if (--aCount)
+		CleanupStack::PopAndDestroy(aCount);
+	CleanupStack::Check(aLastExpectedItem);
+	CleanupStack::PopAndDestroy();
+	}
+#else
+inline void CleanupStack::Pop(TAny*)
+/**
+Pops an object from the top of the cleanup stack.
+
+The function has two modes of operation, depending on whether it is part of 
+a debug build or a release build.
+
+1. In a debug build, the function checks that the specified item is at the top 
+   of the cleanup stack before attempting to pop it; an E32USER-CBase 90 panic 
+   is raised if the check fails.
+
+2  In a release build, the function just pops the object which is at the top 
+   of the cleanup stack; no checking is done.
+
+@param aExpectedItem A pointer to the item expected to be at the top of the 
+                     cleanup stack. In a release build, this parameter
+					 is not used.
+*/
+	{ CleanupStack::Pop(); }
+
+
+
+
+inline void CleanupStack::Pop(TInt aCount, TAny*)
+/**
+Pops the specified number of objects from the top of the cleanup stack.
+
+The function has two modes of operation, depending on whether it is part of 
+a debug build or a release build.
+
+1. In a debug build, the function pops (aCount-1) items from the cleanup stack, 
+   and then checks that the specified item is the next one on the cleanup stack 
+   before attempting to pop it; an E32USER-CBase 90 panic is raised if the
+   check fails.
+
+2. In a release build, the function just pops aCount items from the cleanup stack; 
+   no checking is done.
+
+@param aCount            The number of items top be popped from
+                         the cleanup stack.
+@param aLastExpectedItem A pointer to the item expected to be at the top of 
+                         the cleanup stack, after (aCount-1) items have been
+						 popped. In a release build, this parameter is
+						 not used.
+*/
+	{ CleanupStack::Pop(aCount); }
+
+
+
+
+inline void CleanupStack::PopAndDestroy(TAny*)
+/**
+Pops an object from the top of the cleanup stack, and cleans it up.
+
+The function has two modes of operation, depending on whether it is part of 
+a debug build or a release build.
+
+1. In a debug build, the function checks that the specified item is at the top 
+   of the cleanup stack before attempting to pop and clean it up;
+   an E32USER-CBase 90 panic is raised if the check fails.
+
+2. In a release build, the function just pops and cleans up the object at 
+   the top of the cleanup stack; no checking is done.
+
+@param aExpectedItem A pointer to the item expected to be at the top of the 
+                     cleanup stack. In a release build, this parameter is
+					 not used.
+*/
+	{ CleanupStack::PopAndDestroy(); }
+
+
+
+
+inline void CleanupStack::PopAndDestroy(TInt aCount, TAny*)
+/**
+Pops the specified number of objects from the top of the cleanup stack, and 
+cleans them up.
+
+The function has two modes of operation, depending on whether it is part of 
+a debug build or a release build.
+
+1. In a debug build, the function pops and cleans up (aCount-1) items from the 
+   cleanup stack, and then checks that the specified item is the next one on 
+   the cleanup stack before attempting to pop it and clean it up;
+   an E32USER-CBase  90 panic is raised if the check fails.
+
+2. In a release build, the function just pops and cleans up aCount items from 
+   the cleanup stack; no checking is done.
+
+@param aCount            The number of items top be popped from the
+                         cleanup stack, and cleaned up.
+@param aLastExpectedItem A pointer to the item expected to be at the top of 
+                         the cleanup stack, after (aCount-1) items have been
+						 popped and cleaned up. In a release build, this 
+						 parameter is not used.
+*/
+	{ CleanupStack::PopAndDestroy(aCount); }
+#endif
+
+
+
+
+// Class TCleanupItem
+inline TCleanupItem::TCleanupItem(TCleanupOperation anOperation)
+	: iOperation(anOperation)
+/**
+Constructs the object with a cleanup operation.
+
+@param anOperation  A cleanup operation which will be invoked by the pop and
+                    destroy action resulting from a subsequent call to
+					CleanupStack::PopAndDestroy().
+*/
+	{}
+
+
+
+
+inline TCleanupItem::TCleanupItem(TCleanupOperation anOperation,TAny *aPtr)
+	: iOperation(anOperation), iPtr(aPtr)
+/**
+Constructs the object with a cleanup operation and a pointer to the object
+to be cleaned up.
+
+@param anOperation A cleanup operation which will be invoked by the pop
+                   and destroy action resulting from a subsequent call to
+				   CleanupStack::PopAndDestroy().
+
+@param aPtr        A pointer to an object which is the target of the
+                   cleanup operation.
+*/
+	{}
+
+
+
+
+// Class TCleanupTrapHandler
+inline CCleanup &TCleanupTrapHandler::Cleanup()
+	{return(*iCleanup);}
+
+// Class TAutoClose
+template <class T>
+inline TAutoClose<T>::~TAutoClose()
+/**
+Destructor.
+
+The implementation calls Close() on iObj, the instance of the template class.
+*/
+#ifdef __LEAVE_EQUALS_THROW__
+	{if (!std::uncaught_exception()) iObj.Close();}
+#else
+	{iObj.Close();}
+#endif
+
+
+
+
+template <class T>
+inline void TAutoClose<T>::PushL()
+/**
+Pushes a cleanup item onto the cleanup stack, so that Close() is called on the 
+templated class object, iObj, if a leave occurs.
+*/
+	{CleanupStack::PushL(TCleanupItem(Close, (TAny *)&iObj));}
+
+
+
+
+template <class T>
+inline void TAutoClose<T>::Pop()
+/**
+Pops a single cleanup item from the cleanup stack.
+*/
+	{CleanupStack::Pop();}
+
+
+
+
+template <class T>
+void TAutoClose<T>::Close(TAny *aObj)
+	{((T *)aObj)->Close();}
+
+
+
+
+// Template class CleanupDelete
+template <class T>
+inline void CleanupDelete<T>::PushL(T* aPtr)
+/**
+Creates a TCleanupItem for the specified object.
+
+The cleanup operation is the private static function Delete() of this class, which
+deletes the specified object.
+
+@param aPtr The object for which a TCleanupItem is to be constructed.
+*/
+	{CleanupStack::PushL(TCleanupItem(&Delete,aPtr));}
+
+
+
+
+template <class T>
+void CleanupDelete<T>::Delete(TAny *aPtr)
+/**
+The cleanup operation to be performed.
+
+@param aPtr A pointer to the object for which clean up is to be performed. 
+            The implementation deletes this object.
+*/
+	{delete STATIC_CAST(T*,aPtr);}
+
+
+
+
+// See header file e32base.h for in-source comment.
+template <class T>
+inline void CleanupDeletePushL(T* aPtr)
+	{CleanupDelete<T>::PushL(aPtr);}
+
+
+
+
+// Template class CleanupArrayDelete
+template <class T>
+inline void CleanupArrayDelete<T>::PushL(T* aPtr)
+/**
+Creates a TCleanupItem for the specified array.
+
+The cleanup operation is the private static function ArrayDelete() of
+this class, which deletes the specified array.
+
+@param aPtr The array of class T type objects for which a TCleanupItem is
+            to be constructed.
+*/
+	{CleanupStack::PushL(TCleanupItem(&ArrayDelete,aPtr));}
+
+
+
+
+template <class T>
+void CleanupArrayDelete<T>::ArrayDelete(TAny *aPtr)
+/**
+The cleanup operation to be performed.
+
+@param aPtr A pointer to the array for which clean up is to be performed. 
+            The implementation deletes this array.
+*/
+	{delete [] STATIC_CAST(T*,aPtr);}
+
+
+
+
+// See header file e32base.h for in-source comment.
+template <class T>
+inline void CleanupArrayDeletePushL(T* aPtr)
+	{CleanupArrayDelete<T>::PushL(aPtr);}
+
+
+
+
+// Template class CleanupClose
+template <class T>
+inline void CleanupClose<T>::PushL(T& aRef)
+/**
+Creates a TCleanupItem for the specified object.
+
+The cleanup operation is the private static function Close() of this class.
+
+@param aRef The object for which a TCleanupItem is to be constructed.
+*/
+	{CleanupStack::PushL(TCleanupItem(&Close,&aRef));}
+
+
+
+
+template <class T>
+void CleanupClose<T>::Close(TAny *aPtr)
+/**
+The cleanup operation to be performed.
+
+@param aPtr A pointer to the object for which clean up is to be performed. 
+            The implementation calls Close() on this object.
+*/
+	{(STATIC_CAST(T*,aPtr))->Close();}
+
+
+
+
+// See header file e32base.h for in-source comment.
+template <class T>
+inline void CleanupClosePushL(T& aRef)
+	{CleanupClose<T>::PushL(aRef);}
+
+
+
+
+// Template class CleanupRelease
+template <class T>
+inline void CleanupRelease<T>::PushL(T& aRef)
+/**
+Creates a TCleanupItem for the specified object.
+
+The cleanup operation is the private static function Release() of this class.
+
+@param aRef The object for which a TCleanupItem is to be constructed.
+*/
+	{CleanupStack::PushL(TCleanupItem(&Release,&aRef));}
+
+
+
+
+template <class T>
+void CleanupRelease<T>::Release(TAny *aPtr)
+/**
+The cleanup operation to be performed.
+
+@param aPtr A pointer to the object for which clean up is to be performed. 
+            The implementation calls Release() on this object.
+*/
+	{(STATIC_CAST(T*,aPtr))->Release();}
+
+
+
+
+// See header file e32base.h for in-source comment.
+template <class T>
+inline void CleanupReleasePushL(T& aRef)
+	{CleanupRelease<T>::PushL(aRef);}
+
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32/include/e32base_private.h	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,88 @@
+// Copyright (c) 1994-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32\include\e32base_private.h
+// 
+//
+
+/**
+ @file
+ @internalTechnology
+ @released
+*/
+
+#ifndef __E32BASE_PRIVATE_H__
+#define __E32BASE_PRIVATE_H__
+#include <e32std.h>
+#include <e32std_private.h>
+#include <e32base.h>
+
+/**
+@internalComponent
+*/
+		struct	TObjectDataStr	//In use if this slot contains pointer to object.
+			{			
+			TInt16 instance;  
+			TUint16 uniqueID;
+			};
+/**
+@internalComponent
+*/
+		struct SObjectIxRec
+			{
+			union
+			{
+				TObjectDataStr str;	//This is in use if the slot contains pointer to CObject.	
+				TInt nextEmpty;		//This is in use if the slot is empty. Points to the next empty slot ...
+									//... in the list. 16 bits would be enough but ARM prefers 32 bytes.
+			};
+			CObject* obj;
+			};
+
+/**
+@internalTechnology
+@deprecated
+*/
+class CBitMapAllocator : public CBase
+	{
+public:
+	IMPORT_C static CBitMapAllocator* New(TInt aSize);
+	IMPORT_C static CBitMapAllocator* NewL(TInt aSize);
+	IMPORT_C ~CBitMapAllocator();
+	IMPORT_C TInt Alloc();
+	IMPORT_C TInt AllocFrom(TInt aPos);
+	IMPORT_C TInt Alloc(TInt aCount, TInt& aConsecutive);
+	IMPORT_C TInt AllocAligned(TInt anAlignment);
+	IMPORT_C TInt AllocAlignedBlock(TInt anAlignment);
+	IMPORT_C TInt AllocFromTop();
+	IMPORT_C TInt AllocFromTopFrom(TInt aPos);
+	IMPORT_C void AllocAt(TInt aPos);
+	IMPORT_C void AllocAt(TInt aPos, TInt aCount);
+	IMPORT_C TBool IsFree(TInt aPos);
+	IMPORT_C TBool IsFree(TInt aPos, TInt aCount);
+	IMPORT_C void Free(TInt aPos);
+	IMPORT_C void Free(TInt aPos, TInt aCount);
+	IMPORT_C TInt Avail();
+	IMPORT_C TInt Size();
+	IMPORT_C TInt ExtractRamPages(TInt aConsecutive,TInt& aPageNo);
+protected:
+	IMPORT_C CBitMapAllocator(TInt aSize,TInt aLength);
+protected:
+	TInt iAvail;
+	TInt iSize;
+	TInt iLength;
+	TUint iMap[1];
+	};
+
+
+#endif //__E32BASE_H__
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32/include/e32btrace.h	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,4139 @@
+// Copyright (c) 2005-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32\include\e32btrace.h
+// 
+//
+
+#ifndef E32BTRACE_H
+#define E32BTRACE_H
+
+#ifdef __KERNEL_MODE__
+class TSpinLock;
+#endif
+
+/**
+Class for handling fast tracing.
+
+A trace record consists of three parts: a header, header extensions,
+and the trace data itself.
+
+The header consists of four bytes containing:
+
+-#	Size of the record in bytes. (Maximum value is KMaxBTraceRecordSize.)
+-#	Flags. See enum TFlags.
+-#	Category. Category value from enum BTrace::TCategory.
+-#	Sub-category. The meaning of this is dependent on the value of Category.
+
+When trace records are stored in memory they are stored word (32 bit) aligned.
+Therefore the size must be rounded up to a multiple of four when calculating
+the address of the next record. E.g.
+@code
+	TUint8* record; // pointer to trace record
+	TInt size = record[BTrace::ESizeIndex];
+	record += (size+3)&~3; // move record pointer on to next record.
+@endcode
+The NextRecord() method is provided to do this operation.
+
+Following the header are optionally a number of 32 bit 'header extension' values.
+These are present in the order shown below but only exist if the appropriate flag bit
+is set in the Header.
+
+-#	Header2.		Contains flag values from enum Flags2.
+					This value is only present if the EHeader2Present flag is set.
+-#	Timestamp.		A timestamp value indicating when the trace was generated.
+					The format and resolution of this value are platform-dependent, but
+					typically will contain the same values as would be returned by
+					User::FastCounter() or NKern::FastCounter().
+					This value is only present if the ETimestampPresent flag is set.
+-#	Timestamp2.		Additional timestamp information. E.g. the most significant
+					half of a 64bit timestamp value. Note, it is valid for a Timestamp2 value
+					to be present even if the previous Timestamp is absent.
+					This value is only present if the ETimestamp2Present flag is set.
+-#	Context ID.		This value indicates the context in which the trace was generated.
+					The meaning of the id is dependent on the contents of the two
+					least significant bits:
+					-	00	indicates the value is the address of the NThread object for
+							the currently executing thread.
+					-	01	indicates Fast Interrupt (FIQ) context.
+							Other bits of the value are currently reserved for future use.
+					-	10	indicates Interrupt (IRQ) context. Other bits of the value
+							are currently reserved for future use.
+					-	11	indicates Immediate Delayed Function Call (IDFC) context.
+							Other bits of the value are currently reserved for future use.
+					.
+					This value is only present if the EContextIdPresent flag is set.
+-#	Program Counter. This is the memory address of the instruction after the location
+					the trace was output.
+					This value is only present if the EPcPresent flag is set.
+-#	Extra.			An extra value used for different purposes depending on the trace type.
+					This value is only present if the EExtraPresent flag is set.
+
+Following the header extensions are 0 or more bytes of trace data specified when the trace
+was output.
+
+To output a trace, the following macros can be used:
+- BTrace0
+- BTrace4
+- BTrace8
+- BTrace12
+- BTraceN
+- BTraceBig
+- BTracePc0
+- BTracePc4
+- BTracePc8
+- BTracePc12
+- BTracePcN
+- BTracePcBig
+- BTraceContext0
+- BTraceContext4
+- BTraceContext8
+- BTraceContext12
+- BTraceContextN
+- BTraceContextBig
+- BTraceContextPc0
+- BTraceContextPc4
+- BTraceContextPc8
+- BTraceContextPc12
+- BTraceContextPcN
+- BTraceContextPcBig
+
+Whenever a trace is output, the trace handler is called with the arguments specified.
+See typedef THandler and SetHandler().
+
+Each tracing category has a filter bit, which if set to zero means that traces in that category
+are discarded, see SetFilter(). This filtering is performed before the trace handler is
+called. This filter may also be initialised from boot time by using the 'btrace' keyword in
+an OBY file used to build a ROM image.
+
+Traces may also be additionally sent through a second level of filtering. This examines the
+first 32 bits of data in the trace and if this value isn't present in the list maintained
+in the secondary filter, the trace is discarded. The contents of the secondary filter are
+set using the SetFilter2 methods.
+
+Values used for secondary filtering must be Symbian Unique Identifiers (UIDs) allocated
+using the normal UID allocation process. Note, the following non-valid UID value ranges
+are reserved.
+- 0x00000000..0x007fffff	Reserved for platform specific use.
+- 0x00800000..0x00ffffff	Reserved for use by Symbian.
+
+To generate traces which are to be processed by the secondary filter, the following
+macros can be used:
+
+- BTraceFiltered4
+- BTraceFiltered8
+- BTraceFiltered12
+- BTraceFilteredN
+- BTraceFilteredBig
+- BTraceFilteredPc4
+- BTraceFilteredPc8
+- BTraceFilteredPc12
+- BTraceFilteredPcN
+- BTraceFilteredPcBig
+- BTraceFilteredContext4
+- BTraceFilteredContext8
+- BTraceFilteredContext12
+- BTraceFilteredContextN
+- BTraceFilteredContextBig
+- BTraceFilteredContextPc4
+- BTraceFilteredContextPc8
+- BTraceFilteredContextPc12
+- BTraceFilteredContextPcN
+- BTraceFilteredContextPcBig
+
+Traces generated using the above methods will be filtered twice; once using the primary
+filter which checks the trace's category, and once using the secondary filter which checks
+the 32 bit UID value at the start of the trace data. Therefore the trace must pass both filter
+checks for it to be sent to the trace handler for output.
+
+@publishedPartner
+@released
+*/
+class BTrace
+	{
+public:
+	/**
+	Byte indices into the trace header for specific fields.
+	*/
+	enum THeaderStructure
+		{
+		/**
+		Size of record in bytes.
+		*/
+		ESizeIndex = 0,
+
+		/**
+		Bitfield of flags from enum TFlags. E.g. to detect if a timestamp is present in
+		the record, code like this could be used.
+		@code
+			TUint8* record; // pointer to trace record
+			if(record[BTrace::EFlagsIndex]&BTrace::ETimestampPresent)
+				TimestampPresent();
+			else
+				TimestampNotPresent();
+		@endcode
+		*/
+		EFlagsIndex = 1,
+
+		/**
+		Category value from enum BTrace::TCategory.
+		*/
+		ECategoryIndex = 2,
+
+		/**
+		Sub-category value. The meaning of this is dependent on the Category.
+		*/
+		ESubCategoryIndex = 3,
+		};
+
+	/**
+	Bit flags which indicate state of a trace record.
+	*/
+	enum TFlags
+		{
+		/**
+		Header2 is present in the trace record.
+		*/
+		EHeader2Present		= 1<<0,
+
+		/**
+		A timestamp value is present in the trace record.
+		*/
+		ETimestampPresent	= 1<<1,
+
+		/**
+		A second timestamp value is present in the trace record.
+		*/
+		ETimestamp2Present	= 1<<2,
+
+		/**
+		A context ID is present in the trace record.
+		*/
+		EContextIdPresent	= 1<<3,
+
+		/**
+		A CPU program counter (PC) value is present in the trace record.
+		*/
+		EPcPresent			= 1<<4,
+
+		/**
+		An 'extra' value is present in the trace record.
+		*/
+		EExtraPresent		= 1<<5,
+
+		/**
+		Indicates that the data in this trace record was truncated to keep the size
+		within the maximum permissible.
+		*/
+		ERecordTruncated	= 1<<6,
+
+		/**
+		Indicates that trace record(s) before this one are missing.
+		This can happen if the trace buffer was full when a trace output was attempted.
+		*/
+		EMissingRecord		= 1<<7
+		};
+
+	/**
+	Bit flags present in the Flags2 value of the header extension.
+	*/
+	enum TFlags2
+		{
+		/**
+		Masks out the bits for the multipart trace type. (See enum TMultiPart.)
+		*/
+		EMultipartFlagMask		= 3<<0,
+
+		/**
+		Masks out the bits for the CPU ID for SMP systems (zero if present on non SMP systems)
+		*/
+		ECpuIdMask			= 0xfff<<20,
+		};
+
+	/**
+	Values for multipart trace indicator. These values are stored in Flags2 an
+	are obtained by ANDing with the value EMultipartFlagMask.
+
+	If a 'Big' trace is generated which doesn't fit into a single trace record
+	then its data is split into several separate trace records; a multipart trace.
+
+	In multipart traces the 'extra' trace value is present in the header extension.
+	(EExtraPresent is set.) This extra value contains a unique trace identifier
+	which is the same is all parts of the trace.
+
+	The structure of the data part of each trace record in a multipart trace is described
+	below. In this description, the following labels are used.
+	-	A is the initial 4 bytes of data; the a1 argument of BTraceBig.
+	-	D is the array of bytes of additional data; the aData argument of BTraceBig.
+	-	N is the size of D; the aDataSize argument of BTraceBig
+	-	X is the maximum number of additional bytes which will fit into a trace record. 
+		This is usually KMaxBTraceDataArray but this should not be assumed, instead
+		the size and other information present in each trace record should be examined.
+
+	For the first part of a multipart trace, the data in a trace record has the following
+	structure:
+
+	-	4 bytes containing N.
+	-	4 bytes containing A.
+	-	X bytes containing D[0..X-1]
+
+	If the parts are numbered 0 through to 'j', then a middle part of a multipart trace
+	is numbered 'i' where 0<i<j. The data in these parts has the structure:
+
+	-	4 bytes containing N.
+	-	4 bytes containing X*i. I.e. the offset within D for the data in this trace record.
+	-	X bytes containing D[X*i..X*i+X-1]
+	
+	For the last part of a multipart trace, the data has the structure:
+
+	-	4 bytes containing N.
+	-	4 bytes containing X*j. I.e. the offset within D for the data in this trace record.
+	-	N modulo X bytes containing D[X*j..N-1]. I.e. the final bytes of the trace data.
+	*/
+	enum TMultiPart
+		{
+		/**
+		Indicates that this trace is the first part of a multipart trace.
+		*/
+		EMultipartFirst			= 1,
+
+		/**
+		Indicates that this trace is a middle part of a multipart trace.
+		I.e. it is not the first or last part.
+		*/
+		EMultipartMiddle		= 2,
+
+		/**
+		Indicates that this trace is the last part of a multipart trace.
+		*/
+		EMultipartLast			= 3,
+		};
+
+	/**
+	Enumeration of trace categories.
+	*/
+	enum TCategory
+		{
+		/**
+		Trace generated by all calls to RDebug::Printf.
+
+		The first 4 bytes of trace data contain the thread ID, RThread::Id(), for the
+		thread which caused this trace to be emitted. If the trace wasn't generated in
+		thread context, this id has the value KNullThreadId.
+		
+		Subsequent bytes of data contain the ASCII text for the formatted string
+		generated by Kern::Printf.
+
+		These traces also contain a context ID, i.e. the EContextIdPresent flag is
+		set and a context ID value is present in the extended header.
+
+		If the trace text doesn't fit completely into one trace record, then
+		a multipart trace is generated. See enum TMultiPart.
+		*/
+		ERDebugPrintf = 0,
+
+		/**
+		Trace generated by all calls to Kern::Printf.
+		Trace records in this category have the same structure as ERDebugPrintf.
+		*/
+		EKernPrintf = 1,
+
+		/**
+		Trace generated by platform security diagnostic messages.
+		Trace records in this category have the same structure as ERDebugPrintf.
+		*/
+		EPlatsecPrintf = 2,
+
+		/**
+		Trace generated for the purpose of associating thread context ids with
+		the textual names of threads. These traces are usually generated when a
+		thread is created, renamed or destroyed.
+
+		If #Prime is called with this category, traces will be generated for all
+		threads currently extant.
+
+		@see enum TThreadIdentification
+		*/
+		EThreadIdentification = 3,
+
+		/**
+		Trace generated when the CPU usage changes state, e.g. at thread context switch
+		or during interrupt and DFC processing.
+
+		The purpose of this trace category is to profile CPU usage.
+
+		@see enum TCpuUsage
+		*/
+		ECpuUsage = 4,
+
+        /**
+        Category used for profiling device drivers, kernel extensions etc.
+        Used by PERF_LOG macro.
+        @prototype 9.3
+        */
+        EKernPerfLog = 5,
+
+        /**
+		@internalTechnology
+        @prototype 9.3
+        */
+        EClientServer = 6,
+
+        /**
+		@internalTechnology
+        @prototype 9.3
+        */
+        ERequests = 7,
+
+        /**
+		Trace generated when chunks are created and destroyed, and when memory
+		is committed and decommitted to and from chunks.
+		
+		If #Prime is called with this category, traces will be generated for all
+		chunks currently extant.
+
+		@see TChunks
+        */
+        EChunks = 8,
+
+
+        /**
+		Trace generated when code segments are created and destroyed, mapped
+		into out of processes, and when memory is committed and decommitted to
+		and from them.
+		
+		If #Prime is called with this category, traces will be generated for all
+		code segments currently extant.
+
+		@see TCodeSegs
+        */
+        ECodeSegs = 9,
+
+		/**
+		Trace generated by Demand Paging.
+		@prototype 9.3
+		*/
+		EPaging = 10,
+
+		/**
+		Trace generated when thread and process priorities are modified, whether
+		directly or through priority inheritance, aging or other mechanisms used
+		by the kernel.
+
+		The purpose of this category is to enable system-wide study of thread
+		priority usage.
+
+		If #Prime is called with this category, traces will be generated for all
+		threads currently extant.
+
+		@see enum TThreadPriority
+		@internalTechnology
+        @prototype 9.3
+		*/
+		EThreadPriority = 11,
+
+		/**
+		Trace generated by processing Paging requests in the Media subsystem and Media drivers.
+		@prototype 9.3
+		*/
+		EPagingMedia = 12,
+
+		/**
+		Trace generated by the kernel for memory regions which don't belong to any chunk.
+		@see enum TKernelMemory
+		@prototype 9.4
+		*/
+		EKernelMemory = 13,
+
+		/**
+		Trace generated by user-mode heap usage.
+
+		Unlike other trace categories, capturing heap trace involves an additional step 
+		depending on how much trace is required. To enable heap trace for a single process 
+		from the moment it starts, add the following line to the .exe's project (.mmp) file:
+
+			firstlib eexe_instrumented_heap.lib
+
+		This overrides the build tools default implicit link (for .exe projects) against eexe.lib.
+
+		Alternatively, to enable heap trace for all processes at once you can enable the 
+		KUSERHEAPTRACE bit (#96) of the kernel trace flags. You can set this flag either at 
+		ROM-building time (look for the 'kerneltrace' line generally in \epoc32\rom\<platform>\header.iby)
+		or at runtime by running the following at the Eshell command prompt:
+
+			trace 0 0 1
+
+		Note that changing this flag at runtime only affects processes created after the flag 
+		is set or unset. It will not affect running processes.
+		
+		@see enum THeap
+		@prototype 9.4
+		*/
+		EHeap = 14,
+
+		/**
+		Meta trace. Trace that is only useful to programs which use or display BTrace-based data.
+		@see enum TMetaTrace
+		@prototype 9.4
+		*/
+		EMetaTrace = 15,
+
+		/**
+		Trace generated by the ram allocator to allow the physical layout of RAM
+		to be tracked.
+		@internalTechnology
+		*/
+		ERamAllocator = 16,
+
+		/**
+		Trace generated by the Fast Mutex in the Nkern.
+		*/
+		EFastMutex = 17,
+		
+
+		/**
+		Trace generated by any sampling profiler. 
+		@see enum TProfiling
+		*/
+		EProfiling = 18,       
+		
+		/** 
+        Trace generated by Power Resource Manager.
+        @prototype 9.5
+        */
+        EResourceManager = 19,
+
+
+        /** 
+        Trace generated by Power Resource Manager User-Side API.
+        @prototype 9.5
+        */
+        EResourceManagerUs = 20,
+		
+		/**
+		Trace generated by Raw Event subsystem APIs 
+		@see enum TRawEventTrace
+		@prototype 9.5
+		*/
+		ERawEvent  =21,
+		
+		/**
+		Trace generated by USB communications (Client, Host and OTG) where use
+		of standard logging (conditional Kern::Printf() calls) is sufficiently
+		time-consuming that the required device timings mandated by the core
+		USB standards cannot be achieved
+        @prototype 9.5
+		*/
+		EUsb = 22,
+
+		/**
+		Trace generated by Symbian OS kernel synchronization objects.
+        @prototype 9.5
+		*/
+		ESymbianKernelSync = 23,
+
+		/**
+		First category value in the range reserved for platform specific use;
+		the end of this range is #EPlatformSpecificLast.
+		Symbian's code will not generate any traces with categories in this range.
+
+		It is strongly recommended that platforms reserve the first half of this range
+		(128..143) for definition and use by base-port (kernel-side) code. Any general
+		trace framework built on top of BTrace APIs should use the second half of the range.
+		This allows fast (primary filtered only) BTrace categories to be used in device drivers
+		and other base-port code, without clashing with more general trace frameworks implemented
+		for application layer code. 
+		*/
+		EPlatformSpecificFirst = 128,
+
+		/**
+		Last category value in the range reserved for platform specific use.
+		@see EPlatformSpecificFirst
+		*/
+		EPlatformSpecificLast = 191,
+
+		/**
+		First category value in the range reserved for Symbian tools and future trace framework
+		implementations; the end of this range is #ESymbianExtentionsLast.
+		*/
+		ESymbianExtentionsFirst = 192,
+
+		/**
+		Last category value in the range reserved for Symbian tools and future trace framework
+		implementations.
+		@see ESymbianExtentionsFirst
+		*/
+		ESymbianExtentionsLast = 253,
+
+		/**
+		Used for testing purposes.
+
+		This may be used for ad-hoc testing purposes, e.g. special builds of components
+		with tracing enabled for diagnostic purposes.
+
+		This category is also used by the E32 BTrace unit tests.
+		@test
+		*/
+		ETest1 = 254,
+
+		/**
+		Used for testing purposes.
+
+		This may be used for ad-hoc testing purposes, e.g. special builds of components
+		with tracing enabled for diagnostic purposes.
+
+		This category is also used by the E32 BTrace unit tests.
+		@test
+		*/
+		ETest2 = 255
+		};
+
+	/**
+	Enumeration of sub-category values for trace category EThreadIdentification.
+	@see EThreadIdentification
+	*/
+	enum TThreadIdentification
+		{
+		/**
+		A nano-kernel thread (NThread) has been created.
+
+		Trace data format:
+		- 4 bytes containing the context id (an NThread*) for this thread.
+		*/
+		ENanoThreadCreate,
+
+		/**
+		A nano-kernel thread (NThread) has been destroyed.
+
+		Trace data format:
+		- 4 bytes containing the context id (an NThread*) for this thread.
+		*/
+		ENanoThreadDestroy,
+
+		/**
+		A thread (DThread) has been created.
+
+		Trace data format:
+		- 4 bytes containing the context id (an NThread*) for this thread.
+		- 4 bytes containing trace id (a DProcess*) for the process to which this thread belongs.
+		- Remaining data is the ASCII name of the thread.
+		*/
+		EThreadCreate,
+
+		/**
+		A thread (DThread) has been destroyed.
+
+		Trace data format:
+		- 4 bytes containing the context id (an NThread*) for this thread.
+		- 4 bytes containing trace id for the process to which this thread belongs.
+		- 4 bytes containing thread ID, as returned by RThread::Id().
+		*/
+		EThreadDestroy,
+
+		/**
+		A thread (DThread) has been renamed.
+		This trace may also be output by the tracing system at initialisation
+		in order to identify threads already in existence.
+
+		Trace data format:
+		- 4 bytes containing the context id (an NThread*) for this thread.
+		- 4 bytes containing trace id (a DProcess*) for the process to which this thread belongs.
+		- Remaining data is the ASCII name of the thread.
+		*/
+		EThreadName,
+
+		/**
+		A process has been renamed.
+		This trace may also be output together with EThreadCreate or EThreadName traces
+		to help identify the name of the process to which the thread belongs.
+
+		Trace data format:
+		- 4 bytes containing zero, or if this trace is generated together with EThreadName
+		  or EThreadCreate, this contains the context id (an NThread*) for the thread.
+		- 4 bytes containing trace id (a DProcess*) for process.
+		- Remaining data is the ASCII name of the process.
+		*/
+		EProcessName,
+
+		/**
+		Informational trace giving a threads ID, as returned by RThread::Id().
+		Trace data format:
+		- 4 bytes containing the context id (an NThread*) for this thread.
+		- 4 bytes containing trace id (a DProcess*) for the process to which this thread belongs.
+		- 4 bytes containing thread ID, as returned by RThread::Id().
+		*/
+		EThreadId,
+
+		/**
+		A process has been created.
+
+		Trace data format:
+		- 4 bytes containing trace id (a DProcess*) for the process.
+		*/
+		EProcessCreate,
+
+		/**
+		A process has been destroyed.
+
+		Trace data format:
+		- 4 bytes containing trace id (a DProcess*) for the process.
+		*/
+		EProcessDestroy
+
+		};
+
+	/**
+	Enumeration of sub-category values for trace category ECpuUsage.
+	@see ECpuUsage
+	*/
+	enum TCpuUsage
+		{
+		/**
+		Trace output at start of Interrupt (IRQ) dispatch.
+
+		On platforms which support nested interrupts, traces for these will also
+		be nested.
+		*/
+		EIrqStart,
+
+		/**
+		Trace output at end of Interrupt (IRQ) dispatch.
+
+		Note, this trace isn't generated if an Interrupt Service Routine queues
+		a DFC or causes a thread to be scheduled. In these cases, the traces for
+		these events (EIDFCStart or ENewThreadContext) should be taken to indicate
+		that interrupt servicing has ended.
+		*/
+		EIrqEnd,
+
+		/**
+		Trace output at start of Fast Interrupt (FIQ) dispatch.
+
+		On platforms which support nested interrupts, traces for these will also
+		be nested.
+		*/
+		EFiqStart,
+
+		/**
+		Trace output at end of Fast Interrupt (FIQ) dispatch.
+
+		Note, this trace isn't generated if an Interrupt Service Routine queues
+		a DFC or causes a thread to be scheduled. In these cases, the traces for
+		these events (EIDFCStart or ENewThreadContext) should be taken to indicate
+		that interrupt servicing has ended.
+		*/
+		EFiqEnd,
+
+		/**
+		Trace output at start of Immediate Delayed Function Call (IDFC) processing.
+		This processing also includes moving DFCs to their final queue, so the trace
+		does not necessarily indicate that any IDFCs have been executed.
+		*/
+		EIDFCStart,
+
+		/**
+		Trace output at end of Immediate Delayed Function Call (IDFC) processing.
+		*/
+		EIDFCEnd,
+
+		/**
+		Trace output when a thread is scheduled to run.
+		The context id (NThread*) in this trace is that of the thread being scheduled.
+		*/
+		ENewThreadContext
+		};
+
+    /**
+	@internalTechnology
+    @prototype 9.3
+    */
+	enum TClientServer
+		{
+		/**
+		Trace generated whenever a server is created.
+
+		Trace data format:
+		- 4 bytes containing the server id (a DServer*).
+		- 4 bytes containing undefined data
+		- Remaining data is the ASCII name of the server.
+
+		The context id (NThread*) in this trace is that of the thread creating the server.
+		*/
+		EServerCreate,
+
+		/**
+		Trace generated whenever a server is destroyed.
+
+		Trace data format:
+		- 4 bytes containing the server id (a DServer*).
+
+		*/
+		EServerDestroy,
+
+		/**
+		Trace generated whenever a new session is attached to a server.
+		I.e. a new session has been created.
+
+		Trace data format:
+		- 4 bytes containing the session id (a DSession*).
+		- 4 bytes containing the server id (a DServer*).
+
+		The context id (NThread*) in this trace is that of the thread creating the session.
+		*/
+		ESessionAttach,
+
+		/**
+		Trace generated whenever a server session is detached from a server.
+		I.e. a session has been closed.
+
+		Trace data format:
+		- 4 bytes containing the session id (a DSession*).
+		- 4 bytes containing the reasons (error code) for the session being closed.
+
+		*/
+		ESessionDetach,
+
+		/**
+		Trace generated whenever a new message is sent to a server.
+	
+		Trace data format:
+		- 4 bytes containing the message handle.
+		- 4 bytes containing the iFunction value for the message.
+		- 4 bytes containing the server id (a DServer*).
+
+		The context id (NThread*) in this trace is that of the thread which sent the message.
+		*/
+		EMessageSend,
+
+		/**
+		Trace generated when a server receives a new message.
+
+		Trace data format:
+		- 4 bytes containing the message handle.
+		*/
+		EMessageReceive,
+
+		/**
+		Trace generated whenever a message is completed using RMessagePtr2::Complete.
+
+		Trace data format:
+		- 4 bytes containing the message handle.
+		- 4 bytes containing the completion reason, or object handle, value.
+		    (The object handle value is that which is delivered to the sender of the
+			message, not that supplied by the server actually completing the request.)
+
+		The context id (NThread*) in this trace is that of the thread which completed the message.
+		*/
+		EMessageComplete
+		};
+
+
+    /**
+	@internalTechnology
+    @prototype 9.3
+    */
+	enum TRequests
+		{
+		/**
+		Trace generated whenever a request status is completed.
+
+		Trace data format:
+		- 4 bytes containing the thread id (NThread*) of the thread being signalled.
+		- 4 bytes containing the address of the TRequestStatus object.
+		- 4 bytes containing the completion reason.
+
+		The context id (NThread*) in this trace is that of the thread which completed the request.
+		*/
+		ERequestComplete
+		};
+
+
+	/**
+	Enumeration of sub-category values for trace category EChunks.
+	@see EChunks
+	*/
+	enum TChunks
+		{
+		/**
+		Trace output when a chunk is created.
+		
+		Trace data format:
+		- 4 bytes containing the chunk id (a DChunk*).
+		- 4 bytes containing the maximum size of the chunk.
+		- The ASCII name of the chunk.
+		*/
+		EChunkCreated,
+
+		/**
+		@internalTechnology
+		
+		Trace output when a chunk is created containing extra chunk information.
+
+		Note that the meaning of the data in this trace is different between
+		memory models, and may change without warning.
+		
+		Trace data format:
+		- 4 bytes containing the chunk id (a DChunk*).
+		- 4 bytes containing the chunk type.
+		- 4 bytes containing the chunk's attributes.
+		*/
+		EChunkInfo,
+
+		/**
+		Trace output when a chunk is destroyed.
+		
+		Trace data format:
+		- 4 bytes containing the chunk id (a DChunk*)
+		*/
+		EChunkDestroyed,
+
+		/**
+		Trace output when memory is allocated and committed to a chunk.
+		
+		Trace data format:
+		- 4 bytes containing the chunk id (a DChunk*).
+		- 4 bytes containing the offset into the chunk.
+		- 4 bytes containing the size of the memory committed.
+		*/
+		EChunkMemoryAllocated,
+
+		/**
+		Trace output when memory is decommitted from a chunk and deallocated.
+		
+		Trace data format:
+		- 4 bytes containing the chunk id (a DChunk*).
+		- 4 bytes containing the offset into the chunk.
+		- 4 bytes containing the size of the memory decommitted.
+		*/
+		EChunkMemoryDeallocated,
+
+		/**
+		Trace output when un-owned memory is committed to a chunk.
+		
+		Trace data format:
+		- 4 bytes containing the chunk id (a DChunk*).
+		- 4 bytes containing the offset into the chunk.
+		- 4 bytes containing the size of the memory committed.
+		*/
+		EChunkMemoryAdded,
+
+		/**
+		Trace output when un-owned memory is decommitted to a chunk.
+		
+		Trace data format:
+		- 4 bytes containing the chunk id (a DChunk*).
+		- 4 bytes containing the offset into the chunk.
+		- 4 bytes containing the size of the memory decommitted.
+		*/
+		EChunkMemoryRemoved,
+
+		/**
+		Trace to indicate the owning process of a chunk - only for local (private) chunks.
+		
+		Trace data format:
+		- 4 bytes containing the chunk id (a DChunk*).
+		- 4 bytes containing the process id of the owner (a DProcess*).
+		*/
+		EChunkOwner
+		};
+
+	/**
+	Enumeration of sub-category values for trace category ECodeSegs.
+	@see ECodeSegs
+	*/
+	enum TCodeSegs
+		{
+		/**
+		Trace output when a code segment is created to associate a code segment
+		id with a filename.
+		
+		Trace data format:
+		- 4 bytes containing the code segment id (a DCodeSeg*).
+		- The ASCII filename.
+		*/
+		ECodeSegCreated,
+
+		/**
+		Trace output when a code segment is created.
+		
+		Trace data format:
+		- 4 bytes containing the code segment id (a DCodeSeg*).
+		- 4 bytes containing the attributes.
+		- 4 bytes containing the code base address (.text).
+		- 4 bytes containing the size of the code section (.text).
+		- 4 bytes containing the base address of the constant data section (.rodata).
+		- 4 bytes containing the size of the constant data section (.rodata).
+		- 4 bytes containing the base address of the initialised data section (.data).
+		- 4 bytes containing the size of the initialised data section (.data).
+		- 4 bytes containing the base address of the uninitialised data section (.bss).
+		- 4 bytes containing the size of the uninitialised data section (.bss).
+		*/
+		ECodeSegInfo,
+		
+		/**
+		Trace output when a code segment is destroyed.
+		
+		Trace data format:
+		- 4 bytes containing the code segment id (a DCodeSeg*).
+		*/
+		ECodeSegDestroyed,
+
+		/**
+		Trace output when a code segment is mapped into a process.
+		
+		Trace data format:
+		- 4 bytes containing the code segment id (a DCodeSeg*).
+		- 4 bytes containing the process id (a DProcess*).
+		*/
+		ECodeSegMapped,
+
+		/**
+		Trace output when a code segment is unmapped from a process.
+		
+		Trace data format:
+		- 4 bytes containing the code segment id (a DCodeSeg*).
+		- 4 bytes containing the process id (a DProcess*).
+		*/
+		ECodeSegUnmapped,
+		
+		/**
+		Trace output when memory is allocated to a code segment.
+
+		Under the multiple memory model, code segments for RAM-loaded user code
+		own the RAM pages the code occupies.  The pages are not owned by any
+		chunk, but are mapped into the code chunk of each process that uses the
+		code segment.
+		
+		Trace data format:
+		- 4 bytes containing the code segment id (a DCodeSeg*).
+		- 4 bytes containing the size of the memory allocated.
+		*/
+		ECodeSegMemoryAllocated,
+		
+		/**
+		Trace output when memory is deallocated from a code segment.
+
+		Under the multiple memory model, code segments for RAM-loaded user code
+		own the RAM pages the code occupies.  The pages are not owned by any
+		chunk, but are mapped into the code chunk of each process that uses the
+		code segment.
+		
+		Trace data format:
+		- 4 bytes containing the code segment id (a DCodeSeg*).
+		- 4 bytes containing the size of the memory deallocated.
+		*/
+		ECodeSegMemoryDeallocated
+		};
+
+	
+	/**
+	Enumeration of sub-category values for trace category EPaging.
+	@see EPaging
+	*/
+	enum TPaging
+		{
+		/**
+		This event indicates the beginning of the 'page in' activity.
+		The end of this activity is indicated by one of the following events:
+		- EPagingPageInUnneeded
+		- EPagingPageInROM
+		- EPagingPageInCode
+		
+		Trace data format:
+		- 4 bytes containing the virtual address which was accessed, causing this paging event.
+		- 4 bytes containing the virtual address of the instruction which caused this paging event.
+		  (The PC value.)
+
+		The context id (NThread*) in this trace is that of the thread caused this paging event.
+		*/
+		EPagingPageInBegin,
+
+		/**
+		Event which terminates the 'page in' activity when the required page was found to
+		already be paged in. (See EPagingPageInBegin.)
+
+		Trace data format:
+		- 0 bytes. (No extra data.)
+
+		The context id (NThread*) in this trace is that of the thread caused this paging event.
+		*/
+		EPagingPageInUnneeded,
+
+		/**
+		A ROM page has been paged in.
+		This event indicates the end of the 'page in' activity. (See EPagingPageInBegin.)
+
+		Trace data format:
+		- 4 bytes containing the physical address of the page 'paged in'.
+		- 4 bytes containing the virtual address of the page 'paged in'.
+
+		The context id (NThread*) in this trace is that of the thread caused this paging event.
+		*/
+		EPagingPageInROM,
+
+		/**
+		A ROM page has been 'paged out'. I.e. removed from the live list to be either
+		reused or returned to free pool.
+
+		Trace data format:
+		- 4 bytes containing the physical address of the page being 'paged out'.
+		- 4 bytes containing the virtual address of the page being 'paged out'.
+
+		The context id (NThread*) in this trace is that of the thread caused this paging event.
+		*/
+		EPagingPageOutROM,
+
+		/**
+		A Free page has been 'paged in'. I.e. added to the live list.
+
+		Trace data format:
+		- 4 bytes containing the physical address of the page being 'paged in'.
+
+		The context id (NThread*) in this trace is that of the thread caused this paging event.
+		*/
+		EPagingPageInFree,
+
+		/**
+		A Free page has been 'paged out'. I.e. removed from the live list to be either
+		reused or returned to free pool.
+
+		Trace data format:
+		- 4 bytes containing the physical address of the page being 'paged out'.
+
+		The context id (NThread*) in this trace is that of the thread caused this paging event.
+		*/
+		EPagingPageOutFree,
+
+		/**
+		A page has been made 'young' again because it was accessed.
+
+		Trace data format:
+		- 4 bytes containing the physical address of the page being rejuvenated, (made young).
+		- 4 bytes containing the virtual address which was accessed, causing this paging event.
+		- 4 bytes containing the virtual address of the instruction which caused this paging event.
+		  (The PC value.)
+
+		The context id (NThread*) in this trace is that of the thread caused this paging event.
+		*/
+		EPagingRejuvenate,
+
+		/**
+		A page fault was found to have already been previously serviced.
+
+		Trace data format:
+		- 4 bytes containing the physical address of the page accessed.
+		- 4 bytes containing the virtual address which was accessed, causing this paging event.
+		- 4 bytes containing the virtual address of the instruction which caused this paging event.
+		  (The PC value.)
+
+		The context id (NThread*) in this trace is that of the thread caused this paging event.
+		*/
+		EPagingPageNop,
+
+		/**
+		A page has been locked.
+
+		Trace data format:
+		- 4 bytes containing the physical address of the page being locked.
+		- 4 bytes containing the value of the lock count after the paged was locked.
+
+		The context id (NThread*) in this trace is that of the thread caused this paging event.
+		*/
+		EPagingPageLock,
+
+		/**
+		A page has been unlocked.
+
+		Trace data format:
+		- 4 bytes containing the physical address of the page being unlocked.
+		- 4 bytes containing the value of the lock count before the paged was unlocked.
+
+		The context id (NThread*) in this trace is that of the thread caused this paging event.
+		*/
+		EPagingPageUnlock,
+		
+		/**
+		A page containing RAM cache has been 'paged out'. I.e. removed from the live list to be
+		either reused or returned to free pool.
+
+		Trace data format:
+		- 4 bytes containing the physical address of the page being 'paged out'.
+		- 4 bytes containing the virtual address of the page being 'paged out'.
+
+		The context id (NThread*) in this trace is that of the thread caused this paging event.
+		*/
+		EPagingPageOutCache,
+		
+		/**
+		A page containing RAM-loaded code has been paged in.
+		This event indicates the end of the 'page in' activity. (See EPagingPageInBegin.)
+
+		Trace data format:
+		- 4 bytes containing the physical address of the page 'paged in'.
+		- 4 bytes containing the virtual address of the page 'paged in'.
+
+		The context id (NThread*) in this trace is that of the thread caused this paging event.
+		*/
+		EPagingPageInCode,
+
+		/**
+		A page containing RAM-loaded code has been 'paged out'. I.e. removed from the live list to be
+		either reused or returned to free pool.
+
+		Trace data format:
+		- 4 bytes containing the physical address of the page being 'paged out'.
+		- 4 bytes containing the virtual address of the page being 'paged out'.
+
+		The context id (NThread*) in this trace is that of the thread caused this paging event.
+		*/
+		EPagingPageOutCode,
+		
+		/**
+		A page of RAM-loaded code was found to already be 'paged in' but not mapped in
+		the faulting process.
+		This event is only emitted on the multiple memory model.
+
+		Trace data format:
+		- 4 bytes containing the physical address of the page 'paged in'.
+		- 4 bytes containing the virtual address which was accessed, causing this paging event.
+
+		The context id (NThread*) in this trace is that of the thread caused this paging event.
+		*/
+		EPagingMapCode,
+
+		/**
+		A page has been made 'old' because it was the last young page to be accessed.
+
+		This trace is only produced when the kernel is compiled with the #BTRACE_PAGING_VERBOSE
+		macro defined.
+
+		Trace data format:
+		- 4 bytes containing the physical address of the page being aged, (made old).
+
+		The context id (NThread*) in this trace is that of the thread caused this paging event.
+		*/
+		EPagingAged,
+
+		/**
+		Trace emitted at the start of decompression of demand paged data.
+
+		This trace is only produced when the kernel is compiled with the #BTRACE_PAGING_VERBOSE
+		macro defined.
+
+		Trace data format:
+		- 4 bytes containing an integer which indicates the compression type being used:
+			  0, no compression;
+			  1, bytepair compression.
+
+		The context id (NThread*) in this trace is that of the thread caused this paging event.
+		*/
+		EPagingDecompressStart,
+
+		/**
+		Trace emitted at the end of decompression of demand paged data.
+
+		This trace is only produced when the kernel is compiled with the #BTRACE_PAGING_VERBOSE
+		macro defined.
+
+		The context id (NThread*) in this trace is that of the thread caused this paging event.
+		*/
+		EPagingDecompressEnd,
+		};
+    
+    /**
+	Enumeration of sub-category values for trace category EResourceManager.
+	@see EResourceManager
+    @prototype 9.5
+	*/
+	enum TResourceManager
+		{
+		/**
+		Trace output for resource registration.
+		
+		Trace data format:
+		- 4 bytes containing the Resource Id.
+		- 4 bytes containing the Resource address.
+		- N bytes containing the Resource name, where 0 < N < 32
+		- 4 bytes containing the Resource Minimum Level
+		- 4 bytes containing the Resource Maximum Level
+		- 4 bytes containing the Resource Default Level
+		*/
+		ERegisterResource = 0,
+
+		/**
+		Trace output for client registration
+
+		Trace data format:
+		- 4 bytes containing clientId
+		- 4 bytes containing client address
+		- N bytes containing client name, where 0 < N < 32
+		*/
+		ERegisterClient,
+
+		/**
+		Trace output for client deregistration
+
+		Trace data format:
+		- 4 bytes containing clientId
+		- 4 bytes containing client address
+		- N bytes containing client name, where 0 < N < 32
+		*/
+		EDeRegisterClient,
+
+		/**
+		Trace output for resource state change start operation
+
+		Trace data format:
+		- 4 bytes containing clientId
+		- 4 bytes containing the Resource Id.
+		- N bytes containing client name, where 0 < N < 32
+		- N bytes containing the Resource name, where 0 < N < 32
+		- 4 bytes containing the Resource state
+		*/
+		ESetResourceStateStart,
+
+		/**
+		Trace output for resource state change end operation
+
+		Trace data format:
+		- 4 bytes containing clientId
+		- 4 bytes containing the Resource Id.
+		- N bytes containing client name, where 0 < N < 32
+		- N bytes containing the Resource name, where 0 < N < 32
+		- 4 bytes containing return value.
+		- 4 bytes containing the Resource state.
+		*/
+		ESetResourceStateEnd,
+
+		/**
+		Trace output for registration for post notification
+
+		Trace data format:
+		- 4 bytes containing clientId
+		- 4 bytes containing the Resource Id.
+		- 4 bytest containing the callback address
+		- 4 bytes containing return value.
+		*/
+		EPostNotificationRegister,
+
+		/**
+		Trace output for deregistration for post notification
+
+		Trace data format:
+		- 4 bytes containing clientId
+		- 4 bytes containing the Resource Id.
+		- 4 bytes containing the callback address
+		- 4 bytes containing the return value.
+		*/
+		EPostNotificationDeRegister,
+
+		/**
+		Trace output for post notification sent.
+
+		Trace data format:
+		- 4 bytes containing clientId
+		- 4 bytes containing the Resource Id.
+		*/
+		EPostNotificationSent,
+
+		/**
+		Trace output for Callback complete
+
+		Trace data format:
+		- 4 bytes containing clientId
+		- 4 bytes containing the Resource Id.
+		*/
+		ECallbackComplete,
+
+		/**
+		Trace output for resource manager memory usage
+
+		Trace data format:
+		- 4 bytes containing memory allocated in bytes.
+		*/
+		EMemoryUsage,
+
+		/**
+		Trace output for get resource state start operation
+
+		Trace data format:
+		- 4 bytes containing clientId
+		- 4 bytes containing the Resource Id.
+		- N bytes containing client name, where 0 < N < 32
+		- N bytes containing the Resource name, where 0 < N < 32
+		*/
+		EGetResourceStateStart,
+
+		/**
+		Trace output for get resource state end operation
+
+		Trace data format:
+		- 4 bytes containing clientId
+		- 4 bytes containing the Resource Id.
+		- N bytes containing client name, where 0 < N < 32
+		- N bytes containing the Resource name, where 0 < N < 32
+		- 4 bytes containing the Resource state
+		- 4 bytes containing return value.
+		*/
+		EGetResourceStateEnd,
+
+		/**
+		Trace output for cancellation of long latency operation
+
+		Trace data format:
+		- 4 bytes containing clientId
+		- 4 bytes containing the Resource Id.
+		- N bytes containing client name, where 0 < N < 32
+		- N bytes containing the Resource name, where 0 < N < 32
+		- 4 bytes containing return value
+		*/
+		ECancelLongLatencyOperation,
+
+		/**
+		Trace output for booting of resource manager
+
+		Trace data format:
+		- 4 bytes containing entry point
+		*/
+		EBooting,
+
+		/**
+		Trace output for PSL resource state change operation
+
+		Trace data format:
+		- 4 bytes containing clientId
+		- 4 bytes containing the Resource Id.
+		- N bytes containing the Resource name, where 0 < N < 32
+		- 4 bytes containing the Resource current state
+		- 4 bytes containing the resource requested state
+		*/
+		EPslChangeResourceStateStart,
+
+		/**
+		Trace output for PSL resource state change operation
+
+		Trace data format:
+		- 4 bytes containing clientId
+		- 4 bytes containing the Resource Id.
+		- N bytes containing the Resource name, where 0 < N < 32
+		- 4 bytes containing the Resource current state
+		- 4 bytes containing the resource requested state
+		- 4 bytes containing return value
+		*/
+		EPslChangeResourceStateEnd,
+
+		/**
+		Trace output for get resource state start operation in PSL
+
+		Trace data format:
+		- 4 bytes containing clientId
+		- 4 bytes containing the Resource Id.
+		- N bytes containing the Resource name, where 0 < N < 32
+		*/
+		EPslGetResourceStateStart,
+
+		/**
+		Trace output for get resource state end operation in PSL
+
+		Trace data format:
+		- 4 bytes containing clientId
+		- 4 bytes containing the Resource Id.
+		- N bytes containing the Resource name, where 0 < N < 32
+		- 4 bytes containing the Resource state
+		- 4 bytes containing return value.
+		*/
+		EPslGetResourceStateEnd,
+
+		/**		
+		Trace output for resource creation
+		
+		Trace data format:
+		- 4 bytes containing minimum value of resource
+		- 4 bytes containing maximum value of resource
+		- 4 bytes containing the default value of resource
+		- 4 bytes containing the properties of the resource
+		- N bytes containing the Resource name, where 0 < N < 32
+		*/
+		EPslResourceCreate,
+		
+		/** 
+		Trace output for static resource with dependency registration
+
+		Trace data format:
+		- 4 bytes containing the Resource Id
+		- 4 bytes containing the Resource address
+		- N bytes containing the Resource name, where 0 < N < 32
+		- 4 bytes containing the minimum value of resource
+		- 4 bytes containing the maximum value of resource
+		- 4 bytes containing the default value of resource
+		*/
+		ERegisterStaticResourceWithDependency,
+
+		/** 
+		Trace output for dynamic resource registration
+
+		Trace data format:
+		- 4 bytes containing clientId
+		- 4 bytes containing the Resource Id
+		- N bytes containing the client name, where 0 < N < 32
+		- N bytes containing the resource name, where 0 < N < 32
+		- 4 bytes containing the resouce address
+		*/
+		ERegisterDynamicResource,
+
+		/** 
+		Trace output for dynamic resource deregistration
+
+		Trace data format:
+		- 4 bytes containing clientId
+		- 4 bytes containing the Resource Id
+		- N bytes containing the client name, where 0 < N < 32
+		- N bytes containing the resource name, where 0 < N < 32
+		- 4 bytes containing the resource address
+		- 4 bytes containing the resource level.
+		*/
+		EDeRegisterDynamicResource,
+
+		/**
+		Trace output for resource dependency registration
+	
+		Trace data format:
+		- 4 bytes containing clientId
+		- 4 bytes containing the Resource Id of first dependent resource
+		- N bytes containing the client name, where 0 < N < 32
+		- N bytes containing the resource name of first dependent resource, where 0 < N < 32
+		- 4 bytes containing the Resource Id of second dependent resource
+		- N bytes containing the resource name of second dependent resource, where 0 < N < 32
+		- 4 bytes containing the address of first dependent resource
+		- 4 bytes containing the address of second dependent resource
+		*/
+		ERegisterResourceDependency,
+		
+		/**
+		Trace output for resource dependency deregistration
+
+		Trace data format:
+		- 4 bytes containing clientId
+		- 4 bytes containing the Resource Id of first dependent resource
+		- N bytes containing the client name, where 0 < N < 32
+		- N bytes containing the resource name of first dependent resource, where 0 < N < 32
+		- 4 bytes containing the resource id of second dependent resource
+		- N bytes containing the resource name of second dependent resource, where 0 < N < 32
+		- 4 bytes containing the address of first dependent resource
+		- 4 bytes containing the address of second dependent resource
+		*/
+		EDeRegisterResourceDependency
+		};
+    /**
+	Enumeration of sub-category values for trace category EResourceManagerUs.
+	@see EResourceManagerUs
+    @prototype 9.5
+	*/
+	enum TResourceManagerUs
+		{
+		/**
+		Trace output for the start of opening a channel to the Resource Controller.
+		
+		Trace data format:
+		- 4 bytes unused (displays 0)
+		- 4 bytes containing the client thread identifier.
+		- N bytes containing the client name, where 0 < N < 32
+		*/
+		EOpenChannelUsStart = 0,
+		/**
+		Trace output for the end of opening a channel to the Resource Controller.
+		
+		Trace data format:
+		- 4 bytes unused (displays 0)
+		- 4 bytes containing the client identifier provided by the Resource Controller
+		- N bytes containing the client name, where 0 < N < 32
+		*/
+		EOpenChannelUsEnd,
+		/**
+		Trace output for the start of registering a client with the Resource Controller.
+		
+		Trace data format:
+		- 4 bytes the number of concurrent change resource state operations to be supported
+		- 4 bytes the number of concurrent notification requests to be supported
+		- N bytes containing the client name, where 0 < N < 32
+		- 4 bytes the number of concurrent get resource state operations to be supported
+		*/
+		ERegisterClientUsStart,
+		/**
+		Trace output for the end of registering a client with the Resource Controller.
+		
+		Trace data format:
+		- 4 bytes containing the client identifier provided by the Resource Controller.
+		- 4 bytes specifying the value returned from the call to Resource Controller's AllocReserve method
+		*/
+		ERegisterClientUsEnd,
+		/**
+		Trace output for the start of de-registering a client with the Resource Controller.
+		
+		Trace data format:
+		- 4 bytes unused (displays 0)
+		- 4 bytes containing the client identifier provided by the Resource Controller.
+		- N bytes containing the client name, where 0 < N < 32
+		*/
+		EDeRegisterClientUsStart,
+		/**
+		Trace output for the end of registering a client with the Resource Controller.
+		
+		Trace data format:
+		- 4 bytes containing the client identifier provided by the Resource Controller.
+		*/
+		EDeRegisterClientUsEnd,
+		/**
+		Trace output for the start of a GetResourceState request to the Resource Controller.
+		
+		Trace data format:
+		- 4 bytes specifying the resource ID
+		- 4 bytes containing the client identifier provided by the Resource Controller.
+		- N bytes containing the client name, where 0 < N < 32
+		*/
+		EGetResourceStateUsStart,
+		/**
+		Trace output for the end of a GetResourceState request to the Resource Controller.
+		
+		Trace data format:
+		- 4 bytes specifying the resource ID
+		- 4 bytes specifying the resource level
+		- 4 bytes containing the client identifier
+		- 4 bytes specifying the success code returned by the Resource Controller.
+		*/
+		EGetResourceStateUsEnd,
+		/**
+		Trace output for the start of a ChangeResourceState request to the Resource Controller.
+		
+		Trace data format:
+		- 4 bytes specifying the resource ID
+		- 4 bytes specifying the required state
+		- N bytes containing the client name, where 0 < N < 32
+		- 4 bytes containing the client identifier provided by the Resource Controller.
+		*/
+		ESetResourceStateUsStart,
+		/**
+		Trace output for the end of a ChangeResourceState request to the Resource Controller.
+		
+		Trace data format:
+		- 4 bytes specifying the resource ID
+		- 4 bytes specifying the requested state
+		- 4 bytes containing the client identifier
+		- 4 bytes specifying the success code returned by the Resource Controller.
+		*/
+		ESetResourceStateUsEnd,
+		/**
+		Trace output for the start of a cancel GetResourceState request to the Resource Controller.
+		
+		Trace data format:
+		- 4 bytes specifying the resource ID
+		- 4 bytes containing the client identifier provided by the Resource Controller.
+		- N bytes containing the client name, where 0 < N < 32
+		*/
+		ECancelGetResourceStateUsStart,
+		/**
+		Trace output for the end of a cancel GetResourceState request to the Resource Controller.
+		
+		Trace data format:
+		- 4 bytes specifying the resource ID
+		- 4 bytes containing the client identifier provided by the Resource Controller.
+		- N bytes containing the client name, where 0 < N < 32
+		*/
+		ECancelGetResourceStateUsEnd,
+		/**
+		Trace output for the start of a cancel ChangeResourceState request to the Resource Controller.
+		
+		Trace data format:
+		- 4 bytes specifying the resource ID
+		- 4 bytes containing the client identifier provided by the Resource Controller.
+		- N bytes containing the client name, where 0 < N < 32
+		*/
+		ECancelSetResourceStateUsStart,
+		/**
+		Trace output for the end of a cancel ChangeResourceState request to the Resource Controller.
+		
+		Trace data format:
+		- 4 bytes specifying the resource ID
+		- 4 bytes containing the client identifier provided by the Resource Controller.
+		- N bytes containing the client name, where 0 < N < 32
+		*/
+		ECancelSetResourceStateUsEnd
+		};
+
+	/**
+	Enumeration of sub-category values for trace category EThreadPriority.
+	@see EThreadPriority
+	@internalTechnology
+    @prototype 9.3
+	*/
+	enum TThreadPriority
+		{
+		/**
+		Trace output when a nanothread priority is changed.
+		
+		Trace data format:
+		- 4 bytes containing the context id (an NThread*) for the thread whose priority is changing.
+		- 4 bytes containing the new absolute priority.
+		*/
+		ENThreadPriority=0,
+
+		/**
+		Trace output when a DThread's default priority is set.
+
+		Trace data format:
+		- 4 bytes containing the context id (an NThread*) for the thread whose priority is changing.
+		- 4 bytes containing the iThreadPriority member - a value from enum ::TThrdPriority.
+		- 4 bytes containing the new default absolute priority.
+		*/
+		EDThreadPriority=1,
+
+		/**
+		Trace output when a DProcess priority is changed.
+		
+		Trace data format:
+		- 4 bytes containing trace id (a DProcess*) for process.
+		- 4 bytes containing the new process priority, a value from enum ::TProcPriority
+		*/
+		EProcessPriority=2
+		};
+
+	/**
+	Enumeration of sub-category values for trace category EPagingMedia.
+	@see EPagingMedia
+	*/
+	enum TPagingMedia
+		{
+		/**
+		Event generated when a request to 'page in' data is received by the Local Media Subsystem.
+
+		Trace data format:
+		- 4 bytes containing the linear address of the buffer to where the data is to be written.
+		- 4 bytes containing the offset from start of the partition to where the data to be paged in resides.
+		- 4 bytes containing the number of bytes to be read off the media.
+		- 4 bytes containing local drive number for the drive where the data to be paged in resides (-1 if ROM paging). 
+		- 4 bytes containing the linear address in memory where this request object resides.
+
+		The context id (NThread*) in this trace is that of the thread that took the page fault that caused this event.
+		*/
+		EPagingMediaLocMedPageInBegin,
+
+		/**
+		Event generated by the Local Media Subsystem when a request to 'page in' data is completed.
+
+		Trace data format:
+		- 4 bytes containing the linear address in memory where this request object resides.
+		- 4 bytes containing the completion code to be returned.
+		- 4 bytes containing a code qualifying this request as either a ROM or Code 'page in' (see TPagingRequestId).
+
+		The context id (NThread*) in this trace is that of the media driver thread that services this 'page in' request.
+		*/
+		EPagingMediaLocMedPageInPagedIn,
+		
+		/**
+		Event generated by the Local Media Subsystem when a request to 'page in' data is deferred.
+
+		Trace data format:
+		- 4 bytes containing the linear address in memory where this request object resides.
+		- 4 bytes containing a code qualifying this request as either a ROM or Code 'page in' (see TPagingRequestId).
+
+		The context id (NThread*) in this trace is that of the media driver thread that services this 'page in' request.
+		*/
+		EPagingMediaLocMedPageInDeferred,
+		
+		/**
+		Event generated by the Local Media Subsystem when a request to 'page in' data that has been deferred is re-posted.
+
+		Trace data format:
+		- 4 bytes containing the linear address in memory where this request object resides.
+		- 4 bytes containing a code qualifying this request as either a ROM or Code 'page in' (see TPagingRequestId).
+
+		The context id (NThread*) in this trace is that of the media driver thread that services this 'page in' request.
+		*/
+		EPagingMediaLocMedPageInDeferredReposted,
+		
+		/**
+		Event generated by the Local Media Subsystem when a request to 'page in' data is re-deferred.
+
+		Trace data format:
+		- 4 bytes containing the linear address in memory where this request object resides.
+		- 4 bytes containing a code qualifying this request as either a ROM or Code 'page in' (see TPagingRequestId).
+
+		The context id (NThread*) in this trace is that of the media driver thread that services this 'page in' request.
+		*/
+		EPagingMediaLocMedPageInReDeferred,
+
+		/**
+		Event generated by the Local Media Subsystem when a request to 'page in' data is issued when the media is not yet open.
+
+		Trace data format:
+		- 4 bytes containing the linear address in memory where this request object resides.
+		- 4 bytes containing the state of the media (one of TMediaState).
+		- 4 bytes containing a code qualifying this request as either a ROM or Code 'page in' (see TPagingRequestId).
+
+		The context id (NThread*) in this trace is that of the media driver thread that services this 'page in' request.
+		*/
+		EPagingMediaLocMedPageInQuietlyDeferred,
+		
+		/**
+		Event generated by the Local Media Subsystem when a fragment of a Write request is created and is ready to be sent to the Media 
+		Driver thread .
+
+		Trace data format:
+		- 4 bytes containing the linear address in memory where this request object resides.
+		- 4 bytes containing the ID of this fragment (middle or last).
+		- 4 bytes containing the length of data in this request fragment.
+		- 4 bytes containing the offset within the original request to the start of data in this fragment.
+		- 4 bytes containing the offset from start of the partition to where the data in this fragment is to be written.
+		- 4 bytes containing the address of the DThread object representing the thread that issued the original Write request.
+
+		The context id (NThread*) in this trace is that of the File Server drive thread that issued the original Write request.
+		*/
+		EPagingMediaLocMedFragmentBegin,
+		
+		/**
+		Event generated by the Local Media Subsystem when a Write fragment is completed .
+
+		Trace data format:
+		- 4 bytes containing the linear address in memory where this request object resides.
+		- 4 bytes containing the completion code to be returned.
+
+		The context id (NThread*) in this trace is that of the File Server drive thread that issued the original Write request.
+		*/
+		EPagingMediaLocMedFragmentEnd,
+		
+		/**
+		Event generated when the Media Driver starts processing a request to 'page in' data in its specific Request(..) function.
+
+		Trace data format:
+		- 4 bytes containing a code describing the type of the media (one of TMediaDevice).
+		- 4 bytes containing the linear address in memory where this request object resides.
+
+		The context id (NThread*) in this trace is that of the media driver thread that services this 'page in' request.
+		*/
+		EPagingMediaPagingMedDrvBegin,
+
+		/**
+		Event generated by the Media Driver when the data read by a 'page in' request is written to the paging buffer.
+
+		Trace data format:
+		- 4 bytes containing a code describing the type of the media (one of TMediaDevice).
+		- 4 bytes containing the linear address in memory where this request object resides.
+		- 4 bytes containing the linear address of the buffer to where the data is to be written.
+		- 4 bytes containing the offset within the buffer to where the data will be written.
+		- 4 bytes containing the length of data to be written.
+
+		The context id (NThread*) in this trace is that of the media driver thread that services this 'page in' request.
+		*/
+		EPagingMediaMedDrvWriteBack,
+		
+		/**
+		Event generated when a request to 'page in' data is put on hold because the Media Driver is performing some background
+		operation (not another request) and cannot service the request.
+
+		Trace data format:
+		- 4 bytes containing a code describing the type of the media (one of TMediaDevice).
+		- 4 bytes containing the linear address in memory where this request object resides.
+
+		The context id (NThread*) in this trace is that of the media driver thread that services this 'page in' request.
+		*/
+		EPagingMediaMedDrvOnHold,
+		};
+
+	/**
+	Enumeration of sub-category values for trace category EKernelMemory.
+	@see EKernelMemory
+	*/
+	enum TKernelMemory 
+		{
+		/**
+		Event recorded during startup and prime which details the initial amount of free RAM.
+
+		Trace data format:
+		- 4 bytes containing the number of bytes of RAM the system started with.
+		*/
+		EKernelMemoryInitialFree,
+
+		/**
+		Event recorded during prime which records the then-current amount of free RAM.
+
+		Trace data format:
+		- 4 bytes containing the number of bytes of free RAM.
+		*/
+		EKernelMemoryCurrentFree,
+
+		/**
+		Event recorded when a miscellaneous kernel allocation is made. These include:
+		- Memory for MMU page table contents
+		- Memory for MMU SPageTableInfos
+		- Memory for shadow pages
+
+		Trace data format:
+		- 4 bytes containing the size, in bytes, of the allocation.
+		*/
+		EKernelMemoryMiscAlloc,
+
+		/**
+		Event recorded when a miscellaneous kernel allocation (see EKernelMemoryMiscAlloc
+		above) is freed. 
+
+		Trace data format:
+		- 4 bytes containing the size, in bytes, of the freed allocation.
+		*/
+		EKernelMemoryMiscFree,
+
+		/**
+		The amount of memory reserved for the minimum demand paging cache. The *actual* DP cache
+		also uses free memory, only this minimum amount is permanently reserved for that purpose.
+		This event is recorded during prime and when the amount changes.
+
+		Trace data format:
+		- 4 bytes containing the minimum size, in bytes, of the demand paging cache.
+		*/
+		EKernelMemoryDemandPagingCache,
+
+		/**
+		Physically contiguous memory allocated by device drivers via one of:
+			Epoc::AllocPhysicalRam()
+			Epoc::ZoneAllocPhysicalRam()
+			Epoc::ClaimPhysicalRam()
+			TRamDefragRequest::ClaimRamZone()
+
+		Trace data format:
+		- 4 bytes containing the size of the allocated memory.
+		- 4 bytes containing the physical base address of allocated memory.
+
+		NB: The prime function logs a EKernelMemoryDrvPhysAlloc record where the physical 
+		address is -1 and should be ignored.
+		*/
+		EKernelMemoryDrvPhysAlloc,
+
+		/**
+		Memory freed by device drivers via calls to all versions of 
+		Epoc::FreePhysicalRam(). 
+
+		Trace data format:
+		- 4 bytes containing the size of the freed memory.
+		- 4 bytes containing the physical base address of freed memory.
+		*/
+		EKernelMemoryDrvPhysFree,
+		};
+
+	/**
+	Enumeration of sub-category values for trace category EHeap.
+	@see EHeap
+	*/
+	enum THeap
+		{
+		/**
+		Event recorded during process startup which logs the point of heap creation.
+
+		Trace data format:
+		- 4 bytes containing the heap ID (The RAllocator*)
+		- 2 bytes containing the size of header overhead, per allocation (0xFFFF indicates a variable size)
+		- 2 bytes containing the size of footer overhead, per allocation (0xFFFF indicates a variable size)
+		*/
+		EHeapCreate,
+
+		/**
+		Event recorded during process startup which details the chunk being used as a heap.
+
+		Trace data format:
+		- 4 bytes containing the heap ID (The RAllocator*)
+		- 4 bytes containing the chunk ID (The RHandleBase* of the chunk)
+		*/
+		EHeapChunkCreate,
+		
+		/**
+		Event recorded when RHeap::Alloc() is called.
+
+		Trace data format:
+		- 4 bytes containing the heap ID (The RAllocator*)
+		- 4 bytes containing the address of the allocation
+		- 4 bytes containing the size of the allocation
+		- 4 bytes containing the requested size of allocation
+		*/
+		EHeapAlloc,
+
+		/**
+		Event recorded when RHeap::ReAlloc() is called.
+
+		Trace data format:
+		- 4 bytes containing the heap ID (The RAllocator*)
+		- 4 bytes containing the address of the new allocation
+		- 4 bytes containing the size of the allocation
+		- 4 bytes containing the requested size of allocation
+		- 4 bytes containing the address of the old allocation
+		*/
+		EHeapReAlloc,
+
+		/**
+		Event recorded when RHeap::Free() is called.
+
+		Trace data format:
+		- 4 bytes containing the heap ID (The RAllocator*)
+		- 4 bytes containing the address of the free'd allocation
+		*/
+		EHeapFree,	
+		
+		/**
+		Event recorded when RHeap::Alloc() fails.
+		
+		Trace data format:
+		- 4 bytes containing the heap ID (The RAllocator*)
+		- 4 bytes containing the requested size of allocation
+		*/
+		EHeapAllocFail,
+		
+		/**
+		Event recorded when RHeap::ReAlloc() fails.
+				
+		Trace data format:
+		- 4 bytes containing the heap ID (The RAllocator*)
+		- 4 bytes containing the address of the old allocation
+		- 4 bytes containing the requested size of allocation
+		 */
+		EHeapReAllocFail,
+		
+		/**
+		Event recorded when heap memory corruption occurs.
+		
+		Trace data format:
+		- 4 bytes containing the heap ID (The RAllocator*)
+		- 4 bytes containing address of the corrupted memory block
+		- 4 bytes containing length of the corrupted memory block
+		*/
+		EHeapCorruption,
+		};
+
+	/**
+	Enumeration of sub-category values for trace category EMetaTrace.
+	@see EMetaTrace
+	*/
+	enum TMetaTrace
+		{
+		/**
+		Information about timestamps used for tracing.
+
+		Trace data format:
+		- 4 bytes containing the period of the Timestamp value.
+		- 4 bytes containing the period of the Timestamp2 value.
+		- 4 bytes containing a set of bit flags with the following meaning:
+			- Bit 0, if true, indicates that Timestamp and Timestamp2 are two halves
+			  of a single 64bit timestamp value; Timestamp2 is the most significant part.
+			- All other bits are presently undefined.
+
+		The format of the timestamp period data is a period in seconds given using an exponent and mantissa 
+		format, where the most significant 8 bits are the signed power-of-two value for the exponent, and 
+		the least significant 24 bits are the integer value of the mantissa. The binary point is to the right 
+		of the least significant mantissa bit, and the mantissa may not be in normalised form.
+
+		Example code for decoding the period:
+		@code
+			TInt32 period; // value from trace record
+			int exponent = (signed char)(period>>24);
+			int mantissa = period&0xffffff;
+			double periodInSeconds = (double)mantissa*pow(2,exponent);
+		@endcode
+		*/
+		EMetaTraceTimestampsInfo,
+
+		/**
+		Trace indicating the start of a test case being measured.
+
+		Trace data format:
+		- 4 bytes containing measurement specific value.
+		- 4 bytes containing a further measurement specific value.
+		- Remaining data is ASCII text providing human readable information.
+		*/
+		EMetaTraceMeasurementStart,
+
+		/**
+		Trace indicating the end of a test case being measured.
+
+		Trace data format:
+		- 4 bytes containing measurement specific identifying value.
+		- 4 bytes containing a further measurement specific identifying value.
+
+		The values contained in this trace must be identical to those in the corresponding
+		ETraceInfoMeasurementStart trace.
+		*/
+		EMetaTraceMeasurementEnd,
+
+		/**
+		Trace indicating a change in state of the primary filter.
+
+		Trace data format:
+		- 1 byte containing a trace category number.
+		- 1 byte containing the new filter state for the category. (0=off, 1=on).
+		- 2 byte padding. (Should be output as zeros.)
+		*/
+		EMetaTraceFilterChange
+		};
+
+	/**
+	Enumeration of sub-category values for trace category ERamAllocator.
+	@see BTrace::ERamAllocator
+	*/
+	enum TRamAllocator
+		{
+		/**
+		The number of RAM zones.
+
+		Trace data format:
+		- 4 bytes containing the number of RAM zones.
+		*/
+		ERamAllocZoneCount,
+		
+		/**
+		Information on the layout of a RAM zone.
+
+		Trace data format:
+		- 4 bytes containing the number of pages in the zone
+		- 4 bytes containing the physical base address of the zone
+		- 4 bytes containing the ID of the zone
+		- 1 bytes containing the preference of the zone
+		- 1 bytes containing the flags of the zone
+		- 2 bytes reserved for future use
+		*/
+		ERamAllocZoneConfig,
+
+		/**
+		This trace is sent for every contiguous block of RAM that was allocated 
+		during the kernel boot process.
+
+		Trace data format:
+		- 4 bytes containing the number of contiguous pages allocated for the block
+		- 4 bytes containing the physical base address of the block
+		*/
+		ERamAllocBootAllocation,
+
+
+		/** 
+		This trace marks the end of the boot allocations
+
+		Trace data format:
+		- no extra bytes are sent
+		*/
+		ERamAllocBootAllocationEnd,
+
+		/**
+		Event generated when a RAM zone's flags have been modified
+		This could occur when a RAM zone is blocked/unblocked from further 
+		allocations from all/certain page types.
+
+		Trace data format:
+		- 4 bytes containing the ID of the zone
+		- 4 bytes containing the flags of the zone
+		*/
+		ERamAllocZoneFlagsModified,
+
+		/**
+		Event generated when DRamAllocator::ClaimPhysicalRam has successfully
+		claimed the specified RAM pages.
+
+		Trace data format:
+		- 4 bytes containing the number of contiguous pages
+		- 4 bytes containing the base address of the pages
+		*/
+		ERamAllocClaimRam,
+
+		/**
+		Event generated when DRamAllocator::MarkPageAllocated has successfully
+		marked the specified page as allocated.
+
+		Trace data format:
+		- 4 bytes containing the TZonePageType type of the page
+		- 4 bytes containing the address of the page
+		*/
+		ERamAllocMarkAllocated,
+
+		/**
+		Event generated when DRamAllocator::AllocContiguousRam successfully
+		allocates the requested number of pages.
+
+		Trace data format:
+		- 4 bytes containing the TZonePageType type of the pages
+		- 4 bytes containing the number of contiguous pages
+		- 4 bytes containing the base address of the pages
+		*/
+		ERamAllocContiguousRam,
+
+		/**
+		Event generated when DRamAllocator::FreePage has successfully freed 
+		the specified RAM page.
+
+		Trace data format:
+		- 4 bytes containing the TZonePageType type of the page
+		- 4 bytes containing the address of the page
+		*/
+		ERamAllocFreePage,
+
+		/**
+		Event generated when DRamAllocator::FreePhysical successfully freed 
+		the specified RAM page(s).
+
+		Trace data format:
+		- 4 bytes containing the number of contiguous pages
+		- 4 bytes containing the base address of the pages
+		*/
+		ERamAllocFreePhysical,
+
+		/**
+		Event generated for each contiguous block of pages when 
+		DRamAllocator::AllocRamPages or DRamAllocator::ZoneAllocRamPages
+		are attempting to fulfil a request.
+
+		Trace data format:
+		- 4 bytes containing the TZonePageType type of the pages
+		- 4 bytes containing the number of contiguous pages
+		- 4 bytes containing the base address of the pages
+		*/
+		ERamAllocRamPages,
+
+		/**
+		Event generated for contiguous block of pages when 
+		DRamAllocator::FreeRamPages is invoked.
+
+		Trace data format:
+		- 4 bytes containing the TZonePageType type of the pages
+		- 4 bytes containing the number of contiguous pages
+		- 4 bytes containing the base address of the pages
+		*/
+		ERamAllocFreePages,
+
+		/**
+		Event generated when DRamAllocator::AllocRamPages has successfully 
+		allocated all the requested number of RAM pages.  If DRamAllocator::AllocRamPages
+		couldn't allocate all the requested pages then this event is not generated.
+
+		Trace data format:
+		- no extra bytes sent
+		*/
+		ERamAllocRamPagesEnd,
+
+		/**
+		Event generated when all ERamAllocFreePages events for a particular 
+		call of DRamAllocator::FreeRamPages have been generated.
+
+		Trace data format:
+		- no extra bytes sent
+		*/
+		ERamAllocFreePagesEnd,
+		
+		/**
+		Event generated when DRamAllocator::ChangePageType is has successfully 
+		updated the type of the specified page.
+	
+		Trace data format:
+		- 4 bytes containing the new TZonePageType type of the page
+		- 4 bytes containing the physical address of the page
+		*/
+		ERamAllocChangePageType,
+
+		/**
+		Event generated when DRamAllocator::ZoneAllocContiguousRam has
+		successfully allocated the required number of pages.
+
+		Trace data format:
+		- 4 bytes containing the TZonePageType type of the pages
+		- 4 bytes containing the number of contiguous pages
+		- 4 bytes containing the base address of the pages
+		*/
+		ERamAllocZoneContiguousRam,
+
+		/**
+		Event generated when DRamAllocator::ZoneAllocRamPages has successfully
+		allocated all the requested RAM pages.  If DRamAllocator::ZoneAllocRamPages
+		couldn't allocate all the requested pages then this event is not generated.
+
+		Trace data format:
+		- no extra bytes sent
+		*/
+		ERamAllocZoneRamPagesEnd,
+		
+		/**
+		Event generated when Epoc::ClaimRamZone has successfully claimed 
+		the requested zone.
+		
+		Trace data format:
+		- 4 bytes containing the ID of the zone that has been claimed.
+		*/
+		ERamAllocClaimZone,
+		};
+
+	enum TFastMutex
+		{
+		/**
+		Event generated when a thread acquires a fast mutex, (waits on it).
+
+		Trace data format:
+		- 4 bytes containing the fast mutex id, (an NFastMutex*).
+		*/
+		EFastMutexWait,
+		
+		/**
+		Event generated when a thread releases a fast mutex, (signals it).
+
+		Trace data format:
+		- 4 bytes containing the fast mutex id, (an NFastMutex*).
+		*/
+		EFastMutexSignal,
+
+		/**
+		Event generated when a fast mutex is 'flashed' (signalled then immediately
+		waited on again). E.g the operation performed by NKern::FlashSystem.
+
+		Trace data format:
+		- 4 bytes containing the fast mutex id, (an NFastMutex*).
+		*/
+		EFastMutexFlash,
+		
+		/**
+		Trace to associate a fast mutex with a textual name.
+
+		Trace data format:
+		- 4 bytes containing the fast mutex id, (an NFastMutex*).
+		- 4 bytes containing unspecified data (should be output as zero).
+		- Remaining data is the ASCII name for the fast mutex.
+		*/
+		EFastMutexName,
+
+		/**
+		Event generated when a thread blocks on a fast mutex.
+
+		Trace data format:
+		- 4 bytes containing the fast mutex id, (an NFastMutex*).
+		*/
+		EFastMutexBlock,
+		};
+
+	/**
+	Enumeration of sub-category values for trace category EProfiling.
+	@see BTrace::EProfiling
+	*/
+	enum TProfiling
+		{
+		/**
+		CPU sample including program counter and thread context.
+
+		Trace data format:
+		- 4 bytes containing the program counter.
+		- 4 bytes containing thread context (an NThread*).
+		*/
+		ECpuFullSample = 0, 
+
+		/**
+		Optimised CPU sample including program counter. 
+		Doesn't include a thread context id as it hasn't changed since 
+		the last sample.
+
+		Trace data format:
+		- 4 bytes containing the program counter.
+		*/
+		ECpuOptimisedSample,
+
+		/**
+		CPU sample from iDFC including program counter.
+
+		Trace data format:
+		- 4 bytes containing the program counter.
+		*/
+		ECpuIdfcSample,
+
+		/**
+		CPU sample from non-Symbian thread.
+
+  		Trace data format:
+		- no extra bytes are sent
+		*/
+		ECpuNonSymbianThreadSample
+
+		};
+
+	/**
+	Enumeration of sub-category values for trace category ERawEvent.
+	@see BTrace::ERawEvent  
+	*/
+	enum TRawEventTrace
+		{
+
+		/**
+		For all the set Functions in the TRawEvent class.
+		Trace Data Format Varies depends which of the Overloaded Set Method from where its set .
+		Trace data format:
+		if there are only one 4 byte data
+
+		--The Following oder is folloed for data.
+		- 4 bytes containing the event type
+
+		if there are 2*4 byte data
+		- 4 bytes containing the event type
+		- 4 bytes containing the scan code
+		
+		if there are  3*4 byte data
+		- 4 bytes containing the event type
+		--4 bytes containining the X co-ordinate 
+		--4 bytes containining the Y co-ordinate 
+
+		if there are  4*4 byte data
+		- 4 bytes containing the event type
+		--4 bytes containining the X co-ordinate 
+		--4 bytes containining the Y co-ordinate 
+		--4 bytes containining the Z co-ordinate 
+
+		if there are  5*4 byte data
+		- 4 bytes containing the event type
+		--4 bytes containining the X co-ordinate 
+		--4 bytes containining the Y co-ordinate 
+		--4 bytes containining the Z co-ordinate 
+		--4 bytes containining the PointerNumber 
+
+  		if there are  7*4 byte data
+		- 4 bytes containing the event type
+		--4 bytes containining the X co-ordinate 
+		--4 bytes containining the Y co-ordinate 
+		--4 bytes containining the Z co-ordinate 
+		--4 bytes containining the Phi polar coordinate. 
+		--4 bytes containining the Theta polar coordinate. 
+		--4 bytes containining the rotation angle(alpha)
+		*/
+
+		ESetEvent = 1, 
+		
+		/**
+		For  user side SetTip Events
+		Trace data format:
+		- 4 bytes to state containing Tip Info.
+		*/	
+		ESetTipEvent,
+
+		/**
+		For  SetTilt Events
+		Trace data format:
+		- 4 bytes containing the event type
+		--4 bytes containining the Phi polar coordinate. 
+		--4 bytes containining the Theta polar coordinate.	
+		*/	
+		ESetTiltEvent,
+
+		/**
+		For  SetRotation Events
+		Trace data format:
+		- 4 bytes containing the event type
+		--4 bytes containining the rotation angle (alpha)			
+		*/	
+		ESetRotationtEvent,
+        
+		/**
+		For  SetPointerNumber Events
+		Trace data format:
+		- 4 bytes containing the Pointer Number
+		*/	
+		ESetPointerNumberEvent,
+
+		/**
+		For  user side addevents (User::AddEvent)
+		Trace data format:
+		- 4 bytes containing the event type
+		*/	
+		EUserAddEvent,
+        
+		/**
+		For  kernal side addevents (Kern::AddEvent)
+		Trace data format:
+		- 4 bytes containing the event type
+		*/
+		EKernelAddEvent
+		};
+
+	enum TSymbianKernelSync
+		{
+		/**
+		A semaphore (DSemaphore) has been created.
+
+		Trace data format:
+		- 4 bytes containing trace id (a DSemaphore*) for this semaphore.
+		- 4 bytes containing the owning DThread* or DProcess*
+		- Remaining data is the ASCII name of the semaphore.
+		*/
+		ESemaphoreCreate=0x00,
+		
+		/**
+		A semaphore (DSemaphore) has been destroyed.
+
+		Trace data format:
+		- 4 bytes containing trace id (a DSemaphore*) for this semaphore.
+		*/
+		ESemaphoreDestroy=0x01,
+
+		/**
+		A semaphore (DSemaphore) has been acquired.
+
+		Trace data format:
+		- 4 bytes containing trace id (a DSemaphore*) for this semaphore.
+		*/
+		ESemaphoreAcquire=0x02,
+
+		/**
+		A semaphore (DSemaphore) has been released.
+
+		Trace data format:
+		- 4 bytes containing trace id (a DSemaphore*) for this semaphore.
+		*/
+		ESemaphoreRelease=0x03,
+
+		/**
+		A thread has blocked on a semaphore (DSemaphore)
+
+		Trace data format:
+		- 4 bytes containing trace id (a DSemaphore*) for this semaphore.
+		*/
+		ESemaphoreBlock=0x04,
+
+
+		/**
+		A mutex (DMutex) has been created.
+
+		Trace data format:
+		- 4 bytes containing trace id (a DMutex*) for this mutex.
+		- 4 bytes containing the owning DThread* or DProcess*
+		- Remaining data is the ASCII name of the mutex.
+		*/
+		EMutexCreate=0x10,
+		
+		/**
+		A mutex (DMutex) has been destroyed.
+
+		Trace data format:
+		- 4 bytes containing trace id (a DMutex*) for this mutex.
+		*/
+		EMutexDestroy=0x11,
+
+		/**
+		A mutex (DMutex) has been acquired.
+
+		Trace data format:
+		- 4 bytes containing trace id (a DMutex*) for this mutex.
+		*/
+		EMutexAcquire=0x12,
+
+		/**
+		A mutex (DMutex) has been released.
+
+		Trace data format:
+		- 4 bytes containing trace id (a DMutex*) for this mutex.
+		*/
+		EMutexRelease=0x13,
+
+		/**
+		A thread has blocked on a mutex (DMutex)
+
+		Trace data format:
+		- 4 bytes containing trace id (a DMutex*) for this mutex.
+		*/
+		EMutexBlock=0x14,
+
+
+		/**
+		A condition variable (DCondVar) has been created.
+
+		Trace data format:
+		- 4 bytes containing trace id (a DCondVar*) for this condition variable.
+		- 4 bytes containing the owning DThread* or DProcess*
+		- Remaining data is the ASCII name of the condition variable.
+		*/
+		ECondVarCreate=0x20,
+		
+		/**
+		A condition variable (DCondVar) has been destroyed.
+
+		Trace data format:
+		- 4 bytes containing trace id (a DCondVar*) for this condition variable.
+		*/
+		ECondVarDestroy=0x21,
+
+		/**
+		A thread has blocked on a condition variable (DCondVar)
+
+		Trace data format:
+		- 4 bytes containing trace id (a DCondVar*) for this condition variable.
+		- 4 bytes containing trace id (DMutex*) for the associated mutex.
+		*/
+		ECondVarBlock=0x22,
+
+		/**
+		A thread has been released from a condition variable (DCondVar) wait
+
+		Trace data format:
+		- 4 bytes containing trace id (a DCondVar*) for this condition variable.
+		- 4 bytes containing trace id (DMutex*) for the associated mutex.
+		*/
+		ECondVarWakeUp=0x23,
+
+		/**
+		A condition variable (DCondVar) has been signalled
+
+		Trace data format:
+		- 4 bytes containing trace id (a DCondVar*) for this condition variable.
+		- 4 bytes containing trace id (DMutex*) for the associated mutex.
+		*/
+		ECondVarSignal=0x24,
+
+		/**
+		A condition variable (DCondVar) has been signalled in broadcast mode.
+
+		Trace data format:
+		- 4 bytes containing trace id (a DCondVar*) for this condition variable.
+		- 4 bytes containing trace id (DMutex*) for the associated mutex.
+		*/
+		ECondVarBroadcast=0x25,
+
+		};
+
+	/**
+	Calculate the address of the next trace record.
+	@param aCurrentRecord A pointer to a trace record.
+	@return The address of the trace record which follows aCurrentRecord.
+	*/
+	inline static TUint8* NextRecord(TAny* aCurrentRecord);
+
+#ifdef __KERNEL_MODE__
+
+	/**
+	Create initial trace output required for the specified trace category.
+	E.g. For the EThreadIdentification category, this will cause traces which identify
+	all threads already in existence at this point.
+
+	@aCategory The trace category, or -1 to indicate all trace categories.
+
+	@publishedPartner
+	@released
+	*/
+	IMPORT_C static void Prime(TInt aCategory=-1);
+
+	/**
+	Prototype for function which is called to output trace records.
+	I.e. as set by SetHandler().
+
+	The handler function should output all values which are appropriate for the
+	trace as specified in aHeader.
+
+	@param aHeader	The 4 bytes for the trace header.
+	@param aHeader2	The second header word.
+					(If EHeader2Present is set in the header flags.)
+	@param aContext	The context id.
+					(If EContextIdPresent is set in the header flags.)
+	@param a1		The first four bytes of trace data.
+					(Only if the header size indicates that this is present.)
+	@param a2		The second four bytes of trace data.
+					(Only if the header size indicates that this is present.)
+	@param a3		This is either the third four bytes of trace data, if
+					the header size indicates there is between 9 and 12 bytes
+					of trace data. If more than 12 of trace data are indicated, then
+					a3 contains a pointer to the remaining trace data, bytes 8 trough to N.
+					This trace data is word aligned.
+	@param aExtra	The 'extra' value.
+					(If EExtraPresent is set in the header flags.)
+	@param aPc		The Program Counter value.
+					(If EPcPresent is set in the header flags.)
+
+	@return			True, if the trace handler is enabled and outputting trace.
+					False otherwise.
+
+	Here is an example implementation of a trace handler:
+
+	@code
+	TInt size = (aHeader>>BTrace::ESizeIndex*8)&0xff;
+	TInt flags = (aHeader>>BTrace::EFlagsIndex*8)&0xff;
+	Output(aHeader), size -= 4;
+	if(flags&BTrace::EHeader2Present)
+		Output(aHeader2), size -= 4;
+	if(flags&BTrace::EContextIdPresent)
+		Output(aContext), size -= 4;
+	if(flags&BTrace::EPcPresent)
+		Output(aPc), size -= 4;
+	if(flags&BTrace::EExtraPresent)
+		Output(aExtra), size -= 4;
+	if(size<=0)
+		return ETrue;
+	Output(a1), size -= 4;
+	if(size<=0)
+		return ETrue;
+	Output(a2), size -= 4;
+	if(size<=0)
+		return ETrue;
+	if(size<=4)
+		Output(a3);
+	else
+		{
+		TUint32* data = (TUint32*)a3;
+		TUint32* end = (TUint32*)(a3+size);
+		do Output(*data++); while(data<end);
+		}
+	return ETrue;
+	@endcode
+
+	The trace handler may add timestamp values to the trace it outputs, in which case
+	it should modify the flags and size in aHeader accordingly, before outputting this value.
+	The Timestamp and/or Timestamp2 should be output, in that order, between the Header2 and
+	Context ID values.
+
+	IMPORTANT NOTES.
+	-	The handler must not make use of any kernel APIs, apart from TDfc::RawAdd(). (This is
+		because kernel APIs may contain tracing and this would result in deadlock of the system.)
+	-	The trace handler must not access or modify arguments which are not indicated as
+		being present by their flag in aHeader or aHeader2.
+		In particular, on ARM CPUs, the values a2, a3, aExtra and aPc are stored on the stack
+		and the caller of this function may not have created these arguments before calling the
+		trace handler.
+	-	The handler may be called in any context and in a re-entrant manner. Implementations must
+		be designed to cope with this.
+	-	The interrupt disable status must not be reduced by the trace handler during its operation.
+		E.g. if IRQs are disabled on entry, the handler must not cause them to become enabled
+		at any point.
+
+	@pre Call in any context.
+	@post Interrupt enable status unchanged.
+
+	@publishedPartner
+	@released
+	*/
+	typedef TBool(*THandler)(TUint32 aHeader,TUint32 aHeader2,const TUint32 aContext,const TUint32 a1,const TUint32 a2,const TUint32 a3,const TUint32 aExtra,const TUint32 aPc);
+
+
+	/**
+	Set the function which will receive all trace records.
+	@return The handler function which existed before this function was called.
+	@publishedPartner
+	@released
+	*/
+	IMPORT_C static BTrace::THandler SetHandler(BTrace::THandler aHandler);
+
+
+	/**
+	Set the trace filter bit for the specified category.
+
+	@param aCategory A category value from enum BTrace::TCategory.
+	@param aValue The new filter value for the category.
+				  1 means traces of this category are output, 0 means they are suppressed.
+				  Other values must not be used.
+
+	@return The previous value of the filter for the category, 0 or 1.
+			Or KErrNotSupported if this category is not supported by this build of the kernel.
+	@publishedPartner
+	@released
+	*/
+	IMPORT_C static TInt SetFilter(TUint aCategory, TBool aValue);
+
+
+	/**
+	Modify the secondary trace filter to add or remove the specified UID.
+
+	This method can not be used to disable a UID key if SetFilter2(TInt aGlobalFilter)
+	has been used to set the filter to pass all traces. Such attempts result in a return
+	code of KErrNotSupported.
+
+	@param aUid   The UID to filter.
+	@param aValue The new filter value for the UID.
+				  1 means traces with this UID are output, 0 means they are suppressed.
+				  Other values must not be used.
+
+	@return The previous value of the filter for the UID, 0 or 1, if operation is successful.
+			Otherwise, a negative number representing a system wide error code.
+			(E.g. KErrNoMemory.)
+
+	@pre Call in a thread context.
+
+	@publishedPartner
+	@released
+	*/
+	IMPORT_C static TInt SetFilter2(TUint32 aUid, TBool aValue);
+
+
+	/**
+	Set the secondary trace filter to include only the specified UIDs.
+	
+	@param aUids    Pointer to array of UIDs.
+	@param aNumUids Number of UID values pointer to by \a aUid.
+
+	@return KErrNone on success.
+			Otherwise, a negative number representing a system wide error code.
+			(E.g. KErrNoMemory.)
+
+	@pre Call in a thread context.
+
+	@publishedPartner
+	@released
+	*/
+	IMPORT_C static TInt SetFilter2(const TUint32* aUids, TInt aNumUids);
+
+
+	/**
+	Set the secondary trace filter to pass or reject every trace.
+	
+	@param aGlobalFilter If 0, the secondary filter will reject
+						 all traces; if 1, all traces are passed
+						 by the filter.
+						 Other values have no effect.
+
+	@return The previous value of the global filter, or -1 if the global filter
+			was not previously set.
+
+	@pre Call in a thread context.
+
+	@publishedPartner
+	@released
+	*/
+	IMPORT_C static TInt SetFilter2(TInt aGlobalFilter);
+
+
+	/**
+	Get the contents of the secondary trace filter.
+	
+	@param[out] aUids   Pointer to array of UIDs contained in the secondary filter.
+						Ownership of this array is passed to the caller of this
+						function, which is then responsible for deleting it.
+						If filter is empty, \a aUid equals zero.
+	@param[out] aGlobalFilter	Set to 1 if the secondary filter passes all traces.
+								Set to 0 if the secondary filter rejects all traces.
+								Set to -1 if the secondary filter operates by UIDs contained in traces.
+
+	@return Number of UIDs in returned array, if operation is successful.
+			Otherwise, a negative number representing a system wide error code.
+
+
+	@pre Call in a thread context.
+    @pre Calling thread must be in a critical section.
+
+	@publishedPartner
+	@released
+	*/
+	IMPORT_C static TInt Filter2(TUint32*& aUids, TInt& aGlobalFilter);
+
+
+	/**
+	Get the trace filter bit for the specified category.
+
+	@param aCategory A category value from enum BTrace::TCategory,
+	@return The value of the filter for the category, 0 or 1.
+			Or KErrNotSupported if this category is not supported by this build of the kernel.
+
+	@publishedPartner
+	@released
+	*/
+	inline static TInt Filter(TUint aCategory);
+
+	/**
+	Get a pointer to the spinlock used to serialise BTrace output on SMP systems.
+
+	@internalComponent
+	*/
+	IMPORT_C static TSpinLock* LockPtr();
+
+
+	/**
+	Enumeration of control functions which can be implemented by the BTrace handler.
+
+	These values are passed to #Control to indicate the requested operation and are
+	passed unaltered to the BTrace implementation's control function as specified by
+	SetHandlers().
+
+	@see #Control
+	@see #TControlFunction
+	*/
+	enum TControl
+		{
+		/**
+		Called to indicate that the system has crashed. Typical response to this call
+		is to disable tracing so that debug monitor activity doesn't generate any additional
+		trace.
+
+		As this function is called after the system is crashed its implementation must not
+		make use of any APIs which require a running system, it must also not re-enable
+		interrupts.
+		
+		ControlFunction argument meaning: None, ignore.
+		
+		ControlFunction returns nothing, ignore.
+		*/
+		ECtrlSystemCrashed,
+
+		/**
+		Called by crash monitor to request first block of data from any memory resident
+		trace buffer. A size of zero should be returned if the buffer is empty.
+
+		This should be a non-destructive operation if possible. I.e. the contents of the
+		buffer should be capable of being read multiple times by issuing repeated
+		ECtrlCrashReadFirst/ECtrlCrashReadNext sequences.
+		
+		As this function is called after the system is crashed its implementation must not
+		make use of any APIs which require a running system, it must also not re-enable
+		interrupts.
+
+		ControlFunction argument meaning:
+		- aArg1 should be treated as a TUint8*& and set to the start address of the trace data.
+		- aArg2 should be treated as a TUint& and set to the length of the trace data.
+
+		ControlFunction returns KErrNone if successful, otherwise one of the other system wide
+		error codes.
+		*/
+		ECtrlCrashReadFirst,
+		
+		/**
+		Called by crash monitor after using ECrashReadFirst, to request subsequent
+		blocks of data from the trace buffer. A size of zero should be returned if
+		the end of the buffer has been reached.
+		
+		As this function is called after the system is crashed its implementation must not
+		make use of any APIs which require a running system, it must also not re-enable
+		interrupts.
+
+		ControlFunction argument meaning:
+		aArg1 should be treated as a TUint8** and set to the start address of the trace data.
+		aArg2 should be treated as a TUint* and set to the length of the trace data.
+		
+		ControlFunction returns KErrNone if successful, otherwise one of the other system wide
+		error codes.
+		*/
+		ECtrlCrashReadNext
+		};
+
+	/**
+	Prototype for function callback called by #Control.
+	I.e. as set by SetHandlers().
+	*/
+	typedef TInt(*TControlFunction)(TControl aFunction, TAny* aArg1, TAny* aArg2);
+
+	/**
+	Call the BTrace handlers control function to perform the function.
+
+	@param aFunction	A value from TControl specifying the requested operation.
+	@param aArg1		First argument for the operation. See enum TControl.
+	@param aArg1		Second argument for the operation. See enum TControl.
+
+	@return KErrNone if successful,
+			KErrNotSupported if the function isn't supported.
+			otherwise one of the other system wide error codes.
+
+	@see TControl.
+	*/
+	IMPORT_C static TInt Control(TControl aFunction, TAny* aArg1=0, TAny* aArg2=0);
+
+	/**
+	Set both the function which will receive all trace records, and the
+	control function which will be called by each use of #Control.
+
+	@param aNewHandler The new handler to receive trace.
+	@param aNewControl The new handler for control functions.
+	@param aOldHandler The trace handler which existed prior to this function being called.
+	@param aOldControl The control handler which existed prior to this function being called.
+	*/
+	IMPORT_C static void SetHandlers(BTrace::THandler aNewHandler, BTrace::TControlFunction aNewControl, BTrace::THandler& aOldHandler, BTrace::TControlFunction& aOldControl);
+
+#endif //  __KERNEL_MODE__
+
+	/**
+	Check the trace filters to see if a trace with a given category
+	would be output.
+
+	@param aCategory  A category value from enum BTrace::TCategory.
+					  Only the 8 least significant bits in this value are used;
+					  other bits are ignored.
+
+	@return True if a trace with this specification would be passed by the filters.
+			False if a trace with this specification would be dropped by the filters.
+
+	@publishedPartner
+	@released
+	*/
+	IMPORT_C static TBool CheckFilter(TUint32 aCategory);
+
+	/**
+	Check the trace filters to see if a trace with a given category
+	and filter UID would be output.
+
+	@param aCategory  A category value from enum BTrace::TCategory.
+					  Only the 8 least significant bits in this value are used;
+					  other bits are ignored.
+	@param aUid       A UID to filter on.
+
+	@return True if a trace with this specification would be passed by the filters.
+			False if a trace with this specification would be dropped by the filters.
+
+	@publishedPartner
+	@released
+	*/
+	IMPORT_C static TBool CheckFilter2(TUint32 aCategory,TUint32 aUid);
+
+	/**
+	Common function for BTrace macros.
+	@internalComponent
+	*/
+	IMPORT_C static TBool Out(TUint32 a0,TUint32 a1,TUint32 a2,TUint32 a3);
+
+	/**
+	Common function for BTrace macros.
+	@internalComponent
+	*/
+	IMPORT_C static TBool OutX(TUint32 a0,TUint32 a1,TUint32 a2,TUint32 a3);
+
+	/**
+	Common function for BTrace macros.
+	@internalComponent
+	*/
+	IMPORT_C static TBool OutN(TUint32 a0, TUint32 a1, TUint32 a2, const TAny* aData, TInt aDataSize);
+
+	/**
+	Common function for BTrace macros.
+	@internalComponent
+	*/
+	IMPORT_C static TBool OutNX(TUint32 a0, TUint32 a1, TUint32 a2, const TAny* aData, TInt aDataSize);
+
+	/**
+	Common function for BTrace macros.
+	@internalComponent
+	*/
+	IMPORT_C static TBool OutBig(TUint32 a0, TUint32 a1, const TAny* aData, TInt aDataSize);
+
+	/**
+	Common function for BTrace macros.
+	@internalComponent
+	*/
+	IMPORT_C static TBool OutFiltered(TUint32 a0,TUint32 a1,TUint32 a2,TUint32 a3);
+
+	/**
+	Common function for BTrace macros.
+	@internalComponent
+	*/
+	IMPORT_C static TBool OutFilteredX(TUint32 a0,TUint32 a1,TUint32 a2,TUint32 a3);
+
+	/**
+	Common function for BTrace macros.
+	@internalComponent
+	*/
+	IMPORT_C static TBool OutFilteredN(TUint32 a0, TUint32 a1, TUint32 a2, const TAny* aData, TInt aDataSize);
+
+	/**
+	Common function for BTrace macros.
+	@internalComponent
+	*/
+	IMPORT_C static TBool OutFilteredNX(TUint32 a0, TUint32 a1, TUint32 a2, const TAny* aData, TInt aDataSize);
+
+	/**
+	Common function for BTrace macros.
+	@internalComponent
+	*/
+	IMPORT_C static TBool OutFilteredBig(TUint32 a0, TUint32 a1, const TAny* aData, TInt aDataSize);
+
+	/**
+	@internalComponent
+	*/
+	static void Init0();
+
+	/**
+	@internalComponent
+	*/
+	typedef TBool(*TBTrace1)(TUint32);
+
+	/**
+	@internalComponent
+	*/
+	typedef TBool(*TBTrace2)(TUint32,TUint32);
+
+	/**
+	@internalComponent
+	*/
+	typedef TBool(*TBTrace3)(TUint32,TUint32,TUint32);
+
+	/**
+	@internalComponent
+	*/
+	struct SExecExtension
+		{
+		TUint32	iA2;
+		TUint32	iA3;
+		TUint32	iPc;
+		};
+
+	/**
+	@internalComponent
+	*/
+	static TBool DoOutBig(TUint32 a0, TUint32 a1, const TAny* aData, TInt aDataSize, TUint32 aContext, TUint32 aPc);
+
+	/**
+	@internalComponent
+	*/
+	static TUint32 BigTraceId;
+
+	/**
+	@internalComponent
+	*/
+	static TBool IsSupported(TUint aCategory);
+	};
+
+
+/**
+@internalComponent
+*/
+class DBTraceFilter2
+	{
+public:
+	TUint iNumUids;
+	TInt iAccessCount;
+	TUint32 iUids[1];
+
+	TBool Check(TUint32 aUid);
+
+	static DBTraceFilter2* New(TInt aNumUids);
+	static DBTraceFilter2* Open(DBTraceFilter2*volatile& aFilter2);
+	void Close();
+
+	DBTraceFilter2* iCleanupLink;
+	static DBTraceFilter2* iCleanupHead;
+	static void Cleanup();
+	};
+
+
+
+
+//
+// BTraceX macros
+//
+
+/**
+@internalComponent
+*/
+#define BTRACE_HEADER(aSize,aCategory,aSubCategory)			\
+	(((aSize)<<BTrace::ESizeIndex*8)							\
+	+((aCategory)<<BTrace::ECategoryIndex*8)					\
+	+((aSubCategory)<<BTrace::ESubCategoryIndex*8))
+
+/**
+@internalComponent
+*/
+#define BTRACE_HEADER_C(aSize,aCategory,aSubCategory)		\
+	((((aSize)+4)<<BTrace::ESizeIndex*8)						\
+	+((BTrace::EContextIdPresent)<<BTrace::EFlagsIndex*8)	\
+	+((aCategory)<<BTrace::ECategoryIndex*8)					\
+	+((aSubCategory)<<BTrace::ESubCategoryIndex*8))
+
+/**
+@internalComponent
+*/
+#define BTRACE_HEADER_P(aSize,aCategory,aSubCategory)		\
+	((((aSize)+4)<<BTrace::ESizeIndex*8)						\
+	+((BTrace::EPcPresent)<<BTrace::EFlagsIndex*8)		\
+	+((aCategory)<<BTrace::ECategoryIndex*8)					\
+	+((aSubCategory)<<BTrace::ESubCategoryIndex*8))
+
+/**
+@internalComponent
+*/
+#define BTRACE_HEADER_CP(aSize,aCategory,aSubCategory)								\
+	((((aSize)+8)<<BTrace::ESizeIndex*8)												\
+	+((BTrace::EContextIdPresent|BTrace::EPcPresent)<<BTrace::EFlagsIndex*8)	\
+	+((aCategory)<<BTrace::ECategoryIndex*8)											\
+	+((aSubCategory)<<BTrace::ESubCategoryIndex*8))
+
+
+
+/**
+Output a trace record of the specified category.
+
+The trace record data is 0 bytes in size.
+
+@param aCategory	A value from enum BTrace::TCategory,
+@param aSubCategory Sub-category value between 0 and 255.
+					The meaning of this is dependent on the Category.
+
+@return True if trace is enabled for aCategory, false otherwise.
+@publishedPartner
+@released
+*/
+#define BTrace0(aCategory,aSubCategory) \
+	((BTrace::TBTrace1)BTrace::Out) \
+		(BTRACE_HEADER(4,(aCategory),(aSubCategory)))
+
+/**
+Output a trace record of the specified category.
+
+The trace record data is 4 bytes in size.
+
+@param aCategory	A value from enum BTrace::TCategory,
+@param aSubCategory Sub-category value between 0 and 255.
+					The meaning of this is dependent on the Category.
+@param a1			The 32bit quantity which forms the data of this trace record.
+
+@return True if trace is enabled for aCategory, false otherwise.
+@publishedPartner
+@released
+*/
+#define BTrace4(aCategory,aSubCategory,a1) \
+	((BTrace::TBTrace2)BTrace::Out) \
+		(BTRACE_HEADER(8,(aCategory),(aSubCategory)),(TUint32)(a1))
+
+/**
+Output a trace record of the specified category.
+
+The trace record data is 8 bytes in size.
+
+@param aCategory	A value from enum BTrace::TCategory,
+@param aSubCategory Sub-category value between 0 and 255.
+					The meaning of this is dependent on the Category.
+@param a1			The first 32bit quantity which forms the data of this trace record.
+@param a2			The second 32bit quantity which forms the data of this trace record.
+
+@return True if trace is enabled for aCategory, false otherwise.
+@publishedPartner
+@released
+*/
+#define BTrace8(aCategory,aSubCategory,a1,a2) \
+	((BTrace::TBTrace3)BTrace::Out) \
+		(BTRACE_HEADER(12,(aCategory),(aSubCategory)),(TUint32)(a1),(TUint32)(a2))
+
+/**
+Output a trace record of the specified category.
+
+The trace record data is 12 bytes in size.
+
+@param aCategory	A value from enum BTrace::TCategory,
+@param aSubCategory Sub-category value between 0 and 255.
+					The meaning of this is dependent on the Category.
+@param a1			The first 32bit quantity which forms the data of this trace record.
+@param a2			The second 32bit quantity which forms the data of this trace record.
+@param a3			The third 32bit quantity which forms the data of this trace record.
+
+@return True if trace is enabled for aCategory, false otherwise.
+@publishedPartner
+@released
+*/
+#define BTrace12(aCategory,aSubCategory,a1,a2,a3) \
+	BTrace::Out \
+		(BTRACE_HEADER(16,(aCategory),(aSubCategory)),(TUint32)(a1),(TUint32)(a2),(TUint32)(a3))
+
+/**
+Output a trace record of the specified category.
+
+@param aCategory	A value from enum BTrace::TCategory,
+@param aSubCategory Sub-category value between 0 and 255.
+					The meaning of this is dependent on the Category.
+@param a1			The first 32bit quantity which forms the data of this trace record.
+@param a2			The second 32bit quantity which forms the data of this trace record.
+@param aData		Address of addition data to add to trace.
+					Must be word aligned, i.e. a multiple of 4.
+@param aDataSize	Number of bytes of additional data. If this value is greater than
+					KMaxBTraceDataArray then data is truncated to this size and the
+					flag ERecordTruncated is set in the record.
+
+@return True if trace is enabled for aCategory, false otherwise.
+@publishedPartner
+@released
+*/
+#define BTraceN(aCategory,aSubCategory,a1,a2,aData,aDataSize) \
+	BTrace::OutN \
+		(BTRACE_HEADER(12,(aCategory),(aSubCategory)),(TUint32)(a1),(TUint32)(a2),aData,aDataSize)
+
+/**
+Output a trace record of the specified category.
+
+If the specified data is too big to find into a single trace record, then a
+multipart trace is generated. See TMultiPart.
+
+@param aCategory	A value from enum BTrace::TCategory,
+@param aSubCategory Sub-category value between 0 and 255.
+					The meaning of this is dependent on the Category.
+@param a1			The first 32bit quantity which forms the data of this trace record.
+@param aData		Address of addition data to add to trace.
+					Must be word aligned, i.e. a multiple of 4.
+@param aDataSize	Number of bytes of additional data.
+
+@return True if trace is enabled for aCategory, false otherwise.
+@publishedPartner
+@released
+*/
+#define BTraceBig(aCategory,aSubCategory,a1,aData,aDataSize) \
+	BTrace::OutBig \
+		(BTRACE_HEADER(8,(aCategory),(aSubCategory)),(TUint32)(a1),aData,(TInt)(aDataSize))
+
+
+
+/**
+Output a trace record of the specified category.
+
+The trace record data is 0 bytes in size.
+
+@param aCategory	A value from enum BTrace::TCategory,
+@param aSubCategory Sub-category value between 0 and 255.
+					The meaning of this is dependent on the Category.
+
+@return True if trace is enabled for aCategory, false otherwise.
+@publishedPartner
+@released
+*/
+#define BTraceContext0(aCategory,aSubCategory) \
+	((BTrace::TBTrace1)BTrace::OutX) \
+		(BTRACE_HEADER_C(4,(aCategory),(aSubCategory)))
+
+/**
+Output a trace record of the specified category which also includes a Context ID.
+
+The trace record data is 4 bytes in size.
+
+@param aCategory	A value from enum BTrace::TCategory,
+@param aSubCategory Sub-category value between 0 and 255.
+					The meaning of this is dependent on the Category.
+@param a1			The 32bit quantity which forms the data of this trace record.
+
+@return True if trace is enabled for aCategory, false otherwise.
+@publishedPartner
+@released
+*/
+#define BTraceContext4(aCategory,aSubCategory,a1) \
+	((BTrace::TBTrace2)BTrace::OutX) \
+		(BTRACE_HEADER_C(8,(aCategory),(aSubCategory)),(TUint32)(a1))
+
+/**
+Output a trace record of the specified category which also includes a Context ID.
+
+The trace record data is 8 bytes in size.
+
+@param aCategory	A value from enum BTrace::TCategory,
+@param aSubCategory Sub-category value between 0 and 255.
+					The meaning of this is dependent on the Category.
+@param a1			The first 32bit quantity which forms the data of this trace record.
+@param a2			The second 32bit quantity which forms the data of this trace record.
+
+@return True if trace is enabled for aCategory, false otherwise.
+@publishedPartner
+@released
+*/
+#define BTraceContext8(aCategory,aSubCategory,a1,a2) \
+	((BTrace::TBTrace3)BTrace::OutX) \
+		(BTRACE_HEADER_C(12,(aCategory),(aSubCategory)),(TUint32)(a1),(TUint32)(a2))
+
+/**
+Output a trace record of the specified category which also includes a Context ID.
+
+The trace record data is 12 bytes in size.
+
+@param aCategory	A value from enum BTrace::TCategory,
+@param aSubCategory Sub-category value between 0 and 255.
+					The meaning of this is dependent on the Category.
+@param a1			The first 32bit quantity which forms the data of this trace record.
+@param a2			The second 32bit quantity which forms the data of this trace record.
+@param a3			The third 32bit quantity which forms the data of this trace record.
+
+@return True if trace is enabled for aCategory, false otherwise.
+@publishedPartner
+@released
+*/
+#define BTraceContext12(aCategory,aSubCategory,a1,a2,a3) \
+	BTrace::OutX \
+		(BTRACE_HEADER_C(16,(aCategory),(aSubCategory)),(TUint32)(a1),(TUint32)(a2),(TUint32)(a3))
+
+/**
+Output a trace record of the specified category which also includes a Context ID.
+
+@param aCategory	A value from enum BTrace::TCategory,
+@param aSubCategory Sub-category value between 0 and 255.
+					The meaning of this is dependent on the Category.
+@param a1			The first 32bit quantity which forms the data of this trace record.
+@param a2			The second 32bit quantity which forms the data of this trace record.
+@param aData		Address of addition data to add to trace.
+					Must be word aligned, i.e. a multiple of 4.
+@param aDataSize	Number of bytes of additional data. If this value is greater than
+					KMaxBTraceDataArray then data is truncated to this size and the
+					flag ERecordTruncated is set in the record.
+
+@return True if trace is enabled for aCategory, false otherwise.
+@publishedPartner
+@released
+*/
+#define BTraceContextN(aCategory,aSubCategory,a1,a2,aData,aDataSize) \
+	BTrace::OutNX \
+		(BTRACE_HEADER_C(12,(aCategory),(aSubCategory)),(TUint32)(a1),(TUint32)(a2),aData,aDataSize)
+
+/**
+Output a trace record of the specified category which also includes a Context ID.
+
+If the specified data is too big to find into a single trace record, then a
+multipart trace is generated. See TMultiPart.
+
+@param aCategory	A value from enum BTrace::TCategory,
+@param aSubCategory Sub-category value between 0 and 255.
+					The meaning of this is dependent on the Category.
+@param a1			The first 32bit quantity which forms the data of this trace record.
+@param aData		Address of addition data to add to trace.
+					Must be word aligned, i.e. a multiple of 4.
+@param aDataSize	Number of bytes of additional data.
+
+@return True if trace is enabled for aCategory, false otherwise.
+@publishedPartner
+@released
+*/
+#define BTraceContextBig(aCategory,aSubCategory,a1,aData,aDataSize) \
+	BTrace::OutBig \
+		(BTRACE_HEADER_C(8,(aCategory),(aSubCategory)),(TUint32)(a1),aData,(TInt)(aDataSize))
+
+
+
+/**
+Output a trace record of the specified category which also includes a Program Counter value.
+
+The trace record data is 0 bytes in size.
+
+@param aCategory	A value from enum BTrace::TCategory,
+@param aSubCategory Sub-category value between 0 and 255.
+					The meaning of this is dependent on the Category.
+
+@return True if trace is enabled for aCategory, false otherwise.
+@publishedPartner
+@released
+*/
+#define BTracePc0(aCategory,aSubCategory) \
+	((BTrace::TBTrace1)BTrace::Out) \
+		(BTRACE_HEADER_P(4,(aCategory),(aSubCategory)))
+
+/**
+Output a trace record of the specified category which also includes a Program Counter value.
+
+The trace record data is 4 bytes in size.
+
+@param aCategory	A value from enum BTrace::TCategory,
+@param aSubCategory Sub-category value between 0 and 255.
+					The meaning of this is dependent on the Category.
+@param a1			The 32bit quantity which forms the data of this trace record.
+
+@return True if trace is enabled for aCategory, false otherwise.
+@publishedPartner
+@released
+*/
+#define BTracePc4(aCategory,aSubCategory,a1)	\
+	((BTrace::TBTrace2)BTrace::Out) \
+		(BTRACE_HEADER_P(8,(aCategory),(aSubCategory)),(TUint32)(a1))
+
+/**
+Output a trace record of the specified category which also includes a Program Counter value.
+
+The trace record data is 8 bytes in size.
+
+@param aCategory	A value from enum BTrace::TCategory,
+@param aSubCategory Sub-category value between 0 and 255.
+					The meaning of this is dependent on the Category.
+@param a1			The first 32bit quantity which forms the data of this trace record.
+@param a2			The second 32bit quantity which forms the data of this trace record.
+
+@return True if trace is enabled for aCategory, false otherwise.
+@publishedPartner
+@released
+*/
+#define BTracePc8(aCategory,aSubCategory,a1,a2) \
+	((BTrace::TBTrace3)BTrace::Out) \
+		(BTRACE_HEADER_P(12,(aCategory),(aSubCategory)),(TUint32)(a1),(TUint32)(a2))
+
+/**
+Output a trace record of the specified category which also includes a Program Counter value.
+
+The trace record data is 12 bytes in size.
+
+@param aCategory	A value from enum BTrace::TCategory,
+@param aSubCategory Sub-category value between 0 and 255.
+					The meaning of this is dependent on the Category.
+@param a1			The first 32bit quantity which forms the data of this trace record.
+@param a2			The second 32bit quantity which forms the data of this trace record.
+@param a3			The third 32bit quantity which forms the data of this trace record.
+
+@return True if trace is enabled for aCategory, false otherwise.
+@publishedPartner
+@released
+*/
+#define BTracePc12(aCategory,aSubCategory,a1,a2,a3) \
+	BTrace::Out \
+		(BTRACE_HEADER_P(16,(aCategory),(aSubCategory)),(TUint32)(a1),(TUint32)(a2),(TUint32)(a3))
+
+/**
+Output a trace record of the specified category which also includes a Program Counter value.
+
+@param aCategory	A value from enum BTrace::TCategory,
+@param aSubCategory Sub-category value between 0 and 255.
+					The meaning of this is dependent on the Category.
+@param a1			The first 32bit quantity which forms the data of this trace record.
+@param a2			The second 32bit quantity which forms the data of this trace record.
+@param aData		Address of addition data to add to trace.
+					Must be word aligned, i.e. a multiple of 4.
+@param aDataSize	Number of bytes of additional data. If this value is greater than
+					KMaxBTraceDataArray then data is truncated to this size and the
+					flag ERecordTruncated is set in the record.
+
+@return True if trace is enabled for aCategory, false otherwise.
+@publishedPartner
+@released
+*/
+#define BTracePcN(aCategory,aSubCategory,a1,a2,aData,aDataSize) \
+	BTrace::OutN \
+		(BTRACE_HEADER_P(12,(aCategory),(aSubCategory)),(TUint32)(a1),(TUint32)(a2),aData,aDataSize)
+
+/**
+Output a trace record of the specified category which also includes a Program Counter value.
+
+If the specified data is too big to find into a single trace record, then a
+multipart trace is generated. See TMultiPart.
+
+@param aCategory	A value from enum BTrace::TCategory,
+@param aSubCategory Sub-category value between 0 and 255.
+					The meaning of this is dependent on the Category.
+@param a1			The first 32bit quantity which forms the data of this trace record.
+@param aData		Address of addition data to add to trace.
+					Must be word aligned, i.e. a multiple of 4.
+@param aDataSize	Number of bytes of additional data.
+
+@return True if trace is enabled for aCategory, false otherwise.
+@publishedPartner
+@released
+*/
+#define BTracePcBig(aCategory,aSubCategory,a1,aData,aDataSize) \
+	BTrace::OutBig \
+		(BTRACE_HEADER_P(8,(aCategory),(aSubCategory)),(TUint32)(a1),aData,(TInt)(aDataSize))
+
+
+
+
+/**
+Output a trace record of the specified category which also includes
+Context ID and Program Counter values.
+
+The trace record data is 0 bytes in size.
+
+@param aCategory	A value from enum BTrace::TCategory,
+@param aSubCategory Sub-category value between 0 and 255.
+					The meaning of this is dependent on the Category.
+
+@return True if trace is enabled for aCategory, false otherwise.
+@publishedPartner
+@released
+*/
+#define BTraceContextPc0(aCategory,aSubCategory)	\
+	((BTrace::TBTrace1)BTrace::OutX) \
+		(BTRACE_HEADER_CP(4,(aCategory),(aSubCategory)))
+
+/**
+Output a trace record of the specified category which also includes
+Context ID and Program Counter values.
+
+The trace record data is 4 bytes in size.
+
+@param aCategory	A value from enum BTrace::TCategory,
+@param aSubCategory Sub-category value between 0 and 255.
+					The meaning of this is dependent on the Category.
+@param a1			The 32bit quantity which forms the data of this trace record.
+
+@return True if trace is enabled for aCategory, false otherwise.
+@publishedPartner
+@released
+*/
+#define BTraceContextPc4(aCategory,aSubCategory,a1)	\
+	((BTrace::TBTrace2)BTrace::OutX) \
+		(BTRACE_HEADER_CP(8,(aCategory),(aSubCategory)),(TUint32)(a1))
+
+/**
+Output a trace record of the specified category which also includes
+Context ID and Program Counter values.
+
+The trace record data is 8 bytes in size.
+
+@param aCategory	A value from enum BTrace::TCategory,
+@param aSubCategory Sub-category value between 0 and 255.
+					The meaning of this is dependent on the Category.
+@param a1			The first 32bit quantity which forms the data of this trace record.
+@param a2			The second 32bit quantity which forms the data of this trace record.
+
+@return True if trace is enabled for aCategory, false otherwise.
+@publishedPartner
+@released
+*/
+#define BTraceContextPc8(aCategory,aSubCategory,a1,a2) \
+	((BTrace::TBTrace3)BTrace::OutX) \
+		(BTRACE_HEADER_CP(12,(aCategory),(aSubCategory)),(TUint32)(a1),(TUint32)(a2))
+
+/**
+Output a trace record of the specified category which also includes
+Context ID and Program Counter values.
+
+The trace record data is 12 bytes in size.
+
+@param aCategory	A value from enum BTrace::TCategory,
+@param aSubCategory Sub-category value between 0 and 255.
+					The meaning of this is dependent on the Category.
+@param a1			The first 32bit quantity which forms the data of this trace record.
+@param a2			The second 32bit quantity which forms the data of this trace record.
+@param a3			The third 32bit quantity which forms the data of this trace record.
+
+@return True if trace is enabled for aCategory, false otherwise.
+@publishedPartner
+@released
+*/
+#define BTraceContextPc12(aCategory,aSubCategory,a1,a2,a3) \
+	BTrace::OutX \
+		(BTRACE_HEADER_CP(16,(aCategory),(aSubCategory)),(TUint32)(a1),(TUint32)(a2),(TUint32)(a3))
+
+/**
+Output a trace record of the specified category which also includes
+Context ID and Program Counter values.
+
+@param aCategory	A value from enum BTrace::TCategory,
+@param aSubCategory Sub-category value between 0 and 255.
+					The meaning of this is dependent on the Category.
+@param a1			The first 32bit quantity which forms the data of this trace record.
+@param a2			The second 32bit quantity which forms the data of this trace record.
+@param aData		Address of addition data to add to trace.
+					Must be word aligned, i.e. a multiple of 4.
+@param aDataSize	Number of bytes of additional data. If this value is greater than
+					KMaxBTraceDataArray then data is truncated to this size and the
+					flag ERecordTruncated is set in the record.
+
+@return True if trace is enabled for aCategory, false otherwise.
+@publishedPartner
+@released
+*/
+#define BTraceContextPcN(aCategory,aSubCategory,a1,a2,aData,aDataSize) \
+	BTrace::OutNX \
+		(BTRACE_HEADER_CP(12,(aCategory),(aSubCategory)),(TUint32)(a1),(TUint32)(a2),aData,aDataSize)
+
+/**
+Output a trace record of the specified category which also includes
+Context ID and Program Counter values.
+
+If the specified data is too big to find into a single trace record, then a
+multipart trace is generated. See TMultiPart.
+
+@param aCategory	A value from enum BTrace::TCategory,
+@param aSubCategory Sub-category value between 0 and 255.
+					The meaning of this is dependent on the Category.
+@param a1			The first 32bit quantity which forms the data of this trace record.
+@param aData		Address of addition data to add to trace.
+					Must be word aligned, i.e. a multiple of 4.
+@param aDataSize	Number of bytes of additional data.
+
+@return True if trace is enabled for aCategory, false otherwise.
+@publishedPartner
+@released
+*/
+#define BTraceContextPcBig(aCategory,aSubCategory,a1,aData,aDataSize) \
+	BTrace::OutBig \
+		(BTRACE_HEADER_CP(8,(aCategory),(aSubCategory)),(TUint32)(a1),aData,(TInt)(aDataSize))
+
+
+
+/**
+Output a trace record of the specified category.
+
+The trace record data is 4 bytes in size.
+
+If the value of \a aUid is not contained in the secondary filter then the trace is discarded.
+
+@param aCategory	A value from enum BTrace::TCategory,
+@param aSubCategory Sub-category value between 0 and 255.
+					The meaning of this is dependent on the Category.
+@param aUid			The 32bit quantity which forms the data of this trace record.
+
+@return True if trace is enabled for aCategory and aUid, false otherwise.
+@publishedPartner
+@released
+*/
+#define BTraceFiltered4(aCategory,aSubCategory,aUid) \
+	((BTrace::TBTrace2)BTrace::OutFiltered) \
+		(BTRACE_HEADER(8,(aCategory),(aSubCategory)),(TUint32)(aUid))
+
+/**
+Output a trace record of the specified category.
+
+The trace record data is 8 bytes in size.
+
+If the value of \a aUid is not contained in the secondary filter then the trace is discarded.
+
+@param aCategory	A value from enum BTrace::TCategory,
+@param aSubCategory Sub-category value between 0 and 255.
+					The meaning of this is dependent on the Category.
+@param aUid			The first 32bit quantity which forms the data of this trace record.
+@param a1			The second 32bit quantity which forms the data of this trace record.
+
+@return True if trace is enabled for aCategory and aUid, false otherwise.
+@publishedPartner
+@released
+*/
+#define BTraceFiltered8(aCategory,aSubCategory,aUid,a1) \
+	((BTrace::TBTrace3)BTrace::OutFiltered) \
+		(BTRACE_HEADER(12,(aCategory),(aSubCategory)),(TUint32)(aUid),(TUint32)(a1))
+
+/**
+Output a trace record of the specified category.
+
+The trace record data is 12 bytes in size.
+
+If the value of \a aUid is not contained in the secondary filter then the trace is discarded.
+
+@param aCategory	A value from enum BTrace::TCategory,
+@param aSubCategory Sub-category value between 0 and 255.
+					The meaning of this is dependent on the Category.
+@param aUid			The first 32bit quantity which forms the data of this trace record.
+@param a1			The second 32bit quantity which forms the data of this trace record.
+@param a2			The third 32bit quantity which forms the data of this trace record.
+
+@return True if trace is enabled for aCategory and aUid, false otherwise.
+@publishedPartner
+@released
+*/
+#define BTraceFiltered12(aCategory,aSubCategory,aUid,a1,a2) \
+	BTrace::OutFiltered \
+		(BTRACE_HEADER(16,(aCategory),(aSubCategory)),(TUint32)(aUid),(TUint32)(a1),(TUint32)(a2))
+
+/**
+Output a trace record of the specified category.
+
+If the value of \a aUid is not contained in the secondary filter then the trace is discarded.
+
+@param aCategory	A value from enum BTrace::TCategory,
+@param aSubCategory Sub-category value between 0 and 255.
+					The meaning of this is dependent on the Category.
+@param aUid			The first 32bit quantity which forms the data of this trace record.
+@param a1			The second 32bit quantity which forms the data of this trace record.
+@param aData		Address of addition data to add to trace.
+					Must be word aligned, i.e. a multiple of 4.
+@param aDataSize	Number of bytes of additional data. If this value is greater than
+					KMaxBTraceDataArray then data is truncated to this size and the
+					flag ERecordTruncated is set in the record.
+
+@return True if trace is enabled for aCategory and aUid, false otherwise.
+@publishedPartner
+@released
+*/
+#define BTraceFilteredN(aCategory,aSubCategory,aUid,a1,aData,aDataSize) \
+	BTrace::OutFilteredN \
+		(BTRACE_HEADER(12,(aCategory),(aSubCategory)),(TUint32)(aUid),(TUint32)(a1),aData,aDataSize)
+
+/**
+Output a trace record of the specified category.
+
+If the specified data is too big to find into a single trace record, then a
+multipart trace is generated. See TMultiPart.
+
+If the value of \a aUid is not contained in the secondary filter then the trace is discarded.
+
+@param aCategory	A value from enum BTrace::TCategory,
+@param aSubCategory Sub-category value between 0 and 255.
+					The meaning of this is dependent on the Category.
+@param aUid			The first 32bit quantity which forms the data of this trace record.
+@param aData		Address of addition data to add to trace.
+					Must be word aligned, i.e. a multiple of 4.
+@param aDataSize	Number of bytes of additional data.
+
+@return True if trace is enabled for aCategory and aUid, false otherwise.
+@publishedPartner
+@released
+*/
+#define BTraceFilteredBig(aCategory,aSubCategory,aUid,aData,aDataSize) \
+	BTrace::OutFilteredBig \
+		(BTRACE_HEADER(8,(aCategory),(aSubCategory)),(TUint32)(aUid),aData,(TInt)(aDataSize))
+
+
+
+/**
+Output a trace record of the specified category which also includes a Context ID.
+
+The trace record data is 4 bytes in size.
+
+If the value of \a aUid is not contained in the secondary filter then the trace is discarded.
+
+@param aCategory	A value from enum BTrace::TCategory,
+@param aSubCategory Sub-category value between 0 and 255.
+					The meaning of this is dependent on the Category.
+@param aUid			The 32bit quantity which forms the data of this trace record.
+
+@return True if trace is enabled for aCategory and aUid, false otherwise.
+@publishedPartner
+@released
+*/
+#define BTraceFilteredContext4(aCategory,aSubCategory,aUid) \
+	((BTrace::TBTrace2)BTrace::OutFilteredX) \
+		(BTRACE_HEADER_C(8,(aCategory),(aSubCategory)),(TUint32)(aUid))
+
+/**
+Output a trace record of the specified category which also includes a Context ID.
+
+The trace record data is 8 bytes in size.
+
+If the value of \a aUid is not contained in the secondary filter then the trace is discarded.
+
+@param aCategory	A value from enum BTrace::TCategory,
+@param aSubCategory Sub-category value between 0 and 255.
+					The meaning of this is dependent on the Category.
+@param aUid			The first 32bit quantity which forms the data of this trace record.
+@param a1			The second 32bit quantity which forms the data of this trace record.
+
+@return True if trace is enabled for aCategory and aUid, false otherwise.
+@publishedPartner
+@released
+*/
+#define BTraceFilteredContext8(aCategory,aSubCategory,aUid,a1) \
+	((BTrace::TBTrace3)BTrace::OutFilteredX) \
+		(BTRACE_HEADER_C(12,(aCategory),(aSubCategory)),(TUint32)(aUid),(TUint32)(a1))
+
+/**
+Output a trace record of the specified category which also includes a Context ID.
+
+The trace record data is 12 bytes in size.
+
+If the value of \a aUid is not contained in the secondary filter then the trace is discarded.
+
+@param aCategory	A value from enum BTrace::TCategory,
+@param aSubCategory Sub-category value between 0 and 255.
+					The meaning of this is dependent on the Category.
+@param aUid			The first 32bit quantity which forms the data of this trace record.
+@param a1			The second 32bit quantity which forms the data of this trace record.
+@param a2			The third 32bit quantity which forms the data of this trace record.
+
+@return True if trace is enabled for aCategory and aUid, false otherwise.
+@publishedPartner
+@released
+*/
+#define BTraceFilteredContext12(aCategory,aSubCategory,aUid,a1,a2) \
+	BTrace::OutFilteredX \
+		(BTRACE_HEADER_C(16,(aCategory),(aSubCategory)),(TUint32)(aUid),(TUint32)(a1),(TUint32)(a2))
+
+/**
+Output a trace record of the specified category which also includes a Context ID.
+
+If the value of \a aUid is not contained in the secondary filter then the trace is discarded.
+
+@param aCategory	A value from enum BTrace::TCategory,
+@param aSubCategory Sub-category value between 0 and 255.
+					The meaning of this is dependent on the Category.
+@param aUid			The first 32bit quantity which forms the data of this trace record.
+@param a1			The second 32bit quantity which forms the data of this trace record.
+@param aData		Address of addition data to add to trace.
+					Must be word aligned, i.e. a multiple of 4.
+@param aDataSize	Number of bytes of additional data. If this value is greater than
+					KMaxBTraceDataArray then data is truncated to this size and the
+					flag ERecordTruncated is set in the record.
+
+@return True if trace is enabled for aCategory and aUid, false otherwise.
+@publishedPartner
+@released
+*/
+#define BTraceFilteredContextN(aCategory,aSubCategory,aUid,a1,aData,aDataSize) \
+	BTrace::OutFilteredNX \
+		(BTRACE_HEADER_C(12,(aCategory),(aSubCategory)),(TUint32)(aUid),(TUint32)(a1),aData,aDataSize)
+
+/**
+Output a trace record of the specified category which also includes a Context ID.
+
+If the specified data is too big to find into a single trace record, then a
+multipart trace is generated. See TMultiPart.
+
+If the value of \a aUid is not contained in the secondary filter then the trace is discarded.
+
+@param aCategory	A value from enum BTrace::TCategory,
+@param aSubCategory Sub-category value between 0 and 255.
+					The meaning of this is dependent on the Category.
+@param aUid			The first 32bit quantity which forms the data of this trace record.
+@param aData		Address of addition data to add to trace.
+					Must be word aligned, i.e. a multiple of 4.
+@param aDataSize	Number of bytes of additional data.
+
+@return True if trace is enabled for aCategory and aUid, false otherwise.
+@publishedPartner
+@released
+*/
+#define BTraceFilteredContextBig(aCategory,aSubCategory,aUid,aData,aDataSize) \
+	BTrace::OutFilteredBig \
+		(BTRACE_HEADER_C(8,(aCategory),(aSubCategory)),(TUint32)(aUid),aData,(TInt)(aDataSize))
+
+
+
+/**
+Output a trace record of the specified category which also includes a Program Counter value.
+
+The trace record data is 4 bytes in size.
+
+If the value of \a aUid is not contained in the secondary filter then the trace is discarded.
+
+@param aCategory	A value from enum BTrace::TCategory,
+@param aSubCategory Sub-category value between 0 and 255.
+					The meaning of this is dependent on the Category.
+@param aUid			The 32bit quantity which forms the data of this trace record.
+
+@return True if trace is enabled for aCategory and aUid, false otherwise.
+@publishedPartner
+@released
+*/
+#define BTraceFilteredPc4(aCategory,aSubCategory,aUid)	\
+	((BTrace::TBTrace2)BTrace::OutFiltered) \
+		(BTRACE_HEADER_P(8,(aCategory),(aSubCategory)),(TUint32)(aUid))
+
+/**
+Output a trace record of the specified category which also includes a Program Counter value.
+
+The trace record data is 8 bytes in size.
+
+If the value of \a aUid is not contained in the secondary filter then the trace is discarded.
+
+@param aCategory	A value from enum BTrace::TCategory,
+@param aSubCategory Sub-category value between 0 and 255.
+					The meaning of this is dependent on the Category.
+@param aUid			The first 32bit quantity which forms the data of this trace record.
+@param a1			The second 32bit quantity which forms the data of this trace record.
+
+@return True if trace is enabled for aCategory and aUid, false otherwise.
+@publishedPartner
+@released
+*/
+#define BTraceFilteredPc8(aCategory,aSubCategory,aUid,a1) \
+	((BTrace::TBTrace3)BTrace::OutFiltered) \
+		(BTRACE_HEADER_P(12,(aCategory),(aSubCategory)),(TUint32)(aUid),(TUint32)(a1))
+
+/**
+Output a trace record of the specified category which also includes a Program Counter value.
+
+The trace record data is 12 bytes in size.
+
+If the value of \a aUid is not contained in the secondary filter then the trace is discarded.
+
+@param aCategory	A value from enum BTrace::TCategory,
+@param aSubCategory Sub-category value between 0 and 255.
+					The meaning of this is dependent on the Category.
+@param aUid			The first 32bit quantity which forms the data of this trace record.
+@param a1			The second 32bit quantity which forms the data of this trace record.
+@param a2			The third 32bit quantity which forms the data of this trace record.
+
+@return True if trace is enabled for aCategory and aUid, false otherwise.
+@publishedPartner
+@released
+*/
+#define BTraceFilteredPc12(aCategory,aSubCategory,aUid,a1,a2) \
+	BTrace::OutFiltered \
+		(BTRACE_HEADER_P(16,(aCategory),(aSubCategory)),(TUint32)(aUid),(TUint32)(a1),(TUint32)(a2))
+
+/**
+Output a trace record of the specified category which also includes a Program Counter value.
+
+If the value of \a aUid is not contained in the secondary filter then the trace is discarded.
+
+@param aCategory	A value from enum BTrace::TCategory,
+@param aSubCategory Sub-category value between 0 and 255.
+					The meaning of this is dependent on the Category.
+@param aUid			The first 32bit quantity which forms the data of this trace record.
+@param a1			The second 32bit quantity which forms the data of this trace record.
+@param aData		Address of addition data to add to trace.
+					Must be word aligned, i.e. a multiple of 4.
+@param aDataSize	Number of bytes of additional data. If this value is greater than
+					KMaxBTraceDataArray then data is truncated to this size and the
+					flag ERecordTruncated is set in the record.
+
+@return True if trace is enabled for aCategory and aUid, false otherwise.
+@publishedPartner
+@released
+*/
+#define BTraceFilteredPcN(aCategory,aSubCategory,aUid,a1,aData,aDataSize) \
+	BTrace::OutFilteredN \
+		(BTRACE_HEADER_P(12,(aCategory),(aSubCategory)),(TUint32)(aUid),(TUint32)(a1),aData,aDataSize)
+
+/**
+Output a trace record of the specified category which also includes a Program Counter value.
+
+If the specified data is too big to find into a single trace record, then a
+multipart trace is generated. See TMultiPart.
+
+If the value of \a aUid is not contained in the secondary filter then the trace is discarded.
+
+@param aCategory	A value from enum BTrace::TCategory,
+@param aSubCategory Sub-category value between 0 and 255.
+					The meaning of this is dependent on the Category.
+@param aUid			The first 32bit quantity which forms the data of this trace record.
+@param aData		Address of addition data to add to trace.
+					Must be word aligned, i.e. a multiple of 4.
+@param aDataSize	Number of bytes of additional data.
+
+@return True if trace is enabled for aCategory and aUid, false otherwise.
+@publishedPartner
+@released
+*/
+#define BTraceFilteredPcBig(aCategory,aSubCategory,aUid,aData,aDataSize) \
+	BTrace::OutFilteredBig \
+		(BTRACE_HEADER_P(8,(aCategory),(aSubCategory)),(TUint32)(aUid),aData,(TInt)(aDataSize))
+
+
+
+
+/**
+Output a trace record of the specified category which also includes
+Context ID and Program Counter values.
+
+The trace record data is 4 bytes in size.
+
+If the value of \a aUid is not contained in the secondary filter then the trace is discarded.
+
+@param aCategory	A value from enum BTrace::TCategory,
+@param aSubCategory Sub-category value between 0 and 255.
+					The meaning of this is dependent on the Category.
+@param aUid			The 32bit quantity which forms the data of this trace record.
+
+@return True if trace is enabled for aCategory and aUid, false otherwise.
+@publishedPartner
+@released
+*/
+#define BTraceFilteredContextPc4(aCategory,aSubCategory,aUid)	\
+	((BTrace::TBTrace2)BTrace::OutFilteredX) \
+		(BTRACE_HEADER_CP(8,(aCategory),(aSubCategory)),(TUint32)(aUid))
+
+/**
+Output a trace record of the specified category which also includes
+Context ID and Program Counter values.
+
+The trace record data is 8 bytes in size.
+
+If the value of \a aUid is not contained in the secondary filter then the trace is discarded.
+
+@param aCategory	A value from enum BTrace::TCategory,
+@param aSubCategory Sub-category value between 0 and 255.
+					The meaning of this is dependent on the Category.
+@param aUid			The first 32bit quantity which forms the data of this trace record.
+@param a1			The second 32bit quantity which forms the data of this trace record.
+
+@return True if trace is enabled for aCategory and aUid, false otherwise.
+@publishedPartner
+@released
+*/
+#define BTraceFilteredContextPc8(aCategory,aSubCategory,aUid,a1) \
+	((BTrace::TBTrace3)BTrace::OutFilteredX) \
+		(BTRACE_HEADER_CP(12,(aCategory),(aSubCategory)),(TUint32)(aUid),(TUint32)(a1))
+
+/**
+Output a trace record of the specified category which also includes
+Context ID and Program Counter values.
+
+The trace record data is 12 bytes in size.
+
+If the value of \a aUid is not contained in the secondary filter then the trace is discarded.
+
+@param aCategory	A value from enum BTrace::TCategory,
+@param aSubCategory Sub-category value between 0 and 255.
+					The meaning of this is dependent on the Category.
+@param aUid			The first 32bit quantity which forms the data of this trace record.
+@param a1			The second 32bit quantity which forms the data of this trace record.
+@param a2			The third 32bit quantity which forms the data of this trace record.
+
+@return True if trace is enabled for aCategory and aUid, false otherwise.
+@publishedPartner
+@released
+*/
+#define BTraceFilteredContextPc12(aCategory,aSubCategory,aUid,a1,a2) \
+	BTrace::OutFilteredX \
+		(BTRACE_HEADER_CP(16,(aCategory),(aSubCategory)),(TUint32)(aUid),(TUint32)(a1),(TUint32)(a2))
+
+/**
+Output a trace record of the specified category which also includes
+Context ID and Program Counter values.
+
+If the value of \a aUid is not contained in the secondary filter then the trace is discarded.
+
+@param aCategory	A value from enum BTrace::TCategory,
+@param aSubCategory Sub-category value between 0 and 255.
+					The meaning of this is dependent on the Category.
+@param aUid			The first 32bit quantity which forms the data of this trace record.
+@param a1			The second 32bit quantity which forms the data of this trace record.
+@param aData		Address of addition data to add to trace.
+					Must be word aligned, i.e. a multiple of 4.
+@param aDataSize	Number of bytes of additional data. If this value is greater than
+					KMaxBTraceDataArray then data is truncated to this size and the
+					flag ERecordTruncated is set in the record.
+
+@return True if trace is enabled for aCategory and aUid, false otherwise.
+@publishedPartner
+@released
+*/
+#define BTraceFilteredContextPcN(aCategory,aSubCategory,aUid,a1,aData,aDataSize) \
+	BTrace::OutFilteredNX \
+		(BTRACE_HEADER_CP(12,(aCategory),(aSubCategory)),(TUint32)(aUid),(TUint32)(a1),aData,aDataSize)
+
+/**
+Output a trace record of the specified category which also includes
+Context ID and Program Counter values.
+
+If the specified data is too big to find into a single trace record, then a
+multipart trace is generated. See TMultiPart.
+
+If the value of \a aUid is not contained in the secondary filter then the trace is discarded.
+
+@param aCategory	A value from enum BTrace::TCategory,
+@param aSubCategory Sub-category value between 0 and 255.
+					The meaning of this is dependent on the Category.
+@param aUid			The first 32bit quantity which forms the data of this trace record.
+@param aData		Address of addition data to add to trace.
+					Must be word aligned, i.e. a multiple of 4.
+@param aDataSize	Number of bytes of additional data.
+
+@return True if trace is enabled for aCategory and aUid, false otherwise.
+@publishedPartner
+@released
+*/
+#define BTraceFilteredContextPcBig(aCategory,aSubCategory,aUid,aData,aDataSize) \
+	BTrace::OutFilteredBig \
+		(BTRACE_HEADER_CP(8,(aCategory),(aSubCategory)),(TUint32)(aUid),aData,(TInt)(aDataSize))
+
+
+
+//
+// Inline methods
+//
+
+inline TUint8* BTrace::NextRecord(TAny* aCurrentRecord)
+	{
+	TUint size = ((TUint8*)aCurrentRecord)[ESizeIndex];
+	*(TUint*)&aCurrentRecord += 3;
+	*(TUint*)&aCurrentRecord += size;
+	*(TUint*)&aCurrentRecord &= ~3;
+	return (TUint8*)aCurrentRecord;
+	}
+
+#ifdef __KERNEL_MODE__
+
+inline TInt BTrace::Filter(TUint aCategory)
+	{
+	return SetFilter(aCategory,-1);
+	}
+
+#endif
+
+/**
+The maximum permissible value for aDataSize in trace outputs.
+@see BTraceN BTracePcN BTraceContextN BTraceContextPcN
+@publishedPartner
+@released
+*/
+const TUint KMaxBTraceDataArray = 80;
+
+
+
+/**
+The maximum total number of bytes in a trace record.
+@publishedPartner
+@released
+*/
+const TInt KMaxBTraceRecordSize = 7*4+8+KMaxBTraceDataArray;
+
+
+#ifdef __MARM__
+#define BTRACE_MACHINE_CODED
+#endif
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32/include/e32capability.h	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,305 @@
+// Copyright (c) 2001-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32\include\e32capability.h
+// Platform security capability definitions
+// Used by both source code and tools
+// This file can be directly included into C++ tools such as ROMBUILD to allow
+// capabilities to be specified by name. To do the same for MAKMAKE (in MMP
+// files) some perl code will be needed to parse this file and extract the
+// capability names and values.
+// 
+//
+
+#ifndef __E32CAPABILITY_H__
+#define __E32CAPABILITY_H__
+
+/**
+An enumeration that defines the set of all supported capabilities.
+
+@publishedAll
+@released
+*/
+enum TCapability
+	{
+	/**
+	Grants write access to executables and shared read-only resources.
+	
+	This is the most critical capability as it grants access to executables and
+	therefore to their capabilities. It also grants write access to
+	the /sys and /resource directories.
+	*/
+	ECapabilityTCB				= 0,
+	
+	
+	/**
+	Grants direct access to all communication device drivers. This includes:
+	the EComm, Ethernet, USB device drivers etc.
+	*/
+	ECapabilityCommDD			= 1,
+	
+	
+	/**
+	Grants the right:
+	
+	- to kill any process in the system
+	- to power off unused peripherals
+	- to switch the machine into standby state
+	- to wake the machine up
+	- to power the machine down completely.
+	
+	Note that this does not control access to anything and everything
+	that might drain battery power.
+	*/
+	ECapabilityPowerMgmt		= 2,
+
+
+    /**
+    Grants direct access to all multimedia device drivers.
+    
+    This includes the sound, camera, video device drivers etc.
+    */
+	ECapabilityMultimediaDD		= 3,
+
+
+    /**
+    Grants read access to network operator, phone manufacturer and device
+    confidential settings or data.
+    
+    For example, the pin lock code, the list of applications that are installed.
+    */
+	ECapabilityReadDeviceData	= 4,
+	
+	
+    /**
+    Grants write access to settings that control the behaviour of the device.
+    
+    For example, device lock settings, system time, time zone, alarms, etc.
+    */	
+	ECapabilityWriteDeviceData	= 5,
+
+
+    /**
+    Grants access to protected content.
+    
+    DRM (Digital Rights Management) agents use this capability to decide whether
+    or not an application should have access to DRM content. 
+    Applications granted DRM are trusted to respect the rights associated
+    with the content.
+    */	
+	ECapabilityDRM				= 6,
+
+
+    /**
+    Grants the right to create a trusted UI session, and therefore to display
+    dialogs in a secure UI environment.
+    
+    Trusted UI dialogs are rare. They must be used only when confidentiality
+    and security are critical; for example, for password dialogs. 
+    
+    Normal access to the user interface and the screen does not require
+    this capability.
+    */	
+	ECapabilityTrustedUI		= 7,
+
+
+    /**
+    Grants the right to a server to register with a protected name.
+    
+    Currently, protected names start with a "!" character. The kernel prevents
+    servers without this capability from using such a name, and therefore
+    prevents protected servers from being impersonated.
+    */	
+	ECapabilityProtServ			= 8,
+
+
+    /**
+    Grants access to disk administration operations that affect more than one
+    file or one directory (or overall filesystem integrity/behaviour, etc).
+    
+    For examples, reformatting a disk partition.
+    */	
+	ECapabilityDiskAdmin		= 9,
+
+
+    /**
+    Grants the right to modify or access network protocol controls.
+    
+    Typically when an action can change the behaviour of all existing and
+    future connections, it should be protected by this capability.
+    
+    For example, forcing all existing connections on a specific protocol
+    to be dropped, or changing the priority of a call.
+    */	
+	ECapabilityNetworkControl	= 10,
+
+
+    /**
+    Grants read access to the entire file system; grants write access to
+    the private directories of other processes.
+    
+    This capability is very strictly controlled and should rarely be granted.
+    */	
+	ECapabilityAllFiles			= 11,
+
+
+    /**
+    Grants the right to generate software key & pen events, and to capture any
+    of them regardless of the status of the application.
+    
+    Note that after obtaining the focus, normal applications do not need this
+    capability to be dispatched key and pen events.
+    */	
+	ECapabilitySwEvent			= 12,
+
+
+    /**
+    A user capability that grants access to remote services without any
+    restriction on its physical location.
+    
+    Typically, such a location is unknown to the phone user, and such services
+    may incur cost for the phone user.
+    
+    Voice calls, SMS, and internet services are good examples of
+    such network services. They are supported by GSM, CDMA and all IP transport
+    protocols including Bluetooth profiles over IP.
+    */	
+	ECapabilityNetworkServices	= 13,
+
+
+    /**
+    A user capability that grants access to remote services in the close
+    vicinity of the phone.
+    
+    The location of the remote service is well-known to the phone user, and in
+    most cases, such services will not incur cost for the phone user.
+    */	
+	ECapabilityLocalServices	= 14,
+
+
+    /**
+    A user capability that grants read access to data that is confidential to
+    the phone user. 
+    
+    This capability supports the management of the user's privacy.
+    
+    Typically, contacts, messages and appointments are always seen user
+    confidential data.
+    */	
+	ECapabilityReadUserData		= 15,
+
+
+    /**
+    A user capability that grants write access to user data. 
+    
+    This capability supports the management of the integrity of user data.
+    
+    Note that this capability is not symmetric with the ECapabilityReadUserData
+    capability. For example, you may want to prevent rogue applications from
+    deleting music tracks but you may not want to restrict read access to them.
+    */	
+    ECapabilityWriteUserData	= 16,
+    
+    
+    /**
+    A user capability that grants access to the location of the device.
+    
+    This capability supports the management of the user's privacy with regard
+    to the phone location.
+    */
+	ECapabilityLocation			= 17,
+
+
+	/**
+	Grants access to logical device drivers that provide input information about
+	the surroundings of the device. 
+
+	Good examples of drivers that require this capability would be GPS and biometrics
+	device drivers. For complex multimedia logical device drivers that provide both
+	input and output functions, such as Sound device driver, the  MultimediaDD
+	capability should be used if it is too difficult to separate the input from the
+	output calls at its API level.
+	*/
+	ECapabilitySurroundingsDD	= 18,
+
+
+	/**
+	Grants access to live confidential information about the user and his/her
+	immediate environment. This capability protect the user's privacy.
+
+	Examples are audio, picture and video recording, biometrics (such as blood
+	pressure) recording.
+
+	Please note that the location of the device is excluded from this capability.
+	The protection of this is achieved by using the dedicated capability Location
+	*/
+	ECapabilityUserEnvironment	= 19,
+
+
+	ECapability_Limit,					/**< @internalTechnology */
+
+	ECapability_HardLimit		= 255,	/**< @internalTechnology */
+
+	ECapability_None			= -1,	/**< Special value used to specify 'do not care' or 'no capability'.*/
+
+	ECapability_Denied			= -2	/**< Special value used to indicate a capability that is never granted. */	
+	};
+
+
+/** Define this macro to reference the names of the capabilities. This is here so
+	that ROMBUILD can accept capability names.
+*/
+#ifdef __REFERENCE_CAPABILITY_NAMES__
+
+extern const char* const CapabilityNames[ECapability_Limit];
+
+#endif	// __REFERENCE_CAPABILITY_NAMES__
+
+/** Define this macro to include the names of the capabilities. This is here so
+	that ROMBUILD can accept capability names.
+*/
+#ifdef __INCLUDE_CAPABILITY_NAMES__
+
+/** List of names of all supported capabilities
+	Must be in the same order as the enumerators in TCapability
+
+@publishedAll
+@released
+*/
+extern const char* const CapabilityNames[ECapability_Limit] =
+	{
+	"TCB",
+	"CommDD",
+	"PowerMgmt",
+	"MultimediaDD",
+	"ReadDeviceData",
+	"WriteDeviceData",
+	"DRM",
+	"TrustedUI",
+	"ProtServ",
+	"DiskAdmin",
+	"NetworkControl",
+	"AllFiles",
+	"SwEvent",
+	"NetworkServices",
+	"LocalServices",
+	"ReadUserData",
+	"WriteUserData",
+	"Location",
+	"SurroundingsDD",
+	"UserEnvironment"
+	};
+
+#endif	// __INCLUDE_CAPABILITY_NAMES__
+
+#endif	// __E32CAPABILITY_H__
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32/include/e32cmn.h	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,6727 @@
+// Copyright (c) 1994-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32\include\e32cmn.h
+// 
+//
+
+#ifndef __E32CMN_H__
+#define __E32CMN_H__
+#include <e32const.h>
+
+extern "C" {
+/**
+@publishedAll
+@released
+
+A Nanokernel utility function that compares two memory buffers for equality.
+
+The two buffers are considered equal only if:
+
+1. the buffers have the same length
+
+and
+ 
+2. the binary content of both buffers is the same.
+
+@param aLeft     The start address of the first buffer in the comparison.
+@param aLeftLen  The length of the first buffer in the comparison.
+@param aRight    The start address of the second buffer in the comparison.
+@param aRightLen The length of the second buffer in the comparison.
+
+@return Zero if both buffers are equal; non-zero, otherwise.
+
+@panic USER 88        In debug mode only, if aLeftL is negative, 
+                      and the function is called on the user side.
+@panic KERN-COMMON 88 In debug mode only, if aLeftL is negative,
+                      and the function is called on the kernel side.
+@panic USER 89        In debug mode only, if aRightL is negative, 
+                      and the function is called on the user side.
+@panic KERN-COMMON 89 In debug mode only, if aRightL is negative,
+                      and the function is called on the kernel side.
+*/
+IMPORT_C TInt memcompare(const TUint8* aLeft, TInt aLeftLen, const TUint8* aRight, TInt aRightLen);
+
+
+
+
+/**
+@publishedAll
+@released
+
+A Nanokernel utility function that moves (copies) bytes in memory.
+
+The function assumes that the addresses are aligned on word boundaries,
+and that the length value is a multiple of 4.
+
+@param aTrg    The target address.
+@param aSrc    The source address.
+@param aLength The number of bytes to be moved.
+
+@return The target address.
+
+@panic USER 91        In debug mode only, if aLength is not a multiple of 4,
+                      and the function is called on the user side.
+@panic KERN-COMMON 91 In debug mode only, if aLength is not a multiple of 4,
+                      and the function is called on the kernel side.
+@panic USER 92        In debug mode only, if aSrc is not aligned on a word boundary,
+                      and the function is called on the user side.
+@panic KERN-COMMON 92 In debug mode only, if aSrc is not aligned on a word boundary,
+                      and the function is called on the kernel side.
+@panic USER 93        In debug mode only, if aTrg is not aligned on a word boundary,
+                      and the function is called on the user side.
+@panic KERN-COMMON 93 In debug mode only, if aTrg is not aligned on a word boundary,
+                      and the function is called on the kernel side.
+*/
+IMPORT_C TAny* wordmove(TAny* aTrg, const TAny* aSrc, unsigned int aLength);
+
+
+
+
+/**
+@publishedAll
+@released
+
+A Nanokernel utility function that sets the specified number of bytes
+to binary zero.
+
+@param aTrg    The start address.
+@param aLength The number of bytes to be set.
+
+@return The target address.
+*/
+IMPORT_C TAny* memclr(TAny* aTrg, unsigned int aLength);
+}
+
+
+#if defined(__TOOLS2__) && !defined(_WIN32)
+// memcpy prototype clash: Throw spec on Linux differs from Symbian?
+#include <string.h>
+#elif !defined(__TOOLS__)
+extern "C" {
+/**
+@publishedAll
+@released
+
+A Nanokernel utility function that sets all of the specified number of bytes to
+the specified fill value.
+
+@param aTrg    The start address.
+@param aValue  The fill value (the first or junior byte).
+@param aLength The number of bytes to be set.
+
+@return The target address.
+*/
+	IMPORT_C TAny* memset(TAny* aTrg, TInt aValue, unsigned int aLength);
+
+
+
+
+/**
+@publishedAll
+@released
+
+A Nanokernel utility function that copies bytes in memory.
+
+@param aTrg    The target address.
+@param aSrc    The source address.
+@param aLength The number of bytes to be moved.
+
+@return The target address.
+*/
+	IMPORT_C TAny* memcpy(TAny* aTrg, const TAny* aSrc, unsigned int aLength);
+
+
+
+
+/**
+@publishedAll
+@released
+
+A Nanokernel utility function that moves (copies) bytes in memory.
+
+@param aTrg    The target address.
+@param aSrc    The source address.
+@param aLength The number of bytes to be moved.
+
+@return The target address.
+*/
+	IMPORT_C TAny* memmove(TAny* aTrg, const TAny* aSrc, unsigned int aLength);
+}
+#else
+#include <string.h>
+#endif
+
+
+
+
+/** 
+@publishedAll
+@released
+
+Tests whether the specified value is less than or equal to the
+specified upper limit.
+
+@param aVal   The value to be tested.
+@param aLimit The upper limit.
+
+@return True, if the value is less than or equal to the specified upper limit;
+        false, otherwise.
+*/
+inline TInt Lim(TInt aVal,TUint aLimit)
+	{return(((TUint)aVal)<=aLimit);}
+
+
+
+
+/** 
+@publishedAll
+@released
+
+Tests whether the specified value is strictly less than the
+specified upper limit.
+
+@param aVal   The value to be tested.
+@param aLimit The upper limit.
+
+@return True, if the value is strictly less than the specified upper limit;
+        false, otherwise.
+*/
+inline TInt LimX(TInt aVal,TUint aLimit)
+	{return(((TUint)aVal)<aLimit);}
+
+
+
+
+/** 
+@publishedAll
+@released
+
+Returns the smaller of two values.
+
+@param aLeft  The first value to be compared.
+@param aRight The second value to be compared.
+
+@return The smaller value.
+*/
+template <class T>
+inline T Min(T aLeft,T aRight)
+	{return(aLeft<aRight ? aLeft : aRight);}
+
+
+
+
+/**
+@publishedAll
+@released
+
+Returns the smaller of two objects, where the right hand object is a treated
+as a TInt for the  purpose of comparison.
+
+@param aLeft  The first value to be compared.
+@param aRight The second value to be compared.
+
+@return The smaller value.
+*/
+template <class T>
+inline T Min(T aLeft,TUint aRight)
+	{return(aLeft<(TInt)aRight ? aLeft : (T)aRight);}
+
+
+
+
+/** 
+@publishedAll
+@released
+
+Returns the larger of two values.
+
+@param aLeft  The first value to be compared.
+@param aRight The second value to be compared.
+
+@return The larger value.
+*/
+template <class T>
+inline T Max(T aLeft,T aRight)
+	{return(aLeft<aRight ? aRight : aLeft);}
+
+
+
+
+/**
+@publishedAll
+@released
+
+Returns the larger of two objects, where the right hand object is a treated
+as a TInt for the  purpose of comparison.
+
+@param aLeft  The first value to be compared.
+@param aRight The second value to be compared.
+
+@return The larger value.
+*/
+template <class T>
+inline T Max(T aLeft,TUint aRight)
+	{return(aLeft<(TInt)aRight ? (TInt)aRight : aLeft);}
+
+
+
+
+/**
+@publishedAll
+@released
+
+Returns an absolute value.
+
+@param aVal The source value.
+
+@return The absolute value
+*/
+template <class T>
+inline T Abs(T aVal)
+	{return(aVal<0 ? -aVal : aVal);}
+
+
+
+
+/** 
+@publishedAll
+@released
+
+Determines whether a specified value lies within a defined range of values.
+
+@param aMin The lower value of the range.
+@param aVal The value to be compared.
+@param aMax The higher value of the range.
+
+@return True, if the specified value lies within the range; false, otherwise.
+*/
+template <class T>
+inline TBool Rng(T aMin,T aVal,T aMax)
+	{return(aVal>=aMin && aVal<=aMax);}
+
+
+
+
+/**
+@publishedAll
+@released
+
+Adds a value to a pointer.
+
+@param aPtr Pointer to an object of type T.
+@param aVal The value to be added.
+
+@return The resulting pointer value, as a pointer to a type T.
+*/
+template <class T,class S>
+inline T* PtrAdd(T* aPtr,S aVal)
+	{return((T*)(((TUint8*)aPtr)+aVal));}
+
+
+
+
+/**
+@publishedAll
+@released
+
+Subtracts a value from a pointer.
+
+@param aPtr Pointer to an object of type T.
+@param aVal The value to be added.
+
+@return The resulting pointer value, as a pointer to a type T.
+*/
+template <class T,class S>
+inline T* PtrSub(T* aPtr,S aVal)
+	{return((T*)(((TUint8*)aPtr)-aVal));}
+
+
+
+
+/**
+@publishedAll
+@released
+
+Aligns the specified value onto a 2-byte boundary.
+
+@param aValue The value to be aligned.
+
+@return The aligned value. 
+*/
+template <class T>
+inline T Align2(T aValue)
+	{return((T)((((TUint)aValue)+sizeof(TUint16)-1)&~(sizeof(TUint16)-1)));}
+
+
+
+
+/**
+@publishedAll
+@released
+
+Aligns the specified value onto a 4-byte boundary.
+
+@param aValue The value to be aligned.
+
+@return The aligned value. 
+*/
+template <class T>
+inline T Align4(T aValue)
+	{return((T)((((TUint)aValue)+sizeof(TUint32)-1)&~(sizeof(TUint32)-1)));}
+
+
+
+
+/**
+@publishedAll
+@released
+
+A templated class which encapsulates a reference to an object within a wrapper.
+
+The wrapper object can be passed to a function as a value type. This allows 
+a reference to be passed to a function as a value type.
+
+This wrapper object is commonly termed a value reference.
+*/
+template <class T>
+class TRefByValue
+	{
+public:
+	inline TRefByValue(T& aRef);
+	inline operator T&();
+private:
+	TRefByValue& operator=(TRefByValue aRef);
+private:
+	T &iRef;
+	};
+
+
+
+
+#if !defined (__KERNEL_MODE__)
+class TDesC16;	// forward declaration for TChar member functions
+class TPtrC16;	// forward declaration for TChar member functions
+#endif
+
+
+
+
+/**
+@publishedAll
+@released
+
+Holds a character value and provides a number of utility functions to
+manipulate it and test its properties.
+
+For example, there are functions to convert the character 
+to uppercase and test whether or not it is a control character.
+
+The character value is stored as a 32-bit unsigned integer. The shorthand 
+"TChar value" is used to describe the character value wrapped by a TChar 
+object.
+
+TChar can be used to represent Unicode values outside plane 0 (that is, the 
+extended Unicode range from 0x10000 to 0xFFFFF). This differentiates it from 
+TText which can only be used for 16-bit Unicode character values.
+
+@see TText
+*/
+class TChar
+	{
+public:
+
+	
+    /**
+    General Unicode character category.
+
+    The high nibble encodes the major category (Mark, Number, etc.) and a low 
+    nibble encodes the subdivisions of that category.
+
+    The category codes can be used in three ways:
+    
+    (i) as unique constants: there is one for each Unicode category, with a
+    name of the form
+    @code
+    E<XX>Category
+    @endcode
+    where
+    @code
+    <XX>
+    @endcode
+    is the category name given by
+    the Unicode database (e.g., the constant ELuCategory is used for lowercase
+    letters, category Lu);
+    
+    (ii) as numbers in certain ranges: letter categories are all <= EMaxLetterCategory;
+    
+    (iii) as codes in which the upper nibble gives the category group
+    (e.g., punctuation categories all yield TRUE for
+    the test (category & 0xF0) ==EPunctuationGroup).
+    */
+	enum TCategory
+		{
+        /**
+        Alphabetic letters.
+	
+        Includes ELuCategory, ELlCategory and ELtCategory.
+        */
+		EAlphaGroup = 0x00,								
+        
+        
+        /**
+        Other letters.
+	
+        Includes ELoCategory.
+        */
+		ELetterOtherGroup = 0x10,						
+        
+        
+        /**
+        Letter modifiers.
+	
+        Includes ELmCategory.
+        */
+		ELetterModifierGroup = 0x20,					
+        
+        
+        /**
+        Marks group.
+	
+        Includes EMnCategory, EMcCategory and EMeCategory.
+        */
+		EMarkGroup = 0x30,
+        
+        
+        /**
+        Numbers group.
+	
+	    Includes ENdCategory, ENlCategory and ENoCategory.
+	    */
+		ENumberGroup = 0x40,
+        
+        
+        /**
+        Punctuation group.
+	
+	    IncludesEPcCategory, PdCategory, EpeCategory, EPsCategory and EPoCategory.
+	    */
+		EPunctuationGroup = 0x50,
+        
+        
+        /**
+        Symbols group.
+	
+        Includes ESmCategory, EScCategory, ESkCategory and ESoCategory.
+        */
+		ESymbolGroup = 0x60,
+        
+        
+        /**
+        Separators group.
+	
+        Includes EZsCategory, EZlCategory and EZlpCategory.
+        */
+		ESeparatorGroup = 0x70,
+        
+        
+        /**
+        Control, format, private use, unassigned.
+	
+     	Includes ECcCategory, ECtCategory, ECsCategory,
+     	ECoCategory and ECnCategory.
+     	*/
+		EControlGroup = 0x80,
+	    
+	    
+	    /**
+	    The highest possible groups category.
+	    */
+		EMaxAssignedGroup = 0xE0,
+        
+        
+        /**
+        Unassigned to any other group.
+        */
+		EUnassignedGroup = 0xF0,
+
+
+        /**
+        Letter, Uppercase.
+        */
+		ELuCategory = EAlphaGroup | 0,					
+        
+        
+        /**
+        Letter, Lowercase.
+        */
+		ELlCategory = EAlphaGroup | 1,					
+	    
+	    
+	    /**
+	    Letter, Titlecase.
+	    */
+		ELtCategory = EAlphaGroup | 2,					
+     	
+     	
+     	/**
+     	Letter, Other.
+     	*/
+		ELoCategory = ELetterOtherGroup | 0,			
+	    
+	    
+	    /**
+	    The highest possible (non-modifier) letter category.
+	    */
+		EMaxLetterCategory = ELetterOtherGroup | 0x0F,	
+
+	    /**
+	    Letter, Modifier.
+	    */
+		ELmCategory = ELetterModifierGroup | 0,			
+	    
+	    
+	    /**
+	    The highest possible letter category.
+	    */
+		EMaxLetterOrLetterModifierCategory = ELetterModifierGroup | 0x0F, 
+
+	    /**
+	    Mark, Non-Spacing
+	    */
+		EMnCategory = EMarkGroup | 0,					
+        
+        
+        /**
+        Mark, Combining.
+        */
+		EMcCategory = EMarkGroup | 1,					
+        
+        
+        /**
+        Mark, Enclosing.
+        */
+		EMeCategory = EMarkGroup | 2,					
+        
+        
+        /**
+        Number, Decimal Digit.
+        */
+		ENdCategory = ENumberGroup | 0,					
+        
+        
+        /**
+        Number, Letter.
+        */
+		ENlCategory = ENumberGroup | 1,					
+        
+        
+        /**
+        Number, Other.
+        */
+		ENoCategory = ENumberGroup | 2,					
+        
+        
+        /**
+        Punctuation, Connector.
+        */
+		EPcCategory = EPunctuationGroup | 0,			
+        
+        
+        /**
+        Punctuation, Dash.
+        */
+		EPdCategory = EPunctuationGroup | 1,			
+        
+        
+        /**
+        Punctuation, Open.
+        */
+		EPsCategory = EPunctuationGroup | 2,			
+        
+        
+        /**
+        Punctuation, Close.
+        */
+		EPeCategory = EPunctuationGroup | 3,
+		
+		
+		/**
+		Punctuation, Initial Quote
+		*/			
+		EPiCategory = EPunctuationGroup | 4,			
+		
+		
+		/**
+		Punctuation, Final Quote
+		*/
+		EPfCategory = EPunctuationGroup | 5,			
+        
+        
+        /**
+        Punctuation, Other.
+        */
+		EPoCategory = EPunctuationGroup | 6,			
+        
+        
+        /**
+        Symbol, Math.
+        */
+		ESmCategory = ESymbolGroup | 0,					
+        
+        
+        /**
+        Symbol, Currency.
+        */
+		EScCategory = ESymbolGroup | 1,					
+        
+        
+        /**
+        Symbol, Modifier.
+        */
+		ESkCategory = ESymbolGroup | 2,					
+        
+        
+        /**
+        Symbol, Other.
+        */
+		ESoCategory = ESymbolGroup | 3,					
+        
+        
+        /**
+        The highest possible graphic character category.
+        */
+		EMaxGraphicCategory = ESymbolGroup | 0x0F,		
+
+
+        /**
+        Separator, Space.
+        */
+		EZsCategory = ESeparatorGroup | 0,				
+
+
+        /**
+        The highest possible printable character category.
+        */
+		EMaxPrintableCategory = EZsCategory,			
+
+
+        /**
+        Separator, Line.
+        */
+		EZlCategory = ESeparatorGroup | 1,				
+
+
+        /**
+        Separator, Paragraph.
+        */
+		EZpCategory = ESeparatorGroup | 2,				
+
+
+        /**
+        Other, Control.
+        */
+		ECcCategory = EControlGroup | 0,				
+
+
+        /**
+        Other, Format.
+        */
+		ECfCategory = EControlGroup | 1,				
+
+
+        /**
+        The highest possible category for assigned 16-bit characters; does not
+        include surrogates, which are interpreted as pairs and have no meaning
+        on their own.
+        */
+		EMaxAssignedCategory = EMaxAssignedGroup | 0x0F,
+														
+
+        /**
+        Other, Surrogate.
+        */
+		ECsCategory = EUnassignedGroup | 0,				
+        
+        
+        /**
+        Other, Private Use.
+        */
+		ECoCategory = EUnassignedGroup | 1,				
+        
+        
+        /**
+        Other, Not Assigned.
+        */
+		ECnCategory = EUnassignedGroup | 2				
+		};
+
+	
+    /**
+    The bi-directional Unicode character category.
+
+    For more information on the bi-directional algorithm, see Unicode Technical 
+    Report No. 9 available at: http://www.unicode.org/unicode/reports/tr9.
+    */
+	enum TBdCategory
+		{
+	    /**
+	    Left to right.
+	    */
+		ELeftToRight,				// L Left-to-Right 
+	   
+	   
+	    /**
+	    Left to right embedding.
+	    */
+		ELeftToRightEmbedding,		// LRE Left-to-Right Embedding 
+	   
+	   
+	    /**
+	    Left-to-Right Override.
+	    */
+		ELeftToRightOverride,		// LRO Left-to-Right Override 
+	   
+	   
+	    /**
+	    Right to left.
+	    */
+		ERightToLeft,				// R Right-to-Left 
+	   
+	   
+	    /**
+	    Right to left Arabic.
+	    */
+		ERightToLeftArabic,			// AL Right-to-Left Arabic 
+	   
+	   
+	    /**
+	    Right to left embedding.
+	    */
+		ERightToLeftEmbedding,		// RLE Right-to-Left Embedding 
+	   
+	   
+	    /**
+	    Right-to-Left Override.
+	    */
+		ERightToLeftOverride,		// RLO Right-to-Left Override 
+	   
+	   
+	    /**
+	    Pop Directional Format.
+	    */
+		EPopDirectionalFormat,		// PDF Pop Directional Format 
+	   
+	   
+	    /**
+	    European number.
+	    */
+		EEuropeanNumber,			// EN European Number 
+	   
+	   
+	    /**
+	    European number separator.
+	    */
+		EEuropeanNumberSeparator,	// ES European Number Separator 
+	   
+	   
+	    /**
+	    European number terminator.
+	    */
+		EEuropeanNumberTerminator,	// ET European Number Terminator 
+	   
+	   
+	    /**
+	    Arabic number.
+	    */
+		EArabicNumber,				// AN Arabic Number 
+	   
+	   
+	    /**
+	    Common number separator.
+	    */
+		ECommonNumberSeparator,		// CS Common Number Separator 
+	   
+	   
+	    /**
+	    Non Spacing Mark.
+	    */
+		ENonSpacingMark,			// NSM Non-Spacing Mark 
+	   
+	   
+	    /**
+	    Boundary Neutral.
+	    */
+		EBoundaryNeutral,			// BN Boundary Neutral 
+	   
+	   
+	    /**
+	    Paragraph Separator.
+	    */
+		EParagraphSeparator,		// B Paragraph Separator 
+	   
+	   
+	    /**
+	    Segment separator.
+	    */
+		ESegmentSeparator,			// S Segment Separator 
+
+		
+		/**
+		Whitespace
+		*/
+		EWhitespace,				// WS Whitespace 
+
+
+	    /**
+	    Other neutrals; all other characters: punctuation, symbols.
+	    */
+		EOtherNeutral				// ON Other Neutrals 
+		};
+
+
+	/**
+    Notional character width as known to East Asian (Chinese, Japanese,
+    Korean (CJK)) coding systems.
+    */
+	enum TCjkWidth
+		{
+	    /**
+	    Includes 'ambiguous width' defined in Unicode Technical Report 11: East Asian Width
+	    */
+		ENeutralWidth,			
+	    
+	    
+	    /**
+	    Character which occupies a single cell.
+	    */
+		EHalfWidth,				// other categories are as defined in the report
+        
+        
+        /**
+        Character which occupies 2 cells.
+        */
+		EFullWidth,
+        
+        
+        /**
+        Characters that are always narrow and have explicit full-width
+        counterparts. All of ASCII is an example of East Asian Narrow
+        characters.
+        */
+		ENarrow,
+	    
+	    /**
+	    Characters that are always wide. This category includes characters that
+	    have explicit half-width counterparts.
+	    */
+		EWide
+		};
+
+
+	/**
+	@deprecated
+    
+    Encoding systems used by the translation functions.
+    */
+  	enum TEncoding
+  		{
+  		/**
+  		The Unicode encoding.
+  		*/
+  		EUnicode,
+        
+        
+        /**
+        The shift-JIS encoding (used in Japan).
+        */
+  		EShiftJIS		
+  		};
+
+
+	/**
+	Flags defining operations to be performed using TChar::Fold().
+	
+	The flag values are passed to the Fold() funtion.
+
+	@see TChar::Fold
+	*/
+	enum
+		{
+		/**
+		Convert characters to their lower case form if any.
+		*/
+		EFoldCase = 1,			
+
+
+		/**
+		Strip accents
+     	*/
+		EFoldAccents = 2,		
+
+
+		/**
+		Convert digits representing values 0..9 to characters '0'..'9'
+     	*/
+		EFoldDigits = 4,		
+
+
+		/**
+		Convert all spaces (ordinary, fixed-width, ideographic, etc.) to ' '
+     	*/
+		EFoldSpaces = 8,		
+
+
+		/**
+		Convert hiragana to katakana.
+     	*/
+		EFoldKana = 16,			
+
+
+		/**
+	    Fold fullwidth and halfwidth variants to their standard forms
+     	*/
+		EFoldWidth = 32,		
+
+
+		/**
+		Perform standard folding operations, i.e.those done by Fold() with no argument
+     	*/
+		EFoldStandard = EFoldCase | EFoldAccents | EFoldDigits | EFoldSpaces,
+
+
+        /**
+        Perform all possible folding operations
+        */
+		EFoldAll = -1	
+		};
+
+
+	struct TCharInfo
+    /**
+    A structure to hold information about a Unicode character.
+    
+    An object of this type is passed to TChar::GetInfo().
+ 
+    @see TChar::GetInfo
+    */
+		{
+	    /**
+	    General category.
+	    */
+		TCategory iCategory;				
+        
+        
+        /**
+        Bi-directional category.
+        */
+		TBdCategory iBdCategory;			
+        
+        
+        /**
+        Combining class: number (currently) in the range 0..234
+        */
+		TInt iCombiningClass;				
+        
+        
+        /**
+        Lower case form.
+        */
+		TUint iLowerCase;					
+        
+        
+        /**
+        Upper case form.
+        */
+		TUint iUpperCase;					
+        
+        
+        /**
+        Title case form.
+        */
+		TUint iTitleCase;					
+        
+        
+        /**
+        True, if the character is mirrored.
+        */
+		TBool iMirrored;					
+        
+        
+        /**
+        Integer numeric value: -1 if none, -2 if a fraction.
+        */
+		TInt iNumericValue;					
+		};
+
+	inline TChar();
+	inline TChar(TUint aChar);
+	inline TChar& operator-=(TUint aChar);
+	inline TChar& operator+=(TUint aChar);
+	inline TChar operator-(TUint aChar);
+	inline TChar operator+(TUint aChar);
+	inline operator TUint() const;
+#ifndef __KERNEL_MODE__
+	inline void Fold();
+	inline void LowerCase();
+	inline void UpperCase();
+	inline TBool Eos() const;
+	IMPORT_C TUint GetUpperCase() const;
+	IMPORT_C TUint GetLowerCase() const;
+	IMPORT_C TBool IsLower() const;
+	IMPORT_C TBool IsUpper() const;
+	IMPORT_C TBool IsAlpha() const;
+	IMPORT_C TBool IsDigit() const;
+	IMPORT_C TBool IsAlphaDigit() const;
+	IMPORT_C TBool IsHexDigit() const;
+	IMPORT_C TBool IsSpace() const;
+	IMPORT_C TBool IsPunctuation() const;
+	IMPORT_C TBool IsGraph() const;
+	IMPORT_C TBool IsPrint() const;
+	IMPORT_C TBool IsControl() const;
+	inline void Fold(TInt aFlags);
+	inline void TitleCase();
+	IMPORT_C TUint GetTitleCase() const;
+	IMPORT_C TBool IsTitle() const;
+	IMPORT_C TBool IsAssigned() const;
+	IMPORT_C void GetInfo(TCharInfo& aInfo) const;
+	IMPORT_C TCategory GetCategory() const;
+	IMPORT_C TBdCategory GetBdCategory() const;
+	IMPORT_C TInt GetCombiningClass() const;
+	IMPORT_C TBool IsMirrored() const;
+	IMPORT_C TInt GetNumericValue() const;
+	IMPORT_C TCjkWidth GetCjkWidth() const;
+	IMPORT_C static TBool Compose(TUint& aResult,const TDesC16& aSource);
+	IMPORT_C TBool Decompose(TPtrC16& aResult) const;
+
+protected:
+	inline void SetChar(TUint aChar);
+#endif
+private:
+	TUint iChar;
+	__DECLARE_TEST;
+	};
+
+#include <e32des8.h>
+#ifndef __KERNEL_MODE__
+#include <e32des16.h>
+#endif
+
+
+
+
+#if defined(_UNICODE) && !defined(__KERNEL_MODE__)
+#define __Size (sizeof(TUint)/sizeof(TUint16))
+/**
+@publishedAll
+@released
+
+Defines a build-independent non-modifiable descriptor.
+
+A 16-bit build variant is generated for a Unicode, non-kernel
+mode build.
+
+A build-independent type should always be used unless an explicit 8-bit 
+or 16-bit type is required.
+
+@see TDesC8
+@see TDesC16
+*/
+typedef TDesC16 TDesC;
+
+
+
+
+/**
+@publishedAll
+@released
+
+Defines a build-independent non-modifiable pointer descriptor.
+
+A 16-bit build variant is generated for a Unicode, non-kernel
+mode build.
+
+A build-independent type should always be used unless an explicit 8-bit 
+or 16-bit type is required.
+
+@see TPtrC8
+@see TPtrC16
+*/
+typedef TPtrC16 TPtrC;
+
+
+
+
+/**
+@publishedAll
+@released
+
+Defines a build-independent modifiable descriptor.
+
+A 16-bit build variant is generated for a Unicode, non-kernel
+mode build.
+
+A build-independent type should always be used unless an explicit 8-bit 
+or 16-bit type is required.
+
+@see TDes8
+@see TDes16
+*/
+typedef TDes16 TDes;
+
+
+
+
+/**
+@publishedAll
+@released
+
+Defines a build-independent modifiable pointer descriptor.
+
+A 16-bit build variant is generated for a Unicode, non-kernel
+mode build.
+
+A build-independent type should always be used unless an explicit 8-bit 
+or 16-bit type is required.
+
+@see TPtr8
+@see TPtr16
+*/
+typedef TPtr16 TPtr;
+
+
+
+
+#ifndef __KERNEL_MODE__
+/**
+@publishedAll
+@released
+
+Defines a build-independent heap descriptor. 
+
+A 16-bit build variant is generated for a Unicode, non-kernel
+mode build.
+
+A build-independent type should always be used unless an explicit 8-bit 
+or 16-bit type is required.
+
+@see HBufC8
+@see HBufC16
+*/
+typedef HBufC16 HBufC;
+
+
+
+
+/** 
+@publishedAll
+@released
+
+Defines a build-independent descriptor overflow handler.
+
+A 16-bit build variant is generated for a Unicode, non-kernel
+mode build.
+
+A build-independent type should always be used unless an explicit 8-bit 
+or 16-bit type is required.
+
+@see TDes8Overflow
+@see TDes16Overflow
+*/
+typedef TDes16Overflow TDesOverflow;
+
+
+/** 
+@publishedAll
+@released
+
+Defines a build-independent resizable buffer descriptor.
+
+A 16-bit build variant is generated for a Unicode, non-kernel mode build.
+
+A build-independent type should always be used unless an explicit 8-bit 
+or 16-bit type is required.
+
+@see RBuf8
+@see RBuf16
+*/
+typedef RBuf16 RBuf;
+
+#endif
+#else
+#define __Size (sizeof(TUint)/sizeof(TUint8))
+
+
+
+
+/**
+@publishedAll
+@released
+
+Defines a build-independent non-modifiable descriptor.
+
+An 8-bit build variant is generated for a non-Unicode build.
+
+This build-independent type should always be used unless an explicit 8-bit 
+or 16-bit build variant is required.
+
+@see TDesC8
+@see TDesC16
+*/
+typedef TDesC8 TDesC;
+
+
+
+
+/**
+@publishedAll
+@released
+
+Defines a build-independent non-modifiable pointer descriptor.
+
+An 8-bit build variant is generated for a non-Unicode build.
+
+This build-independent type should always be used unless an explicit 8-bit 
+or 16-bit build variant is required.
+
+@see TPtrC8
+@see TPtrC16
+*/
+typedef TPtrC8 TPtrC;
+
+
+
+
+/**
+@publishedAll
+@released
+
+Defines a build-independent modifiable descriptor.
+
+An 8-bit build variant is generated for a non-Unicode build.
+
+This build-independent type should always be used unless an explicit 8-bit 
+or 16-bit build variant is required.
+
+@see TDes8
+@see TDes16
+*/
+typedef TDes8 TDes;
+
+
+
+
+/**
+@publishedAll
+@released
+
+Defines a build-independent modifiable pointer descriptor.
+
+An 8-bit build variant is generated for a non-Unicode build.
+
+This build-independent type should always be used unless an explicit 8-bit 
+or 16-bit build variant is required.
+
+@see TPtr8
+@see TPtr16
+*/
+typedef TPtr8 TPtr;
+#ifndef __KERNEL_MODE__
+
+
+
+
+/**
+@publishedAll
+@released
+
+Defines a build-independent heap descriptor.
+
+An 8-bit build variant is generated for a non-Unicode, non-kernel
+mode build.
+
+This build-independent type should always be used unless an explicit 8-bit 
+or 16-bit build variant is required.
+
+@see HBufC8
+@see HBufC16
+*/
+typedef HBufC8 HBufC;
+
+
+
+
+/**
+@publishedAll
+@released
+
+Defines a build-independent descriptor overflow handler. 
+
+An 8-bit build variant is generated for a non-Unicode, non-kernel
+mode build.
+
+This build-independent type should always be used unless an explicit 8-bit 
+or 16-bit build variant is required.
+
+@see TDes8Overflow
+@see TDes16Overflow
+*/
+typedef TDes8Overflow TDesOverflow;
+
+
+/**
+@publishedAll
+@released
+
+Defines a build-independent resizable buffer descriptor.
+
+An 8-bit build variant is generated for a non-Unicode, non-kernel mode build.
+
+This build-independent type should always be used unless an explicit 8-bit 
+or 16-bit build variant is required.
+
+@see RBuf8
+@see RBuf16
+*/
+typedef RBuf8 RBuf;
+
+#endif
+#endif
+
+
+#if defined(_UNICODE) && !defined(__KERNEL_MODE__)
+typedef TBufCBase16 TBufCBase;
+#else
+typedef TBufCBase8 TBufCBase;
+#endif
+
+/**
+@publishedAll
+@released
+
+A build-independent non-modifiable buffer descriptor.
+
+This is a descriptor class which provides a buffer of fixed length for
+containing and accessing TUint16 or TUint8 data, depending on the build.
+
+The class intended for instantiation. The data that the descriptor represents 
+is part of the descriptor object itself.
+
+The class is templated, based on an integer value which defines the size of 
+the descriptor's data area.
+
+The data is intended to be accessed, but not modified; however, it can be 
+completely replaced using the assignment operators of this class. The base 
+class provides the functions through which the data is accessed.
+
+This class derives from TBufCBase16 for a Unicode, non-kernel build, but
+derives from TBufCBase8 for a non-Unicode build.
+
+@see TDesC
+@see TDesC8
+@see TDesC16
+@see TPtr
+@see TPtr8
+@see TPtr16
+@see TBufC8
+@see TBufC16
+*/
+template <TInt S>
+#if defined(_UNICODE) && !defined(__KERNEL_MODE__)
+class TBufC : public TBufCBase16
+#else
+class TBufC : public TBufCBase8
+#endif
+	{
+public:
+	inline TBufC();
+	inline TBufC(const TText* aString);
+	inline TBufC(const TDesC& aDes);
+	inline TBufC<S>& operator=(const TText* aString);
+	inline TBufC<S>& operator=(const TDesC& aDes);
+	inline TPtr Des();
+private:
+	TText iBuf[__Align(S)];
+	};
+
+
+
+/**
+@publishedAll
+@released
+
+A build-independent modifiable buffer descriptor.
+
+This is a descriptor class which provides a buffer of fixed length for
+containing, accessing and manipulating TUint16 or TUint8 data, depending
+on the build.
+
+The class is intended for instantiation. The data that the descriptor represents 
+is part of the descriptor object itself.
+
+The class is templated, based on an integer value which determines the size 
+of the data area created as part of the buffer descriptor object; this is 
+also the maximum length of the descriptor.
+
+The data is intended to be both accessed and modified. The base classes provide 
+the functions through which the data is accessed.
+
+This class derives from TBufCBase16 for a Unicode, non-kernel build, but
+derives from TBufCBase8 for a non-Unicode build.
+
+@see TDesC
+@see TDesC8
+@see TDesC16
+@see TDes
+@see TDes8
+@see TDes16
+@see TPtr
+@see TPtr8
+@see TPtr16
+*/
+template <TInt S>
+#if defined(_UNICODE) && !defined(__KERNEL_MODE__)
+class TBuf : public TBufBase16
+#else
+class TBuf : public TBufBase8
+#endif
+	{
+public:
+	inline TBuf();
+	inline explicit TBuf(TInt aLength);
+	inline TBuf(const TText* aString);
+	inline TBuf(const TDesC& aDes);
+	inline TBuf<S>& operator=(const TText* aString);
+	inline TBuf<S>& operator=(const TDesC& aDes);
+	inline TBuf<S>& operator=(const TBuf<S>& aBuf);
+private:
+	TText iBuf[__Align(S)];
+	};
+
+
+
+
+/**
+@publishedAll
+@released
+
+Value reference used in operator TLitC::__TRefDesC().
+
+@see TRefByValue
+*/
+typedef TRefByValue<const TDesC> __TRefDesC;
+
+
+
+
+/**
+@publishedAll
+@released
+
+Encapsulates literal text.
+
+This is always constructed using an _LIT macro.
+
+This class is build independent; i.e. for a non-Unicode build, an 8-bit build
+variant is generated; for a Unicode build, a 16 bit build variant is generated.
+
+The class has no explicit constructors. See the _LIT macro definition.
+*/
+template <TInt S>
+class TLitC
+	{
+public:
+    /**
+    @internalComponent
+    */
+	enum {BufferSize=S-1};
+	inline const TDesC* operator&() const;
+	inline operator const TDesC&() const;
+	inline const TDesC& operator()() const;
+	inline operator const __TRefDesC() const;
+public:
+#if !defined(_UNICODE) || defined(__KERNEL_MODE__)
+
+    /**
+    @internalComponent
+    */
+	typedef TUint8 __TText;
+#elif defined(__GCC32__)
+
+    /**
+    @internalComponent
+    */
+	typedef wchar_t __TText;
+#elif defined(__VC32__)
+
+	/**
+    @internalComponent
+    */
+	typedef TUint16 __TText;
+
+#elif defined(__CW32__)
+
+    /**
+    @internalComponent
+    */
+	typedef TUint16 __TText;
+#elif !defined(__TText_defined)
+#error  no typedef for __TText
+#endif
+public:
+    /**
+    @internalComponent
+    */
+	TUint iTypeLength;
+
+    /**
+    @internalComponent
+    */
+	__TText iBuf[__Align(S)];
+	};
+
+
+/**
+@publishedAll
+@released
+
+Defines an empty or null literal descriptor.
+
+This is the build independent form.
+An 8 bit build variant is generated for a non-Unicode build;
+a 16 bit build variant is generated for a Unicode build.
+*/
+_LIT(KNullDesC,"");
+
+
+
+/**
+@publishedAll
+@released
+
+Defines an empty or null literal descriptor for use with 8-bit descriptors.
+*/
+_LIT8(KNullDesC8,"");
+#ifndef __KERNEL_MODE__
+
+
+
+/**
+@publishedAll
+@released
+
+Defines an empty or null literal descriptor for use with 16-bit descriptors
+*/
+_LIT16(KNullDesC16,"");
+#endif
+
+
+
+
+/**
+@publishedAll
+@released
+
+Packages a non-modifiable pointer descriptor which represents an object of 
+specific type.
+
+The template parameter defines the type of object.
+
+The object represented by the packaged pointer descriptor is accessible through 
+the package but cannot be changed. */
+template <class T>
+class TPckgC : public TPtrC8
+	{
+public:
+	inline TPckgC(const T& aRef);
+	inline const T& operator()() const;
+private:
+	TPckgC<T>& operator=(const TPckgC<T>& aRef);
+	};
+
+
+
+
+/**
+@publishedAll
+@released
+
+Packages a modifiable pointer descriptor which represents an object of specific 
+type.
+
+The template parameter defines the type of object.
+
+The object represented by the packaged pointer descriptor is accessible through 
+the package.
+*/
+template <class T>
+class TPckg : public TPtr8
+	{
+public:
+	inline TPckg(const T& aRef);
+	inline T& operator()();
+private:
+	TPckg<T>& operator=(const TPckg<T>& aRef);
+	};
+
+
+
+
+/**
+@publishedAll
+@released
+
+Packages an object into a modifiable buffer descriptor.
+
+The template parameter defines the type of object to be packaged.
+
+The package provides a type safe way of transferring an object or data structure 
+which is contained within a modifiable buffer descriptor. Typically, a package 
+is used for passing data via inter thread communication.
+
+The contained object is accessible through the package.
+*/
+template <class T>
+class TPckgBuf : public TAlignedBuf8<sizeof(T)>
+	{
+public:
+	inline TPckgBuf();
+	inline TPckgBuf(const T& aRef);
+	inline TPckgBuf& operator=(const TPckgBuf<T>& aRef);
+	inline T& operator=(const T& aRef);
+	inline T& operator()();
+	inline const T& operator()() const;
+	};
+
+
+
+
+/**
+@publishedAll
+@released
+
+Defines a modifiable buffer descriptor that can contain the name of a reference 
+counting object.
+
+@see TBuf
+@see CObject
+*/
+typedef TBuf<KMaxName> TName;
+
+
+/**
+@publishedAll
+@released
+
+Defines a modifiable buffer descriptor that can contain the full name of a 
+reference counting object.
+
+@see TBuf
+@see CObject
+*/
+typedef TBuf<KMaxFullName> TFullName;
+
+
+
+/**
+@publishedAll
+@released
+
+Defines a modifiable buffer descriptor to contain the category name identifying
+the cause of thread or process termination. The buffer takes a maximum length
+of KMaxExitCategoryName.
+
+@see RThread::ExitCategory
+@see RThread::ExitCategory
+*/
+typedef TBuf<KMaxExitCategoryName> TExitCategoryName;
+
+
+
+/**
+@publishedAll
+@released
+
+A buffer that can contain the name of a file.
+The name can have a maximum length of KMaxFileName
+(currently 256 but check the definition of KMaxFileName).
+
+@see KMaxFileName
+*/
+typedef TBuf<KMaxFileName> TFileName;
+
+
+
+/**
+@publishedAll
+@released
+
+A buffer that can contain the name of a path.
+The name can have a maximum length of KMaxPath
+(currently 256 but check the definition of KMaxPath).
+
+@see KMaxPath
+*/
+typedef TBuf<KMaxPath> TPath;
+
+
+
+
+/**
+@publishedAll
+@released
+
+Version name type.
+
+This is a buffer descriptor with a maximum length of KMaxVersionName.
+A TVersion object returns the formatted character representation of its version
+information in a descriptor of this type.
+
+@see TVersion
+*/
+typedef TBuf<KMaxVersionName> TVersionName;
+
+
+
+
+/**
+@publishedAll
+@released
+
+Defines a modifiable buffer descriptor for the text form of the UID.
+The descriptor has a maximum length of KMaxUidName and is used to contain
+the standard text format returned by the function TUid::Name().
+
+@see TUid::Name
+*/
+typedef TBuf<KMaxUidName> TUidName;
+
+
+
+
+/**
+@publishedAll
+@released
+
+Defines a null UID
+*/
+#define KNullUid TUid::Null()
+
+
+
+
+/**
+@publishedAll
+@released
+
+A globally unique 32-bit number.
+*/
+class TUid
+	{
+public:
+#ifndef __KERNEL_MODE__
+	IMPORT_C TBool operator==(const TUid& aUid) const;
+	IMPORT_C TBool operator!=(const TUid& aUid) const;
+	IMPORT_C TUidName Name() const;
+#endif
+	static inline TUid Uid(TInt aUid);
+	static inline TUid Null();
+public:
+	/**
+	The 32-bit integer UID value.
+	*/
+	TInt32 iUid;
+	};
+
+
+
+
+/**
+@publishedAll
+@released
+
+Encapsulates a set of three unique identifiers (UIDs) which, in combination, 
+identify a system object such as a GUI application or a DLL. The three
+component UIDs are referred to as UID1, UID2 and UID3.
+
+An object of this type is referred to as a compound identifier or a UID type.
+*/
+class TUidType
+	{
+public:
+#ifndef __KERNEL_MODE__
+	IMPORT_C TUidType();
+	IMPORT_C TUidType(TUid aUid1);
+	IMPORT_C TUidType(TUid aUid1,TUid aUid2);
+	IMPORT_C TUidType(TUid aUid1,TUid aUid2,TUid aUid3);
+	IMPORT_C TBool operator==(const TUidType& aUidType) const;
+	IMPORT_C TBool operator!=(const TUidType& aUidType) const;
+	IMPORT_C const TUid& operator[](TInt anIndex) const;
+	IMPORT_C TUid MostDerived() const;
+	IMPORT_C TBool IsPresent(TUid aUid) const;
+	IMPORT_C TBool IsValid() const;
+private:
+#endif
+	TUid iUid[KMaxCheckedUid];
+	};
+
+
+
+
+/**
+A class used to represent the Secure ID of a process or executable image.
+
+Constructors and conversion operators are provided to enable conversion
+of this class to and from both TUint32 and TUid objects.
+
+Because this class has non-default constructors, compilers will not initialise
+this objects at compile time, instead code will be generated to construct the object
+at run-time. This is wastefull, and Symbian OS DLLs are not permitted to have
+such uninitialised data. To overcome these problems a macro is provided to construct
+a const object which behaves like a TSecureId. This is _LIT_SECURE_ID.
+This macro should be used where it is desirable to define const TSecureId objects,
+like in header files. E.g. Instead of writing:
+@code
+	const TSecureId MyId=0x1234567
+@endcode
+use
+@code
+	_LIT_SECURE_ID(MyId,0x1234567)
+@endcode
+
+@publishedAll
+@released
+
+@see _LIT_SECURE_ID
+*/
+class TSecureId
+	{
+public:
+	inline TSecureId();
+	inline TSecureId(TUint32 aId);
+	inline operator TUint32() const;
+	inline TSecureId(TUid aId);
+	inline operator TUid() const;
+public:
+	TUint32 iId;
+	};
+
+
+
+
+/**
+A class used to represent the Vendor ID of a process or executable image
+
+Constructors and conversion operators are provided to enable conversion
+of this class to and from both TUint32 and TUid objects.
+
+Because this class has non-default constructors, compilers will not initialise
+this objects at compile time, instead code will be generated to construct the object
+at run-time. This is wastefull, and Symbian OS DLLs are not permitted to have
+such uninitialised data. To overcome these problems a macro is provided to construct
+a const object which behaves like a TSecureId. This is _LIT_VENDOR_ID.
+This macro should be used where it is desirable to define const TSecureId objects,
+like in header files. E.g. Instead of writing:
+@code
+	const TVendorId MyId=0x1234567
+@endcode
+use
+@code
+	_LIT_VENDOR_ID(MyId,0x1234567)
+@endcode
+
+@publishedAll
+@released
+
+@see _LIT_VENDOR_ID
+*/
+class TVendorId
+	{
+public:
+	inline TVendorId();
+	inline TVendorId(TUint32 aId);
+	inline operator TUint32() const;
+	inline TVendorId(TUid aId);
+	inline operator TUid() const;
+public:
+	TUint32 iId;
+	};
+
+
+
+/**
+Structure for compile-time definition of a secure ID
+@internalComponent
+*/
+class SSecureId
+	{
+public:
+	inline const TSecureId* operator&() const;
+	inline operator const TSecureId&() const;
+	inline operator TUint32() const;
+	inline operator TUid() const;
+public:
+	TUint32 iId;
+	};
+
+
+	
+	
+/**
+Structure for compile-time definition of a vendor ID
+@internalComponent
+*/
+class SVendorId
+	{
+public:
+	inline const TVendorId* operator&() const;
+	inline operator const TVendorId&() const;
+	inline operator TUint32() const;
+	inline operator TUid() const;
+public:
+	TUint32 iId;
+	};
+
+
+
+
+/**
+Macro for compile-time definition of a secure ID
+@param name Name to use for secure ID
+@param value Value of secure ID
+@publishedAll
+@released
+*/
+#define _LIT_SECURE_ID(name,value) const SSecureId name={value}
+
+
+
+
+/**
+Macro for compile-time definition of a vendor ID
+@param name Name to use for vendor ID
+@param value Value of vendor ID
+@publishedAll
+@released
+*/
+#define _LIT_VENDOR_ID(name,value) const SVendorId name={value}
+
+
+
+
+/**
+@publishedAll
+@released
+
+Contains version information.
+
+A version is defined by a set of three numbers:
+
+1. the major version number, ranging from 0 to 127, inclusive
+
+2. the minor version number, ranging from 0 to 99 inclusive
+
+3. the build number, ranging from 0 to 32767 inclusive.
+
+The class provides a constructor for setting all three numbers.
+It also provides a member function to build a character representation of
+this information in a TVersionName descriptor.
+
+@see TVersionName
+*/
+class TVersion
+	{
+public:
+	IMPORT_C TVersion();
+	IMPORT_C TVersion(TInt aMajor,TInt aMinor,TInt aBuild);
+	IMPORT_C TVersionName Name() const;
+public:
+    /**
+    The major version number.
+    */
+	TInt8 iMajor;
+
+
+    /**
+    The minor version number.
+    */
+	TInt8 iMinor;
+
+	
+	/**
+	The build number.
+	*/
+	TInt16 iBuild;
+	};
+
+
+
+
+/**
+@publishedAll
+@released
+
+Indicates the completion status of a request made to a service provider.
+
+When a thread makes a request, it passes a request status as a parameter. 
+On completion, the provider signals the requesting thread's request semaphore 
+and stores a completion code in the request status. Typically, this is KErrNone 
+or one of the other system-wide error codes.
+
+This class is not intended for user derivation.
+*/
+class TRequestStatus
+	{
+public:
+	inline TRequestStatus();
+	inline TRequestStatus(TInt aVal);
+	inline TInt operator=(TInt aVal);
+	inline TBool operator==(TInt aVal) const;
+	inline TBool operator!=(TInt aVal) const;
+	inline TBool operator>=(TInt aVal) const;
+	inline TBool operator<=(TInt aVal) const;
+	inline TBool operator>(TInt aVal) const;
+	inline TBool operator<(TInt aVal) const;
+	inline TInt Int() const;
+private:
+	enum
+		{
+		EActive				= 1,  //bit0
+		ERequestPending		= 2,  //bit1
+		};
+	TInt iStatus;
+	TUint iFlags;
+	friend class CActive;
+	friend class CActiveScheduler;
+	friend class CServer2;
+	};
+
+
+
+
+class TSize;
+/**
+@publishedAll
+@released
+
+Stores a two-dimensional point in Cartesian co-ordinates.
+
+Its data members (iX and iY) are public and can be manipulated directly, or 
+by means of the functions provided. Functions are provided to set and manipulate 
+the point, and to compare points for equality.
+*/
+class TPoint
+	{
+public:
+#ifndef __KERNEL_MODE__
+	enum TUninitialized { EUninitialized };
+	/**
+	Constructs default point, initialising its iX and iY members to zero.
+	*/
+	TPoint(TUninitialized) {}
+	inline TPoint();
+	inline TPoint(TInt aX,TInt aY);
+	IMPORT_C TBool operator==(const TPoint& aPoint) const;
+	IMPORT_C TBool operator!=(const TPoint& aPoint) const;
+	IMPORT_C TPoint& operator-=(const TPoint& aPoint);
+	IMPORT_C TPoint& operator+=(const TPoint& aPoint);
+	IMPORT_C TPoint& operator-=(const TSize& aSize);
+	IMPORT_C TPoint& operator+=(const TSize& aSize);
+	IMPORT_C TPoint operator-(const TPoint& aPoint) const;
+	IMPORT_C TPoint operator+(const TPoint& aPoint) const;
+	IMPORT_C TPoint operator-(const TSize& aSize) const;
+	IMPORT_C TPoint operator+(const TSize& aSize) const;
+	IMPORT_C TPoint operator-() const;
+	IMPORT_C void SetXY(TInt aX,TInt aY);
+	IMPORT_C TSize AsSize() const;
+#endif
+public:
+	/**
+	The x co-ordinate.
+	*/
+	TInt iX;
+	/**
+	The y co-ordinate.
+	*/
+	TInt iY;
+	};
+
+
+
+
+/**
+@publishedAll
+@prototype
+
+Stores a three-dimensional point in Cartesian or polar co-ordinates.
+Its data members (iX, iY and iZ) are public and can be manipulated directly.
+
+*/
+class TPoint3D
+	{
+public:
+#ifndef __KERNEL_MODE__
+	enum TUninitialized { EUninitialized };
+
+	/**
+	TUninitialized Constructor
+	*/
+	TPoint3D(TUninitialized) {}
+	/**
+	Constructs default TPoint3D, initialising its iX , iY and iZ members to zero.
+	*/
+	inline TPoint3D();
+	/**
+	Constructs  TPoint3D with the specified x,y  and z co-ordinates.
+	*/
+	inline TPoint3D(TInt aX,TInt aY,TInt aZ);
+	/** 
+	Copy Construct from TPoint , initialises Z co-ordinate to  Zero
+	*/
+	inline TPoint3D(const  TPoint& aPoint);
+
+	IMPORT_C TBool operator==(const TPoint3D& aPoint3D) const;
+	IMPORT_C TBool operator!=(const TPoint3D& aPoint3D) const;
+
+	IMPORT_C TPoint3D& operator-=(const TPoint3D& aPoint3D);
+	IMPORT_C TPoint3D& operator-=(const TPoint& aPoint);
+
+	IMPORT_C TPoint3D& operator+=(const TPoint3D& aPoint3D);	
+	IMPORT_C TPoint3D& operator+=(const TPoint& aPoint);
+
+	IMPORT_C TPoint3D operator-(const TPoint3D& aPoint3D) const;
+	IMPORT_C TPoint3D operator-(const TPoint& aPoint) const;	
+
+	IMPORT_C TPoint3D operator+(const TPoint3D& aPoint3D) const;
+	IMPORT_C TPoint3D operator+(const TPoint& aPoint) const;
+	/**
+    Unary minus operator. The operator returns the negation of this Point3D 
+	*/
+	IMPORT_C TPoint3D operator-() const;
+	
+	/**
+	Set Method to set the xyz co-ordinates of TPoint3D
+	*/
+	IMPORT_C void SetXYZ(TInt aX,TInt aY,TInt aZ);
+	
+	/**
+	TPoint3D from TPoint, sets the Z co-ordinate to  Zero
+	*/
+	IMPORT_C void SetPoint(const TPoint& aPoint);
+
+	/**
+	Returns TPoint from TPoint3D
+	*/
+	IMPORT_C TPoint AsPoint() const;
+#endif
+public:
+	/**
+	The x co-ordinate.
+	*/
+	TInt iX;
+	/**
+	The y co-ordinate.
+	*/
+	TInt iY;
+	/**
+	The z co-ordinate.
+	*/
+	TInt iZ;
+	};
+
+
+
+/**
+@internalTechnology
+@prototype For now, only intended to be used by TRwEvent and the Windows Server
+
+Stores the angular spherical coordinates (Phi,Theta) of a three-dimensional point.
+
+Its data members (iPhi, iTheta) are public and can be manipulated directly.
+*/
+class TAngle3D
+	{
+public:
+	/**
+	The Phi co-ordinate (angle between X-axis and the line that links the projection of the point on the X-Y plane and the origin).
+	*/
+	TInt iPhi;
+	/**
+	The Theta co-ordinate (angle between the Z-axis and the line that links the point and the origin).
+	*/
+	TInt iTheta;
+	};
+
+	
+/**
+@publishedAll
+@released
+
+Stores a two-dimensional size as a width and a height value.
+
+Its data members are public and can be manipulated directly, or by means of 
+the functions provided.
+*/
+class TSize
+	{
+public:
+#ifndef __KERNEL_MODE__
+	enum TUninitialized { EUninitialized };
+	/**
+	Constructs the size object with its iWidth and iHeight members set to zero.
+	*/
+	TSize(TUninitialized) {}
+	inline TSize();
+	inline TSize(TInt aWidth,TInt aHeight);
+	IMPORT_C TBool operator==(const TSize& aSize) const;
+	IMPORT_C TBool operator!=(const TSize& aSize) const;
+	IMPORT_C TSize& operator-=(const TSize& aSize);
+	IMPORT_C TSize& operator-=(const TPoint& aPoint);
+	IMPORT_C TSize& operator+=(const TSize& aSize);
+	IMPORT_C TSize& operator+=(const TPoint& aPoint);
+	IMPORT_C TSize operator-(const TSize& aSize) const;
+	IMPORT_C TSize operator-(const TPoint& aPoint) const;
+	IMPORT_C TSize operator+(const TSize& aSize) const;
+	IMPORT_C TSize operator+(const TPoint& aPoint) const;
+	IMPORT_C TSize operator-() const;
+	IMPORT_C void SetSize(TInt aWidth,TInt aHeight);
+	IMPORT_C TPoint AsPoint() const;
+#endif
+public:
+	/**
+	The width of this TSize object.
+	*/
+	TInt iWidth;
+	/**
+	The height of this TSize object.
+	*/
+	TInt iHeight;
+	};
+
+
+
+
+/**
+@publishedAll
+@released
+
+Information about a kernel object.
+
+This type of object is passed to RHandleBase::HandleInfo(). The function 
+fetches information on the usage of the kernel object associated with that 
+handle and stores the information in the THandleInfo object.
+
+The class contains four data members and no explicitly defined function
+members.
+*/
+class THandleInfo
+	{
+public:
+	/**
+	The number of times that the kernel object is open in the current process.
+	*/
+	TInt iNumOpenInProcess;
+	
+	/**
+	The number of times that the kernel object is open in the current thread.
+	*/
+	TInt iNumOpenInThread;
+	
+	/**
+	The number of processes which have a handle on the kernel object.
+	*/
+	TInt iNumProcesses;
+	
+	/**
+	The number of threads which have a handle on the kernel object.
+	*/
+	TInt iNumThreads;
+	};
+
+
+
+
+/**
+@internalComponent
+*/
+class TFindHandle
+	{
+public:
+	inline TFindHandle();
+	inline TInt Handle() const;
+#ifdef __KERNEL_MODE__
+	inline TInt Index() const;
+	inline TInt UniqueID() const;
+	inline TUint64 ObjectID() const;
+	inline void Set(TInt aIndex, TInt aUniqueId, TUint64 aObjectId);
+#else
+protected:
+	inline void Reset();
+#endif
+private:
+	TInt iHandle;
+	TInt iSpare1;
+	TInt iObjectIdLow;
+	TInt iObjectIdHigh;
+	};
+
+
+
+class RThread;
+class TFindHandleBase;
+class TFindSemaphore;
+/**
+@publishedAll
+@released
+
+A handle to an object.
+
+The class encapsulates the basic behaviour of a handle, hiding the
+handle-number which identifies the object which the handle represents.
+
+The class is abstract in the sense that a RHandleBase object is never
+explicitly instantiated. It is always a base class to a concrete handle class;
+for example, RSemaphore, RThread, RProcess, RCriticalSection etc.
+*/
+class RHandleBase
+	{
+#ifndef SYMBIAN_ENABLE_SPLIT_HEADERS
+public:
+    /**
+    @internalComponent
+    */
+#else
+protected:
+#endif
+    enum
+		{
+		EReadAccess=0x1,
+		EWriteAccess=0x2,
+		EDirectReadAccess=0x4,
+		EDirectWriteAccess=0x8,
+		};
+public:
+	inline RHandleBase();
+	inline TInt Handle() const;
+	inline void SetHandle(TInt aHandle);
+	inline TInt SetReturnedHandle(TInt aHandleOrError);	
+	static void DoExtendedClose();
+#ifndef __KERNEL_MODE__
+	IMPORT_C void Close();
+	IMPORT_C TName Name() const;
+	IMPORT_C TFullName FullName() const;
+	IMPORT_C void FullName(TDes& aName) const;
+	IMPORT_C void SetHandleNC(TInt aHandle);
+	IMPORT_C TInt Duplicate(const RThread& aSrc,TOwnerType aType=EOwnerProcess);
+	IMPORT_C void HandleInfo(THandleInfo* anInfo);
+	IMPORT_C TUint Attributes() const;
+	IMPORT_C TInt BTraceId() const;
+	IMPORT_C void NotifyDestruction(TRequestStatus& aStatus);	/**< @internalTechnology */
+protected:
+	inline RHandleBase(TInt aHandle);
+	IMPORT_C TInt Open(const TFindHandleBase& aHandle,TOwnerType aType);
+	static TInt SetReturnedHandle(TInt aHandleOrError,RHandleBase& aHandle);
+	TInt OpenByName(const TDesC &aName,TOwnerType aOwnerType,TInt aObjectType);
+#endif
+private:
+	static void DoExtendedCloseL();
+protected:
+	TInt iHandle;
+	};
+
+
+
+
+class RMessagePtr2;
+/**
+@publishedAll
+@released
+
+A handle to a semaphore.
+
+The semaphore itself is a Kernel side object.
+
+As with all handles, they should be closed after use. RHandleBase provides 
+the necessary Close() function, which should be called when the handle is 
+no longer required.
+
+@see RHandleBase::Close
+*/
+class RSemaphore : public RHandleBase
+	{
+public:
+#ifndef __KERNEL_MODE__
+	inline TInt Open(const TFindSemaphore& aFind,TOwnerType aType=EOwnerProcess);
+	IMPORT_C TInt CreateLocal(TInt aCount,TOwnerType aType=EOwnerProcess);
+	IMPORT_C TInt CreateGlobal(const TDesC& aName,TInt aCount,TOwnerType aType=EOwnerProcess);
+	IMPORT_C TInt OpenGlobal(const TDesC& aName,TOwnerType aType=EOwnerProcess);
+	IMPORT_C TInt Open(RMessagePtr2 aMessage,TInt aParam,TOwnerType aType=EOwnerProcess);
+	IMPORT_C TInt Open(TInt aArgumentIndex, TOwnerType aType=EOwnerProcess);
+	IMPORT_C void Wait();
+	IMPORT_C TInt Wait(TInt aTimeout);	// timeout in microseconds
+	IMPORT_C void Signal();
+	IMPORT_C void Signal(TInt aCount);
+#endif
+	};
+
+
+
+
+/**
+@publishedAll
+@released
+
+A fast semaphore.
+
+This is a layer over a standard semaphore, and only calls into the kernel side
+if there is contention.
+*/
+class RFastLock : public RSemaphore
+	{
+public:
+	inline RFastLock();
+	IMPORT_C TInt CreateLocal(TOwnerType aType=EOwnerProcess);
+	IMPORT_C void Wait();
+	IMPORT_C void Signal();
+private:
+	TInt iCount;
+	};
+
+
+
+
+/**
+@publishedAll
+@released
+
+The user-side handle to a logical channel.
+
+The class provides functions that are used to open a channel
+to a device driver, and to make requests. A device driver provides
+a derived class to give the user-side a tailored interface to the driver.
+*/
+class RBusLogicalChannel : public RHandleBase
+	{
+public:
+	IMPORT_C TInt Open(RMessagePtr2 aMessage,TInt aParam,TOwnerType aType=EOwnerProcess);
+	IMPORT_C TInt Open(TInt aArgumentIndex, TOwnerType aType=EOwnerProcess);
+protected:
+	inline TInt DoCreate(const TDesC& aDevice, const TVersion& aVer, TInt aUnit, const TDesC* aDriver, const TDesC8* anInfo, TOwnerType aType=EOwnerProcess, TBool aProtected=EFalse);
+	IMPORT_C void DoCancel(TUint aReqMask);
+	IMPORT_C void DoRequest(TInt aReqNo,TRequestStatus& aStatus);
+	IMPORT_C void DoRequest(TInt aReqNo,TRequestStatus& aStatus,TAny* a1);
+	IMPORT_C void DoRequest(TInt aReqNo,TRequestStatus& aStatus,TAny* a1,TAny* a2);
+	IMPORT_C TInt DoControl(TInt aFunction);
+	IMPORT_C TInt DoControl(TInt aFunction,TAny* a1);
+	IMPORT_C TInt DoControl(TInt aFunction,TAny* a1,TAny* a2);
+	inline TInt DoSvControl(TInt aFunction) { return DoControl(aFunction); }
+	inline TInt DoSvControl(TInt aFunction,TAny* a1) { return DoControl(aFunction, a1); }
+	inline TInt DoSvControl(TInt aFunction,TAny* a1,TAny* a2) { return DoControl(aFunction, a1, a2); }
+private:
+	IMPORT_C TInt DoCreate(const TDesC& aDevice, const TVersion& aVer, TInt aUnit, const TDesC* aDriver, const TDesC8* aInfo, TInt aType);
+private:
+	// Padding for Binary Compatibility purposes
+	TInt iPadding1;
+	TInt iPadding2;
+	};
+
+
+
+
+/**
+@internalComponent
+
+Base class for memory allocators.
+*/
+// Put pure virtual functions into a separate base class so that vptr is at same
+// place in both GCC98r2 and EABI builds.
+class MAllocator
+	{
+public:
+	virtual TAny* Alloc(TInt aSize)=0;
+	virtual void Free(TAny* aPtr)=0;
+	virtual TAny* ReAlloc(TAny* aPtr, TInt aSize, TInt aMode=0)=0;
+	virtual TInt AllocLen(const TAny* aCell) const =0;
+	virtual TInt Compress()=0;
+	virtual void Reset()=0;
+	virtual TInt AllocSize(TInt& aTotalAllocSize) const =0;
+	virtual TInt Available(TInt& aBiggestBlock) const =0;
+	virtual TInt DebugFunction(TInt aFunc, TAny* a1=NULL, TAny* a2=NULL)=0;
+	virtual TInt Extension_(TUint aExtensionId, TAny*& a0, TAny* a1)=0;
+	};
+
+
+
+
+/**
+@publishedAll
+@released
+
+Base class for heaps.
+*/
+class RAllocator : public MAllocator
+	{
+public:
+
+
+    /**
+    A set of heap allocation failure flags.
+    
+    This enumeration indicates how to simulate heap allocation failure.
+
+    @see RAllocator::__DbgSetAllocFail()
+    */
+	enum TAllocFail {
+                    /**
+                    Attempts to allocate from this heap fail at a random rate;
+                    however, the interval pattern between failures is the same
+                    every time simulation is started.
+                    */
+	                ERandom,
+	                
+	                
+                  	/**
+                  	Attempts to allocate from this heap fail at a random rate.
+                  	The interval pattern between failures may be different every
+                  	time the simulation is started.
+                  	*/
+	                ETrueRandom,
+	                
+	                
+                    /**
+                    Attempts to allocate from this heap fail at a rate aRate;
+                    for example, if aRate is 3, allocation fails at every
+                    third attempt.
+                    */
+	                EDeterministic,
+
+	                
+	                /**
+	                Cancels simulated heap allocation failure.
+	                */
+	                ENone,
+	                
+	                
+	                /**
+	                An allocation from this heap will fail after the next aRate - 1 
+					allocation attempts. For example, if aRate = 1 then the next 
+					attempt to allocate from this heap will fail.
+	                */
+	                EFailNext,
+	                
+	                /**
+	                Cancels simulated heap allocation failure, and sets
+	                the nesting level for all allocated cells to zero.
+	                */
+	                EReset,
+
+                    /**
+                    aBurst allocations from this heap fail at a random rate;
+                    however, the interval pattern between failures is the same
+                    every time the simulation is started.
+                    */
+	                EBurstRandom,
+	                
+	                
+                  	/**
+                  	aBurst allocations from this heap fail at a random rate.
+                  	The interval pattern between failures may be different every
+                  	time the simulation is started.
+                  	*/
+	                EBurstTrueRandom,
+	                
+	                
+                    /**
+                    aBurst allocations from this heap fail at a rate aRate.
+                    For example, if aRate is 10 and aBurst is 2, then 2 allocations
+					will fail at every tenth attempt.
+                    */
+	                EBurstDeterministic,
+
+	                /**
+	                aBurst allocations from this heap will fail after the next aRate - 1 
+					allocation attempts have occurred. For example, if aRate = 1 and 
+					aBurst = 3 then the next 3 attempts to allocate from this heap will fail.
+	                */
+	                EBurstFailNext,
+
+					/**
+					Use this to determine how many times the current debug 
+					failure mode has failed so far.
+					@see RAllocator::__DbgCheckFailure()
+					*/
+					ECheckFailure,
+	                };
+	                
+	                
+    /**
+    Heap debug checking type flag.
+    */
+	enum TDbgHeapType {
+                      /**
+                      The heap is a user heap.
+                      */
+	                  EUser,
+	                  
+                      /**
+                      The heap is the Kernel heap.
+                      */	                  
+	                  EKernel
+	                  };
+	                  
+	                  
+	enum TAllocDebugOp {ECount, EMarkStart, EMarkEnd, ECheck, ESetFail, ECopyDebugInfo, ESetBurstFail};
+	
+	
+	/**
+	Flags controlling reallocation.
+	*/
+	enum TReAllocMode {
+	                  /**
+	                  A reallocation of a cell must not change
+	                  the start address of the cell.
+	                  */
+	                  ENeverMove=1,
+	                  
+	                  /**
+	                  Allows the start address of the cell to change
+	                  if the cell shrinks in size.
+	                  */
+	                  EAllowMoveOnShrink=2
+	                  };
+	                  
+	                  
+	enum TFlags {ESingleThreaded=1, EFixedSize=2, ETraceAllocs=4, EMonitorMemory=8,};
+	struct SCheckInfo {TBool iAll; TInt iCount; const TDesC8* iFileName; TInt iLineNum;};
+#ifndef SYMBIAN_ENABLE_SPLIT_HEADERS
+	struct SRAllocatorBurstFail {TInt iBurst; TInt iRate; TInt iUnused[2];};
+#endif
+	enum {EMaxHandles=32};
+
+public:
+	inline RAllocator();
+#ifndef __KERNEL_MODE__
+	IMPORT_C TInt Open();
+	IMPORT_C void Close();
+	IMPORT_C TAny* AllocZ(TInt aSize);
+	IMPORT_C TAny* AllocZL(TInt aSize);
+	IMPORT_C TAny* AllocL(TInt aSize);
+	IMPORT_C TAny* AllocLC(TInt aSize);
+	IMPORT_C void FreeZ(TAny*& aCell);
+	IMPORT_C TAny* ReAllocL(TAny* aCell, TInt aSize, TInt aMode=0);
+	IMPORT_C TInt Count() const;
+	IMPORT_C TInt Count(TInt& aFreeCount) const;
+#endif
+	UIMPORT_C void Check() const;
+	UIMPORT_C void __DbgMarkStart();
+	UIMPORT_C TUint32 __DbgMarkEnd(TInt aCount);
+	UIMPORT_C TInt __DbgMarkCheck(TBool aCountAll, TInt aCount, const TDesC8& aFileName, TInt aLineNum);
+	inline void __DbgMarkCheck(TBool aCountAll, TInt aCount, const TUint8* aFileName, TInt aLineNum);
+	UIMPORT_C void __DbgSetAllocFail(TAllocFail aType, TInt aRate);
+	UIMPORT_C void __DbgSetBurstAllocFail(TAllocFail aType, TUint aRate, TUint aBurst);
+	UIMPORT_C TUint __DbgCheckFailure();
+protected:
+	UIMPORT_C virtual TInt Extension_(TUint aExtensionId, TAny*& a0, TAny* a1);
+#ifndef __KERNEL_MODE__
+	IMPORT_C virtual void DoClose();
+#endif
+protected:
+	TInt iAccessCount;
+	TInt iHandleCount;
+	TInt* iHandles;
+	TUint32 iFlags;
+	TInt iCellCount;
+	TInt iTotalAllocSize;
+	};
+
+
+
+
+class UserHeap;
+/**
+@publishedAll
+@released
+
+Represents the default implementation for a heap.
+
+The default implementation uses an address-ordered first fit type algorithm.
+
+The heap itself is contained in a chunk and may be the only occupant of the 
+chunk or may share the chunk with the program stack.
+
+The class contains member functions for allocating, adjusting, freeing individual 
+cells and generally managing the heap.
+
+The class is not a handle in the same sense that RChunk is a handle; i.e. 
+there is no Kernel object which corresponds to the heap.
+*/
+class RHeap : public RAllocator
+	{
+public:
+    /**
+    The structure of a heap cell header for a heap cell on the free list.
+    */
+	struct SCell {
+	             /**
+	             The length of the cell, which includes the length of
+	             this header.
+	             */
+	             TInt len; 
+	             
+	             
+	             /**
+	             A pointer to the next cell in the free list.
+	             */
+	             SCell* next;
+	             };
+
+
+	/**
+    The structure of a heap cell header for an allocated heap cell in a debug build.
+    */             
+	struct SDebugCell {
+	                  /**
+	                  The length of the cell, which includes the length of
+                      this header.
+	                  */
+	                  TInt len;
+	                  
+	                  
+	                  /**
+	                  The nested level.
+	                  */
+	                  TInt nestingLevel;
+	                  
+	                  
+	                  /**
+	                  The cumulative number of allocated cells
+	                  */
+	                  TInt allocCount;
+	                  };
+
+	/**
+    @internalComponent
+    */
+	struct SHeapCellInfo { RHeap* iHeap; TInt iTotalAlloc;	TInt iTotalAllocSize; TInt iTotalFree; TInt iLevelAlloc; SDebugCell* iStranded; };
+
+	/**
+	@internalComponent
+	*/
+	struct _s_align {char c; double d;};
+
+	/** 
+	The default cell alignment.
+	*/
+	enum {ECellAlignment = sizeof(_s_align)-sizeof(double)};
+	
+	/**
+	Size of a free cell header.
+	*/
+	enum {EFreeCellSize = sizeof(SCell)};
+
+
+#ifdef _DEBUG
+    /**
+    Size of an allocated cell header in a debug build.
+    */
+	enum {EAllocCellSize = sizeof(SDebugCell)};
+#else
+    /**
+    Size of an allocated cell header in a release build.
+    */
+	enum {EAllocCellSize = sizeof(SCell*)};
+#endif
+
+
+    /**
+    @internalComponent
+    */
+	enum TDebugOp {EWalk=128};
+	
+	
+    /**
+    @internalComponent
+    */
+	enum TCellType
+		{EGoodAllocatedCell, EGoodFreeCell, EBadAllocatedCellSize, EBadAllocatedCellAddress,
+		EBadFreeCellAddress, EBadFreeCellSize};
+
+		
+    /**
+    @internalComponent
+    */
+	enum TDebugHeapId {EUser=0, EKernel=1};
+    
+    /**
+    @internalComponent
+    */
+    enum TDefaultShrinkRatios {EShrinkRatio1=256, EShrinkRatioDflt=512};
+
+#ifndef SYMBIAN_ENABLE_SPLIT_HEADERS
+	/**
+    @internalComponent
+    */
+#else
+private:
+#endif
+    typedef void (*TWalkFunc)(TAny*, TCellType, TAny*, TInt);
+
+public:
+	UIMPORT_C virtual TAny* Alloc(TInt aSize);
+	UIMPORT_C virtual void Free(TAny* aPtr);
+	UIMPORT_C virtual TAny* ReAlloc(TAny* aPtr, TInt aSize, TInt aMode=0);
+	UIMPORT_C virtual TInt AllocLen(const TAny* aCell) const;
+#ifndef __KERNEL_MODE__
+	UIMPORT_C virtual TInt Compress();
+	UIMPORT_C virtual void Reset();
+	UIMPORT_C virtual TInt AllocSize(TInt& aTotalAllocSize) const;
+	UIMPORT_C virtual TInt Available(TInt& aBiggestBlock) const;
+#endif
+	UIMPORT_C virtual TInt DebugFunction(TInt aFunc, TAny* a1=NULL, TAny* a2=NULL);
+protected:
+	UIMPORT_C virtual TInt Extension_(TUint aExtensionId, TAny*& a0, TAny* a1);
+public:
+	UIMPORT_C RHeap(TInt aMaxLength, TInt aAlign=0, TBool aSingleThread=ETrue);
+	UIMPORT_C RHeap(TInt aChunkHandle, TInt aOffset, TInt aMinLength, TInt aMaxLength, TInt aGrowBy, TInt aAlign=0, TBool aSingleThread=EFalse);
+	UIMPORT_C TAny* operator new(TUint aSize, TAny* aBase) __NO_THROW;
+	inline void operator delete(TAny* aPtr, TAny* aBase);
+	inline TUint8* Base() const;
+	inline TInt Size() const;
+	inline TInt MaxLength() const;
+	inline TInt Align(TInt a) const;
+	inline const TAny* Align(const TAny* a) const;
+	inline TBool IsLastCell(const SCell* aCell) const;
+	inline void Lock() const;
+	inline void Unlock() const;
+	inline TInt ChunkHandle() const;
+protected:
+	inline RHeap();
+	void Initialise();
+	SCell* DoAlloc(TInt aSize, SCell*& aLastFree);
+	void DoFree(SCell* pC);
+	TInt TryToGrowHeap(TInt aSize, SCell* aLastFree);
+	inline void FindFollowingFreeCell(SCell* aCell, SCell*& pPrev, SCell*& aNext);
+	TInt TryToGrowCell(SCell* pC, SCell* pP, SCell* pE, TInt aSize);
+	TInt Reduce(SCell* aCell);
+	UIMPORT_C SCell* GetAddress(const TAny* aCell) const;
+	void CheckCell(const SCell* aCell) const;
+	void Walk(TWalkFunc aFunc, TAny* aPtr);
+	static void WalkCheckCell(TAny* aPtr, TCellType aType, TAny* aCell, TInt aLen);
+	TInt DoCountAllocFree(TInt& aFree);
+	TInt DoCheckHeap(SCheckInfo* aInfo);
+	void DoMarkStart();
+	TUint32 DoMarkEnd(TInt aExpected);
+	void DoSetAllocFail(TAllocFail aType, TInt aRate);
+	TBool CheckForSimulatedAllocFail();
+	inline TInt SetBrk(TInt aBrk);
+	inline TAny* ReAllocImpl(TAny* aPtr, TInt aSize, TInt aMode);
+	void DoSetAllocFail(TAllocFail aType, TInt aRate, TUint aBurst);
+protected:
+	TInt iMinLength;
+	TInt iMaxLength;
+	TInt iOffset;
+	TInt iGrowBy;
+	TInt iChunkHandle;
+	RFastLock iLock;
+	TUint8* iBase;
+	TUint8* iTop;
+	TInt iAlign;
+	TInt iMinCell;
+	TInt iPageSize;
+	SCell iFree;
+protected:
+	TInt iNestingLevel;
+	TInt iAllocCount;
+	TAllocFail iFailType;
+	TInt iFailRate;
+	TBool iFailed;
+	TInt iFailAllocCount;
+	TInt iRand;
+	TAny* iTestData;
+
+	friend class UserHeap;
+	};
+
+
+
+
+
+class OnlyCreateWithNull;
+
+/** @internalTechnology */
+typedef void (OnlyCreateWithNull::* __NullPMF)();
+
+/** @internalTechnology */
+class OnlyCreateWithNull
+	{
+public:
+	inline OnlyCreateWithNull(__NullPMF /*aPointerToNull*/) {}
+	};
+
+/**
+@publishedAll
+@released
+
+A handle to a message sent by the client to the server.
+
+A server's interaction with its clients is channelled through an RMessagePtr2
+object, which acts as a handle to a message sent by the client.
+The details of the original message are kept by the kernel allowing it enforce
+correct usage of the member functions of this class.
+
+@see RMessage2
+*/
+class RMessagePtr2
+	{
+public:
+	inline RMessagePtr2();
+	inline TBool IsNull() const;
+	inline TInt Handle() const;
+#ifndef __KERNEL_MODE__
+	IMPORT_C void Complete(TInt aReason) const;
+	IMPORT_C void Complete(RHandleBase aHandle) const;
+	IMPORT_C TInt GetDesLength(TInt aParam) const;
+	IMPORT_C TInt GetDesLengthL(TInt aParam) const;
+	IMPORT_C TInt GetDesMaxLength(TInt aParam) const;
+	IMPORT_C TInt GetDesMaxLengthL(TInt aParam) const;
+	IMPORT_C void ReadL(TInt aParam,TDes8& aDes,TInt aOffset=0) const;
+	IMPORT_C void ReadL(TInt aParam,TDes16 &aDes,TInt aOffset=0) const;
+	IMPORT_C void WriteL(TInt aParam,const TDesC8& aDes,TInt aOffset=0) const;
+	IMPORT_C void WriteL(TInt aParam,const TDesC16& aDes,TInt aOffset=0) const;
+	IMPORT_C TInt Read(TInt aParam,TDes8& aDes,TInt aOffset=0) const;
+	IMPORT_C TInt Read(TInt aParam,TDes16 &aDes,TInt aOffset=0) const;
+	IMPORT_C TInt Write(TInt aParam,const TDesC8& aDes,TInt aOffset=0) const;
+	IMPORT_C TInt Write(TInt aParam,const TDesC16& aDes,TInt aOffset=0) const;
+	IMPORT_C void Panic(const TDesC& aCategory,TInt aReason) const;
+	IMPORT_C void Kill(TInt aReason) const;
+	IMPORT_C void Terminate(TInt aReason) const;
+	IMPORT_C TInt SetProcessPriority(TProcessPriority aPriority) const;
+	inline   void SetProcessPriorityL(TProcessPriority aPriority) const;
+	IMPORT_C TInt Client(RThread& aClient, TOwnerType aOwnerType=EOwnerProcess) const;
+	inline   void ClientL(RThread& aClient, TOwnerType aOwnerType=EOwnerProcess) const;
+	IMPORT_C TUint ClientProcessFlags() const;
+	IMPORT_C const TRequestStatus* ClientStatus() const;
+
+	/**
+	Return the Secure ID of the process which sent this message.
+
+	If an intended use of this method is to check that the Secure ID is
+	a given value, then the use of a TSecurityPolicy object should be
+	considered. E.g. Instead of something like:
+
+	@code
+		RMessagePtr2& message;
+		TInt error = message.SecureId()==KRequiredSecureId ? KErrNone : KErrPermissionDenied;
+	@endcode
+
+	this could be used;
+
+	@code
+		RMessagePtr2& message;
+		static _LIT_SECURITY_POLICY_S0(mySidPolicy, KRequiredSecureId);
+		TBool pass = mySidPolicy().CheckPolicy(message);
+	@endcode
+
+	This has the benefit that the TSecurityPolicy::CheckPolicy methods are
+	configured by the system wide Platform Security configuration. I.e. are
+	capable of emitting diagnostic messages when a check fails and/or the
+	check can be forced to always pass.
+
+	@see TSecurityPolicy::CheckPolicy(RMessagePtr2 aMsgPtr, const char* aDiagnostic) const
+	@see _LIT_SECURITY_POLICY_S0
+
+	@return The Secure ID.
+
+	@publishedAll
+	@released
+	*/
+	IMPORT_C TSecureId SecureId() const;
+
+	/**
+	Return the Vendor ID of the process which sent this message.
+
+	If an intended use of this method is to check that the Vendor ID is
+	a given value, then the use of a TSecurityPolicy object should be
+	considered. E.g. Instead of something like:
+
+	@code
+		RMessagePtr2& message;
+		TInt error = message.VendorId()==KRequiredVendorId ? KErrNone : KErrPermissionDenied;
+	@endcode
+
+	this could be used;
+
+	@code
+		RMessagePtr2& message;
+		static _LIT_SECURITY_POLICY_V0(myVidPolicy, KRequiredVendorId);
+		TBool pass = myVidPolicy().CheckPolicy(message);
+	@endcode
+
+	This has the benefit that the TSecurityPolicy::CheckPolicy methods are
+	configured by the system wide Platform Security configuration. I.e. are
+	capable of emitting diagnostic messages when a check fails and/or the
+	check can be forced to always pass.
+
+	@see TSecurityPolicy::CheckPolicy(RMessagePtr2 aMsgPtr, const char* aDiagnostic) const
+	@see _LIT_SECURITY_POLICY_V0
+
+	@return The Vendor ID.
+	@publishedAll
+	@released
+	*/
+	IMPORT_C TVendorId VendorId() const;
+
+	/**
+	Check if the process which sent this message has a given capability.
+
+	When a check fails the action taken is determined by the system wide Platform Security
+	configuration. If PlatSecDiagnostics is ON, then a diagnostic message is emitted.
+	If PlatSecEnforcement is OFF, then this function will return ETrue even though the
+	check failed.
+
+	@param aCapability The capability to test.
+	@param aDiagnostic A string that will be emitted along with any diagnostic message
+								that may be issued if the test finds the capability is not present.
+								This string must be enclosed in the __PLATSEC_DIAGNOSTIC_STRING macro
+								which enables it to be easily removed from the system.
+	@return ETrue if process which sent this message has the capability, EFalse otherwise.
+	@publishedAll
+	@released
+	*/
+#ifndef __REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__
+	inline TBool HasCapability(TCapability aCapability, const char* aDiagnostic=0) const;
+#else //__REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__
+	// Only available to NULL arguments
+	inline TBool HasCapability(TCapability aCapability, OnlyCreateWithNull aDiagnostic=NULL) const;
+#ifndef __REMOVE_PLATSEC_DIAGNOSTICS__
+	// For things using KSuppressPlatSecDiagnostic
+	inline TBool HasCapability(TCapability aCapability, OnlyCreateWithNull aDiagnostic, OnlyCreateWithNull aSuppress) const;
+#endif // !__REMOVE_PLATSEC_DIAGNOSTICS__
+#endif // !__REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__
+
+ 	/**
+	Check if the process which sent this message has a given capability.
+
+	When a check fails the action taken is determined by the system wide Platform Security
+	configuration. If PlatSecDiagnostics is ON, then a diagnostic message is emitted.
+	If PlatSecEnforcement is OFF, then this function will not leave even though the
+	check failed.
+
+ 	@param aCapability The capability to test.
+ 	@param aDiagnosticMessage A string that will be emitted along with any diagnostic message
+ 								that may be issued if the test finds the capability is not present.
+ 								This string must be enclosed in the __PLATSEC_DIAGNOSTIC_STRING macro
+ 								which enables it to be easily removed from the system.
+ 	@leave KErrPermissionDenied, if the process does not have the capability.
+ 	@publishedAll
+ 	@released
+ 	*/
+#ifndef __REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__
+ 	inline void HasCapabilityL(TCapability aCapability, const char* aDiagnosticMessage=0) const;
+#else //__REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__
+	// Only available to NULL arguments
+ 	inline void HasCapabilityL(TCapability aCapability, OnlyCreateWithNull aDiagnosticMessage=NULL) const;
+#ifndef __REMOVE_PLATSEC_DIAGNOSTICS__
+	// For things using KSuppressPlatSecDiagnostic
+	inline void HasCapabilityL(TCapability aCapability, OnlyCreateWithNull aDiagnostic, OnlyCreateWithNull aSuppress) const;
+#endif // !__REMOVE_PLATSEC_DIAGNOSTICS__
+#endif // !__REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__
+
+	/**
+	Check if the process which sent this message has both of the given capabilities.
+
+	When a check fails the action taken is determined by the system wide Platform Security
+	configuration. If PlatSecDiagnostics is ON, then a diagnostic message is emitted.
+	If PlatSecEnforcement is OFF, then this function will return ETrue even though the
+	check failed.
+
+	@param aCapability1 The first capability to test.
+	@param aCapability2 The second capability to test.
+	@param aDiagnostic A string that will be emitted along with any diagnostic message
+								that may be issued if the test finds a capability is not present.
+								This string should be enclosed in the __PLATSEC_DIAGNOSTIC_STRING macro
+								which enables it to be easily removed from the system.
+	@return ETrue if the process which sent this message has both the capabilities, EFalse otherwise.
+	@publishedAll
+	@released
+	*/
+#ifndef __REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__
+	inline TBool HasCapability(TCapability aCapability1, TCapability aCapability2, const char* aDiagnostic=0) const;
+#else //__REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__
+	// Only available to NULL arguments
+	inline TBool HasCapability(TCapability aCapability1, TCapability aCapability2, OnlyCreateWithNull aDiagnostic=NULL) const;
+#ifndef __REMOVE_PLATSEC_DIAGNOSTICS__
+	// For things using KSuppressPlatSecDiagnostic
+	inline TBool HasCapability(TCapability aCapability1, TCapability aCapability2, OnlyCreateWithNull aDiagnostic, OnlyCreateWithNull aSuppress) const;
+#endif // !__REMOVE_PLATSEC_DIAGNOSTICS__
+#endif // !__REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__
+
+ 	/**
+	Check if the process which sent this message has both of the given capabilities.
+
+	When a check fails the action taken is determined by the system wide Platform Security
+	configuration. If PlatSecDiagnostics is ON, then a diagnostic message is emitted.
+	If PlatSecEnforcement is OFF, then this function will not leave even though the
+	check failed.
+
+ 	@param aCapability1 The first capability to test.
+ 	@param aCapability2 The second capability to test.
+ 	@param aDiagnosticMessage A string that will be emitted along with any diagnostic message
+ 								that may be issued if the test finds a capability is not present.
+ 								This string should be enclosed in the __PLATSEC_DIAGNOSTIC_STRING macro
+ 								which enables it to be easily removed from the system.
+ 	@leave KErrPermissionDenied, if the process does not have the capabilities.
+ 	@publishedAll
+ 	@released
+ 	*/
+#ifndef __REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__
+	inline void HasCapabilityL(TCapability aCapability1, TCapability aCapability2, const char* aDiagnosticMessage=0) const;
+#else //__REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__
+	// Only available to NULL arguments
+	inline void HasCapabilityL(TCapability aCapability1, TCapability aCapability2, OnlyCreateWithNull aDiagnosticMessage=NULL) const;
+#ifndef __REMOVE_PLATSEC_DIAGNOSTICS__
+	// For things using KSuppressPlatSecDiagnostic
+	inline void HasCapabilityL(TCapability aCapability1, TCapability aCapability2, OnlyCreateWithNull aDiagnostic, OnlyCreateWithNull aSuppress) const;
+#endif // !__REMOVE_PLATSEC_DIAGNOSTICS__
+#endif // !__REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__
+
+	/**
+	@deprecated Use SecureId()
+	*/
+	inline TUid Identity() const { return SecureId(); }
+#endif
+
+private:
+	// Implementations of functions with diagnostics
+	IMPORT_C TBool DoHasCapability(TCapability aCapability, const char* aDiagnostic) const;
+	IMPORT_C TBool DoHasCapability(TCapability aCapability) const;
+	IMPORT_C TBool DoHasCapability(TCapability aCapability, TCapability aCapability2, const char* aDiagnostic) const;
+	IMPORT_C TBool DoHasCapability(TCapability aCapability, TCapability aCapability2) const;
+
+protected:
+	TInt iHandle;
+	};
+inline TBool operator==(RMessagePtr2 aLeft,RMessagePtr2 aRight);
+inline TBool operator!=(RMessagePtr2 aLeft,RMessagePtr2 aRight);
+
+class CSession2;
+
+#define __IPC_V2_PRESENT__
+
+/**
+@publishedAll
+@released
+
+An object that encapsulates the details of a client request.
+*/
+class RMessage2 : public RMessagePtr2
+	{
+	friend class CServer2;
+public:
+
+    /**
+    Defines internal message types.
+    */
+	enum TSessionMessages {
+	                      /**
+	                      A message type used internally that means connect.
+	                      */
+	                      EConnect=-1,
+	                      
+	                      /**
+                          A message type used internally that means disconnect.
+	                      */
+	                      EDisConnect=-2
+	                      };
+public:
+	inline RMessage2();
+#ifndef __KERNEL_MODE__
+	IMPORT_C explicit RMessage2(const RMessagePtr2& aPtr);
+	void SetAuthorised() const; 
+	void ClearAuthorised() const;
+	TBool Authorised() const;
+#endif
+	inline TInt Function() const;
+	inline TInt Int0() const;
+	inline TInt Int1() const;
+	inline TInt Int2() const;
+	inline TInt Int3() const;
+	inline const TAny* Ptr0() const;
+	inline const TAny* Ptr1() const;
+	inline const TAny* Ptr2() const;
+	inline const TAny* Ptr3() const;
+	inline CSession2* Session() const;
+protected:
+    
+    /**
+    The request type.
+    */
+	TInt iFunction;
+	
+	/**
+	A copy of the message arguments.
+	*/
+	TInt iArgs[KMaxMessageArguments];
+private:
+	TInt iSpare1;
+protected:
+    /**
+    @internalComponent
+    */
+	const TAny* iSessionPtr;
+private:
+	mutable TInt iFlags;// Currently only used for *Authorised above
+	TInt iSpare3;		// Reserved for future use
+
+	friend class RMessage;
+	};
+
+
+
+
+/**
+@publishedAll
+@released
+
+Defines an 8-bit modifiable buffer descriptor to contain passwords when dealing
+with password security support in a file server session.
+
+The descriptor takes a maximum length of KMaxMediaPassword.
+
+@see KMaxMediaPassword
+*/
+typedef TBuf8<KMaxMediaPassword> TMediaPassword;	// 128 bit
+
+
+
+/**
+@publishedPartner
+@prototype
+A configuration flag for the shared chunk buffer configuration class (used by the multimedia device drivers). This being
+set signifies that a buffer offset list follows the buffer configuration class. This list holds the offset of each buffer.
+*/
+const TUint KScFlagBufOffsetListInUse=0x00000001;
+
+/**
+@publishedPartner
+@prototype
+A configuration flag for the shared chunk buffer configuration class (used by the multimedia device drivers). This being
+set is a suggestion that the shared chunk should be configured leaving guard pages around each buffers.
+*/
+const TUint KScFlagUseGuardPages=0x00000002;
+
+/**
+@publishedPartner
+@prototype
+The shared chunk buffer configuration class (used by the multimedia device drivers). This is used to hold information
+on the current buffer configuration within a shared chunk.
+*/
+class TSharedChunkBufConfigBase
+	{
+public:	
+	inline TSharedChunkBufConfigBase();
+public:
+	/** The number of buffers. */
+	TInt iNumBuffers;
+	/** The size of each buffer in bytes. */
+	TInt iBufferSizeInBytes;
+	/** Reserved field. */
+	TInt iReserved1;
+	/** Shared chunk buffer flag settings. */
+	TUint iFlags;
+	};
+
+
+/** Maximum size of capability set
+
+@internalTechnology
+*/
+const TInt KCapabilitySetMaxSize = (((TInt)ECapability_HardLimit + 7)>>3);
+
+/** Maximum size of any future extension to TSecurityPolicy
+
+@internalTechnology
+*/
+const TInt KMaxSecurityPolicySize = KCapabilitySetMaxSize + 3*sizeof(TUint32);
+
+
+/** Class representing an arbitrary set of capabilities.
+
+This class can only contain capabilities supported by the current OS version.
+
+@publishedAll
+@released
+*/
+class TCapabilitySet
+	{
+public:
+	inline TCapabilitySet();
+	inline TCapabilitySet(TCapability aCapability);
+	IMPORT_C TCapabilitySet(TCapability aCapability1, TCapability aCapability2);
+	IMPORT_C void SetEmpty();
+	inline void Set(TCapability aCapability);
+	inline void Set(TCapability aCapability1, TCapability aCapability2);
+	IMPORT_C void SetAllSupported();
+	IMPORT_C void AddCapability(TCapability aCapability);
+	IMPORT_C void RemoveCapability(TCapability aCapability);
+	IMPORT_C void Union(const TCapabilitySet&  aCapabilities);
+	IMPORT_C void Intersection(const TCapabilitySet& aCapabilities);
+	IMPORT_C void Remove(const TCapabilitySet& aCapabilities);
+	IMPORT_C TBool HasCapability(TCapability aCapability) const;
+	IMPORT_C TBool HasCapabilities(const TCapabilitySet& aCapabilities) const;
+
+	/**
+	Make this set consist of the capabilities which are disabled on this platform.
+	@internalTechnology
+	*/
+	IMPORT_C void SetDisabled();
+	/**
+	@internalComponent
+	*/
+	TBool NotEmpty() const;
+
+private:
+	TUint32 iCaps[KCapabilitySetMaxSize / sizeof(TUint32)];
+	};
+
+#ifndef __SECURITY_INFO_DEFINED__
+#define __SECURITY_INFO_DEFINED__
+/**
+@internalTechnology
+ */
+struct SCapabilitySet
+	{
+	enum {ENCapW=2};
+
+	inline void AddCapability(TCapability aCap1) {((TCapabilitySet*)this)->AddCapability(aCap1);}
+	inline void Remove(const SCapabilitySet& aCaps) {((TCapabilitySet*)this)->Remove(*((TCapabilitySet*)&aCaps));}
+	inline TBool NotEmpty() const {return ((TCapabilitySet*)this)->NotEmpty();}
+
+	inline const TUint32& operator[] (TInt aIndex) const { return iCaps[aIndex]; }
+	inline TUint32& operator[] (TInt aIndex) { return iCaps[aIndex]; }
+
+	TUint32 iCaps[ENCapW];
+	};
+
+/**
+@internalTechnology
+ */
+struct SSecurityInfo
+	{
+	TUint32	iSecureId;
+	TUint32	iVendorId;
+	SCapabilitySet iCaps;	// Capabilities re. platform security
+	};
+
+#endif
+
+/** Define this macro to reference the set of all capabilities.
+	@internalTechnology
+*/
+#ifdef __REFERENCE_ALL_SUPPORTED_CAPABILITIES__
+
+extern const SCapabilitySet AllSupportedCapabilities;
+
+#endif	//__REFERENCE_ALL_SUPPORTED_CAPABILITIES__
+
+/** Define this macro to include the set of all capabilities.
+	@internalTechnology
+*/
+#ifdef __INCLUDE_ALL_SUPPORTED_CAPABILITIES__
+
+/** The set of all capabilities.
+	@internalTechnology
+*/
+const SCapabilitySet AllSupportedCapabilities = {
+		{
+		ECapability_Limit<32  ? (TUint32)((1u<<(ECapability_Limit&31))-1u) : 0xffffffffu
+		,
+		ECapability_Limit>=32 ? (TUint32)((1u<<(ECapability_Limit&31))-1u) : 0u
+		}
+	};
+
+#endif	// __INCLUDE_ALL_SUPPORTED_CAPABILITIES__
+
+#ifndef __KERNEL_MODE__
+class RProcess;
+class RThread;
+class RMessagePtr2;
+class RSessionBase;
+#else
+class DProcess;
+class DThread;
+#endif
+
+/** Class representing all security attributes of a process or DLL.
+	These comprise a set of capabilities, a Secure ID and a Vendor ID.
+
+@publishedAll
+@released
+*/
+class TSecurityInfo
+	{
+public:
+	inline TSecurityInfo();
+#ifdef __KERNEL_MODE__
+	IMPORT_C TSecurityInfo(DProcess* aProcess);
+	IMPORT_C TSecurityInfo(DThread* aThread);
+#else
+	IMPORT_C TSecurityInfo(RProcess aProcess);
+	IMPORT_C TSecurityInfo(RThread aThread);
+	IMPORT_C TSecurityInfo(RMessagePtr2 aMesPtr);
+	inline void Set(RProcess aProcess);
+	inline void Set(RThread aThread);
+	inline void Set(RMessagePtr2 aMsgPtr);
+	TInt Set(RSessionBase aSession); /**< @internalComponent */
+	inline void SetToCurrentInfo();
+	IMPORT_C void SetToCreatorInfo();
+#endif //__KERNEL_MODE__
+public:
+	TSecureId		iSecureId;	/**< Secure ID */
+	TVendorId		iVendorId;	/**< Vendor ID */
+	TCapabilitySet	iCaps;		/**< Capability Set */
+	};
+
+
+/** Class representing a generic security policy
+
+This class can specify a security policy consisting of either:
+
+-#	A check for between 0 and 7 capabilities
+-#	A check for a given Secure ID along with 0-3 capabilities
+-#	A check for a given Vendor ID along with 0-3 capabilities
+
+If multiple capabilities are specified, all of them must be present for the
+security check to succeed ('AND' relation).
+
+The envisaged use case for this class is to specify access rights to an object
+managed either by the kernel or by a server but in principle owned by a client
+and usable in a limited way by other clients. For example
+- Publish and Subscribe properties
+- DBMS databases
+
+In these cases the owning client would pass one (or more) of these objects to
+the server to specify which security checks should be done on other clients
+before allowing access to the object.
+
+To pass a TSecurityPolicy object via IPC, a client should obtain a descriptor
+for the object using Package() and send this. When a server receives this descriptor
+it should read the descriptor contents into a TSecurityPolicyBuf and then
+Set() should be used to create a policy object from this.
+
+Because this class has non-default constructors, compilers will not initialise
+this object at compile time, instead code will be generated to construct the object
+at run-time. This is wasteful - and Symbian OS DLLs are not permitted to have
+such uninitialised data. To overcome these problems a set of macros are provided to
+construct a const object which behaves like a TSecurityPolicy. These are:
+
+_LIT_SECURITY_POLICY_C1 through _LIT_SECURITY_POLICY_C7,
+_LIT_SECURITY_POLICY_S0 through _LIT_SECURITY_POLICY_S3 and
+_LIT_SECURITY_POLICY_V0 through _LIT_SECURITY_POLICY_V3.
+
+Also, the macros _LIT_SECURITY_POLICY_PASS and _LIT_SECURITY_POLICY_FAIL are provided
+in order to allow easy construction of a const object which can be used as a
+TSecuityPolicy which always passes or always fails, respectively.
+
+If a security policy object is needed to be embedded in another class then the
+TStaticSecurityPolicy structure can be used. This behaves in the same way as a
+TSecurityPolicy object but may be initialised at compile time.
+
+@see TStaticSecurityPolicy
+@see TSecurityPolicyBuf
+@see _LIT_SECURITY_POLICY_PASS
+@see _LIT_SECURITY_POLICY_FAIL
+@see _LIT_SECURITY_POLICY_C1
+@see _LIT_SECURITY_POLICY_C2 
+@see _LIT_SECURITY_POLICY_C3 
+@see _LIT_SECURITY_POLICY_C4 
+@see _LIT_SECURITY_POLICY_C5 
+@see _LIT_SECURITY_POLICY_C6 
+@see _LIT_SECURITY_POLICY_C7 
+@see _LIT_SECURITY_POLICY_S0 
+@see _LIT_SECURITY_POLICY_S1 
+@see _LIT_SECURITY_POLICY_S2 
+@see _LIT_SECURITY_POLICY_S3 
+@see _LIT_SECURITY_POLICY_V0 
+@see _LIT_SECURITY_POLICY_V1 
+@see _LIT_SECURITY_POLICY_V2 
+@see _LIT_SECURITY_POLICY_V3 
+
+@publishedAll
+@released
+*/
+class TSecurityPolicy
+	{
+public:
+	enum TSecPolicyType 
+		{
+		EAlwaysFail=0,
+		EAlwaysPass=1,
+		};
+		
+public:
+	inline TSecurityPolicy();
+	IMPORT_C TSecurityPolicy(TSecPolicyType aType);
+	IMPORT_C TSecurityPolicy(TCapability aCap1, TCapability aCap2 = ECapability_None, TCapability aCap3 = ECapability_None);
+	IMPORT_C TSecurityPolicy(TCapability aCap1, TCapability aCap2, TCapability aCap3, TCapability aCap4, TCapability aCap5 = ECapability_None, TCapability aCap6 = ECapability_None, TCapability aCap7 = ECapability_None);
+	IMPORT_C TSecurityPolicy(TSecureId aSecureId, TCapability aCap1 = ECapability_None, TCapability aCap2 = ECapability_None, TCapability aCap3 = ECapability_None);
+	IMPORT_C TSecurityPolicy(TVendorId aVendorId, TCapability aCap1 = ECapability_None, TCapability aCap2 = ECapability_None, TCapability aCap3 = ECapability_None);
+	IMPORT_C TInt Set(const TDesC8& aDes);
+	IMPORT_C TPtrC8 Package() const;
+
+#ifdef __KERNEL_MODE__
+
+#ifndef __REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__
+	inline TBool CheckPolicy(DProcess* aProcess, const char* aDiagnostic=0) const;
+	inline TBool CheckPolicy(DThread* aThread, const char* aDiagnostic=0) const;
+#else //__REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__
+	// Only available to NULL arguments
+	inline TBool CheckPolicy(DProcess* aProcess, OnlyCreateWithNull aDiagnostic=NULL) const;
+	inline TBool CheckPolicy(DThread* aThread, OnlyCreateWithNull aDiagnostic=NULL) const;
+#endif // !__REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__
+
+#else // !__KERNEL_MODE__
+
+#ifndef __REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__
+	inline TBool CheckPolicy(RProcess aProcess, const char* aDiagnostic=0) const;
+	inline TBool CheckPolicy(RThread aThread, const char* aDiagnostic=0) const;
+	inline TBool CheckPolicy(RMessagePtr2 aMsgPtr, const char* aDiagnostic=0) const;
+	inline TBool CheckPolicy(RMessagePtr2 aMsgPtr, TSecurityInfo& aMissing, const char* aDiagnostic=0) const;
+	inline TBool CheckPolicyCreator(const char* aDiagnostic=0) const;
+#else //__REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__
+	// Only available to NULL arguments
+	inline TBool CheckPolicy(RProcess aProcess, OnlyCreateWithNull aDiagnostic=NULL) const;
+	inline TBool CheckPolicy(RThread aThread, OnlyCreateWithNull aDiagnostic=NULL) const;
+	inline TBool CheckPolicy(RMessagePtr2 aMsgPtr, OnlyCreateWithNull aDiagnostic=NULL) const;
+	inline TBool CheckPolicy(RMessagePtr2 aMsgPtr, TSecurityInfo& aMissing, OnlyCreateWithNull aDiagnostic=NULL) const;
+	inline TBool CheckPolicyCreator(OnlyCreateWithNull aDiagnostic=NULL) const;
+#ifndef __REMOVE_PLATSEC_DIAGNOSTICS__
+	// For things using KSuppressPlatSecDiagnostic
+	inline TBool CheckPolicy(RProcess aProcess, OnlyCreateWithNull aDiagnostic, OnlyCreateWithNull aSuppress) const;
+	inline TBool CheckPolicy(RThread aThread, OnlyCreateWithNull aDiagnostic, OnlyCreateWithNull aSuppress) const;
+	inline TBool CheckPolicy(RMessagePtr2 aMsgPtr, OnlyCreateWithNull aDiagnostic, OnlyCreateWithNull aSuppress) const;
+	inline TBool CheckPolicy(RMessagePtr2 aMsgPtr, TSecurityInfo& aMissing, OnlyCreateWithNull aDiagnostic, OnlyCreateWithNull aSuppress) const;
+	inline TBool CheckPolicyCreator(OnlyCreateWithNull aDiagnostic, OnlyCreateWithNull aSuppress) const;
+#endif // !__REMOVE_PLATSEC_DIAGNOSTICS__
+#endif // !__REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__
+	TInt CheckPolicy(RSessionBase aSession) const; /**< @internalComponent */
+
+#endif //__KERNEL_MODE__
+
+	TBool Validate() const;
+
+private:
+#ifdef __KERNEL_MODE__
+	IMPORT_C TBool DoCheckPolicy(DProcess* aProcess, const char* aDiagnostic) const;
+	IMPORT_C TBool DoCheckPolicy(DProcess* aProcess) const;
+	IMPORT_C TBool DoCheckPolicy(DThread* aThread, const char* aDiagnostic) const;
+	IMPORT_C TBool DoCheckPolicy(DThread* aThread) const;
+#else // !__KERNEL_MODE__
+	IMPORT_C TBool DoCheckPolicy(RProcess aProcess, const char* aDiagnostic) const;
+	IMPORT_C TBool DoCheckPolicy(RProcess aProcess) const;
+	IMPORT_C TBool DoCheckPolicy(RThread aThread, const char* aDiagnostic) const;
+	IMPORT_C TBool DoCheckPolicy(RThread aThread) const;
+	IMPORT_C TBool DoCheckPolicy(RMessagePtr2 aMsgPtr, const char* aDiagnostic) const;
+	IMPORT_C TBool DoCheckPolicy(RMessagePtr2 aMsgPtr) const;
+	IMPORT_C TBool DoCheckPolicyCreator(const char* aDiagnostic) const;
+	IMPORT_C TBool DoCheckPolicyCreator() const;
+#ifndef __REMOVE_PLATSEC_DIAGNOSTICS__
+	TBool DoCheckPolicy(RMessagePtr2 aMsgPtr, TSecurityInfo& aMissing, const char* aDiagnostic) const;
+#endif //__REMOVE_PLATSEC_DIAGNOSTICS__
+	TBool DoCheckPolicy(RMessagePtr2 aMsgPtr, TSecurityInfo& aMissing) const;
+#endif //__KERNEL_MODE__
+
+public:
+	/** Constants to specify the type of TSecurityPolicy objects.
+	*/
+	enum TType
+		{
+		ETypeFail=0,	/**< Always fail*/
+		ETypePass=1,	/**< Always pass*/
+		ETypeC3=2,		/**< Up to 3 capabilities*/
+		ETypeC7=3,		/**< Up to 7 capabilities*/
+		ETypeS3=4,		/**< Secure ID and up to 3 capabilities*/
+		ETypeV3=5,		/**< Vendor ID and up to 3 capabilities*/
+
+		/** The number of possible TSecurityPolicy types
+		This is intended of internal Symbain use only.
+		@internalTechnology
+		*/
+		ETypeLimit
+
+		// other values may be added to indicate expanded policy objects (future extensions)
+		};
+protected:
+	TBool CheckPolicy(const SSecurityInfo& aSecInfo, SSecurityInfo& aMissing) const;
+private:
+	void ConstructAndCheck3(TCapability aCap1, TCapability aCap2, TCapability aCap3);
+private:
+	TUint8 iType;
+	TUint8 iCaps[3];				// missing capabilities are set to 0xff
+	union
+		{
+		TUint32 iSecureId;
+		TUint32 iVendorId;
+		TUint8 iExtraCaps[4];		// missing capabilities are set to 0xff
+		};
+	friend class TCompiledSecurityPolicy;
+	};
+
+/** Provides a TPkcgBuf wrapper for a descriptorised TSecurityPolicy.  This a
+suitable container for passing a security policy across IPC.
+@publishedAll
+@released
+*/
+typedef TPckgBuf<TSecurityPolicy> TSecurityPolicyBuf;
+
+
+/** Structure for compile-time initialisation of a security policy.
+
+This structure behaves in the same way as a TSecurityPolicy object but has
+the advantage that it may be initialised at compile time. E.g.
+the following line defines a security policy 'KSecurityPolictReadUserData'
+which checks ReadUserData capability.
+
+@code
+_LIT_SECURITY_POLICY_C1(KSecurityPolictReadUserData,ECapabilityReadUserData)
+@endcode
+
+Or, an array of security policies may be created like this:
+@code
+static const TStaticSecurityPolicy MyPolicies[] = 
+	{
+	_INIT_SECURITY_POLICY_C1(ECapabilityReadUserData),
+	_INIT_SECURITY_POLICY_PASS(),
+	_INIT_SECURITY_POLICY_S0(0x1234567)
+	}
+@endcode
+
+This class should not be initialised directly, instead one of the following
+macros should be used:
+
+-	_INIT_SECURITY_POLICY_PASS
+-	_INIT_SECURITY_POLICY_FAIL
+-	_INIT_SECURITY_POLICY_C1
+-	_INIT_SECURITY_POLICY_C2
+-	_INIT_SECURITY_POLICY_C3
+-	_INIT_SECURITY_POLICY_C4
+-	_INIT_SECURITY_POLICY_C5
+-	_INIT_SECURITY_POLICY_C6
+-	_INIT_SECURITY_POLICY_C7
+-	_INIT_SECURITY_POLICY_S0
+-	_INIT_SECURITY_POLICY_S1
+-	_INIT_SECURITY_POLICY_S2
+-	_INIT_SECURITY_POLICY_S3
+-	_INIT_SECURITY_POLICY_V0
+-	_INIT_SECURITY_POLICY_V1
+-	_INIT_SECURITY_POLICY_V2
+-	_INIT_SECURITY_POLICY_V3
+-	_LIT_SECURITY_POLICY_PASS
+-	_LIT_SECURITY_POLICY_FAIL
+-	_LIT_SECURITY_POLICY_C1
+-	_LIT_SECURITY_POLICY_C2
+-	_LIT_SECURITY_POLICY_C3
+-	_LIT_SECURITY_POLICY_C4
+-	_LIT_SECURITY_POLICY_C5
+-	_LIT_SECURITY_POLICY_C6
+-	_LIT_SECURITY_POLICY_C7
+-	_LIT_SECURITY_POLICY_S0
+-	_LIT_SECURITY_POLICY_S1
+-	_LIT_SECURITY_POLICY_S2
+-	_LIT_SECURITY_POLICY_S3
+-	_LIT_SECURITY_POLICY_V0
+-	_LIT_SECURITY_POLICY_V1
+-	_LIT_SECURITY_POLICY_V2
+-	_LIT_SECURITY_POLICY_V3
+
+@see TSecurityPolicy
+@publishedAll
+@released
+*/
+struct TStaticSecurityPolicy
+	{
+	inline const TSecurityPolicy* operator&() const;
+	inline operator const TSecurityPolicy&() const;
+	inline const TSecurityPolicy& operator()() const;
+
+#ifndef __KERNEL_MODE__
+#ifndef __REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__
+	inline TBool CheckPolicy(RProcess aProcess, const char* aDiagnostic=0) const;
+	inline TBool CheckPolicy(RThread aThread, const char* aDiagnostic=0) const;
+	inline TBool CheckPolicy(RMessagePtr2 aMsgPtr, const char* aDiagnostic=0) const;
+	inline TBool CheckPolicy(RMessagePtr2 aMsgPtr, TSecurityInfo& aMissing, const char* aDiagnostic=0) const;
+	inline TBool CheckPolicyCreator(const char* aDiagnostic=0) const;
+#else //__REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__
+	// Only available to NULL arguments
+	inline TBool CheckPolicy(RProcess aProcess, OnlyCreateWithNull aDiagnostic=NULL) const;
+	inline TBool CheckPolicy(RThread aThread, OnlyCreateWithNull aDiagnostic=NULL) const;
+	inline TBool CheckPolicy(RMessagePtr2 aMsgPtr, OnlyCreateWithNull aDiagnostic=NULL) const;
+	inline TBool CheckPolicy(RMessagePtr2 aMsgPtr, TSecurityInfo& aMissing, OnlyCreateWithNull aDiagnostic=NULL) const;
+	inline TBool CheckPolicyCreator(OnlyCreateWithNull aDiagnostic=NULL) const;
+#ifndef __REMOVE_PLATSEC_DIAGNOSTICS__
+	// For things using KSuppressPlatSecDiagnostic
+	inline TBool CheckPolicy(RProcess aProcess, OnlyCreateWithNull aDiagnostic, OnlyCreateWithNull aSuppress) const;
+	inline TBool CheckPolicy(RThread aThread, OnlyCreateWithNull aDiagnostic, OnlyCreateWithNull aSuppress) const;
+	inline TBool CheckPolicy(RMessagePtr2 aMsgPtr, OnlyCreateWithNull aDiagnostic, OnlyCreateWithNull aSuppress) const;
+	inline TBool CheckPolicy(RMessagePtr2 aMsgPtr, TSecurityInfo& aMissing, OnlyCreateWithNull aDiagnostic, OnlyCreateWithNull aSuppress) const;
+	inline TBool CheckPolicyCreator(OnlyCreateWithNull aDiagnostic, OnlyCreateWithNull aSuppress) const;
+#endif // !__REMOVE_PLATSEC_DIAGNOSTICS__
+#endif // !__REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__
+#endif // !__KERNEL_MODE__
+
+	TUint32 iA;	/**< @internalComponent */
+	TUint32 iB;	/**< @internalComponent */
+	};
+
+	
+/**
+A dummy enum for use by the CAPABILITY_AS_TUINT8 macro
+@internalComponent
+*/
+enum __invalid_capability_value {};
+
+/**
+A macro to cast a TCapability to a TUint8.
+
+If an invlid capability value is specified then, dependant on the compiler,
+a compile time error or warning will be produced which includes the label
+"__invalid_capability_value"
+
+@param cap The capability value
+@internalComponent
+*/
+#define CAPABILITY_AS_TUINT8(cap)											\
+	((TUint8)(int)(															\
+		(cap)==ECapability_None												\
+		? (__invalid_capability_value(*)[1])(ECapability_None)								\
+		: (__invalid_capability_value(*)[((TUint)(cap+1)<=(TUint)ECapability_Limit)?1:2])(cap)	\
+	))
+
+
+/**
+A macro to construct a TUint32 from four TUint8s.  The TUint32 is in BigEndian
+ordering useful for class layout rather than number generation.
+
+@param i1 The first TUint8
+@param i2 The second TUint8
+@param i3 The third TUint8
+@param i4 The fourth TUint8
+@internalComponent
+*/
+#define FOUR_TUINT8(i1,i2,i3,i4) \
+	(TUint32)(				\
+		(TUint8)i1 		 | 	\
+		(TUint8)i2 << 8  | 	\
+		(TUint8)i3 << 16 | 	\
+		(TUint8)i4 << 24	\
+	)
+
+
+/** Macro for compile-time initialisation of a security policy object that
+always fails.  That is, checks against this policy will always fail,
+irrespective of the security attributes of the item being checked.
+
+The object declared has an implicit conversion to const TSecurityPolicy&.
+Taking the address of the object will return a const TSecurityPolicy*.
+Explicit conversion to const TSecurityPolicy& may be effected by using the
+function call operator n().
+@publishedAll
+@released
+*/
+#define _INIT_SECURITY_POLICY_FAIL \
+	{ 																		\
+	FOUR_TUINT8(															\
+		(TUint8)TSecurityPolicy::ETypeFail,									\
+		(TUint8)0xff,														\
+		(TUint8)0xff,														\
+		(TUint8)0xff														\
+	),																		\
+	(TUint32)0xffffffff														\
+	}
+
+
+/** Macro for compile-time definition of a security policy object that always
+fails.  That is, checks against this policy will always fail, irrespective of
+the security attributes of the item being checked.
+
+The object declared has an implicit conversion to const TSecurityPolicy&.
+Taking the address of the object will return a const TSecurityPolicy*.
+Explicit conversion to const TSecurityPolicy& may be effected by using the
+function call operator n().
+@param	n	Name to use for policy object
+@publishedAll
+@released
+*/
+#define	_LIT_SECURITY_POLICY_FAIL(n) const TStaticSecurityPolicy n = _INIT_SECURITY_POLICY_FAIL
+
+
+/** Macro for compile-time initialisation of a security policy object that 
+always passes.  That is, checks against this policy will always pass,
+irrespective of the security attributes of the item being checked.
+
+The object declared has an implicit conversion to const TSecurityPolicy&.
+Taking the address of the object will return a const TSecurityPolicy*.
+Explicit conversion to const TSecurityPolicy& may be effected by using the
+function call operator n().
+@publishedAll
+@released
+*/
+#define _INIT_SECURITY_POLICY_PASS \
+	{ 																		\
+	FOUR_TUINT8(															\
+		(TUint8)TSecurityPolicy::ETypePass,									\
+		(TUint8)0xff,														\
+		(TUint8)0xff,														\
+		(TUint8)0xff														\
+	),																		\
+	(TUint32)0xffffffff														\
+	}
+
+
+/** Macro for compile-time definition of a security policy object that always
+passes.  That is, checks against this policy will always pass, irrespective of
+the security attributes of the item being checked.
+
+The object declared has an implicit conversion to const TSecurityPolicy&.
+Taking the address of the object will return a const TSecurityPolicy*.
+Explicit conversion to const TSecurityPolicy& may be effected by using the
+function call operator n().
+@param	n	Name to use for policy object
+@publishedAll
+@released
+*/
+#define	_LIT_SECURITY_POLICY_PASS(n) const TStaticSecurityPolicy n = _INIT_SECURITY_POLICY_PASS
+
+
+/** Macro for compile-time initialisation of a security policy object
+The policy will check for seven capabilities.
+
+The object declared has an implicit conversion to const TSecurityPolicy&.
+Taking the address of the object will return a const TSecurityPolicy*.
+Explicit conversion to const TSecurityPolicy& may be effected by using the
+function call operator n().
+
+If an invlid capability value is specified then, dependant on the compiler,
+a compile time error or warning will be produced which includes the label
+"__invalid_capability_value"
+
+@param	c1	The first capability to check (enumerator of TCapability)
+@param	c2	The second capability to check (enumerator of TCapability)
+@param	c3	The third capability to check (enumerator of TCapability)
+@param	c4	The fourth capability to check (enumerator of TCapability)
+@param	c5	The fifth capability to check (enumerator of TCapability)
+@param	c6	The sixth capability to check (enumerator of TCapability)
+@param	c7	The seventh capability to check (enumerator of TCapability)
+
+@publishedAll
+@released
+*/
+#define _INIT_SECURITY_POLICY_C7(c1,c2,c3,c4,c5,c6,c7) \
+	{ 																		\
+	FOUR_TUINT8(															\
+		(TUint8)TSecurityPolicy::ETypeC7,									\
+		CAPABILITY_AS_TUINT8(c1),											\
+		CAPABILITY_AS_TUINT8(c2),											\
+		CAPABILITY_AS_TUINT8(c3)											\
+	),																		\
+	FOUR_TUINT8(															\
+		CAPABILITY_AS_TUINT8(c4),											\
+		CAPABILITY_AS_TUINT8(c5),											\
+		CAPABILITY_AS_TUINT8(c6),											\
+		CAPABILITY_AS_TUINT8(c7)											\
+	)																		\
+	}
+
+
+/** Macro for compile-time definition of a security policy object
+The policy will check for seven capabilities.
+
+The object declared has an implicit conversion to const TSecurityPolicy&.
+Taking the address of the object will return a const TSecurityPolicy*.
+Explicit conversion to const TSecurityPolicy& may be effected by using the
+function call operator n().
+
+If an invlid capability value is specified then, dependant on the compiler,
+a compile time error or warning will be produced which includes the label
+"__invalid_capability_value"
+
+@param	n	Name to use for policy object
+@param	c1	The first capability to check (enumerator of TCapability)
+@param	c2	The second capability to check (enumerator of TCapability)
+@param	c3	The third capability to check (enumerator of TCapability)
+@param	c4	The fourth capability to check (enumerator of TCapability)
+@param	c5	The fifth capability to check (enumerator of TCapability)
+@param	c6	The sixth capability to check (enumerator of TCapability)
+@param	c7	The seventh capability to check (enumerator of TCapability)
+
+@publishedAll
+@released
+*/
+#define	_LIT_SECURITY_POLICY_C7(n,c1,c2,c3,c4,c5,c6,c7)						\
+	const TStaticSecurityPolicy n = _INIT_SECURITY_POLICY_C7(c1,c2,c3,c4,c5,c6,c7)
+
+
+/** Macro for compile-time initialisation of a security policy object
+The policy will check for six capabilities.
+
+The object declared has an implicit conversion to const TSecurityPolicy&.
+Taking the address of the object will return a const TSecurityPolicy*.
+Explicit conversion to const TSecurityPolicy& may be effected by using the
+function call operator n().
+
+If an invlid capability value is specified then, dependant on the compiler,
+a compile time error or warning will be produced which includes the label
+"__invalid_capability_value"
+
+@param	c1	The first capability to check (enumerator of TCapability)
+@param	c2	The second capability to check (enumerator of TCapability)
+@param	c3	The third capability to check (enumerator of TCapability)
+@param	c4	The fourth capability to check (enumerator of TCapability)
+@param	c5	The fifth capability to check (enumerator of TCapability)
+@param	c6	The sixth capability to check (enumerator of TCapability)
+
+@publishedAll
+@released
+*/
+#define _INIT_SECURITY_POLICY_C6(c1,c2,c3,c4,c5,c6)  \
+	_INIT_SECURITY_POLICY_C7(c1,c2,c3,c4,c5,c6,ECapability_None)
+
+
+/** Macro for compile-time definition of a security policy object
+The policy will check for six capabilities.
+
+The object declared has an implicit conversion to const TSecurityPolicy&.
+Taking the address of the object will return a const TSecurityPolicy*.
+Explicit conversion to const TSecurityPolicy& may be effected by using the
+function call operator n().
+
+If an invlid capability value is specified then, dependant on the compiler,
+a compile time error or warning will be produced which includes the label
+"__invalid_capability_value"
+
+@param	n	Name to use for policy object
+@param	c1	The first capability to check (enumerator of TCapability)
+@param	c2	The second capability to check (enumerator of TCapability)
+@param	c3	The third capability to check (enumerator of TCapability)
+@param	c4	The fourth capability to check (enumerator of TCapability)
+@param	c5	The fifth capability to check (enumerator of TCapability)
+@param	c6	The sixth capability to check (enumerator of TCapability)
+
+@publishedAll
+@released
+*/
+#define	_LIT_SECURITY_POLICY_C6(n,c1,c2,c3,c4,c5,c6)  \
+	_LIT_SECURITY_POLICY_C7(n,c1,c2,c3,c4,c5,c6,ECapability_None)
+
+
+/** Macro for compile-time initialisation of a security policy object
+The policy will check for five capabilities.
+
+The object declared has an implicit conversion to const TSecurityPolicy&.
+Taking the address of the object will return a const TSecurityPolicy*.
+Explicit conversion to const TSecurityPolicy& may be effected by using the
+function call operator n().
+
+If an invlid capability value is specified then, dependant on the compiler,
+a compile time error or warning will be produced which includes the label
+"__invalid_capability_value"
+
+@param	c1	The first capability to check (enumerator of TCapability)
+@param	c2	The second capability to check (enumerator of TCapability)
+@param	c3	The third capability to check (enumerator of TCapability)
+@param	c4	The fourth capability to check (enumerator of TCapability)
+@param	c5	The fifth capability to check (enumerator of TCapability)
+
+@publishedAll
+@released
+*/
+#define _INIT_SECURITY_POLICY_C5(c1,c2,c3,c4,c5)  \
+	_INIT_SECURITY_POLICY_C7(c1,c2,c3,c4,c5,ECapability_None,ECapability_None)
+
+
+/** Macro for compile-time definition of a security policy object
+The policy will check for five capabilities.
+
+The object declared has an implicit conversion to const TSecurityPolicy&.
+Taking the address of the object will return a const TSecurityPolicy*.
+Explicit conversion to const TSecurityPolicy& may be effected by using the
+function call operator n().
+
+If an invlid capability value is specified then, dependant on the compiler,
+a compile time error or warning will be produced which includes the label
+"__invalid_capability_value"
+
+@param	n	Name to use for policy object
+@param	c1	The first capability to check (enumerator of TCapability)
+@param	c2	The second capability to check (enumerator of TCapability)
+@param	c3	The third capability to check (enumerator of TCapability)
+@param	c4	The fourth capability to check (enumerator of TCapability)
+@param	c5	The fifth capability to check (enumerator of TCapability)
+
+@publishedAll
+@released
+*/
+#define	_LIT_SECURITY_POLICY_C5(n,c1,c2,c3,c4,c5)  \
+	_LIT_SECURITY_POLICY_C7(n,c1,c2,c3,c4,c5,ECapability_None,ECapability_None)
+
+
+/** Macro for compile-time initialisation of a security policy object
+The policy will check for four capabilities.
+
+The object declared has an implicit conversion to const TSecurityPolicy&.
+Taking the address of the object will return a const TSecurityPolicy*.
+Explicit conversion to const TSecurityPolicy& may be effected by using the
+function call operator n().
+
+If an invlid capability value is specified then, dependant on the compiler,
+a compile time error or warning will be produced which includes the label
+"__invalid_capability_value"
+
+@param	c1	The first capability to check (enumerator of TCapability)
+@param	c2	The second capability to check (enumerator of TCapability)
+@param	c3	The third capability to check (enumerator of TCapability)
+@param	c4	The fourth capability to check (enumerator of TCapability)
+
+@publishedAll
+@released
+*/
+#define _INIT_SECURITY_POLICY_C4(c1,c2,c3,c4)  \
+	_INIT_SECURITY_POLICY_C7(c1,c2,c3,c4,ECapability_None,ECapability_None,ECapability_None)
+
+
+/** Macro for compile-time definition of a security policy object
+The policy will check for four capabilities.
+
+The object declared has an implicit conversion to const TSecurityPolicy&.
+Taking the address of the object will return a const TSecurityPolicy*.
+Explicit conversion to const TSecurityPolicy& may be effected by using the
+function call operator n().
+
+If an invlid capability value is specified then, dependant on the compiler,
+a compile time error or warning will be produced which includes the label
+"__invalid_capability_value"
+
+@param	n	Name to use for policy object
+@param	c1	The first capability to check (enumerator of TCapability)
+@param	c2	The second capability to check (enumerator of TCapability)
+@param	c3	The third capability to check (enumerator of TCapability)
+@param	c4	The fourth capability to check (enumerator of TCapability)
+
+@publishedAll
+@released
+*/
+#define	_LIT_SECURITY_POLICY_C4(n,c1,c2,c3,c4)  \
+	_LIT_SECURITY_POLICY_C7(n,c1,c2,c3,c4,ECapability_None,ECapability_None,ECapability_None)
+
+
+/** Macro for compile-time initialisation of a security policy object
+The policy will check for three capabilities.
+
+The object declared has an implicit conversion to const TSecurityPolicy&.
+Taking the address of the object will return a const TSecurityPolicy*.
+Explicit conversion to const TSecurityPolicy& may be effected by using the
+function call operator n().
+
+If an invlid capability value is specified then, dependant on the compiler,
+a compile time error or warning will be produced which includes the label
+"__invalid_capability_value"
+
+@param	c1	The first capability to check (enumerator of TCapability)
+@param	c2	The second capability to check (enumerator of TCapability)
+@param	c3	The third capability to check (enumerator of TCapability)
+
+@publishedAll
+@released
+*/
+#define _INIT_SECURITY_POLICY_C3(c1,c2,c3)									\
+	{ 																		\
+	FOUR_TUINT8(															\
+		(TUint8)TSecurityPolicy::ETypeC3,									\
+		CAPABILITY_AS_TUINT8(c1),											\
+		CAPABILITY_AS_TUINT8(c2),											\
+		CAPABILITY_AS_TUINT8(c3)											\
+	),																		\
+	(TUint32)0xffffffff														\
+	}
+
+
+/** Macro for compile-time definition of a security policy object
+The policy will check for three capabilities.
+
+The object declared has an implicit conversion to const TSecurityPolicy&.
+Taking the address of the object will return a const TSecurityPolicy*.
+Explicit conversion to const TSecurityPolicy& may be effected by using the
+function call operator n().
+
+If an invlid capability value is specified then, dependant on the compiler,
+a compile time error or warning will be produced which includes the label
+"__invalid_capability_value"
+
+@param	n	Name to use for policy object
+@param	c1	The first capability to check (enumerator of TCapability)
+@param	c2	The second capability to check (enumerator of TCapability)
+@param	c3	The third capability to check (enumerator of TCapability)
+
+@publishedAll
+@released
+*/
+#define	_LIT_SECURITY_POLICY_C3(n,c1,c2,c3)									\
+	const TStaticSecurityPolicy n = _INIT_SECURITY_POLICY_C3(c1,c2,c3)
+
+
+/** Macro for compile-time initialisation of a security policy object
+The policy will check for two capabilities.
+
+The object declared has an implicit conversion to const TSecurityPolicy&.
+Taking the address of the object will return a const TSecurityPolicy*.
+Explicit conversion to const TSecurityPolicy& may be effected by using the
+function call operator n().
+
+If an invlid capability value is specified then, dependant on the compiler,
+a compile time error or warning will be produced which includes the label
+"__invalid_capability_value"
+
+@param	c1	The first capability to check (enumerator of TCapability)
+@param	c2	The second capability to check (enumerator of TCapability)
+
+@publishedAll
+@released
+*/
+#define _INIT_SECURITY_POLICY_C2(c1,c2)  \
+	_INIT_SECURITY_POLICY_C3(c1,c2,ECapability_None)
+
+
+/** Macro for compile-time definition of a security policy object
+The policy will check for two capabilities.
+
+The object declared has an implicit conversion to const TSecurityPolicy&.
+Taking the address of the object will return a const TSecurityPolicy*.
+Explicit conversion to const TSecurityPolicy& may be effected by using the
+function call operator n().
+
+If an invlid capability value is specified then, dependant on the compiler,
+a compile time error or warning will be produced which includes the label
+"__invalid_capability_value"
+
+@param	n	Name to use for policy object
+@param	c1	The first capability to check (enumerator of TCapability)
+@param	c2	The second capability to check (enumerator of TCapability)
+
+@publishedAll
+@released
+*/
+#define	_LIT_SECURITY_POLICY_C2(n,c1,c2)  \
+	_LIT_SECURITY_POLICY_C3(n,c1,c2,ECapability_None)
+
+
+/** Macro for compile-time initialisation of a security policy object
+The policy will check for one capability.
+
+The object declared has an implicit conversion to const TSecurityPolicy&.
+Taking the address of the object will return a const TSecurityPolicy*.
+Explicit conversion to const TSecurityPolicy& may be effected by using the
+function call operator n().
+
+If an invlid capability value is specified then, dependant on the compiler,
+a compile time error or warning will be produced which includes the label
+"__invalid_capability_value"
+
+@param	c1	The first capability to check (enumerator of TCapability)
+
+
+@publishedAll
+@released
+*/
+#define _INIT_SECURITY_POLICY_C1(c1)  \
+	_INIT_SECURITY_POLICY_C3(c1,ECapability_None,ECapability_None)
+
+
+/** Macro for compile-time definition of a security policy object
+The policy will check for one capability.
+
+The object declared has an implicit conversion to const TSecurityPolicy&.
+Taking the address of the object will return a const TSecurityPolicy*.
+Explicit conversion to const TSecurityPolicy& may be effected by using the
+function call operator n().
+
+If an invlid capability value is specified then, dependant on the compiler,
+a compile time error or warning will be produced which includes the label
+"__invalid_capability_value"
+
+@param	n	Name to use for policy object
+@param	c1	The first capability to check (enumerator of TCapability)
+
+@publishedAll
+@released
+*/
+#define	_LIT_SECURITY_POLICY_C1(n,c1)  \
+	_LIT_SECURITY_POLICY_C3(n,c1,ECapability_None,ECapability_None)
+
+
+/** Macro for compile-time initialisation of a security policy object
+The policy will check for a secure ID and three capabilities.
+
+The object declared has an implicit conversion to const TSecurityPolicy&.
+Taking the address of the object will return a const TSecurityPolicy*.
+Explicit conversion to const TSecurityPolicy& may be effected by using the
+function call operator n().
+
+If an invlid capability value is specified then, dependant on the compiler,
+a compile time error or warning be produced which includes the label
+"__invalid_capability_value"
+
+@param	sid	The SID value to check for
+@param	c1	The first capability to check (enumerator of TCapability)
+@param	c2	The second capability to check (enumerator of TCapability)
+@param	c3	The third capability to check (enumerator of TCapability)
+
+@publishedAll
+@released
+*/
+#define _INIT_SECURITY_POLICY_S3(sid,c1,c2,c3)								\
+	{																		\
+	FOUR_TUINT8(															\
+		(TUint8)TSecurityPolicy::ETypeS3,									\
+		CAPABILITY_AS_TUINT8(c1),											\
+		CAPABILITY_AS_TUINT8(c2),											\
+		CAPABILITY_AS_TUINT8(c3)											\
+	),																		\
+	(TUint32)(sid)															\
+	}
+
+
+/** Macro for compile-time definition of a security policy object
+The policy will check for a secure ID and three capabilities.
+
+The object declared has an implicit conversion to const TSecurityPolicy&.
+Taking the address of the object will return a const TSecurityPolicy*.
+Explicit conversion to const TSecurityPolicy& may be effected by using the
+function call operator n().
+
+If an invlid capability value is specified then, dependant on the compiler,
+a compile time error or warning be produced which includes the label
+"__invalid_capability_value"
+
+@param	n	Name to use for policy object
+@param	sid	The SID value to check for
+@param	c1	The first capability to check (enumerator of TCapability)
+@param	c2	The second capability to check (enumerator of TCapability)
+@param	c3	The third capability to check (enumerator of TCapability)
+
+@publishedAll
+@released
+*/
+#define	_LIT_SECURITY_POLICY_S3(n,sid,c1,c2,c3)								\
+	const TStaticSecurityPolicy n = _INIT_SECURITY_POLICY_S3(sid,c1,c2,c3)
+
+
+/** Macro for compile-time initialisation of a security policy object
+The policy will check for a secure ID and two capabilities.
+
+The object declared has an implicit conversion to const TSecurityPolicy&.
+Taking the address of the object will return a const TSecurityPolicy*.
+Explicit conversion to const TSecurityPolicy& may be effected by using the
+function call operator n().
+
+If an invlid capability value is specified then, dependant on the compiler,
+a compile time error or warning be produced which includes the label
+"__invalid_capability_value"
+
+@param	sid	The SID value to check for
+@param	c1	The first capability to check (enumerator of TCapability)
+@param	c2	The second capability to check (enumerator of TCapability)
+
+@publishedAll
+@released
+*/
+#define _INIT_SECURITY_POLICY_S2(sid,c1,c2)  \
+	_INIT_SECURITY_POLICY_S3(sid,c1,c2,ECapability_None)
+
+
+/** Macro for compile-time definition of a security policy object
+The policy will check for a secure ID and two capabilities.
+
+The object declared has an implicit conversion to const TSecurityPolicy&.
+Taking the address of the object will return a const TSecurityPolicy*.
+Explicit conversion to const TSecurityPolicy& may be effected by using the
+function call operator n().
+
+If an invlid capability value is specified then, dependant on the compiler,
+a compile time error or warning be produced which includes the label
+"__invalid_capability_value"
+
+@param	n	Name to use for policy object
+@param	sid	The SID value to check for
+@param	c1	The first capability to check (enumerator of TCapability)
+@param	c2	The second capability to check (enumerator of TCapability)
+
+@publishedAll
+@released
+*/
+#define	_LIT_SECURITY_POLICY_S2(n,sid,c1,c2)  \
+	_LIT_SECURITY_POLICY_S3(n,sid,c1,c2,ECapability_None)
+
+
+/** Macro for compile-time initialisation of a security policy object
+The policy will check for a secure ID and one capability.
+
+The object declared has an implicit conversion to const TSecurityPolicy&.
+Taking the address of the object will return a const TSecurityPolicy*.
+Explicit conversion to const TSecurityPolicy& may be effected by using the
+function call operator n().
+
+If an invlid capability value is specified then, dependant on the compiler,
+a compile time error or warning be produced which includes the label
+"__invalid_capability_value"
+
+@param	sid	The SID value to check for
+@param	c1	The first capability to check (enumerator of TCapability)
+
+@publishedAll
+@released
+*/
+#define _INIT_SECURITY_POLICY_S1(sid,c1)  \
+	_INIT_SECURITY_POLICY_S3(sid,c1,ECapability_None,ECapability_None)
+
+
+/** Macro for compile-time definition of a security policy object
+The policy will check for a secure ID and one capability.
+
+The object declared has an implicit conversion to const TSecurityPolicy&.
+Taking the address of the object will return a const TSecurityPolicy*.
+Explicit conversion to const TSecurityPolicy& may be effected by using the
+function call operator n().
+
+If an invlid capability value is specified then, dependant on the compiler,
+a compile time error or warning be produced which includes the label
+"__invalid_capability_value"
+
+@param	n	Name to use for policy object
+@param	sid	The SID value to check for
+@param	c1	The first capability to check (enumerator of TCapability)
+
+@publishedAll
+@released
+*/
+#define	_LIT_SECURITY_POLICY_S1(n,sid,c1)  \
+	_LIT_SECURITY_POLICY_S3(n,sid,c1,ECapability_None,ECapability_None)
+
+
+/** Macro for compile-time initialisation of a security policy object
+The policy will check for a secure ID.
+
+The object declared has an implicit conversion to const TSecurityPolicy&.
+Taking the address of the object will return a const TSecurityPolicy*.
+Explicit conversion to const TSecurityPolicy& may be effected by using the
+function call operator n().
+
+@param	sid	The SID value to check for
+
+@publishedAll
+@released
+*/
+#define _INIT_SECURITY_POLICY_S0(sid)  \
+	_INIT_SECURITY_POLICY_S3(sid,ECapability_None,ECapability_None,ECapability_None)
+
+
+/** Macro for compile-time definition of a security policy object
+The policy will check for a secure ID.
+
+The object declared has an implicit conversion to const TSecurityPolicy&.
+Taking the address of the object will return a const TSecurityPolicy*.
+Explicit conversion to const TSecurityPolicy& may be effected by using the
+function call operator n().
+
+@param	n	Name to use for policy object
+@param	sid	The SID value to check for
+
+@publishedAll
+@released
+*/
+#define	_LIT_SECURITY_POLICY_S0(n,sid)  \
+	_LIT_SECURITY_POLICY_S3(n,sid,ECapability_None,ECapability_None,ECapability_None)
+
+
+/** Macro for compile-time initialisation of a security policy object
+The policy will check for a vendor ID and three capabilities.
+
+The object declared has an implicit conversion to const TSecurityPolicy&.
+Taking the address of the object will return a const TSecurityPolicy*.
+Explicit conversion to const TSecurityPolicy& may be effected by using the
+function call operator n().
+
+If an invlid capability value is specified then, dependant on the compiler,
+a compile time error or warning be produced which includes the label
+"__invalid_capability_value"
+
+@param	vid	The VID value to check for
+@param	c1	The first capability to check (enumerator of TCapability)
+@param	c2	The second capability to check (enumerator of TCapability)
+@param	c3	The third capability to check (enumerator of TCapability)
+
+@publishedAll
+@released
+*/
+#define _INIT_SECURITY_POLICY_V3(vid,c1,c2,c3)								\
+	{																		\
+	FOUR_TUINT8(															\
+		(TUint8)TSecurityPolicy::ETypeV3,									\
+		CAPABILITY_AS_TUINT8(c1),											\
+		CAPABILITY_AS_TUINT8(c2),											\
+		CAPABILITY_AS_TUINT8(c3)											\
+	),																		\
+	(TUint32)(vid)															\
+	}
+
+
+/** Macro for compile-time definition of a security policy object
+The policy will check for a vendor ID and three capabilities.
+
+The object declared has an implicit conversion to const TSecurityPolicy&.
+Taking the address of the object will return a const TSecurityPolicy*.
+Explicit conversion to const TSecurityPolicy& may be effected by using the
+function call operator n().
+
+If an invlid capability value is specified then, dependant on the compiler,
+a compile time error or warning be produced which includes the label
+"__invalid_capability_value"
+
+@param	n	Name to use for policy object
+@param	vid	The VID value to check for
+@param	c1	The first capability to check (enumerator of TCapability)
+@param	c2	The second capability to check (enumerator of TCapability)
+@param	c3	The third capability to check (enumerator of TCapability)
+
+@publishedAll
+@released
+*/
+#define	_LIT_SECURITY_POLICY_V3(n,vid,c1,c2,c3)								\
+	const TStaticSecurityPolicy n = _INIT_SECURITY_POLICY_V3(vid,c1,c2,c3)
+
+
+/** Macro for compile-time initialisation of a security policy object
+The policy will check for a vendor ID and two capabilities.
+
+The object declared has an implicit conversion to const TSecurityPolicy&.
+Taking the address of the object will return a const TSecurityPolicy*.
+Explicit conversion to const TSecurityPolicy& may be effected by using the
+function call operator n().
+
+If an invlid capability value is specified then, dependant on the compiler,
+a compile time error or warning be produced which includes the label
+"__invalid_capability_value"
+
+@param	vid	The VID value to check for
+@param	c1	The first capability to check (enumerator of TCapability)
+@param	c2	The second capability to check (enumerator of TCapability)
+
+@publishedAll
+@released
+*/
+#define _INIT_SECURITY_POLICY_V2(vid,c1,c2)  \
+	_INIT_SECURITY_POLICY_V3(vid,c1,c2,ECapability_None)
+
+
+/** Macro for compile-time definition of a security policy object
+The policy will check for a vendor ID and two capabilities.
+
+The object declared has an implicit conversion to const TSecurityPolicy&.
+Taking the address of the object will return a const TSecurityPolicy*.
+Explicit conversion to const TSecurityPolicy& may be effected by using the
+function call operator n().
+
+If an invlid capability value is specified then, dependant on the compiler,
+a compile time error or warning be produced which includes the label
+"__invalid_capability_value"
+
+@param	n	Name to use for policy object
+@param	vid	The VID value to check for
+@param	c1	The first capability to check (enumerator of TCapability)
+@param	c2	The second capability to check (enumerator of TCapability)
+
+@publishedAll
+@released
+*/
+#define	_LIT_SECURITY_POLICY_V2(n,vid,c1,c2)  \
+	_LIT_SECURITY_POLICY_V3(n,vid,c1,c2,ECapability_None)
+
+
+/** Macro for compile-time initialisation of a security policy object
+The policy will check for a vendor ID and one capability.
+
+The object declared has an implicit conversion to const TSecurityPolicy&.
+Taking the address of the object will return a const TSecurityPolicy*.
+Explicit conversion to const TSecurityPolicy& may be effected by using the
+function call operator n().
+
+If an invlid capability value is specified then, dependant on the compiler,
+a compile time error or warning be produced which includes the label
+"__invalid_capability_value"
+
+@param	vid	The VID value to check for
+@param	c1	The first capability to check (enumerator of TCapability)
+
+@publishedAll
+@released
+*/
+#define _INIT_SECURITY_POLICY_V1(vid,c1)  \
+	_INIT_SECURITY_POLICY_V3(vid,c1,ECapability_None,ECapability_None)
+
+
+/** Macro for compile-time definition of a security policy object
+The policy will check for a vendor ID and one capability.
+
+The object declared has an implicit conversion to const TSecurityPolicy&.
+Taking the address of the object will return a const TSecurityPolicy*.
+Explicit conversion to const TSecurityPolicy& may be effected by using the
+function call operator n().
+
+If an invlid capability value is specified then, dependant on the compiler,
+a compile time error or warning be produced which includes the label
+"__invalid_capability_value"
+
+@param	n	Name to use for policy object
+@param	vid	The VID value to check for
+@param	c1	The first capability to check (enumerator of TCapability)
+
+@publishedAll
+@released
+*/
+#define	_LIT_SECURITY_POLICY_V1(n,vid,c1)  \
+	_LIT_SECURITY_POLICY_V3(n,vid,c1,ECapability_None,ECapability_None)
+
+
+/** Macro for compile-time initialisation of a security policy object
+The policy will check for a vendor ID.
+
+The object declared has an implicit conversion to const TSecurityPolicy&.
+Taking the address of the object will return a const TSecurityPolicy*.
+Explicit conversion to const TSecurityPolicy& may be effected by using the
+function call operator n().
+
+@param	vid	The VID value to check for
+
+@publishedAll
+@released
+*/
+#define _INIT_SECURITY_POLICY_V0(vid)  \
+	_INIT_SECURITY_POLICY_V3(vid,ECapability_None,ECapability_None,ECapability_None)
+
+
+/** Macro for compile-time definition of a security policy object
+The policy will check for a vendor ID.
+
+The object declared has an implicit conversion to const TSecurityPolicy&.
+Taking the address of the object will return a const TSecurityPolicy*.
+Explicit conversion to const TSecurityPolicy& may be effected by using the
+function call operator n().
+
+@param	n	Name to use for policy object
+@param	vid	The VID value to check for
+
+@publishedAll
+@released
+*/
+#define	_LIT_SECURITY_POLICY_V0(n,vid)  \
+	_LIT_SECURITY_POLICY_V3(n,vid,ECapability_None,ECapability_None,ECapability_None)
+
+
+
+#ifdef __KERNEL_MODE__
+class DThread;
+class RMessageK;
+#endif
+class TPlatSecDiagnostic;
+
+/**
+Class containing Platform Security related methods
+@internalTechnology
+*/
+class PlatSec
+	{
+#ifndef __KERNEL_MODE__
+public:
+	/**
+	Tests whether a given Platform Security capability is enforced by the system.
+
+	Capabilities may not be enforced for several reasons:
+	-#	The capability has been explicitly disabled on this system
+		by use of the PlatSecDisabledCaps configuration parameter
+	-#	Platform Security checks have been globally disabled
+		by use of the EPlatSecEnforcement configuration parameter	     
+	-#	The capability value is unknown. I.e. Is not part of the set of supported
+		capabilities. See TCapabilitySet::SetAllSupported().
+
+	@param aCapability The capability to test
+	@return A non-zero value if the capability is enforced, zero if it is not.
+
+	@publishedAll
+	@released
+	*/
+	IMPORT_C static TBool IsCapabilityEnforced(TCapability aCapability);
+
+	/**
+	An enumeration used with PlatSecSetting()
+	@see PlatSecSetting()
+	@publishedAll
+	@test
+	*/
+	enum TConfigSetting
+		{
+		EPlatSecEnforcement, /**< Used to request the value of the PlatSecEnforcement setting */
+		EPlatSecDiagnotics,  /**< Used to request the value of the PlatSecDiagnotics setting */
+		EPlatSecProcessIsolation,  /**< Used to request the value of the PlatSecProcessIsolation setting */
+		EPlatSecEnforceSysBin,  /**< Used to request the value of the PlatSecEnforceSysBin setting */
+		EPlatSecLocked,  /**< Used to request the value of the PlatSecLocked setting */
+		};
+
+	/**
+	A test function to return the state of a given Platform Security configuration setting.
+	@param aSetting An enumerated value representing the required setting
+	@return A value representing the setting. 0 represents 'OFF', 1 represents 'ON'
+			Other values may be returned for some settings, these exceptions are documented
+			in the description for individual enumerations of TConfigSetting.
+	@see TConfigSetting
+	@publishedAll
+	@test
+	*/
+	IMPORT_C static TInt ConfigSetting(TConfigSetting aSetting);
+
+#endif // Not __KERNEL_MODE__
+
+	//
+	// All methods below here are internalTechnology
+	//
+
+#ifndef __REMOVE_PLATSEC_DIAGNOSTICS__
+public:
+	/** @internalTechnology */
+	static inline TInt LoaderCapabilityViolation(const TDesC8& aImporterName, const TDesC8& aFileName, const SCapabilitySet& aMissingCaps);
+#ifdef __KERNEL_MODE__
+	/** @internalTechnology */
+	static inline TInt CapabilityCheckFail(const DProcess* aViolatingProcess, TCapability aCapability, const char* aContextText);
+	/** @internalTechnology */
+	static inline TInt CapabilityCheckFail(const DThread* aViolatingThread, TCapability aCapability, const char* aContextText);
+	/** @internalTechnology */
+	static inline TInt SecureIdCheckFail(const DProcess* aViolatingProcess, TSecureId aSid, const char* aContextText);
+	/** @internalTechnology */
+	static inline TInt PolicyCheckFail(const DProcess* aProcess, const SSecurityInfo& aMissing, const char* aContextText);
+	/** @internalTechnology */
+	static inline TInt PolicyCheckFail(const DThread* aProcess, const SSecurityInfo& aMissing, const char* aContextText);
+	/** @internalTechnology */
+	static inline TInt ProcessIsolationFail(const char* aContextText);
+	/** @internalTechnology */
+	static inline TInt ProcessIsolationIPCFail(RMessageK* aMessage, const char* aContextText);
+#else // !__KERNEL_MODE__
+	/** @internalTechnology */
+	static inline TInt LoaderCapabilityViolation(RProcess aLoadingProcess, const TDesC8& aFileName, const SCapabilitySet& aMissingCaps);
+	/** @internalTechnology */
+	static inline TInt CreatorCapabilityCheckFail(TCapability aCapability, const char* aContextText);
+	/** @internalTechnology */
+	static inline TInt CreatorCapabilityCheckFail(const TCapabilitySet& aMissingCaps, const char* aContextText);
+	/** @internalTechnology */
+	static inline TInt CapabilityCheckFail(TInt aHandle, TCapability aCapability, const char* aContextText);
+	/** @internalTechnology */
+	static inline TInt CapabilityCheckFail(TInt aHandle, const TCapabilitySet& aMissingCaps, const char* aContextText);
+	/** @internalTechnology */
+	static inline TInt PolicyCheckFail(TInt aHandle, const SSecurityInfo& aMissing, const char* aContextText);
+	/** @internalTechnology */
+	static inline TInt CapabilityCheckFail(RMessagePtr2 aMessage, TCapability aCapability, const char* aContextText);
+	/** @internalTechnology */
+	static inline TInt CapabilityCheckFail(RMessagePtr2 aMessage, const TCapabilitySet& aMissingCaps, const char* aContextText);
+	/** @internalTechnology */
+	static inline TInt PolicyCheckFail(RMessagePtr2 aMessage, const SSecurityInfo& aMissingCaps, const char* aContextText);
+	/** @internalTechnology */
+	static inline TInt PolicyCheckFail(RSessionBase aSession, const SSecurityInfo& aMissingCaps, const char* aContextText);
+	/** @internalTechnology */
+	static inline TInt CreatorPolicyCheckFail(const SSecurityInfo& aMissingCaps, const char* aContextText);
+	/** @internalTechnology */
+	static inline TInt CreatorCapabilityCheckFail(TCapability aCapability);
+	/** @internalTechnology */
+	static inline TInt CreatorCapabilityCheckFail(const TCapabilitySet& aMissingCaps);
+	/** @internalTechnology */
+	static inline TInt CapabilityCheckFail(TInt aHandle, TCapability aCapability);
+	/** @internalTechnology */
+	static inline TInt CapabilityCheckFail(TInt aHandle, const TCapabilitySet& aMissingCaps);
+	/** @internalTechnology */
+	static inline TInt PolicyCheckFail(TInt aHandle, const SSecurityInfo& aMissing);
+	/** @internalTechnology */
+	static inline TInt CapabilityCheckFail(RMessagePtr2 aMessage, TCapability aCapability);
+	/** @internalTechnology */
+	static inline TInt CapabilityCheckFail(RMessagePtr2 aMessage, const TCapabilitySet& aMissingCaps);
+	/** @internalTechnology */
+	static inline TInt PolicyCheckFail(RMessagePtr2 aMessage, const SSecurityInfo& aMissingCaps);
+	/** @internalTechnology */
+	static inline TInt CreatorPolicyCheckFail(const SSecurityInfo& aMissingCaps);
+#endif //__KERNEL_MODE__
+
+private:
+	UIMPORT_C static TInt EmitDiagnostic(TPlatSecDiagnostic& aDiagnostic, const char* aContextText);
+#else //__REMOVE_PLATSEC_DIAGNOSTICS__
+#ifndef __KERNEL_MODE__
+private:
+	IMPORT_C static TInt EmitDiagnostic(TPlatSecDiagnostic& aDiagnostic, const char* aContextText);
+#endif // !__KERNEL_MODE__
+#endif // !__REMOVE_PLATSEC_DIAGNOSTICS__
+
+public:
+	/** @internalTechnology */
+	UIMPORT_C static TInt EmitDiagnostic();
+	};
+
+
+
+/**
+@publishedAll
+@released
+
+Contains information about the code and data sections belonging to a process.
+
+@see RProcess::GetMemoryInfo
+*/
+class TProcessMemoryInfo
+	{
+public:
+    /**
+    The code base address (.text).
+    */
+	TUint32 iCodeBase;
+
+	
+    /**
+    The size of the code section (.text).
+    */
+	TUint32 iCodeSize;
+	
+	
+    /**
+    The base address of the constant data section (.radata).
+    */
+	TUint32 iConstDataBase;
+	
+	
+    /**
+    The size of the constant data section (.radata).
+    */
+
+	TUint32 iConstDataSize;
+	
+	
+    /**
+    The base address of the initialised data section (.data).
+    */
+	TUint32 iInitialisedDataBase;
+	
+	
+    /**
+    The size of the initialised data section (.data).
+    */
+	TUint32 iInitialisedDataSize;
+
+	
+    /**
+    The base address of the uninitialised data section (.bss).
+    */
+	TUint32 iUninitialisedDataBase;
+
+	
+    /**
+    The size of the uninitialised data section (.bss).
+    */
+	TUint32 iUninitialisedDataSize;
+	};
+
+
+
+
+/**
+@publishedAll
+@released
+
+Defines a more useful synonym for TProcessMemoryInfo.
+*/
+typedef TProcessMemoryInfo TModuleMemoryInfo;	// more accurate name - remove old one later
+
+
+
+
+#ifndef __KERNEL_MODE__
+class CBase;
+/**
+@publishedAll
+@released
+
+Generic array.
+
+This class defines a generic array which can be constructed by any of the
+following templated concrete arrays:
+
+1. CArrayFixFlat<class T>
+
+2. CArrayFixSeg<class T>
+
+3. CArrayVarFlat<class T>
+
+4. CArrayVarSeg<class T>
+
+5. CArrayPakFlat<class T>
+
+6. RArray<class T>
+
+7. RPointerArray<class T>
+
+and also by the following template specialisation classes:
+
+1. RArray<TInt>
+
+2. RArray<TUint>
+
+It allows a degree of polymorphism amongst the array classes. It permits the 
+operator[] and the Count() member functions of an array to be invoked without 
+knowing which array class has been used to construct that array.
+
+TArray allows access to elements of an array but does not permit changes to 
+those elements. 
+
+Use the Array() member function of an array to construct and return
+a TArray<class T> object for that array.
+
+A TArray<class T> type object is not intended to be constructed explicitly 
+by user code.
+
+@see CArrayFixFlat
+@see CArrayFixSeg
+@see CArrayVarFlat
+@see CArrayVarSeg
+@see CArrayPakFlat
+@see RArray
+@see RPointerArray
+@see RArray<TInt>
+@see RArray<TUint>
+*/
+template <class T>
+class TArray
+	{
+public:
+	inline TArray(TInt (*aCount)(const CBase* aPtr),const TAny*(*anAt)(const CBase* aPtr,TInt anIndex),const CBase* aPtr);
+	inline TInt Count() const;
+	inline const T& operator[](TInt anIndex) const;
+private:
+	const CBase* iPtr;
+	TInt (*iCount)(const CBase* aPtr);
+	const TAny*(*iAt)(const CBase* aPtr,TInt anIndex);
+	};
+#endif
+
+
+
+
+/**
+@publishedAll
+@released
+
+Defines a function type used by a TIdentityRelation object. 
+
+A function of this type implements an algorithm for determining whether
+two objects match.
+
+@see TIdentityRelation
+*/
+typedef TBool (*TGeneralIdentityRelation)(const TAny*, const TAny*);
+
+
+
+
+/**
+@publishedAll
+@released
+
+Defines a function type used by a TLinearOrder object
+
+A function of this type implements an algorithm that determines
+the order of two objects.
+
+@see TLinearOrder
+*/
+typedef TInt (*TGeneralLinearOrder)(const TAny*, const TAny*);
+
+
+
+
+/**
+@publishedAll
+@released
+
+A templated class which packages a function that determines whether two
+objects of a given class type match. During linear search operations the search
+term is always passed as the first argument and the second argument is an
+element of the array being searched.
+
+A TIdentityRelation<T> object is constructed and passed as a parameter to 
+member functions of the array classes RArray<T> and RPointerArray<T>.
+
+@see RArray
+@see RPointerArray
+*/
+template <class T>
+class TIdentityRelation
+	{
+public:
+	inline TIdentityRelation();
+	inline TIdentityRelation( TBool (*anIdentity)(const T&, const T&) );
+	inline operator TGeneralIdentityRelation() const;
+private:
+	inline static TBool EqualityOperatorCompare(const T& aLeft, const T& aRight);
+private:
+	TGeneralIdentityRelation iIdentity;
+	};
+
+
+
+/**
+@publishedAll
+@released
+
+A set of common identity relations for frequently occurring types.
+
+@see RArray
+@see RPointerArray
+@see RHashSet
+@see RPtrHashSet
+@see RHashMap
+@see RPtrHashMap
+*/
+class DefaultIdentity
+	{
+public:
+	IMPORT_C static TBool Integer(const TInt&, const TInt&);
+	IMPORT_C static TBool Des8(const TDesC8&, const TDesC8&);
+	IMPORT_C static TBool Des16(const TDesC16&, const TDesC16&);
+	IMPORT_C static TBool IntegerPtr(TInt* const&, TInt* const&);
+	IMPORT_C static TBool Des8Ptr(TDesC8* const&, TDesC8* const&);
+	IMPORT_C static TBool Des16Ptr(TDesC16* const&, TDesC16* const&);
+	};
+
+
+
+
+/**
+@publishedAll
+@released
+
+A templated class which packages a function that determines the order of two 
+objects of a given class type. During binary search operations the search term
+is always passed as the first argument and the second argument is an element
+of the array being searched.
+
+A TLinearOrder<T> object is constructed and passed as a parameter to member 
+functions of the array classes RArray<T> and RPointerArray<T>.
+
+@see RArray
+@see RPointerArray
+*/
+template <class T>
+class TLinearOrder
+	{
+public:
+	inline TLinearOrder( TInt(*anOrder)(const T&, const T&) );
+	inline operator TGeneralLinearOrder() const;
+private:
+	TGeneralLinearOrder iOrder;
+	};
+
+
+/*
+@publishedAll
+@released
+
+A set of values that tell array search functions which array element is to be
+returned when there are duplicate elements in the array.
+
+These values are used by RArray, RPointerArray, RArray<TInt>,
+and RArray<TUint> search functions. 
+
+Examples of functions that take
+these enum values are: RPointerArray::SpecificFindInOrderL(),
+and RArray::SpecificFindInSignedKeyOrder().
+
+@see RArray
+@see RPointerArray
+@see RArray<TInt>
+@see RArray<TUint>
+*/
+enum TArrayFindMode
+	{
+	/**
+	Indicates that any element in a block of duplicate elements can be
+	returned by a search function.
+	
+	Note that using this mode, there can be no guarantee that the element
+	returned by the search functions will be the same if the size of the array
+	changes between successive calls to those functions.
+	*/
+	EArrayFindMode_Any = 0,
+	
+	/**
+	Indicates that the first element in a block of duplicate elements
+	is returned.
+	*/
+	EArrayFindMode_First = 1,
+
+	/**
+	Indicates that the first element after the last element in a block
+	of duplicate elements is returned.
+	*/
+	EArrayFindMode_Last = 2,
+    
+    /**
+    @internalTechnology
+    */
+	EArrayFindMode_Limit = 3
+	};
+
+
+/**
+@internalComponent
+
+Base class used in the derivation of RPointerArray, RArray<TInt>,
+and RArray<TUint>. 
+
+The base class is inherited privately.
+
+The class is internal and is not intended for use.
+*/
+class RPointerArrayBase
+	{
+protected:
+	IMPORT_C RPointerArrayBase();
+	IMPORT_C RPointerArrayBase(TInt aGranularity);
+	IMPORT_C RPointerArrayBase(TInt aMinGrowBy, TInt aFactor);
+	IMPORT_C void Close();
+	IMPORT_C TInt Count() const;
+	inline void ZeroCount() {iCount=0;}
+	inline TAny** Entries() {return iEntries;}
+	IMPORT_C TAny*& At(TInt anIndex) const;
+	IMPORT_C TInt Append(const TAny* anEntry);
+	IMPORT_C TInt Insert(const TAny* anEntry, TInt aPos);
+	IMPORT_C void Remove(TInt anIndex);
+	IMPORT_C void Compress();
+	IMPORT_C void Reset();
+	IMPORT_C TInt Find(const TAny* anEntry) const;
+	IMPORT_C TInt Find(const TAny* anEntry, TGeneralIdentityRelation anIdentity) const;
+	IMPORT_C TInt FindReverse(const TAny* aEntry) const;
+	IMPORT_C TInt FindReverse(const TAny* aEntry, TGeneralIdentityRelation aIdentity) const;
+	IMPORT_C TInt FindIsqSigned(TInt anEntry) const;
+	IMPORT_C TInt FindIsqUnsigned(TUint anEntry) const;
+	IMPORT_C TInt FindIsq(const TAny* anEntry, TGeneralLinearOrder anOrder) const;
+	IMPORT_C TInt FindIsqSigned(TInt anEntry, TInt aMode) const;
+	IMPORT_C TInt FindIsqUnsigned(TUint anEntry, TInt aMode) const;
+	IMPORT_C TInt FindIsq(const TAny* anEntry, TGeneralLinearOrder anOrder, TInt aMode) const;
+	IMPORT_C TInt InsertIsqSigned(TInt anEntry, TBool aAllowRepeats);
+	IMPORT_C TInt InsertIsqUnsigned(TUint anEntry, TBool aAllowRepeats);
+	IMPORT_C TInt InsertIsq(const TAny* anEntry, TGeneralLinearOrder anOrder, TBool aAllowRepeats);
+	IMPORT_C TInt BinarySearchSigned(TInt anEntry, TInt& anIndex) const;
+	IMPORT_C TInt BinarySearchUnsigned(TUint anEntry, TInt& anIndex) const;
+	IMPORT_C TInt BinarySearch(const TAny* anEntry, TInt& anIndex, TGeneralLinearOrder anOrder) const;
+	IMPORT_C TInt BinarySearchSigned(TInt anEntry, TInt& anIndex, TInt aMode) const;
+	IMPORT_C TInt BinarySearchUnsigned(TUint anEntry, TInt& anIndex, TInt aMode) const;
+	IMPORT_C TInt BinarySearch(const TAny* anEntry, TInt& anIndex, TGeneralLinearOrder anOrder, TInt aMode) const;
+#ifndef __KERNEL_MODE__
+	IMPORT_C RPointerArrayBase(TAny** aEntries, TInt aCount);
+	IMPORT_C void GranularCompress();
+	IMPORT_C TInt DoReserve(TInt aCount);
+	IMPORT_C void HeapSortSigned();
+	IMPORT_C void HeapSortUnsigned();
+	IMPORT_C void HeapSort(TGeneralLinearOrder anOrder);
+	IMPORT_C static TInt GetCount(const CBase* aPtr);
+	IMPORT_C static const TAny* GetElementPtr(const CBase* aPtr, TInt aIndex);
+#endif
+private:
+	TInt Grow();
+private:
+	TInt iCount;
+	TAny** iEntries;
+	TInt iAllocated;
+	TInt iGranularity;	// positive means linear, negative means exponential growth
+	TInt iSpare1;
+	TInt iSpare2;
+	};
+
+
+
+
+/**
+@publishedAll
+@released
+
+A simple and efficient array of pointers to objects.
+
+The elements of the array are pointers to instances of a class; this class
+is specified as the template parameter T.
+
+The class offers standard array behaviour which includes insertion, appending 
+and sorting of pointers.
+
+Derivation from RPointerArrayBase is private.
+*/
+template <class T>
+class RPointerArray : private RPointerArrayBase
+	{
+public:
+	inline RPointerArray();
+	inline explicit RPointerArray(TInt aGranularity);
+	inline RPointerArray(TInt aMinGrowBy, TInt aFactor);
+	inline void Close();
+	inline TInt Count() const;
+	inline T* const& operator[](TInt anIndex) const;
+	inline T*& operator[](TInt anIndex);
+	inline TInt Append(const T* anEntry);
+	inline TInt Insert(const T* anEntry, TInt aPos);
+	inline void Remove(TInt anIndex);
+	inline void Compress();
+	inline void Reset();
+	void ResetAndDestroy();
+	inline TInt Find(const T* anEntry) const;
+	inline TInt Find(const T* anEntry, TIdentityRelation<T> anIdentity) const;
+	template <class K>
+	inline TInt Find(const K& aKey, TBool (*apfnCompare)(const K* k, const T& t)) const
+	/**
+	Finds the first object pointer in the array which matches aKey using
+	the comparison algorithm provided by apfnCompare.
+	
+	The find operation always starts at the low index end of the array. There 
+	is no assumption about the order of objects in the array.
+
+	@param aKey The key of type K to be compared with the elements of the array using apfnCompare.
+	@param apfnCompare A function defining the identity relation between the
+			object pointers in the array, and their keys of type K.  The
+			function returns true if k and t match based on this relationship.
+	
+	@return The index of the first matching object pointer within the array.
+			KErrNotFound, if no suitable object pointer can be found.
+	*/
+		{ return RPointerArrayBase::Find((T*)&aKey,*(TIdentityRelation<T>*)&apfnCompare); }		
+	inline TInt FindReverse(const T* anEntry) const;
+	inline TInt FindReverse(const T* anEntry, TIdentityRelation<T> anIdentity) const;
+	template <class K>
+	inline TInt FindReverse(const K& aKey, TInt (*apfnMatch)(const K* k, const T& t)) const
+	/**
+	Finds the first object pointer in the array which matches aKey using
+	the comparison algorithm provided by apfnCompare.
+	
+	The find operation always starts at the high index end of the array. There 
+	is no assumption about the order of objects in the array.
+
+	@param aKey The key of type K to be compared with the elements of the array using apfnMatch.
+	@param apfnMatch A function defining the identity relation between the
+			object pointers in the array, and their keys of type K.  The
+			function returns true if k and t match based on this relationship.
+	
+	@return The index of the first matching object pointer within the array.
+			KErrNotFound, if no suitable object pointer can be found.
+	*/
+
+		{ return RPointerArrayBase::FindReverse((T*)&aKey,*(TIdentityRelation<T>*)&apfnMatch); } 				
+	inline TInt FindInAddressOrder(const T* anEntry) const;
+	inline TInt FindInOrder(const T* anEntry, TLinearOrder<T> anOrder) const;
+	inline TInt FindInAddressOrder(const T* anEntry, TInt& anIndex) const;
+	inline TInt FindInOrder(const T* anEntry, TInt& anIndex, TLinearOrder<T> anOrder) const;
+	template <class K>
+	inline TInt FindInOrder(const K& aKey, TInt (*apfnCompare)(const K* k, const T& t)) const
+	/**
+	Finds the object pointer in the array whose object matches the specified
+	key, (Using the relationship defined within apfnCompare) using a binary search
+	technique and an ordering algorithm.
+
+	The function assumes that existing object pointers in the array are ordered 
+	so that the objects themselves are in object order as determined by an algorithm 
+	supplied by the caller and packaged as a TLinearOrder<T>.
+
+	@param aKey The key of type K to be compared with the elements of the array using apfnCompare.
+	@param apfnCompare A function which defines the order that the array was sorted,
+		 where in it aKey (via the defined relationship) should fit, and if the key is present. 
+	
+	@return The index of the matching object pointer within the array.
+			KErrNotFound, if no suitable object pointer can be found.
+	*/	
+		{ return RPointerArrayBase::FindIsq((T*)&aKey,*(TLinearOrder<T>*)&apfnCompare); }
+	inline TInt SpecificFindInAddressOrder(const T* anEntry, TInt aMode) const;
+	inline TInt SpecificFindInOrder(const T* anEntry, TLinearOrder<T> anOrder, TInt aMode) const;
+	inline TInt SpecificFindInAddressOrder(const T* anEntry, TInt& anIndex, TInt aMode) const;
+	inline TInt SpecificFindInOrder(const T* anEntry, TInt& anIndex, TLinearOrder<T> anOrder, TInt aMode) const;
+	inline TInt InsertInAddressOrder(const T* anEntry);
+	inline TInt InsertInOrder(const T* anEntry, TLinearOrder<T> anOrder);
+	inline TInt InsertInAddressOrderAllowRepeats(const T* anEntry);
+	inline TInt InsertInOrderAllowRepeats(const T* anEntry, TLinearOrder<T> anOrder);
+#ifndef __KERNEL_MODE__
+	inline void AppendL(const T* anEntry);
+	inline void InsertL(const T* anEntry, TInt aPos);
+	inline TInt FindL(const T* anEntry) const;
+	inline TInt FindL(const T* anEntry, TIdentityRelation<T> anIdentity) const;
+	inline TInt FindReverseL(const T* anEntry) const;
+	inline TInt FindReverseL(const T* anEntry, TIdentityRelation<T> anIdentity) const;
+	inline TInt FindInAddressOrderL(const T* anEntry) const;
+	inline TInt FindInOrderL(const T* anEntry, TLinearOrder<T> anOrder) const;
+	inline void FindInAddressOrderL(const T* anEntry, TInt& anIndex) const;
+	inline void FindInOrderL(const T* anEntry, TInt& anIndex, TLinearOrder<T> anOrder) const;
+	inline TInt SpecificFindInAddressOrderL(const T* anEntry, TInt aMode) const;
+	inline TInt SpecificFindInOrderL(const T* anEntry, TLinearOrder<T> anOrder, TInt aMode) const;
+	inline void SpecificFindInAddressOrderL(const T* anEntry, TInt& anIndex, TInt aMode) const;
+	inline void SpecificFindInOrderL(const T* anEntry, TInt& anIndex, TLinearOrder<T> anOrder, TInt aMode) const;
+	inline void InsertInAddressOrderL(const T* anEntry);
+	inline void InsertInOrderL(const T* anEntry, TLinearOrder<T> anOrder);
+	inline void InsertInAddressOrderAllowRepeatsL(const T* anEntry);
+	inline void InsertInOrderAllowRepeatsL(const T* anEntry, TLinearOrder<T> anOrder);
+
+	inline RPointerArray(T** aEntries, TInt aCount);
+	inline void GranularCompress();
+	inline TInt Reserve(TInt aCount);
+	inline void ReserveL(TInt aCount);
+	inline void SortIntoAddressOrder();
+	inline void Sort(TLinearOrder<T> anOrder);
+	inline TArray<T*> Array() const;
+#endif
+	};
+
+
+
+/**
+@publishedAll
+@released
+
+Array of raw pointers.
+
+The array is a simple and efficient specialized array of TAny pointers offering
+standard array behaviour.
+
+The derivation from RPointerArrayBase is private.
+*/
+TEMPLATE_SPECIALIZATION class RPointerArray<TAny> : private RPointerArrayBase
+	{
+public:
+	inline RPointerArray();
+	inline explicit RPointerArray(TInt aGranularity);
+	inline RPointerArray(TInt aMinGrowBy, TInt aFactor);
+	inline void Close();
+	inline TInt Count() const;
+	inline TAny* const& operator[](TInt anIndex) const;
+	inline TAny*& operator[](TInt anIndex);
+	inline TInt Append(const TAny* anEntry);
+	inline TInt Insert(const TAny* anEntry, TInt aPos);
+	inline void Remove(TInt anIndex);
+	inline void Compress();
+	inline void Reset();
+	inline TInt Find(const TAny* anEntry) const;
+	inline TInt FindReverse(const TAny* anEntry) const;
+	inline TInt FindInAddressOrder(const TAny* anEntry) const;
+	inline TInt FindInAddressOrder(const TAny* anEntry, TInt& anIndex) const;
+	inline TInt SpecificFindInAddressOrder(const TAny* anEntry, TInt aMode) const;
+	inline TInt SpecificFindInAddressOrder(const TAny* anEntry, TInt& anIndex, TInt aMode) const;
+	inline TInt InsertInAddressOrder(const TAny* anEntry);
+	inline TInt InsertInAddressOrderAllowRepeats(const TAny* anEntry);
+#ifndef __KERNEL_MODE__
+	inline void AppendL(const TAny* anEntry);
+	inline void InsertL(const TAny* anEntry, TInt aPos);
+	inline TInt FindL(const TAny* anEntry) const;
+	inline TInt FindReverseL(const TAny* anEntry) const;
+	inline TInt FindInAddressOrderL(const TAny* anEntry) const;
+	inline void FindInAddressOrderL(const TAny* anEntry, TInt& anIndex) const;
+	inline TInt SpecificFindInAddressOrderL(const TAny* anEntry, TInt aMode) const;
+	inline void SpecificFindInAddressOrderL(const TAny* anEntry, TInt& anIndex, TInt aMode) const;
+	inline void InsertInAddressOrderL(const TAny* anEntry);
+	inline void InsertInAddressOrderAllowRepeatsL(const TAny* anEntry);
+
+	inline RPointerArray(TAny** aEntries, TInt aCount);
+	inline void GranularCompress();
+	inline void SortIntoAddressOrder();
+	inline TArray<TAny*> Array() const;
+#endif
+	};
+
+
+
+/**
+@internalComponent
+
+Base class used in the derivation of RArray.
+
+The base class is inherited privately.
+
+The class is internal and is not intended for use.
+*/
+class RArrayBase
+	{
+protected:
+	IMPORT_C RArrayBase(TInt anEntrySize);
+	IMPORT_C RArrayBase(TInt anEntrySize, TInt aGranularity);
+	IMPORT_C RArrayBase(TInt anEntrySize, TInt aGranularity, TInt aKeyOffset);
+	IMPORT_C RArrayBase(TInt anEntrySize, TInt aMinGrowBy, TInt aKeyOffset, TInt aFactor);
+	IMPORT_C RArrayBase(TInt aEntrySize,TAny* aEntries, TInt aCount);
+	IMPORT_C void Close();
+	IMPORT_C TInt Count() const;
+	IMPORT_C TAny* At(TInt anIndex) const;
+	IMPORT_C TInt Append(const TAny* anEntry);
+	IMPORT_C TInt Insert(const TAny* anEntry, TInt aPos);
+	IMPORT_C void Remove(TInt anIndex);
+	IMPORT_C void Compress();
+	IMPORT_C void Reset();
+	IMPORT_C TInt Find(const TAny* anEntry) const;
+	IMPORT_C TInt Find(const TAny* anEntry, TGeneralIdentityRelation anIdentity) const;
+	IMPORT_C TInt FindReverse(const TAny* aEntry) const;
+	IMPORT_C TInt FindReverse(const TAny* aEntry, TGeneralIdentityRelation aIdentity) const;
+	IMPORT_C TInt FindIsqSigned(const TAny* anEntry) const;
+	IMPORT_C TInt FindIsqUnsigned(const TAny* anEntry) const;
+	IMPORT_C TInt FindIsq(const TAny* anEntry, TGeneralLinearOrder anOrder) const;
+	IMPORT_C TInt FindIsqSigned(const TAny* anEntry, TInt aMode) const;
+	IMPORT_C TInt FindIsqUnsigned(const TAny* anEntry, TInt aMode) const;
+	IMPORT_C TInt FindIsq(const TAny* anEntry, TGeneralLinearOrder anOrder, TInt aMode) const;
+	IMPORT_C TInt InsertIsqSigned(const TAny* anEntry, TBool aAllowRepeats);
+	IMPORT_C TInt InsertIsqUnsigned(const TAny* anEntry, TBool aAllowRepeats);
+	IMPORT_C TInt InsertIsq(const TAny* anEntry, TGeneralLinearOrder anOrder, TBool aAllowRepeats);
+	IMPORT_C TInt BinarySearchSigned(const TAny* anEntry, TInt& anIndex) const;
+	IMPORT_C TInt BinarySearchUnsigned(const TAny* anEntry, TInt& anIndex) const;
+	IMPORT_C TInt BinarySearch(const TAny* anEntry, TInt& anIndex, TGeneralLinearOrder anOrder) const;
+	IMPORT_C TInt BinarySearchSigned(const TAny* anEntry, TInt& anIndex, TInt aMode) const;
+	IMPORT_C TInt BinarySearchUnsigned(const TAny* anEntry, TInt& anIndex, TInt aMode) const;
+	IMPORT_C TInt BinarySearch(const TAny* anEntry, TInt& anIndex, TGeneralLinearOrder anOrder, TInt aMode) const;
+#ifndef __KERNEL_MODE__
+	IMPORT_C void GranularCompress();
+	IMPORT_C TInt DoReserve(TInt aCount);
+	IMPORT_C void HeapSortSigned();
+	IMPORT_C void HeapSortUnsigned();
+	IMPORT_C void HeapSort(TGeneralLinearOrder anOrder);
+	IMPORT_C static TInt GetCount(const CBase* aPtr);
+	IMPORT_C static const TAny* GetElementPtr(const CBase* aPtr, TInt aIndex);
+#endif
+private:
+	TInt Grow();
+private:
+	TInt iCount;
+	TAny* iEntries;
+	TInt iEntrySize;
+	TInt iKeyOffset;
+	TInt iAllocated;
+	TInt iGranularity;	// positive means linear, negative means exponential growth
+	TInt iSpare1;
+	TInt iSpare2;
+	};
+
+
+
+
+/**
+@publishedAll
+@released
+
+A simple and efficient array of fixed length objects.
+
+The elements of the array are instances of a class; this class is specified
+as the template parameter T.
+
+The array offers standard array behaviour which includes insertion, appending 
+and sorting of elements.
+
+Note:
+
+1. where possible, this class should be used in preference to
+   CArrayFixFlat<classT>.
+
+2. the derivation from RArrayBase is private.
+
+3. for performance reasons, RArray stores objects in the array as
+   word (4 byte) aligned quantities. This means that some member functions
+   do not work when RArray is instantiated for classes of less than 4 bytes
+   in size, or when the class's alignment requirement is not 4.
+   Be aware that it is possible to get an unhandled exception on hardware
+   that enforces strict alignment.
+   
+   The affected functions are:
+   
+   3.1 the constructor: RArray(TInt, T*, TInt)
+   
+   3.2 Append(const T&)
+   
+   3.3 Insert(const T&, TInt)
+   
+   3.4 the [] operator, and then using the pointer to iterate through
+       the array as you would with a C array.
+*/
+template <class T>
+class RArray : private RArrayBase
+	{
+public:
+	inline RArray();
+	inline explicit RArray(TInt aGranularity);
+	inline RArray(TInt aGranularity, TInt aKeyOffset);
+	inline RArray(TInt aMinGrowBy, TInt aKeyOffset, TInt aFactor);
+	inline RArray(TInt aEntrySize,T* aEntries, TInt aCount);
+	inline void Close();
+	inline TInt Count() const;
+	inline const T& operator[](TInt anIndex) const;
+	inline T& operator[](TInt anIndex);
+	inline TInt Append(const T& anEntry);
+	inline TInt Insert(const T& anEntry, TInt aPos);
+	inline void Remove(TInt anIndex);
+	inline void Compress();
+	inline void Reset();
+	inline TInt Find(const T& anEntry) const;
+	inline TInt Find(const T& anEntry, TIdentityRelation<T> anIdentity) const;
+	template <class K>
+	inline TInt Find(const K& aKey, TBool (*apfnCompare)(const K* k, const T& t)) const
+	/**
+	Finds the first object in the array which matches aKey using
+	the comparison algorithm provided by apfnCompare.
+	
+	The find operation always starts at the low index end of the array. There 
+	is no assumption about the order of objects in the array.
+
+	@param aKey The key of type K to be compared with the elements of the array using apfnCompare.
+	@param apfnCompare A function defining the identity relation between the
+			object in the array, and their keys of type K.  The function
+			returns true if k and t match based on this relationship.
+	
+	@return The index of the first matching object within the array.
+			KErrNotFound, if no suitable object can be found.
+	*/
+		{ return RArrayBase::Find((T*)&aKey,*(TIdentityRelation<T>*)&apfnCompare); }
+	inline TInt FindReverse(const T& anEntry) const;
+	inline TInt FindReverse(const T& anEntry, TIdentityRelation<T> anIdentity) const;
+	template <class K>
+	inline TInt FindReverse(const K& aKey, TInt (*apfnMatch)(const K* k, const T& t)) const 
+	/**
+	Finds the first object in the array which matches aKey using the comparison
+	algorithm provided by apfnCompare.
+	
+	The find operation always starts at the high index end of the array. There 
+	is no assumption about the order of objects in the array.
+
+	@param aKey The key of type K to be compared with the elements of the array using apfnMatch.
+	@param apfnMatch A function defining the identity relation between the
+			object in the array, and their keys of type K.  The	function
+			returns true if k and t match based on this relationship.
+	
+	@return The index of the first matching object within the array.
+			KErrNotFound, if no suitable object can be found.
+	*/	
+		{ return RArrayBase::FindReverse((T*)&aKey,*(TIdentityRelation<T>*)&apfnMatch); }		
+	inline TInt FindInSignedKeyOrder(const T& anEntry) const;
+	inline TInt FindInUnsignedKeyOrder(const T& anEntry) const;
+	inline TInt FindInOrder(const T& anEntry, TLinearOrder<T> anOrder) const;
+	inline TInt FindInSignedKeyOrder(const T& anEntry, TInt& anIndex) const;
+	inline TInt FindInUnsignedKeyOrder(const T& anEntry, TInt& anIndex) const;
+	inline TInt FindInOrder(const T& anEntry, TInt& anIndex, TLinearOrder<T> anOrder) const;
+	template <class K>
+	inline TInt FindInOrder(const K& aKey, TInt (*apfnCompare)(const K* k, const T& t)) const
+	/**
+	Finds the object in the array whose object matches the specified
+	key, (Using the relationship defined within apfnCompare) using a binary search
+	technique and an ordering algorithm.
+
+	The function assumes that existing objects in the array are ordered so
+	that the objects themselves are in object order as determined by an algorithm 
+	supplied by the caller and packaged as a TLinearOrder<T>.
+
+	@param aKey The key of type K to be compared with the elements of the array using apfnCompare.
+	@param apfnCompare A function which defines the order that the array was sorted,
+		 where in it aKey (via the defined relationship) should fit, and if the key is present. 
+	
+	@return The index of the matching object within the array.
+			KErrNotFound, if no suitable object can be found.
+	*/	
+
+		{ return RArrayBase::FindIsq((T*)&aKey,*(TLinearOrder<T>*)&apfnCompare); }
+	inline TInt SpecificFindInSignedKeyOrder(const T& anEntry, TInt aMode) const;
+	inline TInt SpecificFindInUnsignedKeyOrder(const T& anEntry, TInt aMode) const;
+	inline TInt SpecificFindInOrder(const T& anEntry, TLinearOrder<T> anOrder, TInt aMode) const;
+	inline TInt SpecificFindInSignedKeyOrder(const T& anEntry, TInt& anIndex, TInt aMode) const;
+	inline TInt SpecificFindInUnsignedKeyOrder(const T& anEntry, TInt& anIndex, TInt aMode) const;
+	inline TInt SpecificFindInOrder(const T& anEntry, TInt& anIndex, TLinearOrder<T> anOrder, TInt aMode) const;
+	inline TInt InsertInSignedKeyOrder(const T& anEntry);
+	inline TInt InsertInUnsignedKeyOrder(const T& anEntry);
+	inline TInt InsertInOrder(const T& anEntry, TLinearOrder<T> anOrder);
+	inline TInt InsertInSignedKeyOrderAllowRepeats(const T& anEntry);
+	inline TInt InsertInUnsignedKeyOrderAllowRepeats(const T& anEntry);
+	inline TInt InsertInOrderAllowRepeats(const T& anEntry, TLinearOrder<T> anOrder);
+#ifndef __KERNEL_MODE__
+	inline void AppendL(const T& anEntry);
+	inline void InsertL(const T& anEntry, TInt aPos);
+	inline TInt FindL(const T& anEntry) const;
+	inline TInt FindL(const T& anEntry, TIdentityRelation<T> anIdentity) const;
+	inline TInt FindReverseL(const T& anEntry) const;
+	inline TInt FindReverseL(const T& anEntry, TIdentityRelation<T> anIdentity) const;
+	inline TInt FindInSignedKeyOrderL(const T& anEntry) const;
+	inline TInt FindInUnsignedKeyOrderL(const T& anEntry) const;
+	inline TInt FindInOrderL(const T& anEntry, TLinearOrder<T> anOrder) const;
+	inline void FindInSignedKeyOrderL(const T& anEntry, TInt& anIndex) const;
+	inline void FindInUnsignedKeyOrderL(const T& anEntry, TInt& anIndex) const;
+	inline void FindInOrderL(const T& anEntry, TInt& anIndex, TLinearOrder<T> anOrder) const;
+	inline TInt SpecificFindInSignedKeyOrderL(const T& anEntry, TInt aMode) const;
+	inline TInt SpecificFindInUnsignedKeyOrderL(const T& anEntry, TInt aMode) const;
+	inline TInt SpecificFindInOrderL(const T& anEntry, TLinearOrder<T> anOrder, TInt aMode) const;
+	inline void SpecificFindInSignedKeyOrderL(const T& anEntry, TInt& anIndex, TInt aMode) const;
+	inline void SpecificFindInUnsignedKeyOrderL(const T& anEntry, TInt& anIndex, TInt aMode) const;
+	inline void SpecificFindInOrderL(const T& anEntry, TInt& anIndex, TLinearOrder<T> anOrder, TInt aMode) const;
+	inline void InsertInSignedKeyOrderL(const T& anEntry);
+	inline void InsertInUnsignedKeyOrderL(const T& anEntry);
+	inline void InsertInOrderL(const T& anEntry, TLinearOrder<T> anOrder);
+	inline void InsertInSignedKeyOrderAllowRepeatsL(const T& anEntry);
+	inline void InsertInUnsignedKeyOrderAllowRepeatsL(const T& anEntry);
+	inline void InsertInOrderAllowRepeatsL(const T& anEntry, TLinearOrder<T> anOrder);
+
+	inline void GranularCompress();
+	inline TInt Reserve(TInt aCount);
+	inline void ReserveL(TInt aCount);
+	inline void SortSigned();
+	inline void SortUnsigned();
+	inline void Sort(TLinearOrder<T> anOrder);
+	inline TArray<T> Array() const;
+#endif
+	};
+
+
+
+
+/**
+@publishedAll
+@released
+
+A simple and efficient specialized array of signed integers offering standard 
+array behaviour.
+
+Note that derivation from RPointerArrayBase is private.
+*/
+TEMPLATE_SPECIALIZATION class RArray<TInt> : private RPointerArrayBase
+	{
+public:
+	inline RArray();
+	inline explicit RArray(TInt aGranularity);
+	inline RArray(TInt aMinGrowBy, TInt aFactor);
+	inline void Close();
+	inline TInt Count() const;
+	inline const TInt& operator[](TInt anIndex) const;
+	inline TInt& operator[](TInt anIndex);
+	inline TInt Append(TInt anEntry);
+	inline TInt Insert(TInt anEntry, TInt aPos);
+	inline void Remove(TInt anIndex);
+	inline void Compress();
+	inline void Reset();
+	inline TInt Find(TInt anEntry) const;
+	inline TInt FindReverse(TInt anEntry) const;
+	inline TInt FindInOrder(TInt anEntry) const;
+	inline TInt FindInOrder(TInt anEntry, TInt& anIndex) const;
+	inline TInt SpecificFindInOrder(TInt anEntry, TInt aMode) const;
+	inline TInt SpecificFindInOrder(TInt anEntry, TInt& anIndex, TInt aMode) const;
+	inline TInt InsertInOrder(TInt anEntry);
+	inline TInt InsertInOrderAllowRepeats(TInt anEntry);
+#ifndef __KERNEL_MODE__
+	inline void AppendL(TInt anEntry);
+	inline void InsertL(TInt anEntry, TInt aPos);
+	inline TInt FindL(TInt anEntry) const;
+	inline TInt FindReverseL(TInt anEntry) const;
+	inline TInt FindInOrderL(TInt anEntry) const;
+	inline void FindInOrderL(TInt anEntry, TInt& anIndex) const;
+	inline TInt SpecificFindInOrderL(TInt anEntry, TInt aMode) const;
+	inline void SpecificFindInOrderL(TInt anEntry, TInt& anIndex, TInt aMode) const;
+	inline void InsertInOrderL(TInt anEntry);
+	inline void InsertInOrderAllowRepeatsL(TInt anEntry);
+
+	inline RArray(TInt* aEntries, TInt aCount);
+	inline void GranularCompress();
+	inline TInt Reserve(TInt aCount);
+	inline void ReserveL(TInt aCount);
+	inline void Sort();
+	inline TArray<TInt> Array() const;
+#endif
+	};
+
+
+
+
+/**
+@publishedAll
+@released
+
+Array of unsigned integers.
+
+The array is a simple and efficient specialized array of unsigned integers 
+offering standard array behaviour.
+
+The derivation from RPointerArrayBase is private.
+*/
+TEMPLATE_SPECIALIZATION class RArray<TUint> : private RPointerArrayBase
+	{
+public:
+	inline RArray();
+	inline explicit RArray(TInt aGranularity);
+	inline RArray(TInt aMinGrowBy, TInt aFactor);
+	inline void Close();
+	inline TInt Count() const;
+	inline const TUint& operator[](TInt anIndex) const;
+	inline TUint& operator[](TInt anIndex);
+	inline TInt Append(TUint anEntry);
+	inline TInt Insert(TUint anEntry, TInt aPos);
+	inline void Remove(TInt anIndex);
+	inline void Compress();
+	inline void Reset();
+	inline TInt Find(TUint anEntry) const;
+	inline TInt FindReverse(TUint anEntry) const;
+	inline TInt FindInOrder(TUint anEntry) const;
+	inline TInt FindInOrder(TUint anEntry, TInt& anIndex) const;
+	inline TInt SpecificFindInOrder(TUint anEntry, TInt aMode) const;
+	inline TInt SpecificFindInOrder(TUint anEntry, TInt& anIndex, TInt aMode) const;
+	inline TInt InsertInOrder(TUint anEntry);
+	inline TInt InsertInOrderAllowRepeats(TUint anEntry);
+#ifndef __KERNEL_MODE__
+	inline void AppendL(TUint anEntry);
+	inline void InsertL(TUint anEntry, TInt aPos);
+	inline TInt FindL(TUint anEntry) const;
+	inline TInt FindReverseL(TUint anEntry) const;
+	inline TInt FindInOrderL(TUint anEntry) const;
+	inline void FindInOrderL(TUint anEntry, TInt& anIndex) const;
+	inline TInt SpecificFindInOrderL(TUint anEntry, TInt aMode) const;
+	inline void SpecificFindInOrderL(TUint anEntry, TInt& anIndex, TInt aMode) const;
+	inline void InsertInOrderL(TUint anEntry);
+	inline void InsertInOrderAllowRepeatsL(TUint anEntry);
+
+	inline RArray(TUint* aEntries, TInt aCount);
+	inline void GranularCompress();
+	inline TInt Reserve(TInt aCount);
+	inline void ReserveL(TInt aCount);
+	inline void Sort();
+	inline TArray<TUint> Array() const;
+#endif
+	};
+
+#ifndef __LEAVE_EQUALS_THROW__
+
+class TTrapHandler;
+
+/**
+@internalComponent
+*/
+class TTrap
+	{
+public:
+#ifndef __KERNEL_MODE__
+	IMPORT_C TInt Trap(TInt& aResult);
+	IMPORT_C static void UnTrap();
+#endif
+public:
+	enum {EMaxState=0x10};
+public:
+	TInt iState[EMaxState];
+	TTrap* iNext;
+	TInt* iResult;
+	TTrapHandler* iHandler;
+	};
+
+
+
+/**
+@publishedAll
+@released
+
+Executes the set of C++ statements _s under a trap harness.
+
+Use this macro as a C++ statement.
+
+_r must be a TInt which has already been declared; if any of the
+C++ statements _s leaves, then the leave code is returned in _r,
+otherwise _r is set to KErrNone.
+
+_s can consist of multiple C++ statements; in theory, _s can consist
+of any legal C++ code but in practice, such statements consist of simple
+function calls, e.g. Foo() or an assignment of some value to the result of
+a function call, e.g. functionValue=GetFoo().
+
+A cleanup stack is constructed for the set of C++ statements _s.
+If any function in _s leaves, objects pushed to the cleanup stack are
+cleaned-up. In addition, if any of the C++ statements in _s leaves,
+then remaining C++ code in _s is not executed and any variables which
+are assigned within that remaining code are not defined.
+
+@param _r An lvalue, convertible to TInt&, which will receive the result of
+          any User::Leave() executed within _s or, if no leave occurred,
+          it will be set to KErrNone. The value of _r on entry is not used.
+
+@param _s C++ statements which will be executed under a trap harness.
+
+@see TRAPD
+*/
+#define TRAP(_r,_s) {TTrap __t;if (__t.Trap(_r)==0){_s;TTrap::UnTrap();}}
+
+/**
+@publishedAll
+@released
+
+Executes the set of C++ statements _s under a trap harness.
+
+Use this macro in the same way as you would TRAP, except that the
+variable _r is defined as part of the macro (and is therefore valid for the
+rest of the block in which the macro occurs). Often, this saves a line of code.
+
+@param _r A name, which will be declared as a TInt, and will receive the result
+          of any User::Leave() executed within _s or, if no leave occurred, it
+          will be set to KErrNone. After the macro, _r remains in scope until
+          the end of its enclosing block.
+
+@param _s C++ statements which will be executed under a trap harness.
+
+@see TRAP
+*/
+#define TRAPD(_r,_s) TInt _r;{TTrap __t;if (__t.Trap(_r)==0){_s;TTrap::UnTrap();}}
+
+/**
+@publishedAll
+@released
+
+Executes the set of C++ statements _s under a trap harness.
+Any leave code generated is ignored.
+
+Use this macro as a C++ statement.
+
+This macro is functionally equivalent to:
+@code
+	TInt x;
+	TRAP(x,_s)
+@endcode
+or
+@code
+	TRAPD(x,_s)
+@endcode
+where the value in 'x' is not used by any subsequent code.
+
+_s can consist of multiple C++ statements; in theory, _s can consist
+of any legal C++ code but in practice, such statements consist of simple
+function calls, e.g. Foo() or an assignment of some value to the result of
+a function call, e.g. functionValue=GetFoo().
+
+A cleanup stack is constructed for the set of C++ statements _s.
+If any function in _s leaves, objects pushed to the cleanup stack are
+cleaned-up. In addition, if any of the C++ statements in _s leaves,
+then remaining C++ code in _s is not executed and any variables which
+are assigned within that remaining code are not defined.
+
+@param _s C++ statements which will be executed under a trap harness.
+
+@see TRAPD
+@see TRAP
+*/
+#define TRAP_IGNORE(_s) {TInt _ignore;TTrap __t;if (__t.Trap(_ignore)==0){_s;TTrap::UnTrap();}}
+
+
+#else //__LEAVE_EQUALS_THROW__
+
+#ifdef __WINS__
+/** @internalComponent */
+#define __WIN32SEHTRAP		TWin32SEHTrap __trap; __trap.Trap();
+/** @internalComponent */
+#define __WIN32SEHUNTRAP	__trap.UnTrap();
+IMPORT_C void EmptyFunction();
+#define __CALL_EMPTY_FUNCTION	EmptyFunction();   
+#else // !__WINS__
+#define __WIN32SEHTRAP
+#define __WIN32SEHUNTRAP
+#define __CALL_EMPTY_FUNCTION
+#endif //__WINS__
+
+/** 
+This macro is used by the TRAP and TRAPD macros and provides a means
+of inserting code into uses of these.
+
+This macro is invoked before any 'trapped' code is called, and it should be
+redefined to do whatever task is required. E.g. this code:
+
+@code
+    #undef TRAP_INSTRUMENTATION_START
+    #define TRAP_INSTRUMENTATION_START DoMyLoging(__LINE__)
+@endcode
+
+Will cause all subsequent uses of the TRAP macros to behave in an
+equivalent way to:
+
+@code
+    DoMyLoging(__LINE__)
+    TRAP(r,SomeCodeL());
+@endcode
+
+
+@publishedPartner
+@released
+
+@see TRAP
+@see TRAPD
+*/
+#define TRAP_INSTRUMENTATION_START
+
+
+
+/** 
+This macro is used by the TRAP and TRAPD macros and provides a means
+of inserting code into uses of these.
+
+This macro is invoked if the 'trapped' code did not Leave.
+E.g. this code:
+
+@code
+    #undef TRAP_INSTRUMENTATION_NOLEAVE
+    #define TRAP_INSTRUMENTATION_NOLEAVE DoMyLoging(__LINE__)
+@endcode
+
+Will cause all subsequent uses of the TRAP macros to behave in an
+equivalent way to:
+
+@code
+    TRAP(r,SomeCodeL());
+    if(r==KErrNone) DoMyLoging(__LINE__);
+@endcode
+
+
+@param aLine The line number in the C++ source file where the TRAP or TRAPD
+             macro was used.
+
+@publishedPartner
+@released
+
+@see TRAP
+@see TRAPD
+*/
+#define TRAP_INSTRUMENTATION_NOLEAVE
+
+
+/** 
+This macro is used by the TRAP and TRAPD macros and provides a means
+of inserting code into uses of these.
+
+This macro is invoked if the 'trapped' code did Leave. E.g. this code:
+
+@code
+    #undef TRAP_INSTRUMENTATION_LEAVE
+    #define TRAP_INSTRUMENTATION_LEAVE(aResult) DoMyLoging(aResult,__LINE__)
+@endcode
+
+Will cause all subsequent uses of the TRAP macros to behave in an
+equivalent way to:
+
+@code
+    TRAP(r,SomeCodeL());
+    if(r!=KErrNone) DoMyLoging(r,__LINE__);
+@endcode
+
+
+@param aResult  A reference to the result value used in the TRAP macro.
+
+
+@publishedPartner
+@released
+
+@see TRAP
+@see TRAPD
+*/
+#define TRAP_INSTRUMENTATION_LEAVE(aResult)
+
+
+
+/** 
+This macro is used by the TRAP and TRAPD macros and provides a means
+of inserting code into uses of these.
+
+This macro is invoked after the 'trapped' code is called, regardless of whether
+or not it did Leave.  It should be redefined to do whatever task is
+required. E.g. this code:
+
+@code
+    #undef TRAP_INSTRUMENTATION_END
+    #define TRAP_INSTRUMENTATION_END DoMyLoging(__LINE__)
+@endcode
+
+Will cause all subsequent uses of the TRAP macros to behave in an
+equivalent way to:
+
+@code
+    TRAP(r,SomeCodeL());
+    DoMyLoging(__LINE__)
+@endcode
+
+
+@publishedPartner
+@released
+
+@see TRAP
+@see TRAPD
+*/
+#define TRAP_INSTRUMENTATION_END
+
+
+
+/**
+@publishedAll
+@released
+
+Executes the set of C++ statements _s under a trap harness.
+
+Use this macro as a C++ statement.
+
+_r must be a TInt which has already been declared; if any of the
+C++ statements _s leaves, then the leave code is returned in _r,
+otherwise _r is set to KErrNone.
+
+_s can consist of multiple C++ statements; in theory, _s can consist
+of any legal C++ code but in practice, such statements consist of simple
+function calls, e.g. Foo() or an assignment of some value to the result of
+a function call, e.g. functionValue=GetFoo().
+
+A cleanup stack is constructed for the set of C++ statements _s.
+If any function in _s leaves, objects pushed to the cleanup stack are
+cleaned-up. In addition, if any of the C++ statements in _s leaves,
+then remaining C++ code in _s is not executed and any variables which
+are assigned within that remaining code are not defined.
+
+@param _r An lvalue, convertible to TInt&, which will receive the result of
+          any User::Leave() executed within _s or, if no leave occurred,
+          it will be set to KErrNone. The value of _r on entry is not used.
+
+@param _s C++ statements which will be executed under a trap harness.
+
+@see TRAPD
+*/
+
+/*__CALL_EMPTY_FUNCTION(call to a function with an empty body) was added as a 
+workaround to a compiler bug (mwccsym2 - winscw ) which caused an incorrect 
+trap handler to be invoked when multiple nested TRAP's were present and 
+User::Leave(..) was called. */
+
+#define TRAP(_r, _s)										\
+	{														\
+	TInt& __rref = _r;										\
+	__rref = 0;												\
+	{ TRAP_INSTRUMENTATION_START; }							\
+	try	{													\
+		__WIN32SEHTRAP										\
+		TTrapHandler* ____t = User::MarkCleanupStack();		\
+		_s;													\
+		User::UnMarkCleanupStack(____t);					\
+		{ TRAP_INSTRUMENTATION_NOLEAVE; }					\
+		__WIN32SEHUNTRAP									\
+		}													\
+	catch (XLeaveException& l)								\
+		{													\
+		__rref = l.GetReason();								\
+		{ TRAP_INSTRUMENTATION_LEAVE(__rref); }				\
+		}													\
+	catch (...)												\
+		{													\
+		User::Invariant();									\
+		}													\
+	__CALL_EMPTY_FUNCTION									\
+	{ TRAP_INSTRUMENTATION_END; }							\
+	}
+
+
+/**
+@publishedAll
+@released
+
+Executes the set of C++ statements _s under a trap harness.
+
+Use this macro in the same way as you would TRAP, except that the
+variable _r is defined as part of the macro (and is therefore valid for the
+rest of the block in which the macro occurs). Often, this saves a line of code.
+
+@param _r A name, which will be declared as a TInt, and will receive the result
+          of any User::Leave() executed within _s or, if no leave occurred, it
+          will be set to KErrNone. After the macro, _r remains in scope until
+          the end of its enclosing block.
+
+@param _s C++ statements which will be executed under a trap harness.
+
+@see TRAP
+*/
+
+/*__CALL_EMPTY_FUNCTION(call to a function with an empty body) was added as a 
+workaround to a compiler bug (mwccsym2 - winscw ) which caused an incorrect 
+trap handler to be invoked when multiple nested TRAP's were present and 
+User::Leave(..) was called. */
+
+
+#define TRAPD(_r, _s)										\
+	TInt _r;												\
+	{														\
+	_r = 0;													\
+	{ TRAP_INSTRUMENTATION_START; }							\
+	try	{													\
+		__WIN32SEHTRAP										\
+		TTrapHandler* ____t = User::MarkCleanupStack();		\
+		_s;													\
+		User::UnMarkCleanupStack(____t);					\
+		{ TRAP_INSTRUMENTATION_NOLEAVE; }					\
+		__WIN32SEHUNTRAP									\
+		}													\
+	catch (XLeaveException& l)								\
+		{													\
+		_r = l.GetReason();									\
+		{ TRAP_INSTRUMENTATION_LEAVE(_r); }					\
+		}													\
+	catch (...)												\
+		{													\
+		User::Invariant();									\
+		}													\
+	__CALL_EMPTY_FUNCTION									\
+	{ TRAP_INSTRUMENTATION_END; }							\
+	}
+
+/**
+@publishedAll
+@released
+
+Executes the set of C++ statements _s under a trap harness.
+Any leave code generated is ignored.
+
+Use this macro as a C++ statement.
+
+This macro is functionally equivalent to:
+@code
+	TInt x;
+	TRAP(x,_s)
+@endcode
+or
+@code
+	TRAPD(x,_s)
+@endcode
+where the value in 'x' is not used by any subsequent code.
+
+Use this macro as a C++ statement.
+
+_s can consist of multiple C++ statements; in theory, _s can consist
+of any legal C++ code but in practice, such statements consist of simple
+function calls, e.g. Foo() or an assignment of some value to the result of
+a function call, e.g. functionValue=GetFoo().
+
+A cleanup stack is constructed for the set of C++ statements _s.
+If any function in _s leaves, objects pushed to the cleanup stack are
+cleaned-up. In addition, if any of the C++ statements in _s leaves,
+then remaining C++ code in _s is not executed and any variables which
+are assigned within that remaining code are not defined.
+
+@param _s C++ statements which will be executed under a trap harness.
+
+@see TRAPD
+@see TRAP
+*/
+
+/*__CALL_EMPTY_FUNCTION(call to a function with an empty body) was added as a 
+workaround to a compiler bug (mwccsym2 - winscw ) which caused an incorrect 
+trap handler to be invoked when multiple nested TRAP's were present and 
+User::Leave(..) was called. */
+
+#define TRAP_IGNORE(_s)										\
+	{														\
+	{ TRAP_INSTRUMENTATION_START; }							\
+	try	{													\
+		__WIN32SEHTRAP										\
+		TTrapHandler* ____t = User::MarkCleanupStack();		\
+		_s;													\
+		User::UnMarkCleanupStack(____t);					\
+		{ TRAP_INSTRUMENTATION_NOLEAVE; }					\
+		__WIN32SEHUNTRAP									\
+		}													\
+	catch (XLeaveException& l)								\
+		{													\
+		l.GetReason();										\
+		{ TRAP_INSTRUMENTATION_LEAVE(l.Reason()); }			\
+		}													\
+	catch (...)												\
+		{													\
+		User::Invariant();									\
+		}													\
+	__CALL_EMPTY_FUNCTION									\
+	{ TRAP_INSTRUMENTATION_END; }							\
+	}
+
+
+#endif //__LEAVE_EQUALS_THROW__
+
+/* The macro __SYMBIAN_STDCPP_SUPPORT__ is defined when building a StdC++ target.
+ * In this case, operator new and operator delete below should not be declared
+ * to avoid clashing with StdC++ declarations.
+ */ 
+
+#ifndef __SYMBIAN_STDCPP_SUPPORT__
+
+#ifndef __OPERATOR_NEW_DECLARED__
+
+/* Some operator new and operator delete overloads may be declared in compiler
+ * pre-include files.
+ *
+ * __OPERATOR_NEW_DECLARED__ is #defined if they are, so that we can avoid
+ * re-declaring them here.
+ */
+
+#define __OPERATOR_NEW_DECLARED__
+
+/**
+@publishedAll
+@released
+*/
+GLREF_C TAny* operator new(TUint aSize) __NO_THROW;
+
+/**
+@publishedAll
+@released
+*/
+GLREF_C TAny* operator new(TUint aSize,TUint anExtraSize) __NO_THROW;
+
+/**
+@publishedAll
+@released
+*/
+GLREF_C void operator delete(TAny* aPtr) __NO_THROW;
+
+#ifndef __PLACEMENT_VEC_NEW_INLINE
+/**
+@publishedAll
+@released
+*/
+GLREF_C TAny* operator new[](TUint aSize) __NO_THROW;
+
+/**
+@publishedAll
+@released
+*/
+GLREF_C void operator delete[](TAny* aPtr) __NO_THROW;
+#endif // !__PLACEMENT_VEC_NEW_INLINE
+
+#endif // !__OPERATOR_NEW_DECLARED__
+
+#endif // !__SYMBIAN_STDCPP_SUPPORT__
+
+/**
+@publishedAll
+@released
+*/
+inline TAny* operator new(TUint aSize, TAny* aBase) __NO_THROW;
+
+/**
+@publishedAll
+@released
+*/
+inline void operator delete(TAny* aPtr, TAny* aBase) __NO_THROW;
+
+#ifndef __PLACEMENT_VEC_NEW_INLINE
+/**
+@publishedAll
+@released
+*/
+inline TAny* operator new[](TUint aSize, TAny* aBase) __NO_THROW;
+
+/**
+@publishedAll
+@released
+*/
+inline void operator delete[](TAny* aPtr, TAny* aBase) __NO_THROW;
+
+#endif // !__PLACEMENT_VEC_NEW_INLINE
+
+#if !defined(__BOOL_NO_TRUE_TRAP__)
+
+/**
+@publishedAll
+@released
+*/
+TBool operator==(TTrue,volatile const TBool);
+
+/**
+@publishedAll
+@released
+*/
+TBool operator==(volatile const TBool,TTrue);
+
+/**
+@publishedAll
+@released
+*/
+TBool operator!=(TTrue,volatile const TBool);
+
+/**
+@publishedAll
+@released
+*/
+TBool operator!=(volatile const TBool,TTrue);
+#endif
+
+
+
+
+/**
+@publishedAll
+@released
+
+A Version 2 client/server class that clients use to package 
+the arguments to be sent to a server.
+
+The object can package up to 4 arguments together with information about each
+argument's type, width and accessibility; it is also possible for
+the package to contain zero arguments. In addition to the default constructor,
+the class has four templated constructors, allowing an object of this type to
+be constructed for 0, 1, 2, 3 or 4 arguments.
+
+Internally, the arguments are stored in a simple TInt array.
+Consecutive arguments in a constructor's parameter list are put into
+consecutive slots in the array. The Set() overloaded functions can be used
+to set argument values into specific slots within this array.
+*/
+class TIpcArgs
+	{
+public:
+    /**
+    @internalComponent
+    
+    Argument types; some of these may be ORed together to specify
+	type, accessibility, and width.
+    */
+	enum TArgType
+		{
+		EUnspecified = 0,                         /**< Type not specified.*/
+		EHandle = 1,                              /**< Handle type.*/
+		EFlagDes = 4,                             /**< Descriptor type.*/
+		EFlagConst = 2,                           /**< Read only type.*/
+		EFlag16Bit = 1,                           /**< 16 bit rather than 8 bit.*/
+		EDes8 = EFlagDes,                         /**< 8 bit read/write descriptor.*/
+		EDes16 = EFlagDes|EFlag16Bit,             /**< 16 bit read/write descriptor.*/
+		EDesC8 = EFlagDes|EFlagConst,             /**< 8 bit read only descriptor.*/
+		EDesC16 = EFlagDes|EFlagConst|EFlag16Bit, /**< 16 bit read only descriptor.*/
+		};
+
+
+    /**
+    @internalComponent
+    
+    Bit width of type information.
+	*/
+	enum {
+	     KBitsPerType=3 /** Number of bits of type information used for each of the 4 arguments. */
+	     };
+	
+	
+	/**
+	Indicates a Null argument.
+	*/
+	enum TNothing {
+	              /**
+	              An enum value that can be used to indicate an empty or
+	              unused argument to a server. For example:
+	
+                  @code
+                  TIpcArgs args(arg1, TIpcArgs::ENothing, arg2);
+                  @endcode
+    
+                  This argument will have an undefined value when the server
+                  receives the message.
+	              */
+	              ENothing
+	              };
+public:
+    /**
+    Default constructor.
+    
+    An argument package constructed using this constructor has no arguments;
+    however, arguments can subsequently be set into this argument package object
+    using the Set() member functions.
+    */
+	inline TIpcArgs()
+		:iFlags(0)
+		{}
+		
+		
+    /**
+    A templated constructor that constructs the argument package; it takes
+    1 argument.
+    
+    @param a0 An argument of general class type T0 to be contained by
+              this object.
+    */		
+	template <class T0>
+	inline explicit TIpcArgs(T0 a0)
+		{
+		Assign(iArgs[0],a0);
+		iFlags=(Type(a0)<<(0*KBitsPerType));
+		}
+		
+		
+    /**
+    A templated constructor that constructs the argument package; it takes
+    2 arguments.
+    
+    @param a0 An argument of general class type T0 to be contained by
+              this object.
+    @param a1 An argument of general class type T1 to be contained by
+              this object.
+    */		
+	template <class T0,class T1>
+	inline TIpcArgs(T0 a0,T1 a1)
+		{
+		Assign(iArgs[0],a0);
+		Assign(iArgs[1],a1);
+		iFlags=(Type(a0)<<(0*KBitsPerType))|(Type(a1)<<(1*KBitsPerType));
+		}
+				
+		
+    /**
+    A templated constructor that constructs the argument package; it takes
+    3 arguments.
+    
+    @param a0 An argument of general class type T0 to be contained by
+              this object.
+    @param a1 An argument of general class type T1 to be contained by
+              this object.
+    @param a2 An argument of general class type T2 to be contained by
+              this object.
+    */		
+	template <class T0,class T1,class T2>
+	inline TIpcArgs(T0 a0,T1 a1,T2 a2)
+		{
+		Assign(iArgs[0],a0);
+		Assign(iArgs[1],a1);
+		Assign(iArgs[2],a2);
+		iFlags=(Type(a0)<<(0*KBitsPerType))|(Type(a1)<<(1*KBitsPerType))|(Type(a2)<<(2*KBitsPerType));
+		}
+
+
+    /**
+    A templated constructor that constructs the argument package; it takes
+    4 arguments.
+    
+    @param a0 An argument of general class type T0 to be contained by
+              this object.
+    @param a1 An argument of general class type T1 to be contained by
+              this object.
+    @param a2 An argument of general class type T2 to be contained by
+              this object.
+    @param a3 An argument of general class type T3 to be contained by
+              this object.
+    */		
+	template <class T0,class T1,class T2,class T3>
+	inline TIpcArgs(T0 a0,T1 a1,T2 a2,T3 a3)
+		{
+		Assign(iArgs[0],a0);
+		Assign(iArgs[1],a1);
+		Assign(iArgs[2],a2);
+		Assign(iArgs[3],a3);
+		iFlags=(Type(a0)<<(0*KBitsPerType))|(Type(a1)<<(1*KBitsPerType))|(Type(a2)<<(2*KBitsPerType))|(Type(a3)<<(3*KBitsPerType));
+		}
+	//
+	inline void Set(TInt aIndex,TNothing);
+	inline void Set(TInt aIndex,TInt aValue);
+	inline void Set(TInt aIndex,const TAny* aValue);
+	inline void Set(TInt aIndex,RHandleBase aValue);
+	inline void Set(TInt aIndex,const TDesC8* aValue);
+#ifndef __KERNEL_MODE__
+	inline void Set(TInt aIndex,const TDesC16* aValue);
+#endif
+	inline void Set(TInt aIndex,TDes8* aValue);
+#ifndef __KERNEL_MODE__
+	inline void Set(TInt aIndex,TDes16* aValue);
+#endif
+private:
+	inline static TArgType Type(TNothing);
+	inline static TArgType Type(TInt);
+	inline static TArgType Type(const TAny*);
+	inline static TArgType Type(RHandleBase aValue);
+	inline static TArgType Type(const TDesC8*);
+#ifndef __KERNEL_MODE__
+	inline static TArgType Type(const TDesC16*);
+#endif
+	inline static TArgType Type(TDes8*);
+#ifndef __KERNEL_MODE__
+	inline static TArgType Type(TDes16*);
+#endif
+	//
+	inline static void Assign(TInt&,TNothing);
+	inline static void Assign(TInt& aArg,TInt aValue);
+	inline static void Assign(TInt& aArg,const TAny* aValue);
+	inline static void Assign(TInt& aArg,RHandleBase aValue);
+	inline static void Assign(TInt& aArg,const TDesC8* aValue);
+#ifndef __KERNEL_MODE__
+	inline static void Assign(TInt& aArg,const TDesC16* aValue);
+#endif
+	inline static void Assign(TInt& aArg,TDes8* aValue);
+#ifndef __KERNEL_MODE__
+	inline static void Assign(TInt& aArg,TDes16* aValue);
+#endif
+public:
+    
+    /**
+    The location where the message arguments are stored.
+    
+    There is no reason to access this data member directly and it should be
+    considered as internal.
+    */
+	TInt iArgs[KMaxMessageArguments];
+	
+	/**
+	The location where the flag bits describing the argument types are stored.
+	
+	The symbolic values describing the argument types are internal to Symbian,
+	and there is therefore no reason to access this data member directly.
+	It should be considered as internal.
+	*/
+	TInt iFlags;
+	};
+
+// Structures for passing 64 bit integers and doubles across GCC/EABI boundaries
+
+/**
+@internalComponent
+*/
+struct SInt64
+	{
+public:
+	inline SInt64();
+	inline SInt64(Int64 a);
+	inline SInt64& operator=(Int64 a);
+	inline operator Int64() const;
+public:
+	TUint32 iData[2];	// little endian
+	};
+
+/**
+@internalComponent
+*/
+struct SUint64
+	{
+public:
+	inline SUint64();
+	inline SUint64(Uint64 a);
+	inline SUint64& operator=(Uint64 a);
+	inline operator Uint64() const;
+public:
+	TUint32 iData[2];	// little endian
+	};
+
+/**
+@internalComponent
+*/
+struct SDouble
+	{
+public:
+	inline SDouble();
+	inline SDouble(TReal a);
+	inline SDouble& operator=(TReal a);
+	inline operator TReal() const;
+public:
+	TUint32 iData[2];	// always little endian
+	};
+
+/**
+@publishedAll
+@released
+
+Stores information about a thread's stack.
+
+Note, on the emulator, the memory between iLimit and the thread's current stack pointer
+may not actually be committed.
+
+@see RThread::StackInfo()
+*/
+class TThreadStackInfo
+	{
+public:
+    /**
+    The address which the stack pointer would contain if the stack were empty.
+    */
+	TLinAddr iBase;
+	
+	/**
+	The address which the stack pointer would contain if the stack were full,
+    (The lowest valid address).
+	*/
+	TLinAddr iLimit;
+	
+	/**
+	The limit value for the stack if it were expanded to its maximum size.
+    
+    Currently expanding stacks is not supported so iExpandLimit==iLimit
+	*/
+	TLinAddr iExpandLimit;
+	};
+
+
+
+
+#ifdef __SUPPORT_CPP_EXCEPTIONS__
+/**
+@internalComponent
+@released
+
+The class used to implement User::Leave in term of throw and TRAP in terms of catch.
+
+*/
+class XLeaveException
+	{
+public:
+	inline XLeaveException() {}
+	inline XLeaveException(TInt aReason) {iR = aReason;}
+	inline TInt Reason() const {return iR;}
+	IMPORT_C TInt GetReason() const;
+private:
+#if __ARMCC_VERSION >= 220000 || (defined(__TOOLS2__) && defined(__linux__))
+	// From rvct 2.2 onwards we want the class impedimenta to be shared, so create a key function.
+	// Unfortunately we can't make this the key function the dtor since this would make it impossible for existing 2.1 
+	// derived binaries to be 'BC' with 2.2 binaries (in the general case (which I wont attempt to describe coz its
+	// too complex) so its best to be safe). As a clue: if 2.1 is used to compile with a key function its not possible 
+	// for catch handlers to work :-( (see the old code).
+	virtual void ForceKeyFunction();	
+#endif
+private:
+#if __ARMCC_VERSION < 220000
+	TAny* iVtable;							// reserve space for vtable
+#endif	
+	TInt iR;
+	};
+
+// The standard header file <exception> defines the following guard macro for EDG and CW, VC++, GCC respectively.
+// The guard below is ugly. It will surely come back and bite us unless we resolve the whole issue of standard headers
+// when we move to supporting Standard C++.
+
+// The macro __SYMBIAN_STDCPP_SUPPORT__ is defined when building a StdC++ target.
+// In this case, we wish to avoid declaring uncaught_exception below since it clashes with the StdC++ specification
+ 
+#if !defined(_EXCEPTION) && !defined(_EXCEPTION_) && !defined(__EXCEPTION__) && !defined(__SYMBIAN_STDCPP_SUPPORT__)
+// Declare standard C++ functions relating to exceptions here
+namespace std {
+#if defined(__VC32__) || defined(__CW32__)
+  bool uncaught_exception();
+#else
+  IMPORT_C bool uncaught_exception();
+#endif
+  void terminate(void);
+  void unexpected(void);
+  typedef void (*terminate_handler)();
+  terminate_handler set_terminate(terminate_handler h) throw();
+  typedef void (*unexpected_handler)();
+  unexpected_handler set_unexpected(unexpected_handler h) throw();
+}
+
+#endif
+#endif //__SUPPORT_CPP_EXCEPTIONS__
+
+#ifdef __WINS__
+
+#ifndef __WIN32_SEH_TYPES_KNOWN__
+class __UnknownWindowsType1;
+class __UnknownWindowsType2;
+#endif
+
+class TWin32SEHTrap;
+
+/**
+ * Typedef for the SEH handler function
+ * @internalComponent
+ */
+typedef TUint32 (TWin32SEHExceptionHandler)(__UnknownWindowsType1* aExceptionRecord, TWin32SEHTrap* aRegistrationRecord, __UnknownWindowsType2* aContext);
+
+/**
+ * @internalComponent
+ */
+class TWin32SEHTrap
+	{
+private:
+	// Prevent copy/assign
+    TWin32SEHTrap(TWin32SEHTrap const &);
+    TWin32SEHTrap& operator=(TWin32SEHTrap const &);
+
+#ifdef __KERNEL_MODE__
+//
+// Kernel-side functions for nkern exception handler
+//
+public:
+	/** Find final exception handler in SEH chain */
+	static TWin32SEHTrap* IterateForFinal();
+
+	/** Access exception handler */
+	TWin32SEHExceptionHandler* ExceptionHandler();
+
+private:
+
+#else // !__KERNEL_MODE__
+//
+// User-side functions for use in TRAP(...)
+//
+public:
+	UIMPORT_C TWin32SEHTrap();
+
+public:
+	/** Add object to SEH chain */
+	UIMPORT_C void Trap();
+
+	/** Remove object from SEH chain */
+	UIMPORT_C void UnTrap();
+
+#ifndef __IN_SEH_CPP__
+private:
+#endif
+	/** Handle Win32 exceptions */
+	static TUint32 ExceptionHandler(__UnknownWindowsType1* aException, TWin32SEHTrap* aRegistrationRecord, __UnknownWindowsType2* aContext);
+
+#endif //__KERNEL_MODE__
+
+	//
+	// NB: This is really an _EXCEPTION_REGISTRATION_RECORD
+	//
+    TWin32SEHTrap*					iPrevExceptionRegistrationRecord;	/** Link to previous SEH record */
+	TWin32SEHExceptionHandler*		iExceptionHandler;					/** SEH handler function */
+
+private:
+	TUint32 iPadding[254];	// discourage the compiler from putting this in reused function parameter space
+	};
+
+#else // !__WINS__
+
+#ifdef __X86__
+/**
+ * @internalComponent
+ */
+class TWin32SEHTrap
+	{
+public:
+	UIMPORT_C TWin32SEHTrap();
+	UIMPORT_C void Trap();
+	UIMPORT_C void UnTrap();
+	};
+#endif //__X86__
+#endif //__WINS__
+
+/**
+@internalTechnology
+ */
+struct TEmulatorImageHeader
+	{
+	TUid iUids[KMaxCheckedUid];
+	TProcessPriority iPriority;
+	SSecurityInfo iS;
+	TUint32 iSpare1;
+	TUint32 iSpare2;
+	TUint32 iModuleVersion;
+	TUint32 iFlags;
+	};
+
+// forward declaration of shareable data buffers pool infomation
+class TShPoolInfo;
+
+#include <e32cmn.inl>
+
+#ifndef SYMBIAN_ENABLE_SPLIT_HEADERS
+#include <e32cmn_private.h>
+#endif
+
+#endif //__E32CMN_H__
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32/include/e32cmn.inl	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,7268 @@
+// Copyright (c) 1994-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32\include\e32cmn.inl
+// 
+//
+
+#ifndef __PLACEMENT_NEW_INLINE
+#define __PLACEMENT_NEW_INLINE
+// Global placement operator new
+inline TAny* operator new(TUint /*aSize*/, TAny* aBase) __NO_THROW
+	{return aBase;}
+
+// Global placement operator delete
+inline void operator delete(TAny* /*aPtr*/, TAny* /*aBase*/) __NO_THROW
+	{}
+#endif //__PLACEMENT_NEW_INLINE
+
+#ifndef __PLACEMENT_VEC_NEW_INLINE
+#define __PLACEMENT_VEC_NEW_INLINE
+// Global placement operator new[]
+inline TAny* operator new[](TUint /*aSize*/, TAny* aBase) __NO_THROW
+	{return aBase;}
+
+// Global placement operator delete[]
+inline void operator delete[](TAny* /*aPtr*/, TAny* /*aBase*/) __NO_THROW
+	{}
+#endif //__PLACEMENT_VEC_NEW_INLINE
+
+
+// class RAllocator
+inline RAllocator::RAllocator()
+	{
+	iAccessCount=1;
+	iHandleCount=0;
+	iHandles=0;
+	iFlags=0;
+	iCellCount=0;
+	iTotalAllocSize=0;
+	}
+inline void RAllocator::__DbgMarkCheck(TBool aCountAll, TInt aCount, const TUint8* aFileName, TInt aLineNum)
+	{__DbgMarkCheck(aCountAll, aCount, TPtrC8(aFileName), aLineNum);}
+
+// Class RHeap
+inline RHeap::RHeap()
+	{}
+
+/**
+@return The maximum length to which the heap can grow.
+
+@publishedAll
+@released
+*/
+inline TInt RHeap::MaxLength() const
+	{return iMaxLength;}
+
+inline void RHeap::operator delete(TAny*, TAny*) 
+/**
+Called if constructor issued by operator new(TUint aSize, TAny* aBase) throws exception.
+This is dummy as corresponding new operator does not allocate memory.
+*/
+	{}
+
+
+inline TUint8* RHeap::Base() const
+/**
+Gets a pointer to the start of the heap.
+	
+Note that because of the small space overhead incurred by all allocated cells, 
+no cell will have the same address as that returned by this function.
+	
+@return A pointer to the base of the heap.
+*/
+	{return iBase;}
+
+
+
+
+inline TInt RHeap::Size() const
+/**
+Gets the current size of the heap.
+
+This is the total number of bytes committed by the host chunk. 
+It is the requested size rounded up by page size minus the size of RHeap object(116 bytes)
+minus the cell alignment overhead as shown:
+
+Size = (Rounded committed size - Size of RHeap - Cell Alignment Overhead).
+
+The cell alignment overhead varies between release builds and debug builds.
+
+Note that this value is always greater than the total space available across all allocated cells.
+	
+@return The size of the heap.
+
+@see Rheap::Available( )
+*/
+	{return iTop-iBase;}
+
+
+
+
+inline TInt RHeap::Align(TInt a) const
+/**
+@internalComponent
+*/
+	{return _ALIGN_UP(a, iAlign);}
+
+
+
+
+inline const TAny* RHeap::Align(const TAny* a) const
+/**
+@internalComponent
+*/
+	{return (const TAny*)_ALIGN_UP((TLinAddr)a, iAlign);}
+
+
+
+
+inline TBool RHeap::IsLastCell(const SCell* aCell) const
+/**
+@internalComponent
+*/
+	{return (((TUint8*)aCell) + aCell->len) == iTop;}
+
+
+
+
+#ifndef __KERNEL_MODE__
+inline void RHeap::Lock() const
+/**
+@internalComponent
+*/
+	{((RFastLock&)iLock).Wait();}
+
+
+
+
+inline void RHeap::Unlock() const
+/**
+@internalComponent
+*/
+	{((RFastLock&)iLock).Signal();}
+
+
+inline TInt RHeap::ChunkHandle() const
+/**
+@internalComponent
+*/
+	{
+	return iChunkHandle;
+	}
+#endif
+
+
+
+
+// Class TRefByValue
+template <class T>
+inline TRefByValue<T>::TRefByValue(T &aRef)
+	: iRef(aRef)
+/**
+Constructs this value reference for the specified referenced object.
+
+@param aRef The referenced object.
+*/
+	{}
+
+
+
+
+template <class T>
+inline TRefByValue<T>::operator T &()
+/**
+Gets a reference to the object encapsulated inside this value reference.
+*/
+	{return(iRef);}
+
+
+
+
+/**
+Creates the logical channel.
+
+@param aDevice    The name of the logical device for which the channel
+                  is to be constructed. This is the name by which
+				  the LDD factory object, i.e. the instance of
+				  the DLogicalDevice derived class, is known.
+@param aVer       The required version of the logical device. The driver
+                  normally checks this against the version of the logical
+				  channel, returning KErrNotSupported if the logical channel
+				  is not compatible.
+@param aUnit      A unit of the device. This argument only has meaning if
+                  the flag KDeviceAllowUnit is set in the iParseMask data
+				  member of the LDD factory object.
+@param aDriver    A pointer to a descriptor containing the name of
+                  a physical device. This is the name by which the PDD
+				  factory object, i.e. the instance of the DPhysicalDevice
+				  derived class, is known.
+                  This is NULL, if no explicit name is to be supplied, or
+				  the logical device does not require an accompanying physical
+				  device.
+@param aInfo      A pointer to an explicit 8-bit descriptor containing extra
+                  information for the physical device. This argument only has
+				  meaning if the KDeviceAllowInfo flag is set in the iParseMask
+				  data member of the LDD factory object.
+@param aType      An enumeration whose enumerators define the ownership of
+                  this handle. If not explicitly specified, EOwnerProcess is
+				  taken as default.
+@param aTransferable If false, the channel is created as an object which is
+                     local/private to the current process.
+                     If true, the channel is an object which may be shared with
+                     other processes using the IPC mechanisms for handle passing.
+	
+@return  KErrNone, if successful; otherwise one of the other system wide
+         error codes.
+*/
+inline TInt RBusLogicalChannel::DoCreate(const TDesC& aDevice, const TVersion& aVer, TInt aUnit, const TDesC* aDriver, const TDesC8* aInfo, TOwnerType aType, TBool aTransferable)
+	{ return DoCreate(aDevice, aVer, aUnit, aDriver, aInfo, (TInt)aType | (aTransferable?KCreateProtectedObject:0) ); }
+
+
+
+
+// Class TChar
+inline TChar::TChar()
+/**
+Default constructor.
+
+Constructs this character object with an undefined value.
+*/
+	{}
+
+
+
+
+inline TChar::TChar(TUint aChar)
+	: iChar(aChar)
+/**
+Constructs this character object and initialises it with the specified value.
+
+@param aChar The initialisation value.
+*/
+	{}
+
+
+
+
+inline TChar& TChar::operator-=(TUint aChar)
+/**
+Subtracts an unsigned integer value from this character object.
+
+This character object is changed by the operation.
+
+@param aChar The value to be subtracted.
+
+@return A reference to this character object.
+*/
+	{iChar-=aChar;return(*this);}
+
+
+
+
+inline TChar& TChar::operator+=(TUint aChar)
+/**
+Adds an unsigned integer value to this character object.
+
+This character object is changed by the operation.
+
+@param aChar The value to be added.
+
+@return A reference to this character object.
+*/
+	{iChar+=aChar;return(*this);}
+
+
+
+
+inline TChar TChar::operator-(TUint aChar)
+/**
+Gets the result of subtracting an unsigned integer value from this character 
+object.
+
+This character object is not changed.
+
+@param aChar The value to be subtracted.
+
+@return A character object whose value is the result of the subtraction
+        operation.
+*/
+	{return(iChar-aChar);}
+
+
+
+
+inline TChar TChar::operator+(TUint aChar)
+/** 
+Gets the result of adding an unsigned integer value to this character object. 
+
+This character object is not changed.
+
+@param aChar The value to be added.
+
+@return A character object whose value is the result of the addition operation.
+*/
+	{return(iChar+aChar);}
+
+
+
+
+inline TChar::operator TUint() const
+/**
+Gets the value of the character as an unsigned integer. 
+
+The operator casts a TChar to a TUint, returning the TUint value wrapped by
+this character object.
+*/
+	{return(iChar);}
+
+
+
+
+// Class TDesC8
+inline TBool TDesC8::operator<(const TDesC8 &aDes) const
+/**
+Determines whether this descriptor's data is less than the specified
+descriptor's data.
+
+The comparison is implemented using the Compare() member function.
+
+@param aDes The 8-bit non-modifable descriptor whose data is to be compared 
+            with this descriptor's data.
+            
+@return True if greater than or equal, false otherwise.
+
+@see TDesC8::Compare
+*/
+	{return(Compare(aDes)<0);}
+
+
+
+
+inline TBool TDesC8::operator<=(const TDesC8 &aDes) const
+/**
+Determines whether this descriptor's data is less than or equal to the
+specified descriptor's data.
+
+The comparison is implemented using the Compare() member function.
+
+@param aDes The 8-bit non-modifable descriptor whose data is to be compared 
+            with this descriptor's data. 
+            
+@return True if less than or equal, false otherwise. 
+
+@see TDesC8::Compare
+*/
+	{return(Compare(aDes)<=0);}
+
+
+
+
+inline TBool TDesC8::operator>(const TDesC8 &aDes) const
+/**
+Determines whether this descriptor's data is greater than the specified
+descriptor's data.
+
+The comparison is implemented using the Compare() member function.
+
+@param aDes The 8-bit non-modifable descriptor whose data is to be compared 
+            with this descriptor's data. 
+            
+@return True if greater than, false otherwise. 
+
+@see TDesC8::Compare
+*/
+	{return(Compare(aDes)>0);}
+
+
+
+
+inline TBool TDesC8::operator>=(const TDesC8 &aDes) const
+/**
+Determines whether this descriptor's data is greater than or equal to the
+specified descriptor's data.
+
+The comparison is implemented using the Compare() member function.
+
+@param aDes The 8-bit non-modifable descriptor whose data is to be compared 
+            with this descriptor's data. 
+            
+@return True if greater than, false otherwise.
+
+@see TDesC8::Compare
+*/
+	{return(Compare(aDes)>=0);}
+
+
+
+
+inline TBool TDesC8::operator==(const TDesC8 &aDes) const
+/**
+Determines whether this descriptor's data is equal to the specified
+descriptor's data.
+
+The comparison is implemented using the Compare() member function.
+
+@param aDes The 8-bit non-modifable descriptor whose data is to be compared 
+            with this descriptor's data. 
+            
+@return True if equal, false otherwise. 
+
+@see TDesC8::Compare
+*/
+	{return(Compare(aDes)==0);}
+
+
+
+
+inline TBool TDesC8::operator!=(const TDesC8 &aDes) const
+/**
+Determines whether this descriptor's data is not equal to the specified
+descriptor's data.
+
+The comparison is implemented using the Compare() member function.
+
+@param aDes The 8-bit non-modifable descriptor whose data is to be compared 
+            with this descriptor's data. 
+            
+@return True if not equal, false otherwise. 
+
+@see TDesC8::Compare
+*/
+	{return(Compare(aDes)!=0);}
+
+
+
+
+inline const TUint8 &TDesC8::operator[](TInt anIndex) const
+/**
+Gets a reference to a single data item within this descriptor's data.
+
+@param anIndex The position of the individual data item within the descriptor's 
+               data. This is an offset value; a zero value refers to the
+               leftmost data position. 
+               
+@return A reference to the data item.
+
+@panic USER 21, if anIndex is negative or greater than or equal to the current
+                length of the descriptor.
+*/
+	{return(AtC(anIndex));}
+
+
+
+
+inline TInt TDesC8::Length() const
+/**
+Gets the length of the data.
+
+This is the number of 8-bit values or data items represented by the descriptor.
+
+@return The length of the data represented by the descriptor.
+*/
+	{return(iLength&KMaskDesLength8);}
+
+
+
+
+inline TInt TDesC8::Size() const
+/**
+Gets the size of the data.
+
+This is the number of bytes occupied by the data represented by the descriptor.
+
+@return The size of the data represented by the descriptor.
+*/
+	{return(Length());}
+
+
+
+
+inline void TDesC8::DoSetLength(TInt aLength)
+	{iLength=(iLength&(~KMaskDesLength8))|aLength;}
+
+
+
+
+// Class TPtrC8
+inline void TPtrC8::Set(const TUint8 *aBuf,TInt aLength)
+/**
+Sets the 8-bit non-modifiable pointer descriptor to point to the specified 
+location in memory, whether in RAM or ROM.
+
+The length of the descriptor is set to the specified length.
+
+@param aBuf    A pointer to the location that the descriptor is to represent.
+@param aLength The length of the descriptor. This value must be non-negative.
+
+@panic USER 29, if aLength is negative.
+*/
+	{new(this) TPtrC8(aBuf,aLength);}
+
+
+
+
+inline void TPtrC8::Set(const TDesC8 &aDes)
+/**
+Sets the 8-bit non-modifiable pointer descriptor from the specified descriptor.
+
+It is set to point to the same data and is given the same length.
+
+@param aDes A reference to an 8-bit non-modifiable descriptor.
+*/
+	{new(this) TPtrC8(aDes);}
+
+
+
+
+inline void TPtrC8::Set(const TPtrC8& aPtr)
+/**
+Sets the 8-bit non-modifiable pointer descriptor from the specified
+non-modifiable pointer descriptor.
+
+It is set to point to the same data and is given the same length.
+
+@param aPtr A reference to an 8-bit non-modifiable pointer descriptor.
+*/
+	{new(this) TPtrC8(aPtr);}
+
+
+
+
+
+// class TBufCBase8
+inline TPtr8 TBufCBase8::DoDes(TInt aMaxLength)
+	{return TPtr8(*this,aMaxLength);}
+
+
+
+
+// Template class TBufC8
+template <TInt S>
+inline TBufC8<S>::TBufC8()
+	: TBufCBase8()
+/** 
+Constructs an empty 8-bit non-modifiable buffer descriptor.
+
+It contains no data.
+
+The integer template parameter determines the size of the data area which 
+is created as part of the buffer descriptor object.
+
+Data can, subsequently, be assigned into this buffer descriptor using the 
+assignment operators.
+
+@see TBufC8::operator=
+*/
+	{}
+
+
+
+
+template <TInt S>
+inline TBufC8<S>::TBufC8(const TUint8 *aString)
+	: TBufCBase8(aString,S)
+/**
+Constructs the 8-bit non-modifiable buffer descriptor from a zero terminated 
+string.
+
+The integer template parameter determines the size of the data area which 
+is created as part of this object.
+
+The string, excluding the zero terminator, is copied into this buffer descriptor's 
+data area. The length of this buffer descriptor is set to the length of the 
+string, excluding the zero terminator.
+
+@param aString A pointer to a zero terminated string.
+
+@panic USER 20, if the length of the string, excluding the zero terminator, is
+                greater than the value of the integer template parameter.
+*/
+	{}
+
+
+
+
+template <TInt S>
+inline TBufC8<S>::TBufC8(const TDesC8 &aDes)
+	: TBufCBase8(aDes,S)
+/**
+Constructs the 8-bit non-modifiable buffer descriptor from any
+existing descriptor.
+
+The integer template parameter determines the size of the data area which 
+is created as part of this object.
+
+Data is copied from the source descriptor into this buffer descriptor and 
+the length of this buffer descriptor is set to the length of the
+source descriptor.
+
+@param aDes The source 8-bit non-modifiable descriptor.
+
+@panic USER 20, if the length of the source descriptor is
+                greater than the value of the integer template parameter.
+*/
+	{}
+
+
+
+
+template <TInt S>
+inline TBufC8<S> &TBufC8<S>::operator=(const TUint8 *aString)
+/**
+Copies data into this descriptor, replacing any existing data.
+
+The length of this descriptor is set to reflect the new data.
+
+@param aString A pointer to a zero-terminated string. 
+
+@return A reference to this descriptor.
+
+@panic USER 23, if the length of the string, excluding the zero terminator, is
+                greater than the maximum length of this (target) descriptor.
+*/
+	{Copy(aString,S);return(*this);}
+
+
+
+
+template <TInt S>
+inline TBufC8<S> &TBufC8<S>::operator=(const TDesC8 &aDes)
+/**
+Copies data into this descriptor, replacing any existing data.
+
+The length of this descriptor is set to reflect the new data.
+
+@param aDes An 8-bit non-modifiable descriptor. 
+
+@return A reference to this descriptor.
+
+@panic USER 23, if the length of the descriptor aDes is
+                greater than the maximum length of this (target) descriptor.
+*/
+	{Copy(aDes,S);return(*this);}
+
+
+
+
+template <TInt S>
+inline TPtr8 TBufC8<S>::Des()
+/**
+Creates and returns an 8-bit modifiable pointer descriptor for the data
+represented by this 8-bit non-modifiable buffer descriptor.
+
+The content of a non-modifiable buffer descriptor normally cannot be altered, 
+other than by complete replacement of the data. Creating a modifiable pointer 
+descriptor provides a way of changing the data.
+
+The modifiable pointer descriptor is set to point to this non-modifiable buffer 
+descriptor's data.
+
+The length of the modifiable pointer descriptor is set to the length of this 
+non-modifiable buffer descriptor.
+
+The maximum length of the modifiable pointer descriptor is set to the value 
+of the integer template parameter.
+
+When data is modified through this new pointer descriptor, the lengths of 
+both it and this constant buffer descriptor are changed.
+
+@return An 8-bit modifiable pointer descriptor representing the data in this 
+        8-bit non-modifiable buffer descriptor.
+*/
+	{return DoDes(S);}
+
+
+
+
+#ifndef __KERNEL_MODE__
+// Class HBufC8
+inline HBufC8 &HBufC8::operator=(const HBufC8 &aLcb)
+/**
+Copies data into this 8-bit heap descriptor replacing any existing data.
+
+The length of this descriptor is set to reflect the new data.
+
+Note that the maximum length of this (target) descriptor is the length
+of the descriptor buffer in the allocated host heap cell; this may be greater
+than the maximum length specified when this descriptor was created or
+last re-allocated.
+
+@param aLcb The source 8-bit heap descriptor.
+
+@return A reference to this 8-bit heap descriptor.
+
+@panic USER 23, if the length of the descriptor aLcb is greater than the
+                maximum length of this (target) descriptor
+*/
+	{return *this=static_cast<const TDesC8&>(aLcb);}
+
+
+
+
+// Class RBuf8
+inline RBuf8& RBuf8::operator=(const TUint8* aString)
+/**
+Copies data into this descriptor replacing any existing data.
+
+The length of this descriptor is set to reflect the new data.
+
+@param aString A pointer to a zero-terminated string.
+
+@return A reference to this, the target descriptor.
+
+@panic USER 11, if the length of the string, excluding the zero terminator, is
+                greater than the maximum length of this (target) descriptor.
+*/
+    {Copy(aString);return(*this);}
+
+
+
+
+inline RBuf8& RBuf8::operator=(const TDesC8& aDes)
+/**
+Copies data into this descriptor replacing any existing data.
+
+The length of this descriptor is set to reflect the new data.
+
+@param aDes An 8-bit non-modifiable descriptor.
+
+@return A reference to this, the target descriptor.
+
+@panic USER 11, if the length of the descriptor aDes is greater than the
+                maximum length of this (target) descriptor.
+*/
+    {Copy(aDes);return(*this);}
+
+
+
+
+inline RBuf8& RBuf8::operator=(const RBuf8& aDes)
+/**
+Copies data into this descriptor replacing any existing data.
+
+The length of this descriptor is set to reflect the new data.
+
+@param aDes A 8-bit buffer descriptor.
+
+@return A reference to this, the target descriptor.
+
+@panic USER 11, if the length of the descriptor aDes is greater than the
+                maximum length of this (target) descriptor.
+*/
+    {Copy(aDes);return(*this);}
+
+
+
+
+/**
+Creates an 8-bit resizable buffer descriptor that has been initialised with
+data from the specified read stream; leaves on failure.
+			 
+Data is assigned to the new descriptor from the specified stream.
+This variant assumes that the stream contains the length of the data followed
+by the data itself.
+
+The function is implemented by calling the HBufC8::NewL(RReadStream&amp;,TInt)
+variant and then assigning the resulting heap descriptor using
+the RBuf8::Assign(HBufC8*) variant. The comments that describe
+the HBufC8::NewL() variant	also apply to this RBuf8::CreateL() function.
+
+The function may leave with one of the system-wide error codes,	specifically 
+KErrOverflow, if the length of the data as read from the stream is greater than
+the upper limit as specified by the aMaxLength parameter.
+
+@param aStream    The stream from which the data length and the data to be
+                  assigned to the new descriptor, are taken.
+@param aMaxLength The upper limit on the length of data that the descriptor is
+                  to represent. The value of this parameter must be non-negative
+                  otherwise the	underlying function will panic.
+*/
+inline void RBuf8::CreateL(RReadStream &aStream,TInt aMaxLength)
+	{
+	Assign(HBufC8::NewL(aStream,aMaxLength));
+	}
+#endif
+
+
+
+
+// Class TDes8
+inline TDes8 &TDes8::operator=(const TUint8 *aString)
+/**
+Copies data into this descriptor replacing any existing data.
+
+The length of this descriptor is set to reflect the new data.
+
+@param aString A pointer to a zero-terminated string.
+
+@return A reference to this, the target descriptor.
+
+@panic USER 23, if the length of the string, excluding the zero terminator, is
+                greater than the maximum length of this (target) descriptor.
+*/
+    {Copy(aString);return(*this);}
+
+
+
+
+inline TDes8 &TDes8::operator=(const TDesC8 &aDes)
+/**
+Copies data into this descriptor replacing any existing data.
+
+The length of this descriptor is set to reflect the new data.
+
+@param aDes An 8-bit non-modifiable descriptor. 
+ 
+@return A reference to this, the target descriptor.
+
+@panic USER 23, if the length of the descriptor aDes is greater than the
+                maximum length of this (target) descriptor.
+*/
+    {Copy(aDes);return(*this);}
+
+
+
+
+inline TDes8 &TDes8::operator=(const TDes8 &aDes)
+/**
+Copies data into this descriptor replacing any existing data.
+
+The length of this descriptor is set to reflect the new data.
+
+@param aDes An 8-bit modifiable descriptor.
+
+@return A reference to this, the target descriptor.
+
+@panic USER 23, if the length of the descriptor aDes is greater than the
+                maximum length of this (target) descriptor.
+*/
+    {Copy(aDes);return(*this);}
+
+
+
+
+inline TDes8 &TDes8::operator+=(const TDesC8 &aDes)
+/**
+Appends data onto the end of this descriptor's data and returns a reference 
+to this descriptor.
+
+The length of this descriptor is incremented to reflect the new content.
+
+@param aDes An-8 bit non-modifiable descriptor whose data is to be appended.
+
+@return A reference to this descriptor.
+
+@panic USER 23, if the resulting length of this descriptor is greater than its
+                maximum length.  
+*/
+	{Append(aDes);return(*this);}
+
+
+
+
+inline const TUint8 &TDes8::operator[](TInt anIndex) const
+/**
+Gets a const reference to a single data item within this descriptor's data.
+
+@param anIndex The position of the data item within this descriptor's data.
+               This is an offset value; a zero value refers to the leftmost
+			   data position.
+
+@return A const reference to the data item at the specified position. 
+
+@panic USER 21, if anIndex is negative or is greater than or equal to the
+                current length of this descriptor.
+*/
+	{return(AtC(anIndex));}
+
+
+
+
+inline TUint8 &TDes8::operator[](TInt anIndex)
+/**
+Gets a non-const reference to a single data item within this descriptor's 
+data.
+
+@param anIndex The position of the data item within this descriptor's data.
+               This is an offset value; a zero value refers to the leftmost
+			   data position.
+
+@return A non-const reference to the data item at the specified position.
+
+@panic USER 21, if anIndex is negative or is greater than or equal to the
+                current length of this descriptor.
+*/
+	{return((TUint8 &)AtC(anIndex));}
+
+
+
+
+inline TInt TDes8::MaxLength() const
+/**
+Gets the maximum length of the descriptor.
+
+This is the upper limit for the number of 8-bit values or data items that
+the descriptor can represent.
+
+@return The maximum length of data that the descriptor can represent.
+*/
+	{return(iMaxLength);}
+
+
+
+
+inline TInt TDes8::MaxSize() const
+/**
+Gets the maximum size of the descriptor.
+
+This is the upper limit for the number of bytes which the data represented by
+the descriptor can occupy.
+
+@return The maximum size of the descriptor data.
+*/
+	{return(iMaxLength);}
+
+
+
+
+inline TUint8 * TDes8::WPtr() const
+	{return((TUint8 *)Ptr());}
+
+
+
+
+// Class TPtr8
+inline TPtr8 &TPtr8::operator=(const TUint8 *aString)
+/**
+Copies data into this 8-bit modifiable pointer descriptor replacing any
+existing data.
+
+The length of this descriptor is set to reflect the new data.
+
+@param aString A pointer to a zero-terminated string.
+
+@return A reference to this 8-bit modifiable pointer descriptor.
+
+@panic USER 23, if the length of the string, excluding the zero terminator, is
+                greater than the maximum length of this descriptor.
+*/
+	{Copy(aString);return(*this);}
+
+
+
+
+inline TPtr8 &TPtr8::operator=(const TDesC8 &aDes)
+/**
+Copies data into this 8-bit modifiable pointer descriptor replacing any
+existing data.
+
+The length of this descriptor is set to reflect the new data.
+
+@param aDes An 8-bit modifiable pointer descriptor whose data is to be copied 
+            into this descriptor.
+
+@return A reference to this 8-bit modifiable pointer descriptor.
+
+@panic USER 23, if the length of aDes is greater than the maximum 
+                length of this descriptor.
+*/
+	{Copy(aDes);return(*this);}
+
+
+
+
+inline TPtr8 &TPtr8::operator=(const TPtr8 &aDes)
+/**
+Copies data into this 8-bit modifiable pointer descriptor replacing any
+existing data.
+
+The length of this descriptor is set to reflect the new data.
+
+@param aDes An 8-bit modifiable pointer descriptor whose data is to be copied
+            into this descriptor.
+
+@return A reference to this 8-bit modifiable pointer descriptor.
+
+@panic USER 23, if the length of aDes is greater than the maximum 
+                length of this descriptor.
+*/
+	{Copy(aDes);return(*this);}
+
+
+
+
+inline void TPtr8::Set(TUint8 *aBuf,TInt aLength,TInt aMaxLength)
+/**
+Sets the 8-bit modifiable pointer descriptor to point to the specified location
+in memory, whether in RAM or ROM.
+
+The length of the descriptor and its maximum length are set to the specified
+values.
+
+@param aBuf       A pointer to the location that the descriptor is to represent.
+@param aLength    The length of the descriptor.
+@param aMaxLength The maximum length of the descriptor.
+
+@panic USER 20, if aLength is negative or is greater than the maximum length of
+                this descriptor.
+@panic USER 30, if aMaxLength is negative.
+*/
+	{new(this) TPtr8(aBuf,aLength,aMaxLength);}
+
+
+
+
+inline void TPtr8::Set(const TPtr8 &aPtr)
+/**
+Sets the 8-bit modifiable pointer descriptor from an existing 8-bit modifiable
+pointer descriptor.
+  
+It is set to point to the same data, is given the same length and the same
+maximum length as the source pointer descriptor.
+
+@param aPtr The source 8-bit modifiable pointer descriptor.
+*/
+	{new(this) TPtr8(aPtr);}
+
+
+
+
+// Template class TBuf8
+template <TInt S>
+inline TBuf8<S>::TBuf8()
+	: TBufBase8(S)
+/**
+Constructs an empty 8-bit modifiable buffer descriptor.
+
+It contains no data.
+
+The integer template parameter determines the size of the data area that is created 
+as part of the object, and defines the descriptor's maximum length.
+*/
+	{}
+
+
+
+
+template <TInt S>
+inline TBuf8<S>::TBuf8(TInt aLength)
+	: TBufBase8(aLength,S)
+/**
+Constructs an empty 8-bit modifiable buffer descriptor and sets the its length 
+to the specified value.
+
+No data is assigned to the descriptor.
+
+The integer template parameter determines the size of the data area that is created 
+as part of the object, and defines the descriptor's maximum length.
+
+@param aLength The length of this modifiable buffer descriptor.
+
+@panic USER 20, if aLength is negative or is greater than the 
+                value of the integer template parameter.
+*/
+	{}
+
+
+
+
+template <TInt S>
+inline TBuf8<S>::TBuf8(const TUint8 *aString)
+	: TBufBase8(aString,S)
+/**
+Constructs the 8-bit modifiable buffer descriptor from a
+zero terminated string.
+
+The integer template parameter determines the size of the data area that
+is created as part of the object, and defines the descriptor's maximum length.
+
+The string, excluding the zero terminator, is copied into this buffer
+descriptor's data area. The length of this buffer descriptor is set to the
+length of the string, excluding the zero terminator.
+
+@param aString A pointer to a zero terminated string.
+
+@panic USER 23, if the length of the string, excluding the zero terminator,
+                is greater than the value of the integer template parameter.
+*/
+	{}
+
+
+
+
+template <TInt S>
+inline TBuf8<S>::TBuf8(const TDesC8 &aDes)
+	: TBufBase8(aDes,S)
+/**
+Constructs the 8-bit modifiable buffer descriptor from any existing
+8-bit descriptor.
+
+The integer template parameter determines the size of the data area created 
+as part of this object and defines the descriptor's maximum length.
+
+Data is copied from the source descriptor into this modifiable buffer
+descriptor and the length of this modifiable buffer descriptor is set to
+the length of the source descriptor.
+
+@param aDes The source 8-bit non-modifiable descriptor.
+
+@panic USER 23, if the length of the source descriptor is greater than the
+                value of the integer template parameter.
+*/
+	{}
+
+
+
+
+template <TInt S>
+inline TBuf8<S> &TBuf8<S>::operator=(const TUint8 *aString)
+/**
+Copies data into this 8-bit modifiable buffer descriptor, replacing any
+existing data.
+
+The length of this descriptor is set to reflect the new data.
+
+@param aString A pointer to a zero-terminated string.
+
+@return A reference to this 8-bit modifiable buffer descriptor. 
+
+@panic USER 23, if the length of the string, excluding the zero terminator,
+                is greater than the maximum length of this (target) descriptor.
+*/
+	{Copy(aString);return(*this);}
+
+
+
+
+template <TInt S>
+inline TBuf8<S> &TBuf8<S>::operator=(const TDesC8 &aDes)
+/**
+Copies data into this 8-bit modifiable buffer descriptor, replacing any
+existing data.
+
+The length of this descriptor is set to reflect the new data.
+
+@param aDes An 8 bit non-modifiable descriptor.
+
+@return A reference to this 8-bit modifiable buffer descriptor. 
+
+@panic USER 23, if the length of the descriptor aDes is greater than the
+                maximum length of this (target) descriptor.
+*/
+	{Copy(aDes);return(*this);}
+
+
+
+
+template <TInt S>
+inline TBuf8<S>& TBuf8<S>::operator=(const TBuf8<S>& aBuf)
+/**
+Copies data into this 8-bit modifiable buffer descriptor replacing any
+existing data.
+
+The length of this descriptor is set to reflect the new data.
+
+@param aBuf The source 8-bit modifiable buffer descriptor with the same
+            template value.
+
+@return A reference to this 8-bit modifiable buffer descriptor. 
+*/
+	{Copy(aBuf);return *this;}
+
+
+
+
+// Template class TAlignedBuf8
+template <TInt S>
+inline TAlignedBuf8<S>::TAlignedBuf8()
+	: TBufBase8(S)
+/**
+Constructs an empty 8-bit modifiable buffer descriptor.
+
+It contains no data.
+
+The integer template parameter determines the size of the data area that is created 
+as part of the object, and defines the descriptor's maximum length.
+*/
+	{}
+
+
+
+
+template <TInt S>
+inline TAlignedBuf8<S>::TAlignedBuf8(TInt aLength)
+	: TBufBase8(aLength,S)
+/**
+Constructs an empty 8-bit modifiable buffer descriptor and sets the its length 
+to the specified value.
+
+No data is assigned to the descriptor.
+
+The integer template parameter determines the size of the data area that is created 
+as part of the object, and defines the descriptor's maximum length.
+
+@param aLength The length of this modifiable buffer descriptor.
+
+@panic USER 20, if aLength is negative or is greater than the 
+                value of the integer template parameter.
+*/
+	{}
+
+
+
+
+template <TInt S>
+inline TAlignedBuf8<S>::TAlignedBuf8(const TUint8 *aString)
+	: TBufBase8(aString,S)
+/**
+Constructs the 8-bit modifiable buffer descriptor from a
+zero terminated string.
+
+The integer template parameter determines the size of the data area that
+is created as part of the object, and defines the descriptor's maximum length.
+
+The string, excluding the zero terminator, is copied into this buffer
+descriptor's data area. The length of this buffer descriptor is set to the
+length of the string, excluding the zero terminator.
+
+@param aString A pointer to a zero terminated string.
+
+@panic USER 23, if the length of the string, excluding the zero terminator,
+                is greater than the value of the integer template parameter.
+*/
+	{}
+
+
+
+
+template <TInt S>
+inline TAlignedBuf8<S>::TAlignedBuf8(const TDesC8 &aDes)
+	: TBufBase8(aDes,S)
+/**
+Constructs the 8-bit modifiable buffer descriptor from any existing
+8-bit descriptor.
+
+The integer template parameter determines the size of the data area created 
+as part of this object and defines the descriptor's maximum length.
+
+Data is copied from the source descriptor into this modifiable buffer
+descriptor and the length of this modifiable buffer descriptor is set to
+the length of the source descriptor.
+
+@param aDes The source 8-bit non-modifiable descriptor.
+
+@panic USER 23, if the length of the source descriptor is greater than the
+                value of the integer template parameter.
+*/
+	{}
+
+
+
+
+template <TInt S>
+inline TAlignedBuf8<S> &TAlignedBuf8<S>::operator=(const TUint8 *aString)
+/**
+Copies data into this 8-bit modifiable buffer descriptor, replacing any
+existing data.
+
+The length of this descriptor is set to reflect the new data.
+
+@param aString A pointer to a zero-terminated string.
+
+@return A reference to this 8-bit modifiable buffer descriptor. 
+
+@panic USER 23, if the length of the string, excluding the zero terminator,
+                is greater than the maximum length of this (target) descriptor.
+*/
+	{Copy(aString);return(*this);}
+
+
+
+
+template <TInt S>
+inline TAlignedBuf8<S> &TAlignedBuf8<S>::operator=(const TDesC8 &aDes)
+/**
+Copies data into this 8-bit modifiable buffer descriptor, replacing any
+existing data.
+
+The length of this descriptor is set to reflect the new data.
+
+@param aDes An 8 bit non-modifiable descriptor.
+
+@return A reference to this 8-bit modifiable buffer descriptor. 
+
+@panic USER 23, if the length of the descriptor aDes is greater than the
+                maximum length of this (target) descriptor.
+*/
+	{Copy(aDes);return(*this);}
+
+
+
+
+template <TInt S>
+inline TAlignedBuf8<S>& TAlignedBuf8<S>::operator=(const TAlignedBuf8<S>& aBuf)
+/**
+Copies data into this 8-bit modifiable buffer descriptor replacing any
+existing data.
+
+The length of this descriptor is set to reflect the new data.
+
+@param aBuf The source 8-bit modifiable buffer descriptor with the same
+            template value.
+
+@return A reference to this 8-bit modifiable buffer descriptor. 
+*/
+	{Copy(aBuf);return *this;}
+
+
+
+
+// Template class TLitC8
+template <TInt S>
+inline const TDesC8* TLitC8<S>::operator&() const
+/**
+Returns a const TDesC8 type pointer.
+
+@return A descriptor type pointer to this literal. 
+*/
+	{return REINTERPRET_CAST(const TDesC8*,this);}
+
+
+
+
+template <TInt S>
+inline const TDesC8& TLitC8<S>::operator()() const
+/**
+Returns a const TDesC8 type reference.
+
+@return A descriptor type reference to this literal 
+*/
+	{return *operator&();}
+
+
+
+
+template <TInt S>
+inline TLitC8<S>::operator const TDesC8&() const
+/**
+Invoked by the compiler when a TLitC8<TInt> type is passed to a function
+which is prototyped to take a const TDesC8& type.
+*/
+	{return *operator&();}
+
+
+
+template <TInt S>
+inline TLitC8<S>::operator const __TRefDesC8() const
+/**
+Invoked by the compiler when a TLitC8<TInt> type is passed to a function
+which is prototyped to take a const TRefByValue<const TDesC8> type.
+
+@see __TRefDesC8
+*/
+	{return *operator&();}
+
+
+
+
+#ifndef __KERNEL_MODE__
+// Class TDesC16
+inline TBool TDesC16::operator<(const TDesC16 &aDes) const
+/**
+Determines whether this descriptor's data is less than the specified descriptor's 
+data.
+
+The comparison is implemented using the Compare() member function.
+
+@param aDes The 16-bit non-modifable descriptor whose data is to be compared 
+            with this descriptor's data. 
+
+@return True if less than, false otherwise. 
+
+@see TDesC16::Compare
+*/
+	{return(Compare(aDes)<0);}
+
+
+
+
+inline TBool TDesC16::operator<=(const TDesC16 &aDes) const
+/**
+Determines whether this descriptor's data is less than or equal
+to the specified descriptor's data.
+
+The comparison is implemented using the Compare() member function.
+
+@param aDes The 16-bit non- modifiable descriptor whose data is to be compared 
+            with this descriptor's data. 
+
+@return True if less than or equal, false otherwise. 
+
+@see TDesC16::Compare
+*/
+	{return(Compare(aDes)<=0);}
+
+
+
+
+inline TBool TDesC16::operator>(const TDesC16 &aDes) const
+/**
+Determines whether this descriptor's data is greater than the specified
+descriptor's data.
+
+The comparison is implemented using the Compare() member function.
+
+@param aDes The 16-bit non-modifiable descriptor whose data is to be compared 
+            with this descriptor's data. 
+
+@return True if greater than, false otherwise. 
+
+@see TDesC16::Compare
+*/
+	{return(Compare(aDes)>0);}
+
+
+
+
+inline TBool TDesC16::operator>=(const TDesC16 &aDes) const
+/**
+Determines whether this descriptor's data is greater than or equal to the
+specified descriptor's data.
+
+The comparison is implemented using the Compare() member function.
+
+@param aDes The 16-bit non-modifiable descriptor whose data is to be compared 
+            with this descriptor's data. 
+
+@return True if greater than or equal, false otherwise. 
+
+@see TDesC16::Compare
+*/
+	{return(Compare(aDes)>=0);}
+
+
+
+
+inline TBool TDesC16::operator==(const TDesC16 &aDes) const
+/**
+Determines whether this descriptor's data is equal to the specified
+descriptor's data.
+
+The comparison is implemented using the Compare() member function.
+
+@param aDes The 16-bit non-modifiable descriptor whose data is to be compared 
+            with this descriptor's data. 
+
+@return True if equal, false otherwise. 
+
+@see TDesC16::Compare
+*/
+	{return(Compare(aDes)==0);}
+
+
+
+
+inline TBool TDesC16::operator!=(const TDesC16 &aDes) const
+/**
+Determines whether this descriptor's data is not equal to the specified
+descriptor's data.
+
+The comparison is implemented using the Compare() member function.
+
+@param aDes The 16-bit non-modifiable descriptor whose data is to be compared 
+            with this descriptor's data. 
+
+@return True if not equal, false otherwise. 
+
+@see TDesC16::Compare
+*/
+	{return(Compare(aDes)!=0);}
+
+
+
+
+inline const TUint16 &TDesC16::operator[](TInt anIndex) const
+/**
+Gets a reference to a single data item within this descriptor's data.
+
+@param anIndex The position of the individual data item within the descriptor's 
+               data. This is an offset value; a zero value refers to the
+			   leftmost data position. 
+
+@return A reference to the data item.
+
+@panic USER 9, if anIndex is negative or greater than or equal to the current
+               length of the descriptor.
+*/
+	{return(AtC(anIndex));}
+
+
+
+
+inline TInt TDesC16::Length() const
+/**
+Gets the length of the data.
+
+This is the number of 16-bit values or data items represented by the descriptor.
+
+@return The length of the data represented by the descriptor.
+*/
+	{return(iLength&KMaskDesLength16);}
+
+
+
+
+inline TInt TDesC16::Size() const
+/**
+Gets the size of the data.
+
+This is the number of bytes occupied by the data represented by the descriptor.
+
+@return The size of the data represented by the descriptor. This is always 
+        twice the length.
+ */
+	{return(Length()<<1);}
+
+
+
+
+inline void TDesC16::DoSetLength(TInt aLength)
+	{iLength=(iLength&(~KMaskDesLength16))|aLength;}
+
+
+
+
+// Class TPtrC16
+inline void TPtrC16::Set(const TUint16 *aBuf,TInt aLength)
+/**
+Sets the 16-bit non-modifiable pointer descriptor to point to the specified 
+location in memory, whether in RAM or ROM.
+
+The length of the descriptor is set to the specified length.
+
+@param aBuf    A pointer to the location that the descriptor is to represent.
+@param aLength The length of the descriptor. This value must be non-negative 
+
+@panic USER 17, if aLength is negative.
+*/
+	{new(this) TPtrC16(aBuf,aLength);}
+
+
+
+
+inline void TPtrC16::Set(const TDesC16 &aDes)
+/**
+Sets the 16-bit non-modifiable pointer descriptor from the specified descriptor.
+
+It is set to point to the same data and is given the same length.
+
+@param aDes A reference to a 16-bit non-modifiable descriptor
+*/
+	{new(this) TPtrC16(aDes);}
+
+
+
+
+inline void TPtrC16::Set(const TPtrC16& aPtr)
+	{new(this) TPtrC16(aPtr);}
+
+
+
+
+// class TBufCBase16
+inline TPtr16 TBufCBase16::DoDes(TInt aMaxLength)
+	{return TPtr16(*this,aMaxLength);}
+
+
+
+
+// Template class TBufC16
+template <TInt S>
+inline TBufC16<S>::TBufC16()
+	: TBufCBase16()
+/**
+Constructs an empty 16-bit non-modifiable buffer descriptor. 
+
+It contains no data.
+
+The integer template parameter determines the size of the data area which 
+is created as part of the buffer descriptor object.
+
+Data can, subsequently, be assigned into this buffer descriptor using the 
+assignment operators.
+
+@see TBufC16::operator=
+*/
+	{}
+
+
+
+
+template <TInt S>
+inline TBufC16<S>::TBufC16(const TUint16 *aString)
+	: TBufCBase16(aString,S)
+/** 
+Constructs the 16-bit non-modifiable buffer descriptor from a zero terminated
+string.
+
+The integer template parameter determines the size of the data area which 
+is created as part of this object.
+
+The string, excluding the zero terminator, is copied into this buffer descriptor's 
+data area. The length of this buffer descriptor is set to the length of the 
+string, excluding the zero terminator.
+
+@panic USER 8, if the length of the string, excluding the zero terminator, is
+               greater than the value of the integer template parameter.
+
+@param aString A pointer to a zero terminated string.
+*/
+	{}
+
+
+
+
+template <TInt S>
+inline TBufC16<S>::TBufC16(const TDesC16 &aDes)
+	: TBufCBase16(aDes,S)
+/**
+Constructs the 16-bit non-modifiable buffer descriptor from any
+existing descriptor.
+
+The integer template parameter determines the size of the data area which 
+is created as part of this object.
+
+Data is copied from the source descriptor into this buffer descriptor and 
+the length of this buffer descriptor is set to the length of the
+source descriptor.
+
+@param aDes The source 16-bit non-modifiable descriptor.
+
+@panic USER 8, if the length of the source descriptor is
+               greater than the value of the integer template parameter.
+*/
+	{}
+
+
+
+
+template <TInt S>
+inline TBufC16<S> &TBufC16<S>::operator=(const TUint16 *aString)
+/**
+Copies data into this descriptor replacing any existing data.
+
+The length of this descriptor is set to reflect the new data.
+
+@param aString A pointer to a zero-terminated string.
+
+@return A reference to this descriptor.
+
+@panic USER 11, if the length of the string, excluding the zero terminator, is
+                greater than the maximum length of this (target) descriptor.
+*/
+	{Copy(aString,S);return(*this);}
+
+
+
+
+template <TInt S>
+inline TBufC16<S> &TBufC16<S>::operator=(const TDesC16 &aDes)
+/**
+Copies data into this descriptor, replacing any existing data.
+
+The length of this descriptor is set to reflect the new data.
+
+@param aDes A 16-bit non-modifiable descriptor.
+
+@panic USER 11, if the length of the descriptor aDes is
+                greater than the maximum length of this (target) descriptor.
+
+@return A reference to this descriptor.
+*/
+	{Copy(aDes,S);return(*this);}
+
+
+
+
+template <TInt S>
+inline TPtr16 TBufC16<S>::Des()
+/**
+Creates and returns a 16-bit modifiable pointer descriptor for the data
+represented by this 16-bit non-modifiable buffer descriptor.
+
+The content of a non-modifiable buffer descriptor normally cannot be altered, 
+other than by complete replacement of the data. Creating a modifiable pointer 
+descriptor provides a way of changing the data.
+
+The modifiable pointer descriptor is set to point to this non-modifiable buffer 
+descriptor's data.
+
+The length of the modifiable pointer descriptor is set to the length of this 
+non-modifiable buffer descriptor.
+
+The maximum length of the modifiable pointer descriptor is set to the value 
+of the integer template parameter.
+
+When data is modified through this new pointer descriptor, the lengths of 
+both it and this constant buffer descriptor are changed.
+
+@return A 16-bit modifiable pointer descriptor representing the data in this 
+        16-bit non-modifiable buffer descriptor.
+*/
+	{return(DoDes(S));}
+
+
+
+
+#ifndef __KERNEL_MODE__
+// Class HBufC16
+inline HBufC16 &HBufC16::operator=(const HBufC16 &aLcb)
+/**
+Copies data into this 16-bit heap descriptor replacing any existing data.
+
+The length of this descriptor is set to reflect the new data.
+
+Note that the maximum length of this (target) descriptor is the length
+of the descriptor buffer in the allocated host heap cell; this may be greater
+than the maximum length specified when this descriptor was created or
+last re-allocated.
+
+@param aLcb The source 16-bit heap descriptor.
+
+@return A reference to this 16-bit heap descriptor.
+
+@panic USER 11, if the length of the descriptor aLcb is greater than the
+                maximum length of this (target) descriptor
+*/
+	{return *this=static_cast<const TDesC16&>(aLcb);}
+#endif
+
+
+
+
+// Class TDes16
+inline TDes16 &TDes16::operator=(const TUint16 *aString)
+/**
+Copies data into this descriptor replacing any existing data.
+
+The length of this descriptor is set to reflect the new data.
+
+@param aString A pointer to a zero-terminated string.
+
+@return A reference to this, the target descriptor.
+
+@panic USER 11, if the length of the string, excluding the zero terminator, is
+                greater than the maximum length of this (target) descriptor.
+*/
+    {Copy(aString);return(*this);}
+
+
+
+
+inline TDes16 &TDes16::operator=(const TDesC16 &aDes)
+/**
+Copies data into this descriptor replacing any existing data.
+
+The length of this descriptor is set to reflect the new data.
+
+@param aDes A 16-bit non-modifiable descriptor.
+
+@return A reference to this, the target descriptor.
+
+@panic USER 11, if the length of the descriptor aDes is greater than the
+                maximum length of this (target) descriptor.
+*/
+    {Copy(aDes);return(*this);}
+
+
+
+
+inline TDes16 &TDes16::operator=(const TDes16 &aDes)
+/**
+Copies data into this descriptor replacing any existing data.
+
+The length of this descriptor is set to reflect the new data.
+
+@param aDes A 16-bit modifiable descriptor.
+
+@return A reference to this, the target descriptor.
+
+@panic USER 11, if the length of the descriptor aDes is greater than the
+                maximum length of this (target) descriptor.
+*/
+    {Copy(aDes);return(*this);}
+
+
+
+
+inline TDes16 &TDes16::operator+=(const TDesC16 &aDes)
+/** 
+Appends data onto the end of this descriptor's data and returns a reference 
+to this descriptor.
+
+The length of this descriptor is incremented to reflect the new content.
+
+@param aDes A 16-bit non-modifiable descriptor whose data is to be appended. 
+
+@return A reference to this descriptor.
+
+@panic USER 11, if the resulting length of this descriptor is greater than its
+                maximum length.  
+*/
+	{Append(aDes);return(*this);}
+
+
+
+
+inline const TUint16 &TDes16::operator[](TInt anIndex) const
+/**
+Gets a const reference to a single data item within this descriptor's data.
+
+@param anIndex The position the data item within this descriptor's data. This 
+is an offset value; a zero value refers to the leftmost data position.
+
+@return A const reference to the data item at the specified position.
+
+@panic USER 9, if anIndex is negative or is greater than or equal to the
+                current length of this descriptor.
+*/
+	{return(AtC(anIndex));}
+
+
+
+
+inline TUint16 &TDes16::operator[](TInt anIndex)
+/** 
+Gets a non-const reference to a single data item within this descriptor's 
+data.
+
+@param anIndex The position of the data item within this descriptor's data.
+               This is an offset value; a zero value refers to the leftmost
+			   data position. 
+			   
+@return A non-const reference to the data item at the specified position.
+
+@panic USER 9, if anIndex is negative or is greater than or equal to the
+                current length of this descriptor.
+*/
+	{return((TUint16 &)AtC(anIndex));}
+
+
+
+
+inline TInt TDes16::MaxLength() const
+/**
+Gets the maximum length of the descriptor.
+
+This is the upper limit for the number of 16-bit values or data items that
+the descriptor can represent.
+
+@return The maximum length of data that the descriptor can represent.
+*/
+	{return(iMaxLength);}
+
+
+
+
+inline TInt TDes16::MaxSize() const
+/**
+Gets the maximum size of the descriptor.
+
+This is the upper limit for the number of bytes which the data represented by
+the descriptor can occupy.
+
+@return The maximum size of the descriptor data.
+*/
+	{return(iMaxLength<<1);}
+
+
+
+
+inline TUint16 * TDes16::WPtr() const
+	{return((TUint16 *)Ptr());}
+
+
+
+
+// Class TPtr16
+inline TPtr16 &TPtr16::operator=(const TUint16 *aString)
+/**
+Copies data into this 16-bit modifiable pointer descriptor replacing
+any existing data.
+
+The length of this descriptor is set to reflect the new data.
+
+@param aString A pointer to a zero-terminated string.
+
+@return A reference to this 16-bit modifiable pointer descriptor.
+
+@panic USER 11, if the length of the string, excluding the zero terminator, is
+                greater than the maximum length of this descriptor.
+*/
+	{Copy(aString);return(*this);}
+
+
+
+
+inline TPtr16 &TPtr16::operator=(const TDesC16 &aDes)
+/**
+Copies data into this 16-bit modifiable pointer descriptor replacing any
+existing data.
+
+The length of this descriptor is set to reflect the new data.
+
+@param aDes A 16-bit non-modifiable descriptor whose data is to be copied 
+            into this descriptor.
+
+@return A reference to this 16-bit modifiable pointer descriptor.
+
+@panic USER 11, if the length of aDes is greater than the maximum 
+                length of this descriptor.
+*/
+	{Copy(aDes);return(*this);}
+
+
+
+
+inline TPtr16 &TPtr16::operator=(const TPtr16 &aDes)
+/**
+Copies data into this 16-bit modifiable pointer descriptor replacing any
+existing data.
+
+The length of this descriptor is set to reflect the new data.
+
+@param aDes A 16-bit modifiable pointer descriptor whose data is to be copied 
+            into this descriptor.
+
+@return A reference to this 16-bit modifiable pointer descriptor.
+
+@panic USER 11, if the length of aDes is greater than the maximum 
+                length of this descriptor.
+*/
+	{Copy(aDes);return(*this);}
+
+
+
+
+inline void TPtr16::Set(TUint16 *aBuf,TInt aLength,TInt aMaxLength)
+/**
+Sets the 16-bit modifiable pointer descriptor to point to the specified location 
+in memory, whether in RAM or ROM.
+
+The length of the descriptor and its maximum length are set to the specified
+values.
+
+@param aBuf       A pointer to the location that the descriptor is to represent.
+@param aLength    The length of the descriptor.
+@param aMaxLength The maximum length of the descriptor.
+
+@panic USER 8,  if aLength is negative or is greater than the maximum length of
+                this descriptor.
+@panic USER 18, if aMaxLength is negative.
+*/
+	{new(this) TPtr16(aBuf,aLength,aMaxLength);}
+
+
+
+
+inline void TPtr16::Set(const TPtr16 &aPtr)
+/**
+Sets the 16-bit modifiable pointer descriptor from an existing
+16-bit modifiable pointer descriptor.
+  
+It is set to point to the same data, is given the same length and the same
+maximum length as the source pointer descriptor.
+
+@param aPtr The source 16-bit modifiable pointer descriptor.
+*/
+	{new(this) TPtr16(aPtr);}
+
+
+
+
+// Template class TBuf16
+template <TInt S>
+inline TBuf16<S>::TBuf16()
+	: TBufBase16(S)
+/**
+Constructs an empty 16-bit modifiable buffer descriptor.
+
+It contains no data.
+
+The integer template parameter determines the size of the data area created 
+as part of the object and defines the descriptor's maximum length.
+*/
+	{}
+
+
+
+
+template <TInt S>
+inline TBuf16<S>::TBuf16(TInt aLength)
+	: TBufBase16(aLength,S)
+/**
+Constructs an empty 16-bit modifiable buffer descriptor and sets the its length 
+to the specified value.
+
+No data is assigned to the descriptor.
+
+The integer template parameter defines the size of the data area created as 
+part of the object and defines the descriptor's maximum length.
+
+@param aLength The length of this modifiable buffer descriptor.
+
+@panic USER 8, if aLength is negative or is greater than the 
+                value of the integer template parameter.
+*/
+	{}
+
+
+
+
+template <TInt S>
+inline TBuf16<S>::TBuf16(const TUint16 *aString)
+	: TBufBase16(aString,S)
+/**
+Constructs the 16-bit modifiable buffer descriptor from
+a zero terminated string.
+
+The integer template parameter determines the size of the data area that is
+created as part of this object, and defines the descriptor's maximum length.
+
+The string, excluding the zero terminator, is copied into this buffer
+descriptor's data area. The length of this buffer descriptor is set to the
+length of the string, excluding the zero terminator.
+
+@param aString A pointer to a zero terminated string.
+
+@panic USER 11, if the length of the string, excluding the zero terminator,
+                is greater than the value of the integer template parameter.
+*/
+	{}
+
+
+
+
+template <TInt S>
+inline TBuf16<S>::TBuf16(const TDesC16 &aDes)
+	: TBufBase16(aDes,S)
+/**
+Constructs the 16-bit modifiable buffer descriptor from any existing
+16-bit descriptor.
+
+The integer template parameter determines the size of the data area created 
+as part of this object and defines the descriptor's maximum length.
+
+Data is copied from the source descriptor into this modifiable buffer descriptor 
+and the length of this modifiable buffer descriptor is set to the length of 
+the source descriptor.
+
+@param aDes The source 16-bit non-modifiable descriptor.
+
+@panic USER 11, if the length of the source descriptor is greater than the
+                value of the integer template parameter.
+*/
+	{}
+
+
+
+
+template <TInt S>
+inline TBuf16<S> &TBuf16<S>::operator=(const TUint16 *aString)
+/**
+Copies data into this 16-bit modifiable buffer descriptor, replacing any
+existing data. 
+
+The length of this descriptor is set to reflect the new data.
+
+@param aString A pointer to a zero-terminated string.
+
+@return A reference to this descriptor.
+
+@panic USER 11, if the length of the string, excluding the zero terminator,
+                is greater than the maximum length of this (target) descriptor.
+*/
+	{Copy(aString);return(*this);}
+
+
+
+
+template <TInt S>
+inline TBuf16<S> &TBuf16<S>::operator=(const TDesC16 &aDes)
+/**
+Copies data into this 16-bit modifiable descriptor, replacing any
+existing data.
+
+The length of this descriptor is set to reflect the new data.
+
+@param aDes A 16-bit non-modifiable descriptor.
+
+@return A reference to this descriptor.
+
+@panic USER 11, if the length of the descriptor aDes is greater than the
+                maximum length of this (target) descriptor.
+*/
+	{Copy(aDes);return(*this);}
+
+
+
+
+template <TInt S>
+inline TBuf16<S>& TBuf16<S>::operator=(const TBuf16<S>& aBuf)
+/**
+Copies data into this 16-bit modifiable buffer descriptor replacing any
+existing data.
+
+The length of this descriptor is set to reflect the new data.
+
+@param aBuf The source 16-bit modifiable buffer descriptor with the same
+            template value.
+
+@return A reference to this 16-bit modifiable buffer descriptor. 
+
+@panic USER 11, if the length of the descriptor aDes is greater than the
+                maximum length of this (target) descriptor.
+*/
+	{Copy(aBuf);return *this;}
+
+
+// Class RBuf16
+inline RBuf16& RBuf16::operator=(const TUint16* aString)
+/**
+Copies data into this descriptor replacing any existing data.
+
+The length of this descriptor is set to reflect the new data.
+
+@param aString A pointer to a zero-terminated string.
+
+@return A reference to this, the target descriptor.
+
+@panic USER 11, if the length of the string, excluding the zero terminator, is
+                greater than the maximum length of this (target) descriptor.
+*/
+    {Copy(aString);return(*this);}
+
+
+
+
+inline RBuf16& RBuf16::operator=(const TDesC16& aDes)
+/**
+Copies data into this descriptor replacing any existing data.
+
+The length of this descriptor is set to reflect the new data.
+
+@param aDes A 16-bit non-modifiable descriptor.
+
+@return A reference to this, the target descriptor.
+
+@panic USER 11, if the length of the descriptor aDes is greater than the
+                maximum length of this (target) descriptor.
+*/
+    {Copy(aDes);return(*this);}
+
+
+
+
+inline RBuf16& RBuf16::operator=(const RBuf16& aDes)
+/**
+Copies data into this descriptor replacing any existing data.
+
+The length of this descriptor is set to reflect the new data.
+
+@param aDes A 16-bit buffer descriptor.
+
+@return A reference to this, the target descriptor.
+
+@panic USER 11, if the length of the descriptor aDes is greater than the
+                maximum length of this (target) descriptor.
+*/
+    {Copy(aDes);return(*this);}
+
+
+
+
+/**
+Creates a 16-bit resizable buffer descriptor that has been initialised with
+data from the specified read stream; leaves on failure.
+			 
+Data is assigned to the new descriptor from the specified stream.
+This variant assumes that the stream contains the length of the data followed
+by the data itself.
+
+The function is implemented by calling the HBufC16::NewL(RReadStream&amp;,TInt)
+variant and then assigning the resulting heap descriptor using
+the RBuf16::Assign(HBufC16*) variant. The comments that describe
+the HBufC16::NewL() variant	also apply to this RBuf16::CreateL() function.
+
+The function may leave with one of the system-wide error codes,	specifically 
+KErrOverflow, if the length of the data as read from the stream is greater than
+the upper limit as specified by the aMaxLength parameter.
+
+@param aStream    The stream from which the data length and the data to be
+                  assigned to the new descriptor, are taken.
+@param aMaxLength The upper limit on the length of data that the descriptor is
+                  to represent. The value of this parameter must be non-negative
+                  otherwise the	underlying function will panic.
+*/
+inline void RBuf16::CreateL(RReadStream &aStream,TInt aMaxLength)
+	{
+	Assign(HBufC16::NewL(aStream,aMaxLength));
+	}
+
+
+// Template class TLitC16
+template <TInt S>
+inline const TDesC16* TLitC16<S>::operator&() const
+/**
+Returns a const TDesC16 type pointer.
+
+@return A descriptor type pointer to this literal. 
+*/
+	{return REINTERPRET_CAST(const TDesC16*,this);}
+
+
+
+
+template <TInt S>
+inline const TDesC16& TLitC16<S>::operator()() const
+/**
+Returns a const TDesC16 type reference.
+
+@return A descriptor type reference to this literal 
+*/
+	{return *operator&();}
+
+
+
+
+template <TInt S>
+inline TLitC16<S>::operator const TDesC16&() const
+/**
+Invoked by the compiler when a TLitC16<TInt> type is passed to a function
+which is prototyped to take a const TDesC16& type.
+*/
+	{return *operator&();}
+
+
+
+
+template <TInt S>
+inline TLitC16<S>::operator const __TRefDesC16() const
+/**
+Invoked by the compiler when a TLitC16<TInt> type is passed to a function
+which is prototyped to take a const TRefByValue<const TDesC16> type.
+
+@see __TRefDesC16
+*/
+	{return *operator&();}
+#endif //__KERNEL_MODE__
+
+
+
+
+// Template class TBufC
+#if defined(_UNICODE) && !defined(__KERNEL_MODE__)
+template <TInt S>
+inline TBufC<S>::TBufC()
+	: TBufCBase16()
+/**
+Constructs an empty build independent non-modifiable buffer descriptor.
+
+It contains no data.
+
+The integer template parameter determines the size of the data area which 
+is created as part of the buffer descriptor object.
+
+Data can, subsequently, be assigned into this buffer descriptor using the 
+assignment operators.
+
+@see TBufC::operator=
+*/
+	{}
+
+
+
+
+template <TInt S>
+inline TBufC<S>::TBufC(const TText *aString)
+	: TBufCBase16(aString,S)
+/** 
+Constructs a build independent non-modifiable 
+buffer descriptor from a zero terminated string.
+
+The integer template parameter determines the size of the data area which 
+is created as part of this object.
+
+The string, excluding the zero terminator, is copied into this buffer descriptor's 
+data area. The length of this buffer descriptor is set to the length of the 
+string, excluding the zero terminator.
+
+@param aString A pointer to a zero terminated string.
+
+@panic USER 8,  if the length of the string, excluding the zero terminator, is
+                greater than the value of the integer template parameter for
+				the 16-bit build variant.
+
+@panic USER 20, if the length of the string, excluding the zero terminator, is
+                greater than the value of the integer template parameter for
+				the 8-bit build variant.
+*/
+	{}
+
+
+
+
+template <TInt S>
+inline TBufC<S>::TBufC(const TDesC &aDes)
+	: TBufCBase16(aDes,S)
+/**
+Constructs a build-independent non-modifiable buffer descriptor from any 
+existing build independent descriptor.
+
+The integer template parameter determines the size of the data area which 
+is created as part of this object.
+
+Data is copied from the source descriptor into this buffer descriptor and 
+the length of this buffer descriptor is set to the length of the source descriptor.
+
+The length of the source descriptor must not be greater than the value of 
+the integer template parameter, otherwise the constructor raises a USER 20 
+panic for an 8 bit build variant or a USER 8 panic for a 16 bit (Unicode) 
+build variant.
+
+@param aDes The source build independent non-modifiable descriptor.
+
+@panic USER 8,  if the length of the source descriptor is
+                greater than the value of the integer template parameter for
+				the 16-bit build variant.
+
+@panic USER 20, if the length of the source descriptor is
+                greater than the value of the integer template parameter for
+				the 8-bit build variant.
+*/
+	{}
+#else
+template <TInt S>
+inline TBufC<S>::TBufC()
+	: TBufCBase8()
+	{}
+template <TInt S>
+inline TBufC<S>::TBufC(const TText *aString)
+	: TBufCBase8(aString,S)
+	{}
+template <TInt S>
+inline TBufC<S>::TBufC(const TDesC &aDes)
+	: TBufCBase8(aDes,S)
+	{}
+#endif
+template <TInt S>
+inline TBufC<S> &TBufC<S>::operator=(const TText *aString)
+/** 
+Copies data into this descriptor, replacing any existing data.
+
+The length of this descriptor is set to reflect the new data.
+
+@param aString A pointer to a zero-terminated string.
+
+@return A reference to this descriptor.
+
+@panic USER 11, if the length of the string, excluding the zero terminator,
+                is greater than the maximum length of this (target) descriptor
+				for the 16-bit build variant.
+
+@panic USER 23, if the length of the string, excluding the zero terminator,
+                is greater than the maximum length of this (target) descriptor
+				for the 8-bit build variant.
+*/
+	{Copy(aString,S);return(*this);}
+
+
+
+
+template <TInt S>
+inline TBufC<S> &TBufC<S>::operator=(const TDesC &aDes)
+/**
+Copies data into this descriptor, replacing any existing data.
+
+The length of this descriptor is set to reflect the new data.
+
+@param aDes A build independent non-modifiable descriptor. 
+
+@return A reference to this descriptor.
+
+@panic USER 11, if the length of the descriptor aDes is greater than the
+                maximum length of this (target) descriptor for the 16-bit
+				build variant.
+
+@panic USER 23, if the length of the descriptor aDes is greater than the
+                maximum length of this (target) descriptor for the 8-bit
+				build variant.
+*/
+	{Copy(aDes,S);return(*this);}
+
+
+
+
+template <TInt S>
+inline TPtr TBufC<S>::Des()
+/**
+Creates and returns a build-independent modifiable pointer descriptor for
+the data represented by this build-independent non-modifiable buffer
+descriptor.
+
+The content of a non-modifiable buffer descriptor normally cannot be altered, 
+other than by complete replacement of the data. Creating a modifiable pointer 
+descriptor provides a way of changing the data.
+
+The modifiable pointer descriptor is set to point to this non-modifiable buffer 
+descriptor's data.
+
+The length of the modifiable pointer descriptor is set to the length of this 
+non-modifiable buffer descriptor.
+
+The maximum length of the modifiable pointer descriptor is set to the value 
+of the integer template parameter.
+
+When data is modified through this new pointer descriptor, the lengths of 
+both it and this constant buffer descriptor are changed.
+
+@return A build independent modifiable pointer descriptor representing the 
+        data in this build independent non-modifiable buffer descriptor.
+*/
+	{return(DoDes(S));}
+
+
+
+
+// Template class TBuf
+#if defined(_UNICODE) && !defined(__KERNEL_MODE__)
+template <TInt S>
+inline TBuf<S>::TBuf()
+	: TBufBase16(S)
+/**
+Creates a build-independent modifiable buffer descriptor which 
+contains no data.
+
+The integer template parameter determines the size of the data area that is created 
+as part of the object, and defines the descriptor's maximum length.
+*/
+	{}
+
+
+
+
+template <TInt S>
+inline TBuf<S>::TBuf(TInt aLength)
+	: TBufBase16(aLength,S)
+/**
+Constructs an empty build independent modifiable buffer descriptor and
+sets its length to the specified value.
+
+No data is assigned to the descriptor.
+
+The integer template parameter determines the size of the data area created 
+as part of the object and defines the descriptor's maximum length.
+
+@param aLength The length of this modifiable buffer descriptor.
+
+@panic USER 8,  if aLength is negative and is greater than the value of the
+                integer template parameter for a 16-bit build variant.
+
+@panic USER 20, if aLength is negative and is greater than the value of the
+                integer template parameter for a 8-bit build variant.
+*/
+	{}
+
+
+
+
+template <TInt S>
+inline TBuf<S>::TBuf(const TText *aString)
+	: TBufBase16(aString,S)
+/**
+Constructs the build-independent modifiable buffer descriptor from
+a zero terminated string.
+
+The integer template parameter determines the size of the data area which 
+is created as part of this object.
+
+The string, excluding the zero terminator, is copied into this buffer
+descriptor's data area. The length of this buffer descriptor is set to
+the length of the string, excluding the zero terminator.
+
+@param aString A pointer to a zero terminated string.
+
+@panic USER 11, if the length of the string, excluding the zero terminator,
+                is greater than the value of the integer template parameter
+				for a 16-bit build variant.
+@panic USER 23, if the length of the string, excluding the zero terminator,
+                is greater than the value of the integer template parameter
+				for a 8-bit build variant.
+*/
+	{}
+
+
+
+
+template <TInt S>
+inline TBuf<S>::TBuf(const TDesC &aDes)
+	: TBufBase16(aDes,S)
+/**
+Constructs the build-independent modifiable buffer descriptor from any
+existing build-independent descriptor.
+
+The integer template parameter determines the size of the data area created 
+as part of this object, and defines the descriptor's maximum length.
+
+Data is copied from the source descriptor into this modifiable buffer descriptor 
+and the length of this modifiable buffer descriptor is set to the length of 
+the source descriptor.
+
+@param aDes The source build independent non-modifiable descriptor.
+
+@panic USER 11, if the length of the source descriptor is greater than the
+                value of the integer template parameter for a 16-bit
+				build variant.
+@panic USER 23, if the length of the source descriptor is greater than the
+                value of the integer template parameter for an 8-bit
+				build variant.
+	
+*/
+	{}
+#else
+template <TInt S>
+inline TBuf<S>::TBuf()
+	: TBufBase8(S)
+	{}
+template <TInt S>
+inline TBuf<S>::TBuf(TInt aLength)
+	: TBufBase8(aLength,S)
+	{}
+template <TInt S>
+inline TBuf<S>::TBuf(const TText *aString)
+	: TBufBase8(aString,S)
+	{}
+template <TInt S>
+inline TBuf<S>::TBuf(const TDesC &aDes)
+	: TBufBase8(aDes,S)
+	{}
+#endif
+template <TInt S>
+inline TBuf<S> &TBuf<S>::operator=(const TText *aString)
+	{Copy(aString);return(*this);}
+template <TInt S>
+inline TBuf<S> &TBuf<S>::operator=(const TDesC &aDes)
+	{Copy(aDes);return(*this);}
+template <TInt S>
+inline TBuf<S> &TBuf<S>::operator=(const TBuf<S> &aBuf)
+	{Copy(aBuf);return(*this);}
+
+
+
+
+// Template class TLitC
+template <TInt S>
+inline const TDesC* TLitC<S>::operator&() const
+/**
+Returns a const TDesC type pointer.
+
+@return A descriptor type pointer to this literal. 
+*/
+	{return REINTERPRET_CAST(const TDesC*,this);}
+
+
+
+
+template <TInt S>
+inline const TDesC& TLitC<S>::operator()() const
+/**
+Returns a const TDesC type reference.
+
+@return A descriptor type reference to this literal 
+*/
+	{return *operator&();}
+
+
+
+
+template <TInt S>
+inline TLitC<S>::operator const TDesC&() const
+/**
+Invoked by the compiler when a TLitC<TInt> type is passed to a function
+which is prototyped to take a const TDesC& type.
+*/
+	{return *operator&();}
+
+
+
+
+template <TInt S>
+inline TLitC<S>::operator const __TRefDesC() const
+/**
+Invoked by the compiler when a TLitC<TInt> type is passed to a function
+which is prototyped to take a const TRefByValue<const TDesC> type.
+
+@see __TRefDesC.
+*/
+	{return *operator&();}
+
+
+
+
+// Template class TPckgC
+template <class T>
+inline TPckgC<T>::TPckgC(const T &aRef)
+	: TPtrC8((const TUint8 *)&aRef,sizeof(T))
+/**
+Constructs a packaged non-modifiable pointer descriptor to represent
+the specified object whose type is defined by the template parameter.
+
+@param aRef The object to be represented by this packaged non-modifiable 
+            pointer descriptor.
+*/
+	{}
+
+
+
+
+template <class T>
+inline const T &TPckgC<T>::operator()() const
+/**
+Gets a reference to the object represented by this packaged non-modifiable
+pointer descriptor.
+
+@return The packaged object 
+*/
+	{return(*((const T *)iPtr));}
+
+
+
+
+// Template class TPckg
+template <class T>
+inline TPckg<T>::TPckg(const T &aRef)
+	: TPtr8((TUint8 *)&aRef,sizeof(T),sizeof(T))
+/**
+Constructs a packaged modifiable pointer descriptor to represent the specified 
+object whose type is defined by the template parameter.
+
+@param aRef The object to be represented by this packaged modifiable pointer 
+            descriptor.
+*/
+	{}
+
+
+
+
+template <class T>
+inline T &TPckg<T>::operator()()
+/**
+Gets a reference to the object represented by this packaged
+modifiable pointer descriptor.
+
+@return The packaged object.
+*/
+	{return(*((T *)iPtr));}
+
+
+
+
+// Template class TPckgBuf
+template <class T>
+inline TPckgBuf<T>::TPckgBuf()
+	: TAlignedBuf8<sizeof(T)>(sizeof(T))
+/**
+Constructs a packaged modifiable buffer descriptor for an object whose type 
+is defined by the template parameter.
+
+The length of the packaged descriptor is set to the length of the templated 
+class but no data is assigned into the descriptor.
+*/
+	{new(&this->iBuf[0]) T;}
+
+
+
+
+template <class T>
+inline TPckgBuf<T>::TPckgBuf(const T &aRef)
+	: TAlignedBuf8<sizeof(T)>(sizeof(T))
+/**
+Constructs a packaged modifiable buffer descriptor for an object whose type 
+is defined by the template parameter and copies the supplied object into the 
+descriptor.
+
+The length of the packaged descriptor is set to the length of the templated 
+class.
+
+@param aRef The source object to be copied into the packaged modifiable buffer 
+            descriptor.
+*/
+	{new(&this->iBuf[0]) T(aRef);}
+
+
+
+
+template <class T>
+inline TPckgBuf<T> &TPckgBuf<T>::operator=(const TPckgBuf<T> &aRef)
+/**
+Copies data from the specified packaged modifiable buffer descriptor into this 
+packaged modifiable buffer descriptor, replacing any existing data.
+
+@param aRef The source packaged modifiable buffer descriptor. 
+@return A reference to this packaged modifiable descriptor.
+*/
+	{this->Copy(aRef);return(*this);}
+
+
+
+
+template <class T>
+inline T &TPckgBuf<T>::operator=(const T &aRef)
+/**
+Copies data from the specified object into this packaged modifiable buffer 
+descriptor, replacing any existing data.
+
+@param aRef The source object. 
+@return A reference to the copy of the source object in the packaged modifiable 
+        buffer descriptor.
+*/
+	{this->Copy((TUint8 *)&aRef,sizeof(T));return(*((T *)&this->iBuf[0]));}
+
+
+
+
+template <class T>
+inline T &TPckgBuf<T>::operator()()
+/**
+Gets a reference to the object contained by this packaged modifiable
+buffer descriptor.
+
+@return The packaged object.
+*/
+	{return(*((T *)&this->iBuf[0]));}
+
+
+
+
+template <class T>
+inline const T &TPckgBuf<T>::operator()() const
+/**
+Gets a const reference to the object contained by this packaged modifiable
+buffer descriptor.
+
+@return The (const) packaged object.
+*/
+	{return(*((T *)&this->iBuf[0]));}
+
+
+
+
+// Class TRequestStatus
+inline TRequestStatus::TRequestStatus()
+/**
+Default constructor.
+*/
+: iFlags(0)
+	{}
+
+
+
+
+inline TRequestStatus::TRequestStatus(TInt aVal)
+/**
+Constructs an asynchronous request status object and assigns a completion value 
+to it.
+
+@param aVal The completion value to be assigned to the constructed request 
+            status object.
+*/
+	: iStatus(aVal),
+	iFlags(aVal==KRequestPending ? TRequestStatus::ERequestPending : 0)
+
+	{}
+
+
+
+
+inline TInt TRequestStatus::operator=(TInt aVal)
+/**
+Assigns the specified completion code to the request status object.
+
+@param aVal The value to be assigned.
+
+@return The value assigned.
+*/
+	{
+	if(aVal==KRequestPending)
+		iFlags|=TRequestStatus::ERequestPending;
+	else
+		iFlags&=~TRequestStatus::ERequestPending;
+	return (iStatus=aVal);
+	}
+
+
+
+
+inline TBool TRequestStatus::operator==(TInt aVal) const
+/**
+Tests whether the request status object's completion code is the same as
+the specified value.
+
+@param aVal The value to be compared.
+
+@return True, if the values are equal; false otherwise.
+*/
+	{return(iStatus==aVal);}
+
+
+
+
+inline TBool TRequestStatus::operator!=(TInt aVal) const
+/**
+Tests whether the request status object's completion code is not equal to
+the specified value.
+
+@param aVal The value to be compared.
+
+@return True, if the values are unequal; false otherwise.
+*/
+	{return(iStatus!=aVal);}
+
+
+
+
+inline TBool TRequestStatus::operator>=(TInt aVal) const
+/**
+Tests whether the request status object's completion code is greater than 
+or equal to the specified value.
+
+@param aVal The value to be compared.
+
+@return True, if the request status object's value is greater than or equal 
+        to the specified value; false, otherwise.
+*/
+	{return(iStatus>=aVal);}
+
+
+
+
+inline TBool TRequestStatus::operator<=(TInt aVal) const
+/**
+Tests whether the request status object's completion code is less than or 
+equal to the specified value.
+
+@param aVal The value to be compared.
+
+@return True, if the request status object's value is less than or equal 
+        to the specified value; false, otherwise.
+*/
+	{return(iStatus<=aVal);}
+
+
+
+
+inline TBool TRequestStatus::operator>(TInt aVal) const
+/**
+Tests whether the request status object's completion code is greater than 
+the specified value.
+
+@param aVal The value to be compared.
+
+@return True, if the request status object's value is greater than
+        the specified value; false, otherwise.
+*/
+	{return(iStatus>aVal);}
+
+
+
+
+inline TBool TRequestStatus::operator<(TInt aVal) const
+/**
+Tests whether the request status object's completion code is less than the 
+specified value.
+
+@param aVal The value to be compared.
+
+@return True, if the request status object's value is less than the specified 
+        value; false, otherwise.
+*/
+	{return(iStatus<aVal);}
+
+
+
+
+inline TInt TRequestStatus::Int() const
+/**
+Gets this request status object's completion code value.
+
+@return The completion code.
+*/
+	{return(iStatus);}
+
+
+
+
+// Class TPoint
+#ifndef __KERNEL_MODE__
+inline TPoint::TPoint()
+	: iX(0),iY(0)
+/**
+Constructs default point, initialising its iX and iY members to zero.
+*/
+	{}
+
+
+
+
+inline TPoint::TPoint(TInt aX,TInt aY)
+	: iX(aX),iY(aY)
+/**
+Constructs a point with the specified x and y co-ordinates.
+
+@param aX The x co-ordinate value.
+@param aY The y co-ordinate value.
+*/
+	{}
+
+
+
+
+// Class TSize
+inline TSize::TSize()
+	: iWidth(0),iHeight(0)
+/**
+Constructs the size object with its iWidth and iHeight members set to zero.
+*/
+	{}
+
+
+
+
+inline TSize::TSize(TInt aWidth,TInt aHeight)
+	: iWidth(aWidth),iHeight(aHeight)
+/**
+Constructs the size object with the specified width and height values.
+
+@param aWidth The width value.
+@param aHeight The height value .
+*/
+	{}
+#endif
+
+
+
+// Class TPoint3D
+#ifndef __KERNEL_MODE__
+inline TPoint3D::TPoint3D()
+	: iX(0),iY(0),iZ(0)
+/**
+Constructs default 3Dpoint, initialising its iX, iY and iZ members to zero.
+*/
+	{}
+
+inline TPoint3D::TPoint3D(TInt aX,TInt aY,TInt aZ)
+	: iX(aX),iY(aY),iZ(aZ)
+/**
+Constructs  TPoint3D with the specified x,y  and z co-ordinates.
+
+@param aX The x co-ordinate value.
+@param aY The y co-ordinate value.
+@param aZ The z co-ordinate value.
+*/
+	{}
+
+
+
+
+inline TPoint3D::TPoint3D(const  TPoint& aPoint)
+:iX(aPoint.iX),iY(aPoint.iY),iZ(0)
+/* 
+Copy Construct from TPoint , initialises Z co-ordinate to  Zero
+@param aPoint The TPoint from which we create TPoint3D object
+*/
+	{}
+
+
+#endif
+
+
+// Class TFindHandle
+inline TFindHandle::TFindHandle()
+	: iHandle(0), iSpare1(0), iObjectIdLow(0), iObjectIdHigh(0)
+	{}
+
+
+
+
+inline TInt TFindHandle::Handle() const
+/**
+@publishedAll
+@released
+
+Gets the find-handle number associated with the Kernel object. 
+
+The find-handle number identifies the kernel object with respect to
+its container.
+	
+Note that setting the find-handle number into a TFindHandle object is not
+implemented by this class; it is implemented by derived classes, typically by
+their Next() member functions. The class TFindSemaphore is a good example.
+	
+@return The find-handle number.
+*/
+	{return iHandle;}
+
+
+
+
+#ifdef __KERNEL_MODE__
+const TInt KFindHandleUniqueIdShift=16;    ///< @internalComponent
+const TInt KFindHandleUniqueIdMask=0x7fff; ///< @internalComponent
+const TInt KFindHandleIndexMask=0x7fff;    ///< @internalComponent
+
+
+
+
+/**
+Gets the index into its container at which the kernel object was last seen.
+
+@return The object's index in its container.
+*/
+inline TInt TFindHandle::Index() const
+	{return(iHandle&KFindHandleIndexMask);}
+
+
+
+
+/**
+Gets the unique ID of the kernel container this object resides in.
+
+@return The ID of this object's container.
+*/
+inline TInt TFindHandle::UniqueID() const
+	{return((iHandle>>KFindHandleUniqueIdShift)&KFindHandleUniqueIdMask);}
+
+
+
+
+/**
+Gets the unique ID of the kernel object itself.
+
+@return The ID of the object.
+*/
+inline TUint64 TFindHandle::ObjectID() const
+	{return MAKE_TUINT64(iObjectIdHigh, iObjectIdLow);}
+
+
+
+
+/**
+Sets the find handle to refer to a specific object.
+
+@oaram aIndex The current index of the object in its container.
+@param aUniqueId The unique ID of the container object.
+@param aObjectId The unique ID of the object iteself.
+*/
+inline void TFindHandle::Set(TInt aIndex, TInt aUniqueId, TUint64 aObjectId)
+	{
+	iHandle=(TInt)((aUniqueId<<KFindHandleUniqueIdShift)|aIndex);
+	iObjectIdLow=I64LOW(aObjectId);
+	iObjectIdHigh=I64HIGH(aObjectId);
+	}
+
+
+#else
+
+
+/**
+Resets the find handle to its initial state.
+*/
+inline void TFindHandle::Reset()
+	{
+	iHandle=iSpare1=iObjectIdLow=iObjectIdHigh=0;
+	}
+#endif
+
+
+
+
+// Class RHandleBase
+inline RHandleBase::RHandleBase()
+	: iHandle(0)
+/**
+Default constructor.
+*/
+	{}
+
+
+
+
+#ifndef __KERNEL_MODE__
+inline RHandleBase::RHandleBase(TInt aHandle)
+	: iHandle(aHandle)
+/**
+Copy constructor.
+
+It constructs this handle from an existing one. Specifically, the handle-number 
+encapsulated by the specified handle is copied to this handle.
+
+@param aHandle The existing handle to be copied.
+*/
+	{}
+#endif
+
+
+
+
+inline void RHandleBase::SetHandle(TInt aHandle)
+/**
+Sets the handle-number of this handle to the specified 
+value.
+
+@param aHandle The handle-number to be set.
+*/
+	{ iHandle=aHandle; }
+
+
+
+
+inline TInt RHandleBase::Handle() const
+/**
+Retrieves the handle-number of the object associated with this handle.
+
+@return The handle number
+*/
+	{return(iHandle);}
+
+
+
+
+inline TInt RHandleBase::SetReturnedHandle(TInt aHandleOrError)
+/**
+Sets the handle-number of this handle to the specified 
+value.
+
+The function can take a (zero or positive) handle-number,
+or a (negative) error number.
+
+If aHandleOrError represents a handle-number, then the handle-number of this handle
+is set to that value.
+If aHandleOrError represents an error number, then the handle-number of this handle is set to zero
+and the negative value is returned.
+
+@param aHandleOrError A handle-number, if zero or positive; an error value, if negative.
+
+@return KErrNone, if aHandle is a handle-number; the value of aHandleOrError, otherwise.
+*/
+	{
+	if(aHandleOrError>=0)
+		{
+		iHandle = aHandleOrError;
+		return KErrNone;
+		}
+	iHandle = 0;
+	return aHandleOrError;
+	}
+
+
+
+
+// Class RSemaphore
+#ifndef __KERNEL_MODE__
+inline TInt RSemaphore::Open(const TFindSemaphore& aFind,TOwnerType aType)
+/**
+Opens a handle to the global semaphore found using a TFindSemaphore object.
+
+A TFindSemaphore object is used to find all global semaphores whose full names 
+match a specified pattern.
+
+By default, any thread in the process can use this instance of RSemaphore 
+to access the semaphore. However, specifying EOwnerThread as the second parameter 
+to this function, means that only the opening thread can use this instance 
+of RSemaphore to access the semaphore; any other thread in this process that 
+wants to access the semaphore must either duplicate the handle or use OpenGlobal() 
+again.
+
+@param aFind A reference to the TFindSemaphore object used to find the semaphore. 
+@param aType An enumeration whose enumerators define the ownership of this 
+             semaphore handle. If not explicitly specified, EOwnerProcess is
+			 taken as default. 
+
+@return KErrNone if successful otherwise another of the system wide error codes.
+*/
+	{return(RHandleBase::Open((const TFindHandleBase&)aFind,aType));}
+#endif
+
+
+
+
+// Class RFastLock
+
+
+/**
+Default constructor.
+*/
+inline RFastLock::RFastLock()
+	:	iCount(0)
+	{}
+
+
+
+
+// Class RMessagePtr2
+
+
+/**
+Default constructor
+*/
+inline RMessagePtr2::RMessagePtr2()
+	: iHandle(0)
+	{}
+
+
+
+
+/**
+Tests whether this message handle is empty.
+
+@return True, if this message handle is empty, false, otherwise.
+*/
+inline TBool RMessagePtr2::IsNull() const
+	{return iHandle==0;}
+
+
+
+
+/**
+Gets the message handle value.
+
+@return The message handle value.
+*/
+inline TInt RMessagePtr2::Handle() const
+	{return iHandle;}
+inline TBool operator==(RMessagePtr2 aLeft,RMessagePtr2 aRight)
+	{return aLeft.Handle()==aRight.Handle();}
+inline TBool operator!=(RMessagePtr2 aLeft,RMessagePtr2 aRight)
+	{return aLeft.Handle()!=aRight.Handle();}
+
+
+
+
+
+// Class RMessage
+
+
+/**
+Default constructor
+*/
+inline RMessage2::RMessage2()
+	{}
+
+
+
+
+/**
+Gets the the number of the function requested by the client.
+
+@return The function number. 
+*/
+inline TInt RMessage2::Function() const
+	{return(iFunction);}
+
+
+
+
+/**
+Gets the first message argument as an integer value.
+
+@return The first message argument.
+*/
+inline TInt RMessage2::Int0() const
+	{return(iArgs[0]);}
+
+
+
+
+/**
+Gets the second message argument as an integer value.
+
+@return The second message argument.
+*/
+inline TInt RMessage2::Int1() const
+	{return(iArgs[1]);}
+
+
+
+
+/**
+Gets the third message argument as an integer value.
+
+@return The third message argument.
+*/
+inline TInt RMessage2::Int2() const
+	{return(iArgs[2]);}
+
+
+
+/**
+Gets the fourth message argument as an integer value.
+
+@return The fourth message argument.
+*/
+inline TInt RMessage2::Int3() const
+	{return(iArgs[3]);}
+
+
+
+/**
+Gets the first message argument as a pointer type.
+
+@return The first message argument.
+*/
+inline const TAny *RMessage2::Ptr0() const
+	{return((const TAny *)iArgs[0]);}
+
+
+
+
+/**
+Gets the second message argument as a pointer type.
+
+@return The second message argument.
+*/
+inline const TAny *RMessage2::Ptr1() const
+	{return((const TAny *)iArgs[1]);}
+
+
+
+
+/**
+Gets the third message argument as a pointer type.
+
+@return The third message argument.
+*/
+inline const TAny *RMessage2::Ptr2() const
+	{return((const TAny *)iArgs[2]);}
+
+
+
+
+/**
+Gets the fourth message argument as a pointer type.
+
+@return The fourth message argument.
+*/
+inline const TAny *RMessage2::Ptr3() const
+	{return((const TAny *)iArgs[3]);}
+
+
+
+/**
+Gets a pointer to the session.
+
+@return A pointer to the session object.
+*/
+inline CSession2* RMessage2::Session() const
+	{return (CSession2*)iSessionPtr; }
+
+
+
+
+// Class TUid
+inline TUid TUid::Uid(TInt aUid)
+/**
+Constructs the TUid object from a 32-bit integer.
+
+@param aUid The 32-bit integer value from which the TUid object is to be
+            constructed.
+
+@return The constructed TUid object.
+*/
+	{TUid uid={aUid};return uid;}
+
+
+
+
+inline TUid TUid::Null()
+/**
+Constructs a Null-valued TUid object.
+
+@return The constructed Null-valued TUid object.
+*/
+	{TUid uid={KNullUidValue};return uid;}
+
+
+
+
+#ifndef __KERNEL_MODE__
+// Template class TArray
+template <class T>
+inline TArray<T>::TArray(TInt (*aCount)(const CBase *aPtr),const TAny *(*anAt)(const CBase *aPtr,TInt anIndex),const CBase *aPtr)
+	: iPtr(aPtr),iCount(aCount),iAt(anAt)
+/**
+Constructor.
+
+A TArray object is not intended to be instantiated explicitly. An object of
+this type is instantiated as a result of a call to to the Array() member
+function of a concrete array class
+
+@param aCount A pointer to a function which takes a
+              @code
+			  const CBase*
+              @endcode
+              argument and returns a
+              @code
+              TInt
+              @endcode
+              aCount must point to the member function which returns the
+              current number of elements of type class T contained in the
+	          array at aPtr, for which this TArray is being constructed.
+              This argument is supplied by the Array() member function of the
+              array class. 
+@param anAt   A pointer to a function which takes a
+              @code
+              const CBase*
+              @endcode
+              and a 
+              @code
+              TInt
+              @endcode
+              argument, and returns a pointer to
+              @code
+              TAny
+              @endcode
+              anAt must point to the member function which returns a reference
+              to the element located at position anIndex within the array at
+              aPtr, for which this TArray is being constructed.
+              This argument is supplied by the Array() member function of the
+              array class.
+@param aPtr   A pointer to the array for which this TArray is being
+              constructed. This argument is supplied by the Array() member
+              function of the array class.
+
+@see CArrayFixFlat::Array
+@see CArrayFixSeg::Array
+@see CArrayVarFlat::Array
+@see CArrayVarSeg::Array
+@see CArrayPakFlat::Array
+@see RArray::Array
+@see RPointerArray::Array
+@see RArray<TInt>::Array
+@see RArray<TUint>::Array
+*/
+	{}
+
+
+
+
+template <class T>
+inline TInt TArray<T>::Count() const
+/**
+Gets the number of elements currently held in the array for which this generic 
+array has been constructed.
+
+@return The number of array elements.
+*/
+	{return((*iCount)(iPtr));}
+
+
+
+
+template <class T>
+inline const T &TArray<T>::operator[](TInt anIndex) const
+/**
+Gets a reference to the element located at the specified position.
+
+The returned reference is const and cannot be used to change the element.
+Any member function of the referenced template class T must be declared
+as const if that function is to be accessed through this operator.
+
+@param anIndex The position of the element within the array for which this
+               TArray has been constructed. The position is relative to zero;
+			   i.e. zero implies the first element in the array. 
+
+@return A const reference to the element located at position anIndex within
+        the array for which this TArray has been constructed.
+
+@panic E32USER-CBase 21, if anIndex is negative, or greater than or equal to
+       the number of objects currently within the array.
+*/
+	{return(*((const T *)(*iAt)(iPtr,anIndex)));}
+#endif
+
+
+
+
+// Class TIdentityRelation<T>
+template <class T>
+inline TIdentityRelation<T>::TIdentityRelation()
+/**
+Constructs the object to use the equality operator (==) defined for class T
+to determine whether two class T type objects match.
+*/
+	{iIdentity=(TGeneralIdentityRelation)&EqualityOperatorCompare;}
+
+
+
+
+template <class T>
+inline TIdentityRelation<T>::TIdentityRelation( TBool (*anIdentity)(const T&, const T&) )
+/**
+Constructs the object taking the specified function as an argument.
+
+The specified function should implement an algorithm for determining whether
+two class T type objects match. It should return:
+
+1. true, if the two objects match.
+
+2. false, if the two objects do not match.
+
+@param anIdentity A pointer to a function that takes constant references to two
+                  class T objects and returns a TInt value. 
+*/
+	{ iIdentity=(TGeneralIdentityRelation)anIdentity; }
+
+
+
+
+template <class T>
+inline TIdentityRelation<T>::operator TGeneralIdentityRelation() const
+/**
+Operator that gets the function that determines whether two
+objects of a given class type match.
+*/
+	{ return iIdentity; }
+
+
+
+template <class T>
+inline TBool TIdentityRelation<T>::EqualityOperatorCompare(const T& aLeft, const T& aRight)
+/**
+Compares two objects of class T using the equality operator defined for class T.
+*/
+	{return aLeft == aRight;}
+
+
+
+// Class TLinearOrder<T>
+template <class T>
+inline TLinearOrder<T>::TLinearOrder( TInt(*anOrder)(const T&, const T&) )
+/**
+Constructs the object taking the specified function as an argument.
+
+The specified function should implement an algorithm that determines the
+order of two class T type objects. It should return:
+
+1. zero, if the two objects are equal.
+
+2. a negative value, if the first object is less than the second.
+
+3. a positive value, if the first object is greater than the second.
+
+@param anOrder A pointer to a function that takes constant references to two
+               class T objects and returns a TInt value. 
+*/
+	{ iOrder=(TGeneralLinearOrder)anOrder; }
+
+
+
+
+template <class T>
+inline TLinearOrder<T>::operator TGeneralLinearOrder() const
+/**
+Operator that gets the function that determines the order of two
+objects of a given class type.
+*/
+	{ return iOrder; }
+
+
+
+
+// Class RPointerArray<T>
+
+/**
+Default C++ constructor.
+
+This constructs an array object for an array of pointers with default
+granularity, which is 8.
+*/
+template <class T>
+inline RPointerArray<T>::RPointerArray()
+	: RPointerArrayBase()
+	{}
+
+
+
+
+/**
+C++ constructor with granularity.
+
+This constructs an array object for an array of pointers with the specified 
+granularity.
+
+@param aGranularity The granularity of the array.
+
+@panic USER 127, if aGranularity is not positive, or greater than or equal
+       to 0x10000000.
+*/
+template <class T>
+inline RPointerArray<T>::RPointerArray(TInt aGranularity)
+	: RPointerArrayBase(aGranularity)
+	{}
+
+
+
+
+/**
+C++ constructor with minimum growth step and exponential growth factor.
+
+This constructs an array object for an array of pointers with the specified 
+minimum growth step and exponential growth factor.
+
+@param aMinGrowBy	The minimum growth step of the array. Must be between 1 and
+					65535 inclusive.
+@param aFactor		The factor by which the array grows, multiplied by 256.
+					For example 512 specifies a factor of 2. Must be between 257
+					and 32767 inclusive.
+
+@panic USER 192, if aMinGrowBy<=0 or aMinGrowBy>65535.
+@panic USER 193, if aFactor<=257 or aFactor>32767.
+*/
+template <class T>
+inline RPointerArray<T>::RPointerArray(TInt aMinGrowBy, TInt aFactor)
+	: RPointerArrayBase(aMinGrowBy, aFactor)
+	{}
+
+
+
+
+template <class T>
+inline void RPointerArray<T>::Close()
+/**
+Closes the array and frees all memory allocated to it.
+
+The function must be called before this array object goes out of scope.
+
+Note that the function does not delete the objects whose pointers are contained
+in the array.
+*/
+	{RPointerArrayBase::Close();}
+
+
+
+
+template <class T>
+inline TInt RPointerArray<T>::Count() const
+/**
+Gets the number of object pointers in the array.
+
+@return The number of object pointers in the array.
+*/
+	{ return RPointerArrayBase::Count(); }
+
+
+
+
+template <class T>
+inline T* const& RPointerArray<T>::operator[](TInt anIndex) const
+/**
+Gets a reference to the object pointer located at the specified 
+position within the array.
+
+The compiler chooses this option if the returned reference is used in
+an expression where the reference cannot be modified.
+
+@param anIndex The position of the object pointer within the array. The
+               position is relative to zero, i.e. zero implies the object
+			   pointer at the beginning of the array.
+
+@return A const reference to the object pointer at position anIndex within 
+        the array.
+
+@panic USER 130, if anIndex is negative, or is greater than the number of
+       objects currently in the array.
+*/
+	{return (T* const&)At(anIndex);}
+
+
+
+
+template <class T>
+inline T*& RPointerArray<T>::operator[](TInt anIndex)
+/**
+Gets a reference to the object pointer located at the specified 
+position within the array.
+
+The compiler chooses this option if the returned reference is used in
+an expression where the reference can be modified.
+
+@param anIndex The position of the object pointer within the array. The
+               position is relative to zero, i.e. zero implies the object
+			   pointer at the beginning of the array.
+
+@return A non-const reference to the object pointer at position anIndex within 
+        the array.
+
+@panic USER 130, if anIndex is negative, or is greater than the number of
+       objects currently in the array.
+*/
+	{return (T*&)At(anIndex);}
+
+
+
+
+template <class T>
+inline TInt RPointerArray<T>::Append(const T* anEntry)
+/**
+Appends an object pointer onto the array.
+
+@param anEntry The object pointer to be appended.
+
+@return KErrNone, if the insertion is successful, otherwise one of the system 
+        wide error codes.
+*/
+	{ return RPointerArrayBase::Append(anEntry); }
+
+
+
+
+template <class T>
+inline TInt RPointerArray<T>::Insert(const T* anEntry, TInt aPos)
+/**
+Inserts an object pointer into the array at the specified position.
+
+@param anEntry The object pointer to be inserted.
+@param aPos    The position within the array where the object pointer is to be 
+               inserted. The position is relative to zero, i.e. zero implies
+			   that a pointer is inserted at the beginning of the array.
+
+@return KErrNone, if the insertion is successful, otherwise one of the system 
+        wide error codes.
+
+@panic USER 131, if aPos is negative, or is greater than the number of object
+       pointers currently in the array.
+*/
+	{ return RPointerArrayBase::Insert(anEntry,aPos); }
+
+
+
+
+template <class T>
+inline void RPointerArray<T>::Remove(TInt anIndex)
+/**
+Removes the object pointer at the specified position from the array.
+
+Note that the function does not delete the object whose pointer is removed.
+
+@param anIndex The position within the array from where the object pointer 
+               is to be removed. The position is relative to zero, i.e. zero
+			   implies that a pointer at the beginning of the array is to be
+			   removed.
+			   
+@panic USER 130, if anIndex is negative, or is greater than the number of
+       objects currently in the array. 
+*/
+	{RPointerArrayBase::Remove(anIndex);}
+
+
+
+
+template <class T>
+inline void RPointerArray<T>::Compress()
+/**
+Compresses the array down to a minimum.
+
+After a call to this function, the memory allocated to the array is just
+sufficient for its contained object pointers.
+Subsequently adding a new object pointer to the array 
+always results in a re-allocation of memory.
+*/
+	{RPointerArrayBase::Compress();}
+
+
+
+
+template <class T>
+inline void RPointerArray<T>::Reset()
+/**
+Empties the array.
+
+It frees all memory allocated to the array and resets the internal state so 
+that it is ready to be reused.
+
+This array object can be allowed to go out of scope after a call to this
+function.
+
+Note that the function does not delete the objects whose pointers are contained
+in the array.
+*/
+	{RPointerArrayBase::Reset();}
+
+
+
+
+template <class T>
+inline TInt RPointerArray<T>::Find(const T* anEntry) const
+/**
+Finds the first object pointer in the array which matches the specified object 
+pointer, using a sequential search.
+
+Matching is based on the comparison of pointers.
+
+The find operation always starts at the low index end of the array. There 
+is no assumption about the order of objects in the array.
+
+@param anEntry The object pointer to be found.
+@return The index of the first matching object pointer within the array.
+        KErrNotFound, if no matching object pointer can be found.
+*/
+	{ return RPointerArrayBase::Find(anEntry); }
+
+
+
+
+template <class T>
+inline TInt RPointerArray<T>::Find(const T* anEntry, TIdentityRelation<T> anIdentity) const
+/**
+Finds the first object pointer in the array whose object matches the specified 
+object, using a sequential search and a matching algorithm.
+
+The algorithm for determining whether two class T objects match is provided 
+by a function supplied by the caller.
+
+The find operation always starts at the low index end of the array. There 
+is no assumption about the order of objects in the array.
+
+@param anEntry    The object pointer to be found.
+@param anIdentity A package encapsulating the function which determines whether 
+                  two class T objects match.
+
+@return The index of the first matching object pointer within the array.
+        KErrNotFound, if no suitable object pointer can be found.
+*/
+	{ return RPointerArrayBase::Find(anEntry,anIdentity); }
+
+
+
+
+template <class T>
+inline TInt RPointerArray<T>::FindReverse(const T* anEntry) const
+/**
+Finds the last object pointer in the array which matches the specified object 
+pointer, using a sequential search.
+
+Matching is based on the comparison of pointers.
+
+The find operation always starts at the high index end of the array. There 
+is no assumption about the order of objects in the array.
+
+@param anEntry The object pointer to be found.
+@return The index of the last matching object pointer within the array.
+        KErrNotFound, if no matching object pointer can be found.
+*/
+	{ return RPointerArrayBase::FindReverse(anEntry); }
+
+
+
+
+template <class T>
+inline TInt RPointerArray<T>::FindReverse(const T* anEntry, TIdentityRelation<T> anIdentity) const
+/**
+Finds the last object pointer in the array whose object matches the specified 
+object, using a sequential search and a matching algorithm.
+
+The algorithm for determining whether two class T objects match is provided 
+by a function supplied by the caller.
+
+The find operation always starts at the high index end of the array. There 
+is no assumption about the order of objects in the array.
+
+@param anEntry    The object pointer to be found.
+@param anIdentity A package encapsulating the function which determines whether 
+                  two class T objects match.
+
+@return The index of the last matching object pointer within the array.
+        KErrNotFound, if no suitable object pointer can be found.
+*/
+	{ return RPointerArrayBase::FindReverse(anEntry,anIdentity); }
+
+
+
+
+template <class T>
+inline TInt RPointerArray<T>::FindInAddressOrder(const T* anEntry) const
+/**
+Finds the object pointer in the array that matches the specified object
+pointer, using a binary search technique.
+
+The function assumes that object pointers in the array are in address order.
+
+@param anEntry The object pointer to be found.
+
+@return The index of the matching object pointer within the array or KErrNotFound 
+        if no suitable object pointer can be found.
+*/
+	{ return RPointerArrayBase::FindIsqUnsigned((TUint)anEntry); }
+
+
+
+
+template <class T>
+inline TInt RPointerArray<T>::FindInOrder(const T* anEntry, TLinearOrder<T> anOrder) const
+/**
+Finds the object pointer in the array whose object matches the specified
+object, using a binary search technique and an ordering algorithm.
+
+The function assumes that existing object pointers in the array are ordered 
+so that the objects themselves are in object order as determined by an algorithm 
+supplied by the caller and packaged as a TLinearOrder<T>.
+
+@param anEntry The object pointer to be found.
+@param anOrder A package encapsulating the function which determines the order 
+               of two class T objects.
+
+@return The index of the matching object pointer within the array or KErrNotFound, 
+        if no suitable object pointer can be found.
+*/
+	{ return RPointerArrayBase::FindIsq(anEntry,anOrder); }
+
+
+
+
+template <class T>
+inline TInt RPointerArray<T>::FindInAddressOrder(const T* anEntry, TInt& anIndex) const
+/**
+Finds the object pointer in the array that matches the specified object
+pointer, using a binary search technique.
+
+The function assumes that object pointers in the array are in address order.
+
+@param anEntry The object pointer to be found.
+@param anIndex A TInt supplied by the caller. On return, contains an index
+               value:
+               If the function returns KErrNone, this is the index of the
+               matching object pointer within the array. 
+               If the function returns KErrNotFound,  this is the
+               index of the first object pointer within the array which
+               logically follows after anEntry.
+
+@return KErrNone, if a matching object pointer is found.
+        KErrNotFound, if no suitable object pointer can be found.
+*/
+	{ return RPointerArrayBase::BinarySearchUnsigned((TUint)anEntry,anIndex); }
+
+
+
+
+template <class T>
+inline TInt RPointerArray<T>::FindInOrder(const T* anEntry, TInt& anIndex, TLinearOrder<T> anOrder) const
+/**
+Finds the object pointer in the array whose object matches the specified
+object, using a binary search technique and an ordering algorithm.
+
+The function assumes that existing object pointers in the array are ordered 
+so that the objects themselves are in object order as determined by an
+algorithm supplied by the caller and packaged as a TLinearOrder<T>.
+
+@param anEntry The object pointer to be found.
+@param anIndex A TInt supplied by the caller. On return, contains an
+               index value:
+               If the function returns KErrNone, this is the index of the
+               matching object pointer within the array. 
+               If the function returns KErrNotFound, this is the index of
+               the first object pointer in the array whose object is larger
+               than the entry being searched for - if no objects pointed to in
+               the array are larger, then the index value is the same as the
+               total number of object pointers in the array.
+
+@param anOrder A package encapsulating the function which determines the order 
+               of two class T objects.
+
+@return KErrNone, if a matching object pointer is found.
+        KErrNotFound, if no suitable object pointer can be found.
+*/
+	{ return RPointerArrayBase::BinarySearch(anEntry,anIndex,anOrder); }
+
+
+
+
+template <class T>
+inline TInt RPointerArray<T>::SpecificFindInAddressOrder(const T* anEntry, TInt aMode) const
+/**
+Finds the object pointer in the array that matches the specified object
+pointer, using a binary search technique.
+
+Where there is more than one matching element, it finds the first, the last 
+or any matching element as specified by the value of aMode.
+
+The function assumes that object pointers in the array are in address order.
+
+@param	anEntry The object pointer to be found.
+@param	aMode   Specifies whether to find the first match, the last match or
+                any match, as defined by one of the TArrayFindMode enum values.
+
+@return KErrNotFound, if there is no matching element, otherwise the array
+        index of a matching element - what the index refers to depends on the
+        value of aMode:
+        if this is EArrayFindMode_First, then the index refers to the first matching element;
+        if this is EArrayFindMode_Any, then the index can refer to any of the matching elements;
+        if this is EArrayFindMode_Last, then the index refers to first element that follows
+        the last matching element - if the last matching element is also the last element of
+        the array, then the index value is the same as the total number of elements in the array.
+        
+@see TArrayFindMode
+*/
+	{ return RPointerArrayBase::FindIsqUnsigned((TUint)anEntry, aMode); }
+
+
+
+
+template <class T>
+inline TInt RPointerArray<T>::SpecificFindInOrder(const T* anEntry, TLinearOrder<T> anOrder, TInt aMode) const
+/**
+Finds the object pointer in the array whose object matches the specified
+object, using a binary search technique and an ordering algorithm.
+
+Where there is more than one matching element, it finds the first, the last
+or any matching element as specified by the value of aMode.
+
+The function assumes that existing object pointers in the array are ordered 
+so that the objects themselves are in object order as determined by an algorithm 
+supplied by the caller and packaged as a TLinearOrder<T> type.
+
+@param anEntry The object pointer to be found.
+@param anOrder A package encapsulating the function which determines the order 
+               of two class T objects.
+@param	aMode  Specifies whether to find the first match, the last match or any match,
+               as defined by one of the TArrayFindMode enum values.
+
+@return KErrNotFound, if there is no matching element, otherwise the array
+        index of a matching element -  what the index refers to depends on
+        the value of aMode:
+        if this is EArrayFindMode_First, then the index refers to the first matching element;
+        if this is EArrayFindMode_Any, then the index can refer to any of the matching elements;
+        if this is EArrayFindMode_Last, then the index refers to first element that follows
+        the last matching element - if the last matching element is also the last element of the array,
+        then the index value is the same as the total number of elements in the array.
+        
+@see TArrayFindMode   
+*/
+	{ return RPointerArrayBase::FindIsq(anEntry,anOrder,aMode); }
+
+
+
+
+template <class T>
+inline TInt RPointerArray<T>::SpecificFindInAddressOrder(const T* anEntry, TInt& anIndex, TInt aMode) const
+/**
+Finds the object pointer in the array that matches the specified object
+pointer, using a binary search technique.
+
+Where there is more than one matching element, it finds the first, the last
+or any matching element as specified by the value of aMode.
+
+The function assumes that object pointers in the array are in address order.
+
+@param anEntry The object pointer to be found.
+@param anIndex A TInt type supplied by the caller. On return, it contains an
+               index value depending on whether a match is found and on the
+               value of aMode.
+               If there is no matching element in the array, then this is
+               the index of the first element in the array that is bigger than
+               the element being searched for - if no elements in the array are
+               bigger, then the index value is the same as the total number of
+               elements in the array. If there is a matching element, then what
+               the index refers to depends on the value of aMode:
+               if this is EArrayFindMode_First, then the index refers to the first matching element;
+               if this is EArrayFindMode_Any, then the index can refer to any of the matching elements;
+               if this is EArrayFindMode_Last, then the index refers to first element that follows the
+               last matching element - if the last matching element is also the last element of the array,
+               then the index value is the same as the total number of elements in the array.
+               
+@param	aMode  Specifies whether to find the first match, the last match or any
+               match, as defined by one of the TArrayFindMode enum values.
+
+@return KErrNone, if a matching object pointer is found.
+        KErrNotFound, if no suitable object pointer can be found.
+        
+@see TArrayFindMode
+*/
+	{ return RPointerArrayBase::BinarySearchUnsigned((TUint)anEntry,anIndex,aMode); }
+
+
+
+
+template <class T>
+inline TInt RPointerArray<T>::SpecificFindInOrder(const T* anEntry, TInt& anIndex, TLinearOrder<T> anOrder, TInt aMode) const
+/**
+Finds the object pointer in the array whose object matches the specified
+object, using a binary search technique and an ordering algorithm.
+
+Where there is more than one matching element, it finds the first, the last or any
+matching element as specified by the value of aMode.
+
+The function assumes that existing object pointers in the array are ordered 
+so that the objects themselves are in object order as determined by an
+algorithm supplied by the caller and packaged as a TLinearOrder<T> type.
+
+@param anEntry The object pointer to be found.
+@param anIndex A TInt type supplied by the caller. On return, it contains an
+               index value depending on whether a match is found and on the
+               value of aMode. If there is no matching element in the array,
+               then this is the index of the first element in the array
+               that is bigger than the element being searched for - if
+               no elements in the array are bigger, then the index value
+               is the same as the total number of elements in the array.
+               If there is a matching element, then what the index refers to
+               depends on the value of aMode:
+               if this is EArrayFindMode_First, then the index refers to the first matching element;
+               if this is EArrayFindMode_Any, then the index can refer to any of the matching elements;
+               if this is EArrayFindMode_Last, then the index refers to first element that follows
+               the last matching element - if the last matching element is also the last element
+               of the array, then the index value is the same as the total number of elements in the array.
+
+@param anOrder A package encapsulating the function which determines the order 
+               of two class T objects.
+@param	aMode  Specifies whether to find the first match, the last match or
+               any match, as defined by one of the TArrayFindMode enum values.
+
+@return KErrNone, if a matching object pointer is found.
+        KErrNotFound, if no suitable object pointer can be found.
+        
+@see TArrayFindMode
+*/
+	{ return RPointerArrayBase::BinarySearch(anEntry,anIndex,anOrder,aMode); }
+
+
+
+
+template <class T>
+inline TInt RPointerArray<T>::InsertInAddressOrder(const T* anEntry)
+/**
+Inserts an object pointer into the array in address order.
+
+No duplicate entries are permitted. The array remains unchanged following
+an attempt to insert a duplicate entry.
+
+The function assumes that existing object pointers within the array are in 
+address order.
+
+@param anEntry The object pointer to be inserted.
+
+@return KErrNone, if the insertion is successful;
+        KErrAlreadyExists, if an attempt is being made
+        to insert a duplicate entry; otherwise one of the other system wide
+        error codes.
+*/
+	{ return RPointerArrayBase::InsertIsqUnsigned((TUint)anEntry,EFalse); }
+
+
+
+
+template <class T>
+inline TInt RPointerArray<T>::InsertInOrder(const T* anEntry, TLinearOrder<T> anOrder)
+/**
+Inserts an object pointer into the array so that the object itself is in object 
+order.
+
+The algorithm for determining the order of two class T objects is provided 
+by a function supplied by the caller.
+
+No duplicate entries are permitted. The array remains unchanged following
+an attempt to insert a duplicate entry.
+
+The function assumes that the array is ordered so that the referenced objects 
+are in object order.
+
+@param anEntry The object pointer to be inserted.
+@param anOrder A package encapsulating the function which determines the order 
+               of two class T objects.
+
+@return KErrNone, if the insertion is successful;
+        KErrAlreadyExists, if an attempt is being made
+        to insert a duplicate entry; otherwise one of the other system wide
+        error codes.
+*/
+	{ return RPointerArrayBase::InsertIsq(anEntry,anOrder,EFalse); }
+
+
+
+
+template <class T>
+inline TInt RPointerArray<T>::InsertInAddressOrderAllowRepeats(const T* anEntry)
+/**
+Inserts an object pointer into the array in address order, allowing duplicates.
+
+If the new object pointer is a duplicate of an existing object pointer in 
+the array, then the new pointer is inserted after the existing one. If more 
+than one duplicate object pointer already exists in the array, then any new 
+duplicate pointer is inserted after the last one.
+
+The function assumes that existing object pointers within the array are in 
+address order.
+
+@param anEntry The object pointer to be inserted.
+
+@return KErrNone, if the insertion is successful, otherwise one of the system 
+        wide error codes.
+*/
+	{ return RPointerArrayBase::InsertIsqUnsigned((TUint)anEntry,ETrue); }
+
+
+
+
+template <class T>
+inline TInt RPointerArray<T>::InsertInOrderAllowRepeats(const T* anEntry, TLinearOrder<T> anOrder)
+/**
+Inserts an object pointer into the array so that the object itself is in object 
+order, allowing duplicates
+
+The algorithm for determining the order of two class T objects is provided 
+by a function supplied by the caller.
+
+If the specified object is a duplicate of an existing object, then the new 
+pointer is inserted after the pointer to the existing object. If more than 
+one duplicate object already exists, then the new pointer is inserted after 
+the pointer to the last one.
+
+@param anEntry The object pointer to be inserted. 
+@param anOrder A package encapsulating the function which determines the order 
+               of two class T objects.
+
+@return KErrNone, if the insertion is successful, otherwise one of the system 
+        wide error codes.
+*/
+	{ return RPointerArrayBase::InsertIsq(anEntry,anOrder,ETrue); }
+
+
+
+
+#ifndef __KERNEL_MODE__
+template <class T>
+inline RPointerArray<T>::RPointerArray(T** aEntries, TInt aCount)
+	: RPointerArrayBase((TAny **)aEntries, aCount)
+/**
+C++ constructor with a pointer to the first array entry in a pre-existing
+array, and the number of entries in that array.
+
+This constructor takes a pointer to a pre-existing set of entries of type 
+pointer to class T, which is owned by another RPointerArray object. Ownership 
+of the set of entries still resides with the original RPointerArray object.
+
+@param aEntries A pointer to the first entry of type pointer to class T in 
+                the set of entries belonging to the existing array.
+@param aCount   The number of entries in the existing array. The granularity of
+                this array is set to this value.
+
+@panic USER 156, if aCount is not positive.
+*/
+	{}
+
+
+
+
+template <class T>
+inline void RPointerArray<T>::GranularCompress()
+/**
+Compresses the array down to a granular boundary.
+
+After a call to this function, the memory allocated to the array is sufficient 
+for its contained object pointers. Adding new object pointers to the array 
+does not result in a re-allocation of memory until the the total number of 
+pointers reaches a multiple of the granularity.
+*/
+	{RPointerArrayBase::GranularCompress();}
+
+
+
+
+template <class T>
+inline TInt RPointerArray<T>::Reserve(TInt aCount)
+/**
+Reserves space for the specified number of elements.
+
+After a call to this function, the memory allocated to the array is sufficient 
+to hold the number of object pointers specified. Adding new object pointers to the array 
+does not result in a re-allocation of memory until the the total number of 
+pointers exceeds the specified count.
+
+@param	aCount	The number of object pointers for which space should be reserved
+@return	KErrNone		If the operation completed successfully
+@return KErrNoMemory	If the requested amount of memory could not be allocated
+*/
+	{ return RPointerArrayBase::DoReserve(aCount); }
+
+
+
+
+template <class T>
+inline void RPointerArray<T>::SortIntoAddressOrder()
+/**
+Sorts the object pointers within the array into address order.
+*/
+	{ HeapSortUnsigned(); }
+
+
+
+
+template <class T>
+inline void RPointerArray<T>::Sort(TLinearOrder<T> anOrder)
+/**
+Sorts the object pointers within the array. 
+
+The sort order of the pointers is based on the order of the referenced objects. 
+The referenced object order is determined by an algorithm supplied by the 
+caller and packaged as a TLinerOrder<T>.
+
+@param anOrder A package encapsulating the function which determines the order 
+               of two class T objects.
+*/
+	{ HeapSort(anOrder); }
+
+
+
+
+template <class T>
+inline TArray<T*> RPointerArray<T>::Array() const
+/**
+Constructs and returns a generic array.
+
+@return A generic array representing this array.
+
+@see TArray
+*/
+	{ return TArray<T*>(GetCount,GetElementPtr,(const CBase*)this); }
+#endif
+
+
+
+template <class T>
+void RPointerArray<T>::ResetAndDestroy()
+/**
+Empties the array and deletes the referenced objects.
+
+It frees all memory allocated to the array and resets the internal state so 
+that it is ready to be reused. The function also deletes all of the objects 
+whose pointers are contained by the array.
+
+This array object can be allowed to go out of scope after a call to this function.
+*/
+	{
+	TInt c=Count();
+	T** pE=(T**)Entries();
+	ZeroCount();
+	TInt i;
+	for (i=0; i<c; i++)
+		{
+		delete *pE;
+		pE++;
+		}
+	Reset();
+	}
+
+
+
+// Specialization for RPointerArray<TAny>
+
+/**
+Default C++ constructor.
+
+This constructs an array object for an array of TAny pointers with default
+granularity, which is 8.
+*/
+inline RPointerArray<TAny>::RPointerArray()
+	: RPointerArrayBase()
+	{}
+
+
+
+
+/**
+C++ constructor with granularity.
+
+This constructs an array object for an array of TAny pointers with the specified 
+granularity.
+
+@param aGranularity The granularity of the array.
+
+@panic USER 127, if aGranularity is not positive, or greater than or equal
+       to 0x10000000.
+*/
+inline RPointerArray<TAny>::RPointerArray(TInt aGranularity)
+	: RPointerArrayBase(aGranularity)
+	{}
+
+
+
+
+/**
+C++ constructor with minimum growth step and exponential growth factor.
+
+This constructs an array object for an array of TAny pointers with the specified 
+minimum growth step and exponential growth factor.
+
+@param aMinGrowBy	The minimum growth step of the array. Must be between 1 and
+					65535 inclusive.
+@param aFactor		The factor by which the array grows, multiplied by 256.
+					For example 512 specifies a factor of 2. Must be between 257
+					and 32767 inclusive.
+
+@panic USER 192, if aMinGrowBy<=0 or aMinGrowBy>65535.
+@panic USER 193, if aFactor<=257 or aFactor>32767.
+*/
+inline RPointerArray<TAny>::RPointerArray(TInt aMinGrowBy, TInt aFactor)
+	: RPointerArrayBase(aMinGrowBy, aFactor)
+	{}
+
+
+
+
+inline void RPointerArray<TAny>::Close()
+/**
+Closes the array and frees all memory allocated to it.
+
+The function must be called before this array object goes out of scope.
+
+Note that the function does not delete the objects whose pointers are contained
+in the array.
+*/
+	{RPointerArrayBase::Close();}
+
+
+
+
+inline TInt RPointerArray<TAny>::Count() const
+/**
+Gets the number of pointers in the array.
+
+@return The number of pointers in the array.
+*/
+	{ return RPointerArrayBase::Count(); }
+
+
+
+
+inline TAny* const& RPointerArray<TAny>::operator[](TInt anIndex) const
+/**
+Gets a reference to the pointer located at the specified 
+position within the array.
+
+The compiler chooses this option if the returned reference is used in
+an expression where the reference cannot be modified.
+
+@param anIndex The position of the pointer within the array. The
+               position is relative to zero, i.e. zero implies the object
+			   pointer at the beginning of the array.
+
+@return A const reference to the pointer at position anIndex within 
+        the array.
+
+@panic USER 130, if anIndex is negative, or is greater than the number of
+       objects currently in the array.
+*/
+	{return At(anIndex);}
+
+
+
+
+inline TAny*& RPointerArray<TAny>::operator[](TInt anIndex)
+/**
+Gets a reference to the pointer located at the specified 
+position within the array.
+
+The compiler chooses this option if the returned reference is used in
+an expression where the reference can be modified.
+
+@param anIndex The position of the pointer within the array. The
+               position is relative to zero, i.e. zero implies the object
+			   pointer at the beginning of the array.
+
+@return A non-const reference to the pointer at position anIndex within 
+        the array.
+
+@panic USER 130, if anIndex is negative, or is greater than the number of
+       objects currently in the array.
+*/
+	{return At(anIndex);}
+
+
+
+
+inline TInt RPointerArray<TAny>::Append(const TAny* anEntry)
+/**
+Appends an pointer onto the array.
+
+@param anEntry The pointer to be appended.
+
+@return KErrNone, if the insertion is successful, otherwise one of the system 
+        wide error codes.
+*/
+	{ return RPointerArrayBase::Append(anEntry); }
+
+
+
+
+inline TInt RPointerArray<TAny>::Insert(const TAny* anEntry, TInt aPos)
+/**
+Inserts an pointer into the array at the specified position.
+
+@param anEntry The pointer to be inserted.
+@param aPos    The position within the array where the pointer is to be 
+               inserted. The position is relative to zero, i.e. zero implies
+			   that a pointer is inserted at the beginning of the array.
+
+@return KErrNone, if the insertion is successful, otherwise one of the system 
+        wide error codes.
+
+@panic USER 131, if aPos is negative, or is greater than the number of object
+       pointers currently in the array.
+*/
+	{ return RPointerArrayBase::Insert(anEntry,aPos); }
+
+
+
+
+inline void RPointerArray<TAny>::Remove(TInt anIndex)
+/**
+Removes the pointer at the specified position from the array.
+
+Note that the function does not delete the object whose pointer is removed.
+
+@param anIndex The position within the array from where the pointer 
+               is to be removed. The position is relative to zero, i.e. zero
+			   implies that a pointer at the beginning of the array is to be
+			   removed.
+			   
+@panic USER 130, if anIndex is negative, or is greater than the number of
+       objects currently in the array. 
+*/
+	{RPointerArrayBase::Remove(anIndex);}
+
+
+
+
+inline void RPointerArray<TAny>::Compress()
+/**
+Compresses the array down to a minimum.
+
+After a call to this function, the memory allocated to the array is just
+sufficient for its contained pointers.
+Subsequently adding a new pointer to the array 
+always results in a re-allocation of memory.
+*/
+	{RPointerArrayBase::Compress();}
+
+
+
+
+inline void RPointerArray<TAny>::Reset()
+/**
+Empties the array.
+
+It frees all memory allocated to the array and resets the internal state so 
+that it is ready to be reused.
+
+This array object can be allowed to go out of scope after a call to this
+function.
+
+Note that the function does not delete the objects whose pointers are contained
+in the array.
+*/
+	{RPointerArrayBase::Reset();}
+
+
+
+
+inline TInt RPointerArray<TAny>::Find(const TAny* anEntry) const
+/**
+Finds the first pointer in the array which matches the specified pointer, using
+a sequential search.
+
+Matching is based on the comparison of pointers.
+
+The find operation always starts at the low index end of the array. There 
+is no assumption about the order of objects in the array.
+
+@param anEntry The pointer to be found.
+@return The index of the first matching pointer within the array.
+        KErrNotFound, if no matching pointer can be found.
+*/
+	{ return RPointerArrayBase::Find(anEntry); }
+
+
+
+
+inline TInt RPointerArray<TAny>::FindReverse(const TAny* anEntry) const
+/**
+Finds the last pointer in the array which matches the specified pointer, using
+a sequential search.
+
+Matching is based on the comparison of pointers.
+
+The find operation always starts at the high index end of the array. There 
+is no assumption about the order of objects in the array.
+
+@param anEntry The pointer to be found.
+@return The index of the last matching pointer within the array.
+        KErrNotFound, if no matching pointer can be found.
+*/
+	{ return RPointerArrayBase::FindReverse(anEntry); }
+
+
+
+
+inline TInt RPointerArray<TAny>::FindInAddressOrder(const TAny* anEntry) const
+/**
+Finds the pointer in the array that matches the specified object
+pointer, using a binary search technique.
+
+The function assumes that pointers in the array are in address order.
+
+@param anEntry The pointer to be found.
+
+@return The index of the matching pointer within the array or KErrNotFound 
+        if no suitable pointer can be found.
+*/
+	{ return RPointerArrayBase::FindIsqUnsigned((TUint)anEntry); }
+
+
+
+
+inline TInt RPointerArray<TAny>::FindInAddressOrder(const TAny* anEntry, TInt& anIndex) const
+/**
+Finds the pointer in the array that matches the specified object
+pointer, using a binary search technique.
+
+The function assumes that pointers in the array are in address order.
+
+@param anEntry The pointer to be found.
+@param anIndex A TInt supplied by the caller. On return, contains an index
+               value:
+               If the function returns KErrNone, this is the index of the
+			   matching pointer within the array. 
+               If the function returns KErrNotFound, this is the index of the
+			   last pointer within the array which logically
+			   precedes anEntry.
+
+@return KErrNone, if a matching pointer is found.
+        KErrNotFound, if no suitable pointer can be found.
+*/
+	{ return RPointerArrayBase::BinarySearchUnsigned((TUint)anEntry,anIndex); }
+
+
+
+
+inline TInt RPointerArray<TAny>::SpecificFindInAddressOrder(const TAny* anEntry, TInt aMode) const
+/**
+Finds the pointer in the array that matches the specified pointer, using a
+binary search technique.
+
+Where there is more than one matching element, it finds the first, the last 
+or any matching element as specified by the value of aMode.
+
+The function assumes that pointers in the array are in address order.
+
+@param	anEntry The pointer to be found.
+@param	aMode   Specifies whether to find the first match, the last match or
+                any match, as defined by one of the TArrayFindMode enum values.
+
+@return KErrNotFound, if there is no matching element, otherwise the array
+        index of a matching element - what the index refers to depends on the
+        value of aMode:
+        if this is EArrayFindMode_First, then the index refers to the first matching element;
+        if this is EArrayFindMode_Any, then the index can refer to any of the matching elements;
+        if this is EArrayFindMode_Last, then the index refers to first element that follows
+        the last matching element - if the last matching element is also the last element of
+        the array, then the index value is the same as the total number of elements in the array.
+        
+@see TArrayFindMode
+*/
+	{ return RPointerArrayBase::FindIsqUnsigned((TUint)anEntry, aMode); }
+
+
+
+
+inline TInt RPointerArray<TAny>::SpecificFindInAddressOrder(const TAny* anEntry, TInt& anIndex, TInt aMode) const
+/**
+Finds the pointer in the array that matches the specified pointer, using a
+binary search technique.
+
+Where there is more than one matching element, it finds the first, the last
+or any matching element as specified by the value of aMode.
+
+The function assumes that pointers in the array are in address order.
+
+@param anEntry The pointer to be found.
+@param anIndex A TInt type supplied by the caller. On return, it contains an
+               index value depending on whether a match is found and on the
+               value of aMode.
+               If there is no matching element in the array, then this is
+               the index of the first element in the array that is bigger than
+               the element being searched for - if no elements in the array are
+               bigger, then the index value is the same as the total number of
+               elements in the array. If there is a matching element, then what
+               the index refers to depends on the value of aMode:
+               if this is EArrayFindMode_First, then the index refers to the first matching element;
+               if this is EArrayFindMode_Any, then the index can refer to any of the matching elements;
+               if this is EArrayFindMode_Last, then the index refers to first element that follows the
+               last matching element - if the last matching element is also the last element of the array,
+               then the index value is the same as the total number of elements in the array.
+               
+@param	aMode  Specifies whether to find the first match, the last match or any
+               match, as defined by one of the TArrayFindMode enum values.
+
+@return KErrNone, if a matching pointer is found.
+        KErrNotFound, if no suitable pointer can be found.
+        
+@see TArrayFindMode
+*/
+	{ return RPointerArrayBase::BinarySearchUnsigned((TUint)anEntry,anIndex,aMode); }
+
+
+
+
+inline TInt RPointerArray<TAny>::InsertInAddressOrder(const TAny* anEntry)
+/**
+Inserts an pointer into the array in address order.
+
+No duplicate entries are permitted. The array remains unchanged following
+an attempt to insert a duplicate entry.
+
+The function assumes that existing pointers within the array are in 
+address order.
+
+@param anEntry The pointer to be inserted.
+
+@return KErrNone, if the insertion is successful;
+        KErrAlreadyExists, if an attempt is being made
+        to insert a duplicate entry; otherwise one of the other system wide
+        error codes.
+*/
+	{ return RPointerArrayBase::InsertIsqUnsigned((TUint)anEntry,EFalse); }
+
+
+
+
+inline TInt RPointerArray<TAny>::InsertInAddressOrderAllowRepeats(const TAny* anEntry)
+/**
+Inserts an pointer into the array in address order, allowing duplicates.
+
+If the new pointer is a duplicate of an existing pointer in 
+the array, then the new pointer is inserted after the existing one. If more 
+than one duplicate pointer already exists in the array, then any new 
+duplicate pointer is inserted after the last one.
+
+The function assumes that existing pointers within the array are in 
+address order.
+
+@param anEntry The pointer to be inserted.
+
+@return KErrNone, if the insertion is successful, otherwise one of the system 
+        wide error codes.
+*/
+	{ return RPointerArrayBase::InsertIsqUnsigned((TUint)anEntry,ETrue); }
+
+
+
+
+#ifndef __KERNEL_MODE__
+inline RPointerArray<TAny>::RPointerArray(TAny** aEntries, TInt aCount)
+	: RPointerArrayBase((TAny **)aEntries, aCount)
+/**
+C++ constructor with a pointer to the first array entry in a pre-existing
+array, and the number of entries in that array.
+
+This constructor takes a pointer to a pre-existing set of entries of type TAny*,
+which is owned by another RPointerArray object. Ownership of the set of entries
+still resides with the original RPointerArray object.
+
+@param aEntries A pointer to the first entry of type TAny* in the set of entries
+                belonging to the existing array.                
+@param aCount   The number of entries in the existing array. The granularity of
+                this array is set to this value.
+
+@panic USER 156, if aCount is not positive.
+*/
+	{}
+
+
+
+
+inline void RPointerArray<TAny>::GranularCompress()
+/**
+Compresses the array down to a granular boundary.
+
+After a call to this function, the memory allocated to the array is sufficient 
+for its contained pointers. Adding new pointers to the array 
+does not result in a re-allocation of memory until the the total number of 
+pointers reaches a multiple of the granularity.
+*/
+	{RPointerArrayBase::GranularCompress();}
+
+
+
+
+inline void RPointerArray<TAny>::SortIntoAddressOrder()
+/**
+Sorts the pointers within the array into address order.
+*/
+	{ HeapSortUnsigned(); }
+
+
+
+
+inline TArray<TAny*> RPointerArray<TAny>::Array() const
+/**
+Constructs and returns a generic array.
+
+@return A generic array representing this array.
+
+@see TArray
+*/
+	{ return TArray<TAny*>(GetCount,GetElementPtr,(const CBase*)this); }
+#endif
+
+
+
+template <class T>
+inline RArray<T>::RArray()
+	: RArrayBase(sizeof(T))
+/** 
+Default C++ constructor. 
+
+This constructs an array object for an array of type class T objects with 
+default granularity and key offset value. The default granularity is 8 and 
+the defaul key offset value is zero.
+
+@panic USER 129, if the size of class T is not positive or is not less
+       than 640.
+*/
+	{}
+
+
+
+
+template <class T>
+inline RArray<T>::RArray(TInt aGranularity)
+	: RArrayBase(sizeof(T),aGranularity)
+/**
+C++ constructor with granularity. 
+
+This constructs an array object for an array of type class T objects with 
+a specified granularity and default key offset value. The default key offset 
+value is zero.
+
+@param aGranularity The granularity of the array.
+
+@panic USER 129, if the size of class T is not positive or is not less
+       than 640.
+@panic USER 127, if aGranularity is not positive or the product of this
+       value and the size of class T is not less than 0x10000000.
+*/
+	{}
+
+
+
+
+template <class T>
+inline RArray<T>::RArray(TInt aGranularity, TInt aKeyOffset)
+	: RArrayBase(sizeof(T),aGranularity,aKeyOffset)
+/**
+C++ constructor with granularity and key offset.
+
+This constructs an array object for an array of type class T objects with 
+a specified granularity and a specified key offset value.
+
+@param aGranularity The granularity of the array.
+@param aKeyOffset   The key offset.
+
+@panic USER 129, if the size of class T is not positive or is not less
+       than 640.
+@panic USER 127, if aGranularity is not positive or the product of this
+       value and the size of class T is not less than 0x10000000.
+@panic USER 128, if aKeyOffset is not positive, or is not less than the 
+       size of class T, or is not a multiple of 4.
+*/
+	{}
+
+
+
+
+/**
+C++ constructor with minimum growth step and exponential growth factor.
+
+This constructs an array object for an array of class T objects with the
+specified minimum growth step and exponential growth factor.
+
+@param aMinGrowBy	The minimum growth step of the array. Must be between 1 and
+					65535 inclusive.
+@param aKeyOffset   The key offset.
+@param aFactor		The factor by which the array grows, multiplied by 256.
+					For example 512 specifies a factor of 2. Must be between 257
+					and 32767 inclusive.
+
+@panic USER 129, if the size of class T is not positive or is not less than 640.
+@panic USER 128, if aKeyOffset is negative, or is not less than the 
+       size of class T, or is not a multiple of 4.
+@panic USER 192, if aMinGrowBy<=0 or aMinGrowBy>65535.
+@panic USER 193, if aFactor<=257 or aFactor>32767.
+*/
+template <class T>
+inline RArray<T>::RArray(TInt aMinGrowBy, TInt aKeyOffset, TInt aFactor)
+	: RArrayBase(sizeof(T), aMinGrowBy, aKeyOffset, aFactor)
+	{}
+
+
+
+
+template <class T>
+inline RArray<T>::RArray(TInt aEntrySize,T* aEntries, TInt aCount)
+	: RArrayBase(aEntrySize,aEntries,aCount)
+/**
+C++ constructor with size of entry, a pointer to the first array entry in a 
+pre-existing array, and the number of entries in that array.
+
+This constructor takes a pointer to a pre-existing set of entries of type 
+class T objects owned by another RArray object. Ownership of the set of entries 
+still resides with the original RArray object.
+
+This array is assigned a default granularity and key offset value. The default 
+granularity is 8 and the default key offset value is zero.
+
+The purpose of constructing an array in this way is to allow sorting and
+finding operations to be done without further allocation of memory.
+
+@param aEntrySize The size of an entry in the existing array. 
+@param aEntries   A pointer to the first entry of type class T in the set of 
+                  entries belonging to the existing array.
+@param aCount     The number of entries in the existing array.
+ 
+@panic USER 129, if aEntrySize is not positive or is not less than 640.
+@panic USER 156, if aCount is not positive.
+*/
+	{}
+
+
+
+
+template <class T>
+inline void RArray<T>::Close()
+/**
+Closes the array and frees all memory allocated to the array. 
+
+The function must be called before this array object is destroyed.
+*/
+	{RArrayBase::Close();}
+
+
+
+
+template <class T>
+inline TInt RArray<T>::Count() const
+/**
+Gets the number of objects in the array.
+
+@return The number of objects in the array.
+*/
+	{return RArrayBase::Count();}
+
+
+
+
+template <class T>
+inline const T& RArray<T>::operator[](TInt anIndex) const
+/**
+Gets a reference to an object located at a specified position within the array.
+
+The compiler chooses this function if the returned reference is used in an 
+expression where the reference cannot be modified.
+
+@param anIndex The position of the object within the array. The position is 
+               relative to zero, i.e. zero implies the object at the beginning
+			   of the array. 
+
+@return A const reference to the object at position anIndex within the array.
+
+@panic USER 130, if anIndex is negative or is greater than the number of 
+       objects currently in the array
+*/
+	{return *(const T*)At(anIndex); }
+
+
+
+
+template <class T>
+inline T& RArray<T>::operator[](TInt anIndex)
+/**
+Gets a reference to an object located at a specified position within the array.
+
+The compiler chooses this function if the returned reference is used in an 
+expression where the reference can be modified.
+
+@param anIndex The position of the object within the array. The position is 
+               relative to zero, i.e. zero implies the object at the beginning
+			   of the array. 
+
+@return A non-const reference to the object at position anIndex within the array.
+
+@panic USER 130, if anIndex is negative or is greater than the number of 
+       objects currently in the array
+*/
+	{return *(T*)At(anIndex); }
+
+
+
+
+template <class T>
+inline TInt RArray<T>::Append(const T& anEntry)
+/**
+Apends an object onto the array.
+
+@param anEntry    A reference to the object of type class T to be appended.
+
+@return KErrNone, if the insertion is successful, otherwise one of the system 
+        wide error codes.
+*/
+	{return RArrayBase::Append(&anEntry);}
+
+
+
+
+template <class T>
+inline TInt RArray<T>::Insert(const T& anEntry, TInt aPos)
+/**
+Inserts an object into the array at a specified position.
+
+@param anEntry The class T object to be inserted.
+@param aPos    The position within the array where the object is to
+               be inserted. The position is relative to zero, i.e. zero
+			   implies that an object is inserted at the beginning of
+			   the array.
+			   
+@return KErrNone, if the insertion is successful, otherwise one of the system 
+        wide error codes.
+
+@panic USER 131, if aPos is negative or is greater than the number of objects
+       currently in the array.
+*/
+	{return RArrayBase::Insert(&anEntry,aPos);}
+
+
+
+
+template <class T>
+inline void RArray<T>::Remove(TInt anIndex)
+/**
+Removes the object at a specified position from the array.
+
+@param anIndex The position within the array from where the object is to be 
+               removed. The position is relative to zero, i.e. zero implies
+			   that an object at the beginning of the array is to be removed.
+	
+@panic USER 130, if anIndex is negative or is greater than the number of
+       objects currently in the array.
+*/
+	{RArrayBase::Remove(anIndex);}
+
+
+
+
+template <class T>
+inline void RArray<T>::Compress()
+/** 
+Compresses the array down to a minimum.
+
+After a call to this function, the memory allocated to the array is just
+sufficient for its contained objects. Subsequently adding a new object to the
+array always results in a re-allocation of memory.
+*/
+	{RArrayBase::Compress();}
+
+
+
+
+template <class T>
+inline void RArray<T>::Reset()
+/**
+Empties the array, so that it is ready to be reused.
+
+The function frees all memory allocated to the array and resets the internal 
+state so that it is ready to be reused.
+
+This array object can be allowed to go out of scope after a call to this function.
+*/
+	{RArrayBase::Reset();}
+
+
+
+
+template <class T>
+inline TInt RArray<T>::Find(const T& anEntry) const
+/**
+Finds the first object in the array which matches the specified object using 
+a sequential search.
+
+Matching is based on the comparison of a TInt value at the key offset position 
+within the objects.
+
+For classes which define their own equality operator (==), the alternative method
+Find(const T& anEntry, TIdentityRelation<T> anIdentity) is recommended.
+
+The find operation always starts at the low index end of the array. There 
+is no assumption about the order of objects in the array.
+
+@param anEntry A reference to an object of type class T to be used for matching.
+
+@return The index of the first matching object within the array. 
+        KErrNotFound, if no matching object can be found.
+*/
+	{return RArrayBase::Find(&anEntry);}
+
+
+
+
+template <class T>
+inline TInt RArray<T>::Find(const T& anEntry, TIdentityRelation<T> anIdentity) const
+/**
+Finds the first object in the array which matches the specified object using 
+a sequential search and a matching algorithm.
+
+The algorithm for determining whether two class T type objects match is provided 
+by a function supplied by the caller.
+
+Such a function need not be supplied if an equality operator (==) is defined for class T. 
+In this case, default construction of anIdentity provides matching, as in the example below:
+
+@code
+//Construct a TPoint and append to an RArray<TPoint>
+TPoint p1(0,0);
+RArray<TPoint> points;
+points.AppendL(p1);
+//Find position of p1 in points using TIdentityRelation<TPoint> default construction
+TInt r = points.Find(p1, TIdentityRelation<TPoint>());
+@endcode
+
+The find operation always starts at the low index end of the array. There 
+is no assumption about the order of objects in the array.
+
+@param anEntry    A reference to an object of type class T to be used
+                  for matching.
+@param anIdentity A package encapsulating the function which determines whether 
+                  two class T type objects match.
+
+@return The index of the first matching object within the array.
+        KErrNotFound, if no matching object can be found.
+*/
+	{return RArrayBase::Find(&anEntry,anIdentity);}
+
+
+
+
+template <class T>
+inline TInt RArray<T>::FindReverse(const T& anEntry) const
+/**
+Finds the last object in the array which matches the specified object using 
+a sequential search.
+
+Matching is based on the comparison of a TInt value at the key offset position 
+within the objects.
+
+For classes which define their own equality operator (==), the alternative method
+FindReverse(const T& anEntry, TIdentityRelation<T> anIdentity) is recommended.
+
+The find operation always starts at the high index end of the array. There 
+is no assumption about the order of objects in the array.
+
+@param anEntry A reference to an object of type class T to be used for matching.
+
+@return The index of the last matching object within the array. 
+        KErrNotFound, if no matching object can be found.
+*/
+	{return RArrayBase::FindReverse(&anEntry);}
+
+
+
+
+template <class T>
+inline TInt RArray<T>::FindReverse(const T& anEntry, TIdentityRelation<T> anIdentity) const
+/**
+Finds the last object in the array which matches the specified object using 
+a sequential search and a matching algorithm.
+
+The algorithm for determining whether two class T type objects match is provided 
+by a function supplied by the caller.
+
+Such a function need not be supplied if an equality operator (==) is defined for class T. 
+In this case, default construction of anIdentity provides matching.
+
+See Find(const T& anEntry, TIdentityRelation<T> anIdentity) for more details.
+
+The find operation always starts at the high index end of the array. There 
+is no assumption about the order of objects in the array.
+
+@param anEntry    A reference to an object of type class T to be used
+                  for matching.
+@param anIdentity A package encapsulating the function which determines whether 
+                  two class T type objects match.
+
+@return The index of the last matching object within the array.
+        KErrNotFound, if no matching object can be found.
+*/
+	{return RArrayBase::FindReverse(&anEntry,anIdentity);}
+
+
+
+
+template <class T>
+inline TInt RArray<T>::FindInSignedKeyOrder(const T& anEntry) const
+/**
+Finds the object in the array which matches the specified object using a binary 
+search technique.
+
+The function assumes that existing objects within the array are in signed 
+key order.
+
+@param anEntry A reference to an object of type class T to be used for matching.
+
+@return The index of the matching object within the array, or KErrNotFound 
+        if no matching object can be found.
+*/
+	{return RArrayBase::FindIsqSigned(&anEntry);}
+
+
+
+
+template <class T>
+inline TInt RArray<T>::FindInUnsignedKeyOrder(const T& anEntry) const
+/**
+Finds the object in the array which matches the specified object using a binary 
+search technique.
+
+The function assumes that existing objects within the array are in unsigned 
+key order.
+
+@param anEntry A reference to an object of type class T to be used for matching.
+
+@return The index of the matching object within the array, or KErrNotFound 
+        if no matching object can be found.
+*/
+	{return RArrayBase::FindIsqUnsigned(&anEntry);}
+
+
+
+
+template <class T>
+inline TInt RArray<T>::FindInOrder(const T& anEntry, TLinearOrder<T> anOrder) const
+/**
+Finds the object in the array which matches the specified object using a binary 
+search technique and an ordering algorithm.
+
+The function assumes that existing objects within the array are in object 
+order as determined by an algorithm supplied by the caller and packaged as 
+a TLinearOrder<T>.
+
+@param anEntry A reference to an object of type class T to be used for matching.
+@param anOrder A package encapsulating the function which determines the order 
+               of two class T objects.
+
+@return The index of the matching object within the array, or KErrNotFound if 
+        no matching object can be found.
+*/
+	{return RArrayBase::FindIsq(&anEntry,anOrder);}
+
+
+
+
+template <class T>
+inline TInt RArray<T>::FindInSignedKeyOrder(const T& anEntry, TInt& anIndex) const
+/**
+Finds the object in the array which matches the specified object using a binary 
+search technique.
+
+The function assumes that existing objects within the array are in signed 
+key order.
+
+@param anEntry A reference to an object of type class T to be used for matching.
+@param anIndex On return contains an index value. If the function returns KErrNone,
+               this is the index of the matching object within the array.
+               If the function returns KErrNotFound, this is the index of the
+               first element in the array whose key is bigger than the key of the
+               element being sought. If there are no elements in the array with
+               a bigger key, then the index value is the same as the total 
+               number of elements in the array.
+@return KErrNone if a matching object is found, or KErrNotFound if no matching 
+        object can be found.
+*/
+	{return RArrayBase::BinarySearchSigned(&anEntry,anIndex);}
+
+
+
+
+template <class T>
+inline TInt RArray<T>::FindInUnsignedKeyOrder(const T& anEntry, TInt& anIndex) const
+/**
+Finds the object in the array which matches the specified object using a binary 
+search technique.
+
+The function assumes that existing objects within the array are in unsigned 
+key order.
+
+@param anEntry A reference to an object of type class T to be used for matching.
+@param anIndex On return contains an index value. If the function returns
+               KErrNone, this is the index of the matching object within the
+               array. 
+               If the function returns KErrNotFound, this is the index of the
+               first element in the array whose key is bigger than the key of the
+               element being sought. If there are no elements in the array with
+               a bigger key, then the index value is the same as the total 
+               number of elements in the array.
+@return KErrNone if a matching object is found, or KErrNotFound if no matching 
+        object can be found.
+*/
+	{return RArrayBase::BinarySearchUnsigned(&anEntry,anIndex);}
+
+
+
+
+template <class T>
+inline TInt RArray<T>::FindInOrder(const T& anEntry, TInt& anIndex, TLinearOrder<T> anOrder) const
+/**
+Finds the object in the array which matches the specified object using a binary 
+search technique and an ordering algorithm.
+
+The function assumes that existing objects within the array are in object 
+order as determined by an algorithm supplied by the caller and packaged as 
+a TLinearOrder<T>.
+
+@param anEntry A reference to an object of type class T to be used for matching.
+@param anIndex On return contains an index value. If the function returns
+               KErrNone, this is the index of the matching object within the
+               array.
+               If the function returns KErrNotFound, this is the index of the
+               first element in the array that is bigger than the element being
+               searched for - if no elements in the array are bigger, then
+               the index value is the same as the total number of elements in
+               the array.
+@param anOrder A package encapsulating the function which determines the order 
+               of two class T objects.
+
+@return KErrNone if a matching object is found. KErrNotFound if no matching 
+        object can be found.
+*/
+	{return RArrayBase::BinarySearch(&anEntry,anIndex,anOrder);}
+
+
+
+
+template <class T>
+inline TInt RArray<T>::SpecificFindInSignedKeyOrder(const T& anEntry, TInt aMode) const
+/**
+Finds the object in the array which matches the specified object using a binary 
+search technique.
+
+The element ordering is determined by a signed 32-bit word
+(the key) embedded in each array element. In the case that there is more than
+one matching element, finds the first, last or any match as specified by
+the value of aMode.
+
+The function assumes that existing objects within the array are in signed 
+key order.
+
+@param anEntry A reference to an object of type class T to be used for matching.
+@param	aMode  Specifies whether to find the first match, the last match or
+               any match, as defined by one of the TArrayFindMode enum values.
+               
+@return KErrNotFound, if there is no matching element, otherwise the array
+        index of a matching element -  what the index refers to depends on the
+        value of aMode:
+        if this is EArrayFindMode_First, then the index refers to the first matching element;
+        if this is EArrayFindMode_Any, then the index can refer to any of the matching elements;
+        if this is EArrayFindMode_Last, then the index refers to first element that follows
+        the last matching element - if the last matching element is also the last element of
+        the array, then the index value is the same as the total number of elements in the array.
+        
+@see TArrayFindMode        
+*/
+	{return RArrayBase::FindIsqSigned(&anEntry,aMode);}
+
+
+
+
+template <class T>
+inline TInt RArray<T>::SpecificFindInUnsignedKeyOrder(const T& anEntry, TInt aMode) const
+/**
+Finds the object in the array which matches the specified object using a binary 
+search technique.
+
+The element ordering is determined by an unsigned 32-bit word
+(the key) embedded in each array element. Where there is more than
+one matching element, it finds the first, last or any matching element
+as specified by the value of aMode.
+
+The function assumes that existing objects within the array are in unsigned 
+key order.
+
+@param anEntry A reference to an object of type class T to be used for matching.
+@param	aMode  Specifies whether to find the first match, the last match or
+               any match, as defined by one of the TArrayFindMode enum values.
+
+@return KErrNotFound, if there is no matching element, otherwise the array
+        index of a matching element - what the index refers to depends on the
+        value of aMode:
+        if this is EArrayFindMode_First, then the index refers to the first matching element;
+        if this is EArrayFindMode_Any, then the index can refer to any of the matching elements;
+        if this is EArrayFindMode_Last, then the index refers to first element that follows the
+        last matching element - if the last matching element is also the last element of the array,
+        then the index value is the same as the total number of elements in the array.
+        
+@see TArrayFindMode
+*/
+	{return RArrayBase::FindIsqUnsigned(&anEntry,aMode);}
+
+
+
+
+template <class T>
+inline TInt RArray<T>::SpecificFindInOrder(const T& anEntry, TLinearOrder<T> anOrder, TInt aMode) const
+/**
+Finds the object in the array which matches the specified object using a binary 
+search technique and an ordering algorithm.
+
+Where there is more than one matching element, it finds the first, the last
+or any matching element as specified by the value of aMode.
+
+The function assumes that existing objects within the array are in object 
+order as determined by an algorithm supplied by the caller and packaged as 
+a TLinearOrder<T> type.
+
+@param anEntry A reference to an object of type class T to be used for matching.
+@param anOrder A package encapsulating the function which determines the order 
+               of two class T objects.
+@param	aMode  Specifies whether to find the first match, the last match or any
+               match, as defined by one of the TArrayFindMode enum values.
+
+@return KErrNotFound, if there is no matching element, otherwise the array index
+        of a matching element -  what the index refers to depends on the value of
+        aMode:
+        if this is EArrayFindMode_First, then the index refers to the first matching element;
+        if this is EArrayFindMode_Any, then the index can refer to any of the matching elements;
+        if this is EArrayFindMode_Last, then the index refers to first element that follows
+        the last matching element - if the last matching element is also the last element of
+        the array, then the index value is the same as the total number of elements in the array.
+*/
+	{return RArrayBase::FindIsq(&anEntry,anOrder,aMode);}
+
+
+
+
+template <class T>
+inline TInt RArray<T>::SpecificFindInSignedKeyOrder(const T& anEntry, TInt& anIndex, TInt aMode) const
+/**
+Finds the object in the array which matches the specified object using a binary 
+search technique.
+
+The element ordering is determined by a signed 32-bit word
+(the key) embedded in each array element. Where there is more than
+one matching element, finds the first, last or any matching element as
+specified specified by the value of aMode.
+
+The function assumes that existing objects within the array are in signed 
+key order.
+
+@param anEntry A reference to an object of type class T to be used for matching.
+@param anIndex A TInt type supplied by the caller. On return, it contains
+               an index value depending on whether a match is found and on the
+               value of aMode. If there is no matching element in the array,
+               then this is the index of the first element in the array that
+               is bigger than the element being searched for - if no elements
+               in the array are bigger, then the index value is the same as the
+               total number of elements in the array. If there is a matching
+               element, then what the index refers to depends on the value of aMode:
+               if this is EArrayFindMode_First, then the index refers to the first matching element;
+               if this is EArrayFindMode_Any, then the index can refer to any of the matching elements;
+               if this is EArrayFindMode_Last, then the index refers to first element that follows
+               the last matching element - if the last matching element is also the last element of
+               the array, then the index value is the same as the total number of elements in the array.
+@param	aMode  Specifies whether to find the first match, the last match or any match,
+               as defined by one of the TArrayFindMode enum values.
+               
+@return	KErrNone, if a matching object pointer is found;
+        KErrNotFound, if no suitable object pointer can be found.
+*/
+	{return RArrayBase::BinarySearchSigned(&anEntry,anIndex,aMode);}
+
+
+
+
+template <class T>
+inline TInt RArray<T>::SpecificFindInUnsignedKeyOrder(const T& anEntry, TInt& anIndex, TInt aMode) const
+/**
+Finds the object in the array which matches the specified object using a binary 
+search technique.
+
+The element ordering is determined by an unsigned 32-bit word
+(the key) embedded in each array element. Where there is more than
+one matching element, it finds the first, last or any matching element as
+specified by the value of aMode.
+
+The function assumes that existing objects within the array are in unsigned 
+key order.
+
+@param anEntry A reference to an object of type class T to be used for matching.
+@param anIndex A TInt type supplied by the caller. On return, it contains an index
+               value depending on whether a match is found and on the value of aMode.
+               If there is no matching element in the array, then this is the index
+               of the first element in the array that is bigger than the element
+               being searched for - if no elements in the array are bigger, then
+               the index value is the same as the total number of elements in the array.
+               If there is a matching element, then what the index refers to depends on
+               the value of aMode:
+               if this is EArrayFindMode_First, then the index refers to the first matching element;
+               if this is EArrayFindMode_Any, then the index can refer to any of the matching elements;
+               if this is EArrayFindMode_Last, then the index refers to first element that follows the
+               last matching element - if the last matching element is also the last element of the array,
+               then the index value is the same as the total number of elements in the array.
+@param	aMode  Specifies whether to find the first match, the last match or any match, as defined by one
+               of the TArrayFindMode enum values.
+@return	KErrNone, if a matching object pointer is found; KErrNotFound, if no suitable object pointer can be found.
+
+@see TArrayFindMode
+*/
+	{return RArrayBase::BinarySearchUnsigned(&anEntry,anIndex,aMode);}
+
+
+
+
+template <class T>
+inline TInt RArray<T>::SpecificFindInOrder(const T& anEntry, TInt& anIndex, TLinearOrder<T> anOrder, TInt aMode) const
+/**
+Finds the object in the array which matches the specified object using a binary 
+search technique and a specified ordering algorithm.
+
+Where there is more than one matching element, it finds the first, the last or
+any matching element as specified by the value of aMode.
+
+The function assumes that existing objects within the array are in object 
+order as determined by an algorithm supplied by the caller and packaged as 
+a TLinearOrder<T> type.
+
+@param anEntry A reference to an object of type class T to be used for matching.
+@param anIndex A TInt type supplied by the caller. On return, it contains
+               an index value depending on whether a match is found and on the
+               value of aMode. If there is no matching element in the array,
+               then this is the index of the first element in the array that
+               is bigger than the element being searched for - if no elements
+               in the array are bigger, then the index value is the same as 
+               the total number of elements in the array.
+               If there is a matching element, then what the index refers to
+               depends on the value of aMode:
+               if this is EArrayFindMode_First, then the index refers to the first matching element;
+               if this is EArrayFindMode_Any, then the index can refer to any of the matching elements;
+               if this is EArrayFindMode_Last, then the index refers to first element that follows
+               the last matching element - if the last matching element is also
+               the last element of the array, then the index value is the same as
+               the total number of elements in the array.
+@param anOrder A package encapsulating the function which determines the order 
+               of two class T objects.
+@param	aMode  Specifies whether to find the first match, the last match or any match,
+               as defined by one of the TArrayFindMode enum values.
+@return	KErrNone, if a matching object pointer is found;
+        KErrNotFound, if no suitable object pointer can be found.
+
+*/
+	{return RArrayBase::BinarySearch(&anEntry,anIndex,anOrder,aMode);}
+
+
+
+
+template <class T>
+inline TInt RArray<T>::InsertInSignedKeyOrder(const T& anEntry)
+/**
+Inserts an object into the array in ascending signed key order.
+
+The order of two class T type objects is based on comparing a TInt value
+located at the key offset position within the class T object.
+
+No duplicate entries are permitted. The array remains unchanged following
+an attempt to insert a duplicate entry.
+
+@param anEntry A reference to the object of type class T to be inserted.
+
+@return KErrNone, if the insertion is successful;
+        KErrAlreadyExists, if an attempt is being made
+        to insert a duplicate entry; otherwise one of the other system wide
+        error codes.
+*/
+	{return RArrayBase::InsertIsqSigned(&anEntry,EFalse);}
+
+
+
+
+template <class T>
+inline TInt RArray<T>::InsertInUnsignedKeyOrder(const T& anEntry)
+/**
+Inserts an object into the array in ascending unsigned key order.
+
+The order of two class T type objects is based on comparing a TUint value 
+located at the key offset position within the class T object. 
+
+No duplicate entries are permitted. The array remains unchanged following
+an attempt to insert a duplicate entry.
+
+@param anEntry A reference to the object of type class T to be inserted.
+
+@return KErrNone, if the insertion is successful;
+        KErrAlreadyExists, if an attempt is being made
+        to insert a duplicate entry; otherwise one of the other system wide
+        error codes.
+*/
+	{return RArrayBase::InsertIsqUnsigned(&anEntry,EFalse);}
+
+
+
+
+template <class T>
+inline TInt RArray<T>::InsertInOrder(const T& anEntry, TLinearOrder<T> anOrder)
+/**
+Inserts an object of into the array in object order.
+
+The algorithm for determining the order of two class T type objects is provided 
+by a function supplied by the caller.
+
+No duplicate entries are permitted. The array remains unchanged following
+an attempt to insert a duplicate entry.
+
+The function assumes that existing objects within the array are in object 
+order.
+
+@param anEntry A reference to the object of type class T to be inserted.
+@param anOrder A package encapsulating the function which determines the order 
+               of two class T objects.
+
+@return KErrNone, if the insertion is successful;
+        KErrAlreadyExists, if an attempt is being made
+        to insert a duplicate entry; otherwise one of the other system wide
+        error codes.
+*/
+	{return RArrayBase::InsertIsq(&anEntry,anOrder,EFalse);}
+
+
+
+
+template <class T>
+inline TInt RArray<T>::InsertInSignedKeyOrderAllowRepeats(const T& anEntry)
+/**
+Inserts an object into the array in ascending signed key order,
+allowing duplicates.
+
+The order of two class T type objects is based on comparing a TInt value
+located at the key offset position within the class T object. 
+
+If anEntry is a duplicate of an existing object in the array, then the new 
+object is inserted after the existing object. If more than one duplicate object 
+already exists in the array, then any new duplicate object is inserted after 
+the last one.
+
+@param anEntry A reference to the object of type class T to be inserted.
+
+@return KErrNone, if the insertion is successful, otherwise one of the system 
+        wide error codes.
+*/
+	{return RArrayBase::InsertIsqSigned(&anEntry,ETrue);}
+
+
+
+
+template <class T>
+inline TInt RArray<T>::InsertInUnsignedKeyOrderAllowRepeats(const T& anEntry)
+/**
+Inserts an object into the array in ascending unsigned key order, allowing 
+duplicates.
+
+The order of two class T type objects is based on comparing a TUint value 
+located at the key offset position within the class T object. 
+
+If anEntry is a duplicate of an existing object in the array, then the new 
+object is inserted after the existing object. If more than one duplicate object 
+already exists in the array, then any new duplicate object is inserted after 
+the last one.
+
+@param anEntry A reference to the object of type class T to be inserted.
+
+@return KErrNone, if the insertion is successful, otherwise one of the system 
+        wide error codes. 
+*/
+	{return RArrayBase::InsertIsqUnsigned(&anEntry,ETrue);}
+
+
+
+
+template <class T>
+inline TInt RArray<T>::InsertInOrderAllowRepeats(const T& anEntry, TLinearOrder<T> anOrder)
+/**
+Inserts an object into the array in object order, allowing duplicates.
+
+The algorithm for determining the order of two class T type objects is provided 
+by a function supplied by the caller.
+
+If anEntry is a duplicate of an existing object in the array, then the new 
+object is inserted after the existing object. If more than one duplicate object 
+already exists in the array, then anEntry is inserted after the last one.
+
+The function assumes that existing objects within the array are in object 
+order.
+
+@param anEntry A reference to the object of type class T to be inserted.
+@param anOrder A package encapsulating the function which determines the order 
+               of two class T objects.
+
+@return KErrNone, if the insertion is successful, otherwise one of the system 
+        wide error codes.
+*/
+	{return RArrayBase::InsertIsq(&anEntry,anOrder,ETrue);}
+
+
+
+#ifndef __KERNEL_MODE__
+
+template <class T>
+inline void RArray<T>::GranularCompress()
+/**
+Compresses the array down to a granular boundary.
+
+After a call to this function, the memory allocated to the array is sufficient 
+for its contained objects. Adding new objects to the array does not result 
+in a re-allocation of memory until the the total number of objects reaches 
+a multiple of the granularity.
+*/
+	{RArrayBase::GranularCompress();}
+
+
+
+
+template <class T>
+inline TInt RArray<T>::Reserve(TInt aCount)
+/**
+Reserves space for the specified number of elements.
+
+After a call to this function, the memory allocated to the array is sufficient 
+to hold the number of objects specified. Adding new objects to the array 
+does not result in a re-allocation of memory until the the total number of 
+objects exceeds the specified count.
+
+@param	aCount	The number of objects for which space should be reserved
+@return	KErrNone		If the operation completed successfully
+@return KErrNoMemory	If the requested amount of memory could not be allocated
+*/
+	{ return RArrayBase::DoReserve(aCount); }
+
+
+
+
+template <class T>
+inline void RArray<T>::SortSigned()
+/**
+Sorts the objects within the array; the sort order is assumed to be in signed 
+integer order.
+*/
+	{HeapSortSigned();}
+
+
+
+
+template <class T>
+inline void RArray<T>::SortUnsigned()
+/**
+Sorts the objects within the array; the sort order is assumed to be in unsigned 
+integer order.
+*/
+	{HeapSortUnsigned();}
+
+
+
+
+template <class T>
+inline void RArray<T>::Sort(TLinearOrder<T> anOrder)
+/**
+Sorts the objects within the array using the specified TLinearOrder. 
+
+The sort order is determined by an algorithm supplied by the caller and
+packaged as a TLinerOrder<T>.
+
+@param anOrder A package encapsulating the function which determines the order 
+               of two class T type objects.
+*/
+	{HeapSort(anOrder);}
+
+
+
+
+template <class T>
+inline TArray<T> RArray<T>::Array() const
+/**
+Constructs and returns a generic array.
+
+@return A generic array representing this array.
+*/
+	{ return TArray<T>(GetCount,GetElementPtr,(const CBase*)this); }
+#endif
+
+
+
+
+inline RArray<TInt>::RArray()
+	: RPointerArrayBase()
+/**
+Constructs an array object for an array of signed integers with
+default granularity. 
+
+The default granularity is 8. 
+*/
+	{}
+
+
+
+
+inline RArray<TInt>::RArray(TInt aGranularity)
+	: RPointerArrayBase(aGranularity)
+/**
+Constructs an array object for an array of signed integers with the specified 
+granularity.
+	
+@param aGranularity The granularity of the array.
+
+@panic USER 127, if aGranularity is not positive or is greater than or
+       equal to 0x10000000.
+*/
+	{}
+
+
+
+
+/**
+C++ constructor with minimum growth step and exponential growth factor.
+
+This constructs an array object for an array of signed integers with the
+specified minimum growth step and exponential growth factor.
+
+@param aMinGrowBy	The minimum growth step of the array. Must be between 1 and
+					65535 inclusive.
+@param aFactor		The factor by which the array grows, multiplied by 256.
+					For example 512 specifies a factor of 2. Must be between 257
+					and 32767 inclusive.
+
+@panic USER 192, if aMinGrowBy<=0 or aMinGrowBy>65535.
+@panic USER 193, if aFactor<=257 or aFactor>32767.
+*/
+inline RArray<TInt>::RArray(TInt aMinGrowBy, TInt aFactor)
+	: RPointerArrayBase(aMinGrowBy, aFactor)
+	{}
+
+
+
+
+inline void RArray<TInt>::Close()
+/**
+Closes the array and frees all memory allocated to the array.
+	
+The function must be called before this array object goes out of scope. 
+*/
+	{RPointerArrayBase::Close();}
+
+
+
+
+inline TInt RArray<TInt>::Count() const
+/**
+Gets the number of signed integers in the array.
+	
+@return The number of signed integers in the array.
+*/
+	{ return RPointerArrayBase::Count(); }
+
+
+
+
+inline const TInt& RArray<TInt>::operator[](TInt anIndex) const
+/**
+Gets a reference to the signed integer located at a specified position within 
+the array.
+	
+The compiler chooses this function if the returned reference is used in an 
+expression where the reference cannot be modified.
+	
+@param anIndex The position of the signed integer within the array. The
+               position is relative to zero, i.e. zero implies the entry
+			   at the beginning of the array. 
+
+@return A const reference to the signed integer at position anIndex within 
+        the array.
+
+@panic USER 130, if anIndex is negative, or is greater than the number of 
+	   entries currently in the array.
+*/
+	{return (const TInt&)At(anIndex);}
+
+
+
+
+inline TInt& RArray<TInt>::operator[](TInt anIndex)
+/**
+Gets a reference to the signed integer located at a specified position within 
+the array.
+	
+The compiler chooses this function if the returned reference is used in an 
+expression where the reference can be modified.
+	
+@param anIndex The position of the signed integer within the array. The
+               position is relative to zero, i.e. zero implies the entry
+			   at the beginning of the array. 
+
+@return A non-const reference to the signed integer at position anIndex within 
+        the array.
+
+@panic USER 130, if anIndex is negative, or is greater than the number of 
+	   entries currently in the array.
+*/
+	{return (TInt&)At(anIndex);}
+
+
+
+
+inline TInt RArray<TInt>::Append(TInt anEntry)
+/**
+Appends a signed integer onto the array.
+	
+@param anEntry The signed integer to be appended.
+	
+@return KErrNone, if the insertion is successful, otherwise one of the system 
+	    wide error codes.
+*/
+	{ return RPointerArrayBase::Append((const TAny*)anEntry); }
+
+
+
+
+inline TInt RArray<TInt>::Insert(TInt anEntry, TInt aPos)
+/**
+Inserts a signed integer into the array at the specified position.
+	
+@param anEntry The signed integer to be inserted.
+@param aPos    The position within the array where the signed integer is to be 
+	           inserted. The position is relative to zero, i.e. zero implies
+			   that an entry is inserted at the beginning of the array.
+			   
+@return KErrNone, if the insertion is successful, otherwise one of the system 
+	    wide error codes.
+
+@panic USER 131, if aPos is negative, or is greater than the number of entries
+       currently in the array.
+*/
+	{ return RPointerArrayBase::Insert((const TAny*)anEntry,aPos); }
+
+
+
+
+inline void RArray<TInt>::Remove(TInt anIndex)
+/**
+Removes the signed integer at the specified position from the array.
+	
+@param anIndex The position within the array from where the signed integer 
+	           is to be removed. The position is relative to zero, i.e. zero
+			   implies that an entry at the beginning of the array is to be
+			   removed. 
+
+@panic USER 130, if anIndex is negative or is greater than the number of
+       entries currently in the array.
+*/
+	{RPointerArrayBase::Remove(anIndex);}
+
+
+
+
+inline void RArray<TInt>::Compress()
+/**
+Compresses the array down to a minimum.
+	
+After a call to this function, the memory allocated to the array is just
+sufficient for its entries. Subsequently adding a new signed integer to the
+array always results in a re-allocation of memory.
+*/
+	{RPointerArrayBase::Compress();}
+
+
+
+
+inline void RArray<TInt>::Reset()
+/**
+Empties the array.
+
+The function frees all memory allocated to the array and 
+resets the internal state so that it is ready to be reused.
+	
+This array object can be allowed to go out of scope after a call to this
+function.
+*/
+	{RPointerArrayBase::Reset();}
+
+
+
+
+inline TInt RArray<TInt>::Find(TInt anEntry) const
+/**
+Finds the first signed integer in the array which matches the specified signed 
+integer using a sequential search.
+	
+The find operation always starts at the low index end of the array. There 
+is no assumption about the order of entries in the array.
+	
+@param anEntry The signed integer to be found.
+
+@return The index of the first matching signed integer within the array.
+        KErrNotFound, if no matching entry can be found.
+*/
+	{ return RPointerArrayBase::Find((const TAny*)anEntry); }
+
+
+
+
+inline TInt RArray<TInt>::FindReverse(TInt anEntry) const
+/**
+Finds the last signed integer in the array which matches the specified signed 
+integer using a sequential search.
+	
+The find operation always starts at the high index end of the array. There 
+is no assumption about the order of entries in the array.
+	
+@param anEntry The signed integer to be found.
+
+@return The index of the last matching signed integer within the array.
+        KErrNotFound, if no matching entry can be found.
+*/
+	{ return RPointerArrayBase::FindReverse((const TAny*)anEntry); }
+
+
+
+
+inline TInt RArray<TInt>::FindInOrder(TInt anEntry) const
+/**
+Finds the signed integer in the array that matches the specified signed integer 
+using a binary search technique.
+	
+The function assumes that the array is in signed integer order.
+	
+@param anEntry The signed integer to find.
+
+@return The index of the matching signed integer within the array or KErrNotFound, 
+        if no match can be found.
+*/
+	{ return RPointerArrayBase::FindIsqSigned(anEntry); }
+
+
+
+
+inline TInt RArray<TInt>::FindInOrder(TInt anEntry, TInt& anIndex) const
+/**
+Finds the signed integer in the array that matches the specified signed integer
+using a binary search technique.
+	
+The function assumes that the array is in signed integer order.
+	
+@param anEntry The signed integer to find.
+@param anIndex A TInt suplied by the caller. On return contains an index value.
+               If the function returns KErrNone, this is the index of the
+               matching signed integer within the array.   
+               If the function returns KErrNotFound, this is the index of the
+               first signed integer within the array that is bigger than the
+               signed integer being searched for - if no signed integers within
+               the array are bigger, then the index value is the same as the
+               total number of signed integers within the array.
+
+@return KErrNone if a matching signed integer is found.
+        KErrNotFound if no  match can be found.
+*/
+	{ return RPointerArrayBase::BinarySearchSigned(anEntry,anIndex); }
+
+
+
+
+inline TInt RArray<TInt>::SpecificFindInOrder(TInt anEntry, TInt aMode) const
+/**
+Finds the signed integer in the array that matches the specified signed integer 
+using a binary search technique.
+
+Where there is more than one matching element, it finds the first, last or any
+matching element as specified by the value of aMode.
+	
+The function assumes that the array is in signed integer order.
+	
+@param anEntry The signed integer to be found.
+@param aMode   Specifies whether to find the first match, the last match or any
+               match, as defined by one of the TArrayFindMode enum values.
+
+@return KErrNotFound, if there is no matching element, otherwise the array
+        index of a matching element -  what the index refers to depends on the
+        value of aMode:
+        if this is EArrayFindMode_First, then the index refers to the first matching element;
+        if this is EArrayFindMode_Any, then the index can refer to any of the matching elements;
+        if this is EArrayFindMode_Last, then the index refers to first element that follows
+        the last matching element - if the last matching element is also the last element
+        of the array, then the index value is the same as the total number of elements in
+        the array.
+
+@see TArrayFindMode         
+*/
+	{ return RPointerArrayBase::FindIsqSigned(anEntry,aMode); }
+
+
+
+
+inline TInt RArray<TInt>::SpecificFindInOrder(TInt anEntry, TInt& anIndex, TInt aMode) const
+/**
+Finds the signed integer in the array that matches the specified signed integer
+using a binary search technique.
+
+Where there is more than one matching element, it finds the first, last or any 
+matching element  as specified by the value of aMode.
+
+The function assumes that the array is in signed integer order.
+	
+@param anEntry The signed integer to be found.
+@param anIndex A TInt type supplied by the caller. On return, it contains an index
+               value depending on whether a match is found and on the value of aMode.
+               If there is no matching element in the array, then this is the  index of
+               the first element in the array that is bigger than the element being
+               searched for - if no elements in the array are bigger, then the index
+               value is the same as the total number of elements in the array.
+               If there is a matching element, then what the index refers to depends
+               on the value of aMode:
+               if this is EArrayFindMode_First, then the index refers to the first matching element;
+               if this is EArrayFindMode_Any, then the index can refer to any of the matching elements;
+               if this is EArrayFindMode_Last, then the index refers to first element that follows
+               the last matching element - if the last matching element is also the last element
+               of the array, then the index value is the same as the total number of elements in the array.
+               
+@param	aMode  Specifies whether to find the first match, the last match or any match,
+               as defined by one of the TArrayFindMode enum values.
+               
+@return KErrNone, if a matching element is found; 
+        KErrNotFound, if no suitable element can be found.               
+        
+@see TArrayFindMode
+*/
+	{ return RPointerArrayBase::BinarySearchSigned(anEntry,anIndex,aMode); }
+
+
+
+
+inline TInt RArray<TInt>::InsertInOrder(TInt anEntry)
+/**
+Inserts a signed integer into the array in signed integer order.
+	
+No duplicate entries are permitted. The array remains unchanged following
+an attempt to insert a duplicate entry.
+	
+The function assumes that existing entries within the array are in signed 
+integer order.
+	
+@param anEntry The signed integer to be inserted
+
+@return KErrNone, if the insertion is successful;
+        KErrAlreadyExists, if an attempt is being made
+        to insert a duplicate entry; otherwise one of the other system wide
+        error codes.
+*/
+	{ return RPointerArrayBase::InsertIsqSigned(anEntry,EFalse); }
+
+
+
+
+inline TInt RArray<TInt>::InsertInOrderAllowRepeats(TInt anEntry)
+/**
+Inserts a signed integer into the array in signed integer order,
+allowing duplicates.
+	
+If anEntry is a duplicate of an existing entry in the array, then the new 
+signed integer is inserted after the existing one. If more than one duplicate 
+entry already exists in the array, then any new duplicate signed integer is 
+inserted after the last one.
+	
+The function assumes that existing entries within the array are in signed 
+integer order.
+	
+@param anEntry The signed integer to be inserted.
+
+@return KErrNone, if the insertion is successful, otherwise one of the system 
+        wide error codes.
+*/
+	{ return RPointerArrayBase::InsertIsqSigned(anEntry,ETrue); }
+
+
+
+
+#ifndef __KERNEL_MODE__
+inline RArray<TInt>::RArray(TInt* aEntries, TInt aCount)
+	: RPointerArrayBase((TAny**)aEntries, aCount)
+/**
+C++ constructor with a pointer to the first array entry in a 
+pre-existing array, and the number of entries in that array.
+
+This constructor takes a pointer to a pre-existing set of entries of type 
+TInt objects. Ownership of the set of entries does not transfer to
+this RArray object.
+
+The purpose of constructing an array in this way is to allow sorting and
+finding operations to be done without further allocation of memory.
+
+@param aEntries   A pointer to the first entry of type class TInt in the set of 
+                  entries belonging to the existing array.
+@param aCount     The number of entries in the existing array.
+*/
+	{}
+
+inline void RArray<TInt>::GranularCompress()
+/**
+Compresses the array down to a granular boundary.
+	
+After a call to this function, the memory allocated to the array is sufficient 
+for its contained entries. Adding new signed integers to the array does not 
+result in a re-allocation of memory until the total number of entries reaches 
+a multiple of the granularity.
+*/
+	{RPointerArrayBase::GranularCompress();}
+
+
+
+
+inline TInt RArray<TInt>::Reserve(TInt aCount)
+/**
+Reserves space for the specified number of elements.
+
+After a call to this function, the memory allocated to the array is sufficient 
+to hold the number of integers specified. Adding new integers to the array 
+does not result in a re-allocation of memory until the the total number of 
+integers exceeds the specified count.
+
+@param	aCount	The number of integers for which space should be reserved
+@return	KErrNone		If the operation completed successfully
+@return KErrNoMemory	If the requested amount of memory could not be allocated
+*/
+	{ return RPointerArrayBase::DoReserve(aCount); }
+
+
+
+
+inline void RArray<TInt>::Sort()
+/**
+Sorts the array entries into signed integer order.
+*/
+	{ HeapSortSigned(); }
+
+
+
+
+inline TArray<TInt> RArray<TInt>::Array() const
+/**
+Constructs and returns a generic array.
+	
+@return A generic array representing this array.
+
+@see TArray
+*/
+	{ return TArray<TInt>(GetCount,GetElementPtr,(const CBase*)this); }
+#endif
+
+
+
+inline RArray<TUint>::RArray()
+	: RPointerArrayBase()
+/**
+Default C++ constructor.
+
+This constructs an array object for an array of unsigned 
+integers with default granularity.
+
+The default granularity of the array is 8.
+*/
+	{}
+
+
+
+
+inline RArray<TUint>::RArray(TInt aGranularity)
+	: RPointerArrayBase(aGranularity)
+/**
+Constructs an array object for an array of unsigned integers with the specified 
+granularity.
+	
+@param aGranularity The granularity of the array.
+
+@panic USER 127, if aGranularity is not positive or is greater than or
+       equal to 0x10000000.
+*/
+	{}
+
+
+
+
+/**
+C++ constructor with minimum growth step and exponential growth factor.
+
+This constructs an array object for an array of unsigned integers with the
+specified minimum growth step and exponential growth factor.
+
+@param aMinGrowBy	The minimum growth step of the array. Must be between 1 and
+					65535 inclusive.
+@param aFactor		The factor by which the array grows, multiplied by 256.
+					For example 512 specifies a factor of 2. Must be between 257
+					and 32767 inclusive.
+
+@panic USER 192, if aMinGrowBy<=0 or aMinGrowBy>65535.
+@panic USER 193, if aFactor<=257 or aFactor>32767.
+*/
+inline RArray<TUint>::RArray(TInt aMinGrowBy, TInt aFactor)
+	: RPointerArrayBase(aMinGrowBy, aFactor)
+	{}
+
+
+
+
+inline void RArray<TUint>::Close()
+/**
+Closes the array and frees all memory allocated to the array.
+	
+The function must be called before this array object goes out of scope.
+*/
+	{RPointerArrayBase::Close();}
+
+
+
+
+inline TInt RArray<TUint>::Count() const
+/**
+Gets the number of unsigned integers in the array.
+
+@return The number of unsigned integers in the array.
+*/
+	{return RPointerArrayBase::Count(); }
+
+
+
+
+inline const TUint& RArray<TUint>::operator[](TInt anIndex) const
+/**
+Gets a reference to the unsigned integer located at the specified position 
+within the array.
+	
+The compiler uses this variant if the returned reference is used in an
+expression where the reference cannot be modified.
+	
+@param anIndex The position of the unsigned integer within the array, relative 
+	           to zero, i.e. zero implies the entry at the beginning of
+			   the array.
+
+@return A reference to the const unsigned integer at position anIndex within 
+        the array.
+
+@panic USER 130, if anIndex is negative, or is greater than the number of
+       entries currently in the array.
+*/
+	{return (const TUint&)At(anIndex);}
+
+
+
+
+inline TUint& RArray<TUint>::operator[](TInt anIndex)
+/**
+Gets a reference to the unsigned integer located at the specified position 
+within the array.
+	
+The compiler uses this variant if the returned reference is used in an
+expression where the reference can be modified.
+	
+@param anIndex The position of the unsigned integer within the array, relative 
+	           to zero, i.e. zero implies the entry at the beginning of
+			   the array.
+
+@return A reference to the non-const unsigned integer at position anIndex
+        within the array.
+
+@panic USER 130, if anIndex is negative, or is greater than the number of
+       entries currently in the array.
+*/
+	{return (TUint&)At(anIndex);}
+
+
+
+
+inline TInt RArray<TUint>::Append(TUint anEntry)
+/**
+Appends an unsigned integer onto the array.
+	
+@param anEntry The unsigned integer to be appended.
+@return KErrNone, if the insertion is successful, otherwise one of the system 
+        wide error codes.
+*/
+	{ return RPointerArrayBase::Append((const TAny*)anEntry); }
+
+
+
+
+inline TInt RArray<TUint>::Insert(TUint anEntry, TInt aPos)
+/**
+Inserts an unsigned integer into the array at the specified position.
+	
+@param anEntry  The unsigned integer to be inserted.
+@param aPos     The position within the array where the unsigned integer is to 
+	            be inserted. The position is relative to zero, i.e. zero
+				implies that an entry is inserted at the beginning of
+				the array.
+			
+@return KErrNone, if the insertion is successful, otherwise one of the system 
+        wide error codes.
+
+@panic USER 131, if aPos is negative, or is greater than the number of entries
+       currently in the array.
+*/
+	{ return RPointerArrayBase::Insert((const TAny*)anEntry,aPos); }
+
+
+
+
+inline void RArray<TUint>::Remove(TInt anIndex)
+/**
+Removes the unsigned integer at the specified position from the array.
+	
+@param anIndex The position within the array from where the unsigned integer 
+               is to be removed. The position is relative to zero, i.e. zero
+			   implies that an entry at the beginning of the array is to be
+			   removed. 
+			   
+				 
+@panic USER 130, if anIndex is negative, or is greater than the number of
+       entries currently in the array.
+*/
+	{RPointerArrayBase::Remove(anIndex);}
+
+
+
+
+inline void RArray<TUint>::Compress()
+/**
+Compresses the array down to a minimum.
+	
+After a call to this function, the memory allocated to the array is just
+sufficient for its entries. Subsequently adding a new unsigned integer to the
+array always results in a re-allocation of memory.
+*/
+	{RPointerArrayBase::Compress();}
+
+
+
+
+inline void RArray<TUint>::Reset()
+/**
+Empties the array.
+
+It frees all memory allocated to the array and resets the 
+internal state so that it is ready to be reused.
+	
+This array object can be allowed to go out of scope after a call to
+this function.
+*/
+	{RPointerArrayBase::Reset();}
+
+
+
+
+inline TInt RArray<TUint>::Find(TUint anEntry) const
+/**
+Finds the first unsigned integer in the array which matches the specified
+value, using a sequential search.
+	
+The find operation always starts at the low index end of the array. There 
+is no assumption about the order of entries in the array.
+	
+@param anEntry The unsigned integer to be found.
+
+@return The index of the first matching unsigned integer within the array.
+        KErrNotFound, if no matching entry can be found.
+*/
+	{ return RPointerArrayBase::Find((const TAny*)anEntry); }
+
+
+
+
+inline TInt RArray<TUint>::FindReverse(TUint anEntry) const
+/**
+Finds the last unsigned integer in the array which matches the specified
+value, using a sequential search.
+	
+The find operation always starts at the high index end of the array. There 
+is no assumption about the order of entries in the array.
+	
+@param anEntry The unsigned integer to be found.
+
+@return The index of the last matching unsigned integer within the array.
+        KErrNotFound, if no matching entry can be found.
+*/
+	{ return RPointerArrayBase::FindReverse((const TAny*)anEntry); }
+
+
+
+
+inline TInt RArray<TUint>::FindInOrder(TUint anEntry) const
+/**
+Finds the unsigned integer in the array which matches the specified value, 
+using a binary search technique.
+	
+The functions assume that existing entries within the array are in unsigned 
+integer order.
+	
+@param anEntry The unsigned integer to be found.
+
+@return This is either: the index of the matching unsigned integer within the 
+     	array;
+		KErrNotFound, if no suitable entry can be found.
+*/
+	{ return RPointerArrayBase::FindIsqUnsigned(anEntry); }
+
+
+
+
+inline TInt RArray<TUint>::FindInOrder(TUint anEntry, TInt& anIndex) const
+/**
+Finds the unsigned integer in the array which matches the specified value, 
+using a binary search technique.
+
+If the index cannot be found, the function returns the index of the last
+unsigned integer within the array which logically precedes anEntry.
+	
+The functions assume that existing entries within the array are in unsigned 
+integer order.
+	
+@param anEntry The unsigned integer to be found.
+@param anIndex A TInt supplied by the caller. On return, contains an index
+               value.
+               If the function returns KErrNone, this is the index of the
+               matching unsigned integer within the array.               
+               If the function returns KErrNotFound, this is the index of the
+               first unsigned integer within the array that is bigger than the
+               unsigned integer being searched for - if no unsigned integers within
+               the array are bigger, then the index value is the same as the
+               total number of unsigned integers within the array.
+@return KErrNone, if a matching unsigned integer is found. 
+        KErrNotFound, if no suitable entry can be found.
+*/
+	{ return RPointerArrayBase::BinarySearchUnsigned(anEntry,anIndex); }
+
+
+
+
+inline TInt RArray<TUint>::SpecificFindInOrder(TUint anEntry, TInt aMode) const
+/**
+Finds the unsigned integer in the array that matches the specified unsigned integer 
+using a binary search technique.
+
+In the case that there is more than one matching element, finds the first, last
+or any match as specified by the value of aMode.
+	
+The function assumes that the array is in unsigned integer order.
+	
+@param anEntry The unsigned integer to be found..
+@param aMode   Specifies whether to find the first match, the last match or any match,
+               as defined by one of the TArrayFindMode enum values.
+
+@return KErrNotFound, if there is no matching element, otherwise the array index of
+        a matching element - what the index refers to depends on the value of
+        aMode:
+        if this is EArrayFindMode_First, then the index refers to the first matching element;
+        if this is EArrayFindMode_Any, then the index can refer to any of the matching elements;
+        if this is EArrayFindMode_Last, then the index refers to first element that follows
+        the last matching element - if the last matching element is also the last element of
+        the array, then the index value is the same as the total number of elements in the array.
+        
+@see TArrayFindMode
+*/
+	{ return RPointerArrayBase::FindIsqUnsigned(anEntry,aMode); }
+
+
+
+
+inline TInt RArray<TUint>::SpecificFindInOrder(TUint anEntry, TInt& anIndex, TInt aMode) const
+/**
+Finds the unsigned integer in the array that matches the specified unsigned integer
+using a binary search technique.
+
+In the case that there is more than one matching element, finds the first, last or any match as specified.
+
+The function assumes that the array is in unsigned integer order.
+	
+@param anEntry The unsigned integer to be found.
+@param anIndex A TInt type supplied by the caller. On return, it contains an index
+               value depending on whether a match is found and on the value of aMode.
+               If there is no matching element in the array, then this is the  index
+               of the first element in the array that is bigger than the element being
+               searched for - if no elements in the array are bigger, then the index
+               value is the same as the total number of elements in the array.
+               If there is a matching element, then what the index refers to depends
+               on the value of aMode:
+               if this is EArrayFindMode_First, then the index refers to the first matching element;
+               if this is EArrayFindMode_Any, then the index can refer to any of the matching elements;
+               if this is EArrayFindMode_Last, then the index refers to first element that follows
+               the last matching element - if the last matching element is also the last element of the array,
+               then the index value is the same as the total number of elements in the array.
+@param	aMode  Specifies whether to find the first match, the last match or any match, as defined by one
+               of the TArrayFindMode enum values.
+               
+@return	KErrNone, if a matching entry is found; KErrNotFound, if no matching entry exists.
+
+@see TArrayFindMode
+*/
+	{ return RPointerArrayBase::BinarySearchUnsigned(anEntry,anIndex,aMode); }
+
+
+
+
+inline TInt RArray<TUint>::InsertInOrder(TUint anEntry)
+/**
+Inserts an unsigned integer into the array in unsigned integer order.
+	
+No duplicate entries are permitted. The array remains unchanged following
+an attempt to insert a duplicate entry.
+	
+The function assumes that existing entries within the array are in unsigned 
+integer order.
+	
+@param anEntry The unsigned integer to be inserted.
+
+@return KErrNone, if the insertion is successful;
+        KErrAlreadyExists, if an attempt is being made
+        to insert a duplicate entry; otherwise one of the other system wide
+        error codes.
+*/
+	{ return RPointerArrayBase::InsertIsqUnsigned(anEntry,EFalse); }
+
+
+
+
+inline TInt RArray<TUint>::InsertInOrderAllowRepeats(TUint anEntry)
+/**
+Inserts an unsigned integer into the array in unsigned integer order, allowing 
+duplicates.
+	
+If the new integer is a duplicate of an existing entry in the array, then 
+the new unsigned integer is inserted after the existing one. If more than 
+one duplicate entry already exists in the array, then any new duplicate
+unsigned integer is inserted after the last one.
+	
+The function assumes that existing entries within the array are in unsigned 
+integer order.
+	
+@param anEntry The unsigned integer to be inserted.
+
+@return KErrNone, if the insertion is successful, otherwise one of the system 
+        wide error codes.
+*/
+	{ return RPointerArrayBase::InsertIsqUnsigned(anEntry,ETrue); }
+
+
+
+
+#ifndef __KERNEL_MODE__
+inline RArray<TUint>::RArray(TUint* aEntries, TInt aCount)
+	: RPointerArrayBase((TAny**)aEntries, aCount)
+/**
+C++ constructor with a pointer to the first array entry in a 
+pre-existing array, and the number of entries in that array.
+
+This constructor takes a pointer to a pre-existing set of entries of type 
+TUint objects. Ownership of the set of entries does not transfer to
+this RArray object.
+
+The purpose of constructing an array in this way is to allow sorting and
+finding operations to be done without further allocation of memory.
+
+@param aEntries   A pointer to the first entry of type class TUint in the set of 
+                  entries belonging to the existing array.
+@param aCount     The number of entries in the existing array.
+*/
+	{}
+
+
+
+inline void RArray<TUint>::GranularCompress()
+/**
+Compresses the array down to a granular boundary.
+	
+After a call to this function, the memory allocated to the array is sufficient 
+for its contained entries. Adding new unsigned integers to the array does not 
+result in a re-allocation of memory until the total number of entries reaches 
+a multiple of the granularity.
+*/
+	{RPointerArrayBase::GranularCompress();}
+
+
+
+
+inline TInt RArray<TUint>::Reserve(TInt aCount)
+/**
+Reserves space for the specified number of elements.
+
+After a call to this function, the memory allocated to the array is sufficient 
+to hold the number of integers specified. Adding new integers to the array 
+does not result in a re-allocation of memory until the the total number of 
+integers exceeds the specified count.
+
+@param	aCount	The number of integers for which space should be reserved
+@return	KErrNone		If the operation completed successfully
+@return KErrNoMemory	If the requested amount of memory could not be allocated
+*/
+	{ return RPointerArrayBase::DoReserve(aCount); }
+
+
+
+
+inline void RArray<TUint>::Sort()
+/**
+Sorts the array entries into unsigned integer order.
+*/
+	{ HeapSortUnsigned(); }
+
+
+
+
+inline TArray<TUint> RArray<TUint>::Array() const
+/**
+Constructs and returns a generic array.
+	
+@return A generic array representing this array.
+
+@see TArray
+*/
+	{ return TArray<TUint>(GetCount,GetElementPtr,(const CBase*)this); }
+#endif
+
+
+
+
+/**
+Sets an argument to default value and type.
+*/
+inline void TIpcArgs::Set(TInt,TNothing)
+	{}
+
+
+
+
+/**
+Sets an argument value of TInt type.
+
+@param aIndex An index value that identifies the slot in the array of arguments
+              into which the argument value is to be placed.
+              This must be a value in the range 0 to 3.
+@param aValue The argument value.              
+*/
+inline void TIpcArgs::Set(TInt aIndex,TInt aValue)
+	{
+	iArgs[aIndex] = aValue;
+	iFlags |= EUnspecified<<(aIndex*KBitsPerType);
+	}
+
+
+
+
+/**
+Sets an argument value of TAny* type.
+
+@param aIndex An index value that identifies the slot in the array of arguments
+              into which the argument value is to be placed.
+              This must be a value in the range 0 to 3.
+@param aValue The argument value.              
+*/
+inline void TIpcArgs::Set(TInt aIndex,const TAny* aValue)
+	{
+	iArgs[aIndex] = (TInt)aValue;
+	iFlags |= EUnspecified<<(aIndex*KBitsPerType);
+	}
+
+
+
+
+/**
+Sets an argument value of RHandleBase type.
+
+@param aIndex An index value that identifies the slot in the array of arguments
+              into which the argument value is to be placed.
+              This must be a value in the range 0 to 3.
+@param aValue The argument value.              
+*/
+inline void TIpcArgs::Set(TInt aIndex,RHandleBase aValue)
+	{
+	iArgs[aIndex] = (TInt)aValue.Handle();
+	iFlags |= EHandle<<(aIndex*KBitsPerType);
+	}
+
+
+
+
+/**
+Sets an argument value TDesC8* type.
+
+@param aIndex An index value that identifies the slot in the array of arguments
+              into which the argument value is to be placed.
+              This must be a value in the range 0 to 3.
+@param aValue The argument value.              
+*/
+inline void TIpcArgs::Set(TInt aIndex,const TDesC8* aValue)
+	{
+	iArgs[aIndex] = (TInt)aValue;
+	iFlags |= EDesC8<<(aIndex*KBitsPerType);
+	}
+
+
+
+
+#ifndef __KERNEL_MODE__
+
+/**
+Sets an argument value of TDesC16* type.
+
+@param aIndex An index value that identifies the slot in the array of arguments
+              into which the argument value is to be placed.
+              This must be a value in the range 0 to 3.
+@param aValue The argument value.              
+*/
+inline void TIpcArgs::Set(TInt aIndex,const TDesC16* aValue)
+	{
+	iArgs[aIndex] = (TInt)aValue;
+	iFlags |= EDesC16<<(aIndex*KBitsPerType);
+	}
+
+#endif
+
+
+
+
+/**
+Sets an argument value of TDes8* type.
+
+@param aIndex An index value that identifies the slot in the array of arguments
+              into which the argument value is to be placed.
+              This must be a value in the range 0 to 3.
+@param aValue The argument value.              
+*/
+inline void TIpcArgs::Set(TInt aIndex,TDes8* aValue)
+	{
+	iArgs[aIndex] = (TInt)aValue;
+	iFlags |= EDes8<<(aIndex*KBitsPerType);
+	}
+
+
+
+
+#ifndef __KERNEL_MODE__
+
+/**
+Sets an argument value of TDes16* type.
+
+@param aIndex An index value that identifies the slot in the array of arguments
+              into which the argument value is to be placed.
+              This must be a value in the range 0 to 3.
+@param aValue The argument value.              
+*/
+inline void TIpcArgs::Set(TInt aIndex,TDes16* aValue)
+	{
+	iArgs[aIndex] = (TInt)aValue;
+	iFlags |= EDes16<<(aIndex*KBitsPerType);
+	}
+
+#endif
+
+
+
+
+inline TIpcArgs::TArgType TIpcArgs::Type(TNothing)
+	{ return EUnspecified; }
+inline TIpcArgs::TArgType TIpcArgs::Type(TInt)
+	{ return EUnspecified; }
+inline TIpcArgs::TArgType TIpcArgs::Type(const TAny*)
+	{ return EUnspecified; }
+inline TIpcArgs::TArgType TIpcArgs::Type(RHandleBase)
+	{ return EHandle; }
+inline TIpcArgs::TArgType TIpcArgs::Type(const TDesC8*)
+	{ return EDesC8; }
+#ifndef __KERNEL_MODE__
+inline TIpcArgs::TArgType TIpcArgs::Type(const TDesC16*)
+	{ return EDesC16; }
+#endif
+inline TIpcArgs::TArgType TIpcArgs::Type(TDes8*)
+	{ return EDes8; }
+#ifndef __KERNEL_MODE__
+inline TIpcArgs::TArgType TIpcArgs::Type(TDes16*)
+	{ return EDes16; }
+#endif
+inline void TIpcArgs::Assign(TInt&,TIpcArgs::TNothing)
+	{}
+inline void TIpcArgs::Assign(TInt& aArg,TInt aValue)
+	{ aArg = aValue; }
+inline void TIpcArgs::Assign(TInt& aArg,const TAny* aValue)
+	{ aArg = (TInt)aValue; }
+inline void TIpcArgs::Assign(TInt& aArg,RHandleBase aValue)
+	{ aArg = (TInt)aValue.Handle(); }
+inline void TIpcArgs::Assign(TInt& aArg,const TDesC8* aValue)
+	{ aArg = (TInt)aValue; }
+#ifndef __KERNEL_MODE__
+inline void TIpcArgs::Assign(TInt& aArg,const TDesC16* aValue)
+	{ aArg = (TInt)aValue; }
+#endif
+inline void TIpcArgs::Assign(TInt& aArg,TDes8* aValue)
+	{ aArg = (TInt)aValue; }
+#ifndef __KERNEL_MODE__
+inline void TIpcArgs::Assign(TInt& aArg,TDes16* aValue)
+	{ aArg = (TInt)aValue; }
+#endif
+
+
+
+// Structures for passing 64 bit integers and doubles across GCC/EABI boundaries
+
+inline SInt64::SInt64()
+	{}
+
+inline SInt64::SInt64(Int64 a)
+	{
+	iData[0] = (TUint32)((Uint64)a);
+	iData[1] = (TUint32)(((Uint64)a)>>32);
+	}
+
+inline SInt64& SInt64::operator=(Int64 a)
+	{
+	iData[0] = (TUint32)((Uint64)a);
+	iData[1] = (TUint32)(((Uint64)a)>>32);
+	return *this;
+	}
+
+inline SInt64::operator Int64() const
+	{
+	Int64 x;
+	TUint32* px = (TUint32*)&x;
+	px[0] = iData[0];
+	px[1] = iData[1];
+	return x;
+	}
+
+inline SUint64::SUint64()
+	{}
+
+inline SUint64::SUint64(Uint64 a)
+	{
+	iData[0] = (TUint32)a;
+	iData[1] = (TUint32)(a>>32);
+	}
+
+inline SUint64& SUint64::operator=(Uint64 a)
+	{
+	iData[0] = (TUint32)a;
+	iData[1] = (TUint32)(a>>32);
+	return *this;
+	}
+
+inline SUint64::operator Uint64() const
+	{
+	Uint64 x;
+	TUint32* px = (TUint32*)&x;
+	px[0] = iData[0];
+	px[1] = iData[1];
+	return x;
+	}
+
+inline SDouble::SDouble()
+	{}
+
+inline SDouble::SDouble(TReal a)
+	{
+	const TUint32* pa = (const TUint32*)&a;
+#ifdef __DOUBLE_WORDS_SWAPPED__
+	iData[0] = pa[1];
+	iData[1] = pa[0];	// compiler puts MS word of double first
+#else
+	iData[0] = pa[0];
+	iData[1] = pa[1];	// compiler puts MS word of double second
+#endif
+	}
+
+inline SDouble& SDouble::operator=(TReal a)
+	{
+	new (this) SDouble(a);
+	return *this;
+	}
+
+inline SDouble::operator TReal() const
+	{
+	TReal x;
+	TUint32* px = (TUint32*)&x;
+#ifdef __DOUBLE_WORDS_SWAPPED__
+	px[1] = iData[0];
+	px[0] = iData[1];	// compiler puts MS word of double first
+#else
+	px[0] = iData[0];
+	px[1] = iData[1];	// compiler puts MS word of double second
+#endif
+	return x;
+	}
+
+//
+// TSecureId
+//
+
+/** Default constructor. This leaves the object in an undefined state */
+inline TSecureId::TSecureId()
+	{}
+
+/** Construct 'this' using a TUint32
+@param aId The value for the ID */
+inline TSecureId::TSecureId(TUint32 aId)
+	: iId(aId) {}
+
+/** Convert 'this' into a TUint32
+*/
+inline TSecureId::operator TUint32() const
+	{ return iId; }
+
+/** Construct 'this' using a TUid
+@param aId The value for the ID */
+inline TSecureId::TSecureId(TUid aId)
+	: iId(aId.iUid) {}
+
+/** Convert 'this' into a TUid
+*/
+inline TSecureId::operator TUid() const
+	{ return (TUid&)iId; }
+
+//
+// SSecureId
+//
+inline const TSecureId* SSecureId::operator&() const
+	{ return (const TSecureId*)this; }
+inline SSecureId::operator const TSecureId&() const
+	{ return (const TSecureId&)iId; }
+inline SSecureId::operator TUint32() const
+	{ return iId; }
+inline SSecureId::operator TUid() const
+	{ return (TUid&)iId; }
+
+//
+// TVendorId
+//
+
+/** Default constructor which leaves the object in an undefined state */
+inline TVendorId::TVendorId()
+	{}
+
+/** Construct 'this' using a TUint32
+@param aId The value for the ID */
+inline TVendorId::TVendorId(TUint32 aId)
+	: iId(aId) {}
+
+/** Convert 'this' into a TUint32
+*/
+inline TVendorId::operator TUint32() const
+	{ return iId; }
+
+/** Construct 'this' using a TUid
+@param aId The value for the ID */
+inline TVendorId::TVendorId(TUid aId)
+	: iId(aId.iUid) {}
+
+/** Convert 'this' into a TUid
+*/
+inline TVendorId::operator TUid() const
+	{ return (TUid&)iId; }
+
+//
+// SSecureId
+//
+inline const TVendorId* SVendorId::operator&() const
+	{ return (const TVendorId*)this; }
+inline SVendorId::operator const TVendorId&() const
+	{ return (const TVendorId&)iId; }
+inline SVendorId::operator TUint32() const
+	{ return iId; }
+inline SVendorId::operator TUid() const
+	{ return (TUid&)iId; }
+
+//
+// TSharedChunkBufConfigBase
+// 
+inline TSharedChunkBufConfigBase::TSharedChunkBufConfigBase()
+	{memset(this,0,sizeof(TSharedChunkBufConfigBase));}
+
+/**
+Default constructor. This leaves the set in an undefned state.
+*/
+inline TCapabilitySet::TCapabilitySet()
+	{}
+
+/**
+Construct a set consisting of a single capability.
+@param aCapability The single capability
+*/
+inline TCapabilitySet::TCapabilitySet(TCapability aCapability)
+	{ new (this) TCapabilitySet(aCapability, aCapability); }
+
+/**
+Make this set consist of a single capability.
+@param aCapability The single capability.
+*/
+inline void TCapabilitySet::Set(TCapability aCapability)
+	{ new (this) TCapabilitySet(aCapability, aCapability); }
+
+/**
+Make this set consist of two capabilities.
+@param aCapability1 The first capability.
+@param aCapability2 The second capability.
+*/
+inline void TCapabilitySet::Set(TCapability aCapability1, TCapability aCapability2)
+	{ new (this) TCapabilitySet(aCapability1, aCapability2); }
+
+
+/**
+Default constructor. This leaves the object in an undefned state.
+*/
+inline TSecurityInfo::TSecurityInfo()
+	{}
+
+/** Constructs a TSecurityPolicy that will always fail, irrespective of the
+checked object's attributes.
+*/
+inline TSecurityPolicy::TSecurityPolicy()
+	{ new (this) TSecurityPolicy(EAlwaysFail); }
+
+/**
+'Address of' operator which generates a TSecurityPolicy*
+@return A pointer of type TSecurityPolicy which refers to this object
+*/
+inline const TSecurityPolicy* TStaticSecurityPolicy::operator&() const
+	{ return (const TSecurityPolicy*)this; }
+
+/**
+'Reference of' operator which generates a TSecurityPolicy&
+@return A reference of type TSecurityPolicy which refers to this object
+*/
+inline TStaticSecurityPolicy::operator const TSecurityPolicy&() const
+	{ return *(const TSecurityPolicy*)this; }
+
+/**
+A method to explicity generate a TSecurityPolicy reference.
+@return A reference of type TSecurityPolicy which refers to this object
+*/
+inline const TSecurityPolicy& TStaticSecurityPolicy::operator()() const
+	{ return *(const TSecurityPolicy*)this; }
+
+#ifdef __KERNEL_MODE__
+#ifndef __REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__
+
+/** Checks this policy against the platform security attributes of aProcess.
+
+	When a check fails the action taken is determined by the system wide Platform Security
+	configuration. If PlatSecDiagnostics is ON, then a diagnostic message is emitted.
+	If PlatSecEnforcement is OFF, then this function will return ETrue even though the
+	check failed.
+
+@param aProcess The DProcess object to check against this TSecurityPolicy.
+@param aDiagnostic A string that will be emitted along with any diagnostic message
+							that may be issued if the policy check fails.
+							This string must be enclosed in the __PLATSEC_DIAGNOSTIC_STRING macro
+							which enables it to be easily removed from the system.
+@return ETrue if all the requirements of this TSecurityPolicy are met by the
+platform security attributes of aProcess, EFalse otherwise.
+@panic KERN-COMMON 190 if 'this' is an invalid SSecurityInfo object
+*/
+inline TBool TSecurityPolicy::CheckPolicy(DProcess* aProcess, const char* aDiagnostic) const
+	{
+	return DoCheckPolicy(aProcess, aDiagnostic);
+	}
+
+/** Checks this policy against the platform security attributes of the process
+owning aThread.
+
+	When a check fails the action taken is determined by the system wide Platform Security
+	configuration. If PlatSecDiagnostics is ON, then a diagnostic message is emitted.
+	If PlatSecEnforcement is OFF, then this function will return ETrue even though the
+	check failed.
+
+@param aThread The thread whose owning process' platform security attributes
+are to be checked against this TSecurityPolicy.
+@param aDiagnostic A string that will be emitted along with any diagnostic message
+							that may be issued if the policy check fails.
+							This string must be enclosed in the __PLATSEC_DIAGNOSTIC_STRING macro
+							which enables it to be easily removed from the system.
+@return ETrue if all the requirements of this TSecurityPolicy are met by the
+platform security parameters of the owning process of aThread, EFalse otherwise.
+@panic KERN-COMMON 190 if 'this' is an invalid SSecurityInfo object
+*/
+inline TBool TSecurityPolicy::CheckPolicy(DThread* aThread, const char* aDiagnostic) const
+	{
+	return DoCheckPolicy(aThread, aDiagnostic);
+	}
+
+#else //__REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__
+
+/** Checks this policy against the platform security attributes of aProcess.
+
+	When a check fails the action taken is determined by the system wide Platform Security
+	configuration. If PlatSecDiagnostics is ON, then a diagnostic message is emitted.
+	If PlatSecEnforcement is OFF, then this function will return ETrue even though the
+	check failed.
+
+@param aProcess The DProcess object to check against this TSecurityPolicy.
+@param aDiagnostic A string that will be emitted along with any diagnostic message
+							that may be issued if the policy check fails.
+							This string must be enclosed in the __PLATSEC_DIAGNOSTIC_STRING macro
+							which enables it to be easily removed from the system.
+@return ETrue if all the requirements of this TSecurityPolicy are met by the
+platform security attributes of aProcess, EFalse otherwise.
+@panic KERN-COMMON 190 if 'this' is an invalid SSecurityInfo object
+*/
+inline TBool TSecurityPolicy::CheckPolicy(DProcess* aProcess, OnlyCreateWithNull /*aDiagnostic*/) const
+	{
+	return DoCheckPolicy(aProcess);
+	}
+
+/** Checks this policy against the platform security attributes of the process
+owning aThread.
+
+	When a check fails the action taken is determined by the system wide Platform Security
+	configuration. If PlatSecDiagnostics is ON, then a diagnostic message is emitted.
+	If PlatSecEnforcement is OFF, then this function will return ETrue even though the
+	check failed.
+
+@param aThread The thread whose owning process' platform security attributes
+are to be checked against this TSecurityPolicy.
+@param aDiagnostic A string that will be emitted along with any diagnostic message
+							that may be issued if the policy check fails.
+							This string must be enclosed in the __PLATSEC_DIAGNOSTIC_STRING macro
+							which enables it to be easily removed from the system.
+@return ETrue if all the requirements of this TSecurityPolicy are met by the
+platform security parameters of the owning process of aThread, EFalse otherwise.
+@panic KERN-COMMON 190 if 'this' is an invalid SSecurityInfo object
+*/
+inline TBool TSecurityPolicy::CheckPolicy(DThread* aThread, OnlyCreateWithNull /*aDiagnostic*/) const
+	{
+	return DoCheckPolicy(aThread);
+	}
+
+#endif // !__REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__
+#endif // __KERNEL_MODE__
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32/include/e32cmn_private.h	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,66 @@
+// Copyright (c) 1994-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32\include\e32cmn_private.h
+// 
+//
+
+#ifndef __E32CMN_PRIVATE_H__
+#define __E32CMN_PRIVATE_H__
+#include <e32const.h>
+#include <e32const_private.h>
+
+#include <e32des8.h>
+#include <e32des8_private.h>
+#ifndef __KERNEL_MODE__
+#include <e32des16.h>
+#include <e32des16_private.h>
+#endif
+
+
+/**
+@internalTechnology
+*/
+struct SRAllocatorBurstFail {TInt iBurst; TInt iRate; TInt iUnused[2];};
+
+/**
+@internalTechnology
+*/
+typedef TBuf<KMaxKernelName> TKName;
+
+/**
+@internalTechnology
+*/
+typedef TBuf<KMaxInfoName> TInfoName;
+
+/**
+@internalComponent
+*/
+typedef TBuf<KMaxDeviceInfo> TDeviceInfo;
+
+/**
+@internalComponent
+*/
+typedef TBuf<KMaxPassword> TPassword;
+
+/** Default value to clear all data to committed to a chunk to.
+@see TChunkCreateInfo::SetClearByte()
+@see RChunk::Create()
+@internalComponent
+*/
+const TUint8 KChunkClearByteDefault = 0x3;
+
+/**@internalComponent */
+const TUint32 KEmulatorImageFlagAllowDllData = 0x01;
+
+#endif //__E32CMN_H__
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32/include/e32cons.h	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,243 @@
+// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32\include\e32cons.h
+// 
+//
+
+#ifndef __E32CONS_H__
+#define __E32CONS_H__
+#include <e32base.h>
+#include <e32keys.h>
+//
+
+/**
+@publishedAll
+@released
+
+Defines a default console width that can be used when creating a console.
+
+@see CConsoleBase::Create()
+*/
+const TInt KDefaultConsWidth=78;
+
+/**
+@publishedAll
+@released
+
+Defines a default console height that can be used when creating a console.
+
+@see CConsoleBase::Create()
+*/
+const TInt KDefaultConsHeight=18;
+
+/**
+@publishedAll
+@released
+
+Implies a full size screen console when passed as the width and height
+values when creating a console.
+
+@see CConsoleBase::Create()
+*/
+const TInt KConsFullScreen=-1;
+
+
+/**
+@publishedAll
+@released
+
+Defines a set of text attributes used for consoles that support colour.
+
+@see CColorConsoleBase::SetTextAttribute().
+*/
+enum TTextAttribute
+	{
+	ETextAttributeNormal,  /**< Defines the normal text attribute.   */
+	ETextAttributeBold,    /**< Defines the bold text attribute.     */
+	ETextAttributeInverse, /**< Defines the inverse text attribute.  */
+	ETextAttributeHighlight/**< Defines the highlight text attribute.*/
+	};
+
+
+/**
+@publishedAll
+@released
+
+A base class that defines a console interface.
+*/
+class CConsoleBase : public CBase
+	{
+public:
+	IMPORT_C virtual ~CConsoleBase();
+	IMPORT_C TKeyCode Getch();
+	IMPORT_C void Printf(TRefByValue<const TDesC> aFmt,...);
+	IMPORT_C void SetPos(TInt aX);
+	IMPORT_C void SetPos(TInt aX,TInt aY);
+	IMPORT_C TInt WhereX() const;
+	IMPORT_C TInt WhereY() const;
+// Pure virtual
+
+
+    /**
+    Creates a new console window.
+    
+    @param aTitle The title text for the console.
+                  This should not be longer than 256 characters.
+    @param aSize  The size of the console window.
+    
+    @return KErrNone, if successful; otherwise one of the other
+                      system wide error codes.
+    */
+	virtual TInt Create(const TDesC &aTitle,TSize aSize) =0;
+
+	
+    /**
+    Gets a keystroke from the console window, asynchronously.
+    
+    @param aStatus The request status object.
+    */
+	virtual void Read(TRequestStatus &aStatus) =0;
+	
+	
+	/**
+	Cancels any outstanding request to get a keystroke from the console window.
+	*/
+	virtual void ReadCancel() =0;
+	
+	
+	/**
+	Writes the content of the specified descriptor to the console window.
+	
+	@param aDes Descriptor containing the characters to be written to
+	            the console window.
+	*/
+	virtual void Write(const TDesC &aDes) =0;
+	
+	
+	/**
+	Gets the current cursor position relative to the console window.
+	
+	@return  The current cursor position.
+	*/
+	virtual TPoint CursorPos() const =0;
+	
+	
+	/**
+    Puts the cursor at the absolute position in the window.
+    
+    @param aPoint The cursor position.
+	*/
+	virtual void SetCursorPosAbs(const TPoint &aPoint) =0;
+	
+	
+	/**
+	Puts the cursor at the specified position relative
+	to the current cursor position.
+	
+	@param aPoint The cursor position.
+	*/
+	virtual void SetCursorPosRel(const TPoint &aPoint) =0;
+	
+	
+	/**
+	Sets the percentage height of the cursor.
+	
+    @param aPercentage The percentage height. This is a value from 0 to 100.
+                       If 0 is specified, then no cursor is displayed.
+	*/
+	virtual void SetCursorHeight(TInt aPercentage) =0;
+
+	
+	/**
+	Sets a new console title.
+	
+	@param aTitle The title text for the console.
+                  This should not be longer than 256 characters.
+	*/
+	virtual void SetTitle(const TDesC &aTitle) =0;
+
+	
+	/**
+	Clears the console.
+	*/
+	virtual void ClearScreen() =0;
+	
+	
+	/**
+	Clears the console from the current cursor position to
+	the end of the line.
+	*/
+	virtual void ClearToEndOfLine() =0;
+	
+	
+	/**
+	Gets the size of the console.
+	*/
+	virtual TSize ScreenSize() const =0;
+	
+	
+	/**
+	Gets the current key code value.
+	
+	@return The key code value.
+	*/
+	virtual TKeyCode KeyCode() const =0;
+	
+	/**
+	Gets the current key modifiers.
+	
+	@return The key modifiers.
+	*/
+	virtual TUint KeyModifiers() const =0;
+protected:
+	IMPORT_C CConsoleBase();
+protected:
+	IMPORT_C virtual TInt Extension_(TUint aExtensionId, TAny*& a0, TAny* a1);
+	};
+
+
+class CProxyConsole;
+
+/**
+@publishedAll
+@released
+
+Adds colour support to the basic console interface.
+*/
+class CColorConsoleBase : public CConsoleBase
+	{
+public:
+
+    /**
+    Sets the text attribute as defined by TTextAttribute.
+    
+    @param anAttribute The text attribute to be set.
+    */
+	virtual void SetTextAttribute(TTextAttribute /*anAttribute*/); 
+protected:
+	IMPORT_C virtual TInt Extension_(TUint aExtensionId, TAny*& a0, TAny* a1);
+
+	friend class CProxyConsole;
+	};
+//
+
+/**
+@publishedAll
+@released
+*/
+extern "C" {
+IMPORT_C TAny *NewConsole();
+}
+#endif
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32/include/e32const.h	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,3131 @@
+// Copyright (c) 1994-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32\include\e32const.h
+// 
+//
+
+#ifndef __E32CONST_H__
+#define __E32CONST_H__
+
+#include <e32err.h>
+#include <e32lang.h>
+
+
+
+/**
+@publishedAll
+@released
+
+The default width value used when appending and justifying data
+in a descriptor.
+
+@see TDes16::AppendJustify()
+@see TDes16::Justify()
+@see TDes8::AppendJustify()
+@see TDes8::Justify()
+*/
+const TInt KDefaultJustifyWidth=(-1);
+
+
+
+/**
+@publishedAll
+@released
+
+Defines the number of TUids that form a TUidType.
+
+@see TUid
+@see TUidType
+*/
+const TInt KMaxCheckedUid=3;
+
+
+/**
+@publishedAll
+@released
+
+Defines the number of 32-bit debug trace mask words.
+
+*/
+const TInt KNumTraceMaskWords = 8;
+
+
+/**
+@publishedAll
+@released
+
+Defines the maximum length for the text form of a UID name.
+
+@see TUidName
+@see TUid::Name()
+*/
+const TInt KMaxUidName=10;
+
+
+
+
+/**
+@publishedAll
+@released
+
+Defines the maximum length of a module name.
+*/
+const TInt KMaxModuleVersionName=10;
+
+
+
+
+/**
+@publishedAll
+@released
+
+Defines the maximum length of the name of a reference counted object.
+
+@see TName
+*/
+const TInt KMaxName=0x80;
+
+
+
+
+/**
+@publishedAll
+@released
+
+Defines the maximum length of the name of a reference counted kernel-side object. 
+*/
+const TInt KMaxKernelName=0x50;
+
+
+
+
+/**
+@publishedAll
+@released
+
+Defines the maximum size of a process name.
+*/
+const TInt KMaxProcessName=(KMaxKernelName-KMaxUidName-KMaxModuleVersionName-4);
+
+
+
+
+/**
+@publishedAll
+@released
+
+Defines the maximum size of a library name.
+*/
+const TInt KMaxLibraryName=(KMaxKernelName-KMaxUidName-KMaxModuleVersionName);
+
+
+
+
+/**
+@publishedAll
+@released
+
+Defines the maximum length of a TInfoName object.
+*/
+const TInt KMaxInfoName=0x10;
+
+
+
+
+/**
+@publishedAll
+@released
+
+Defines the maximum length of the full name of a reference counted object.
+
+@see TFullName
+*/
+const TInt KMaxFullName=(KMaxName<<1);
+
+
+
+
+/**
+@publishedAll
+@released
+
+The maximum length for a password buffer.
+
+@see TPassword
+*/
+const TInt KMaxPassword=0x10;
+
+
+
+
+/**
+@publishedAll
+@released
+
+The maximum length of a category name.
+
+@see TExitCategoryName
+*/
+const TInt KMaxExitCategoryName=0x10;
+
+
+
+
+/**
+@publishedAll
+@released
+
+The maximum length of the full text name for a day of the week.
+
+@see TDayName
+*/
+const TInt KMaxDayName=0x20;
+
+
+
+
+/**
+@publishedAll
+@released
+
+The maximum length of the abbreviated text name for a day of the week.
+
+@see TDayNameAbb
+*/
+const TInt KMaxDayNameAbb=0x08;
+
+
+
+
+/**
+@publishedAll
+@released
+
+Defines the maximum size of arrays or data structures required
+to hold the names of the days of the week.
+*/
+const TInt KMaxDays=7;
+
+
+
+
+/**
+@publishedAll
+@released
+
+The maximum length of the full text name for a month.
+
+@see TDayName
+*/
+const TInt KMaxMonthName=0x20;
+
+
+
+
+/**
+@publishedAll
+@released
+
+The maximum length of the abbreviated text name for a month.
+
+@see TMonthNameAbb
+*/
+const TInt KMaxMonthNameAbb=0x08;
+
+
+
+
+/**
+@publishedAll
+@released
+
+Defines the maximum size of arrays or data structures required
+to hold the names of the months of the year.
+*/
+const TInt KMaxMonths=12;
+
+
+
+
+/**
+@publishedAll
+@released
+
+The maximum length of the text for a date suffix.
+
+@see TDateSuffix
+*/
+const TInt KMaxSuffix=0x04;
+
+
+
+
+/**
+@publishedAll
+@released
+
+Defines the maximum size of arrays and data structures required
+to hold date suffix strings.
+*/
+const TInt KMaxSuffixes=31;
+
+
+
+
+/**
+@publishedAll
+@released
+
+The maximum length of the text for AM and PM.
+
+@see TAmPmName
+*/
+const TInt KMaxAmPmName=0x04;
+
+
+
+
+/**
+@publishedAll
+@released
+
+Defines the maximum size of arrays and data structures required
+to hold am/pm strings.
+*/
+const TInt KMaxAmPms=2;
+
+
+
+
+/**
+@publishedAll
+@released
+
+Defines the maximum number of date separator characters in a date string.
+*/
+const TInt KMaxDateSeparators=4;
+
+
+
+
+/**
+@publishedAll
+@released
+
+Defines the maximum number of time separator characters in a time string.
+*/
+const TInt KMaxTimeSeparators=4;
+
+
+
+
+/**
+@publishedAll
+@released
+
+Defines the maximum size of data structures to hold the translate tables
+for Western European alphabetic conversions.
+*/
+const TInt KMaxTranslateTable=0x100;
+
+
+
+
+/**
+@publishedAll
+@released
+
+The maximum length of the text for a currency symbol.
+
+@see TCurrencySymbol
+*/
+const TInt KMaxCurrencySymbol=0x08;
+
+
+
+
+/**
+@publishedAll
+@released
+
+The maximum length of the short date format specification text.
+
+@see TShortDateFormatSpec
+*/
+const TInt KMaxShortDateFormatSpec=40;
+
+
+
+
+/**
+@publishedAll
+@released
+
+The maximum length of the short date format specification text.
+
+@see TLongDateFormatSpec
+*/
+const TInt KMaxLongDateFormatSpec=80;
+
+
+
+
+/**
+@publishedAll
+@released
+
+The maximum length of the time string formatting commands.
+
+@see TTimeFormatSpec
+*/
+const TInt KMaxTimeFormatSpec=60;
+
+
+
+
+/**
+@publishedAll
+@released
+
+Defines the maximum length of a filename.
+*/
+const TInt KMaxFileName=0x100;
+
+
+
+
+/**
+@publishedAll
+@released
+
+The maximum length of the character representation of version information.
+
+@see TVersion::Name()
+*/
+const TInt KMaxVersionName=0x10;
+
+
+
+
+/**
+@publishedAll
+@released
+
+Defines the maximum length of a path.
+
+@see TPath
+*/
+const TInt KMaxPath=0x100;
+
+
+
+
+/**
+@publishedAll
+@released
+
+Defines the maximum length of a TDeviceInfo object.
+
+@see TDeviceInfo
+*/
+const TInt KMaxDeviceInfo=0x80;
+
+
+
+
+/**
+@publishedAll
+@released
+
+The maximum size of the password required to unlock a media drive.
+*/
+const TInt KMaxMediaPassword=16;
+
+
+
+
+/**
+@publishedAll
+@released
+
+Defines the minimum size of a new heap.
+
+Functions that require a new heap to be allocated will either panic,
+or will reset the required heap size to this value if a smaller heap
+size is specified.
+
+@see UserHeap
+@see RThread::Create()
+*/
+const TInt KMinHeapSize=0x100;
+
+
+
+
+/**
+@publishedAll
+@released
+
+Not used by Symbian OS.
+*/
+const TInt KDstHome=0x01;
+
+
+
+
+/**
+@publishedAll
+@released
+
+Not used by Symbian OS.
+*/
+const TInt KDstEuropean=0x02;
+
+
+
+
+/**
+@publishedAll
+@released
+
+Not used by Symbian OS.
+*/
+const TInt KDstNorthern=0x04;
+
+
+
+
+/**
+@publishedAll
+@released
+
+Not used by Symbian OS.
+*/
+const TInt KDstSouthern=0x08;
+
+
+
+
+/**
+@publishedAll
+@released
+
+A default stack size that can be used when creating threads.
+*/
+#ifdef __X86GCC__
+const TInt KDefaultStackSize=0x4000;
+#else
+const TInt KDefaultStackSize=0x2000;
+#endif // __X86GCC__
+
+
+
+
+/**
+@publishedAll
+@released
+
+Indicates an undefined character, used internally when formatting text. 
+*/
+const TUint KNoChar=0xffffffffu;
+
+
+
+
+/**
+@publishedAll
+@released
+
+Defines an index value that is interpreted by the TKey class,
+and derived classes, as having a specific meaning.
+
+@see TKey::SetPtr()
+@see TKey::At()
+*/
+const TInt KIndexPtr=(-1);
+
+
+
+
+/**
+@publishedAll
+@released
+
+A flag used by the kernel to mark a handle as not being closable.
+*/
+const TInt KHandleNoClose=0x00008000;
+
+
+
+
+/**
+@publishedAll
+@released
+
+A flag used by the kernel to mark a handle as being local.
+*/
+const TInt KHandleFlagLocal=0x40000000;
+
+
+
+
+/**
+@publishedAll
+@released
+
+A flag used by the Kernel to indicate the current process.
+*/
+const TInt KCurrentProcessHandle=0xffff0000|KHandleNoClose;
+
+
+
+
+/**
+@publishedAll
+@released
+
+A flag used by the Kernel to indicate the current thread.
+*/
+const TInt KCurrentThreadHandle=0xffff0001|KHandleNoClose;
+
+
+
+
+/**
+@publishedAll
+@released
+
+Defines a handle number value of zero.
+
+@see RHandleBase
+*/
+const TInt KNullHandle=0;
+
+
+
+
+/**
+@publishedAll
+@released
+
+Defines a default unit. Not generally used by Symbian OS.
+*/
+const TInt KDefaultUnit=0x00;
+
+
+
+
+/**
+@publishedAll
+@released
+
+The device unit that must be passed in a call
+to RBusLogicalChannel::DoCreate(), if units are not permitted.
+
+@see RBusLogicalChannel
+*/
+const TInt KNullUnit=0xffffffff;
+
+
+
+
+/**
+@publishedAll
+@released
+
+The maximum unit number that can be passed in a call
+to RBusLogicalChannel::DoCreate().
+
+@see RBusLogicalChannel
+*/
+const TInt KMaxUnits=0x20;
+
+
+
+
+/**
+@publishedAll
+@released
+
+Defines the maximum number of message arguments that can be passed
+across the user side/kernel side boundary.
+*/
+const TInt KMaxMessageArguments=0x04;
+
+
+
+
+/**
+@publishedAll
+@released
+
+The default width of the character representation of a real number, used by
+the default constructor of a TRealFormat object and the formatting functions
+of descriptors.
+
+@see TRealFormat
+@see TDes16::AppendFormat()
+@see TDes8::AppendFormat()
+*/
+const TInt KDefaultRealWidth=20;
+
+
+
+
+/**
+@publishedAll
+@released
+
+The default value used by UserHeap::ChunkHeap() for defining increments to
+the size of a chunk, when no explicit value specified by the caller.
+
+@see UserHeap::ChunkHeap()
+*/
+const TInt KMinHeapGrowBy=0x1000;
+
+
+
+
+/**
+@publishedAll
+@released
+
+Not used by Symbian OS.
+*/
+const TInt KMaxExponentConversion=99;
+
+
+
+
+/**
+@publishedAll
+@released
+
+Defines a Null UID value.
+
+@see TUid
+*/
+const TInt KNullUidValue=0;
+
+
+
+
+/**
+@publishedAll
+@deprecated
+
+The timer granularity used by a CDeltaTimer object is
+now the tick period and this constant is obsolete.
+
+@see CDeltaTimer
+*/
+const TInt KDeltaTimerDefaultGranularity=100000;
+
+
+
+
+/**
+@publishedAll
+@released
+
+The largest possible value for a TInt8.
+*/
+const TInt KMaxTInt8=0x7f;
+
+
+
+
+/**
+@publishedAll
+@released
+
+The smallest possible value for a TInt8.
+*/
+const TInt KMinTInt8=(-128);
+
+
+
+
+/**
+@publishedAll
+@released
+
+The largest possible value for a TUint8.
+*/
+const TUint KMaxTUint8=0xffu;
+
+
+
+
+/**
+@publishedAll
+@released
+
+The largest possible value for a TInt16.
+*/
+const TInt KMaxTInt16=0x7fff;
+
+
+
+
+/**
+@publishedAll
+@released
+
+The smallest possible value for a TInt16.
+*/
+const TInt KMinTInt16=(-32768);
+
+
+
+
+/**
+@publishedAll
+@released
+
+The largest possible value for a TUint16.
+*/
+const TUint KMaxTUint16=0xffffu;
+
+
+
+
+/**
+@publishedAll
+@released
+
+The largest possible value for a TInt32.
+*/
+const TInt KMaxTInt32=0x7fffffff;
+
+
+
+
+/**
+@publishedAll
+@released
+
+The smallest possible value for a TInt32.
+*/
+const TInt KMinTInt32=(TInt)0x80000000;
+
+
+
+
+/**
+@publishedAll
+@released
+
+The largest possible value for a TUint32.
+*/
+const TUint KMaxTUint32=0xffffffffu;
+
+
+
+
+/**
+@publishedAll
+@released
+
+The largest possible value for a TInt.
+*/
+const TInt KMaxTInt=0x7fffffff;
+
+
+
+
+/**
+@publishedAll
+@released
+
+The smallest possible value for a TInt.
+*/
+const TInt KMinTInt=(TInt)0x80000000;
+
+
+
+
+/**
+@publishedAll
+@released
+
+The largest possible value for a TUint.
+*/
+const TUint KMaxTUint=0xffffffffu;
+
+
+
+
+/**
+@publishedAll
+@released
+
+The largest possible value for a TInt64.
+*/
+const TInt64 KMaxTInt64 = I64LIT(0x7fffffffffffffff);
+
+
+
+
+/**
+@publishedAll
+@released
+
+The smallest possible value for a TInt64.
+*/
+const TInt64 KMinTInt64 = UI64LIT(0x8000000000000000);
+
+
+
+
+/**
+@publishedAll
+@released
+
+The largest possible value for a TUint64.
+*/
+const TUint64 KMaxTUint64 = UI64LIT(0xffffffffffffffff);
+
+
+
+
+/**
+@publishedAll
+@released
+
+Defines the character *, and represents any number of characters in any
+part of a path component, filename or extension.
+
+It is used in a TParse file specification.
+
+@see TParse
+*/
+const TUint KMatchAny='*';
+
+
+
+
+/**
+@publishedAll
+@released
+
+Defines the character ?, and represents a single character in
+a path component, filename or extension.
+
+It is used in a TParse file specification.
+
+@see TParse
+*/
+const TUint KMatchOne='?';
+
+
+
+
+/**
+@publishedAll
+@released
+
+Defines the maximum number of local drives.
+*/
+const TInt KMaxLocalDrives=16;
+
+
+
+
+/**
+@publishedAll
+@released
+
+Defines the maximum number of peripheral bus sockets.
+*/
+const TInt KMaxPBusSockets=4;
+
+
+
+
+/**
+@publishedAll
+@released
+
+Not used by Symbian OS.
+*/
+const TInt KNoCallEntryPoint = 0x01;
+
+
+
+
+/**
+@publishedAll
+@released
+
+The value to which CActive::iStatus is set by an active object's
+service provider before the service provider initiates an asynchronous request.
+
+@see CActive
+*/
+const TInt KRequestPending=(-KMaxTInt);
+
+
+
+
+// Drive capabilities
+
+/**
+@publishedAll
+@released
+
+Defines the possible media types. 
+*/
+enum TMediaType
+	{
+	EMediaNotPresent,
+	
+	EMediaUnknown,
+	
+	EMediaFloppy,
+	
+	/** Solid-state media. */
+	EMediaHardDisk,
+	
+	EMediaCdRom,
+	
+	EMediaRam,
+	
+	EMediaFlash,
+	
+	EMediaRom,
+	
+	EMediaRemote,
+	
+	EMediaNANDFlash,
+	
+	/** Rotating media. */
+	EMediaRotatingMedia  
+	};
+
+
+
+
+/**
+@publishedAll
+@released
+
+Defines the state of a battery, if supported.
+*/
+enum TBatteryState {EBatNotSupported,EBatGood,EBatLow};
+
+
+
+
+/**
+@publishedAll
+@released
+
+Drive attribute - drive is local.
+*/
+const TUint KDriveAttLocal=0x01;
+
+
+
+
+/**
+@publishedAll
+@released
+
+Drive attribute - ROM drive.
+*/
+const TUint KDriveAttRom=0x02;
+
+
+
+
+/**
+@publishedAll
+@released
+
+Drive attribute - output from a process on one drive is redirected
+to another drive.
+*/
+const TUint KDriveAttRedirected=0x04;
+
+
+
+
+/**
+@publishedAll
+@released
+
+Drive attribute - drive letter has been substituted (assigned a path).
+*/
+const TUint KDriveAttSubsted=0x08;
+
+
+
+
+/**
+@publishedAll
+@released
+
+Drive attribute - drive is internal (not removable).
+*/
+const TUint KDriveAttInternal=0x10;
+
+
+
+
+/**
+@publishedAll
+@released
+
+Drive attribute - drive is removable.
+*/
+const TUint KDriveAttRemovable=0x20;
+
+
+
+
+/**
+@publishedAll
+@released
+
+Drive attribute - drive is remote.
+*/
+const TUint KDriveAttRemote=0x40;
+
+
+
+
+/**
+@publishedAll
+@released
+
+Drive attribute -.
+*/
+const TUint KDriveAttTransaction=0x80;
+
+
+/**
+@publishedAll
+@released
+
+Drive attribute - drive is used for paging.
+*/
+const TUint KDriveAttPageable=0x100;
+
+
+
+/**
+@publishedAll
+@released
+
+Drive attribute - drive is logically removable (can be taken offline from Symbian OS).
+If not logically removable then physically removable e.g. a card can be take out.
+*/
+const TUint KDriveAttLogicallyRemovable=0x200; 
+
+
+/**
+@publishedAll
+@released
+
+Drive attribute - drive is hidden.
+A drive which has its hidden attribute set would be excluded from the list of available drives.
+*/
+const TUint KDriveAttHidden=0x400; 
+
+
+/**
+@publishedAll
+@released
+
+Drive attribute - It can be set in a search in order to instruct that all drives should be returned.
+*/
+const TUint KDriveAttAll=0x100000;
+
+
+/**
+@publishedAll
+@released
+
+Drive attribute - It can be set in combination with other drive attributes in order to exclude during a drive search, drives with 
+these attributes set. 
+*/
+const TUint KDriveAttExclude=0x40000;
+
+
+
+/**
+@publishedAll
+@released
+
+Drive attribute - It can be set in combination with other drive attributes in order to search and return exclusively drives with these attributes set.
+*/
+const TUint KDriveAttExclusive=0x80000;
+
+
+
+/**
+@internalTechnology
+
+Used as a mask in order to extract the actual drive attributes.
+
+*/
+const TUint KDriveAttMatchedFlags=0xFFF;
+
+
+
+/**
+@internalTechnology
+
+Used as a mask in order to extract the extra(ex KDriveAttAll ,KDriveAttExclude, KDriveAttExclusive ,0) drive attributes.
+*/
+const TUint KDriveAttMatchedAtt=0x0FFF0000;
+
+
+
+
+/**
+@publishedAll
+@released
+
+Media attribute - the media capacity can change over time.
+*/
+const TUint KMediaAttVariableSize=0x01;
+
+
+
+
+/**
+@publishedAll
+@released
+
+Media attribute - media is dual density.
+*/
+const TUint KMediaAttDualDensity=0x02;
+
+
+
+
+/**
+@publishedAll
+@released
+
+Media attribute - media is formattable.
+*/
+const TUint KMediaAttFormattable=0x04;
+
+
+
+
+/**
+@publishedAll
+@released
+
+Media attribute - media is write-protected.
+*/
+const TUint KMediaAttWriteProtected=0x08;
+
+
+
+
+/**
+@publishedAll
+@released
+
+Media attribute - media is lockable; this is provided for
+lockable multi-media cards
+*/
+const TUint KMediaAttLockable=0x10;
+
+
+
+
+/**
+@publishedAll
+@released
+
+Media attribute - media is locked; this is provided for
+lockable multi-media cards
+*/
+const TUint KMediaAttLocked=0x20;
+
+
+
+/**
+@publishedAll
+@released
+
+Media attribute - media has password.
+*/
+const TUint KMediaAttHasPassword=0x40;
+
+/**
+@publishedAll
+@released
+*/
+const TUint KMediaAttReadWhileWrite=0x80;
+
+/**
+@publishedAll
+@released
+
+Media attribute - media supports TBusLocalDrive::DeleteNotify()
+*/
+const TUint KMediaAttDeleteNotify=0x100;
+
+/**
+@publishedAll
+@released
+
+Media attribute - media supports paging
+*/
+const TUint KMediaAttPageable=0x200;
+
+
+
+/**
+@publishedAll
+@released
+
+Identifies a FAT file system
+*/
+const TUint KDriveFileSysFAT=0x01;
+
+
+
+
+/**
+@publishedAll
+@released
+
+Identifies a ROM file system.
+*/
+const TUint KDriveFileSysROM=0x02;
+
+
+
+
+/**
+@publishedAll
+@released
+
+Identifies an LFFS file system.
+*/
+const TUint KDriveFileSysLFFS=0x03;
+
+
+
+
+/**
+@publishedAll
+@released
+
+Identifies a read-only file system.
+*/
+const TUint KDriveFileSysROFS=0x04;
+
+
+
+
+/**
+@publishedAll
+@released
+
+Identifies a non-file system.  That is a partition without any file system layer.
+*/
+const TUint KDriveFileNone=0x05;
+
+
+
+
+/**
+@publishedAll
+@released
+
+An enumerator with a single enumeration value that defines the Boolean value 
+false in Symbian OS.
+
+@see TBool
+*/
+enum TFalse {
+            /**
+            Defines the value false that is passed to a TBool type.
+            */
+            EFalse=FALSE
+            };
+            
+            
+            
+            
+/**
+@publishedAll
+@released
+
+An enumerator with a single enumeration value that defines the Boolean value 
+true in Symbian OS.
+
+@see TBool
+*/
+enum TTrue {
+           /**
+           Defines the value true that is passed to a TBool type.
+           */
+           ETrue=TRUE
+           };
+
+
+
+
+/**
+@publishedAll
+@released
+
+Defines flags that can be used to indicate whether duplicates, for example in 
+a list, are allowed.
+*/
+enum TAllowDuplicates {
+                      /**
+                      No duplicates allowed.
+                      */
+                      ENoDuplicates,
+                      
+                      /**
+                      Duplicates allowed.
+                      */
+                      EAllowDuplicates
+                      };
+
+
+
+
+/**
+@publishedAll
+@released
+
+An enumeration whose enumerators determine the number system to be used
+when converting numbers into a character format.
+
+@see TDes8::Num()
+@see TDes8::NumUC()
+@see TDes8::AppendNum()
+@see TDes8::AppendNumUC()
+@see TDes16::Num()
+@see TDes16::NumUC()
+@see TDes16::AppendNum()
+@see TDes16::AppendNumUC()
+*/
+enum TRadix {
+            /**
+            Convert number into binary character representation.
+            */
+            EBinary=2,
+            /**
+            Convert number into octal character representation.
+            */            
+            EOctal=8,
+            /**
+            Convert number into decimal character representation.
+            */            
+            EDecimal=10,
+          	/**
+          	Convert number into hexadecimal character representation.
+          	*/            
+            EHex=16
+            };
+
+
+
+
+
+/**
+@publishedAll
+@released
+
+The mask for the dialect bits
+*/
+const TUint KDialectMask=0x03FF;
+
+
+
+
+
+/**
+@publishedAll
+@released
+
+Defines the date formats.
+*/
+enum TDateFormat {
+                 /**
+                 US format (mm/dd/yyyy)
+                 */
+                 EDateAmerican,
+                 
+                 /**
+                 European format (dd/mm/yyyy)
+                 */                 
+                 EDateEuropean,
+                 
+                 /**
+                 Japanese format (yyyy/mm/dd)
+                 */
+                 EDateJapanese};
+
+
+
+
+/**
+@publishedAll
+@released
+
+Defines the time formats as either 12 hour or 24 hour.
+*/
+enum TTimeFormat {
+                 ETime12,
+                 ETime24
+                 };
+
+
+
+
+/**
+@publishedAll
+@released
+
+Defines the clock display formats, as either analog or digital.
+*/
+enum TClockFormat {
+                  EClockAnalog,
+                  EClockDigital
+                  };
+
+
+
+
+/** 
+@publishedAll
+@released
+
+Enumerates the units of measurement as either Imperial or Metric.
+*/
+enum TUnitsFormat {
+                  EUnitsImperial,
+                  EUnitsMetric
+                  };
+
+
+
+
+/**
+@publishedAll
+@released
+
+Identifies a time as being am or pm.
+*/
+enum TAmPm {
+           EAm,
+           EPm
+           };
+
+
+
+
+/**
+@publishedAll
+@released
+
+Defines whether:
+
+1. the currency symbol is located before or after the currency amount.
+
+2. the am/pm text is located before or after the time.
+*/
+enum TLocalePos 
+	{
+	/**
+	The currency symbol is located before the currency amount.
+	The am/pm text is located before the time.
+	*/
+	ELocaleBefore,
+	
+	/**
+	The currency symbol is located after the currency amount.
+	The am/pm text is located after the time.
+	*/
+	ELocaleAfter
+	};
+
+
+
+
+/**
+@publishedAll
+@released
+
+Number Modes available to select.
+*/
+enum TDigitType
+	{
+	EDigitTypeUnknown = 0x0000,
+	EDigitTypeWestern = 0x0030,
+	EDigitTypeArabicIndic = 0x0660,
+	EDigitTypeEasternArabicIndic = 0x6F0,
+	EDigitTypeDevanagari = 0x0966,
+	EDigitTypeBengali = 0x09E6,
+	EDigitTypeGurmukhi = 0x0A66,
+	EDigitTypeGujarati = 0x0AE6,
+	EDigitTypeOriya = 0x0B66,
+	EDigitTypeTamil = 0x0BE6,
+	EDigitTypeTelugu = 0x0C66,
+	EDigitTypeKannada = 0x0CE6,
+	EDigitTypeMalayalam = 0x0D66,
+	EDigitTypeThai = 0x0E50,
+	EDigitTypeLao = 0x0ED0,
+	EDigitTypeTibetan = 0x0F20,
+	EDigitTypeMayanmar = 0x1040,
+	EDigitTypeKhmer = 0x17E0,
+	EDigitTypeAllTypes = 0xFFFF
+	};
+
+
+
+
+/**
+@publishedAll
+@released
+
+Defines the daylight saving zones.
+*/
+enum TDaylightSavingZone
+	{
+	/**
+	The home daylight saving zone. Its value is usually the same as that of the 
+	zone in which the home city is located, but may differ. In this case, the 
+	value for home overrides the value of the zone in which home is located.
+	*/
+	EDstHome=0x40000000,
+	
+	/**
+	No daylight saving zone.
+	*/
+	EDstNone=0,
+	
+	/**
+	The European daylight saving zone.
+	*/
+	EDstEuropean=1,
+	
+	/**
+	The Northern hemisphere (non-European) daylight saving zone.
+	*/
+	EDstNorthern=2,
+	
+	/**
+	Southern hemisphere daylight saving zone.
+	*/
+	EDstSouthern=4
+	};
+
+
+
+
+/**
+@internalComponent
+
+Indicates how negative currency values are formatted.
+*/
+enum TNegativeCurrencyFormat // must match TLocale:: version, included here so ELOCL.DLL can see it
+	{
+	E_NegC_LeadingMinusSign,
+	E_NegC_InBrackets,// this one must be non-zero for binary compatibility with the old TBool TLocale::iCurrencyNegativeInBrackets which was exposed in the binary interface because it was accessed via *inline* functions
+	E_NegC_InterveningMinusSignWithSpaces,
+	E_NegC_InterveningMinusSignWithoutSpaces,
+	E_NegC_TrailingMinusSign
+	};
+
+/**
+@internalComponent
+
+
+Indicates how the device universal time is maintained
+*/
+enum TDeviceTimeState // must match TLocale:: version
+	{
+	/** Universal time is maintained by the device RTC and the user selection 
+	of the locale of the device indicating offset from GMT and daylight saving*/
+	EDeviceUserTime,
+
+	/** Universal time and offset from GMT is supplied by the mobile network
+	and maintained by device RTC */
+	ENITZNetworkTimeSync
+	};
+
+
+
+/**
+@publishedAll
+@released
+
+Defines the days of the week.
+
+The enumerator symbol names correspond with the days of the week,
+i.e. EMonday refers to Monday etc.
+*/
+enum TDay
+	{
+	EMonday,
+	ETuesday,
+	EWednesday,
+	EThursday,
+	EFriday,
+	ESaturday,
+	ESunday
+	};
+
+
+
+
+/**
+@publishedAll
+@released
+
+Defines the months of the year.
+
+The enumerator symbol names correspond with the months of the year,
+i.e. EJanuary refers to January etc.
+*/
+enum TMonth
+	{
+	EJanuary,
+	EFebruary,
+	EMarch,
+	EApril,
+	EMay,
+	EJune,
+	EJuly,
+	EAugust,
+	ESeptember,
+	EOctober,
+	ENovember,
+	EDecember
+	};
+
+
+
+
+/**
+@publishedAll
+@released
+
+Handle ownership flags.
+
+The flags indicate whether a handle being opened is owned by a process or 
+a thread.
+
+Ownership by a process means that the handle instance can be used by all
+threads in the process to access the Kernel side object that the
+handle represents.
+
+Ownership by a thread means that the handle instance can only be used by the 
+thread that creates or opens the handle.
+
+An enumerator of this type is passed to all member functions of RHandleBase, 
+and classes derived from RHandleBase, which open a handle.
+*/
+enum TOwnerType {
+	             /**
+	             Ownership of the handle is to be vested in the process.
+	             */
+                 EOwnerProcess,
+                 
+                 /**
+                 Ownership of the handle is to be vested in the thread.
+                 */
+                 EOwnerThread
+                };
+
+
+
+
+const TInt KCreateProtectedObject = (TInt)0x80000000;
+
+
+
+
+
+/**
+@publishedAll
+@released
+
+Defines process priorities.
+
+The enumerator values are passed to RProcess::SetPriority().
+
+The priorities are listed in relative order stating with the lowest.
+*/
+enum TProcessPriority
+	{
+	EPriorityLow=150,
+	EPriorityBackground=250,
+	EPriorityForeground=350,
+	EPriorityHigh=450,
+	EPriorityWindowServer=650,
+	EPriorityFileServer=750,
+	EPriorityRealTimeServer=850,
+	EPrioritySupervisor=950
+	};
+
+
+
+
+/**
+@publishedAll
+@released
+
+Defines thread priorities.
+
+The enumerator values are passed to RThread::SetPriority().
+
+The relative priorities are listed in order starting with the lowest.
+
+The absolute thread priorities are listed in order starting with the lowest.
+*/
+enum TThreadPriority
+	{
+	EPriorityNull=(-30),
+	EPriorityMuchLess=(-20),
+	EPriorityLess=(-10),
+	EPriorityNormal=0,
+	EPriorityMore=10,
+	EPriorityMuchMore=20,
+	EPriorityRealTime=30,
+	EPriorityAbsoluteVeryLow=100,
+	EPriorityAbsoluteLowNormal=150,
+	EPriorityAbsoluteLow=200,
+	EPriorityAbsoluteBackgroundNormal=250,
+	EPriorityAbsoluteBackground=300,
+	EPriorityAbsoluteForegroundNormal=350,
+	EPriorityAbsoluteForeground=400,
+	EPriorityAbsoluteHighNormal=450,
+	EPriorityAbsoluteHigh=500,
+	EPriorityAbsoluteRealTime1=810,
+	EPriorityAbsoluteRealTime2=820,
+	EPriorityAbsoluteRealTime3=830,
+	EPriorityAbsoluteRealTime4=840,
+	EPriorityAbsoluteRealTime5=850,
+	EPriorityAbsoluteRealTime6=860,
+	EPriorityAbsoluteRealTime7=870, 
+	EPriorityAbsoluteRealTime8=880
+	};
+
+
+/**
+@publishedAll
+@released
+
+A list of exception types which a thread's exception handler might deal with.
+An enumerator of this type is passed to User::IsExceptionHandled()
+and User::RaiseException().
+
+While an exception handler can deal with exceptions as listed in the exception
+constants set, a TExcType is simply a type of exception.
+For example, EExcIntegerDivideByZero and EExcIntegerOverflow are types
+of KExceptionInteger exception.
+*/
+enum TExcType
+	{
+	EExcGeneral=0, ///<A miscellaneous exception.
+	EExcIntegerDivideByZero=1, ///<An attempt was made to divide an integer by zero.
+	EExcSingleStep=2, ///<Raised after executing an instruction, when CPU is in single-step mode.
+	EExcBreakPoint=3, ///<A break point was hit.
+	EExcIntegerOverflow=4, ///<An integer value overflowed.
+	EExcBoundsCheck=5, ///<Access to an out of bounds array element was caught.
+	EExcInvalidOpCode=6, ///<The CPU reached an invalid instruction.
+	EExcDoubleFault=7, ///<A fault occurred while handling a previous exception or interrupt.
+	EExcStackFault=8, ///<The thread ran out of stack space.
+	EExcAccessViolation=9, ///<The thread attempted to access memory in an unauthorized area.
+	EExcPrivInstruction=10, ///<Attempted to execute an instruction in wrong machine mode.
+	EExcAlignment=11, ///<The thread tried to read or write non-aligned data.
+	EExcPageFault=12, ///<Thread could not access the memory page requested.
+	EExcFloatDenormal=13, ///<An operand in a floating point operation was denormal.
+	EExcFloatDivideByZero=14, ///<An attempt was made to divide a floating point number by zero.
+	EExcFloatInexactResult=15, ///<The result of a floating point operation could not be represented precisely.
+	EExcFloatInvalidOperation=16, ///<The result of a floating point operation was an ill-defined quantity.
+	EExcFloatOverflow=17, ///<The result of a floating point operation was too large to be represented.
+	EExcFloatStackCheck=18, ///<The result of a floating point operation caused the stack to over or underflow.
+	EExcFloatUnderflow=19, ///<The result of a floating point operation was too small to be represented.
+	EExcAbort=20, ///<This exception is not raised by the Kernel, though it may be raised by a user thread on itself.
+	EExcKill=21, ///<This exception is not raised by the Kernel, though it may be raised by a user thread on itself.
+	EExcUserInterrupt=22, ///<May be used to indicate a general exception.
+	EExcDataAbort=23, ///<The thread has tried to read data from an invalid address.
+	EExcCodeAbort=24, ///<The thread has tried to fetch an instruction from an invalid address.
+	EExcMaxNumber=25, ///<Do not use.
+	EExcInvalidVector=26, ///<Do not use.
+	};
+
+
+
+/**
+@publishedAll
+@released
+
+Identifies how a thread or process has ended.
+
+While a thread or process is alive, its exit type is always EExitPending.
+
+Both RThread::ExitType() and RProcess::ExitType() return a TExitType.
+
+@see RThread::ExitType()
+@see RProcess::ExitType()
+@see User::Exit()
+@see RThread::Kill()
+@see RProcess::Kill()
+*/
+enum TExitType {
+               /**
+               The thread or process has ended under normal conditions, i.e. as a result of either:
+               1. The thread or process running to completion.
+               2. User::Exit() being invoked.
+               3. RThread::Kill() or RProcess::Kill() being invoked on the RThread or RProcess handle, respectively.
+			   */
+               EExitKill,
+                
+               /**
+               The thread or process has ended as a result of a terminate,
+               i.e. Terminate() has been called on the RThread or RProcess handle.
+               */
+               EExitTerminate,
+
+               /**
+               The thread or process has been panicked.
+               */
+               EExitPanic,
+
+               /**
+               The thread or process is alive.
+               */
+               EExitPending
+               };
+
+
+
+
+/**
+@publishedAll
+@released
+
+An enumeration whose enumerators govern the alignment of data which is copied 
+or formatted into a descriptor.
+
+@see TDes8::Justify()
+@see TDes8::AppendJustify()
+@see TDes16::Justify()
+@see TDes16::AppendJustify()
+*/
+enum TAlign {
+            /**
+            Data is left aligned
+            */
+            ELeft,
+            /**
+            Data is centered
+            */            
+            ECenter,
+            /**
+            Data is right aligned
+            */            
+            ERight
+            };
+
+
+
+
+/**
+@publishedAll
+@released
+
+A mask for the set of flags that govern the general format
+of the character representation of a real number.
+
+These are the flags with symbols starting KRealFormat...
+*/
+const TInt KRealFormatTypesMask=0x00000007;
+
+
+
+
+/**
+@publishedAll
+@released
+
+Defines the general format of the character representation of a real number.
+The TRealFormat::iType data member is set to one of these.
+
+The real number is converted to fixed format which has the general pattern:
+"nnn.ddd", where nnn is the integer portion and ddd is the decimal portion.
+A negative value is prefixed by a minus sign.
+
+The number of decimal places generated is defined by the value of
+TRealFormat::iPlaces. Trailing zeroes are generated as required.
+If necessary, the decimal portion is rounded to fit the specification.
+If this value is zero, no decimal point and no decimal portion is generated.
+
+Triad separation is available,
+defined by TRealFormat::iTriad and TRealFormat::iTriLen.
+
+Note that a zero value is converted either to the form "0.000..." with
+iPlaces '0' characters after the decimal point, if iPlaces is greater than
+zero, or to "0" if iPlaces is zero.
+
+@see TRealFormat
+*/
+const TInt KRealFormatFixed=1;
+
+
+
+
+/**
+@publishedAll
+@released
+
+Defines the general format of the character representation of a real number.
+The TRealFormat::iType data member is set to one of these.
+
+The real number is converted to scientific format with one non-zero digit
+before the decimal point and a number of digits after the decimal point.
+Hence the number has the general pattern:
+"n.dddE+ee" or "n.dddE-ee", or "n.dddE+eee" or "n.dddE-eee".
+
+The decimal portion is followed by the character 'E', a sign ('+' or '-')
+and the exponent as two digits, including leading zeroes, if necessary.
+If necessary, the decimal portion is rounded. 
+
+A negative value is prefixed by a minus sign.
+
+If the flag KUseSigFigs is not set, TRealFormat::iPlaces defines the number
+of digits which follow the decimal point. If the flag KUseSigFigs is set,
+iPlaces defines the maximum number of significant digits to be generated.
+
+Note that, by default, exponents are limited to two digits.
+Those numbers that require three digits must have the flag
+KAllowThreeDigitExp set. If iPlaces is zero, the value is rounded to one digit
+of precision and no decimal point is included.
+
+Triad separation is not available.
+
+Note that a zero value is converted either to the form "0.000...E+00" with
+iPlaces '0' characters after the decimal point, if iPlaces is greater than
+zero, or to "0E+00" if iPlaces is zero.
+
+@see TRealFormat
+*/
+const TInt KRealFormatExponent=2;
+
+
+
+
+/**
+@publishedAll
+@released
+
+Defines the general format of the character representation of a real number.
+The TRealFormat::iType data member is set to one of these.
+
+The real number is converted either to fixed or scientific format.
+The format chosen is the one which can present the greater number of
+significant digits. Where both formats can present the same number of
+significant digits, fixed format is used.
+
+The number of decimal places generated depends only on the value of
+TRealFormat::iWidth; the value of the iPlaces member is ignored.
+
+Trailing zeroes in the decimal portion are discarded.
+
+Triad separation is not available.
+
+Note that a zero value is converted to "0".
+
+@see TRealFormat
+*/
+const TInt KRealFormatGeneral=3;
+
+
+
+
+/**
+@publishedAll
+@released
+
+Defines the general format of the character representation of a real number.
+The TRealFormat::iType data member is set to one of these.
+
+The same as KRealFormatFixed but the TRealFormat::iPlaces is interpreted as
+specifying the maximum number of significant digits.
+
+Trailing zeroes in the decimal portion are discarded.
+
+@see TRealFormat
+*/
+const TInt KRealFormatNoExponent=4;
+
+
+
+
+/**
+@publishedAll
+@released
+
+Defines the general format of the character representation of a real number.
+The TRealFormat::iType data member is set to one of these.
+
+The same as KRealFormatGeneral but TRealFormat::iPlaces is interpreted as
+specifying the maximum number of significant digits, and the number is
+displayed without an exponent whenever possible.
+
+Trailing zeroes in the decimal portion are discarded.
+
+@see TRealFormat
+*/
+const TInt KRealFormatCalculator=5;
+
+
+
+
+// Extra flags ORed in with the previous types
+
+
+/**
+@publishedAll
+@released
+
+A bitmask for all flags except those with symbols starting KRealFormat...
+*/
+const TInt KRealFormatTypeFlagsMask=0x7C000000;
+
+
+
+
+/**
+@publishedAll
+@released
+
+A flag that modifies the format of the character representation of a real
+number.
+
+It reduces the effective width by one character. This forces a large enough
+value for TRealFormat::iWidth to be chosen to guarantee that positive and
+negative numbers can be shown to the same precision.
+
+It applies when TRealFormat::iType is set to KRealFormatFixed
+or KRealFormatGeneral, and should be ORed into TRealFormat::iType after one of
+these types has been set.
+*/
+const TInt KExtraSpaceForSign=0x40000000;
+
+
+
+/**
+@publishedAll
+@released
+
+A flag that modifies the format of the character representation of a real
+number.
+
+It allows an exponent to be formatted whose magnitude is greater than 100.
+If this flag is not set, an attempt to format such a number fails.
+
+If set, three digit exponents are allowed. If not set, only two digit
+exponents are allowed.
+
+Applies when TRealFormat::iType is set to KRealFormatExponent
+or KRealFormatGeneral, and should be ORed into TRealFormat::iType after one of
+these types has been set.
+*/
+const TInt KAllowThreeDigitExp=0x20000000;
+
+
+
+
+/**
+@publishedAll
+@released
+
+A flag that modifies the format of the character representation of a real
+number.
+
+If set, the TRealFormat::iPlaces member is interpreted as the maximum number
+of significant digits to be generated.
+
+Applies when TRealFormat::iType is set to KRealFormatExponent, and should be
+ORed into TRealFormat::iType after this type has been set.
+*/
+const TInt KUseSigFigs=0x10000000;
+
+
+
+
+/**
+@publishedAll
+@released
+
+A flag that modifies the format of the character representation of a real
+number.
+
+It disables triad separation.
+
+Applies when TRealFormat::iType is set to KRealFormatFixed
+or KRealFormatNoExponent, and should be ORed into TRealFormat::iType after one of
+these types has been set.
+*/
+const TInt KDoNotUseTriads=0x08000000;
+
+
+
+
+/**
+@publishedAll
+@released
+
+A flag that modifies the format of the character representation of a real
+number.
+
+If set, this flag limits the precision to KPrecisionLimit digits.
+If not set, the precision defaults to KMaxPrecision digits.
+
+This flag should be ORed into TRealFormat::iType.
+*/
+const TInt KGeneralLimit=0x04000000;
+
+
+
+
+/**
+@publishedAll
+@released
+
+A value, which when passed to the new operator, indicates that the operation
+is to leave if insufficient memory available.
+*/
+enum TLeave {ELeave};
+
+
+
+
+/**
+@publishedAll
+@released
+
+Defines the way in which the first week in a year is determined.
+*/
+enum TFirstWeekRule {
+                    /**
+                    The first week in the year is always the week containing
+                    the first day of the year.
+                    */
+                    EFirstWeek,
+                    /**
+                    If at least four days of the new year occur during the week
+                    containing the first day then this is the first week in the
+                    year. Otherwise the first week in the year is the following
+                    week. This is the default and complies with the
+                    international standard.
+                    */
+                    EFirstFourDayWeek,
+                    /**
+                    The first week in the year is the first week of which all
+                    seven days occur within the new year.
+                    */
+                    EFirstFullWeek
+                    };
+
+
+
+
+/**
+@publishedAll
+@released
+
+Timer lock specifications.
+
+They are used by CTimer::Lock() to define the fraction of a second in which 
+to call its RunL() function.
+
+@see CTimer
+*/
+enum TTimerLockSpec
+	{
+	/** Timer tick is at 1/12 past the second. */
+	EOneOClock,
+
+	/** Timer tick is at 2/12 past the second */
+	ETwoOClock,
+
+	/** Timer tick is at 3/12 past the second */
+	EThreeOClock,
+
+	/** Timer tick is at 4/12 past the second */
+	EFourOClock,
+
+	/** Timer tick is at 5/12 past the second */
+	EFiveOClock,
+
+	/** Timer tick is at 6/12 past the second */
+	ESixOClock,
+
+	/** Timer tick is at 7/12 past the second */
+	ESevenOClock,
+
+	/** Timer tick is at 8/12 past the second */
+	EEightOClock,
+
+	/** Timer tick is at 9/12 past the second */
+	ENineOClock,
+
+	/** Timer tick is at 10/12 past the second */
+	ETenOClock,
+
+	/** Timer tick is at 11/12 past the second */
+	EElevenOClock,
+
+	/** Timer tick is on the second */
+	ETwelveOClock
+	};
+
+
+
+
+/**
+@publishedAll
+@released
+
+Defines the possible environment changes which may be reported by
+a change notifier through the RChangeNotifier interface.
+
+Each enumerator corresponds to a distinct type of event.
+
+The changes are reported through a TRequestStatus object when a request to
+the change notifier completes. As each enumerator value represents
+a separate bit, any combination of events can be reported.
+
+@see RChangeNotifier
+@see TRequestStatus
+@see TLocale
+*/
+enum TChanges
+	{
+	/**
+	The system locale has changed.
+
+    Typically this event occurs as a result of a call to TLocale::Set().
+	*/
+	EChangesLocale=0x01,
+
+	
+	/**
+	The system time has passed midnight.
+	*/
+	EChangesMidnightCrossover=0x02,
+	
+	
+	/**
+	A thread has died.
+	
+	This event is reported when any thread in the system dies.
+    */
+	EChangesThreadDeath=0x04,
+	
+	
+	/**
+	The status of the power supply has changed.
+	*/
+	EChangesPowerStatus=0x08,
+
+
+	/**
+	The system time has changed.
+	*/
+	EChangesSystemTime=0x10,
+	
+
+	/**
+	The free memory level has crossed a specified threshold value.
+	*/
+	EChangesFreeMemory=0x20,
+
+	
+	/**
+	A memory allocation has failed due to insufficient free memory.
+	*/
+	EChangesOutOfMemory=0x40,
+	
+
+	/**
+	The free memory level has fallen below the low-memory threshold
+	@see UserSvr::SetMemoryThresholds()
+	*/
+	EChangesLowMemory=0x80,
+	};
+
+
+
+
+/**
+@publishedAll
+@released
+
+Defines a pointer to a thread function which takes a pointer of
+type TAny and returns a TInt.
+
+A function of this type is passed as parameter to RThread::Create()
+when creating a thread. Control passes to this function when the thread
+is first scheduled for execution.
+
+@see RThread
+*/
+typedef TInt (*TThreadFunction)(TAny*);
+
+
+
+
+/**
+@publishedAll
+@released
+
+Defines a function that takes no arguments but returns a TInt.
+
+This is a type which is returned from a call to RLibrary::Lookup().
+
+@see RLibrary
+*/
+typedef TInt (*TLibraryFunction)();
+
+
+
+
+/**
+@publishedAll
+@released
+
+Defines a function that takes a single argument of type TInt and returns a TInt.
+
+This is a type which is returned from a call to RLibrary::EntryPoint().
+
+@see RLibrary
+*/
+typedef TInt (*TLibraryEntry)(TInt);
+
+
+
+/**
+@publishedAll
+@released
+
+Defines an exception handler function which takes a TExcType as an argument,
+and returns void.
+
+A function of this type is an exception handler used by member functions
+of a thread handle, RThread.
+
+@see RThread
+@see TExcType
+*/
+typedef void (*TExceptionHandler)(TExcType);
+
+
+
+
+// masking constants
+
+/**
+@publishedAll
+@released
+
+One of a set of flags that categorizes exceptions - associated with
+the abort exception only.
+
+@see RThread::SetExceptionHandler()
+@see RThread::ModifyExceptionMask()
+*/
+const TUint KExceptionAbort=0x01;
+
+
+
+
+/**
+@publishedAll
+@released
+
+One of a set of flags that categorizes exceptions - associated with
+the kill exception only.
+
+@see RThread::SetExceptionHandler()
+@see RThread::ModifyExceptionMask()
+*/
+const TUint KExceptionKill=0x02;
+
+
+
+
+/**
+@publishedAll
+@released
+
+One of a set of flags that categorizes exceptions - general
+and user exceptions.
+
+@see RThread::SetExceptionHandler()
+@see RThread::ModifyExceptionMask()
+*/
+const TUint KExceptionUserInterrupt=0x04;
+
+
+
+
+/**
+@publishedAll
+@released
+
+One of a set of flags that categorizes exceptions - exceptions caused
+by illegal floating point operations. This exception is not guaranteed
+to be raised when a hardware floating point implementation is in use.
+
+@see RThread::SetExceptionHandler()
+@see RThread::ModifyExceptionMask()
+*/
+const TUint KExceptionFpe=0x08;
+
+
+
+
+/**
+@publishedAll
+@released
+
+One of a set of flags that categorizes exceptions - exceptions associated
+with executing instructions; includes protection faults,
+illegal instruction codes, page faults etc
+
+@see RThread::SetExceptionHandler()
+@see RThread::ModifyExceptionMask()
+*/
+const TUint KExceptionFault=0x10;
+
+
+
+
+/**
+@publishedAll
+@released
+
+One of a set of flags that categorizes exceptions - exceptions caused
+by illegal operations on integer values.
+*/
+const TUint KExceptionInteger=0x20;
+
+
+
+
+/**
+@publishedAll
+@released
+
+One of a set of flags that categorizes exceptions - exceptions raised
+when debugging code.
+
+@see RThread::SetExceptionHandler()
+@see RThread::ModifyExceptionMask()
+*/
+const TUint KExceptionDebug=0x40;
+
+
+
+
+/**
+@publishedAll
+@released
+
+Aligns the specified value on the boundary defined by __Size.
+This is usually 4 for byte alignment or 2 for double-byte alignment.
+
+@param s The value to be aligned.
+*/
+#define __Align(s) ((((s)+__Size-1)/__Size)*__Size)
+
+
+
+
+/**
+@publishedAll
+@released
+
+Defines the type of environment data passed to a process
+when that process is created.
+
+The data can be either a handle or just binary data.
+*/
+enum TProcessParameterType
+	{
+	EHandle=1,
+	EBinaryData=2,
+	};
+
+
+
+
+// bitwise constants
+
+/**
+@publishedAll
+@released
+
+Constant that defines the specified bit value.
+*/
+const TUint32 KBit0= 0x00000001;
+
+
+
+
+/**
+@publishedAll
+@released
+
+Constant that defines the specified bit value.
+*/
+const TUint32 KBit1= 0x00000002;
+
+
+
+
+/**
+@publishedAll
+@released
+
+Constant that defines the specified bit value.
+*/
+const TUint32 KBit2= 0x00000004;
+
+
+
+
+/**
+@publishedAll
+@released
+
+Constant that defines the specified bit value.
+*/
+const TUint32 KBit3= 0x00000008;
+
+
+
+
+/**
+@publishedAll
+@released
+
+Constant that defines the specified bit value.
+*/
+const TUint32 KBit4= 0x00000010;
+
+
+
+
+/**
+@publishedAll
+@released
+
+Constant that defines the specified bit value.
+*/
+const TUint32 KBit5= 0x00000020;
+
+
+
+
+/**
+@publishedAll
+@released
+
+Constant that defines the specified bit value.
+*/
+const TUint32 KBit6= 0x00000040;
+
+
+
+
+/**
+@publishedAll
+@released
+
+Constant that defines the specified bit value.
+*/
+const TUint32 KBit7= 0x00000080;
+
+
+
+
+/**
+@publishedAll
+@released
+
+Constant that defines the specified bit value.
+*/
+const TUint32 KBit8= 0x00000100;
+
+
+
+
+/**
+@publishedAll
+@released
+
+Constant that defines the specified bit value.
+*/
+const TUint32 KBit9= 0x00000200;
+
+
+
+
+/**
+@publishedAll
+@released
+
+Constant that defines the specified bit value.
+*/
+const TUint32 KBit10=0x00000400;
+
+
+
+
+/**
+@publishedAll
+@released
+
+Constant that defines the specified bit value.
+*/
+const TUint32 KBit11=0x00000800;
+
+
+
+
+/**
+@publishedAll
+@released
+
+Constant that defines the specified bit value.
+*/
+const TUint32 KBit12=0x00001000;
+
+
+
+
+/**
+@publishedAll
+@released
+
+Constant that defines the specified bit value.
+*/
+const TUint32 KBit13=0x00002000;
+
+
+
+
+/**
+@publishedAll
+@released
+
+Constant that defines the specified bit value.
+*/
+const TUint32 KBit14=0x00004000;
+
+
+
+
+/**
+@publishedAll
+@released
+
+Constant that defines the specified bit value.
+*/
+const TUint32 KBit15=0x00008000;
+
+
+
+
+/**
+@publishedAll
+@released
+
+Constant that defines the specified bit value.
+*/
+const TUint32 KBit16=0x00010000;
+
+
+
+
+/**
+@publishedAll
+@released
+
+Constant that defines the specified bit value.
+*/
+const TUint32 KBit17=0x00020000;
+
+
+
+
+/**
+@publishedAll
+@released
+
+Constant that defines the specified bit value.
+*/
+const TUint32 KBit18=0x00040000;
+
+
+
+
+/**
+@publishedAll
+@released
+
+Constant that defines the specified bit value.
+*/
+const TUint32 KBit19=0x00080000;
+
+
+
+
+/**
+@publishedAll
+@released
+
+Constant that defines the specified bit value.
+*/
+const TUint32 KBit20=0x00100000;
+
+
+
+
+/**
+@publishedAll
+@released
+
+Constant that defines the specified bit value.
+*/
+const TUint32 KBit21=0x00200000;
+
+
+
+
+/**
+@publishedAll
+@released
+
+Constant that defines the specified bit value.
+*/
+const TUint32 KBit22=0x00400000;
+
+
+
+
+/**
+@publishedAll
+@released
+
+Constant that defines the specified bit value.
+*/
+const TUint32 KBit23=0x00800000;
+
+
+
+
+/**
+@publishedAll
+@released
+
+Constant that defines the specified bit value.
+*/
+const TUint32 KBit24=0x01000000;
+
+
+
+
+/**
+@publishedAll
+@released
+
+Constant that defines the specified bit value.
+*/
+const TUint32 KBit25=0x02000000;
+
+
+
+
+/**
+@publishedAll
+@released
+
+Constant that defines the specified bit value.
+*/
+const TUint32 KBit26=0x04000000;
+
+
+
+
+/**
+@publishedAll
+@released
+
+Constant that defines the specified bit value.
+*/
+const TUint32 KBit27=0x08000000;
+
+
+
+
+/**
+@publishedAll
+@released
+
+Constant that defines the specified bit value.
+*/
+const TUint32 KBit28=0x10000000;
+
+
+
+
+/**
+@publishedAll
+@released
+
+Constant that defines the specified bit value.
+*/
+const TUint32 KBit29=0x20000000;
+
+
+
+
+/**
+@publishedAll
+@released
+
+Constant that defines the specified bit value.
+*/
+const TUint32 KBit30=0x40000000;
+
+
+
+
+/**
+@publishedAll
+@released
+
+Constant that defines the specified bit value.
+*/
+const TUint32 KBit31=0x80000000;
+
+
+
+
+/**
+@publishedAll
+@released
+
+Constant that defines the specified bit value.
+
+This is often used as a bit mask.
+*/
+const TUint32 KSet32=0xffffffff;
+
+
+
+
+/**
+@publishedAll
+@released
+
+
+Constant that defines the specified bit value.
+
+This is often used as a bit mask.
+*/
+const TUint32 KClear32=0x00000000;
+  
+  
+  
+
+/**
+@publishedAll
+@released
+
+Constant that defines the specified  value.
+*/
+const TInt KKilo=1024;
+
+
+
+
+/**
+@publishedAll
+@released
+
+Constant that defines the specified  value.
+*/
+const TInt KMega=1024*1024;
+
+
+
+
+/**
+@publishedAll
+@released
+
+Client/Server Session types.
+*/
+enum TIpcSessionType
+	{
+	/**
+	The session is not sharable with other threads.
+	*/
+	EIpcSession_Unsharable=0,
+
+	/**
+	The session is sharable with other threads in the same process.
+	*/
+	EIpcSession_Sharable=1,
+
+	/**
+	The session is sharable with all other threads in the system.
+	*/
+	EIpcSession_GlobalSharable=2
+	};
+
+
+
+
+/**
+@publishedAll
+@released
+*/
+const TInt KNullDebugPort=-2;
+
+
+/**
+A constant which represents a thread ID which will never be assigned to a thread.
+I.e. The following statement is always true; RThread::Id()!=KNullThreadId
+@publishedAll
+@released
+@see TThreadId
+*/
+const TUint KNullThreadId = 0xffffffffu;
+
+
+
+/**
+A constant which represents a process ID which will never be assigned to a process.
+I.e. The following statement is always true; RProcess::Id()!=KNullProcessId
+@publishedAll
+@released
+@see TProcessId
+*/
+const TUint KNullProcessId = 0xffffffffu;
+
+
+
+/**
+@publishedAll
+@released
+
+Hardware floating point types.
+*/
+enum TFloatingPointType
+	{
+	/** No hardware floating point. */
+	EFpTypeNone=0,
+	/** ARM VFPv2 */
+	EFpTypeVFPv2=1,
+	/** ARM VFPv3 */
+	EFpTypeVFPv3=2
+	};
+
+
+
+/**
+@publishedAll
+@released
+
+Hardware floating point execution modes.
+*/
+enum TFloatingPointMode
+	{
+	/**
+	Run in the fastest mode available - results of calculations may not be
+	exactly as the IEEE standard in some cases. On ARM VFPv2 hardware this
+	corresponds to RunFast mode.
+	*/
+	EFpModeRunFast=0,
+
+	/**
+	Perform all calculations as specified in the IEEE standard, but do not
+	generate floating point exceptions. This is compatible with the Java
+	floating point model. This is the default.
+	*/
+	EFpModeIEEENoExceptions=1
+	};
+
+
+
+
+/**
+@publishedAll
+@released
+
+Hardware floating point rounding modes.
+*/
+enum TFloatingPointRoundingMode
+	{
+	/**
+	Round to the nearest value. This is the default.
+	*/
+	EFpRoundToNearest=0,
+
+	/**
+	Round toward positive infinity.
+	*/
+	EFpRoundToPlusInfinity=1,
+
+	/**
+	Round toward negative infinity.
+	*/
+	EFpRoundToMinusInfinity=2,
+
+	/**
+	Round toward zero.
+	*/
+	EFpRoundToZero=3,
+
+	/**
+	@internalComponent
+	*/
+	EFpRoundNumModes=4
+	};
+
+
+
+#include <e32capability.h>
+
+#ifndef SYMBIAN_ENABLE_SPLIT_HEADERS
+#include <e32const_private.h>
+#endif
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32/include/e32const_private.h	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,43 @@
+// Copyright (c) 1994-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32\include\e32const_private.h
+// 
+//
+
+/**
+ @file
+ @internalTechnology
+ @released
+*/
+
+#ifndef __E32CONST_PRIVATE_H__
+#define __E32CONST_PRIVATE_H__
+
+/**
+@publishedPartner
+@released
+*/
+const TText KProtectedServerNamePrefix = '!';
+
+/**
+@internalTechnology
+*/
+const TUint32 KModuleVersionWild=0xfffffffeu;
+
+/**
+@internalTechnology
+*/
+const TUint32 KModuleVersionNull=0xffffffffu;
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32/include/e32debug.h	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,51 @@
+// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32\include\e32debug.h
+// 
+//
+
+#ifndef __E32DEBUG_H__
+#define __E32DEBUG_H__
+#include <e32std.h>			// TThreadId
+
+/**	@publishedPartner
+	@removed
+*/
+const TInt KMaxProfiles=64;
+
+/**	@publishedPartner
+	@removed
+*/
+class TProfile
+    {
+public:
+    TInt iTime;
+    TInt iCount;
+    };
+//
+
+/**	@publishedPartner
+	@released
+*/
+class RDebug
+	{
+public:
+    IMPORT_C static void Printf(const char*, ...);
+    IMPORT_C static void RawPrint(const TDesC8& aDes);
+    IMPORT_C static TInt Print(TRefByValue<const TDesC> aFmt,...);
+    IMPORT_C static void RawPrint(const TDesC16& aDes);
+	};
+
+#endif
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32/include/e32def.h	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,2636 @@
+/*
+* Copyright (c) 1994-2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Symbian Foundation License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+* e32\include\e32def.h
+* NOTE: THIS FILE SHOULD BE ACCEPTABLE TO A C COMPILER
+* 
+*
+*/
+
+
+
+#ifndef __E32DEF_H__
+#define __E32DEF_H__
+
+/*
+ * __LEAVE_EQUALS_THROW__ requires the compiler to support C++ exceptions
+ */
+#ifndef __SUPPORT_CPP_EXCEPTIONS__
+#undef __LEAVE_EQUALS_THROW__
+#endif
+
+
+#if defined(__VC32__)
+/**
+@publishedAll
+@released
+*/
+#define __NO_CLASS_CONSTS__
+#if (_MSC_VER >= 1200)
+/**
+@publishedAll
+@released
+*/
+#define __NORETURN__ __declspec(noreturn)
+#else
+#define __NORETURN__
+#endif
+/**
+@publishedAll
+@released
+*/
+#define __NORETURN_TERMINATOR()
+/**
+@publishedAll
+@released
+*/
+#define IMPORT_C __declspec(dllexport)
+/**
+@publishedAll
+@released
+*/
+#define EXPORT_C __declspec(dllexport)
+/**
+@publishedAll
+@released
+*/
+#define IMPORT_D __declspec(dllexport)
+/**
+@publishedAll
+@released
+*/
+#define EXPORT_D __declspec(dllexport)
+/**
+@publishedAll
+@released
+*/
+#define NONSHARABLE_CLASS(x) class x
+/**
+@publishedAll
+@released
+*/
+#define NONSHARABLE_STRUCT(x) struct x
+/**
+@publishedAll
+@released
+*/
+#define __NO_THROW throw()
+/**
+@publishedAll
+@released
+*/
+#define __THROW(t) throw(t)
+#pragma warning( disable : 4355 )	/* 'this' used in base member initializer list */
+#pragma warning( disable : 4511 )	/* copy constructor could not be generated */
+#pragma warning( disable : 4512 )	/* assignment operator could not be generated */
+#pragma warning( disable : 4514 )	/* unreferenced inline function has been removed */
+#pragma warning( disable : 4699 )	/* Note: Using precompiled header %s */
+#pragma warning( disable : 4710 )	/* function not inlined */
+#pragma warning( disable : 4121 )	/* alignment sensitive to packing */
+#pragma warning( disable : 4273 )
+#pragma warning( disable : 4097 )	/* typedef-name 'identifier1' used as synonym for class-name 'identifier2' */
+#pragma warning( disable : 4291 )	/* 'TAny *CBase::operator new(TUint,TLeave)' : no matching operator delete found; memory will not be freed if initialization throws an exception */
+
+#if _MSC_VER  >= 1100
+/**
+@publishedAll
+@released
+*/
+#define TEMPLATE_SPECIALIZATION template<>
+#else
+#define TEMPLATE_SPECIALIZATION
+#endif
+#endif
+
+
+
+#if defined(__CW32__)
+#undef __embedded_cplusplus
+/** @internalTechnology */
+#define __embedded_cplusplus	1
+#define __NO_CLASS_CONSTS__
+#define __NORETURN__
+#define __NORETURN_TERMINATOR()
+#define IMPORT_C __declspec(dllexport)
+#define EXPORT_C __declspec(dllexport)
+#define IMPORT_D __declspec(dllexport)
+#define EXPORT_D __declspec(dllexport)
+#define NONSHARABLE_CLASS(x) class x
+#define NONSHARABLE_STRUCT(x) struct x
+#define __NO_THROW throw()
+#define __THROW(t) throw(t)
+
+#define TEMPLATE_SPECIALIZATION template<>
+/**
+@publishedAll
+@released
+*/
+#define _asm	asm
+#ifndef __int64
+#pragma longlong on
+/** @internalTechnology */
+#define __int64  long long
+#endif
+#ifndef __SUPPORT_CPP_EXCEPTIONS__
+#pragma exceptions off    /* no support for C++ exception handling */
+#pragma RTTI off          /* no support for C++ runtime type information */
+#endif
+#if __MWERKS__ >= 0x3200
+#pragma warning off (10480)	/* deleteing void pointer is undefined */
+#pragma warning off (10350) /* N pad byte(s) inserted after data member */
+#endif
+#endif
+
+
+//
+// GCC (ARM) compiler
+//
+#if defined(__GCC32__) && defined(__MARM__)
+#ifndef __GNUC__		/* GCC98r2 doesn't define this for some reason */
+#define __GNUC__	2
+#endif
+#define __NO_CLASS_CONSTS__
+#define __NORETURN__  __attribute__ ((noreturn))
+#ifdef __GCCV3__
+#define __NORETURN_TERMINATOR()
+#else
+#define __NORETURN_TERMINATOR()		abort()
+#endif
+#define IMPORT_C
+#define IMPORT_D
+#if !defined __WINS__ && defined _WIN32 /* VC++ Browser Hack */
+#define EXPORT_C
+#define EXPORT_D
+/** @internalTechnology */
+#define asm(x)
+#else
+#define EXPORT_C __declspec(dllexport)
+#define EXPORT_D __declspec(dllexport)
+#endif
+#define NONSHARABLE_CLASS(x) class x
+#define NONSHARABLE_STRUCT(x) struct x
+#define __NO_THROW
+#define __THROW(t)
+#ifdef __EABI__
+#define TEMPLATE_SPECIALIZATION template<>
+#else
+#define TEMPLATE_SPECIALIZATION
+#endif
+/**
+@publishedAll
+@released
+*/
+#define __DOUBLE_WORDS_SWAPPED__
+#endif
+
+
+/** @internalTechnology */
+#define __NO_MUTABLE_KEYWORD
+#if defined(__NO_MUTABLE_KEYWORD)
+/**
+@publishedAll
+@deprecated
+*/
+#define __MUTABLE
+#else
+#define __MUTABLE mutable
+#endif
+
+
+
+/**
+@publishedAll
+@deprecated
+*/
+#define CONST_CAST(type,exp) (const_cast<type>(exp))
+
+/**
+@publishedAll
+@deprecated
+*/
+#define STATIC_CAST(type,exp) (static_cast<type>(exp))
+
+/**
+@publishedAll
+@deprecated
+*/
+#define REINTERPRET_CAST(type,exp) (reinterpret_cast<type>(exp))
+
+#if defined(__NO_MUTABLE_KEYWORD)
+/**
+@publishedAll
+@deprecated
+*/
+#define MUTABLE_CAST(type,exp) (const_cast<type>(exp))
+#else
+#define MUTABLE_CAST(type,exp) (exp)
+#endif
+
+/**
+@publishedAll
+@deprecated
+*/
+#define GLREF_D extern
+/**
+@publishedAll
+@deprecated
+*/
+#define GLDEF_D
+/**
+@publishedAll
+@deprecated
+*/
+#define LOCAL_D static
+/**
+@publishedAll
+@deprecated
+*/
+#define GLREF_C extern
+/**
+@publishedAll
+@deprecated
+*/
+#define GLDEF_C
+/**
+@publishedAll
+@deprecated
+*/
+#define LOCAL_C static
+/**
+@internalAll
+@prototype
+*/
+#ifndef IMPORT_D
+#define IMPORT_D IMPORT_C 
+#endif
+
+/**
+@publishedAll
+@deprecated
+*/
+#define FOREVER for(;;)
+
+
+
+
+/**
+@publishedAll
+@released
+
+Symbolic definition for a true value.
+*/
+#define TRUE 1
+
+
+
+
+/**
+@publishedAll
+@released
+
+Symbolic definition for a false value.
+*/
+#define FALSE 0
+#ifndef NULL
+
+
+
+
+/**
+@publishedAll
+@released
+
+Symbolic definition for a NULL value.
+*/
+#define NULL 0
+#endif
+
+
+
+
+#ifndef VA_START
+/**
+@publishedAll
+@released
+
+A macro used by Symbian OS code for handling a variable argument list
+in a function call.
+
+Sets a pointer to point to the first of the variable arguments.
+
+Typical usage:
+
+@code
+Foo(CAbcdef aAbcdef,...)
+   {
+   VA_LIST list;
+   VA_START(list, aAbcdef);
+   // other code
+   } 
+@endcode
+
+@param ap   A pointer used to hold the address of an argument in
+            the variable argument list. After execution of the code generated 
+            by this macro, the pointer points to the first argument in
+            the variable argument list.
+            This symbol is usually declared as a VA_LIST type. 
+
+@param pn   The argument that immediately precedes the variable argument list.
+
+@see VA_LIST
+@see VA_ARG
+*/
+#define VA_START(ap,pn) ((ap)[0]=(TInt8 *)&pn+((sizeof(pn)+sizeof(TInt)-1)&~(sizeof(TInt)-1)),(void)0)
+#endif
+
+
+
+
+#ifndef VA_ARG
+/**
+@publishedAll
+@released
+
+A macro used by Symbian OS code for handling a variable argument list
+in a function call.
+
+Increments a pointer to a variable argument list to point to the next argument
+in the list. The current argument is assumed to be of a type defined by
+the second parameter to this macro.
+
+Typical usage:
+
+@code
+Foo(CAbcdef aAbcdef,...)
+   {
+   VA_LIST list;
+   VA_START(list, aAbcdef);
+   ...
+   TInt x = VA_ARG(list,TInt);
+   ...
+   const TDesC *pS=VA_ARG(aList,const TDesC*);
+   ... 
+   etc
+   } 
+@endcode
+
+@param ap   A pointer used to hold the address of an argument in
+            the variable argument list. It is assumed to point to the current
+            argument in the variable argument list. After execution of the code
+            generated by this macro, the pointer points to the next argument in
+            the list. This symbol is usually declared as a VA_LIST type. 
+
+@param type The type of the current argument.
+            This can be any valid type, for example, TInt, const TDesC*, etc.
+            
+@see VA_LIST
+@see VA_START            
+*/
+#define VA_ARG(ap,type) ((ap)[0]+=((sizeof(type)+sizeof(TInt)-1)&~(sizeof(TInt)-1)),(*(type *)((ap)[0]-((sizeof(type)+sizeof(TInt)-1)&~(sizeof(TInt)-1)))))
+#endif
+
+
+
+
+#ifndef VA_END
+/**
+@publishedAll
+@released
+
+A macro used by Symbian OS code for handling a variable argument list
+in a function call.
+
+Sets a pointer to zero.
+
+@param ap   A pointer used to hold the address of an argument in
+            the variable argument list. After execution of the code generated 
+            by this macro, the pointer is reset to 0.
+            This symbol is usually declared as a VA_LIST type. 
+            
+@see VA_LIST
+@see VA_START
+@see VA_ARG            
+*/
+#define VA_END(ap) ((ap)[0]=0,(void)0)
+#endif
+	
+
+
+/**
+@publishedAll
+@released
+
+Calculates the offset of member f within class c.
+
+This is used in the TSglQue and TDblQue constructors to set the offset of
+the link object from the start of a list element.
+
+@param c The name of the class.
+@param f The name of the member within the specified class.
+
+@see TSglQue
+@see TDblQue
+*/
+#ifndef _FOFF
+#if __GNUC__ < 4
+#define _FOFF(c,f)			(((TInt)&(((c *)0x1000)->f))-0x1000)
+#else
+#define _FOFF(c,f)			__builtin_offsetof(c,f)
+#endif
+#endif
+
+
+
+/**
+@internalTechnology
+@released
+*/
+#define _ALIGN_DOWN(x,a)	((x)&~((a)-1))
+/**
+@internalTechnology
+@released
+*/
+#define _ALIGN_UP(x,a)		_ALIGN_DOWN((x)+(a)-1, a)
+
+
+
+
+/** 
+@publishedAll
+@released
+
+Pointer to any type.
+
+TAny* is equivalent to void* in standard C or C++. TAny* is used in preference 
+to void* because it is more suggestive of the actual meaning,
+e.g. TAny* foo();.
+
+TAny is not used where it really means "nothing", as in the declaration of 
+functions which do not return a value; void is used instead, e.g. void Foo();.
+*/
+typedef void TAny;
+
+
+
+
+/**
+@publishedAll
+@released
+
+8-bit signed integer type, used in Symbian OS to mean an 8-bit
+signed integer, independent of the implementation.
+*/
+typedef signed char TInt8;
+
+
+
+
+/**
+@publishedAll
+@released
+
+8-bit unsigned integer type; used in Symbian OS to mean an 8-bit
+unsigned integer, independent of the implementation.
+*/
+typedef unsigned char TUint8;
+
+
+
+
+/**
+@publishedAll
+@released
+
+16-bit signed integer type, used in Symbian OS to mean a 16-bit
+signed integer, independent of the implementation.
+*/
+typedef short int TInt16;
+
+
+
+
+/**
+@publishedAll
+@released
+
+16-bit unsigned integer type. used in Symbian OS to mean a 16-bit
+unsigned integer, independent of the implementation.
+*/
+typedef unsigned short int TUint16;
+
+
+
+
+/**
+@publishedAll
+@released
+
+32-bit signed integer type, used in Symbian OS to mean a 32-bit
+signed integer, independent of the implementation.
+*/
+typedef long int TInt32;
+
+
+
+
+/**
+@publishedAll
+@released
+
+A signed integer type of the same size as a pointer.
+*/
+typedef TInt32 T_IntPtr;
+typedef TInt32 TIntPtr;
+
+
+
+
+/**
+@publishedAll
+@released
+
+32-bit unsigned integer type; used in Symbian OS to mean a 32-bit
+unsigned integer, independent of the implementation.
+*/
+typedef unsigned long int TUint32;
+
+
+
+
+/**
+@publishedAll
+@released
+
+An unsigned integer type of the same size as a pointer.
+*/
+typedef TUint32 T_UintPtr;
+typedef TUint32 TUintPtr;
+
+
+
+
+/**
+@publishedAll
+@released
+
+Signed integer type of the natural machine word length.
+
+This is as defined by the C++ implementation's int type. In all
+implementations, this is guaranteed to be at least 32 bits.
+
+A TInt should be used in preference to a sized integer (TInt32, TInt16) for 
+all general use. Sized integers should only be used when packing is essential. 
+C++'s type conversion rules imply that all sized integers smaller than the 
+natural machine word are in any case broadened to the natural machine word 
+size when passed as function parameters.
+
+A TInt should be used in preference to an unsigned integer (TUint) for all 
+general use. Unsigned integers should only be used for flags (which use Boolean 
+operations but not arithmetic) and, in very rare cases, for numbers whose 
+range exceeds that available from signed integers. Although it is natural 
+to attempt to use unsigned integers for quantities which cannot by nature 
+be negative, the C++ language does not provide the support necessary to enforce 
+the "expected" behaviour in these circumstances, and experience has shown 
+that it is better to use signed integers unless there is good reason not to.
+
+@see TUint
+@see TInt32
+@see TInt16
+*/
+typedef signed int TInt;
+
+
+
+
+/**
+@publishedAll
+@released
+
+Unsigned integer type of the natural machine word length. 
+
+This is guaranteed to be at least 32 bits in all implementations.
+
+In almost all circumstances, a TInt should be used in preference to a TUint. 
+The main exception is in flags bytes.
+
+@see TInt
+*/
+typedef unsigned int TUint;
+
+
+
+
+/**
+@publishedAll
+@released
+
+32-bit floating point number, providing IEEE754 single precision on all Symbian 
+OS implementations.
+
+TReal should normally be used in preference to TReal32.
+
+Use of floating-point numbers should generally be avoided unless a natural 
+part of the problem specification. Most Symbian OS implementations do not 
+have a hardware floating point unit: as a result, their floating-point performance 
+is hundreds of times slower than integer performance.
+*/
+typedef float TReal32;
+
+
+
+
+/**
+@publishedAll
+@released
+
+64-bit floating point number, providing IEEE754 double precision on all Symbian 
+OS implementations.
+
+Use of floating-point numbers should generally be avoided unless a natural 
+part of the problem specification. Most Symbian OS implementations do not 
+have a hardware floating point unit: as a result, their floating-point performance 
+is hundreds of times slower than integer performance.
+
+This type is identical to TReal.
+
+@see TReal
+*/
+typedef double TReal64;
+
+
+
+
+/**
+@publishedAll
+@released
+
+64-bit floating point number; identical to TReal64.
+
+Use of floating-point numbers should generally be avoided unless a natural 
+part of the problem specification. Most Symbian OS implementations do not 
+have a hardware floating point unit: as a result, their floating-point performance 
+is hundreds of times slower than integer performance.
+
+Most serious floating-point calculations require double-precision. All standard 
+math functions (see Math class) take double-precision arguments. Single-precision 
+should only be used where space and performance are at a premium, and when 
+their limited precision is acceptable.
+
+@see TReal64
+@see Math
+*/
+typedef double TReal;
+
+
+
+
+/**
+@publishedAll
+@released
+
+8-bit unsigned character.
+
+Use instead of C++ built-in char type because it is guaranteed to be unsigned. 
+Use instead of TInt8 where the application is really for text rather than 
+8-bit arithmetic or binary quantities.
+
+For most purposes, you should use TText rather than TText8. TText is mapped 
+onto either TText8 or TText16 depending on whether a non-Unicode or Unicode 
+variant is being built. Use TText8 only when you are dealing explicitly with 
+8-bit text, regardless of build.
+
+@see TText */
+typedef unsigned char TText8;
+
+
+
+
+/**
+@publishedAll
+@released
+
+16-bit unsigned character.
+
+Use instead of C++ wchar_t type because it is guaranteed to be unsigned. Use 
+instead of TInt16 where the application is really for text rather than 8-bit 
+arithmetic or binary quantities.
+
+For most purposes, you should use TText rather than TText16. TText is mapped 
+onto either TText8 or TText16 depending on whether a non-Unicode or Unicode 
+variant is being built. Use TText16 only when you are dealing explicitly with 
+16-bit text, regardless of build.
+
+@see TText
+*/
+typedef unsigned short int TText16;
+
+
+
+
+/**
+@publishedAll
+@released
+
+Boolean type which takes the value either ETrue or EFalse.
+
+Although only a single bit would theoretically be necessary to represent a 
+Boolean, a machine word is used instead, so that these quantities can be easily 
+passed. Also, TBool must map onto int because of C++'s interpretation of 
+operands in conditional expressions.
+
+On implementations of Symbian OS in which the compiler supports the ANSI-recommended 
+bool type, TBool will be typedef'ed to bool instead of int.
+*/
+typedef int TBool;
+
+
+
+
+/**
+@publishedPartner
+@released
+
+Defines a linear (virtual) address type.
+*/
+typedef T_UintPtr TLinAddr;
+
+
+
+#if defined(__GCC32__)
+
+
+
+
+/**
+@publishedAll
+@released
+
+Defines a 64-bit signed integer type.
+*/
+typedef long long Int64;
+
+
+
+
+/**
+@publishedAll
+@released
+
+Defines a 64-bit unsigned integer type.
+*/
+typedef unsigned long long Uint64;
+
+
+
+
+/**
+@publishedAll
+@released
+*/
+#define	I64LIT(x)	x##LL
+/**
+@publishedAll
+@released
+*/
+#define	UI64LIT(x)	x##ULL
+
+#elif defined(__VC32__)
+typedef __int64 Int64;
+typedef unsigned __int64 Uint64;
+#define	I64LIT(x)	(__int64)##x
+#define	UI64LIT(x)	(unsigned __int64)##x
+
+#elif defined(__CW32__)
+#pragma longlong on
+typedef long long Int64;
+typedef unsigned long long Uint64;
+#define	I64LIT(x)	x##LL
+#define	UI64LIT(x)	x##ULL
+#endif
+
+
+
+
+/**
+@publishedAll
+@released
+
+Defines a 64-bit signed integer type.
+
+NOTE: For those migrating from versions of Symbian OS before 8.1b (i.e. 8.1a, 7.0s etc)
+TInt64 is now defined as a built-in type instead of as a class type. This means
+that the member functions of the old TInt64 class are no longer exported
+from EUSER.LIB, and represents a compatibility break.
+
+To ease migration of source code, a number of macros are provided. Similar
+macros have also been defined in Symbian OS versions 7.0s and 8.1a, but
+implemented in terms of the old TInt64 class. This is important for code that
+is common to : one or both of these Symbian OS versions, and to 8.1b and
+subsequent versions.
+
+The following list shows the new macros and the functions that they replace.
+It also shows some alternative techniques.
+In this list: x, v and r are declared as TInt64, c is declared as TInt, High
+and Low are declared as TUint.
+
+@code
+OLD USAGE						REPLACEMENT
+
+TInt64(High,Low);				MAKE_TINT64(High,Low);
+x.Set(High,Low);				MAKE_TINT64(High,Low);
+x.Low();						I64LOW(x);
+x.High();						I64HIGH(x); 
+x.GetTInt();					I64INT(x); 
+x.GetTReal();					I64REAL(x); 
+x.Lsr(c);						I64LSR(x,c); 
+x.Mul10();						x*=10; 
+x.MulTop(a);					I64MULTOP(x,a); 
+x.DivMod(v,r);					r=x%v; x/=v;
+@endcode 
+*/
+typedef	Int64	TInt64;
+
+
+
+
+/**
+@publishedAll
+@released
+ 
+Defines a 64-bit unsigned integer type.
+*/
+typedef	Uint64	TUint64;
+
+
+
+
+/** @internalComponent */
+#define _MAKE_TINT64_ZX(x)	((TInt64)((TUint32)(x)))
+
+/** @internalComponent */
+#define _MAKE_TUINT64_ZX(x)	((TUint64)((TUint32)(x)))
+
+
+
+
+/**
+@publishedAll
+@released
+*/
+#define MAKE_TINT64(h,l)	( (_MAKE_TINT64_ZX(h)<<32) | _MAKE_TINT64_ZX(l) )
+
+
+
+
+/**
+@publishedAll
+@released
+*/
+#define MAKE_TUINT64(h,l)	( (_MAKE_TUINT64_ZX(h)<<32) | _MAKE_TUINT64_ZX(l) )
+
+
+
+
+/**
+@publishedAll
+@released
+
+Generates code to access the high order 32 bits of a 64 bit number.
+*/
+#define	I64HIGH(x)			( (TUint32)((x)>>32) )
+
+
+
+
+/**
+@publishedAll
+@released
+
+Generates code to access the low order 32 bits of a 64 bit number.
+*/
+#define	I64LOW(x)			( (TUint32)(x) )
+
+
+
+
+/**
+@publishedAll
+@released
+
+Generates code to cast a 64 bit value as an signed integer.
+*/
+#define	I64INT(x)			( (TInt)(x) )
+
+
+
+
+/**
+@publishedAll
+@released
+
+Generates code to cast a 64 bit value as a TReal type.
+*/
+#define	I64REAL(x)			( (TReal)(x) )
+
+
+
+
+/**
+@publishedAll
+@released
+
+Generates code to logically shift a 64 bit integer right.
+*/
+#define	I64LSR(x, shift)	( *reinterpret_cast<TUint64*>(&(x)) >>= (shift) )
+
+
+
+/**
+@publishedAll
+@released
+
+Generates code to multiply a 64 bit integer by 10.
+*/
+#define	I64MUL10(x)			( (x) *= 10 )
+
+
+
+/**
+@publishedAll
+@released
+
+Generates code to divide a 64 bit integer by another and find the remainder.
+*/
+#define	I64DIVMOD(x, divisor, remainder)	( ((remainder) = (x) % (divisor), (x) /= (divisor)) )
+
+
+
+
+/**
+@publishedAll
+@released
+
+Generates code to cast a double to a 64 bit integer.
+*/
+#define	I64DOUBLECAST(x)	( static_cast<TInt64>(x) )
+
+
+
+
+/**
+@publishedAll
+@deprecated Use _LIT8 instead.
+
+8-bit literal.
+
+The macro defines an explicit 8-bit constant literal which is suitable
+for non-Unicode literal text, regardless of the build.
+
+@see _L
+@see _LIT8
+@see _LIT
+*/
+#define _L8(a) (TPtrC8((const TText8 *)(a)))
+
+
+
+
+/**
+@publishedAll
+@released
+
+Defines an explicit 8-bit string which is suitable when non-Unicode text
+is required, regardless of the build.
+
+This is used by the deprecated literal descriptor _L8.
+*/
+#define _S8(a) ((const TText8 *)a)
+
+
+
+
+/**
+@publishedAll
+@released
+
+Constructs a constant literal descriptor of type TLitC8<TInt> with
+the specified name and text.
+
+The 8-bit build variant is generated for both non-Unicode and Unicode builds.
+
+@param name The name of the C++ variable to be generated.
+@param s    The literal text enclosed within a pair of double quotes. 
+
+@see _LIT
+*/
+#define _LIT8(name,s) const static TLitC8<sizeof(s)> name={sizeof(s)-1,s}
+
+
+
+
+/**
+@publishedAll
+@deprecated Use _LIT16 instead.
+
+16-bit literal.
+
+The macro defines an explicit 16-bit constant literal which is suitable
+for Unicode literal text, regardless of the build.
+
+@see _L
+@see _LIT16
+@see _LIT
+*/
+#define _L16(a) (TPtrC16((const TText16 *)L ## a))
+
+
+
+/**
+@publishedAll
+@released
+
+Defines an explicit 16-bit string which is suitable when Unicode text
+is required, regardless of the build.
+
+This is used by the deprecated literal descriptor _L16.
+*/
+#define _S16(a) ((const TText16 *)L ## a)
+
+
+
+
+/**
+@publishedAll
+@released
+
+Constructs a constant literal descriptor of type TLitC16<TInt> with
+the specified name and text.
+
+The 16-bit build variant is generated for both non-Unicode and Unicode builds.
+
+@param name The name of the C++ variable to be generated.
+@param s    The literal text enclosed within a pair of double quotes. 
+
+@see _LIT
+*/
+#define _LIT16(name,s) const static TLitC16<sizeof(L##s)/2> name={sizeof(L##s)/2-1,L##s}
+
+
+
+
+#if defined(_UNICODE) && !defined(__KERNEL_MODE__)
+/**
+@publishedAll
+@released
+
+Build independent general text character.
+
+In non-Unicode builds, this is mapped to TText8. In Unicode builds, this is 
+mapped to TText16. Use the classes with explicit width only when you wish 
+the width to be independent of the build variant.
+
+Use this class rather than TChar for general use.
+*/
+typedef TText16 TText;
+
+
+
+/**
+@publishedAll
+@deprecated Use _LIT instead.
+
+Build independent literal. 
+
+The macro defines either an 8-bit constant literal (for non-Unicode text),
+or a 16-bit constant literal (for Unicode text) depending on the build.
+
+@see _LIT
+@see _L16
+@see _L8
+*/
+#define _L(a) (TPtrC((const TText *)L ## a))
+
+
+
+
+/**
+@publishedAll
+@released
+
+Defines either an 8-bit string (for non-Unicode text),
+or a 16-bit string (for Unicode text) depending on the build.
+
+This is used by the deprecated build independent literal _L.
+*/
+#define _S(a) ((const TText *)L ## a)
+
+
+
+
+/**
+@publishedAll
+@released
+
+Constructs a build independent constant literal descriptor of type TLitC<TInt>
+with the specified name and text.
+
+An 8-bit build variant is generated for a non-Unicode build;
+A 16-bit build variant is generated for a Unicode build.
+
+@param name The name of the C++ variable to be generated.
+@param s    The literal text enclosed within a pair of double quotes. 
+
+@see _LIT16
+@see _LIT8
+*/
+#define _LIT(name,s) const static TLitC<sizeof(L##s)/2> name={sizeof(L##s)/2-1,L##s}
+
+
+
+
+#else
+/**
+@publishedAll
+@released
+
+Build independent general text character.
+
+In non-Unicode builds, this is mapped to TText8. In Unicode builds, this is 
+mapped to TText16. Use the classes with explicit width only when you wish 
+the width to be independent of the build variant.
+
+Use this class rather than TChar for general use.
+*/
+typedef TText8 TText;
+
+
+
+/**
+@publishedAll
+@released
+
+@deprecated Use _LIT instead.
+
+Build independent literal. 
+
+The macro defines either an 8-bit constant literal (for non-Unicode text),
+or a 16-bit constant literal (for Unicode text) depending on the build.
+
+@see _LIT
+@see _L16
+@see _L8
+*/
+#define _L(a) (TPtrC((const TText *)(a)))
+
+
+
+
+/**
+@publishedAll
+@released
+
+Defines either an 8-bit string (for non-Unicode text),
+or a 16-bit string (for Unicode text) depending on the build.
+
+This is used by the deprecated build independent literal _L.
+*/
+#define _S(a) ((const TText *)a)
+
+
+
+
+/**
+@publishedAll
+@released
+
+Constructs a build independent constant literal descriptor of type TLitC<TInt>
+with the specified name and text.
+
+An 8-bit build variant is generated for a non-Unicode build;
+A 16-bit build variant is generated for a Unicode build.
+
+@param name The name of the C++ variable to be generated.
+@param s    The literal text enclosed within a pair of double quotes. 
+
+@see _LIT16
+@see _LIT8
+*/
+#define _LIT(name,s) const static TLitC<sizeof(s)> name={sizeof(s)-1,s}
+#endif
+
+
+
+
+#ifndef __VA_LIST_defined
+/** 
+@publishedAll
+@released
+
+Defines a 'C' style array of pointers to TInt8 types.
+
+The type is most commonly used by code that needs to deal with a variable
+number of arguments passed to a function.
+
+@see TInt8
+*/
+typedef TInt8 *VA_LIST[1];
+#endif
+
+/** 
+@publishedAll
+@released
+
+Asserts that a condition is true.
+
+Code is generated for all builds.
+
+This macro is used as a C++ statement to assert the truth of some condition,
+and to take appropriate action if the condition is false. Unlike __ASSERT_DEBUG
+it is defined in both release and debug builds.
+
+The most common use for this macro is to check that the external environment of
+a function or class is behaving as expected; for example, that parameters
+passed to a function are credible, or that called functions are behaving as
+expected; the macro is commonly placed at the beginning of a function.
+
+The effect of the macro is to generate code which tests
+the conditional expression c; if the expression is false, then
+function p is called. In the majority of cases, the function p is one that
+raises a panic.
+
+Note that the macro definition is, in effect, equivalent to: 
+
+@code
+if !(c)p;
+@endcode
+
+@param c a conditional expression which results in true or false.
+@param p a function which is called if the conditional expression c is false.
+
+@see __ASSERT_DEBUG
+*/
+#define __ASSERT_ALWAYS(c,p) (void)((c)||(p,0))
+
+
+
+#ifdef __WINS__
+#ifdef __CW32__
+/** 
+@internalAll
+@released
+*/
+#define __BREAKPOINT()			\
+	{							\
+	__asm { byte 0xcc };		\
+	}
+#else // !__CW32__
+/** 
+@internalAll
+@released
+*/
+#define __BREAKPOINT()			\
+	{							\
+	__asm { int 3 };			\
+	}
+#endif //__CW32__
+#else
+/** 
+@internalAll
+@released
+*/
+#define __BREAKPOINT()
+#endif
+
+#if defined(_DEBUG)
+
+
+/** 
+@publishedAll
+@released
+
+Asserts that a condition is true.
+
+Code is generated for debug builds only.
+
+This macro is used as a C++ statement to assert the truth of some condition,
+and to take appropriate action if the condition is false. It is used in
+the same way as __ASSERT_ALWAYS, except that it is only defined for debug builds.
+
+The macro may be used to insert extra checks at various points in source code
+as desired; the code will only be generated in debug builds and not in release
+builds.
+
+@param c A conditional expression which results in true or false.
+@param p A function which is called if the conditional expression c is false.
+
+@see __ASSERT_ALWAYS
+*/
+#define __ASSERT_DEBUG(c,p) (void)((c)||(p,0))
+
+
+
+/** 
+@internalAll
+@removed
+*/
+#define __DECLARE_NAME(t)
+
+
+
+
+/** 
+@publishedAll
+@released
+
+Calls the function for testing object invariance.
+
+Classes can define a standard member function __DbgTestInvariant(),
+which checks that the object is in a valid state, and panics if it is not.
+In debug builds, this macro simply expands to call that function. For details on how
+to define __DbgTestInvariant(), and an example of its use, see __DECLARE_TEST.
+
+The macro is typically invoked at the beginning of all the member functions of
+the class. For non-const functions (those which can change the object’s state),
+you can ensure that the object has been left in a stable state by invoking
+the macro at the end of the function.
+
+In release builds, no code is generated for the macro. 
+*/
+#define __TEST_INVARIANT __DbgTestInvariant()
+
+
+
+
+/**
+@publishedAll
+@released
+
+Marks the start of checking the current thread's heap. 
+
+This macro is defined only for debug builds.
+
+This macro must be matched by a corresponding call to __UHEAP_MARKEND or __UHEAP_MARKENDC.
+
+Calls to this macro can be nested but each call must be matched by corresponding 
+call to __UHEAP_MARKEND or __UHEAP_MARKENDC.
+
+@see User::__DbgMarkStart()
+@see __UHEAP_MARKEND
+@see __UHEAP_MARKENDC
+*/
+#define __UHEAP_MARK User::__DbgMarkStart(FALSE)
+
+
+
+
+/**
+@publishedAll
+@released
+
+Checks that the number of allocated cells at the current nested level on the 
+current thread's heap is the same as the specified value.
+
+This macro is defined only for debug builds.
+
+The macro also takes the name of the file containing this source code statement 
+and the line number of this source code statement; they are displayed as part 
+of the panic category, if the checks fail.
+
+The macro assumes that:
+
+1. the heap being checked is a user heap
+
+2. checking is being done for the number of allocated cells at the current nested 
+   level; i.e. that aCountAll is set to false
+
+3. the line number is the line number of this source code statement.
+
+4. the file name is the full path name of the file containing this source statement
+
+@param aCount The number of heap cells expected to be allocated at
+              the current nest level.
+
+@see User::__DbgMarkCheck()
+@see __KHEAP_CHECK
+*/
+#define __UHEAP_CHECK(aCount) User::__DbgMarkCheck(FALSE,FALSE,aCount,(TText8*)__FILE__,__LINE__)
+
+
+
+
+/**
+@publishedAll
+@released
+
+Checks that the total number of allocated cells on the current thread's heap 
+is the same as the specified value.
+
+This macro is defined only for debug builds.
+
+The macro also takes the name of the file containing this source code statement 
+and the line number of this source code statement; they are displayed as part 
+of the panic category, if the checks fail.
+
+@param aCount The total number of heap cells expected to be allocated.
+
+@see User::__DbgMarkCheck()
+@see __KHEAP_CHECKALL
+*/
+#define __UHEAP_CHECKALL(aCount) User::__DbgMarkCheck(FALSE,TRUE,aCount,(TText8*)__FILE__,__LINE__)
+
+
+
+
+/**
+@publishedAll
+@released
+
+Marks the end of checking the current thread's heap. 
+
+The macro expects zero heap cells to remain allocated at the current nest 
+level. This macro is defined only for debug builds.
+
+This macro must match an earlier call to __UHEAP_MARK.
+
+@see User::__DbgMarkEnd()
+@see __UHEAP_MARK
+*/
+#define __UHEAP_MARKEND User::__DbgMarkEnd(FALSE,0)
+
+
+
+
+/**
+@publishedAll
+@released
+
+Marks the end of checking the current thread's heap. 
+
+The macro expects aCount heap cells to remain allocated at the current nest 
+level.
+
+This macro must match an earlier call to __UHEAP_MARK.
+
+@param aCount The number of heap cells expected to remain allocated at
+              the current nest level.
+
+@see User::__DbgMarkEnd()
+@see __UHEAP_MARK
+*/
+#define __UHEAP_MARKENDC(aCount) User::__DbgMarkEnd(FALSE,aCount)
+
+
+
+
+/**
+@publishedAll
+@released
+
+Simulates heap allocation failure for the current thread's heap.
+
+The failure occurs on the next call to new or any of the functions which 
+allocate memory from the heap. This macro is defined only for debug builds.
+
+@param aCount Determines when the allocation will fail.
+              Heap allocation fails on attempt number aCount - later
+              allocations will succeed.
+              For example, if aCount is 3, then heap allocation fails
+              on the 3rd attempt, but all subsequent allocations succeed. 
+
+@see User::__DbgSetAllocFail()
+*/
+#define __UHEAP_FAILNEXT(aCount) User::__DbgSetAllocFail(FALSE,RAllocator::EFailNext,aCount)
+
+/**
+@publishedAll
+@released
+
+Simulates heap allocation failure for the current thread's heap.
+
+The failures will occur for aBurst times from the next call to new or any of the functions which 
+allocate memory from the heap. This macro is defined only for debug builds.
+
+@param aCount Determines when the allocation will fail.
+              Heap allocation fails on attempt number aCount - later
+              allocations will succeed.
+              For example, if aCount is 3, then heap allocation fails
+              on the 3rd attempt, but all subsequent allocations succeed.  
+              Note when used with RHeap the maximum value aCount can be set 
+              to is KMaxTUint16.
+@param aBurst The number of consecutive allocations that will fail.  Note 
+              when used with RHeap the maximum value aBurst can be set to 
+              is KMaxTUint16.
+
+@see User::__DbgSetBurstAllocFail()
+*/
+#define __UHEAP_BURSTFAILNEXT(aCount,aBurst) User::__DbgSetBurstAllocFail(FALSE,RAllocator::EBurstFailNext,aCount,aBurst)
+
+
+
+/**
+@publishedAll
+@released
+
+Simulates heap allocation failure for the current thread's heap. 
+
+The failure occurs on subsequent calls to new or any of the functions which 
+allocate memory from the heap. This macro is defined only for debug builds.
+
+@param aType  The type of failure to be simulated.
+@param aRate The failure rate.
+
+@see User::__DbgSetAllocFail()
+@see RAllocator::TAllocFail
+*/
+#define __UHEAP_SETFAIL(aType,aRate) User::__DbgSetAllocFail(FALSE, aType, aRate)
+
+/**
+@publishedAll
+@released
+
+Simulates heap allocation failure for the current thread's heap. 
+
+The failure occurs on subsequent calls to new or any of the functions which 
+allocate memory from the heap. This macro is defined only for debug builds.
+
+@param aType  The type of failure to be simulated.
+@param aRate  The failure rate.  Note when used with RHeap the maximum value 
+              aRate can be set to is KMaxTUint16.
+@param aBurst The number of consecutive allocations that will fail.    Note 
+              when used with RHeap the maximum value aBurst can be set 
+              to is KMaxTUint16.
+
+@see User::__DbgSetBurstAllocFail()
+@see RAllocator::TAllocFail
+*/
+#define __UHEAP_SETBURSTFAIL(aType,aRate,aBurst) User::__DbgSetBurstAllocFail(FALSE, aType, aRate, aBurst)
+
+
+
+/**
+@publishedAll
+@released
+
+Cancels simulated heap allocation failure for the current thread's heap. 
+
+This macro is defined only for debug builds.
+
+@see User::__DbgSetAllocFail()
+*/
+#define __UHEAP_RESET User::__DbgSetAllocFail(FALSE,RAllocator::ENone,1)
+
+
+/**
+@publishedAll
+@released
+
+Cancels simulated heap allocation failure for the current thread's heap. 
+It walks the the heap and sets the nesting level for all allocated
+cells to zero.
+
+This macro is defined only for debug builds.
+*/
+#define __UHEAP_TOTAL_RESET User::__DbgSetAllocFail(FALSE,RAllocator::EReset,1)
+
+/**
+@publishedAll
+@released
+
+Returns the number of heap allocation failures the current debug allocator fail
+function has caused so far.
+
+This is intended to only be used with fail types RAllocator::EFailNext,
+RAllocator::EBurstFailNext, RAllocator::EDeterministic and
+RAllocator::EBurstDeterministic.  The return value is unreliable for 
+all other fail types.
+
+@return The number of heap allocation failures the current debug fail 
+function has caused.
+
+@see RAllocator::TAllocFail
+*/
+#define __UHEAP_CHECKFAILURE User::__DbgCheckFailure(FALSE)
+
+/**
+@publishedAll
+@released
+
+Returns the number of kernel heap allocation failures the current debug 
+allocator fail function has caused so far.
+
+This is intended to only be used with fail types RAllocator::EFailNext,
+RAllocator::EBurstFailNext, RAllocator::EDeterministic and
+RAllocator::EBurstDeterministic.  The return value is unreliable for 
+all other fail types.
+
+@return The number of heap allocation failures the current debug fail 
+function has caused.
+
+@see RAllocator::TAllocFail
+*/
+#define __KHEAP_CHECKFAILURE User::__DbgCheckFailure(TRUE)
+
+
+
+/**
+@publishedAll
+@released
+
+Marks the start of heap checking for the specific heap. 
+
+This macro is defined only for debug builds.
+
+This macro must be matched by a corresponding call to __RHEAP_MARKEND or __RHEAP_MARKENDC.
+
+Calls to this macro can be nested but each call must be matched by corresponding 
+call to __RHEAP_MARKEND or __RHEAP_MARKENDC.
+
+@param aHeap A pointer to the specific RHeap
+
+@see RHeap
+@see RAllocator::__DbgMarkStart()
+@see __RHEAP_MARKEND
+@see __RHEAP_MARKENDC
+*/
+#define __RHEAP_MARK(aHeap) (aHeap)->__DbgMarkStart()
+
+
+
+
+/**
+@publishedAll
+@released
+
+Checks that the number of allocated cells at the current nested level on the 
+specified heap is the same as the specified value. 
+
+The macro also takes the name of the file containing this source code statement 
+and the line number of this source code statement; they are displayed as part 
+of the panic category, if the checks fail. 
+
+This macro is defined only for debug builds.
+
+@param aHeap  A pointer to the specific RHeap.
+@param aCount The number of heap cells expected to be allocated at
+              the current nest level.
+
+@see RAllocator::__DbgMarkCheck()
+*/
+#define __RHEAP_CHECK(aHeap,aCount) (aHeap)->__DbgMarkCheck(FALSE,aCount,(TText8*)__FILE__,__LINE__)
+
+
+
+
+/**
+@publishedAll
+@released
+
+Checks that the total number of allocated cells on the specified heap is the 
+same as the specified value.
+
+The macro also takes the name of the file containing this source code statement 
+and the line number of this source code statement; they are displayed as part 
+of the panic category, if the checks fail.
+
+This macro is defined only for debug builds.
+
+@param aHeap  A pointer to the specific RHeap.
+@param aCount The total number of heap cells expected to be allocated.
+
+@see RAllocator::__DbgMarkCheck()
+*/
+#define __RHEAP_CHECKALL(aHeap,aCount) (aHeap)->__DbgMarkCheck(TRUE,aCount,(TText8*)__FILE__,__LINE__)
+
+
+
+
+/**
+@publishedAll
+@released
+
+Marks the end of heap checking for the specific heap.
+
+The macro expects zero heap cells to remain allocated at the current nest 
+level. This macro is defined only for debug builds.
+
+This macro must match an earlier call to __RHEAP_MARK.
+
+@param aHeap A pointer to the specific RHeap.
+
+@see RAllocator::__DbgMarkEnd()
+@see __RHEAP_MARK
+*/
+#define __RHEAP_MARKEND(aHeap) (aHeap)->__DbgMarkEnd(0)
+
+
+
+
+/**
+@publishedAll
+@released
+
+Marks the end of heap checking for the specific heap.
+
+The macro expects aCount heap cells to remain allocated at the current nest 
+level. This macro is defined only for debug builds.
+
+This macro must match an earlier call to __RHEAP_MARK.
+
+@param aHeap  A pointer to the specific RHeap.
+@param aCount The number of heap cells expected to remain allocated at
+              the current nest level
+
+@see RAllocator::__DbgMarkEnd()
+@see __RHEAP_MARK
+*/
+#define __RHEAP_MARKENDC(aHeap,aCount) (aHeap)->__DbgMarkEnd(aCount)
+
+
+
+
+/**
+@publishedAll
+@released
+
+Simulates an allocation failure for the specific heap.
+
+The failure occurs on the next call to new or any of the functions which allocate 
+memory from the heap. This macro is defined only for debug builds.
+
+@param aHeap  A pointer to the specific RHeap.
+@param aCount The rate of failure - heap allocation fails every aCount attempt.
+
+@see RAllocator::__DbgSetAllocFail()
+*/
+#define __RHEAP_FAILNEXT(aHeap,aCount) (aHeap)->__DbgSetAllocFail(RAllocator::EFailNext,aCount)
+
+/**
+@publishedAll
+@released
+
+Simulates aBurst allocation failures for the specific heap.
+
+The failure occurs on the next call to new or any of the functions which allocate 
+memory from the heap. This macro is defined only for debug builds.
+
+@param aHeap  A pointer to the specific RHeap.
+@param aCount The heap allocation will fail after aCount-1 allocation attempts. 
+              Note when used with RHeap the maximum value aCount can be set 
+              to is KMaxTUint16.
+@param aBurst The number of consecutive allocations that will fail.  Note 
+              when used with RHeap the maximum value aBurst can be set 
+              to is KMaxTUint16.
+
+@see RAllocator::__DbgSetBurstAllocFail()
+*/
+#define __RHEAP_BURSTFAILNEXT(aHeap,aCount,aBurst) (aHeap)->__DbgSetBurstAllocFail(RAllocator::EBurstFailNext,aCount, aBurst)
+
+
+
+/**
+@publishedAll
+@released
+
+Simulates an allocation failure for the specific heap. 
+
+The failure occurs on subsequent calls to new or any of the functions which 
+allocate memory from the heap. This macro is defined only for debug builds.
+
+@param aHeap  A pointer to the specific RHeap.
+@param aType  The type of failure to be simulated. 
+@param aRate The failure rate.
+
+@see RAllocator::__DbgSetAllocFail()
+*/
+#define __RHEAP_SETFAIL(aHeap,aType,aRate) (aHeap)->__DbgSetAllocFail(aType,aRate)
+
+/**
+@publishedAll
+@released
+
+Simulates an allocation failure for the specific heap. 
+
+The failure occurs on subsequent calls to new or any of the functions which 
+allocate memory from the heap. This macro is defined only for debug builds.
+
+@param aHeap  A pointer to the specific RHeap.
+@param aType  The type of failure to be simulated. 
+@param aRate  The failure rate.  Note when used with RHeap the maximum value 
+              aRate can be set to is KMaxTUint16.
+@param aBurst The number of consecutive allocations that will fail.  Note 
+              when used with RHeap the maximum value aBurst can be set 
+              to is KMaxTUint16.
+
+@see RAllocator::__DbgSetBurstAllocFail()
+*/
+#define __RHEAP_SETBURSTFAIL(aHeap,aType,aRate,aBurst) (aHeap)->__DbgSetBurstAllocFail(aType,aRate,aBurst)
+
+
+
+/**
+@publishedAll
+@released
+
+Cancels simulated allocation failure for the specific heap.
+
+This macro is defined only for debug builds.
+
+@param aHeap A pointer to the specific RHeap.
+
+@see RAllocator::__DbgSetAllocFail()
+*/
+#define __RHEAP_RESET(aHeap) (aHeap)->__DbgSetAllocFail(RAllocator::ENone,1)
+
+
+
+/**
+@publishedAll
+@released
+
+Cancels simulated allocation failure for the specific heap.
+It walks the the heap and sets the nesting level for all allocated
+cells to zero.
+
+This macro is defined only for debug builds.
+
+@param aHeap A pointer to the specific RHeap.
+
+@see RAllocator::__DbgSetAllocFail()
+*/
+#define __RHEAP_TOTAL_RESET(aHeap) (aHeap)->__DbgSetAllocFail(RAllocator::EReset,1)
+
+/**
+@publishedAll
+@released
+
+Returns the number of heap allocation failures the current debug allocator fail
+function has caused so far.
+
+This is intended to only be used with fail types RAllocator::EFailNext,
+RAllocator::EBurstFailNext, RAllocator::EDeterministic and
+RAllocator::EBurstDeterministic.  The return value is unreliable for 
+all other fail types.
+
+@return The number of heap allocation failures the current debug fail 
+function has caused.
+
+@see RAllocator::TAllocFail
+*/
+#define __RHEAP_CHECKFAILURE(aHeap) (aHeap)->__DbgCheckFailure()
+
+
+#if defined (__WINS__) 
+
+/**
+@publishedAll
+@released
+*/
+#define __DEBUGGER() {if (User::JustInTime()) __BREAKPOINT()}
+
+#else
+#define __DEBUGGER()
+#endif
+
+
+#if defined(__DLL__)
+/**
+@publishedAll
+@released
+
+Declares a function for testing object invariance.
+
+For complex classes, it is often useful to provide a function that can
+be called to check that the object is in a valid state.
+The __DECLARE_TEST macro supplies a standard prototype for such a function
+named __DbgTestInvariant(). A companion macro __TEST_INVARIANT is provided
+to call the function.
+
+For DLLs, as opposed to EXEs, __DbgTestInvariant() is exported,
+i.e. the macro expands to:
+
+@code
+public: IMPORT_C void __DbgTestInvariant() const; void __DbgTest(TAny *aPtr) const
+@endcode
+
+This macro should placed as the last item in a class declaration (as it 
+switches back to public access). Note that a terminating semi-colon must be used.
+
+You should define the __DbgTestInvariant() function to check that the object
+is in a healthy state. If it finds an error, it should call User::Invariant(),
+which will cause a panic. 
+
+If a class is derived from a base class, then the base class __DbgTestInvariant()
+should be called first, and then any further checking done. 
+
+The second function declared, __DbgTest(), is intended to allow test code a way
+of directly accessing non-public members of a class. The function is
+implemented by any test code that requires it, rather than in the class’s own
+source code. The function is therefore not exported.
+
+__DECLARE_TEST is defined for both debug and release builds. This point is
+particularly important for DLLs, as otherwise the exported interfaces would
+differ between the build versions, giving potential binary compatibility
+problems. To avoid using memory unnecessarily in release builds, you can,
+however, use preprocessor directives to define the code within
+__DbgTestInvariant() only for debug builds. __DbgTestInvariant() is never
+called in release builds.
+
+@see __TEST_INVARIANT
+*/
+#define __DECLARE_TEST public: IMPORT_C void __DbgTestInvariant() const; void __DbgTest(TAny *aPtr) const
+#else
+#define __DECLARE_TEST public: void __DbgTestInvariant() const; void __DbgTest(TAny *aPtr) const
+#endif
+
+#else
+#define __ASSERT_DEBUG(c,p)
+#define __DECLARE_NAME(t)
+#define __TEST_INVARIANT
+#if defined(__DLL__)
+#define __DECLARE_TEST public: IMPORT_C void __DbgTestInvariant() const; void __DbgTest(TAny *aPtr) const
+#else
+#define __DECLARE_TEST public: void __DbgTestInvariant() const; void __DbgTest(TAny *aPtr) const
+#endif
+
+
+
+
+/**
+@publishedAll
+@released
+
+Marks the start of checking the current thread's heap. 
+
+This macro is defined only for debug builds.
+
+This macro must be matched by a corresponding call to __UHEAP_MARKEND or __UHEAP_MARKENDC.
+
+Calls to this macro can be nested but each call must be matched by corresponding 
+call to __UHEAP_MARKEND or __UHEAP_MARKENDC.
+
+@see User::__DbgMarkStart()
+@see __UHEAP_MARKEND
+@see __UHEAP_MARKENDC
+*/
+#define __UHEAP_MARK
+
+
+
+
+/**
+@publishedAll
+@released
+
+Checks that the number of allocated cells at the current nested level on the 
+current thread's heap is the same as the specified value.
+
+This macro is defined only for debug builds.
+
+The macro also takes the name of the file containing this source code statement 
+and the line number of this source code statement; they are displayed as part 
+of the panic category, if the checks fail.
+
+The macro assumes that:
+
+1. the heap being checked is a user heap
+
+2. checking is being done for the number of allocated cells at the current nested 
+   level; i.e. that aCountAll is set to false
+
+3. the line number is the line number of this source code statement.
+
+4. the file name is the full path name of the file containing this source statement
+
+@param aCount The number of heap cells expected to be allocated at
+              the current nest level.
+
+@see User::__DbgMarkCheck()
+@see __KHEAP_CHECK
+*/
+#define __UHEAP_CHECK(aCount)
+
+
+
+
+/**
+@publishedAll
+@released
+
+Checks that the total number of allocated cells on the current thread's heap 
+is the same as the specified value.
+
+This macro is defined only for debug builds.
+
+The macro also takes the name of the file containing this source code statement 
+and the line number of this source code statement; they are displayed as part 
+of the panic category, if the checks fail.
+
+@param aCount The total number of heap cells expected to be allocated.
+
+@see User::__DbgMarkCheck()
+@see __KHEAP_CHECKALL
+*/
+#define __UHEAP_CHECKALL(aCount)
+
+
+
+
+/**
+@publishedAll
+@released
+
+Marks the end of checking the current thread's heap. 
+
+The macro expects zero heap cells to remain allocated at the current nest 
+level. This macro is defined only for debug builds.
+
+This macro must match an earlier call to __UHEAP_MARK.
+
+@see User::__DbgMarkEnd()
+@see __UHEAP_MARK
+*/
+#define __UHEAP_MARKEND
+
+
+
+
+/**
+@publishedAll
+@released
+
+Marks the end of checking the current thread's heap. 
+
+The macro expects aCount heap cells to remain allocated at the current nest 
+level.
+
+This macro must match an earlier call to __UHEAP_MARK.
+
+@param aCount The number of heap cells expected to remain allocated at
+              the current nest level.
+
+@see User::__DbgMarkEnd()
+@see __UHEAP_MARK
+*/
+#define __UHEAP_MARKENDC(aCount)
+
+
+
+
+/**
+@publishedAll
+@released
+
+Simulates heap allocation failure for the current thread's heap.
+
+The failure occurs on the next call to new or any of the functions which 
+allocate memory from the heap. This macro is defined only for debug builds.
+
+@param aCount Determines when the allocation will fail.
+              Heap allocation fails on attempt number aCount - later
+              allocations will succeed.
+              For example, if aCount is 3, then heap allocation fails
+              on the 3rd attempt, but all subsequent allocations succeed. 
+
+@see User::__DbgSetAllocFail()
+*/
+#define __UHEAP_FAILNEXT(aCount)
+
+/**
+@publishedAll
+@released
+
+Simulates heap allocation failure for the current thread's heap.
+
+The failures will occur for aBurst times from the next call to new or any of the functions which 
+allocate memory from the heap. This macro is defined only for debug builds.
+
+@param aCount Determines when the allocation will fail.
+              Heap allocation fails on attempt number aCount - later
+              allocations will succeed.
+              For example, if aCount is 3, then heap allocation fails
+              on the 3rd attempt, but all subsequent allocations succeed.   
+              Note when used with RHeap the maximum value aBurst can be 
+              set to is KMaxTUint16.
+@param aBurst The number of consecutive allocations that will fail.  Note 
+              when used with RHeap the maximum value aBurst can be set 
+              to is KMaxTUint16.
+
+@see User::__DbgSetBurstAllocFail()
+*/
+#define __UHEAP_BURSTFAILNEXT(aCount,aBurst)
+
+
+
+/**
+@publishedAll
+@released
+
+Simulates heap allocation failure for the current thread's heap. 
+
+The failure occurs on subsequent calls to new or any of the functions which 
+allocate memory from the heap. This macro is defined only for debug builds.
+
+@param aType  The type of failure to be simulated.
+@param aRate The failure rate.
+
+@see User::__DbgSetAllocFail()
+*/
+#define __UHEAP_SETFAIL(aType,aRate)
+
+/**
+@publishedAll
+@released
+
+Simulates heap allocation failure for the current thread's heap. 
+
+The failure occurs on subsequent calls to new or any of the functions which 
+allocate memory from the heap. This macro is defined only for debug builds.
+
+@param aType  The type of failure to be simulated.
+@param aRate  The failure rate.  Note when used with RHeap the maximum value 
+              aRate can be set to is KMaxTUint16.
+@param aBurst The number of consecutive allocations that will fail.  Note 
+              when used with RHeap the maximum value aBurst can be set 
+              to is KMaxTUint16.
+
+@see User::__DbgSetBurstAllocFail()
+@see RAllocator::TAllocFail
+*/
+#define __UHEAP_SETBURSTFAIL(aType,aRate,aBurst)
+
+
+
+/**
+@publishedAll
+@released
+
+Cancels simulated heap allocation failure for the current thread's heap. 
+
+This macro is defined only for debug builds.
+
+@see User::__DbgSetAllocFail()
+*/
+#define __UHEAP_RESET
+
+
+
+/**
+@publishedAll
+@released
+
+Cancels simulated heap allocation failure for the current thread's heap. 
+It walks the the heap and sets the nesting level for all allocated
+cells to zero.
+
+This macro is defined only for debug builds.
+*/
+#define __UHEAP_TOTAL_RESET
+
+/**
+@publishedAll
+@released
+
+Returns the number of heap allocation failures the current debug allocator fail
+function has caused so far.
+
+This is intended to only be used with fail types RAllocator::EFailNext,
+RAllocator::EBurstFailNext, RAllocator::EDeterministic and
+RAllocator::EBurstDeterministic.  The return value is unreliable for 
+all other fail types.
+
+@return The number of heap allocation failures the current debug fail 
+function has caused.
+
+@see RAllocator::TAllocFail
+*/
+#define __UHEAP_CHECKFAILURE ((TUint)0)
+
+/**
+@publishedAll
+@released
+
+Returns the number of kernel heap allocation failures the current debug 
+allocator fail function has caused so far.
+
+This is intended to only be used with fail types RAllocator::EFailNext,
+RAllocator::EBurstFailNext, RAllocator::EDeterministic and
+RAllocator::EBurstDeterministic.  The return value is unreliable for 
+all other fail types.
+
+@return The number of heap allocation failures the current debug fail 
+function has caused.
+
+@see RAllocator::TAllocFail
+*/
+#define __KHEAP_CHECKFAILURE ((TUint)0)
+
+/**
+@publishedAll
+@released
+
+Marks the start of heap checking for the specific heap. 
+
+This macro is defined only for debug builds.
+
+This macro must be matched by a corresponding call to __RHEAP_MARKEND or __RHEAP_MARKENDC.
+
+Calls to this macro can be nested but each call must be matched by corresponding 
+call to __RHEAP_MARKEND or __RHEAP_MARKENDC.
+
+@param aHeap A pointer to the specific RHeap
+
+@see RHeap
+@see RAllocator::__DbgMarkStart()
+@see __RHEAP_MARKEND
+@see __RHEAP_MARKENDC
+*/
+#define __RHEAP_MARK(aHeap)
+
+
+
+
+/**
+@publishedAll
+@released
+
+Checks that the number of allocated cells at the current nested level on the 
+specified heap is the same as the specified value. 
+
+The macro also takes the name of the file containing this source code statement 
+and the line number of this source code statement; they are displayed as part 
+of the panic category, if the checks fail. 
+
+This macro is defined only for debug builds.
+
+@param aHeap  A pointer to the specific RHeap.
+@param aCount The number of heap cells expected to be allocated at
+              the current nest level.
+
+@see RAllocator::__DbgMarkCheck()
+*/
+#define __RHEAP_CHECK(aHeap,aCount)
+
+
+
+
+/**
+@publishedAll
+@released
+
+Checks that the total number of allocated cells on the specified heap is the 
+same as the specified value.
+
+The macro also takes the name of the file containing this source code statement 
+and the line number of this source code statement; they are displayed as part 
+of the panic category, if the checks fail.
+
+This macro is defined only for debug builds.
+
+@param aHeap  A pointer to the specific RHeap.
+@param aCount The total number of heap cells expected to be allocated.
+
+@see RAllocator::__DbgMarkCheck()
+*/
+#define __RHEAP_CHECKALL(aHeap,aCount)
+
+
+
+
+/**
+@publishedAll
+@released
+
+Marks the end of heap checking for the specific heap.
+
+The macro expects zero heap cells to remain allocated at the current nest 
+level. This macro is defined only for debug builds.
+
+This macro must match an earlier call to __RHEAP_MARK.
+
+@param aHeap A pointer to the specific RHeap.
+
+@see RAllocator::__DbgMarkEnd()
+@see __RHEAP_MARK
+*/
+#define __RHEAP_MARKEND(aHeap)
+
+
+
+
+/**
+@publishedAll
+@released
+
+Marks the end of heap checking for the specific heap.
+
+The macro expects aCount heap cells to remain allocated at the current nest 
+level. This macro is defined only for debug builds.
+
+This macro must match an earlier call to __RHEAP_MARK.
+
+@param aHeap  A pointer to the specific RHeap.
+@param aCount The number of heap cells expected to remain allocated at
+              the current nest level
+
+@see RAllocator::__DbgMarkEnd()
+@see __RHEAP_MARK
+*/
+#define __RHEAP_MARKENDC(aHeap,aCount)
+
+
+
+
+/**
+@publishedAll
+@released
+
+Simulates an allocation failure for the specific heap.
+
+The failure occurs on the next call to new or any of the functions which allocate 
+memory from the heap. This macro is defined only for debug builds.
+
+@param aHeap  A pointer to the specific RHeap.
+@param aCount The rate of failure - heap allocation fails every aCount attempt.
+
+@see RAllocator::__DbgSetAllocFail()
+*/
+#define __RHEAP_FAILNEXT(aHeap,aCount)
+
+/**
+@publishedAll
+@released
+
+Simulates aBurst allocation failures for the specific heap.
+
+The failure occurs on the next call to new or any of the functions which allocate 
+memory from the heap. This macro is defined only for debug builds.
+
+@param aHeap  A pointer to the specific RHeap.
+@param aCount The heap allocation will fail after aCount-1 allocation attempts. 
+              Note when used with RHeap the maximum value aCount can be set 
+              to is KMaxTUint16.
+@param aBurst The number of consecutive allocations that will fail.  Note 
+              when used with RHeap the maximum value aBurst can be set 
+              to is KMaxTUint16.
+
+@see RAllocator::__DbgSetBurstAllocFail()
+*/
+#define __RHEAP_BURSTFAILNEXT(aHeap,aCount,aBurst)
+
+
+
+/**
+@publishedAll
+@released
+
+Simulates an allocation failure for the specific heap. 
+
+The failure occurs on subsequent calls to new or any of the functions which 
+allocate memory from the heap. This macro is defined only for debug builds.
+
+@param aHeap  A pointer to the specific RHeap.
+@param aType  The type of failure to be simulated. 
+@param aRate The failure rate.
+
+@see RAllocator::__DbgSetAllocFail()
+*/
+#define __RHEAP_SETFAIL(aHeap,aType,aRate)
+
+/**
+@publishedAll
+@released
+
+Simulates an allocation failure for the specific heap. 
+
+The failure occurs on subsequent calls to new or any of the functions which 
+allocate memory from the heap. This macro is defined only for debug builds.
+
+@param aHeap  A pointer to the specific RHeap.
+@param aType  The type of failure to be simulated. 
+@param aRate  The failure rate.  Note when used with RHeap the maximum value 
+              aRate can be set to is KMaxTUint16.
+@param aBurst The number of consecutive allocations that will fail.  Note 
+              when used with RHeap the maximum value aBurst can be set 
+              to is KMaxTUint16.
+
+@see RAllocator::__DbgSetBurstAllocFail()
+*/
+#define __RHEAP_SETBURSTFAIL(aHeap,aType,aRate,aBurst)
+
+
+
+/**
+@publishedAll
+@released
+
+Cancels simulated allocation failure for the specific heap.
+
+This macro is defined only for debug builds.
+
+@param aHeap A pointer to the specific RHeap.
+
+@see RAllocator::__DbgSetAllocFail()
+*/
+#define __RHEAP_RESET(aHeap)
+
+
+
+/**
+@publishedAll
+@released
+
+Cancels simulated allocation failure for the specific heap.
+It walks the the heap and sets the nesting level for all allocated
+cells to zero.
+
+This macro is defined only for debug builds.
+
+@param aHeap A pointer to the specific RHeap.
+
+@see RAllocator::__DbgSetAllocFail()
+*/
+#define __RHEAP_TOTAL_RESET(aHeap)
+
+
+/**
+@publishedAll
+@released
+
+Returns the number of heap allocation failures the current debug allocator fail
+function has caused so far.
+
+This is intended to only be used with fail types RAllocator::EFailNext,
+RAllocator::EBurstFailNext, RAllocator::EDeterministic and
+RAllocator::EBurstDeterministic.  The return value is unreliable for 
+all other fail types.
+
+@return The number of heap allocation failures the current debug fail 
+function has caused.
+
+@see RAllocator::TAllocFail
+*/
+#define __RHEAP_CHECKFAILURE(aHeap) ((TUint)0)
+
+#define __DEBUGGER()
+#endif
+
+#if defined (__WINS__)
+/** @internalTechnology */
+#define __EMULATOR_IMAGE_HEADER2(aUid0,aUid1,aUid2,aPriority,aCap0,aCap1,aSid,aVid,aVer,aFlags)	TEmulatorImageHeader uid={{aUid0,aUid1,aUid2},aPriority,{aSid,aVid,{aCap0,aCap1}},0,0,aVer,aFlags};
+/** @internalTechnology */
+#define __EMULATOR_IMAGE_HEADER(aUid0,aUid1,aUid2,aPriority,aCap,aFlags)					TEmulatorImageHeader uid={{aUid0,aUid1,aUid2},aPriority,{aUid2,0,{aCap,0}},0,0,0x00010000u,aFlags};
+#else
+#define __EMULATOR_IMAGE_HEADER2(aUid0,aUid1,aUid2,aPriority,aCap0,aCap1,aSid,aVer,aFlags)
+#define __EMULATOR_IMAGE_HEADER(aUid0,aUid1,aUid2,aPriority,aCap,aFlags)
+#endif
+
+#if defined(_UNICODE)
+#if !defined(UNICODE)
+/**
+@publishedAll
+@deprecated
+*/
+#define UNICODE
+#endif
+#endif
+
+#if !defined(ASSERT)
+/**
+@publishedAll
+@released
+
+Generates _ASSERT_DEBUG code that calls User::Invariant() if the specified
+condition is not true.
+
+@param x A conditional expression which results in true or false.
+*/
+#define ASSERT(x) __ASSERT_DEBUG(x,User::Invariant())
+#endif
+
+
+
+
+#if defined(_DEBUG)
+/**
+@publishedAll
+@released
+*/
+#define __DEBUG_ONLY(x) x
+#else
+#define __DEBUG_ONLY(x)
+#endif
+
+
+
+
+#ifdef __KERNEL_MODE__
+
+/** @internalComponent */
+#define	KIMPORT_C	IMPORT_C
+
+/** @internalComponent */
+#define	KEXPORT_C	EXPORT_C
+
+/** @internalComponent */
+#define	UIMPORT_C
+
+/** @internalComponent */
+#define	UEXPORT_C
+#else
+#define	KIMPORT_C
+#define	KEXPORT_C
+#define	UIMPORT_C	IMPORT_C
+#define	UEXPORT_C	EXPORT_C
+#endif
+
+
+
+
+/**
+@publishedAll
+@released
+
+Asserts that a condition is true at compilation time.
+
+@param x Condition to assert
+*/
+#define __ASSERT_COMPILE(x)		void __compile_time_assert(int __check[(x)?1:-1])
+
+/**
+@internalComponent
+*/
+static const char* const KSuppressPlatSecDiagnosticMagicValue = (const char*)1;
+#ifndef __REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__
+/**
+When this value is used in Platform Security APIs as the value for the aDiagnosticText
+argument, these APIs will not emit any form of diagnostic message.
+@publishedPartner
+@released
+*/
+// Note this value is the same as KSuppressPlatSecDiagnosticMagicValue
+// and used to be a set by it but that caused an error with GCCE compiler
+static const char* const KSuppressPlatSecDiagnostic = (const char*)1;
+
+#else /* __REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__ */
+
+#ifndef __KERNEL_MODE__
+#ifndef __REMOVE_PLATSEC_DIAGNOSTICS__
+/**
+When this value is used in Platform Security APIs as the value for the aDiagnostic
+argument, these APIs will not emit any form of diagnostic message.
+@publishedPartner
+@released
+*/
+#define KSuppressPlatSecDiagnostic		NULL, NULL
+
+#else /* __REMOVE_PLATSEC_DIAGNOSTICS__ */
+
+/**
+When this value is used in Platform Security APIs as the value for the aDiagnostic
+argument, these APIs will not emit any form of diagnostic message.
+@publishedPartner
+@released
+*/
+#define KSuppressPlatSecDiagnostic		NULL
+
+#endif /* !__REMOVE_PLATSEC_DIAGNOSTICS__ */
+#endif /* !__KERNEL_MODE__ */
+#endif /* !__REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__ */
+
+/*
+ * MSVC operator new and operator new[] header guards
+ */
+#ifdef __PLACEMENT_NEW
+#define __PLACEMENT_NEW_INLINE
+#endif /* __PLACEMENT_NEW */
+
+#if defined(__VC32__) && (_MSC_VER < 1300)
+#define __PLACEMENT_VEC_NEW_INLINE
+#endif /* version of MSVC that doesn't support overloaded operator new[] */
+
+/**
+Calling convention qualifier for functions involving floating point 
+variables passed or returned by value.
+@publishedAll
+@released
+*/
+#ifndef __SOFTFP
+#define __SOFTFP
+#endif /* __SOFTFP */
+
+#ifndef SYMBIAN_ENABLE_SPLIT_HEADERS
+#include <e32def_private.h>
+#endif
+
+#endif /* __E32DEF_H__ */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32/include/e32def_private.h	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,658 @@
+// Copyright (c) 1994-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32\include\e32def_private.h
+// 
+//
+
+#ifndef __E32DEF_PRIVATE_H__
+#define __E32DEF_PRIVATE_H__
+
+#ifdef __PROFILING__
+
+/**
+@publishedPartner
+@removed
+*/
+#define __PROFILE_START(aBin) RDebug::ProfileStart(aBin)
+
+/**
+@publishedPartner
+@removed
+*/
+#define __PROFILE_END(aBin)   RDebug::ProfileEnd(aBin)
+
+/**
+@publishedPartner
+@removed
+*/
+#define __PROFILE_RESET(aNumberOfBins) RDebug::ProfileReset(0,aNumberOfBins)
+
+/**
+@publishedPartner
+@removed
+*/
+#define __PROFILE_DISPLAY(aNumberOfBins) \
+			{	TFixedArray<TProfile, aNumberOfBins> result; \
+				RDebug::ProfileResult(result.Begin(), 0, aNumberOfBins); \
+				for (TInt i=0; i<aNumberOfBins; i++)   \
+				RDebug::Print(_L("Profile bin %d:  Calls: %d, Clock ticks: %d\n" ),i,res[i].iCount,result[i].iTime);  \
+			}
+#else /* __PROFILING__ */
+#define __PROFILE_START(aBin) 
+#define __PROFILE_END(aBin)   
+#define __PROFILE_RESET(aNumberOfBins) 
+#define __PROFILE_DISPLAY(aNumberOfBins)
+#endif
+
+#if defined(_DEBUG)
+
+/**
+@publishedPartner
+@released
+
+Marks the start of Kernel heap checking. 
+
+Checking the Kernel heap is only useful when developing Kernel side code such 
+as device drivers and media drivers.
+
+This macro is defined only for debug builds.
+
+This macro must be matched by a corresponding call to __KHEAP_MARKEND or __KHEAP_MARKENDC. 
+Calls to this macro can be nested but each call must be matched by corresponding 
+call to __KHEAP_MARKEND or __KHEAP_MARKENDC.
+
+@see User::__DbgMarkStart()
+@see __KHEAP_MARKEND
+@see __KHEAP_MARKENDC
+*/
+#define __KHEAP_MARK User::__DbgMarkStart(TRUE)
+
+
+
+
+/**
+@publishedPartner
+@released
+
+Checks that the number of allocated cells at the current nested level of the 
+Kernel heap is the same as the specified value. This macro is defined only 
+for debug builds. Checking the Kernel heap is only useful when developing 
+Kernel side code such as device drivers and media drivers.
+
+The macro also takes the name of the file containing this source code statement 
+and the line number of this source code statement; they are displayed as part 
+of the panic category, if the checks fail.
+
+@param aCount The number of heap cells expected to be allocated at
+              the current nest level.
+
+@see User::__DbgMarkCheck()
+@see __UHEAP_CHECK
+*/
+#define __KHEAP_CHECK(aCount) User::__DbgMarkCheck(TRUE,FALSE,aCount,(TText8*)__FILE__,__LINE__)
+
+
+
+
+/**
+@publishedPartner
+@released
+
+Checks that the total number of allocated cells on the Kernel heap is the same 
+as the specified value.
+
+It is only useful when developing Kernel side code such as device drivers 
+and media drivers. 
+
+The macro also takes the name of the file containing this source code statement 
+and the line number of this source code statement; they are displayed as part 
+of the panic category, if the checks fail.
+
+This macro is defined only for debug builds.
+
+@param aCount The total number of heap cells expected to be allocated
+
+@see User::__DbgMarkCheck()
+@see __UHEAP_CHECKALL
+*/
+#define __KHEAP_CHECKALL(aCount) User::__DbgMarkCheck(TRUE,TRUE,aCount,(TText8*)__FILE__,__LINE__)
+
+
+
+
+/**
+@publishedPartner
+@released
+
+Marks the end of Kernel heap checking. The macro expects zero heap cells to 
+remain allocated at the current nest level.
+
+This macro is defined only for debug builds. Checking the Kernel heap is only 
+useful when developing Kernel side code such as device drivers and media drivers.
+
+This macro must match an earlier call to __KHEAP_MARK.
+
+@see User::__DbgMarkEnd()
+@see __KHEAP_MARK
+*/
+#define __KHEAP_MARKEND User::__DbgMarkEnd(TRUE,0)
+
+
+
+
+/**
+@publishedPartner
+@released
+
+Marks the end of Kernel heap checking. The macro expects aCount heap cells 
+to remain allocated at the current nest level.
+
+This macro is defined only for debug builds.
+
+This macro must match an earlier call to __KHEAP_MARK.
+
+@param aCount The number of heap cells expected to remain allocated at
+              the current nest level.
+
+@see User::__DbgMarkEnd()
+@see __KHEAP_MARK
+*/
+#define __KHEAP_MARKENDC(aCount) User::__DbgMarkEnd(TRUE,aCount)
+
+
+
+
+/**
+@publishedPartner
+@released
+
+Simulates Kernel heap allocation failure. The failure occurs on the next call 
+to new or any of the functions which allocate memory from the heap. This macro 
+is defined only for debug builds.
+
+Checking the Kernel heap is only useful when developing Kernel side code such 
+as device drivers and media drivers.
+
+@param aCount The rate of failure - heap allocation fails every aCount attempt.
+
+@see User::__DbgSetAllocFail()
+*/
+#define __KHEAP_FAILNEXT(aCount) User::__DbgSetAllocFail(TRUE,RAllocator::EFailNext,aCount)
+
+/**
+@publishedPartner
+@released
+
+Simulates Kernel heap allocation failures. aBurst failures will occur on the next call 
+to new or any of the functions which allocate memory from the heap. This macro 
+is defined only for debug builds.
+
+Checking the Kernel heap is only useful when developing Kernel side code such 
+as device drivers and media drivers.
+
+@param aCount The heap allocation will fail after aCount-1 allocation attempts. 
+              Note when used with RHeap the maximum value aCount can be set 
+              to is KMaxTUint16.
+@param aBurst The number of allocations that will fail after aCount-1 allocation 
+              attempts.  Note when used with RHeap the maximum value aBurst can be 
+              set to is KMaxTUint16.
+
+
+@see User::__DbgSetBurstAllocFail()
+*/
+#define __KHEAP_BURSTFAILNEXT(aCount,aBurst) User::__DbgSetBurstAllocFail(TRUE,RAllocator::EBurstFailNext,aCount,aBurst)
+
+
+/**
+@publishedPartner
+@released
+
+Simulates Kernel heap allocation failure. 
+
+The failure occurs on subsequent calls to new or any of the functions which 
+allocate memory from this heap.
+
+This macro is defined only for debug builds.
+
+@param aType  The type of failure to be simulated.
+@param aRate The failure rate.
+
+@see RAllocator::TAllocFail
+@see User::__DbgSetAllocFail()
+*/
+#define __KHEAP_SETFAIL(aType,aRate) User::__DbgSetAllocFail(TRUE,aType,aRate)
+
+/**
+@publishedPartner
+@released
+
+Simulates Kernel heap allocation failure. 
+
+The failure occurs on subsequent calls to new or any of the functions which 
+allocate memory from this heap.
+
+This macro is defined only for debug builds.
+
+@param aType  The type of failure to be simulated.
+@param aRate  The failure rate.  Note when used with RHeap the maximum value 
+              aRate can be set to is KMaxTUint16.
+@param aBurst The number of consecutive allocations that will fail.  Note 
+              when used with RHeap the maximum value aBurst can be set to 
+              is KMaxTUint16.
+
+@see RAllocator::TAllocFail
+@see User::__DbgSetBurstAllocFail()
+*/
+#define __KHEAP_SETBURSTFAIL(aType,aRate,aBurst) User::__DbgSetBurstAllocFail(TRUE,aType,aRate,aBurst)
+
+
+
+/**
+@publishedPartner
+@released
+
+Cancels simulated Kernel heap allocation failure. 
+
+Checking the Kernel heap is only useful when developing Kernel side code such 
+as device drivers and media drivers.
+
+This macro is defined only for debug builds.
+
+@see User::__DbgSetAllocFail()
+*/
+#define __KHEAP_RESET User::__DbgSetAllocFail(TRUE,RAllocator::ENone,1)
+
+
+
+
+/**
+@publishedPartner
+@released
+
+Cancels simulated kernel heap allocation failure. 
+It walks the the heap and sets the nesting level for all allocated
+cells to zero.
+
+Checking the kernel heap is only useful when developing kernel side code such 
+as device drivers and media drivers.
+
+This macro is defined only for debug builds.
+*/
+#define __KHEAP_TOTAL_RESET User::__DbgSetAllocFail(TRUE,RAllocator::EReset,1)
+
+#else
+
+/**
+@publishedPartner
+@released
+
+Marks the start of Kernel heap checking. 
+
+Checking the Kernel heap is only useful when developing Kernel side code such 
+as device drivers and media drivers.
+
+This macro is defined only for debug builds.
+
+This macro must be matched by a corresponding call to __KHEAP_MARKEND or __KHEAP_MARKENDC. 
+Calls to this macro can be nested but each call must be matched by corresponding 
+call to __KHEAP_MARKEND or __KHEAP_MARKENDC.
+
+@see User::__DbgMarkStart()
+@see __KHEAP_MARKEND
+@see __KHEAP_MARKENDC
+*/
+#define __KHEAP_MARK
+
+
+
+
+/**
+@publishedPartner
+@released
+
+Checks that the number of allocated cells at the current nested level of the 
+Kernel heap is the same as the specified value. This macro is defined only 
+for debug builds. Checking the Kernel heap is only useful when developing 
+Kernel side code such as device drivers and media drivers.
+
+The macro also takes the name of the file containing this source code statement 
+and the line number of this source code statement; they are displayed as part 
+of the panic category, if the checks fail.
+
+@param aCount The number of heap cells expected to be allocated at
+              the current nest level.
+
+@see User::__DbgMarkCheck()
+@see __UHEAP_CHECK
+*/
+#define __KHEAP_CHECK(aCount)
+
+
+
+
+/**
+@publishedPartner
+@released
+
+Checks that the total number of allocated cells on the Kernel heap is the same 
+as the specified value.
+
+It is only useful when developing Kernel side code such as device drivers 
+and media drivers. 
+
+The macro also takes the name of the file containing this source code statement 
+and the line number of this source code statement; they are displayed as part 
+of the panic category, if the checks fail.
+
+This macro is defined only for debug builds.
+
+@param aCount The total number of heap cells expected to be allocated
+
+@see User::__DbgMarkCheck()
+@see __UHEAP_CHECKALL
+*/
+#define __KHEAP_CHECKALL(aCount)
+
+
+
+
+/**
+@publishedPartner
+@released
+
+Marks the end of Kernel heap checking. The macro expects zero heap cells to 
+remain allocated at the current nest level.
+
+This macro is defined only for debug builds. Checking the Kernel heap is only 
+useful when developing Kernel side code such as device drivers and media drivers.
+
+This macro must match an earlier call to __KHEAP_MARK.
+
+@see User::__DbgMarkEnd()
+@see __KHEAP_MARK
+*/
+#define __KHEAP_MARKEND
+
+
+
+
+/**
+@publishedPartner
+@released
+
+Marks the end of Kernel heap checking. The macro expects aCount heap cells 
+to remain allocated at the current nest level.
+
+This macro is defined only for debug builds.
+
+This macro must match an earlier call to __KHEAP_MARK.
+
+@param aCount The number of heap cells expected to remain allocated at
+              the current nest level.
+
+@see User::__DbgMarkEnd()
+@see __KHEAP_MARK
+*/
+#define __KHEAP_MARKENDC(aCount)
+
+
+
+
+/**
+@publishedPartner
+@released
+
+Simulates Kernel heap allocation failure. The failure occurs on the next call 
+to new or any of the functions which allocate memory from the heap. This macro 
+is defined only for debug builds.
+
+Checking the Kernel heap is only useful when developing Kernel side code such 
+as device drivers and media drivers.
+
+@param aCount The rate of failure - heap allocation fails every aCount attempt.
+
+@see User::__DbgSetAllocFail()
+*/
+#define __KHEAP_FAILNEXT(aCount)
+
+/**
+@publishedPartner
+@released
+
+Simulates Kernel heap allocation failures. aBurst failures will occur on the next call 
+to new or any of the functions which allocate memory from the heap. This macro 
+is defined only for debug builds.
+
+Checking the Kernel heap is only useful when developing Kernel side code such 
+as device drivers and media drivers.
+
+@param aCount The heap allocation will fail after aCount-1 allocation attempts.  
+              Note when used with RHeap the maximum value aCount can be set 
+              to is KMaxTUint16.
+@param aBurst The number of allocations that will fail after aCount-1 allocation
+              attempts.  Note when used with RHeap the maximum value aBurst can 
+              be set to is KMaxTUint16.
+
+@see User::__DbgSetBurstAllocFail()
+*/
+#define __KHEAP_BURSTFAILNEXT(aCount,aBurst)
+
+
+
+/**
+@publishedPartner
+@released
+
+Simulates Kernel heap allocation failure. 
+
+The failure occurs on subsequent calls to new or any of the functions which 
+allocate memory from this heap.
+
+This macro is defined only for debug builds.
+
+@param aType  The type of failure to be simulated.
+@param aRate The failure rate.
+
+@see User::__DbgSetAllocFail()
+*/
+#define __KHEAP_SETFAIL(aType,aRate)
+
+/**
+@publishedPartner
+@released
+
+Simulates Kernel heap allocation failure. 
+
+The failure occurs on subsequent calls to new or any of the functions which 
+allocate memory from this heap.
+
+This macro is defined only for debug builds.
+
+@param aType  The type of failure to be simulated.
+@param aRate  The failure rate.  Note when used with RHeap the maximum value 
+              aRate can be set to is KMaxTUint16.
+@param aBurst The number of consecutive allocations that will fail.  Note 
+              when used with RHeap the maximum value aBurst can be set 
+              to is KMaxTUint16.
+
+@see User::__DbgSetBurstAllocFail()
+*/
+#define __KHEAP_SETBURSTFAIL(aType,aRate,aBurst)
+
+
+
+/**
+@publishedPartner
+@released
+
+Cancels simulated Kernel heap allocation failure. 
+
+Checking the Kernel heap is only useful when developing Kernel side code such 
+as device drivers and media drivers.
+
+This macro is defined only for debug builds.
+
+@see User::__DbgSetAllocFail()
+*/
+#define __KHEAP_RESET
+
+
+
+/**
+@publishedPartner
+@released
+
+Cancels simulated kernel heap allocation failure. 
+It walks the the heap and sets the nesting level for all allocated
+cells to zero.
+
+Checking the kernel heap is only useful when developing kernel side code such 
+as device drivers and media drivers.
+
+This macro is defined only for debug builds.
+*/
+#define __KHEAP_TOTAL_RESET
+#endif
+
+#ifndef __VALUE_IN_REGS__ 
+/**
+@publishedPartner
+@released
+*/
+#define __VALUE_IN_REGS__ 
+#endif
+
+#ifdef __REMOVE_PLATSEC_DIAGNOSTICS__
+/**
+@publishedPartner
+@released
+*/
+#ifndef __REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__
+#define __REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__
+#endif /*__REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__*/
+#endif /*__REMOVE_PLATSEC_DIAGNOSTICS__*/
+
+#ifndef __REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__
+/**
+@internalComponent
+*/
+#define __PLATSEC_DIAGNOSTIC_FILE_AND_LINE_HELPER(l) #l
+/**
+@internalComponent
+*/
+#define __PLATSEC_DIAGNOSTIC_FILE_AND_LINE_HELPER2(f,l) f "(" __PLATSEC_DIAGNOSTIC_FILE_AND_LINE_HELPER(l) ")"
+/**
+@publishedPartner
+@released
+*/
+#define __PLATSEC_DIAGNOSTIC_FILE_AND_LINE __PLATSEC_DIAGNOSTIC_FILE_AND_LINE_HELPER2(__FILE__,__LINE__)
+
+#endif /* !__REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__ */
+
+#ifndef __REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__
+
+/**
+@publishedPartner
+@released
+
+A macro that should be used to enclose a platform security diagnostic
+'C' style string that can be passed to a capability checking function such
+as RThread::HasCapability() and Kern::CurrentThreadHasCapability().
+
+The content of the string is emitted if the capability test finds that
+the capability is not present.
+
+The macro provides a convenient mechanism that allows the strings to
+be removed from future versions of Symbian OS.
+
+For example:
+
+@code
+if(!Kern::CurrentThreadHasCapability(ECapabilityPowerMgmt,__PLATSEC_DIAGNOSTIC_STRING("Checked by Hal function EDisplayHalSetState")))
+    {
+    return KErrPermissionDenied;
+    }			
+@endcode
+
+In this example, the string:
+
+@code
+Checked by Hal function EDisplayHalSetState
+@endcode
+
+is emitted if the calling process does not have the ECapabilityPowerMgmt capability.
+
+@param s A C-style string.
+
+@see RProcess::HasCapability()
+@see RThread::HasCapability()
+@see RMessagePtr2::HasCapability()
+@see User::CreatorHasCapability()
+*/
+#define __PLATSEC_DIAGNOSTIC_STRING(s) s
+
+#else /* __REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__ */
+
+#define __PLATSEC_DIAGNOSTIC_STRING(s) NULL
+
+#endif /* !__REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__ */
+
+/** @internalTechnology */
+#define __NO_MUTABLE_KEYWORD
+
+
+/**
+@internalTechnology
+
+A sorted list of all the code segments in ROM that contain an Exception Descriptor.
+
+*/
+typedef struct TRomExceptionSearchTable
+	{
+	/**
+	The number of entries in the following table.
+	*/
+	TInt32 iNumEntries;
+	
+	/**
+	Address of the code segment of each TRomImageHeader that has an Exception Descriptor.
+	*/
+	TLinAddr iEntries[1];
+	} TRomExceptionSearchTable;
+	
+/**
+@internalComponent
+*/
+typedef struct TExceptionDescriptor 
+	{
+	TLinAddr iExIdxBase;
+	TLinAddr iExIdxLimit;
+	TLinAddr iROSegmentBase;
+	TLinAddr iROSegmentLimit;
+	} TExceptionDescriptor;
+	
+#ifdef __KERNEL_MODE__
+
+/** @internalComponent */
+#define	KIMPORT_C	IMPORT_C
+
+/** @internalComponent */
+#define	KEXPORT_C	EXPORT_C
+
+#else
+#define	KIMPORT_C
+#define	KEXPORT_C
+#endif
+
+#endif //__E32DEF_PRIVATE_H__
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32/include/e32des16.h	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,716 @@
+// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32\include\e32des16.h
+// 
+//
+
+#ifndef __E32DES16_H__
+#define __E32DES16_H__
+
+/**
+@internalComponent
+*/
+const TUint KMaskDesLength16=0xfffffff;
+
+class TBufCBase16;
+class TDes16;
+class TPtrC16;
+class TPtr16;
+struct TCollationMethod;
+class HBufC16;
+class HBufC8;
+
+class TDesC16
+/**
+@publishedAll
+@released
+
+Abstract base class for 16-bit descriptors.
+
+The class encapsulates the data member containing the length of data
+represented by a 16-bit descriptor. It also provides member functions through
+which the data can be accessed, but not modified.
+
+Data represented by this class is treated as a contiguous set of 16-bit (i.e. 
+double byte) values or data items.
+
+This class cannot be instantiated as it is intended to form part of a class 
+hierarchy; it provides a well defined part of descriptor behaviour. It can, 
+however, be passed as an argument type for functions which want access to 
+descriptor data but do not need to modify that data.
+
+@see TDesC
+@see TPtrC16
+*/
+    {
+public:
+    /**
+    A value returned by a call to HasPrefixC().
+    
+    @see TDesC16::HasPrefixC
+    */
+	enum TPrefix {
+	              /**
+	              Indicates that a supplied prefix can be extended to
+                  be equivalent to the text at the start of a descriptor.
+	              */
+	              EIsPrefix = 0,
+   	              /**
+   	              Indicates that a supplied prefix does not seem to be a
+   	              prefix, but it is possible that it could be extended to
+   	              become equivalent to text at the start of this descriptor.
+                  */
+	              EMightBePrefix = 1,
+   	              /**
+   	              Indicates that a supplied prefix cannot be extended to be
+   	              equivalent to the text at the start of a descriptor.
+                  */
+	              EIsNotPrefix = 2
+	             };
+public:
+	inline TBool operator<(const TDesC16 &aDes) const;
+	inline TBool operator<=(const TDesC16 &aDes) const;
+	inline TBool operator>(const TDesC16 &aDes) const;
+	inline TBool operator>=(const TDesC16 &aDes) const;
+	inline TBool operator==(const TDesC16 &aDes) const;
+	inline TBool operator!=(const TDesC16 &aDes) const;
+	inline const TUint16 &operator[](TInt anIndex) const;
+	inline TInt Length() const;
+	inline TInt Size() const;
+	IMPORT_C const TUint16 *Ptr() const;
+	IMPORT_C TInt Compare(const TDesC16 &aDes) const;
+	IMPORT_C TInt CompareF(const TDesC16 &aDes) const;
+	IMPORT_C TInt CompareC(const TDesC16 &aDes) const;
+	IMPORT_C TInt CompareC(const TDesC16& aDes,TInt aMaxLevel,const TCollationMethod* aCollationMethod) const;	
+	/**
+	@internalComponent
+	*/
+	IMPORT_C HBufC16* GetNormalizedDecomposedFormL() const;
+	/**
+	@internalComponent
+	*/	
+	IMPORT_C HBufC16* GetFoldedDecomposedFormL() const;
+	/**
+	@internalComponent
+	*/
+	IMPORT_C HBufC8* GetCollationKeysL(TInt aMaxLevel,const TCollationMethod* aCollationMethod) const;
+	IMPORT_C TInt Match(const TDesC16 &aDes) const;
+	IMPORT_C TInt MatchF(const TDesC16 &aDes) const;
+	IMPORT_C TInt MatchC(const TDesC16 &aDes) const;
+	IMPORT_C TInt MatchC(const TDesC16 &aPattern, TInt aWildChar, TInt aWildSequenceChar, 
+						 TInt aEscapeChar, TInt aMaxLevel = 3, const TCollationMethod* aCollationMethod = NULL) const;
+  	IMPORT_C TInt MatchC(const TDesC16 &aPattern, const TCollationMethod* aCollationMethod,
+  						 TInt aMaxLevel = 3, TInt aWildChar = '?', TInt aWildSequenceChar = '*', TInt aEscapeChar = 0) const;
+	IMPORT_C TInt Locate(TChar aChar) const;
+	IMPORT_C TInt LocateReverse(TChar aChar) const;
+	IMPORT_C TInt Find(const TDesC16 &aDes) const;
+	IMPORT_C TInt Find(const TUint16 *aBuf,TInt aLen) const;
+	IMPORT_C TPrefix HasPrefixC(const TDesC16& aPossiblePrefix, TInt aLevel, const TCollationMethod* aCollationMethod) const;
+	IMPORT_C TPtrC16 Left(TInt aLength) const;
+	IMPORT_C TPtrC16 Right(TInt aLength) const;
+	IMPORT_C TPtrC16 Mid(TInt aPos) const;
+	IMPORT_C TPtrC16 Mid(TInt aPos,TInt aLength) const;
+	IMPORT_C TInt LocateF(TChar aChar) const;
+	IMPORT_C TInt LocateReverseF(TChar aChar) const;
+	IMPORT_C TInt FindF(const TDesC16 &aDes) const;
+	IMPORT_C TInt FindF(const TUint16 *aBuf,TInt aLen) const;
+	IMPORT_C TInt FindC(const TDesC16 &aDes) const;
+	IMPORT_C TInt FindC(const TUint16 *aBuf,TInt aLen) const;
+	IMPORT_C TInt FindC(const TUint16 *aText,TInt aLength, TInt aMaxLevel) const;
+	IMPORT_C TInt FindC(const TDesC16 &aDes,TInt &aLengthFound, const TCollationMethod &aMethod,TInt aMaxLevel) const;
+	IMPORT_C HBufC16 *Alloc() const;
+	IMPORT_C HBufC16 *AllocL() const;
+	IMPORT_C HBufC16 *AllocLC() const;
+protected:
+	inline TDesC16() {}
+	inline TDesC16(TInt aType,TInt aLength);
+// delay this for a while
+#ifdef SYMBIAN_FIX_TDESC_CONSTRUCTORS
+	inline TDesC16( const TDesC16& aOther) : iLength(aOther.iLength) {}
+#endif
+//	inline ~TDesC16() {}			Commented out for the moment since it breaks code
+	inline TInt Type() const;
+	inline void DoSetLength(TInt aLength);
+	IMPORT_C const TUint16 &AtC(TInt anIndex) const;
+private:
+	TUint iLength;
+	__DECLARE_TEST;
+    };
+//
+class TPtrC16 : public TDesC16
+/**
+@publishedAll
+@released
+
+16-bit non-modifiable pointer descriptor.
+
+This is a descriptor class intended for instantiation and encapsulates a
+pointer to the 16-bit data that it represents. The data can live in ROM or RAM
+and this location is separate from the descriptor object itself.
+
+The data is intended to be accessed, but not changed, through this descriptor. 
+The base class provides the functions through which data is accessed.
+
+@see TPtr16
+@see TDesC16
+@see TDes16
+@see TBufC16
+@see TBuf16
+@see HBufC16
+*/
+	{
+public:
+	IMPORT_C TPtrC16();
+	IMPORT_C TPtrC16(const TDesC16 &aDes);
+	IMPORT_C TPtrC16(const TUint16 *aString);
+	IMPORT_C TPtrC16(const TUint16 *aBuf,TInt aLength);
+	inline void Set(const TUint16 *aBuf,TInt aLength);
+	inline void Set(const TDesC16 &aDes);
+	inline void Set(const TPtrC16 &aPtr);
+private:
+	TPtrC16& operator=(const TPtrC16 &aDes);
+protected:
+	const TUint16 *iPtr;
+private:
+	__DECLARE_TEST;
+	};
+//
+class TDes16Overflow
+/**
+@publishedAll
+@released
+
+An interface that defines an overflow handler for a 16-bit descriptor.
+
+The interface encapsulates a function that is called when an attempt to append 
+formatted text fails because the descriptor is already at its maximum length.
+
+A derived class must provide an implementation for the Overflow() member function.
+
+@see TDes16::AppendFormat
+*/
+	{
+public:
+	/**
+	Handles the overflow.
+	
+	This function is called when the TDes16::AppendFormat() 
+	variant that takes an overflow handler argument, fails.
+	
+	@param aDes The 16-bit modifiable descriptor whose overflow results in the 
+	            call to this overflow handler.
+	*/
+	virtual void Overflow(TDes16 &aDes)=0;
+	};
+//
+class TDes16IgnoreOverflow : public TDes16Overflow
+/**
+@publishedAll
+@released
+
+A derived class which provides an implementation for the Overflow() member function
+where truncation is required.
+
+@see TDes16::AppendFormat
+*/
+	{
+public:
+	/**
+	Handles the overflow.
+	
+	This function is called when the TDes16::AppendFormat() 
+	variant that takes an overflow handler argument, fails.
+	
+	@param aDes The 16-bit modifiable descriptor whose overflow results in the 
+	            call to this overflow handler.
+	*/
+	IMPORT_C virtual void Overflow(TDes16 &aDes);
+	};
+//
+class TRealFormat;
+class TDes16 : public TDesC16
+/**
+@publishedAll
+@released
+
+Abstract base class for 16-bit modifiable descriptors.
+
+The class encapsulates the data member containing the maximum length of data 
+represented by a 16-bit descriptor. It also provides member functions through 
+which the data can be modified.
+
+The class adds to the behaviour provided by TDesC16.
+
+This class cannot be instantiated as it is intended to form part of a class 
+hierarchy; it provides a well defined part of descriptor behaviour. It can, 
+however, be passed as an argument type for functions which need to both modify 
+and access descriptor data.
+
+@see TDes
+@see TDesC8
+@see TDesC16
+*/
+	{
+public:
+	inline TDes16& operator=(const TUint16 *aString);
+	inline TDes16& operator=(const TDesC16 &aDes);
+	inline TDes16& operator=(const TDes16 &aDes);
+	inline TInt MaxLength() const;
+	inline TInt MaxSize() const;
+	inline const TUint16 &operator[](TInt anIndex) const;
+	inline TUint16 &operator[](TInt anIndex);
+	inline TDes16 &operator+=(const TDesC16 &aDes);
+	IMPORT_C void Zero();
+ 	IMPORT_C void SetLength(TInt aLength);
+ 	IMPORT_C void SetMax();
+	IMPORT_C void Copy(const TDesC8 &aDes);
+	IMPORT_C void Copy(const TDesC16 &aDes);
+	IMPORT_C void Copy(const TUint16 *aBuf,TInt aLength);
+	IMPORT_C void Copy(const TUint16 *aString);
+	IMPORT_C void Append(TChar aChar);
+	IMPORT_C void Append(const TDesC16 &aDes);
+	IMPORT_C void Append(const TUint16 *aBuf,TInt aLength);
+	IMPORT_C void Fill(TChar aChar);
+	IMPORT_C void Fill(TChar aChar,TInt aLength);
+	IMPORT_C void FillZ();
+	IMPORT_C void FillZ(TInt aLength);
+	IMPORT_C void NumFixedWidth(TUint aVal,TRadix aRadix,TInt aWidth);
+	IMPORT_C void AppendNumFixedWidth(TUint aVal,TRadix aRadix,TInt aWidth);
+	IMPORT_C TPtr16 LeftTPtr(TInt aLength) const;
+	IMPORT_C TPtr16 RightTPtr(TInt aLength) const;
+	IMPORT_C TPtr16 MidTPtr(TInt aPos) const;
+	IMPORT_C TPtr16 MidTPtr(TInt aPos,TInt aLength) const;
+	IMPORT_C const TUint16 *PtrZ();
+	IMPORT_C void CopyF(const TDesC16 &aDes);
+	IMPORT_C void CopyC(const TDesC16 &aDes);
+	IMPORT_C void CopyLC(const TDesC16 &aDes);
+	IMPORT_C void CopyUC(const TDesC16 &aDes);
+	IMPORT_C void CopyCP(const TDesC16 &aDes);
+	IMPORT_C void AppendFill(TChar aChar,TInt aLength);
+	IMPORT_C void ZeroTerminate();
+	IMPORT_C void Swap(TDes16 &aDes);
+	IMPORT_C void Fold();
+	IMPORT_C void Collate();
+	IMPORT_C void LowerCase();
+	IMPORT_C void UpperCase();
+	IMPORT_C void Capitalize();
+	IMPORT_C void Repeat(const TDesC16 &aDes);
+	IMPORT_C void Repeat(const TUint16 *aBuf,TInt aLength);
+	IMPORT_C void Trim();
+	IMPORT_C void TrimAll();
+	IMPORT_C void TrimLeft();
+	IMPORT_C void TrimRight();
+	IMPORT_C void Insert(TInt aPos,const TDesC16 &aDes);
+	IMPORT_C void Delete(TInt aPos,TInt aLength);
+	IMPORT_C void Replace(TInt aPos,TInt aLength,const TDesC16 &aDes);
+	IMPORT_C void Justify(const TDesC16 &aDes,TInt aWidth,TAlign anAlignment,TChar aFill);
+	IMPORT_C void NumFixedWidthUC(TUint aVal,TRadix aRadix,TInt aWidth);
+	IMPORT_C void NumUC(TUint64 aVal, TRadix aRadix=EDecimal);
+	IMPORT_C TInt Num(TReal aVal,const TRealFormat &aFormat) __SOFTFP;
+	IMPORT_C void Num(TInt64 aVal);
+	IMPORT_C void Num(TUint64 aVal, TRadix aRadix);
+	IMPORT_C void Format(TRefByValue<const TDesC16> aFmt,...);
+	IMPORT_C void FormatList(const TDesC16 &aFmt,VA_LIST aList);
+	IMPORT_C void AppendJustify(const TDesC16 &Des,TInt aWidth,TAlign anAlignment,TChar aFill);
+	IMPORT_C void AppendJustify(const TDesC16 &Des,TInt aLength,TInt aWidth,TAlign anAlignment,TChar aFill);
+	IMPORT_C void AppendJustify(const TUint16 *aString,TInt aWidth,TAlign anAlignment,TChar aFill);
+	IMPORT_C void AppendJustify(const TUint16 *aString,TInt aLength,TInt aWidth,TAlign anAlignment,TChar aFill);
+	IMPORT_C void AppendNumFixedWidthUC(TUint aVal,TRadix aRadix,TInt aWidth);
+	IMPORT_C void AppendNumUC(TUint64 aVal, TRadix aRadix=EDecimal);
+	IMPORT_C TInt AppendNum(TReal aVal,const TRealFormat &aFormat) __SOFTFP;
+	IMPORT_C void AppendNum(TInt64 aVal);
+	IMPORT_C void AppendNum(TUint64 aVal, TRadix aRadix);
+	IMPORT_C void AppendFormat(TRefByValue<const TDesC16> aFmt,TDes16Overflow *aOverflowHandler,...);
+	IMPORT_C void AppendFormat(TRefByValue<const TDesC16> aFmt,...);
+	IMPORT_C void AppendFormatList(const TDesC16 &aFmt,VA_LIST aList,TDes16Overflow *aOverflowHandler=NULL);
+	IMPORT_C TPtr8 Collapse();
+protected:
+	inline TDes16() {}
+	inline TDes16(TInt aType,TInt aLength,TInt aMaxLength);
+// delay this for a while
+#ifdef SYMBIAN_FIX_TDESC_CONSTRUCTORS
+	inline TDes16(const TDes16& aOther) : TDesC16(aOther), iMaxLength(aOther.iMaxLength) {}
+#endif
+	inline TUint16 *WPtr() const;
+	void DoAppendNum(TUint64 aVal, TRadix aRadix, TUint aA, TInt aW);
+	void DoPadAppendNum(TInt aLength, TInt aW, const TUint8* aBuf);
+protected:
+	TInt iMaxLength;
+	__DECLARE_TEST;
+    };
+//
+class TPtr16 : public TDes16
+/**
+@publishedAll
+@released
+
+16-bit modifiable pointer descriptor
+
+This is a descriptor class intended for instantiation and encapsulates a
+pointer to the 16-bit data that it represents. The data can live in ROM or
+RAM and this location is separate from the descriptor object itself.
+
+The data is intended to be accessed and modified through this descriptor. 
+The base classes provide the functions through which the data can be
+manipulated.
+
+@see TPtr
+@see TPtrC16
+@see TDesC16
+@see TDes16
+@see TBufC16
+@see TBuf16
+@see HBufC16
+*/
+	{
+public:
+	IMPORT_C TPtr16(TUint16 *aBuf,TInt aMaxLength);
+	IMPORT_C TPtr16(TUint16 *aBuf,TInt aLength,TInt aMaxLength);
+	inline TPtr16& operator=(const TUint16 *aString);
+	inline TPtr16& operator=(const TDesC16& aDes);
+	inline TPtr16& operator=(const TPtr16& aDes);
+	inline void Set(TUint16 *aBuf,TInt aLength,TInt aMaxLength);
+	inline void Set(const TPtr16 &aPtr);
+private:
+	IMPORT_C TPtr16(TBufCBase16 &aLcb,TInt aMaxLength);
+protected:
+	TUint16 *iPtr;
+private:
+	friend class TBufCBase16;
+	__DECLARE_TEST;
+	};
+//
+class TBufCBase16 : public TDesC16
+/**
+@internalAll
+*/
+	{
+protected:
+	IMPORT_C TBufCBase16();
+	inline TBufCBase16(TInt aLength);
+	IMPORT_C TBufCBase16(const TUint16 *aString,TInt aMaxLength);
+	IMPORT_C TBufCBase16(const TDesC16 &aDes,TInt aMaxLength);
+	IMPORT_C void Copy(const TUint16 *aString,TInt aMaxLength);
+	IMPORT_C void Copy(const TDesC16 &aDes,TInt aMaxLength);
+	inline TPtr16 DoDes(TInt aMaxLength);
+	inline TUint16 *WPtr() const;
+	};
+//
+class RReadStream;
+class HBufC16 : public TBufCBase16
+/**
+@publishedAll
+@released
+
+16-bit heap descriptor.
+
+This is a descriptor class which provides a buffer of fixed length, allocated 
+on the heap, for containing and accessing data.
+
+The class is intended for instantiation.
+
+Heap descriptors have the important property that they can be made larger 
+or smaller, changing the size of the descriptor buffer. This is achieved by 
+reallocating the descriptor. Unlike the behaviour of dynamic buffers, reallocation 
+is not done automatically.
+
+Data is intended to be accessed, but not modified; however, it can be completely 
+replaced using the assignment operators of this class. The base class (TDesC16) provides 
+the functions through which the data is accessed.
+
+The descriptor is hosted by a heap cell, and the 16-bit data that the descriptor 
+represents is part of the descriptor object itself. The size of the cell depends 
+on the requested maximum length of the descriptor buffer when the descriptor 
+is created or re-allocated.
+
+It is important to note that the size of the allocated cell, and, therefore, 
+the resulting maximum length of the descriptor, may be larger than requested 
+due to the way memory is allocated in Symbian OS. The amount by which this 
+may be rounded up depends on the platform and build type.
+
+@see HBufC
+@see TPtr16
+@see TDesC16
+*/
+	{
+public:
+	IMPORT_C static HBufC16 *New(TInt aMaxLength);
+	IMPORT_C static HBufC16 *NewL(TInt aMaxLength);
+	IMPORT_C static HBufC16 *NewLC(TInt aMaxLength);
+	IMPORT_C static HBufC16 *NewMax(TInt aMaxLength);
+	IMPORT_C static HBufC16 *NewMaxL(TInt aMaxLength);
+	IMPORT_C static HBufC16 *NewMaxLC(TInt aMaxLength);
+	IMPORT_C static HBufC16 *NewL(RReadStream &aStream,TInt aMaxLength);
+	IMPORT_C static HBufC16 *NewLC(RReadStream &aStream,TInt aMaxLength);
+	IMPORT_C HBufC16& operator=(const TUint16 *aString);
+	IMPORT_C HBufC16& operator=(const TDesC16 &aDes);
+	inline HBufC16& operator=(const HBufC16 &aLcb);
+	IMPORT_C HBufC16 *ReAlloc(TInt aMaxLength);
+	IMPORT_C HBufC16 *ReAllocL(TInt aMaxLength);
+	IMPORT_C TPtr16 Des();
+private:
+	inline HBufC16(TInt aLength);
+private:
+	TText16 iBuf[1];
+	__DECLARE_TEST;
+	};
+//
+/**
+@internalComponent
+*/
+#define __Size16 (sizeof(TInt)/sizeof(TInt16))
+/**
+@internalComponent
+*/
+#define __Align16(s) ((((s)+__Size16-1)/__Size16)*__Size16)
+//
+template <TInt S>
+class TBufC16 : public TBufCBase16
+/**
+@publishedAll
+@released
+
+16-bit non-modifiable buffer descriptor.
+
+This is a descriptor class which provides a buffer of fixed length for
+containing and accessing TUint16 data.
+
+The class intended for instantiation. The 16-bit data that the descriptor 
+represents is part of the descriptor object itself.
+
+The class is templated, based on an integer value which defines the size of 
+the descriptor's data area.
+
+The data is intended to be accessed, but not modified; however, it can be 
+completely replaced using the assignment operators of this class. The base 
+class provides the functions through which the data is accessed.
+
+@see TBufC
+@see TDesC16
+@see TPtr16
+@see TUint16
+*/
+	{
+public:
+	inline TBufC16();
+    inline TBufC16(const TUint16 *aString);
+	inline TBufC16(const TDesC16 &aDes);
+	inline TBufC16<S> &operator=(const TUint16 *aString);
+	inline TBufC16<S> &operator=(const TDesC16 &aDes);
+	inline TPtr16 Des();
+protected:
+	TUint16 iBuf[__Align16(S)];
+	};
+//
+class TBufBase16 : public TDes16
+/**
+@internalAll
+*/	
+	{
+protected:
+	IMPORT_C TBufBase16(TInt aMaxLength);
+	IMPORT_C TBufBase16(TInt aLength,TInt aMaxLength);
+	IMPORT_C TBufBase16(const TUint16* aString,TInt aMaxLength);
+	IMPORT_C TBufBase16(const TDesC16& aDes,TInt aMaxLength);
+	};
+//
+template <TInt S>
+class TBuf16 : public TBufBase16
+/**
+@publishedAll
+@released
+
+A descriptor class which provides a buffer of fixed length for
+containing, accessing and manipulating TUint16 data.
+
+The class is intended for instantiation. The 16-bit data that the descriptor 
+represents is part of the descriptor object itself.
+
+The class is templated, based on an integer value which determines the size 
+of the data area which is created as part of the buffer descriptor object; 
+this is also the maximum length of the descriptor.
+
+The data is intended to be both accessed and modified. The base classes provide 
+the functions through which the data is accessed.
+
+@see TBuf
+@see TDesC16
+@see TDes16
+@see TPtr16
+*/
+	{
+public:
+	inline TBuf16();
+	inline explicit TBuf16(TInt aLength);
+    inline TBuf16(const TUint16* aString);
+	inline TBuf16(const TDesC16& aDes);
+	inline TBuf16<S>& operator=(const TUint16* aString);
+	inline TBuf16<S>& operator=(const TDesC16& aDes);
+	inline TBuf16<S>& operator=(const TBuf16<S>& aDes);
+protected:
+	TUint16 iBuf[__Align16(S)];
+	};
+
+
+#ifndef __KERNEL_MODE__
+
+class RBuf16 : public TDes16
+/**
+@publishedAll
+@released
+
+16 bit resizable buffer descriptor.
+
+The class provides a buffer that contains, accesses and manipulates
+TUint16 data. The buffer itself is on the heap, and is managed by the class.
+
+Internally, RBuf16 behaves in one of two ways:
+
+- as a TPtr16 descriptor type, where the buffer just contains data
+- as a pointer to a heap descriptor, an HBufC16* type, where the buffer
+  contains both	descriptor information and the data.
+
+Note that the handling of the distinction is hidden from view.
+
+An RBuf16 object can allocate its own buffer. Alternatively, it can take
+ownership of a pre-existing section of allocated memory, or it can take
+ownership of a pre-existing heap descriptor. It can also reallocate the buffer
+to resize it. Regardless of the way in which the buffer has been allocated,
+the RBuf16 object is responsible for freeing memory when the object itself is closed.
+
+The class is intended for instantiation.
+
+The class is derived from TDes16, which means that data can be both accessed
+and modified. The base classes provide the functions through which the data is
+accessed. In addition, an RBuf16 object can be passed to any function that is
+prototyped to take a TDes16 or a TDesC16 type.
+
+@see TBuf16
+@see TPtr16
+@see HBufC16
+@see TDesC16
+@see TDes16
+*/
+	{
+public:
+	IMPORT_C RBuf16();
+	IMPORT_C explicit RBuf16(HBufC16* aHBuf);
+	inline RBuf16& operator=(const TUint16* aString);
+	inline RBuf16& operator=(const TDesC16& aDes);
+	inline RBuf16& operator=(const RBuf16& aDes);
+	IMPORT_C void Assign(const RBuf16& aRBuf);
+	IMPORT_C void Assign(TUint16 *aHeapCell,TInt aMaxLength);
+	IMPORT_C void Assign(TUint16 *aHeapCell,TInt aLength,TInt aMaxLength);
+	IMPORT_C void Assign(HBufC16* aHBuf);
+	IMPORT_C void Swap(RBuf16& aRBuf);
+	IMPORT_C TInt Create(TInt aMaxLength);
+	IMPORT_C void CreateL(TInt aMaxLength);
+	IMPORT_C TInt CreateMax(TInt aMaxLength);
+	IMPORT_C void CreateMaxL(TInt aMaxLength);
+	inline void CreateL(RReadStream &aStream,TInt aMaxLength);
+	IMPORT_C TInt Create(const TDesC16& aDes);
+	IMPORT_C void CreateL(const TDesC16& aDes);
+	IMPORT_C TInt Create(const TDesC16& aDes,TInt aMaxLength);
+	IMPORT_C void CreateL(const TDesC16& aDes,TInt aMaxLength);
+	IMPORT_C TInt ReAlloc(TInt aMaxLength);
+	IMPORT_C void ReAllocL(TInt aMaxLength);
+	IMPORT_C void Close();
+	IMPORT_C void CleanupClosePushL();
+
+protected:
+	IMPORT_C RBuf16(TInt aType,TInt aLength,TInt aMaxLength);
+	RBuf16(const RBuf16&); // Outlaw copy construction
+	union
+		{
+		TUint16* iEPtrType;		//Pointer to data used when RBuf is of EPtr type
+		HBufC16* iEBufCPtrType;	//Pointer to data used when RBuf is of EBufCPtr type
+		};
+	__DECLARE_TEST;
+	};
+
+#endif //__KERNEL_MODE__
+
+
+/**
+@publishedAll
+@released
+
+Value reference used in operator TLitC16::__TRefDesC16()
+
+@see TRefByValue
+*/
+typedef TRefByValue<const TDesC16> __TRefDesC16;
+
+
+
+
+template <TInt S>
+class TLitC16
+/**
+@publishedAll
+@released
+
+Encapsulates literal text. 
+
+This is always constructed using an _LIT16 macro.
+
+This class is build independent; i.e. an explicit 16-bit build variant
+is generated for both a non-Unicode build and a Unicode build.
+
+The class has no explicit constructors.
+
+@see _LIT16
+*/
+	{
+public:
+	inline const TDesC16* operator&() const;
+	inline operator const TDesC16&() const;
+	inline const TDesC16& operator()() const;
+	inline operator const __TRefDesC16() const;
+public:
+#if defined(__GCC32__)
+    /**
+    @internalComponent
+    */
+	typedef wchar_t __TText;
+#elif defined(__VC32__)
+    /**
+    @internalComponent
+    */
+	typedef TUint16 __TText;
+#elif defined(__CW32__)
+    /**
+    @internalComponent
+    */
+	typedef TUint16 __TText;
+#elif !defined(__TText_defined)
+#error	no typedef for __TText
+#endif
+public:
+    /**
+    @internalComponent
+    */
+	TUint iTypeLength;
+	
+	/**
+    @internalComponent
+    */
+	__TText iBuf[__Align16(S)];
+	};
+
+#ifndef SYMBIAN_ENABLE_SPLIT_HEADERS
+#include <e32des16_private.h>
+#endif
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32/include/e32des16_private.h	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,26 @@
+// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32\include\e32des16_private.h
+// 
+//
+
+#ifndef __E32DES16_PRIVATE_H__
+#define __E32DES16_PRIVATE_H__
+
+/**
+@internalComponent
+*/
+const TInt KShiftDesType16=28;
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32/include/e32des8.h	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,693 @@
+// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32\include\e32des8.h
+// 
+//
+
+#ifndef __E32DES8_H__
+#define __E32DES8_H__
+
+/**
+@internalComponent
+*/
+const TUint KMaskDesLength8=0xfffffff;
+
+class TBufCBase8;
+class TDes8;
+class TPtrC8;
+class TPtr8;
+class TPtr16;
+#ifndef __KERNEL_MODE__
+class HBufC8;
+#endif
+class TDesC8
+/**
+@publishedAll
+@released
+
+Abstract base class for 8-bit non-modifiable descriptors.
+
+The class encapsulates the data member containing the length of data
+represented by an 8-bit descriptor. It also provides member functions through
+which the data can be accessed, but not modified.
+
+Data represented by this class is treated as a contiguous set of 8-bit (i.e. 
+single byte) values or data items.
+
+This class cannot be instantiated as it is intended to form part of a class 
+hierarchy; it provides a well defined part of descriptor behaviour. It can, 
+however, be passed as an argument type for functions which want access to 
+descriptor data but do not need to modify that data.
+
+@see TDesC
+@see TPtrC8
+*/
+    {
+public:
+	inline TBool operator<(const TDesC8 &aDes) const;
+	inline TBool operator<=(const TDesC8 &aDes) const;
+	inline TBool operator>(const TDesC8 &aDes) const;
+	inline TBool operator>=(const TDesC8 &aDes) const;
+	inline TBool operator==(const TDesC8 &aDes) const;
+	inline TBool operator!=(const TDesC8 &aDes) const;
+	inline const TUint8 &operator[](TInt anIndex) const;
+	inline TInt Length() const;
+	inline TInt Size() const;
+	IMPORT_C const TUint8 *Ptr() const;
+	IMPORT_C TInt Compare(const TDesC8 &aDes) const;
+	IMPORT_C TInt Match(const TDesC8 &aDes) const;
+	IMPORT_C TInt MatchF(const TDesC8 &aDes) const;
+	IMPORT_C TInt MatchC(const TDesC8 &aDes) const;
+	IMPORT_C TInt Locate(TChar aChar) const;
+	IMPORT_C TInt LocateReverse(TChar aChar) const;
+	IMPORT_C TInt Find(const TDesC8 &aDes) const;
+	IMPORT_C TInt Find(const TUint8 *pS,TInt aLenS) const;
+	IMPORT_C TPtrC8 Left(TInt aLength) const;
+	IMPORT_C TPtrC8 Right(TInt aLength) const;
+	IMPORT_C TPtrC8 Mid(TInt aPos) const;
+	IMPORT_C TPtrC8 Mid(TInt aPos,TInt aLength) const;
+	IMPORT_C TInt CompareF(const TDesC8 &aDes) const;
+#ifndef __KERNEL_MODE__
+	IMPORT_C TInt CompareC(const TDesC8 &aDes) const;
+	IMPORT_C TInt LocateF(TChar aChar) const;
+	IMPORT_C TInt LocateReverseF(TChar aChar) const;
+	IMPORT_C TInt FindF(const TDesC8 &aDes) const;
+	IMPORT_C TInt FindF(const TUint8 *pS,TInt aLenS) const;
+	IMPORT_C TInt FindC(const TDesC8 &aDes) const;
+	IMPORT_C TInt FindC(const TUint8 *pS,TInt aLenS) const;
+	IMPORT_C HBufC8 *Alloc() const;
+	IMPORT_C HBufC8 *AllocL() const;
+	IMPORT_C HBufC8 *AllocLC() const;
+#endif
+protected:
+	inline TDesC8(TInt aType,TInt aLength);
+	inline TDesC8() {}
+// delay this for a while
+#ifdef SYMBIAN_FIX_TDESC_CONSTRUCTORS
+	inline TDesC8( const TDesC8& aOther) : iLength(aOther.iLength) {}
+#endif
+//	inline ~TDesC8() {}			Commented out for the moment since it breaks code
+	inline TInt Type() const;
+	inline void DoSetLength(TInt aLength);
+	IMPORT_C const TUint8 &AtC(TInt anIndex) const;
+private:
+	TUint iLength;
+	__DECLARE_TEST;
+    };
+//
+class TPtrC8 : public TDesC8
+/**
+@publishedAll
+@released
+
+8-bit non-modifiable pointer descriptor.
+
+This is a descriptor class intended for instantiation and encapsulates a
+pointer to the 8-bit data that it represents. The data can live in ROM or RAM
+and this location is separate from the descriptor object itself.
+
+The data is intended to be accessed, but not changed, through this descriptor. 
+The base class provides the functions through which data is accessed.
+
+@see TPtr8
+@see TDesC8
+@see TDes8
+@see TBufC8
+@see TBuf8
+@see HBufC8
+*/
+	{
+public:
+	IMPORT_C TPtrC8();
+	IMPORT_C TPtrC8(const TDesC8 &aDes);
+	IMPORT_C TPtrC8(const TUint8 *aString);
+	IMPORT_C TPtrC8(const TUint8 *aBuf,TInt aLength);
+	inline void Set(const TUint8 *aBuf,TInt aLength);
+	inline void Set(const TDesC8 &aDes);
+	inline void Set(const TPtrC8& aPtr);
+private:
+	TPtrC8& operator=(const TPtrC8 &aDes);
+protected:
+	const TUint8 *iPtr;
+private:
+	__DECLARE_TEST;
+	};
+//
+class TDes8Overflow
+/**
+@publishedAll
+@released
+
+An interface that defines an overflow handler for an 8-bit descriptor.
+
+The interface encapsulates a function that is called when an attempt to append 
+formatted text fails because the descriptor is already at its maximum length.
+
+A derived class must provide an implementation for the Overflow() member
+function.
+
+@see TDes8::AppendFormat
+*/
+	{
+public:
+    /**
+    Handles the overflow.
+    
+    This function is called when the TDes8::AppendFormat() variant that takes
+    an overflow handler argument, fails.
+	
+	@param aDes The 8-bit modifiable descriptor whose overflow results in the 
+	            call to this overflow handler.
+	*/
+	virtual void Overflow(TDes8 &aDes)=0;
+	};
+//
+class TDes8IgnoreOverflow : public TDes8Overflow
+/**
+@publishedAll
+@released
+
+A derived class which provides an implementation for the Overflow() member function
+where truncation is required.
+
+@see TDes16::AppendFormat
+*/
+	{
+public:
+	/**
+	Handles the overflow.
+	
+	This function is called when the TDes8::AppendFormat() 
+	variant that takes an overflow handler argument, fails.
+	
+	@param aDes The 8-bit modifiable descriptor whose overflow results in the 
+	            call to this overflow handler.
+	*/
+	IMPORT_C virtual void Overflow(TDes8 &aDes);
+	};
+//
+class TDesC16;
+class TRealFormat;
+class TDes8 : public TDesC8
+/** 
+@publishedAll
+@released
+
+Abstract base class for 8-bit modifiable descriptors.
+
+The class encapsulates the data member containing the maximum length of data
+represented by an 8-bit descriptor. It also provides member functions through
+which the data can be modified.
+
+The class adds to the behaviour provided by TDesC8.
+
+This class cannot be instantiated as it is intended to form part of a class 
+hierarchy; it provides a well defined part of descriptor behaviour. It can, 
+however, be passed as an argument type for functions which need to both modify 
+and access descriptor data.
+
+@see TDes
+@see TDesC8
+@see TDesC16
+*/
+	{
+public:
+	inline TDes8& operator=(const TUint8 *aString);
+	inline TDes8& operator=(const TDesC8 &aDes);
+	inline TDes8& operator=(const TDes8 &aDes);
+	inline TInt MaxLength() const;
+	inline TInt MaxSize() const;
+	inline const TUint8 &operator[](TInt anIndex) const;
+	inline TUint8 &operator[](TInt anIndex);
+	inline TDes8 &operator+=(const TDesC8 &aDes);
+	IMPORT_C void Zero();
+ 	IMPORT_C void SetLength(TInt aLength);
+ 	IMPORT_C void SetMax();
+	IMPORT_C void Copy(const TDesC8 &aDes);
+	IMPORT_C void Copy(const TUint8 *aBuf,TInt aLength);
+	IMPORT_C void Copy(const TUint8 *aString);
+	IMPORT_C void Copy(const TDesC16 &aDes);
+	IMPORT_C void Append(TChar aChar);
+	IMPORT_C void Append(const TDesC8 &aDes);
+	IMPORT_C void Append(const TDesC16 &aDes);
+	IMPORT_C void Append(const TUint8 *aBuf,TInt aLength);
+	IMPORT_C void Fill(TChar aChar);
+	IMPORT_C void Fill(TChar aChar,TInt aLength);
+	IMPORT_C void FillZ();
+	IMPORT_C void FillZ(TInt aLength);
+	IMPORT_C void Num(TInt64 aVal);
+	IMPORT_C void Num(TUint64 aVal, TRadix aRadix);
+	IMPORT_C void NumFixedWidth(TUint aVal,TRadix aRadix,TInt aWidth);
+	IMPORT_C void AppendNum(TInt64 aVal);
+	IMPORT_C void AppendNum(TUint64 aVal, TRadix aRadix);
+	IMPORT_C void AppendNumFixedWidth(TUint aVal,TRadix aRadix,TInt aWidth);
+#ifndef __KERNEL_MODE__
+	IMPORT_C TPtr8 LeftTPtr(TInt aLength) const;
+	IMPORT_C TPtr8 RightTPtr(TInt aLength) const;
+	IMPORT_C TPtr8 MidTPtr(TInt aPos) const;
+	IMPORT_C TPtr8 MidTPtr(TInt aPos,TInt aLength) const;
+	IMPORT_C const TUint8 *PtrZ();
+	IMPORT_C void CopyF(const TDesC8 &aDes);
+	IMPORT_C void CopyC(const TDesC8 &aDes);
+	IMPORT_C void CopyLC(const TDesC8 &aDes);
+	IMPORT_C void CopyUC(const TDesC8 &aDes);
+	IMPORT_C void CopyCP(const TDesC8 &aDes);
+	IMPORT_C void Swap(TDes8 &aDes);
+	IMPORT_C void AppendFill(TChar aChar,TInt aLength);
+	IMPORT_C void ZeroTerminate();
+	IMPORT_C void Fold();
+	IMPORT_C void Collate();
+	IMPORT_C void LowerCase();
+	IMPORT_C void UpperCase();
+	IMPORT_C void Capitalize();
+	IMPORT_C void Repeat(const TUint8 *aBuf,TInt aLength);
+	IMPORT_C void Repeat(const TDesC8 &aDes);
+	IMPORT_C void Trim();
+	IMPORT_C void TrimAll();
+	IMPORT_C void TrimLeft();
+	IMPORT_C void TrimRight();
+	IMPORT_C void Insert(TInt aPos,const TDesC8 &aDes);
+	IMPORT_C void Delete(TInt aPos,TInt aLength);
+	IMPORT_C void Replace(TInt aPos,TInt aLength,const TDesC8 &aDes);
+	IMPORT_C void Justify(const TDesC8 &aDes,TInt aWidth,TAlign anAlignment,TChar aFill);
+	IMPORT_C void NumFixedWidthUC(TUint aVal,TRadix aRadix,TInt aWidth);
+	IMPORT_C void NumUC(TUint64 aVal, TRadix aRadix=EDecimal);
+	IMPORT_C TInt Num(TReal aVal,const TRealFormat &aFormat) __SOFTFP;
+	IMPORT_C void AppendNumFixedWidthUC(TUint aVal,TRadix aRadix,TInt aWidth);
+	IMPORT_C TInt AppendNum(TReal aVal,const TRealFormat &aFormat) __SOFTFP;
+	IMPORT_C void AppendNumUC(TUint64 aVal,TRadix aRadix=EDecimal);
+	IMPORT_C void Format(TRefByValue<const TDesC8> aFmt,...);
+	IMPORT_C void FormatList(const TDesC8 &aFmt,VA_LIST aList);
+	IMPORT_C void AppendJustify(const TDesC8 &Des,TInt aWidth,TAlign anAlignment,TChar aFill);
+	IMPORT_C void AppendJustify(const TDesC8 &Des,TInt aLength,TInt aWidth,TAlign anAlignment,TChar aFill);
+	IMPORT_C void AppendJustify(const TUint8 *aString,TInt aWidth,TAlign anAlignment,TChar aFill);
+	IMPORT_C void AppendJustify(const TUint8 *aString,TInt aLength,TInt aWidth,TAlign anAlignment,TChar aFill);
+	IMPORT_C void AppendFormat(TRefByValue<const TDesC8> aFmt,TDes8Overflow *aOverflowHandler,...);
+	IMPORT_C void AppendFormat(TRefByValue<const TDesC8> aFmt,...);
+	IMPORT_C void AppendFormatList(const TDesC8 &aFmt,VA_LIST aList,TDes8Overflow *aOverflowHandler=NULL);
+	IMPORT_C TPtr16 Expand();
+	IMPORT_C void Collapse();
+#endif //__KERNEL_MODE__
+protected:
+	inline TDes8(TInt aType,TInt aLength,TInt aMaxLength);
+	inline TUint8 *WPtr() const;
+	inline TDes8() {}
+// delay this for a while
+#ifdef SYMBIAN_FIX_TDESC_CONSTRUCTORS
+	inline TDes8(const TDes8& aOther) : TDesC8(aOther), iMaxLength(aOther.iMaxLength) {}
+#endif
+	void DoAppendNum(TUint64 aVal, TRadix aRadix, TUint aA, TInt aW);
+	void DoPadAppendNum(TInt aLength, TInt aW, const TUint8* aBuf);
+protected:
+	TInt iMaxLength;
+	__DECLARE_TEST;
+    };
+//
+class TPtr8 : public TDes8
+/**
+@publishedAll
+@released
+
+8-bit modifiable pointer descriptor.
+
+This is a descriptor class intended for instantiation and encapsulates a
+pointer to the 8-bit data that it represents. The data can live in ROM or
+RAM and this location is separate from the descriptor object itself.
+
+The data is intended to be accessed and modified through this descriptor. 
+The base classes provide the functions through which the data can be 
+manipulated.
+
+@see TPtr
+@see TPtrC8
+@see TDesC8
+@see TDes8
+@see TBufC8
+@see TBuf8
+@see HBufC8
+*/
+	{
+public:
+	IMPORT_C TPtr8(TUint8 *aBuf,TInt aMaxLength);
+	IMPORT_C TPtr8(TUint8 *aBuf,TInt aLength,TInt aMaxLength);
+	inline TPtr8& operator=(const TUint8 *aString);
+	inline TPtr8& operator=(const TDesC8& aDes);
+	inline TPtr8& operator=(const TPtr8& aPtr);
+	inline void Set(TUint8 *aBuf,TInt aLength,TInt aMaxLength);
+	inline void Set(const TPtr8 &aPtr);
+private:
+	IMPORT_C TPtr8(TBufCBase8 &aLcb,TInt aMaxLength);
+protected:
+	TUint8 *iPtr;
+private:
+	friend class TBufCBase8;
+	__DECLARE_TEST;
+	};
+//
+class TBufCBase8 : public TDesC8
+/**
+@internalAll
+*/
+	{
+protected:
+	IMPORT_C TBufCBase8();
+	inline TBufCBase8(TInt aLength);
+	IMPORT_C TBufCBase8(const TUint8 *aString,TInt aMaxLength);
+	IMPORT_C TBufCBase8(const TDesC8 &aDes,TInt aMaxLength);
+	IMPORT_C void Copy(const TUint8 *aString,TInt aMaxLength);
+	IMPORT_C void Copy(const TDesC8 &aDes,TInt aMaxLength);
+	inline TPtr8 DoDes(TInt aMaxLength);
+	inline TUint8 *WPtr() const;
+	};
+//
+#ifndef __KERNEL_MODE__
+class RReadStream;
+class HBufC8 : public TBufCBase8
+/**
+@publishedAll
+@released
+
+8-bit heap descriptor.
+
+This is a descriptor class which provides a buffer of fixed length, allocated 
+on the heap, for containing and accessing data.
+
+The class is intended for instantiation.
+
+Heap descriptors have the important property that they can be made larger 
+or smaller, changing the size of the descriptor buffer. This is achieved by 
+reallocating the descriptor. Unlike the behaviour of dynamic buffers, 
+reallocation is not done automatically.
+
+Data is intended to be accessed, but not modified; however, it can be 
+completely replaced using the assignment operators of this class. The base
+class (TDesC8) provides the functions through which the data is accessed.
+
+The descriptor is hosted by a heap cell, and the 8-bit data that the
+descriptor represents is part of the descriptor object itself. The size of the
+cell depends on the requested maximum length of the descriptor buffer when the
+descriptor is created or re-allocated.
+
+It is important to note that the size of the allocated cell, and, therefore, 
+the resulting maximum length of the descriptor, may be larger than requested 
+due to the way memory is allocated in Symbian OS. The amount by which this 
+may be rounded up depends on the platform and build type.
+
+@see HBufC
+@see TPtr8
+@see TDesC8
+*/
+	{
+public:
+	IMPORT_C static HBufC8 *New(TInt aMaxLength);
+	IMPORT_C static HBufC8 *NewL(TInt aMaxLength);
+	IMPORT_C static HBufC8 *NewLC(TInt aMaxLength);
+	IMPORT_C static HBufC8 *NewMax(TInt aMaxLength);
+	IMPORT_C static HBufC8 *NewMaxL(TInt aMaxLength);
+	IMPORT_C static HBufC8 *NewMaxLC(TInt aMaxLength);
+	IMPORT_C static HBufC8 *NewL(RReadStream &aStream,TInt aMaxLength);
+	IMPORT_C static HBufC8 *NewLC(RReadStream &aStream,TInt aMaxLength);
+	IMPORT_C HBufC8& operator=(const TUint8 *aString);
+	IMPORT_C HBufC8& operator=(const TDesC8 &aDes);
+	inline HBufC8& operator=(const HBufC8 &aLcb);
+	IMPORT_C HBufC8 *ReAlloc(TInt aMaxLength);
+	IMPORT_C HBufC8 *ReAllocL(TInt aMaxLength);
+	IMPORT_C TPtr8 Des();
+private:
+	inline HBufC8(TInt aLength);
+private:
+	TText8 iBuf[1];
+	__DECLARE_TEST;
+	};
+#endif
+//
+/**
+@internalComponent
+*/
+#define __Size8 (sizeof(TInt)/sizeof(TInt8))
+/**
+@internalComponent
+*/
+#define __Align8(s) ((((s)+__Size8-1)/__Size8)*__Size8)
+//
+template <TInt S>
+class TBufC8 : public TBufCBase8
+/**
+@publishedAll
+@released
+
+8-bit non-modifiable buffer descriptor. 
+
+This is a descriptor class which provides a buffer of fixed length for
+containing and accessing TUint8 data.
+
+The class intended for instantiation. The 8-bit data that the descriptor
+represents is part of the descriptor object itself. 
+
+The class is templated, based on an integer value which defines the size of 
+the descriptor's data area.
+
+The data is intended to be accessed, but not modified; however, it can be 
+completely replaced using the assignment operators of this class. The base 
+class provides the functions through which the data is accessed.
+
+@see TBufC
+@see TDesC8
+@see TPtr8
+@see TUint8
+*/
+	{
+public:
+	inline TBufC8();
+    inline TBufC8(const TUint8 *aString);
+	inline TBufC8(const TDesC8 &aDes);
+	inline TBufC8<S> &operator=(const TUint8 *aString);
+	inline TBufC8<S> &operator=(const TDesC8 &aDes);
+	inline TPtr8 Des();
+protected:
+	TUint8 iBuf[__Align8(S)];
+	};
+//
+class TBufBase8 : public TDes8
+/**
+@internalAll
+*/
+	{
+protected:
+	IMPORT_C TBufBase8(TInt aMaxLength);
+	IMPORT_C TBufBase8(TInt aLength,TInt aMaxLength);
+	IMPORT_C TBufBase8(const TUint8* aString,TInt aMaxLength);
+	IMPORT_C TBufBase8(const TDesC8& aDes,TInt aMaxLength);
+	};
+//
+template <TInt S>
+class TBuf8 : public TBufBase8
+/**
+@publishedAll
+@released
+
+A descriptor class which provides a buffer of fixed length for
+containing, accessing and manipulating TUint8 data.
+
+The class is intended for instantiation. The 8-bit data that the descriptor 
+represents is part of the descriptor object itself.
+
+The class is templated, based on an integer value which determines the size 
+of the data area which is created as part of the buffer descriptor object; 
+this is also the maximum length of the descriptor.
+
+The data is intended to be both accessed and modified. The base classes provide 
+the functions through which the data is accessed.
+
+@see TBuf
+@see TDesC8
+@see TDes8
+@see TPtr8
+*/
+	{
+public:
+	inline TBuf8();
+	inline explicit TBuf8(TInt aLength);
+    inline TBuf8(const TUint8* aString);
+	inline TBuf8(const TDesC8& aDes);
+	inline TBuf8<S>& operator=(const TUint8* aString);
+	inline TBuf8<S>& operator=(const TDesC8& aDes);
+	inline TBuf8<S>& operator=(const TBuf8<S>& aBuf);
+protected:
+	TUint8 iBuf[__Align8(S)];
+	};
+
+//
+template <TInt S>
+class TAlignedBuf8 : public TBufBase8
+/**
+@internalComponent
+
+A descriptor class functionally identical to TBuf8, the only
+difference from it being that TAlignedBuf8's internal buffer 
+is guaranteed to be 64-bit aligned.
+
+At present this class is not intended for general use. It exists
+solely to support TPckgBuf which derives from it.
+
+@see TBuf8
+@see TPckgBuf
+*/
+{
+public:
+	inline TAlignedBuf8();
+	inline explicit TAlignedBuf8(TInt aLength);
+    inline TAlignedBuf8(const TUint8* aString);
+	inline TAlignedBuf8(const TDesC8& aDes);
+	inline TAlignedBuf8<S>& operator=(const TUint8* aString);
+	inline TAlignedBuf8<S>& operator=(const TDesC8& aDes);
+	inline TAlignedBuf8<S>& operator=(const TAlignedBuf8<S>& aBuf);
+protected:
+	union {
+		double only_here_to_force_8byte_alignment;
+		TUint8 iBuf[__Align8(S)];
+	};
+};
+
+#ifndef __KERNEL_MODE__
+
+class RBuf8 : public TDes8
+/**
+@publishedAll
+@released
+
+8 bit resizable buffer descriptor.
+
+The class provides a buffer that contains, accesses and manipulates
+TUint8 data. The buffer itself is on the heap, and is managed by the class.
+
+Internally, RBuf8 behaves in one of two ways:
+
+- as a TPtr8 descriptor type, where the buffer just contains data
+- as a pointer to a heap descriptor, an HBufC8* type, where the buffer
+  contains both	descriptor information and the data.
+
+Note that the handling of the distinction is hidden from view.
+
+An RBuf8 object can allocate its own buffer. Alternatively, it can take
+ownership of a pre-existing section of allocated memory, or it can take
+ownership of a pre-existing heap descriptor. It can also reallocate the buffer
+to resize it. Regardless of the way in which the buffer has been allocated,
+the RBuf8 object is responsible for freeing memory when the object itself is closed.
+
+The class is intended for instantiation.
+
+The class is derived from TDes8, which means that data can be both accessed
+and modified. The base classes provide the functions through which the data is
+accessed. In addition, an RBuf8 object can be passed to any function that is
+prototyped to take a TDes8 or a TDesC8 type.
+
+@see TBuf8
+@see TPtr8
+@see HBufC8
+@see TDesC8
+@see TDes8
+*/
+	{
+public:
+	IMPORT_C RBuf8();
+	IMPORT_C explicit RBuf8(HBufC8* aHBuf);
+	inline RBuf8& operator=(const TUint8* aString);
+	inline RBuf8& operator=(const TDesC8& aDes);
+	inline RBuf8& operator=(const RBuf8& aDes);
+	IMPORT_C void Assign(const RBuf8& aRBuf);
+	IMPORT_C void Assign(TUint8 *aHeapCell,TInt aMaxLength);
+	IMPORT_C void Assign(TUint8 *aHeapCell,TInt aLength,TInt aMaxLength);
+	IMPORT_C void Assign(HBufC8* aHBuf);
+	IMPORT_C void Swap(RBuf8& aRBuf);
+	IMPORT_C TInt Create(TInt aMaxLength);
+	IMPORT_C void CreateL(TInt aMaxLength);
+	IMPORT_C TInt CreateMax(TInt aMaxLength);
+	IMPORT_C void CreateMaxL(TInt aMaxLength);
+	inline void CreateL(RReadStream &aStream,TInt aMaxLength);
+	IMPORT_C TInt Create(const TDesC8& aDes);
+	IMPORT_C void CreateL(const TDesC8& aDes);
+	IMPORT_C TInt Create(const TDesC8& aDes,TInt aMaxLength);
+	IMPORT_C void CreateL(const TDesC8& aDes,TInt aMaxLength);
+	IMPORT_C TInt ReAlloc(TInt aMaxLength);
+	IMPORT_C void ReAllocL(TInt aMaxLength);
+	IMPORT_C void Close();
+	IMPORT_C void CleanupClosePushL();
+
+protected:
+	IMPORT_C RBuf8(TInt aType,TInt aLength,TInt aMaxLength);
+	RBuf8(const RBuf8&); // Outlaw copy construction
+	union
+		{
+		TUint8* iEPtrType;		//Pointer to data used when RBuf is of EPtr type
+		HBufC8* iEBufCPtrType;	//Pointer to data used when RBuf is of EBufCPtr type
+		};
+	__DECLARE_TEST;
+	};
+
+#endif
+
+/**
+@publishedAll
+@released
+
+Value reference used in operator TLitC8::__TRefDesC8()
+
+@see TRefByValue
+*/
+typedef TRefByValue<const TDesC8> __TRefDesC8;
+
+
+
+
+template <TInt S>
+class TLitC8
+/**
+@publishedAll
+@released
+
+Encapsulates literal text. 
+
+This is always constructed using an _LIT8 macro.
+
+This class is build independent; i.e. an explicit 8-bit build variant
+is generated for both a non-Unicode build and a Unicode build.
+
+The class has no explicit constructors.
+
+@see _LIT8
+*/
+	{
+public:
+	inline const TDesC8* operator&() const;
+	inline operator const TDesC8&() const;
+	inline const TDesC8& operator()() const;
+	inline operator const __TRefDesC8() const;
+public:
+    /**
+    @internalComponent
+    */
+	TUint iTypeLength;
+	
+	/**
+    @internalComponent
+    */
+	TText8 iBuf[__Align8(S)];
+	};
+
+#ifndef SYMBIAN_ENABLE_SPLIT_HEADERS
+#include <e32des8_private.h>
+#endif
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32/include/e32des8_private.h	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,27 @@
+// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32\include\e32des8_private.h
+// 
+//
+
+#ifndef __E32DES8_PRIVATE_H__
+#define __E32DES8_PRIVATE_H__
+
+/**
+@internalComponent
+*/
+const TInt KShiftDesType8=28;
+
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32/include/e32err.h	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,632 @@
+// Copyright (c) 1994-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32\include\e32err.h
+// 
+//
+
+/**
+ @file
+ @publishedAll
+ @released
+*/
+
+#ifndef __E32ERR_H__
+#define __E32ERR_H__
+#include <e32def.h>
+#include <e32def_private.h>
+
+
+
+/**
+System wide error code 0 : this represents the no-error condition.
+
+A system wide error code indicates an error in the environment, or in
+user input from which a program may recover.
+*/
+const TInt KErrNone=0;                   
+
+
+
+
+/**
+System wide error code -1 : item not found.
+
+A system wide error code indicates an error in the environment, or in
+user input from which a program may recover.
+*/
+const TInt KErrNotFound=(-1); // Must remain set to -1
+
+
+
+
+/**
+System wide error code -2 : an error that has no specific categorisation.
+
+A system wide error code indicates an error in the environment, or in
+user input from which a program may recover.
+*/
+const TInt KErrGeneral=(-2);
+
+
+
+
+/**
+System wide error code -3 : indicates an operation that has been cancelled.
+
+A system wide error code indicates an error in the environment, or in
+user input from which a program may recover.
+*/
+const TInt KErrCancel=(-3);
+
+
+
+
+/**
+System wide error code -4 : an attempt to allocate memory has failed.
+
+A system wide error code indicates an error in the environment, or in
+user input from which a program may recover.
+*/
+const TInt KErrNoMemory=(-4);
+
+
+
+
+/**
+System wide error code -5 : some functionality is not supported in a given context.
+
+A system wide error code indicates an error in the environment, or in
+user input from which a program may recover.
+
+There may be many reasons for this; for example, a device may not support
+some specific behaviour.
+*/
+const TInt KErrNotSupported=(-5);
+
+
+
+
+/**
+System wide error code -6 : an argument is out of range.
+
+A system wide error code indicates an error in the environment, or in
+user input from which a program may recover.
+*/
+const TInt KErrArgument=(-6);
+
+
+
+
+/**
+System wide error code -7 : a calculation has lost precision.
+
+A system wide error code indicates an error in the environment, or in
+user input from which a program may recover.
+
+This error arises when converting from an internal 96-bit real representation
+to a TReal32; the exponent of the internal representation is so small
+that the 32-bit real cannot contain it.
+*/
+const TInt KErrTotalLossOfPrecision=(-7);
+
+
+
+
+/**
+System wide error code -8 : an invalid handle has been passed.
+
+A system wide error code indicates an error in the environment, or in
+user input from which a program may recover.
+
+A function involving a resource owned by a server or the kernel has
+specified an invalid handle.
+*/
+const TInt KErrBadHandle=(-8);
+
+
+
+
+/**
+System wide error code -9 : indicates an overflow in some operation.
+
+A system wide error code indicates an error in the environment, or in
+user input from which a program may recover.
+
+In the context of mathematical or time/date functions, indicates a calculation
+that has produced arithmetic overflow exceeding the bounds allowed by
+the representation.
+
+In the context of data transfer, indicates that a buffer has over-filled
+without being emptied soon enough.
+*/
+const TInt KErrOverflow=(-9);
+
+
+
+
+/**
+System wide error code -10 : indicates an underflow in some operation.
+
+A system wide error code indicates an error in the environment, or in
+user input from which a program may recover.
+
+In the context of mathematical or time/date functions, indicates a calculation
+that has produced a result smaller than the smallest magnitude of
+a finite number allowed by the representation.
+
+In the context of data transfer, indicates that a buffer was under-filled
+when data was required.
+*/
+const TInt KErrUnderflow=(-10);
+
+
+
+
+/**
+System wide error code -11 : an object already exists.
+
+A system wide error code indicates an error in the environment, or in
+user input from which a program may recover.
+
+An object of some name/type is to be created, but an object of
+that name/type already exists.
+*/
+const TInt KErrAlreadyExists=(-11);
+
+
+
+
+/**
+System wide error code -12 : in the context of file operations, a path
+was not found.
+
+A system wide error code indicates an error in the environment, or in
+user input from which a program may recover.
+*/
+const TInt KErrPathNotFound=(-12);
+
+
+
+
+/**
+System wide error code -13 : a handle refers to a thread that has died.
+
+A system wide error code indicates an error in the environment, or in
+user input from which a program may recover.
+*/
+const TInt KErrDied=(-13);
+
+
+
+
+/**
+System wide error code -14 : a requested resource is already in exclusive use.
+
+A system wide error code indicates an error in the environment, or in
+user input from which a program may recover.
+*/
+const TInt KErrInUse=(-14);
+
+
+
+
+/**
+System wide error code -15 : client/server send/receive operation cannot run,
+because the server has terminated.
+
+A system wide error code indicates an error in the environment, or in
+user input from which a program may recover.
+*/
+const TInt KErrServerTerminated=(-15);
+
+
+
+
+/**
+System wide error code -16 : a client/server send/receive operation cannot run,
+because the server is busy handling another request.
+
+A system wide error code indicates an error in the environment, or in
+user input from which a program may recover.
+*/
+const TInt KErrServerBusy=(-16);
+
+
+
+
+/**
+System wide error code -17 : indicates that an operation is complete,
+successfully or otherwise.
+
+A system wide error code indicates an error in the environment, or in
+user input from which a program may recover.
+
+This code may be used to indicate that some follow on operation can take place.
+It does not necessarily indicate an error condition.
+*/
+const TInt KErrCompletion=(-17);
+
+
+
+
+/**
+System wide error code -18 : indicates that a device required by an i/o operation
+is not ready to start operations.
+
+A system wide error code indicates an error in the environment, or in
+user input from which a program may recover.
+
+A common reason for returning this code is because a device has not been
+initialised, or has no power.
+*/
+const TInt KErrNotReady=(-18);
+
+
+
+
+/**
+System wide error code -19 : a device is of unknown type.
+
+A system wide error code indicates an error in the environment, or in
+user input from which a program may recover.
+*/
+const TInt KErrUnknown=(-19);
+
+
+
+
+/**
+System wide error code -20 : indicates that some media is not formatted properly,
+or links between sections of it have been corrupted.
+
+A system wide error code indicates an error in the environment, or in
+user input from which a program may recover.
+*/
+const TInt KErrCorrupt=(-20);
+
+
+
+
+/**
+System wide error code -21 : access to a file is denied, because the permissions on
+the file do not allow the requested operation to be performed.
+
+A system wide error code indicates an error in the environment, or in
+user input from which a program may recover.
+*/
+const TInt KErrAccessDenied=(-21);
+
+
+
+
+/**
+System wide error code -22 : an operation cannot be performed, because the part
+of the file to be read or written is locked.
+
+A system wide error code indicates an error in the environment, or in
+user input from which a program may recover.
+*/
+const TInt KErrLocked=(-22);
+
+
+
+
+/**
+System wide error code -23 : during a file write operation, not all the data
+could be written.
+
+A system wide error code indicates an error in the environment, or in
+user input from which a program may recover.
+*/
+const TInt KErrWrite=(-23);
+
+
+
+
+/**
+System wide error code -24 : a volume which was to be used for a file system
+operation has been dismounted.
+
+A system wide error code indicates an error in the environment, or in
+user input from which a program may recover.
+*/
+const TInt KErrDisMounted=(-24);
+
+
+
+
+/**
+System wide error code -25 : indicates that end of file has been reached.
+
+A system wide error code indicates an error in the environment, or in
+user input from which a program may recover.
+
+Note that RFile::Read() is a higher-level interface. When the end of
+the file is reached, it returns zero bytes in the destination descriptor, and
+a KErrNone return value. KErrEof is not used for this purpose; other error
+conditions are returned only if some other error condition was indicated on
+the file.
+*/
+const TInt KErrEof=(-25);
+
+
+
+
+/**
+System wide error code -26 : a write operation cannot complete, because the disk
+is full.
+
+A system wide error code indicates an error in the environment, or in
+user input from which a program may recover.
+*/
+const TInt KErrDiskFull=(-26);
+
+
+
+
+/**
+System wide error code -27 : a driver DLL is of the wrong type.
+
+A system wide error code indicates an error in the environment, or in
+user input from which a program may recover.
+*/
+const TInt KErrBadDriver=(-27);
+
+
+
+
+/**
+System wide error code -28 : a file name or other object name does not conform to
+the required syntax.
+
+A system wide error code indicates an error in the environment, or in
+user input from which a program may recover.
+*/
+const TInt KErrBadName=(-28);
+
+
+
+
+/**
+System wide error code -29 : a communication line has failed.
+
+A system wide error code indicates an error in the environment, or in
+user input from which a program may recover.
+*/
+const TInt KErrCommsLineFail=(-29);
+
+
+
+
+/**
+System wide error code -30 : a frame error has occurred in
+a communications operation.
+
+A system wide error code indicates an error in the environment, or in
+user input from which a program may recover.
+*/
+const TInt KErrCommsFrame=(-30);
+
+
+
+
+/**
+System wide error code -31 : an overrun has been detected by
+a communications driver.
+
+A system wide error code indicates an error in the environment, or in
+user input from which a program may recover.
+*/
+const TInt KErrCommsOverrun=(-31);
+
+
+
+
+/**
+System wide error code -32 : a parity error has occurred in communications.
+
+A system wide error code indicates an error in the environment, or in
+user input from which a program may recover.
+*/
+const TInt KErrCommsParity=(-32);
+
+
+
+
+/**
+System wide error code -33 : an operation has timed out.
+
+A system wide error code indicates an error in the environment, or in
+user input from which a program may recover.
+*/
+const TInt KErrTimedOut=(-33);
+
+
+
+
+/**
+System wide error code -34 : a session could not connect.
+
+A system wide error code indicates an error in the environment, or in
+user input from which a program may recover.
+*/
+const TInt KErrCouldNotConnect=(-34);
+
+
+
+
+/**
+System wide error code -35 : a session could not disconnect.
+
+A system wide error code indicates an error in the environment, or in
+user input from which a program may recover.
+*/
+const TInt KErrCouldNotDisconnect=(-35);
+
+
+
+
+/**
+System wide error code -36 : a function could not be executed because the required
+session was disconnected.
+
+A system wide error code indicates an error in the environment, or in
+user input from which a program may recover.
+*/
+const TInt KErrDisconnected=(-36);
+
+
+
+
+/**
+System wide error code -37 : a library entry point was not of the required type.
+
+A system wide error code indicates an error in the environment, or in
+user input from which a program may recover.
+*/
+const TInt KErrBadLibraryEntryPoint=(-37);
+
+
+
+
+/**
+System wide error code -38 : a non-descriptor parameter was passed by
+a client interface, when a server expected a descriptor.
+
+A system wide error code indicates an error in the environment, or in
+user input from which a program may recover.
+*/
+const TInt KErrBadDescriptor=(-38);
+
+
+
+
+/**
+System wide error code -39 : an operation has been aborted.
+
+A system wide error code indicates an error in the environment, or in
+user input from which a program may recover.
+*/
+const TInt KErrAbort=(-39);
+
+
+
+
+/**
+System wide error code -40 : a number was too big.
+
+A system wide error code indicates an error in the environment, or in
+user input from which a program may recover.
+*/
+const TInt KErrTooBig=(-40);
+
+
+
+
+/**
+System wide error code -41 : a divide-by-zero operation has been attempted.
+
+A system wide error code indicates an error in the environment, or in
+user input from which a program may recover.
+*/
+const TInt KErrDivideByZero=(-41);		// Added by AnnW
+
+
+
+
+/**
+System wide error code -42 : insufficient power was available to
+complete an operation.
+
+A system wide error code indicates an error in the environment, or in
+user input from which a program may recover.
+*/
+const TInt KErrBadPower=(-42);
+
+
+
+
+/**
+System wide error code -43 : an operation on a directory has failed.
+
+A system wide error code indicates an error in the environment, or in
+user input from which a program may recover.
+*/
+const TInt KErrDirFull=(-43);
+
+
+
+
+/**
+System wide error code -44 : an operation cannot be performed because
+the necessary hardware is not available.
+
+A system wide error code indicates an error in the environment, or in
+user input from which a program may recover.
+*/
+const TInt KErrHardwareNotAvailable=(-44);
+
+
+
+
+/**
+System wide error code -45 : the completion status when an outstanding
+client/server message is completed because a shared session has been closed.
+
+A system wide error code indicates an error in the environment, or in
+user input from which a program may recover.
+*/
+const TInt KErrSessionClosed=(-45);
+
+
+
+
+/**
+System wide error code -46 : an operation cannot be performed due to
+a potential security violation.
+
+A system wide error code indicates an error in the environment, or in
+user input from which a program may recover.
+*/
+const TInt KErrPermissionDenied=(-46);
+
+
+
+/**
+System wide error code -47 : a requested extension function is not
+supported by the object concerned.
+
+*/
+const TInt KErrExtensionNotSupported=(-47);
+
+
+
+/**
+System wide error code -48 : a break has occurred in
+a communications operation.
+
+A system wide error code indicates an error in the environment, or in
+user input from which a program may recover.
+*/
+const TInt KErrCommsBreak=(-48);
+
+
+/**
+System wide error code -49 : a trusted time source could not be found
+and any time value given in conjunction with this error code should 
+not be trusted as correct.
+*/
+const TInt KErrNoSecureTime =(-49);
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32/include/e32event.h	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,435 @@
+// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32\include\e32event.h
+// 
+//
+
+#ifndef __E32EVENT_H__
+#define __E32EVENT_H__
+#include <e32cmn.h>
+#include <e32btrace.h>
+
+/**
+@publishedAll
+@released
+*/
+const TInt KUndefinedDeviceNumber = -1;
+
+/**
+@publishedAll
+@released
+
+Represents a raw hardware event as generated by hardware drivers of
+a pointer device, a keyboard etc.
+
+Raw hardware events are added to the kernel's event queue.
+*/
+class TRawEvent
+	{
+public:
+
+    /**
+    Defines the event type.
+    */
+	enum TType
+		{
+		
+		/**
+		Represents an uninitialised event object.
+		*/
+		ENone,
+		
+		/**
+		A pointer device (e.g. a pen) has moved. Only changes in Cartesian coordinates are tracked.
+		*/
+		EPointerMove,
+		
+		/**
+		A switch on event caused by a screen tap using a pointer device. 
+		*/
+        EPointerSwitchOn,
+        
+        /**
+        Represents a keyboard key down event.
+        */
+		EKeyDown,
+		
+		/**
+		Represents a keyboard key up event.
+		*/
+		EKeyUp,
+		
+		/**
+		Represents a redraw event.
+		
+		Typically generated in an emulator environment in response
+		to a host OS redraw event.
+		*/
+		ERedraw,
+		
+		/**
+		Represents a device switch on event.
+		*/
+		ESwitchOn,
+		
+		/**
+		*/
+        EActive,
+        
+  		/**
+		*/
+		EInactive,
+		
+		/**
+		Represents a modifier key being pressed.
+		*/
+		EUpdateModifiers,
+		
+		/**
+		Represents a button down event.
+		
+		This is typically used to represent a pointing device
+		coming into contact with a touch sensitive screen.
+		*/
+		EButton1Down,
+		
+		/**
+		Represents a button up event.
+		
+		This is typically used to represent a pointing device
+		being lifted away from a touch sensitive screen.
+		*/
+		EButton1Up,
+		
+		/**
+		Represents a button down event.
+		
+		This is typically used to represent a pointing device
+		coming into contact with a touch sensitive screen.
+		*/
+		EButton2Down,
+		
+		/**
+		Represents a button up event.
+		
+		This is typically used to represent a pointing device
+		being lifted away from a touch sensitive screen.
+		*/
+		EButton2Up,
+		
+		/**
+		Represents a button down event.
+		
+		This is typically used to represent a pointing device
+		coming into contact with a touch sensitive screen.
+		*/
+		EButton3Down,
+		
+		/**
+		Represents a button up event.
+		
+		This is typically used to represent a pointing device
+		being lifted away from a touch sensitive screen.
+		*/
+		EButton3Up,
+		
+		/**
+		Represents a device switch off event.
+		*/
+		ESwitchOff,
+		
+		/**
+		Represents a key being continually pressed event.
+		*/
+		EKeyRepeat,
+		
+		/**
+		Represents a case open event.
+		
+		The meaning of a case is hardware specific.
+		*/
+		ECaseOpen,
+		
+		/**
+        Represents a case close event.
+		
+		The meaning of a case is hardware specific.
+		*/
+		ECaseClose,
+
+		/**
+		@prototype
+        Represents a 3D pointer entering the detection volume event.
+		
+		This is typically used to represent a pointing device
+		coming into detection range of a sensitive screen.
+		*/
+		EPointer3DInRange,
+
+		/**
+		@prototype
+        Represents a 3D pointer leaving the detection volume event.
+		
+		This is typically used to represent a pointing device
+		leaving the detection range of a sensitive screen.
+		*/
+		EPointer3DOutOfRange,
+
+		/**
+		@prototype
+        Represents a 3D pointer tilt changes only event.
+		
+		This is typically sent by a 3D pointer driver when it detects
+		a change in the pointer's polar coordinates (Theta or Phi).
+		*/
+		EPointer3DTilt,
+
+		/**
+		@prototype
+        Represents a 3D pointer rotation only event.
+		
+		This is typically sent by a 3D pointer driver when it detects
+		a rotation of the pointing device (along ist main axis).
+		*/
+		EPointer3DRotation,
+
+		/**
+		@prototype
+        Represents a general 3D pointer changes event.
+		
+		This is typically sent by a 3D pointer driver when it detects
+		a change in the pointer's linear and/or polar coordinates and/or rotation.
+		*/
+		EPointer3DTiltAndMove,
+
+		/**
+		@prototype
+		Reserved for a 3D pointing device button down event.
+		*/
+		EButton4Down,
+		
+		/**
+		@prototype
+		Reserved for a 3D pointing device button up event.
+		*/
+		EButton4Up,
+
+		/**
+		@prototype
+		Reserved for a 3D pointing device button down event.
+		*/
+		EButton5Down,
+		
+		/**
+		@prototype
+		Reserved for a 3D pointing device button up event.
+		*/
+		EButton5Up,
+
+		/**
+		@prototype
+		Reserved for a 3D pointing device button down event.
+		*/
+		EButton6Down,
+		
+		/**
+		@prototype
+		Reserved for a 3D pointing device button up event.
+		*/
+		EButton6Up,
+
+		/**
+		Represents a device restart event.
+		*/
+		ERestartSystem
+		};
+public:
+
+    /**
+    Default constructor
+    */
+	inline TRawEvent()
+		{ *(TInt*)&iType=0; }
+		
+	/**
+	Gets the event type
+	
+	@return The event type.
+	*/	
+	inline TType Type() const
+		{return TType(iType);}
+
+	/**
+	Gets the device number (eg. screen number)
+
+	@return The device number.
+	*/
+	inline TInt DeviceNumber() const
+		{return TInt(iDeviceNumber-1);}
+
+	/**
+	Sets the device number (eg. screen number)
+
+	@param aDeviceNumber The device number
+	*/
+	inline void SetDeviceNumber(TInt aDeviceNumber)
+		{iDeviceNumber = TUint8(aDeviceNumber+1);}
+
+	IMPORT_C TPoint Pos() const;
+	IMPORT_C TInt ScanCode() const;
+    IMPORT_C TInt Modifiers() const;
+    
+    /**
+    Gets the Cartesian coordinates of the 3D pointer end that is closer to the screen.
+    
+    @return The Cartesian coordinates of the point defined by the end of the 3D pointing device that is closer to the screen.
+    */
+	IMPORT_C TPoint3D Pos3D() const;
+    
+
+	/**
+    Gets the angular spherical polar coordinates of the 3D pointer end that is closer to the screen.
+    
+    @return The angular spherical polar coordinates of the point defined by the end of the 3D pointing device that is closer to the screen.
+	@see TAngle3D
+	*/
+	IMPORT_C TAngle3D Tilt() const;
+
+	/**
+    Gets the rotation angle of 3D pointing device.
+
+    Some 3D pointing devices support information regarding the angle formed between the physical and magnetical poles,
+	as obtaining when rotating the pen along its main axis.
+
+    @return The rotation angle of the 3D pointing device.
+    */
+	IMPORT_C TInt Rotation() const;
+
+    /**
+    Gets the tick count value associated with the event.
+    
+    Note that the interval between tick counts is
+    hardware dependent.
+    
+    @return The tick count value
+    */
+	inline TUint Ticks() const
+		{return iTicks;}
+	/**
+	Gets the information on which end of the pointing device is closer to the screen
+	
+	@return A Boolean indicating which end of the pointing device is closer to the screen.
+	*/	
+	inline TBool IsTip() const
+		{return TBool(iTip);}
+	
+	/**
+	Sets the information on which end of the pointing device is closer to the screen
+	
+	@param aTip A Boolean indicating which end of the pointing device is closer to the screen.
+	*/	
+	inline void SetTip(TBool aTip)
+		{iTip = TUint8(aTip);
+#ifdef BTRACE_TRAWEVENT	
+		BTraceContext4(BTrace::ERawEvent, BTrace::ESetTipEvent,(TUint32)aTip);
+#endif
+		}
+
+	IMPORT_C void Set(TType aType,TInt aScanCode);
+	IMPORT_C void Set(TType aType,TInt aX,TInt aY);
+	IMPORT_C void Set(TType aType);
+
+	IMPORT_C void Set(TType aType,TInt aX,TInt aY,TInt aZ);
+	IMPORT_C void Set(TType aType,TInt aX,TInt aY,TInt aZ,TInt aPhi,TInt aTheta,TInt aAlpha);
+
+	IMPORT_C void SetTilt(TType aType,TInt aPhi,TInt aTheta);
+	IMPORT_C void SetRotation(TType aType,TInt aAlpha);
+
+	/**
+	@return the pointer number of the the event
+	*/
+	inline TUint8 PointerNumber() const
+		{
+		return iPointerNumber;
+		}
+
+
+	/**
+	The pointer number for the event is set
+	The pointer  number should be more or equal 0 and should be less than HALData::EPointerMaxPointers,
+	otherwise WSERV would ignore the event,ie 	0 <= aPointerNumber < HALData::EPointerMaxPointers 
+	@param	aPointerNumber
+	Error conditions: None.
+	*/
+	inline void SetPointerNumber(const TUint8 aPointerNumber)
+		{
+		iPointerNumber=aPointerNumber;	
+#ifdef BTRACE_TRAWEVENT	
+		BTraceContext4(BTrace::ERawEvent, BTrace::ESetPointerNumberEvent,(TUint32)aPointerNumber);
+#endif
+		}
+
+    /**
+	Initialises the event with the supplied information	
+	@param	aType	The event type.
+	@param	aX		The X position.
+	@param	aY		The Y position.
+	@param	aZ		The Z position.
+	@param  aPointerNumber   The pointer number for the event
+	*/
+	IMPORT_C void Set (TType aType, TInt aX, TInt aY, TInt aZ, TUint8 aPointerNumber);
+	
+protected:
+	TUint8 iType;
+	TUint8 iTip;	/**< Indicates whether the tip or head of pointing device is closer to screen.*/
+	TUint8 iPointerNumber; //
+	TUint8 iDeviceNumber;
+	TUint iTicks;
+	union
+		{
+		struct {TInt x;TInt y;} pos;
+		struct {TInt x;TInt y;TInt z;TInt phi;TInt theta;TInt alpha;} pos3D;
+		TInt scanCode;
+		TInt modifiers;
+		} iU;
+	};
+
+
+
+
+/**
+@publishedAll
+@released
+
+Encapsulates a hardware event object as a descriptor (package buffer) for
+the purpose of data transfer.
+*/
+class TRawEventBuf : public TPckgBuf<TRawEvent>
+	{
+public:
+
+    /**
+    Gets the hardware event object from the package buffer.
+    
+    @return The hardware event object.
+    */
+	inline TRawEvent &Event() const {return(*((TRawEvent *)&iBuf[0]));}
+	};
+
+#ifndef SYMBIAN_ENABLE_SPLIT_HEADERS
+#include <e32event_private.h>
+#endif
+
+#endif
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32/include/e32event_private.h	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,40 @@
+// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32\include\e32event_private.h
+// 
+//
+
+#ifndef __E32EVENT_PRIVATE_H__
+#define __E32EVENT_PRIVATE_H__
+#include <e32cmn.h>
+#include <e32cmn_private.h>
+
+/**
+@publishedPartner
+@released
+
+Encapsulates information about a device's display screen.
+*/
+class TScreenInfoV01
+	{
+public:
+	TBool iWindowHandleValid; /**< Indicates whether the window handle is valid.*/
+	TAny *iWindowHandle;      /**< The window handle.*/
+	TBool iScreenAddressValid;/**< Indicates whether the screen address is valid.*/
+	TAny *iScreenAddress;     /**< The linear address of the screen.*/
+	TSize iScreenSize;        /**< The size of the screen.*/
+	};
+//
+#endif
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32/include/e32hal.h	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,622 @@
+// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32\include\e32hal.h
+// 
+//
+
+#ifndef __E32HAL_H__
+#define __E32HAL_H__
+#include <e32cmn.h>
+#include <e32cmn_private.h>
+
+/**
+@publishedPartner
+@deprecated No replacement.
+*/ 
+const TInt KMaxRomDevices=8;
+
+
+
+
+/**
+@publishedPartner
+@released
+
+Defines the calibration settings that can be restored by 
+the digitiser's implementation of DDigitiser::RestoreXYInputCalibration.
+
+See the digitiser template port in:
+@code
+...\template\template_variant\specific\xyin.cpp
+@endcode
+
+@see DDigitiser::RestoreXYInputCalibration()
+*/ 
+enum TDigitizerCalibrationType
+    {
+    EFactory, /**< Restore to factory settings. */
+    ESaved    /**< Restore to saved settings.   */
+    };
+
+
+
+
+/**
+@publishedPartner
+@released
+
+Defines the screen coordinates of the point touched during calibration.
+
+An object of this type is passed, via a TPckgBuf, to the HAL handler
+that deals with the HAL group function-id pair:
+- EHalGroupDigitiser, EDigitiserHalSetXYInputCalibration
+- EHalGroupDigitiser, EDigitiserHalCalibrationPoints
+- EHalGroupDigitiser, EDigitiserHalRestoreXYInputCalibration
+
+@see EDigitiserHalSetXYInputCalibration
+@see EDigitiserHalCalibrationPoints
+@see EDigitiserHalRestoreXYInputCalibration
+@see TDigitiserHalFunction
+@see EHalGroupDigitiser
+@see TPckgBuf
+*/ 
+class TDigitizerCalibration
+    {
+public:
+    TPoint iTl;  /**< Top left point.*/
+    TPoint iBl;  /**< Bottom left point. */
+    TPoint iTr;  /**< Top right point.*/
+    TPoint iBr;  /**< Bottom right point.*/
+    };
+
+
+
+
+/**
+@publishedPartner
+@released
+
+An enum that identifies the full set of keyboard types.
+
+A variable of this type is defined and used in the TKeyboardInfoV01 struct. 
+
+@see TKeyboardInfoV01::iKeyboardType.
+*/ 
+enum TKeyboard
+	{
+	EKeyboard_Keypad=1, /**< Keypad type*/
+	EKeyboard_Full=2,   /**< Full keyboard type*/
+	};
+
+
+
+
+/**
+@publishedPartner
+@released
+
+Encapsulates information about the keyboard.
+
+NOTE that the information represented here is not used by Symbian OS, 
+and exists to maintain binary compatibilty with older versions.
+
+However, keyboard drivers that implement the HAL handler for
+the EHalGroupKeyboard group still need to return a default object
+of this type.
+See the template port.
+
+An object of this type is passed, via a TPckgBuf, to the HAL handler
+that deals with the HAL group function-id pair:
+- EHalGroupKeyboard, EKeyboardHalKeyboardInfo;
+
+@see EKeyboardHalKeyboardInfo
+@see TKeyboardHalFunction
+@see EHalGroupKeyboard
+@see TPckgBuf
+*/ 
+class TKeyboardInfoV01
+	{
+public:
+    /**
+    The number of device keys.
+    
+    NOTE that the information represented by this variable is not
+    used by Symbian OS, and exists to maintain binary compatibility
+    with older versions. 
+    */
+	TInt iDeviceKeys;
+	
+	
+	/**
+	The number of application keys.
+	
+	NOTE that the information represented by this variable is not
+    used by Symbian OS, and exists to maintain binary compatibility
+    with older versions. 
+	*/
+    TInt iAppsKeys;
+    
+    
+    /**
+    Defines the type of keyboard available as enumerated by
+    the TKeyboard enum.
+        
+    NOTE that the information represented by this variable is not
+    used by Symbian OS, and exists to maintain binary compatibility
+    with older versions. 
+            
+    @see TKeyboard
+    */
+	TKeyboard iKeyboardType;
+    };
+    
+    
+    
+    
+/**
+@publishedPartner
+@released
+
+Package buffer for a TKeyboardInfoV01 object.
+
+@see TKeyboardInfoV01
+*/ 
+typedef TPckgBuf<TKeyboardInfoV01> TKeyboardInfoV01Buf;
+
+
+
+
+/**
+@publishedPartner
+@released
+
+Encapsulates information about the digitiser.
+
+An object of this type is passed, via a TPckgBuf, to the HAL handler
+that deals with the HAL group function-id pair:
+- EHalGroupDigitiser, EDigitiserHalXYInfo;
+
+@see EDigitiserHalXYInfo
+@see TDigitiserHalFunction
+@see EHalGroupDigitiser
+@see TPckgBuf
+*/ 
+class TDigitiserInfoV01
+	{
+public:
+	TPoint iOffsetToDisplay;/**< The offset in pixels from the digitiser usable area to the display area. */
+	TSize iDigitiserSize;   /**< The width/height of the display in pixels as used by digitiser.*/
+	};
+	
+	
+/**
+@publishedPartner
+@released
+Encapsulates extra information required by 3 dimensional pointing devices.
+*/ 
+class TDigitiserInfoV02 : public TDigitiserInfoV01
+	{	
+public :
+	TInt iZRange;			/**< The maximum distance to screen a pointing device will be detected (settable).*/
+	TUint8 iThetaSupported;	/**< A Boolean value that indicates if Theta polar angle detection (tilt) is supported.*/
+	TUint8 iPhiSupported;	/**< A Boolean value that indicates if Phi polar angle detection (tilt) is supported.*/
+	TUint8 iAlphaSupported;	/**< A Boolean value that indicates if rotation of the pointing device along its main axis is supported.*/
+	TUint8 iPressureSupported; /**< A Boolean value that indicates if pressure applied on screen is supported.*/
+	TInt iProximityStep;    /**<proximity resolution, e.g. proximity readings change in steps of 1, 5, 10, ... */
+	TInt iMaxPressure;      /**< maximum pressure reading*/
+	TInt iPressureStep;     /**< pressure resolution, */	
+	TUint8 iMaxPointers;    /**< max number of multi-touch pointers supported by hardware/driver.*/ 
+	TUint8 iNumberOfPointers;/**< Number of pointers it supports (settable).*/
+	};
+
+
+/**
+@publishedPartner
+@released
+
+Package buffer for a TDigitiserInfoV01 object.
+
+@see TDigitiserInfoV01
+*/ 
+typedef TPckgBuf<TDigitiserInfoV01> TDigitiserInfoV01Buf;
+
+/**
+@publishedPartner
+@prototype
+
+Package buffer for a TDigitiserInfoV02 object.
+
+@see TDigitiserInfoV02
+*/ 
+typedef TPckgBuf<TDigitiserInfoV02> TDigitiserInfoV02Buf;
+
+/**
+@publishedPartner
+@released
+
+Encapsulates information about the mouse display characteristics.
+
+An object of this type is passed, via a TPckgBuf, to the HAL handler
+that deals with the HAL group function-id pair:
+- EHalGroupMouse, EMouseHalMouseInfo;
+
+@see EMouseHalMouseInfo
+@see TMouseHalFunction
+@see EHalGroupMouse
+@see TPckgBuf
+*/ 
+class TMouseInfoV01
+	{
+public:
+	TInt iMouseButtons;      /**< The number of mouse buttons.*/
+	TPoint iOffsetToDisplay; /**< The offset in pixels from the mouse usable area to the display area.*/
+	TSize iMouseAreaSize;    /**< The width/height of the display in pixels as used by the mouse.     */
+	};
+	
+	
+	
+	
+/**
+@publishedPartner
+@released
+
+Package buffer for a TMouseInfoV01 object.
+
+@see TMouseInfoV01
+*/ 
+typedef TPckgBuf<TMouseInfoV01> TMouseInfoV01Buf;
+
+
+
+/**
+@publishedPartner
+@released
+
+Encapsulates Variant specific information.
+
+An object of this type is passed, via a TPckgBuf, to the HAL handler
+that deals with the HAL group function-id pair:
+- EHalGroupVariant, EVariantHalVariantInfo;
+
+@see EVariantHalVariantInfo
+@see TVariantHalFunction
+@see EHalGroupVariant
+@see TPckgBuf
+*/ 
+class TVariantInfoV01
+	{
+public:
+    /**
+    The ROM version.
+    */
+	TVersion iRomVersion;
+	
+	/**
+	The Id that uniquely identifies the device.
+	*/
+	SInt64 iMachineUniqueId;
+	
+	/**
+	The bits that represent the LED capabilities.
+	
+	NB capabilities in this context does not mean security capabilities.
+	*/
+    TUint iLedCapabilities;
+    
+    /**
+    The processor clock speed.
+    */
+    TInt iProcessorClockInKHz;
+    
+    /**
+    The speed factor. 
+    */
+    TInt iSpeedFactor;
+    };
+    
+    
+    
+    
+/**
+@publishedPartner
+@released
+
+Package buffer for a TVariantInfoV01 object.
+
+@see TVariantInfoV01
+*/ 
+typedef TPckgBuf<TVariantInfoV01> TVariantInfoV01Buf;
+
+
+
+
+/**
+@publishedPartner
+@deprecated Use HAL::Get() from the HAL library instead with attributes ESystemStartupReason.
+
+The reason that the device last reset
+
+Note that not all reasons can occur on all devices.
+*/
+enum TMachineStartupType
+	{
+	EStartupCold,EStartupColdReset,EStartupNewOs,
+	EStartupPowerFail,EStartupWarmReset,EStartupKernelFault,
+	EStartupSafeReset
+	};
+
+
+
+
+/**
+@publishedPartner
+@deprecated Use HAL::Get() from the HAL library instead with attributes  EPen or EMouse.
+
+The XY input method supported
+*/
+enum TXYInputType
+	{
+	EXYInputNone,
+	EXYInputPointer,
+	EXYInputMouse,
+	EXYInputDeltaMouse
+	};
+
+
+
+/**
+@publishedPartner
+@deprecated Use HAL::Get() from the HAL library instead.
+
+Miscellaneous machine info.
+*/
+class TMachineInfoV1
+	{
+public:
+	TVersion iRomVersion;
+	TXYInputType iXYInputType;
+	TBool iKeyboardPresent;
+	TBool iBacklightPresent;
+    TSize iDisplaySizeInPixels;
+    TSize iXYInputSizeInPixels;
+    TSize iPhysicalScreenSize;
+	TPoint iOffsetToDisplayInPixels;
+	TInt iKeyboardId;
+	TInt iDisplayId;
+	SInt64 iMachineUniqueId;
+    TUint iLedCapabilities;
+    TInt iProcessorClockInKHz;
+    TInt iSpeedFactor;
+    TInt iMaximumDisplayColors;
+	};
+/**
+@publishedPartner
+@deprecated
+*/
+typedef TPckgBuf<TMachineInfoV1> TMachineInfoV1Buf;
+
+
+
+
+/**
+@publishedPartner
+@deprecated Use HAL::Get() from the HAL library instead with attributes ELanguageIndex or EKeyboardIndex.
+
+Miscellaneous locale info.
+*/
+class TMachineInfoV2 : public TMachineInfoV1
+	{
+public:
+	TInt iLanguageIndex;
+    TInt iKeyboardIndex;
+    };
+/**
+@publishedPartner
+@deprecated
+*/
+typedef TPckgBuf<TMachineInfoV2> TMachineInfoV2Buf;
+
+
+
+
+/**
+@publishedPartner
+@deprecated Use HAL::Get() from the HAL library instead with attributes EMemoryRAM, EMemoryRAMFree or EMemoryROM.
+
+Miscellaneous memory info.
+*/ 
+class TMemoryInfoV1
+    {
+public:
+    TInt iTotalRamInBytes;
+    TInt iTotalRomInBytes;
+    TInt iMaxFreeRamInBytes;
+    TInt iFreeRamInBytes;
+    TInt iInternalDiskRamInBytes;
+    TBool iRomIsReprogrammable;
+    };
+/**
+@publishedPartner
+@deprecated
+*/
+typedef TPckgBuf<TMemoryInfoV1> TMemoryInfoV1Buf;
+
+
+
+
+/**
+@publishedPartner
+@deprecated No replacement.
+
+Miscellaneous ROM info.
+*/ 
+class TRomInfoEntryV1
+	{
+public:
+    enum TRomTypeV1
+    	{
+    	ERomTypeRom=0,
+    	ERomTypeFlash=1
+    	};
+	TInt iSize;		    // size of ROM in bytes, 0=no ROM present
+	TInt iWidth;		// bus width in bits
+	TInt iSpeed;		// number of wait states
+	TRomTypeV1 iType;	// 0=ROM, 1=FLASH
+	};
+
+
+
+
+/**
+@publishedPartner
+@deprecated No replacement.
+
+Miscellaneous ROM info.
+*/ 
+class TRomInfoV1
+	{
+public:
+	TRomInfoEntryV1	iEntry[KMaxRomDevices];
+	};
+/**
+@publishedPartner
+@deprecated
+*/
+typedef TPckgBuf<TRomInfoV1> TRomInfoV1Buf;
+
+/**
+@publishedPartner
+@released
+*/
+const TUint KRuggedFileSystem=0x01;
+
+/**
+@publishedPartner
+@released
+*/
+class TDriveInfoV1
+    {
+public:
+	TInt iTotalSupportedDrives;
+	TInfoName iDriveName[KMaxLocalDrives];
+	TInt iTotalSockets;
+	TInfoName iSocketName[KMaxPBusSockets];
+	TInt iRuggedFileSystem;
+	TUint iRegisteredDriveBitmask;
+	};
+/**
+@publishedPartner
+@released
+*/
+typedef TPckgBuf<TDriveInfoV1> TDriveInfoV1Buf;
+
+#if defined(_UNICODE) && !defined(__KERNEL_MODE__)
+/**
+@publishedPartner
+@released
+*/
+class TDriveInfoV18
+    {
+public:
+	TInt iTotalSupportedDrives;
+	TBuf8<KMaxInfoName> iDriveName[KMaxLocalDrives]; //TInfoName
+	TInt iTotalSockets;
+	TBuf8<KMaxInfoName> iSocketName[KMaxPBusSockets]; //TInfoName
+	TInt iRuggedFileSystem;
+	TUint iRegisteredDriveBitmask;
+	};
+/**
+@publishedPartner
+@released
+*/
+typedef TPckgBuf<TDriveInfoV18> TDriveInfoV1Buf8;
+#else
+typedef TDriveInfoV1 TDriveInfoV18;
+typedef TDriveInfoV1Buf TDriveInfoV1Buf8;
+#endif
+
+/**
+@publishedPartner
+@released
+*/
+class TExcInfo
+	{
+public:
+	TAny *iCodeAddress;
+	TAny *iDataAddress;
+	TInt iExtraData;
+	};
+
+#ifndef __KERNEL_MODE__
+#include <e32std.h>
+
+
+
+
+/**
+@publishedPartner
+@released
+
+A set of user side utility functions for acessing hardware related
+information.
+
+Four of these functions are DEPRECATED and should NOT be used; some of
+these functions have replacements, but others do not; see the description of
+the individual functions.
+
+The following functions are not deprecated, but are only used by Symbian
+OS as part of its internal implementation:
+-  UserHal::FaultReason()
+-  UserHal::ExceptionId()
+-  UserHal::ExceptionInfo()
+-  UserHal::PageSizeInBytes()
+-  UserHal::TickPeriod()
+-  UserHal::DriveInfo()
+-  UserHal::SwitchOff()
+-  UserHal::SetXYInputCalibration()
+-  UserHal::CalibrationPoints()
+-  UserHal::SaveXYInputCalibration()
+-  UserHal::RestoreXYInputCalibration()
+*/
+class UserHal
+	{
+public:
+	// kernel group
+	IMPORT_C static TInt MemoryInfo(TDes8& anInfo);
+	IMPORT_C static TInt RomInfo(TDes8& anInfo);
+	IMPORT_C static TInt StartupReason(TMachineStartupType& aReason);
+	IMPORT_C static TInt FaultReason(TInt &aReason);
+	IMPORT_C static TInt ExceptionId(TInt &anId);
+	IMPORT_C static TInt ExceptionInfo(TExcInfo &aInfo);
+	IMPORT_C static TInt PageSizeInBytes(TInt& aSize);
+
+	// variant group
+	IMPORT_C static TInt MachineInfo(TDes8& anInfo);
+	IMPORT_C static TInt TickPeriod(TTimeIntervalMicroSeconds32& aPeriod);
+
+	// media group
+	IMPORT_C static TInt DriveInfo(TDes8& anInfo);
+
+	// power group
+   	IMPORT_C static TInt SwitchOff();
+
+	// digitiser group
+	IMPORT_C static TInt SetXYInputCalibration(const TDigitizerCalibration& aCalibration);
+	IMPORT_C static TInt CalibrationPoints(TDigitizerCalibration& aCalibration);
+	IMPORT_C static TInt SaveXYInputCalibration();
+	IMPORT_C static TInt RestoreXYInputCalibration(TDigitizerCalibrationType aType);
+	};
+#endif
+#endif
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32/include/e32hashtab.h	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,1748 @@
+// Copyright (c) 2005-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32/include/e32hashtab.h
+// 
+//
+
+#ifndef __E32HASHTAB_H__
+#define __E32HASHTAB_H__
+#include <e32cmn.h>
+
+/**
+@publishedAll
+@released
+
+Defines a function type used by a THashFunction32 object. 
+
+A function of this type implements an algorithm for producing a 32 bit hash
+value from a key.
+
+@see THashFunction32
+*/
+typedef TUint32 (*TGeneralHashFunction32)(const TAny*);
+
+
+/**
+@publishedAll
+@released
+
+A templated class which packages a function that calculates a 32 bit hash
+value from a key of templated type.
+
+A THashFunction32<T> object is constructed and passed as a parameter to 
+member functions of the hash table classes RHashSet<T>, RPtrHashSet<T>,
+RHashMap<T,V> and RPtrHashMap<T,V>.
+
+@see RHashSet
+@see RPtrHashSet
+@see RHashMap
+@see RPtrHashMap
+*/
+template <class T>
+class THashFunction32
+	{
+public:
+	inline THashFunction32( TUint32 (*aHashFunc)(const T&) )
+		{ iHashFunction = (TGeneralHashFunction32)aHashFunc; }
+	inline operator TGeneralHashFunction32() const
+		{ return iHashFunction; }
+	inline TUint32 Hash(const T& aKey) const
+		{ return (*iHashFunction)(&aKey); }
+private:
+	TGeneralHashFunction32 iHashFunction;
+	};
+
+
+/**
+@publishedAll
+@released
+
+A set of common hashing functions for frequently occurring types.
+
+@see RHashSet
+@see RPtrHashSet
+@see RHashMap
+@see RPtrHashMap
+*/
+class DefaultHash
+	{
+public:
+	IMPORT_C static TUint32 Integer(const TInt&);
+	IMPORT_C static TUint32 Des8(const TDesC8&);
+	IMPORT_C static TUint32 Des16(const TDesC16&);
+	IMPORT_C static TUint32 IntegerPtr(TInt* const &);
+	IMPORT_C static TUint32 Des8Ptr(TDesC8* const &);
+	IMPORT_C static TUint32 Des16Ptr(TDesC16* const &);
+	};
+
+
+
+class THashTableIterBase;
+
+/**
+@internalComponent
+
+Base class used in the derivation of RHashSet<T>, RPtrHashSet<T>,
+RHashMap<K,V> and RPtrHashMap<K,V>.
+
+This class provides a general hash table implementation using probe sequences
+generated by pseudo-double hashing.
+The class is internal and is not intended for use.
+*/
+class RHashTableBase
+	{
+public:
+	enum TDefaultSpecifier
+		{
+		EDefaultSpecifier_Normal,
+		};
+
+protected:
+	template<class K, TDefaultSpecifier S>
+	class Defaults
+		{
+	public:
+		inline static TGeneralHashFunction32 Hash();
+		inline static TGeneralIdentityRelation Id();
+		};
+
+protected:
+	enum TElementState
+		{
+		EEmpty=0,		// entry is vacant
+		EDeleted=1,		// entry has been deleted
+		EGen0=2,		// entry is occupied, generation number 0
+		EGen1=3,		// entry is occupied, generation number 1
+		EStateMask=3,
+		EOccupiedMask=2,
+		};
+
+	struct SElement
+		{
+		inline void SetEmpty() {iHash=EEmpty;}
+		inline void SetDeleted() {iHash=EDeleted;}
+		inline TBool IsEmpty() const {return (iHash&EStateMask)==EEmpty;}
+		inline TBool IsDeleted() const {return (iHash&EStateMask)==EDeleted;}
+		inline TBool IsEmptyOrDeleted() const {return !(iHash&EOccupiedMask);}
+
+		TUint32	iHash;			// bits 2-31 = 30 bit hash value, bits 0,1 = state
+		};
+
+protected:
+	IMPORT_C RHashTableBase(TGeneralHashFunction32, TGeneralIdentityRelation, TInt aElementSize, TInt aKeyOffset);
+	IMPORT_C void Close();
+	IMPORT_C TAny* Find(const TAny* aKey, TInt aOffset=0) const;
+	IMPORT_C TAny* FindL(const TAny* aKey, TInt aOffset=0) const;
+	TInt Insert(const TAny* aKey, TAny*& aElement);
+	IMPORT_C TInt PtrInsert(const TAny* aKey, const TAny* aValue);
+	IMPORT_C void PtrInsertL(const TAny* aKey, const TAny* aValue);
+	IMPORT_C TInt ValueInsert(const TAny* aKey, TInt aKeySize, const TAny* aValue, TInt aValueOffset, TInt aValueSize);
+	IMPORT_C void ValueInsertL(const TAny* aKey, TInt aKeySize, const TAny* aValue, TInt aValueOffset, TInt aValueSize);
+	IMPORT_C TInt Remove(const TAny* aKey);
+	IMPORT_C TInt Count() const;
+	IMPORT_C TInt Reserve(TInt aCount);
+	IMPORT_C void ReserveL(TInt aCount);
+	IMPORT_C void ConsistencyCheck(TUint32* aDeleted=0, TUint32* aComparisons=0, TUint32 aChainLimit=0, TUint32* aChainInfo=0);
+private:
+	void SetThresholds();
+	TInt ExpandTable(TInt aNewIndexBits);
+	void ShrinkTable();
+	void ReformTable(TUint aNewIndexBits);
+	void VerifyReform();
+private:
+	inline SElement* Element(TInt aIndex)
+		{return (SElement*)(((TUint8*)iElements) + aIndex*iElementSize);}
+	inline const SElement* ElementC(TInt aIndex) const
+		{return (const SElement*)(((TUint8*)iElements) + aIndex*iElementSize);}
+	inline TAny* GetKey(const SElement* aElement) const
+		{return iKeyOffset ? ((TUint8*)aElement + iKeyOffset) : (TAny*)((TUint32*)aElement)[1];}
+private:
+	TGeneralHashFunction32 iHashFunc;	// generates the hash from a given key
+	TGeneralIdentityRelation iIdFunc;	// compare two keys for equality
+	TUint8 iIndexBits;					// number of bits used to index the table
+	TUint8 iGeneration;					// 2 or 3, generation number used when traversing entire table
+	TUint8 iKeyOffset;					// offset to key
+	TUint8 iPad0;
+	TAny* iElements;
+	TUint32 iCount;						// number of valid entries
+	TUint32 iEmptyCount;				// number of empty entries
+	TUint32 iLowerThreshold;			// shrink if count drops below this
+	TUint32 iUpperThreshold;			// expand if count rises above this
+	TUint32 iCleanThreshold;			// clean table if count of empty entries falls below this
+	TInt iElementSize;
+	TInt iPad1;							// expansion room
+	TInt iPad2;
+
+	friend struct RHashTableBase::SElement;
+	friend class THashTableIterBase;
+	friend class HashTest;
+	};
+
+
+/**
+@internalComponent
+*/
+TEMPLATE_SPECIALIZATION class RHashTableBase::Defaults<TInt*, RHashTableBase::EDefaultSpecifier_Normal>
+	{
+public:
+	inline static TGeneralHashFunction32 Hash();
+	inline static TGeneralIdentityRelation Id();
+	};
+
+/**
+@internalComponent
+*/
+inline TGeneralHashFunction32 RHashTableBase::Defaults<TInt*, RHashTableBase::EDefaultSpecifier_Normal>::Hash()
+	{return (TGeneralHashFunction32)&DefaultHash::IntegerPtr;}
+
+/**
+@internalComponent
+*/
+inline TGeneralIdentityRelation RHashTableBase::Defaults<TInt*, RHashTableBase::EDefaultSpecifier_Normal>::Id()
+	{return (TGeneralIdentityRelation)&DefaultIdentity::IntegerPtr;}
+
+/**
+@internalComponent
+*/
+TEMPLATE_SPECIALIZATION class RHashTableBase::Defaults<TInt32*, RHashTableBase::EDefaultSpecifier_Normal>
+	{
+public:
+	inline static TGeneralHashFunction32 Hash();
+	inline static TGeneralIdentityRelation Id();
+	};
+
+/**
+@internalComponent
+*/
+inline TGeneralHashFunction32 RHashTableBase::Defaults<TInt32*, RHashTableBase::EDefaultSpecifier_Normal>::Hash()
+	{return (TGeneralHashFunction32)&DefaultHash::IntegerPtr;}
+
+/**
+@internalComponent
+*/
+inline TGeneralIdentityRelation RHashTableBase::Defaults<TInt32*, RHashTableBase::EDefaultSpecifier_Normal>::Id()
+	{return (TGeneralIdentityRelation)&DefaultIdentity::IntegerPtr;}
+
+/**
+@internalComponent
+*/
+TEMPLATE_SPECIALIZATION class RHashTableBase::Defaults<TUint*, RHashTableBase::EDefaultSpecifier_Normal>
+	{
+public:
+	inline static TGeneralHashFunction32 Hash();
+	inline static TGeneralIdentityRelation Id();
+	};
+/**
+@internalComponent
+*/
+inline TGeneralHashFunction32 RHashTableBase::Defaults<TUint*, RHashTableBase::EDefaultSpecifier_Normal>::Hash()
+	{return (TGeneralHashFunction32)&DefaultHash::IntegerPtr;}
+
+/**
+@internalComponent
+*/
+inline TGeneralIdentityRelation RHashTableBase::Defaults<TUint*, RHashTableBase::EDefaultSpecifier_Normal>::Id()
+	{return (TGeneralIdentityRelation)&DefaultIdentity::IntegerPtr;}
+
+
+/**
+@internalComponent
+*/
+TEMPLATE_SPECIALIZATION class RHashTableBase::Defaults<TUint32*, RHashTableBase::EDefaultSpecifier_Normal>
+	{
+public:
+	inline static TGeneralHashFunction32 Hash();
+	inline static TGeneralIdentityRelation Id();
+	};
+/**
+@internalComponent
+*/
+inline TGeneralHashFunction32 RHashTableBase::Defaults<TUint32*, RHashTableBase::EDefaultSpecifier_Normal>::Hash()
+	{return (TGeneralHashFunction32)&DefaultHash::IntegerPtr;}
+
+/**
+@internalComponent
+*/
+inline TGeneralIdentityRelation RHashTableBase::Defaults<TUint32*, RHashTableBase::EDefaultSpecifier_Normal>::Id()
+	{return (TGeneralIdentityRelation)&DefaultIdentity::IntegerPtr;}
+
+/**
+@internalComponent
+*/
+TEMPLATE_SPECIALIZATION class RHashTableBase::Defaults<TDesC8*, RHashTableBase::EDefaultSpecifier_Normal>
+	{
+public:
+	inline static TGeneralHashFunction32 Hash();
+	inline static TGeneralIdentityRelation Id();
+	};
+/**
+@internalComponent
+*/
+inline TGeneralHashFunction32 RHashTableBase::Defaults<TDesC8*, RHashTableBase::EDefaultSpecifier_Normal>::Hash()
+	{return (TGeneralHashFunction32)&DefaultHash::Des8Ptr;}
+
+/**
+@internalComponent
+*/
+inline TGeneralIdentityRelation RHashTableBase::Defaults<TDesC8*, RHashTableBase::EDefaultSpecifier_Normal>::Id()
+	{return (TGeneralIdentityRelation)&DefaultIdentity::Des8Ptr;}
+
+/**
+@internalComponent
+*/
+TEMPLATE_SPECIALIZATION class RHashTableBase::Defaults<TDesC16*, RHashTableBase::EDefaultSpecifier_Normal>
+	{
+public:
+	inline static TGeneralHashFunction32 Hash();
+	inline static TGeneralIdentityRelation Id();
+	};
+/**
+@internalComponent
+*/
+inline TGeneralHashFunction32 RHashTableBase::Defaults<TDesC16*, RHashTableBase::EDefaultSpecifier_Normal>::Hash()
+	{return (TGeneralHashFunction32)&DefaultHash::Des16Ptr;}
+
+/**
+@internalComponent
+*/
+inline TGeneralIdentityRelation RHashTableBase::Defaults<TDesC16*, RHashTableBase::EDefaultSpecifier_Normal>::Id()
+	{return (TGeneralIdentityRelation)&DefaultIdentity::Des16Ptr;}
+
+/**
+@internalComponent
+*/
+TEMPLATE_SPECIALIZATION class RHashTableBase::Defaults<TInt, RHashTableBase::EDefaultSpecifier_Normal>
+	{
+public:
+	inline static TGeneralHashFunction32 Hash();
+	inline static TGeneralIdentityRelation Id();
+	};
+
+/**
+@internalComponent
+*/
+inline TGeneralHashFunction32 RHashTableBase::Defaults<TInt, RHashTableBase::EDefaultSpecifier_Normal>::Hash()
+	{return (TGeneralHashFunction32)&DefaultHash::Integer;}
+
+/**
+@internalComponent
+*/
+inline TGeneralIdentityRelation RHashTableBase::Defaults<TInt, RHashTableBase::EDefaultSpecifier_Normal>::Id()
+	{return (TGeneralIdentityRelation)&DefaultIdentity::Integer;}
+
+/**
+@internalComponent
+*/
+TEMPLATE_SPECIALIZATION class RHashTableBase::Defaults<TInt32, RHashTableBase::EDefaultSpecifier_Normal>
+	{
+public:
+	inline static TGeneralHashFunction32 Hash();
+	inline static TGeneralIdentityRelation Id();
+	};
+
+/**
+@internalComponent
+*/
+inline TGeneralHashFunction32 RHashTableBase::Defaults<TInt32, RHashTableBase::EDefaultSpecifier_Normal>::Hash()
+	{return (TGeneralHashFunction32)&DefaultHash::Integer;}
+
+/**
+@internalComponent
+*/
+inline TGeneralIdentityRelation RHashTableBase::Defaults<TInt32, RHashTableBase::EDefaultSpecifier_Normal>::Id()
+	{return (TGeneralIdentityRelation)&DefaultIdentity::Integer;}
+
+/**
+@internalComponent
+*/
+TEMPLATE_SPECIALIZATION class RHashTableBase::Defaults<TUint, RHashTableBase::EDefaultSpecifier_Normal>
+	{
+public:
+	inline static TGeneralHashFunction32 Hash();
+	inline static TGeneralIdentityRelation Id();
+	};
+
+/**
+@internalComponent
+*/
+inline TGeneralHashFunction32 RHashTableBase::Defaults<TUint, RHashTableBase::EDefaultSpecifier_Normal>::Hash()
+	{return (TGeneralHashFunction32)&DefaultHash::Integer;}
+
+/**
+@internalComponent
+*/
+inline TGeneralIdentityRelation RHashTableBase::Defaults<TUint, RHashTableBase::EDefaultSpecifier_Normal>::Id()
+	{return (TGeneralIdentityRelation)&DefaultIdentity::Integer;}
+
+
+/**
+@internalComponent
+*/
+TEMPLATE_SPECIALIZATION class RHashTableBase::Defaults<TUint32, RHashTableBase::EDefaultSpecifier_Normal>
+	{
+public:
+	inline static TGeneralHashFunction32 Hash();
+	inline static TGeneralIdentityRelation Id();
+	};
+
+/**
+@internalComponent
+*/
+inline TGeneralHashFunction32 RHashTableBase::Defaults<TUint32, RHashTableBase::EDefaultSpecifier_Normal>::Hash()
+	{return (TGeneralHashFunction32)&DefaultHash::Integer;}
+
+/**
+@internalComponent
+*/
+inline TGeneralIdentityRelation RHashTableBase::Defaults<TUint32, RHashTableBase::EDefaultSpecifier_Normal>::Id()
+	{return (TGeneralIdentityRelation)&DefaultIdentity::Integer;}
+
+
+/**
+@internalComponent
+*/
+TEMPLATE_SPECIALIZATION class RHashTableBase::Defaults<TDesC8, RHashTableBase::EDefaultSpecifier_Normal>
+	{
+public:
+	inline static TGeneralHashFunction32 Hash();
+	inline static TGeneralIdentityRelation Id();
+	};
+
+/**
+@internalComponent
+*/
+inline TGeneralHashFunction32 RHashTableBase::Defaults<TDesC8, RHashTableBase::EDefaultSpecifier_Normal>::Hash()
+	{return (TGeneralHashFunction32)&DefaultHash::Des8;}
+
+/**
+@internalComponent
+*/
+inline TGeneralIdentityRelation RHashTableBase::Defaults<TDesC8, RHashTableBase::EDefaultSpecifier_Normal>::Id()
+	{return (TGeneralIdentityRelation)&DefaultIdentity::Des8;}
+
+
+/**
+@internalComponent
+*/
+TEMPLATE_SPECIALIZATION class RHashTableBase::Defaults<TDesC16, RHashTableBase::EDefaultSpecifier_Normal>
+	{
+public:
+	inline static TGeneralHashFunction32 Hash();
+	inline static TGeneralIdentityRelation Id();
+	};
+
+/**
+@internalComponent
+*/
+inline TGeneralHashFunction32 RHashTableBase::Defaults<TDesC16, RHashTableBase::EDefaultSpecifier_Normal>::Hash()
+	{return (TGeneralHashFunction32)&DefaultHash::Des16;}
+
+/**
+@internalComponent
+*/
+inline TGeneralIdentityRelation RHashTableBase::Defaults<TDesC16, RHashTableBase::EDefaultSpecifier_Normal>::Id()
+	{return (TGeneralIdentityRelation)&DefaultIdentity::Des16;}
+
+
+
+
+/**
+@internalComponent
+
+Base class used in the derivation of THashSetIter<T>, TPtrHashSetIter<T>,
+THashMapIter<K,V> and TPtrHashMapIter<K,V>.
+
+This class provides iteration capability for the hash table classes derived
+from RHashTableBase.
+The class is internal and is not intended for use.
+*/
+class THashTableIterBase
+	{
+protected:
+	IMPORT_C THashTableIterBase(const RHashTableBase& aTable);
+	IMPORT_C void Reset();
+	IMPORT_C const TAny* Next(TInt aOffset=0);
+	IMPORT_C const TAny* Current(TInt aOffset=0) const;
+	IMPORT_C void RemoveCurrent();
+private:
+	const RHashTableBase& iTbl;
+	TInt iIndex;
+	TInt iPad1;							// expansion room
+	TInt iPad2;
+	};
+
+
+
+template <class T> class THashSetIter;
+
+/**
+@publishedAll
+@released
+
+A templated class which implements an unordered extensional set of objects of
+type T using a probe-sequence hash table. The objects are copied into the set
+when they are added. A bitwise binary copy is used here, so the type T must
+not implement a nontrivial copy constructor.
+
+*/
+template <class T>
+class RHashSet : public RHashTableBase
+	{
+private:
+	friend class THashSetIter<T>;
+	
+	struct SFullElement
+		{
+		TUint32 iHash;
+		T iT;
+		};
+
+public:
+
+/**
+A class which allows iteration over the elements of a RHashSet<T> class.
+
+The set being iterated over may not be modified while an iteration is in progress
+or the iteration operations may malfunction or panic.
+
+@see THashSetIter<T>
+*/
+	typedef THashSetIter<T> TIter;
+	
+/**
+Construct a set of objects of type T using a specified hash function and identity relation.
+The set is initially empty.
+
+@param	aHash		The hash function used to hash the objects of type T.
+@param	aIdentity	The identity relation used to determine if two objects of type T
+					should be considered identical.
+*/
+	inline RHashSet(const THashFunction32<T>& aHash, const TIdentityRelation<T>& aIdentity)
+		:	RHashTableBase(aHash, aIdentity, sizeof(SFullElement), _FOFF(SFullElement,iT))
+		{}
+
+
+/**
+Construct a set of objects of type T using a default hash function and identity relation.
+The set is initially empty.
+*/
+	inline RHashSet()
+		:	RHashTableBase(Defaults<T,EDefaultSpecifier_Normal>::Hash(), Defaults<T,EDefaultSpecifier_Normal>::Id(), sizeof(SFullElement), _FOFF(SFullElement,iT))
+		{}
+
+
+/**
+Free all memory used by this set.
+Returns the set to the same state it had following construction.
+*/
+	inline void Close()
+		{ RHashTableBase::Close(); }
+
+
+/**
+Locate a specified element in the set.
+
+@param	aKey	The object of type T to search for.
+@return			A pointer to the copy of the specified object in the set, if it
+				exists. The object may not be modified via this pointer.
+				NULL if the specified object is not a member of this set.
+*/
+	inline const T* Find(const T& aKey) const
+		{ return (const T*)RHashTableBase::Find(&aKey, _FOFF(SFullElement,iT)); }
+
+
+/**
+Locate a specified element in the set.
+
+@param	aKey	The object of type T to search for.
+@return			A reference to the copy of the specified object in the set, if it
+				exists. The object may not be modified via this reference.
+@leave			KErrNotFound if the specified object is not a member of this set.
+*/
+	inline const T& FindL(const T& aKey) const
+		{ return *(const T*)RHashTableBase::FindL(&aKey, _FOFF(SFullElement,iT)); }
+
+
+/**
+Locate a specified element in the set.
+
+@param	aKey	The object of type T to search for.
+@return			A pointer to the copy of the specified object in the set, if it
+				exists. The object may be modified via this pointer. Care should
+				be taken not to modify any parts of the object which are used by
+				either the hash function or the identity relation for this set.
+				If this is done the set may become inconsistent, resulting in
+				malfunctions and/or panics at a later time.
+				NULL if the specified object is not a member of this set.
+*/
+	inline T* Find(const T& aKey)
+		{ return (T*)RHashTableBase::Find(&aKey, _FOFF(SFullElement,iT)); }
+
+
+/**
+Locate a specified element in the set.
+
+@param	aKey	The object of type T to search for.
+@return			A reference to the copy of the specified object in the set, if it
+				exists. The object may be modified via this reference. Care should
+				be taken not to modify any parts of the object which are used by
+				either the hash function or the identity relation for this set.
+				If this is done the set may become inconsistent, resulting in
+				malfunctions and/or panics at a later time.
+@leave			KErrNotFound if the specified object is not a member of this set.
+*/
+	inline T& FindL(const T& aKey)
+		{ return *(T*)RHashTableBase::FindL(&aKey, _FOFF(SFullElement,iT)); }
+
+
+/**
+Insert an element into the set.
+
+If the specified object is not currently a member of the set, a copy of the
+object is added to the set and KErrNone is returned.
+If the specified object is currently a member of the set, the existing copy
+of the object is replaced by the provided object and KErrNone is
+returned.
+In both cases the object is copied bitwise into the set.
+
+@param	aKey	The object of type T to add to the set.
+@return			KErrNone if the object was added successfully.
+				KErrNoMemory if memory could not be allocated to store
+					the copy of aKey.
+*/
+	inline TInt Insert(const T& aKey)
+		{ return RHashTableBase::ValueInsert(&aKey, sizeof(T), 0, 0, 0); }
+
+
+/**
+Insert an element into the set.
+
+If the specified object is not currently a member of the set, a copy of the
+object is added to the set and KErrNone is returned.
+If the specified object is currently a member of the set, the existing copy
+of the object is replaced by the provided object and KErrNone is
+returned.
+In both cases the object is copied bitwise into the set.
+
+@param	aKey	The object of type T to add to the set.
+@leave			KErrNoMemory if memory could not be allocated to store
+					the copy of aKey.
+*/
+	inline void InsertL(const T& aKey)
+		{ RHashTableBase::ValueInsertL(&aKey, sizeof(T), 0, 0, 0); }
+
+
+/**
+Remove an element from the set.
+
+@param	aKey	The object to be removed.
+@return			KErrNone if the object was removed successfully.
+				KErrNotFound if the object was not present in the set.
+*/
+	inline TInt Remove(const T& aKey)
+		{ return RHashTableBase::Remove(&aKey); }
+
+
+/**
+Query the number of elements in the set.
+
+@return	The number of elements currently in the set.
+*/
+	inline TInt Count() const
+		{ return RHashTableBase::Count(); }
+
+
+/**
+Expand the set to accommodate a specified number of elements.
+If the set already has enough space for the specified number of elements, no
+action is taken. Any elements already in the set are retained.
+
+@param	aCount	The number of elements for which space should be allocated.
+@return	KErrNone if the operation completed successfully.
+@return	KErrNoMemory if sufficient memory could not be allocated.
+*/
+	inline TInt Reserve(TInt aCount)
+		{ return RHashTableBase::Reserve(aCount); }
+
+
+/**
+Expand the set to accommodate a specified number of elements.
+If the set already has enough space for the specified number of elements, no
+action is taken. Any elements already in the set are retained.
+
+@param	aCount	The number of elements for which space should be allocated.
+@leave	KErrNoMemory if sufficient memory could not be allocated.
+*/
+	inline void ReserveL(TInt aCount)
+		{ RHashTableBase::ReserveL(aCount); }
+
+	};
+
+
+/**
+@publishedAll
+@released
+
+A templated class which allows iteration over the elements of a RHashSet<T>
+class.
+
+The set being iterated over may not be modified while an iteration is in progress
+or the iteration operations may malfunction or panic.
+
+@see RHashSet<T>
+*/
+template <class T>
+class THashSetIter : public THashTableIterBase
+	{
+private:
+	
+	struct SFullElement
+		{
+		TUint32 iHash;
+		T iT;
+		};
+
+public:
+
+/**
+Construct an iterator over the specified set.
+The iterator starts at conceptual position one before the beginning of the list
+being iterated.
+
+@param	aSet	The set to be iterated over.
+*/
+	inline THashSetIter(const RHashSet<T>& aSet)
+		:	THashTableIterBase(aSet)
+		{}
+
+
+/**
+Reset the iterator to its initial state.
+
+@param	aSet	The set to be iterated over.
+*/
+	inline void Reset()
+		{ THashTableIterBase::Reset(); }
+
+
+/**
+Return the current position of the iterator.
+
+@return	A pointer to the set member corresponding to the current position of the
+		iterator.
+		NULL if the iterator has just been constructed or reset, or if it has
+		previously reached the end of an iteration.
+*/
+	inline const T* Current() const
+		{ return (const T*)THashTableIterBase::Current(_FOFF(SFullElement,iT)); }
+
+
+/**
+Steps the iterator to the next position.
+
+@return	A pointer to the set member corresponding to the next position of the
+		iterator.
+		NULL if the iterator has exhausted all the available set elements.
+*/
+	inline const T* Next()
+		{ return (const T*)THashTableIterBase::Next(_FOFF(SFullElement,iT)); }
+
+
+/**
+Removes the element at the current iterator position from the hash table.
+If the iterator does not currently point to a valid element, no action is taken.
+Note that the iterator position is not altered so it no longer points to a valid
+element following the Remove(). It is illegal to call Current() on the iterator
+after calling Remove() - the only legal operations are Reset() and Next().
+
+*/
+	inline void RemoveCurrent()
+		{ THashTableIterBase::RemoveCurrent(); }
+	};
+
+
+
+template <class T> class TPtrHashSetIter;
+
+/**
+@publishedAll
+@released
+
+A templated class which implements an unordered extensional set of objects of
+type T using a probe-sequence hash table. The objects are not copied into the set
+when they are added; rather the set stores pointers to the contained objects.
+
+*/
+template <class T>
+class RPtrHashSet : public RHashTableBase
+	{
+private:
+	friend class TPtrHashSetIter<T>;
+	
+	struct SFullElement
+		{
+		TUint32 iHash;
+		T* iT;
+		};
+
+public:
+
+/**
+A class which allows iteration over the elements of a RPtrHashSet<T> class.
+
+The set being iterated over may not be modified while an iteration is in progress
+or the iteration operations may malfunction or panic.
+
+@see TPtrHashSetIter<T>
+*/
+	typedef TPtrHashSetIter<T> TIter;
+
+/**
+Construct a set of objects of type T using a specified hash function and identity relation.
+The set is initially empty.
+
+@param	aHash		The hash function used to hash the objects of type T.
+@param	aIdentity	The identity relation used to determine if two objects of type T
+					should be considered identical.
+*/
+	inline RPtrHashSet(const THashFunction32<T>& aHash, const TIdentityRelation<T>& aIdentity)
+		:	RHashTableBase(aHash, aIdentity, sizeof(SFullElement), 0)
+		{}
+
+
+/**
+Construct a set of objects of type T using a default hash function and identity relation.
+The set is initially empty.
+*/
+	inline RPtrHashSet()
+		:	RHashTableBase(Defaults<T,EDefaultSpecifier_Normal>::Hash(), Defaults<T,EDefaultSpecifier_Normal>::Id(), sizeof(SFullElement), 0)
+		{}
+
+
+/**
+Free all memory used by this set.
+Returns the set to the same state it had following construction.
+*/
+	inline void Close()
+		{ RHashTableBase::Close(); }
+
+
+/**
+Locate a specified element in the set.
+
+@param	aKey	The object of type T to search for.
+@return			A pointer to the specified object, if it is in the set.
+				The object may not be modified via this pointer.
+				NULL if the specified object is not a member of this set.
+*/
+	inline const T* Find(const T& aKey) const
+		{ return (const T*)RHashTableBase::Find(&aKey, -_FOFF(SFullElement,iT)); }
+
+
+/**
+Locate a specified element in the set.
+
+@param	aKey	The object of type T to search for.
+@return			A reference to the specified object, if it is in the set.
+				The object may not be modified via this reference.
+@leave	KErrNotFound if the specified object is not a member of this set.
+*/
+	inline const T& FindL(const T& aKey) const
+		{ return *(const T*)RHashTableBase::FindL(&aKey, -_FOFF(SFullElement,iT)); }
+
+
+/**
+Locate a specified element in the set.
+
+@param	aKey	The object of type T to search for.
+@return			A pointer to the specified object, if it is in the set.
+				The object may be modified via this pointer. Care should
+				be taken not to modify any parts of the object which are used by
+				either the hash function or the identity relation for this set.
+				If this is done the set may become inconsistent, resulting in
+				malfunctions and/or panics at a later time.
+				NULL if the specified object is not a member of this set.
+*/
+	inline T* Find(const T& aKey)
+		{ return (T*)RHashTableBase::Find(&aKey, -_FOFF(SFullElement,iT)); }
+
+
+/**
+Locate a specified element in the set.
+
+@param	aKey	The object of type T to search for.
+@return			A reference to the specified object, if it is in the set.
+				The object may be modified via this reference. Care should
+				be taken not to modify any parts of the object which are used by
+				either the hash function or the identity relation for this set.
+				If this is done the set may become inconsistent, resulting in
+				malfunctions and/or panics at a later time.
+@leave	KErrNotFound if the specified object is not a member of this set.
+*/
+	inline T& FindL(const T& aKey)
+		{ return *(T*)RHashTableBase::FindL(&aKey, -_FOFF(SFullElement,iT)); }
+
+
+/**
+Insert an element into the set.
+
+If the specified object is not currently a member of the set, a pointer to the
+object is added to the set and KErrNone is returned.
+If the specified object is currently a member of the set, the existing pointer
+to the object is replaced by the provided pointer and KErrNone is
+returned.
+In both cases only a pointer to the object is stored - the object is never copied.
+
+@param	aKey	A pointer to the object of type T to add to the set.
+@return			KErrNone if the object was added successfully.
+				KErrNoMemory if memory could not be allocated to store
+					the pointer to the new object.
+*/
+	inline TInt Insert(const T* aKey)
+		{ return RHashTableBase::PtrInsert(aKey, 0); }
+
+
+/**
+Insert an element into the set.
+
+If the specified object is not currently a member of the set, a pointer to the
+object is added to the set and KErrNone is returned.
+If the specified object is currently a member of the set, the existing pointer
+to the object is replaced by the provided pointer and KErrNone is
+returned.
+In both cases only a pointer to the object is stored - the object is never copied.
+
+@param	aKey	A pointer to the object of type T to add to the set.
+@leave	KErrNoMemory if memory could not be allocated to store the pointer to the new object.
+*/
+	inline void InsertL(const T* aKey)
+		{ RHashTableBase::PtrInsertL(aKey, 0); }
+
+
+/**
+Remove an element from the set.
+
+@param	aKey	A pointer to the object to be removed.
+@return			KErrNone if the object was removed successfully.
+				KErrNotFound if the object was not present in the set.
+*/
+	inline TInt Remove(const T* aKey)
+		{ return RHashTableBase::Remove(aKey); }
+
+
+/**
+Query the number of elements in the set.
+
+@return	The number of elements currently in the set.
+*/
+	inline TInt Count() const
+		{ return RHashTableBase::Count(); }
+
+
+/**
+Expand the set to accommodate a specified number of elements.
+If the set already has enough space for the specified number of elements, no
+action is taken. Any elements already in the set are retained.
+
+@param	aCount	The number of elements for which space should be allocated.
+@return	KErrNone if the operation completed successfully.
+@return	KErrNoMemory if sufficient memory could not be allocated.
+*/
+	inline TInt Reserve(TInt aCount)
+		{ return RHashTableBase::Reserve(aCount); }
+
+
+/**
+Expand the set to accommodate a specified number of elements.
+If the set already has enough space for the specified number of elements, no
+action is taken. Any elements already in the set are retained.
+
+@param	aCount	The number of elements for which space should be allocated.
+@leave	KErrNoMemory if sufficient memory could not be allocated.
+*/
+	inline void ReserveL(TInt aCount)
+		{ RHashTableBase::ReserveL(aCount); }
+
+
+	void ResetAndDestroy();
+	};
+
+
+/**
+@publishedAll
+@released
+
+A templated class which allows iteration over the elements of a RPtrHashSet<T>
+class.
+
+The set being iterated over may not be modified while an iteration is in progress
+or the iteration operations may malfunction or panic.
+
+@see RPtrHashSet<T>
+*/
+template <class T>
+class TPtrHashSetIter : public THashTableIterBase
+	{
+private:
+	
+	struct SFullElement		
+		{
+		TUint32 iHash;
+		T* iT;
+		};
+
+public:
+
+/**
+Construct an iterator over the specified set.
+The iterator starts at conceptual position one before the beginning of the list
+being iterated.
+
+@param	aSet	The set to be iterated over.
+*/
+	inline TPtrHashSetIter(const RPtrHashSet<T>& aSet)
+		:	THashTableIterBase(aSet)
+		{}
+
+
+/**
+Reset the iterator to its initial state.
+
+@param	aSet	The set to be iterated over.
+*/
+	inline void Reset()
+		{ THashTableIterBase::Reset(); }
+
+
+/**
+Return the current position of the iterator.
+
+@return	A pointer to the set member corresponding to the current position of the
+		iterator.
+		NULL if the iterator has just been constructed or reset, or if it has
+		previously reached the end of an iteration.
+*/
+	inline const T* Current() const
+		{ return (const T*)THashTableIterBase::Current(-_FOFF(SFullElement,iT)); }
+
+
+/**
+Steps the iterator to the next position.
+
+@return	A pointer to the set member corresponding to the next position of the
+		iterator.
+		NULL if the iterator has exhausted all the available set elements.
+*/
+	inline const T* Next()
+		{ return (const T*)THashTableIterBase::Next(-_FOFF(SFullElement,iT)); }
+
+
+/**
+Removes the element at the current iterator position from the hash table.
+If the iterator does not currently point to a valid element, no action is taken.
+Note that the iterator position is not altered so it no longer points to a valid
+element following the Remove(). It is illegal to call Current() on the iterator
+after calling Remove() - the only legal operations are Reset() and Next().
+
+*/
+	inline void RemoveCurrent()
+		{ THashTableIterBase::RemoveCurrent(); }
+	};
+
+
+
+template <class K, class V> class THashMapIter;
+
+/**
+@publishedAll
+@released
+
+A templated class which implements an associative array with key type K and value type V,
+using a probe-sequence hash table. Both the key and value objects are copied into the
+table when they are added. A bitwise binary copy is used here, so neither of the types
+K and V may implement a nontrivial copy constructor.
+
+*/
+template <class K, class V>
+class RHashMap : public RHashTableBase
+	{
+private:
+	friend class THashMapIter<K,V>;
+	
+	struct SFullElement
+		{
+		TUint32 iHash;
+		K iK;
+		V iV;
+		};
+
+public:
+
+/**
+A class which allows iteration over the elements of a RHashMap<K,V> class.
+
+The array being iterated over may not be modified while an iteration is in progress
+or the iteration operations may malfunction or panic.
+
+@see THashMapIter<K,V>
+*/
+	typedef THashMapIter<K,V> TIter;
+
+/**
+Construct an associative array of key-value pairs of type (K,V) using a
+specified hash function and identity relation.
+The array initially contains no key-value pairs.
+
+@param	aHash		The hash function used to hash the key objects of type K.
+@param	aIdentity	The identity relation used to determine if two key objects
+					of type K should be considered identical.
+*/
+	inline RHashMap(const THashFunction32<K>& aHash, const TIdentityRelation<K>& aIdentity)
+		:	RHashTableBase(aHash, aIdentity, sizeof(SFullElement), _FOFF(SFullElement,iK))
+		{}
+
+
+/**
+Construct an associative array of key-value pairs of type (K,V) using a
+default hash function and identity relation.
+The array initially contains no key-value pairs.
+*/
+	inline RHashMap()
+		:	RHashTableBase(Defaults<K,EDefaultSpecifier_Normal>::Hash(), Defaults<K,EDefaultSpecifier_Normal>::Id(), sizeof(SFullElement), _FOFF(SFullElement,iK))
+		{}
+
+
+/**
+Free all memory used by this array.
+Returns the array to the same state it had following construction.
+*/
+	inline void Close()
+		{ RHashTableBase::Close(); }
+
+
+/**
+Look up a specified key in the associative array and return a pointer to the
+corresponding value.
+
+@param	aKey	The key object of type K to look up.
+@return			A pointer to the copy of the corresponding value object in the
+				array, if the specified key object was found.
+				The value object may not be modified via this pointer.
+				NULL if the specified key object was not found.
+*/
+	inline const V* Find(const K& aKey) const
+		{ return (const V*)RHashTableBase::Find(&aKey, _FOFF(SFullElement,iV)); }
+
+
+/**
+Look up a specified key in the associative array and return a pointer to the
+corresponding value.
+
+@param	aKey	The key object of type K to look up.
+@return			A reference to the copy of the corresponding value object in the
+				array, if the specified key object was found.
+				The value object may not be modified via this reference.
+@leave	KErrNotFound if the specified key object was not found.
+*/
+	inline const V& FindL(const K& aKey) const
+		{ return *(const V*)RHashTableBase::FindL(&aKey, _FOFF(SFullElement,iV)); }
+
+
+/**
+Look up a specified key in the associative array and return a pointer to the
+corresponding value.
+
+@param	aKey	The key object of type K to look up.
+@return			A pointer to the copy of the corresponding value object in the
+				array, if the specified key object was found.
+				The value object may be modified via this pointer.
+				NULL if the specified key object was not found.
+*/
+	inline V* Find(const K& aKey)
+		{ return (V*)RHashTableBase::Find(&aKey, _FOFF(SFullElement,iV)); }
+
+
+/**
+Look up a specified key in the associative array and return a pointer to the
+corresponding value.
+
+@param	aKey	The key object of type K to look up.
+@return			A reference to the copy of the corresponding value object in the
+				array, if the specified key object was found.
+				The value object may be modified via this reference.
+@leave	KErrNotFound if the specified key object was not found.
+*/
+	inline V& FindL(const K& aKey)
+		{ return *(V*)RHashTableBase::FindL(&aKey, _FOFF(SFullElement,iV)); }
+
+
+/**
+Insert a key-value pair into the array.
+
+If the specified key object is not found in the array, a copy of the
+key object along with a copy of the value object are added to the array
+and KErrNone is returned.
+If the specified key object is found in the array, the existing copies
+of both the key and value objects are replaced by the provided objects
+and KErrNone is returned.
+In both cases the objects are copied bitwise into the array.
+
+@param	aKey	The key object of type K to add to the array.
+@param	aValue	The value object of type V to associate with aKey.
+@return			KErrNone if the key-value pair was added successfully.
+				KErrNoMemory if memory could not be allocated to store
+					the copies of aKey and aValue.
+*/
+	inline TInt Insert(const K& aKey, const V& aValue)
+		{ return RHashTableBase::ValueInsert(&aKey, sizeof(K), &aValue, _FOFF(SFullElement,iV), sizeof(V)); }
+
+
+/**
+Insert a key-value pair into the array.
+
+If the specified key object is not found in the array, a copy of the
+key object along with a copy of the value object are added to the array
+and KErrNone is returned.
+If the specified key object is found in the array, the existing copies
+of both the key and value objects are replaced by the provided objects
+and KErrNone is returned.
+In both cases the objects are copied bitwise into the array.
+
+@param	aKey	The key object of type K to add to the array.
+@param	aValue	The value object of type V to associate with aKey.
+@leave	KErrNoMemory if memory could not be allocated to store the copies of aKey and aValue.
+*/
+	inline void InsertL(const K& aKey, const V& aValue)
+		{ RHashTableBase::ValueInsertL(&aKey, sizeof(K), &aValue, _FOFF(SFullElement,iV), sizeof(V)); }
+
+
+/**
+Remove a key-value pair from the array.
+
+@param	aKey	The key to be removed.
+@return			KErrNone if the key object and corresponding value object were
+				removed successfully.
+				KErrNotFound if the key object was not present in the array.
+*/
+	inline TInt Remove(const K& aKey)
+		{ return RHashTableBase::Remove(&aKey); }
+
+
+/**
+Query the number of key-value pairs in the array.
+
+@return	The number of key-value pairs currently in the array.
+*/
+	inline TInt Count() const
+		{ return RHashTableBase::Count(); }
+
+
+/**
+Expand the array to accommodate a specified number of key-value pairs.
+If the set already has enough space for the specified number of elements, no
+action is taken. Any elements already in the set are retained.
+
+@param	aCount	The number of key-value pairs for which space should be allocated.
+@return	KErrNone if the operation completed successfully.
+@return	KErrNoMemory if sufficient memory could not be allocated.
+*/
+	inline TInt Reserve(TInt aCount)
+		{ return RHashTableBase::Reserve(aCount); }
+
+
+/**
+Expand the array to accommodate a specified number of key-value pairs.
+If the set already has enough space for the specified number of elements, no
+action is taken. Any elements already in the set are retained.
+
+@param	aCount	The number of key-value pairs for which space should be allocated.
+@leave	KErrNoMemory if sufficient memory could not be allocated.
+*/
+	inline void ReserveL(TInt aCount)
+		{ RHashTableBase::ReserveL(aCount); }
+
+	};
+
+
+/**
+@publishedAll
+@released
+
+A templated class which allows iteration over the elements of a RHashMap<K,V>
+class.
+
+The array being iterated over may not be modified while an iteration is in progress
+or the iteration operations may malfunction or panic.
+
+@see RHashMap<K,V>
+*/
+template <class K, class V>
+class THashMapIter : public THashTableIterBase
+	{
+private:
+	
+	struct SFullElement
+		{
+		TUint32 iHash;
+		K iK;
+		V iV;
+		};
+
+public:
+
+/**
+Construct an iterator over the specified associative array.
+The iterator starts at conceptual position one before the beginning of the list
+being iterated.
+
+@param	aMap	The array to be iterated over.
+*/
+	inline THashMapIter(const RHashMap<K,V>& aMap)
+		:	THashTableIterBase(aMap)
+		{}
+
+
+/**
+Reset the iterator to its initial state.
+
+@param	aSet	The set to be iterated over.
+*/
+	inline void Reset()
+		{ THashTableIterBase::Reset(); }
+
+
+/**
+Return the key corresponding to the current position of the iterator.
+
+@return	A pointer to the key object corresponding to the current position of the
+		iterator.
+		NULL if the iterator has just been constructed or reset, or if it has
+		previously reached the end of an iteration.
+*/
+	inline const K* CurrentKey() const
+		{ return (const K*)THashTableIterBase::Current(_FOFF(SFullElement,iK)); }
+
+
+/**
+Steps the iterator to the next position and returns the corresponding key.
+
+@return	A pointer to the key object corresponding to the next position of the
+		iterator.
+		NULL if the iterator has exhausted all the available key-value pairs.
+*/
+	inline const K* NextKey()
+		{ return (const K*)THashTableIterBase::Next(_FOFF(SFullElement,iK)); }
+
+
+/**
+Return the value corresponding to the current position of the iterator.
+
+@return	A pointer to the value object corresponding to the current position of the
+		iterator.
+		NULL if the iterator has just been constructed or reset, or if it has
+		previously reached the end of an iteration.
+*/
+	inline V* CurrentValue() 
+		{ return (V*)THashTableIterBase::Current(_FOFF(SFullElement,iV)); }
+
+
+/**
+Steps the iterator to the next position and returns the corresponding value.
+
+@return	A pointer to the value object corresponding to the next position of the
+		iterator.
+		NULL if the iterator has exhausted all the available key-value pairs.
+*/
+	inline const V* NextValue()
+		{ return (const V*)THashTableIterBase::Next(_FOFF(SFullElement,iV)); }
+
+
+/**
+Removes the element at the current iterator position from the hash table.
+If the iterator does not currently point to a valid element, no action is taken.
+Note that the iterator position is not altered so it no longer points to a valid
+element following the Remove(). It is illegal to call either CurrentKey() or
+CurrentValue() on the iterator after calling Remove() - the only legal
+operations are Reset(), NextKey() or NextValue().
+
+*/
+	inline void RemoveCurrent()
+		{ THashTableIterBase::RemoveCurrent(); }
+	};
+
+
+
+template <class K, class V> class TPtrHashMapIter;
+
+/**
+@publishedAll
+@released
+
+A templated class which implements an associative array with key type K and value type V,
+using a probe-sequence hash table. Neither the key nor value objects are copied into the
+table when they are added - only pointers are stored.
+
+*/
+template <class K, class V>
+class RPtrHashMap : public RHashTableBase
+	{
+private:
+	friend class TPtrHashMapIter<K,V>;
+	
+	struct SFullElement
+		{
+		TUint32 iHash;
+		K* iK;
+		V* iV;
+		};
+public:
+
+/**
+A class which allows iteration over the elements of a RPtrHashMap<K,V> class.
+
+The array being iterated over may not be modified while an iteration is in progress
+or the iteration operations may malfunction or panic.
+
+@see TPtrHashMapIter<K,V>
+*/
+	typedef TPtrHashMapIter<K,V> TIter;
+
+/**
+Construct an associative array of key-value pairs of type (K,V) using a
+specified hash function and identity relation.
+The array initially contains no key-value pairs.
+
+@param	aHash		The hash function used to hash the key objects of type K.
+@param	aIdentity	The identity relation used to determine if two key objects
+					of type K should be considered identical.
+*/
+	inline RPtrHashMap(const THashFunction32<K>& aHash, const TIdentityRelation<K>& aIdentity)
+		:	RHashTableBase(aHash, aIdentity, sizeof(SFullElement), 0)
+		{}
+
+
+/**
+Construct an associative array of key-value pairs of type (K,V) using a
+default hash function and identity relation.
+The array initially contains no key-value pairs.
+*/
+	inline RPtrHashMap()
+		:	RHashTableBase(Defaults<K,EDefaultSpecifier_Normal>::Hash(), Defaults<K,EDefaultSpecifier_Normal>::Id(), sizeof(SFullElement), 0)
+		{}
+
+
+/**
+Free all memory used by this array.
+Returns the array to the same state it had following construction.
+*/
+	inline void Close()
+		{ RHashTableBase::Close(); }
+
+
+/**
+Look up a specified key in the associative array and return a pointer to the
+corresponding value.
+
+@param	aKey	The key object of type K to look up.
+@return			A pointer to corresponding value object if the specified key
+				object was found. The value object may not be modified via
+				this pointer.
+				NULL if the specified key object was not found.
+*/
+	inline const V* Find(const K& aKey) const
+		{ return (const V*)RHashTableBase::Find(&aKey, -_FOFF(SFullElement,iV)); }
+
+
+/**
+Look up a specified key in the associative array and return a pointer to the
+corresponding value.
+
+@param	aKey	The key object of type K to look up.
+@return			A reference to corresponding value object if the specified key
+				object was found. The value object may not be modified via
+				this reference.
+@leave	KErrNotFound if the specified key object was not found.
+*/
+	inline const V& FindL(const K& aKey) const
+		{ return *(const V*)RHashTableBase::FindL(&aKey, -_FOFF(SFullElement,iV)); }
+
+
+/**
+Look up a specified key in the associative array and return a pointer to the
+corresponding value.
+
+@param	aKey	The key object of type K to look up.
+@return			A pointer to corresponding value object if the specified key
+				object was found. The value object may be modified via
+				this pointer.
+				NULL if the specified key object was not found.
+*/
+	inline V* Find(const K& aKey)
+		{ return (V*)RHashTableBase::Find(&aKey, -_FOFF(SFullElement,iV)); }
+
+
+/**
+Look up a specified key in the associative array and return a pointer to the
+corresponding value.
+
+@param	aKey	The key object of type K to look up.
+@return			A reference to corresponding value object if the specified key
+				object was found. The value object may be modified via
+				this reference.
+@leave	KErrNotFound if the specified key object was not found.
+*/
+	inline V& FindL(const K& aKey)
+		{ return *(V*)RHashTableBase::FindL(&aKey, -_FOFF(SFullElement,iV)); }
+
+
+/**
+Insert a key-value pair into the array.
+
+If the specified key object is not found in the array, a pointer to the
+key object along with a pointer to the value object are added to the array
+and KErrNone is returned.
+If the specified key object is found in the array, the existing pointers
+to both the key and value objects are replaced by the provided pointers
+and KErrNone is returned.
+In both cases only pointers are stored in the array - the objects themselves
+are not copied.
+
+@param	aKey	A pointer to the key object of type K to add to the array.
+@param	aValue	A pointer to the value object of type V to associate with aKey.
+@return			KErrNone if the key-value pair was added successfully.
+				KErrNoMemory if memory could not be allocated to store
+					the pointers aKey and aValue.
+*/
+	inline TInt Insert(const K* aKey, const V* aValue)
+		{ return RHashTableBase::PtrInsert(aKey, aValue); }
+
+
+/**
+Insert a key-value pair into the array.
+
+If the specified key object is not found in the array, a pointer to the
+key object along with a pointer to the value object are added to the array
+and KErrNone is returned.
+If the specified key object is found in the array, the existing pointers
+to both the key and value objects are replaced by the provided pointers
+and KErrNone is returned.
+In both cases only pointers are stored in the array - the objects themselves
+are not copied.
+
+@param	aKey	A pointer to the key object of type K to add to the array.
+@param	aValue	A pointer to the value object of type V to associate with aKey.
+@leave	KErrNoMemory if memory could not be allocated to store the pointers aKey and aValue.
+*/
+	inline void InsertL(const K* aKey, const V* aValue)
+		{ RHashTableBase::PtrInsertL(aKey, aValue); }
+
+
+/**
+Remove a key-value pair from the array.
+
+@param	aKey	A pointer to the key to be removed.
+@return			KErrNone if the pointers to the key object and corresponding
+				value object were removed successfully.
+				KErrNotFound if the key object was not present in the array.
+*/
+	inline TInt Remove(const K* aKey)
+		{ return RHashTableBase::Remove(aKey); }
+
+
+/**
+Query the number of key-value pairs in the array.
+
+@return	The number of key-value pairs currently in the array.
+*/
+	inline TInt Count() const
+		{ return RHashTableBase::Count(); }
+
+
+/**
+Expand the array to accommodate a specified number of key-value pairs.
+If the set already has enough space for the specified number of elements, no
+action is taken. Any elements already in the set are retained.
+
+@param	aCount	The number of key-value pairs for which space should be allocated.
+@return	KErrNone if the operation completed successfully.
+@return	KErrNoMemory if sufficient memory could not be allocated.
+*/
+	inline TInt Reserve(TInt aCount)
+		{ return RHashTableBase::Reserve(aCount); }
+
+
+/**
+Expand the array to accommodate a specified number of key-value pairs.
+If the set already has enough space for the specified number of elements, no
+action is taken. Any elements already in the set are retained.
+
+@param	aCount	The number of key-value pairs for which space should be allocated.
+@leave	KErrNoMemory if sufficient memory could not be allocated.
+*/
+	inline void ReserveL(TInt aCount)
+		{ RHashTableBase::ReserveL(aCount); }
+
+
+	void ResetAndDestroy();
+	};
+
+
+/**
+@publishedAll
+@released
+
+A templated class which allows iteration over the elements of a RPtrHashMap<K,V>
+class.
+
+The array being iterated over may not be modified while an iteration is in progress
+or the iteration operations may malfunction or panic.
+
+@see RPtrHashMap<K,V>
+*/
+template <class K, class V>
+class TPtrHashMapIter : public THashTableIterBase
+	{
+private:
+	
+	struct SFullElement
+		{
+		TUint32 iHash;
+		K* iK;
+		V* iV;
+		};
+public:
+
+/**
+Construct an iterator over the specified associative array.
+The iterator starts at conceptual position one before the beginning of the list
+being iterated.
+
+@param	aMap	The array to be iterated over.
+*/
+	inline TPtrHashMapIter(const RPtrHashMap<K,V>& aMap)
+		:	THashTableIterBase(aMap)
+		{}
+
+
+/**
+Reset the iterator to its initial state.
+
+@param	aSet	The set to be iterated over.
+*/
+	inline void Reset()
+		{ THashTableIterBase::Reset(); }
+
+
+/**
+Return the key corresponding to the current position of the iterator.
+
+@return	A pointer to the key object corresponding to the current position of the
+		iterator.
+		NULL if the iterator has just been constructed or reset, or if it has
+		previously reached the end of an iteration.
+*/
+	inline const K* CurrentKey() const
+		{ return (const K*)THashTableIterBase::Current(-_FOFF(SFullElement,iK)); }
+
+
+/**
+Steps the iterator to the next position and returns the corresponding key.
+
+@return	A pointer to the key object corresponding to the next position of the
+		iterator.
+		NULL if the iterator has exhausted all the available key-value pairs.
+*/
+	inline const K* NextKey()
+		{ return (const K*)THashTableIterBase::Next(-_FOFF(SFullElement,iK)); }
+
+
+/**
+Return the value corresponding to the current position of the iterator.
+
+@return	A pointer to the value object corresponding to the current position of the
+		iterator.
+		NULL if the iterator has just been constructed or reset, or if it has
+		previously reached the end of an iteration.
+*/
+	inline const V* CurrentValue() const
+		{ return (const V*)THashTableIterBase::Current(-_FOFF(SFullElement,iV)); }
+
+
+/**
+Steps the iterator to the next position and returns the corresponding value.
+
+@return	A pointer to the value object corresponding to the next position of the
+		iterator.
+		NULL if the iterator has exhausted all the available key-value pairs.
+*/
+	inline const V* NextValue()
+		{ return (const V*)THashTableIterBase::Next(-_FOFF(SFullElement,iV)); }
+
+		
+/**
+Removes the element at the current iterator position from the hash table.
+If the iterator does not currently point to a valid element, no action is taken.
+Note that the iterator position is not altered so it no longer points to a valid
+element following the Remove(). It is illegal to call either CurrentKey() or
+CurrentValue() on the iterator after calling Remove() - the only legal
+operations are Reset(), NextKey() or NextValue().
+
+*/
+	inline void RemoveCurrent()
+		{ THashTableIterBase::RemoveCurrent(); }
+	};
+
+
+
+/**
+Deletes all the objects of type T to which pointers are stored in this set.
+Then frees all the memory used by the set and returns the set to the same state
+as immediately following construction.
+*/
+template <class T>
+void RPtrHashSet<T>::ResetAndDestroy()
+	{
+	TPtrHashSetIter<T> iter(*this);
+	T* p;
+	do	{
+		p = (T*)iter.Next();
+		delete p;
+		} while(p);
+	Close();
+	}
+
+
+/**
+Deletes all the key objects of type K and corresponding value objects of type V
+to which pointers are stored in this array.
+Then frees all the memory used by the array and returns the array to the same
+state as immediately following construction.
+*/
+template <class K, class V>
+void RPtrHashMap<K,V>::ResetAndDestroy()
+	{
+	TPtrHashMapIter<K,V> iter(*this);
+	K* p;
+	V* q;
+	do	{
+		p = (K*)iter.NextKey();
+		q = (V*)iter.CurrentValue();
+		delete p;
+		delete q;
+		} while(p);
+	Close();
+	}
+
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32/include/e32huffman.h	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,131 @@
+// Copyright (c) 1998-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32\include\e32huffman.h
+// 
+//
+
+#include <e32std.h>
+
+/** @file
+	@internalTechnology
+*/
+
+/** Bit output stream.
+	Good for writing bit streams for packed, compressed or huffman data algorithms.
+
+	This class must be derived from and OverflowL() reimplemented if the bitstream data
+	cannot be generated into a single memory buffer.
+*/
+class TBitOutput
+	{
+public:
+	IMPORT_C TBitOutput();
+	IMPORT_C TBitOutput(TUint8* aBuf,TInt aSize);
+	inline void Set(TUint8* aBuf,TInt aSize);
+	inline const TUint8* Ptr() const;
+	inline TInt BufferedBits() const;
+//
+	IMPORT_C void WriteL(TUint aValue, TInt aLength);
+	IMPORT_C void HuffmanL(TUint aHuffCode);
+	IMPORT_C void PadL(TUint aPadding);
+private:
+	void DoWriteL(TUint aBits, TInt aSize);
+	virtual void OverflowL();
+private:
+	TUint iCode;		// code in production
+	TInt iBits;
+	TUint8* iPtr;
+	TUint8* iEnd;
+	};
+
+/** Set the memory buffer to use for output
+
+	Data will be written to this buffer until it is full, at which point OverflowL() will
+	be called. This should handle the data and then can Set() again to reset the buffer
+	for further output.
+	
+	@param aBuf The buffer for output
+	@param aSize The size of the buffer in bytes
+*/
+inline void TBitOutput::Set(TUint8* aBuf,TInt aSize)
+	{iPtr=aBuf;iEnd=aBuf+aSize;}
+	
+/** Get the current write position in the output buffer
+
+	In conjunction with the address of the buffer, which should be known to the
+	caller, this describes the data in the bitstream.
+*/
+inline const TUint8* TBitOutput::Ptr() const
+	{return iPtr;}
+	
+/** Get the number of bits that are buffered
+
+	This reports the number of bits that have not yet been written into the
+	output buffer. It will always lie in the range 0..7. Use PadL() to
+	pad the data out to the next byte and write it to the buffer.
+*/
+inline TInt TBitOutput::BufferedBits() const
+	{return iBits+8;}
+
+
+/** Bit input stream. Good for reading bit streams for packed, compressed or huffman
+	data algorithms.
+*/
+class TBitInput
+	{
+public:
+	IMPORT_C TBitInput();
+	IMPORT_C TBitInput(const TUint8* aPtr, TInt aLength, TInt aOffset=0);
+	IMPORT_C void Set(const TUint8* aPtr, TInt aLength, TInt aOffset=0);
+//
+	IMPORT_C TUint ReadL();
+	IMPORT_C TUint ReadL(TInt aSize);
+	IMPORT_C TUint HuffmanL(const TUint32* aTree);
+private:
+	virtual void UnderflowL();
+private:
+	TInt iCount;
+	TUint iBits;
+	TInt iRemain;
+	const TUint32* iPtr;
+	};
+
+/** Huffman code toolkit.
+
+	This class builds a huffman encoding from a frequency table and builds
+	a decoding tree from a code-lengths table
+
+	The encoding generated is based on the rule that given two symbols s1 and s2, with 
+	code length l1 and l2, and huffman codes h1 and h2:
+
+		if l1<l2 then h1<h2 when compared lexicographically
+		if l1==l2 and s1<s2 then h1<h2 ditto
+
+	This allows the encoding to be stored compactly as a table of code lengths
+*/
+class Huffman
+	{
+public:
+	enum {KMaxCodeLength=27};
+	enum {KMetaCodes=KMaxCodeLength+1};
+	enum {KMaxCodes=0x8000};
+public:
+	IMPORT_C static void HuffmanL(const TUint32 aFrequency[],TInt aNumCodes,TUint32 aHuffman[]);
+	IMPORT_C static void Encoding(const TUint32 aHuffman[],TInt aNumCodes,TUint32 aEncodeTable[]);
+	IMPORT_C static void Decoding(const TUint32 aHuffman[],TInt aNumCodes,TUint32 aDecodeTree[],TInt aSymbolBase=0);
+	IMPORT_C static TBool IsValid(const TUint32 aHuffman[],TInt aNumCodes);
+//
+	IMPORT_C static void ExternalizeL(TBitOutput& aOutput,const TUint32 aHuffman[],TInt aNumCodes);
+	IMPORT_C static void InternalizeL(TBitInput& aInput,TUint32 aHuffman[],TInt aNumCodes);
+	};
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32/include/e32keys.h	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,521 @@
+// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32\include\e32keys.h
+// 
+//
+
+#ifndef __E32KEYS_H__
+#define __E32KEYS_H__
+
+// Using #define instead of const TInt so this file is parsable by rcomp
+
+/**
+@publishedPartner
+@released
+
+Base code of range that doesn't correspond to a character
+*/
+#define ENonCharacterKeyBase 0xf800
+
+/**
+@publishedPartner
+@released
+
+Size of range that doesn't correspond to a character
+*/
+#define ENonCharacterKeyCount 0x100
+
+/**
+@publishedPartner
+@released
+
+Base code of range that is reserved for application framework use and guaranteed
+not to be produced by any keyboard.
+*/
+#define ESpecialKeyBase 0xf700
+
+/**
+@publishedPartner
+@released
+
+Size of range that is reserved for application framework use and guaranteed
+not to be produced by any keyboard.
+*/
+#define ESpecialKeyCount 0x100
+
+
+
+
+/**
+@publishedAll
+@released
+
+Modifier flags for a key or pointer event.
+
+The modifier flags for a key event are held in TKeyEvent::iModifiers.
+
+The modifier flags for a pointer event are held in TPointerEvent::iModifiers.
+
+@see TKeyEvent::iModifiers
+@see TPointerEvent::iModifiers
+*/
+enum TEventModifier
+	{
+	EModifierAutorepeatable=0x00000001, /**< Key event can auto-repeat.*/
+	EModifierKeypad=0x00000002,         /**< The key that generated the event was on the numeric keypad, on the emulator.*/
+	EModifierLeftAlt=0x00000004,        /**< Left Alt key.*/
+	EModifierRightAlt=0x00000008,       /**< Right Alt key.*/
+	EModifierAlt=0x00000010,            /**< Single Alt key.*/
+	EModifierLeftCtrl=0x00000020,       /**< Left Control (Ctrl) key.*/
+	EModifierRightCtrl=0x00000040,      /**< Right Control (Ctrl) key.*/
+	EModifierCtrl=0x00000080,           /**< Single Control (Ctrl) key.*/
+	EModifierLeftShift=0x00000100,      /**< Left Shift key.*/
+	EModifierRightShift=0x00000200,     /**< Right Shift key.*/
+	EModifierShift=0x00000400,          /**< Single Shift key.*/
+	EModifierLeftFunc=0x00000800,       /**< Left Fn key.*/
+	EModifierRightFunc=0x00001000,      /**< Right Fn key.*/
+	EModifierFunc=0x00002000,           /**< Single Fn key.*/
+	EModifierCapsLock=0x00004000,       /**< Caps lock key.*/
+	EModifierNumLock=0x00008000,        /**< Num lock key.*/
+	EModifierScrollLock=0x00010000,     /**< Scroll lock key.*/
+	EModifierKeyUp=0x00020000,          /**< Key up event.*/
+	EModifierSpecial=0x00040000,        /**< The keycode is a non-standard keyboard character that has been generated in a special keyboard mode, for example accented vowels.*/
+	EModifierDoubleClick=0x00080000,    /**< Double click.*/
+    EModifierPureKeycode=0x00100000,    /**< The key code in the key event is not changed. E.g.an alphabetic key is not changed by the Caps Lock or Shift key being pressed.*/
+	EModifierKeyboardExtend=0x00200000,	/**< The "Keyboard extend" generated modifier. */
+	EModifierCancelRotation=0x00000000, /**< No Keyboard rotation is in effect. */
+	EModifierRotateBy90=0x00400000,		/**< Keyboard rotation through 90 degrees clockwise is in effect. */
+	EModifierRotateBy180=0x00800000,	/**< Keyboard rotation through 180 degrees clockwise is in effect. */
+	EModifierRotateBy270=0x01000000,	/**< Keyboard rotation through 270 degrees clockwise is in effect. */
+	EModifierPointer3DButton1=0x02000000,/**< 3D pointer device specific modifier (button 1). */
+	EModifierPointer3DButton2=0x04000000,/**< 3D pointer device specific modifier (button 2). */
+	EModifierPointer3DButton3=0x08000000,/**< 3D pointer device specific modifier (button 3). */
+	EModifierAdvancedPointerEvent=0x10000000, /**< TPointerEvent is a TAdvancedPointerEvent.*/
+	EAllModifiers=0x1fffffff            /**< A combination of all event modifiers.*/
+	};
+
+
+
+
+/**
+@publishedAll
+@released
+
+Specifies the state of an event modifier, for instance Caps Lock or Num Lock.
+
+Event modifiers are enumerated in TEventModifier.
+The modifier state can be set using RWsSession::SetModifierState().
+
+@see TEventModifier
+@see RWsSession::SetModifierState()
+*/
+enum TModifierState
+    {
+    ETurnOnModifier=0x40, /**< Switch on modifier.*/
+    ETurnOffModifier,     /**< Switch off modifier.*/
+    EToggleModifier       /**< Toggle the modifier on or off.*/
+    };
+
+
+
+
+/**
+@publishedAll
+@released
+
+Scan codes for the physical keys found on keyboards.
+
+When processing a TKeyEvent, the TStdScanCode in TKeyEvent::iScanCode should
+usually be ignored in favour of the TKeyCode in TKeyEvent::iCode.
+
+Using iScanCode would bypass the keyboard mapping and any FEP that happens
+to be installed. The exceptions to this general rule are games where
+the positions of the keys are more important than their translations,
+and FEPs that are implementing keyboard maps themselves. In these cases,
+if the iCode is used rather than iScanCode to determine the key pressed,
+there will be two unfortunate consequences.
+First, the low-level keyboard mapping might re-arrange the mapping that
+you are trying to impose.
+Second, you will subvert the CTRL+number method of entering Unicode literals.
+
+@see TKeyEvent
+@see TStdScanCode
+*/
+enum TStdScanCode
+	{
+	EStdKeyNull=0x00,                     /**< No key present. */
+	EStdKeyBackspace=0x01,                /**< Scan code for Backspace key.*/
+	EStdKeyTab=0x02,                      /**< Scan code for Tab key. */
+	EStdKeyEnter=0x03,                    /**< Scan code for Enter key.*/
+	EStdKeyEscape=0x04,                   /**< Scan code for Escape (Esc) key.*/
+	EStdKeySpace=0x05,                    /**< Scan code for Space key.*/
+	EStdKeyPrintScreen=0x06,              /**< Scan code for Print Screen key.*/
+	EStdKeyPause=0x07,                    /**< Scan code for Pause key.*/
+	EStdKeyHome=0x08,                     /**< Scan code for Home key.*/
+	EStdKeyEnd=0x09,                      /**< Scan code for End key.*/
+	EStdKeyPageUp=0x0a,                   /**< Scan code for Page Up key.*/
+	EStdKeyPageDown=0x0b,                 /**< Scan code for Page Down key.*/
+	EStdKeyInsert=0x0c,                   /**< Scan code for Insert key.*/
+	EStdKeyDelete=0x0d,                   /**< Scan code for Delete (Del) key.*/
+	EStdKeyLeftArrow=0x0e,                /**< Scan code for Left arrow key.*/
+	EStdKeyRightArrow=0x0f,               /**< Scan code for Right arrow key.*/
+	EStdKeyUpArrow=0x10,                  /**< Scan code for Up arrow key.*/
+	EStdKeyDownArrow=0x11,                /**< Scan code for Down arrow key.*/
+	EStdKeyLeftShift=0x12,                /**< Scan code for left Shift key.*/
+	EStdKeyRightShift=0x13,               /**< Scan code for right Shift key.*/
+	EStdKeyLeftAlt=0x14,                  /**< Scan code for left Alt key.*/
+	EStdKeyRightAlt=0x15,                 /**< Scan code for right Alt key.*/
+	EStdKeyLeftCtrl=0x16,                 /**< Scan code for left Control (Ctrl) key.*/
+	EStdKeyRightCtrl=0x17,                /**< Scan code for right Control (Ctrl) key.*/
+	EStdKeyLeftFunc=0x18,                 /**< Scan code for left Fn key.*/
+	EStdKeyRightFunc=0x19,                /**< Scan code for right Fn key.*/
+	EStdKeyCapsLock=0x1a,                 /**< Scan code for Caps lock key.*/
+	EStdKeyNumLock=0x1b,                  /**< Scan code for Num lock key.*/
+	EStdKeyScrollLock=0x1c,               /**< Scan code for Scroll lock key.*/
+	EStdKeyF1=0x60,                       /**< Scan code for function key F1.*/
+	EStdKeyF2=0x61,                       /**< Scan code for function key F2.*/
+	EStdKeyF3=0x62,                       /**< Scan code for function key F3.*/
+	EStdKeyF4=0x63,                       /**< Scan code for function key F4.*/
+	EStdKeyF5=0x64,                       /**< Scan code for function key F5*/
+	EStdKeyF6=0x65,                       /**< Scan code for function key F6*/
+	EStdKeyF7=0x66,                       /**< Scan code for function key F7*/
+	EStdKeyF8=0x67,                       /**< Scan code for function key F8*/
+	EStdKeyF9=0x68,                       /**< Scan code for function key F9*/
+	EStdKeyF10=0x69,                      /**< Scan code for function key F10*/
+	EStdKeyF11=0x6a,                      /**< Scan code for function key F11*/
+	EStdKeyF12=0x6b,                      /**< Scan code for function key F12*/
+	EStdKeyF13=0x6c,                      /**< Scan code for function key F13*/
+	EStdKeyF14=0x6d,                      /**< Scan code for function key F14*/
+	EStdKeyF15=0x6e,                      /**< Scan code for function key F15*/
+	EStdKeyF16=0x6f,                      /**< Scan code for function key F16*/
+	EStdKeyF17=0x70,                      /**< Scan code for function key F17*/
+	EStdKeyF18=0x71,                      /**< Scan code for function key F18*/
+	EStdKeyF19=0x72,                      /**< Scan code for function key F19*/
+	EStdKeyF20=0x73,                      /**< Scan code for function key F20*/
+	EStdKeyF21=0x74,                      /**< Scan code for function key F21*/
+	EStdKeyF22=0x75,                      /**< Scan code for function key F22.*/
+	EStdKeyF23=0x76,                      /**< Scan code for function key F23.*/
+	EStdKeyF24=0x77,                      /**< Scan code for function key F24.*/
+	EStdKeyXXX=0x78,                      /**< Scan code for the key to the left of the 1 key on a standard keyboard.*/
+	EStdKeyComma=0x79,                    /**< Scan code for Comma (,) key.*/
+	EStdKeyFullStop=0x7a,                 /**< Scan code for Full stop (.) key.*/
+	EStdKeyForwardSlash=0x7b,             /**< Scan code for Forward slash (/) key.*/
+	EStdKeyBackSlash=0x7c,                /**< Scan code for Back slash (\) key.*/
+	EStdKeySemiColon=0x7d,                /**< Scan code for Semi colon (;) key.*/
+	EStdKeySingleQuote=0x7e,              /**< Scan code for Single quote (') key.*/
+	EStdKeyHash=0x7f,                     /**< Scan code for Hash key (#) key.*/
+	EStdKeySquareBracketLeft=0x80,        /**< Scan code for left Square bracket ([) key.*/
+	EStdKeySquareBracketRight=0x81,       /**< Scan code for right Square bracket (]) key.*/
+	EStdKeyMinus=0x82,                    /**< Scan code for Minus key (-) key.*/
+	EStdKeyEquals=0x83,                   /**< Scan code for Equals key (=) key.*/
+	EStdKeyNkpForwardSlash=0x84,          /**< Scan code for forward slash (/) key on the Numeric keypad.*/
+	EStdKeyNkpAsterisk=0x85,              /**< Scan code for Asterisk (*) key on the Numeric keypad.*/
+	EStdKeyNkpMinus=0x86,                 /**< Scan code for Minus (-) key on the Numeric keypad.*/
+	EStdKeyNkpPlus=0x87,                  /**< Scan code for Plus (+) key on the Numeric keypad.*/
+	EStdKeyNkpEnter=0x88,                 /**< Scan code for Enter key on the Numeric keypad.*/
+	EStdKeyNkp1=0x89,                     /**< Scan code for the 1 key on the Numeric keypad.*/
+	EStdKeyNkp2=0x8a,                     /**< Scan code for the 2 key on the Numeric keypad.*/
+	EStdKeyNkp3=0x8b,                     /**< Scan code for the 3 key on the Numeric keypad.*/
+	EStdKeyNkp4=0x8c,                     /**< Scan code for the 4 key on the Numeric keypad.*/
+	EStdKeyNkp5=0x8d,                     /**< Scan code for the 5 key on the Numeric keypad.*/
+	EStdKeyNkp6=0x8e,                     /**< Scan code for the 6 key on the Numeric keypad.*/
+	EStdKeyNkp7=0x8f,                     /**< Scan code for the 7 key on the Numeric keypad.*/
+	EStdKeyNkp8=0x90,                     /**< Scan code for the 8 key on the Numeric keypad.*/ 
+	EStdKeyNkp9=0x91,                     /**< Scan code for the 9 key on the Numeric keypad.*/
+	EStdKeyNkp0=0x92,                     /**< Scan code for the 0 key on the Numeric keypad.*/
+	EStdKeyNkpFullStop=0x93,              /**< Scan code for Full stop (.) key on the Numeric keypad.*/
+    EStdKeyMenu=0x94,                     /**< Scan code for Menu key.*/
+    EStdKeyBacklightOn=0x95,              /**< Scan code for Backlight on key.*/
+    EStdKeyBacklightOff=0x96,             /**< Scan code for Backlight off key.*/
+    EStdKeyBacklightToggle=0x97,          /**< Scan code for Backlight toggle key.*/
+    EStdKeyIncContrast=0x98,              /**< Scan code for Increase contrast key.*/
+    EStdKeyDecContrast=0x99,              /**< Scan code for Decrease contrast key.*/
+    EStdKeySliderDown=0x9a,               /**< Scan code for Slider down key.*/
+    EStdKeySliderUp=0x9b,                 /**< Scan code for Slider up key.*/
+    EStdKeyDictaphonePlay=0x9c,           /**< Scan code for Dictaphone play key.*/
+    EStdKeyDictaphoneStop=0x9d,           /**< Scan code for Dictaphone stop key.*/
+    EStdKeyDictaphoneRecord=0x9e,         /**< Scan code for Dictaphone record key.*/
+    EStdKeyHelp=0x9f,                     /**< Scan code for Help key */
+    EStdKeyOff=0xa0,                      /**< Scan code for Off key.*/
+    EStdKeyDial=0xa1,                     /**< Scan code for Dial key.*/
+    EStdKeyIncVolume=0xa2,                /**< Scan code for Increase volume key.*/
+    EStdKeyDecVolume=0xa3,                /**< Scan code for Decrease volume key.*/
+    EStdKeyDevice0=0xa4,                  /**< Device-specific scan code - usually represents an extra hardware key on the phone.*/
+    EStdKeyDevice1=0xa5,                  /**< Device-specific scan code - usually represents an extra hardware key on the phone.*/
+    EStdKeyDevice2=0xa6,                  /**< Device-specific scan code - usually represents an extra hardware key on the phone.*/
+    EStdKeyDevice3=0xa7,                  /**< Device-specific scan code - usually represents an extra hardware key on the phone.*/
+    EStdKeyDevice4=0xa8,                  /**< Device-specific scan code - usually represents an extra hardware key on the phone.*/
+    EStdKeyDevice5=0xa9,                  /**< Device-specific scan code - usually represents an extra hardware key on the phone.*/
+    EStdKeyDevice6=0xaa,                  /**< Device-specific scan code - usually represents an extra hardware key on the phone.*/
+    EStdKeyDevice7=0xab,                  /**< Device-specific scan code - usually represents an extra hardware key on the phone.*/
+    EStdKeyDevice8=0xac,                  /**< Device-specific scan code - usually represents an extra hardware key on the phone.*/
+    EStdKeyDevice9=0xad,                  /**< Device-specific scan code - usually represents an extra hardware key on the phone.*/
+    EStdKeyDeviceA=0xae,                  /**< Device-specific scan code - usually represents an extra hardware key on the phone.*/
+    EStdKeyDeviceB=0xaf,                  /**< Device-specific scan code - usually represents an extra hardware key on the phone.*/
+    EStdKeyDeviceC=0xb0,                  /**< Device-specific scan code - usually represents an extra hardware key on the phone.*/
+    EStdKeyDeviceD=0xb1,                  /**< Device-specific scan code - usually represents an extra hardware key on the phone.*/
+    EStdKeyDeviceE=0xb2,                  /**< Device-specific scan code - usually represents an extra hardware key on the phone.*/
+    EStdKeyDeviceF=0xb3,                  /**< Device-specific scan code - usually represents an extra hardware key on the phone.*/
+    EStdKeyApplication0=0xb4,             /**< Scan code for device-specific application launcher key.*/
+    EStdKeyApplication1=0xb5,             /**< Scan code for device-specific application launcher key.*/
+    EStdKeyApplication2=0xb6,             /**< Scan code for device-specific application launcher key.*/
+    EStdKeyApplication3=0xb7,             /**< Scan code for device-specific application launcher key.*/
+    EStdKeyApplication4=0xb8,             /**< Scan code for device-specific application launcher key.*/
+    EStdKeyApplication5=0xb9,             /**< Scan code for device-specific application launcher key.*/
+    EStdKeyApplication6=0xba,             /**< Scan code for device-specific application launcher key.*/
+    EStdKeyApplication7=0xbb,             /**< Scan code for device-specific application launcher key.*/
+    EStdKeyApplication8=0xbc,             /**< Scan code for device-specific application launcher key.*/
+    EStdKeyApplication9=0xbd,             /**< Scan code for device-specific application launcher key.*/
+    EStdKeyApplicationA=0xbe,             /**< Scan code for device-specific application launcher key.*/
+    EStdKeyApplicationB=0xbf,             /**< Scan code for device-specific application launcher key.*/
+    EStdKeyApplicationC=0xc0,             /**< Scan code for device-specific application launcher key.*/
+    EStdKeyApplicationD=0xc1,             /**< Scan code for device-specific application launcher key.*/
+    EStdKeyApplicationE=0xc2,             /**< Scan code for device-specific application launcher key.*/
+    EStdKeyApplicationF=0xc3,             /**< Scan code for device-specific application launcher key.*/
+	EStdKeyYes=0xc4,                      /**< Scan code for Yes key.*/
+	EStdKeyNo=0xc5,                       /**< Scan code for No key.*/
+	EStdKeyIncBrightness=0xc6,            /**< Scan code for Increase brightness key.*/
+	EStdKeyDecBrightness=0xc7,            /**< Scan code for Decrease brightness key.*/
+	EStdKeyKeyboardExtend=0xc8,           /**< Scan code for flip actuated when keypad extends to full keyboard.*/
+    EStdKeyDevice10=0xc9,                 /**< Device-specific scan code - usually represents an extra hardware key on the phone.*/
+    EStdKeyDevice11=0xca,                 /**< Device-specific scan code - usually represents an extra hardware key on the phone.*/
+    EStdKeyDevice12=0xcb,                 /**< Device-specific scan code - usually represents an extra hardware key on the phone.*/
+    EStdKeyDevice13=0xcc,                 /**< Device-specific scan code - usually represents an extra hardware key on the phone.*/
+    EStdKeyDevice14=0xcd,                 /**< Device-specific scan code - usually represents an extra hardware key on the phone.*/
+    EStdKeyDevice15=0xce,                 /**< Device-specific scan code - usually represents an extra hardware key on the phone.*/
+    EStdKeyDevice16=0xcf,                 /**< Device-specific scan code - usually represents an extra hardware key on the phone.*/
+    EStdKeyDevice17=0xd0,                 /**< Device-specific scan code - usually represents an extra hardware key on the phone.*/
+    EStdKeyDevice18=0xd1,                 /**< Device-specific scan code - usually represents an extra hardware key on the phone.*/
+    EStdKeyDevice19=0xd2,                 /**< Device-specific scan code - usually represents an extra hardware key on the phone.*/
+    EStdKeyDevice1A=0xd3,                 /**< Device-specific scan code - usually represents an extra hardware key on the phone.*/
+    EStdKeyDevice1B=0xd4,                 /**< Device-specific scan code - usually represents an extra hardware key on the phone.*/
+    EStdKeyDevice1C=0xd5,                 /**< Device-specific scan code - usually represents an extra hardware key on the phone.*/
+    EStdKeyDevice1D=0xd6,                 /**< Device-specific scan code - usually represents an extra hardware key on the phone.*/
+    EStdKeyDevice1E=0xd7,                 /**< Device-specific scan code - usually represents an extra hardware key on the phone.*/
+    EStdKeyDevice1F=0xd8,                 /**< Device-specific scan code - usually represents an extra hardware key on the phone.*/
+    EStdKeyApplication10=0xd9,            /**< Scan code for device-specific application launcher key.*/
+    EStdKeyApplication11=0xda,            /**< Scan code for device-specific application launcher key.*/
+    EStdKeyApplication12=0xdb,            /**< Scan code for device-specific application launcher key.*/
+    EStdKeyApplication13=0xdc,            /**< Scan code for device-specific application launcher key.*/
+    EStdKeyApplication14=0xdd,            /**< Scan code for device-specific application launcher key.*/
+    EStdKeyApplication15=0xde,            /**< Scan code for device-specific application launcher key.*/
+    EStdKeyApplication16=0xdf,            /**< Scan code for device-specific application launcher key.*/
+    EStdKeyApplication17=0xe0,            /**< Scan code for device-specific application launcher key.*/
+    EStdKeyApplication18=0xe1,            /**< Scan code for device-specific application launcher key.*/
+    EStdKeyApplication19=0xe2,            /**< Scan code for device-specific application launcher key.*/
+    EStdKeyApplication1A=0xe3,            /**< Scan code for device-specific application launcher key.*/
+    EStdKeyApplication1B=0xe4,            /**< Scan code for device-specific application launcher key.*/
+    EStdKeyApplication1C=0xe5,            /**< Scan code for device-specific application launcher key.*/
+    EStdKeyApplication1D=0xe6,            /**< Scan code for device-specific application launcher key.*/
+    EStdKeyApplication1E=0xe7,            /**< Scan code for device-specific application launcher key.*/
+    EStdKeyApplication1F=0xe8,            /**< Scan code for device-specific application launcher key.*/
+	EStdKeyDevice20=0xe9,				  /**< Device-specific scan code - usually represents an extra hardware key on the phone.*/
+	EStdKeyDevice21=0xea,				  /**< Device-specific scan code - usually represents an extra hardware key on the phone.*/
+	EStdKeyDevice22=0xeb,				  /**< Device-specific scan code - usually represents an extra hardware key on the phone.*/
+	EStdKeyDevice23=0xec,				  /**< Device-specific scan code - usually represents an extra hardware key on the phone.*/
+	EStdKeyDevice24=0xed,				  /**< Device-specific scan code - usually represents an extra hardware key on the phone.*/
+	EStdKeyDevice25=0xee,				  /**< Device-specific scan code - usually represents an extra hardware key on the phone.*/
+	EStdKeyDevice26=0xef,				  /**< Device-specific scan code - usually represents an extra hardware key on the phone.*/
+	EStdKeyDevice27=0xf0,				  /**< Device-specific scan code - usually represents an extra hardware key on the phone.*/
+	EStdKeyApplication20=0xf1,			  /**< Scan code for device-specific application launcher key.*/
+	EStdKeyApplication21=0xf2,			  /**< Scan code for device-specific application launcher key.*/
+	EStdKeyApplication22=0xf3,			  /**< Scan code for device-specific application launcher key.*/
+	EStdKeyApplication23=0xf4,			  /**< Scan code for device-specific application launcher key.*/
+	EStdKeyApplication24=0xf5,			  /**< Scan code for device-specific application launcher key.*/
+	EStdKeyApplication25=0xf6,			  /**< Scan code for device-specific application launcher key.*/
+	EStdKeyApplication26=0xf7,			  /**< Scan code for device-specific application launcher key.*/
+	EStdKeyApplication27=0xf8			  /**< Scan code for device-specific application launcher key.*/
+	};
+
+
+
+
+/**
+@publishedAll
+@released
+	
+Codes generated by non-ASCII key presses.
+
+A key event's character code is held in TKeyEvent::iCode.
+
+@see TKeyEvent::iCode
+*/
+enum TKeyCode
+	{
+	EKeyNull=0x0000,                     /**< Code for the Null key. */
+	EKeyBell=0x0007,                     /**< Code for the Bell key*/
+	EKeyBackspace=0x0008,                /**< Code for the Backspace key */
+	EKeyTab=0x0009,                      /**< Code for the Tab key*/
+	EKeyLineFeed=0x000a,                 /**< Code for the Linefeed key*/
+	EKeyVerticalTab=0x000b,              /**< Code for the Vertical tab key*/
+	EKeyFormFeed=0x000c,                 /**< Code for the Form feed key*/
+	EKeyEnter=0x000d,                    /**< Code for the Enter key */
+	EKeyEscape=0x001b,                   /**< Code for the Escape key */
+	EKeySpace=0x0020,                    /**< Code for the Space key*/
+	EKeyDelete=0x007f,                   /**< Code for the Delete (Del) key*/
+	EKeyPrintScreen=ENonCharacterKeyBase,/**< Code for the Print screen key */
+	EKeyPause,                           /**< Code for the Pause key*/
+	EKeyHome,                            /**< Code for the Home key*/
+	EKeyEnd,                             /**< Code for the End key*/
+	EKeyPageUp,                          /**< Code for the Page up key*/
+	EKeyPageDown,                        /**< Code for the Page down key*/
+	EKeyInsert,                          /**< Code for the Insert key*/
+	EKeyLeftArrow,                       /**< Code for the Left arrow key*/
+	EKeyRightArrow,                      /**< Code for the Right arrow key*/
+	EKeyUpArrow,                         /**< Code for the Up arrow key*/
+	EKeyDownArrow,                       /**< Code for the Down arrow key*/
+	EKeyLeftShift,                       /**< Code for the left Shift key*/
+	EKeyRightShift,                      /**< Code for the right Shift key*/
+	EKeyLeftAlt,                         /**< Code for the left Alt key*/
+	EKeyRightAlt,                        /**< Code for the right Alt key*/
+	EKeyLeftCtrl,                        /**< Code for the left Control (Ctrl) key*/
+	EKeyRightCtrl,                       /**< Code for the right Control (Ctrl) key.*/
+	EKeyLeftFunc,                        /**< Code for the left Fn key.*/
+	EKeyRightFunc,                       /**< Code for the right Fn key.*/
+	EKeyCapsLock,                        /**< Code for the Caps lock key.*/
+	EKeyNumLock,                         /**< Code for the Num lock key.*/
+	EKeyScrollLock,                      /**< Code for the Scroll lock key.*/
+	EKeyF1,                              /**< Code for the F1 function key.*/
+	EKeyF2,                              /**< Code for the F2 function key.*/
+	EKeyF3,                              /**< Code for the F3 function key.*/
+	EKeyF4,                              /**< Code for the F4 function key.*/
+	EKeyF5,                              /**< Code for the F5 function key.*/
+	EKeyF6,                              /**< Code for the F6 function key.*/
+	EKeyF7,                              /**< Code for the F7 function key.*/
+	EKeyF8,                              /**< Code for the F8 function key.*/
+	EKeyF9,                              /**< Code for the F9 function key.*/
+	EKeyF10,                             /**< Code for the F10 function key.*/
+	EKeyF11,                             /**< Code for the F11 function key.*/
+	EKeyF12,                             /**< Code for the F12 function key.*/
+	EKeyF13,                             /**< Code for the F13 function key.*/
+	EKeyF14,                             /**< Code for the F14 function key.*/
+	EKeyF15,                             /**< Code for the F15 function key.*/
+	EKeyF16,                             /**< Code for the F16 function key.*/
+	EKeyF17,                             /**< Code for the F17 function key.*/
+	EKeyF18,                             /**< Code for the F18 function key.*/
+	EKeyF19,                             /**< Code for the F19 function key.*/
+	EKeyF20,                             /**< Code for the F20 function key.*/
+	EKeyF21,                             /**< Code for the F21 function key.*/
+	EKeyF22,                             /**< Code for the F22 function key.*/
+	EKeyF23,                             /**< Code for the F23 function key.*/
+	EKeyF24,                             /**< Code for the F24 function key.*/
+    EKeyOff,                             /**< Code for the Off key.*/
+    EKeyIncContrast,                     /**< Code for the Increase contrast key.*/
+    EKeyDecContrast,                     /**< Code for the Decrease contrast key.*/
+    EKeyBacklightOn,                     /**< Code for the Backlight on key.*/
+    EKeyBacklightOff,                    /**< Code for the Backlight off key.*/
+    EKeyBacklightToggle,                 /**< Code for the Backlight toggle key.*/
+    EKeySliderDown,                      /**< Code for the Slider down key.*/
+    EKeySliderUp,                        /**< Code for the Slider up key.*/
+    EKeyMenu,                            /**< Code for the Menu key.*/
+    EKeyDictaphonePlay,                  /**< Code for the Dictaphone play key.*/
+    EKeyDictaphoneStop,                  /**< Code for the Dictaphone stop key.*/
+    EKeyDictaphoneRecord,                /**< Code for the Dictaphone record key.*/
+    EKeyHelp,                            /**< Code for the Help key.*/
+    EKeyDial,                            /**< Code for the Dial key.*/
+	EKeyScreenDimension0,                /**< Code for the first Screen dimension change key.*/
+	EKeyScreenDimension1,                /**< Code for the second Screen dimension change key.*/
+	EKeyScreenDimension2,                /**< Code for the third Screen dimension change key.*/
+	EKeyScreenDimension3,                /**< Code for the fourth Screen dimension change key.*/
+	EKeyIncVolume,                       /**< Code for the increase colume key.*/
+	EKeyDecVolume,                       /**< Code for the decrease volume key.*/
+	EKeyDevice0,                         /**< Code for a device specific key.*/
+	EKeyDevice1,                         /**< Code for a device specific key.*/
+	EKeyDevice2,                         /**< Code for a device specific key. */
+	EKeyDevice3,                         /**< Code for a device specific key.*/
+	EKeyDevice4,                         /**< Code for a device specific key.*/
+	EKeyDevice5,                         /**< Code for a device specific key.*/
+	EKeyDevice6,                         /**< Code for a device specific key.*/
+	EKeyDevice7,                         /**< Code for a device specific key.*/
+	EKeyDevice8,                         /**< Code for a device specific key.*/
+	EKeyDevice9,                         /**< Code for a device specific key.*/
+	EKeyDeviceA,                         /**< Code for a device specific key.*/
+	EKeyDeviceB,                         /**< Code for a device specific key.*/
+	EKeyDeviceC,                         /**< Code for a device specific key.*/
+	EKeyDeviceD,                         /**< Code for a device specific key.*/
+	EKeyDeviceE,                         /**< Code for a device specific key.*/
+	EKeyDeviceF,                         /**< Code for a device specific key.*/
+	EKeyApplication0,                    /**< Code for an Application launcher key.*/
+	EKeyApplication1,                    /**< Code for an Application launcher key.*/
+	EKeyApplication2,                    /**< Code for an Application launcher key.*/
+	EKeyApplication3,                    /**< Code for an Application launcher key.*/
+	EKeyApplication4,                    /**< Code for an Application launcher key.*/
+	EKeyApplication5,                    /**< Code for an Application launcher key.*/
+	EKeyApplication6,                    /**< Code for an Application launcher key.*/
+	EKeyApplication7,                    /**< Code for an Application launcher key.*/
+	EKeyApplication8,                    /**< Code for an Application launcher key.*/
+	EKeyApplication9,                    /**< Code for an Application launcher key.*/
+	EKeyApplicationA,                    /**< Code for an Application launcher key.*/
+	EKeyApplicationB,                    /**< Code for an Application launcher key.*/
+	EKeyApplicationC,                    /**< Code for an Application launcher key.*/
+	EKeyApplicationD,                    /**< Code for an Application launcher key.*/
+	EKeyApplicationE,                    /**< Code for an Application launcher key.*/
+	EKeyApplicationF,                    /**< Code for an Application launcher key.*/
+	EKeyYes,                             /**< Code for the Yes key.*/
+	EKeyNo,                              /**< Code for the No key.*/
+	EKeyIncBrightness,                   /**< Code for the increase brightness key.*/
+	EKeyDecBrightness,                   /**< Code for the decrease brightness key. */
+	EKeyKeyboardExtend,                  /**< Code for flip actuated when keypad extends to full keyboard.*/
+	EKeyDevice10,                        /**< Code for a device specific key.*/
+	EKeyDevice11,                        /**< Code for a device specific key.*/
+	EKeyDevice12,                        /**< Code for a device specific key. */
+	EKeyDevice13,                        /**< Code for a device specific key.*/
+	EKeyDevice14,                        /**< Code for a device specific key.*/
+	EKeyDevice15,                        /**< Code for a device specific key.*/
+	EKeyDevice16,                        /**< Code for a device specific key.*/
+	EKeyDevice17,                        /**< Code for a device specific key.*/
+	EKeyDevice18,                        /**< Code for a device specific key.*/
+	EKeyDevice19,                        /**< Code for a device specific key.*/
+	EKeyDevice1A,                        /**< Code for a device specific key.*/
+	EKeyDevice1B,                        /**< Code for a device specific key.*/
+	EKeyDevice1C,                        /**< Code for a device specific key.*/
+	EKeyDevice1D,                        /**< Code for a device specific key.*/
+	EKeyDevice1E,                        /**< Code for a device specific key.*/
+	EKeyDevice1F,                        /**< Code for a device specific key.*/
+	EKeyApplication10,                   /**< Code for an Application launcher key.*/
+	EKeyApplication11,                   /**< Code for an Application launcher key.*/
+	EKeyApplication12,                   /**< Code for an Application launcher key.*/
+	EKeyApplication13,                   /**< Code for an Application launcher key.*/
+	EKeyApplication14,                   /**< Code for an Application launcher key.*/
+	EKeyApplication15,                   /**< Code for an Application launcher key.*/
+	EKeyApplication16,                   /**< Code for an Application launcher key.*/
+	EKeyApplication17,                   /**< Code for an Application launcher key.*/
+	EKeyApplication18,                   /**< Code for an Application launcher key.*/
+	EKeyApplication19,                   /**< Code for an Application launcher key.*/
+	EKeyApplication1A,                   /**< Code for an Application launcher key.*/
+	EKeyApplication1B,                   /**< Code for an Application launcher key.*/
+	EKeyApplication1C,                   /**< Code for an Application launcher key.*/
+	EKeyApplication1D,                   /**< Code for an Application launcher key.*/
+	EKeyApplication1E,                   /**< Code for an Application launcher key.*/
+	EKeyApplication1F,                   /**< Code for an Application launcher key.*/
+	EKeyDevice20,                        /**< Code for a device specific key.*/
+	EKeyDevice21,                        /**< Code for a device specific key.*/
+	EKeyDevice22,                        /**< Code for a device specific key.*/
+	EKeyDevice23,                        /**< Code for a device specific key.*/
+	EKeyDevice24,                        /**< Code for a device specific key.*/
+	EKeyDevice25,                        /**< Code for a device specific key.*/
+	EKeyDevice26,                        /**< Code for a device specific key.*/
+	EKeyDevice27,                        /**< Code for a device specific key.*/
+	EKeyApplication20,                   /**< Code for an Application launcher key.*/
+	EKeyApplication21,                   /**< Code for an Application launcher key.*/
+	EKeyApplication22,                   /**< Code for an Application launcher key.*/
+	EKeyApplication23,                   /**< Code for an Application launcher key.*/
+	EKeyApplication24,                   /**< Code for an Application launcher key.*/
+	EKeyApplication25,                   /**< Code for an Application launcher key.*/
+	EKeyApplication26,                   /**< Code for an Application launcher key.*/
+	EKeyApplication27                    /**< Code for an Application launcher key.*/
+	};
+
+#endif
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32/include/e32kpan.h	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,502 @@
+// Copyright (c) 1994-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32\include\e32kpan.h
+// Kernel-generated panic codes
+// 
+//
+
+#ifndef __E32KPAN_H__
+#define __E32KPAN_H__
+#include <e32def.h>
+
+/**
+@publishedAll
+@released
+
+These panics represent program errors detected by the Kernel.
+Typically, they are caused by passing bad or contradictory parameters
+to functions. Threads that cause exceptions also raise a KERN-EXEC type panic.
+*/
+enum TKernelPanic
+    {
+    
+    /**
+    This panic is raised when the Kernel cannot find an object in
+    the object index for the current process, or current thread, using
+    a specified object index number (the raw handle number).
+    */
+	EBadHandle=0,
+	
+	/**
+	This is a general panic raised as a result of attempting 
+	some unauthorised activity such as trying to suspend a thread,
+	or trying to set the priority of a thread, when not authorised to do so.
+	*/
+	EAccessDenied=1,
+	
+	/**
+	This panic is raised by the kernel when opening a kernel side object,
+	a DObject type, and the fullname is invalid.
+	*/
+	EBadName=2,
+	
+	/**
+	This panic is raised when an unhandled exception occurs.
+	Exceptions have many causes, but the most common are access violations
+	caused, for example, by dreferencing NULL.
+	
+	Among other possible causes are:
+	general protection faults, executing an invalid instruction,
+	alignment checks, etc.
+	*/
+	ECausedException=3,
+	
+	/**
+	Not used.
+	*/
+	ECompletion=4,
+	
+	/**
+	Not used.
+	*/
+	ELeaveWithoutTrap=5,
+	
+	/**
+	This panic is raised by the kernel when a handle to a code segment
+	is invalid.
+	*/
+	EBadCodeSegHandle=6,
+	
+	/**
+	Not used.
+	*/
+	ESegmentWriteOutOfRange=7,
+	
+	/**
+	Not used.
+	*/
+	EChunkSizeTooBig=8,
+	
+	/**
+	This is a general panic raised by the kernel when an attempt
+	is made to issue a request when one is already outstanding, and only one
+    outstanding request is permitted at any one time.
+	*/
+	ERequestAlreadyPending=9,
+	
+	/**
+	This panic is raised by the Request() member function of
+	the DLogicalChannel() kernel object when the request number passed
+	to the function is smaller than the permitted minimum.
+	
+	@see DLogicalChannel::EMinRequestId
+	*/
+	ERequestNoInvalid=10,
+	
+	/**
+	This panic is raised when creating a logical channel, and the unit number
+	is outside the permitted range.
+	
+	If unit numbers are not permmitted, the unit number value
+	must be KNullUnit.
+	If unit numbers are permitted, the unit number value must
+	be less than KMaxUnits.
+	*/
+	EBadUnitNumber=11,
+	
+	/**
+	This panic is raised by the kernel if an event capture
+	hook has already been designated.
+	*/
+	EEventAlreadyCaptured=12,
+	
+	/**
+	This panic is raised by the kernel if the current thread is not
+	the designated event capture hook.
+	*/
+	EEventNotCaptured=13,
+	
+	/**
+	This panic is raised when an attempt is made to set the priority of
+	a thread or process to an illegal value.
+	*/
+	EBadPriority=14,
+	
+	/**
+	This panic is raised when a timer event is requested from an asynchronous
+	timer service, an RTimer, and a timer event is already outstanding.
+	It is caused by calling either the At(), After() or Lock() member functions
+	after a previous call to any of these functions but before the timer event
+	requested by those functions has completed.
+	*/
+	ETimerAlreadyPending=15,
+	
+	/**
+	Not used.
+	*/
+	EAlreadyLoggedOn=16,
+	
+	/**
+	The panic is raised if kernel heap checking has failed.
+	*/
+	EFailedKernelHeapCheck=17,
+	
+	/**
+	Not used.
+	*/
+	ERequestFromWrongThread=18,
+
+    /**
+    This panic is raised by the Kernel when a server program issues a request
+    to receive a message, i.e. when it calls the Receive() member function
+    of RServer, the handle to the Kernel side server object.
+    
+    The panic occurs when a receive message request has previously been made
+    and is still outstanding.
+    */
+	EMesAlreadyPending=19,
+	
+	/**
+	This panic is raised by the Kernel when a request for an event
+	(as originated by a call to UserSvr::RequestEvent()) is made while
+	a previously made request is still outstanding.
+	*/
+	EEventRequestPending=20,
+	
+	/**
+	Not used.
+	*/
+	EIllegalWsProcess=21,
+	
+	/**
+	Not used.
+	*/
+	EHardwareNotAvailable=22,
+	
+	/**
+	This panic is raised when attempting to create a session with a server,
+	and access is been denied.
+	*/
+	EUnsharableSession=23,
+	
+	/**
+	This panic is raised when writing global DLL data, and the length of
+	data to be written is greater than the space available.
+	*/
+	EDesOverflow=24,
+	
+	/**
+	This panic is raised when searching for objects, using the internal
+	function TFindHandleBase::NextObject(), and an invalid object type
+	is specified.
+	*/
+	EBadObjectType=25,
+	
+	/**
+	This panic is raised by kernel side code that implements heap debugging
+	behaviour, when a specific debug request is not recognised.
+	*/
+	EBadKernelHeapDebugFunction=26,
+	
+	/**
+	This panic is raised when an executive call is made with an invalid call
+	number.
+	*/
+	EInvalidSystemCall=27,
+	
+	/**
+	Not used.
+	*/
+	ESetSessionPtrInvalidMessage=28,
+	
+	/**
+	Not used.
+	*/
+	ECompleteDisconnectInvalidMessage=29,
+	
+	/**
+	This panic is raised when an attempt is being made to send 
+	a synchronous message to a server more than once, using
+	the current thread's dedicated synchronous message.
+	*/
+	ESyncMsgSentTwice=30,
+	
+	/**
+	Not used.
+	*/
+	EAutoAttachFailed=31,
+	
+	/**
+	This panic is called by DProcess::Resume() when trying to resume
+	a process that is still being loaded.
+	*/
+	EProcessNotLoaded=32,
+	
+	/**
+    This panic is raised in a call to Kern::KUDesInfo(), Kern::KUDesPut() etc
+    when an invalid descriptor is passed.
+	*/
+	EKUDesInfoInvalidType=33,
+	
+	/**
+	This panic is raised in a call to Kern::KUDesSetLength() & Kern::KUDesPut()
+	when the descriptor passed to it is not a modifiable type.
+	*/
+	EKUDesSetLengthInvalidType=34,
+	
+	/**
+	This panic is raised in a call to Kern::KUDesSetLength() & Kern::KUDesPut()
+	when the length of the source descriptor is longer than the length of
+	the target descriptor.
+	*/
+	EKUDesSetLengthOverflow=35,
+	
+	/**
+	This panic is raised by the kernel side code that implements the setting
+	of the currency symbol when the length of the currency symbol is 
+    greater than KMaxCurrencySymbol. 
+	*/
+	EBadParameter=36,
+	
+	/**
+	This panic is raised by kernel code when it tries to acquire the process
+	DLL lock just before a load, and the wait DLL lock is invalid.
+	*/
+	EWaitDllLockInvalid=37,
+	
+	/**
+	This panic is raised by internal kernel code when an illegal attempt
+	is made to attatch to a library.
+	*/
+	ELibraryAttachInvalid=38,
+	
+	/**
+	This panic is raised when extracting a list of DLL entry points
+	and the number exceeds the maximum permitted.
+	*/
+	ETooManyEntryPoints=39,
+	
+	/**
+	This panic is raised by internal kernel code when an illegal attempt
+	is made to detach a library.
+	*/
+	ELibraryDetachInvalid=40,
+	
+	/**
+	This panic is raised by internal kernel code when an illegal attempt
+	is made to attach to a library.
+	*/
+	ELibraryAttachedInvalid=41,
+
+	/**
+	This panic is raised by internal kernel code when an illegal attempt
+	is made to detach a library.
+	*/
+	ELibraryDetachedInvalid=42,
+
+	/**
+	This panic is raised by kernel code when it tries to release the process DLL lock
+	when a load fails, and the release DLL lock is invalid.
+	*/
+	EReleaseDllLockInvalid=43,
+	
+	/**
+	This panic is raised when a bad message handle is passed to the kernel.
+	This usually occurs when using methods on the RMessagePtr2 or RMessage2 classes
+	after the message has been completed; or when the iHandle data member has become
+	corrupted.
+	*/
+	EBadMessageHandle=44,
+	
+	/**
+	Not used.
+	*/
+	EInvalidMessageParameter=45,
+	
+	/**
+	This panic can be raised as a result of a call to one of a large
+	number of functions. In general, the panic indicates an attempt to perform an
+	operation on a thread or process by code running in another process - violating
+	the security principle of process isolation. 
+		
+	There are exceptions to this general rule, for example, where the
+	panic is raised because the calling process has insufficient capability. The
+	precise reason is stated with the function(s). 
+	
+	-# The panic is raised on a call to the following function if the
+	   process owning the thread performing the call is not the creator of the target
+	   process or, if a handle is specified, the handle is not local.
+	   - RProcess::SetParameter()
+	   .
+	-# The panic is raised on a call to the following functions if the
+	   process owning the thread performing the call is not the same as the target
+	   process.\n
+	   - RProcess::Kill()
+	   - RProcess::Terminate()
+	   - RProcess::Panic()
+	   - RProcess::SetJustInTime()
+	   - RProcess::Resume()
+	   - RThread::Kill()
+	   - RThread::Terminate()
+	   - RThread::Panic()
+	   - RThread::Suspend()
+	   - RThread::Resume()
+	   - RThread::SetPriority()		 
+	   - RThread::RequestComplete()
+	   - RThread::RequestSignal()		 
+	   .  
+	   NOTE: the creator of a new process can kill or panic the new
+	   process, change the new process priority and set the new process startup
+	   parameters until the process is resumed (which the creator can also do). After
+	   the new process has been resumed, then it becomes totally independent of its
+	   creator, and any attempt to panic it, kill it etc will raise the KERN-EXEC 46
+	   panic.
+	-# The panic is raised on call to the following (Symbian partner
+	   only) functions if the calling process does not have the PowerMgmt
+	   capability (TCapability::ECapabilityPowerMgmt): 
+	   - Power::PowerDown()
+	   - Power::EnableWakeupEvents()
+	   - Power::DisableWakeupEvents()
+	   - Power::RequestWakeupEventNotification()
+	   - Power::CancelWakeupEventNotification()
+	   .
+	-# The panic is raised on call to the following functions if the
+	   calling process does not have the WriteDeviceData capability
+       (TCapability::ECapabilityWriteDeviceData): 
+	   - User::SetMachineConfiguration()
+	   - User::SetHomeTime()
+	   - User::SetUTCTime()
+	   - User::SetUTCOffset()
+	   - User::SetUTCTimeAndOffset()
+	   .
+	-# The panic is raised on call to the following function if the
+	   calling process does not have the ReadDeviceData capability
+	   (TCapability::ECapabilityReadDeviceData): 		  
+	   - User::MachineConfiguration()
+	   .
+	*/
+	EPlatformSecurityTrap=46,
+	
+	/**
+	This panic is raised when the user issues a request to be notified of
+	messages or the availability of space, when a request has already been
+	issued and is still outstanding.
+	
+	@see RMsgQueue
+	*/
+	EMsgQueueRequestPending=47,
+	
+	/**
+	This panic is raised when creating a message queue and the size of
+	the template parameter is invalid.
+	
+	@see RMsgQueue
+	*/
+	EMsgQueueInvalidLength=48,
+	
+	/**
+	This panic is raised when creating a message queue and the specified number
+	of slots is not positive.
+	
+	@see RMsgQueue
+	*/
+	EMsgQueueInvalidSlots=49,
+	
+	/**
+	This panic is raised if an attempt is made to cancel an outstanding request 
+	to be notified of messages or the availability of space, and the cancel is
+	being made by a thread in a different process.
+	*/
+	EMsgQueueIllegalCancel=50,
+	
+	/**
+	This panic is raised by RProcess::Setparameter()
+	if a slot value is invalid.
+	*/
+	EParameterSlotRange=51,
+	
+	/**
+	This panic is raised by RProcess::Setparameter()
+	if a slot is in use.
+	*/
+	EParameterSlotInUse=52,
+	
+	/**
+	This panic is raised by RProcess::Setparameter()
+	if the length of the data passed is negative.
+	*/
+	EParameterSlotDataLength=53,
+	
+	/**
+	This panic is raised by RCondVar::Wait() when the current thread does
+	not hold the specified mutex.
+	*/
+	ECondVarWaitMutexNotLocked=54,
+	
+	/**
+	This panic is raised when a call is made to RThread::GetDesMaxLength(),
+	which is obsolete.
+	*/
+	EObsoleteFunctionality=55,
+
+	/**
+	This panic is raised on a process which has not yet been resumed and whoes
+	creator has died.
+	*/
+	EZombieProcessKilled=56,
+
+	/**
+	A connect message was sent to a session that has already been successfully
+	connected to the server (cookie is non-NULL).
+	*/
+	ESessionAlreadyConnected=57,
+
+	/**
+	A session tried to set the kernel session cookie to a null value
+	*/
+	ESessionNullCookie=58,
+
+	/**
+	A session tried to set the kernel session cookie twice
+	*/
+	ESessionCookieAlreadySet=59,
+
+	/**
+	A session tried to set the kernel session cookie with a message
+	that wasn't the connect message
+	*/
+	ESessionInvalidCookieMsg=60,
+
+	/**
+	A realtime thread executed a non-realtime function.
+	*/
+	EIllegalFunctionForRealtimeThread=61,
+
+	/**
+	This panic is raised by Kern::SetThreadRealtimeState when the state argument is invalid.
+	*/
+	EInvalidRealtimeState=62,
+
+	/**
+	An invalid notification type was passed to a shared buffers exec call handler.
+	*/
+	EShBufExecBadNotification=64,
+
+	/**
+	An invalid parameter was passed to a shared buffers exec call handler.
+	*/
+	EShBufExecBadParameter=65,
+	};
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32/include/e32ktran.h	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,110 @@
+// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32\include\e32ktran.h
+// 
+//
+
+/**
+ @file
+ @internalTechnology
+*/
+
+#ifndef __E32KTRAN_H__
+#define __E32KTRAN_H__
+#include <e32std.h>
+#include <e32keys.h>
+#include <e32base.h>
+//
+class TMaskedModifiers
+	{
+public:
+	TUint iMask;
+	TUint iValue;
+	};
+//
+enum TPattern
+	{
+	EAnyKey=0x00,
+	EAnyAlphaNumeric,
+	EAnyAlpha,
+	EAnyAlphaLowerCase,
+	EAnyAlphaUpperCase,
+	EAnyDecimalDigit,
+	EAnyDigitGivenRadix,
+	EAnyModifierKey,
+	EMatchKey=0x40,
+	EMatchKeyCaseInsens,
+	EMatchLeftOrRight
+	};
+//
+class TKeyCodePattern
+	{
+public:
+	TUint16 iKeyCode;
+	TInt8   iPattern;
+	TInt8   iFiller;
+	};
+//
+class TCaptureKey
+	{
+public:
+	TMaskedModifiers iModifiers;
+	TKeyCodePattern  iKeyCodePattern;
+	TUint iApp;
+	TUint iHandle;
+	};
+//
+class TKeyData
+	{
+public:
+	TInt  iModifiers;
+	TInt  iApp;
+	TInt  iHandle;
+	TBool iIsCaptureKey;
+	TUint iKeyCode;
+	};
+//
+class CCaptureKeys: public CBase
+	{
+public:
+	IMPORT_C CCaptureKeys();
+	IMPORT_C ~CCaptureKeys();
+	IMPORT_C void Construct();
+	IMPORT_C void AddCaptureKeyL(const TCaptureKey &aCaptureKey);
+	IMPORT_C void AddCaptureKeyL(const TCaptureKey &aCaptureKey, TUint8 aPriority);
+	IMPORT_C void SetCaptureKey(TUint32 aHandle, const TCaptureKey &aCaptureKey);
+	IMPORT_C void SetCaptureKey(TUint32 aHandle, const TCaptureKey &aCaptureKey, TUint8 aPriority);
+	IMPORT_C void CancelCaptureKey(TUint32 aHandle);
+	IMPORT_C void CancelAllCaptureKeys(TUint32 aApp);
+	IMPORT_C void ProcessCaptureKeys(TKeyData &aKeyData) const;
+protected:
+	void CheckCaptureKey(const TCaptureKey &aCaptureKey);
+	void removeCaptureKey(TUint index);
+protected:
+	RArray<TCaptureKey> iCKarray;
+	};
+//
+class CKeyTranslator: public CBase
+	{
+public:
+	IMPORT_C static CKeyTranslator *New();
+	virtual TInt GetModifierState()=0;
+	virtual void SetModifierState(TEventModifier aModifier,TModifierState aState)=0;
+	virtual TBool TranslateKey(TUint aScanCode,TBool aKeyUp,const CCaptureKeys &aCaptureKeys,TKeyData &aKeyData)=0;
+    virtual void UpdateModifiers(TInt aModifiers)=0;
+    virtual TInt ChangeKeyData(const TDesC& aLibraryName)=0;
+	};
+
+#endif
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32/include/e32lang.h	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,690 @@
+// Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32\include\e32lang.h
+// 
+//
+
+#ifndef __E32LANG_H__
+#define __E32LANG_H__
+
+
+/**
+* 
+* Extended Languages (aka three-digit locales)
+*
+* In order to support language variants for specific network operators, the
+* language can be extended to 16 bits by pairing it with a dialect. Up to 1024 
+* languages and 63 dialects are supported. For example, American Sprint is 
+* ELangAmerican with EDialectSprint = 10 + 1024 = 1034.
+*
+* The locale-specific resource files have a file extension of the form RNNNNN,
+* where NNNNN is five digits. For compatibility reasons, any leading zeros are
+* ignored, so that .R10 and R00010 are considered identical.
+* The locale content for American Sprint is stored in .R1034 (or .R01034)
+*/
+
+/**
+@publishedAll
+@released
+
+Language identity enumeration. 
+
+Each value in the enumeration uniquely identifies a language.
+
+If another value is needed, one of the following actions should be taken: Either
+the Internationalization Technology Architect in Symbian should be contacted or
+a defect should be raised against EUser. Unallocated values should not have
+meanings inferred or extrapolated from already allocated values.
+
+@see BaflUtils::NearestLanguageFile
+@see BaflUtils::GetDowngradePath
+*/
+enum TLanguage
+	{
+	/**
+	Enumerated value used for testing - does not represent a language.
+	*/
+	ELangTest = 0,
+	
+	/** UK English. */
+	ELangEnglish = 1,
+	
+	/** French. */
+	ELangFrench = 2,
+	
+	/** German. */
+	ELangGerman = 3,
+	
+	/** Spanish. */
+	ELangSpanish = 4,
+	
+	/** Italian. */
+	ELangItalian = 5,
+	
+	/** Swedish. */
+	ELangSwedish = 6,
+	
+	/** Danish. */
+	ELangDanish = 7,
+	
+	/** Norwegian. */
+	ELangNorwegian = 8,
+	
+	/** Finnish. */
+	ELangFinnish = 9,
+	
+	/** American. */
+	ELangAmerican = 10,
+	
+	/** Swiss French. */
+	ELangSwissFrench = 11,
+	
+	/** Swiss German. */
+	ELangSwissGerman = 12,
+	
+	/** Portuguese. */
+	ELangPortuguese = 13,
+	
+	/** Turkish. */
+	ELangTurkish = 14,
+	
+	/** Icelandic. */
+	ELangIcelandic = 15,
+	
+	/** Russian. */
+	ELangRussian = 16,
+	
+	/** Hungarian. */
+	ELangHungarian = 17,
+	
+	/** Dutch. */
+	ELangDutch = 18,
+	
+	/** Belgian Flemish. */
+	ELangBelgianFlemish = 19,
+	
+	/** Australian English. */
+	ELangAustralian = 20,
+	
+	/** Belgian French. */
+	ELangBelgianFrench = 21,
+	
+	/** Austrian German. */
+	ELangAustrian = 22,
+	
+	/** New Zealand English. */
+	ELangNewZealand = 23,
+	
+	/** International French. */
+	ELangInternationalFrench = 24,
+	
+	/** Czech. */
+	ELangCzech = 25,
+	
+	/** Slovak. */
+	ELangSlovak = 26,
+	
+	/** Polish. */
+	ELangPolish = 27,
+	
+	/** Slovenian. */
+	ELangSlovenian = 28,
+	
+	/** Taiwanese Chinese. */
+	ELangTaiwanChinese = 29,
+	
+	/** Hong Kong Chinese. */
+	ELangHongKongChinese = 30,
+	
+	/** Peoples Republic of China's Chinese. */
+	ELangPrcChinese = 31,
+
+	/** Japanese. */
+	ELangJapanese = 32,
+
+	/** Thai. */
+	ELangThai = 33,
+
+	/** Afrikaans. */
+	ELangAfrikaans = 34,
+
+	/** Albanian. */
+	ELangAlbanian = 35,
+
+	/** Amharic. */
+	ELangAmharic = 36,
+
+	/** Arabic. */
+	ELangArabic = 37,
+
+	/** Armenian. */
+	ELangArmenian = 38,
+
+	/** Tagalog. */
+	ELangTagalog = 39,
+
+	/** Belarussian. */
+	ELangBelarussian = 40,
+
+	/** Bengali. */
+	ELangBengali = 41,
+
+	/** Bulgarian. */
+	ELangBulgarian = 42,
+
+	/** Burmese. */
+	ELangBurmese = 43,
+
+	/** Catalan. */
+	ELangCatalan = 44,
+
+	/** Croatian. */
+	ELangCroatian = 45,
+
+	/** Canadian English. */
+	ELangCanadianEnglish = 46,
+
+	/** International English. */
+	ELangInternationalEnglish = 47,
+
+	/** South African English. */
+	ELangSouthAfricanEnglish = 48,
+
+	/** Estonian. */
+	ELangEstonian = 49,
+
+	/** Farsi. */
+	ELangFarsi = 50,
+
+	/** Canadian French. */
+	ELangCanadianFrench = 51,
+
+	/** Gaelic. */
+	ELangScotsGaelic = 52,
+
+	/** Georgian. */
+	ELangGeorgian = 53,
+
+	/** Greek. */
+	ELangGreek = 54,
+
+	/** Cyprus Greek. */
+	ELangCyprusGreek = 55,
+
+	/** Gujarati. */
+	ELangGujarati = 56,
+
+	/** Hebrew. */
+	ELangHebrew = 57,
+
+	/** Hindi. */
+	ELangHindi = 58,
+
+	/** Indonesian. */
+	ELangIndonesian = 59,
+
+	/** Irish. */
+	ELangIrish = 60,
+
+	/** Swiss Italian. */
+	ELangSwissItalian = 61,
+
+	/** Kannada. */
+	ELangKannada = 62,
+
+	/** Kazakh. */
+	ELangKazakh = 63,
+
+	/** Khmer. */
+	ELangKhmer = 64,
+
+	/** Korean. */
+	ELangKorean = 65,
+
+	/** Lao. */
+	ELangLao = 66,
+
+	/** Latvian. */
+	ELangLatvian = 67,
+
+	/** Lithuanian. */
+	ELangLithuanian = 68,
+
+	/** Macedonian. */
+	ELangMacedonian = 69,
+
+	/** Malay. */
+	ELangMalay = 70,
+
+	/** Malayalam. */
+	ELangMalayalam = 71,
+
+	/** Marathi. */
+	ELangMarathi = 72,
+
+	/** Moldavian. */
+	ELangMoldavian = 73,
+
+	/** Mongolian. */
+	ELangMongolian = 74,
+
+	/** Norwegian Nynorsk. */
+	ELangNorwegianNynorsk = 75,
+
+	/** Brazilian Portuguese. */
+	ELangBrazilianPortuguese = 76,
+
+	/** Punjabi. */
+	ELangPunjabi = 77,
+
+	/** Romanian. */
+	ELangRomanian = 78,
+
+	/** Serbian. */
+	ELangSerbian = 79,
+
+	/** Sinhalese. */
+	ELangSinhalese = 80,
+
+	/** Somali. */
+	ELangSomali = 81,
+
+	/** International Spanish. */
+	ELangInternationalSpanish = 82,
+
+	/** American Spanish. */
+	ELangLatinAmericanSpanish = 83,
+
+	/** Swahili. */
+	ELangSwahili = 84,
+
+	/** Finland Swedish. */
+	ELangFinlandSwedish = 85,
+
+	/** Reserved, not in use. */
+	ELangReserved1 = 86,		// This enum should not be used for new languages, see INC110543
+
+	/** Tamil. */
+	ELangTamil = 87,
+
+	/** Telugu. */
+	ELangTelugu = 88,
+
+	/** Tibetan. */
+	ELangTibetan = 89,
+
+	/** Tigrinya. */
+	ELangTigrinya = 90,
+
+	/** Cyprus Turkish. */
+	ELangCyprusTurkish = 91,
+
+	/** Turkmen. */
+	ELangTurkmen = 92,
+
+	/** Ukrainian. */
+	ELangUkrainian = 93,
+
+	/** Urdu. */
+	ELangUrdu = 94,
+
+	/** Reserved, not in use. */
+	ELangReserved2 = 95,		// This enum should not be used for new languages, see INC110543
+
+	/** Vietnamese. */
+	ELangVietnamese = 96,
+
+	/** Welsh. */
+	ELangWelsh = 97,
+
+	/** Zulu. */
+	ELangZulu = 98,
+
+	/**
+	@deprecated
+	
+	Use of this value is deprecated.
+	*/
+	ELangOther = 99,
+
+	/** English with terms as used by the device manufacturer, if this needs to
+	be distinct from the English used by the UI vendor. */
+	ELangManufacturerEnglish = 100,
+
+	/** South Sotho.
+	
+	A language of Lesotho also called Sesotho. SIL code sot. */
+	ELangSouthSotho = 101,
+	
+	/** Basque. */
+	ELangBasque = 102,
+	
+	/** Galician. */
+	ELangGalician = 103,
+	
+	/** Javanese. */
+	ELangJavanese = 104,
+	
+	/** Maithili. */
+	ELangMaithili = 105,
+	
+	/** Azerbaijani(Latin alphabet). */
+	ELangAzerbaijani_Latin = 106,
+	
+	/** Azerbaijani(Cyrillic alphabet). */
+	ELangAzerbaijani_Cyrillic = 107,
+	
+	/** Oriya. */
+	ELangOriya = 108,
+	
+	/** Bhojpuri. */
+	ELangBhojpuri = 109,
+	
+	/** Sundanese. */
+	ELangSundanese = 110,
+	
+	/** Kurdish(Latin alphabet). */
+	ELangKurdish_Latin = 111,
+	
+	/** Kurdish(Arabic alphabet). */
+	ELangKurdish_Arabic = 112,
+	
+	/** Pashto. */
+	ELangPashto = 113,
+	
+	/** Hausa. */
+	ELangHausa = 114,
+	
+	/** Oromo. */
+	ELangOromo = 115,
+	
+	/** Uzbek(Latin alphabet). */
+	ELangUzbek_Latin = 116,
+	
+	/** Uzbek(Cyrillic alphabet). */
+	ELangUzbek_Cyrillic = 117,
+	
+	/** Sindhi(Arabic alphabet). */
+	ELangSindhi_Arabic = 118,
+	
+	/** Sindhi(using Devanagari script). */
+	ELangSindhi_Devanagari = 119,
+	
+	/** Yoruba. */
+	ELangYoruba = 120,
+	
+	/** Cebuano. */
+	ELangCebuano = 121,
+	
+	/** Igbo. */
+	ELangIgbo = 122,
+	
+	/** Malagasy. */
+	ELangMalagasy = 123,
+	
+	/** Nepali. */ 
+	ELangNepali = 124,
+	
+	/** Assamese. */
+	ELangAssamese = 125,
+	
+	/** Shona. */
+	ELangShona = 126,
+	
+	/** Zhuang. */
+	ELangZhuang = 127,
+	
+	/** Madurese. */
+	ELangMadurese = 128,
+	
+	/** English as appropriate for use in Asia-Pacific regions. */
+	ELangEnglish_Apac=129,
+
+	/** English as appropriate for use in Taiwan. */
+	ELangEnglish_Taiwan=157,
+
+	/** English as appropriate for use in Hong Kong. */
+	ELangEnglish_HongKong=158,
+
+	/** English as appropriate for use in the Peoples Republic of China. */
+	ELangEnglish_Prc=159,
+
+	/** English as appropriate for use in Japan. */
+	ELangEnglish_Japan=160,
+
+	/** English as appropriate for use in Thailand. */
+	ELangEnglish_Thailand=161,
+	
+	/** Fulfulde, also known as Fula */
+	ELangFulfulde = 162,
+	
+	/** Tamazight. */
+	ELangTamazight = 163,
+
+	/** Bolivian Quechua. */
+	ELangBolivianQuechua = 164,
+	
+	/** Peru Quechua. */
+	ELangPeruQuechua = 165,
+	
+	/** Ecuador Quechua. */
+	ELangEcuadorQuechua = 166,
+	
+	/** Tajik(Cyrillic alphabet). */
+	ELangTajik_Cyrillic = 167,
+	
+	/** Tajik(using Perso-Arabic script). */
+	ELangTajik_PersoArabic = 168,
+	
+	/** Nyanja, also known as Chichewa or Chewa. */
+	ELangNyanja = 169,
+	
+	/** Haitian Creole. */
+	ELangHaitianCreole = 170,
+	
+	/** Lombard. */
+	ELangLombard = 171,
+
+	/** Koongo, also known as Kongo or KiKongo. */
+	ELangKoongo = 172, 
+	
+	/** Akan. */
+	ELangAkan = 173,
+	
+	/** Hmong. */
+	ELangHmong = 174,
+
+	/** Yi. */
+	ELangYi = 175,
+	
+	/** Tshiluba, also known as Luba-Kasai */
+	ELangTshiluba = 176,
+
+	/** Ilocano, also know as Ilokano or Iloko. */
+	ELangIlocano = 177,
+	
+	/** Uyghur. */
+	ELangUyghur = 178,
+	
+	/** Neapolitan. */
+	ELangNeapolitan = 179,
+
+	/** Rwanda, also known as Kinyarwanda */
+	ELangRwanda = 180,
+	
+	/** Xhosa. */
+	ELangXhosa = 181,
+
+	/** Balochi, also known as Baluchi */
+	ELangBalochi = 182,
+	
+	/** Hiligaynon. */
+	ElangHiligaynon = 183,
+	
+	/** Minangkabau. */
+	ELangMinangkabau = 184,
+	
+	/** Makhuwa. */
+	ELangMakhuwa = 185,
+	
+	/** Santali. */
+	ELangSantali = 186,
+
+	/** Gikuyu, sometimes written Kikuyu. */
+	ELangGikuyu = 187,
+	
+	/** Mòoré, also known as Mossi or More. */
+	ELangMoore = 188,
+	
+	/** Guaraní. */
+	ELangGuarani = 189, 
+	
+	/** Rundi, also known as Kirundi. */
+	ELangRundi = 190,
+
+	/** Romani(Latin alphabet). */
+	ELangRomani_Latin = 191,
+	
+	/** Romani(Cyrillic alphabet). */
+	ELangRomani_Cyrillic = 192,
+	
+	/** Tswana. */
+	ELangTswana = 193,
+	
+	/** Kanuri. */
+	ELangKanuri = 194,
+	
+	/** Kashmiri(using Devanagari script). */
+	ELangKashmiri_Devanagari = 195,
+	
+	/** Kashmiri(using Perso-Arabic script). */
+	ELangKashmiri_PersoArabic = 196,
+	
+	/** Umbundu. */
+	ELangUmbundu = 197,
+	
+	/** Konkani. */
+	ELangKonkani = 198,
+	
+	/** Balinese, a language used in Indonesia (Java and Bali). */
+	ELangBalinese = 199,
+	
+	/** Northern Sotho. */
+	ELangNorthernSotho = 200,
+	
+	/** Wolof. */
+	ELangWolof = 201,
+	
+	/** Bemba. */
+	ELangBemba = 202,
+
+	/** Tsonga. */
+	ELangTsonga = 203,
+	
+	/** Yiddish. */
+	ELangYiddish = 204,
+	
+	/** Kirghiz, also known as Kyrgyz. */
+	ELangKirghiz = 205,
+	
+	/** Ganda, also known as Luganda. */
+	ELangGanda = 206,
+
+	/** Soga, also known as Lusoga. */
+	ELangSoga = 207,
+	
+	/** Mbundu, also known as Kimbundu. */
+	ELangMbundu = 208,
+	
+	/** Bambara. */
+	ELangBambara = 209,
+	
+	/** Central Aymara. */
+	ELangCentralAymara = 210,
+
+	/** Zarma. */
+	ELangZarma = 211,
+	
+	/** Lingala. */
+	ELangLingala = 212,
+	
+	/** Bashkir. */
+	ELangBashkir = 213,
+	
+	/** Chuvash. */
+	ELangChuvash = 214,
+
+	/** Swati. */
+	ELangSwati = 215,
+
+	/** Tatar. */
+	ELangTatar = 216,
+	
+	/** Southern Ndebele. */
+	ELangSouthernNdebele = 217,
+	
+	/** Sardinian. */
+	ELangSardinian = 218,
+	
+	/** Scots. */
+	ELangScots = 219,
+
+	/** Meitei, also known as Meithei or Manipuri */
+	ELangMeitei = 220,
+	
+	/** Walloon. */
+	ELangWalloon = 221,
+	
+	/** Kabardian. */
+	ELangKabardian = 222,
+	
+	/** Mazanderani, also know as Mazandarani or Tabri. */
+	ELangMazanderani = 223,
+	
+	/** Gilaki. */
+	ELangGilaki = 224,
+	
+	/** Shan. */
+	ELangShan = 225,
+	
+	/** Luyia. */
+	ELangLuyia = 226,
+	
+	/** Luo, also known as Dholuo, a language of Kenya. */
+	ELanguageLuo = 227,
+	
+	/** Sukuma, also known as Kisukuma. */
+	ELangSukuma = 228,
+	
+	/** Aceh, also known as Achinese. */
+	ELangAceh = 229,
+
+	/** English used in India. */
+    ELangEnglish_India = 230,
+	
+	/** Malay as appropriate for use in Asia-Pacific regions. */
+	ELangMalay_Apac=326,
+
+	/**
+	Indicates the final language in the language downgrade path.
+	
+	@see BaflUtils::NearestLanguageFile
+	@see BaflUtils::GetDowngradePath
+	*/
+	ELangNone = 0xFFFF, // up to 1023 languages * 16 dialects, in 16 bits
+	ELangMaximum = ELangNone // This must always be equal to the last (largest) TLanguage enum.
+	};
+
+
+#endif /* __E32LANG_H__ */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32/include/e32ldr.h	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,410 @@
+// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32\include\e32ldr.h
+// 
+//
+
+/**
+ @file
+ @internalTechnology
+*/
+
+#ifndef __E32LDR_H__
+#define __E32LDR_H__
+#include <e32cmn.h>
+
+const TInt KMaxLibraryEntryPoints=0x100;
+
+//
+// Loader version number.
+//
+const TInt KLoaderMajorVersionNumber=1;
+const TInt KLoaderMinorVersionNumber=0;
+
+//
+// IPC messages to the loader
+//
+enum TLoaderMsg
+	{
+	ELoadProcess=1,
+	ELoadLibrary=2,
+	ELoadLogicalDevice=3,
+	ELoadPhysicalDevice=4,
+	ELoadLocale=5,
+	ELoadFileSystem=6,
+	EGetInfo=7,
+	ELoaderDebugFunction=8,
+	ELoadFSExtension=9,
+	EGetInfoFromHeader=10,
+	ELoadFSPlugin=11,
+	ELoaderCancelLazyDllUnload=12,
+	ELdrDelete=13,
+	ECheckLibraryHash=14, 
+	ELoadFSProxyDrive=15,
+    
+    EMaxLoaderMsg
+	};
+//
+// Loader message arguments:
+//		0 = TLdrInfo
+//		1 = Filename
+//		2 = Command line (process) or path (library)
+//
+class TLdrInfo
+	{
+public:
+	IMPORT_C TLdrInfo();		// for BC
+public:
+	TUidType iRequestedUids;
+	TOwnerType iOwnerType;
+	TInt iHandle;
+	TUint32 iSecureId;
+	TUint32 iRequestedVersion;
+	TInt iMinStackSize;			// Size of new process stack 
+	};
+	
+
+#ifndef __KERNEL_MODE__
+#include <e32std.h>
+//
+// Loader client class
+//
+class RLoader : public RSessionBase
+	{
+public:
+	IMPORT_C TInt Connect();
+	TVersion Version() const;
+	TInt LoadProcess(TInt& aHandle, const TDesC& aFileName, const TDesC& aCommand, const TUidType& aUidType, TOwnerType aType);
+	IMPORT_C TInt LoadLibrary(TInt& aHandle, const TDesC& aFileName, const TDesC& aPath, const TUidType& aType, TUint32 aModuleVersion);
+	IMPORT_C TInt GetInfo(const TDesC& aFileName, TDes8& aInfoBuf);
+	TInt LoadDeviceDriver(const TDesC& aFileName, TInt aDeviceType);
+	IMPORT_C TInt DebugFunction(TInt aFunction, TInt a1, TInt a2, TInt a3);
+	TInt LoadLocale(const TDesC& aLocaleDllName, TLibraryFunction* aExportList);
+	TInt GetInfoFromHeader(const TDesC8& aHeader, TDes8& aInfoBuf);
+	IMPORT_C TInt CancelLazyDllUnload();
+	IMPORT_C TInt Delete(const TDesC& aFileName);
+    IMPORT_C TInt CheckLibraryHash(const TDesC& aFileName, TBool aValidateHash=EFalse);
+	TInt LoadProcess(TInt& aHandle, const TDesC& aFileName, const TDesC& aCommand, const TUidType& aUidType, TInt aMinStackSize, TOwnerType aType);
+public:
+#ifdef __ARMCC__
+	// workaround for possible EDG bug (!!)
+	inline TInt SendReceive(TInt aFunction,const TIpcArgs& aArgs) const
+	  { return RSessionBase::SendReceive(aFunction, aArgs); }
+#else
+	using RSessionBase::SendReceive;
+#endif
+
+#ifdef __TOOLS2__
+public:
+	void Free();
+private:
+	TAny* iHandle;
+#endif
+	};
+#endif
+
+//
+// Information required to create a new code segment
+//
+enum TCodeSegAttributes
+	{
+	ECodeSegAttKernel	=0x00000001,
+	ECodeSegAttGlobal	=0x00000002,
+	ECodeSegAttFixed	=0x00000004,
+	ECodeSegAttABIMask	=0x00000018,	  // same values as in image header
+	ECodeSegAttPaged	=0x00000200,	  // the code seg is demand paged
+	ECodeSegAttHDll		=(TInt)0x80000000,// Emulator host file type: 1=DLL, 0=EXE
+	ECodeSegAttExpVer	=0x40000000,	  // Filename is explicitly versioned
+	ECodeSegAttNmdExpData=0x20000000	  // Named symbol export data in code seg
+	};
+
+class TBlockMapEntryBase
+/**
+	Where sections of a file are located on the media.
+	The kernel uses this to load in parts of a demand paged file.
+ */
+	{
+public:
+	TUint iNumberOfBlocks;  // Number of contiguous blocks in map.
+	TUint iStartBlock;		// Number for first block in the map.
+	};
+
+struct SBlockMapInfoBase
+/**
+	Describes context for TBlockMapEntryBase objects.
+ */
+	{
+	TUint iBlockGranularity;	// Size of a block in bytes.
+	TUint iBlockStartOffset;	// Offset to start of the file or requested file position within a block.
+	TInt64 iStartBlockAddress;	// Address of the first block of the partition.
+	TInt iLocalDriveNumber;		// Local drive number of where the file lies on.
+	};
+
+// forward declarations from file server
+class RFile;
+class RFs;
+
+/**
+A Handle used to identify a file on storage media.
+@internalTechnology
+*/
+class RFileClamp
+	{
+public:
+	inline RFileClamp()
+		{
+		iCookie[0] = 0;
+		iCookie[1] = 0;
+		}
+	IMPORT_C TInt Clamp(RFile& aFile);
+	IMPORT_C TInt Close(RFs& aFs);
+
+public:
+	TInt64 iCookie[2];
+	};
+
+
+class TCodeSegCreateInfo
+	{
+public:
+	TBuf8<KMaxFileName> iFileName;		// not including {MMMMmmmm} version info
+	TUidType iUids;				// uid1 indicates EXE or DLL
+	TUint32 iAttr;
+	TInt iCodeSize;
+	TInt iTextSize;
+	TInt iDataSize;
+	TInt iBssSize;
+	TInt iTotalDataSize;
+	TUint32 iEntryPtVeneer;		// address of first instruction to be called
+	TUint32 iFileEntryPoint;	// address of entry point within this code segment
+	TInt iDepCount;
+	TUint32 iExportDir;
+	TInt iExportDirCount;
+	TUint32 iCodeLoadAddress;	// 0 for RAM loaded code, else pointer to TRomImageHeader
+	TUint32 iCodeRunAddress;
+	TUint32 iDataLoadAddress;
+	TUint32 iDataRunAddress;
+	TUint32 iExceptionDescriptor;
+	TInt iRootNameOffset;
+	TInt iRootNameLength;
+	TInt iExtOffset;
+	TUint32 iModuleVersion;
+	SSecurityInfo iS;
+	TAny* iHandle;				// pointer to kernel-side DCodeSeg object
+	TInt iClientProcessHandle;	// handle to client process for user DLL loads
+	/** Code relocation information stored on loader heap. */
+	TUint32* iCodeRelocTable;
+	/** Size of code relocation table in bytes. */
+	TInt iCodeRelocTableSize;
+	/** Import fixup information stored on loader heap. */
+	TUint32* iImportFixupTable;
+	/** Size of import fixup table in bytes. */
+	TInt iImportFixupTableSize;
+	/** Offset to apply to each code address in the image when it is fixed up. */
+	TUint32 iCodeDelta;
+	/** Offset to apply to each data address in the image when it is fixed up. */
+	TUint32 iDataDelta;
+	/**
+		Whether the code is paged.  If this is set, then
+		TCodeSegCreateInfo::iCodeRelocTable[Size] and
+		TCodeSegCreateInfo::iImportFixupTable[Size] contain fixup information
+		which the kernel uses to fix up each page.
+		(They may be null if the binary has no imports or no code section.)
+	 */
+	TBool iUseCodePaging;
+	/** The UID of the compression scheme in use. */
+	TUint32 iCompressionType;
+	/**
+		Start of compressed pages within the file.  The kernel uses
+		this to load compressed pages from byte-pair files when demand
+		paging.
+	 */
+	TInt32* iCodePageOffsets;
+	/** Where (possibly compressed) object code starts in iFile. */
+	TInt iCodeStartInFile;
+	/** Length of (possibly compressed) object code in iFile. */
+	TInt iCodeLengthInFile;
+	/** Information about block map entries in iCodeBlockMapEntries. */
+	SBlockMapInfoBase iCodeBlockMapCommon;
+	/** Where object code is located on the media. */
+	TBlockMapEntryBase* iCodeBlockMapEntries;
+	/** Size of block map entry array in bytes. */
+	TInt iCodeBlockMapEntriesSize;
+	/**
+		File clamp cookie, used to delete the file when the
+		codeseg is destroyed.
+	 */
+	RFileClamp iFileClamp;
+public:
+	IMPORT_C TPtrC8 RootName() const;
+	};
+
+//
+// Information required to create a new process
+//
+class TProcessCreateInfo : public TCodeSegCreateInfo
+	{
+public:
+	TInt iHeapSizeMin;
+	TInt iHeapSizeMax;
+	TInt iStackSize;
+	TInt iClientHandle;			// handle to loader's client
+	TInt iProcessHandle;		// handle to new DProcess
+	TInt iFinalHandle;			// handle from loader client to new process
+	TOwnerType iOwnerType;
+	TProcessPriority iPriority;
+	TUint iSecurityZone;
+	enum TDebugAttributes	// must be the same as RLibrary::TInfoV2::TDebugAttributes
+		{
+		EDebugAllowed = 1<<0, ///< Flags set if executable may be debugged.
+		ETraceAllowed = 1<<1 ///< Flags set if executable may be traced.
+		};
+	TUint iDebugAttributes;
+	TRequestStatus* iDestructStat;
+
+	};
+
+const TUint KSecurityZoneUnique = 0u;
+const TUint KSecurityZoneLegacyCode = ~0u;
+
+//
+// Information required to attach a code segment to a process
+// in the form of a library.
+//
+class TLibraryCreateInfo
+	{
+public:
+	TAny* iCodeSegHandle;		// pointer to kernel-side DCodeSeg object
+	TInt iClientHandle;			// handle to loader's client
+	TInt iLibraryHandle;		// handle to new DLibrary
+	TOwnerType iOwnerType;
+	};
+
+//
+// Information required to find an existing code segment
+//
+class TFindCodeSeg
+	{
+public:
+	TUidType iUids;				// required UIDs
+	const TAny* iRomImgHdr;		// ROM image header if ROM code required, NULL otherwise
+	TUint32 iAttrMask;			// mask for attributes
+	TUint32 iAttrVal;			// required value for masked attributes
+	TInt iProcess;				// handle to process in which code is required to operate
+								// not used if kernel only specified
+	SSecurityInfo iS;			// required capabilities/SID
+	TUint32 iModuleVersion;		// required version
+	TBuf8<KMaxLibraryName> iName;	// name to look for - zero length means any
+	};
+
+//
+// Information required to by the reaper from the codeseg.
+//
+struct TCodeSegLoaderCookie
+	{
+	RFileClamp iFileClamp;
+	TInt64 iStartAddress;
+	TInt iDriveNumber;
+	};
+
+//
+// Loader magic executive functions
+//
+class E32Loader
+	{
+public:
+	// used by loader only
+	IMPORT_C static TInt CodeSegCreate(TCodeSegCreateInfo& aInfo);
+	IMPORT_C static TInt CodeSegLoaded(TCodeSegCreateInfo& aInfo);
+	IMPORT_C static TInt LibraryCreate(TLibraryCreateInfo& aInfo);
+	IMPORT_C static TInt CodeSegOpen(TAny* aHandle, TInt aClientProcessHandle);
+	IMPORT_C static void CodeSegClose(TAny* aHandle);
+	IMPORT_C static void CodeSegNext(TAny*& aHandle, const TFindCodeSeg& aFind);
+	IMPORT_C static void CodeSegInfo(TAny* aHandle, TCodeSegCreateInfo& aInfo);
+	IMPORT_C static TInt CodeSegAddDependency(TAny* aImporter, TAny* aExporter);
+	IMPORT_C static void CodeSegDeferDeletes();
+	IMPORT_C static void CodeSegEndDeferDeletes();
+	IMPORT_C static TInt ProcessCreate(TProcessCreateInfo& aInfo, const TDesC8* aCommandLine);
+	IMPORT_C static TInt ProcessLoaded(TProcessCreateInfo& aInfo);
+	IMPORT_C static TInt CheckClientState(TInt aClientHandle);
+	IMPORT_C static TInt DeviceLoad(TAny* aHandle, TInt aType);
+	IMPORT_C static TAny* ThreadProcessCodeSeg(TInt aHandle);
+	IMPORT_C static void ReadExportDir(TAny* aHandle, TUint32* aDest);
+	IMPORT_C static TInt LocaleExports(TAny* aHandle, TLibraryFunction* aExportsList);
+
+#ifdef __MARM__
+	IMPORT_C static void GetV7StubAddresses(TLinAddr& aExe, TLinAddr& aDll);
+	static TInt V7ExeEntryStub();
+	static TInt V7DllEntryStub(TInt aReason);
+#endif
+
+	IMPORT_C static TUint32 PagingPolicy();
+	
+	IMPORT_C static TInt NotifyIfCodeSegDestroyed(TRequestStatus& aStatus);
+	IMPORT_C static TInt GetDestroyedCodeSegInfo(TCodeSegLoaderCookie& aCookie);
+
+public:
+	// used by client side
+	static TInt WaitDllLock();
+	static TInt ReleaseDllLock();
+	static TInt LibraryAttach(TInt aHandle, TInt& aNumEps, TLinAddr* aEpList);
+	static TInt LibraryAttached(TInt aHandle);
+	static TInt StaticCallList(TInt& aNumEps, TLinAddr* aEpList);
+	static TInt LibraryDetach(TInt& aNumEps, TLinAddr* aEpList);
+	static TInt LibraryDetached();
+	};
+
+typedef TInt (*TSupervisorFunction)(TAny*);
+
+// Relocation types
+/**
+@internalTechnology
+@released
+*/
+const TUint16 KReservedRelocType        = (TUint16)0x0000;
+/**
+@internalTechnology
+@released
+*/
+const TUint16 KTextRelocType            = (TUint16)0x1000;
+/**
+@internalTechnology
+@released
+*/
+const TUint16 KDataRelocType            = (TUint16)0x2000;
+/**
+@internalTechnology
+@released
+*/
+const TUint16 KInferredRelocType        = (TUint16)0x3000;
+
+// Compression types
+
+/**
+@internalTechnology
+@released
+*/
+const TUint KFormatNotCompressed=0;
+/**
+@internalTechnology
+@released
+*/
+const TUint KUidCompressionDeflate=0x101F7AFC;
+
+
+const TUint KUidCompressionBytePair=0x102822AA;
+
+
+#endif
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32/include/e32lmsg.h	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,67 @@
+// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32\include\e32lmsg.h
+// 
+//
+
+/**
+ @file
+ @internalTechnology
+*/
+
+#ifndef __E32LMSG_H__
+#define __E32LMSG_H__
+#include <e32cmn.h>
+
+const TInt KMaxLocaleMessageText=0x80;
+//
+enum TLocaleMessage
+	{
+	EFileServer_Button1,
+	EFileServer_Button2,
+	EFileServer_PutTheCardBackLine1,
+	EFileServer_PutTheCardBackLine2,
+	EFileServer_LowPowerLine1,
+	EFileServer_LowPowerLine2,
+	EFileServer_DiskErrorLine1,
+	EFileServer_DiskErrorLine2,
+	ESoundDriver_Chimes,
+	ESoundDriver_Rings,
+	ESoundDriver_Signal,
+	EMediaDriver_DiskNameInternal,
+	EMediaDriver_DiskNameExternal1,
+	EMediaDriver_DiskNameExternal2,
+	EMediaDriver_DiskNameExternal3,
+	EMediaDriver_DiskNameExternal4,
+	EMediaDriver_DiskNameExternal5,
+	EMediaDriver_DiskNameExternal6,
+	EMediaDriver_DiskNameExternal7,
+	EMediaDriver_DiskNameExternal8,
+	EMediaDriver_SocketName0,
+	EMediaDriver_SocketName1,
+	EMediaDriver_SocketName2,
+	EMediaDriver_SocketName3,
+	ELocaleMessages_LastMsg
+	};
+
+class TLocaleMessageText : public TBuf<KMaxLocaleMessageText>
+	{
+public:
+	IMPORT_C TLocaleMessageText();
+	IMPORT_C TLocaleMessageText(TLocaleMessage aMessageNo);
+	IMPORT_C void Set(TLocaleMessage aMessageNo);
+	};
+
+#endif
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32/include/e32math.h	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,483 @@
+// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32\include\e32math.h
+// 
+//
+
+#ifndef __E32MATH_H__
+#define __E32MATH_H__
+#include <e32std.h>
+
+
+/**
+@publishedAll
+@released
+*/
+const TInt KMaxPrecision=15;
+/**
+@publishedAll
+@released
+
+This constant specifies the maximum number of significant digits available with floating 
+point computations. Rounding and string formatting methods will not use more digits than this.
+*/
+const TInt KPrecisionLimit=12;
+/**
+@publishedAll
+@released
+*/
+const TInt KMantissaBits=53;
+/**
+@publishedAll
+@released
+*/
+const TInt KMaxExponent=1023;
+/**
+@publishedAll
+@released
+*/
+const TInt KExponentBias=1022;
+/**
+@publishedAll
+@released
+*/
+const TInt KSpecialExponent=2047;
+//
+
+
+/**
+@publishedAll
+@released
+
+The maximum exponent for a 32-bit floating point number.
+*/
+const TInt KTReal32MaxExponent=128;			// changed from 127
+
+
+/**
+@publishedAll
+@released
+
+The minimum exponent for a 32-bit floating point number.
+*/
+const TInt KTReal32MinExponent=-125;
+/**
+@publishedAll
+@released
+*/
+const TInt KTReal32ExponentBias=126;
+/**
+@publishedAll
+@released
+*/
+const TInt KTReal32SpecialExponent=255;		// changed from KTReal32ExponentBad
+
+
+/**
+@publishedAll
+@released
+
+A zero exponent value for a 32-bit floating point number. 
+*/
+const TInt KTReal32ZeroExponent=0;
+//
+
+
+/**
+@publishedAll
+@released
+
+The maximum exponent for a 64-bit floating point number.
+*/
+const TInt KTReal64MaxExponent=1024;		// changed from 1023
+
+
+/**
+@publishedAll
+@released
+
+The minimum exponent for a 64-bit floating point number.
+*/
+const TInt KTReal64MinExponent=-1021;
+
+
+/**
+@publishedAll
+@released
+*/
+const TInt KTReal64ExponentBias=1022;
+
+
+/**
+@publishedAll
+@released
+*/
+const TInt KTReal64SpecialExponent=2047;	// changed from KTReal64BadExponent
+
+
+/**
+@publishedAll
+@released
+
+A zero exponent value for a 64-bit floating point number. 
+*/
+const TInt KTReal64ZeroExponent=0;
+//
+
+
+/**
+@publishedAll
+@released
+
+The minimum value of a 64-bit floating point number.
+*/
+const TReal KMinTReal=2.2250738585072015E-308;	// changed from TReal64
+
+
+/**
+@publishedAll
+@released
+
+The maximum value of a 64-bit floating point number.
+*/
+const TReal KMaxTReal=1.7976931348623157E+308;	//
+//
+
+
+/**
+@publishedAll
+@released
+
+The minimum value of a 32-bit floating point number.
+*/
+const TReal32 KMinTReal32=1.17549435E-38f;
+
+
+/**
+@publishedAll
+@released
+
+The maximum value of a 32-bit floating point number.
+*/
+const TReal32 KMaxTReal32=3.4028234663852885981170418348452e+38f;
+//
+
+
+/**
+@publishedAll
+@released
+
+The minimum value of a 64-bit floating point number.
+*/
+const TReal64 KMinTReal64=2.2250738585072015E-308;
+
+
+/**
+@publishedAll
+@released
+
+The maximum value of a 64-bit floating point number.
+*/
+const TReal64 KMaxTReal64=1.7976931348623157E+308;
+//
+
+
+/**
+@publishedAll
+@released
+*/
+const TReal KSqhf=0.70710678118654752440;
+
+
+/**
+@publishedAll
+@released
+
+Log 2 to the base "e".
+*/
+const TReal KRln2=1.4426950408889634;
+
+
+/**
+@publishedAll
+@released
+
+Log 10 to the base "e".
+*/
+const TReal KRln10=0.4342944819032518;
+
+
+/**
+@publishedAll
+@released
+
+Log 2 to the base 10.
+*/
+const TReal KRlg2=0.3010299956639812;
+
+
+/**
+@publishedAll
+@released
+
+The mathematical constant Pi.
+*/
+const TReal KPi=3.1415926535897932;
+
+
+/**
+@publishedAll
+@released
+
+The reciprocal of the mathematical constant Pi. 
+*/
+const TReal KPiInv=0.3183098861837907;
+
+
+/**
+@publishedAll
+@released
+
+The mathematical constant Pi divided by 2.
+*/
+const TReal KPiBy2=1.5707963267948966;
+
+
+/**
+@publishedAll
+@released
+
+Not used.
+*/
+const TReal KDrpi=0.6366197723675813;
+
+
+/**
+@publishedAll
+@released
+
+The square root of 3.
+*/
+const TReal KSqt3=1.7320508075688773;
+
+
+/**
+@publishedAll
+@released
+*/
+const TReal KMsq3=0.2679491924311227;
+
+
+/**
+@publishedAll
+@released
+
+The multiplying factor to convert radians to degrees.
+*/
+const TReal KRadToDeg=57.29577951308232;
+
+
+/**
+@publishedAll
+@released
+
+The multiplying factor to convert degrees to radians.
+*/
+const TReal KDegToRad=0.017453292519943296;
+
+
+
+
+class TRealX
+/**
+@publishedAll
+@released
+
+A class encapsulating an extended precision real value.
+
+This class provides 64 bit precision and a dynamic range of approximately
+1E-9863 to 1E+9863. All member functions are optimized for speed.
+*/
+	{
+public:
+	enum TRealXOrder {ELessThan=1,EEqual=2,EGreaterThan=4,EUnordered=8};
+public:
+	IMPORT_C TRealX();
+	IMPORT_C TRealX(TInt aInt);
+	IMPORT_C TRealX(TUint aInt);
+	IMPORT_C TRealX(TUint aExp, TUint aMantHi, TUint aMantLo);
+	IMPORT_C TRealX(const TInt64 &aInt);
+	IMPORT_C TRealX(TReal32 aReal) __SOFTFP;
+	IMPORT_C TRealX(TReal64 aReal) __SOFTFP;
+	IMPORT_C TRealX &operator=(TInt aInt);
+	IMPORT_C TRealX &operator=(TUint aInt);
+	IMPORT_C TRealX &operator=(const TInt64& aInt);
+	IMPORT_C TRealX &operator=(TReal32 aReal) __SOFTFP;
+	IMPORT_C TRealX &operator=(TReal64 aReal) __SOFTFP;
+	IMPORT_C TInt Set(TInt aInt);
+	IMPORT_C TInt Set(TUint aInt);
+	IMPORT_C TInt Set(const TInt64& aInt);
+	IMPORT_C TInt Set(TReal32 aReal) __SOFTFP;
+	IMPORT_C TInt Set(TReal64 aReal) __SOFTFP;
+	IMPORT_C operator TInt() const;
+	IMPORT_C operator TUint() const;
+	IMPORT_C operator TInt64() const;
+	IMPORT_C operator TReal32() const __SOFTFP;
+	IMPORT_C operator TReal64() const __SOFTFP;
+	IMPORT_C TInt GetTReal(TReal32 &aVal) const;
+	IMPORT_C TInt GetTReal(TReal64 &aVal) const;
+	IMPORT_C void SetZero(TBool aNegative=EFalse);
+	IMPORT_C void SetNaN();
+	IMPORT_C void SetInfinite(TBool aNegative);
+	IMPORT_C TBool IsZero() const;
+	IMPORT_C TBool IsNaN() const;
+	IMPORT_C TBool IsInfinite() const;
+	IMPORT_C TBool IsFinite() const;
+	IMPORT_C const TRealX &operator+=(const TRealX &aVal);
+	IMPORT_C const TRealX &operator-=(const TRealX &aVal);
+	IMPORT_C const TRealX &operator*=(const TRealX &aVal);
+	IMPORT_C const TRealX &operator/=(const TRealX &aVal);
+	IMPORT_C const TRealX &operator%=(const TRealX &aVal);
+	IMPORT_C TInt AddEq(const TRealX &aVal);
+	IMPORT_C TInt SubEq(const TRealX &aVal);
+	IMPORT_C TInt MultEq(const TRealX &aVal);
+	IMPORT_C TInt DivEq(const TRealX &aVal);
+	IMPORT_C TInt ModEq(const TRealX &aVal);
+	IMPORT_C TRealX operator+() const;
+	IMPORT_C TRealX operator-() const;
+	IMPORT_C TRealX &operator++();
+	IMPORT_C TRealX operator++(TInt);
+	IMPORT_C TRealX &operator--();
+	IMPORT_C TRealX operator--(TInt);
+	IMPORT_C TRealX operator+(const TRealX &aVal) const;
+	IMPORT_C TRealX operator-(const TRealX &aVal) const;
+	IMPORT_C TRealX operator*(const TRealX &aVal) const;
+	IMPORT_C TRealX operator/(const TRealX &aVal) const;
+	IMPORT_C TRealX operator%(const TRealX &aVal) const;
+	IMPORT_C TInt Add(TRealX& aResult,const TRealX &aVal) const;
+	IMPORT_C TInt Sub(TRealX& aResult,const TRealX &aVal) const;
+	IMPORT_C TInt Mult(TRealX& aResult,const TRealX &aVal) const;
+	IMPORT_C TInt Div(TRealX& aResult,const TRealX &aVal) const;
+	IMPORT_C TInt Mod(TRealX& aResult,const TRealX &aVal) const;
+	IMPORT_C TRealXOrder Compare(const TRealX& aVal) const;
+	inline TBool operator==(const TRealX &aVal) const;
+	inline TBool operator!=(const TRealX &aVal) const;
+	inline TBool operator>=(const TRealX &aVal) const;
+	inline TBool operator<=(const TRealX &aVal) const;
+	inline TBool operator>(const TRealX &aVal) const;
+	inline TBool operator<(const TRealX &aVal) const;
+public:
+    /**
+	The mantissa.
+	*/
+	// Represented as two adjacent 32 bit values, rather than one 64 value.
+	// This is to avoid EABI introduced padding overheads and BC breakages. 
+	// This representation works because the mantissa is always accessed from
+	// assembler code as two 32 bit quantities. The C++ code that accesses it
+	// now constructs an automatic TInt64 with the two components.
+	TUint32 iMantLo;
+	TUint32 iMantHi;
+	
+	/**
+	The sign: 0 for +, 1 for -
+	*/
+	TInt8 iSign;	
+	
+	/**
+	Flags: 0 for exact, 1 for rounded down, 2 for rounded up
+	*/ 
+	TUint8 iFlag;
+	
+	/**
+	Exponent: biased by 32767, iExp=0 => zero, +65535 => infinity or NaN
+	*/
+	TUint16 iExp;
+	};
+
+
+
+
+struct SPoly
+/**
+@publishedAll
+@released
+
+A structure containing the set of coefficients for a polynomial.
+
+@see Math::Poly
+*/
+    {
+    TInt num;
+	TReal c[1];
+    };
+
+
+
+
+class Math
+/**
+@publishedAll
+@released
+
+A collection of mathematical functions.
+*/
+	{
+public:
+	IMPORT_C static TInt ACos(TReal &aTrg,const TReal &aSrc);
+	IMPORT_C static TInt ASin(TReal &aTrg,const TReal &aSrc);
+	IMPORT_C static TInt ATan(TReal &aTrg,const TReal &aSrc);
+	IMPORT_C static TInt ATan(TReal &aTrg,const TReal &aSrcY,const TReal &aSrcX);
+	IMPORT_C static TInt Cos(TReal &aTrg,const TReal &aSrc);
+	
+	/**
+	This function is not implemented by Symbian OS.
+	*/
+	IMPORT_C static TInt DtoR(TReal &aTrg,const TDesC &aSrc,TInt &aPos,const TChar aPoint);
+	IMPORT_C static TInt Exp(TReal &aTrg,const TReal &aSrc);
+	IMPORT_C static TInt Frac(TReal &aTrg,const TReal &aSrc);
+	IMPORT_C static TInt Int(TReal &aTrg,const TReal &aSrc);
+	IMPORT_C static TInt Int(TInt16 &aTrg,const TReal &aSrc);
+	IMPORT_C static TInt Int(TInt32 &aTrg,const TReal &aSrc);
+	IMPORT_C static TInt Log(TReal &aTrg,const TReal &aSrc);
+	IMPORT_C static TInt Ln(TReal &aTrg,const TReal &aSrc);
+	IMPORT_C static TInt Mod(TReal &aTrg,const TReal &aSrc,const TReal &aModulus);
+	IMPORT_C static TReal Poly(TReal aVal,const SPoly *aPoly) __SOFTFP;
+	IMPORT_C static TInt Pow(TReal &aTrg,const TReal &aSrc,const TReal &aPower);
+	IMPORT_C static TInt Pow10(TReal &aTrg,const TInt exp);
+	IMPORT_C static TInt Rand(TInt64 &aSeed);
+	IMPORT_C static TReal FRand(TInt64 &aSeed) __SOFTFP;
+	IMPORT_C static TUint32 Random();
+	IMPORT_C static TInt Round(TReal &aTrg,const TReal &aSrc,TInt aDecimalPlaces);
+	IMPORT_C static TInt Sin(TReal &aTrg,const TReal &aSrc); 
+	IMPORT_C static TInt Sqrt(TReal &aTrg,const TReal &aSrc);
+	IMPORT_C static TInt Tan(TReal &aTrg,const TReal &aSrc);
+	IMPORT_C static TBool IsZero(const TReal &aVal);
+	IMPORT_C static TBool IsNaN(const TReal &aVal);
+	IMPORT_C static TBool IsInfinite(const TReal &aVal);
+	IMPORT_C static TBool IsFinite(const TReal &aVal);
+	IMPORT_C static void PolyX(TRealX& aY, const TRealX& aX, TInt aDeg, const TRealX *aCoef);
+	static TInt MultPow10X(TRealX& aTrg, TInt aPower);
+	IMPORT_C static void Mul64(Int64 aX, Int64 aY, Int64& aOutH, Uint64& aOutL);
+	IMPORT_C static void UMul64(Uint64 aX, Uint64 aY, Uint64& aOutH, Uint64& aOutL);
+	IMPORT_C static Int64 DivMod64(Int64 aDividend, Int64 aDivisor, Int64& aRemainder);
+	IMPORT_C static Uint64 UDivMod64(Uint64 aDividend, Uint64 aDivisor, Uint64& aRemainder);
+private:
+	IMPORT_C static void SetZero(TReal &aVal,TInt aSign=0);
+	IMPORT_C static void SetNaN(TReal &aVal);
+	IMPORT_C static void SetInfinite(TReal &aVal,TInt aSign);
+	};
+
+#include <e32math.inl>
+
+#endif // __E32MATH_H__
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32/include/e32math.inl	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,141 @@
+// Copyright (c) 1997-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32\include\e32math.inl
+// 
+//
+
+#if !defined(__E32MATH_INL__)
+#define __E32MATH_INL__
+
+
+
+
+// class TRealX
+
+TBool TRealX::operator==(const TRealX &aVal) const
+/**
+@publishedAll
+@released
+
+Compares this extended precision number for equality with another.
+
+@param aVal A reference to the extended precision value to be compared.
+
+@return True, if this extended precision number is equal to aVal;
+        false, otherwise.
+*/
+	{
+	return(Compare(aVal)&EEqual);
+	}
+
+
+
+
+TBool TRealX::operator!=(const TRealX &aVal) const
+/**
+@publishedAll
+@released
+
+Compares this extended precision number for in-equality with another.
+
+@param aVal A reference to the extended precision value to be compared.
+
+@return True, if this extended precision number is not equal to aVal;
+        false, otherwise.
+*/
+	{
+	return!(Compare(aVal)&EEqual);
+	}
+
+
+
+
+TBool TRealX::operator>=(const TRealX &aVal) const
+/**
+@publishedAll
+@released
+
+Compares this extended precision number for being greater than
+or equal to another.
+
+@param aVal A reference to the extended precision value to be compared.
+
+@return True, if this extended precision number is greater than or equal
+        to aVal, false, otherwise.
+*/
+	{
+	return(Compare(aVal)&(EEqual|EGreaterThan));
+	}
+
+
+
+
+TBool TRealX::operator<=(const TRealX &aVal) const
+/**
+@publishedAll
+@released
+
+Compares this extended precision number for being less than
+or equal to another.
+
+@param aVal A reference to the extended precision value to be compared.
+
+@return True, if this extended precision number is less than or equal
+        to aVal, false, otherwise.
+*/
+	{
+	return(Compare(aVal)&(ELessThan|EEqual));
+	}
+
+
+
+
+TBool TRealX::operator>(const TRealX &aVal) const
+/**
+@publishedAll
+@released
+
+Compares this extended precision number for being greater than
+another.
+
+@param aVal A reference to the extended precision value to be compared.
+
+@return True, if this extended precision number is greater than aVal,
+        false, otherwise.
+*/
+	{
+	return(Compare(aVal)&EGreaterThan);
+	}
+
+
+
+
+TBool TRealX::operator<(const TRealX &aVal) const
+/**
+@publishedAll
+@released
+
+Compares this extended precision number for being less than
+another.
+
+@param aVal A reference to the extended precision value to be compared.
+
+@return True, if this extended precision number is less than aVal,
+        false, otherwise.
+*/
+	{
+	return(Compare(aVal)&ELessThan);
+	}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32/include/e32notif.h	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,43 @@
+// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32\include\e32notif.h
+// 
+//
+
+/**
+ @file
+ @internalTechnology
+*/
+
+#ifndef __E32NOTIF_H__
+#define __E32NOTIF_H__
+#include <e32std.h>
+
+#define __NOTIFIER_NAME _L("!Notifier")
+enum TNotifierMessage 
+	{
+	ENotifierNotify,
+	ENotifierInfoPrint,
+	EStartNotifier,
+	ECancelNotifier,
+	EUpdateNotifier,
+	EStartNotifierAndGetResponse,
+	EStartNotifierFromSpecifiedDll,
+	EStartNotifierFromSpecifiedDllAndGetResponse,
+	ENotifierNotifyCancel,
+	EUpdateNotifierAndGetResponse,
+	};
+
+#endif
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32/include/e32panic.h	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,2994 @@
+// Copyright (c) 1997-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32\include\e32panic.h
+// 
+//
+
+/**
+ @file e32panic.h
+ @publishedAll
+ @released
+*/
+
+#ifndef __E32PANIC_H__
+#define __E32PANIC_H__
+
+
+
+
+/**
+Defines a set of panic numbers associated with the USER panic category.
+
+Some of these numbers are also associated with panics raised on
+the kernel side, and may be associated with 
+a number of category names, including KERN-COMMON, KERN-HEAP etc.
+*/
+enum TCdtPanic
+	{
+	
+	/**
+	A thread has called User::Invariant(). 
+
+    Typically, User::Invariant() is called when a test for a class
+    invariant fails, i.e. when a test which checks that the internal data
+    of an object is self-consistent, fails. 
+
+    Check the design and implementation of your class.
+    
+    @see User
+	*/
+	EInvariantFalse=0,
+		
+	
+	/**
+	Not used.
+	*/
+	ETDateTimeUnderflow=1,
+	
+		
+	
+	/**
+    Not used.
+	*/
+	ETDateTimeBadDate=2,
+	
+	
+	/**
+	A TDateTime object has been constructed with an invalid date or time field.
+
+    @see TDateTime
+	*/
+	ETDateTimeBadDateTime=3,
+	
+	
+    /**
+    Not used.
+	*/
+	ETDateTimeAddDaysRange=4,
+	
+	
+	/**
+    Not used.
+	*/
+	ETDateTimeAddMonthsRange=5,
+
+
+	/**
+    Not used.
+	*/
+	ETDateTimeDaySecNegative=6,
+	
+	
+	/**
+	A panic raised by the Ptr() member function of a 16-bit descriptor
+	if the descriptor is invalid.
+	
+	@see TDesC16::Ptr()
+	*/
+	ETDes16BadDescriptorType=7,
+	
+	
+	/**
+	The length value passed to a 16-bit variant descriptor member
+	function is invalid.
+	
+	This panic may be raised by some descriptor constructors and, specifically,
+	by the Replace() and Set() descriptor member functions.
+	
+	@see TDes16
+	*/
+	ETDes16LengthOutOfRange=8,
+	
+	
+	/**
+	The index value passed to the 16-bit variant descriptor Operator[] is
+	out of bounds.
+	*/
+	ETDes16IndexOutOfRange=9,
+	
+	
+	/**
+	The position value passed to a 16-bit variant descriptor member function
+	is out of bounds.
+
+	The panic can be raised by the Left(), Right(), Mid(), Insert(), Delete()
+	and Replace() member functions of TDes16.
+
+    @see TDes16
+	*/
+	ETDes16PosOutOfRange=10,
+	
+	
+	/**
+	An operation to move or copy data to a 16-bit variant descriptor,
+	will cause the length of that descriptor to exceed its maximum length.
+	
+	This may be caused by any of the copying, appending or formatting member
+	functions but, specifically, by the Insert(), Replace(), Fill(), Fillz(),
+	and ZeroTerminate() descriptor member functions. It can also be caused by
+	the SetLength() function.
+
+    @see TDes16
+	*/
+	ETDes16Overflow=11,
+	
+	
+	/**
+	The format string passed to the 16-bit variant descriptor member functions
+	Format() and AppendFormat() has incorrect syntax.
+	
+    @see TDes16
+	*/
+	ETDes16BadFormatDescriptor=12,
+	
+	
+	/**
+	An invalid variable list has been passed to the AppendFormatList() member
+	function of the 16-bit variant descriptor TDes16, when the format is %S or %s.
+	
+    This panic is raised in debug builds only.
+    
+    @see TDes16
+	*/
+	ETDes16BadFormatParams=13,
+	
+	
+	/**
+	This panic is raised when expanding or contracting an HBufC16 buffer using
+	the ReAlloc() or ReAllocL() descriptor member functions and the new
+	specified length is too small to contain the data.
+	
+	@see HBufC16
+	*/
+	ETDes16ReAllocTooSmall=14,
+	
+	
+	/**
+	Not used.
+	*/
+	ETDes16RemoteBadDescriptorType=15,
+	
+	
+    /**
+	In a call to the Replace() member function of the 16-bit variant
+	descriptor TDes16,the length of the source descriptor is negative
+	or exceeds the maximum length of the target descriptor.
+	
+    @see TDes16
+	*/
+	ETDes16RemoteLengthOutOfRange=16,
+	
+	
+	/**
+	A 16-bit variant descriptor is being constructed with a negative
+	length value.
+	
+	This panic may also be raised if the Set(), Repeat() and the Find() member
+	functions are passed negative length values.
+	*/
+	ETDes16LengthNegative=17,
+	
+	
+	/**
+	A 16-bit variant descriptor is being constructed with a negative maximum 
+	length value.
+	*/
+	ETDes16MaxLengthNegative=18,
+	
+	
+	/**
+	A panic raised by the Ptr() member function of an 8-bit descriptor
+	if the descriptor is invalid.
+	
+	@see TDesC8::Ptr()
+	*/
+	ETDes8BadDescriptorType=19,
+	
+	
+	/**
+	The length value passed to an 8-bit variant descriptor member
+	function is invalid.
+	
+	This panic may be raised by some descriptor constructors and, specifically,
+	by the Replace() and Set() descriptor member functions.
+	
+	@see TDes8
+	*/
+	ETDes8LengthOutOfRange=20,
+	
+	
+	/**
+	The index value passed to the 8-bit variant descriptor Operator[] is
+	out of bounds.
+	*/
+	ETDes8IndexOutOfRange=21,
+	
+	
+	/**
+	The position value passed to an 8-bit variant descriptor member function
+	is out of bounds.
+
+	The panic can be raised by the Left(), Right(), Mid(), Insert(), Delete()
+	and Replace() member functions of TDes8
+
+    @see TDes8
+	*/
+	ETDes8PosOutOfRange=22,
+	
+	
+	/**
+	An operation to move or copy data to an 8-bit variant descriptor,
+	will cause the length of that descriptor to exceed its maximum length.
+	
+	This may be caused by any of the copying, appending or formatting member
+	functions but, specifically, by the Insert(), Replace(), Fill(), Fillz(),
+	and ZeroTerminate() descriptor member functions. It can also be caused by
+	the SetLength() function.
+
+    @see TDes8
+	*/
+    ETDes8Overflow=23,
+   	
+	
+	/**
+	The format string passed to the 8-bit variant descriptor member functions
+	Format() and AppendFormat() has incorrect syntax.
+	
+    @see TDes8
+	*/
+	ETDes8BadFormatDescriptor=24,
+	
+	
+	/**
+	An invalid variable list has been passed to the AppendFormatList() member
+	function of the 8-bit variant descriptor TDes8, when the format is %S or %s.
+	
+    This panic is raised in debug builds only.
+    
+    @see TDes8
+	*/
+	ETDes8BadFormatParams=25,
+		
+	
+	/**
+	This panic is raised when expanding or contracting an HBufC8 buffer using
+	the ReAlloc() or ReAllocL() descriptor member functions and the new
+	specified length is too small to contain the data.
+	
+	@see HBufC8
+	*/
+	ETDes8ReAllocTooSmall=26,
+	
+	
+	/**
+	Not used.
+	*/
+	ETDes8RemoteBadDescriptorType=27,
+	
+	
+	
+    /**
+	In a call to the Replace() member function of the 8-bit variant
+	descriptor TDes8,the length of the source descriptor is negative
+	or exceeds the maximum length of the target descriptor.
+	
+    @see TDes8
+	*/
+	ETDes8RemoteLengthOutOfRange=28,
+	
+	
+	/**
+	An 8-bit variant descriptor is being constructed with a negative
+	length value.
+	
+	This panic may also be raised if the Set(), Repeat() and the Find() member
+	functions are passed negative length values.
+	*/
+	ETDes8LengthNegative=29,
+	
+	
+	/**
+	An 8-bit variant descriptor is being constructed with a negative maximum 
+	length value.
+	*/
+	ETDes8MaxLengthNegative=30,
+	
+	
+	/**
+	Not used.
+	*/
+	ETEntLeaveWithoutEnter=31,
+	
+	
+	/**
+	It is raised by TRawEvent::Pos() when
+	the event is not a mouse/pen type event.
+    
+    This panic is raised in debug builds only.
+    */
+	ETEventNotMoveType=32,
+	
+	
+	/**
+    It is raised by TRawEvent::ScanCode() when
+    the event is not a key down or key up event.
+    
+   	This panic is raised in debug builds only.
+	*/
+	ETEventNotKeyType=33,
+	
+	
+	/**
+    It is raised by TRawEvent::Modifiers() when
+    the event is not a modifier update event.
+	
+   	This panic is raised in debug builds only.
+	*/
+    ETEventNotUpdateModifiersType=34,
+    
+    
+    /**
+    This panic is raised by the default At() virtual member function of TKey.
+    
+    The function is intended to be overridden by a derived class.
+    
+    @see TKey
+    */
+	ETFuncTKeyVirtualAt=35,
+	
+	
+	/**
+	This panic is raised by the default Swap() virtual member function of TSwap.
+	
+	The function is intended to be overridden by a derived class.
+
+	@see TSwap
+	*/
+	ETFuncTSwapVirtualSwap=36,
+	
+	
+	/**
+	The index value passed to the operator[] of a TUidType is negative
+	or is greater than or equal to KMaxCheckedUid.
+	
+	@see KMaxCheckedUid
+	@see TUidType
+	*/
+	ETFuncUidTypeBadIndex=37,
+	
+	
+	/**
+	The length of the descriptor passed to the Set(TDesC8&) member function of TCheckedUid 
+	is not equal to the size of a TCheckedUid object.
+	
+	@see TCheckedUid
+	*/
+	ETFuncCheckedUidBadSet=38,
+	
+	
+	/**
+	The size specified of a new heap is smaller than the permitted minimum;
+	it must be at least the size of a RHeap object.
+	
+	On the user side this is associated with the USER category; on the kernel side
+	this is associated with the KERN-HEAP category.
+	*/
+	ETHeapNewBadSize=39,
+
+	
+	/**
+	Not used.
+	*/
+	ETHeapCreateSizeTooSmall=40,
+	
+	
+	/**
+	In a call to UserHeap::ChunkHeap(), the value defining the minimum length
+	of the heap is greater than the value defining the maximum length to
+	which the heap can grow.
+
+    @see UserHeap
+	*/
+	ETHeapCreateMaxLessThanMin=41,
+	
+	
+	/**
+	In a call to the RHeap member functions, AllocLen(), Free(), FreeZ(),
+	ReAlloc(), ReAllocL(), Adjust() and AdjustL(), a pointer passed to these
+	functions does not point to a valid cell.
+
+	On the user side this is associated with the USER category; on the kernel side
+	this is associated with the KERN-HEAP category.
+	*/
+	ETHeapBadCellAddress=42,
+	
+	
+	/**
+	In a call to the Adjust() and AdjustL() member functions of RHeap, a heap
+	cell is being shrunk and the amount by which the cell is being shrunk
+	is less than the current length of the cell.
+	*/
+	ETHeapAdjustTooSmall=43,
+	
+	
+	/**
+	In a call to the Free() and FreeZ() member functions of RHeap,the cell
+	being freed overlaps the next cell on the free list (i.e. the first cell
+	on the free list with an address higher than the one being freed).
+	*/
+	ETHeapFreeBadNextCell=44,
+	
+	
+	/**
+	In a call to the Free() and FreeZ() member functions of RHeap, the cell
+	being freed overlaps the previous cell on the free list (i.e. the last cell
+	on the free list with an address lower than the one being freed).
+	*/
+	ETHeapFreeBadPrevCell=45,
+	
+	
+	/**
+	In a call to the ReAlloc() and ReAllocL() member functions of RHeap, the
+	cell being reallocated overlaps the next cell on the free list (i.e. the
+	first cell on the free list with an address higher than the one being
+	reallocated).
+	*/
+	ETHeapReAllocBadNextCell=46,
+	
+	
+	/**
+	In a call to the Alloc(), AllocL() or AllocLC() member functions of RHeap,
+	an attempt has been made to allocate a cell from a heap, using an unsigned
+	size value which is greater than or equal to the value of KMaxTInt/2.
+
+    This panic may also be raised by the heap walker when it finds a bad
+    allocated heap cell size.
+    
+    @see User::Check()
+    @see RAllocator::Check()
+    @see KMaxTInt
+	*/
+	ETHeapBadAllocatedCellSize=47,
+	
+	
+	/**
+	This panic is raised by the heap walker when it finds a bad
+	allocated heap cell address.
+	*/
+	ETHeapBadAllocatedCellAddress=48,
+	
+	
+	/**
+	This panic is raised by the heap walker when it finds a bad
+	free heap cell address.
+	*/
+	ETHeapBadFreeCellAddress=49,
+	
+	
+	/**
+	Not used.
+	*/
+	ETHeapDebugBufferOverflow=50,
+	
+	
+	/**
+	A call has been made to the __DbgMarkEnd() member function of RHeap, when
+	there has been no corresponding call to the __DbgMarkStart() member function.
+	
+	This panic is also raised when there are more calls to __DbgMarkEnd() than
+	to __DbgMarkStart(). These functions are part of the debug assistance provided by
+	the RHeap class.
+
+    This panic is raised in debug builds only.
+	*/
+	ETHeapDebugUnmatchedCallToCheckHeap=51,
+	
+	
+	/**
+	In a call to the Adjust() and AdjustL() member functions of an RHeap,
+	the offset from the start of the cell being stretched or shrunk is
+	a negative value.
+	*/
+	ETHeapAdjustOffsetNegative=52,
+	
+	
+	/**
+	Not used.
+	*/
+	ETHeapAllocSizeNegative=53,
+	
+	
+	/**
+	In a call to the ReAlloc() and ReAllocL() member functions of an RHeap,
+	the new size for the cell being reallocated is a negative value.
+	*/
+	ETHeapReAllocSizeNegative=54,
+	
+	
+	/**
+	This panic is caused by the UserHeap::ChunkHeap() static function when
+	the value defining the minimum length of the heap is negative.
+	*/
+	ETHeapMinLengthNegative=55,
+	
+	
+	/**
+	This panic is caused by the UserHeap::ChunkHeap() static function when
+	the value defining the maximum length to which the heap can grow,
+	is negative.
+	*/
+	ETHeapMaxLengthNegative=56,
+	
+	
+	/**
+	This panic is raised when closing a shared heap using the Close() member
+	function of RHeap and the access count is zero or negative.
+	
+	A zero or negative access count suggests that an attempt is being made
+	to close the heap too many times.
+	*/
+	EAllocatorClosedTooManyTimes=57,
+	
+	
+	/**
+	This panic is raised when opening a heap for shared access using the Open()
+	member function of RHeap and the heap type is not EChunkNormal.
+	*/
+	ETHeapOnlyChunkHeaps=58,
+	
+	
+	/**
+	This panic is raised by the UnGet() member function of the 8-bit variant
+	lexical analyzer, TLex8, if the character position is already at
+	the start of the string.
+
+    @see TLex8
+	*/
+	ETLex8UnGetUnderflow=59,
+	
+	
+	/**
+	This panic is raised by the Inc() member function of the 8-bit variant
+	lexical analyzer, TLex8, if the resulting character position lies before
+	the start of the string or after the end of the string.
+
+    @see TLex8
+	*/
+	ETLex8IncOutOfRange=60,
+	
+	
+	/**
+	This panic is raised by the SkipAndMark() member function of the 8-bit
+	variant lexical analyzer, TLex8, if the resulting character position lies
+	before the start of the string, or after the end of the string.
+
+    @see TLex8
+	*/
+	ETLex8SkipOutOfRange=61,
+	
+	
+	/**
+	Not used.
+	*/
+	ETLex8BadFormatList=62,
+	
+	
+	/**
+	This panic is raised by the ValidateMark() member function of the 8-bit
+	variant lexical analyzer, TLex8, if the position of the extraction mark
+	lies before the start of the string or after the end of the string.
+
+    @see TLex8
+	*/
+	ETLex8MarkOutOfRange=63,
+	
+	
+	/**
+	This panic is raised by the UnGet() member function of the 16-bit variant
+	lexical analyzer, TLex16, if the character position is already at the start
+	of the string.
+
+    @see TLex16
+	*/
+	ETLex16UnGetUnderflow=64,
+	
+	
+	/**
+	This panic is raised by the Inc() member function of the 16-bit variant
+	lexical analyzer, TLex16, if the resulting character position lies before
+	the start of the string or after the end of the string.
+
+    @see TLex16
+	*/
+	ETLex16IncOutOfRange=65,
+	
+	
+	/**
+	This panic is raised by the SkipAndMark() member function of the 16-bit
+	variant lexical analyzer, TLex16, if the resulting character position lies
+	before the start of the string or after the end of the string.
+
+    @see TLex16
+	*/
+	ETLex16SkipOutOfRange=66,
+	
+	
+	/**
+	Not used.
+	*/
+	ETLex16BadFormatList=67,
+	
+	
+	/**
+	This panic is raised by the ValidateMark() member function of the 16-bit
+	variant lexical analyzer, TLex16, if the position of the extraction mark
+	lies before the start of the string or after the end of the string.
+
+    @see TLex16
+	*/
+	ETLex16MarkOutOfRange=68,
+	
+	
+	/**
+	This panic is raised by the TDateSuffix constructor or its Set() member
+	function when the suffix index specified is negative or is greater than or
+	equal to the value KMaxSuffixes.
+	
+	The index is used to access a locale dependent table of suffix characters,
+	which can be appended to the dates of the month (e.g. the characters "st" 
+	for 1st, "nd" for 2nd, "st" for 31st).
+	
+	@see TDateSuffix
+	@see KMaxSuffixes
+	*/
+	ETLoclSuffixOutOfRange=69,
+	
+	
+	/**
+	This panic is raised when attempting to complete a client/server request
+	and the RMessagePtr is null.
+	*/
+	ETMesCompletion=70,
+	
+	
+	/**
+	Not used.
+	*/
+	EMesBadRetryCount=71,
+	
+	
+	/**
+	This panic is raised by the Send() and SendReceive() member functions
+	of RSessionBase, the client interface for communication with a server,
+	when the specified operation code identifying the required service is
+	either negative or a value greater than KMaxTint.
+	
+	@see RSessionBase
+	@see KMaxTint
+	*/
+	ETMesBadFunctionNumber=72,
+	
+	
+	/**
+	This panic is raised by the Receive() member function of RServer,
+	the handle to the server, when the attempt to receive a message
+	for the server, synchronously, fails.
+
+    @see RServer
+	*/
+	ETMesReceiveFailed=73,
+	
+	
+	/**
+	Not used.
+	*/
+	ESQueOffsetNegative=74,
+	
+	
+	/**
+	This panic is raised by the constructor of a singly linked list header,
+	a TSglQue or by the SetOffset() member function when the specified offset
+	is not 4 byte aligned, i.e. when it is not divisible by 4.
+
+    @see TSglQue
+	*/
+	ESQueOffsetNotAligned=75,
+	
+	
+	/**
+	This panic is raised when attempting to remove an object from a singly
+	linked list, using the Remove() member function of TSglQue, when
+	that object is not in the list.
+
+    @see TSglQue
+	*/
+	ESQueLinkNotQueued=76,
+	
+	
+	/**
+	Not used.
+	*/
+	ETQueOffsetNegative=77,
+
+	
+	/**
+	This panic is raised by the constructor of a doubly linked list header,
+	a TDblQue or by the SetOffset() member function, when the specified
+	offset is not 4 byte aligned, i.e. when it is not divisible by 4.
+
+    @see TDblQue
+	*/
+	ETQueOffsetNotAligned=78,
+	
+	
+	/**
+	This panic is raised by a call to either the First() or the Last() member
+	functions of a doubly linked list, a TDblQue, which return pointers
+	to the first and last element in the list respectively; the panic
+	occurs when the list is empty.
+
+    This panic is raised in debug builds only.
+
+    @see TDblQue
+	*/
+	ETQueQueueEmpty=79,
+	
+	
+	/**
+    This panic is raised by the post increment operator, operator++, the post
+    decrement operator, operator- and the return current element
+    operator, operator T*, of the doubly linked list iterator, a TDblQueIter;
+    the panic occurs when the element returned by these operators is not in
+    the list.
+    
+    Typically, this is caused by the removal of the element from the list prior
+    to calling these operators.
+	
+    This panic is raised in debug builds only.
+    
+    @see TDblQueIter
+	*/
+	ETQueLinkHasBeenRemoved=80,
+	
+	
+	/**
+	This panic is raised by the get rectangle operator, operator[], of
+	a clipping region, derived from the abstract base class TRegion.
+	
+	The panic occurs when the index, which refers to the specific rectangle
+	within the region, is greater than or equal to the number of rectangles
+	contained within the region (as returned by the Count() member function).
+
+    The index must be strictly less than the number of contained rectangles.
+
+    @see TRegion
+	*/
+	ETRegionOutOfRange=81,
+	
+	
+	/**
+	This panic is raised when sorting the rectangles within a clipping region,
+	derived from the abstract base class TRegion, using the Sort() member
+	function of TRegion.
+	
+	The panic occurs when the region is invalid.
+
+    This panic is raised in debug builds only.
+
+    @see TRegion
+	*/
+	ETRegionInvalidRegionInSort=82,
+	
+	
+	/**
+	This panic occurs when the Kernel sends a message to the Kernel server
+	and this completes with an error, i.e. an error code which is not KErrNone.
+	*/
+	ETUtlKernelServerSend=83,
+	
+	
+	/**
+	This panic is raised by the Panic() member function of RTest, the test class.
+	*/
+	ERTestFailed=84,
+	
+	
+	/**
+	This panic is raised by the CheckConsoleCreated() member functions of
+	RTest and RTestJ, the test classes, when the creation of a console, 
+	as derived from a CConsoleBase, fails.
+	*/
+	ERTestCreateConsole=85,
+	
+	
+	/**
+	This panic is raised by the static function User::After() when
+	the specified time interval is negative.
+	*/
+	EExecAfterTimeNegative=86,
+	
+	
+	/**
+	This panic is raised when the time interval passed to the After() member
+	function of RTimer is negative.
+
+    @see RTimer
+	*/
+	ERTimerAfterTimeNegative=87,
+	
+	
+	/**
+	This panic is raised by Mem::Compare(), Mem::CompareC() and Mem::CompareF()
+	when the length of the area of memory designated as the left hand area,
+	is negative.
+	
+	This panic is raised in debug builds only.
+
+	On the user side this is associated with the USER category; on the kernel side
+	this is associated with the KERN-COMMON category.
+
+	@see Mem
+	*/
+	EMemLeftNegative=88,
+	
+	
+	/**
+	This panic is raised by Mem::Compare(), Mem::CompareC() and Mem::CompareF()
+	when the length of the area of memory designated as the right hand area,
+	is negative.
+	
+	This panic is raised in debug builds only.
+
+	On the user side this is associated with the USER category; on the kernel side
+	this is associated with the KERN-COMMON category.
+
+	@see Mem
+	*/
+	EMemRightNegative=89,
+	
+	
+	/**
+	This panic is raised by Mem::Copy() when the length of the area of memory
+	to be copied is negative.
+
+	This panic is raised in debug builds only.
+
+	On the user side this is associated with the USER category; on the kernel side
+	this is associated with the KERN-COMMON category.
+
+	@see Mem
+	*/
+	EMemCopyLengthNegative=90,
+	
+	
+	/**
+	This panic is raised by Mem::Move() when the length of the area of memory
+	to be moved is not a multiple of 4.
+
+	This panic is raised in debug builds only.
+
+	On the user side this is associated with the USER category; on the kernel side
+	this is associated with the KERN-COMMON category.
+
+	@see Mem
+	*/
+	EWordMoveLengthNotMultipleOf4=91,
+	
+	
+	/**
+	This panic is raised by Mem::Move() when the address of the source for
+	the move operation is not aligned on a 4 byte boundary.
+
+	This panic is raised in debug builds only.
+
+	On the user side this is associated with the USER category; on the kernel side
+	this is associated with the KERN-COMMON category.
+
+	@see Mem
+	*/
+	EWordMoveSourceNotAligned=92,
+	
+	
+	/**
+	This panic is raised by Mem::Move() when the address of the target for
+	the move operation is not aligned on a 4 byte boundary.
+
+	This panic is raised in debug builds only.
+
+	On the user side this is associated with the USER category; on the kernel side
+	this is associated with the KERN-COMMON category.
+
+	@see Mem
+	*/
+	EWordMoveTargetNotAligned=93,
+	
+	
+	/**
+	This panic is raised by Mem::Swap() when the length of the area of
+	memory to be swapped is negative.
+
+	This panic is raised in debug builds only.
+
+	On the user side this is associated with the USER category; on the kernel side
+	this is associated with the KERN-COMMON category.
+
+	@see Mem
+	*/
+	EMemSwapLengthNegative=94,
+	
+	
+	/**
+	This panic is raised by Mem::Fill() and Mem::FillZ() when the length of
+	the area of memory to be filled is negative.
+
+	This panic is raised in debug builds only.
+
+	On the user side this is associated with the USER category; on the kernel side
+	this is associated with the KERN-COMMON category.
+
+	@see Mem
+	*/
+	EMemFillLengthNegative=95,
+	
+	
+	/**
+	The value for the number of records to be sorted passed
+	to User::QuickSort() is negative.
+
+    @see User
+	*/
+	ESortCountNegative=96,
+	
+	
+	/**
+	The value for the number of records taking part in the search passed
+	to User::BinarySearch() is negative.
+	
+	@see User
+	*/
+	EBinarySearchCountNegative=97,
+	
+	
+	/**
+	This panic is raised by the constructor of the base key class, TKey.
+	
+	It occurs when the offset value passed to the constructor is negative.
+	As TKey is an abstract class, i.e. objects of type TKey are not intended
+	to be explicitly constructed, look at the offset value passed to
+	the constructors of derived classes such as TKeyArrayFix, TKeyArrayVar,
+	and TKeyArrayPak for the cause of the panic.
+
+    @see TKey
+    @see TKeyArrayFix
+    @see TKeyArrayVar
+	@see TKeyArrayPak
+	*/
+	EKeyOffsetNegative=98,
+	
+	
+	/**
+	This panic is raised when a local or global chunk is created using
+	the RChunk member functions: CreateLocal(), CreateGlobal(),
+	CreateDoubleEndedLocal() and CreateDoubleEndedGlobal().
+	
+	It occurs when the value for the maximum size to which this chunk can
+	be adjusted, is negative.
+	
+	@see RChunk
+	*/
+	EChkCreateMaxSizeNegative=99,
+	
+	
+	/**
+	This panic is raised when a local or global chunk is created using
+	the RChunk member functions: CreateLocal() and CreateGlobal().
+	
+	It occurs when the value for the number of bytes to be committed to 
+	this chunk on creation, is negative.
+
+	@see RChunk
+	*/
+	EChkCreateSizeNotPositive=100,
+	
+	
+	/**
+	This panic is raised when a local or global chunk is created using
+	the RChunk member functions: CreateLocal() and CreateGlobal().
+	
+	It occurs when the value for the number of bytes to be committed to
+	this chunk on creation is greater than the value for the maximum size
+	to which this chunk can be adjusted.
+
+	@see RChunk
+	*/
+	EChkCreateMaxLessThanMin=101,
+	
+	
+	/**
+	This panic is raised when changing the number of bytes committed to a chunk
+	by calling the Adjust() member function of RChunk.
+	
+	The panic occurs when the value passed to the function is negative.
+	
+	@see RChunk
+	*/
+	EChkAdjustNewSizeNegative=102,
+	
+	
+	/**
+	Not used.
+	*/
+	ESesDelayTimeNegative=103,
+	
+	
+	/**
+	Not used.
+	*/
+	ESesRetryCountNegative=104,
+	
+	
+	/**
+	This panic is raised when a local or global semaphore is created using
+	the RSemaphore member functions: CreateLocal() and CreateGlobal(), and
+	the value for the initial semaphore count is negative.
+	
+	@see RSemaphore
+	*/
+	ESemCreateCountNegative=105,
+	
+	
+	/**
+	This panic is raised when a semaphore is signaled using
+	the Signal(TInt aCount) member function and the count value is negative.
+
+    @see RSemaphore
+	*/
+	ESemSignalCountNegative=106,
+	
+	
+	/**
+	This panic is raised when a critical section is signalled using
+	the Signal() member function and the call to Signal() is not matched
+	by an earlier call to Wait(), which suggests that this is a stray signal.
+
+    @see RCriticalSection
+	*/
+	ECriticalSectionStraySignal=107,
+	
+	
+	/**
+	Not used.
+	*/
+	EThrdHeapNotChunkType=108,
+	
+	
+	/**
+	This panic is raised when creating a thread using the Create() member
+	functions of RThread.
+	
+	The panic occurs when the value of the stack size passed to
+	these functions is negative.
+	
+    @see RThread
+	*/
+	EThrdStackSizeNegative=109,
+	
+	
+	/**
+	This panic is raised when creating a thread using the Create() member
+	functions of RThread.
+	
+	The panic is only raised by those variants of Create() that create a new
+	heap for the new thread. The panic occurs if the minimum heap size
+	specified is less than KMinHeapSize.
+
+    @see RThread
+    @see KMinHeapSize
+	*/
+	EThrdHeapMinTooSmall=110,
+	
+	
+	/**
+	This panic is raised when creating a thread using the Create() member
+	functions of RThread.
+	
+	The panic is only raised by those variants of Create() which create a new
+	heap for the new thread. The panic occurs if the minimum heap size
+	specified is greater than the maximum size to which the heap can grow.
+	
+    @see RThread
+	*/
+	EThrdHeapMaxLessThanMin=111,
+	
+	
+	/**
+	This panic is raised by the Alloc() and AllocL() member functions of class
+	RRef when the size value passed is negative.
+	*/
+	ERefAllocSizeNegative=112,
+	
+	
+	/**
+	This panic is raised by:
+
+    1. the constructor of a time representation object, a TTime, which takes
+       a text string, when the format of that text string is incorrect
+       or represents an invalid date/time.
+       
+    2. the Parse() member function of a time representation object, a TTime,
+       if the century offset value is either negative or is greater than
+       or equal to 100.
+       
+    3. the Time::DaysInMonth() function, if an invalid month value is passed.
+
+    @see TTime
+    @see Time
+	*/
+	ETTimeValueOutOfRange=113,
+	
+	
+	/**
+    This panic is raised by member functions of TBusLocalDrive when no
+    connection has been made to a local drive.
+    
+	This panic is raised in debug builds only.
+	
+	@see TBusLocalDrive
+	*/
+	EDriveNotConnected=114,
+	
+	
+	/**
+	This panic is raised when attempting to connect to a local drive
+	using the Connect() member function of TBusLocalDrive, and
+	the specified drive number is out of range, i.e. the drive number
+	is negative or is greater than or equal to KMaxLocalDrives.
+	
+	@see TBusLocalDrive
+	@see KMaxLocalDrives
+	*/
+	EDriveOutOfRange=115,
+	
+	
+	/**
+	This panic is raised by the Lookup() member function of RLibrary when
+	the ordinal number of the required DLL function, is zero or negative.
+    
+    @see RLibrary
+	*/
+	EBadLookupOrdinal=116,
+	
+	
+	/**
+	Not used.
+	*/
+	EChunkHeapBadOffset=117,
+	
+	
+	/**
+	Not used.
+	*/
+	ETQueLinkAlreadyInUse=118,
+	
+	
+	/**
+	This panic is raised when setting a new currency symbol using
+	the User::SetCurrencySymbol() function.
+	
+	The panic occurs when the length of the descriptor containing
+	the new symbol is greater than KMaxCurrencySymbol.
+ 	
+ 	@see User
+ 	@see KMaxCurrencySymbol
+	*/
+	ECurrencySymbolOverflow=119,
+	
+	
+	/**
+	This panic is raised by the CreateDoubleEndedLocal()
+	and CreateDoubleEndedGlobal() member functions of RChunk when the lower
+	address of the committed region is negative.
+	
+	@see RChunk
+	*/
+	EChkCreateBottomNegative=120,
+	
+	
+	/**
+	This panic is raised by the CreateDoubleEndedLocal()
+	and CreateDoubleEndedGlobal() member functions of RChunk when the upper
+	address of the committed region is negative.
+	
+	@see RChunk
+	*/
+	EChkCreateTopNegative=121,
+	
+	
+	/**
+	This panic is raised by the CreateDoubleEndedLocal()
+	and CreateDoubleEndedGlobal() member functions of RChunk when the upper
+	address of the committed region is lower than the lower address of
+	the committed region.
+
+	@see RChunk
+	*/
+	EChkCreateTopLessThanBottom=122,
+	
+	
+	/**
+	This panic is raised by the CreateDoubleEndedLocal()
+	and CreateDoubleEndedGlobal() member functions of RChunk when the upper
+	address of the committed region is lower than the maximum size to which
+	this chunk can be adjusted.
+
+	@see RChunk
+	*/
+	EChkCreateTopBiggerThanMax=123,
+	
+	
+	/**
+	This panic is raised by RChunk::AdjustDoubleEnded() when the lower address
+	of the committed region is negative.
+	
+    @see RChunk
+	*/
+	EChkAdjustBottomNegative=124,
+	
+	
+	/**
+	This panic is raised by RChunk::AdjustDoubleEnded() when the upper address
+	of the committed region is negative.
+	
+    @see RChunk
+	*/
+	EChkAdjustTopNegative=125,
+	
+	
+	/**
+	This panic is raised by RChunk::AdjustDoubleEnded() when the upper address
+	of the committed region is lower than the lower address of the committed
+	region.
+	
+    @see RChunk
+	*/
+	EChkAdjustTopLessThanBottom=126,
+	
+	
+	/**
+	This panic is raised when constructing an array of pointers,
+	an RPointerArray, and specifying a granularity value which is
+	one of the following:
+
+    1. zero
+
+    2. negative
+
+    3. greater than 0x10000000.
+    
+    @see RPointerArray
+	*/
+	EBadArrayGranularity=127,
+	
+	
+	/**
+	This panic is raised when constructing an array of fixed length objects,
+	an RArray, and specifying a key offset value which is one of the following:
+
+    1. negative
+
+    2. not a multiple of 4
+
+    3. greater than or equal to the size of the array elements.
+    
+    @see RArray
+	*/
+	EBadArrayKeyOffset=128,
+	
+	
+	/**
+	This panic is raised when constructing an array of fixed length objects,
+	an RArray, and the length of the array elements is one of the following:
+
+    1. zero
+
+    2. negative
+
+    3. greater than 640.
+    
+    @see RArray
+	*/
+	EBadArrayEntrySize=129,
+	
+	
+	/**
+	This panic is raised when an index value passed to a member function
+	of RArray or RPointerArray identifying an array element, is out of bounds.
+
+    @see RArray
+    @see RPointerArray
+	*/
+	EBadArrayIndex=130,
+	
+	
+	/**
+	This panic is raised when the value identifying the insertion position
+	in a call to RArray::Insert() or RPointerArray::Insert(), is either
+	negative or greater than the number of elements in the array.
+
+    @see RArray
+    @see RPointerArray
+	*/
+	EBadArrayPosition=131,
+	
+	
+	/**
+	This panic is raised when an index value passed to
+	Mem::CollationMethodByIndex() or Mem::CollationMethodId() is out of bounds.
+
+    @see Mem
+	*/
+	EBadCollationRulesIndex=132,
+	
+	
+	/**
+	This panic is raised when an index value passed to TFixedArray::At()
+    or TFixedArray::operator[] is out of bounds.
+
+    @see TFixedArray
+	*/
+	EBadFixedArrayIndex=133,
+	
+	
+	/**
+	Not used.
+	*/
+	ERawEventFlipTypeNotImplemented=134,
+	
+	
+	/**
+	Not used.
+	*/
+	ENumberOfParametersExceedsMaximum=136,
+	
+	
+	/**
+	This panic is raised internally by the descriptor formatting functions during the handling
+	of the variable parameter lists when the parameter is too big.
+	*/
+	ESizeOfParameterTooBig=137,
+	
+	
+	/**
+	This panic is raised internally by the descriptor formatting functions
+	during the handling of the variable parameter lists when an index value
+	for the parameters is outside its permitted range.
+	*/
+	EParameterIndexOutOfRange1=138,
+	
+	
+	/**
+	This panic is raised internally by the descriptor formatting functions
+	during the handling of the variable parameter lists when an index value
+	for the parameters is outside its permitted range.
+	
+	This panic is raised in debug mode only.
+	*/
+	EParameterIndexOutOfRange2=139,
+	
+	
+	/**
+	This panic is raised internally by the descriptor formatting functions
+	during the handling of the variable parameter lists.
+	*/
+	EFormatDirectiveAlreadySet1=140,
+	
+	
+	/**
+	This panic is raised internally by the descriptor formatting functions
+	during the handling of the variable parameter lists.
+	*/
+	EFormatDirectiveAlreadySet2=141,
+	
+	
+	/**
+	This panic is raised internally by the descriptor formatting functions
+	during the handling of the variable parameter lists.
+	*/
+	ENumberOfFormatDirectivesExceedsMaximum=142,
+	
+	
+	/**
+	This panic is raised internally by the descriptor formatting functions
+	during the handling of the variable parameter lists.
+	*/
+	ENoParametersInFormatDirective=143,
+	
+	
+	/**
+	This panic is raised internally by the descriptor formatting functions
+	during the handling of the variable parameter lists.
+	*/
+	EFormatDirectiveNotYetSet=144,
+	
+	
+	/**
+	This panic is raised internally by the descriptor formatting functions
+	during the handling of the variable parameter lists.
+	*/
+	EBadFormatDirectiveDataPointer=145,
+	
+	
+	/**
+	This panic is raised internally by the descriptor formatting functions
+	during the handling of the variable parameter lists.
+	*/
+	EFormatDirectiveIndexOutOfRange=146,
+	
+	
+	/**
+	This panic is raised internally by the descriptor formatting functions
+	during the handling of the variable parameter lists.
+	*/
+	ENotOnFirstPassOfFormatDescriptor1=147,
+	
+	
+	/**
+	This panic is raised internally by the descriptor formatting functions
+	during the handling of the variable parameter lists.
+	*/
+	ENotOnFirstPassOfFormatDescriptor2=148,
+	
+	
+	/**
+	This panic is raised internally by the descriptor formatting functions
+	during the handling of the variable parameter lists.
+	*/
+	EInconsistentSizeOfParameter=149,
+	
+	
+	/**
+	This panic is raised internally by the descriptor formatting functions
+	during the handling of the variable parameter lists.
+	*/
+	ENullTargetPointer=150,
+	
+	
+	/**
+	This panic is raised internally by the descriptor formatting functions
+	during the handling of the variable parameter lists.
+	*/
+	ENegativeSizeOfParameter=151,
+	
+	
+	/**
+	This panic is raised internally by the descriptor formatting functions
+	during the handling of the variable parameter lists.
+	*/
+	EErrorOnSecondPassOfFormatDescriptor=152,
+	
+	
+	/**
+	This panic is raised internally by the descriptor formatting functions
+	during the handling of the variable parameter lists.
+	*/
+	EUnexpectedError1=153,
+	
+	
+	/**
+	This panic is raised internally by the descriptor formatting functions
+	during the handling of the variable parameter lists.
+	*/
+	EUnexpectedError2=154,
+	
+	
+	/**
+	Not used.
+	*/
+	ECreateTransferBufferSizeNotPositive=155,
+	
+	
+	/**
+	This panic occurs in the construction of an RPointerArray object from
+	an existing pointer array object, when the number defining the number
+	of entries in the existing array is not positive.
+	
+	@see RPointerArray
+	*/
+	EBadArrayCount=156,
+	
+	
+	/**
+	This panic is raised by RChunk::Commit() when the value of the offset of
+	the committed region is negative.
+	
+	@see RChunk
+	*/
+	EChkCommitOffsetNegative=157,
+	
+	
+	/**
+	This panic is raised by RChunk::Commit() when the size of the
+	the committed region is negative.
+	
+	@see RChunk
+	*/
+	EChkCommitSizeNegative=158,
+	
+	
+	/**
+	This panic is raised by RChunk::Allocate() when the size of the
+	the committed region is negative.
+	
+	@see RChunk
+	*/
+	EChkAllocateSizeNegative=159,
+	
+	
+	/**
+	This panic is raised by RChunk::Decommit() when the value of the offset of
+	the committed region is negative.
+	
+	@see RChunk
+	*/
+	EChkDecommitOffsetNegative=160,
+	
+	
+	/**
+	This panic is raised by RChunk::Decommit() when the size of the
+	the committed region is negative.
+	
+	@see RChunk
+	*/
+	EChkDecommitSizeNegative=161,
+	
+	
+	/**
+	This panic is raised when an invalid chunk type has been passed to
+	the internal member RChunk::Create()
+	
+	@see RChunk
+	*/
+	EChkCreateInvalidType=162,
+	
+	
+	/**
+	This panic is raised when a global chunk is being created and
+	no name has been specified.
+	
+	@see RChunk
+	*/
+	EChkCreateInvalidName=163,
+	
+	
+	/**
+	This panic is raised when creating a 'normal' chunk and the offset of the bottom of the new committed region 
+    from the base of the chunk's reserved region is not zero.
+
+    @see RChunk
+	*/
+	EChkCreateInvalidBottom=164,
+	
+	
+	/**
+	This panic is raised by the internal function RLibrary::Init() when the function that 
+	constructs static data following a DLL load, leaves.
+	*/
+	EDllStaticConstructorLeave=165,
+	
+	
+	/**
+	This panic is raised internally, if a call to the static data destructors
+	following a library handle close, leaves.
+	*/
+	EDllStaticDestructorLeave=166,
+	
+	
+	/**
+	This panic is raised in a call to RAllocator::Close() when the number of
+	handles is greater than	the maximum allowed, RAllocator::EMaxHandles.
+	
+	@see RAllocator
+	*/
+	EAllocatorBadHandleCount=167,
+	
+	
+	/**
+	This panic is raised by the internal RHeap constructor when the offset value is invalid.
+	*/
+	ETHeapNewBadOffset=168,
+	
+	
+	/**
+	This panic is raised by the Symbian internal function RHeap::Reduce() on failure.
+	*/
+	ETHeapReduceFailed=169,
+	
+	
+	/**
+	This panic is raised by the Symbian internal function RHeap::Reset() on failure.
+	*/
+	ETHeapResetFailed=170,
+	
+	
+	/**
+    This panic is raised by the Symbian internal function RHeap::WalkCheckCell() on a 
+    bad free cell size.
+	*/
+	ETHeapBadFreeCellSize=171,
+	
+	
+	/**
+    This panic is raised by the Symbian internal function RHeap::Initialise() on a
+    bad alignment value.
+	*/
+	ETHeapNewBadAlignment=172,
+	
+	
+	/**
+	Not used.
+	*/
+	ETHeapBadDebugOp=173,
+	
+	
+	/**
+	This panic is raised when an unimplemented pure virtual function is called.
+	*/
+	EPureVirtualCalled=174,
+	
+	
+	/**
+	This panic is raised when a User::Leave() is called and there
+	is no TRAP frame.
+	*/
+	EUserLeaveWithoutTrap=175,
+	
+	
+	/**
+	This panic is raised when a mathematical function fails with an
+	unrecognized exception, i.e. one that is none of: KErrArgument,
+	KErrDivideByZero, KErrOverflow or KErrUnderflow.
+	*/
+	EMathUnknownError=176,
+	
+	
+	/**
+	This panic is raised by the Symbian internal function RHeap::WalkCheckCell() on a 
+    bad cell type.
+	*/
+	ETHeapWalkBadCellType=177,
+	
+	
+	/**
+	This panic is raised when descriptors convert integers into text, and
+	an invalid radix is passed, i.e. a value that is not one 
+	of the TRadix enum values.
+	*/
+	EInvalidRadix=178,
+	
+	
+	/**
+	This panic is raised when converting and appending numbers in descriptors,
+	and buffers are not aligned on even addresses.
+	
+    This panic is raised in debug builds only.	
+	*/
+	EDes16PadAppendBadAlign=179,
+	
+	
+	/**
+	Not used.
+	*/
+	EMsgQueueSizeInvalid=180,
+	
+	
+    /**
+	@internalComponent
+	*/
+	EHuffmanTooManyCodes=181,
+	
+	
+	/**
+	@internalComponent
+	*/
+	EHuffmanInvalidCoding=182,
+	
+	
+	/**
+	@internalComponent
+	*/
+	EBadArrayFindMode=183,
+	
+	
+	/**
+	In a call to RNotifier::Notify(), the length of one or more of
+	the descriptors containing the displayable text is bigger than
+	the maximum TUint16 value.
+	*/
+	ENotifierTextTooLong=184,
+	
+	
+	/**
+	In a call to one of the functions:
+	TMonthName::Set()
+	TMonthNameAbb::Set()
+	TDayName::Set()
+	TDayNameAbb::Set()
+	
+	the month or day value is outside the permitted range of values.
+
+    @see TMonthName
+    @see TMonthNameAbb
+    @see TDayName
+    @see TDayNameAbb
+	*/
+	EBadLocaleParameter=185,
+	
+	
+	/**
+	This panic is raised internally by the descriptor formatting functions
+	during the handling of the variable parameter lists.
+	*/
+	EUnexpectedError3=186,
+	
+	
+	/**
+	In a call to TDes8::Expand(), either the length, or the maximum length,
+	or the pointer to the data is not an even number.
+	
+	@see TDes8
+	*/
+	EDes8ExpandOdd=187,
+	
+	
+	/**
+	In a call to TDes8::Collapse(), either the length, or the maximum length,
+	or the pointer to the data is not an even number.
+	
+	@see TDes8
+	*/
+	EDes8CollapseOdd=188,
+
+
+	/**
+	In a call to one of the TSecurityPolicy constructors, the specified
+	capability was found to be inavlid.
+
+	@see TCapability
+	*/
+	ECapabilityInvalid=189,
+
+
+	/**
+	In a call to TSecurityPolicy::CheckPolicy, the security policy was found to
+	be corrupt.
+
+	@see TSecurityPolicy
+	*/
+	ESecurityPolicyCorrupt=190,
+
+	
+	/**
+	In a call to TSecurityPolicy::TSecurityPolicy(TSecPolicyType aType), aType
+	was not one of ETypePass or ETypeFail.
+
+	@see TSecurityPolicy
+	*/
+	ETSecPolicyTypeInvalid=191,
+
+	/**
+	This panic is raised when constructing an RPointerArray or RArray if the
+	specified minimum growth step is less than or equal to zero or is greater
+	than 65535.
+    
+    @see RPointerArray
+    @see RArray
+	*/
+	EBadArrayMinGrowBy=192,
+	
+	
+	/**
+	This panic is raised when constructing an RPointerArray or RArray if the
+	specified exponential growth factor is less than or equal to 1 or is
+	greater than or equal to 128.
+    
+    @see RPointerArray
+    @see RArray
+	*/
+	EBadArrayFactor=193,
+	
+	
+	/**
+	This panic is raised if code inside an __ASSERT_*_NO_LEAVE harness leaves.
+    
+    @see RPointerArray
+    @see RArray
+	*/
+	EUnexpectedLeave=194,
+	
+	
+	/**
+	A function was used to grow a cell on the heap, but it did not grow as expected.
+	*/		
+	ETHeapCellDidntGrow=195,
+	
+	
+	/**
+	An attempt was made to install a Win32 SE handler not on the stack.
+
+	@see TWin32SEHTrap
+	*/
+	EWin32SEHandlerNotOnStack=196,
+	
+	/**
+	This panic is raised when the caller of an API doesn't have the right capabilities to
+	call the specific API that raises this panic. Please consult the documentation for the
+	API in question to learn what capabilities you need to call it.
+	*/
+	EPlatformSecurityViolation=197,
+
+	/**
+	This panic is raised if a NULL function pointer is passed in as the hash function
+	when constructing a hash table class.
+	*/
+	EHashTableNoHashFunc=198,
+
+	/**
+	This panic is raised if a NULL function pointer is passed in as the identity
+	relation when constructing a hash table class.
+	*/
+	EHashTableNoIdentityRelation=199,
+
+	/**
+	This panic is raised if a negative element size is specified when constructing
+	a hash table class.
+	*/
+	EHashTableBadElementSize=200,
+
+	/**
+	This panic is raised if, when constructing a hash table class, the specified
+	key offset is inconsistent with the specified element size.
+	*/
+	EHashTableBadKeyOffset=201,
+
+	/**
+	This panic is raised in debug builds only if a deleted entry still remains after
+	a hash table reform. It should never occur, since it signifies an error in the
+	hash table implementation.
+	*/
+	EHashTableDeletedEntryAfterReform=202,
+
+	/**
+	This panic should never occur since it signifies an error in the hash table
+	implementation.
+	*/
+	EHashTableBadGeneration=203,
+
+	/**
+	This panic should never occur since it signifies an error in the hash table
+	implementation.
+	*/
+	EHashTableBadHash=204,
+
+	/**
+	This panic should never occur since it signifies an error in the hash table
+	implementation.
+	*/
+	EHashTableEntryLost=205,
+
+	/**
+	This panic should never occur since it signifies an error in the hash table
+	implementation.
+	*/
+	EHashTableCountWrong=206,
+
+	/**
+	This panic should never occur since it signifies an error in the hash table
+	implementation.
+	*/
+	EHashTableEmptyCountWrong=207,
+
+	/**
+	This panic is raised if, while attempting to step a hash table iterator to
+	the next entry, the iterator is found to point to an invalid table entry.
+	This will typically occur if elements have been removed from the hash table
+	without resetting the iterator.
+	*/
+	EHashTableIterNextBadIndex=208,
+
+	/**
+	This panic is raised if, while interrogating the current position of a
+	hash table iterator, the iterator is found to point to an invalid table entry.
+	This will typically occur if elements have been added to or removed from
+	the hash table without resetting the iterator.
+	*/
+	EHashTableIterCurrentBadIndex=209,
+
+	/**
+	This panic is raised if an invalid argument is passed to the Reserve() function
+	on any of the hash table classes.
+	*/
+	EHashTableBadReserveCount=210,
+
+	/**
+	The Win32 SE handler chain has been corrupted.
+
+	@see TWin32SEHTrap
+	*/
+	EWin32SEHChainCorrupt=211,
+
+	
+	/**
+	This panic is raised if an invalid argument is passed to the Reserve() function
+	on the RArray<T> or RPointerArray<T> classes.
+	*/
+	EArrayBadReserveCount=212,
+
+	/**
+	This panic is raised when attempting to set a new debug failure mode on 
+	a heap with an invalid argument.  For example, if aBurst > KMaxTUint6
+	when invoking __UHEAP_BURSTFAILNEXT when a RHeap object is used for
+	the user heap.
+
+	On the user side this is associated with the USER category; on the kernel side
+	this is associated with the KERN-HEAP category.
+
+	@see RAllocator::TAllocFail
+	*/
+	ETHeapBadDebugFailParameter = 213,
+	
+	
+	/**
+	This panic is raised when an invalid chunk attribute has been passed to
+	the method RChunk::Create().
+	
+	@see RChunk
+	*/
+	EChkCreateInvalidAttribute = 214,
+
+	
+	/**
+	This panic is raised when a TChunkCreateInfo object with an invalid version 
+	number has been passed to the method RChunk::Create().
+
+	@see RChunk
+	@see TChunkCreateInfo
+	*/
+	EChkCreateInvalidVersion = 215,
+	};
+
+
+
+
+/**
+Defines a set of panic numbers associated with the E32USER-CBASE panic category.
+
+Panics with this category are raised in user side code by member functions of
+CBase derived classes that reside in euser.dll. Typically, they are caused by
+passing bad or contradictory values to class constructors or member functions.
+*/
+enum TBasePanic
+    {
+    
+    /**
+    This panic is raised by the Set() member function of CAsyncCallBack,
+    if this active object is already active when the function is called.
+    
+    @see CAsyncCallBack
+    */
+	ECAsyncCBIsActive=1,
+	
+	
+	/**
+	This panic is raised by the Call() member function of CAsyncOneShot,
+	if the active object has not already been added to the active scheduler.
+	
+	This panic is raised in debug builds only.
+	
+	@see CAsyncOneShot
+	*/
+	ECAsyncOneShotNotAdded=2,
+	
+	
+	/**
+	This panic is raised during construction of a dynamic buffer,
+	a CBufFlat or a CBufSeg object, when the value of the granularity passed
+	to the constructors is negative.
+	
+	@see CBufFlat
+	@see CBufSeg
+	*/
+	EBufExpandSizeNegative=3,
+	
+	
+	/**
+	This panic is raised when reading from a dynamic buffer,
+	a CBufFlat or a CBufSeg, using the Read() member function.
+	
+	It is caused by attempting to read beyond the end of the buffer.
+
+	@see CBufFlat
+	@see CBufSeg
+	*/
+	EBufReadBeyondEnd=4,
+	
+	
+	/**
+	This panic is raised when writing to a dynamic buffer,
+	a CBufFlat or a CBufSeg, using the Write() member function.
+	
+	It is caused by attempting to write beyond the end of the buffer.
+
+	@see CBufFlat
+	@see CBufSeg
+	*/
+	EBufWriteBeyondEnd=5,
+	
+	
+	/** 
+	This panic is raised when reading from a dynamic buffer,
+	a CBufFlat or a CBufSeg, using the Read() member function.
+	
+	It is caused by specifying a negative length for the amount of data
+	to be read.
+
+	@see CBufFlat
+	@see CBufSeg
+	*/
+	EBufReadLengthNegative=6,
+	
+	
+	/**
+	This panic is raised when writing to a dynamic buffer,
+	a CBufFlat or a CBufSeg, using the Write() member function.
+	
+	It is caused by specifying a negative length for the amount of data
+	to be written.
+
+	@see CBufFlat
+	@see CBufSeg
+	*/
+	EBufWriteLengthNegative=7,
+
+
+    /**
+    This panic is raised when inserting data into a dynamic buffer,
+    a CBufFlat or a CBufSeg, using the InsertL() member function or when
+    inserting an uninitialized region into the dynamic buffer using
+    the ExpandL() member function.
+    
+    It is caused by passing a negative length value to these functions.
+
+	@see CBufFlat
+	@see CBufSeg
+    */
+	EBufInsertLengthNegative=8,
+	
+	
+	/**
+	This panic is raised when inserting data into a dynamic buffer,
+	a CBufFlat or a CBufSeg, using the InsertL() member function.
+	
+	It is caused when the variant of InsertL(), which takes a pointer to TAny
+	is passed a NULL pointer value.
+
+	@see CBufFlat
+	@see CBufSeg
+	*/
+	EBufInsertBadPtr=9,
+	
+	
+	/**
+	This panic is raised when specifying the minimum amount of space
+	that a flat dynamic buffer, a CBufFlat, should occupy using
+	the SetReserveL() member function.
+	
+	It is caused when the size value passed to the function is negative.
+
+	@see CBufFlat
+	*/
+	EBufFlatReserveNegative=10,
+
+
+	/**
+	This panic is raised when specifying the minimum amount of space
+	that a flat dynamic buffer, a CBufFlat, should occupy using
+	the SetReserveL() member function.
+	
+	It is caused when the size value passed to the function is less than
+	the current size of the buffer.
+
+	@see CBufFlat
+	*/
+	EBufFlatReserveSetTooSmall=11,
+	
+	
+	/**
+	This panic is raised by the Delete(), Ptr(), BackPtr() member functions
+	of a flat dynamic buffer, a CBufFlat; the panic can also be raised by
+	InsertL() and ExpandL().
+	
+	It is caused when the position value passed to these functions is either
+	negative or represents a position beyond the end of the current buffer.
+	
+	@see CBufFlat
+	*/
+	EBufFlatPosOutOfRange=12,
+	
+	
+	/**
+	This panic is raised by the Delete() member function of
+	a flat dynamic buffer, a CBufFlat.
+	
+	It is caused when the combination of position and length values passed
+	to the function implies an attempt to delete data beyond the end of
+	the flat buffer.
+
+   	@see CBufFlat
+	*/
+	EBufFlatDeleteBeyondEnd=13,
+	
+	
+	/**
+	This panic is raised by the Delete(), Ptr(), BackPtr() member functions
+	of a segmented dynamic buffer, a CBufSeg); the panic can also be raised
+	by InsertL() and ExpandL().
+	
+	It is caused when the position value passed to these functions is either
+	negative or represents a position beyond the end of the current buffer.
+
+   	@see CBufSeg
+	*/
+	EBufSegPosOutOfRange=14,
+	
+	
+	/**
+	This panic is raised by the Delete() member function of a segmented dynamic
+	buffer, a CBufSeg.
+	
+	It is caused when the combination of position and length values passed to
+	the function implies an attempt to delete data beyond the end of
+	the segmented buffer.
+
+   	@see CBufSeg
+	*/
+	EBufSegDeleteBeyondEnd=15,
+	
+	
+	/**
+	This panic is raised by the InsertL(), Delete(), Ptr() and BackPtr() member
+	functions as implemented for segmented buffers, CBufSeg, when
+	the offset within a segment, where data is to be inserted or removed,
+	is greater than the buffer granularity.
+
+    This panic is raised in debug builds only.
+    
+  	@see CBufSeg
+	*/
+	EBufSegSetSBO=16,
+	
+	
+	/**
+	This panic is raised by the constructors of arrays of fixed length objects
+	as represented, for example, by the classes CArrayFixFlat, CArrayFixSeg,
+	and CArrayFixFlat<TAny>.
+	
+	It is caused when the record length is either negative or zero. The record
+	length is either explicitly specified, as in the case of
+	the CArrayFixFlat<TAny> class, or is implied by the length of the template
+	class as in the case of the CArrayFixFlat class.
+	
+	@see CArrayFixFlat
+	@see CArrayFixSeg
+	*/
+	EArrayFixInvalidLength=17,
+	
+	
+	/**
+	This panic is raised by the constructors of arrays of fixed length objects
+	as represented, for example, by the classes: CArrayFixFlat and CArrayFixSeg.
+	
+	It is caused when the granularity passed to the constructors is
+	either negative or zero.
+
+	@see CArrayFixFlat
+	@see CArrayFixSeg
+	*/
+	EArrayFixInvalidGranularity=18,
+	
+	
+	/**
+	This panic is raised by the constructors of arrays of variable length
+	objects as represented, for example, by the classes: CArrayVarFlat
+	and CArrayVarSeg.
+	
+	It is caused when the granularity passed to the constructors is either
+	negative or zero.
+
+	@see CArrayFixFlat
+	@see CArrayFixSeg
+	*/
+	EArrayVarInvalidGranularity=19,
+	
+	
+	/**
+	This panic is raised by the constructors of packed arrays as represented,
+	for example, by the class CArrayPakFlat.
+	
+	It is caused when the granularity passed to the constructors is either
+	negative or zero.
+
+	@see CArrayPakFlat
+	*/
+	EArrayPakInvalidGranularity=20,
+	
+	
+	/**
+	This panic is raised by any operation which accesses an element of an array
+	by explicit reference to an index number, for example, the Delete(),
+	InsertL() and At() member functions or the operator Operator[].
+	
+	It is caused by specifying an index value which is either negative,
+	or is greater than or equal to the number of objects currently within the array.
+	*/
+	EArrayIndexOutOfRange=21,
+	
+	
+	/**
+	This panic is raised when deleting contiguous elements from an array of
+	fixed length objects (derived from CArrayFixBase) using the Delete()
+	member function.
+	
+	It is caused by specifying the number of contiguous elements as
+	a zero or negative value.
+	*/
+	EArrayCountNegative=22,
+	
+	
+	/**
+	This panic is raised when inserting contiguous elements into an array
+	of fixed length objects (derived from CArrayFixBase) using the
+	InsertL() member function.
+	
+	It is caused by specifying the number of contiguous elements as
+	a zero or negative value.
+	*/
+	EArrayCountNegative2=23,
+	
+	
+	/**
+	This panic is raised when resizing an array of fixed length objects
+	(derived from CArrayFixBase) using the ResizeL() member function.
+	
+	It is caused by specifying the number of contiguous elements as a zero
+	or negative value.
+	*/
+	EArrayCountNegative3=24,
+	
+	
+	/**
+	This panic is raised when deleting contiguous elements from an array of
+	variable length objects (derived from CArrayVarBase) using the Delete()
+	member function.
+	
+	It is caused by specifying the number of contiguous elements as a zero
+	or negative value.
+	*/
+	EArrayCountNegative4=25,
+	
+	
+	/**
+	This panic is raised when deleting contiguous elements from
+	a packed array (derived from CArrayPakBase) using the Delete()
+	member function.
+	
+	It is caused by specifying the number of contiguous elements as
+	a zero or negative value.
+	*/
+	EArrayCountNegative5=26,
+	
+	
+	/**
+	This panic is raised when reserving space in flat arrays of
+	fixed length objects, the CArrayFixFlat,CArrayFixFlat<TAny>
+	and CArrayPtrFlat classes, using the SetReserveL() member function.
+	
+	It is caused by specifying the number of elements, for which space is to be
+	reserved, as less than the current number of elements in the array.
+	*/
+    EArrayReserveTooSmall=27,
+    
+    
+	/**
+	This panic is raised when inserting or appending replicated 
+	elements to the arrays of fixed length objects CArrayFixFlat and
+	CArrayFixSeg using the InsertL() or AppendL() functions.
+	
+	It is caused by specifying the number of replicas as negative or zero.
+    */
+	EArrayReplicasNegative=28,
+	
+	
+	/**
+	This panic is raised when deleting elements from a fixed length, variable
+	length or packed array (derived from CArrayFixBase, CArrayVarBase
+	and CArrayPakBase) using the Delete() function.
+	
+	It is caused when the specification of the position of the first element
+	to be deleted and the number of contiguous elements to be deleted refers
+	to elements which are outside the bounds of the array.
+	*/
+	EArrayCountTooBig=29,
+	
+	
+	/**
+	This panic is raised when inserting into, appending onto, expanding or
+	extending a variable length array or a packed array (i.e. arrays derived
+	from CArrayVar or CArrayPak) using the InsertL(), AppendL(), ExpandL()
+	or ExtendL() functions respectively.
+	
+	It is caused by specifying the length of the element as a negative value.
+	*/
+	EArrayLengthNegative=30,
+
+
+	/**
+	Not used.
+	*/
+	EArrayReaderCountVirtual=31,
+	
+	
+	/**
+	Not used.
+	*/
+	EArrayReaderAtVirtual=32,
+	
+	
+	/**
+	This panic is raised by the destructor of a CObject.
+	
+	It is caused when an attempt is made to delete the CObject
+	when the reference count is not zero.
+
+    @see CObject
+	*/
+	EObjObjectStillReferenced=33,
+
+
+	/**
+	This panic is raised by the Close() member function of a CObject.
+	
+	It is caused when the reference count is negative.
+	*/
+	EObjNegativeAccessCount=34,
+
+
+	/**
+	This panic is raised by the Remove() member function of an object
+	container, a CObjectCon.
+	
+	It is caused when the CObject to be removed from the container is
+	not contained by the container.
+	
+    @see CObject
+	*/
+	EObjRemoveObjectNotFound=35,
+	
+	
+	/**
+	This panic is raised by the Remove() member function of a container
+	index, a CObjectConIx.
+	
+	It is caused when the object container, a CObjectCon, to be removed from
+	the index is not contained by the index.
+	*/
+	EObjRemoveContainerNotFound=36,
+	
+	
+	/**
+	This panic is raised by the Remove() member function of an object index,
+	a CObjectIx.
+	
+	It is caused when the handle passed to the Remove() function does not
+	represent a CObject known to the object index.
+	*/
+	EObjRemoveBadHandle=37,
+	
+	
+	/**
+	This panic is raised by the At(), FindByName() and FindByFullName() member
+	functions of an object container, a CObjectCon.
+	
+	It is caused when the unique ID as derived from the handle is not the same 
+	as the unique ID held by the object container.
+	*/
+	EObjFindBadHandle=38,
+	
+	
+	/**
+	This panic is raised by the At() member function of an object container,
+	a CObjectCon.
+	
+	It is caused when the index represented by the handle is outside
+	the permitted range. In effect, the handle is bad.
+	*/
+	EObjFindIndexOutOfRange=39,
+
+
+	/**
+	This panic is raised by the destructor of an active object, a CActive.
+	
+	It is caused by an attempt to delete the active object while it still
+	has a request outstanding.
+	*/
+	EReqStillActiveOnDestruct=40,
+
+
+	/**
+	This panic is raised by the Add() member function of an active scheduler,
+	a CActiveScheduler.
+	
+	It is caused by an attempt to add an active object to the active scheduler
+	when it has already been added to the active scheduler
+	*/
+	EReqAlreadyAdded=41,
+	
+	
+	/**
+	This panic is raised by the SetActive() member function of an active
+	object, a CActive.
+	
+	It is caused by an attempt to flag the active object
+	as active when it is already active, i.e. a request is still outstanding.
+	*/
+	EReqAlreadyActive=42,
+	
+	
+	/**
+	This panic is raised by the Install() member function of an active
+	scheduler, a CActiveScheduler.
+	
+	It is caused by attempting to install this active scheduler as the current
+	active scheduler when there is already a current active scheduler;
+	i.e. an active scheduler has already been installed.
+	*/
+	EReqManagerAlreadyExists=43,
+
+
+	/**
+	This panic is raised by the Start(), Stop() and Add() member functions
+	of an active scheduler, a CActiveScheduler.
+	
+	It is caused by attempting to start or stop an active scheduler or by
+	attempting to add an active object, a CActive, to the active scheduler.
+	*/
+	EReqManagerDoesNotExist=44,
+
+
+	/**
+	This panic is raised by the Stop() member function of an active scheduler,
+	a CActiveScheduler.
+
+	Calling Stop() terminates the wait loop started by the most recent
+	call to Start(). The panic is caused by a call to Stop() which is not
+	matched by a corresponding call to Start().
+	*/
+	EReqTooManyStops=45,
+
+
+	/**
+	This panic is raised by an active scheduler, a CActiveScheduler.
+	
+	It is caused by a stray signal.
+	*/
+	EReqStrayEvent=46,
+	
+	
+	/**
+	This panic is raised by the Error() virtual member function of an active
+	scheduler, a CActiveScheduler.
+	
+	This function is called when an active object’s RunL() function leaves.
+	Applications always replace the Error() function in a class derived from
+	CActiveScheduler; the default behaviour provided by CActiveScheduler raises
+	this panic.
+	*/
+	EReqActiveObjectLeave=47,
+	
+	
+	/**
+	This panic is raised by the Add() member function of an active scheduler,
+	a CActiveScheduler, when a NULL pointer is passed to the function.
+	*/
+	EReqNull=48,
+
+
+	/**
+	This panic is raised by the SetActive() and Deque() member functions of
+	an active object, a CActive.
+	
+	It is raised if the active object has not been added to the active scheduler.
+	*/
+	EActiveNotAdded=49,
+
+
+	/**
+	This panic is raised by the SetPriority() member function of an active
+	object, a CActive.
+	
+	It is caused by an attempt to change the priority of the active object 
+	while it is active, i.e. while a request is outstanding).
+	*/
+	ESetPriorityActive=50,
+
+
+	/**
+	This panic is raised by the At(), After() and Lock() member functions of
+	the CTimer active object.
+	
+	It is caused by an attempt to request a timer event when the CTimer active
+	object has not been added to the active scheduler.
+	*/
+	ETimNotAdded=51,
+
+
+	/**
+	This panic is raised by the Start() member function of the periodic timer
+    active object, a CPeriodic, when a negative time interval is passed to
+    the function.
+	*/
+	ETimIntervalNegativeOrZero=52,
+	
+	
+	/**
+	This panic is raised by the Start() member function of the periodic 
+	timer active object, a CPeriodic, when a negative delay time interval
+	is passed to the function.
+	*/
+	ETimDelayNegative=53,
+	
+	
+	/**
+	Not used.
+	*/
+	EUnusedBasePanic1=54,  // Unused
+
+
+	/**
+	Not used.
+	*/
+	ESvrNoServerName=55,
+	
+	
+	/**
+	This panic is raised by the New() and NewL() member functions of
+	CBitMapAllocator when a negative or zero size is passed to them.
+	*/
+	EBmaSizeLessOrEqualToZero=56,
+	
+	
+	/**
+	This panic is raised by the Free(TInt aPos) member function of
+	CBitMapAllocator when a position value is passed which is out of bounds.
+	*/
+	EBmaFreeOutOfRange=57,
+
+
+	/**
+	This panic is raised by the IsFree(TInt aPos) member function of
+	CBitMapAllocator when a position value is passed which is out of bounds.
+	*/
+	EBmaAllocOutOfRange=58,
+	
+	
+	/**
+	This panic is raised by the AllocFromTopFrom(TInt aPos) member function 
+	of CBitMapAllocator when a position value is passed which is out of bounds.
+	*/
+	EBmaAllocFromTopFromOutOfRange=59,
+
+
+	/**
+	Not used.
+	*/
+	EBmaFreeTooMany=60,
+	
+	
+	/**
+	Not used.
+	*/
+	EBmaFreeNotAllocated=61,
+	
+	
+	/**
+	This panic is raised by the AllocAt() member function of CBitMapAllocator
+	when the implied position has already been allocated.
+	*/
+	EBmaAllocAtAlreadyAllocated=62,
+	
+	
+	/**
+	This panic is raised as a result of a call to the Pop() and PopAndDestroy()
+	static member functions of the CleanupStack class.
+	
+	The panic occurs when TRAPs have been nested and an attempt is made to pop too
+	many items from the cleanup stack for the current nest level.
+	*/
+	EClnPopAcrossLevels=63,
+
+
+	/**
+	This panic is raised as a result of a call to the Pop() and PopAndDestroy()
+	static member functions of the CleanupStack class.
+	
+	The panic occurs when attempt is made to pop more items from the cleanup
+	stack than are on the cleanup stack.
+	*/
+	EClnPopUnderflow=64,
+	
+	
+	/**
+	The panic is raised as a result of a call to the Pop() and PopAndDestroy()
+	static member functions of the CleanupStack class.
+	
+	The panic occurs when an attempt is made to pop more items from the cleanup
+	stack than are on the cleanup stack.
+	*/
+	EClnLevelUnderflow=65,
+
+
+	/**
+	This panic is raised if an attempt is being made to insert a cleanup item
+	into a position on the cleanup stack reserved for marking the current TRAP
+	nest level.
+	
+	In practice this error occurs if the call to CleanupStack::PushL() happens
+	when there has been no call to TRAP().
+	*/
+	EClnPushAtLevelZero=66,
+	
+	
+	/**
+	This panic is raised when building a TCleanupStackItem which is to be added
+	to the cleanup stack.
+	
+	The building of the TCleanupStackItem needs a TCleanupItem and this has
+	been constructed with a NULL cleanup operation (a TCleanupOperation).
+	*/
+	EClnNoCleanupOperation=67,
+
+
+	/**
+	This panic is raised if there are no free slots available on the cleanup
+	stack to insert a cleanup item.
+	*/
+	EClnNoFreeSlotItem=68,
+	
+	
+	/**
+	This panic is raised if no trap handler has been installed.
+	
+	In practice, this occurs if CTrapCleanup::New() has not been called
+	before using the cleanup stack.
+	*/
+	EClnNoTrapHandlerInstalled=69,
+	
+	
+	/**
+	This panic is raised as a result of a call to the versions of the
+	Pop() and PopAndDestroy() static member functions of the CleanupStack class
+	which take an explicit count of the items to be popped.
+	
+	The panic is caused by passing a negative value for the number of items
+	to be popped.
+	*/
+	EClnPopCountNegative=70,
+	
+	
+	/**
+	This panic is raised when TRAPs have been nested and an attempt is made to
+	exit from a TRAP nest level before all the cleanup items belonging to that
+	level have been popped off the cleanup stack.
+	*/
+	EClnLevelNotEmpty=71,
+
+
+	/**
+	This panic is raised by the constructor of the circular buffer base class,
+	a CCirBufBase, when the size value passed is zero or negative.
+	*/
+	ECircItemSizeNegativeOrZero=72,
+
+
+	/**
+	This panic is raised by a call to the SetLengthL() member function of 
+	the circular buffer base class, a CCirBufBase, by passing a length
+	value which is zero or negative.
+	*/
+	ECircSetLengthNegativeOrZero=73,
+	
+	
+	/**
+	This panic is raised by a call to the Add() member function of a 
+	circular buffer, a CCirBuf when the pointer to the item
+	to be added is NULL.
+	*/
+	ECircNoBufferAllocated=74,
+	
+	
+	/**
+	This panic is raised by a call to the Add() member function of a
+	circular buffer, a CCirBuf when the number of items to be added
+	is zero or negative.
+	*/
+	ECircAddCountNegative=75,
+
+
+	/**
+	This panic is raised by a call to the Remove() member function of
+	a circular buffer, a CCirBuf when the number of items to be removed is zero
+	or negative.
+	*/
+	ECircRemoveCountNegative=76,
+
+
+	/**
+	This panic is raise by CConsoleBase::Getch() when the asynchronous request
+	that fetches the character completes with a completion code that
+	is not KErrNone.
+	*/
+	EConsGetchFailed=77,
+	
+	
+	/**
+	Not used.
+	*/
+	ESecurityData=78,
+	
+	
+	/**
+	This panic is raised by the Alloc() member function 
+	of CBitMapAllocator if the object is in an inconsistnt state.
+	*/
+	EBmaInconsistentState=79,
+
+
+	/**
+	This panic is raised by the AllocFrom() member function 
+	of CBitMapAllocator if the position passed into it is outside its valid
+	range, i.e. is negative or is greater than or equal to the size.
+	*/
+	EBmaAllocFromOutOfRange=80,
+
+
+	/**
+	This panic is raised by the Alloc() member function 
+	of CBitMapAllocator if the count value passed into it
+	is not positive.
+	*/
+	EBmaAllocCountNegative=81,
+	
+	
+	/**
+	This panic is raised by the AllocAligned() member function 
+	of CBitMapAllocator if the alignment value passed into it
+	is negative or greater than or equal to 32.
+	*/
+	EBmaAllAlgnOutOfRange=82,
+
+
+	/**
+	This panic is raised by the AllocAlignedBlock() member function 
+	of CBitMapAllocator if the alignment value passed into it
+	is negative or greater than or equal to 32.
+	*/
+	EBmaAllAlgnBOutOfRange=83,
+	
+	
+	/**
+	This panic is raised by the AllocAt() member function 
+	of CBitMapAllocator if the position value passed into it
+	is outside the permitted range.
+	*/
+	EBmaAllocBlkOutOfRange=84,
+
+
+	/**
+	This panic is raised by the IsFree() member function 
+	of CBitMapAllocator if the position value passed into it
+	is outside the permitted range.
+	*/
+	EBmaChkBlkOutOfRange=85,
+
+
+	/**
+	This panic is raised by the Free() member function 
+	of CBitMapAllocator if the position value passed into it
+	is outside the permitted range.
+	*/
+	EBmaFreeBlkOutOfRange=86,
+
+
+	/**
+	This panic is raised by the Free() member function 
+	of CBitMapAllocator if attempting to free a block that is not allocated.
+	*/
+	EBmaFreeBlkNotAllocated=87,
+
+
+	/**
+	This panic is raised by the Free() member function 
+	of CBitMapAllocator if attempting to allocate a block that is not free.
+	*/
+	EBmaAllocBlkNotFree=88,
+
+
+	/**
+	This panic is raised by call to the Replace() member function of 
+	CActiveScheduler when the replacement active scheduler is the same as
+	the existing active scheduler.
+	*/
+	EActiveSchedulerReplacingSelf=89,
+	
+	
+	/**
+	The panic is raised as a result of a call to the Pop() and PopAndDestroy()
+	static member functions of the CleanupStack class.
+	
+	The panic occurs when an the item to be popped is not the expected item.
+	*/
+	EClnCheckFailed=90,
+	
+	
+	/**
+	This panic is raised by CActiveSchedulerWait::Start()
+    when the CActiveSchedulerWait has already been started.
+    
+    @see CActiveSchedulerWait
+	*/
+	EActiveSchedulerWaitAlreadyStarted=91,
+	
+	
+	/** 
+	This panic is raised by CActiveSchedulerWait::AsyncStop() and
+	CActiveSchedulerWait::CanStopNow()
+	when the CActiveSchedulerWait has not been started.
+	*/
+	EActiveSchedulerWaitNotStarted=92,
+
+
+	/**
+	This panic is raised during construction of a CAsyncOneShot if the attempt
+	to open a handle to the current thread fails.
+	*/
+	EAsyncOneShotSetupFailed=93,
+	
+	
+	/**
+	Not used.
+	*/
+	ESvrBadSecurityPolicy=94,
+
+
+	/**
+	This panic is raised if CPolicyServer::CustomSecurityCheckL(),
+	or CPolicyServer::CustomFailureActionL() are called.
+	
+	Odds are that you forgot to implement one of these two functions in your
+	CPolicyServer derived Server.
+	*/
+	EPolSvrCallingBaseImplementation=95,
+
+
+	/**
+	This panic is raised in debug builds by the CPolicyServer constructor if
+	TPolicy::iRanges[0] does not have a value of 0.
+	*/
+	EPolSvr1stRangeNotZero=96,
+
+
+	/**
+	This panic is raised in debug builds by the CPolicyServer constructor if
+	each element of TPolicy::iRanges is not greater than the previous.
+	*/
+	EPolSvrRangesNotIncreasing=97,
+
+
+	/**
+	This panic is raised in debug builds by the CPolicyServer constructor
+	unless every element in TPolicy::iElementsIndex is valid.  Every element,
+	x, must not be one of (ESpecialCaseHardLimit <= x <= ESpecialCaseLimit) in
+	order to be valid.  See CPolicyServer::TSpecialCase for more information.
+	*/
+	EPolSvrElementsIndexValueInvalid=98,
+
+
+	/**
+	This panic is raised in debug builds by the CPolicyServer constructor if
+	TPolicy::iOnConnect has an invalid value. iOnConnect must not be one of
+	(ESpecialCaseHardLimit <= x <= ESpecialCaseLimit) in order to be valid.
+	See CPolicyServer::TSpecialCase for more information.
+	*/
+	EPolSvrIOnConnectValueInvalid=99,
+	
+
+	/**
+	This panic is raised if CPolicyServer::iPolicy is found to be invalid for
+	an unkown reason.  There is a good chance that your policy would cause the
+	server to panic with one of the above specific policy panic codes if you
+	run it in debug mode.  See the policy server documentation for a
+	description of a valid policy.
+	*/
+	EPolSvrPolicyInvalid=100,
+
+
+	/**
+	The value returned from CustomSecurityCheckL or CustomFailureActionL was
+	invalid.  See CPolicyServer::TCustomResult for a list of valid results.
+	*/
+	EPolSvrInvalidCustomResult=101,
+
+
+	/**
+	This panic is raised in debug builds by the CPolicyServer constructor if
+	TPolicy.iRangeCount is not greater than 0.  All policies given to the
+	policy server must contain at least 1 policy. 
+	*/
+	EPolSvrIRangeCountInvalid=102,
+
+
+	/**
+	This panic is raised by the policy server framework if a message fails a
+	policy check (custom or not) and the associated action is EPanicClient.
+	*/
+	EPolSvrActionPanicClient=103,
+
+	/**
+	This panic is raised by CObjectIx class methods if inconsistent data condition occurs
+	It can appear in debug build only.
+	*/
+	EObjInconsistent=104,
+	
+	/**
+	This panic is raised as a result of a call to the Pop() and PopAndDestroy()
+	static member functions of the CleanupStack class.
+	
+	The panic occurs when the cleanup operation of a popped item modifies the 
+	cleanup stack. In such a case, the function cannot guarantee that the correct 
+	items will be popped.
+	*/
+	EClnStackModified=105,
+
+    };
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32/include/e32power.h	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,67 @@
+// Copyright (c) 2002-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32\include\e32power.h
+// 
+//
+
+#ifndef __E32POWER_H__
+#define __E32POWER_H__
+
+#include <e32cmn.h>
+
+
+
+
+/**
+@publishedPartner
+@released
+
+System-wide power states
+*/
+enum TPowerState
+	{
+	/** The system is fully operational; could be busy or idle */ 
+	EPwActive,
+	/** The system sleeps keeping the full memory state in RAM */ 
+	EPwStandby,
+	/** System is off; can go to active by rebooting only */
+	EPwOff,
+	/** The system restarts - i.e. switches off and then back on */
+	EPwRestart,
+	/** An integer that strictly greater of any legal power state value */
+	EPwLimit,
+	};
+
+
+
+
+/** 
+@publishedPartner
+@released
+
+User-level domain manager's interface to Kernel-level power management.
+*/
+class Power
+
+	{
+public:
+	IMPORT_C static TInt EnableWakeupEvents(TPowerState);
+	IMPORT_C static void DisableWakeupEvents();
+	IMPORT_C static void RequestWakeupEventNotification(TRequestStatus&);
+	IMPORT_C static void CancelWakeupEventNotification();
+	IMPORT_C static TInt PowerDown();
+	};
+
+#endif
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32/include/e32property.h	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,179 @@
+// Copyright (c) 2002-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32\include\e32property.h
+// 
+//
+
+#ifndef __E32PROPERTY_H__
+#define __E32PROPERTY_H__
+
+#include <e32cmn.h>
+
+/**
+@publishedAll
+@released
+
+Property category UID value reserved for System services.
+*/
+static const TInt32 KUidSystemCategoryValue=0x101f75b6;
+
+
+/**
+@publishedAll
+@released
+
+Property category UID reserved for System services
+*/
+static const TUid KUidSystemCategory={KUidSystemCategoryValue};
+
+
+/**
+@publishedAll
+@released
+
+The lowest value for Property categories at which additional
+security restrictions are applied when defining properties.
+
+Properties with category values above this threshold may only be defined
+if the category matches the defining process's Secure ID.
+
+Below this threashold, properties may be defined either by processes with
+a matching Secure ID, or by processes with the WriteDeviceData capability.
+*/
+static const TInt32 KUidSecurityThresholdCategoryValue=0x10273357;
+
+
+/**
+@publishedAll
+@released
+
+User side interface to Publish & Subscribe.
+
+The class defines a handle to a property, a single data value representing
+an item of state information. Threads can publish (change) a property value
+through this handle. Threads can also subscribe
+(request notification of changes) to a property value through this handle;
+they can also retrieve the current property value.
+*/
+class RProperty : public RHandleBase
+	{
+public:
+	/**
+	The largest supported property value, in bytes, for byte-array (binary)
+	types and text types.
+    */
+	enum { KMaxPropertySize = 512 };
+	/**
+	The largest supported property value, in bytes, for large byte-array (binary)
+	types and large text types.
+    */
+	enum { KMaxLargePropertySize = 65535 };
+
+
+	/**
+	Property type attribute.
+	*/
+	enum TType
+		{
+		/**
+		Integral property type.
+		*/
+		EInt,
+		
+		
+		/**
+		Byte-array (binary data) property type.
+		This type provides real-time guarantees but is limited to a maximum size
+		of 512 bytes.
+
+		@see KMaxPropertySize 
+		*/
+		EByteArray,
+		
+		
+		/**
+		Text property type. 
+		This is just a programmer friendly view of a byte-array property, and
+		is implemented in the same way as EByteArray.
+		*/
+		EText = EByteArray,
+
+
+		/**
+		Large byte-array (binary data) property type.
+		This type provides no real-time guarantees but supports properties
+		of up to 65536 bytes.
+
+		@see KMaxLargePropertySize 
+		*/
+		ELargeByteArray,
+		
+		
+		/**
+		Large text property type. 
+		This is just a programmer friendly view of a byte-array property, and
+		is implemented in the same way as EByteArray.
+		*/
+		ELargeText = ELargeByteArray,
+
+
+		/**
+		Upper limit for TType values.
+		It is the maximal legal TType value plus 1.
+		*/ 
+		ETypeLimit,
+		
+		
+		/**
+		Bitmask for TType values coded within TInt attributes.
+		*/ 
+		ETypeMask = 0xff
+		};
+
+
+public:
+	IMPORT_C static TInt Define(TUid aCategory, TUint aKey, TInt aAttr, TInt aPreallocate=0);
+	IMPORT_C static TInt Define(TUid aCategory, TUint aKey, TInt aAttr, const TSecurityPolicy& aReadPolicy, const TSecurityPolicy& aWritePolicy, TInt aPreallocated=0);
+	IMPORT_C static TInt Define(TUint aKey, TInt aAttr, const TSecurityPolicy& aReadPolicy, const TSecurityPolicy& aWritePolicy, TInt aPreallocated=0);
+	IMPORT_C static TInt Delete(TUid aCategory, TUint aKey);
+	IMPORT_C static TInt Delete(TUint aKey);
+	IMPORT_C static TInt Get(TUid aCategory, TUint aKey, TInt& aValue);
+	IMPORT_C static TInt Get(TUid aCategory, TUint aKey, TDes8& aValue);
+#ifndef __KERNEL_MODE__
+	IMPORT_C static TInt Get(TUid aCategory, TUint aKey, TDes16& aValue);
+#endif
+	IMPORT_C static TInt Set(TUid aCategory, TUint aKey, TInt aValue);
+	IMPORT_C static TInt Set(TUid aCategory, TUint aKey, const TDesC8& aValue);
+#ifndef __KERNEL_MODE__
+	IMPORT_C static TInt Set(TUid aCategory, TUint aKey, const TDesC16& aValue);
+#endif
+
+	IMPORT_C TInt Attach(TUid aCategory, TUint aKey, TOwnerType aType = EOwnerProcess);
+
+	IMPORT_C void Subscribe(TRequestStatus& aRequest);
+	IMPORT_C void Cancel();
+
+	IMPORT_C TInt Get(TInt& aValue);
+	IMPORT_C TInt Get(TDes8& aValue);
+#ifndef __KERNEL_MODE__
+	IMPORT_C TInt Get(TDes16& aValue);
+#endif
+	IMPORT_C TInt Set(TInt aValue);
+	IMPORT_C TInt Set(const TDesC8& aValue);
+#ifndef __KERNEL_MODE__
+	IMPORT_C TInt Set(const TDesC16& aValue);
+#endif
+	};
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32/include/e32rom.h	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,1275 @@
+// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32\include\e32rom.h
+// 
+//
+
+#ifndef __E32ROM_H__
+#define __E32ROM_H__
+#include <e32cmn.h>
+#include <e32def_private.h>
+
+//
+
+#ifndef __SECURITY_INFO_DEFINED__
+#define __SECURITY_INFO_DEFINED__
+/**
+@internalTechnology
+*/
+//This struct must be identical in size and offset to the one in e32cmn.h
+//Functions need not be duplicated.  But must be same structurally.
+struct SCapabilitySet
+	{
+	enum {ENCapW=2};
+	TUint32 iCaps[ENCapW];
+	inline const TUint32& operator[] (TInt aIndex) const { return iCaps[aIndex]; }
+	inline TUint32& operator[] (TInt aIndex) { return iCaps[aIndex]; }
+	};
+
+/**
+@internalTechnology
+*/
+//This struct must be identical in size and offset to the one in e32cmn.h
+//Functions need not be duplicated.  But must be same structurally.
+struct SSecurityInfo
+	{
+	TUint32	iSecureId;
+	TUint32	iVendorId;
+	SCapabilitySet iCaps;	
+	};
+#endif
+
+/**
+@internalTechnology
+@prototype
+*/
+struct SDemandPagingConfig
+	{
+	TUint16 iMinPages;
+	TUint16 iMaxPages;
+	TUint16 iYoungOldRatio;
+	TUint16 iSpare[3];
+	};
+
+/**
+@internalTechnology
+@prototype
+*/
+struct SRomPageInfo
+	{
+	enum TAttributes
+		{
+		EPageable = 1<<0
+		};
+	enum TCompression
+		{
+		ENoCompression,
+		EBytePair,
+		};
+	TUint32 iDataStart;
+	TUint16 iDataSize;
+	TUint8  iCompressionType;
+	TUint8  iPagingAttributes;
+	};
+
+/**
+@publishedPartner
+@released
+
+Defines the size of the header for a ROM image.
+
+@see TRomHeader
+*/
+const TUint KRomHeaderSize=0x200;
+//
+
+
+/**
+@publishedPartner
+@released
+
+The format of the header for a ROM image.
+
+This is retained as part of the ROM image.
+It is generated by the rombuild tool, and is used by the Bootstrap and
+the kernel.
+*/
+class TRomHeader
+	{
+public:
+	enum { KDefaultDebugPort = -1 };
+	enum { KNumTraceMask = 8 };  // this is also defined in e23const.h
+
+__ASSERT_COMPILE(KNumTraceMask==KNumTraceMaskWords);
+
+public:
+    /**
+    Reserved for a small amount of Bootstrap code, if required.
+    The first 4 bytes of the binary image typically contains
+    a branch instruction which jumps to code at offset 0x100.
+    */
+	TUint8 iJump[124]; 
+	
+	                                     
+    /**
+    The restart vector.
+    */	                                     
+	TLinAddr iRestartVector;
+	
+	
+	/**
+	The date and time that the ROM image was built, in microseconds.
+	*/
+	TInt64 iTime;
+	
+	
+	/**
+	The high order 32 bits of the ROM image build date & time.
+	*/
+	TUint32 iTimeHi;
+	
+	
+	/**
+	The virtual address of the base of the ROM.
+	*/
+	TLinAddr iRomBase;
+	
+	
+	/**
+	The size of the ROM image, in bytes.
+	
+	This includes the second section for sectioned ROMs.
+	*/
+	TUint32 iRomSize;
+	
+	
+	/**
+	The virtual address of the TRomRootDirectoryList structure.
+
+    @see TRomRootDirectoryList 
+	*/
+	TLinAddr iRomRootDirectoryList;
+	
+	
+	/**
+	The virtual address of kernel data, when in RAM.
+	*/
+	TLinAddr iKernDataAddress;
+	
+	
+	/**
+	The virtual address of the top of the kernel region, when in RAM.
+	*/
+	TLinAddr iKernelLimit;
+	
+	
+	/**
+	The virtual address of the primarys ROM file image header.
+
+    @see TRomImageHeader 
+	*/
+	TLinAddr iPrimaryFile;
+	
+	
+	/**
+	The virtual address of the secondarys ROM file image header.
+	
+	@see TRomImageHeader 
+	*/
+	TLinAddr iSecondaryFile;
+	
+	
+	/**
+	A computed constant that causes the 32-bit checksum of the image to equal
+	the value specified by the "romchecksum" keyword.
+	*/
+	TUint iCheckSum;
+	
+	
+	/**
+	A unique number identifying the hardware for which this ROM image
+	has been built.
+
+    Note that this is only used for testing purposes.
+	*/
+	TUint32 iHardware;
+	
+	
+	/**
+	A bitmask identifying which of the languages are supported by the ROM image,
+	as specified by the "languages" keyword.
+
+    Note that this is only used for testing purposes.
+	*/
+	TInt64 iLanguage;
+	
+	
+	/**
+	Contains the flags that define the security options in force.
+	
+	@see TKernelConfigFlags
+	*/
+	TUint32 iKernelConfigFlags;
+
+	/**
+	The virtual address of the TRomExceptionSearchTable structure.
+
+	@see TRomExceptionSearchTable
+	*/
+	TLinAddr iRomExceptionSearchTable;
+	
+	/**
+	Current size of ROM header (Previously iUnused3)
+	If value is 0x69966996 then header size = 0x100
+	*/
+	TUint32 iRomHeaderSize;
+	
+	
+	/**
+	The virtual address of the ROM section header, if the ROM is sectioned.
+	
+	@see TRomSectionHeader
+	*/
+	TLinAddr iRomSectionHeader;
+	
+	
+	/**
+	The total supervisor data size, i.e. the amount of memory mapped for
+	the kernel data chunk.
+	*/
+	TInt iTotalSvDataSize;
+	
+	
+	/**
+	The virtual address of the TRomEntry for the Variant file.
+	
+	@see TRomEntry
+	*/
+	TLinAddr iVariantFile;
+
+	
+	/**
+	The virtual address of TRomEntry for the first extension file, if it exists.
+	
+	If there is more than one extension, then the next extension field in
+	the extensions TRomImageHeader points to the TRomEntry for
+	that next extension.
+	
+    @see TRomImageHeader::iNextExtension
+   	@see TRomImageHeader
+	@see TRomEntry
+	*/
+	TLinAddr iExtensionFile;
+	
+	
+	/**
+	The virtual adress of the first area to be relocated into RAM, as defined
+	using the "area" keyword.
+	*/
+	TLinAddr iRelocInfo;
+	
+	
+	/**
+	The old position of the kernel trace mask, see iTraceMask below
+	*/
+	TUint32  iOldTraceMask;		// The old location of the kernel tracemask
+	
+	
+	/**
+	The virtual address of the user data area.
+	*/
+	TLinAddr iUserDataAddress;	// non-MMU stuff
+
+	
+	/**
+	The total size of the user data.
+	*/
+	TInt iTotalUserDataSize;	// non-MMU stuff
+	
+	
+	/**
+	A value that is interpreted by the Bootstrap and kernel as the debug port
+	to be used.
+	*/
+	TUint32 iDebugPort;			// semantic is ASSP-specific
+	
+	
+	/**
+	The ROM version number.
+	*/
+	TVersion iVersion;
+	
+	
+	/**
+	The type of compression used for the image.
+	
+	This is a UID, or 0 if there is no compression.
+	*/
+	TUint32 iCompressionType;	// compression type used
+	
+	
+	/**
+	The size of the image after compression.
+	*/
+	TUint32 iCompressedSize;	// Size after compression
+	
+	
+	/**
+	The size of the image before compression.
+	*/
+	TUint32 iUncompressedSize;	// Size before compression
+	
+	
+	/**
+	*/
+	TUint32 iDisabledCapabilities[2];   // 2==SSecurityInfo::ENCapW
+
+
+	/**
+	The initial value for the kernel trace masks.
+	*/
+	TUint32  iTraceMask[KNumTraceMask];  // The kernel debug trace masks
+
+	/**
+	Initial values for fast-trace filter.
+	*/
+	TUint32 iInitialBTraceFilter[8];
+
+	/**
+	Initial value for size of fast-trace buffer.
+	*/
+	TInt iInitialBTraceBuffer;
+
+	/**
+	Initial value for size of fast-trace mode.
+	*/
+	TInt iInitialBTraceMode;
+
+	/**
+	Offset, in bytes from ROM start, for the start of the pageable ROM area.
+	@internalTechnology
+	@prototype
+	*/
+	TInt iPageableRomStart;
+
+	/**
+	Size, in bytes , of the pageable ROM area.
+	@internalTechnology
+	@prototype
+	*/
+	TInt iPageableRomSize;
+
+	/**
+	Offset, in bytes from ROM start, for the page index. (Array of SRomPageInfo objects.)
+	@internalTechnology
+	@prototype
+	*/
+	TInt iRomPageIndex;
+
+	/**
+	@internalTechnology
+	@prototype
+	*/
+	SDemandPagingConfig iDemandPagingConfig;
+
+	/**
+	Offset, in bytes from ROM start, for the start of compressed un-paged ROM area
+	@internalTechnology
+	@prototype
+	*/
+	TUint32 iCompressedUnpagedStart;
+	
+	
+	/**
+	Size, in bytes of the un-paged part of image after compression.
+	@internalTechnology
+	@prototype
+	*/
+	TUint32 iUnpagedCompressedSize;
+	
+	
+	/**
+	Size, in bytes of the un-paged part of image before compression.
+	@internalTechnology
+	@prototype
+	*/
+	TUint32 iUnpagedUncompressedSize;
+	
+	/**
+	@internalComponent
+	*/
+	TUint32 iSpare[37];   // spare : force size to be correct
+
+	};
+
+__ASSERT_COMPILE(sizeof(TRomHeader)==KRomHeaderSize);
+__ASSERT_COMPILE(SCapabilitySet::ENCapW==2); // TRomHeader::iDisabledCapabilities has hard coded 2 because h2inc.pl does not parse scoped identifiers
+
+
+
+
+/**
+@publishedPartner
+@released
+
+Contains information about a root directory.
+
+A variable number of these are contained in a TRomRootDirectoryList structure.
+
+@see TRomRootDirectoryList
+*/
+class TRootDirInfo
+	{
+public:
+    /**
+    The hardware variant for this root directory entry.
+    */
+	TUint iHardwareVariant;
+	
+	
+	/**
+	The virtual address of the root directory.
+	
+	@see TRomDir
+	*/
+	TLinAddr iAddressLin;
+	};
+
+
+
+
+/**
+@publishedPartner
+@released
+
+A structure that allows you to find the root directories for each hardware
+Variant supported by the ROM.
+
+Usually, there is only one Variant and one root directory. However, a ROM can
+have multiple root directories and directory trees, one for each hardware Variant
+supported by the ROM. This ensures that the file server only sees the files
+that are relevant to the hardware on which it is running. In this case, there
+are multiple entries in the table describing each root directory.
+*/
+class TRomRootDirectoryList
+	{
+public:
+    /**
+    The number of root directory entries.
+    */
+	TInt iNumRootDirs;
+	
+	
+	/**
+	The root directory entries.
+
+    The number of entries is defined by iNumRootDirs.
+	*/
+	TRootDirInfo iRootDir[1];
+	};
+
+
+
+
+/**
+@publishedPartner
+@released
+
+The format of a ROM section header.
+*/
+class TRomSectionHeader
+	{
+public:
+
+    /**
+    The ROM version number.
+    */
+	TVersion iVersion;
+	
+	
+	/**
+	A computed constant that causes the 32-bit checksum of the upper
+	section to equal zero.
+
+	Upper sections checksum to zero so that the overall ROM checksum in
+	the TRomHeader is unaffected by changes to this section.
+	
+	@see TRomHeader
+	*/
+	TUint iCheckSum;
+	
+	
+	/**
+	The date and time that the ROM image was built, in microseconds.
+	*/
+	TInt64 iTime;
+
+	
+	/**
+	A bitmask identifying which of the languages are supported by the ROM image,
+	as specified by the "languages" keyword.
+    */
+	TInt64 iLanguage;
+	};
+//
+
+
+
+
+/**
+@publishedPartner
+@released
+
+A structure that describes a file or a directory.
+*/
+class TRomEntry
+	{
+public:
+    
+     
+    /**
+    The size of the file.
+    */
+	TInt iSize;
+	
+	
+	/**
+	The virtual address of the file, or of a TRomDir structure if this entry
+	describes another directory.
+	
+	@see TRomDir
+	*/
+	TUint32 iAddressLin;
+
+
+	/**
+	Attributes.
+	*/
+	TUint8 iAtt;
+
+
+	/**
+	The length of the file or directory name.
+	*/
+	TUint8 iNameLength;
+
+
+	/**
+	A variable length field containing the file or directory name.
+	*/
+	TUint8 iName[2];
+	};
+
+
+
+
+/**
+@publishedPartner
+@released
+
+The size of the fixed part of a TRomEntry structure.
+*/
+const TInt KRomEntrySize=(sizeof(TRomEntry)-2);
+
+
+
+
+//
+class TRomDirSortInfo;
+
+/**
+@publishedPartner
+@released
+
+A structure that describes the first part of a ROM directory.
+
+This part of a ROM directory is a sequence of variable length entries,
+each describing a file or a subdirectory, in the order that the members
+were specified in the original obey file; the variable length entries are
+the TRomEntry structures that follow the iSize member.
+
+This part of the ROM directory is followed by a structure defined
+by TRomDirSortInfo, which contains a pair of sorted tables suitable for
+a binary search.
+
+@see TRomDirSortInfo
+*/
+class TRomDir
+	{
+public:
+	inline const TRomDirSortInfo* SortInfo() const;
+	inline const TRomEntry* SortedEntry(TInt aIndex) const;
+	inline TInt SubDirCount() const;
+	inline TInt FileCount() const;
+	inline TInt EntryCount() const;
+	TInt BinarySearch(const TDesC& aName, TInt aLengthLimit, TInt aMode, TBool aDir) const;
+	const TRomDir* FindLeafDir(const TDesC& aPath) const;
+public:
+
+    /**
+    The number of bytes occupied by the set of TRomEntry structures
+    that follow this field.
+    
+    @see TRomDir::iEntry
+    */
+	TInt iSize;
+
+	
+	/**
+	A variable number of entries, each of which describes a file or a directory.
+	
+	Each entry is 4-byte aligned, and may have padding to ensure that the entry
+	is 4-bye aligned.
+	*/
+	TRomEntry iEntry;
+	};
+
+
+
+
+/**
+@publishedPartner
+@released
+
+A structure that describes the second part of a ROM directory.
+
+It contains a pair of sorted tables suitable for
+a binary search. The sorted tables contain unsigned 16-bit scaled offsets,
+which point to the start of the corresponding TRomEntry in the TRomDir.
+
+@see TRomDir
+*/
+class TRomDirSortInfo
+	{
+public:
+
+	/**
+    The number of subdirectories in this directory.
+	*/
+	TUint16	iSubDirCount;		// number of subdirectories in this directory
+	
+	
+	/**
+	The number of files in this directory.
+	*/
+	TUint16 iFileCount;			// number of non-directory files in this directory
+	
+	
+	/**
+	The two sorted tables:
+	
+	1. First one is a table of 16-bit scaled offsets to the directory entries.
+	
+	2. Second one is a table of 16-bit scaled ofsets to the file entries.
+	   This table starts at offset 2*iSubDirCount from the start of the first table.
+	   
+	If the offset is X, then the corresponding TRomEntry is at address:
+	@code
+	4*X +(char*)address of the first TRomEntry
+	@endcode
+	For example, the first entry is at offset zero.
+	
+	The entries are sorted in the order of the UTF-8 representation of
+	the names in a case insensitive way (compare the C function stricmp()).
+	In effect, this folds upper and lowercase ASCII characters but leaves all
+	other Unicode characters unchanged.
+	*/
+	TUint16 iEntryOffset[1];	// offsets of each entry from TRomDir::iEntry; extend
+								// order of offsets is directories first, then files, lexicographic order within each group
+	};
+
+
+/**
+Gets a pointer to the start of the second part of the ROM directory,
+as described by the TRomDirSortInfo structure.
+
+@return The pointer to the start of the second part of the ROM directory.
+*/
+inline const TRomDirSortInfo* TRomDir::SortInfo() const
+	{ return (const TRomDirSortInfo*)( ((TLinAddr)&iEntry) + ( (iSize+sizeof(TUint32)-1) &~ (sizeof(TUint32)-1) )); }
+
+
+
+
+/**
+Gets the TRomEntry corresponding to the file or directory located at
+the specified index position within the sorted tables.
+
+@param aIndex The index of the entry within the sorted tables.
+              Note that for the purpose of this function, the two tables
+              are treated as one single table.
+              
+@return The required TRomEntry              
+*/
+inline const TRomEntry* TRomDir::SortedEntry(TInt aIndex) const
+	{
+	const TRomDirSortInfo* s = SortInfo();
+	return (const TRomEntry*)(((TLinAddr)&iEntry) + s->iEntryOffset[aIndex] * sizeof(TUint32));
+	}
+
+
+
+
+/**
+Gets the number of subdirectories in the directory.
+
+@return The number of subdirectories.
+*/
+inline TInt TRomDir::SubDirCount() const
+	{ return SortInfo()->iSubDirCount; }
+
+	
+	
+	
+/**
+Gets the number of files in the directory.
+
+@return The number of files.
+*/	
+inline TInt TRomDir::FileCount() const
+	{ return SortInfo()->iFileCount; }
+
+
+
+
+/**
+Gets the total number of files and subdirectories in the directory.
+
+@return The total number of files and subdirectories.
+*/	
+inline TInt TRomDir::EntryCount() const
+	{
+	const TRomDirSortInfo* s = SortInfo();
+	return s->iSubDirCount + s->iFileCount;
+	}
+
+
+
+
+//
+// Header of ROM image files under the new scheme. (dlls & exes)
+//
+/**
+@publishedPartner
+@released
+*/
+const TUint32 KRomImageFlagPrimary			=0x80000000u;
+
+/**
+@publishedPartner
+@released
+*/
+const TUint32 KRomImageFlagVariant			=0x40000000u;
+
+/**
+@publishedPartner
+@released
+*/
+const TUint32 KRomImageFlagExtension		=0x20000000u;
+
+/**
+@publishedPartner
+@released
+*/
+const TUint32 KRomImageFlagDevice			=0x10000000u;
+
+/**
+@publishedPartner
+@released
+*/
+const TUint32 KRomImageFlagsKernelMask		=0xf0000000u;
+
+/**
+@publishedPartner
+@released
+*/
+const TUint32 KRomImageFlagSecondary		=0x08000000u;
+
+/**
+@publishedPartner
+@released
+*/
+const TUint32 KRomImageFlagData				=0x04000000u;	// image has data and is not extension or variant
+
+/**
+@publishedPartner
+@released
+*/
+const TUint32 KRomImageFlagDataInit			=0x02000000u;	// image or non-EXE dependencies would require data initialisation
+
+/**
+@publishedPartner
+@released
+*/
+const TUint32 KRomImageFlagDataPresent		=0x01000000u;	// image or any dependencies have data
+
+/**
+@publishedPartner
+@released
+*/
+const TUint32 KRomImageFlagExeInTree		=0x00800000u;	// image depends on EXE
+
+/**
+@publishedPartner
+@released
+*/
+const TUint32 KRomImageFlagDll				=0x00000001u;
+
+/**
+@publishedPartner
+@released
+*/
+const TUint32 KRomImageFlagFixedAddressExe	=0x00000004u;
+
+/**
+@publishedPartner
+@released
+*/
+const TUint32 KRomImageABIMask				=0x00000018u;
+
+/**
+@publishedPartner
+@released
+*/
+const TUint32 KRomImageABI_GCC98r2			=0x00000000u;	// for ARM
+
+/**
+@publishedPartner
+@released
+*/
+const TUint32 KRomImageABI_EABI				=0x00000008u;	// for ARM
+
+/**
+@publishedPartner
+@released
+*/
+const TUint32 KRomImageEptMask				=0x000000e0u;	// entry point type
+
+/**
+@publishedPartner
+@released
+*/
+const TInt	  KRomImageEptShift				=5;
+
+/**
+@publishedPartner
+@released
+*/
+const TUint32 KRomImageEpt_Eka1				=0x00000000u;
+
+/**
+@publishedPartner
+@released
+*/
+const TUint32 KRomImageEpt_Eka2				=0x00000020u;
+
+/**
+@internalTechnology
+@released
+*/
+const TUint KRomImageFlagUnpaged			=0x00000100u;
+
+
+/**
+@internalTechnology
+@released
+*/
+const TUint KRomImageFlagPaged				=0x00000200u;
+
+
+/**
+@internalTechnology
+@released
+Flag to indicate when named symbol export data present in image
+*/
+const TUint KRomImageNmdExpData				=0x00000400u;
+
+/**
+@internalTechnology
+@released
+Flag to indicate debuggability of this image.
+*/
+const TUint KRomImageDebuggable			=0x00000800u;
+
+class TDllRefTable;
+
+/**
+@publishedPartner
+@released
+
+The format of the header for a ROM file image.
+
+The structure of a file image is based on the native image file format,
+but this can be compressed in the ROM image, as the relocation information
+and the .idata section are discarded once the file is fixed up.
+
+The Import Address Table (IAT) is also removed and each reference to
+an IAT entry is converted into a reference to the associated Export Directory
+entry in the corresponding DLL.
+
+ROM file images have the following sections:
+
+@code
+The header (as described by this structure)
+.text  - code
+.rdata - constant (read-only) data
+.edata - the export directory
+.data  - initialised data that is copied to RAM when the executable runs.
+The DLL reference table (a TDllRefTable structure), which is a list of DLLs
+used by the executable.
+@endcode
+
+@see TRomImageHeader::iDllRefTable
+@see TDllRefTable
+*/
+class TRomImageHeader
+	{
+public:
+
+    /**
+    The UID1 for the file.
+    
+    @see TUidType
+    */
+	TUint32	iUid1;
+
+	
+    /**
+    The UID2 for the file.
+
+    @see TUidType
+    */
+	TUint32	iUid2;
+
+	
+    /**
+    The UID3 for the file.
+
+    @see TUidType
+    */
+	TUint32	iUid3;
+	
+	
+	/**
+	The checksum of the UIDs
+	*/
+	TUint32	iUidChecksum;
+	
+	
+	/**
+	The entrypoint of this executable, i.e. the offset within this file.
+	*/
+	TUint32 iEntryPoint;
+	
+	
+	/**
+	This executables code address.
+	*/
+	TUint32 iCodeAddress;
+
+
+	/**
+	This executables data address.
+	*/
+	TUint32 iDataAddress;
+
+	
+	/**
+	The size of the code.
+	
+	This includes the size of the constant data.
+	*/
+	TInt iCodeSize;
+	
+	
+	/**
+	The size of the executable code.
+	
+	This is the value of (iCodeSize - the size of the constant data).
+	*/
+	TInt iTextSize;
+	
+	
+	/**
+	The data size.
+	*/
+	TInt iDataSize;
+	
+	
+	/**
+	The size of the .bss (the zero-filled data)
+	*/
+	TInt iBssSize;
+	
+	
+	/**
+	The minimum size of the heap.
+	*/
+	TInt iHeapSizeMin;
+	
+	
+	/**
+	The maximum size of the heap.
+	*/
+	TInt iHeapSizeMax;
+	
+	
+	/**
+	The size of the stack.
+	*/
+	TInt iStackSize;
+	
+	
+	/**
+	The address of the DLL reference table.
+	
+	@see TDllRefTable
+	*/
+	TDllRefTable* iDllRefTable;
+	
+	
+	/**
+	The number of functions exported by this executable.
+	*/
+	TInt iExportDirCount;
+	
+	
+	/**
+	The address of the export directory, which is a simple list of functions
+	that can be indexed by ordinal.
+	*/
+	TUint32 iExportDir;
+	
+	
+	/**
+	Security information, details of which are internal to Symbian.
+	*/
+	SSecurityInfo iS;
+	
+	
+	/**
+	The version number of the tools used to generate this file image.
+	*/
+	TVersion iToolsVersion;
+	
+	
+	/**
+	Flags field.
+	*/
+	TUint32 iFlags;
+	
+	
+	/**
+	The priority of the process.
+	*/
+	TProcessPriority iPriority;
+	
+	
+	/**
+	The virtual base address of the data and .bss, where the process expects
+	its data chunk to be when it runs.
+	*/
+	TUint32 iDataBssLinearBase;
+	
+	
+	/**
+	The address of the TRomEntry for the next extension file.
+	
+	This field is only used if there is more than one extension.
+	The first extension is found using the TRomHeader.
+	
+	@see TRomEntry
+	@see TRomHeader
+	*/
+	TLinAddr iNextExtension;
+	
+	
+	/**
+	A number denoting the hardware Variant.
+	
+	It is used to determine whether this executable can run
+	on a given system.
+	*/
+	TUint32 iHardwareVariant;
+	
+	
+	/**
+	The total data size, including space reserved for DLLs
+	*/
+	TInt iTotalDataSize;	// data+bss + space reserved for DLLs
+	
+	
+	/**
+	The module version.
+	*/
+	TUint32 iModuleVersion;
+
+	/**
+	The address of the Exception Descriptor if present.
+	0 if no Exception descriptor
+	*/
+	TLinAddr iExceptionDescriptor;
+	};	
+	
+	
+	
+	
+//
+// Header for extension ROMs
+// Equivalent to TRomHeader
+//
+
+/**
+@publishedPartner
+@released
+
+The format of a ROM extension header.
+*/
+class TExtensionRomHeader
+	{	
+public:
+    
+    /**
+    The extension ROM image version number.
+    */
+	TVersion iVersion;
+	
+	
+	/**
+	The virtual address of the base of the extension ROM.
+	*/
+	TLinAddr iRomBase;
+	
+	
+	/**
+	The size of the extension ROM image.
+	*/
+	TUint32 iRomSize;
+	
+	
+	/**
+	The virtual address of the TRomRootDirList structure for
+	the combined kernel+extension ROM image.
+	
+	@see TRomRootDirList
+	*/
+	TLinAddr iRomRootDirectoryList;
+	
+	
+	/**
+	The date and time that the extension ROM image was built, in microseconds.
+	*/
+	TInt64 iTime;
+	
+	
+	/**
+	The extension ROM image checksum
+	*/
+	TUint iCheckSum;
+
+
+	//
+	/**
+	Copy of the kernel ROM image version number.
+	*/
+	TVersion iKernelVersion;
+	
+	
+	/**
+	Copy of the kernel ROM image build date & time.
+	*/
+	TInt64 iKernelTime;
+	
+	
+	/**
+	Copy of the kernel ROM image checksum.
+	*/
+	TUint iKernelCheckSum;
+	//
+
+
+	/**
+	The type of compression used for the image.
+	
+	This is a UID, or 0 if there is no compression.
+	*/
+	TUint32 iCompressionType;	// compression type used
+	
+	
+	/**
+	The size of the image after compression.
+	*/
+	TUint32 iCompressedSize;	// Size after compression
+	
+	
+	/**
+	The size of the image before compression.
+	*/
+	TUint32 iUncompressedSize;	// Size before compression
+	
+	
+	/**
+	The virtual address of the TRomExceptionSearchTable structure.
+
+	@see TRomExceptionSearchTable
+	*/
+	TLinAddr iRomExceptionSearchTable;
+
+	
+	/**
+	Reserved for future use.
+	*/
+	TUint32 iPad[32-15]; // sizeof(TExtensionRomHeader)=128
+	};
+
+
+
+
+
+/**
+@publishedPartner
+@released
+
+A list of DLLs that an executable needs in order to run.
+
+Each DLL referenced in this list has a pointer to a TRomImageHeader structure
+that describes that DLL. This allows the DLL loader to search
+a dependency chain, and ensure that all required DLLs are loaded.
+
+@see TRomImageHeader
+*/
+class TDllRefTable
+	{
+public:
+
+    /**
+    Flags field.
+    */
+	TUint16 iFlags;
+	
+	
+	/**
+	The number of referenced DLLs in this list.
+	*/
+	TUint16 iNumberOfEntries;
+	
+	
+	/**
+	A set of pointers to the TRomImageHeader structures for each referenced DLL.
+	*/
+	TRomImageHeader* iEntry[1];
+	};
+
+#endif
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32/include/e32shbuf_priv.h	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,135 @@
+// Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32/include/e32shbuf_priv.h
+// Shareable Data Buffers
+
+/**
+	@file
+	@internalComponent
+	@prototype
+*/
+
+#ifndef E32SHBUF_PRIV_H
+#define E32SHBUF_PRIV_H
+
+
+#include <e32def.h>
+
+
+/**
+	Defines flags for TShPoolInfo.
+
+	These values specify the behaviour of the pool and its buffers.
+
+	@internalComponent
+	@prototype
+*/
+enum TShPoolCreateFlags
+	{
+	/**
+	The buffers in this pool are at least the size of an MMU page,
+	are aligned to an MMU page, and may be mapped in and out of a process's
+	address space independently.
+	*/
+	EShPoolPageAlignedBuffer	= 0x0001,
+
+	/**
+	The buffers in this pool do not have any size or alignment restrictions beyond
+	that specified by the pool creator.
+
+	The whole pool is always mapped into a process's address space.
+	*/
+	EShPoolNonPageAlignedBuffer = 0x0002,
+
+	/**
+	This pool maps onto device memory, not system RAM.
+	*/
+	EShPoolPhysicalMemoryPool	= 0x0004,
+
+	/**
+	The physical memory backing this pool is contiguous.
+	*/
+	EShPoolContiguous			= 0x0008,
+
+	/**
+	Each buffer will only ever be mapped into one process's address space at a time.
+
+	Requires EShPoolPageAlignedBuffer.
+	*/
+	EShPoolExclusiveAccess		= 0x0010,
+
+	/**
+	An unmapped page will be placed between each buffer.
+
+	Requires EShPoolPageAlignedBuffer.
+	*/
+	EShPoolGuardPages			= 0x0020,
+
+	/**
+	Set by automatic shrinking when it is unable to shrink the pool despite there
+	being enough free buffers available (usually due to fragmentation).  This prevents
+	the automatic shrinking code being continually called when it can't do anything.
+	*/
+	EShPoolSuppressShrink		= 0x80000000,
+	};
+
+
+/**
+	Specifies client flags.
+
+	@internalComponent
+	@prototype
+*/
+enum TShPoolClientFlags
+	{
+	/**
+	Buffers will be automatically mapped into this process's address space when a handle is
+	created for them.  Having this flag clear can be useful for a process that will function
+	as an intermediary, without requiring access to the data in the buffers.
+	*/
+	EShPoolAutoMapBuf		= 0x1000,
+
+	/**
+	Newly-allocated buffers will not be mapped into this process's address space.
+	*/
+	EShPoolNoMapBuf			= 0x2000,
+	};
+
+
+/**
+	Specifies the type of notification.  (A real enumeration, not bit flags.)
+
+	@internalComponent
+	@prototype
+*/
+enum TShPoolNotifyType
+	{
+	EShPoolLowSpace = 1,		// notifies when free buffers drop to a certain number
+	EShPoolFreeSpace = 2,		// notifies when free buffers rise to a certain number
+	};
+
+/**
+	Structure for passing base address and pointer of buffer
+
+	@internalComponent
+	@prototype
+*/
+struct SShBufBaseAndSize
+	{
+	TLinAddr iBase;
+	TUint    iSize;
+	};
+
+
+#endif	// E32SHBUF_PRIV_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32/include/e32shbufcmn.h	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,176 @@
+// Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32/include/e32shbufcmn.h
+// Shareable Data Buffers
+
+/**
+	@file
+	@publishedPartner
+	@prototype
+*/
+
+#ifndef E32SHBUFCMN_H
+#define E32SHBUFCMN_H
+
+#include <e32shbuf_priv.h>
+#include <e32def.h>
+
+/**
+	Defines values used to modify client behaviour when opening a pool or buffer in a new process.
+
+	@publishedPartner
+	@prototype
+*/
+enum TShPoolHandleFlags
+	{
+	/**
+	The buffers will be writeable in the process where this handle is used.
+	If not set, the buffers will be read-only.
+	*/
+	EShPoolWriteable		= 0x0001,
+
+	/**
+	The process will be able to allocate buffers from this pool.
+	If not set, the process will not be able to allocate buffers from this pool.
+	*/
+	EShPoolAllocate			= 0x0002,
+	};
+
+
+/**
+	Defines flags for RShBuf::Alloc() and DShPool::Alloc().
+
+	@see RShBuf::Alloc()
+	@see DShPool::Alloc()
+
+	@publishedPartner
+	@prototype
+*/
+enum TShPoolAllocFlags
+	{
+	/**
+	The thread is willing to wait for a pool grow if no buffer is immediately available.
+	If this is not set, the Alloc() will return immediately if no free buffer is available,
+	but the pool might be able to grow to create new buffers.
+	*/
+	EShPoolAllocCanWait = 0x0001,
+
+	/**
+	Do not automatically map the newly-allocated buffer into this process, if the pool is page-aligned.
+	(RShBuf::Alloc() only.)
+	*/
+	EShPoolAllocNoMap = 0x0002,
+	};
+
+
+/**
+	Defines the attributes of a pool.
+
+	@publishedPartner
+	@prototype
+*/
+class TShPoolInfo
+	{
+public:
+	IMPORT_C TShPoolInfo();
+
+	/**
+	Specifies the size of each buffer in the pool.
+	*/
+	TUint iBufSize;
+
+	/**
+	Specifies the initial number of buffers to be allocated to the pool.
+	*/
+	TUint iInitialBufs;
+
+	/**
+	Specifies the maximum number of buffers the pool can grow to.
+	*/
+	TUint iMaxBufs;
+
+	/**
+	This specifies when the pool grows.  If zero, the pool will not grow or shrink
+	automatically.
+  
+	This is the proportion of free buffers left in the pool at which it should be grown.
+	For example, if the ratio is 0.1, the pool will be grown when the number of free
+	buffers drops to 10%.
+
+	This value is expressed as a 32-bit fixed-point number, where the binary
+	point is defined to be between bits 7 and 8 (where the least-significant
+	bit is defined as bit 0).  (This format is also known as a Q8, or fx24.8
+	number, or alternatively as the value * 256.)  For the example given of 10%,
+	use the value 26.  It represents a value < 1 (i.e. must be < 256).  Calculations
+	are rounded down towards zero, but if calculating how many buffers to trigger
+	on gives 0, the grow will be triggered when 1 buffer is free.
+	*/
+	TUint iGrowTriggerRatio;
+
+	/**
+	This specifies the proportion by which to grow the pool each time it is grown.
+	If zero, the pool will not grow or shrink automatically.
+
+	It is expressed as a 32-bit fx24.8 fixed-point number, in the same way as
+	iGrowTriggerRatio.  Calculations are rounded down towards zero, but if calculating
+	how many buffers to grow by yields 0, then the pool will be grown by 1 buffer.
+	*/
+	TUint iGrowByRatio;
+
+	/**
+	The hysteresis value to ensure that the pool does not automatically shrink
+	immediately after is grows.
+
+	Automatic shrinking will only happen when there are (iGrowTriggerRatio +
+	iGrowByRatio) * iShrinkHysteresisRatio * (total buffers in the pool) free
+	buffers left in the pool.
+
+	The amount by which the pool is shrunk depends on iGrowByRatio: it is the operational
+	inverse, such that the pool would shrink down to the same number of buffers if shrunk
+	immediately after growing (although hysteresis normally prevents this).
+
+	For example, if iGrowByRatio is 10%, a pool of 100 buffers would grow to 110 buffers.
+	To shrink back to 100, a shrink ratio of 10/110 = 9% is required.  That is, if the
+	grow-by ration is G, the shrink-by ratio S is calculated as S = 1 - 1 / (1 + G).
+
+	iShrinkHysteresisRatio is a 32-bit fx24.8 fixed-point number in the same way as
+	iGrowTriggerRatio and iGrowByRatio.  It represents a value > 1 (i.e. must be > 256).
+
+	@see iGrowByRatio
+	*/
+	TUint iShrinkHysteresisRatio;
+
+	/**
+	Specifies the alignment for each buffer, as a shift count (log2 bytes).
+
+	For example, 9 means that each buffer is aligned on a 512-byte boundary.
+	*/
+	TUint iAlignment;
+
+	/**
+	Specifies flags for the pool, as bit values from TShPoolCreateFlags or-ed together.
+
+	@see TShPoolCreateFlags
+	*/
+	TUint iFlags;
+private:
+	TInt iSpare1;			// Reserved for future use
+	TInt iSpare2;
+	TInt iSpare3;
+	TInt iSpare4;
+	};
+
+
+#endif	// E32SHBUF_H
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32/include/e32std.h	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,5060 @@
+// Copyright (c) 1994-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32\include\e32std.h
+// 
+//
+
+#ifndef __E32STD_H__
+#define __E32STD_H__
+
+#ifdef __KERNEL_MODE__
+#error !! Including e32std.h in kernel code !!
+#endif
+
+#include <e32cmn.h>
+
+/**
+@publishedAll
+@released
+*/
+class TFunctor
+	{
+public:
+	IMPORT_C virtual void operator()() =0;
+	};
+
+/**
+@publishedAll
+@released
+
+Encapsulates a general call-back function.
+
+The class encapsulates:
+
+1. a pointer to a function which takes an argument of type TAny* and returns 
+   a TInt.
+
+2. a pointer which is passed to the function every time it is called.
+   The pointer can point to any object. It can also be NULL.
+
+The callback function can be a static function of a class,
+e.g. TInt X::Foo(TAny *) or it can be a function which is not a member of
+any class, e.g. TInt Foo(TAny *).
+
+When used with the CIdle and the CPeriodic classes, the callback function
+is intended to be called repeatedly; the encapsulated pointer is passed on
+each call. Typically, the pointer refers to an object which records the state
+of the task across each call. When used with CIdle, the callback function
+should also return a true (non-zero) value if it is intended to be called
+again, otherwise it should return a false (zero) value.
+
+@see CIdle
+@see CPeriodic
+*/
+class TCallBack
+	{
+public:
+	inline TCallBack();
+	inline TCallBack(TInt (*aFunction)(TAny* aPtr));
+	inline TCallBack(TInt (*aFunction)(TAny* aPtr),TAny* aPtr);
+	inline TInt CallBack() const;
+public:
+	
+	/**
+	A pointer to the callback function.
+	*/
+	TInt (*iFunction)(TAny* aPtr);
+	
+	
+	/**
+	A pointer that is passed to the callback function when
+	the function is called.
+	*/
+	TAny* iPtr;
+	};
+
+
+
+
+/**
+@publishedAll
+@released
+
+An object embedded within a class T so that objects of type T can form part 
+of a singly linked list.
+
+A link object encapsulates a pointer to the next link object in the list.
+
+@see TSglQue
+*/
+class TSglQueLink
+	{
+#if defined _DEBUG
+public:
+	inline TSglQueLink() : iNext(NULL)
+	/**
+	An explicitly coded default constructor that is only defined for DEBUG builds.
+	
+	It sets the pointer to the next link object to NULL.
+	
+	@see iNext
+	*/
+	{}
+#endif
+private:
+	IMPORT_C void Enque(TSglQueLink* aLink);
+public:
+	/**
+	A pointer to the next link object in the list.
+	*/
+	TSglQueLink* iNext;
+	friend class TSglQueBase;
+	};
+
+
+
+
+/**
+@publishedAll
+@released
+
+A base class that provides implementation for the link object of a doubly
+linked list.
+
+It also encapsulates pointers both to the next and the previous link 
+objects in the doubly linked list.
+
+The class is abstract and is not intended to be instantiated.
+
+@see TDblQueLink
+*/
+class TDblQueLinkBase
+	{
+public:
+	inline TDblQueLinkBase() : iNext(NULL)
+	/**
+	Default constructor.
+	
+	It sets the pointer to the next link object to NULL.
+	
+	@see iNext
+	*/
+	{}
+	IMPORT_C void Enque(TDblQueLinkBase* aLink);
+	IMPORT_C void AddBefore(TDblQueLinkBase* aLink);
+public:
+	/**
+	A pointer to the next link object in the list.
+	*/
+	TDblQueLinkBase* iNext;
+	
+	/**
+	A pointer to the previous link object in the list.
+	*/
+	TDblQueLinkBase* iPrev;
+	};
+
+
+
+
+/**
+@publishedAll
+@released
+
+An object embedded within a class T so that objects of type T can form part 
+of a doubly linked list.
+*/
+class TDblQueLink : public TDblQueLinkBase
+	{
+public:
+	IMPORT_C void Deque();
+	};
+
+
+
+
+/**
+@publishedAll
+@released
+
+An object embedded within a class T so that objects of type T can form part
+of an ordered doubly linked list.
+
+Objects are added to the doubly linked list in descending priority order.
+*/
+class TPriQueLink : public TDblQueLink
+	{
+public:
+	/**
+	The priority value.
+
+    Objects are added to the doubly linked list in descending order of this value.
+	*/
+	TInt iPriority;
+	};
+
+
+
+
+/**
+@publishedAll
+@released
+
+An object embedded within a class T so that objects of type T can form part 
+of a delta doubly linked list.
+*/
+class TDeltaQueLink : public TDblQueLinkBase
+	{
+public:
+	/**
+	The delta value.
+	*/
+	TInt iDelta;
+	};
+
+
+
+
+/**
+@publishedAll
+@released
+
+An object embedded within a class T so that objects of type T can form part 
+of a doubly linked list sorted by tick count.
+*/
+class TTickCountQueLink : public TDblQueLink
+	{
+public:
+	/**
+	The tick count.
+	*/
+	TUint iTickCount;
+	};
+
+
+
+
+/**
+@publishedAll
+@released
+
+A base class that provides implementation for the singly linked list header. 
+
+It also encapsulates the offset value of a link object.
+
+The class is abstract and is not intended to be instantiated.
+
+@see TSglQue
+*/
+class TSglQueBase
+	{
+public:
+	IMPORT_C TBool IsEmpty() const;
+	IMPORT_C void SetOffset(TInt aOffset);
+	IMPORT_C void Reset();
+protected:
+	IMPORT_C TSglQueBase();
+	IMPORT_C TSglQueBase(TInt aOffset);
+	IMPORT_C void DoAddFirst(TAny* aPtr);
+	IMPORT_C void DoAddLast(TAny* aPtr);
+	IMPORT_C void DoRemove(TAny* aPtr);
+protected:
+	/**
+	A pointer to the first element in the list.
+	*/
+	TSglQueLink* iHead;
+	
+	/**
+	A pointer to the last element in the list.
+	*/
+	TSglQueLink* iLast;
+	
+	/**
+	The offset of a component link object within elements that form the list.
+	*/
+	TInt iOffset;
+private:
+	TSglQueBase(const TSglQueBase& aQue);
+	TSglQueBase &operator=(const TSglQueBase& aQue);
+	friend class TSglQueIterBase;
+	};
+
+
+
+
+/**
+@publishedAll
+@released
+
+A base class that provides implementation for the doubly linked list header. 
+
+It also encapsulates the offset value of a link object.
+
+The class is abstract and is not intended to be instantiated.
+
+@see TDblQue
+*/
+class TDblQueBase
+	{
+public:
+	IMPORT_C TBool IsEmpty() const;
+	IMPORT_C void SetOffset(TInt aOffset);
+	IMPORT_C void Reset();
+protected:
+	IMPORT_C TDblQueBase();
+	IMPORT_C TDblQueBase(TInt aOffset);
+	IMPORT_C void DoAddFirst(TAny* aPtr);
+	IMPORT_C void DoAddLast(TAny* aPtr);
+	IMPORT_C void DoAddPriority(TAny* aPtr);
+	IMPORT_C void __DbgTestEmpty() const;
+protected:
+	/**
+	The head, or anchor point of the queue.
+	*/
+	TDblQueLink iHead;
+	
+	/**
+	The offset of a component link object within elements that form the list.
+	*/
+	TInt iOffset;
+private:
+	TDblQueBase(const TDblQueBase& aQue);
+	TDblQueBase& operator=(const TDblQueBase& aQue);
+	friend class TDblQueIterBase;
+	};
+
+
+
+
+/**
+@publishedAll
+@released
+
+A base class that provides implementation for the TDeltaQue template class.
+
+The class is abstract and is not intended to be instantiated.
+
+@see TDeltaQue
+*/
+class TDeltaQueBase : public TDblQueBase
+	{
+public:
+	IMPORT_C TBool CountDown();
+	IMPORT_C TBool CountDown(TInt aValue);
+	IMPORT_C TBool FirstDelta(TInt& aValue);
+	IMPORT_C void Reset();
+protected:
+	IMPORT_C TDeltaQueBase();
+	IMPORT_C TDeltaQueBase(TInt aOffset);
+	IMPORT_C void DoAddDelta(TAny* aPtr,TInt aDelta);
+	IMPORT_C void DoRemove(TAny* aPtr);
+	IMPORT_C TAny* DoRemoveFirst();
+protected:
+	/**
+	Pointer to the delta value in the first link element.
+	*/
+	TInt* iFirstDelta;
+	};
+
+
+
+
+/**
+@publishedAll
+@released
+
+A templated class that provides the behaviour for managing a singly linked 
+list.
+
+It also acts as the head of the list, maintaining the pointers into the list.
+
+The template parameter defines the type of element that forms the singly linked 
+list and is the class that acts as host to the link object.
+
+@see TSglQueLink
+*/
+template <class T>
+class TSglQue : public TSglQueBase
+	{
+public:
+	inline TSglQue();
+	inline explicit TSglQue(TInt aOffset);
+	inline void AddFirst(T& aRef);
+	inline void AddLast(T& aRef);
+	inline TBool IsFirst(const T* aPtr) const;
+	inline TBool IsLast(const T* aPtr) const;
+	inline T* First() const;
+	inline T* Last() const;
+	inline void Remove(T& aRef);
+	};
+
+
+
+
+/**
+@publishedAll
+@released
+
+A templated class that provides the behaviour for managing a doubly linked 
+list. 
+
+It also acts as the head of the list, maintaining the pointers into the list.
+
+The template parameter defines the type of element that forms the doubly linked 
+list and is the class that acts as host to the link object.
+
+@see TDblQueLink
+*/
+template <class T>
+class TDblQue : public TDblQueBase
+	{
+public:
+	inline TDblQue();
+	inline explicit TDblQue(TInt aOffset);
+	inline void AddFirst(T& aRef);
+	inline void AddLast(T& aRef);
+	inline TBool IsHead(const T* aPtr) const;
+	inline TBool IsFirst(const T* aPtr) const;
+	inline TBool IsLast(const T* aPtr) const;
+	inline T* First() const;
+	inline T* Last() const;
+	};
+
+
+
+
+/**
+@publishedAll
+@released
+
+A templated class that provides the behaviour for managing a doubly linked
+list in which the elements are added in descending priority order.
+
+Priority is defined by the value of the TPriQueLink::iPriority member of
+the link element.
+
+The template parameter defines the type of element that forms the doubly linked
+list and is the class that acts as host to the link object.
+
+@see TPriQueLink
+@see TPriQueLink::iPriority
+*/
+template <class T>
+class TPriQue : public TDblQueBase
+	{
+public:
+	inline TPriQue();
+	inline explicit TPriQue(TInt aOffset);
+	inline void Add(T& aRef);
+	inline TBool IsHead(const T* aPtr) const;
+	inline TBool IsFirst(const T* aPtr) const;
+	inline TBool IsLast(const T* aPtr) const;
+	inline T* First() const;
+	inline T* Last() const;
+	};
+
+
+
+
+/**
+@publishedAll
+@released
+
+A templated class that provides the behaviour for managing a doubly linked 
+list in which elements represent values which are increments, or deltas, on 
+the value represented by a preceding element.
+
+The list is ordered so that the head of the queue represents a nominal zero 
+point.
+
+The delta value of a new element represents its 'distance' from the nominal 
+zero point. The new element is added into the list, and the delta values of 
+adjacent elements (and of the new element, if necessary) are adjusted, so 
+that the sum of all deltas, up to and including the new element, is the same 
+as the new element's intended 'distance' from the nominal zero point.
+
+A common use for a list of this type is as a queue of timed events, where 
+the delta values represent the intervals between the events.
+
+The delta value is defined by the value of the TDeltaQueLink::iDelta member 
+of the link element.
+
+The template parameter defines the type of element that forms the doubly linked 
+list and is the class that acts as host to the link object.
+
+@see TDeltaQueLink
+@see TDeltaQueLink::iDelta
+*/
+template <class T>
+class TDeltaQue : public TDeltaQueBase
+	{
+public:
+	inline TDeltaQue();
+	inline explicit TDeltaQue(TInt aOffset);
+	inline void Add(T& aRef,TInt aDelta);
+	inline void Remove(T& aRef);
+	inline T* RemoveFirst();
+	};
+
+
+
+
+// Forward declaration
+class TTickCountQueLink;
+
+/**
+@internalComponent
+@released
+
+A class that provides the behaviour for managing a doubly linked list
+in which elements are added in order of the time until their tick count.
+
+A common use for a list of this type is as a queue of timed events, where 
+the tick counts are the expiry times of the events.
+
+The tick count is defined by the value of the TTickCountQueLink::iTickCount
+member of the link element.
+
+@see TTickCountQueLink
+@see TTickCountQueLink::iTickCount
+*/
+class TTickCountQue : public TDblQueBase
+	{
+public:
+	TTickCountQue();
+	void Add(TTickCountQueLink& aRef);
+	TTickCountQueLink* First() const;
+	TTickCountQueLink* RemoveFirst();
+	TTickCountQueLink* RemoveFirst(TUint aTickCount);
+	};
+
+
+
+
+/**
+@publishedAll
+@released
+
+A base class that provides implementation for the singly linked list iterator. 
+
+It also encapsulates a pointer to the current link link list element.
+
+The class is abstract and is not intended to be instantiated.
+*/
+class TSglQueIterBase
+	{
+public:
+	IMPORT_C void SetToFirst();
+protected:
+	IMPORT_C TSglQueIterBase(TSglQueBase& aQue);
+	IMPORT_C TAny* DoPostInc();
+	IMPORT_C TAny* DoCurrent();
+	IMPORT_C void DoSet(TAny* aLink);
+protected:
+	TInt iOffset;
+	TSglQueLink* iHead;
+	TSglQueLink* iNext;
+	};
+
+
+
+
+/**
+@publishedAll
+@released
+
+A templated class that provides the behaviour for iterating through a set of 
+singly linked list elements.
+
+The template parameter defines the type of element that forms the singly linked 
+list. The class defined in the template parameter contains the link object.
+*/
+template <class T>
+class TSglQueIter : public TSglQueIterBase
+	{
+public:
+	inline TSglQueIter(TSglQueBase& aQue);
+	inline void Set(T& aLink);
+	inline operator T*();
+	inline T* operator++(TInt);
+	};
+
+
+
+
+/**
+@publishedAll
+@released
+
+A base class that provides implementation for the doubly linked list iterator.
+
+It also encapsulates a pointer to the current link list element.
+
+The class is abstract and is not intended to be instantiated.
+*/
+class TDblQueIterBase
+	{
+public:
+	IMPORT_C void SetToFirst();
+	IMPORT_C void SetToLast();
+protected:
+	IMPORT_C TDblQueIterBase(TDblQueBase& aQue);
+	IMPORT_C TAny* DoPostInc();
+	IMPORT_C TAny* DoPostDec();
+	IMPORT_C TAny* DoCurrent();
+	IMPORT_C void DoSet(TAny* aLink);
+protected:
+	/**
+	The offset of a component link object within elements that form the list.
+	*/
+	TInt iOffset;
+	
+	/**
+	Pointer to the anchor for the list.
+	*/
+	TDblQueLinkBase* iHead;
+	
+	/**
+	Pointer to the current element.
+	*/
+	TDblQueLinkBase* iNext;
+	};
+
+
+
+
+/**
+@publishedAll
+@released
+
+A templated class that provides the behaviour for iterating through a set of 
+doubly linked list elements.
+
+The template parameter defines the type of element that forms the doubly linked 
+list. The class defined in the template parameter contains the link object.
+*/
+template <class T>
+class TDblQueIter : public TDblQueIterBase
+	{
+public:
+	inline TDblQueIter(TDblQueBase& aQue);
+	inline void Set(T& aLink);
+	inline operator T*();
+	inline T* operator++(TInt);
+	inline T* operator--(TInt);
+	};
+
+
+
+
+/**
+@publishedAll
+@released
+
+Governs the type of comparison to be made between descriptor keys or between 
+text keys.
+
+@see TKeyArrayFix
+@see TKeyArrayVar
+@see TKeyArrayPak
+*/
+enum TKeyCmpText
+	{
+	/**
+	For a Unicode build, this is the same as ECmpNormal16.
+	For a non-Unicode build, this is the same as ECmpNormal8.
+	
+	Using the build independent names (i.e. TPtrC, TPtr, TBufC, TBuf or TText) 
+	allows the compiler to chose the correct variant according to the build.
+	*/
+	ECmpNormal,
+	
+	
+	/**
+	For descriptor keys, the key is assumed to be the 8 bit variant, derived
+	from TDesc8. A simple comparison is done between the content of the
+	descriptors; the data is not folded and collation rules are not applied for
+	the purpose of the comparison.
+	
+	For text keys, the key is assumed to be the 8 bit variant, of type TText8. 
+	A normal comparison is done between the text data; the data is not folded 
+	and collation rules are not applied for the purpose of the comparison.
+	*/
+	ECmpNormal8,
+	
+	
+	/**
+	For descriptor keys, the key is assumed to be the 16 bit variant, derived
+	from TDesc16. A simple comparison is done between the content of the
+	descriptors; the data is not folded and collation rules are not applied for
+	the purpose of the comparison.
+	
+	For text keys, the key is assumed to be the 16 bit variant, of type
+	TText16. A normal comparison is done between the text data; the data is
+	not folded 	and collation rules are not applied for the purpose of the
+	comparison.
+	*/
+	ECmpNormal16,
+	
+	
+	/**
+	For a Unicode build, this is the same as EcmpFolded16.
+    For a non-Unicode build, this is the same as EcmpFolded8.
+
+    Using the build independent names (i.e. TPtrC, TPtr, TBufC, TBuf or TText)
+    allows the compiler to chose the correct variant according to the build. 
+	*/
+	ECmpFolded,
+	
+	
+	/**
+	For descriptor keys, the key is assumed to be the 8 bit variant,
+	derived from TDesc8. The descriptor contents are folded for the purpose
+	of the comparison.
+
+    For text keys, the key is assumed to be the 8 bit variant, of type
+    TText8. The text data is folded for the purpose of the comparison.
+	*/
+	ECmpFolded8,
+	
+	
+	/**
+	For descriptor keys, the key is assumed to be the 16 bit variant,
+	derived from TDesc16. The descriptor contents are folded for the purpose
+	of the comparison.
+
+    For text keys, the key is assumed to be the 16 bit variant, of type
+    TText16. The text data is folded for the purpose of the comparison.
+	*/
+	ECmpFolded16,
+	
+	
+	/**
+	For a Unicode build, this is the same as EcmpCollated16.
+    For a non-Unicode build, this is the same as EcmpCollated8.
+
+    Using the build independent names (i.e. TPtrC, TPtr, TBufC, TBuf or TText)
+    allows the compiler to chose the correct variant according to the build.
+	*/
+	ECmpCollated,
+	
+	
+	/**
+	For descriptor keys, the key is assumed to be the 8 bit variant,
+	derived from TDesc8. Collation rules are applied for the purpose of
+	the comparison.
+
+    For text keys, the key is assumed to be the 8 bit variant, of type 
+    TText8. Collation rules are applied for the purpose of the comparison.
+	*/
+	ECmpCollated8,
+	
+	
+	/**
+	For descriptor keys, the key is assumed to be the 16 bit variant,
+	derived from TDesc16. Collation rules are applied for the purpose of
+	the comparison.
+
+    For text keys, the key is assumed to be the 16 bit variant,
+    of type TText16. Collation rules are applied for the purpose of
+    the comparison.
+	*/
+	ECmpCollated16
+	};
+
+
+
+
+/**
+@publishedAll
+@released
+
+Governs the type of comparison to be made between numeric keys.
+
+@see TKeyArrayFix
+@see TKeyArrayVar
+@see TKeyArrayPak
+*/
+enum TKeyCmpNumeric
+	{
+	/**
+	The key is assumed to be of type TInt8.
+	*/
+	ECmpTInt8=((ECmpCollated16+1)<<1),
+	
+	
+	/**
+	The key is assumed to be of type TInt16.
+	*/
+	ECmpTInt16,
+	
+	
+	/**
+	The key is assumed to be of type TInt32.
+	*/
+	ECmpTInt32,
+	
+	
+	/**
+	The key is assumed to be of type TInt.
+	*/
+	ECmpTInt,
+	
+	
+	/**
+	The key is assumed to be of type TUint8.
+	*/
+	ECmpTUint8,
+	
+	
+	/**
+	The key is assumed to be of type TUint16.
+	*/
+	ECmpTUint16,
+	
+	
+	/**
+	The key is assumed to be of type TUint32.
+	*/
+	ECmpTUint32,
+	
+	
+	/**
+	The key is assumed to be of type TUint.
+	*/
+	ECmpTUint,
+	
+	
+	/**
+	The key is assumed to be of type TInt64.
+	*/
+	ECmpTInt64
+	};
+
+
+
+
+/**
+@publishedAll
+@released
+
+Defines the characteristics of a key used to access the elements of an array.
+
+The class is abstract and cannot be instantiated. A derived class must be 
+defined and implemented.
+
+The classes TKeyArrayFix, TKeyArrayVar and TKeyArrayPak, derived from TKey, 
+are already supplied to implement keys for the fixed length element, variable 
+length element and packed arrays.
+
+A derived class would normally be written to define the characteristics of 
+a key for a non standard array.
+
+@see TKeyArrayFix
+@see TKeyArrayVar
+@see TKeyArrayPak
+*/
+class TKey
+	{
+public:
+	inline void SetPtr(const TAny* aPtr);
+	IMPORT_C virtual TInt Compare(TInt aLeft,TInt aRight) const;
+	IMPORT_C virtual TAny* At(TInt anIndex) const;
+protected:
+	IMPORT_C TKey();
+	IMPORT_C TKey(TInt aOffset,TKeyCmpText aType);
+	IMPORT_C TKey(TInt aOffset,TKeyCmpText aType,TInt aLength);
+	IMPORT_C TKey(TInt aOffset,TKeyCmpNumeric aType);
+protected:
+	TInt iKeyOffset;
+	TInt iKeyLength;
+	TInt iCmpType;
+	const TAny* iPtr;
+	};
+
+/**
+@publishedAll
+@released
+
+Defines the basic behaviour for swapping two elements of an array.
+
+The class is abstract. A derived class must be defined and implemented to 
+use the functionality.
+
+A derived class can define how to swap two elements of an array. In practice, 
+this means providing an implementation for the virtual function Swap().
+
+To support this, the derived class is also likely to need a pointer to the 
+array itself and suitable constructors and/or other member functions to set 
+such a pointer.
+*/
+class TSwap
+	{
+public:
+	IMPORT_C TSwap();
+	IMPORT_C virtual void Swap(TInt aLeft,TInt aRight) const;
+	};
+
+
+
+
+/**
+@publishedAll
+@released
+
+Folds a specified character and provides functions to fold additional
+characters after construction of the object.
+
+Folding converts the character to a form which can be used in tolerant
+comparisons without control over the operations performed. Tolerant comparisons
+are those which ignore character differences like case and accents. 
+
+Note that folding is locale-independent behaviour. It is also important to 
+note that there can be no guarantee that folding is in any way culturally 
+appropriate, and should not be used for matching characters in
+natural language.
+
+@see User::Fold
+*/
+class TCharF : public TChar
+	{
+public:
+	inline TCharF(TUint aChar);
+	inline TCharF(const TChar& aChar);
+	inline TCharF& operator=(TUint aChar);
+	inline TCharF& operator=(const TChar& aChar);
+	};
+
+
+
+
+/**
+@publishedAll
+@released
+
+Converts a specified character to lower case and provides functions to convert 
+additional characters after construction of the object.
+*/
+class TCharLC : public TChar
+	{
+public:
+	inline TCharLC(TUint aChar);
+	inline TCharLC(const TChar& aChar);
+	inline TCharLC& operator=(TUint aChar);
+	inline TCharLC& operator=(const TChar& aChar);
+	};
+
+
+
+
+/**
+@publishedAll
+@released
+
+Converts a specified character to upper case and provides functions to convert 
+additional characters after construction of the object.
+*/
+class TCharUC : public TChar
+	{
+public:
+	inline TCharUC(TUint aChar);
+	inline TCharUC(const TChar& aChar);
+	inline TCharUC& operator=(TUint aChar);
+	inline TCharUC& operator=(const TChar& aChar);
+	};
+
+
+
+/**
+@publishedAll
+@released
+
+Defines the character representation of a real number type such
+as a TReal or a TRealX.
+
+An object of this type is used by functions that convert real values to
+character format, for example, the descriptor functions:
+Num(), AppendNum() and Format().
+
+There are three constructors for constructing a suitable object.
+The data members of the class, however, are public and can be
+explicitly set after construction.
+*/
+class TRealFormat
+	{
+public:
+	IMPORT_C TRealFormat();
+	IMPORT_C TRealFormat(TInt aWidth);
+	IMPORT_C TRealFormat(TInt aWidth,TInt aDecimalPlaces);
+public:
+    /**
+    Governs the format of the character representation of the real number.
+
+    This is set to one of the defined format types.
+
+    One or more of the defined format flags can subsequently be ORed into this member.
+    
+    @see KRealFormatFixed
+    @see KRealFormatExponent
+    @see KRealFormatGeneral
+    @see KRealFormatNoExponent
+    @see KRealFormatCalculator
+    @see KExtraSpaceForSign
+    @see KAllowThreeDigitExp
+    @see KDoNotUseTriads
+    @see KGeneralLimit
+    @see KUseSigFigs
+    */
+	TInt iType;
+	
+	
+	/**
+	Defines the maximum number of characters required to represent the number.
+	*/
+	TInt iWidth;
+	
+	
+	/**
+	Defines either the number of characters to be used to represent the decimal
+	portion of the number, or the maximum number of significant digits in
+	the character representation of the number.
+
+    The interpretation depends on the chosen format as defined by iType.
+    
+	@see TRealFormat::iType
+	*/
+	TInt iPlaces;
+	
+	
+	/**
+	Defines the character to be used to separate the integer portion of
+	a number representation from its decimal portion.
+
+    In general, the character used for this purpose is a matter of local
+    convention. The TLocale::DecimalSeparator() function can supply the
+    desired character.
+
+    @see TLocale
+	*/
+	TChar iPoint;
+	
+	
+	/**
+	Defines the character to be used to delimit groups of three digits in
+	the integer part of the number.
+
+    In general, the character used for this purpose is a matter of local
+    convention. The TLocale::ThousandsSeparator() function can supply the
+    desired character.
+
+    @see TLocale
+	*/
+	TChar iTriad;
+	
+	
+	/**
+	Defines the threshold number of digits above which triad separation is to
+	occur. A value of zero disables triad separation and no triad separation
+	character (i.e. the character held in iTriad) is inserted into the
+	resulting character representation regardless of the number of characters.
+
+    For example, a value of 1 causes the number 1000 to be represented by the
+    characters "1,000" whereas a value of 4 causes the same number to be
+    represented by the characters "1000" (This assumes the ‘,’ triad separation
+    character).
+
+    Note that no triad separation occurs if the flag KDoNotUseTriads is set in
+    the iType data member.
+
+	@see TRealFormat::iTriad
+	@see KDoNotUseTriads
+	*/
+	TInt iTriLen;
+	};
+
+
+
+
+/**
+@publishedAll
+@released
+
+Defines the extraction mark used by the TLex8 class to indicate the current 
+lexical element being analysed.
+
+In practice, objects of this type are accessed through the TLexMark typedef.
+
+@see TLexMark
+@see TLex8
+*/
+class TLexMark8
+	{
+public:
+	inline TLexMark8();
+private:
+	inline TLexMark8(const TUint8* aString);
+	const TUint8* iPtr;
+	friend class TLex8;
+	__DECLARE_TEST;
+	};
+
+
+
+
+class TRealX;
+/**
+@publishedAll
+@released
+
+Provides general string-parsing functions suitable for numeric format
+conversions and syntactical-element parsing.
+
+The class is the 8-bit variant for non-Unicode strings and 8-bit wide
+characters.
+
+An instance of this class stores a string, maintaining an extraction mark 
+to indicate the current lexical element being analysed and a pointer to the 
+next character to be examined.
+
+Objects of this type are normally accessed through the build independent type 
+TLex.
+
+@see TLex
+*/
+class TLex8
+	{
+public:
+	IMPORT_C TLex8();
+	inline TLex8(const TUint8* aString);
+	inline TLex8(const TDesC8& aDes);
+	inline TLex8& operator=(const TUint8* aString);
+	inline TLex8& operator=(const TDesC8& aDes);
+	inline TBool Eos() const;
+	inline void Mark(TLexMark8& aMark) const;
+	inline void Mark();
+	IMPORT_C void Inc();
+	IMPORT_C void Inc(TInt aNumber);
+	IMPORT_C TChar Get();
+	IMPORT_C TChar Peek() const;
+	IMPORT_C void UnGet();
+	inline void UnGetToMark();
+	IMPORT_C void UnGetToMark(const TLexMark8 aMark);
+	IMPORT_C void SkipSpace();
+	inline void SkipAndMark(TInt aNumber);
+	IMPORT_C void SkipAndMark(TInt aNumber, TLexMark8& aMark);
+	inline void SkipSpaceAndMark();
+	IMPORT_C void SkipSpaceAndMark(TLexMark8& aMark);
+	IMPORT_C void SkipCharacters();
+	inline TInt TokenLength() const;
+	IMPORT_C TInt TokenLength(const TLexMark8 aMark) const;
+	IMPORT_C TPtrC8 MarkedToken() const;
+	IMPORT_C TPtrC8 MarkedToken(const TLexMark8 aMark) const;
+	IMPORT_C TPtrC8 NextToken();
+	IMPORT_C TPtrC8 Remainder() const;
+	IMPORT_C TPtrC8 RemainderFromMark() const;
+	IMPORT_C TPtrC8 RemainderFromMark(const TLexMark8 aMark) const;
+	IMPORT_C TInt Offset() const;
+	inline TInt MarkedOffset() const;
+	IMPORT_C TInt MarkedOffset(const TLexMark8 aMark) const;
+	IMPORT_C TInt Val(TInt8& aVal);
+	IMPORT_C TInt Val(TInt16& aVal);
+	IMPORT_C TInt Val(TInt32& aVal);
+	IMPORT_C TInt Val(TInt64& aVal);
+	inline TInt Val(TInt& aVal);
+	IMPORT_C TInt Val(TUint8& aVal,TRadix aRadix);
+	IMPORT_C TInt Val(TUint16& aVal,TRadix aRadix);
+	IMPORT_C TInt Val(TUint32& aVal,TRadix aRadix);
+	IMPORT_C TInt Val(TInt64& aVal, TRadix aRadix);
+	inline TInt Val(TUint& aVal,TRadix aRadix=EDecimal);
+	IMPORT_C TInt BoundedVal(TInt32& aVal,TInt aLimit);
+	IMPORT_C TInt BoundedVal(TInt64& aVal, const TInt64& aLimit);
+	IMPORT_C TInt BoundedVal(TUint32& aVal,TRadix aRadix,TUint aLimit);
+	IMPORT_C TInt BoundedVal(TInt64& aVal, TRadix aRadix, const TInt64& aLimit);
+	IMPORT_C TInt Val(TReal32& aVal);
+	IMPORT_C TInt Val(TReal32& aVal,TChar aPoint);
+	IMPORT_C TInt Val(TReal64& aVal);
+	IMPORT_C TInt Val(TReal64& aVal,TChar aPoint);
+	inline void Assign(const TLex8& aLex);
+	IMPORT_C void Assign(const TUint8* aString);
+	IMPORT_C void Assign(const TDesC8& aDes);
+	TInt Val(TRealX& aVal);
+	TInt Val(TRealX& aVal, TChar aPoint);
+
+	/** @deprecated Use BoundedVal(TInt32& aVal,TInt aLimit) */
+	inline TInt Val(TInt32& aVal,TInt aLimit) { return BoundedVal(aVal,aLimit); };
+
+	/** @deprecated Use BoundedVal(TInt64& aVal,const TInt64& aLimit) */
+	inline TInt Val(TInt64& aVal,const TInt64& aLimit) { return BoundedVal(aVal,aLimit); };
+
+	/** @deprecated Use BoundedVal(TUint32& aVal,TRadix aRadix,TUint aLimit) */
+	inline TInt Val(TUint32& aVal,TRadix aRadix,TUint aLimit) { return BoundedVal(aVal,aRadix,aLimit); };
+
+	/** @deprecated Use BoundedVal(TInt64& aVal,TRadix aRadix,const TInt64& aLimit) */
+	inline TInt Val(TInt64& aVal,TRadix aRadix,const TInt64& aLimit) { return BoundedVal(aVal,aRadix,aLimit); };
+private:
+	void Scndig(TInt& aSig,TInt& aExp,TInt64& aDl);
+	void ScndigAfterPoint(TInt& aSig,TInt64& aDl);
+	void ValidateMark(const TLexMark8 aMark) const;
+private:
+	const TUint8* iNext;
+	const TUint8* iBuf;
+	const TUint8* iEnd;
+	TLexMark8 iMark;
+	__DECLARE_TEST;
+	};
+
+
+
+
+/**
+@publishedAll
+@released
+
+Defines the extraction mark used by the TLex16 class to indicate the current 
+lexical element being analysed.
+
+In practice, objects of this type are accessed through the TLexMark typedef.
+
+@see TLexMark
+@see TLex16
+*/
+class TLexMark16
+	{
+public:
+	inline TLexMark16();
+private:
+	inline TLexMark16(const TUint16* aString);
+	const TUint16* iPtr;
+	friend class TLex16;	
+	__DECLARE_TEST;
+	};
+
+
+
+
+/**
+@publishedAll
+@released
+
+Provides general string-parsing functions suitable for numeric format
+conversions and syntactical-element parsing. 
+
+The class is the 16-bit variant for Unicode strings and 16-bit wide
+characters.
+
+An instance of this class stores a string, maintaining an extraction mark 
+to indicate the current lexical element being analysed and a pointer to the 
+next character to be examined.
+
+Objects of this type are normally accessed through the build independent type 
+TLex.
+
+@see TLex
+*/
+class TLex16
+	{
+public:
+	IMPORT_C TLex16();
+	inline TLex16(const TUint16* aString);
+	inline TLex16(const TDesC16& aDes);
+	inline TLex16& operator=(const TUint16* aString);
+	inline TLex16& operator=(const TDesC16& aDes);
+	inline TBool Eos() const;
+	inline void Mark();
+	inline void Mark(TLexMark16& aMark) const;
+	IMPORT_C void Inc();
+	IMPORT_C void Inc(TInt aNumber);
+	IMPORT_C TChar Get();
+	IMPORT_C TChar Peek() const;
+	IMPORT_C void UnGet();
+	inline void UnGetToMark();
+	IMPORT_C void UnGetToMark(const TLexMark16 aMark);
+	IMPORT_C void SkipSpace();
+	inline void SkipAndMark(TInt aNumber);
+	IMPORT_C void SkipAndMark(TInt aNumber, TLexMark16& aMark);
+	IMPORT_C void SkipSpaceAndMark(TLexMark16& aMark);
+	inline void SkipSpaceAndMark();
+	IMPORT_C void SkipCharacters();
+	inline TInt TokenLength() const;
+	IMPORT_C TInt TokenLength(const TLexMark16 aMark) const;
+	IMPORT_C TPtrC16 MarkedToken() const;
+	IMPORT_C TPtrC16 MarkedToken(const TLexMark16 aMark) const;
+	IMPORT_C TPtrC16 NextToken();
+	IMPORT_C TPtrC16 Remainder() const;
+	IMPORT_C TPtrC16 RemainderFromMark() const;
+	IMPORT_C TPtrC16 RemainderFromMark(const TLexMark16 aMark) const;
+	IMPORT_C TInt Offset() const;
+	inline TInt MarkedOffset() const;
+	IMPORT_C TInt MarkedOffset(const TLexMark16 aMark) const;
+	IMPORT_C TInt Val(TInt8& aVal);
+	IMPORT_C TInt Val(TInt16& aVal);
+	IMPORT_C TInt Val(TInt32& aVal);
+	IMPORT_C TInt Val(TInt64& aVal);
+	inline TInt Val(TInt& aVal);
+	IMPORT_C TInt Val(TUint8& aVal,TRadix aRadix);
+	IMPORT_C TInt Val(TUint16& aVal,TRadix aRadix);
+	IMPORT_C TInt Val(TUint32& aVal,TRadix aRadix);
+	IMPORT_C TInt Val(TInt64& aVal, TRadix aRadix);
+//	inline TInt Val(TInt64& aVal, TRadix aRadix) {return Val(aVal,aRadix);}
+	inline TInt Val(TUint& aVal,TRadix aRadix=EDecimal);
+	IMPORT_C TInt BoundedVal(TInt32& aVal,TInt aLimit);
+	IMPORT_C TInt BoundedVal(TInt64& aVal, const TInt64& aLimit);
+	IMPORT_C TInt BoundedVal(TUint32& aVal,TRadix aRadix,TUint aLimit);
+	IMPORT_C TInt BoundedVal(TInt64& aVal, TRadix aRadix, const TInt64& aLimit);
+	IMPORT_C TInt Val(TReal32& aVal);
+	IMPORT_C TInt Val(TReal32& aVal,TChar aPoint);
+	IMPORT_C TInt Val(TReal64& aVal);
+	IMPORT_C TInt Val(TReal64& aVal,TChar aPoint);
+	inline void Assign(const TLex16& aLex);
+	IMPORT_C void Assign(const TUint16* aString);
+	IMPORT_C void Assign(const TDesC16& aDes);		
+	TInt Val(TRealX& aVal);
+	TInt Val(TRealX& aVal, TChar aPoint);
+
+	/** @deprecated Use BoundedVal(TInt32& aVal,TInt aLimit) */
+	inline TInt Val(TInt32& aVal,TInt aLimit) { return BoundedVal(aVal,aLimit); };
+
+	/** @deprecated Use BoundedVal(TInt64& aVal,const TInt64& aLimit) */
+	inline TInt Val(TInt64& aVal,const TInt64& aLimit) { return BoundedVal(aVal,aLimit); };
+
+	/** @deprecated Use BoundedVal(TUint32& aVal,TRadix aRadix,TUint aLimit) */
+	inline TInt Val(TUint32& aVal,TRadix aRadix,TUint aLimit) { return BoundedVal(aVal,aRadix,aLimit); };
+
+	/** @deprecated Use BoundedVal(TInt64& aVal,TRadix aRadix,const TInt64& aLimit) */
+	inline TInt Val(TInt64& aVal,TRadix aRadix,const TInt64& aLimit) { return BoundedVal(aVal,aRadix,aLimit); };
+private:
+	void Scndig(TInt& aSig,TInt& aExp,TInt64& aDl);
+	void ValidateMark(const TLexMark16 aMark) const;
+private:
+	const TUint16* iNext;
+	const TUint16* iBuf;
+	const TUint16* iEnd;
+	TLexMark16 iMark;
+	__DECLARE_TEST;
+	};
+
+
+
+
+#if defined(_UNICODE)
+/**
+@publishedAll
+@released
+
+Provides access to general string-parsing functions suitable for numeric format 
+conversions and syntactical-element parsing.
+
+It maps directly to either a TLex16 for a Unicode build or a TLex8 for a non-Unicode 
+build.
+
+The build independent type should always be used unless an explicit 16 bit 
+or 8 bit build variant is required.
+
+@see TLex16
+@see TLex8
+*/
+typedef TLex16 TLex;
+
+
+
+
+/**
+@publishedAll
+@released
+
+Defines the extraction mark used by the TLex classes to indicate the current 
+lexical element being analysed. 
+
+It maps directly to either a TLexMark16 for a Unicode build or a TLexMark8 
+for a non-Unicode build.
+
+The build independent type should always be used unless an explicit 16 bit 
+or 8 bit build variant is required.
+*/
+typedef TLexMark16 TLexMark;
+
+
+
+
+#else
+
+
+
+/**
+@publishedAll
+@released
+
+Provides access to general string-parsing functions suitable for numeric format 
+conversions and syntactical-element parsing.
+
+It maps directly to either a TLex16 for a Unicode build or a TLex8 for a non-Unicode 
+build.
+
+The build independent type should always be used unless an explicit 16 bit 
+or 8 bit build variant is required.
+
+@see TLex16
+@see TLex8
+*/
+typedef TLex8 TLex;
+
+
+
+
+/**
+@publishedAll
+@released
+
+Defines the extraction mark used by the TLex classes to indicate the current 
+lexical element being analysed. 
+
+It maps directly to either a TLexMark16 for a Unicode build or a TLexMark8 
+for a non-Unicode build.
+
+The build independent type should always be used unless an explicit 16 bit 
+or 8 bit build variant is required.
+*/
+typedef TLexMark8 TLexMark;
+#endif
+
+
+
+
+/**
+@publishedAll
+@released
+
+Packages a Uid type together with a checksum.
+
+@see TUidType
+*/
+class TCheckedUid
+	{
+public:
+	IMPORT_C TCheckedUid();
+	IMPORT_C TCheckedUid(const TUidType& aUidType);
+	IMPORT_C TCheckedUid(const TDesC8& aPtr);
+	IMPORT_C void Set(const TUidType& aUidType);
+	IMPORT_C void Set(const TDesC8& aPtr);
+	IMPORT_C TPtrC8 Des() const;
+	inline const TUidType& UidType() const;
+protected:
+	IMPORT_C TUint Check() const;
+private:
+	TUidType iType;
+	TUint iCheck;
+	};
+
+
+
+
+/**
+@publishedAll
+@released
+
+A date and time object in which the individual components are accessible in
+human-readable form.
+
+The individual components are: year, month, day, hour, minute,
+second and microsecond.
+
+These components are stored as integers and all except the year are checked for
+validity when a TDateTime is constructed or assigned new values.
+
+This class only supports getting and setting the entire date/time or any component 
+of it. It does not support adding or subtracting intervals to or from a time. 
+For functions which manipulate times, use class TTime.
+
+@see TTime
+*/
+class TDateTime
+	{
+public:
+	inline TDateTime();
+	IMPORT_C TDateTime(TInt aYear,TMonth aMonth,TInt aDay,TInt aHour,TInt aMinute, TInt aSecond,TInt aMicroSecond);
+	IMPORT_C TInt Set(TInt aYear,TMonth aMonth,TInt aDay,TInt aHour,TInt aMinute, TInt aSecond,TInt aMicroSecond);
+	IMPORT_C TInt SetYear(TInt aYear);
+	IMPORT_C TInt SetYearLeapCheck(TInt aYear);
+	IMPORT_C TInt SetMonth(TMonth aMonth);
+	IMPORT_C TInt SetDay(TInt aDay);
+	IMPORT_C TInt SetHour(TInt aHour);
+	IMPORT_C TInt SetMinute(TInt aMinute);
+	IMPORT_C TInt SetSecond(TInt aSecond);
+	IMPORT_C TInt SetMicroSecond(TInt aMicroSecond);
+	inline TInt Year() const;
+	inline TMonth Month() const;
+	inline TInt Day() const;
+	inline TInt Hour() const;
+	inline TInt Minute() const;
+	inline TInt Second() const;
+	inline TInt MicroSecond() const;
+private:
+	TInt iYear;
+	TMonth iMonth;
+	TInt iDay;
+	TInt iHour;
+	TInt iMinute;
+	TInt iSecond;
+	TInt iMicroSecond;
+	};
+
+
+
+
+/**
+@publishedAll
+@released
+
+Represents a time interval of a millionth of a second stored as
+a 64-bit integer. 
+
+It supports the initialisation, setting and getting of an interval and provides
+standard comparison operations. Objects of this class can be added to and
+subtracted from TTime objects.
+
+@see TTime
+*/
+class TTimeIntervalMicroSeconds
+	{
+public:
+	inline TTimeIntervalMicroSeconds();
+	inline TTimeIntervalMicroSeconds(const TInt64& aInterval);
+	inline TTimeIntervalMicroSeconds& operator=(const TInt64& aInterval);
+	inline TBool operator==(const TTimeIntervalMicroSeconds& aInterval) const;
+	inline TBool operator!=(const TTimeIntervalMicroSeconds& aInterval) const;
+	inline TBool operator>=(const TTimeIntervalMicroSeconds& aInterval) const;
+	inline TBool operator<=(const TTimeIntervalMicroSeconds& aInterval) const;
+	inline TBool operator>(const TTimeIntervalMicroSeconds& aInterval) const;
+	inline TBool operator<(const TTimeIntervalMicroSeconds& aInterval) const;
+	inline const TInt64& Int64() const;
+private:
+	TInt64 iInterval;
+	};
+
+
+
+
+/**
+@publishedAll
+@released
+
+Provides a base class for all time interval classes using
+a 32-bit representation. 
+
+It supports retrieving the interval and provides various operations for
+comparing intervals. Its concrete derived classes can be added to and
+subtracted from a TTime.
+
+The comparison operators simply compare the integer representations of the 
+two intervals. They do not take account of different time interval units. 
+So, for example, when comparing for equality an interval of three hours with 
+an interval of three days, the result is true.
+
+@see TTime
+*/
+class TTimeIntervalBase
+	{
+public:
+	inline TBool operator==(TTimeIntervalBase aInterval) const;
+	inline TBool operator!=(TTimeIntervalBase aInterval) const;
+	inline TBool operator>=(TTimeIntervalBase aInterval) const;
+	inline TBool operator<=(TTimeIntervalBase aInterval) const;
+	inline TBool operator>(TTimeIntervalBase aInterval) const;
+	inline TBool operator<(TTimeIntervalBase aInterval) const;
+	inline TInt Int() const;
+protected:
+	inline TTimeIntervalBase();
+	inline TTimeIntervalBase(TInt aInterval);
+protected:
+	TInt iInterval;
+	};
+
+
+
+
+/**
+@publishedAll
+@released
+
+Represents a microsecond time interval stored in 32 rather than 64 bits.
+
+Its range is +-2147483647, which is +-35 minutes, 47 seconds. Comparison and 
+interval retrieval functions are provided by the base class TTimeIntervalBase.
+*/
+class TTimeIntervalMicroSeconds32 : public TTimeIntervalBase
+	{
+public:
+	inline TTimeIntervalMicroSeconds32();
+	inline TTimeIntervalMicroSeconds32(TInt aInterval);
+	inline TTimeIntervalMicroSeconds32& operator=(TInt aInterval);
+	};
+
+
+
+
+/**
+@publishedAll
+@released
+
+Represents a time interval in seconds.
+
+Comparison and interval retrieval functions 
+are provided by the base class TTimeIntervalBase.
+
+The range of values which it can represent is +-2147483647, which is equal to
++-24855 days (approximately 68 years).
+*/
+class TTimeIntervalSeconds : public TTimeIntervalBase
+	{
+public:
+	inline TTimeIntervalSeconds();
+	inline TTimeIntervalSeconds(TInt aInterval);
+	inline TTimeIntervalSeconds& operator=(TInt aInterval);
+	};
+
+
+
+
+/**
+@publishedAll
+@released
+
+Represents a time interval in minutes.
+
+Comparison and interval retrieval functions 
+are provided by the base class TTimeIntervalBase.
+*/
+class TTimeIntervalMinutes : public TTimeIntervalBase
+	{
+public:
+	inline TTimeIntervalMinutes();
+	inline TTimeIntervalMinutes(TInt aInterval);
+	inline TTimeIntervalMinutes& operator=(TInt aInterval);
+	};
+
+
+
+
+/**
+@publishedAll
+@released
+
+Represents a time interval in hours.
+
+Comparison and interval retrieval functions 
+are provided by the base class TTimeIntervalBase.
+*/
+class TTimeIntervalHours : public TTimeIntervalBase
+	{
+public:
+	inline TTimeIntervalHours();
+	inline TTimeIntervalHours(TInt aInterval);
+	inline TTimeIntervalHours& operator=(TInt aInterval);
+	};
+
+
+
+
+/**
+@publishedAll
+@released
+
+Represents a time interval in days.
+
+Comparison and interval retrieval functions 
+are provided by the base class TTimeIntervalBase.
+*/
+class TTimeIntervalDays : public TTimeIntervalBase
+	{
+public:
+	inline TTimeIntervalDays();
+	inline TTimeIntervalDays(TInt aInterval);
+	inline TTimeIntervalDays& operator=(TInt aInterval);
+	};
+
+
+
+
+/**
+@publishedAll
+@released
+
+Represents a time interval in months.
+
+Comparison and interval retrieval functions 
+are provided by the base class TTimeIntervalBase.
+*/
+class TTimeIntervalMonths : public TTimeIntervalBase
+	{
+public:
+	inline TTimeIntervalMonths();
+	inline TTimeIntervalMonths(TInt aInterval);
+	inline TTimeIntervalMonths& operator=(TInt aInterval);
+	};
+
+
+
+
+/**
+@publishedAll
+@released
+
+Represents a time interval in years.
+
+Comparison and interval retrieval functions 
+are provided by the base class TTimeIntervalBase.
+*/
+class TTimeIntervalYears : public TTimeIntervalBase
+	{
+public:
+	inline TTimeIntervalYears();
+	inline TTimeIntervalYears(TInt aInterval);
+	inline TTimeIntervalYears& operator=(TInt aInterval);
+	};
+	
+	
+	
+/**
+@publishedAll
+@released
+
+An enumeration one or both of whose enumerator values may be returned
+by TTime::Parse().
+
+@see TTime::Parse
+*/
+enum {
+     /**
+     Indicates that a time is present.
+     
+     @see TTime::Parse
+     */
+     EParseTimePresent=0x1,
+     /**
+     Indicates that a date is present.
+     
+     @see TTime::Parse
+     */
+     EParseDatePresent=0x2
+     };
+
+
+
+class TLocale;
+/**
+@publishedAll
+@released
+
+Stores and manipulates the date and time. 
+
+It represents a date and time as a number of microseconds since midnight, 
+January 1st, 0 AD nominal Gregorian. BC dates are represented by negative 
+TTime values. A TTime object may be constructed from a TInt64, a TDateTime 
+a string literal, or by default, which initialises the time to an arbitrary 
+value. To access human-readable time information, the TTime may be converted 
+from a TInt64 into a TDateTime, which represents the date and time as seven 
+numeric fields and provides functions to extract these fields. Alternatively, 
+to display the time as text, the time may be formatted and placed into a
+descriptor using a variety of formatting commands and which may or may not
+honour the system's locale settings. The conversion between time and text may
+be performed the other way around, so that a descriptor can be parsed and
+converted into a TTime value.
+
+In addition to setting and getting the date and time and converting between 
+text and time, TTime provides functions to get intervals between times and 
+standard comparison and arithmetic operators which enable time intervals to 
+be added or subtracted to or from the time.
+
+@see TInt64
+@see TDateTime
+*/
+class TTime
+	{
+public:
+	inline TTime();
+	inline TTime(const TInt64& aTime);
+	IMPORT_C TTime(const TDesC& aString);
+	IMPORT_C TTime(const TDateTime& aDateTime);
+	inline TTime& operator=(const TInt64& aTime);
+	IMPORT_C TTime& operator=(const TDateTime& aDateTime);
+	IMPORT_C void HomeTime();
+	IMPORT_C void UniversalTime();
+	IMPORT_C TInt Set(const TDesC& aString);
+	IMPORT_C TInt HomeTimeSecure();
+	IMPORT_C TInt UniversalTimeSecure();
+
+	IMPORT_C TDateTime DateTime() const;
+	IMPORT_C TTimeIntervalMicroSeconds MicroSecondsFrom(TTime aTime) const;
+	IMPORT_C TInt SecondsFrom(TTime aTime,TTimeIntervalSeconds& aInterval) const;
+	IMPORT_C TInt MinutesFrom(TTime aTime,TTimeIntervalMinutes& aInterval) const;
+	IMPORT_C TInt HoursFrom(TTime aTime,TTimeIntervalHours& aInterval) const;
+	IMPORT_C TTimeIntervalDays DaysFrom(TTime aTime) const;
+	IMPORT_C TTimeIntervalMonths MonthsFrom(TTime aTime) const;
+	IMPORT_C TTimeIntervalYears YearsFrom(TTime aTime) const;
+
+	IMPORT_C TInt DaysInMonth() const;
+	IMPORT_C TDay DayNoInWeek() const;
+	IMPORT_C TInt DayNoInMonth() const;
+	IMPORT_C TInt DayNoInYear() const;
+	IMPORT_C TInt DayNoInYear(TTime aStartDate) const;
+	IMPORT_C TInt WeekNoInYear() const;
+	IMPORT_C TInt WeekNoInYear(TTime aStartDate) const;
+	IMPORT_C TInt WeekNoInYear(TFirstWeekRule aRule) const;
+	IMPORT_C TInt WeekNoInYear(TTime aStartDate,TFirstWeekRule aRule) const;
+	IMPORT_C void FormatL(TDes& aDes,const TDesC& aFormat) const;
+	IMPORT_C void FormatL(TDes& aDes,const TDesC& aFormat,const TLocale& aLocale) const;
+	IMPORT_C void RoundUpToNextMinute();
+	IMPORT_C TInt Parse(const TDesC& aDes,TInt aCenturyOffset=0);
+
+	IMPORT_C TTime operator+(TTimeIntervalYears aYear) const;
+	IMPORT_C TTime operator+(TTimeIntervalMonths aMonth) const;
+	IMPORT_C TTime operator+(TTimeIntervalDays aDay) const;
+	IMPORT_C TTime operator+(TTimeIntervalHours aHour) const;
+	IMPORT_C TTime operator+(TTimeIntervalMinutes aMinute) const;
+	IMPORT_C TTime operator+(TTimeIntervalSeconds aSecond) const;  	
+	IMPORT_C TTime operator+(TTimeIntervalMicroSeconds aMicroSecond) const;
+	IMPORT_C TTime operator+(TTimeIntervalMicroSeconds32 aMicroSecond) const;
+	IMPORT_C TTime operator-(TTimeIntervalYears aYear) const;
+	IMPORT_C TTime operator-(TTimeIntervalMonths aMonth) const;
+	IMPORT_C TTime operator-(TTimeIntervalDays aDay) const;
+	IMPORT_C TTime operator-(TTimeIntervalHours aHour) const;
+	IMPORT_C TTime operator-(TTimeIntervalMinutes aMinute) const;
+	IMPORT_C TTime operator-(TTimeIntervalSeconds aSecond) const;  	
+	IMPORT_C TTime operator-(TTimeIntervalMicroSeconds aMicroSecond) const;
+	IMPORT_C TTime operator-(TTimeIntervalMicroSeconds32 aMicroSecond) const;
+	IMPORT_C TTime& operator+=(TTimeIntervalYears aYear);
+	IMPORT_C TTime& operator+=(TTimeIntervalMonths aMonth);
+	IMPORT_C TTime& operator+=(TTimeIntervalDays aDay);
+	IMPORT_C TTime& operator+=(TTimeIntervalHours aHour);
+	IMPORT_C TTime& operator+=(TTimeIntervalMinutes aMinute);
+	IMPORT_C TTime& operator+=(TTimeIntervalSeconds aSecond);	
+	IMPORT_C TTime& operator+=(TTimeIntervalMicroSeconds aMicroSecond);
+	IMPORT_C TTime& operator+=(TTimeIntervalMicroSeconds32 aMicroSecond);
+	IMPORT_C TTime& operator-=(TTimeIntervalYears aYear);
+	IMPORT_C TTime& operator-=(TTimeIntervalMonths aMonth);
+	IMPORT_C TTime& operator-=(TTimeIntervalDays aDay);
+	IMPORT_C TTime& operator-=(TTimeIntervalHours aHour);
+	IMPORT_C TTime& operator-=(TTimeIntervalMinutes aMinute);
+	IMPORT_C TTime& operator-=(TTimeIntervalSeconds aSecond);	
+	IMPORT_C TTime& operator-=(TTimeIntervalMicroSeconds aMicroSecond);
+	IMPORT_C TTime& operator-=(TTimeIntervalMicroSeconds32 aMicroSecond);
+	inline TBool operator==(TTime aTime) const;
+	inline TBool operator!=(TTime aTime) const;
+	inline TBool operator>=(TTime aTime) const;
+	inline TBool operator<=(TTime aTime) const;
+	inline TBool operator>(TTime aTime) const;
+	inline TBool operator<(TTime aTime) const;
+	inline const TInt64& Int64() const;
+private:
+	static TTime Convert(const TDateTime& aDateTime);
+private:
+	TInt64 iTime;
+	__DECLARE_TEST;
+	};
+
+
+
+
+/**
+@publishedAll
+@released
+
+A utility class whose functions may be used by the other date/time related 
+classes.
+*/
+class Time
+	{
+public:
+	IMPORT_C static TTime NullTTime();
+	IMPORT_C static TTime MaxTTime();
+	IMPORT_C static TTime MinTTime();
+	IMPORT_C static TInt DaysInMonth(TInt aYear, TMonth aMonth);
+	IMPORT_C static TBool IsLeapYear(TInt aYear);
+	IMPORT_C static TInt LeapYearsUpTo(TInt aYear);
+	};
+
+
+
+
+/**
+@publishedAll
+@released
+
+Gets a copy of the current locale's full text name for a day of the week.
+
+After construction or after a call to Set(), the copy of the text can be accessed 
+and manipulated using the standard descriptor member functions provided by 
+the base class.
+
+@see KMaxDayName
+*/
+class TDayName : public TBuf<KMaxDayName>
+	{
+public:
+	IMPORT_C TDayName();
+	IMPORT_C TDayName(TDay aDay);
+	IMPORT_C void Set(TDay aDay);
+	};
+
+
+
+
+/**
+@publishedAll
+@released
+
+Gets a copy of the current locale's abbreviated text name for a day of the 
+week.
+
+After construction or after a call to Set(), the copy of the abbreviated text 
+can be accessed and manipulated using the standard descriptor member functions 
+provided by the base class.
+
+The abbreviated day name cannot be assumed to be one character. In English, 
+it is 3 characters (Mon, Tue, Wed etc.), but the length can vary from locale 
+to locale, with a maximum length of KMaxDayNameAbb.
+
+@see KMaxDayNameAbb
+*/
+class TDayNameAbb : public TBuf<KMaxDayNameAbb>
+	{
+public:
+	IMPORT_C TDayNameAbb();
+	IMPORT_C TDayNameAbb(TDay aDay);
+	IMPORT_C void Set(TDay aDay);
+	};
+
+
+
+
+/**
+@publishedAll
+@released
+
+Gets a copy of the current locale's full text name for a month.
+
+After construction or after a call to Set(), the copy of the text can be accessed 
+and manipulated using the standard descriptor member functions provided by 
+the base class.
+
+@see KMaxMonthName
+*/
+class TMonthName : public TBuf<KMaxMonthName>
+	{
+public:
+	IMPORT_C TMonthName();
+	IMPORT_C TMonthName(TMonth aMonth);
+	IMPORT_C void Set(TMonth aMonth);
+	};
+
+
+
+
+/**
+@publishedAll
+@released
+
+Gets a copy of the current locale's abbreviated text name for a month.
+
+After construction or after a call to Set(), the copy of the abbreviated text 
+can be accessed and manipulated using the standard descriptor member functions 
+provided by the base class.
+
+@see KMaxMonthNameAbb
+*/
+class TMonthNameAbb : public TBuf<KMaxMonthNameAbb>
+	{
+public:
+	IMPORT_C TMonthNameAbb();
+	IMPORT_C TMonthNameAbb(TMonth aMonth);
+	IMPORT_C void Set(TMonth aMonth);
+	};
+
+
+
+
+/**
+@publishedAll
+@released
+
+Gets a copy of the current locale's date suffix text for a specific day in 
+the month.
+
+The text is the set of characters which can be appended to dates of the month 
+(e.g. in English, st for 1st, nd for 2nd etc).
+
+After construction or after a call to Set(), the copy of the suffix text can 
+be accessed and manipulated using the standard descriptor member functions 
+provided by the base class.
+*/
+class TDateSuffix : public TBuf<KMaxSuffix>
+	{
+public:
+	IMPORT_C TDateSuffix();
+	IMPORT_C TDateSuffix(TInt aDateSuffix);
+	IMPORT_C void Set(TInt aDateSuffix);
+	};
+
+
+
+
+/**
+@publishedAll
+@released
+
+Current locale's am/pm text
+
+This class retrieves a copy of the current locale's text identifying time 
+before and after noon. In English, this is am and pm.
+
+After construction or after a call to Set(), the copy of the text can be accessed 
+and manipulated using the standard descriptor member functions provided by 
+the base class.
+*/
+class TAmPmName : public TBuf<KMaxAmPmName>
+	{
+public:
+	IMPORT_C TAmPmName();
+	IMPORT_C TAmPmName(TAmPm aSelector);
+	IMPORT_C void Set(TAmPm aSelector);
+	};
+
+
+
+
+/**
+@publishedAll
+@released
+
+Gets a copy of the currency symbol(s) in use by the current locale.
+
+After construction or after a call to TCurrencySymbol::Set(), the copy of 
+the currency symbol(s) can be accessed and manipulated using the standard 
+descriptor member functions provided by the base class.
+*/
+class TCurrencySymbol : public TBuf<KMaxCurrencySymbol>
+	{
+public:
+	IMPORT_C TCurrencySymbol();
+	IMPORT_C void Set();
+	};
+
+
+
+
+/**
+@publishedAll
+@released
+
+Contains a format list that defines the short date format.
+
+An instance of this class should be passed as the second argument
+to TTime::FormatL().
+The string does not include any time components. The content of the long 
+date format specification is taken from the system-wide settings.
+
+For example, in the English locale, the short date format would be something
+like 14/1/2000.
+
+This class is used as follows:
+
+@code
+TTime now;
+now.HomeTime();
+TBuf<KMaxShortDateFormatSpec*2> buffer;
+now.FormatL(buffer,TShortDateFormatSpec());
+@endcode
+
+@see KMaxShortDateFormatSpec
+@see TTime::FormatL
+*/
+class TShortDateFormatSpec : public TBuf<KMaxShortDateFormatSpec> // to be passed into TTime::FormatL
+	{
+public:
+	IMPORT_C TShortDateFormatSpec();
+	IMPORT_C void Set();
+	};
+
+
+
+
+/**
+@publishedAll
+@released
+
+Contains a format list that defines the long date format.
+
+An instance of this class should be passed as the second argument
+to TTime::FormatL(). 
+The string does not include any time components. The content of the long 
+date format specification is taken from the system-wide settings.
+
+For example, in the English locale, the long date format would be
+something like 14th January 2000.
+
+This class is used as follows:
+
+@code
+TTime now;
+now.HomeTime();
+TBuf<KMaxLongDateFormatSpec*2> buffer;
+now.FormatL(buffer,TLongDateFormatSpec());
+@endcode
+
+@see KMaxLongDateFormatSpec
+@see TTime::FormatL
+*/
+class TLongDateFormatSpec : public TBuf<KMaxLongDateFormatSpec> // to be passed into TTime::FormatL
+	{
+public:
+	IMPORT_C TLongDateFormatSpec();
+	IMPORT_C void Set();
+	};
+
+
+
+
+/**
+@publishedAll
+@released
+
+Contains a format list that defines the time string format. 
+
+An instance of this class should be passed as the second argument
+to TTime::FormatL().
+The string does not include any time components. The content of the time format 
+specification is taken from the system-wide settings.
+
+This class is used as follows:
+
+@code
+TTime now;
+now.HomeTime();
+TBuf<KMaxTimeFormatSpec*2> buffer;
+now.FormatL(buffer,TTimeFormatSpec());
+@endcode
+
+@see KMaxTimeFormatSpec
+@see TTime::FormatL
+*/
+class TTimeFormatSpec : public TBuf<KMaxTimeFormatSpec> // to be passed into TTime::FormatL
+	{
+public:
+	IMPORT_C TTimeFormatSpec();
+	IMPORT_C void Set();
+	};
+
+
+
+
+/**
+@publishedAll
+@released
+
+Sets and gets the system's locale settings.
+
+Symbian OS maintains the locale information internally. On
+construction, this object is initialized with the system information
+for all locale items.
+*/
+class TLocale
+	{
+public:
+		
+    /**
+    Indicates how negative currency values are formatted.
+    */
+	enum TNegativeCurrencyFormat
+		{
+	    /**
+	    A minus sign is inserted before the currency symbol and value.
+	    */
+		ELeadingMinusSign,
+
+		/**
+		The currency value and symbol are enclosed in brackets (no minus sign
+		is used).
+		*/
+		EInBrackets, //this one must be non-zero for binary compatibility with the old TBool TLocale::iCurrencyNegativeInBrackets which was exposed in the binary interface because it was accessed via *inline* functions
+			
+	    /**
+	    A minus sign is inserted after the currency symbol and value.
+        */
+		ETrailingMinusSign,
+		
+        /**
+        A minus sign is inserted between the currency symbol and the value.
+        */
+		EInterveningMinusSign
+		};
+		
+	/**
+	Flags for negative currency values formatting
+	*/
+	enum 
+		{
+		/** 
+		If this flag is set and the currency value being formatted is negative,
+		if there is a space between the currency symbol and the value,
+		that space is lost. 
+		*/
+		EFlagNegativeLoseSpace = 0x00000001,
+		
+		/**   
+		If this flag is set and the currency value being formatted is negative,
+		the position of the currency symbol is placed in the opposite direction 
+		from the position set for the positive currency value. 
+		*/
+		EFlagNegativeCurrencySymbolOpposite=0x00000002
+		};
+	/** Indicates how the device universal time is maintained */
+	enum TDeviceTimeState
+		{
+		/** Universal time is maintained by the device RTC and the user selection 
+		of the locale of the device indicating offset from GMT and daylight saving*/
+		EDeviceUserTime,
+
+		/** Universal time and offset from GMT is supplied by the mobile network
+		and maintained by device RTC */
+		ENITZNetworkTimeSync
+		};
+public:
+	IMPORT_C TLocale();
+	inline TLocale(TInt);
+	IMPORT_C void Refresh();
+	IMPORT_C TInt Set() const;
+	IMPORT_C void FormatCurrency(TDes& aText, TInt aAmount);
+	IMPORT_C void FormatCurrency(TDes& aText, TInt64 aAmount);
+	IMPORT_C void FormatCurrency(TDes& aText, TDesOverflow& aOverflowHandler, TInt aAmount); 
+	IMPORT_C void FormatCurrency(TDes& aText, TDesOverflow& aOverflowHandler, TInt64 aAmount); 
+	
+	inline TInt CountryCode() const;
+	inline void SetCountryCode(TInt aCode);
+	inline TTimeIntervalSeconds UniversalTimeOffset() const;
+	inline TDateFormat DateFormat() const;
+	inline void SetDateFormat(TDateFormat aFormat);
+	inline TTimeFormat TimeFormat() const;
+	inline void SetTimeFormat(TTimeFormat aFormat);
+	inline TLocalePos CurrencySymbolPosition() const;
+	inline void SetCurrencySymbolPosition(TLocalePos aPos);
+	inline TBool CurrencySpaceBetween() const;
+	inline void SetCurrencySpaceBetween(TBool aSpace);
+	inline TInt CurrencyDecimalPlaces() const;
+	inline void SetCurrencyDecimalPlaces(TInt aPlaces);
+	inline TBool CurrencyNegativeInBrackets() const;        // These two functions are deprecated
+	inline void SetCurrencyNegativeInBrackets(TBool aBool); // They are here to maintain compatibility. Use the New functions -> NegativeCurrencyFormat setter/getter. 
+ 	inline TBool CurrencyTriadsAllowed() const;  
+	inline void SetCurrencyTriadsAllowed(TBool aBool);
+	inline TChar ThousandsSeparator() const;
+	inline void SetThousandsSeparator(const TChar& aChar);
+	inline TChar DecimalSeparator() const;
+	inline void SetDecimalSeparator(const TChar& aChar);
+	inline TChar DateSeparator(TInt aIndex) const;
+	inline void SetDateSeparator(const TChar& aChar,TInt aIndex);
+	inline TChar TimeSeparator(TInt aIndex) const;
+	inline void SetTimeSeparator(const TChar& aChar,TInt aIndex);
+	inline TBool AmPmSpaceBetween() const;
+	inline void SetAmPmSpaceBetween(TBool aSpace);
+	inline TLocalePos AmPmSymbolPosition() const;
+	inline void SetAmPmSymbolPosition(TLocalePos aPos);
+	inline TUint DaylightSaving() const;
+	inline TBool QueryHomeHasDaylightSavingOn() const;
+	inline TDaylightSavingZone HomeDaylightSavingZone() const;
+	inline TUint WorkDays() const;
+	inline void SetWorkDays(TUint aMask);
+	inline TDay StartOfWeek() const;
+	inline void SetStartOfWeek(TDay aDay);
+	inline TClockFormat ClockFormat() const;
+	inline void SetClockFormat(TClockFormat aFormat);
+	inline TUnitsFormat UnitsGeneral() const;
+	inline void SetUnitsGeneral(TUnitsFormat aFormat);
+	inline TUnitsFormat UnitsDistanceShort() const;
+	inline void SetUnitsDistanceShort(TUnitsFormat aFormat);
+	inline TUnitsFormat UnitsDistanceLong() const;
+	inline void SetUnitsDistanceLong(TUnitsFormat aFormat);
+	inline TNegativeCurrencyFormat NegativeCurrencyFormat() const;
+	inline void SetNegativeCurrencyFormat(TNegativeCurrencyFormat aNegativeCurrencyFormat);
+	inline TBool NegativeLoseSpace() const;
+	inline void SetNegativeLoseSpace(TBool aBool);
+	inline TBool NegativeCurrencySymbolOpposite() const;
+	inline void SetNegativeCurrencySymbolOpposite(TBool aBool);
+	inline TLanguage LanguageDowngrade(TInt aIndex) const;	 // 0 <= aIndex < 3
+	inline void SetLanguageDowngrade(TInt aIndex, TLanguage aLanguage);
+	inline TDigitType DigitType() const;
+	inline void SetDigitType(TDigitType aDigitType);
+	inline TDeviceTimeState DeviceTime() const;
+ 	inline void SetDeviceTime(TDeviceTimeState aState);
+
+	void SetDefaults(); /**< @internalComponent */
+
+private:
+	friend class TExtendedLocale;
+private:
+	TInt iCountryCode;
+	TTimeIntervalSeconds iUniversalTimeOffset;
+	TDateFormat iDateFormat;
+	TTimeFormat iTimeFormat;
+	TLocalePos iCurrencySymbolPosition;
+	TBool iCurrencySpaceBetween;
+	TInt iCurrencyDecimalPlaces;
+	TNegativeCurrencyFormat iNegativeCurrencyFormat; //	replaced TBool iCurrencyNegativeInBrackets
+	TBool iCurrencyTriadsAllowed;
+	TChar iThousandsSeparator;
+	TChar iDecimalSeparator;
+	TChar iDateSeparator[KMaxDateSeparators];
+	TChar iTimeSeparator[KMaxTimeSeparators];
+	TLocalePos iAmPmSymbolPosition;
+	TBool iAmPmSpaceBetween;
+	TUint iDaylightSaving;
+	TDaylightSavingZone iHomeDaylightSavingZone;
+	TUint iWorkDays;
+	TDay iStartOfWeek;
+	TClockFormat iClockFormat;
+	TUnitsFormat iUnitsGeneral;
+	TUnitsFormat iUnitsDistanceShort;
+	TUnitsFormat iUnitsDistanceLong;
+	TUint iExtraNegativeCurrencyFormatFlags;
+	TUint16 iLanguageDowngrade[3];
+	TUint16 iSpare16;
+	TDigitType iDigitType;
+ 	TDeviceTimeState iDeviceTimeState;
+ 	TInt iSpare[0x1E];
+	};
+
+/** 
+@publishedAll
+@released
+
+TLocaleAspect
+
+Enumeration used with TExtendedLocale::LoadLocaleAspect to select which
+locale information is to be replaced from the contents of the Locale
+DLL being loaded.
+
+ELocaleLanguageSettings - Replaces everything that should change with
+                          language selection e.g. Month names, Day names,
+                          etc,
+
+ELocaleLocaleSettings - Replaces the currently selected currency symbol,
+                        TLocale settings, and FAT utility functions
+
+ELocaleTimeAndDateSettings - Replaces the current time and date display
+                             format settings.
+
+ELocaleCollateSettings - Replaces the "system" preferred Charset
+                         (because that's where the collation table
+                         is!). The "Default" charset will remain
+                         unchanged until after the next power
+                         off/on cycle
+*/
+enum TLocaleAspect
+	{
+	ELocaleLanguageSettings = 0x01,
+	ELocaleCollateSetting = 0x02,
+	ELocaleLocaleSettings = 0x04,
+	ELocaleTimeDateSettings = 0x08,
+	};
+
+/**
+@internalComponent
+*/
+struct SLocaleLanguage
+	{
+	TLanguage 		iLanguage;
+	const TText*	iDateSuffixTable;
+	const TText*	iDayTable;
+	const TText*	iDayAbbTable;
+	const TText*	iMonthTable;
+	const TText*	iMonthAbbTable;
+	const TText*	iAmPmTable;
+	const TText16* const*	iMsgTable;
+	};
+
+/**
+@internalComponent
+*/
+struct SLocaleLocaleSettings
+	{
+	TText	iCurrencySymbol[KMaxCurrencySymbol+1];
+	TAny*	iLocaleExtraSettingsDllPtr;
+	};
+
+/**
+@internalComponent
+*/
+struct SLocaleTimeDateFormat
+	{
+	TText	iShortDateFormatSpec[KMaxShortDateFormatSpec+1];
+	TText	iLongDateFormatSpec[KMaxLongDateFormatSpec+1];
+	TText	iTimeFormatSpec[KMaxTimeFormatSpec+1];
+	TAny*	iLocaleTimeDateFormatDllPtr;
+	};
+
+struct LCharSet;
+
+/**
+@publishedAll
+@released
+
+Extended locale class
+
+This class holds a collection of locale information. It contains a TLocale internally.
+It has methods to load a locale DLL and to set the system wide locale information.
+
+*/
+class TExtendedLocale
+	{
+public:
+
+	// Default constructor, create an empty instance
+	IMPORT_C TExtendedLocale();
+
+	// Initialise to (or restore from!) current system wide locale
+	// settings
+	IMPORT_C void LoadSystemSettings();
+	
+	// Overwrite current system wide locale settings with the current
+	// contents of this TExtendedLocale
+	IMPORT_C TInt SaveSystemSettings();
+
+	// Load a complete set of locale data from a named Locale DLL
+	IMPORT_C TInt LoadLocale(const TDesC& aLocaleDllName);
+
+	// Load an additional Locale DLL and over-ride a selected subset
+	// (currently ELocaleLanguageSettings to select an alternative set
+	// of language specific text strings, ELocaleCollateSetting to
+	// select a new system collation table,
+	// ELocaleOverRideMatchCollationTable to locally select an
+	// alternative collation order for matching text strings, or
+	// ELocaleOverRideSortCollationTable for ordering text strings)
+	// of settings with its contents
+	IMPORT_C TInt LoadLocaleAspect(TUint aAspectGroup, const TDesC& aLocaleDllName);
+
+	// Set the currency Symbol
+	IMPORT_C TInt SetCurrencySymbol(const TDesC &aSymbol);
+
+	// Get the name of the DLL holding the data for a particular set
+	// of Locale properties
+	IMPORT_C TInt GetLocaleDllName(TLocaleAspect aLocaleDataSet, TDes& aDllName);
+
+	// Get the preferred collation method.
+	// Note that some Charsets may contain more than one Collation
+	// method (e.g "dictionary" v "phonebook" ordering) so an optional
+	// index parameter can be used to select between them
+	IMPORT_C TCollationMethod GetPreferredCollationMethod(TInt index = 0) ;
+	
+	//Get the Currency Symbol
+	IMPORT_C TPtrC GetCurrencySymbol();
+	
+	//Get the Long Date Format
+	IMPORT_C TPtrC GetLongDateFormatSpec();
+	
+	//Get the Short Date Format
+	IMPORT_C TPtrC GetShortDateFormatSpec();
+	
+	//Get the Time Format
+	IMPORT_C TPtrC GetTimeFormatSpec();
+
+	// Retrieve a reference to the encapsulated TLocale
+	inline TLocale*	GetLocale();
+
+	inline const LCharSet* GetDefaultCharSet();
+	inline const LCharSet* GetPreferredCharSet();
+	inline SLocaleLanguage* GetLanguageSettings();
+	inline SLocaleLocaleSettings* GetLocaleExtraSettings();
+	inline SLocaleTimeDateFormat* GetLocaleTimeDateFormat();
+	
+private:
+
+	TInt DoLoadLocale(const TDesC& aLocaleDllName, TLibraryFunction* aExportList);
+	void DoUpdateLanguageSettings(TLibraryFunction* aExportList);
+	void DoUpdateLocaleSettings(TLibraryFunction* aExportList);
+	void DoUpdateTimeDateFormat(TLibraryFunction* aExportList);
+
+private:
+
+	TLocale					iLocale;
+	SLocaleLanguage			iLanguageSettings;
+	SLocaleLocaleSettings	iLocaleExtraSettings;
+	SLocaleTimeDateFormat	iLocaleTimeDateFormat;
+	const LCharSet*			iDefaultCharSet;
+	const LCharSet*			iPreferredCharSet;
+	};
+
+
+
+
+/**
+@publishedAll
+@released
+
+Geometric rectangle.
+
+The class represents a rectangle whose sides are parallel with the axes of 
+the co-ordinate system. 
+
+The co-ordinates of the top-left and bottom-right corners are used to set 
+the dimensions of the rectangle. The bottom right co-ordinate is outside the 
+rectangle. Thus TRect(TPoint(2,2),TSize(4,4)) is equal
+to TRect(TPoint(2,2),TPoint(6,6)), 
+and in both cases you get a 4x4 pixel rectangle on the screen.
+
+Functions are provided to initialise and manipulate the rectangle and to extract 
+information about it.
+*/
+class TRect
+	{
+public:
+	enum TUninitialized { EUninitialized };
+	/**
+	Constructs a default rectangle.
+	
+	This initialises the co-ordinates of its top 
+	left and bottom right corners to (0,0).
+	*/
+	TRect(TUninitialized) {}
+	IMPORT_C TRect();
+	IMPORT_C TRect(TInt aAx,TInt aAy,TInt aBx,TInt aBy);
+	IMPORT_C TRect(const TPoint& aPointA,const TPoint& aPointB);
+	IMPORT_C TRect(const TPoint& aPoint,const TSize& aSize);
+	IMPORT_C TRect(const TSize& aSize);
+	IMPORT_C TBool operator==(const TRect& aRect) const;
+	IMPORT_C TBool operator!=(const TRect& aRect) const;
+	IMPORT_C void SetRect(TInt aAx,TInt aAy,TInt aBx,TInt aBy);
+	IMPORT_C void SetRect(const TPoint& aPointTL,const TPoint& aPointBR);
+	IMPORT_C void SetRect(const TPoint& aPoint,const TSize& aSize);
+	IMPORT_C void Move(TInt aDx,TInt aDy);
+	IMPORT_C void Move(const TPoint& aOffset);
+	IMPORT_C void Resize(TInt aDx,TInt aDy);
+	IMPORT_C void Resize(const TSize& aSize);
+	IMPORT_C void Shrink(TInt aDx,TInt aDy);
+	IMPORT_C void Shrink(const TSize& aSize);
+	IMPORT_C void Grow(TInt aDx,TInt aDy);
+	IMPORT_C void Grow(const TSize& aSize);
+	IMPORT_C void BoundingRect(const TRect& aRect);
+	IMPORT_C TBool IsEmpty() const;
+	IMPORT_C TBool Intersects(const TRect& aRect) const;
+	IMPORT_C void Intersection(const TRect& aRect);
+	IMPORT_C void Normalize();
+	IMPORT_C TBool Contains(const TPoint& aPoint) const;
+	IMPORT_C TSize Size() const;
+	IMPORT_C TInt Width() const;
+	IMPORT_C TInt Height() const;
+	IMPORT_C TBool IsNormalized() const;
+	IMPORT_C TPoint Center() const;
+	IMPORT_C void SetSize(const TSize& aSize);
+	IMPORT_C void SetWidth(TInt aWidth);
+	IMPORT_C void SetHeight(TInt aHeight);
+private:
+	void Adjust(TInt aDx,TInt aDy);
+public:
+	/**
+	The x and y co-ordinates of the top left hand corner of the rectangle.
+	*/
+	TPoint iTl;
+	
+	/**
+	The x and y co-ordinates of the bottom right hand corner of the rectangle.
+	*/
+	TPoint iBr;
+	};
+
+
+
+
+/**
+@publishedAll
+@released
+
+Clipping region - abstract base class. 
+
+This abstract base class represents a 2-dimensional area which is used by 
+Graphics, the graphics window server, and the text window server to define 
+regions of the display which need to be updated, or regions within which all 
+operations must occur. 
+
+A TRegion is defined in terms of an array of TRects and the more complex the 
+region, the more TRects are required to represent it.
+
+A clipping region initially has space allocated for five rectangles.
+If manipulations result in a region which requires more than this, an attempt
+is made to allocate more rectangles. If this cannot be done, an error flag
+is set, and all subsequent operations involving the region have no effect
+(except possibly to propagate the error flag to other regions).
+The CheckError() member function allows 
+the error flag to be tested; Clear() can be used to clear it.
+
+The redraw logic of application programs may use the TRegion in various ways:
+
+1. minimally, they pass it to the graphics context as the clipping region; when 
+   a graphics context is activated to a window, the clipping region is set up 
+   automatically
+
+2. if they wish to avoid redrawing objects which are outside the general area 
+   of the region, they may use TRegion::BoundingRect() to return the rectangle 
+   which bounds the clipping region, and draw only primitives that lie within 
+   that rectangle
+
+3. if they wish to exercise finer control, they may extract the individual rectangles 
+   that comprise the clipping region using Operator[]().
+
+Application programs may also manipulate clipping regions in order to constrain 
+parts of their redrawing to narrower areas of the screen than the clipping 
+region offered by the window server. To do this, functions that allow clipping 
+region manipulation may be used; for example, adding or removing rectangles 
+or finding the intersection or union of two regions.
+*/
+class TRegion
+	{
+public:
+	inline TInt Count() const;
+	inline const TRect* RectangleList() const;
+	inline TBool CheckError() const;
+	IMPORT_C TBool IsEmpty() const;
+	IMPORT_C TRect BoundingRect() const;
+	IMPORT_C const TRect& operator[](TInt aIndex) const;
+	IMPORT_C void Copy(const TRegion& aRegion);
+	IMPORT_C void AddRect(const TRect& aRect);
+	IMPORT_C void SubRect(const TRect& aRect,TRegion* aSubtractedRegion=NULL);
+	IMPORT_C void Offset(TInt aXoffset,TInt aYoffset);
+	IMPORT_C void Offset(const TPoint& aOffset);
+	IMPORT_C void Union(const TRegion& aRegion);
+	IMPORT_C void Intersection(const TRegion& aRegion,const TRegion& aRegion2);
+	IMPORT_C void Intersect(const TRegion& aRegion);
+	IMPORT_C void SubRegion(const TRegion& aRegion,TRegion* aSubtractedRegion=NULL);
+	IMPORT_C void ClipRect(const TRect& aRect);
+	IMPORT_C void Clear();
+	IMPORT_C void Tidy();
+	IMPORT_C TInt Sort();
+	IMPORT_C TInt Sort(const TPoint& aOffset);
+	IMPORT_C void ForceError();
+	IMPORT_C TBool IsContainedBy(const TRect& aRect) const;
+	IMPORT_C TBool Contains(const TPoint& aPoint) const;
+	IMPORT_C TBool Intersects(const TRect& aRect) const;	
+protected:
+	IMPORT_C TRect* RectangleListW();
+	IMPORT_C TRegion(TInt aAllocedRects);
+	inline TRegion();
+	TBool SetListSize(TInt aCount);
+	void AppendRect(const TRect& aRect);
+	void DeleteRect(TRect* aRect);
+	void AppendRegion(TRegion& aRegion);
+protected:
+	TInt iCount;
+	TBool iError;
+	TInt iAllocedRects;
+protected:
+	enum {ERRegionBuf=0x40000000};
+	};
+
+
+
+
+/**
+@publishedAll
+@released
+
+Expandable region.
+
+This class provides for the construction and destruction of a TRegion, including 
+a granularity for expanding the region. A region;s granularity represents 
+the number of memory slots allocated when the object is created, and the number 
+of new memory slots allocated each time an RRegion is expanded beyond the 
+number of free slots. The default granularity is five.
+*/
+class RRegion : public TRegion
+	{
+private:
+	enum {EDefaultGranularity=5};
+protected:
+	IMPORT_C RRegion(TInt aBuf,TInt aGran);
+public:
+	IMPORT_C RRegion();
+	IMPORT_C RRegion(TInt aGran);
+	IMPORT_C RRegion(const RRegion& aRegion);
+	IMPORT_C RRegion(const TRect& aRect,TInt aGran=EDefaultGranularity);
+	IMPORT_C RRegion(TInt aCount,TRect* aRectangleList,TInt aGran=EDefaultGranularity);
+	IMPORT_C void Close();
+	IMPORT_C void Destroy();
+	inline TInt CheckSpare() const;
+private:
+	TInt iGranularity;
+	TRect* iRectangleList;
+	friend class TRegion;
+	};
+
+
+
+
+/**
+@publishedAll
+@released
+
+Region with pre-allocated buffer. 
+
+This class provides the functionality of an RRegion, but in addition, for 
+optimisation purposes, uses a buffer containing pre-allocated space for as 
+many rectangles as are specified in the granularity. 
+
+When this buffer is full, cell allocation takes place as for an RRegion, and 
+the RRegionBuf effectively becomes an RRegion. In this case, the region does 
+not revert to using the buffer, even if the region were to shrink so that 
+the buffer could, once again, contain the region. When the region is no longer 
+required, call Close(), defined in the base class RRegion, to free up all 
+memory.
+*/
+template <TInt S>
+class RRegionBuf : public RRegion
+	{
+public:
+	inline RRegionBuf();
+	inline RRegionBuf(const RRegion& aRegion);
+	inline RRegionBuf(const RRegionBuf<S>& aRegion);
+	inline RRegionBuf(const TRect& aRect);
+private:
+	TInt8 iRectangleBuf[S*sizeof(TRect)];
+	};
+
+
+
+
+/**
+@publishedAll
+@released
+
+A fixed size region.
+
+The region consists of a fixed number of rectangles; this number is specified 
+in the templated argument. The region cannot be expanded to contain more than 
+this number of rectangles. If an attempt is made to do so, the region's 
+error flag is set, and the region is cleared.
+
+Note that when adding a rectangle to a region, if that rectangle overlaps 
+an existing rectangle, the operation causes more than one rectangle to be 
+created.
+*/
+template <TInt S>
+class TRegionFix : public TRegion
+	{
+public:
+	inline TRegionFix();
+	inline TRegionFix(const TRect& aRect);
+	inline TRegionFix(const TRegionFix<S>& aRegion);
+private:
+	TInt8 iRectangleBuf[S*sizeof(TRect)];
+	};
+
+
+
+
+/**
+@publishedAll
+@released
+
+Base class for searching for global kernel objects.
+
+This is the base class for a number of classes which are used to find specific 
+types of global kernel object such as semaphores, threads and mutexes;
+TFindSemaphore, TFindThread and TFindMutex are typical examples of such
+derived classes.
+
+The class implements the common behaviour, specifically, the storage of the 
+match pattern which is used to search for object names.
+
+This class is not intended to be explicitly instantiated; it has public
+constructors but they are part of the class implementation and are described
+for information only.
+*/
+class TFindHandleBase : public TFindHandle
+	{
+public:
+	IMPORT_C TFindHandleBase();
+	IMPORT_C TFindHandleBase(const TDesC& aMatch);
+	IMPORT_C void Find(const TDesC& aMatch);
+protected:
+	TInt NextObject(TFullName& aResult,TInt aObjectType);
+private:
+	
+	/**
+	The full name of the last kernel side object found.
+	*/
+	TFullName iMatch;
+	};
+
+
+
+
+/**
+@publishedAll
+@released
+
+Finds all global semaphores whose full names match a specified pattern.
+
+The match pattern can be set into the TFindSemaphore object at construction; 
+it can also be changed at any time after construction by using the Find() 
+member function of the TFindHandleBase base class.
+
+After construction, the Next() member function can be used repeatedly to find 
+successive global semaphores whose full names match the current pattern.
+
+A successful call to Next() means that a matching global semaphore has been 
+found. To open a handle on this semaphore, call the RSemaphore::Open() function 
+and pass a reference to this TFindSemaphore.
+
+Pattern matching is part of descriptor behaviour.
+
+@see TFindHandleBase::Find
+@see TFindSemaphore::Next
+@see RSemaphore::Open
+@see TDesC16::Match
+@see TDesC8::Match
+*/
+class TFindSemaphore : public TFindHandleBase
+	{
+public:
+	inline TFindSemaphore();
+	inline TFindSemaphore(const TDesC& aMatch);
+	IMPORT_C TInt Next(TFullName& aResult);
+	};
+
+
+
+
+/**
+@publishedAll
+@released
+
+Finds all global mutexes whose full names match a specified pattern.
+
+The match pattern can be set into the object at construction; it can also 
+be changed at any time after construction by using the Find() member function 
+of the base class.
+
+After construction, the Next() member function may be used repeatedly to find 
+successive global mutexes whose full names match the current pattern.
+
+A successful call to Next() means that a matching global mutex has been found. 
+To open a handle on this mutex, call the Open() member function of RMutex 
+and pass a reference to this TFindMutex object.
+
+Pattern matching is part of descriptors behaviour.
+
+@see TFindHandleBase::Find
+@see TFindMutex::Next
+@see RMutex::Open
+@see TDesC16::Match
+@see TDesC8::Match
+*/
+class TFindMutex : public TFindHandleBase
+	{
+public:
+	inline TFindMutex();
+	inline TFindMutex(const TDesC& aMatch);
+	IMPORT_C TInt Next(TFullName& aResult);
+	};
+
+
+
+
+/**
+@publishedAll
+@released
+
+Searches for all global chunks by pattern matching against the names of (Kernel 
+side) chunk objects.
+
+The match pattern can be set into this object at construction; it can also 
+be changed at any time after construction by using TFindHandleBase::Find().
+
+After construction, call TFindChunk::Next() repeatedly to find successive 
+chunks whose names match the current pattern. A successful call
+to TFindChunk::Next() means that a matching chunk has been found.
+
+@see TFindHandleBase
+*/
+class TFindChunk : public TFindHandleBase
+	{
+public:
+	inline TFindChunk();
+	inline TFindChunk(const TDesC& aMatch);
+	IMPORT_C TInt Next(TFullName& aResult);
+	};
+
+
+
+
+
+/**
+@publishedAll
+@released
+
+Searches for threads by pattern matching against the names
+of thread objects.
+
+The match pattern can be set into this object at construction; it can also be
+changed at any time after construction by using TFindHandleBase::Find().
+
+After construction, call TFindThread::Next() repeatedly to find successive
+threads whose names match the current pattern.
+A successful call to TFindThread::Next() means that a matching thread has
+been found. To open a handle on this thread, call RThread::Open() and pass
+a reference to this TFindThread.
+
+@see RThread
+*/
+class TFindThread : public TFindHandleBase
+	{
+public:
+	inline TFindThread();
+	inline TFindThread(const TDesC& aMatch);
+	IMPORT_C TInt Next(TFullName& aResult);
+	};
+
+
+
+
+/**
+@publishedAll
+@released
+
+Searches for processes by pattern matching against the names
+of process objects.
+
+The match pattern can be set into this object at construction; it can also be
+changed at any time after construction by using TFindHandleBase::Find().
+
+After construction, call TFindProcess::Next() repeatedly to find successive
+processes whose names match the current pattern.
+A successful call to TFindProcess::Next() means that a matching process has
+been found. To open a handle on this process, call RProcess::Open() and pass
+a reference to this TFindProcess.
+
+@see RProcess
+*/
+class TFindProcess : public TFindHandleBase
+	{
+public:
+	inline TFindProcess();
+	inline TFindProcess(const TDesC& aMatch);
+	IMPORT_C TInt Next(TFullName& aResult);
+	};
+
+
+
+/**
+@publishedAll
+@released
+
+Searches for LDD factory objects by pattern matching against the names of 
+ LDD factory objects.
+
+An LDD factory object is an instance of a DLogicalDevice derived class. 
+
+The match pattern can be set into this object at construction; it can also 
+be changed at any time after construction by using TFindHandleBase::Find().
+
+After construction, call TFindLogicalDevice::Next() repeatedly to find successive 
+LDD factory objects whose names match the current pattern. A successful call to 
+TFindLogicalDevice::Next() means that a matching LDD factory object has been found.
+
+The name of an LDD factory object is set by its Install() member function as 
+part of the construction process.
+*/
+class TFindLogicalDevice : public TFindHandleBase
+	{
+public:
+	inline TFindLogicalDevice();
+	inline TFindLogicalDevice(const TDesC& aMatch);
+	IMPORT_C TInt Next(TFullName& aResult);
+	};
+
+/**
+@publishedAll
+@released
+
+Searches for PDD factory objects by pattern matching against the names of
+PDD factory objects.
+
+A PDD factory object is an instance of a DPhysicalDevice derived class. 
+
+The match pattern can be set into this object at construction; it can also be 
+changed at any time after construction by using TFindHandleBase::Find().
+
+After construction, call TFindPhysicalDevice::Next() repeatedly to find successive 
+PDD factory objects whose names match the current pattern. A successful call to 
+TFindPhysicalDevice::Next() means that a matching PDD factory object has been found.
+
+The name of a PDD factory object is set by its Install() member function as part 
+of the construction process.
+*/
+class TFindPhysicalDevice : public TFindHandleBase
+	{
+public:
+	inline TFindPhysicalDevice();
+	inline TFindPhysicalDevice(const TDesC& aMatch);
+	IMPORT_C TInt Next(TFullName& aResult);
+	};
+
+
+
+
+
+/**
+@publishedAll
+@released
+
+Searches for servers by pattern matching against the names of kernel side
+server objects.
+
+The match pattern can be set into this object at construction; it can also
+be changed at any time after construction by using the TFindHandleBase::Find()
+base class.
+
+After construction, call TFindServer::Next() repeatedly to find successive
+servers whose names match the current pattern.
+A successful call to TFindServer::Next() means that a matching server
+has been found.
+*/
+class TFindServer : public TFindHandleBase
+	{
+public:
+	inline TFindServer();
+	inline TFindServer(const TDesC& aMatch);
+	IMPORT_C TInt Next(TFullName& aResult);
+	};
+
+
+
+
+/**
+@publishedAll
+@released
+
+Searches for DLLs whose full names match a specified pattern.
+
+The match pattern is set at construction but can also be changed at any time
+after construction by using TFindHandleBase::Find().
+
+After construction, use TFindLibrary::Next() to repeatedly find successive DLLs
+whose names match the current pattern. A successful call to
+TFindLibrary::Next() means that a matching DLL has been found.
+*/
+class TFindLibrary : public TFindHandleBase
+	{
+public:
+	inline TFindLibrary();
+	inline TFindLibrary(const TDesC& aMatch);
+	IMPORT_C TInt Next(TFullName& aResult);
+	};
+
+
+
+/**
+@publishedAll
+@released
+
+User side handle to an LDD factory object, an instance of a DLogicalDevice 
+derived class.
+
+The LDD factory object is a Kernel side object which is constructed on the 
+Kernel heap when the logical device is opened using User::LoadLogicalDevice(). 
+The handle allows the User side to get information about the logical device.
+
+To use the device, a thread must create and use an instance of an 
+RBusLogicalChannel derived class.
+
+*/
+class RDevice : public RHandleBase
+	{
+public:
+	inline TInt Open(const TFindLogicalDevice& aFind,TOwnerType aType=EOwnerProcess);
+	IMPORT_C TInt Open(const TDesC& aName,TOwnerType aType=EOwnerProcess);
+	IMPORT_C void GetCaps(TDes8& aDes) const;
+	IMPORT_C TBool QueryVersionSupported(const TVersion& aVer) const;
+	IMPORT_C TBool IsAvailable(TInt aUnit, const TDesC* aPhysicalDevice, const TDesC8* anInfo) const;
+	};
+
+/**
+@publishedAll
+@released
+
+Asynchronous timer services. 
+
+Five types of asynchronous request are supported by the class:
+
+1. Requesting an event after a specified interval
+
+2. Requesting an event at a specified system time
+
+3. Requesting a timer event on a specific second fraction
+
+4. Requesting an event if an interval elapses with no user activity.
+
+5. Requesting an event after a specified interval, to a resolution of 1ms.
+   
+Each of these requests can be cancelled.
+
+The timer exists from its creation, following a call to RTimer::CreateLocal(),
+until it is destroyed by a call to the Close() member function of the base
+class RHandleBase.
+
+This class is ultimately implemented in terms of the nanokernel tick, and
+therefore the granularity of the generated events is limited to the period of
+this timer.  This is variant specific, but is usually 1 millisecond.
+
+Note that the CTimer active object uses an RTimer.
+*/
+class RTimer : public RHandleBase
+	{
+public:
+	IMPORT_C TInt CreateLocal();
+	IMPORT_C void Cancel();
+	IMPORT_C void After(TRequestStatus& aStatus,TTimeIntervalMicroSeconds32 anInterval);
+	IMPORT_C void AfterTicks(TRequestStatus &aStatus, TInt aTicks);
+	IMPORT_C void At(TRequestStatus& aStatus,const TTime& aTime);
+	IMPORT_C void AtUTC(TRequestStatus& aStatus,const TTime& aUTCTime);
+	IMPORT_C void Lock(TRequestStatus& aStatus,TTimerLockSpec aLock);
+	IMPORT_C void Inactivity(TRequestStatus& aStatus, TTimeIntervalSeconds aSeconds);
+	IMPORT_C void HighRes(TRequestStatus& aStatus,TTimeIntervalMicroSeconds32 anInterval);
+	};
+
+
+
+
+/**
+@publishedAll
+@released
+
+A handle to a dynamically loadable DLL.
+
+The class is not intended for user derivation.
+*/
+class RLibrary : public RHandleBase
+	{
+public:
+	IMPORT_C void Close();
+	IMPORT_C TInt Load(const TDesC& aFileName, const TUidType& aType);
+	IMPORT_C TInt Load(const TDesC& aFileName, const TDesC& aPath=KNullDesC);
+	IMPORT_C TInt Load(const TDesC& aFileName, const TDesC& aPath, const TUidType& aType);
+	IMPORT_C TInt Load(const TDesC& aFileName, const TDesC& aPath, const TUidType& aType, TUint32 aModuleVersion);
+	IMPORT_C TInt LoadRomLibrary(const TDesC& aFileName, const TDesC& aPath);
+	IMPORT_C TLibraryFunction Lookup(TInt anOrdinal) const;
+	IMPORT_C TUidType Type() const;
+	IMPORT_C TFileName FileName() const;
+	IMPORT_C TInt GetRamSizes(TInt& aCodeSize, TInt& aConstDataSize);
+	IMPORT_C TInt Init(); /**< @internalTechnology */
+public:
+	/**
+	Class representing information about an executable binary, (DLL or EXE).
+	@internalTechnology
+	*/
+	struct TInfo
+		{
+		TUint32 iModuleVersion;			/**< Version number */
+		TUidType iUids;					/**< UIDs */
+		TSecurityInfo iSecurityInfo;	/**< Security Info */
+		};
+
+	/**
+	Class representing information about an executable binary, (DLL or EXE), version 2.
+	@internalTechnology
+	*/
+	struct TInfoV2 : public TInfo
+		{
+		TUint8 iHardwareFloatingPoint;	/**< Which hardware floating point used, from TFloatingPointType */
+		enum TDebugAttributes
+		{
+			EDebugAllowed = 1<<0, ///< Flags set if executable may be debugged.
+			ETraceAllowed = 1<<1 ///< Flags set if executable may be traced.
+		};
+		TUint8 iDebugAttributes; ///< Bitmask of values from enum TDebugAttributes
+		TUint8 iSpare[6];
+		};
+
+	/**
+	Type representing a TInfo struct packaged as a descriptor.
+	@internalTechnology
+	*/
+	typedef TPckgBuf<TInfo> TInfoBuf;
+
+	/**
+	Type representing a TInfo struct packaged as a descriptor, version 2.
+	@internalTechnology
+	*/
+	typedef TPckgBuf<TInfoV2> TInfoBufV2;
+
+	/**
+	@internalTechnology
+	*/
+	enum TRequiredImageHeaderSize
+		{
+#ifdef __WINS__
+		/**
+		Size of header data which should be passed to GetInfoFromHeader()
+		*/
+		KRequiredImageHeaderSize = KMaxTInt
+#else
+		KRequiredImageHeaderSize = 9*1024
+#endif
+		};
+
+	IMPORT_C static TInt GetInfoFromHeader(const TDesC8& aHeader, TDes8& aInfoBuf);
+
+	/**
+	@internalTechnology
+	@deprecated Use TInfo
+	*/
+	struct SInfo
+		{
+		TUint32 iModuleVersion;
+		TUidType iUids;
+		SSecurityInfo iS;
+		};
+
+	/**
+	@internalTechnology
+	@deprecated Use TInfoBuf
+	*/
+	typedef TPckgBuf<SInfo> SInfoBuf;
+
+	/**
+	@internalTechnology
+	*/
+	IMPORT_C static TInt GetInfo(const TDesC& aFileName, TDes8& aInfoBuf);
+private:
+	TInt InitL();
+	};
+
+
+
+
+/**
+@publishedAll
+@released
+
+A handle to a critical section.
+
+A critical section itself is a kernel object, and is implemented using
+a semaphore. The class RCriticalSection inherits privately from RSemaphore
+as a matter of implementation and this is, in effect, equivalent to using
+a semaphore.
+
+The public functions of RSemaphore are not part of the public API of this 
+class.
+
+As with all handles, they should be closed after use. This class provides 
+the necessary Close() function, which should be called when the handle is 
+no longer required.
+
+@see RHandleBase::Close
+*/
+class RCriticalSection : private RSemaphore
+	{
+public:
+	IMPORT_C RCriticalSection();
+	IMPORT_C TInt CreateLocal(TOwnerType aType=EOwnerProcess);
+	IMPORT_C void Close();
+	IMPORT_C void Wait();
+	IMPORT_C void Signal();
+	inline TBool IsBlocked() const;
+private:
+	TInt iBlocked;
+	};
+
+
+
+/**
+@publishedAll
+@released
+
+A handle to a mutex.
+
+The mutex itself is a kernel side object.
+
+Handles should be closed after use. RHandleBase provides the necessary Close() 
+function which should be called when the handle is no longer required.
+
+@see RHandleBase::Close
+*/
+class RMutex : public RHandleBase
+	{
+public:
+	inline TInt Open(const TFindMutex& aFind,TOwnerType aType=EOwnerProcess);
+	IMPORT_C TInt CreateLocal(TOwnerType aType=EOwnerProcess);
+	IMPORT_C TInt CreateGlobal(const TDesC& aName,TOwnerType aType=EOwnerProcess);
+	IMPORT_C TInt OpenGlobal(const TDesC& aName,TOwnerType aType=EOwnerProcess);
+	IMPORT_C TInt Open(RMessagePtr2 aMessage,TInt aParam,TOwnerType aType=EOwnerProcess);
+	IMPORT_C TInt Open(TInt aArgumentIndex, TOwnerType aType=EOwnerProcess);
+	IMPORT_C void Wait();
+	IMPORT_C void Signal();
+	IMPORT_C TBool IsHeld();
+	};
+
+
+
+/**
+@publishedAll
+@released
+
+A handle to a condition variable.
+
+The condition variable itself is a kernel side object.
+
+Handles should be closed after use. RHandleBase provides the necessary Close() 
+function which should be called when the handle is no longer required.
+
+@see RHandleBase::Close
+*/
+class RCondVar : public RHandleBase
+	{
+public:
+	IMPORT_C TInt CreateLocal(TOwnerType aType=EOwnerProcess);
+	IMPORT_C TInt CreateGlobal(const TDesC& aName, TOwnerType aType=EOwnerProcess);
+	IMPORT_C TInt OpenGlobal(const TDesC& aName, TOwnerType aType=EOwnerProcess);
+	IMPORT_C TInt Open(RMessagePtr2 aMessage, TInt aParam, TOwnerType aType=EOwnerProcess);
+	IMPORT_C TInt Open(TInt aArgumentIndex, TOwnerType aType=EOwnerProcess);
+	IMPORT_C TInt Wait(RMutex& aMutex);
+	IMPORT_C TInt TimedWait(RMutex& aMutex, TInt aTimeout);	// timeout in microseconds
+	IMPORT_C void Signal();
+	IMPORT_C void Broadcast();
+	};
+
+
+
+class UserHeap;
+class TChunkCreate;
+struct TChunkCreateInfo;
+/**
+@publishedAll
+@released
+
+A handle to a chunk.
+
+The chunk itself is a kernel side object.
+*/
+class RChunk : public RHandleBase
+	{
+public:
+    /**
+    @internalComponent
+    */
+	enum TAttribs
+		{
+		ENormal=0x00,
+		EDoubleEnded=0x01,
+		EDisconnected=0x02,
+		ELocal=0x00,
+		EGlobal=0x10,
+		EData=0x00,
+		ECode=0x20,
+		};
+
+	/**	
+    Set of flags used by SetRestrictions().
+    
+    @see RChunk::SetRestrictions
+    */
+	enum TRestrictions
+		{
+		EPreventAdjust = 0x01,  // Prevent Adjust, Commit, Allocate and Decommit
+		};
+public:
+	inline TInt Open(const TFindChunk& aFind,TOwnerType aType=EOwnerProcess);
+	IMPORT_C TInt CreateLocal(TInt aSize,TInt aMaxSize,TOwnerType aType=EOwnerProcess);
+	IMPORT_C TInt CreateLocalCode(TInt aSize,TInt aMaxSize,TOwnerType aType=EOwnerProcess);
+	IMPORT_C TInt CreateGlobal(const TDesC& aName,TInt aSize,TInt aMaxSize,TOwnerType aType=EOwnerProcess);
+	IMPORT_C TInt CreateDoubleEndedLocal(TInt aInitialBottom, TInt aInitialTop,TInt aMaxSize,TOwnerType aType=EOwnerProcess);
+	IMPORT_C TInt CreateDoubleEndedGlobal(const TDesC& aName,TInt aInitialBottom,TInt aInitialTop,TInt aMaxSize,TOwnerType aType=EOwnerProcess);
+	IMPORT_C TInt CreateDisconnectedLocal(TInt aInitialBottom, TInt aInitialTop,TInt aMaxSize,TOwnerType aType=EOwnerProcess);
+	IMPORT_C TInt CreateDisconnectedGlobal(const TDesC& aName,TInt aInitialBottom,TInt aInitialTop,TInt aMaxSize,TOwnerType aType=EOwnerProcess);
+	IMPORT_C TInt Create(TChunkCreateInfo& aCreateInfo);
+	IMPORT_C TInt SetRestrictions(TUint aFlags);
+	IMPORT_C TInt OpenGlobal(const TDesC& aName,TBool isReadOnly,TOwnerType aType=EOwnerProcess);
+	IMPORT_C TInt Open(RMessagePtr2 aMessage,TInt aParam,TBool isReadOnly,TOwnerType aType=EOwnerProcess);
+	IMPORT_C TInt Open(TInt aArgumentIndex, TOwnerType aType=EOwnerProcess);
+	IMPORT_C TInt Adjust(TInt aNewSize) const;
+	IMPORT_C TInt AdjustDoubleEnded(TInt aBottom, TInt aTop) const;
+	IMPORT_C TInt Commit(TInt anOffset, TInt aSize) const;
+	IMPORT_C TInt Allocate(TInt aSize) const;
+	IMPORT_C TInt Decommit(TInt anOffset, TInt aSize) const;
+	IMPORT_C TInt Unlock(TInt aOffset, TInt aSize);	/**< @internalTechnology */
+	IMPORT_C TInt Lock(TInt aOffset, TInt aSize);	/**< @internalTechnology */
+	IMPORT_C TUint8* Base() const;
+	IMPORT_C TInt Size() const;
+	IMPORT_C TInt Bottom() const;
+	IMPORT_C TInt Top() const;
+	IMPORT_C TInt MaxSize() const;
+	inline TBool IsReadable() const;
+	inline TBool IsWritable() const;
+private:
+	friend class UserHeap;
+	};
+
+
+/**
+This structure specifies the type and properties of the chunk to be created.  It
+is passed as a parameter to the RChunk::Create() method.
+
+@publishedAll
+@released
+*/
+struct TChunkCreateInfo
+	{
+public :
+	/**
+	Currently supported version numbers
+	@internalComponent
+	*/
+	enum TChunkCreateVersions
+		{
+		EVersion0,
+		ESupportedVersions,
+		};
+
+	friend class RChunk;
+
+	IMPORT_C TChunkCreateInfo();
+	IMPORT_C void SetNormal(TInt aInitialSize, TInt aMaxSize);
+	IMPORT_C void SetCode(TInt aInitialSize, TInt aMaxSize);
+	IMPORT_C void SetDoubleEnded(TInt aInitialBottom, TInt aInitialTop, TInt aMaxSize);
+	IMPORT_C void SetDisconnected(TInt aInitialBottom, TInt aInitialTop, TInt aMaxSize);
+	IMPORT_C void SetOwner(TOwnerType aType);
+	IMPORT_C void SetGlobal(const TDesC& aName);
+	IMPORT_C void SetClearByte(TUint8 aClearByte);
+	void SetThreadHeap(TInt aInitialSize, TInt aMaxSize, const TDesC& aName);
+
+protected :
+	/** The version number of this TChunkCreateInfo.
+	@internalComponent
+	*/
+	TUint iVersionNumber;
+	/** The type of the chunk to be created.
+	@internalComponent
+	*/
+	TUint iType;
+	/** Specify if chunk is global or not.
+	@internalComponent
+	*/
+	TBool iGlobal;
+	/**	The maximum size in bytes of the chunk to be created.
+	@internalComponent
+	*/
+	TInt iMaxSize;
+	/** An enumeration whose enumerators define the ownership of this chunk 
+		handle. If not explicitly specified, EOwnerProcess is taken as default.
+	@internalComponent
+	*/
+	TOwnerType iOwnerType;
+	/**	A pointer to a descriptor containing the name to be assigned to  
+		global chunks. The length of the descriptor must be no greater than 
+		that allowed for a TKName type.  Must be NULL for local chunks.
+	@internalComponent
+	*/
+	const TDesC* iName;
+	/** The offset of the bottom of the region to commit to the chunk on 
+		creation from the base of the chunk's reserved region.
+		This is only used for double ended and disconnected chunks.
+	@internalComponent
+	*/
+	TInt iInitialBottom;
+	/** The offset of the top of the region to commit to the chunk on 
+		creation from the base of the chunk's reserved region.
+		This is only used for double ended and disconnected chunks.
+	@internalComponent
+	*/
+	TInt iInitialTop;
+	/**	Attributes to the chunk to be created should have.
+		Should be set from one or more the values in TChunkCreateAttributes.
+	@internalComponent
+	*/
+	TUint iAttributes;
+	/** The byte to clear all the memory committed to the chunk to.
+	@internalComponent
+	*/
+	TUint8 iClearByte; 
+	/** @internalComponent*/
+	TUint8 iSpare1[3];
+	/** @internalComponent*/
+	TUint iSpare2;
+	};
+
+
+struct SStdEpocThreadCreateInfo;
+/**
+@publishedAll
+@released
+
+A set of static functions for constructing fixed length heaps and local or 
+global heaps.
+
+@see RHeap
+@see RChunk
+*/
+class UserHeap
+	{
+public:
+	enum TChunkHeapCreateMode {EChunkHeapSwitchTo=1, EChunkHeapDuplicate=2};
+	IMPORT_C static RHeap* FixedHeap(TAny* aBase, TInt aMaxLength, TInt aAlign=0, TBool aSingleThread=ETrue);
+	IMPORT_C static RHeap* ChunkHeap(const TDesC* aName, TInt aMinLength, TInt aMaxLength, TInt aGrowBy=1, TInt aAlign=0, TBool aSingleThread=EFalse);
+	IMPORT_C static RHeap* ChunkHeap(RChunk aChunk, TInt aMinLength, TInt aGrowBy=1, TInt aMaxLength=0, TInt aAlign=0, TBool aSingleThread=EFalse, TUint32 aMode=0);
+	IMPORT_C static RHeap* OffsetChunkHeap(RChunk aChunk, TInt aMinLength, TInt aOffset, TInt aGrowBy=1, TInt aMaxLength=0, TInt aAlign=0, TBool aSingleThread=EFalse, TUint32 aMode=0);
+	IMPORT_C static TInt SetupThreadHeap(TBool aNotFirst, SStdEpocThreadCreateInfo& aInfo);
+	IMPORT_C static TInt CreateThreadHeap(SStdEpocThreadCreateInfo& aInfo, RHeap*& aHeap, TInt aAlign=0, TBool aSingleThread=EFalse);
+	};
+
+
+
+
+/**
+@publishedAll
+@released
+
+Encapsulates the Id of a kernel object.
+*/
+class TObjectId
+	{
+public:
+	inline TObjectId();
+	inline TObjectId(TUint64 anId);
+	inline TUint64 Id() const;
+	inline operator TUint() const;
+	inline TBool operator==(TObjectId aId) const;
+	inline TBool operator!=(TObjectId aId) const;
+private:
+	TUint64 iId;
+	};
+
+
+
+
+/**
+@publishedAll
+@released
+
+Encapsulates the Id of a thread.
+
+An object of this type is not explicitly constructed in open code,
+but is returned by the Id() member function of a thread handle,
+an RThread type.
+
+@see RThread
+*/
+class TThreadId : public TObjectId
+	{
+public:
+	inline TThreadId();
+	inline TThreadId(TUint64 anId);
+	};
+
+
+
+
+class RProcess;
+
+
+/**
+@publishedAll
+@released
+
+A handle to a thread.
+
+The thread itself is a kernel object.
+*/
+class RThread : public RHandleBase
+	{
+public:
+	inline RThread();
+	IMPORT_C TInt Create(const TDesC& aName, TThreadFunction aFunction, TInt aStackSize, TInt aHeapMinSize, TInt aHeapMaxSize, TAny *aPtr, TOwnerType aType=EOwnerProcess);
+	IMPORT_C TInt Create(const TDesC& aName, TThreadFunction aFunction, TInt aStackSize, RAllocator* aHeap, TAny* aPtr, TOwnerType aType=EOwnerProcess);
+	IMPORT_C TInt Open(const TDesC& aFullName, TOwnerType aType=EOwnerProcess);
+	IMPORT_C TInt Open(TThreadId aID, TOwnerType aType=EOwnerProcess);
+	IMPORT_C TThreadId Id() const;
+	IMPORT_C void Resume() const;
+	IMPORT_C void Suspend() const;
+	/**
+	@publishedAll
+	@deprecated Use User::RenameThread() instead
+	*/
+	inline static TInt RenameMe(const TDesC& aName);
+
+	IMPORT_C void Kill(TInt aReason);
+	IMPORT_C void Terminate(TInt aReason);
+	IMPORT_C void Panic(const TDesC& aCategory,TInt aReason);
+	IMPORT_C TInt Process(RProcess& aProcess) const;
+	IMPORT_C TThreadPriority Priority() const;
+	IMPORT_C void SetPriority(TThreadPriority aPriority) const;
+	IMPORT_C TProcessPriority ProcessPriority() const;
+	IMPORT_C void SetProcessPriority(TProcessPriority aPriority) const;
+	IMPORT_C TInt RequestCount() const;
+	IMPORT_C TExitType ExitType() const;
+	IMPORT_C TInt ExitReason() const;
+	IMPORT_C TExitCategoryName ExitCategory() const;
+	IMPORT_C void RequestComplete(TRequestStatus*& aStatus,TInt aReason) const;
+	IMPORT_C void RequestSignal() const;
+	IMPORT_C void Logon(TRequestStatus& aStatus) const;
+	IMPORT_C TInt LogonCancel(TRequestStatus& aStatus) const;
+	IMPORT_C void HandleCount(TInt& aProcessHandleCount, TInt& aThreadHandleCount) const;
+	IMPORT_C void Context(TDes8& aDes) const;
+	IMPORT_C TInt StackInfo(TThreadStackInfo& aInfo) const;
+	IMPORT_C TInt GetCpuTime(TTimeIntervalMicroSeconds& aCpuTime) const;
+	inline TInt Open(const TFindThread& aFind,TOwnerType aType=EOwnerProcess);
+	IMPORT_C void Rendezvous(TRequestStatus& aStatus) const;
+	IMPORT_C TInt RendezvousCancel(TRequestStatus& aStatus) const;
+	IMPORT_C static void Rendezvous(TInt aReason);
+
+	/**
+	Return the Secure ID of the process to which the thread belongs.
+
+	If an intended use of this method is to check that the Secure ID is
+	a given value, then the use of a TSecurityPolicy object should be
+	considered. E.g. Instead of something like:
+
+	@code
+		RThread& thread;
+		TInt error = thread.SecureId()==KRequiredSecureId ? KErrNone : KErrPermissionDenied;
+	@endcode
+
+	this could be used;
+
+	@code
+		RThread& thread;
+		static _LIT_SECURITY_POLICY_S0(mySidPolicy, KRequiredSecureId);
+		TBool pass = mySidPolicy().CheckPolicy(thread);
+	@endcode
+
+	This has the benefit that the TSecurityPolicy::CheckPolicy methods are
+	configured by the system wide Platform Security configuration. I.e. are
+	capable of emitting diagnostic messages when a check fails and/or the
+	check can be forced to always pass.
+
+	@see TSecurityPolicy::CheckPolicy(RThread aThread, const char* aDiagnostic) const
+	@see _LIT_SECURITY_POLICY_S0
+
+	@return The Secure ID.
+	@publishedAll
+	@released
+	*/
+	IMPORT_C TSecureId SecureId() const;
+
+	/**
+	Return the Vendor ID of the process to which the thread belongs.
+
+	If an intended use of this method is to check that the Vendor ID is
+	a given value, then the use of a TSecurityPolicy object should be
+	considered. E.g. Instead of something like:
+
+	@code
+		RThread& thread;
+		TInt error = thread.VendorId()==KRequiredVendorId ? KErrNone : KErrPermissionDenied;
+	@endcode
+
+	this could be used;
+
+	@code
+		RThread& thread;
+		static _LIT_SECURITY_POLICY_V0(myVidPolicy, KRequiredVendorId);
+		TBool pass = myVidPolicy().CheckPolicy(thread);
+	@endcode
+
+	This has the benefit that the TSecurityPolicy::CheckPolicy methods are
+	configured by the system wide Platform Security configuration. I.e. are
+	capable of emitting diagnostic messages when a check fails and/or the
+	check can be forced to always pass.
+
+	@see TSecurityPolicy::CheckPolicy(RThread aThread, const char* aDiagnostic) const
+	@see _LIT_SECURITY_POLICY_V0
+
+	@return The Vendor ID.
+	@publishedAll
+    @released
+	*/
+	IMPORT_C TVendorId VendorId() const;
+
+	/**
+	Check if the process to which the thread belongs has a given capability
+
+	When a check fails the action taken is determined by the system wide Platform Security
+	configuration. If PlatSecDiagnostics is ON, then a diagnostic message is emitted.
+	If PlatSecEnforcement is OFF, then this function will return ETrue even though the
+	check failed.
+
+	@param aCapability The capability to test.
+	@param aDiagnostic A string that will be emitted along with any diagnostic message
+								that may be issued if the test finds the capability is not present.
+								This string must be enclosed in the __PLATSEC_DIAGNOSTIC_STRING macro
+								which enables it to be easily removed from the system.
+	@return ETrue if the process to which the thread belongs has the capability, EFalse otherwise.
+	@publishedAll
+    @released
+	*/
+#ifndef __REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__
+	inline TBool HasCapability(TCapability aCapability, const char* aDiagnostic=0) const;
+#else //__REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__
+	// Only available to NULL arguments
+	inline TBool HasCapability(TCapability aCapability, OnlyCreateWithNull aDiagnostic=NULL) const;
+#ifndef __REMOVE_PLATSEC_DIAGNOSTICS__
+	// For things using KSuppressPlatSecDiagnostic
+	inline TBool HasCapability(TCapability aCapability, OnlyCreateWithNull aDiagnostic, OnlyCreateWithNull aSuppress) const;
+#endif // !__REMOVE_PLATSEC_DIAGNOSTICS__
+#endif // !__REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__
+
+	/**
+	Check if the process to which the thread belongs has both of the given capabilities
+
+	When a check fails the action taken is determined by the system wide Platform Security
+	configuration. If PlatSecDiagnostics is ON, then a diagnostic message is emitted.
+	If PlatSecEnforcement is OFF, then this function will return ETrue even though the
+	check failed.
+
+	@param aCapability1 The first capability to test.
+	@param aCapability2 The second capability to test.
+	@param aDiagnostic A string that will be emitted along with any diagnostic message
+								that may be issued if the test finds a capability is not present.
+								This string must be enclosed in the __PLATSEC_DIAGNOSTIC_STRING macro
+								which enables it to be easily removed from the system.
+	@return ETrue if the process to which the thread belongs has both the capabilities, EFalse otherwise.
+	@publishedAll
+	@released
+	*/
+#ifndef __REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__
+	inline TBool HasCapability(TCapability aCapability1, TCapability aCapability2, const char* aDiagnostic=0) const;
+#else //__REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__
+	// Only available to NULL arguments
+	inline TBool HasCapability(TCapability aCapability1, TCapability aCapability2, OnlyCreateWithNull aDiagnostic=NULL) const;
+#ifndef __REMOVE_PLATSEC_DIAGNOSTICS__
+	// For things using KSuppressPlatSecDiagnostic
+	inline TBool HasCapability(TCapability aCapability, TCapability aCapability2, OnlyCreateWithNull aDiagnostic, OnlyCreateWithNull aSuppress) const;
+#endif // !__REMOVE_PLATSEC_DIAGNOSTICS__
+#endif // !__REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__
+
+	/** Function only temporarily supported to aid migration to process emulation...
+
+	@publishedAll
+	@deprecated Use process emulation instead
+	*/
+	inline TInt Create(const TDesC& aName,TThreadFunction aFunction,TInt aStackSize,TAny* aPtr,RLibrary* aLibrary,RHeap* aHeap, TInt aHeapMinSize,TInt aHeapMaxSize,TOwnerType aType);
+
+private:
+	// Implementations of functions with diagnostics
+	IMPORT_C TBool DoHasCapability(TCapability aCapability, const char* aDiagnostic) const;
+	IMPORT_C TBool DoHasCapability(TCapability aCapability) const;
+	IMPORT_C TBool DoHasCapability(TCapability aCapability1, TCapability aCapability2, const char* aDiagnostic) const;
+	IMPORT_C TBool DoHasCapability(TCapability aCapability1, TCapability aCapability2) const;
+	};
+
+/**
+@publishedAll
+@deprecated
+*/
+inline TInt RThread::Create(const TDesC& /*aName*/,TThreadFunction /*aFunction*/,TInt /*aStackSize*/,TAny* /*aPtr*/,RLibrary* /*aLibrary*/,RHeap* /*aHeap*/, TInt /*aHeapMinSize*/,TInt /*aHeapMaxSize*/,TOwnerType /*aType*/)
+	{return KErrNotSupported; }
+
+
+
+/**
+@publishedAll
+@released
+
+Encapsulates the Id of a process.
+
+An object of this type is not explicitly constructed in open code,
+but is returned by the Id() member function of a process handle,
+an RProcess type.
+
+@see RProcess
+*/
+class TProcessId : public TObjectId
+	{
+public:
+	inline TProcessId();
+	inline TProcessId(TUint64 anId);
+	};
+
+
+
+
+class RSubSessionBase;
+
+/** 
+@publishedAll
+@released
+
+A handle to a process.
+
+The process itself is a kernel object.
+*/
+class RProcess : public RHandleBase
+	{
+public:
+	inline RProcess();
+	IMPORT_C TInt Create(const TDesC& aFileName,const TDesC& aCommand,TOwnerType aType=EOwnerProcess);
+	IMPORT_C TInt Create(const TDesC& aFileName,const TDesC& aCommand,const TUidType &aUidType, TOwnerType aType=EOwnerProcess);
+	IMPORT_C TInt Open(const TDesC& aName,TOwnerType aType=EOwnerProcess);
+	IMPORT_C TInt Open(TProcessId aId,TOwnerType aType=EOwnerProcess);
+	IMPORT_C TUidType Type() const;
+	IMPORT_C TProcessId Id() const;
+	/**
+	@publishedAll
+	@deprecated Use User::RenameProcess() instead
+	*/
+	inline static TInt RenameMe(const TDesC& aName);
+
+	IMPORT_C void Kill(TInt aReason);
+	IMPORT_C void Terminate(TInt aReason);
+	IMPORT_C void Panic(const TDesC& aCategory,TInt aReason);
+	IMPORT_C void Resume();
+	IMPORT_C TFileName FileName() const;
+	IMPORT_C TExitType ExitType() const;
+	IMPORT_C TInt ExitReason() const;
+	IMPORT_C TExitCategoryName ExitCategory() const;
+	IMPORT_C TProcessPriority Priority() const;
+	IMPORT_C void SetPriority(TProcessPriority aPriority) const;
+    IMPORT_C TBool JustInTime() const;
+    IMPORT_C void SetJustInTime(TBool aBoolean) const; 
+	IMPORT_C void Logon(TRequestStatus& aStatus) const;
+	IMPORT_C TInt LogonCancel(TRequestStatus& aStatus) const;
+	IMPORT_C TInt GetMemoryInfo(TModuleMemoryInfo& aInfo) const;
+	inline TInt Open(const TFindProcess& aFind,TOwnerType aType=EOwnerProcess);
+	IMPORT_C void Rendezvous(TRequestStatus& aStatus) const;
+	IMPORT_C TInt RendezvousCancel(TRequestStatus& aStatus) const;
+	IMPORT_C static void Rendezvous(TInt aReason);
+
+	/**
+	Return the Secure ID of the process.
+
+	If an intended use of this method is to check that the Secure ID is
+	a given value, then the use of a TSecurityPolicy object should be
+	considered. E.g. Instead of something like:
+
+	@code
+		RProcess& process;
+		TInt error = process.SecureId()==KRequiredSecureId ? KErrNone : KErrPermissionDenied;
+	@endcode
+
+	this could be used;
+
+	@code
+		RProcess& process;
+		static _LIT_SECURITY_POLICY_S0(mySidPolicy, KRequiredSecureId);
+		TBool pass = mySidPolicy().CheckPolicy(process);
+	@endcode
+
+	This has the benefit that the TSecurityPolicy::CheckPolicy methods are
+	configured by the system wide Platform Security configuration. I.e. are
+	capable of emitting diagnostic messages when a check fails and/or the
+	check can be forced to always pass.
+
+	@see TSecurityPolicy::CheckPolicy(RProcess aProcess, const char* aDiagnostic) const
+	@see _LIT_SECURITY_POLICY_S0
+
+	@return The Secure ID.
+	@publishedAll
+	@released
+	*/
+	IMPORT_C TSecureId SecureId() const;
+
+	/**
+	Return the Vendor ID of the process.
+
+	If an intended use of this method is to check that the Vendor ID is
+	a given value, then the use of a TSecurityPolicy object should be
+	considered. E.g. Instead of something like:
+
+	@code
+		RProcess& process;
+		TInt error = process.VendorId()==KRequiredVendorId ? KErrNone : KErrPermissionDenied;
+	@endcode
+
+	this could be used;
+
+	@code
+		RProcess& process;
+		static _LIT_SECURITY_POLICY_V0(myVidPolicy, KRequiredVendorId);
+		TBool pass = myVidPolicy().CheckPolicy(process);
+	@endcode
+
+	This has the benefit that the TSecurityPolicy::CheckPolicy methods are
+	configured by the system wide Platform Security configuration. I.e. are
+	capable of emitting diagnostic messages when a check fails and/or the
+	check can be forced to always pass.
+
+	@see TSecurityPolicy::CheckPolicy(RProcess aProcess, const char* aDiagnostic) const
+	@see _LIT_SECURITY_POLICY_V0
+
+	@return The Vendor ID.
+	@publishedAll
+    @released
+	*/
+	IMPORT_C TVendorId VendorId() const;
+
+	/**
+	Check if the process has a given capability
+
+	When a check fails the action taken is determined by the system wide Platform Security
+	configuration. If PlatSecDiagnostics is ON, then a diagnostic message is emitted.
+	If PlatSecEnforcement is OFF, then this function will return ETrue even though the
+	check failed.
+
+	@param aCapability The capability to test.
+	@param aDiagnostic A string that will be emitted along with any diagnostic message
+								that may be issued if the test finds the capability is not present.
+								This string must be enclosed in the __PLATSEC_DIAGNOSTIC_STRING macro
+								which enables it to be easily removed from the system.
+	@return ETrue if the process has the capability, EFalse otherwise.
+	@publishedAll
+	@released
+	*/
+#ifndef __REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__
+	inline TBool HasCapability(TCapability aCapability, const char* aDiagnostic=0) const;
+#else //__REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__
+	// Only available to NULL arguments
+	inline TBool HasCapability(TCapability aCapability, OnlyCreateWithNull aDiagnostic=NULL) const;
+#ifndef __REMOVE_PLATSEC_DIAGNOSTICS__
+	// For things using KSuppressPlatSecDiagnostic
+	inline TBool HasCapability(TCapability aCapability, OnlyCreateWithNull aDiagnostic, OnlyCreateWithNull aSuppress) const;
+#endif // !__REMOVE_PLATSEC_DIAGNOSTICS__
+#endif // !__REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__
+
+	/**
+	Check if the process has both of the given capabilities
+
+	When a check fails the action taken is determined by the system wide Platform Security
+	configuration. If PlatSecDiagnostics is ON, then a diagnostic message is emitted.
+	If PlatSecEnforcement is OFF, then this function will return ETrue even though the
+	check failed.
+
+	@param aCapability1 The first capability to test.
+	@param aCapability2 The second capability to test.
+	@param aDiagnostic A string that will be emitted along with any diagnostic message
+								that may be issued if the test finds a capability is not present.
+								This string must be enclosed in the __PLATSEC_DIAGNOSTIC_STRING macro
+								which enables it to be easily removed from the system.
+	@return ETrue if the process has both the capabilities, EFalse otherwise.
+	@publishedAll
+	@released
+	*/
+#ifndef __REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__
+	inline TBool HasCapability(TCapability aCapability1, TCapability aCapability2, const char* aDiagnostic=0) const;
+#else //__REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__
+	// Only available to NULL arguments
+	inline TBool HasCapability(TCapability aCapability1, TCapability aCapability2, OnlyCreateWithNull aDiagnostic=NULL) const;
+#ifndef __REMOVE_PLATSEC_DIAGNOSTICS__
+	// For things using KSuppressPlatSecDiagnostic
+	inline TBool HasCapability(TCapability aCapability, TCapability aCapability2, OnlyCreateWithNull aDiagnostic, OnlyCreateWithNull aSuppress) const;
+#endif // !__REMOVE_PLATSEC_DIAGNOSTICS__
+#endif // !__REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__
+
+	IMPORT_C TInt SetParameter(TInt aIndex,  RHandleBase aHandle);
+	IMPORT_C TInt SetParameter(TInt aSlot, const RSubSessionBase& aSession);
+	IMPORT_C TInt SetParameter(TInt aSlot, const TDesC16& aDes);
+	IMPORT_C TInt SetParameter(TInt aSlot, const TDesC8& aDes);
+	IMPORT_C TInt SetParameter(TInt aSlot, TInt aData);
+	inline RProcess(TInt aHandle);
+
+	/**
+	@deprecated Use RProcess::SecureId() instead
+	*/
+	inline TUid Identity() const { return SecureId(); }
+
+	/**
+	Legacy Platform Security development and migration support
+	@internalAll
+	@deprecated No replacement
+	*/
+	enum TSecureApi { ESecureApiOff, ESecureApiOn, ESecureApiQuery }; // __SECURE_API__ remove this
+
+	/**
+	Legacy Platform Security development and migration support
+	@internalAll
+	@deprecated No replacement
+	*/
+	IMPORT_C TInt SecureApi(TInt aState); // __SECURE_API__ remove this
+
+	/**
+	Legacy Platform Security development and migration support
+	@internalAll
+	@deprecated No replacement
+	*/
+	enum TDataCaging { EDataCagingOff, EDataCagingOn, EDataCagingQuery}; // __DATA_CAGING__ __SECURE_API__ remove this
+
+	/**
+	Legacy Platform Security development and migration support
+	@internalAll
+	@deprecated No replacement
+	*/
+	IMPORT_C TInt DataCaging(TInt aState); // __DATA_CAGING__ __SECURE_API__ remove this
+	
+
+	IMPORT_C TInt CreateWithStackOverride(const TDesC& aFileName,const TDesC& aCommand, const TUidType &aUidType, TInt aMinStackSize, TOwnerType aType);
+
+	IMPORT_C static TAny* ExeExportData(void);
+
+private:
+	// Implementations of functions with diagnostics
+	IMPORT_C TBool DoHasCapability(TCapability aCapability, const char* aDiagnostic) const;
+	IMPORT_C TBool DoHasCapability(TCapability aCapability) const;
+	IMPORT_C TBool DoHasCapability(TCapability aCapability1, TCapability aCapability2, const char* aDiagnostic) const;
+	IMPORT_C TBool DoHasCapability(TCapability aCapability1, TCapability aCapability2) const;
+	};
+
+
+
+
+
+
+
+
+
+/**
+@internalTechnology
+*/
+class RServer2 : public RHandleBase
+	{
+public:
+	IMPORT_C TInt CreateGlobal(const TDesC& aName);
+	IMPORT_C TInt CreateGlobal(const TDesC& aName, TInt aMode);
+	IMPORT_C void Receive(RMessage2& aMessage,TRequestStatus& aStatus);
+	IMPORT_C void Receive(RMessage2& aMessage);
+	IMPORT_C void Cancel();
+	};
+
+
+
+
+/**
+@publishedAll
+@released
+
+Client-side handle to a session with a server.
+
+This is the client-side interface through which communication with the server
+is channelled.
+
+Clients normally define and implement a derived class to provide
+a richer interface.
+*/
+class RSessionBase : public RHandleBase
+	{
+	friend class RSubSessionBase;
+public:
+    /**
+    Indicates whether or not threads in the process are automatically attached
+    to the session when passed as a parameter to the Share() function.
+    */
+	enum TAttachMode {EExplicitAttach,EAutoAttach};
+public:
+	/**
+	Creates a session that can be shared by other threads in the current
+    process.
+    
+    After calling this function the session object may be used by threads other
+    than than the one that created it.
+    
+    Note that this can only be done with servers that mark their sessions
+    as sharable.
+    
+    @return	KErrNone, if the session is successfully shared;
+	        KErrNoMmemory, if the attempt fails for lack of memory.
+
+    @panic	KERN-EXEC 23 The session cannot be shared.
+    
+    @see CServer2
+    @see RSessionBase::ShareProtected()
+    @see CServer2::TServerType
+	*/
+	inline TInt ShareAuto()	{ return DoShare(EAutoAttach); }
+
+
+    /**
+    Creates a session handle that can be be passed via IPC to another process
+    as well as being shared by other threads in the current process.
+    
+    After calling this function the session object may be used by threads other
+    than than the one that created it.
+
+    Note that this can only be done with servers that mark their sessions
+    as globally sharable.
+    
+    @return	KErrNone, if the session is successfully shared;
+	        KErrNoMmemory, if the attempt fails for lack of memory.
+   
+    @panic	KERN-EXEC 23 The session cannot be shared.
+    
+    @see CServer2
+    @see RSessionBase::ShareAuto()
+    @see CServer2::TServerType
+    */
+	inline TInt ShareProtected() { return DoShare(EAutoAttach|KCreateProtectedObject); }
+
+
+	IMPORT_C TInt Open(RMessagePtr2 aMessage,TInt aParam,TOwnerType aType=EOwnerProcess);
+	IMPORT_C TInt Open(RMessagePtr2 aMessage,TInt aParam,const TSecurityPolicy& aServerPolicy,TOwnerType aType=EOwnerProcess);
+	IMPORT_C TInt Open(TInt aArgumentIndex, TOwnerType aType=EOwnerProcess);
+	IMPORT_C TInt Open(TInt aArgumentIndex, const TSecurityPolicy& aServerPolicy, TOwnerType aType=EOwnerProcess);
+	inline TInt SetReturnedHandle(TInt aHandleOrError);
+	IMPORT_C TInt SetReturnedHandle(TInt aHandleOrError,const TSecurityPolicy& aServerPolicy);
+protected:
+	inline TInt CreateSession(const TDesC& aServer,const TVersion& aVersion);
+	IMPORT_C TInt CreateSession(const TDesC& aServer,const TVersion& aVersion,TInt aAsyncMessageSlots);
+	IMPORT_C TInt CreateSession(const TDesC& aServer,const TVersion& aVersion,TInt aAsyncMessageSlots,TIpcSessionType aType,const TSecurityPolicy* aPolicy=0, TRequestStatus* aStatus=0);
+	inline TInt CreateSession(RServer2 aServer,const TVersion& aVersion);
+	IMPORT_C TInt CreateSession(RServer2 aServer,const TVersion& aVersion,TInt aAsyncMessageSlots);
+	IMPORT_C TInt CreateSession(RServer2 aServer,const TVersion& aVersion,TInt aAsyncMessageSlots,TIpcSessionType aType,const TSecurityPolicy* aPolicy=0, TRequestStatus* aStatus=0);
+	inline static TInt SetReturnedHandle(TInt aHandleOrError,RHandleBase& aHandle);
+
+	/**
+	@deprecated Use CreateSession(const TDesC& aServer,const TVersion& aVersion,TInt aAsyncMessageSlots,TIpcSessionType aType,const TSecurityPolicy* aPolicy=0, TRequestStatus* aStatus=0);
+	*/
+	inline TInt CreateSession(const TDesC& aServer,const TVersion& aVersion,TInt aAsyncMessageSlots,TRequestStatus* aStatus)
+		{ return CreateSession(aServer, aVersion, aAsyncMessageSlots, EIpcSession_Unsharable, (TSecurityPolicy*)0, aStatus); }
+	inline TInt Send(TInt aFunction,const TIpcArgs& aArgs) const;
+	inline void SendReceive(TInt aFunction,const TIpcArgs& aArgs,TRequestStatus& aStatus) const;
+	inline TInt SendReceive(TInt aFunction,const TIpcArgs& aArgs) const;
+	inline TInt Send(TInt aFunction) const;
+	inline void SendReceive(TInt aFunction,TRequestStatus& aStatus) const;
+	inline TInt SendReceive(TInt aFunction) const;
+private:
+	IMPORT_C TInt DoSend(TInt aFunction,const TIpcArgs* aArgs) const;
+	IMPORT_C void DoSendReceive(TInt aFunction,const TIpcArgs* aArgs,TRequestStatus& aStatus) const;
+	IMPORT_C TInt DoSendReceive(TInt aFunction,const TIpcArgs* aArgs) const;
+	TInt SendAsync(TInt aFunction,const TIpcArgs* aArgs,TRequestStatus* aStatus) const;
+	TInt SendSync(TInt aFunction,const TIpcArgs* aArgs) const;
+	IMPORT_C TInt DoShare(TInt aAttachMode);
+	TInt DoConnect(const TVersion &aVersion,TRequestStatus* aStatus);
+	};
+
+
+
+
+/**
+@publishedAll
+@released
+
+Client-side handle to a sub-session. 
+
+It represents a client-side sub-session, and has a corresponding sub-session
+object on the server-side.
+
+Clients normally define and implement a derived class to provide a richer
+interface. In particular, a derived class should:
+
+1. provide a function to create a new sub-session with the server;
+   this should call CreateSubSession().
+
+2. provide a function to close the current sub-session;
+   this should call CloseSubSession().
+
+A session must already exist with a server before a client can establish
+any sub-sessions.
+*/
+class RSubSessionBase
+	{
+public:
+	inline TInt SubSessionHandle() const;
+protected:
+	inline RSubSessionBase();
+	IMPORT_C const RSessionBase Session() const;
+	inline TInt CreateSubSession(const RSessionBase& aSession,TInt aFunction,const TIpcArgs& aArgs);
+	inline TInt CreateSubSession(const RSessionBase& aSession,TInt aFunction);
+	IMPORT_C TInt CreateAutoCloseSubSession(RSessionBase& aSession,TInt aFunction,const TIpcArgs& aArgs);
+	IMPORT_C void CloseSubSession(TInt aFunction);
+	inline TInt Send(TInt aFunction,const TIpcArgs& aArgs) const;
+	inline void SendReceive(TInt aFunction,const TIpcArgs& aArgs,TRequestStatus& aStatus) const;
+	inline TInt SendReceive(TInt aFunction,const TIpcArgs& aArgs) const;
+	inline TInt Send(TInt aFunction) const;
+	inline void SendReceive(TInt aFunction,TRequestStatus& aStatus) const;
+	inline TInt SendReceive(TInt aFunction) const;
+private:
+	IMPORT_C TInt DoCreateSubSession(const RSessionBase& aSession,TInt aFunction,const TIpcArgs* aArgs);
+	IMPORT_C TInt DoSend(TInt aFunction,const TIpcArgs* aArgs) const;
+	IMPORT_C void DoSendReceive(TInt aFunction,const TIpcArgs* aArgs,TRequestStatus& aStatus) const;
+	IMPORT_C TInt DoSendReceive(TInt aFunction,const TIpcArgs* aArgs) const;
+	TInt DoCreateSubSession(RSessionBase& aSession,TInt aFunction,const TIpcArgs* aArgs, TBool aAutoClose);
+private:
+	RSessionBase iSession;
+	TInt iSubSessionHandle;
+	};
+
+
+
+
+/**
+@publishedAll
+@released
+
+Base class that provides an implementation for the templated
+RRef class.
+
+@see RRef
+*/
+class RRefBase
+	{
+public:
+	IMPORT_C void Free();
+protected:
+	inline RRefBase();
+	inline RRefBase(const RRefBase& aRef);
+	IMPORT_C void DoAlloc(const TAny* aPtr,TInt aSize);
+	IMPORT_C void DoAllocL(const TAny* aPtr,TInt aSize);
+	IMPORT_C void Copy(const RRefBase& aRef);
+private:
+	IMPORT_C void operator=(const RRefBase& aRef);
+protected:
+	TInt* iPtr;
+	};
+
+
+
+
+/**
+@publishedAll
+@released
+
+Contains, or packages, a copy of an instance of another class.
+
+The template parameter defines the type of the contained object.
+
+The contained object is held in allocated memory, and can be accessed
+through the member selection and dereference operators.
+*/
+template <class T>
+class RRef : public RRefBase
+	{
+public:
+	inline RRef();
+	inline RRef(const RRef<T>& anObject);
+	inline void operator=(const RRef<T>& anObject);
+	inline T* operator->();
+	inline operator T*();
+	inline void Alloc(const T& anObject);
+	inline void Alloc(const T& anObject,TInt aSize);
+	inline void AllocL(const T& anObject);
+	inline void AllocL(const T& anObject,TInt aSize);
+	};
+
+
+
+
+/**
+@publishedAll
+@released
+
+A handle to a change notifier. 
+
+The change notifier itself is a kernel object.
+*/
+class RChangeNotifier : public RHandleBase
+	{
+public:
+	IMPORT_C TInt Create();
+	IMPORT_C TInt Logon(TRequestStatus& aStatus) const;
+	IMPORT_C TInt LogonCancel() const;
+	};
+
+
+
+
+/**
+@publishedAll
+@released
+
+Handle to a thread death notifier. 
+
+The notifier allows threads to be notified of the death of another thread. 
+
+The thread-death notifier itself is a kernel object.
+*/
+class RUndertaker : public RHandleBase
+	{
+public:
+	IMPORT_C TInt Create();
+	IMPORT_C TInt Logon(TRequestStatus& aStatus,TInt& aThreadHandle) const;
+	IMPORT_C TInt LogonCancel() const;
+	};
+
+
+
+
+
+class HBufC16;
+/**
+@publishedAll
+@released
+
+A handle to a session with the extended notifier server that provides support
+for plug-in notifiers.
+
+The interface allows engines or other low level components
+to communicate with the UI.
+*/
+class RNotifier : public RSessionBase
+	{
+public:
+	IMPORT_C RNotifier();
+	IMPORT_C TInt Connect();
+	IMPORT_C void Close();
+	IMPORT_C TInt StartNotifier(TUid aNotifierUid,const TDesC8& aBuffer);
+	IMPORT_C TInt StartNotifier(TUid aNotifierUid,const TDesC8& aBuffer,TDes8& aResponse);
+	IMPORT_C TInt StartNotifier(TUid aNotifierDllUid,TUid aNotifierUid,const TDesC8& aBuffer,TDes8& aResponse);
+	IMPORT_C TInt CancelNotifier(TUid aNotifierUid);
+	IMPORT_C TInt UpdateNotifier(TUid aNotifierUid,const TDesC8& aBuffer,TDes8& aResponse);
+	IMPORT_C void UpdateNotifierAndGetResponse(TRequestStatus& aRs,TUid aNotifierUid,const TDesC8& aBuffer,TDes8& aResponse);
+	IMPORT_C void StartNotifierAndGetResponse(TRequestStatus& aRs,TUid aNotifierUid,const TDesC8& aBuffer,TDes8& aResponse);
+	IMPORT_C void StartNotifierAndGetResponse(TRequestStatus& aRs,TUid aNotifierDllUid,TUid aNotifierUid,const TDesC8& aBuffer,TDes8& aResponse);
+	IMPORT_C TInt UnloadNotifiers(TUid aNotifierUid);
+	IMPORT_C TInt LoadNotifiers(TUid aNotifierUid);
+	IMPORT_C void Notify(const TDesC& aLine1,const TDesC& aLine2,const TDesC& aBut1,const TDesC& aBut2,TInt& aButtonVal,TRequestStatus& aStatus);
+	IMPORT_C void NotifyCancel();
+	IMPORT_C TInt InfoPrint(const TDesC& aDes);
+private:
+	TPtr8 iButtonVal;
+	HBufC16* iCombinedBuffer;
+	};
+
+/**
+@publishedAll
+@released
+
+Abstract class that defines a handler to work with the TRAP mechanism.
+
+Symbian OS provides a trap handler and this class does not normally need to be
+used or accessed directly by applications and third party code.
+*/
+class TTrapHandler
+	{
+public:
+	IMPORT_C TTrapHandler();
+	
+	/**
+	Called when a TRAP is invoked.
+	*/
+	IMPORT_C virtual void Trap()=0;
+	
+	/**
+	Called when a function exits a TRAP without leaving.
+    */
+	IMPORT_C virtual void UnTrap()=0;
+	
+	/**
+	Called when a function within a TRAP leaves.
+
+    @param aValue The leave value.
+	*/
+	IMPORT_C virtual void Leave(TInt aValue)=0;
+	};
+
+
+
+
+struct TCollationMethod; // forward declaration
+
+
+
+
+/**
+@publishedAll
+@released
+
+Contains a set of static functions which perform manipulation of
+data in memory.
+
+The arguments passed to the functions of this class are pointers to memory 
+locations and length values. These functions are, therefore, not normally 
+used in open code but are suitable for implementing data manipulation for 
+other classes. Typically the interface provided by such classes is typesafe 
+and hides this direct memory to memory manipulation.
+*/
+class Mem
+	{
+public:
+	inline static TUint8* Copy(TAny* aTrg, const TAny* aSrc, TInt aLength);
+	inline static TUint8* Move(TAny* aTrg, const TAny* aSrc, TInt aLength);
+	inline static void Fill(TAny* aTrg, TInt aLength, TChar aChar);
+	inline static void FillZ(TAny* aTrg, TInt aLength);
+#ifndef __GCC32__
+	inline static TInt Compare(const TUint8* aLeft, TInt aLeftL, const TUint8* aRight, TInt aRightL);
+#else
+	IMPORT_C static TInt Compare(const TUint8* aLeft, TInt aLeftL, const TUint8* aRight, TInt aRightL);
+#endif
+
+	IMPORT_C static TInt Compare(const TUint16* aLeft, TInt aLeftL, const TUint16* aRight, TInt aRightL);
+	IMPORT_C static TInt CompareF(const TUint8* aLeft, TInt aLeftL, const TUint8* aRight, TInt aRightL);
+	IMPORT_C static TInt CompareF(const TUint16* aLeft, TInt aLeftL, const TUint16* aRight, TInt aRightL);
+	IMPORT_C static TInt CompareC(const TUint8* aLeft, TInt aLeftL, const TUint8* aRight, TInt aRightL);
+	IMPORT_C static TInt CompareC(const TUint16* aLeft, TInt aLeftL, const TUint16* aRight, TInt aRightL);
+	IMPORT_C static TInt CompareC(const TUint16* aLeft, TInt aLeftL, const TUint16* aRight, TInt aRightL,
+								  TInt aMaxLevel, const TCollationMethod* aCollationMethod);
+	IMPORT_C static TInt CollationMethods();
+	IMPORT_C static TUint CollationMethodId(TInt aIndex);
+	IMPORT_C static const TCollationMethod* CollationMethodByIndex(TInt aIndex);
+	IMPORT_C static const TCollationMethod* CollationMethodById(TUint aId);
+	IMPORT_C static const TCollationMethod* GetDefaultMatchingTable();
+	IMPORT_C static void Swap(TAny* aPtr1, TAny* aPtr2, TInt aLength);
+	IMPORT_C static void Crc(TUint16& aCrc, const TAny* aPtr, TInt aLength);
+	IMPORT_C static void Crc32(TUint32& aCrc, const TAny* aPtr, TInt aLength);
+	};
+
+
+
+
+
+/**
+@publishedAll
+@released
+
+Set of static user functions.
+
+These functions are related to a number of System component APIs.
+
+The majority of the functions are related to either the current thread, or 
+its heap. Examples in this category include User::Exit(), which causes the 
+thread to terminate, and User::Alloc(), which allocates memory from the current 
+thread's heap.
+
+Some of these functions are equivalent to functions in the RThread or RHeap 
+classes. In these cases, the User function is a convenient way to access the 
+function without first having to get a handle to the current thread.
+
+Functions are also provided to support debugging of memory leaks. These function 
+calls can be written explicitly or can be generated using a corresponding 
+macro - the advantage of using a macro is that the function call is only 
+generated for debug builds.
+
+A final category of functions, which includes User::BinarySearch() and User::QuickSort(), 
+are just useful functions which have no other natural home.
+
+@see RThread
+@see RHeap
+*/
+class User : public UserHeap
+    {
+public:
+    // Execution control
+	IMPORT_C static void InitProcess();			/**< @internalComponent */
+    IMPORT_C static void Exit(TInt aReason);
+    IMPORT_C static void Panic(const TDesC& aCategory,TInt aReason);
+    IMPORT_C static void HandleException(TAny* aInfo);	/**< @internalComponent */
+    // Cleanup support
+    IMPORT_C static void Leave(TInt aReason);
+    IMPORT_C static void LeaveNoMemory();
+    IMPORT_C static TInt LeaveIfError(TInt aReason);
+    IMPORT_C static TAny* LeaveIfNull(TAny* aPtr);
+    IMPORT_C static TTrapHandler* SetTrapHandler(TTrapHandler* aHandler);
+    IMPORT_C static TTrapHandler* TrapHandler();
+    IMPORT_C static TTrapHandler* MarkCleanupStack();   /**< @internalComponent */
+    IMPORT_C static void UnMarkCleanupStack(TTrapHandler* aHandler);   /**< @internalComponent */
+	IMPORT_C static void LeaveEnd();	/**< @internalComponent */
+    // Infoprint
+    IMPORT_C static TInt InfoPrint(const TDesC& aDes);
+    // Asynchronous service support
+    IMPORT_C static void RequestComplete(TRequestStatus*& aStatus,TInt aReason);
+    IMPORT_C static void WaitForAnyRequest();
+    IMPORT_C static void WaitForRequest(TRequestStatus& aStatus); 
+    IMPORT_C static void WaitForRequest(TRequestStatus& aStatus1,TRequestStatus& aStatus2);
+    IMPORT_C static void WaitForNRequest(TRequestStatus *aStatusArray[], TInt aNum);
+    // User heap management
+    IMPORT_C static TInt AllocLen(const TAny* aCell); 
+    IMPORT_C static TAny* Alloc(TInt aSize);
+    IMPORT_C static TAny* AllocL(TInt aSize); 
+    IMPORT_C static TAny* AllocLC(TInt aSize);
+    IMPORT_C static TAny* AllocZ(TInt aSize);
+    IMPORT_C static TAny* AllocZL(TInt aSize); 
+    IMPORT_C static TInt AllocSize(TInt& aTotalAllocSize); 
+    IMPORT_C static TInt Available(TInt& aBiggestBlock); 
+    IMPORT_C static TInt CountAllocCells();
+    IMPORT_C static TInt CountAllocCells(TInt& aFreeCount); 
+    IMPORT_C static void Free(TAny* aCell);
+    IMPORT_C static void FreeZ(TAny*& aCell); 
+    IMPORT_C static RAllocator& Allocator();
+    inline static RHeap& Heap();
+    IMPORT_C static TAny* ReAlloc(TAny* aCell, TInt aSize, TInt aMode=0);
+    IMPORT_C static TAny* ReAllocL(TAny* aCell, TInt aSize, TInt aMode=0);
+    IMPORT_C static RAllocator* SwitchAllocator(RAllocator* aAllocator);
+	inline static RHeap* SwitchHeap(RAllocator* aHeap);
+	IMPORT_C static TInt CompressAllHeaps();
+    // Synchronous timer services
+    IMPORT_C static void After(TTimeIntervalMicroSeconds32 aInterval);
+    IMPORT_C static TInt At(const TTime& aTime);
+    IMPORT_C static void AfterHighRes(TTimeIntervalMicroSeconds32 aInterval);
+    // Set time and deal with timezones
+    IMPORT_C static TInt SetHomeTime(const TTime& aTime);
+    IMPORT_C static TInt SetHomeTimeSecure(const TTime& aTime);
+	IMPORT_C static TInt SetUTCTime(const TTime& aUTCTime);
+	IMPORT_C static TInt SetUTCTimeSecure(const TTime& aUTCTime);
+	IMPORT_C static TTimeIntervalSeconds UTCOffset();
+	IMPORT_C static void SetUTCOffset(TTimeIntervalSeconds aOffset);
+	IMPORT_C static TInt SetUTCTimeAndOffset(const TTime& aUTCTime, TTimeIntervalSeconds aOffset);
+    // Set locale information
+    IMPORT_C static TInt SetCurrencySymbol(const TDesC& aSymbol);
+	// Set floating point mode
+	IMPORT_C static TInt SetFloatingPointMode(TFloatingPointMode aMode, TFloatingPointRoundingMode aRoundingMode=EFpRoundToNearest);
+	// Timers
+	IMPORT_C static TUint TickCount();
+	IMPORT_C static TUint32 NTickCount();
+	IMPORT_C static TTimerLockSpec LockPeriod();
+	IMPORT_C static TTimeIntervalSeconds InactivityTime();
+	IMPORT_C static void ResetInactivityTime();
+	IMPORT_C static TUint32 FastCounter();
+	// Atomic operations
+	IMPORT_C static TInt LockedInc(TInt& aValue);
+	IMPORT_C static TInt LockedDec(TInt& aValue);
+	IMPORT_C static TInt SafeInc(TInt& aValue);
+	IMPORT_C static TInt SafeDec(TInt& aValue);
+    // Beep
+    IMPORT_C static TInt Beep(TInt aFrequency,TTimeIntervalMicroSeconds32 aDuration); 
+    // Information
+    IMPORT_C static TInt IsRomAddress(TBool& aBool,TAny* aPtr);
+    // Algorithms
+    IMPORT_C static TInt BinarySearch(TInt aCount,const TKey& aKey,TInt& aPos);
+    IMPORT_C static TInt QuickSort(TInt aCount,const TKey& aKey,const TSwap& aSwap);
+    // Language-dependent character functions 
+    IMPORT_C static TLanguage Language();
+    IMPORT_C static TUint Collate(TUint aChar); 
+    IMPORT_C static TUint Fold(TUint aChar); 
+    IMPORT_C static TUint LowerCase(TUint aChar); 
+    IMPORT_C static TUint UpperCase(TUint aChar); 
+	IMPORT_C static TUint Fold(TUint aChar,TInt aFlags);
+	IMPORT_C static TUint TitleCase(TUint aChar);
+    // C-style string length
+    IMPORT_C static TInt StringLength(const TUint8* aString); 
+    IMPORT_C static TInt StringLength(const TUint16* aString);
+    // Device management
+    IMPORT_C static TInt FreeLogicalDevice(const TDesC& aDeviceName); 
+	IMPORT_C static TInt FreePhysicalDevice(const TDesC& aDriverName); 
+    IMPORT_C static TInt LoadLogicalDevice(const TDesC& aFileName); 
+    IMPORT_C static TInt LoadPhysicalDevice(const TDesC& aFileName); 
+    // Version information
+    IMPORT_C static TBool QueryVersionSupported(const TVersion& aCurrent,const TVersion& aRequested);
+    IMPORT_C static TVersion Version();
+    // Machine configuration
+    IMPORT_C static TInt SetMachineConfiguration(const TDesC8& aConfig);
+    IMPORT_C static TInt MachineConfiguration(TDes8& aConfig,TInt& aSize);
+    // Debugging support
+    IMPORT_C static void SetDebugMask(TUint32 aVal);
+    IMPORT_C static void SetDebugMask(TUint32 aVal, TUint aIndex);
+    IMPORT_C static void SetJustInTime(const TBool aBoolean); 
+    IMPORT_C static void Check();
+    IMPORT_C static void Invariant();
+    IMPORT_C static TBool JustInTime();
+    IMPORT_C static void __DbgMarkStart(TBool aKernel);
+    IMPORT_C static void __DbgMarkCheck(TBool aKernel, TBool aCountAll, TInt aCount, const TUint8* aFileName, TInt aLineNum);
+    IMPORT_C static TUint32 __DbgMarkEnd(TBool aKernel, TInt aCount);
+    IMPORT_C static void __DbgSetAllocFail(TBool aKernel, RAllocator::TAllocFail aFail, TInt aRate);
+    IMPORT_C static void __DbgSetBurstAllocFail(TBool aKernel, RAllocator::TAllocFail aFail, TUint aRate, TUint aBurst);
+	IMPORT_C static TUint __DbgCheckFailure(TBool aKernel);
+	IMPORT_C static void PanicUnexpectedLeave(); /**< @internalComponent */
+    // Name Validation
+    IMPORT_C static TInt ValidateName(const TDesC& aName);
+	// Instruction Memory Barrier
+	IMPORT_C static void IMB_Range(TAny* aStart, TAny* aEnd);
+	//
+	IMPORT_C static TInt CommandLineLength();
+	IMPORT_C static void CommandLine(TDes &aCommand);
+	IMPORT_C static TExceptionHandler ExceptionHandler();
+	IMPORT_C static TInt SetExceptionHandler(TExceptionHandler aHandler,TUint32 aMask);
+	IMPORT_C static void ModifyExceptionMask(TUint32 aClearMask, TUint32 aSetMask);
+	IMPORT_C static TInt RaiseException(TExcType aType);
+	IMPORT_C static TBool IsExceptionHandled(TExcType aType);
+
+	/**
+	A set of values that defines the effect that terminating a thread 
+	has, either on its owning process or on the whole system.
+	
+	A thread is said to be critical if its owning process or the entire system
+	terminates when the thread itself terminates. 
+	
+	You pass one of these values to the functions:
+	- User::SetCritical()
+	- User::SetProcessCritical()
+	
+	The meaning of a value when passed to one function is different to
+	its meaning when passed the other function. See the description of each
+	individual value.
+			
+	@see User::SetCritical()
+	@see User::SetProcessCritical()
+	*/
+	enum TCritical {
+	
+	
+	               /**
+                   This value can be passed to both:
+                   - User::SetCritical(), which means that the current thread
+                   is no longer critical, i.e. termination of the current
+                   thread will no longer cause termination of the current thread's
+                   owning process (i.e. the current process) or a reboot of the system.
+                   - User::SetProcessCritical(), which means that threads
+                   subsequently created in the current thread's owning
+                   process (i.e. the current process) will no longer cause termination of that
+                   process or a reboot of the system. Note, however, that existing
+                   threads are NOT affected when you call this function.
+                   
+                   @see User::SetCritical()
+                   @see User::SetProcessCritical()
+                   */
+                   ENotCritical, 
+                   
+                                      
+                   /**
+                   This value can only be passed to User::SetCritical() and
+                   affects the current thread only.
+                   
+                   It means that the owning process (i.e.the current process)
+                   terminates if:
+                   - the current thread is terminated.
+                   - the current thread panics.
+                   
+                   @see User::SetCritical()
+                   */	
+	               EProcessCritical,
+
+	               
+	               /**
+                   This value can only be passed to User::SetCritical() and
+                   affects the current thread only.
+                   
+                   It means that the owning process (i.e.the current process)
+                   terminates if the current thread terminates for any reason.
+                   
+                   @see User::SetCritical()
+                   */
+	               EProcessPermanent,
+	               
+	               
+	               /**
+	               This value can only be passed to User::SetProcessCritical() and
+                   affects any new threads created in the current process.
+	               
+	               It means that the current process terminates if:
+	               - any new thread subsequently created in the current process is terminated.
+	               - any new thread subsequently created in the current process panics.
+	               .
+	               Note, however, that existing threads in the current process
+	               are NOT affected when you call User::SetProcessCritical()
+	               with this value.
+	               	               
+	               @see EProcessCritical
+                   @see User::SetProcessCritical()
+	               */
+	               EAllThreadsCritical,
+	                	                
+	                
+	               /**
+	               This value can be passed to both: User::SetCritical() and
+	               User::SetProcessCritical().
+                   
+                   When passed to User::SetCritical(), it means that
+                   the entire system is rebooted if:
+                   - the current thread is terminated.
+                   - the current thread panics.
+                   
+                   When passed to User::SetProcessCritical(), it means that
+                   the entire system is rebooted if:
+                   - any new thread subsequently created in the current process is terminated.
+                   - any new thread subsequently created in the current process panics.
+                   - the process itself is terminated
+                   - the process itself panics
+	               
+	               Note:
+                   -# existing threads in the current process are NOT affected when you
+                   call User::SetProcessCritical() with this value.
+                   -# Only a process with 'Protected Server' capability can set a
+                   thread to system-critical.
+                   
+                   @see User::SetCritical()
+                   @see User::SetProcessCritical()
+	               */
+	               ESystemCritical,
+	               
+	               
+	               /**
+	               This value can be passed to both: User::SetCritical()
+	               and User::SetProcessCritical().
+                   
+                   When passed to User::SetCritical(), it means that
+                   the entire system is rebooted if the current thread
+                   exits for any reason.
+                   
+                   When passed to User::SetProcessCritical(), it means that
+                   the entire system is rebooted if any new thread 
+                   subsequently created in the current process exits
+                   for any reason, or if the process itself exits for any reason.
+	               
+	               Note:
+                   -# existing threads in the current process are NOT affected when you
+                   call User::SetProcessCritical() with this value.
+                   -# Only a process with 'Protected Server' capability can set a
+                   thread to system-permanent.
+                   
+                   @see User::SetCritical()
+                   @see User::SetProcessCritical()
+	               */
+	               ESystemPermanent
+	               };
+	IMPORT_C static TCritical Critical();
+	IMPORT_C static TCritical Critical(RThread aThread);
+	IMPORT_C static TInt SetCritical(TCritical aCritical);
+	IMPORT_C static TCritical ProcessCritical();
+	IMPORT_C static TCritical ProcessCritical(RProcess aProcess);
+	IMPORT_C static TInt SetProcessCritical(TCritical aCritical);
+	IMPORT_C static TBool PriorityControl();
+	IMPORT_C static void SetPriorityControl(TBool aEnable);
+
+	/**
+	A threads realtime state.
+	Some non-realtime behaviour can be detected by the kernel. When it does so,
+	action is taken depending on the thread state:
+	-	ERealtimeStateOff - no action.
+	-	ERealtimeStateOn - the the thread will be panicked with KERN-EXEC 61 (EIllegalFunctionForRealtimeThread).
+	-	ERealtimeStateWarn - no action. However, if the kernel trace flag KREALTIME is enabled
+							 then tracing will be emitted as if the thread state was ERealtimeStateOn.
+	@publishedPartner
+	@prototype
+	*/
+	enum TRealtimeState
+		{
+		ERealtimeStateOff,	/**< Thread is not realtime */
+		ERealtimeStateOn,	/**< Thread is realtime */
+		ERealtimeStateWarn	/**< Thread is realtime but doesn't want this enforced */
+		};
+
+	/**
+	Set the current threads realtime state.
+	@see TRealtimeState
+	@param aState The state
+	@return KErrNone if successful. KErrArgument if aState is invalid.
+	@publishedPartner
+	@prototype
+	*/
+	IMPORT_C static TInt SetRealtimeState(TRealtimeState aState);
+
+	/**
+	Return the Secure ID of the process that created the current process.
+	@return The Secure ID.
+	@publishedAll
+	@released
+	*/
+	IMPORT_C static TSecureId CreatorSecureId();
+
+	/**
+	Return the Vendor ID of the process that created the current process.
+	@return The Vendor ID.
+	@publishedAll
+	@released
+	*/
+	IMPORT_C static TVendorId CreatorVendorId();
+
+	/**
+	Check if the process that created the current process has a given capability
+
+	When a check fails the action taken is determined by the system wide Platform Security
+	configuration. If PlatSecDiagnostics is ON, then a diagnostic message is emitted.
+	If PlatSecEnforcement is OFF, then this function will return ETrue even though the
+	check failed.
+
+	@param aCapability The capability to test.
+	@param aDiagnostic A string that will be emitted along with any diagnostic message
+								that may be issued if the test finds the capability is not present.
+								This string must be enclosed in the __PLATSEC_DIAGNOSTIC_STRING macro
+								which enables it to be easily removed from the system.
+	@return ETrue if the creator process has the capability, EFalse otherwise.
+	@publishedAll
+	@released
+	*/
+#ifndef __REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__
+	inline static TBool CreatorHasCapability(TCapability aCapability, const char* aDiagnostic=0);
+#else //__REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__
+	// Only available to NULL arguments
+	inline static TBool CreatorHasCapability(TCapability aCapability, OnlyCreateWithNull aDiagnostic=NULL);
+#ifndef __REMOVE_PLATSEC_DIAGNOSTICS__
+	// For things using KSuppressPlatSecDiagnostic
+	inline static TBool CreatorHasCapability(TCapability aCapability, OnlyCreateWithNull aDiagnostic, OnlyCreateWithNull aSuppress);
+#endif // !__REMOVE_PLATSEC_DIAGNOSTICS__
+#endif // !__REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__
+
+	/**
+	Check if the process that created the current process has both of the given capabilities
+
+	When a check fails the action taken is determined by the system wide Platform Security
+	configuration. If PlatSecDiagnostics is ON, then a diagnostic message is emitted.
+	If PlatSecEnforcement is OFF, then this function will return ETrue even though the
+	check failed.
+
+	@param aCapability1 The first capability to test.
+	@param aCapability2 The second capability to test.
+	@param aDiagnostic A string that will be emitted along with any diagnostic message
+								that may be issued if the test finds a capability is not present.
+								This string must be enclosed in the __PLATSEC_DIAGNOSTIC_STRING macro
+								which enables it to be easily removed from the system.
+	@return ETrue if the creator process has both the capabilities, EFalse otherwise.
+	@publishedAll
+	@released
+	*/
+#ifndef __REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__
+	inline static TBool CreatorHasCapability(TCapability aCapability1, TCapability aCapability2, const char* aDiagnostic=0);
+#else //__REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__
+	// Only available to NULL arguments
+	inline static TBool CreatorHasCapability(TCapability aCapability1, TCapability aCapability2, OnlyCreateWithNull aDiagnostic=NULL);
+#ifndef __REMOVE_PLATSEC_DIAGNOSTICS__
+	// For things using KSuppressPlatSecDiagnostic
+	inline static TBool CreatorHasCapability(TCapability aCapability, TCapability aCapability2, OnlyCreateWithNull aDiagnostic, OnlyCreateWithNull aSuppress);
+#endif // !__REMOVE_PLATSEC_DIAGNOSTICS__
+#endif // !__REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__
+
+	IMPORT_C static TInt ParameterLength(TInt aSlot);
+	IMPORT_C static TInt GetTIntParameter(TInt aSlot, TInt& aData);
+	IMPORT_C static TInt GetDesParameter(TInt aSlot, TDes8& aDes);
+	IMPORT_C static TInt GetDesParameter(TInt aSlot, TDes16& aDes);
+	IMPORT_C static TInt RenameThread(const TDesC &aName);
+	IMPORT_C static TInt RenameProcess(const TDesC &aName);
+	/*
+	User::Identity() has been deprecated and is available for backward
+	compatibility purposes only.
+
+	Use RProcess().SecureId() instead.
+    
+	@deprecated
+	*/
+	inline static TUid Identity() { return RProcess().SecureId(); }
+
+	/*
+	User::CreatorIdentity() has been deprecated and is available for backward
+	compatibility purposes only.
+
+	Use CreatorSecureId() instead.
+	
+	@deprecated
+	*/
+	static inline TUid CreatorIdentity() { return CreatorSecureId(); }
+
+	IMPORT_C static void NotifyOnIdle(TRequestStatus& aStatus);			/**< @internalTechnology */
+	IMPORT_C static void CancelMiscNotifier(TRequestStatus& aStatus);	/**< @internalTechnology */
+private:
+	// Implementations of functions with diagnostics
+	IMPORT_C static TBool DoCreatorHasCapability(TCapability aCapability, const char* aDiagnostic);
+	IMPORT_C static TBool DoCreatorHasCapability(TCapability aCapability);
+	IMPORT_C static TBool DoCreatorHasCapability(TCapability aCapability1, TCapability aCapability2, const char* aDiagnostic);
+	IMPORT_C static TBool DoCreatorHasCapability(TCapability aCapability1, TCapability aCapability2);
+	};
+
+
+
+
+class ExecHandler;
+
+/**
+@internalComponent
+@removed
+*/
+typedef void (*TTlsCleanupHandler)(TAny*);		//don't use
+
+/**
+@publishedAll
+@released
+
+A collection of static functions involved in managing access to
+thread-local storage. 
+
+Thread-local storage is a single machine word of static writable memory.
+The scope of this machine word is the thread, which means that there is one
+word per thread. The word is only accessible to code running in a DLL.
+
+In practice, this word is almost always used to hold a pointer to allocated
+memory; this makes that memory available to all DLL code running on behalf
+of the same thread.
+
+Note that DLL code running on behalf of one thread does not see the same word when
+running on behalf of another thread. 
+
+The class in not intended for user derivation.
+*/
+class Dll
+	{
+public:
+	static TInt SetTls(TAny* aPtr);
+	static TAny* Tls();
+	static void FreeTls();
+	static void FileName(TFileName &aFileName);
+	};
+
+
+
+
+#ifndef __TOOLS__
+/**
+@publishedAll
+@released
+
+A thin wrapper class for C++ arrays allowing automatic checking of index values 
+to ensure that all accesses are legal. 
+
+The class also supports the deletion of objects.
+
+The class is templated, based on a class type and an integer value. The class 
+type defines the type of object contained in the array; the integer value 
+defines the size (dimension) of the array.
+
+A wrapper object can be:
+
+1. embedded in objects allocated on the heap.
+
+2. used on the program stack.
+*/
+template <class T,TInt S> 
+class TFixedArray
+	{
+	typedef TFixedArray<T,S> ThisClass;
+public:
+	inline TFixedArray();
+	inline TFixedArray(const T* aList, TInt aLength);
+	//
+	inline void Copy(const T* aList, TInt aLength);
+	inline void Reset();		// zero fill
+	inline void DeleteAll();
+	//
+	inline TInt Count() const;
+	inline TInt Length() const;
+	// Accessors - debug range checking
+	inline T& operator[](TInt aIndex);
+	inline const T& operator[] (TInt aIndex) const;
+	// Accessors - always range checking
+	inline T& At(TInt aIndex);
+	inline const T& At(TInt aIndex) const;
+	// Provides pointers to the beginning and end of the array
+	inline T* Begin();
+	inline T* End();
+	inline const T* Begin() const;
+	inline const T* End() const;
+	//
+	inline TArray<T> Array() const;
+protected:
+	inline static TBool InRange(TInt aIndex);
+	inline static TInt CountFunctionR(const CBase* aThis);
+	inline static const TAny* AtFunctionR(const CBase* aThis,TInt aIndex);
+protected:
+	T iRep[S];
+	};
+
+
+
+
+/**
+@publishedAll
+@released
+*/
+#define DECLARE_ROM_ARRAY( AName, AData, AType ) \
+   	const TFixedArray<AType,(sizeof(AData)/sizeof((AData)[0]))>& \
+            AName = *(reinterpret_cast<const TFixedArray<AType, \
+                           (sizeof(AData)/sizeof((AData)[0]))>* > (AData))
+#endif
+
+// Global leaving operator new
+/**
+@publishedAll
+@released
+*/
+inline TAny* operator new(TUint aSize, TLeave);
+/**
+@publishedAll
+@released
+*/
+inline TAny* operator new(TUint aSize, TLeave, TUint aExtraSize);
+#if !defined(__VC32__) || defined (__MSVCDOTNET__)
+/**
+@publishedAll
+@released
+*/
+inline TAny* operator new[](TUint aSize, TLeave);
+#endif
+
+
+#ifdef __LEAVE_EQUALS_THROW__
+/** Macro to assert in all builds that code does not leave
+
+@param	_s	C++ statements to be executed which should not leave
+@panic	USER 194 if the code being checked does leave
+
+@publishedAll
+@released
+*/
+#define	__ASSERT_ALWAYS_NO_LEAVE(_s)	\
+	{														\
+	try	{													\
+		TTrapHandler* ____t = User::MarkCleanupStack();		\
+		_s;													\
+		User::UnMarkCleanupStack(____t);					\
+		}													\
+	catch (XLeaveException& /*l*/)							\
+		{													\
+		User::PanicUnexpectedLeave();						\
+		}													\
+	catch (...)												\
+		{													\
+		User::Invariant();									\
+		}													\
+	}
+
+#else
+/** Macro to assert in all builds that code does not leave
+
+@param	_s	C++ statements to be executed which should not leave
+@panic	USER 194 if the code being checked does leave
+
+@publishedAll
+@released
+*/
+#define	__ASSERT_ALWAYS_NO_LEAVE(_s)	\
+	{									\
+	TInt _r;							\
+	TTrap _t;							\
+	if (_t.Trap(_r) == 0)				\
+		{								\
+		_s;								\
+		TTrap::UnTrap();				\
+		}								\
+	else								\
+		User::PanicUnexpectedLeave();	\
+	}
+#endif
+
+/** Macro to assert in debug builds that code does not leave
+
+@param	_s	C++ statements to be executed which should not leave
+@panic	USER 194 if the code being checked does leave
+
+@publishedAll
+@released
+*/
+#ifdef _DEBUG
+#define	__ASSERT_DEBUG_NO_LEAVE(_s)		__ASSERT_ALWAYS_NO_LEAVE(_s)
+#else
+#define	__ASSERT_DEBUG_NO_LEAVE(_s)		{ _s; }
+#endif
+
+/**
+This is a panic handler function pointer for PREQ2104.
+*/
+typedef void (*TPanicHandler)(const TDesC&,TInt);
+
+
+
+// Inline methods
+#include <e32std.inl>
+
+#ifndef SYMBIAN_ENABLE_SPLIT_HEADERS
+#include <e32std_private.h>
+#endif
+
+#endif
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32/include/e32std.inl	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,7439 @@
+// Copyright (c) 1994-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32\include\e32std.inl
+// 
+//
+
+// Global leaving operator new
+inline TAny* operator new(TUint aSize, TLeave)
+	{return User::AllocL(aSize);}
+inline TAny* operator new(TUint aSize, TLeave, TUint aExtraSize)
+	{return User::AllocL(aSize + aExtraSize);}
+#if !defined(__VC32__) || defined (__MSVCDOTNET__)
+inline TAny* operator new[](TUint aSize, TLeave)
+	{return User::AllocL(aSize);}
+#endif
+
+
+
+
+// class Mem
+inline TUint8* Mem::Copy(TAny* aTrg, const TAny* aSrc, TInt aLength)
+/**
+Copies data from a source location to a target location and returns a pointer 
+to the end of the copied data.
+	
+The source and target areas can overlap.
+	
+The copy operation is optimised so that if both source and target locations 
+are aligned on a word boundary, the operation performs the copy on a word 
+by word basis.
+	
+@param aTrg    A pointer to the target location for the copy operation. 
+@param aSrc    A pointer to the source location for the copy operation. 
+@param aLength The number of bytes to be copied. This value must not
+               be negative. 
+
+@return A pointer to a location aLength bytes beyond aTrg (i.e. the location 
+        aTrg+aLength).
+
+@panic USER 90 In debug builds only, if aLength is negative. 
+*/
+	{ return (TUint8*)memmove(aTrg, aSrc, aLength) + aLength; }
+
+
+
+
+inline TUint8* Mem::Move(TAny* aTrg, const TAny* aSrc, TInt aLength)
+/**
+Moves a block of data from a source location to a target location and returns 
+a pointer to the end of the moved data.
+	
+The source and target areas can overlap.
+	
+Both source and target locations must be aligned on a word boundary. 
+The specified length must also be a multiple of 4.
+	
+@param aTrg    A pointer to the target location for the move operation. This 
+               pointer must be word aligned. 
+@param aSrc    A pointer to the source location for the move operation. This
+               pointer must be word aligned.
+@param aLength The number of bytes to be copied. This value must be a multiple 
+               of 4.
+			   
+@return A pointer to a location aLength bytes beyond aTrg (i.e. the location 
+        aTrg+aLength).
+
+@panic USER 93 In debug builds only, if aTrg is not word aligned.
+@panic USER 92 In debug builds only, if aSrc is not word aligned.
+@panic USER 91 In debug builds only, if aLength is not a multiple of 4.
+*/
+	{ return (TUint8*)wordmove(aTrg, aSrc, aLength) + aLength; }
+
+
+
+
+inline void Mem::Fill(TAny* aTrg, TInt aLength, TChar aChar)
+/**
+Fills a specified block of data with a specified character, replacing
+any existing content.
+	
+The function assumes that the fill character is a non-Unicode character.
+	
+@param aTrg    A pointer to the location where filling is to start. 
+@param aLength The number of bytes to be filled. This value must not
+               be negative. 
+@param aChar   The fill character.
+
+@panic USER 95 In debug builds only, if aLength is negative.  
+*/
+	{ memset(aTrg, (TInt)(aChar.operator TUint()), aLength); }
+
+
+
+
+inline void Mem::FillZ(TAny* aTrg,TInt aLength)
+/**
+Fills a specified block of data with binary zeroes (i.e. 0x00), replacing any 
+existing content.
+	
+@param aTrg    A pointer to the location where filling is to start. 
+@param aLength The number of bytes to be filled. This value must not
+               be negative. 
+	
+@panic USER 95 In debug builds only, if aLength is negative.  
+*/
+	{ memclr(aTrg, aLength); }
+
+
+
+#ifndef __TOOLS2__
+#if !(defined(__GCC32__) && defined(__MARM__))
+inline TInt Mem::Compare(const TUint8* aLeft, TInt aLeftL, const TUint8* aRight, TInt aRightL)
+/**
+Compares a block of data at one specified location with a block of data at 
+another specified location.
+
+The comparison proceeds on a byte for byte basis, the result of the comparison 
+is based on the difference of the first bytes to disagree.
+
+The data at the two locations are equal if they have the same length and content. 
+Where the lengths are different and the shorter section of data is the same 
+as the first part of the longer section of data, the shorter is considered 
+to be less than the longer.
+
+@param aLeft   A pointer to the first (or left) block of 8 bit data
+               to be compared.
+@param aLeftL  The length of the first (or left) block of data to be compared,  
+               i.e. the number of bytes.
+@param aRight  A pointer to the second (or right) block of 8 bit data to be 
+               compared.
+@param aRightL The length of the second (or right) block of data to be compared 
+               i.e. the number of bytes.
+               
+@return Positive, if the first (or left) block of data is greater than the 
+        second (or right) block of data.
+        Negative, if the first (or left) block of data is less than the
+        second (or right) block of data.
+        Zero, if both the first (or left) and second (or right) blocks of data
+        have the same length and the same content.
+*/
+	{ return memcompare(aLeft, aLeftL, aRight, aRightL); }
+#endif
+#endif // __TOOLS2__
+
+
+
+// class RHeap
+inline TInt RHeap::SetBrk(TInt aBrk)
+	{ return ((RChunk*)&iChunkHandle)->Adjust(aBrk); }
+
+
+
+
+// class TChar
+#ifndef __KERNEL_MODE__
+inline void TChar::SetChar(TUint aChar)
+	{iChar=aChar;}
+
+
+
+
+inline void TChar::Fold()
+/**
+Converts the character to a form which can be used in tolerant comparisons 
+without control over the operations performed. 
+
+Tolerant comparisons are those which ignore character differences like case 
+and accents.
+
+This function can be used when searching for a string in a text file or a 
+file in a directory. Folding performs the following conversions: converts 
+to lowercase, strips accents, converts all digits representing the values 
+0..9 to the ordinary digit characters '0'..'9', converts all spaces (standard, 
+non-break, fixed-width, ideographic, etc.) to the ordinary space character 
+(0x0020), converts Japanese characters in the hiragana syllabary to katakana, 
+and converts East Asian halfwidth and fullwidth variants to their ordinary 
+forms. You can choose to perform any subset of these operations by using the 
+other function overload.
+
+@see User::Fold
+*/
+	{iChar=User::Fold(iChar);}
+
+
+
+
+inline void TChar::LowerCase()
+/**
+Converts the character to its lowercase form.
+
+Characters lacking a lowercase form are unchanged.
+
+@see User::LowerCase
+*/
+	{iChar=User::LowerCase(iChar);}
+
+
+
+
+inline void TChar::UpperCase()
+/**
+Converts the character to its uppercase form.
+
+Characters lacking an uppercase form are unchanged.
+
+@see User::UpperCase
+*/
+	{iChar=User::UpperCase(iChar);}
+
+
+
+
+#ifdef _UNICODE
+inline void TChar::Fold(TInt aFlags)
+/**
+Converts the character to a form which can be used in tolerant comparisons 
+allowing selection of the specific fold operations to be performed.
+
+@param aFlags Flags which define the operations to be performed. The values 
+              are defined in the enum beginning with EFoldCase.
+
+@see TChar::EFoldCase
+@see User::Fold
+*/
+	{iChar=User::Fold(iChar,aFlags);}
+
+
+
+
+inline void TChar::TitleCase()
+/**
+Converts the character to its titlecase form.
+
+The titlecase form of a character is identical to its uppercase form unless 
+a specific titlecase form exists. Characters lacking a titlecase form are 
+unchanged.
+*/
+	{iChar=User::TitleCase(iChar);}
+#endif
+
+
+
+
+inline TBool TChar::Eos() const
+/**
+Tests whether the character is the C/C++ end-of-string character - 0.
+
+@return True, if the character is 0; false, otherwise.
+*/
+	{return(iChar==0);}
+#endif // _UNICODE
+
+
+
+
+// Class TCallBack
+inline TCallBack::TCallBack()
+/**
+Default constructor.
+	
+Sets the function pointer to Null.
+*/
+	{iFunction=NULL;}
+
+
+
+
+inline TCallBack::TCallBack(TInt (*aFunction)(TAny *aPtr))
+	: iFunction(aFunction),iPtr(NULL)
+/**
+Constructs the callback object with the specified callback function.
+
+@param aFunction A pointer to the callback function. It takes an argument of
+                 type TAny* and returns a TInt.
+				 It must be either a static member of a class or a function
+				 which is not a member of any class. 
+*/
+	{}
+
+
+
+
+inline TCallBack::TCallBack(TInt (*aFunction)(TAny *aPtr),TAny *aPtr)
+	: iFunction(aFunction),iPtr(aPtr)
+/**
+Constructs the callback object with the specified callback function and
+a pointer to any object.
+
+@param aFunction A pointer to the callback function. It takes an argument of
+                 type TAny* and returns a TInt.
+				 It must be either a static member of a class or a function
+				 which is not a member of any class. 
+@param aPtr      A pointer which is always passed to the callback function.
+*/
+	{}
+
+
+
+
+/**
+Calls the callback function.
+	
+@return The value returned by the callback function. The meaning of this value
+        depends entirely on the context in which the callback function
+        is called.
+        For example, when used with the CIdle class, a false (zero) value
+        indicates that the callback function should not be 	called again.
+        As another example, when used with the CPeriodic class, the return
+        value is ignored and is irrelevant in that context.
+
+@see CIdle
+@see CPeriodic        
+*/
+inline TInt TCallBack::CallBack() const
+	{ return (iFunction ? (*iFunction)(iPtr) : 0); }
+
+
+
+
+// Class TSglQue
+template <class T>
+inline TSglQue<T>::TSglQue()
+/**
+Constructs an empty list header and sets the offset value of the link object 
+to zero.
+
+In practice, never assume that the offset of the link object from the start 
+of a list element is zero, even if the link object is declared as the first 
+data member in the list element class.
+
+If this default constructor is used, then call the SetOffset() function of 
+the base class to ensure that the offset value is set correctly.
+
+@see TSglQueBase::SetOffset
+*/
+	{}
+
+
+
+
+template <class T>
+inline TSglQue<T>::TSglQue(TInt aOffset)
+	: TSglQueBase(aOffset)
+/**
+Constructs an empty list header and sets the offset of the link object to the 
+specified value.
+
+@param aOffset The offset of the link object from the start of a list element. 
+                The macro _FOFF can be used to calculate this value.
+				
+@panic USER 75, if aOffset is not divisible by four.
+
+@see _FOFF
+*/
+	{}
+
+
+
+
+template <class T>
+inline void TSglQue<T>::AddFirst(T &aRef)
+/**
+Inserts the specified list element at the front of the singly linked list.
+
+If the list is not empty, the specified element becomes the first in the list. 
+What was previously the first element becomes the second in the list.
+
+@param aRef The list element to be inserted at the front of the singly linked 
+            list.
+*/
+	{DoAddFirst(&aRef);}
+
+
+
+
+template <class T>
+inline void TSglQue<T>::AddLast(T &aRef)
+/**
+Inserts the specified list element at the back of the singly linked list.
+
+If the list is not empty, the specified element becomes the last in the list. 
+What was previously the last element becomes the next to last element in the 
+list.
+
+@param aRef The list element to be inserted at the back of the singly linked 
+            list.
+*/
+	{DoAddLast(&aRef);}
+
+
+
+
+template <class T>
+inline TBool TSglQue<T>::IsFirst(const T *aPtr) const
+/**
+Tests whether the specified element is the first in the singly linked list.
+
+@param aPtr A pointer to the element whose position in the list is to be
+            checked.
+
+@return True, if the element is the first in the list; false, otherwise.
+*/
+	{return(PtrAdd(aPtr,iOffset)==(T *)iHead);}
+
+
+
+
+template <class T>
+inline TBool TSglQue<T>::IsLast(const T *aPtr) const
+/**
+Tests whether the specified element is the last in the singly linked list.
+
+@param aPtr A pointer to the element whose position in the list is 
+            to be checked.
+
+@return True, if the element is the last in the list; false, otherwise.
+*/
+	{return(PtrAdd(aPtr,iOffset)==(T *)iLast);}
+
+
+
+
+template <class T>
+inline T *TSglQue<T>::First() const
+/**
+Gets a pointer to the first list element in the singly linked list.
+
+@return A pointer to the first list element in the singly linked list. If 
+        the list is empty, this pointer is not necessarily NULL and must not
+		be assumed to point to a valid object.
+*/
+	{return(PtrSub((T *)iHead,iOffset));}
+
+
+
+
+template <class T>
+inline T *TSglQue<T>::Last() const
+/**
+Gets a pointer to the last list element in the singly linked list.
+
+@return A pointer to the last list element in the singly linked list. If the 
+        list is empty, this pointer is not necessarily NULL and must not be
+		assumed to point to a valid object.
+*/
+	{return(PtrSub((T *)iLast,iOffset));}
+
+
+
+
+template <class T>
+inline void TSglQue<T>::Remove(T &aRef)
+/**
+Removes the specified element from the singly linked list.
+
+The singly linked list must not be empty.
+
+@param aRef A list element to be removed from the singly linked list.
+
+@panic USER 76, if the element to be removed is not in the list
+*/
+	{DoRemove(&aRef);}
+
+
+
+
+// Class TDblQue
+template <class T>
+inline TDblQue<T>::TDblQue()
+/**
+Constructs an empty list header and sets the offset value of the link object 
+to zero.
+
+In practice, never assume that the offset of the link object from the start 
+of a list element is zero, even if the link object is declared as the first 
+data member in the list element class.
+
+If this default constructor is used, then call the SetOffset() function of 
+the base class to ensure that the offset value is set correctly.
+
+@see TDblQueBase::SetOffset()
+*/
+	{}
+
+
+
+
+template <class T>
+inline TDblQue<T>::TDblQue(TInt aOffset)
+	: TDblQueBase(aOffset)
+/**
+Constructs an empty list header and sets the offset of the link object to the 
+specified value.
+
+@param aOffset The offset of the link object from the start of a list element. 
+                The macro _FOFF can be used to calculate this value.
+				
+@panic USER 78. if aOffset is not divisble by 4.
+				  
+@see _FOFF
+*/
+	{}
+
+
+
+
+template <class T>
+inline void TDblQue<T>::AddFirst(T &aRef)
+/**
+Inserts the specified list element at the front of the doubly linked list.
+
+If the list is not empty, the specified element becomes the first in the list. 
+What was previously the first element becomes the second in the list.
+
+@param aRef The list element to be inserted at the front of the doubly linked 
+            list.
+*/
+	{DoAddFirst(&aRef);}
+
+
+
+
+template <class T>
+inline void TDblQue<T>::AddLast(T &aRef)
+/**
+Inserts the specified list element at the back of the doubly linked list.
+
+If the list is not empty, the specified element becomes the last in the list. 
+What was previously the last element becomes the next to last element in the 
+list.
+
+@param aRef The list element to be inserted at the back of the doubly linked 
+            list.
+*/
+	{DoAddLast(&aRef);}
+
+
+
+
+template <class T>
+inline TBool TDblQue<T>::IsHead(const T *aPtr) const
+/**
+Tests whether the end of a list has been reached.
+
+A doubly linked list is circular; in following the chain of elements in a 
+list (e.g. using the iterator operator++ or operator--), the chain eventually 
+reaches the end of the list and aPtr corresponds to the header (although it 
+will not point to a valid T object).
+
+@param aPtr The pointer value to be checked. 
+
+@return True, if the end of the list has been reached. False, if the end of 
+        the list has not been reached; aPtr points to an element in the list.
+*/
+	{return(PtrAdd(aPtr,iOffset)==(T *)&iHead);}
+
+
+
+
+template <class T>
+inline TBool TDblQue<T>::IsFirst(const T *aPtr) const
+/**
+Tests whether the specified element is the first in the doubly linked list.
+
+@param aPtr A pointer to the element whose position in the list is to be checked.
+
+@return True, if the element is the first in the list; false, otherwise.
+*/
+	{return(PtrAdd(aPtr,iOffset)==(T *)iHead.iNext);}
+
+
+
+
+template <class T>
+inline TBool TDblQue<T>::IsLast(const T *aPtr) const
+/**
+Tests whether the specified element is the last in the doubly linked list.
+
+@param aPtr A pointer to the element whose position in the list is to be checked.
+
+@return True, if the element is the last in the list; false, otherwise.
+*/
+	{return(PtrAdd(aPtr,iOffset)==(T *)iHead.iPrev);}
+
+
+
+
+template <class T>
+inline T *TDblQue<T>::First() const
+/**
+Gets a pointer to the first list element in the doubly linked list.
+
+@return A pointer to the first list element in the doubly linked list. If 
+        the list is empty, this pointer is not necessarily NULL and must not
+		be assumed to point to a valid object.
+*/
+	{
+#if defined (_DEBUG)
+	__DbgTestEmpty();
+#endif
+    return(PtrSub((T *)iHead.iNext,iOffset));
+    }
+
+
+
+
+template <class T>
+inline T *TDblQue<T>::Last() const
+/**
+Gets a pointer to the last list element in the doubly linked list.
+
+@return A pointer to the last list element in the doubly linked list. If the 
+        list is empty, this pointer is not necessarily NULL and must not be assumed 
+        to point to a valid object.
+*/
+	{
+#if defined (_DEBUG)
+	__DbgTestEmpty();
+#endif
+	return(PtrSub((T *)iHead.iPrev,iOffset));
+	}
+
+
+
+
+// Class TPriQue
+template <class T>
+inline TPriQue<T>::TPriQue()
+/**
+Default constructor.
+
+Constructs an empty list header and sets the offset value of the link
+object to zero.
+
+In practice, never assume that the offset of the link object from the start
+of a list element is zero, even if the link object is declared as the first
+data member in the list element class.
+
+If this default constructor is used, then call the SetOffset() function of
+the base class to ensure that the offset value is set correctly.
+
+@see TDblQueBase::SetOffset
+*/
+	{}
+
+
+
+
+template <class T>
+inline TPriQue<T>::TPriQue(TInt aOffset)
+	: TDblQueBase(aOffset)
+/**
+Constructs an empty list header and sets the offset of the link object
+to the specified value.
+
+@param aOffset The offset of the link object from the start of a list element.
+                The macro _FOFF can be used to calculate this value.
+				
+@panic USER 78 if aOffset is not divisible by four.		  
+*/
+	{}
+
+
+
+
+template <class T>
+inline void TPriQue<T>::Add(T &aRef)
+/**
+Inserts the specified list element in descending priority order.
+
+If there is an existing list element with the same priority, then the new
+element is added after the existing element.
+
+@param aRef The list element to be inserted.
+*/
+	{DoAddPriority(&aRef);}
+
+
+
+
+template <class T>
+inline TBool TPriQue<T>::IsHead(const T *aPtr) const
+/**
+Tests whether the end of a list has been reached.
+
+A doubly linked list is circular; in following the chain of elements in a list
+(e.g. using the iterator operator++ or operator--), the chain eventually
+reaches the end of the list and aPtr corresponds to the header (although it
+will not point to a valid T object).
+
+@param aPtr The pointer value to be checked.
+
+@return True, if the end of the list has been reached. False, if the end of the
+        list has not been reached; aPtr points to an element in the list.
+*/
+	{return(PtrAdd(aPtr,iOffset)==(T *)&iHead);}
+
+
+
+
+template <class T>
+inline TBool TPriQue<T>::IsFirst(const T *aPtr) const
+/**
+Tests whether the specified element is the first in the linked list.
+
+@param aPtr A pointer to the element whose position in the list is to
+            be checked.
+
+@return True, if the element is the first in the list; false, otherwise.
+*/
+	{return(PtrAdd(aPtr,iOffset)==(T *)iHead.iNext);}
+
+
+
+
+template <class T>
+inline TBool TPriQue<T>::IsLast(const T *aPtr) const
+/**
+Tests whether the specified element is the last in the linked list.
+
+@param aPtr A pointer to the element whose position in the list is to
+            be checked.
+
+@return True, if the element is the last in the list; false, otherwise.
+*/
+	{return(PtrAdd(aPtr,iOffset)==(T *)iHead.iPrev);}
+
+
+
+
+template <class T>
+inline T *TPriQue<T>::First() const
+/**
+Gets a pointer to the first list element in the linked list.
+
+@return A pointer to the first list element in the linked list.
+        If the list is empty, this pointer is not necessarily NULL and must
+		not be assumed to point to a valid object.
+*/
+	{return(PtrSub((T *)iHead.iNext,iOffset));}
+
+
+
+
+template <class T>
+inline T *TPriQue<T>::Last() const
+/**
+Gets a pointer to the last list element in the linked list.
+
+@return A pointer to the last list element in the linked list.
+        If the list is empty, this pointer is not necessarily NULL and must
+		not be assumed to point to a valid object.
+*/
+	{return(PtrSub((T *)iHead.iPrev,iOffset));}
+
+
+
+
+// Class TDeltaQue
+template <class T>
+inline TDeltaQue<T>::TDeltaQue()
+/**
+Constructs an empty list header and sets the offset value of the link object 
+to zero.
+
+In practice, never assume that the offset of the link object from the start 
+of a list element is zero, even if the link object is declared as the first 
+data member in the list element class.
+
+If this default constructor is used, then call the TDblQueBase::SetOffset() 
+function in the base class to ensure that the offset value is set correctly.
+
+TDeltaQueBase::iFirstDelta is set to NULL.
+
+@see TDblQueBase::SetOffset
+*/
+	{}
+
+
+
+
+template <class T>
+inline TDeltaQue<T>::TDeltaQue(TInt aOffset)
+	: TDeltaQueBase(aOffset)
+/**
+Constructs an empty list header and sets the offset of the link object to the 
+specified value.
+
+TDeltaQueBase::iFirstDelta is set to NULL.
+
+@param aOffset The offset of the link object from the start of a list element. 
+                The macro _FOFF can be used to calculate this value. 
+
+@panic USER 78, if aOffset is not divisible by four.
+				  
+@see _FOFF
+*/
+	{}
+
+
+
+
+template <class T>
+inline void TDeltaQue<T>::Add(T &aRef,TInt aDelta)
+/**
+Adds the specified list element, having the specified 'distance' from the
+nominal zero point, into the list.
+
+The element is added into the list, the adjacent delta values adjusted, and 
+a suitable delta value assigned to the new element, so that the new element 
+is at the specified 'distance' from the nominal zero point.
+
+@param aRef   The list element to be inserted.
+@param aDelta The 'distance' from the nominal zero point.
+*/
+	{DoAddDelta(&aRef,aDelta);}
+
+
+
+
+template <class T>
+inline void TDeltaQue<T>::Remove(T &aRef)
+/**
+Removes the specified list element from the linked list.
+
+The delta value of the element following the removed element is adjusted
+so that its 'distance' from the nominal zero point remains the same.
+
+@param aRef The list element to be removed.
+*/
+	{DoRemove(&aRef);}
+
+
+
+
+template <class T>
+inline T *TDeltaQue<T>::RemoveFirst()
+/**
+Removes the first list element from the linked list if its delta value is zero 
+or negative.
+
+@return A pointer to the element removed from the linked list. This is NULL, 
+        if the first element has a positive delta value.
+*/
+	{return((T *) DoRemoveFirst());}
+
+
+
+
+// Class TSglQueIter
+template <class T>
+inline TSglQueIter<T>::TSglQueIter(TSglQueBase &aQue)
+	: TSglQueIterBase(aQue)
+/**
+Constructs the iterator for the specified singly linked list.
+
+The iterator can be constructed whether or not the list contains any elements.
+
+If the list does contain elements, the iterator pointer is set to the first one.
+
+If the list has no elements, the iterator pointer is not set and the conversion 
+operator T*() and the post increment operator ++ subsequently return NULL. 
+Once elements have been added to the list, use either the
+TSglQueIter::Set() function or the TSglQueIterBase::SetToFirst() function to set the 
+iterator pointer.
+
+@param aQue A reference to a singly linked list header.
+
+@see TSglQueIter::Set
+@see TSglQueIterBase::SetToFirst
+*/
+	{}
+
+
+
+
+template <class T>
+inline void TSglQueIter<T>::Set(T &aLink)
+/**
+Sets the iterator to point to a specific element in the list.
+
+This function can be used to alter the pointer at any time during the iterator's 
+existence. The referenced element must be in the list, otherwise the result 
+is undefined.
+
+@param aLink A reference to the element from where iteration is to continue.
+*/
+	{DoSet(&aLink);}
+
+
+
+
+template <class T>
+inline TSglQueIter<T>::operator T *()
+/**
+Gets a pointer to the iterator’s current element.
+
+The operator is normally used implicitly; e.g. some member functions of the
+list header class TSglQue require a pointer to an element (of type class T)
+as a parameter, but in practice an iterator is often passed instead.
+This operator performs the necessary conversion.
+*/
+	{return((T *)DoCurrent());}
+
+
+
+
+template <class T>
+inline T *TSglQueIter<T>::operator++(TInt)
+/**
+Gets a pointer to the iterator's current element and then sets the iterator 
+to point to the next element.
+
+Repeated use of this operator allows successive elements to be accessed.
+
+@return A pointer to the current list element, if the iterator points to an 
+        element. NULL, if the iterator does not point to an element; i.e. the
+		iterator pointer has reached the end of the list.
+*/
+	{return((T *)DoPostInc());}
+
+
+
+
+// Class TDblQueIter
+template <class T>
+inline TDblQueIter<T>::TDblQueIter(TDblQueBase &aQue)
+	: TDblQueIterBase(aQue)
+/**
+Constructs the iterator for the specified doubly linked list
+
+The iterator can be constructed whether or not the list contains any elements.
+
+If the list does contain elements, the iterator pointer is set to the first one.
+
+If the list has no elements, the iterator pointer is not set and the conversion 
+operator T*(), the post increment operator++() and the post decrement operator 
+--() subsequently return NULL. Once elements have been added to the list, use 
+either the TDblQueIter::Set() function, the TDblQueIterBase::SetToFirst() 
+function or the TDblQueIterBase::SetToLast() function to set the iterator 
+pointer.
+
+@param aQue A reference to a doubly linked list header.
+
+@see TDblQueIter::Set
+@see TDblQueIterBase::SetToFirst
+@see TDblQueIterBase::SetToLast
+*/
+	{}
+
+
+
+
+template <class T>
+inline void TDblQueIter<T>::Set(T &aLink)
+/**
+Sets the iterator to point to a specific element in the list.
+
+This function can be used to alter the pointer at any time during
+the iterator's existence. The referenced element must be in the list,
+otherwise the result is undefined.
+
+@param aLink A reference to the element from where iteration is to continue.
+*/
+	{DoSet(&aLink);}
+
+
+
+
+template <class T>
+inline TDblQueIter<T>::operator T *()
+/**
+Gets a pointer to the iterator’s current element.
+
+The operator is normally used implicitly; e.g. some member functions of the
+list header class TDblQue require a pointer to an element (of type class T)
+as a parameter but in practice, an iterator is often passed instead.
+This operator performs the necessary conversion.
+
+@return A pointer to the current element, if the iterator points to an element
+        in the list. NULL, if the iterator does not point to an element;
+		i.e. the iterator pointer has previously reached the end of the list
+		(see operator++) or the start of the list (see operator--) or
+		the list is empty. 
+*/
+	{return((T *) DoCurrent());}
+
+
+
+
+template <class T>
+inline T *TDblQueIter<T>::operator++(TInt)
+/**
+Gets a pointer to the iterator's current element and then sets the iterator 
+to point to the next element.
+
+Repeated use of this operator allows successive 
+elements to be accessed in the forwards direction.
+
+@return A pointer to the current list element, if the iterator points to an 
+        element. NULL, if the iterator does not point to an element;
+		i.e. the iterator pointer has reached the end of the list.
+*/
+	{return((T *) DoPostInc());}
+
+
+
+
+template <class T>
+inline T *TDblQueIter<T>::operator--(TInt)
+/**
+Gets a pointer to the iterator's current element and then sets the iterator 
+to point to the previous element.
+
+Repeated use of this operator allows successive 
+elements to be accessed in the backwards direction.
+
+@return A pointer to the current element, if the iterator points to an element. 
+        NULL, if the iterator does not point to an element; i.e. the iterator
+		pointer has reached the beginning of the list.
+*/
+	{return((T *) DoPostDec());}
+
+
+
+
+// Class TKey
+inline void TKey::SetPtr(const TAny *aPtr)
+/**
+Sets the pointer to a sample element whose key is to be used for comparison.
+	
+The element can be in an existing array or it can be located anywhere in
+addressable memory.
+	
+The At() member function supplied by a derived class must return a pointer 
+to this sample element's key when passed an index value of KIndexPtr.
+	
+SetPtr() must be called before calling User::BinarySearch() because this algorithm 
+uses the key of this sample element as the basis for searching the array.
+	
+@param aPtr A pointer to a sample element.
+*/
+	{iPtr=aPtr;}
+
+
+
+
+// Class TCharF
+inline TCharF::TCharF(TUint aChar)
+	: TChar(User::Fold(aChar))
+/**
+Constructs this 'fold character' object and initialises it with the specified 
+value.
+
+@param aChar The initialisation value.
+*/
+	{}
+
+
+
+
+inline TCharF::TCharF(const TChar& aChar)
+	: TChar(User::Fold(aChar))
+/**
+Constructs this 'fold character' object and initialises it with the value of 
+the TChar object aChar.
+
+@param aChar The character object to use as the initialisation value.
+*/
+	{}
+
+
+
+
+inline TCharF& TCharF::operator=(TUint aChar)
+/**
+Assigns an unsigned integer value to the 'fold character' object.
+
+@param aChar The value to assign.
+
+@return A reference to this 'fold character' object.
+*/
+	{SetChar(User::Fold(aChar));return(*this);}
+
+
+
+
+inline TCharF& TCharF::operator=(const TChar& aChar)
+/**
+Assigns the specified character object to this 'fold character' object.
+
+@param aChar The character object to assign.
+
+@return A reference to this 'fold character' object.
+*/
+	{SetChar(User::Fold(aChar));return(*this);}
+
+
+
+
+// Class TCharLC
+inline TCharLC::TCharLC(TUint aChar)
+	: TChar(User::LowerCase(aChar))
+/**
+Constructs this 'character to lower case' object and initialises it with the 
+specified value.
+
+@param aChar The initialisation value.
+
+*/
+	{}
+
+
+
+
+inline TCharLC::TCharLC(const TChar& aChar)
+	: TChar(User::LowerCase(aChar))
+/**
+Constructs this 'character to lower case' object and initialises it with the 
+value of the TChar object aChar.
+
+@param aChar The character object to use as the initialisation value.
+*/
+	{}
+
+
+
+
+inline TCharLC& TCharLC::operator=(TUint aChar)
+/**
+Assigns an unsigned integer value to the 'character to lower case' object.
+
+@param aChar The value to assign.
+
+@return A reference to this 'character to lower case' object.
+*/
+	{SetChar(User::LowerCase(aChar));return(*this);}
+
+
+
+
+inline TCharLC& TCharLC::operator=(const TChar& aChar)
+/**
+Assigns the specified character object to this 'character to lower case'
+object.
+
+@param aChar The character object to assign.
+
+@return A reference to this 'character to lower case' object.
+*/
+	{SetChar(User::LowerCase(aChar));return(*this);}
+
+
+
+
+// Class TCharUC
+inline TCharUC::TCharUC(TUint aChar)
+	: TChar(User::UpperCase(aChar))
+/**
+Constructs this 'character to upper case' object and initialises it with the 
+specified value.
+
+@param aChar The initialisation value.
+*/
+	{}
+
+
+
+
+inline TCharUC::TCharUC(const TChar& aChar)
+	: TChar(User::UpperCase(aChar))
+/**
+Constructs this 'character to upper case' object and initialises it with the 
+value of the TChar object aChar.
+
+@param aChar The character object to use as the initialisation value.
+*/
+	{}
+
+
+
+
+inline TCharUC& TCharUC::operator=(TUint aChar)
+/**
+Assigns an unsigned integer value to the 'character to upper case'  object.
+
+@param aChar The value to assign.
+
+@return A reference to this 'character to upper case'  object.
+*/
+	{SetChar(User::UpperCase(aChar));return(*this);}
+
+
+
+
+inline TCharUC& TCharUC::operator=(const TChar& aChar)
+/**
+Assigns the specified character object to this 'character to upper case' 
+object.
+
+@param aChar The character object to assign.
+
+@return A reference to this 'character to upper case'  object.
+*/
+	{SetChar(User::UpperCase(aChar));return(*this);}
+
+
+
+
+// Class TDateTime
+inline TDateTime::TDateTime()
+	: iYear(1980),
+	  iMonth(EJanuary), 
+	  iDay(1),
+	  iHour(0),
+	  iMinute(0),
+	  iSecond(0),
+	  iMicroSecond(0)
+/**
+Constructs an uninitialised TDateTime object.
+*/
+	{}           
+
+
+
+
+inline TInt TDateTime::Year() const
+/**
+Gets the year component of the date/time.
+
+A negative value indicates a BC date.
+
+@return The year
+*/
+	{return(iYear);}
+
+
+
+
+inline TMonth TDateTime::Month() const
+/**
+Gets the month component of the date/time.
+
+@return The month. EJanuary to EDecember. Offset from zero, so add one before 
+        displaying the month number.
+*/
+	{return(iMonth);}
+
+
+
+
+inline TInt TDateTime::Day() const
+/**
+Gets the day component of the date/time.
+
+@return The day. Offset from zero, so add one before displaying the day number.
+*/
+	{return(iDay);}
+
+
+
+
+inline TInt TDateTime::Hour() const
+/**
+Gets the hour component of the date/time.
+
+@return The hour.
+*/
+	{return(iHour);}
+
+
+
+
+inline TInt TDateTime::Minute() const
+/**
+Gets the minute component of the date/time.
+
+@return The minute.
+*/
+	{return(iMinute);}
+
+
+
+
+inline TInt TDateTime::Second() const
+/**
+Gets the second component of the date/time.
+
+@return The second.
+*/
+	{return(iSecond);}
+
+
+
+
+inline TInt TDateTime::MicroSecond() const
+/**
+Gets the microsecond component of the date/time.
+
+@return The microsecond.
+*/
+	{return(iMicroSecond);}
+
+// Class TTimeIntervalMicroSeconds
+
+
+
+
+inline TTimeIntervalMicroSeconds::TTimeIntervalMicroSeconds()
+/**
+Default constructor.
+
+Constructs an uninitialised object.
+*/
+	{}
+
+
+
+
+inline TTimeIntervalMicroSeconds::TTimeIntervalMicroSeconds(const TInt64& aInterval)
+	: iInterval(aInterval)
+/**
+Constructs the object with the specified 64-bit interval value.
+
+@param aInterval The 64-bit interval value with which the object is to be
+                 initialised.
+*/
+	{}
+
+
+
+
+inline TTimeIntervalMicroSeconds& TTimeIntervalMicroSeconds::operator=(const TInt64& aInterval)
+/**
+Assigns a 64-bit integer value to this object.
+
+@param aInterval The 64-bit integer interval value to be assigned.
+
+@return A reference to this object.
+*/
+	{iInterval=aInterval;return(*this);}
+
+
+
+
+inline TBool TTimeIntervalMicroSeconds::operator==(const TTimeIntervalMicroSeconds& aInterval) const
+/**
+Tests whether this TTimeIntervalMicroSeconds object is equal to the
+specified TTimeIntervalMicroSeconds object.
+
+@param aInterval The time interval to be compared with this time interval.
+
+@return True if the two time intervals are equal. False otherwise.
+*/
+	{return(iInterval==aInterval.iInterval);}
+
+
+
+
+inline TBool TTimeIntervalMicroSeconds::operator!=(const TTimeIntervalMicroSeconds& aInterval) const
+/**
+Tests whether this TTimeIntervalMicroSeconds object is not equal to the
+specified TTimeIntervalMicroSeconds object.
+
+@param aInterval The time interval to be compared with this time interval.
+
+@return True if the two time intervals are not equal. False otherwise.
+*/
+	{return(iInterval!=aInterval.iInterval);}
+
+
+
+
+inline TBool TTimeIntervalMicroSeconds::operator>=(const TTimeIntervalMicroSeconds& aInterval) const
+/**
+Tests whether this TTimeIntervalMicroSeconds object is greater than or equal to the
+specified TTimeIntervalMicroSeconds object.
+
+@param aInterval The time interval to be compared with this time interval.
+
+@return True if this time interval is greater than or equal to the specified
+        time interval. False otherwise.
+*/
+	{return(iInterval>=aInterval.iInterval);}
+
+
+
+
+inline TBool TTimeIntervalMicroSeconds::operator<=(const TTimeIntervalMicroSeconds& aInterval) const
+/**
+Tests whether this TTimeIntervalMicroSeconds object is less than or equal to the
+specified TTimeIntervalMicroSeconds object.
+
+@param aInterval The time interval to be compared with this time interval.
+
+@return True if this time interval is less than or equal to the specified
+        time interval. False otherwise.
+*/
+	{return(iInterval<=aInterval.iInterval);}
+
+
+
+
+inline TBool TTimeIntervalMicroSeconds::operator>(const TTimeIntervalMicroSeconds& aInterval) const
+/**
+Tests whether this TTimeIntervalMicroSeconds object is greater than the
+specified TTimeIntervalMicroSeconds object.
+
+@param aInterval The time interval to be compared with this time interval.
+
+@return True if this time interval is greater than the specified
+        time interval. False otherwise.
+*/
+	{return(iInterval>aInterval.iInterval);}
+
+
+
+
+inline TBool TTimeIntervalMicroSeconds::operator<(const TTimeIntervalMicroSeconds& aInterval) const
+/**
+Tests whether this TTimeIntervalMicroSeconds object is less than the
+specified TTimeIntervalMicroSeconds object.
+
+@param aInterval The time interval to be compared with this time interval.
+
+@return True if this time interval is less than the specified
+        time interval. False otherwise.
+*/
+	{return(iInterval<aInterval.iInterval);}
+
+
+
+
+inline const TInt64& TTimeIntervalMicroSeconds::Int64() const
+/**
+Gets the time interval as a 64-bit integer value.
+
+@return This 64-bit integer time interval value.
+*/
+	{return(iInterval);}
+
+
+
+
+// Class TTimeIntervalBase
+inline TTimeIntervalBase::TTimeIntervalBase()
+/**
+Default constructor.
+*/
+	{}
+
+
+
+
+inline TTimeIntervalBase::TTimeIntervalBase(TInt aInterval)
+	: iInterval(aInterval)
+/**
+Constructor taking an interval value.
+
+@param aInterval The interval value.
+*/
+	{}
+
+
+
+
+inline TBool TTimeIntervalBase::operator==(TTimeIntervalBase aInterval) const
+/**
+Tests whether this time interval is the same as the specified time interval.
+
+@param aInterval The time interval to be compared with this time interval.
+
+@return True if the two time intervals are equal. False otherwise.
+*/
+	{return(iInterval==aInterval.iInterval);}
+
+
+
+
+inline TBool TTimeIntervalBase::operator!=(TTimeIntervalBase aInterval) const
+/**
+Tests whether this time interval is not the same as the specified
+time interval.
+
+@param aInterval The time interval to be compared with this time interval.
+
+@return True if the two time intervals differ. False otherwise.
+*/
+	{return(iInterval!=aInterval.iInterval);}
+
+
+
+
+inline TBool TTimeIntervalBase::operator>=(TTimeIntervalBase aInterval) const
+/**
+Tests whether this time interval is greater than or equal to the
+specified time interval.
+
+@param aInterval The time interval to be compared with this time interval.
+
+@return True if this time interval is greater than or equal to the specified
+        time interval. False otherwise.
+*/
+	{return(iInterval>=aInterval.iInterval);}
+
+
+
+
+inline TBool TTimeIntervalBase::operator<=(TTimeIntervalBase aInterval) const
+/**
+Tests whether this time interval is less than or equal to the
+specified time interval.
+
+@param aInterval The time interval to be compared with this time interval.
+
+@return True if this time interval is less than or equal to the specified
+        time interval. False otherwise.
+*/
+	{return(iInterval<=aInterval.iInterval);}
+
+
+
+
+inline TBool TTimeIntervalBase::operator>(TTimeIntervalBase aInterval) const
+/**
+Tests whether this time interval is greater than the specified time interval.
+
+@param aInterval The time interval to be compared with this time interval.
+
+@return True if this time interval is greater than the specified
+        time interval. False otherwise.
+*/
+	{return(iInterval>aInterval.iInterval);}
+
+
+
+
+inline TBool TTimeIntervalBase::operator<(TTimeIntervalBase aInterval) const
+/**
+Tests whether this time interval is less than the specified time interval.
+
+@param aInterval The time interval to be compared with this time interval.
+
+@return True if this time interval is less than the specified
+        time interval. False otherwise.
+*/
+	{return(iInterval<aInterval.iInterval);}
+
+
+
+
+inline TInt TTimeIntervalBase::Int() const
+/** 
+Gets the time interval as a 32 bit integer.
+
+@return The time interval as a 32 bit integer.
+*/
+	{return(iInterval);}
+
+
+
+
+// Class TTimeIntervalMicroSeconds32
+inline TTimeIntervalMicroSeconds32::TTimeIntervalMicroSeconds32()
+/**
+Default constructor.
+
+Constructs an uninitialised object.
+*/
+	{}
+
+
+
+
+inline TTimeIntervalMicroSeconds32::TTimeIntervalMicroSeconds32(TInt aInterval)
+    : TTimeIntervalBase(aInterval)
+/**
+Constructs the object with the specified interval value.
+
+@param aInterval The interval value with which the object is to be initialised.
+*/
+	{}
+
+
+
+
+inline TTimeIntervalMicroSeconds32& TTimeIntervalMicroSeconds32::operator=(TInt aInterval)
+/**
+Assigns a value to this object.
+
+@param aInterval The interval value to be assigned.
+
+@return A reference to this object.
+*/
+	{iInterval=aInterval;return(*this);}
+
+
+
+
+// Class TTimeIntervalSeconds
+inline TTimeIntervalSeconds::TTimeIntervalSeconds()
+/**
+Default constructor.
+
+Constructs an uninitialised object.
+*/
+	{}
+
+
+
+
+inline TTimeIntervalSeconds::TTimeIntervalSeconds(TInt aInterval)
+	: TTimeIntervalBase(aInterval)
+/**
+Constructs the object with the specified interval value.
+
+@param aInterval The interval value with which the object is to be initialised.
+*/
+	{}
+
+
+
+
+inline TTimeIntervalSeconds& TTimeIntervalSeconds::operator=(TInt aInterval)
+/**
+Assigns a value to this object.
+
+@param aInterval The interval value to be assigned.
+
+@return A reference to this object.
+*/
+	{iInterval=aInterval;return(*this);}
+
+
+
+
+// Class TTimeIntervalMinutes
+inline TTimeIntervalMinutes::TTimeIntervalMinutes()
+/**
+Default constructor.
+
+Constructs an uninitialised object.
+*/
+	{}
+
+
+
+
+inline TTimeIntervalMinutes::TTimeIntervalMinutes(TInt aInterval)
+	: TTimeIntervalBase(aInterval)
+/**
+Constructs the object with the specified interval value.
+
+@param aInterval The interval value with which the object is to be initialised.
+*/
+	{}
+
+
+
+
+inline TTimeIntervalMinutes& TTimeIntervalMinutes::operator=(TInt aInterval)
+/**
+Assigns a value to this object.
+
+@param aInterval The interval value to be assigned.
+
+@return A reference to this object.
+*/
+	{iInterval=aInterval;return(*this);}
+
+
+
+
+// Class TTimeIntervalHours
+inline TTimeIntervalHours::TTimeIntervalHours()
+/**
+Default constructor.
+
+Constructs an uninitialised object.
+*/
+	{}
+inline TTimeIntervalHours::TTimeIntervalHours(TInt aInterval)
+	: TTimeIntervalBase(aInterval)
+/**
+Constructs the object with the specified interval value.
+
+@param aInterval The interval value with which the object is to be initialised.
+*/
+	{}
+
+
+
+
+inline TTimeIntervalHours& TTimeIntervalHours::operator=(TInt aInterval)
+/**
+Assigns a value to this object.
+
+@param aInterval The interval value to be assigned.
+
+@return A reference to this object.
+*/
+	{iInterval=aInterval;return(*this);}
+
+
+
+
+// Class TTimeIntervalDays
+inline TTimeIntervalDays::TTimeIntervalDays()
+/**
+Default constructor.
+
+Constructs an uninitialised object.
+*/
+	{}
+
+
+
+
+inline TTimeIntervalDays::TTimeIntervalDays(TInt aInterval)
+	: TTimeIntervalBase(aInterval)
+/**
+Constructs the object with the specified interval value.
+
+@param aInterval The interval value with which the object is to be initialised.
+*/
+	{}
+
+
+
+
+inline TTimeIntervalDays& TTimeIntervalDays::operator=(TInt aInterval)
+/**
+Assigns a value to this object.
+
+@param aInterval The interval value to be assigned.
+
+@return A reference to this object.
+*/
+	{iInterval=aInterval;return(*this);}
+
+
+
+
+// Class TTimeIntervalMonths
+inline TTimeIntervalMonths::TTimeIntervalMonths()
+/**
+Default constructor.
+
+Constructs an uninitialised object.
+*/
+	{}
+
+
+
+
+inline TTimeIntervalMonths::TTimeIntervalMonths(TInt aInterval)
+	: TTimeIntervalBase(aInterval)
+/**
+Constructs the object with the specified interval value.
+
+@param aInterval The interval value with which the object is to be initialised.
+*/
+	{}
+
+
+
+
+inline TTimeIntervalMonths& TTimeIntervalMonths::operator=(TInt aInterval)
+/**
+Assigns a value to this object.
+
+@param aInterval The interval value to be assigned.
+
+@return A reference to this object.
+*/
+	{iInterval=aInterval;return(*this);}
+
+
+
+
+// Class TTimeIntervalYears
+inline TTimeIntervalYears::TTimeIntervalYears()
+/**
+Default constructor.
+
+Constructs an uninitialised object.
+*/
+	{}
+
+
+
+
+inline TTimeIntervalYears::TTimeIntervalYears(TInt aInterval)
+	: TTimeIntervalBase(aInterval)
+/**
+Constructs the object with the specified interval value.
+
+@param aInterval The interval value with which the object is to be initialised.
+*/
+	{}
+
+
+
+
+inline TTimeIntervalYears& TTimeIntervalYears::operator=(TInt aInterval)
+/**
+Assigns a value to this object.
+
+@param aInterval The interval value to be assigned.
+
+@return A reference to this object.
+*/
+	{iInterval=aInterval;return(*this);}
+
+
+
+
+// Class TTime
+inline TTime::TTime()
+/**
+Default constructor.
+
+The object is initialised to an arbitrary value.
+*/
+	{}
+
+
+
+
+inline TTime::TTime(const TInt64& aTime)
+	: iTime(aTime)
+/**
+Constructs the object from a 64-bit microsecond value.
+
+@param aTime Microsecond value to which to initialise the TTime object.
+*/
+	{}
+
+
+
+
+inline TTime &TTime::operator=(const TInt64& aTime)
+/**
+Assigns a value contained in a 64-bit integer to this TTime object.
+
+@param aTime Microsecond value which to assign to the TTime object.
+
+@return This TTime object.
+*/
+	{iTime=aTime;return(*this);}
+
+
+
+
+inline TBool TTime::operator==(TTime aTime) const
+/**
+Tests whether two date/times are equal.
+
+@param aTime The time to be compared with this TTime.
+
+@return True if the two TTimes are equal. False if not.
+*/
+	{return(iTime==aTime.iTime);}
+
+
+
+
+inline TBool TTime::operator!=(TTime aTime) const
+/**
+Tests whether two date/times are not equal.
+
+@param aTime The date/time to be compared with this TTime.
+
+@return True if the two TTimes are different. False if the same.
+*/
+	{return(iTime!=aTime.iTime);}
+
+
+
+
+inline TBool TTime::operator>=(TTime aTime) const
+/**
+Tests whether this date/time is later than or the same as the
+specified date/time.
+
+@param aTime The date/time to be compared with this date/time.
+
+@return True if this date/time is later than or the same as the
+        specified date/time. False otherwise.
+*/
+	{return(iTime>=aTime.iTime);}
+
+
+
+
+inline TBool TTime::operator<=(TTime aTime) const
+/**
+Tests whether this date/time is earlier than or the same as the
+specified date/time.
+
+@param aTime The date/time to be compared with this date/time.
+
+@return True if this date/time is earlier than or the same as the
+        specified date/time. False otherwise.
+*/
+	{return(iTime<=aTime.iTime);}
+
+
+
+
+inline TBool TTime::operator>(TTime aTime) const
+/**
+Tests whether this date/time is later than the specified date/time.
+
+@param aTime The date/time to be compared with this date/time.
+
+@return True if this date/time is later than the specified date/time.
+        False otherwise.
+*/
+	{return(iTime>aTime.iTime);}
+
+
+
+
+inline TBool TTime::operator<(TTime aTime) const
+/**
+Tests whether this date/time is earlier than the specified date/time.
+
+@param aTime The date/time to be compared with this date/time.
+
+@return True if this date/time is earlier than the specified date/time.
+        False otherwise.
+*/
+	{return(iTime<aTime.iTime);}
+
+
+
+
+inline const TInt64& TTime::Int64() const
+/**
+Gets the 64 bit integer representation of this TTime obect.
+
+@return The 64 bit integer representation.
+*/
+	{return(iTime);}
+
+
+
+
+// Class TLexMark8
+inline TLexMark8::TLexMark8()
+	: iPtr(NULL)
+/**
+Default constructor.
+*/
+	{}
+
+
+
+
+inline TLexMark8::TLexMark8(const TUint8 *aString) 
+	: iPtr(aString)
+	{}
+
+
+
+
+// Class TLex8
+inline TLex8::TLex8(const TUint8 *aString)
+/**
+Constructs the object with a pointer to a string.
+
+The extraction mark and next character members are initialised to point
+to the start of the string.
+
+@param aString String to be assigned.
+*/
+	{Assign(TPtrC8(aString));}
+
+
+
+
+inline TLex8::TLex8(const TDesC8 &aDes)
+/**
+Constructs the object with a descriptor.
+
+The extraction mark and next character 
+members are initialised to point to the start of the string.
+
+@param aDes Descriptor to be assigned by reference.
+*/
+	{Assign(aDes);}
+
+
+
+
+inline TLex8& TLex8::operator=(const TUint8* aString)
+/**
+Allows strings to be assigned to a TLex8.
+
+@param aString String to be assigned to the TLex8. 
+
+@return TLex8 descriptor.
+*/
+	{Assign(TPtrC8(aString));return(*this);}
+
+
+
+
+inline TLex8& TLex8::operator=(const TDesC8& aBuf)
+/**
+Allows descriptors to be assigned to a TLex8.
+
+@param aBuf Descriptor to be assigned to the TLex8.
+
+@return TLex8 descriptor.
+*/
+	{Assign(aBuf);return(*this);}
+
+
+
+
+inline TBool TLex8::Eos() const
+/**
+Tests whether the next character position is at the end of the string.
+
+@return True if at end of string, false otherwise.
+*/
+	{return(iNext==iEnd);}
+
+
+
+
+inline void TLex8::Mark()
+/**
+Sets the TLex8's next character position to its extraction mark.
+*/
+	{Mark(iMark);}
+
+
+
+
+inline void TLex8::Mark(TLexMark8& aMark) const
+/**
+Sets the supplied extraction mark to the TLex8's next character position.
+
+@param aMark On return, this is set to the next character position.
+*/
+	{aMark.iPtr=iNext;}
+
+
+
+
+inline void TLex8::UnGetToMark()
+/**
+Sets the next character position to the current extraction mark position.
+
+@panic USER 63, if the extraction mark is before the start or beyond the end
+       of the string.
+*/
+    {UnGetToMark(iMark);}
+
+
+
+
+inline void TLex8::SkipAndMark(TInt aNumber)
+/**
+Moves the next character position a specified number of characters. 
+  
+@param aNumber Number of characters to skip.
+
+@panic USER 61, if the skip moves the next character position either to before
+       the start or beyond the end of the string.
+*/
+    {SkipAndMark(aNumber,iMark);}
+
+
+
+
+inline void TLex8::SkipSpaceAndMark()
+/**
+Moves the next character position past any white space and copies it to the 
+TLex8's extraction mark.
+
+Stops if at the end of the string.
+*/
+    {SkipSpaceAndMark(iMark);}
+
+
+
+
+inline TInt TLex8::TokenLength() const
+/**
+Gets the length of the token.
+
+This is the difference between the next character 
+position and the extraction mark.
+
+@return Length of the token.
+*/
+	{return(iNext-iMark.iPtr);}
+
+
+
+
+inline TInt TLex8::MarkedOffset() const
+/**
+Gets the offset of the extraction mark from the start of the string.
+
+@return The offset of the extraction mark.
+*/
+    {return(iMark.iPtr-iBuf);}
+
+
+
+
+inline TInt TLex8::Val(TInt &aVal)
+/**
+Parses the string to extract a signed integer.
+
+@param aVal On return, contains the extracted integer.
+
+@return KErrNone if successful.
+        KErrGeneral if the next character position is initially at the end of the string
+        or no valid characters found initially.
+        KErrOverflow if there is sign overflow, i.e. converted value greater than limit.
+        If error codes KErrGeneral or KErrOverflow are returned, the object's
+        members are left unaltered.
+*/
+	{return(Val((TInt32&)aVal));}
+
+
+
+
+inline TInt TLex8::Val(TUint &aVal,TRadix aRadix)
+/**
+Parses the string to extract an unsigned integer, using the specified radix.
+
+@param aVal   On return, contains the extracted integer.
+@param aRadix The radix to use when converting the number. The default radix
+              for this function overload is decimal.
+
+@return KErrNone if successful.
+        KErrGeneral if the next character position is initially at the end of the string
+        or no valid characters found initially.
+        KErrOverflow if there is sign overflow, i.e. converted value greater than limit.
+        If error codes KErrGeneral or KErrOverflow are returned, the object's
+        members are left unaltered.
+*/
+	{return(Val((TUint32&)aVal,aRadix));}
+
+
+
+
+inline void TLex8::Assign(const TLex8& aLex)
+/**
+Assigns a string to this object from another TLex8 object.
+
+@param aLex The object to be assigned.
+*/
+	{new(this) TLex8(aLex);}
+
+
+
+
+// Class TLexMark16
+inline TLexMark16::TLexMark16()
+	: iPtr(NULL)
+/**
+Default constructor.
+*/
+	{}
+
+
+
+
+inline TLexMark16::TLexMark16(const TUint16 *aString) 
+	: iPtr(aString)
+	{}
+
+
+
+
+// Class TLex16
+inline TLex16::TLex16(const TUint16 *aString)
+/**
+Constructs the object with a pointer to a string.
+
+The extraction mark and next character members are initialised to point
+to the start of the string.
+
+@param aString String to be assigned.
+*/
+	{Assign(TPtrC16(aString));}
+
+
+
+
+inline TLex16::TLex16(const TDesC16 &aDes)
+/**
+Constructs the object with a descriptor.
+
+The extraction mark and next character 
+members are initialised to point to the start of the string.
+
+@param aDes Descriptor to be assigned by reference.
+*/
+	{Assign(aDes);}
+
+
+
+inline TLex16& TLex16::operator=(const TUint16* aString)
+/** 
+Allows strings to be assigned to a TLex16.
+
+@param aString String to be assigned to the TLex16. 
+
+@return TLex16 descriptor.
+*/
+	{Assign(TPtrC16(aString));return(*this);}
+
+
+
+
+inline TLex16& TLex16::operator=(const TDesC16& aBuf)
+/**
+Allows descriptors to be assigned to a TLex16.
+
+@param aBuf Descriptor to be assigned to the TLex16.
+
+@return TLex8 descriptor.
+*/
+	{Assign(aBuf);return(*this);}
+
+
+
+
+inline TBool TLex16::Eos() const
+/**
+Tests whether the next character position is at the end of the string.
+
+@return True if at end of string, false otherwise.
+*/
+	{return(iNext==iEnd);}
+
+
+
+
+inline void TLex16::Mark(TLexMark16& aMark) const
+/**
+Sets the supplied extraction mark to the TLex16's next character position.
+
+@param aMark On return, set to the next character position.
+*/
+	{aMark.iPtr=iNext;}
+
+
+
+
+inline void TLex16::Mark()
+/**
+Sets the TLex16's next character position to its extraction mark.
+*/
+	{iMark.iPtr=iNext;}
+
+
+
+
+inline void TLex16::UnGetToMark()
+/**
+Sets the next character position to the current extraction mark position.
+
+@panic USER 68, if the specified mark is before the start or beyond the end
+       of the string.
+*/
+    {UnGetToMark(iMark);}
+
+
+
+
+inline void TLex16::SkipAndMark(TInt aNumber)
+/**
+Moves the next character position a specified number of characters.
+
+@param aNumber Number of characters to skip. 
+
+@panic USER 68, if the skip moves the next character position either to before
+       the start or beyond the end of the string.
+*/
+    {SkipAndMark(aNumber,iMark);}
+
+
+
+
+inline void TLex16::SkipSpaceAndMark()
+/**
+Moves the next character position past any white space and copies it to the 
+TLex16's extraction mark.
+
+Stops if at the end of the string.
+*/
+    {SkipSpaceAndMark(iMark);}
+
+
+
+
+inline TInt TLex16::TokenLength() const
+/**
+Gets the length of the token.
+
+This is the difference between the next character 
+position and the extraction mark.
+
+@return Length of the token.
+*/
+	{return(iNext-iMark.iPtr);}
+
+
+
+
+inline TInt TLex16::MarkedOffset() const
+/**
+Gets the offset of the extraction mark from the start of the string.
+
+@return The offset of the extraction mark.
+*/
+    {return(iMark.iPtr-iBuf);}
+
+
+
+
+inline TInt TLex16::Val(TInt &aVal)
+/**
+Parses the string to extract a signed integer.
+
+@param aVal On return, contains the extracted integer.
+
+@return KErrNone if successful.
+        KErrGeneral if the next character position is initially at the end of the string
+        or no valid characters found initially.
+        KErrOverflow if there is sign overflow, i.e. converted value greater than limit.
+        If error codes KErrGeneral or KErrOverflow are returned, the object's
+        members are left unaltered.
+*/
+	{return(Val((TInt32&)aVal));}
+
+
+
+
+inline TInt TLex16::Val(TUint &aVal,TRadix aRadix)
+/**
+Parses the string to extract an unsigned integer, using the specified radix.
+
+@param aVal   On return, contains the extracted integer.
+@param aRadix The radix to use when converting the number. The default radix
+              for this function overload is decimal.
+
+@return KErrNone if successful.
+        KErrGeneral if the next character position is initially at the end of the string
+        or no valid characters found initially.
+        KErrOverflow if there is sign overflow, i.e. converted value greater than limit.
+        If error codes KErrGeneral or KErrOverflow are returned, the object's
+        members are left unaltered.
+*/
+	{return(Val((TUint32&)aVal,aRadix));}
+
+
+
+
+inline void TLex16::Assign(const TLex16& aLex)
+/**
+Assigns a string to this object from another TLex16 object.
+
+@param aLex The object to be assigned.
+*/
+	{new(this) TLex16(aLex);}
+
+
+
+
+// Class TLocale
+inline TLocale::TLocale(TInt)
+	{}
+
+inline TInt TLocale::CountryCode() const
+/**
+Gets the code which is used to select country-specific locale data.
+
+The country code is the code used as the international dialling prefix.
+This code is also used to identify a country by the dialling software.
+	
+@return The country code.
+*/
+	{return(iCountryCode);}
+
+
+
+
+inline void TLocale::SetCountryCode(TInt aCode)
+/**
+Sets the value which is used to select country-specific locale data.
+
+This value can be retrieved by using TLocale::CountryCode(). The country code
+is the code used as the international dialling prefix. This code is also used
+to identify a country by the dialling software.
+	
+@param aCode The country code.
+
+@see TLocale::CountryCode
+*/
+	{iCountryCode=aCode;}
+
+
+
+
+inline TTimeIntervalSeconds TLocale::UniversalTimeOffset() const
+/**
+Gets the locale's universal time offset.
+	
+@return Offset in seconds from universal time. Time zones east of universal 
+	    time have positive offsets. Time zones west of universal time have negative 
+	    offsets.
+
+@deprecated Use User::UTCOffset to get the current offset inclusive of daylight
+			savings time. This function returns the same value, for compatibility.
+*/
+	{return(iUniversalTimeOffset);}
+
+
+
+
+inline TDateFormat TLocale::DateFormat() const
+/**
+Gets the date format.
+	
+@return The date format.
+*/
+	{return(iDateFormat);}
+
+
+
+
+inline void TLocale::SetDateFormat(TDateFormat aFormat)
+/**
+Sets the date format.
+	
+@param aFormat The date format to be used.
+*/
+	{iDateFormat=aFormat;}
+
+
+
+
+inline TTimeFormat TLocale::TimeFormat() const
+/**
+Gets the time format (12 or 24 hour).
+	
+@return The time format.
+*/
+	{return(iTimeFormat);}
+
+
+
+
+inline void TLocale::SetTimeFormat(TTimeFormat aFormat)
+/**
+Sets the time format (12 or 24 hour).
+	
+@param aFormat The time format.
+*/
+	{iTimeFormat=aFormat;}
+
+
+
+
+inline TLocalePos TLocale::CurrencySymbolPosition() const
+/**
+Gets the currency symbol position.
+	
+For negative currency values, this position may be
+reversed using SetNegativeCurrencySymbolOpposite().
+	
+@return The currency symbol position.
+
+@see TLocale::SetNegativeCurrencySymbolOpposite
+*/
+	{return(iCurrencySymbolPosition);}
+
+
+
+
+inline void TLocale::SetCurrencySymbolPosition(TLocalePos aPos)
+/**
+Sets the currency symbol position.
+	
+@param aPos The currency symbol position.
+*/
+	{iCurrencySymbolPosition=aPos;}
+
+
+
+
+inline TBool TLocale::CurrencySpaceBetween() const
+/**
+Gets whether or not a space is inserted between the currency symbol and the 
+currency value.
+	
+For negative currency values, the space can be removed using SetNegativeLoseSpace().
+	
+@return True if a space is inserted; false if not.
+
+@see TLocale::SetNegativeLoseSpace
+*/
+	{return(iCurrencySpaceBetween);}
+
+
+
+
+inline void TLocale::SetCurrencySpaceBetween(TBool aSpace)
+/**
+Sets whether a space is inserted between the currency symbol and the currency 
+amount.
+	
+@param aSpace ETrue if a space is inserted; EFalse if not.
+*/
+	{iCurrencySpaceBetween=aSpace;}
+
+
+
+
+inline TInt TLocale::CurrencyDecimalPlaces() const
+/**
+Gets the number of decimal places to which currency values are set.
+	
+@return The number of decimal places.
+*/
+	{return(iCurrencyDecimalPlaces);}
+
+
+
+
+inline void TLocale::SetCurrencyDecimalPlaces(TInt aPlaces)
+/**
+Sets the number of decimal places to which currency values should be set.
+	
+@param aPlaces The number of decimal places.
+*/
+	{iCurrencyDecimalPlaces=aPlaces;}
+
+
+
+
+inline TBool TLocale::CurrencyNegativeInBrackets() const
+/**
+@deprecated
+
+Gets whether negative currency values are enclosed in brackets rather than 
+being preceded by a minus sign. 
+	
+This is deprecated, use NegativeCurrencyFormat() instead.
+	
+@return True if negative currency is enclosed in brackets and has no minus 
+        sign; false if negative currency has a minus sign and is not enclosed
+		in brackets.
+
+@see TLocale::NegativeCurrencyFormat
+*/
+	{return((TBool)iNegativeCurrencyFormat);}			
+
+
+
+
+inline void TLocale::SetCurrencyNegativeInBrackets(TBool aBool)
+/** 
+@deprecated
+
+Sets whether negative currency values are enclosed in brackets rather than
+being preceded by a minus sign.
+	
+This is deprecated, use SetNegativeCurrencyFormat() instead.
+	
+@param aBool ETrue, if a negative currency value must be enclosed in brackets 
+	         without a minus sign; EFalse, if a negative currency value is
+			 preceded by a minus sign without any enclosing brackets.
+
+@see TLocale::SetNegativeCurrencyFormat
+*/
+	{iNegativeCurrencyFormat=(aBool)?EInBrackets:ELeadingMinusSign;}
+
+
+
+
+inline TBool TLocale::CurrencyTriadsAllowed() const
+/**
+Gets whether triads are allowed in currency values. Triads are groups of 
+three digits separated by the thousands separator.
+	
+@return True if triads are allowed; false if not.
+*/
+	{return(iCurrencyTriadsAllowed);}
+
+
+
+
+inline void TLocale::SetCurrencyTriadsAllowed(TBool aBool)
+/**
+Sets whether triads are allowed in currency values.
+	
+@param aBool ETrue if triads are allowed; EFalse if triads not allowed.
+*/
+	{iCurrencyTriadsAllowed=aBool;}
+
+
+
+
+inline TChar TLocale::ThousandsSeparator() const
+/**
+Gets the character used to separate groups of three digits to the left of 
+the decimal separator.
+	
+A thousands separator character is only displayed in currency values if currency 
+triads are allowed.
+	
+@return The character used as the thousands separator.
+*/
+	{return(iThousandsSeparator);}
+
+
+
+
+inline void TLocale::SetThousandsSeparator(const TChar& aChar)
+/**
+Sets the character to be used to separate groups of three digits to the left 
+of the decimal separator.
+	
+A thousands separator character is only displayed in currency values if currency 
+triads are allowed.
+	
+@param aChar The character to be used as the thousands separator.
+*/
+	{iThousandsSeparator=aChar;}
+
+
+
+
+inline TChar TLocale::DecimalSeparator() const
+/**
+Gets the character used to separate a whole number from its fractional part.
+	
+@return The character used as the decimal separator.
+*/
+	{return(iDecimalSeparator);}
+
+
+
+
+inline void TLocale::SetDecimalSeparator(const TChar& aChar)
+/**
+Sets the character to be used to separate a whole number from its fractional 
+part.
+	
+@param aChar The character to be used as the decimal separator.
+*/
+	{iDecimalSeparator=aChar;}
+
+
+
+
+inline TChar TLocale::DateSeparator(TInt aIndex) const
+/**
+Gets one of the four characters used to separate the day, month and year 
+components of the date.
+	
+If the four separators are represented by S0, S1, S2 and S3 and the three 
+date components are represented by XX, YY and ZZ, then the separators are 
+located: S0 XX S1 YY S2 ZZ S3.
+	
+@param aIndex An index indicating which of the four separators is being accessed. 
+              This must be a value between zero and three inclusive.
+
+@return A date separator character as determined by the value of aIndex.
+*/
+	{return(iDateSeparator[aIndex]);}
+
+
+
+
+inline void TLocale::SetDateSeparator(const TChar& aChar,TInt aIndex)
+/**
+Sets one of the four characters used to separate the day, month and year
+components of the date.
+	
+If the four separators are represented by S0, S1, S2 and S3 and the three 
+date components are represented by XX, YY and ZZ, then the separators are 
+located: S0 XX S1 YY S2 ZZ S3.
+	
+@param aChar  A date separator character to be used.
+@param aIndex An index indicating which of the four separators is being accessed. 
+	          This must be a value between zero and three inclusive.
+*/
+	{__ASSERT_DEBUG(aIndex>=0 && aIndex<KMaxDateSeparators,User::Invariant());
+	iDateSeparator[aIndex]=aChar;}
+
+
+
+
+inline TChar TLocale::TimeSeparator(TInt aIndex) const
+/**
+Gets one of the four characters used to separate the hour, second and minute 
+components of the time.
+	
+If the four separators are represented by S0, S1, S2 and S3 and the three 
+time components are represented by XX, YY and ZZ, then the separators are 
+located: S0 XX S1 YY S2 ZZ S3.
+	
+@param aIndex An index indicating which of the four separators is being
+              accessed. This must be a value between zero and three inclusive.
+
+@return A time separator character as determined by the value of aIndex.
+*/
+
+	{return(iTimeSeparator[aIndex]);}
+
+
+
+
+inline void TLocale::SetTimeSeparator(const TChar& aChar,TInt aIndex)
+/**
+Sets one of the four characters used to separate the hour, minute and second 
+components of the date.
+	
+If the four separators are represented by S0, S1, S2 and S3 and the three 
+time components are represented by XX, YY and ZZ, then the separators are 
+located: S0 XX S1 YY S2 ZZ S3.
+	
+@param aChar  A time separator character to be used.
+@param aIndex An index indicating which of the four separators is being accessed. 
+	          This must be a value between zero and three inclusive.
+*/
+	{__ASSERT_DEBUG(aIndex>=0 && aIndex<KMaxTimeSeparators,User::Invariant());
+	iTimeSeparator[aIndex]=aChar;}
+
+
+
+
+inline TLocalePos TLocale::AmPmSymbolPosition() const
+/**
+Gets the am/pm text position (before or after the time value).
+
+@return The am/pm text position (0 before, 1 after).
+*/
+	{return(iAmPmSymbolPosition);}
+
+
+
+
+inline void TLocale::SetAmPmSymbolPosition(TLocalePos aPos)
+/**
+Sets the am/pm text position (before or after the time value).
+	
+@param aSpace The am/pm text position (0 before, 1 after).
+*/
+	{iAmPmSymbolPosition=aPos;}
+
+
+
+
+inline TBool TLocale::AmPmSpaceBetween() const
+/**
+Tests whether or not a space is inserted between the time and the preceding 
+or trailing am/pm text.
+	
+@return True if a space is inserted between the time and am/pm text; false 
+        if not.
+*/
+	{return(iAmPmSpaceBetween);}
+
+
+
+
+inline void TLocale::SetAmPmSpaceBetween(TBool aSpace)
+/**
+Sets whether a space is inserted between the time and the preceding or trailing 
+am/pm text.
+	
+@param aPos ETrue if a space is inserted between the time and am/pm text; 
+            EFalse otherwise.
+*/
+	{iAmPmSpaceBetween=aSpace;}
+
+
+
+
+inline TUint TLocale::DaylightSaving() const
+/**
+Gets the zones in which daylight saving is in effect.
+	
+If daylight saving is in effect, one hour is added to the time.
+	
+Use TLocale::QueryHomeHasDaylightSavingOn() to find out whether daylight saving 
+is in effect for the home city. This is because the daylight saving setting 
+for the home city may differ from that of the zone in which home is located.
+	
+@return A bit mask in which the three least significant bits are defined, 
+        indicating which of the three daylight saving zones are adjusted for
+		daylight saving. These bits represent:
+		Northern (non-European countries in the northern hemisphere),
+		Southern (southern hemisphere),
+		and European.
+
+@see TLocale::QueryHomeHasDaylightSavingOn
+@see TDaylightSavingZone
+
+@deprecated Use the timezone server to retrieve information on timezones and DST.
+			This method will always indicate that DST is inactive, in order to
+			preserve compatibility.
+*/
+	{return(iDaylightSaving);} 
+
+
+
+
+inline TBool TLocale::QueryHomeHasDaylightSavingOn() const
+/**
+Tests whether or not daylight saving is set for the home city.
+	
+@return True if home daylight saving is set; false if not.
+
+@deprecated Use the timezone server to retrieve information on timezones and DST.
+			This method will always indicate that DST is inactive, in order to
+			preserve compatibility.
+*/
+	{return((iHomeDaylightSavingZone|EDstHome) & iDaylightSaving);}
+
+
+
+
+inline TDaylightSavingZone TLocale::HomeDaylightSavingZone() const
+/**
+Gets the daylight saving zone in which the home city is located.
+	
+@return The daylight saving zone in which the home city is located.
+
+@deprecated Use the timezone server to retrieve information on timezones and DST.
+*/
+	{return(iHomeDaylightSavingZone);}
+
+
+
+
+inline TUint TLocale::WorkDays() const
+/**
+Gets a bit mask representing the days of the week which are considered as 
+working days.
+	
+@return A bit mask of seven bits indicating (by being set) which days are 
+        workdays. The least significant bit corresponds to Monday, the next bit to 
+	    Tuesday and so on.
+*/
+	{return(iWorkDays);}
+
+
+
+
+inline void TLocale::SetWorkDays(TUint aMask)
+/**
+Sets the days of the week which are considered as working days.
+	
+@param aMask A bit mask of seven bits indicating (by being set) which days 
+             are workdays. The least significant bit corresponds to Monday, the
+			 next bit is Tuesday and so on.
+*/
+	{iWorkDays=aMask;}
+
+
+
+
+inline TDay TLocale::StartOfWeek() const
+/**
+Gets the day which is considered the first day of the week.
+	
+@return The first day of the week.
+*/
+	{return(iStartOfWeek);}
+
+
+
+
+inline void TLocale::SetStartOfWeek(TDay aDay)
+/**
+Sets the day which is considered to be the first day of the week.
+	
+@param aDay The first day of the week.
+*/
+	{iStartOfWeek=aDay;}
+
+
+
+
+inline TClockFormat TLocale::ClockFormat() const
+/**
+Gets the clock display format.
+	
+@return The clock display format.
+*/
+	{return(iClockFormat);}
+
+
+
+
+inline void TLocale::SetClockFormat(TClockFormat aFormat)
+/**
+Sets the clock display format.
+	
+@param aFormat The clock display format.
+*/
+	{iClockFormat=aFormat;}
+
+
+
+
+inline TUnitsFormat TLocale::UnitsGeneral() const
+/**
+Gets the general units of measurement.
+
+This function should be used when both short and long distances use the
+same units of measurement.
+	
+@return General units of measurement.
+*/
+	{return(iUnitsGeneral);}
+
+
+
+
+inline void TLocale::SetUnitsGeneral(TUnitsFormat aFormat)
+/**
+Sets the general units of measurement.
+This function should be used when both short and long distances use the
+same units of measurement.
+	
+@param aFormat General units of measurement.
+*/
+	{iUnitsGeneral=aFormat;}
+
+
+
+
+inline TUnitsFormat TLocale::UnitsDistanceShort() const
+/**
+Gets the units of measurement for short distances.
+
+Short distances are those which would normally be represented by either
+metres and centimetres or feet and inches.
+	
+@return Units of measurement for short distances.
+*/
+	{return(iUnitsDistanceShort);}
+
+
+
+
+inline void TLocale::SetUnitsDistanceShort(TUnitsFormat aFormat)
+/**
+Sets the units of measurement for short distances.
+
+Short distances are those which would normally be represented by either
+metres and centimetres or feet and inches.
+	
+@param aFormat Units of measurement for short distances.
+*/
+	{iUnitsDistanceShort=aFormat;}
+
+
+
+
+inline TUnitsFormat TLocale::UnitsDistanceLong() const
+/**
+Gets the units of measurement for long distances.
+
+Long distances are those which would normally be represented by either
+miles or kilometres.
+	
+@return Units of measurement for long distances.
+*/
+	{return(iUnitsDistanceLong);}
+
+
+
+
+inline void TLocale::SetUnitsDistanceLong(TUnitsFormat aFormat)
+/**
+Sets the units of measurement for long distances.
+
+Long distances are those which would normally be represented by either
+miles or kilometres.
+	
+@param aFormat Units of measurement for long distances.
+*/
+	{iUnitsDistanceLong=aFormat;}
+
+
+
+
+inline void TLocale::SetNegativeCurrencyFormat(TLocale::TNegativeCurrencyFormat aNegativeCurrencyFormat)
+/**
+Sets the negative currency format.
+	
+@param aNegativeCurrencyFormat How negative currency values are formatted.
+*/
+	{iNegativeCurrencyFormat = aNegativeCurrencyFormat;}
+
+
+
+
+inline TLocale::TNegativeCurrencyFormat TLocale::NegativeCurrencyFormat() const
+/**
+Gets the negative currency format.
+	
+@return How negative currency values are formatted.
+*/
+	{return(iNegativeCurrencyFormat);}
+
+
+
+
+inline TBool TLocale::NegativeLoseSpace() const
+/**
+Gets whether negative currency values lose the space between the currency 
+symbol and the value.
+	
+@return True, if negative currency values lose the space between the value 
+	    and the symbol; false, if not.
+*/
+	{ 
+	if((iExtraNegativeCurrencyFormatFlags|EFlagNegativeLoseSpace)==iExtraNegativeCurrencyFormatFlags)
+		return ETrue;
+	else
+		return EFalse;
+	}
+
+
+
+
+inline void TLocale::SetNegativeLoseSpace(TBool aBool)
+/**
+Sets whether negative currency values lose the space between the currency symbol 
+and the value.
+	
+@param aBool ETrue to set a flag which indicates that negative currency values 
+	         should lose the space between the value and the symbol. EFalse to unset it.
+*/
+	{
+	if(aBool)
+		iExtraNegativeCurrencyFormatFlags |= EFlagNegativeLoseSpace;
+	else
+		iExtraNegativeCurrencyFormatFlags &= ~EFlagNegativeLoseSpace;
+	}
+
+
+
+
+inline TBool TLocale::NegativeCurrencySymbolOpposite() const
+/**
+Gets whether in negative currency values, the position of the currency symbol 
+is set to be the opposite of the position used for non-negative values (before 
+or after the value, as set by SetCurrencySymbolPosition()).
+	
+@return True, if the currency symbol position for negative currency values 
+	    is the opposite of the position set by SetCurrencySymbolPosition();
+		false, otherwise.
+
+@see TLocale::SetCurrencySymbolPosition
+*/
+	{
+	if((iExtraNegativeCurrencyFormatFlags|EFlagNegativeCurrencySymbolOpposite)==iExtraNegativeCurrencyFormatFlags)
+		return ETrue;
+	else
+		return EFalse;
+	}
+
+
+
+
+inline void TLocale::SetNegativeCurrencySymbolOpposite(TBool aBool)
+/**
+Sets whether the position of the currency symbol for negative currency values 
+should be the opposite of the position used for non-negative values (before 
+or after the value, as set by SetCurrencySymbolPosition()).
+	
+@param aBool ETrue to set the position of the currency symbol in negative 
+             currency values to be the opposite of the position as set
+			 using SetCurrencySymbolPosition(). EFalse to leave the
+			 position unchanged.
+
+@see TLocale::SetCurrencySymbolPosition
+*/
+	{
+	if (aBool)
+		iExtraNegativeCurrencyFormatFlags |= EFlagNegativeCurrencySymbolOpposite;
+	else
+		iExtraNegativeCurrencyFormatFlags &= ~EFlagNegativeCurrencySymbolOpposite;
+	}
+
+
+
+
+inline TLanguage TLocale::LanguageDowngrade(TInt aIndex) const
+/**
+Gets the language that is stored at the specified index into the customisable 
+part of the language downgrade path.
+	
+The second, third and fourth languages in the language downgrade path can 
+be customised. These can be enquired using this function. The first language 
+in the path is always the language of the current locale, as returned by User::Language(). 
+	
+The languages in the downgrade path are used in turn by the BaflUtils::NearestLanguageFile() 
+function to find the best matching language-specific version of a language-neutral 
+filename.
+	
+The full language downgrade path can be retrieved using BaflUtils::GetDowngradePath().
+	
+@param aIndex An index into the customisable part of the language downgrade 
+              path. Between zero and two inclusive.
+
+@return The language at the specified index.
+
+@see BaflUtils::NearestLanguageFile
+@see BaflUtils::GetDowngradePath
+*/
+	{
+	__ASSERT_DEBUG(0 <= aIndex && aIndex < 3, User::Invariant());
+	return static_cast<TLanguage>(iLanguageDowngrade[aIndex]);
+	}
+
+
+
+
+inline void TLocale::SetLanguageDowngrade(TInt aIndex, TLanguage aLanguage)
+/**
+Sets a language in the customisable part of the language downgrade path.
+	
+@param aIndex    An index into the customisable part of the path at which to 
+	             add the language, a value between zero and two.
+@param aLanguage The language to add. ELangNone is considered to be the last 
+	             language in the path, no more will be searched, so can be used
+				 to specify that no language downgrade is required.
+
+@see BaflUtils::NearestLanguageFile
+@see BaflUtils::GetDowngradePath
+*/
+	{
+	__ASSERT_DEBUG(0 <= aIndex && aIndex < 3, User::Invariant());
+	iLanguageDowngrade[aIndex] = static_cast<TUint16>(aLanguage);
+	}
+
+
+
+
+/**
+Gets the number mode stored in the locale.
+
+@return The number mode for the locale.
+*/
+inline TDigitType TLocale::DigitType() const
+	{ return iDigitType; }
+
+
+
+
+/**
+Sets the number mode for the locale. 
+
+@param aDigitType The number mode to be set.
+*/
+inline void TLocale::SetDigitType(TDigitType aDigitType)
+	{ iDigitType=aDigitType; }
+
+
+
+
+/**
+Sets the device time state.
+
+@param aState The device time state. 
+
+@deprecated Use the timezone server to coordinate automatic time adjustment.
+*/
+inline void TLocale::SetDeviceTime(TDeviceTimeState aState)
+   	{
+   	iDeviceTimeState=aState;
+   	}
+
+
+/**
+Gets the device time state.
+
+@return The device time state.
+
+@deprecated Use the timezone server to coordinate automatic time adjustment.
+*/
+inline TLocale::TDeviceTimeState TLocale::DeviceTime() const
+   	{
+   	return iDeviceTimeState;
+   	}
+
+
+/**
+Get the pointer to the TLocale object contained in this extended locale.
+
+@return Pointer to the TLocale object. 
+*/
+inline TLocale*	TExtendedLocale::GetLocale()
+	{ return &iLocale; }
+
+inline const LCharSet* TExtendedLocale::GetDefaultCharSet() 
+	{ return iDefaultCharSet; }
+
+inline const LCharSet* TExtendedLocale::GetPreferredCharSet() 
+	{ return iPreferredCharSet; }
+
+inline SLocaleLanguage* TExtendedLocale::GetLanguageSettings() 
+	{return &iLanguageSettings;}
+
+inline SLocaleLocaleSettings* TExtendedLocale::GetLocaleExtraSettings() 
+	{ return &iLocaleExtraSettings; };
+
+inline SLocaleTimeDateFormat* TExtendedLocale::GetLocaleTimeDateFormat() 
+	{ return &iLocaleTimeDateFormat; }
+
+
+// Class TFindSemaphore
+inline TFindSemaphore::TFindSemaphore()
+    : TFindHandleBase()
+/**
+Constructs the object with a default match pattern.
+
+The default match pattern, as implemented by the base class, is the single 
+character "*".
+
+A new match pattern can be set after construction by calling the Find() member 
+function of the TFindHandleBase base class.
+
+@see TFindHandleBase::Find
+*/
+    {}
+
+
+
+
+inline TFindSemaphore::TFindSemaphore(const TDesC &aMatch)
+    : TFindHandleBase(aMatch)
+/**
+Constructs this object with the specified match pattern.
+
+A new match pattern can be set after construction by
+calling TFindHandleBase::Find().
+
+Note that after construction, the object contains a copy of the supplied
+match pattern; the source descriptor can, therefore, be safely discarded.
+
+@param aMatch A reference to the descriptor containing the match pattern. 
+
+@see TFindHandleBase::Find
+*/
+    {}
+
+
+
+
+// Class TFindMutex
+inline TFindMutex::TFindMutex()
+    : TFindHandleBase()
+/**
+Constructs this object with a default match pattern.
+
+The default match pattern, as implemented by the base class, is the single 
+character "*".
+
+A new match pattern can be set after construction by calling the Find() member 
+function of the TFindHandleBase base class.
+
+@see TFindHandleBase::Find
+*/
+    {}
+
+
+
+
+inline TFindMutex::TFindMutex(const TDesC &aMatch)
+    : TFindHandleBase(aMatch)
+/**
+Constructs this object with the specified match pattern.
+
+A new match pattern can be set after construction by calling the Find() member 
+function of the TFindHandleBase base class.
+
+After construction, the object contains a copy of the supplied match pattern; 
+the source descriptor can, therefore, be safely discarded.
+
+@param aMatch The match pattern.
+
+@see TFindHandleBase::Find
+*/
+    {}
+
+
+
+
+// Class TFindChunk
+inline TFindChunk::TFindChunk()
+    : TFindHandleBase()
+/**
+Constructs this object with a default match pattern.
+
+The default match pattern, as implemented by the base class, is
+the single character "*".
+
+A new match pattern can be set after construction by
+calling TFindHandleBase::Find().
+
+@see TFindHandleBase
+*/
+    {}
+
+
+
+
+inline TFindChunk::TFindChunk(const TDesC &aMatch)
+    : TFindHandleBase(aMatch)
+/**
+Constructs the object with the specified match pattern.
+
+A new match pattern can be set after construction by
+calling TFindHandleBase::Find().
+
+@param aMatch The match pattern.
+
+@see TFindHandleBase
+*/
+    {}
+
+
+
+
+// Class TFindThread
+inline TFindThread::TFindThread()
+    : TFindHandleBase()
+/**
+Constructs this object with a default match pattern.
+
+The default match pattern, as implemented by the base class,
+is the single character *.
+
+A new match pattern can be set after construction
+by calling TFindHandleBase::Find().
+
+@see TFindHandleBase::Find
+*/
+    {}
+
+
+
+
+inline TFindThread::TFindThread(const TDesC &aMatch)
+    : TFindHandleBase(aMatch)
+/**
+Constructs this object with the specified match pattern.
+
+A new match pattern can be set after construction
+by calling the TFindHandleBase::Find().
+
+@see TFindHandleBase::Find
+*/
+    {}
+
+
+
+
+// Class TFindProcess
+inline TFindProcess::TFindProcess()
+    : TFindHandleBase()
+/**
+Constructs this object with a default match pattern.
+
+The default match pattern, as implemented by the base class,
+is the single character *.
+
+A new match pattern can be set after construction
+by calling TFindHandleBase::Find().
+
+@see TFindHandleBase::Find
+*/
+    {}
+
+
+
+
+inline TFindProcess::TFindProcess(const TDesC &aMatch)
+    : TFindHandleBase(aMatch)
+/**
+Constructs this object with the specified match pattern.
+
+A new match pattern can be set after construction
+by calling the TFindHandleBase::Find().
+
+@see TFindHandleBase::Find
+*/
+    {}
+
+
+
+
+// Class TFindLogicalDevice
+/**
+Constructs the LDD factory object with a default match pattern.
+
+The default match pattern, as implemented by the base class, is the single 
+character "*".
+
+A new match pattern can be set after construction by calling the Find() member 
+function of the TFindHandleBase base class.
+
+@see TFindHandleBase::Find
+*/
+inline TFindLogicalDevice::TFindLogicalDevice()
+    : TFindHandleBase()
+    {}
+
+/**
+Constructs the LDD factory object with a specified match pattern.
+
+A new match pattern can be set after construction by calling
+TFindHandleBase::Find().
+
+@param aMatch The match pattern.
+
+@see TFindHandleBase::Find
+*/
+inline TFindLogicalDevice::TFindLogicalDevice(const TDesC &aMatch)
+    : TFindHandleBase(aMatch)
+    {}
+
+// Class TFindPhysicalDevice
+/**
+Constructs the PDD factory object with a default match pattern.
+
+The default match pattern, as implemented by the base class, is the single 
+character "*".
+
+A new match pattern can be set after construction by calling the Find() member 
+function of the TFindHandleBase base class.
+
+@see TFindHandleBase::Find
+*/
+inline TFindPhysicalDevice::TFindPhysicalDevice()
+    : TFindHandleBase()
+    {}
+
+/**
+Constructs the PDD factory object with a specified match pattern.
+
+A new match pattern can be set after construction by calling
+TFindHandleBase::Find().
+
+@param aMatch The match pattern.
+
+@see TFindHandleBase::Find
+*/
+inline TFindPhysicalDevice::TFindPhysicalDevice(const TDesC &aMatch)
+    : TFindHandleBase(aMatch)
+    {}
+
+
+
+
+
+// Class TFindServer
+inline TFindServer::TFindServer()
+    : TFindHandleBase()
+/**
+Constructs the object with a default match pattern.
+
+The default match pattern, as implemented by the base class, is the single 
+character "*".
+
+A new match pattern can be set after construction by calling the Find() member 
+function of the TFindHandleBase base class.
+
+@see TFindHandleBase::Find
+*/
+    {}
+
+
+
+
+inline TFindServer::TFindServer(const TDesC &aMatch)
+    : TFindHandleBase(aMatch)
+/**
+Constructs the object with a specified match pattern.
+
+A new match pattern can be set after construction by calling
+TFindHandleBase::Find().
+
+@param aMatch The match pattern.
+
+@see TFindHandleBase::Find
+*/
+    {}
+
+
+
+
+// Class TFindLibrary
+inline TFindLibrary::TFindLibrary()
+    : TFindHandleBase()
+/**
+Constructs this object with a default match pattern.
+
+The default match pattern is the single character ‘*’ and is implemented by
+the base class TFindHandleBase.
+*/
+    {}
+
+
+
+
+inline TFindLibrary::TFindLibrary(const TDesC &aMatch)
+    : TFindHandleBase(aMatch)
+/**
+Constructs this object with the specified match pattern.
+
+@param aMatch The descriptor containing the match pattern. 
+*/
+    {}
+
+
+
+
+// Class RDevice
+/**
+Opens a handle to an LDD factory object found using a TFindLogicalDevice object.
+
+A TFindLogicalDevice object is used to find all LDD factory objects whose full names match 
+a specified pattern.
+
+@param aFind A reference to the object which is used to find the LDD factory object.
+@param aType An enumeration whose enumerators define the ownership of this 
+             LDD factory object handle. If not explicitly specified, EOwnerProcess is
+			 taken as default.
+
+@return KErrNone if successful, otherwise one of the other system wide error 
+        codes.
+*/
+inline TInt RDevice::Open(const TFindLogicalDevice& aFind,TOwnerType aType)
+	{return(RHandleBase::Open(aFind,aType));}
+
+
+
+
+// Class RCriticalSection
+inline TBool RCriticalSection::IsBlocked() const
+/**
+Tests whether the critical section is occupied by another thread.
+
+@return True, if the critical section is occupied by another thread. False, 
+        otherwise.
+*/
+	{return(iBlocked!=1);}
+
+
+
+
+// Class RMutex
+inline TInt RMutex::Open(const TFindMutex& aFind,TOwnerType aType)
+/**
+Opens a handle to the global mutex found using a TFindMutex object.
+
+A TFindMutex object is used to find all global mutexes whose full names match 
+a specified pattern.
+
+By default, any thread in the process can use this instance of RMutex to access 
+the mutex. However, specifying EOwnerThread as the second parameter to this 
+function, means that only the opening thread can use this instance of RMutex 
+to access the mutex; any other thread in this process that wants to access 
+the mutex must either duplicate the handle or use OpenGlobal() again.
+
+@param aFind A reference to the object which is used to find the mutex.
+@param aType An enumeration whose enumerators define the ownership of this 
+             mutex handle. If not explicitly specified, EOwnerProcess is
+			 taken as default. 
+
+@return KErrNone if successful, otherwise one of the other system wide error 
+        codes.
+*/
+	{return(RHandleBase::Open(aFind,aType));}
+
+
+
+
+// Class RChunk
+inline TInt RChunk::Open(const TFindChunk& aFind,TOwnerType aType)
+/**
+Opens a handle to the global chunk found using a TFindChunk object.
+
+A TFindChunk object is used to find all chunks whose full names match
+a specified pattern. 
+
+By default, ownership of this chunk handle is vested in the current process, 
+but can be vested in the current thread by passing EOwnerThread as the second 
+parameter to this function.
+
+@param aFind A reference to the TFindChunk object used to find the chunk.
+@param aType An enumeration whose enumerators define the ownership of this 
+             chunk handle. If not explicitly specified, EOwnerProcess is
+			 taken as default.
+
+@return KErrNone if successful, otherwise another of the system error codes.
+*/
+	{return(RHandleBase::Open(aFind,aType));}
+
+
+
+
+inline TBool RChunk::IsReadable() const
+/**
+Tests whether the chunk is mapped into its process address space.
+
+@return True, if the chunk is readable; false, otherwise.
+*/
+	{return (Attributes()&RHandleBase::EDirectReadAccess); }
+
+
+
+
+inline TBool RChunk::IsWritable() const
+/**
+Tests whether the chunk mapped into its process address space and is writable.
+
+@return True, if the chunk is writable; false, otherwise.
+*/
+	{return (Attributes()&RHandleBase::EDirectWriteAccess); }
+
+
+
+
+// Class TObjectId
+inline TObjectId::TObjectId()
+/**
+Default constructor.
+*/
+	{}
+
+
+
+
+inline TObjectId::TObjectId(TUint64 aId)
+	: iId(aId)
+/**
+Constructor taking an unsigned integer value.
+
+@param aId The value of the object id.
+*/
+	{}
+
+
+
+
+inline TUint64 TObjectId::Id() const
+/**
+Return the ID as a 64 bit integer
+*/
+	{ return iId; }
+
+
+
+
+inline TObjectId::operator TUint() const
+/**
+Conversion operator invoked by the compiler when a TObjectId type is passed
+to a function that is prototyped to take a TUint type.
+
+@see TUint
+*/
+	{ return TUint(iId); }
+
+
+
+
+inline TBool TObjectId::operator==(TObjectId aId) const
+/**
+Tests whether this thread Id is equal to the specified Id.
+
+@param aId The thread Id to be compared with this thread Id.
+
+@return True, if the thread Ids are equal; false otherwise.
+*/
+	{return iId==aId.iId;}
+
+
+
+
+inline TBool TObjectId::operator!=(TObjectId aId) const
+/**
+Tests whether this thread Id is unequal to the specified thread Id.
+
+@param aId The thread Id to be compared with this thread Id.
+
+@return True, if the thread Ids are unequal; false otherwise.
+*/
+	{return iId!=aId.iId;}
+
+
+
+
+// Class TThreadId
+inline TThreadId::TThreadId()
+	: TObjectId()
+/**
+Default constructor.
+*/
+	{}
+
+
+
+
+inline TThreadId::TThreadId(TUint64 aId)
+	: TObjectId(aId)
+/**
+Constructor taking an unsigned integer value.
+
+@param aId The value of the thread id.
+*/
+	{}
+
+
+
+
+// Class RThread
+inline RThread::RThread()
+	: RHandleBase(KCurrentThreadHandle)
+/**
+Default constructor.
+
+The constructor exists to initialise private data within this handle; it does 
+not create the thread object.
+
+Specifically, it sets the handle-number to the value KCurrentThreadHandle.
+In effect, the constructor creates a default thread handle.
+*/
+	{}
+
+
+
+
+inline TInt RThread::Open(const TFindThread& aFind,TOwnerType aType)
+/**
+Opens a handle to the thread found by pattern matching a name.
+
+A TFindThread object is used to find all threads whose full names match a 
+specified pattern. 
+
+By default, ownership of this thread handle is vested in the current process, 
+but can be vested in the current thread by passing EOwnerThread as the second 
+parameter to this function.
+
+@param aFind A reference to the TFindThread object used to find the thread.
+@param aType An enumeration whose enumerators define the ownership of this 
+             thread handle. If not explicitly specified, EOwnerProcess is
+			 taken as default.
+
+@return KErrNone if successful, otherwise one of the other system-wide error codes.
+*/
+	{return(RHandleBase::Open(aFind,aType));}
+
+
+
+
+#ifndef __REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__
+
+inline TBool RThread::HasCapability(TCapability aCapability, const char* aDiagnostic) const
+	{
+	return DoHasCapability(aCapability, aDiagnostic);
+	}
+
+inline TBool RThread::HasCapability(TCapability aCapability1, TCapability aCapability2, const char* aDiagnostic) const
+	{
+	return DoHasCapability(aCapability1, aCapability2, aDiagnostic);
+	}
+
+#else //__REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__
+
+// Only available to NULL arguments
+inline TBool RThread::HasCapability(TCapability aCapability, OnlyCreateWithNull /*aDiagnostic*/) const
+	{
+	return DoHasCapability(aCapability);
+	}
+
+inline TBool RThread::HasCapability(TCapability aCapability1, TCapability aCapability2, OnlyCreateWithNull /*aDiagnostic*/) const
+	{
+	return DoHasCapability(aCapability1, aCapability2);
+	}
+
+#ifndef __REMOVE_PLATSEC_DIAGNOSTICS__
+// For things using KSuppressPlatSecDiagnostic
+inline TBool RThread::HasCapability(TCapability aCapability, OnlyCreateWithNull /*aDiagnostic*/, OnlyCreateWithNull /*aSuppress*/) const
+	{
+	return DoHasCapability(aCapability, KSuppressPlatSecDiagnosticMagicValue);
+	}
+
+inline TBool RThread::HasCapability(TCapability aCapability1, TCapability aCapability2, OnlyCreateWithNull /*aDiagnostic*/, OnlyCreateWithNull /*aSuppress*/) const
+	{
+	return DoHasCapability(aCapability1, aCapability2, KSuppressPlatSecDiagnosticMagicValue);
+	}
+
+#endif // !__REMOVE_PLATSEC_DIAGNOSTICS__
+
+#endif // !__REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__
+
+// Class TProcessId
+inline TProcessId::TProcessId()
+	: TObjectId()
+/**
+Default constructor.
+*/
+	{}
+
+
+
+
+inline TProcessId::TProcessId(TUint64 aId)
+	: TObjectId(aId)
+/**
+Constructor taking an unsigned integer value.
+
+@param aId The value of the process id.
+*/
+	{}
+
+
+
+
+// Class RProcess
+inline RProcess::RProcess()
+	: RHandleBase(KCurrentProcessHandle)
+/** 
+Default constructor.
+
+The constructor exists to initialise private data within this handle; it does 
+not create the process object.
+
+Specifically, it sets the handle-number to the value KCurrentProcessHandle.
+In effect, the constructor creates a default process handle.
+*/
+	{}
+
+
+
+
+inline RProcess::RProcess(TInt aHandle)
+	: RHandleBase(aHandle)
+/**
+Constructor taking a handle number.
+
+@param aHandle The handle number to be used to construct this RProcess handle.
+*/
+	{}
+
+
+
+
+inline TInt RProcess::Open(const TFindProcess& aFind,TOwnerType aType)
+/**
+Opens a handle to the process found by pattern matching a name.
+
+A TFindProcess object is used to find all processes whose full names match 
+a specified pattern. 
+
+By default, ownership of this process handle is vested in the current process, 
+but can be vested in the current thread by passing EOwnerThread as the second 
+parameter to this function.
+
+@param aFind A reference to the TFindProcess object used to find the process.
+@param aType An enumeration whose enumerators define the ownership of this 
+             process handle. If not explicitly specified, EOwnerProcess is taken
+			 as default.
+
+@return KErrNone if successful, otherwise one of the other system-wide error codes.
+*/
+	{return(RHandleBase::Open(aFind,aType));}
+
+
+
+
+#ifndef __REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__
+
+inline TBool RProcess::HasCapability(TCapability aCapability, const char* aDiagnostic) const
+	{
+	return DoHasCapability(aCapability, aDiagnostic);
+	}
+
+inline TBool RProcess::HasCapability(TCapability aCapability1, TCapability aCapability2, const char* aDiagnostic) const
+	{
+	return DoHasCapability(aCapability1, aCapability2, aDiagnostic);
+	}
+
+#else //__REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__
+
+// Only available to NULL arguments
+inline TBool RProcess::HasCapability(TCapability aCapability, OnlyCreateWithNull /*aDiagnostic*/) const
+	{
+	return DoHasCapability(aCapability);
+	}
+
+inline TBool RProcess::HasCapability(TCapability aCapability1, TCapability aCapability2, OnlyCreateWithNull /*aDiagnostic*/) const
+	{
+	return DoHasCapability(aCapability1, aCapability2);
+	}
+
+#ifndef __REMOVE_PLATSEC_DIAGNOSTICS__
+// For things using KSuppressPlatSecDiagnostic
+inline TBool RProcess::HasCapability(TCapability aCapability, OnlyCreateWithNull /*aDiagnostic*/, OnlyCreateWithNull /*aSuppress*/) const
+	{
+	return DoHasCapability(aCapability, KSuppressPlatSecDiagnosticMagicValue);
+	}
+
+inline TBool RProcess::HasCapability(TCapability aCapability1, TCapability aCapability2, OnlyCreateWithNull /*aDiagnostic*/, OnlyCreateWithNull /*aSuppress*/) const
+	{
+	return DoHasCapability(aCapability1, aCapability2, KSuppressPlatSecDiagnosticMagicValue);
+	}
+
+#endif // !__REMOVE_PLATSEC_DIAGNOSTICS__
+
+#endif // !__REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__
+
+
+
+
+
+// Class RSessionBase
+
+
+/**
+Creates a session with a server, specifying no message slots.
+
+It should be called as part of session initialisation in the derived class.
+
+Message slots are not pre-allocated for the session but are taken from
+a system-wide pool allowing up to 255 asynchronous messages to be outstanding.
+This raises a risk of failure due to lack of memory and, therefore, this mode
+of operation is not viable for sessions that make guarantees about the failure
+modes of asynchonous services.
+
+@param aServer  The name of the server with which a session is to
+                be established.
+@param aVersion The lowest version of the server with which this client
+                is compatible
+
+@return KErrNone if successful, otherwise one of the other system-wide error
+        codes.
+*/
+inline TInt RSessionBase::CreateSession(const TDesC& aServer,const TVersion& aVersion)
+	{return CreateSession(aServer,aVersion,-1,EIpcSession_Unsharable,NULL,0);}
+
+
+
+
+/**
+Creates a session with a server, specifying no message slots.
+
+It should be called as part of session initialisation in the derived class.
+
+Message slots are not pre-allocated for the session but are taken from
+a system-wide pool allowing up to 255 asynchronous messages to be outstanding.
+This raises a risk of failure due to lack of memory and, therefore, this mode
+of operation is not viable for sessions that make guarantees about the failure
+modes of asynchonous services.
+
+@param aServer  A handle to a server with which a session is to be established.
+@param aVersion The lowest version of the server with which this client
+                is compatible
+
+@return KErrNone if successful, otherwise one of the other system-wide error
+        codes.
+*/
+inline TInt RSessionBase::CreateSession(RServer2 aServer,const TVersion& aVersion)
+	{return CreateSession(aServer,aVersion,-1,EIpcSession_Unsharable,NULL,0);}
+
+
+
+
+/**
+Issues a blind request to the server with the specified function number,
+and arguments.
+
+A blind request is one where the server does not issue a response
+to the client.
+
+@param aFunction The function number identifying the request.
+@param aArgs     A set of up to 4 arguments and their types to be passed
+                 to the server.
+
+@return KErrNone, if the send operation is successful;
+        KErrServerTerminated, if the server no longer present;
+        KErrServerBusy, if there are no message slots available;
+        KErrNoMemory, if there is insufficient memory available.
+
+@panic  USER 72 if the function number is negative.
+*/
+inline TInt RSessionBase::Send(TInt aFunction,const TIpcArgs& aArgs) const
+	{return DoSend(aFunction,&aArgs);}
+
+
+
+
+/**
+Issues an asynchronous request to the server with the specified function
+number and arguments. 
+
+The completion status of the request is returned via the request
+status object, aStatus. 
+
+@param aFunction The function number identifying the request.
+@param aArgs     A set of up to 4 arguments and their types to be passed
+                 to the server.
+@param aStatus   The request status object used to contain the completion status
+                 of the request.
+                 
+@panic  USER 72  if the function number is negative.                 
+*/
+inline void RSessionBase::SendReceive(TInt aFunction,const TIpcArgs& aArgs,TRequestStatus& aStatus) const
+	{DoSendReceive(aFunction,&aArgs,aStatus);}
+
+
+
+
+/**
+Issues a synchronous request to the server with the specified function number
+and arguments.
+
+@param aFunction The function number identifying the request.
+@param aArgs     A set of up to 4 arguments and their types to be passed
+                 to the server.
+
+@return KErrNone, if the send operation is successful;
+        KErrServerTerminated, if the server no longer present;
+        KErrServerBusy, if there are no message slots available;
+        KErrNoMemory, if there is insufficient memory available.
+
+@panic  USER 72  if the function number is negative.
+*/
+inline TInt RSessionBase::SendReceive(TInt aFunction,const TIpcArgs& aArgs) const
+	{return DoSendReceive(aFunction,&aArgs);}
+
+
+
+
+/**
+Issues a blind request to the server with the specified function number,
+but with no arguments.
+
+A blind request is one where the server does not issue a response
+to the client.
+
+@param aFunction The function number identifying the request.
+
+@return KErrNone, if the send operation is successful;
+        KErrServerTerminated, if the server no longer present;
+        KErrServerBusy, if there are no message slots available;
+        KErrNoMemory, if there is insufficient memory available.
+
+@panic  USER 72 if the function number is negative.
+*/
+inline TInt RSessionBase::Send(TInt aFunction) const
+	{return DoSend(aFunction,NULL);}
+
+
+
+
+/**
+Issues an asynchronous request to the server with the specified function
+number, but with no arguments.
+
+The completion status of the request is returned via the request
+status object, aStatus. 
+
+@param aFunction The function number identifying the request.
+@param aStatus   The request status object used to contain the completion
+                 status of the request.
+                 
+@panic  USER 72  if the function number is negative.                 
+*/
+inline void RSessionBase::SendReceive(TInt aFunction,TRequestStatus& aStatus) const
+	{ DoSendReceive(aFunction,NULL,aStatus);}
+
+
+
+
+/**
+Sets the handle-number of this handle to the specified 
+value.
+
+The function can take a (zero or positive) handle-number,
+or a (negative) error number.
+
+If aHandleOrError represents a handle-number, then the handle-number of this handle
+is set to that value.
+If aHandleOrError represents an error number, then the handle-number of this handle is set to zero
+and the negative value is returned.
+
+@param aHandleOrError A handle-number, if zero or positive; an error value, if negative.
+
+@return KErrNone, if aHandle is a handle-number; the value of aHandleOrError, otherwise.
+*/
+inline TInt RSessionBase::SetReturnedHandle(TInt aHandleOrError)
+	{ return RHandleBase::SetReturnedHandle(aHandleOrError);}
+
+
+
+
+inline TInt RSessionBase::SetReturnedHandle(TInt aHandleOrError,RHandleBase& aHandle)
+	{ return RHandleBase::SetReturnedHandle(aHandleOrError,aHandle);}
+/**
+Issues a synchronous request to the server with the specified function number,
+but with no arguments.
+
+@param aFunction The function number identifying the request.
+
+@return KErrNone, if the send operation is successful;
+        KErrServerTerminated, if the server no longer present;
+        KErrServerBusy, if there are no message slots available;
+        KErrNoMemory, if there is insufficient memory available.
+
+@panic  USER 72  if the function number is negative.
+*/
+inline TInt RSessionBase::SendReceive(TInt aFunction) const
+	{return DoSendReceive(aFunction,NULL);}
+
+
+
+
+// Class RSubSessionBase
+inline RSubSessionBase::RSubSessionBase()
+	: iSubSessionHandle(0)
+/**
+Default constructor
+*/
+	{}
+
+
+
+
+inline TInt RSubSessionBase::SubSessionHandle() const
+/**
+Gets the sub-session handle number.
+
+This number is automatically passed to the server when making requests and is
+used to identify the appropriate server-side sub-session.
+
+@return The sub-session handle number.
+*/
+	{return iSubSessionHandle;}
+
+
+
+
+/**
+Creates a new sub-session within an existing session.
+
+@param aSession    The session to which this sub-session will belong.
+@param aFunction   The opcode specifying the requested service; the server should interpret this as a request to create a sub-session.
+@param aArgs       The message arguments.   
+
+@return            KErrNone if successful, otherwise one of the system-wide error codes.
+*/
+inline TInt RSubSessionBase::CreateSubSession(const RSessionBase& aSession,TInt aFunction,const TIpcArgs& aArgs)
+	{ return DoCreateSubSession(aSession,aFunction,&aArgs); }
+
+
+
+	
+/**
+Creates a new sub-session within an existing session.
+
+This variant sends no message arguments to the server.
+
+@param aSession    The session to which this sub-session will belong.
+@param aFunction   The opcode specifying the requested service; the server should interpret this as a request to create a sub-session.
+
+@return            KErrNone if successful, otherwise one of the system-wide error codes.
+*/
+inline TInt RSubSessionBase::CreateSubSession(const RSessionBase& aSession,TInt aFunction)
+	{ return DoCreateSubSession(aSession,aFunction,NULL); }
+
+
+
+	
+/**
+Sends a blind message to the server - no reply is expected.
+
+A set of message arguments is passed that can be used to specify client
+addresses, which the server can use to read from and write to the client
+address space.
+
+Note that this function can fail if there are no available message-slots, either
+in the system wide pool (if this is being used), or in the session reserved pool
+(if this is being used). If the client request is synchronous, then always use
+the synchronous variant of SendReceive(); this is guaranteed to reach the server.
+
+@param aFunction	The opcode specifying the requested service.
+@param aArgs		The message arguments.
+                    
+@return				KErrNone if successful, otherwise one of the system-wide error codes.                    
+*/
+inline TInt RSubSessionBase::Send(TInt aFunction,const TIpcArgs& aArgs) const
+	{return DoSend(aFunction,&aArgs);}
+
+
+
+	
+/**
+Sends a message to the server and waits asynchronously for the reply.
+
+An opcode specifies the service required.
+A set of message arguments is passed that can be used to specify client addresses,
+which the server can use to read from and write to the client address space.
+
+Note that this function can fail if there are no available message-slots, 
+either in the system wide pool (if this is being used), or in the session
+reserved pool (if this is being used). If the client request is synchronous,
+then always use the synchronous variant of SendReceive();
+this is guaranteed to reach the server.
+
+@param aFunction	The opcode specifying the requested service.
+@param aArgs		The message arguments.
+@param aStatus	    A request status which indicates the completion status of the asynchronous request.
+*/
+inline void RSubSessionBase::SendReceive(TInt aFunction,const TIpcArgs& aArgs,TRequestStatus& aStatus) const
+	{DoSendReceive(aFunction,&aArgs,aStatus);}
+
+
+
+	
+/**
+Sends a message to the server and waits synchronously for a reply.
+
+An opcode specifies the service required.
+A set of message arguments is passed that can be used to specify client addresses,
+which the server can use to read from and write to the client address space.
+
+Note that this function will only fail if the server itself fails or environmental
+errors occur in the server. All requests made using this function are guaranteed to
+reach the server. This means that all synchronous client requests (typically those
+that return void) should be routed through this synchronous variant of SendReceive().
+
+@param aFunction	The opcode specifying the requested service.
+@param aArgs		The message arguments.
+
+@return				KErrNone if successful, otherwise one of the system-wide error codes. 
+*/
+inline TInt RSubSessionBase::SendReceive(TInt aFunction,const TIpcArgs& aArgs) const
+	{return DoSendReceive(aFunction,&aArgs);}
+	
+
+
+	
+/**
+Sends a blind message to the server - no reply is expected.
+
+This variant sends no message arguments to the server.
+
+@param aFunction	The opcode specifying the requested service.
+                    
+@return				KErrNone if successful, otherwise one of the system-wide error codes. 
+*/
+inline TInt RSubSessionBase::Send(TInt aFunction) const
+	{return DoSend(aFunction,NULL);}
+
+
+
+	
+/**
+Sends a message to the server and waits asynchronously for the reply.
+
+An opcode specifies the service required.
+This variant sends no message arguments to the server.
+
+@param aFunction	The opcode specifying the requested service.
+@param aStatus	    A request status which indicates the completion status of the asynchronous request.
+*/
+inline void RSubSessionBase::SendReceive(TInt aFunction,TRequestStatus& aStatus) const
+	{ DoSendReceive(aFunction,NULL,aStatus);}
+
+
+
+	
+/**
+Sends a message to the server and waits synchronously for a reply.
+
+An opcode specifies the service required.
+This variant sends no message arguments to the server.
+
+@param aFunction	The opcode specifying the requested service.
+
+@return				KErrNone if successful, otherwise one of the system-wide error codes. 
+*/
+inline TInt RSubSessionBase::SendReceive(TInt aFunction) const
+	{return DoSendReceive(aFunction,NULL);}
+
+
+
+
+// Class RRefBase
+
+/**
+Default constructor.
+*/
+inline RRefBase::RRefBase()
+	: iPtr(NULL)
+	{}
+
+
+
+/**
+Copy constructor.
+
+@param aRef A reference to the object to be copied.
+*/
+inline RRefBase::RRefBase(const RRefBase &aRef)
+	{Copy(aRef);}
+
+
+
+
+// Class RRef
+
+
+/**
+Default constructor.
+*/
+template <class T>
+inline RRef<T>::RRef()
+	{}
+
+
+
+/**
+Copy constructor.
+
+The constructor frees any existing contained object, and takes ownership of
+the object owned by anObject. 
+
+@param anObject A reference to another 'reference' object.
+                On return from this constructor, anObject may be safely
+                orphaned if it lives on the program stack.
+*/
+template <class T>
+inline RRef<T>::RRef(const RRef<T> &anObject)
+	{Copy(anObject);}
+
+
+
+
+/**
+Assignment operator.
+
+The constructor frees any existing contained object, and takes ownership of
+the object owned by anObject. 
+
+@param anObject A reference to another 'reference' object.
+                On return from this constructor, anObject may be safely
+                orphaned if it lives on the program stack.
+*/
+template <class T>
+inline void RRef<T>::operator=(const RRef<T> &anObject)
+	{Copy(anObject);}
+
+
+
+
+/**
+Gets a pointer to the contained object.
+
+@return A pointer to the contained object
+*/
+template <class T>
+inline T *RRef<T>::operator->()
+	{return((T *)iPtr);}
+
+
+
+
+/**
+Gets a pointer to the contained object.
+
+@return A pointer to the contained object
+*/
+template <class T>
+inline RRef<T>::operator T*()
+	{return((T *)iPtr);}
+
+
+
+
+/**
+Creates a copy of the specified object, which is to be contained by
+this reference object.
+
+The amount of memory set aside to contain the object is defined by the size
+of the object
+
+@param anObject The object to be packaged up by this reference object.
+*/
+template <class T>
+void RRef<T>::Alloc(const T &anObject)
+	{DoAlloc(&anObject,sizeof(T));}
+
+
+
+
+/**
+Creates a copy of the specified object, which is to be contained by
+this reference object.
+
+The amount of memory set aside to contain the object is defined by aSize.
+
+@param anObject The object to be packaged up by this reference object.
+@param aSize    The amount of memory to be set aside to contain the object.
+                You must make sure that this is big enough.
+*/
+template <class T>
+void RRef<T>::Alloc(const T &anObject,TInt aSize)
+	{DoAlloc(&anObject,aSize);}
+
+
+
+
+/**
+Creates a copy of the specified object, which is to be contained by
+this reference object, and leaves on failure.
+
+The amount of memory set aside to contain the object is defined by the size
+of the object
+
+@param anObject The object to be packaged up by this reference object.
+*/
+template <class T>
+void RRef<T>::AllocL(const T &anObject)
+	{DoAllocL(&anObject,sizeof(T));}
+
+
+
+
+/**
+Creates a copy of the specified object, which is to be contained by
+this reference object, and leaves on failure.
+
+The amount of memory set aside to contain the object is defined by aSize.
+
+@param anObject The object to be packaged up by this reference object.
+@param aSize    The amount of memory to be set aside to contain the object.
+                You must make sure that this is big enough.
+*/
+template <class T>
+void RRef<T>::AllocL(const T &anObject,TInt aSize)
+	{DoAllocL(&anObject,aSize);}
+
+
+
+
+// Class TRegion
+inline TBool TRegion::CheckError() const
+/** 
+Tests whether the region's error flag is set.
+
+The error flag may be set:
+
+1. when an attempt to allocate more memory for the region fails
+
+2. if an attempt is made to expand a fixed size region beyond its allocated
+   size
+
+3. if ForceError() has been called.
+
+Use Clear() to unset the error flag, clear the region and free all allocated 
+memory.
+
+@return True, if the error flag is set; false, otherwise. 
+
+@see TRegion::ForceError
+@see TRegion::Clear
+*/
+	{return(iError);}
+
+
+
+
+inline TInt TRegion::Count() const
+/**
+Gets the number of rectangles in this region.
+
+@return The number of rectangles.
+*/
+	{return(iCount);}
+
+
+
+
+inline const TRect *TRegion::RectangleList() const
+/**
+Gets a pointer to the array of rectangles defining this region.
+
+@return Pointer to the array of rectangles. Note that array is a standard 
+        C++ array, i.e. a concatenated set of TRect objects. Use Count() to
+		get the number of rectangles.
+
+@see TRegion::Count
+*/
+	{return(((TRegion *)this)->RectangleListW());}
+
+
+
+
+inline TRegion::TRegion()
+	{}
+
+
+
+
+// Class RRegion
+inline TInt RRegion::CheckSpare() const
+/**
+Gets the number of free memory slots in the region.
+
+This is the number of slots which have been allocated, minus the number in 
+use.
+
+@return The number of free memory slots in the region.
+*/
+	{return(iAllocedRects-iCount);}
+
+
+
+
+// Class TRegionFix
+template <TInt S>
+inline TRegionFix<S>::TRegionFix() : TRegion(-S)
+/**
+Constructs a default fixed size region.
+*/
+	{}
+
+
+
+
+template <TInt S>
+inline TRegionFix<S>::TRegionFix(const TRect &aRect) : TRegion(-S)
+/**
+Constructs a fixed size region with a TRect.
+
+@param aRect Rectangle to be added to the newly constructed region.
+*/
+	{AddRect(aRect);}
+
+
+
+
+template <TInt S>
+inline TRegionFix<S>::TRegionFix(const TRegionFix<S> &aRegion)
+/**
+Copy constructor.
+
+@param aRegion The TRegionFix object to be copied.
+*/
+	{*this=aRegion;}
+
+
+
+
+template <TInt S>
+inline RRegionBuf<S>::RRegionBuf() : RRegion(-S&(~ERRegionBuf),S)
+/**
+Constructs a default object.
+
+The granularity is the value of the template parameter.
+*/
+	{}
+
+
+
+template <TInt S>
+inline RRegionBuf<S>::RRegionBuf(const RRegion &aRegion) 
+/**
+Constructs this object from the specified RRegion.
+
+@param aRegion The region to assign to this RRegionBuf.
+*/
+	{*this=aRegion;}
+
+
+
+
+template <TInt S>
+inline RRegionBuf<S>::RRegionBuf(const TRect &aRect) : RRegion(-S&(~ERRegionBuf),S)
+/**
+Constructs an RRegionBuf with a TRect.
+
+Its granularity is initialised to the value contained in the template argument.
+The resulting region consists of the specified single rectangle.
+
+@param aRect The single rectangle with which to initialise the region.
+*/
+	{AddRect(aRect);}
+
+
+
+
+template <TInt S>
+inline RRegionBuf<S>::RRegionBuf(const RRegionBuf<S> &aRegion)
+/**
+Copy constructs from an existing RRegionBuf object.
+
+@param aRegion The RRegionBuf to be copied.
+*/
+    {*this=aRegion;}
+
+
+
+
+// enum TTimerLockSpec
+inline TTimerLockSpec &operator++(TTimerLockSpec &aLock)
+	{
+	return aLock=((aLock==ETwelveOClock) ? EOneOClock : (TTimerLockSpec)((TInt)aLock+1));
+	}
+inline TTimerLockSpec operator++(TTimerLockSpec &aLock, TInt)
+	{
+	TTimerLockSpec l=aLock;
+	aLock=((aLock==ETwelveOClock) ? EOneOClock : (TTimerLockSpec)((TInt)aLock+1));
+	return l;
+	}
+
+
+
+
+// Class TCheckedUid
+inline const TUidType& TCheckedUid::UidType() const
+/**
+Gets the Uid type contained in this object.
+
+@return The Uid type.
+*/
+    {return(iType);}
+
+
+
+
+// Array deletion support, uses CBase deletion (virtual d'tor) for all C-classes
+template <class T>
+/**	@internalComponent
+*/
+void _DeleteArray(T** aBegin,T** aEnd)
+	{for (;;) if (aBegin<aEnd) delete *aBegin++; else return;}
+
+template <class T>
+/**	@internalComponent
+*/
+struct _ArrayUtil
+	{
+	static inline void Delete(T* aBegin,T* aEnd,CBase*)
+		{::_DeleteArray((CBase**)aBegin,(CBase**)aEnd);}
+	static inline void Delete(T* aBegin,T* aEnd,TAny*)
+		{::_DeleteArray(aBegin,aEnd);}
+	static inline void Delete(T* aArray,TInt aCount)
+		{Delete(aArray,aArray+aCount,*aArray);}
+	};
+
+
+
+
+#ifndef __TOOLS__
+// Template class TFixedArray
+IMPORT_C void PanicTFixedArray();
+
+
+
+
+template <class T,TInt S>
+inline TFixedArray<T,S>::TFixedArray()
+/**
+Default constructor.
+
+Constructs an uninitialised C++ array.
+*/
+	{}
+
+
+
+
+template <class T,TInt S>
+inline void TFixedArray<T,S>::Copy(const T* aList,TInt aLength)
+/**
+Copies the specified set of contiguous objects into the C++ array.
+
+The copy operation starts at the beginning of the array, replacing
+any existing data.
+
+@param aList   A pointer to a set of contiguous objects. 
+@param aLength The number of contiguous objects to be copied. This value must
+               not be negative and must not be greater than the size of the
+			   array as defined by the integer template parameter.
+
+@panic USER 133, in a debug build only, if aLength is negative or is greater
+       than the size of the array as defined by the integer template parameter.
+*/
+	{__ASSERT_DEBUG(TUint(aLength)<=TUint(S),PanicTFixedArray());Mem::Copy(iRep,aList,aLength*sizeof(T));}
+
+
+
+
+template <class T,TInt S>
+inline TFixedArray<T,S>::TFixedArray(const T* aList,TInt aLength)
+/**
+Constructs a C++ array initialised with the specified objects.
+
+@param aList   A pointer to a set of contiguous objects. 
+@param aLength The number of contiguous objects to be copied. This value must
+               not be negative and must not be greater than the size of the
+			   array as defined by the integer template parameter.
+
+@panic USER 133, in a debug build only, if aLength is negative or is greater
+       than the size of the array as defined by the integer template parameter.
+*/
+	{Copy(aList,aLength);}
+
+
+
+
+template <class T,TInt S>
+inline void TFixedArray<T,S>::Reset()
+/**
+Fills every element of the array with binary zeroes.
+*/
+	{Mem::FillZ(iRep,sizeof(iRep));}
+
+
+
+
+template <class T,TInt S>
+inline TInt TFixedArray<T,S>::Count() const
+/**
+Gets the size of the array.
+
+For any instance of this class, the array size 
+is fixed and has the same value as the integer template parameter.
+
+@return The size of the array.
+*/
+	{return S;}
+
+
+
+
+template <class T,TInt S>
+inline TInt TFixedArray<T,S>::Length() const
+/**
+Gets the size of an array element, in bytes.
+
+@return The size of an array element, in bytes.
+*/
+	{return sizeof(T);}
+
+
+
+
+template <class T,TInt S>
+inline TBool TFixedArray<T,S>::InRange(TInt aIndex)
+	{return TUint(aIndex)<S;}
+
+
+
+
+template <class T,TInt S>
+inline T& TFixedArray<T,S>::operator[](TInt aIndex)
+/**
+Gets a reference to the specified element within the C++ array.
+
+@param aIndex The position of the element within the array. This is an offset value; 
+              a zero value refers to the first element in the array. This value must be 
+              greater than or equal to zero and less than the size of the array.
+
+@return A reference to an element of the array.
+
+@panic USER 133, in a debug build only, if aIndex is negative or greater than or equal to the size
+       of the array as defined by the integer template parameter.
+*/
+	{__ASSERT_DEBUG(InRange(aIndex),PanicTFixedArray());return iRep[aIndex];}
+
+
+
+
+template <class T,TInt S>
+inline const T& TFixedArray<T,S>::operator[](TInt aIndex) const
+/**
+Gets a const reference to the specified element within the C++ array.
+
+@param aIndex The position of the element within the array. This is an offset value; 
+              a zero value refers to the first element in the array. This value must be 
+              greater than or equal to zero and less than the size of the array.
+
+@return A const reference to an element of the array; the element cannot be 
+        changed through this reference.
+
+@panic USER 133, in a debug build only, if aIndex is negative or greater than or equal to the size
+       of the array as defined by the integer template parameter.
+*/
+	{return CONST_CAST(ThisClass&,*this)[aIndex];}
+
+
+
+
+template <class T,TInt S>
+inline T& TFixedArray<T,S>::At(TInt aIndex)
+/**
+Gets a reference to the specified element within the C++ array.
+
+@param aIndex The position of the element within the array. This is an offset value; 
+              a zero value refers to the first element in the array. This value must be 
+              greater than or equal to zero and less than the size of the array.
+
+@return A reference to an element of the array.
+
+@panic USER 133, if aIndex is negative or greater than or equal to the size
+       of the array as defined by the integer template parameter.
+*/
+	{__ASSERT_ALWAYS(InRange(aIndex),PanicTFixedArray());return iRep[aIndex];}
+
+
+
+
+template <class T,TInt S>
+inline const T& TFixedArray<T,S>::At(TInt aIndex) const
+/**
+Gets a const reference to the specified element within the C++ array.
+
+@param aIndex The position of the element within the array. This is an offset value; 
+              a zero value refers to the first element in the array. This value must be 
+              greater than or equal to zero and less than the size of the array.
+
+@return A const reference to an element of the array; the element cannot be 
+        changed through this reference.
+
+@panic USER 133, in a debug build only, if aIndex is negative or greater than or equal to the size
+       of the array as defined by the integer template parameter.
+*/
+	{return CONST_CAST(ThisClass&,*this).At(aIndex);}
+
+
+
+
+template <class T,TInt S>
+inline T* TFixedArray<T,S>::Begin()
+/**
+Gets a pointer to the first element of the array.
+
+@return A pointer to the first element of the array.
+*/
+	{return &iRep[0];}
+
+
+
+
+template <class T,TInt S>
+inline T* TFixedArray<T,S>::End()
+/**
+Gets a pointer to the first byte following the end of the array.
+
+@return A pointer to the first byte following the end of the array.
+*/
+	{return &iRep[S];}
+
+
+
+
+template <class T,TInt S>
+inline const T* TFixedArray<T,S>::Begin() const
+/**
+Gets a pointer to the first element of the array.
+
+@return A pointer to a const element of the array. 
+*/
+	{return &iRep[0];}
+
+
+
+
+template <class T,TInt S>
+inline const T* TFixedArray<T,S>::End() const
+/**
+Gets a pointer to the first byte following the end of the array.
+
+@return A pointer to the const first byte following the end of the array.
+*/
+	{return &iRep[S];}
+
+
+
+
+template <class T,TInt S>
+inline TInt TFixedArray<T,S>::CountFunctionR(const CBase*)
+	{return S;}
+
+
+
+
+template <class T,TInt S>
+inline const TAny* TFixedArray<T,S>::AtFunctionR(const CBase* aThis,TInt aIndex)
+	{return &REINTERPRET_CAST(const ThisClass&,*aThis)[aIndex];}
+
+
+
+
+template <class T,TInt S>
+inline TArray<T> TFixedArray<T,S>::Array() const
+/**
+Creates and returns a generic array for this C++ array.
+
+@return A generic array for this C++ array.
+*/
+	{return TArray<T>(CountFunctionR,AtFunctionR,REINTERPRET_CAST(const CBase*,this));}
+
+
+
+
+template <class T,TInt S>
+inline void TFixedArray<T,S>::DeleteAll()
+/**
+Invokes the delete operator on every member of the array.
+
+The function can only be used for arrays of pointers to CBase derived objects.
+
+If the array is to be used after a call to this function, it is good practice 
+to call TFixedArray<class T,TInt S>::Reset() to set all array elements to 
+NULL.
+*/
+	{_ArrayUtil<T>::Delete(iRep,S);}
+#endif
+
+
+
+
+// class User
+
+inline RHeap* User::SwitchHeap(RAllocator* aHeap)
+/**
+Changes the current thread's heap.
+	
+@param aHeap A pointer to the new heap handle.
+
+@return A pointer to the old heap handle.
+*/
+	{ return (RHeap*)SwitchAllocator(aHeap); }
+
+
+
+
+inline RHeap& User::Heap()
+/**
+Gets a reference to the handle to the current thread's heap.
+	
+@return A reference to the handle to the current thread's heap.
+*/
+	{ return (RHeap&)Allocator(); }
+
+
+
+
+#ifndef __REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__
+
+inline TBool User::CreatorHasCapability(TCapability aCapability, const char* aDiagnostic)
+	{
+	return DoCreatorHasCapability(aCapability, aDiagnostic);
+	}
+
+inline TBool User::CreatorHasCapability(TCapability aCapability1, TCapability aCapability2, const char* aDiagnostic)
+	{
+	return DoCreatorHasCapability(aCapability1, aCapability2, aDiagnostic);
+	}
+
+#else //__REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__
+
+// Only available to NULL arguments
+inline TBool User::CreatorHasCapability(TCapability aCapability, OnlyCreateWithNull /*aDiagnostic*/)
+	{
+	return DoCreatorHasCapability(aCapability);
+	}
+
+inline TBool User::CreatorHasCapability(TCapability aCapability1, TCapability aCapability2, OnlyCreateWithNull /*aDiagnostic*/)
+	{
+	return DoCreatorHasCapability(aCapability1, aCapability2);
+	}
+
+#ifndef __REMOVE_PLATSEC_DIAGNOSTICS__
+// For things using KSuppressPlatSecDiagnostic
+inline TBool User::CreatorHasCapability(TCapability aCapability, OnlyCreateWithNull /*aDiagnostic*/, OnlyCreateWithNull /*aSuppress*/)
+	{
+	return DoCreatorHasCapability(aCapability, KSuppressPlatSecDiagnosticMagicValue);
+	}
+
+inline TBool User::CreatorHasCapability(TCapability aCapability1, TCapability aCapability2, OnlyCreateWithNull /*aDiagnostic*/, OnlyCreateWithNull /*aSuppress*/)
+	{
+	return DoCreatorHasCapability(aCapability1, aCapability2, KSuppressPlatSecDiagnosticMagicValue);
+	}
+
+#endif // !__REMOVE_PLATSEC_DIAGNOSTICS__
+
+#endif // !__REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__
+
+/** Sets this TSecurityInfo to the security attributes of this process. */
+inline void TSecurityInfo::SetToCurrentInfo()
+	{ new (this) TSecurityInfo(RProcess()); }
+
+/** Constructs a TSecurityInfo using the security attributes of aProcess */
+inline void TSecurityInfo::Set(RProcess aProcess)
+	{ new (this) TSecurityInfo(aProcess); }
+
+/** Constructs a TSecurityInfo using the security attributes of the process
+owning aThread 
+*/
+inline void TSecurityInfo::Set(RThread aThread)
+	{ new (this) TSecurityInfo(aThread); }
+
+/** Constructs a TSecurityInfo using the security attributes of the process
+which sent the message aMsgPtr */
+inline void TSecurityInfo::Set(RMessagePtr2 aMsgPtr)
+	{ new (this) TSecurityInfo(aMsgPtr); }
+
+#ifndef __REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__
+
+/** Checks this policy against the platform security attributes of aProcess.
+
+	When a check fails the action taken is determined by the system wide Platform Security
+	configuration. If PlatSecDiagnostics is ON, then a diagnostic message is emitted.
+	If PlatSecEnforcement is OFF, then this function will return ETrue even though the
+	check failed.
+
+@param aProcess The RProcess object to check against this TSecurityPolicy.
+@param aDiagnostic A string that will be emitted along with any diagnostic message
+							that may be issued if the policy check fails.
+							This string must be enclosed in the __PLATSEC_DIAGNOSTIC_STRING macro
+							which enables it to be easily removed from the system.
+@return ETrue if all the requirements of this TSecurityPolicy are met by the
+platform security attributes of aProcess, EFalse otherwise.
+@panic USER 190 if 'this' is an invalid SSecurityInfo object
+*/
+inline TBool TSecurityPolicy::CheckPolicy(RProcess aProcess, const char* aDiagnostic) const
+	{
+	return DoCheckPolicy(aProcess, aDiagnostic);
+	}
+
+/** Checks this policy against the platform security attributes of the process
+owning aThread.
+
+	When a check fails the action taken is determined by the system wide Platform Security
+	configuration. If PlatSecDiagnostics is ON, then a diagnostic message is emitted.
+	If PlatSecEnforcement is OFF, then this function will return ETrue even though the
+	check failed.
+
+@param aThread The thread whose owning process' platform security attributes
+are to be checked against this TSecurityPolicy.
+@param aDiagnostic A string that will be emitted along with any diagnostic message
+							that may be issued if the policy check fails.
+							This string must be enclosed in the __PLATSEC_DIAGNOSTIC_STRING macro
+							which enables it to be easily removed from the system.
+@return ETrue if all the requirements of this TSecurityPolicy are met by the
+platform security parameters of the owning process of aThread, EFalse otherwise.
+@panic USER 190 if 'this' is an invalid SSecurityInfo object
+*/
+inline TBool TSecurityPolicy::CheckPolicy(RThread aThread, const char* aDiagnostic) const
+	{
+	return DoCheckPolicy(aThread, aDiagnostic);
+	}
+
+/** Checks this policy against the platform security attributes of the process which sent
+the given message.
+
+	When a check fails the action taken is determined by the system wide Platform Security
+	configuration. If PlatSecDiagnostics is ON, then a diagnostic message is emitted.
+	If PlatSecEnforcement is OFF, then this function will return ETrue even though the
+	check failed.
+
+@param aMsgPtr The RMessagePtr2 object to check against this TSecurityPolicy.
+@param aDiagnostic A string that will be emitted along with any diagnostic message
+							that may be issued if the policy check fails.
+							This string must be enclosed in the __PLATSEC_DIAGNOSTIC_STRING macro
+							which enables it to be easily removed from the system.
+@return ETrue if all the requirements of this TSecurityPolicy are met by the
+platform security attributes of aMsg, EFalse otherwise.
+@panic USER 190 if 'this' is an invalid SSecurityInfo object
+*/
+inline TBool TSecurityPolicy::CheckPolicy(RMessagePtr2 aMsgPtr, const char* aDiagnostic) const
+	{
+	return DoCheckPolicy(aMsgPtr, aDiagnostic);
+	}
+
+/** Checks this policy against the platform security attributes of the process which sent
+the given message.
+
+	When a check fails the action taken is determined by the system wide Platform Security
+	configuration. If PlatSecDiagnostics is ON, then a diagnostic message is emitted.
+	If PlatSecEnforcement is OFF, then this function will return ETrue even though the
+	check failed.
+
+@param aMsgPtr The RMessagePtr2 object to check against this TSecurityPolicy.
+@param aMissing A TSecurityInfo object which this method fills with any capabilities or IDs
+				it finds to be missing. 
+@param aDiagnostic A string that will be emitted along with any diagnostic message
+							that may be issued if the policy check fails.
+							This string must be enclosed in the __PLATSEC_DIAGNOSTIC_STRING macro
+							which enables it to be easily removed from the system.
+@return ETrue if all the requirements of this TSecurityPolicy are met by the
+platform security attributes of aMsg, EFalse otherwise.
+@panic USER 190 if 'this' is an invalid SSecurityInfo object
+
+@internalComponent
+*/
+inline TBool TSecurityPolicy::CheckPolicy(RMessagePtr2 aMsgPtr, TSecurityInfo& aMissing, const char* aDiagnostic) const
+	{
+	return DoCheckPolicy(aMsgPtr, aMissing, aDiagnostic);
+	}
+
+/** Checks this policy against the platform security attributes of this process' creator.
+
+	When a check fails the action taken is determined by the system wide Platform Security
+	configuration. If PlatSecDiagnostics is ON, then a diagnostic message is emitted.
+	If PlatSecEnforcement is OFF, then this function will return ETrue even though the
+	check failed.
+
+@param aDiagnostic A string that will be emitted along with any diagnostic message
+							that may be issued if the policy check fails.
+							This string must be enclosed in the __PLATSEC_DIAGNOSTIC_STRING macro
+							which enables it to be easily removed from the system.
+@return ETrue if all the requirements of this TSecurityPolicy are met by the
+platform security attributes of this process' creator, EFalse otherwise.
+@panic USER 190 if 'this' is an invalid SSecurityInfo object
+*/
+inline TBool TSecurityPolicy::CheckPolicyCreator(const char* aDiagnostic) const
+	{
+	return DoCheckPolicyCreator(aDiagnostic);
+	}
+
+/**
+@see TSecurityPolicy::CheckPolicy(RProcess aProcess, const char* aDiagnostic)
+*/
+inline TBool TStaticSecurityPolicy::CheckPolicy(RProcess aProcess, const char* aDiagnostic) const
+	{
+	return (&(*this))->CheckPolicy(aProcess, aDiagnostic);
+	}
+
+/**
+@see TSecurityPolicy::CheckPolicy(RThread aThread, const char* aDiagnostic)
+*/
+inline TBool TStaticSecurityPolicy::CheckPolicy(RThread aThread, const char* aDiagnostic) const
+	{
+	return (&(*this))->CheckPolicy(aThread, aDiagnostic);
+	}
+
+/**
+@see TSecurityPolicy::CheckPolicy(RMessagePtr2 aMsgPtr, const char* aDiagnostic)
+*/
+inline TBool TStaticSecurityPolicy::CheckPolicy(RMessagePtr2 aMsgPtr, const char* aDiagnostic) const
+	{
+	return (&(*this))->CheckPolicy(aMsgPtr, aDiagnostic);
+	}
+
+/**
+@see TSecurityPolicy::CheckPolicy(RMessagePtr2 aMsgPtr, TSecurityInfo& aMissing, const char* aDiagnostic)
+@internalComponent
+*/
+inline TBool TStaticSecurityPolicy::CheckPolicy(RMessagePtr2 aMsgPtr, TSecurityInfo& aMissing, const char* aDiagnostic) const
+	{
+	return (&(*this))->CheckPolicy(aMsgPtr, aMissing, aDiagnostic);
+	}
+
+/**
+@see TSecurityPolicy::CheckPolicyCreator(const char* aDiagnostic)
+*/
+inline TBool TStaticSecurityPolicy::CheckPolicyCreator(const char* aDiagnostic) const
+	{
+	return (&(*this))->CheckPolicyCreator(aDiagnostic);
+	}
+
+#else //__REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__
+
+/** Checks this policy against the platform security attributes of aProcess.
+
+	When a check fails the action taken is determined by the system wide Platform Security
+	configuration. If PlatSecDiagnostics is ON, then a diagnostic message is emitted.
+	If PlatSecEnforcement is OFF, then this function will return ETrue even though the
+	check failed.
+
+@param aProcess The RProcess object to check against this TSecurityPolicy.
+@param aDiagnostic A string that will be emitted along with any diagnostic message
+							that may be issued if the policy check fails.
+							This string must be enclosed in the __PLATSEC_DIAGNOSTIC_STRING macro
+							which enables it to be easily removed from the system.
+@return ETrue if all the requirements of this TSecurityPolicy are met by the
+platform security attributes of aProcess, EFalse otherwise.
+@panic USER 190 if 'this' is an invalid SSecurityInfo object
+*/
+inline TBool TSecurityPolicy::CheckPolicy(RProcess aProcess, OnlyCreateWithNull /*aDiagnostic*/) const
+	{
+	return DoCheckPolicy(aProcess);
+	}
+
+/** Checks this policy against the platform security attributes of the process
+owning aThread.
+
+	When a check fails the action taken is determined by the system wide Platform Security
+	configuration. If PlatSecDiagnostics is ON, then a diagnostic message is emitted.
+	If PlatSecEnforcement is OFF, then this function will return ETrue even though the
+	check failed.
+
+@param aThread The thread whose owning process' platform security attributes
+are to be checked against this TSecurityPolicy.
+@param aDiagnostic A string that will be emitted along with any diagnostic message
+							that may be issued if the policy check fails.
+							This string must be enclosed in the __PLATSEC_DIAGNOSTIC_STRING macro
+							which enables it to be easily removed from the system.
+@return ETrue if all the requirements of this TSecurityPolicy are met by the
+platform security parameters of the owning process of aThread, EFalse otherwise.
+@panic USER 190 if 'this' is an invalid SSecurityInfo object
+*/
+inline TBool TSecurityPolicy::CheckPolicy(RThread aThread, OnlyCreateWithNull /*aDiagnostic*/) const
+	{
+	return DoCheckPolicy(aThread);
+	}
+
+/** Checks this policy against the platform security attributes of the process which sent
+the given message.
+
+	When a check fails the action taken is determined by the system wide Platform Security
+	configuration. If PlatSecDiagnostics is ON, then a diagnostic message is emitted.
+	If PlatSecEnforcement is OFF, then this function will return ETrue even though the
+	check failed.
+
+@param aMsgPtr The RMessagePtr2 object to check against this TSecurityPolicy.
+@param aDiagnostic A string that will be emitted along with any diagnostic message
+							that may be issued if the policy check fails.
+							This string must be enclosed in the __PLATSEC_DIAGNOSTIC_STRING macro
+							which enables it to be easily removed from the system.
+@return ETrue if all the requirements of this TSecurityPolicy are met by the
+platform security attributes of aMsg, EFalse otherwise.
+@panic USER 190 if 'this' is an invalid SSecurityInfo object
+*/
+inline TBool TSecurityPolicy::CheckPolicy(RMessagePtr2 aMsgPtr, OnlyCreateWithNull /*aDiagnostic*/) const
+	{
+	return DoCheckPolicy(aMsgPtr);
+	}
+
+/** Checks this policy against the platform security attributes of the process which sent
+the given message.
+
+	When a check fails the action taken is determined by the system wide Platform Security
+	configuration. If PlatSecDiagnostics is ON, then a diagnostic message is emitted.
+	If PlatSecEnforcement is OFF, then this function will return ETrue even though the
+	check failed.
+
+@param aMsgPtr The RMessagePtr2 object to check against this TSecurityPolicy.
+@param aMissing A TSecurityInfo object which this method fills with any capabilities or IDs
+				it finds to be missing. 
+@param aDiagnostic A string that will be emitted along with any diagnostic message
+							that may be issued if the policy check fails.
+							This string must be enclosed in the __PLATSEC_DIAGNOSTIC_STRING macro
+							which enables it to be easily removed from the system.
+@return ETrue if all the requirements of this TSecurityPolicy are met by the
+platform security attributes of aMsg, EFalse otherwise.
+@panic USER 190 if 'this' is an invalid SSecurityInfo object
+
+@internalComponent
+*/
+inline TBool TSecurityPolicy::CheckPolicy(RMessagePtr2 aMsgPtr, TSecurityInfo& aMissing, OnlyCreateWithNull /*aDiagnostic*/) const
+	{
+	return DoCheckPolicy(aMsgPtr, aMissing);
+	}
+
+/** Checks this policy against the platform security attributes of this process' creator.
+
+	When a check fails the action taken is determined by the system wide Platform Security
+	configuration. If PlatSecDiagnostics is ON, then a diagnostic message is emitted.
+	If PlatSecEnforcement is OFF, then this function will return ETrue even though the
+	check failed.
+
+@param aDiagnostic A string that will be emitted along with any diagnostic message
+							that may be issued if the policy check fails.
+							This string must be enclosed in the __PLATSEC_DIAGNOSTIC_STRING macro
+							which enables it to be easily removed from the system.
+@return ETrue if all the requirements of this TSecurityPolicy are met by the
+platform security attributes of this process' creator, EFalse otherwise.
+@panic USER 190 if 'this' is an invalid SSecurityInfo object
+*/
+inline TBool TSecurityPolicy::CheckPolicyCreator(OnlyCreateWithNull /*aDiagnostic*/) const
+	{
+	return DoCheckPolicyCreator();
+	}
+
+#ifndef __REMOVE_PLATSEC_DIAGNOSTICS__
+inline TBool TSecurityPolicy::CheckPolicy(RProcess aProcess, OnlyCreateWithNull /*aDiagnostic*/, OnlyCreateWithNull /*aSuppress*/) const
+	{
+	return DoCheckPolicy(aProcess, KSuppressPlatSecDiagnosticMagicValue);
+	}
+
+inline TBool TSecurityPolicy::CheckPolicy(RThread aThread, OnlyCreateWithNull /*aDiagnostic*/, OnlyCreateWithNull /*aSuppress*/) const
+	{
+	return DoCheckPolicy(aThread, KSuppressPlatSecDiagnosticMagicValue);
+	}
+
+inline TBool TSecurityPolicy::CheckPolicy(RMessagePtr2 aMsgPtr, OnlyCreateWithNull /*aDiagnostic*/, OnlyCreateWithNull /*aSuppress*/) const
+	{
+	return DoCheckPolicy(aMsgPtr, KSuppressPlatSecDiagnosticMagicValue);
+	}
+
+inline TBool TSecurityPolicy::CheckPolicy(RMessagePtr2 aMsgPtr, TSecurityInfo& aMissing, OnlyCreateWithNull /*aDiagnostic*/, OnlyCreateWithNull /*aSuppress*/) const
+	{
+	return DoCheckPolicy(aMsgPtr, aMissing, KSuppressPlatSecDiagnosticMagicValue);
+	}
+
+inline TBool TSecurityPolicy::CheckPolicyCreator(OnlyCreateWithNull /*aDiagnostic*/, OnlyCreateWithNull /*aSuppress*/) const
+	{
+	return DoCheckPolicyCreator(KSuppressPlatSecDiagnosticMagicValue);
+	}
+#endif // !__REMOVE_PLATSEC_DIAGNOSTICS__
+
+/**
+@see TSecurityPolicy::CheckPolicy(RProcess aProcess, const char* aDiagnostic)
+*/
+inline TBool TStaticSecurityPolicy::CheckPolicy(RProcess aProcess, OnlyCreateWithNull /*aDiagnostic*/) const
+	{
+	return (&(*this))->CheckPolicy(aProcess);
+	}
+
+/**
+@see TSecurityPolicy::CheckPolicy(RThread aThread, const char* aDiagnostic)
+*/
+inline TBool TStaticSecurityPolicy::CheckPolicy(RThread aThread, OnlyCreateWithNull /*aDiagnostic*/) const
+	{
+	return (&(*this))->CheckPolicy(aThread);
+	}
+
+/**
+@see TSecurityPolicy::CheckPolicy(RMessagePtr2 aMsgPtr, const char* aDiagnostic)
+*/
+inline TBool TStaticSecurityPolicy::CheckPolicy(RMessagePtr2 aMsgPtr, OnlyCreateWithNull /*aDiagnostic*/) const
+	{
+	return (&(*this))->CheckPolicy(aMsgPtr);
+	}
+
+/**
+@see TSecurityPolicy::CheckPolicy(RMessagePtr2 aMsgPtr, TSecurityInfo& aMissing, const char* aDiagnostic)
+@internalComponent
+*/
+inline TBool TStaticSecurityPolicy::CheckPolicy(RMessagePtr2 aMsgPtr, TSecurityInfo& aMissing, OnlyCreateWithNull /*aDiagnostic*/) const
+	{
+	return (&(*this))->CheckPolicy(aMsgPtr, aMissing);
+	}
+
+/**
+@see TSecurityPolicy::CheckPolicyCreator(const char* aDiagnostic)
+*/
+inline TBool TStaticSecurityPolicy::CheckPolicyCreator(OnlyCreateWithNull /*aDiagnostic*/) const
+	{
+	return (&(*this))->CheckPolicyCreator();
+	}
+
+#ifndef __REMOVE_PLATSEC_DIAGNOSTICS__
+/**
+@see TSecurityPolicy::CheckPolicy(RProcess aProcess, const char* aDiagnostic)
+*/
+inline TBool TStaticSecurityPolicy::CheckPolicy(RProcess aProcess, OnlyCreateWithNull /*aDiagnostic*/, OnlyCreateWithNull /*aSuppress*/) const
+	{
+	return (&(*this))->CheckPolicy(aProcess, KSuppressPlatSecDiagnostic);
+	}
+
+/**
+@see TSecurityPolicy::CheckPolicy(RThread aThread, const char* aDiagnostic)
+*/
+inline TBool TStaticSecurityPolicy::CheckPolicy(RThread aThread, OnlyCreateWithNull /*aDiagnostic*/, OnlyCreateWithNull /*aSuppress*/) const
+	{
+	return (&(*this))->CheckPolicy(aThread, KSuppressPlatSecDiagnostic);
+	}
+
+/**
+@see TSecurityPolicy::CheckPolicy(RMessagePtr2 aMsgPtr, const char* aDiagnostic)
+*/
+inline TBool TStaticSecurityPolicy::CheckPolicy(RMessagePtr2 aMsgPtr, OnlyCreateWithNull /*aDiagnostic*/, OnlyCreateWithNull /*aSuppress*/) const
+	{
+	return (&(*this))->CheckPolicy(aMsgPtr, KSuppressPlatSecDiagnostic);
+	}
+
+/**
+@see TSecurityPolicy::CheckPolicy(RMessagePtr2 aMsgPtr, TSecurityInfo& aMissing, const char* aDiagnostic)
+@internalComponent
+*/
+inline TBool TStaticSecurityPolicy::CheckPolicy(RMessagePtr2 aMsgPtr, TSecurityInfo& aMissing, OnlyCreateWithNull /*aDiagnostic*/, OnlyCreateWithNull /*aSuppress*/) const
+	{
+	return (&(*this))->CheckPolicy(aMsgPtr, aMissing, KSuppressPlatSecDiagnostic);
+	}
+
+/**
+@see TSecurityPolicy::CheckPolicyCreator(const char* aDiagnostic)
+*/
+inline TBool TStaticSecurityPolicy::CheckPolicyCreator(OnlyCreateWithNull /*aDiagnostic*/, OnlyCreateWithNull /*aSuppress*/) const
+	{
+	return (&(*this))->CheckPolicyCreator(KSuppressPlatSecDiagnostic);
+	}
+#endif // !__REMOVE_PLATSEC_DIAGNOSTICS__
+
+#endif //__REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__
+
+
+
+#ifndef __KERNEL_MODE__
+
+/**
+Appends an object pointer onto the array.
+
+The function leaves with one of the system wide error codes, if the operation fails.
+
+NOTE: This function is NOT AVAILABLE to code running on the kernel side.
+
+@param anEntry The object pointer to be appended.
+*/
+template <class T>
+inline void RPointerArray<T>::AppendL(const T* anEntry)
+	{ User::LeaveIfError(Append(anEntry));}
+
+
+/**
+Inserts an object pointer into the array at the specified position.
+
+The function leaves with one of the system wide error codes, if
+the operation fails.
+
+NOTE: This function is NOT AVAILABLE to code running on the kernel side.
+
+@param anEntry The object pointer to be inserted.
+@param aPos    The position within the array where the object pointer is to be 
+               inserted. The position is relative to zero, i.e. zero implies
+			   that a pointer is inserted at the beginning of the array.
+
+@panic USER 131, if aPos is negative, or is greater than the number of object
+       pointers currently in the array.
+*/
+template <class T>
+inline void RPointerArray<T>::InsertL(const T* anEntry, TInt aPos)
+	{ User::LeaveIfError(Insert(anEntry,aPos)); }
+
+
+/**
+Finds the first object pointer in the array which matches the specified object 
+pointer, using a sequential search.
+
+Matching is based on the comparison of pointers.
+
+The find operation always starts at the low index end of the array. There 
+is no assumption about the order of objects in the array.
+
+NOTE: This function is NOT AVAILABLE to code running on the kernel side.
+
+@param anEntry The object pointer to be found.
+@return The index of the first matching object pointer within the array.
+@leave KErrNotFound, if no matching object pointer can be found.
+*/
+template <class T>
+inline TInt RPointerArray<T>::FindL(const T* anEntry) const
+	{ return User::LeaveIfError(Find(anEntry));}
+
+
+/**
+Finds the first object pointer in the array whose object matches the specified 
+object, using a sequential search and a matching algorithm.
+
+The algorithm for determining whether two class T objects match is provided 
+by a function supplied by the caller.
+
+The find operation always starts at the low index end of the array. There 
+is no assumption about the order of objects in the array.
+
+NOTE: This function is NOT AVAILABLE to code running on the kernel side.
+
+@param anEntry    The object pointer to be found.
+@param anIdentity A package encapsulating the function which determines whether 
+                  two class T objects match.
+
+@return The index of the first matching object pointer within the array.
+@leave  KErrNotFound, if no suitable object pointer can be found.
+*/
+template <class T>
+inline TInt RPointerArray<T>::FindL(const T* anEntry, TIdentityRelation<T> anIdentity) const
+	{ return User::LeaveIfError(Find(anEntry, anIdentity));}
+
+
+/**
+Finds the last object pointer in the array which matches the specified object 
+pointer, using a sequential search.
+
+Matching is based on the comparison of pointers.
+
+The find operation always starts at the high index end of the array. There 
+is no assumption about the order of objects in the array.
+
+NOTE: This function is NOT AVAILABLE to code running on the kernel side.
+
+@param anEntry The object pointer to be found.
+@return The index of the last matching object pointer within the array.
+@leave KErrNotFound, if no matching object pointer can be found.
+*/
+template <class T>
+inline TInt RPointerArray<T>::FindReverseL(const T* anEntry) const
+	{ return User::LeaveIfError(FindReverse(anEntry));}
+
+
+/**
+Finds the last object pointer in the array whose object matches the specified 
+object, using a sequential search and a matching algorithm.
+
+The algorithm for determining whether two class T objects match is provided 
+by a function supplied by the caller.
+
+The find operation always starts at the high index end of the array. There 
+is no assumption about the order of objects in the array.
+
+NOTE: This function is NOT AVAILABLE to code running on the kernel side.
+
+@param anEntry    The object pointer to be found.
+@param anIdentity A package encapsulating the function which determines whether 
+                  two class T objects match.
+
+@return The index of the last matching object pointer within the array.
+@leave  KErrNotFound, if no suitable object pointer can be found.
+*/
+template <class T>
+inline TInt RPointerArray<T>::FindReverseL(const T* anEntry, TIdentityRelation<T> anIdentity) const
+	{ return User::LeaveIfError(FindReverse(anEntry, anIdentity));}
+
+
+/**
+Finds the object pointer in the array that matches the specified object
+pointer, using a binary search technique.
+
+The function assumes that object pointers in the array are in address order.
+
+NOTE: This function is NOT AVAILABLE to code running on the kernel side.
+
+@param anEntry The object pointer to be found.
+
+@return The index of the matching object pointer within the array
+@leave KErrNotFound, if no suitable object pointer can be found.
+*/
+template <class T>
+inline TInt RPointerArray<T>::FindInAddressOrderL(const T* anEntry) const
+	{ return User::LeaveIfError(FindInAddressOrder(anEntry));}
+
+
+/**
+Finds the object pointer in the array whose object matches the specified
+object, using a binary search technique and an ordering algorithm.
+
+The function assumes that existing object pointers in the array are ordered 
+so that the objects themselves are in object order as determined by an algorithm 
+supplied by the caller and packaged as a TLinearOrder<T>.
+
+NOTE: This function is NOT AVAILABLE to code running on the kernel side.
+
+@param anEntry The object pointer to be found.
+@param anOrder A package encapsulating the function which determines the order 
+               of two class T objects.
+
+@return The index of the matching object pointer within the array.
+
+@leave KErrNotFound, if no suitable object pointer can be found.
+*/
+template <class T>
+inline TInt RPointerArray<T>::FindInOrderL(const T* anEntry, TLinearOrder<T> anOrder) const
+	{ return User::LeaveIfError(FindInOrder(anEntry, anOrder));}
+
+
+/**
+Finds the object pointer in the array that matches the specified object
+pointer, using a binary search technique.
+
+The function assumes that object pointers in the array are in address order.
+
+NOTE: This function is NOT AVAILABLE to code running on the kernel side.
+
+@param anEntry The object pointer to be found.
+@param anIndex A reference to a TInt into which the
+               function puts an index value: If the function does not leave,
+               this is the index of the matching object pointer within the
+               array. If the function leaves with KErrNotFound, this is the
+               index of the first object pointer within the array which
+               logically follows after anEntry.
+
+@leave KErrNotFound, if no suitable object pointer can be found.
+*/
+template <class T>
+inline void RPointerArray<T>::FindInAddressOrderL(const T* anEntry, TInt& anIndex) const
+	{ User::LeaveIfError(FindInAddressOrder(anEntry, anIndex)); }
+
+
+/**
+Finds the object pointer in the array whose object matches the specified
+object, using a binary search technique and an ordering algorithm.
+
+The function assumes that existing object pointers in the array are ordered 
+so that the objects themselves are in object order as determined by an
+algorithm supplied by the caller and packaged as a TLinearOrder<T>.
+
+NOTE: This function is NOT AVAILABLE to code running on the kernel side.
+
+@param anEntry The object pointer to be found.
+@param anIndex A TInt supplied by the caller. On return, contains an
+               index value:
+               If the function does not leave, this is the index of the
+               matching object pointer within the array. 
+               If the function leaves with KErrNotFound, this is the index of
+               the first object pointer in the array whose object is bigger
+               than the entry being searched for - if no objects pointed to in
+               the array are bigger, then the index value is the same as the
+               total number of object pointers in the array.
+
+@param anOrder A package encapsulating the function which determines the order 
+               of two class T objects.
+
+@leave         KErrNotFound, if no suitable object pointer can be found.
+*/
+template <class T>
+inline void RPointerArray<T>::FindInOrderL(const T* anEntry, TInt& anIndex, TLinearOrder<T> anOrder) const
+	{ User::LeaveIfError(FindInOrder(anEntry, anIndex, anOrder)); }
+
+
+/**
+Finds the object pointer in the array that matches the specified object
+pointer, using a binary search technique.
+
+Where there is more than one matching element, it finds the first, the last
+or any matching element as specified by the value of aMode.
+
+The function assumes that object pointers in the array are in address order.
+
+NOTE: This function is NOT AVAILABLE to code running on the kernel side.
+
+@param	anEntry The object pointer to be found.
+@param	aMode   Specifies whether to find the first match, the last match or
+                any match, as defined by one of the TArrayFindMode enum values.
+
+@return If there is a matching element, the array index of a matching element -  what
+        the index refers to depends on the value of aMode:
+        if this is EArrayFindMode_First, then the index refers to the first matching element;
+        if this is EArrayFindMode_Any, then the index can refer to any of the matching elements;
+        if this is EArrayFindMode_Last, then the index refers to first element that follows the
+        last matching element - if the last matching element is also the last element of the array,
+        then the index value is the same as the total number of elements in the array.
+        
+@leave  KErrNotFound if no matching entry exists.
+
+@see TArrayFindMode
+*/
+template <class T>
+inline TInt RPointerArray<T>::SpecificFindInAddressOrderL(const T* anEntry, TInt aMode) const
+	{ return User::LeaveIfError(SpecificFindInAddressOrder(anEntry, aMode));}
+
+
+/**
+Finds the object pointer in the array whose object matches the specified
+object, using a binary search technique and an ordering algorithm.
+
+In the case that there is more than one matching element finds the first, last
+or any match as specified by the value of aMode.
+
+The function assumes that existing object pointers in the array are ordered 
+so that the objects themselves are in object order as determined by an algorithm 
+supplied by the caller and packaged as a TLinearOrder<T> type.
+
+NOTE: This function is NOT AVAILABLE to code running on the kernel side.
+
+@param anEntry The object pointer to be found.
+@param anOrder A package encapsulating the function which determines the order 
+               of two class T objects.
+@param	aMode  Specifies whether to find the first match, the last match or any match,
+               as defined by one of the TArrayFindMode enum values.
+
+@return If there is a matching element, the array index of a matching
+        element -  what the index refers to depends on the value of aMode:
+        if this is EArrayFindMode_First, then the index refers to the first matching element;
+        if this is EArrayFindMode_Any, then the index can refer to any of the matching elements;
+        if this is EArrayFindMode_Last, then the index refers to first element that follows
+        the last matching element - if the last matching element is also the last element of the array, then
+        the index value is the same as the total number of elements in the array.
+
+@leave  KErrNotFound if no matching entry exists.
+
+@see TArrayFindMode
+*/
+template <class T>
+inline TInt RPointerArray<T>::SpecificFindInOrderL(const T* anEntry, TLinearOrder<T> anOrder, TInt aMode) const
+	{ return User::LeaveIfError(SpecificFindInOrder(anEntry, anOrder, aMode));}
+
+
+/**
+Finds the object pointer in the array that matches the specified object
+pointer, using a binary search technique.
+
+Where there is more than one matching element, it finds the first, the last or
+any matching element as specified by the value of aMode.
+
+The function assumes that object pointers in the array are in address order.
+
+NOTE: This function is NOT AVAILABLE to code running on the kernel side.
+
+@param anEntry The object pointer to be found.
+@param anIndex A TInt type supplied by the caller. On return, it contains an index
+               value depending on whether a match is found and on the value of aMode.
+               If there is no matching element in the array, then this is the  index
+               of the first element in the array that is bigger than the element being
+               searched for - if no elements in the array are bigger, then the index
+               value is the same as the total number of elements in the array.
+               If there is a matching element, then what the index refers to depends
+               on the value of aMode:
+               if this is EArrayFindMode_First, then the index refers to the first matching element;
+               if this is EArrayFindMode_Any, then the index can refer to any of the matching elements;
+               if this is EArrayFindMode_Last, then the index refers to first element that follows
+               the last matching element - if the last matching element is also the last element
+               of the array, then the index value is the same as the total number of elements in the array.
+               
+@param	aMode  Specifies whether to find the first match, the last match or any match, as defined by
+               one of the TArrayFindMode enum values.
+
+@leave  KErrNotFound, if no suitable object pointer can be found.
+
+@see TArrayFindMode
+*/
+template <class T>
+inline void RPointerArray<T>::SpecificFindInAddressOrderL(const T* anEntry, TInt& anIndex, TInt aMode) const
+	{ User::LeaveIfError(SpecificFindInAddressOrder(anEntry, anIndex, aMode)); }
+
+
+/**
+Finds the object pointer in the array whose object matches the specified
+object, using a binary search technique and an ordering algorithm.
+
+Where there is more than one matching element, it finds the first, the last or any
+matching element as specified by the value of aMode.
+
+The function assumes that existing object pointers in the array are ordered 
+so that the objects themselves are in object order as determined by an
+algorithm supplied by the caller and packaged as a TLinearOrder<T>.
+
+NOTE: This function is NOT AVAILABLE to code running on the kernel side.
+
+@param anEntry The object pointer to be found.
+@param anIndex A TInt type supplied by the caller. On return, it contains an index
+               value depending on whether a match is found and on the value of aMode.
+               If there is no matching element in the array, then this is
+               the index of the first element in the array that is bigger than
+               the element being searched for - if no elements in the array are bigger,
+               then the index value is the same as the total number of elements in the array.
+               If there is a matching element, then what the index refers to depends
+               on the value of aMode:
+               if this is EArrayFindMode_First, then the index refers to the first matching element;
+               if this is EArrayFindMode_Any, then the index can refer to any of the matching elements;
+               if this is EArrayFindMode_Last, then the index refers to first element that follows
+               the last matching element - if the last matching element is also the last element of
+               the array, then the index value is the same as the total number of elements in the array.
+
+@param anOrder A package encapsulating the function which determines the order 
+               of two class T objects.
+@param	aMode  Specifies whether to find the first match, the last match or any match, as defined by
+               one of the TArrayFindModeenum values.
+
+@leave  KErrNotFound, if no suitable object pointer can be found.
+
+@see TArrayFindMode
+*/
+template <class T>
+inline void RPointerArray<T>::SpecificFindInOrderL(const T* anEntry, TInt& anIndex, TLinearOrder<T> anOrder, TInt aMode) const
+	{ User::LeaveIfError(SpecificFindInOrder(anEntry, anIndex, anOrder, aMode)); }
+
+
+/**
+Inserts an object pointer into the array in address order.
+
+No duplicate entries are permitted.
+The function assumes that existing object pointers within the array are in 
+address order.
+
+The function leaves with one of the system wide error codes, if the operation fails.
+
+NOTE: This function is NOT AVAILABLE to code running on the kernel side.
+
+@param anEntry The object pointer to be inserted.
+*/
+template <class T>
+inline void RPointerArray<T>::InsertInAddressOrderL(const T* anEntry)
+	{ User::LeaveIfError(InsertInAddressOrder(anEntry)); }
+
+
+/**
+Inserts an object pointer into the array so that the object itself is in object 
+order.
+
+The algorithm for determining the order of two class T objects is provided 
+by a function supplied by the caller.
+
+No duplicate entries are permitted.
+
+The function assumes that the array is ordered so that the referenced objects 
+are in object order.
+
+The function leaves with one of the system wide error codes, if the operation fails.
+
+Note that the array remains unchanged following an attempt to insert a duplicate
+entry.
+
+NOTE: This function is NOT AVAILABLE to code running on the kernel side.
+
+@param anEntry The object pointer to be inserted.
+@param anOrder A package encapsulating the function which determines the order 
+               of two class T objects.
+*/
+template <class T>
+inline void RPointerArray<T>::InsertInOrderL(const T* anEntry, TLinearOrder<T> anOrder)
+	{ User::LeaveIfError(InsertInOrder(anEntry, anOrder)); }
+
+
+/**
+Inserts an object pointer into the array in address order, allowing duplicates.
+
+If the new object pointer is a duplicate of an existing object pointer in 
+the array, then the new pointer is inserted after the existing one. If more 
+than one duplicate object pointer already exists in the array, then any new 
+duplicate pointer is inserted after the last one.
+
+The function assumes that existing object pointers within the array are in 
+address order.
+
+The function leaves with one of the system wide error codes, if the operation fails.
+
+NOTE: This function is NOT AVAILABLE to code running on the kernel side.
+
+@param anEntry The object pointer to be inserted.
+*/
+template <class T>
+inline void RPointerArray<T>::InsertInAddressOrderAllowRepeatsL(const T* anEntry)
+	{ User::LeaveIfError(InsertInAddressOrderAllowRepeats(anEntry)); }
+
+
+/**
+Inserts an object pointer into the array so that the object itself is in object 
+order, allowing duplicates
+
+The algorithm for determining the order of two class T objects is provided 
+by a function supplied by the caller.
+
+If the specified object is a duplicate of an existing object, then the new 
+pointer is inserted after the pointer to the existing object. If more than 
+one duplicate object already exists, then the new pointer is inserted after 
+the pointer to the last one.
+
+The function leaves with one of the system wide error codes, if the operation fails.
+
+NOTE: This function is NOT AVAILABLE to code running on the kernel side.
+
+@param anEntry The object pointer to be inserted. 
+@param anOrder A package encapsulating the function which determines the order 
+               of two class T objects.
+*/
+template <class T>
+inline void RPointerArray<T>::InsertInOrderAllowRepeatsL(const T* anEntry, TLinearOrder<T> anOrder)
+	{ User::LeaveIfError(InsertInOrderAllowRepeats(anEntry, anOrder)); }
+
+
+
+/**
+Reserves space for the specified number of elements.
+
+After a call to this function, the memory allocated to the array is sufficient 
+to hold the number of object pointers specified. Adding new object pointers to the array 
+does not result in a re-allocation of memory until the the total number of 
+pointers exceeds the specified count.
+
+@param	aCount	The number of object pointers for which space should be reserved
+@leave KErrNoMemory	If the requested amount of memory could not be allocated
+*/
+template <class T>
+inline void RPointerArray<T>::ReserveL(TInt aCount)
+	{ User::LeaveIfError(RPointerArrayBase::DoReserve(aCount)); }
+
+
+
+// Specialization for RPointerArray<TAny>
+
+/**
+Appends an pointer onto the array.
+
+The function leaves with one of the system wide error codes, if the operation fails.
+
+NOTE: This function is NOT AVAILABLE to code running on the kernel side.
+
+@param anEntry The pointer to be appended.
+*/
+inline void RPointerArray<TAny>::AppendL(const TAny* anEntry)
+	{ User::LeaveIfError(Append(anEntry));}
+
+
+/**
+Inserts an pointer into the array at the specified position.
+
+The function leaves with one of the system wide error codes, if
+the operation fails.
+
+NOTE: This function is NOT AVAILABLE to code running on the kernel side.
+
+@param anEntry The pointer to be inserted.
+@param aPos    The position within the array where the pointer is to be 
+               inserted. The position is relative to zero, i.e. zero implies
+			   that a pointer is inserted at the beginning of the array.
+
+@panic USER 131, if aPos is negative, or is greater than the number of object
+       pointers currently in the array.
+*/
+inline void RPointerArray<TAny>::InsertL(const TAny* anEntry, TInt aPos)
+	{ User::LeaveIfError(Insert(anEntry,aPos)); }
+
+
+/**
+Finds the first pointer in the array which matches the specified pointer, using
+a sequential search.
+
+Matching is based on the comparison of pointers.
+
+The find operation always starts at the low index end of the array. There 
+is no assumption about the order of objects in the array.
+
+NOTE: This function is NOT AVAILABLE to code running on the kernel side.
+
+@param anEntry The pointer to be found.
+@return The index of the first matching pointer within the array.
+@leave KErrNotFound, if no matching pointer can be found.
+*/
+inline TInt RPointerArray<TAny>::FindL(const TAny* anEntry) const
+	{ return User::LeaveIfError(Find(anEntry));}
+
+
+/**
+Finds the last pointer in the array which matches the specified pointer, using
+a sequential search.
+
+Matching is based on the comparison of pointers.
+
+The find operation always starts at the high index end of the array. There 
+is no assumption about the order of objects in the array.
+
+NOTE: This function is NOT AVAILABLE to code running on the kernel side.
+
+@param anEntry The pointer to be found.
+@return The index of the last matching pointer within the array.
+@leave KErrNotFound, if no matching pointer can be found.
+*/
+inline TInt RPointerArray<TAny>::FindReverseL(const TAny* anEntry) const
+	{ return User::LeaveIfError(FindReverse(anEntry));}
+
+
+/**
+Finds the pointer in the array that matches the specified pointer, using a
+binary search technique.
+
+The function assumes that pointers in the array are in address order.
+
+NOTE: This function is NOT AVAILABLE to code running on the kernel side.
+
+@param anEntry The pointer to be found.
+
+@return The index of the matching pointer within the array
+@leave KErrNotFound, if no suitable pointer can be found.
+*/
+inline TInt RPointerArray<TAny>::FindInAddressOrderL(const TAny* anEntry) const
+	{ return User::LeaveIfError(FindInAddressOrder(anEntry));}
+
+
+/**
+Finds the pointer in the array that matches the specified pointer, using a
+binary search technique.
+
+The function assumes that pointers in the array are in address order.
+
+NOTE: This function is NOT AVAILABLE to code running on the kernel side.
+
+@param anEntry The pointer to be found.
+@param anIndex A reference to a TInt into which the
+               function puts an index value: If the function does not leave,
+			   this is the index of the matching pointer within the array. If the
+			   function leaves with KErrNotFound, this is the index of the last
+			   pointer within the array which logically precedes
+			   anEntry.
+
+@leave KErrNotFound, if no suitable pointer can be found.
+*/
+inline void RPointerArray<TAny>::FindInAddressOrderL(const TAny* anEntry, TInt& anIndex) const
+	{ User::LeaveIfError(FindInAddressOrder(anEntry, anIndex)); }
+
+
+/**
+Finds the pointer in the array that matches the specified pointer, using a
+binary search technique.
+
+Where there is more than one matching element, it finds the first, the last
+or any matching element as specified by the value of aMode.
+
+The function assumes that pointers in the array are in address order.
+
+NOTE: This function is NOT AVAILABLE to code running on the kernel side.
+
+@param	anEntry The pointer to be found.
+@param	aMode   Specifies whether to find the first match, the last match or
+                any match, as defined by one of the TArrayFindMode enum values.
+
+@return If there is a matching element, the array index of a matching element -  what
+        the index refers to depends on the value of aMode:
+        if this is EArrayFindMode_First, then the index refers to the first matching element;
+        if this is EArrayFindMode_Any, then the index can refer to any of the matching elements;
+        if this is EArrayFindMode_Last, then the index refers to first element that follows the
+        last matching element - if the last matching element is also the last element of the array,
+        then the index value is the same as the total number of elements in the array.
+        
+@leave  KErrNotFound if no matching entry exists.
+
+@see TArrayFindMode
+*/
+inline TInt RPointerArray<TAny>::SpecificFindInAddressOrderL(const TAny* anEntry, TInt aMode) const
+	{ return User::LeaveIfError(SpecificFindInAddressOrder(anEntry, aMode));}
+
+
+/**
+Finds the pointer in the array that matches the specified pointer, using a
+binary search technique.
+
+Where there is more than one matching element, it finds the first, the last or
+any matching element as specified by the value of aMode.
+
+The function assumes that pointers in the array are in address order.
+
+NOTE: This function is NOT AVAILABLE to code running on the kernel side.
+
+@param anEntry The pointer to be found.
+@param anIndex A TInt type supplied by the caller. On return, it contains an index
+               value depending on whether a match is found and on the value of aMode.
+               If there is no matching element in the array, then this is the  index
+               of the first element in the array that is bigger than the element being
+               searched for - if no elements in the array are bigger, then the index
+               value is the same as the total number of elements in the array.
+               If there is a matching element, then what the index refers to depends
+               on the value of aMode:
+               if this is EArrayFindMode_First, then the index refers to the first matching element;
+               if this is EArrayFindMode_Any, then the index can refer to any of the matching elements;
+               if this is EArrayFindMode_Last, then the index refers to first element that follows
+               the last matching element - if the last matching element is also the last element
+               of the array, then the index value is the same as the total number of elements in the array.
+               
+@param	aMode  Specifies whether to find the first match, the last match or any match, as defined by
+               one of the TArrayFindMode enum values.
+
+@leave  KErrNotFound, if no suitable pointer can be found.
+
+@see TArrayFindMode
+*/
+inline void RPointerArray<TAny>::SpecificFindInAddressOrderL(const TAny* anEntry, TInt& anIndex, TInt aMode) const
+	{ User::LeaveIfError(SpecificFindInAddressOrder(anEntry, anIndex, aMode)); }
+
+
+/**
+Inserts an pointer into the array in address order.
+
+No duplicate entries are permitted.  The function assumes that existing pointers
+within the array are in address order.
+
+The function leaves with one of the system wide error codes, if the operation fails.
+
+NOTE: This function is NOT AVAILABLE to code running on the kernel side.
+
+@param anEntry The pointer to be inserted.
+*/
+inline void RPointerArray<TAny>::InsertInAddressOrderL(const TAny* anEntry)
+	{ User::LeaveIfError(InsertInAddressOrder(anEntry)); }
+
+
+/**
+Inserts an pointer into the array in address order, allowing duplicates.
+
+If the new pointer is a duplicate of an existing pointer in the array, then the
+new pointer is inserted after the existing one. If more than one duplicate
+pointer already exists in the array, then any new duplicate pointer is inserted
+after the last one.
+
+The function assumes that existing pointers within the array are in address
+order.
+
+The function leaves with one of the system wide error codes, if the operation fails.
+
+NOTE: This function is NOT AVAILABLE to code running on the kernel side.
+
+@param anEntry The pointer to be inserted.
+*/
+inline void RPointerArray<TAny>::InsertInAddressOrderAllowRepeatsL(const TAny* anEntry)
+	{ User::LeaveIfError(InsertInAddressOrderAllowRepeats(anEntry)); }
+
+
+/**
+Apends an object onto the array.
+
+The function leaves with one of the system wide error codes, if the operation fails.
+
+NOTE: This function is NOT AVAILABLE to code running on the kernel side.
+
+@param anEntry    A reference to the object of type class T to be appended.
+*/
+template <class T>
+inline void RArray<T>::AppendL(const T& anEntry)
+	{ User::LeaveIfError(Append(anEntry));}
+
+
+/**
+Inserts an object into the array at a specified position.
+
+The function leaves with one of the system wide error codes, if the operation fails.
+
+NOTE: This function is NOT AVAILABLE to code running on the kernel side.
+
+@param anEntry The class T object to be inserted.
+@param aPos    The position within the array where the object is to
+               be inserted. The position is relative to zero, i.e. zero
+			   implies that an object is inserted at the beginning of
+			   the array.
+			   
+@panic USER 131, if aPos is negative or is greater than the number of objects
+       currently in the array.
+*/
+template <class T>
+inline void RArray<T>::InsertL(const T& anEntry, TInt aPos)
+	{ User::LeaveIfError(Insert(anEntry, aPos));}
+
+
+/**
+Finds the first object in the array which matches the specified object using 
+a sequential search.
+
+Matching is based on the comparison of a TInt value at the key offset position 
+within the objects.
+
+For classes which define their own equality operator (==), the alternative method
+FindL(const T& anEntry, TIdentityRelation<T> anIdentity) is recommended.
+
+The find operation always starts at the low index end of the array. There 
+is no assumption about the order of objects in the array.
+
+NOTE: This function is NOT AVAILABLE to code running on the kernel side.
+
+@param anEntry A reference to an object of type class T to be used for matching.
+
+@return The index of the first matching object within the array. 
+@leave  KErrNotFound, if no matching object can be found.
+*/
+template <class T>
+inline TInt RArray<T>::FindL(const T& anEntry) const
+	{ return User::LeaveIfError(Find(anEntry));}
+
+
+/**
+Finds the first object in the array which matches the specified object using 
+a sequential search and a matching algorithm.
+
+The algorithm for determining whether two class T type objects match is provided 
+by a function supplied by the caller.
+
+Such a function need not be supplied if an equality operator (==) is defined for class T. 
+In this case, default construction of anIdentity provides matching.
+
+See Find(const T& anEntry, TIdentityRelation<T> anIdentity) for more details.
+
+The find operation always starts at the low index end of the array. There 
+is no assumption about the order of objects in the array.
+
+NOTE: This function is NOT AVAILABLE to code running on the kernel side.
+
+@param anEntry    A reference to an object of type class T to be used
+                  for matching.
+@param anIdentity A package encapsulating the function which determines whether 
+                  two class T type objects match.
+
+@return The index of the first matching object within the array.
+@leave  KErrNotFound, if no matching object can be found.
+*/
+template <class T>
+inline TInt RArray<T>::FindL(const T& anEntry, TIdentityRelation<T> anIdentity) const
+	{ return User::LeaveIfError(Find(anEntry, anIdentity));}
+
+
+/**
+Finds the last object in the array which matches the specified object using 
+a sequential search.
+
+Matching is based on the comparison of a TInt value at the key offset position 
+within the objects.
+
+For classes which define their own equality operator (==), the alternative method
+FindReverseL(const T& anEntry, TIdentityRelation<T> anIdentity) is recommended.
+
+The find operation always starts at the high index end of the array. There 
+is no assumption about the order of objects in the array.
+
+NOTE: This function is NOT AVAILABLE to code running on the kernel side.
+
+@param anEntry A reference to an object of type class T to be used for matching.
+
+@return The index of the last matching object within the array. 
+@leave  KErrNotFound, if no matching object can be found.
+*/
+template <class T>
+inline TInt RArray<T>::FindReverseL(const T& anEntry) const
+	{ return User::LeaveIfError(FindReverse(anEntry));}
+
+
+/**
+Finds the last object in the array which matches the specified object using 
+a sequential search and a matching algorithm.
+
+The algorithm for determining whether two class T type objects match is provided 
+by a function supplied by the caller.
+
+Such a function need not be supplied if an equality operator (==) is defined for class T. 
+In this case, default construction of anIdentity provides matching.
+
+See Find(const T& anEntry, TIdentityRelation<T> anIdentity) for more details.
+
+The find operation always starts at the high index end of the array. There 
+is no assumption about the order of objects in the array.
+
+NOTE: This function is NOT AVAILABLE to code running on the kernel side.
+
+@param anEntry    A reference to an object of type class T to be used
+                  for matching.
+@param anIdentity A package encapsulating the function which determines whether 
+                  two class T type objects match.
+
+@return The index of the last matching object within the array.
+@leave  KErrNotFound, if no matching object can be found.
+*/
+template <class T>
+inline TInt RArray<T>::FindReverseL(const T& anEntry, TIdentityRelation<T> anIdentity) const
+	{ return User::LeaveIfError(FindReverse(anEntry, anIdentity));}
+
+
+/**
+Finds the object in the array which matches the specified object using a binary 
+search technique.
+
+The function assumes that existing objects within the array are in signed 
+key order.
+
+NOTE: This function is NOT AVAILABLE to code running on the kernel side.
+
+@param anEntry A reference to an object of type class T to be used for matching.
+
+@return The index of the matching object within the array.
+@leave  KErrNotFound, if no matching object can be found.
+*/
+template <class T>
+inline TInt RArray<T>::FindInSignedKeyOrderL(const T& anEntry) const
+	{ return User::LeaveIfError(FindInSignedKeyOrder(anEntry));}
+
+
+/**
+Finds the object in the array which matches the specified object using a binary 
+search technique.
+
+The function assumes that existing objects within the array are in unsigned 
+key order.
+
+NOTE: This function is NOT AVAILABLE to code running on the kernel side.
+
+@param anEntry A reference to an object of type class T to be used for matching.
+
+@return The index of the matching object within the array.
+@leave  KErrNotFound, if no matching object can be found.
+*/
+template <class T>
+inline TInt RArray<T>::FindInUnsignedKeyOrderL(const T& anEntry) const
+	{ return User::LeaveIfError(FindInUnsignedKeyOrder(anEntry));}
+
+
+/**
+Finds the object in the array which matches the specified object using a binary 
+search technique and an ordering algorithm.
+
+The function assumes that existing objects within the array are in object 
+order as determined by an algorithm supplied by the caller and packaged as 
+a TLinearOrder<T>.
+
+NOTE: This function is NOT AVAILABLE to code running on the kernel side.
+
+@param anEntry A reference to an object of type class T to be used for matching.
+@param anOrder A package encapsulating the function which determines the order 
+               of two class T objects.
+
+@return The index of the matching object within the array.
+@leave  KErrNotFound if no matching object can be found.
+*/
+template <class T>
+inline TInt RArray<T>::FindInOrderL(const T& anEntry, TLinearOrder<T> anOrder) const
+{ return User::LeaveIfError(FindInOrder(anEntry, anOrder));}
+
+
+/**
+Finds the object in the array which matches the specified object using a binary 
+search technique.
+
+The function assumes that existing objects within the array are in signed 
+key order.
+
+NOTE: This function is NOT AVAILABLE to code running on the kernel side.
+
+@param anEntry A reference to an object of type class T to be used for matching.
+@param anIndex On return contains an index value of the matching object within the array.
+               If the function leaves with KErrNotFound,this is the index of the
+               first element in the array whose key is bigger than the key of the
+               element being sought. If there are no elements in the array with
+               a bigger key, then the index value is the same as the total 
+               number of elements in the array.
+@leave KErrNotFound, if no matching object can be found.
+*/
+template <class T>
+inline void RArray<T>::FindInSignedKeyOrderL(const T& anEntry, TInt& anIndex) const
+	{ User::LeaveIfError(FindInSignedKeyOrder(anEntry, anIndex));}
+
+
+/**
+Finds the object in the array which matches the specified object using a binary 
+search technique.
+
+The function assumes that existing objects within the array are in unsigned 
+key order.
+
+NOTE: This function is NOT AVAILABLE to code running on the kernel side.
+
+@param anEntry A reference to an object of type class T to be used for matching.
+@param anIndex On return contains an index value of the matching object within the array. 
+               If the function leaves with KErrNotFound,  this is the index of the
+               first element in the array whose key is bigger than the key of the
+               element being sought. If there are no elements in the array with
+               a bigger key, then the index value is the same as the total 
+               number of elements in the array.
+@leave  KErrNotFound, if no matching object can be found.
+*/
+template <class T>
+inline void RArray<T>::FindInUnsignedKeyOrderL(const T& anEntry, TInt& anIndex) const
+	{ User::LeaveIfError(FindInUnsignedKeyOrder(anEntry, anIndex));}
+
+
+/**
+Finds the object in the array which matches the specified object using a binary 
+search technique and an ordering algorithm.
+
+The function assumes that existing objects within the array are in object 
+order as determined by an algorithm supplied by the caller and packaged as 
+a TLinearOrder<T>.
+
+NOTE: This function is NOT AVAILABLE to code running on the kernel side.
+
+@param anEntry A reference to an object of type class T to be used for matching.
+@param anIndex On return contains the index value of the matching object within the array
+               If the function leaves with KErrNotFound, this is the index of
+               the first element in the array that is bigger than the element
+               being searched for - if no elements in the array are bigger,
+               then the index value is the same as the total number of elements
+               in the array.
+@param anOrder A package encapsulating the function which determines the order 
+               of two class T objects.
+
+@leave  KErrNotFound if no matching object can be found.
+*/
+template <class T>
+inline void RArray<T>::FindInOrderL(const T& anEntry, TInt& anIndex, TLinearOrder<T> anOrder) const
+	{ User::LeaveIfError(FindInOrder(anEntry, anIndex, anOrder));}
+
+
+/**
+Finds the object in the array which matches the specified object using a binary 
+search technique.
+
+The element ordering is determined by a signed 32-bit word
+(the key) embedded in each array element. In the case that there is more than
+one matching element, finds the first, last or any match as specified.
+
+The function assumes that existing objects within the array are in signed 
+key order.
+
+NOTE: This function is NOT AVAILABLE to code running on the kernel side.
+
+@param anEntry A reference to an object of type class T to be used for matching.
+@param	aMode  Specifies whether to find the first match, the last match or
+               any match, as defined by one of the TArrayFindMode enum values.
+
+@return The array index of a matching element - what the index refers to
+        depends on the value of aMode:
+        if this is EArrayFindMode_First, then the index refers to the first matching element;
+        if this is EArrayFindMode_Any, then the index can refer to any of the matching elements;
+        if this is EArrayFindMode_Last, then the index refers to first element that follows
+        the last matching element - if the last matching element is also the last element of
+        the array, then the index value is the same as the total number of elements in the array.
+@leave  KErrNotFound if no matching entry exists.
+
+@see TArrayFindMode
+*/
+template <class T>
+inline TInt RArray<T>::SpecificFindInSignedKeyOrderL(const T& anEntry, TInt aMode) const
+{ return User::LeaveIfError(SpecificFindInSignedKeyOrder(anEntry, aMode));}
+
+
+/**
+Finds the object in the array which matches the specified object using a binary 
+search technique.
+
+The element ordering is determined by an unsigned 32-bit word
+(the key) embedded in each array element. In the case that there is more than
+one matching element, finds the first, last or any match as specified.
+
+The function assumes that existing objects within the array are in unsigned 
+key order.
+
+NOTE: This function is NOT AVAILABLE to code running on the kernel side.
+
+@param anEntry A reference to an object of type class T to be used for matching.
+@param	aMode  Specifies whether to find the first match, the last match or any
+        match, as defined by one of the TArrayFindMode enum values.
+
+@return The array index of a matching element -  what the index refers to
+        depends on the value of aMode:
+        if this is EArrayFindMode_First, then the index refers to the first matching element;
+        if this is EArrayFindMode_Any, then the index can refer to any of the matching elements;
+        if this is EArrayFindMode_Last, then the index refers to first element that follows
+        the last matching element - if the last matching element is also the last element
+        of the array, then the index value is the same as the total number of elements in the array.
+        
+@leave  KErrNotFound if no matching entry exists.
+
+@see TArrayFindMode
+*/
+template <class T>
+inline TInt RArray<T>::SpecificFindInUnsignedKeyOrderL(const T& anEntry, TInt aMode) const
+	{ return User::LeaveIfError(SpecificFindInUnsignedKeyOrder(anEntry, aMode));}
+
+
+/**
+Finds the object in the array which matches the specified object using a binary 
+search technique and an ordering algorithm.
+
+Where there is more than one matching element, it finds the first, the last or
+any matching element as specified by the value of aMode.
+
+The function assumes that existing objects within the array are in object 
+order as determined by an algorithm supplied by the caller and packaged as 
+a TLinearOrder<T> type.
+
+NOTE: This function is NOT AVAILABLE to code running on the kernel side.
+
+@param anEntry A reference to an object of type class T to be used for matching.
+@param anOrder A package encapsulating the function which determines the order 
+               of two class T objects.
+@param	aMode  Specifies whether to find the first match, the last match or any match,
+               as defined by one of the TArrayFindMode enum values.
+
+@return The array index of a matching element -  what the index refers to
+        depends on the value of aMode:
+        if this is EArrayFindMode_First, then the index refers to the first matching element;
+        if this is EArrayFindMode_Any, then the index can refer to any of the matching elements;
+        if this is EArrayFindMode_Last, then the index refers to first element that follows
+        the last matching element - if the last matching element is also the last element
+        of the array, then the index value is the same as the total number of elements in the array.
+        
+@leave KErrNotFound if no matching entry exists.
+
+@see TArrayFindMode
+*/
+template <class T>
+inline TInt RArray<T>::SpecificFindInOrderL(const T& anEntry, TLinearOrder<T> anOrder, TInt aMode) const
+{ return User::LeaveIfError(SpecificFindInOrder(anEntry, anOrder, aMode));}
+
+
+/**
+Finds the object in the array which matches the specified object using a binary 
+search technique.
+
+The element ordering is determined by a signed 32-bit word
+(the key) embedded in each array element. In the case that there is more than
+one matching element, finds the first, last or any match as specified.
+
+The function assumes that existing objects within the array are in signed 
+key order.
+
+NOTE: This function is NOT AVAILABLE to code running on the kernel side.
+
+@param anEntry A reference to an object of type class T to be used for matching.
+@param anIndex A TInt type supplied by the caller. On return, it contains an
+               index value depending on whether a match is found and on the
+               value of aMode. If there is no matching element in the array,
+               then this is the index of the first element in the array that
+               is bigger than the element being searched for - if no elements
+               in the array are bigger, then the index value is the same as
+               the total number of elements in the array.
+               If there is a matching element, then what the index refers to
+               depends on the value of aMode:
+               if this is EArrayFindMode_First, then the index refers to the first matching element;
+               if this is EArrayFindMode_Any, then the index can refer to any of the matching elements;
+               if this is EArrayFindMode_Last, then the index refers to first element that follows
+               the last matching element - if the last matching element is also the last element
+               of the array, then the index value is the same as the total number of elements
+               in the array.
+@param aMode   Specifies whether to find the first match, the last match or any match,
+               as defined by one of the TArrayFindMode enum values.
+               
+@leave KErrNotFound if no matching entry exists.
+
+@see TArrayFindMode
+*/
+template <class T>
+inline void RArray<T>::SpecificFindInSignedKeyOrderL(const T& anEntry, TInt& anIndex, TInt aMode) const
+	{ User::LeaveIfError(SpecificFindInSignedKeyOrder(anEntry, anIndex, aMode));}
+
+
+/**
+Finds the object in the array which matches the specified object using a binary 
+search technique.
+
+The element ordering is determined by an unsigned 32-bit word
+(the key) embedded in each array element. In the case that there is more than
+one matching element, finds the first, last or any match as specified.
+
+The function assumes that existing objects within the array are in unsigned 
+key order.
+
+NOTE: This function is NOT AVAILABLE to code running on the kernel side.
+
+@param anEntry A reference to an object of type class T to be used for matching.
+@param anIndex A TInt type supplied by the caller. On return, it contains an
+               index value depending on whether a match is found and on the
+               value of aMode. If there is no matching element in the array,
+               then this is the index of the first element in the array that
+               is bigger than the element being searched for - if no elements
+               in the array are bigger, then the index value is the same as
+               the total number of elements in the array. If there is a matching
+               element, then what the index refers to depends on the value of aMode:
+               if this is EArrayFindMode_First, then the index refers to the first matching element;
+               if this is EArrayFindMode_Any, then the index can refer to any of the matching elements;
+               if this is EArrayFindMode_Last, then the index refers to first element that follows
+               the last matching element - if the last matching element is also the last element
+               of the array, then the index value is the same as the total number of elements in the array.
+@param aMode   Specifies whether to find the first match, the last match or any match,
+               as defined by one of the  TArrayFindMode enum values.
+               
+@leave KErrNotFound if no matching entry exists.
+
+@see TArrayFindMode
+*/
+template <class T>
+inline void RArray<T>::SpecificFindInUnsignedKeyOrderL(const T& anEntry, TInt& anIndex, TInt aMode) const
+	{ User::LeaveIfError(SpecificFindInUnsignedKeyOrder(anEntry, anIndex, aMode));}
+
+
+/**
+Finds the object in the array which matches the specified object using a binary 
+search technique and a specified ordering algorithm.
+
+Where there is more than one matching element, it finds the first, the last or
+any matching element as specified by the value of aMode.
+
+The function assumes that existing objects within the array are in object 
+order as determined by an algorithm supplied by the caller and packaged as 
+a TLinearOrder<T> type.
+
+NOTE: This function is NOT AVAILABLE to code running on the kernel side.
+
+@param anEntry A reference to an object of type class T to be used for matching.
+@param anIndex A TInt type supplied by the caller. On return, it contains an
+               index value depending on whether a match is found and on the value
+               of aMode. If there is no matching element in the array, then this is
+               the  index of the first element in the array that is bigger than the
+               element being searched for - if no elements in the array are bigger,
+               then the index value is the same as the total number of elements
+               in the array. If there is a matching element, then what the index
+               refers to depends on the value of aMode:
+               if this is EArrayFindMode_First, then the index refers to the first matching element;
+               if this is EArrayFindMode_Any, then the index can refer to any of the matching elements;
+               if this is EArrayFindMode_Last, then the index refers to first element that follows
+               the last matching element - if the last matching element is also the last element
+               of the array, then the index value is the same as the total number of elements in the array.
+               
+@param anOrder A package encapsulating the function which determines the order 
+               of two class T objects.
+@param aMode   Specifies whether to find the first match, the last match or any match,
+               as defined by one of the TArrayFindMode enum values.
+               
+@leave KErrNotFound if no matching entry exists.
+
+@see TArrayFindMode
+*/
+template <class T>
+inline void RArray<T>::SpecificFindInOrderL(const T& anEntry, TInt& anIndex, TLinearOrder<T> anOrder, TInt aMode) const
+	{ User::LeaveIfError(SpecificFindInOrder(anEntry, anIndex, anOrder, aMode));}
+
+
+/**
+Inserts an object into the array in ascending signed key order.
+
+The order of two class T type objects is based on comparing a TInt value
+located at the key offset position within the class T object.
+
+No duplicate entries are permitted.
+
+The function leaves with one of the system wide error codes, if the operation fails.
+
+Note that the array remains unchanged following an attempt to insert a duplicate entry.
+
+NOTE: This function is NOT AVAILABLE to code running on the kernel side.
+
+@param anEntry A reference to the object of type class T to be inserted.
+*/
+template <class T>
+inline void RArray<T>::InsertInSignedKeyOrderL(const T& anEntry)
+	{ User::LeaveIfError(InsertInSignedKeyOrder(anEntry));}
+
+
+/**
+Inserts an object into the array in ascending unsigned key order, not allowing 
+duplicate entries.
+
+The order of two class T type objects is based on comparing a TUint value 
+located at the key offset position within the class T object. 
+
+The function leaves with one of the system wide error codes, if the operation fails.
+
+Note that the array remains unchanged following an attempt to insert a duplicate entry.
+
+NOTE: This function is NOT AVAILABLE to code running on the kernel side.
+
+@param anEntry A reference to the object of type class T to be inserted.
+*/
+template <class T>
+inline void RArray<T>::InsertInUnsignedKeyOrderL(const T& anEntry)
+	{ User::LeaveIfError(InsertInUnsignedKeyOrder(anEntry));}
+
+
+/**
+Inserts an object of into the array in object order.
+
+The algorithm for determining the order of two class T type objects is provided 
+by a function supplied by the caller.
+
+No duplicate entries are permitted.
+
+The function assumes that existing objects within the array are in object 
+order.
+
+The function leaves with one of the system wide error codes, if the operation fails.
+
+Note that the array remains unchanged following an attempt to insert a duplicate entry.
+
+NOTE: This function is NOT AVAILABLE to code running on the kernel side.
+
+@param anEntry A reference to the object of type class T to be inserted.
+@param anOrder A package encapsulating the function which determines the order 
+               of two class T objects.
+*/
+template <class T>
+inline void RArray<T>::InsertInOrderL(const T& anEntry, TLinearOrder<T> anOrder)
+	{ User::LeaveIfError(InsertInOrder(anEntry, anOrder));}
+
+
+/**
+Inserts an object into the array in ascending signed key order,
+allowing duplicates.
+
+The order of two class T type objects is based on comparing a TInt value
+located at the key offset position within the class T object. 
+
+If anEntry is a duplicate of an existing object in the array, then the new 
+object is inserted after the existing object. If more than one duplicate object 
+already exists in the array, then any new duplicate object is inserted after 
+the last one.
+
+The function leaves with one of the system wide error codes, if the operation fails.
+
+NOTE: This function is NOT AVAILABLE to code running on the kernel side.
+
+@param anEntry A reference to the object of type class T to be inserted.
+*/
+template <class T>
+inline void RArray<T>::InsertInSignedKeyOrderAllowRepeatsL(const T& anEntry)
+	{ User::LeaveIfError(InsertInSignedKeyOrderAllowRepeats(anEntry));}
+
+
+/**
+Inserts an object into the array in ascending unsigned key order, allowing 
+duplicates.
+
+The order of two class T type objects is based on comparing a TUint value 
+located at the key offset position within the class T object. 
+
+If anEntry is a duplicate of an existing object in the array, then the new 
+object is inserted after the existing object. If more than one duplicate object 
+already exists in the array, then any new duplicate object is inserted after 
+the last one.
+
+The function leaves with one of the system wide error codes, if the operation fails.
+
+NOTE: This function is NOT AVAILABLE to code running on the kernel side.
+
+@param anEntry A reference to the object of type class T to be inserted.
+*/
+template <class T>
+inline void RArray<T>::InsertInUnsignedKeyOrderAllowRepeatsL(const T& anEntry)
+	{ User::LeaveIfError(InsertInUnsignedKeyOrderAllowRepeats(anEntry));}
+
+
+/**
+Inserts an object into the array in object order, allowing duplicates.
+
+The algorithm for determining the order of two class T type objects is provided 
+by a function supplied by the caller.
+
+If anEntry is a duplicate of an existing object in the array, then the new 
+object is inserted after the existing object. If more than one duplicate object 
+already exists in the array, then anEntry is inserted after the last one.
+
+The function assumes that existing objects within the array are in object 
+order.
+
+The function leaves with one of the system wide error codes, if the operation fails.
+
+NOTE: This function is NOT AVAILABLE to code running on the kernel side.
+
+@param anEntry A reference to the object of type class T to be inserted.
+@param anOrder A package encapsulating the function which determines the order 
+               of two class T objects.
+*/
+template <class T>
+inline void RArray<T>::InsertInOrderAllowRepeatsL(const T& anEntry, TLinearOrder<T> anOrder)
+	{ User::LeaveIfError(InsertInOrderAllowRepeats(anEntry, anOrder));}
+
+
+
+/**
+Reserves space for the specified number of elements.
+
+After a call to this function, the memory allocated to the array is sufficient 
+to hold the number of objects specified. Adding new objects to the array 
+does not result in a re-allocation of memory until the the total number of 
+objects exceeds the specified count.
+
+@param	aCount	The number of objects for which space should be reserved
+@leave KErrNoMemory	If the requested amount of memory could not be allocated
+*/
+template <class T>
+inline void RArray<T>::ReserveL(TInt aCount)
+	{ User::LeaveIfError(RArrayBase::DoReserve(aCount)); }
+
+
+
+
+/**
+Appends a signed integer onto the array.
+
+The function leaves with one of the system wide error codes, if the operation fails.
+	
+NOTE: This function is NOT AVAILABLE to code running on the kernel side.	
+	
+@param anEntry The signed integer to be appended.
+*/
+inline void RArray<TInt>::AppendL(TInt anEntry)
+	{ User::LeaveIfError(Append(anEntry));}
+
+
+/**
+Inserts a signed integer into the array at the specified position.
+	
+The function leaves with one of the system wide error codes, if the operation fails.
+	
+NOTE: This function is NOT AVAILABLE to code running on the kernel side.	
+	
+@param anEntry The signed integer to be inserted.
+@param aPos    The position within the array where the signed integer is to be 
+	           inserted. The position is relative to zero, i.e. zero implies
+			   that an entry is inserted at the beginning of the array.
+		   
+@panic USER 131, if aPos is negative, or is greater than the number of entries
+       currently in the array.
+*/
+inline void RArray<TInt>::InsertL(TInt anEntry, TInt aPos)
+	{ User::LeaveIfError(Insert(anEntry, aPos));}
+
+
+/**
+Finds the first signed integer in the array which matches the specified signed 
+integer using a sequential search.
+
+The find operation always starts at the low index end of the array. There 
+is no assumption about the order of entries in the array.
+
+NOTE: This function is NOT AVAILABLE to code running on the kernel side.
+	
+@param anEntry The signed integer to be found.
+
+@return The index of the first matching signed integer within the array.
+@leave  KErrNotFound, if no matching entry can be found.
+*/
+inline TInt RArray<TInt>::FindL(TInt anEntry) const
+	{ return User::LeaveIfError(Find(anEntry));}
+
+
+/**
+Finds the last signed integer in the array which matches the specified signed 
+integer using a sequential search.
+
+The find operation always starts at the high index end of the array. There 
+is no assumption about the order of entries in the array.
+
+NOTE: This function is NOT AVAILABLE to code running on the kernel side.
+	
+@param anEntry The signed integer to be found.
+
+@return The index of the last matching signed integer within the array.
+@leave  KErrNotFound, if no matching entry can be found.
+*/
+inline TInt RArray<TInt>::FindReverseL(TInt anEntry) const
+	{ return User::LeaveIfError(FindReverse(anEntry));}
+
+
+/**
+Finds the signed integer in the array that matches the specified signed integer 
+using a binary search technique.
+
+The function assumes that the array is in signed integer order.
+	
+NOTE: This function is NOT AVAILABLE to code running on the kernel side.	
+	
+@param anEntry The signed integer to be found.
+
+@return The index of the matching signed integer within the array.
+@leave  KErrNotFound, if no match can be found.
+*/
+inline TInt RArray<TInt>::FindInOrderL(TInt anEntry) const
+	{ return User::LeaveIfError(FindInOrder(anEntry));}
+
+
+/**
+Finds the signed integer in the array that matches the specified signed integer
+using a binary search technique.
+	
+The function assumes that the array is in signed integer order.
+	
+NOTE: This function is NOT AVAILABLE to code running on the kernel side.	
+	
+@param anEntry The signed integer to be found.
+@param anIndex A reference to a signed integer into which the
+               function puts an index value: If the function returns ,
+               this is the index of the matching signed integer within the
+               array. If the function leaves with KErrNotFound, this is the
+               index of the first signed integer within the array that is
+               bigger than the signed integer being searched for - if no
+               signed integers within the array are bigger, then the index
+               value is the same as the total number of signed integers
+               within the array.
+@leave  KErrNotFound if no  match can be found.
+*/
+inline void RArray<TInt>::FindInOrderL(TInt anEntry, TInt& anIndex) const
+	{ User::LeaveIfError(FindInOrder(anEntry, anIndex));}
+
+
+/**
+Finds the signed integer in the array that matches the specified signed integer 
+using a binary search technique.
+
+Where there is more than one matching element, it finds the first, last or any
+matching element  as specified by the value of aMode.
+	
+The function assumes that the array is in signed integer order.
+	
+NOTE: This function is NOT AVAILABLE to code running on the kernel side.	
+	
+@param anEntry The signed integer to be found.
+@param aMode   Specifies whether to find the first match, the last match or
+               any match, as defined by one of the TArrayFindMode enum values.
+
+@return The array index of a matching element - what the index refers to
+        depends on the value of aMode:
+        if this is EArrayFindMode_First, then the index refers to the first matching element;
+        if this is EArrayFindMode_Any, then the index can refer to any of the matching elements;
+        if this is EArrayFindMode_Last, then the index refers to first element that follows
+        the last matching element - if the last matching element is also the last element
+        of the array, then the index value is the same as the total number of elements in the array.
+        
+@leave  KErrNotFound if no matching entry exists.
+
+@see TArrayFindMode
+*/
+inline TInt RArray<TInt>::SpecificFindInOrderL(TInt anEntry, TInt aMode) const
+	{ return User::LeaveIfError(SpecificFindInOrder(anEntry, aMode));}
+
+
+/**
+Finds the signed integer in the array that matches the specified signed integer
+using a binary search technique.
+
+Where there is more than one matching element, it finds the first, last or any
+matching element  as specified by the value of aMode.
+
+The function assumes that the array is in signed integer order.
+
+NOTE: This function is NOT AVAILABLE to code running on the kernel side.
+	
+@param anEntry The signed integer to be found.
+@param anIndex A TInt type supplied by the caller. On return, it contains an
+               index value depending on whether a match is found and on the value of aMode.
+               If there is no matching element in the array, then this is
+               the  index of the first element in the array that is bigger
+               than the element being searched for - if no elements in the
+               array are bigger, then the index value is the same as the total
+               number of elements in the array. If there is a matching element,
+               then what the index refers to depends on the value of aMode:
+               if this is EArrayFindMode_First, then the index refers to the first matching element;
+               if this is EArrayFindMode_Any, then the index can refer to any of the matching elements;
+               if this is EArrayFindMode_Last, then the index refers to first element that follows
+               the last matching element - if the last matching element is also the last element
+               of the array, then the index value is the same as the total number of elements in the array.
+               
+@param	aMode  Specifies whether to find the first match, the last match or any match, as defined
+               by one of the TArrayFindMode enum values.
+               
+@leave KErrNotFound if no matching entry exists.
+
+@see TArrayFindMode
+*/
+inline void RArray<TInt>::SpecificFindInOrderL(TInt anEntry, TInt& anIndex, TInt aMode) const
+	{ User::LeaveIfError(SpecificFindInOrder(anEntry, anIndex, aMode));}
+
+
+/**
+Inserts a signed integer into the array in signed integer order.
+
+No duplicate entries are permitted.
+
+The function assumes that existing entries within the array are in signed 
+integer order.
+
+The function leaves with one of the system wide error codes, if the operation fails.
+
+Note that the array remains unchanged following an attempt to insert a duplicate entry. 
+
+NOTE: This function is NOT AVAILABLE to code running on the kernel side.
+
+@param anEntry The signed integer to be inserted.
+*/
+inline void RArray<TInt>::InsertInOrderL(TInt anEntry)
+	{ User::LeaveIfError(InsertInOrder(anEntry));}
+
+
+/**
+Inserts a signed integer into the array in signed integer order,
+allowing duplicates.
+
+If anEntry is a duplicate of an existing entry in the array, then the new 
+signed integer is inserted after the existing one. If more than one duplicate 
+entry already exists in the array, then any new duplicate signed integer is 
+inserted after the last one.
+
+The function assumes that existing entries within the array are in signed 
+integer order.
+
+The function leaves with one of the system wide error codes, if the operation fails.
+	
+NOTE: This function is NOT AVAILABLE to code running on the kernel side.
+	
+@param anEntry The signed integer to be inserted.
+*/
+inline void RArray<TInt>::InsertInOrderAllowRepeatsL(TInt anEntry)
+	{ User::LeaveIfError(InsertInOrderAllowRepeats(anEntry));}
+
+
+
+/**
+Reserves space for the specified number of elements.
+
+After a call to this function, the memory allocated to the array is sufficient 
+to hold the number of integers specified. Adding new integers to the array 
+does not result in a re-allocation of memory until the the total number of 
+integers exceeds the specified count.
+
+@param	aCount	The number of integers for which space should be reserved
+@leave KErrNoMemory	If the requested amount of memory could not be allocated
+*/
+inline void RArray<TInt>::ReserveL(TInt aCount)
+	{ User::LeaveIfError(RPointerArrayBase::DoReserve(aCount)); }
+
+
+
+
+/**
+Appends an unsigned integer onto the array.
+	
+The function leaves with one of the system wide error codes, if the operation fails.
+	
+NOTE: This function is NOT AVAILABLE to code running on the kernel side.	
+	
+@param anEntry The unsigned integer to be appended.
+*/
+inline void RArray<TUint>::AppendL(TUint anEntry)
+	{ User::LeaveIfError(Append(anEntry));}
+
+
+/**
+Inserts an unsigned integer into the array at the specified position.
+	
+The function leaves with one of the system wide error codes, if the operation fails.
+	
+NOTE: This function is NOT AVAILABLE to code running on the kernel side.	
+	
+@param anEntry  The unsigned integer to be inserted.
+@param aPos     The position within the array where the unsigned integer is to 
+	            be inserted. The position is relative to zero, i.e. zero
+				implies that an entry is inserted at the beginning of
+				the array.
+			
+@panic USER 131, if aPos is negative, or is greater than the number of entries
+       currently in the array.
+*/
+inline void RArray<TUint>::InsertL(TUint anEntry, TInt aPos)
+	{ User::LeaveIfError(Insert(anEntry, aPos));}
+
+
+/**
+Finds the first unsigned integer in the array which matches the specified
+value, using a sequential search.
+
+The find operation always starts at the low index end of the array. There 
+is no assumption about the order of entries in the array.
+	
+NOTE: This function is NOT AVAILABLE to code running on the kernel side.	
+	
+@param anEntry The unsigned integer to be found.
+@return The index of the first matching unsigned integer within the array.
+@leave  KErrNotFound, if no matching entry can be found.
+*/
+inline TInt RArray<TUint>::FindL(TUint anEntry) const
+	{ return User::LeaveIfError(Find(anEntry));}
+
+
+/**
+Finds the last unsigned integer in the array which matches the specified
+value, using a sequential search.
+
+The find operation always starts at the high index end of the array. There 
+is no assumption about the order of entries in the array.
+	
+NOTE: This function is NOT AVAILABLE to code running on the kernel side.	
+	
+@param anEntry The unsigned integer to be found.
+@return The index of the last matching unsigned integer within the array.
+@leave  KErrNotFound, if no matching entry can be found.
+*/
+inline TInt RArray<TUint>::FindReverseL(TUint anEntry) const
+	{ return User::LeaveIfError(FindReverse(anEntry));}
+
+
+/**
+Finds the unsigned integer in the array which matches the specified value, 
+using a binary search technique.
+	
+The functions assume that existing entries within the array are in unsigned 
+integer order.
+
+NOTE: This function is NOT AVAILABLE to code running on the kernel side.
+	
+@param anEntry The unsigned integer to be found.
+
+@return The index of the matching unsigned integer within the array;
+@leave  KErrNotFound, if no matching entry can be found.
+*/
+inline TInt RArray<TUint>::FindInOrderL(TUint anEntry) const
+	{ return User::LeaveIfError(FindInOrder(anEntry));}
+
+
+/**
+Finds the unsigned integer in the array which matches the specified value, 
+using a binary search technique.
+
+If the index cannot be found, the function returns the index of the last
+unsigned integer within the array which logically precedes anEntry.
+The functions assume that existing entries within the array are in unsigned 
+integer order.
+	
+NOTE: This function is NOT AVAILABLE to code running on the kernel side.
+	
+@param anEntry The unsigned integer to be found.
+@param anIndex A TInt supplied by the caller. On return, contains an index
+               value of the matching unsigned integer within the array. 
+               If the function leaves with KErrNotFound, this is the index of the
+               first unsigned integer within the array that is bigger than the
+               unsigned integer being searched for - if no unsigned integers within
+               the array are bigger, then the index value is the same as the
+               total number of unsigned integers within the array.
+
+@leave  KErrNotFound, if no matching entry can be found.
+*/
+inline void RArray<TUint>::FindInOrderL(TUint anEntry, TInt& anIndex) const
+	{ User::LeaveIfError(FindInOrder(anEntry, anIndex));}
+
+
+/**
+Finds the unsigned integer in the array that matches the specified unsigned integer 
+using a binary search technique.
+
+In the case that there is more than one matching element, finds the first, last or any
+match as specified.
+	
+The function assumes that the array is in unsigned integer order.
+
+NOTE: This function is NOT AVAILABLE to code running on the kernel side.
+	
+@param anEntry The unsigned integer to be found.
+@param aMode   Specifies whether to find the first match, the last match or 
+               any match, as defined by one of the TArrayFindMode enum values.
+
+@return The array index of a matching element - what the index refers to depends
+        on the value of aMode:
+        if this is EArrayFindMode_First, then the index refers to the first matching element;
+        if this is EArrayFindMode_Any, then the index can refer to any of the matching elements;
+        if this is EArrayFindMode_Last, then the index refers to first element that follows
+        the last matching element - if the last matching element is also the last element
+        of the array, then the index value is the same as the total number of elements in the array.
+        
+@leave KErrNotFound if no matching entry exists.
+
+@see TArrayFindMode
+*/
+inline TInt RArray<TUint>::SpecificFindInOrderL(TUint anEntry, TInt aMode) const
+	{ return User::LeaveIfError(SpecificFindInOrder(anEntry, aMode));}
+
+
+/**
+Finds the unsigned integer in the array that matches the specified unsigned integer
+using a binary search technique.
+
+Where there is more than one matching element, it finds the first, last or
+any matching element as specified by the value of aMode.
+
+The function assumes that the array is in unsigned integer order.
+	
+NOTE: This function is NOT AVAILABLE to code running on the kernel side.	
+	
+@param anEntry The unsigned integer to be found.
+@param anIndex A TInt type supplied by the caller. On return, it contains an index
+               value depending on whether a match is found and on the value of aMode.
+               If there is no matching element in the array, then this is the
+               index of the first element in the array that is bigger than the element
+               being searched for - if no elements in the array are bigger, then
+               the index value is the same as the total number of elements in the array.
+               If there is a matching element, then what the index refers to depends on
+               the value of aMode:
+               if this is EArrayFindMode_First, then the index refers to the first matching element;
+               if this is EArrayFindMode_Any, then the index can refer to any of the matching elements;
+               if this is EArrayFindMode_Last, then the index refers to first element that follows
+               the last matching element - if the last matching element is also the last element of the array,
+               then the index value is the same as the total number of elements in the array.
+               
+@param	aMode  Specifies whether to find the first match, the last match or any match, as defined by
+               one of the TArrayFindMode enum values.
+@leave KErrNotFound if no matching entry exists.
+
+@see TArrayFindMode
+*/
+inline void RArray<TUint>::SpecificFindInOrderL(TUint anEntry, TInt& anIndex, TInt aMode) const
+	{ User::LeaveIfError(SpecificFindInOrder(anEntry, anIndex, aMode));}
+
+
+/**
+Inserts an unsigned integer into the array in unsigned integer order.
+
+No duplicate entries are permitted.
+
+The function assumes that existing entries within the array are in unsigned 
+integer order.
+
+The function leaves with one of the system wide error codes, if the operation fails.
+	
+Note that the array remains unchanged following an attempt to insert a duplicate entry.
+	
+NOTE: This function is NOT AVAILABLE to code running on the kernel side.	
+	
+@param anEntry The unsigned integer to be inserted.
+*/
+inline void RArray<TUint>::InsertInOrderL(TUint anEntry)
+	{ User::LeaveIfError(InsertInOrder(anEntry));}
+
+
+/**
+Inserts an unsigned integer into the array in unsigned integer order, allowing 
+duplicates.
+
+If the new integer is a duplicate of an existing entry in the array, then 
+the new unsigned integer is inserted after the existing one. If more than 
+one duplicate entry already exists in the array, then any new duplicate
+unsigned integer is inserted after the last one.
+	
+The function assumes that existing entries within the array are in unsigned 
+integer order.
+
+The function leaves with one of the system wide error codes, if the operation fails.
+	
+NOTE: This function is NOT AVAILABLE to code running on the kernel side.	
+	
+@param anEntry The unsigned integer to be inserted.
+*/
+inline void RArray<TUint>::InsertInOrderAllowRepeatsL(TUint anEntry)
+	{ User::LeaveIfError(InsertInOrderAllowRepeats(anEntry));}
+
+
+
+/**
+Reserves space for the specified number of elements.
+
+After a call to this function, the memory allocated to the array is sufficient 
+to hold the number of integers specified. Adding new integers to the array 
+does not result in a re-allocation of memory until the the total number of 
+integers exceeds the specified count.
+
+@param	aCount	The number of integers for which space should be reserved
+@leave KErrNoMemory	If the requested amount of memory could not be allocated
+*/
+inline void RArray<TUint>::ReserveL(TInt aCount)
+	{ User::LeaveIfError(RPointerArrayBase::DoReserve(aCount)); }
+
+
+
+
+/**
+Sets the priority of the client's process.
+
+@param aPriority The priority value.
+*/
+inline void RMessagePtr2::SetProcessPriorityL(TProcessPriority aPriority) const
+	{ User::LeaveIfError(SetProcessPriority(aPriority));}
+
+
+/**
+Opens a handle on the client thread.
+
+@param aClient    On successful return, the handle to the client thread.
+@param aOwnerType An enumeration whose enumerators define the ownership of
+                  the handle. If not explicitly specified,
+                  EOwnerProcess is taken as default.
+*/
+inline void RMessagePtr2::ClientL(RThread& aClient, TOwnerType aOwnerType) const
+	{ User::LeaveIfError(Client(aClient, aOwnerType));}
+
+
+#ifndef __REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__
+
+inline TBool RMessagePtr2::HasCapability(TCapability aCapability, const char* aDiagnostic) const
+	{
+	return DoHasCapability(aCapability, aDiagnostic);
+	}
+
+inline void RMessagePtr2::HasCapabilityL(TCapability aCapability, const char* aDiagnosticMessage) const
+	{
+	if (!HasCapability(aCapability, aDiagnosticMessage))
+		{
+		User::Leave(KErrPermissionDenied);
+		}
+	}
+
+inline TBool RMessagePtr2::HasCapability(TCapability aCapability1, TCapability aCapability2, const char* aDiagnostic) const
+	{
+	return DoHasCapability(aCapability1, aCapability2, aDiagnostic);
+	}
+
+inline void RMessagePtr2::HasCapabilityL(TCapability aCapability1, TCapability aCapability2, const char* aDiagnosticMessage) const
+	{
+	if (!HasCapability(aCapability1, aCapability2, aDiagnosticMessage))
+		{
+		User::Leave(KErrPermissionDenied);
+		}
+	}
+
+#else //__REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__
+
+// Only available to NULL arguments
+inline TBool RMessagePtr2::HasCapability(TCapability aCapability, OnlyCreateWithNull /*aDiagnostic*/) const
+	{
+	return DoHasCapability(aCapability);
+	}
+
+inline void RMessagePtr2::HasCapabilityL(TCapability aCapability, OnlyCreateWithNull /*aDiagnosticMessage*/) const
+	{
+	if (!DoHasCapability(aCapability))
+		{
+		User::Leave(KErrPermissionDenied);
+		}
+	}
+
+inline TBool RMessagePtr2::HasCapability(TCapability aCapability1, TCapability aCapability2, OnlyCreateWithNull /*aDiagnostic*/) const
+	{
+	return DoHasCapability(aCapability1, aCapability2);
+	}
+
+inline void RMessagePtr2::HasCapabilityL(TCapability aCapability1, TCapability aCapability2, OnlyCreateWithNull /*aDiagnosticMessage*/) const
+	{
+	if (!DoHasCapability(aCapability1, aCapability2))
+		{
+		User::Leave(KErrPermissionDenied);
+		}
+	}
+
+#ifndef __REMOVE_PLATSEC_DIAGNOSTICS__
+// For things using KSuppressPlatSecDiagnostic
+inline TBool RMessagePtr2::HasCapability(TCapability aCapability, OnlyCreateWithNull /*aDiagnostic*/, OnlyCreateWithNull /*aSuppress*/) const
+	{
+	return DoHasCapability(aCapability, KSuppressPlatSecDiagnosticMagicValue);
+	}
+
+inline void RMessagePtr2::HasCapabilityL(TCapability aCapability, OnlyCreateWithNull /*aDiagnostic*/, OnlyCreateWithNull /*aSuppress*/) const
+	{
+	if (!DoHasCapability(aCapability, KSuppressPlatSecDiagnosticMagicValue))
+		{
+		User::Leave(KErrPermissionDenied);
+		}
+	}
+
+inline TBool RMessagePtr2::HasCapability(TCapability aCapability1, TCapability aCapability2, OnlyCreateWithNull /*aDiagnostic*/, OnlyCreateWithNull /*aSuppress*/) const
+	{
+	return DoHasCapability(aCapability1, aCapability2, KSuppressPlatSecDiagnosticMagicValue);
+	}
+
+inline void RMessagePtr2::HasCapabilityL(TCapability aCapability1, TCapability aCapability2, OnlyCreateWithNull /*aDiagnostic*/, OnlyCreateWithNull /*aSuppress*/) const
+	{
+	if (!DoHasCapability(aCapability1, aCapability2, KSuppressPlatSecDiagnosticMagicValue))
+		{
+		User::Leave(KErrPermissionDenied);
+		}
+	}
+#endif // !__REMOVE_PLATSEC_DIAGNOSTICS__
+
+#endif // !__REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__
+
+inline TInt RThread::RenameMe(const TDesC& aName)
+	{ return User::RenameThread(aName); }
+inline TInt RProcess::RenameMe(const TDesC& aName)
+	{ return User::RenameProcess(aName); }
+
+#endif // !__KERNEL_MODE__
+
+#ifdef __SUPPORT_CPP_EXCEPTIONS__
+// The standard header file <exception> defines the following guard macro for EDG and CW, VC++, GCC respectively.
+// The guard below is ugly. It will surely come back and bite us unless we resolve the whole issue of standard headers
+// when we move to supporting Standard C++.
+
+// The macro __SYMBIAN_STDCPP_SUPPORT__ is defined when building a StdC++ target.
+// In this case, we wish to avoid defining uncaught_exception below since it clashes with the StdC++ specification 
+#if !defined(_EXCEPTION) && !defined(_EXCEPTION_) && !defined(__EXCEPTION__) && !defined(__SYMBIAN_STDCPP_SUPPORT__)
+
+#if defined(__VC32__) && !defined(_CRTIMP_PURE)
+
+	// Declare MS EH runtime functions
+	bool __uncaught_exception(void);
+
+#if _MSC_VER >= 1200
+	__declspec(noreturn) void terminate(void);
+	__declspec(noreturn) void unexpected(void);
+#else
+	void terminate(void);
+	void unexpected(void);
+#endif
+
+	typedef void (*terminate_handler)();
+	terminate_handler set_terminate(terminate_handler h) throw();
+	typedef void (*unexpected_handler)();
+	unexpected_handler set_unexpected(unexpected_handler h) throw();
+
+namespace std {
+#ifdef __MSVCDOTNET__
+	inline bool uncaught_exception(void) { return ::__uncaught_exception(); }
+#else // !__MSVCDOTNET__
+	// MS KB242192: BUG: uncaught_exception() Always Returns False
+	inline bool uncaught_exception(void) { return false; }
+#endif //__MSVCDOTNET__
+	inline void terminate(void) { ::terminate(); }
+	inline void unexpected(void) { ::unexpected(); }
+	inline terminate_handler set_terminate(terminate_handler h) throw() { return ::set_terminate(h); }
+	inline unexpected_handler set_unexpected(unexpected_handler h) throw() { return ::set_unexpected(h); }
+}
+
+#endif // extract from MSVC headers
+
+#ifdef __CW32__
+
+	extern "C" bool __uncaught_exception(void);
+
+namespace std {
+#if __MWERKS__ > 0x3200
+	inline bool uncaught_exception(void) { return ::__uncaught_exception(); }
+#else
+	// no uncaught_exception() implementation on CW 2.4.7
+	inline bool uncaught_exception(void) { return false; }
+#endif
+}
+
+#endif // extract from CW headers
+
+#endif // <exception> header guard
+
+#endif //__SUPPORT_CPP_EXCEPTIONS__
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32/include/e32std_private.h	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,142 @@
+// Copyright (c) 1994-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32\include\e32std_private.h
+// 
+//
+
+/**
+ @file
+ @internalTechnology
+ @released
+*/
+
+#ifndef __E32STD_PRIVATE_H__
+#define __E32STD_PRIVATE_H__
+
+#ifdef __KERNEL_MODE__
+#error !! Including e32std.h in kernel code !!
+#endif
+
+#include <e32cmn.h>
+#include <e32cmn_private.h>
+
+/**
+@internalComponent
+*/
+const TUint KLocaleLanguageKey = 0x10208903;
+
+/**
+@internalComponent
+*/
+const TUint KLocaleDataKey = 0x10208904;
+
+/**
+@internalComponent
+*/
+const TUint KLocaleDataExtraKey = 0x10208905;
+
+/**
+@internalComponent
+*/
+const TUint KLocaleTimeDateFormatKey = 0x10208907;
+
+/**
+@internalComponent
+*/
+const TUint KLocaleDefaultCharSetKey = 0x10208908;
+
+/**
+@internalComponent
+*/
+const TUint KLocalePreferredCharSetKey = 0x10208909;
+
+/**
+@internalComponent
+*/
+enum TLocaleFunctions
+	{
+	FnDummy,
+	FnAmPmTable,
+	FnCharSet,
+	FnCollTable,
+	FnCurrencySymbol,
+	FnDateSuffixTable,
+	FnDayAbbTable,
+	FnDayTable,
+	FnFoldTable,
+	FnLanguage,
+	FnLocaleData,
+	FnLowerTable,
+	FnMonthAbbTable,
+	FnMonthTable,
+	FnMsgTable,
+	FnTypeTable,
+	FnUniCode,
+	FnUpperTable,
+	FnShortDateFormatSpec,
+	FnLongDateFormatSpec,
+	FnTimeFormatSpec,
+	FnFatUtilityFunctions
+	};
+
+/**
+@internalAll
+*/
+const TInt KMediaPasswordNotifyUid(0x10004c00);
+
+/**
+@internalAll
+*/
+enum TMediaPswdNotifyExitMode {EMPEMUnlock, EMPEMCancel, EMPEMUnlockAndStore};
+
+
+/**
+@internalAll
+*/
+struct TMediaPswdNotifyBase
+	{
+	enum TCardType {ECTMmcPassword} iCT;
+	TVersion iVersion;
+	};
+
+/**
+@internalAll
+*/
+struct TMediaPswdSendNotifyInfoV1 : public TMediaPswdNotifyBase
+	{
+	// empty.
+	};
+
+/**
+@internalAll
+*/
+struct TMediaPswdSendNotifyInfoV1Debug : public TMediaPswdSendNotifyInfoV1
+	{
+	TInt iSleepPeriod;							// us, -ve means maximum range
+	TMediaPswdNotifyExitMode iEM;
+	TText8 iPW[KMaxMediaPassword];
+	};
+
+/**
+@internalAll
+*/
+struct TMediaPswdReplyNotifyInfoV1 : public TMediaPswdNotifyBase
+	{
+	TText8 iPW[KMaxMediaPassword];
+	TMediaPswdNotifyExitMode iEM;
+	};
+
+
+#endif
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32/include/e32svr.h	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,84 @@
+// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32\include\e32svr.h
+// 
+//
+
+#ifndef __E32SVR_H__
+#define __E32SVR_H__
+#include <e32hal.h>
+#include <d32locd.h>
+#include <e32notif.h>
+#include <e32ldr.h>
+#include <e32event.h>
+#include <e32event_private.h>
+#include <e32ktran.h>
+#include <e32debug.h>
+#include <e32lmsg.h>
+
+/**
+@internalComponent
+@removed
+*/
+enum TBlockType {EBlocked,EUnBlocked,ERelease};
+
+/**
+A collection of static functions that are intended for internal use only, 
+except for AddEvent.
+@see UserSvr::AddEvent()
+@publishedPartner
+@released
+*/
+class UserSvr
+	{
+public:
+	IMPORT_C static void CaptureEventHook();	/**< @internalAll */
+	IMPORT_C static void ReleaseEventHook();	/**< @internalAll */
+	IMPORT_C static void RequestEvent(TRawEventBuf &anEvent,TRequestStatus &aStatus);	/**< @internalAll */
+	IMPORT_C static void RequestEventCancel();	/**< @internalAll */
+	IMPORT_C static TInt AddEvent(const TRawEvent& anEvent);
+	IMPORT_C static void ScreenInfo(TDes8& anInfo);	/**< @internalAll */
+	IMPORT_C static TInt DllSetTls(TInt aHandle, TAny *aPtr);	/**<@internalAll */
+	IMPORT_C static TInt DllSetTls(TInt aHandle, TInt aDllUid, TAny *aPtr);	/**< @internalComponent */
+	IMPORT_C static TAny *DllTls(TInt aHandle);	/**< @internalAll */
+	IMPORT_C static TAny *DllTls(TInt aHandle, TInt aDllUid);	/**< @internalComponent */
+	IMPORT_C static void DllFreeTls(TInt aHandle);	/**< @internalAll */
+	IMPORT_C static void DllFileName(TInt aHandle, TDes &aFileName);	/**< @internalAll */
+	IMPORT_C static void FsRegisterThread();	/**< @internalAll */
+	IMPORT_C static void RegisterTrustedChunk(TInt aHandle);/**< @internalComponent */
+	IMPORT_C static void WsRegisterThread();	/**< @internalAll */
+    IMPORT_C static TBool TestBootSequence();	/**< @internalAll */
+    IMPORT_C static void WsRegisterSwitchOnScreenHandling(TBool aState);	/**< @internalAll */
+    IMPORT_C static void WsSwitchOnScreen();	/**< @internalAll */
+    IMPORT_C static TInt ChangeLocale(const TDesC& aLocaleDllName);	/**< @internalAll */
+	IMPORT_C static TInt ResetMachine(TMachineStartupType aType);	/**< @internalAll */
+	IMPORT_C static void UnlockRamDrive();	/**< @internalAll */
+	IMPORT_C static void LockRamDrive();	/**< @internalAll */
+	IMPORT_C static TUint32 RomRootDirectoryAddress();	/**< @internalAll */
+	IMPORT_C static TInt ExecuteInSupervisorMode(TSupervisorFunction aFunction, TAny* aParameter);	/**< @internalAll */
+	IMPORT_C static TUint32 RomHeaderAddress();	/**< @internalAll */
+	IMPORT_C static TUint32 DebugMask();	/**< @internalAll */ //Return the kernel debug mask 0
+	IMPORT_C static TUint32 DebugMask(TUint aIndex);	/**<@internalAll */	// Return the kernel debug mask
+	IMPORT_C static TInt HalFunction(TInt aGroup, TInt aFunction, TAny* a1, TAny* a2);	/**<@internalAll */
+	IMPORT_C static TInt HalFunction(TInt aGroup, TInt aFunction, TAny* a1, TAny* a2, TInt aDeviceNumber);	/**<@internalAll */
+	IMPORT_C static TInt HalGet(TInt,TAny*);	/**<@internalAll */ // redundant - only here for BC
+	IMPORT_C static TInt HalSet(TInt,TAny*);	/**<@internalAll */ // redundant - only here for BC
+	IMPORT_C static TInt SetMemoryThresholds(TInt aLowThreshold, TInt aGoodThreshold); /**<@internalAll */
+	IMPORT_C static TBool IpcV1Available();	/**<@internalAll */
+	IMPORT_C static TLinAddr ExceptionDescriptor(TLinAddr aCodeAddress); /**< @internalTechnology */
+	IMPORT_C static TInt LocalePropertiesSetDefaults();	/**< @internalTechnology */
+	};
+
+#endif
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32/include/e32test.h	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,369 @@
+// Copyright (c) 1994-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32\include\e32test.h
+// 
+//
+
+/**
+ @file e32test.h
+ @publishedAll
+ @released
+*/
+
+#ifndef __E32TEST_H__
+#define __E32TEST_H__
+#include <e32std.h>
+#include <e32std_private.h>
+#include <e32base_private.h>
+#include <e32base.h>
+#include <e32cons.h>
+#include <e32ver.h>
+#include <e32kpan.h>
+#include <cpudefs.h>
+#include <e32debug.h>
+#include <e32def_private.h>
+#include <e32event_private.h>
+
+
+/**
+Test console.
+
+The class creates a console window to which test results can be logged
+through the various overloads of the operator().
+*/
+class RTest
+	{
+public:
+	IMPORT_C RTest(const TDesC &aTitle,TInt aThrowaway,const TText* anOtherThrowaway);
+	IMPORT_C RTest(const TDesC &aTitle,TInt aThrowaway);
+	IMPORT_C RTest(const TDesC &aTitle);
+	IMPORT_C void Close();
+	IMPORT_C void Title();
+	IMPORT_C void Start(const TDesC &aHeading);
+	IMPORT_C void Next(const TDesC &aHeading);
+	IMPORT_C void End();
+	IMPORT_C void operator()(TInt aResult,TInt aLineNum,const TText* aFileName);
+	IMPORT_C void operator()(TInt aResult,TInt aLineNum);
+	IMPORT_C void operator()(TInt aResult);
+	IMPORT_C void Panic(TInt anError,TRefByValue<const TDesC> aFmt,...);
+	IMPORT_C void Panic(TRefByValue<const TDesC> aFmt,...);
+	IMPORT_C void Printf(TRefByValue<const TDesC> aFmt,...);
+	IMPORT_C TKeyCode Getch();
+	inline static const TAny* String(TInt aSel,const TText8 *aBuf1,const TText16 *aBuf2);
+	inline CConsoleBase* Console() const;
+	inline void SetConsole(CConsoleBase* aConsole);
+	inline TBool Logged() const;
+	inline void SetLogged(TBool aToLog);
+	inline void HandleError(TInt aError, TInt aLine, const TText* aFileName);
+	inline void HandleNull(TInt aLine, const TText* aFileName);
+	inline void HandleNotEqual(TInt aExpected, TInt aActual, TInt aLine, const TText* aFileName);
+	inline void HandleFailedCompare(TInt aLeft, const TText* aComp, TInt aRight, TInt aLine, const TText* aFileName);
+	inline void HandleValue(TInt aValue,  TInt aLine, const TText* aFileName);
+
+	IMPORT_C static TInt CloseHandleAndWaitForDestruction(RHandleBase& aH);	/**< @internalTechnology */
+
+protected:
+	void CheckConsoleCreated();
+	void DisplayLevel();
+	inline void Push();
+	inline void Pop();
+private:
+	enum {EMaxStack=0x100,EMaxBuffer=0x100};
+private:
+	TInt	iTest;
+	TInt	iCheck;
+	TInt	iLevel;
+	TBool	iLogging;
+	CConsoleBase *iConsole;
+	TBuf<0x40> iTitle;
+	TInt iStack[EMaxStack];
+	TText iBuf[EMaxBuffer];
+	};
+
+
+
+
+/**
+Gets the console.
+
+@return A pointer to the console object.
+*/
+inline CConsoleBase* RTest::Console() const
+	{ return(iConsole); }
+
+	
+	
+	
+/**
+Utility function that returns a pointer to the specified TText8* argument
+or the TText16* argument depending on the value of the aSel argument.
+
+@param aSel  An integer containing the size of a TText8 type or TText16 type.
+@param aBuf1 A pointer to 8-bit text.
+@param aBuf2 A pointer to 16-bit text.
+
+@return A pointer to aBuf1, if the value of aSel is the size of a TText8 type,
+        otherwise a pointer to aBuf2.
+*/	
+inline const TAny *RTest::String(TInt aSel,const TText8 *aBuf1,const TText16 *aBuf2)
+	{ return(aSel == sizeof(TText8) ? (TAny *)aBuf1 : (TAny *)aBuf2); }
+
+
+
+/**
+@internalComponent
+*/
+inline void RTest::Push()
+	{ iStack[iLevel++] = iTest; iTest = 0; }
+
+
+
+/**
+@internalComponent
+*/
+inline void RTest::Pop()
+	{ iTest = iStack[--iLevel]; }
+
+
+
+
+/**
+Sets the console.
+
+@param aConsole A pointer to the console object to be used.
+*/	
+inline void RTest::SetConsole(CConsoleBase* aConsole)
+    { iConsole = aConsole; }
+
+
+
+
+/**
+Tests whether the logging flag is set.
+
+If the logging flag is set, console output is also written to
+the debug output as represented by a RDebug object.
+
+@return True, if the logging flag is set, false otherwise.
+*/	
+inline TBool RTest::Logged() const
+	{ return(iLogging); }
+
+
+
+
+/**
+Sets the logging flag.
+
+If the logging flag is set, console output is also written to
+the debug output as represented by a RDebug object.
+
+@param aToLog ETrue, if the logging flag is to be set, EFalse, otherwise.
+*/	
+inline void RTest::SetLogged(TBool aToLog)
+	{ iLogging = aToLog; }
+
+
+
+
+// test equivalent of _L
+/**
+@internalComponent
+*/
+#define _TL(a) (S*)RTest::String(sizeof(S),(TText8*)a,(TText16*)L ## a) 
+
+// the next two, slightly confusing, macros are necessary in order
+// to enable proper string merging with certain compilers.
+
+/**
+@internalComponent
+*/
+#define __test(x,l,f) test(x,l,_S(f))
+
+/**
+@internalComponent
+*/
+#define test(x) __test(x,__LINE__,__FILE__)
+
+
+#ifdef __E32TEST_EXTENSION__
+
+/**
+@internalComponent
+*/
+#define __S(f) _S(f)
+
+/**
+@internalComponent
+
+Panics and displays an appropriate error message if x is less then zero (Indicating an error code).
+*/
+#define test_NotNegative(x) { TInt _r = (x); if (_r < 0) test.HandleError(_r, __LINE__,__S(__FILE__)); }
+
+/**
+@internalComponent
+
+Panics and displays an appropriate error message if x is not equal to KErrNone.
+*/
+#define test_KErrNone(x) { TInt _r = (x); if (_r !=KErrNone) test.HandleError(_r, __LINE__,__S(__FILE__)); }
+
+/**
+@internalComponent
+
+Panics and displays an appropriate error message if the trapped statement/block x leaves.
+*/
+#define test_TRAP(x) { TRAPD(_r, x); if (_r != KErrNone) test.HandleError(_r, __LINE__,__S(__FILE__)); }
+
+/**
+@internalComponent
+
+Panics and displays an appropriate error message if x is not equal to NULL.
+*/
+#define test_NotNull(x) { TAny* _a = (TAny*)(x); if (_a == NULL) test.HandleNull(__LINE__,__S(__FILE__)); }
+/**
+@internalComponent
+
+Panics and displays an appropriate error message if e (expected) is not equal to a (actual).
+*/
+#define test_Equal(e, a) { TInt _e = TInt(e); TInt _a = TInt(a); if (_e != _a) test.HandleNotEqual(_e, _a, __LINE__,__S(__FILE__)); }
+
+/**
+@internalComponent
+
+Panics and displays an appropriate error message if the comparison specified with operator b, between a and c, is EFalse.
+*/
+#define test_Compare(a,b,c)  {TInt _a = TInt(a); TInt _c = TInt(c); if (!(_a b _c)) test.HandleFailedCompare(_a, __S(#b), _c, __LINE__,__S(__FILE__)); }
+
+
+/**
+@internalComponent
+
+Panics and displays an appropriate error message displaying v, if the expression e is false.
+*/
+#define test_Value(v, e) if (!(e)) test.HandleValue(v,  __LINE__,__S(__FILE__));
+
+/**
+@internalComponent
+
+If expression e is false, statement s is executed then a Panic is raised.
+*/
+#define test_Assert(e,s) if(!(e)) {s; test.operator()(EFalse, __LINE__,__S(__FILE__)); }
+	
+	
+
+#endif
+
+
+/**
+Prints a failure message, including an error code at the console and raises a panic.
+
+
+@param aError	 The error code to be printed in the failure massage.
+@param aLineNum  A line number that is printed in the failure message.
+@param aFileName A file name that is printed in the failure message.
+                 
+@panic USER 84 Always.
+*/
+inline void RTest::HandleError(TInt aError, TInt aLine, const TText* aFileName)
+	{
+	RDebug::Printf("RTEST: Error %d at line %d", aError,aLine);
+	Printf(_L("RTEST: Error %d\n"), aError);
+	operator()(EFalse, aLine, aFileName);
+	}
+/**
+Prints a failure message indicating null was encountered, at the console and raises a panic.
+
+@param aLineNum  A line number that is printed in the failure message.
+@param aFileName A file name that is printed in the failure message.
+                 
+@panic USER 84 Always.
+*/
+
+inline void RTest::HandleNull(TInt aLine, const TText* aFileName)
+	{
+	RDebug::Printf("RTEST: Null value at line %d", aLine);
+	Printf(_L("RTEST: Null value\n"));
+	operator()(EFalse, aLine, aFileName);
+	}
+
+
+/**
+Prints a failure message indicating that two value (also printed) where not equal, at the console and raises a panic.
+
+@param aExpected The value that is to be printed as expected.
+@param aActual	 The value that is to be printed as being actually received.
+@param aLineNum  A line number that is printed in the failure message.
+@param aFileName A file name that is printed in the failure message.
+                 
+@panic USER 84 Always.
+*/
+
+inline void RTest::HandleNotEqual(TInt aExpected, TInt aActual, TInt aLine, const TText* aFileName)
+	{
+	RDebug::Printf("RTEST: Expected 0x%x (%d) but got 0x%x (%d) at line %d", aExpected,aExpected,aActual,aActual,aLine);
+	Printf(_L("RTEST: Expected 0x%x (%d) but got 0x%x (%d)\n"), aExpected,aExpected,aActual,aActual);
+	operator()(EFalse, aLine, aFileName);
+	}
+
+
+/**
+Prints a failure message indicating that a comparison between two values (also printed) resulted in EFalse,
+at the console and raises a panic.
+
+@param aLeft 	 The left value of the comparison.
+@param aComp	 A string representing the comparison operator.
+@param aRight	 The right value of the comparison.
+@param aLineNum  A line number that is printed in the failure message.
+@param aFileName A file name that is printed in the failure message.
+                 
+@panic USER 84 Always.
+*/
+inline void RTest::HandleFailedCompare(TInt aLeft, const TText* aComp, TInt aRight, TInt aLine, const TText* aFileName)
+	{
+	RDebug::Printf("RTEST: (0x%x (%d) %s 0x%x (%d)) == EFalse at line %d", aLeft,aLeft,aComp,aRight,aRight,aLine);
+	Printf(_L("RTEST: (0x%x (%d) %s 0x%x (%d)) == EFalse\n"), aLeft,aLeft,aComp, aRight,aRight);
+	operator()(EFalse, aLine, aFileName);
+	}
+
+
+/**
+Prints a failure message indicating that aValue was not an expected value, at the console and raises a panic.
+
+@param aValue The value that is to be printed as not being an expected value.
+@param aLineNum  A line number that is printed in the failure message.
+@param aFileName A file name that is printed in the failure message.
+                 
+@panic USER 84 Always.
+*/
+inline void RTest::HandleValue(TInt aValue,  TInt aLine, const TText* aFileName)
+	{
+	Printf(_L("RTEST: %d (0x%x) was not an expected value.\n"), aValue, aValue);
+	operator()(EFalse, aLine, aFileName);
+	}
+
+
+/**
+@internalTechnology
+*/
+_LIT(KLitCloseAndWait,"Close&Wait");
+
+/**
+@internalTechnology
+*/
+#define CLOSE_AND_WAIT(h)	((void)(RTest::CloseHandleAndWaitForDestruction(h) && (User::Panic(KLitCloseAndWait,__LINE__),1)))
+
+
+
+#endif
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32/include/e32ver.h	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,42 @@
+// Copyright (c) 1994-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32\include\e32ver.h
+// 
+//
+
+/**
+ @file
+ @internalComponent
+*/
+
+#ifndef __E32VER_H__
+#define __E32VER_H__
+
+const TInt KE32MajorVersionNumber=2;
+const TInt KE32MinorVersionNumber=0;
+const TInt KE32BuildVersionNumber=1997;
+
+const TInt KMachineConfigurationMajorVersionNumber=1;
+const TInt KMachineConfigurationMinorVersionNumber=0;
+const TInt KMachineConfigurationBuildVersionNumber=110;
+
+const TInt KMediaDriverInterfaceMajorVersionNumber=2;
+const TInt KMediaDriverInterfaceMinorVersionNumber=0;
+const TInt KMediaDriverInterfaceBuildVersionNumber=141;
+
+const TInt KNotifierMajorVersionNumber=1;
+const TInt KNotifierMinorVersionNumber=0;
+const TInt KNotifierBuildVersionNumber=110;
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32/include/partitions.h	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,197 @@
+// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32\include\partitions.h
+// 
+//
+
+/**
+ @file
+ @internalTechnology
+*/
+
+#ifndef __PARTITIONS_H__
+#define __PARTITIONS_H__
+#include <e32def.h>
+
+const TUint KPartitionTypeEmpty=0x00;
+const TUint KPartitionTypeFAT12=0x01;
+const TUint KPartitionTypeXENIXroot=0x02;
+const TUint KPartitionTypeXENIXusr=0x03;
+const TUint KPartitionTypeFAT16small=0x04;
+const TUint KPartitionTypeExtended=0x05;
+const TUint KPartitionTypeFAT16=0x06;
+const TUint KPartitionTypeNTFS=0x07;
+const TUint KPartitionTypeAIX=0x08;
+const TUint KPartitionTypeAIXboot=0x09;
+const TUint KPartitionTypeOS2BootManager=0x0a;
+const TUint KPartitionTypeWin95FAT32=0x0b;
+const TUint KPartitionTypeWin95FAT32LBA=0x0c;
+const TUint KPartitionTypeWin95FAT16LBA=0x0e;
+const TUint KPartitionTypeWin95ExtdLBA=0x0f;
+const TUint KPartitionTypeOPUS=0x10;
+const TUint KPartitionTypeHiddenFAT12=0x11;
+const TUint KPartitionTypeCompaqDiag=0x12;
+const TUint KPartitionTypeHiddenFAT16small=0x14;
+const TUint KPartitionTypeHiddenFAT16=0x16;
+const TUint KPartitionTypeHiddenNTFS=0x17;
+const TUint KPartitionTypeASTSmartSleep=0x18;
+const TUint KPartitionTypeHiddenWin95FAT32=0x1b;
+const TUint KPartitionTypeHiddenWin95FAT32LBA=0x1c;
+const TUint KPartitionTypeHiddenWin95FAT16LBA=0x1e;
+const TUint KPartitionTypeNECDOS=0x24;
+const TUint KPartitionTypePlan9=0x39;
+const TUint KPartitionTypePartitionMagic=0x3c;
+const TUint KPartitionTypeVenix80286=0x40;
+const TUint KPartitionTypePPCPRePBoot=0x41;
+const TUint KPartitionTypeSFS=0x42;
+const TUint KPartitionTypeQNX4x=0x4d;
+const TUint KPartitionTypeQNX4x_2=0x4e;
+const TUint KPartitionTypeQNX4x_3=0x4f;
+const TUint KPartitionTypeOnTrackDM=0x50;
+const TUint KPartitionTypeOnTrackDM6Aux=0x51;
+const TUint KPartitionTypeCPM=0x52;
+const TUint KPartitionTypeOnTrackDM6Aux_2=0x53;
+const TUint KPartitionTypeOnTrackDM6=0x54;
+const TUint KPartitionTypeEZDrive=0x55;
+const TUint KPartitionTypeGoldenBow=0x56;
+const TUint KPartitionTypePriamEdisk=0x5c;
+const TUint KPartitionTypeSpeedStor=0x61;
+const TUint KPartitionTypeGNU_HURD=0x63;
+const TUint KPartitionTypeNovellNetware=0x64;
+const TUint KPartitionTypeNovellNetware_2=0x65;
+const TUint KPartitionTypeDiskSecure=0x70;
+const TUint KPartitionTypePCIX=0x75;
+const TUint KPartitionTypeOldMinix=0x80;
+const TUint KPartitionTypeMinixOldLinux=0x81;
+const TUint KPartitionTypeLinuxSwap=0x82;
+const TUint KPartitionTypeLinux=0x83;
+const TUint KPartitionTypeOS2Hidden=0x84;
+const TUint KPartitionTypeLinuxExtended=0x85;
+const TUint KPartitionTypeNTFSvolset=0x86;
+const TUint KPartitionTypeNTFSvolset_2=0x87;
+const TUint KPartitionTypeLinuxLVM=0x8e;
+const TUint KPartitionTypeAmoeba=0x93;
+const TUint KPartitionTypeAmoebaBBT=0x94;
+const TUint KPartitionTypeBSD_OS=0x9f;
+const TUint KPartitionTypeIBMThinkpad=0xa0;
+const TUint KPartitionTypeFreeBSD=0xa5;
+const TUint KPartitionTypeOpenBSD=0xa6;
+const TUint KPartitionTypeNeXTSTEP=0xa7;
+const TUint KPartitionTypeNetBSD=0xa9;
+const TUint KPartitionTypeBSDIfs=0xb7;
+const TUint KPartitionTypeBSDIswap=0xb8;
+const TUint KPartitionTypeBootWizardHidden=0xbb;
+const TUint KPartitionTypeDRDOS=0xc1;
+const TUint KPartitionTypeDRDOS_2=0xc4;
+const TUint KPartitionTypeDRDOS_3=0xc6;
+const TUint KPartitionTypeSyrinx=0xc7;
+const TUint KPartitionTypeNonFSData=0xda;
+const TUint KPartitionTypeCPM_CTOS=0xdb;
+const TUint KPartitionTypeDellUtility=0xde;
+const TUint KPartitionTypeBootIt=0xdf;
+const TUint KPartitionTypeDOSaccess=0xe1;
+const TUint KPartitionTypeDOS_RO=0xe3;
+const TUint KPartitionTypeSymbianCrashLog=0xf0;
+const TUint KPartitionTypeSpeedStor_2=0xf1;
+const TUint KPartitionTypeDOSsecondary=0xf2;
+const TUint KPartitionTypeSpeedStor_3=0xf4;
+const TUint	KPartitionTypeRofs=0xfa;			// HACK
+const TUint KPartitionTypeIso9660=0xfb;			// hack
+const TUint KPartitionTypeEneaLFFS=0xfc;		// hack
+const TUint KPartitionTypeLinuxRaidAuto=0xfd;
+const TUint KPartitionTypeLANStep=0xfe;
+const TUint KPartitionTypeBBT=0xff;
+
+inline TBool PartitionIsFAT(TUint a)
+	{
+	return (
+		a==KPartitionTypeFAT12						||
+		a==KPartitionTypeFAT16small					||
+		a==KPartitionTypeFAT16						||
+		a==KPartitionTypeFAT16						||
+		a==KPartitionTypeWin95FAT16LBA				||
+		a==KPartitionTypeHiddenFAT12				||
+		a==KPartitionTypeHiddenFAT16small			||
+		a==KPartitionTypeHiddenFAT16				||
+		a==KPartitionTypeHiddenWin95FAT16LBA
+		);
+	}
+
+inline TBool PartitionIsFAT32(TUint a)
+	{
+	return (
+		a==KPartitionTypeWin95FAT32					||
+		a==KPartitionTypeWin95FAT32LBA				||
+		a==KPartitionTypeHiddenWin95FAT32			||
+		a==KPartitionTypeHiddenWin95FAT32LBA
+		);
+	}
+
+inline TBool PartitionIsNTFS(TUint a)
+	{
+	return (
+		a==KPartitionTypeNTFS						||
+		a==KPartitionTypeHiddenNTFS
+		);
+	}
+
+//
+// Entry in MBR partition table
+//
+const TUint KBootIndicatorBootable=0x80;
+
+class TMBRPartitionEntry
+	{
+public:
+	TBool IsValidPartition()
+		{ return (iNumSectors>0 && iPartitionType!=KPartitionTypeEmpty); }
+	TBool IsValidDosPartition()
+		{ return (iNumSectors>0 && PartitionIsFAT(iPartitionType)); }
+	TBool IsDefaultBootPartition()
+		{ return(iX86BootIndicator==KBootIndicatorBootable && (IsValidDosPartition() || IsValidFAT32Partition())); }
+	TBool IsValidFAT32Partition()
+		{ return (iNumSectors>0 && PartitionIsFAT32(iPartitionType)); }
+public:
+	TUint8 iX86BootIndicator;
+	TUint8 iStartHead;
+	TUint8 iStartSector;
+	TUint8 iStartCylinder;
+	TUint8 iPartitionType;
+	TUint8 iEndHead;
+	TUint8 iEndSector;
+	TUint8 iEndCylinder;
+	TUint32 iFirstSector;
+	TUint32 iNumSectors;
+	};
+
+//
+// Defines for Master boot record
+//
+const TUint KMBRFirstPartitionOffset=0x1BE;
+const TUint KMBRSignatureOffset=0x1FE;
+const TUint KMBRSignature=0xAA55;
+const TInt KMBRMaxPrimaryPartitions=4;
+
+class TMasterBootRecord
+	{
+public:
+	TUint8 iBootCode[KMBRFirstPartitionOffset];
+	TMBRPartitionEntry iPartitionEntry[KMBRMaxPrimaryPartitions];
+	TUint16 iSignature;
+	};
+
+
+
+#endif
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32/include/u32exec.h	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,208 @@
+// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32\include\u32exec.h
+// 
+//
+
+/**
+ @file
+ @internalComponent
+*/
+
+#ifndef __U32EXEC_H__
+#define __U32EXEC_H__
+#include <u32std.h>
+#include <cpudefs.h>
+
+#ifdef __KERNEL_MODE__
+#define	EXEC_INT64		Int64
+#define	EXEC_TIME		TTimeK
+#else
+#define	EXEC_INT64		TInt64
+#define	EXEC_TIME		TInt64
+#endif
+
+#define __EXECDECL__	__NAKED__
+
+#if defined(__WINS__)
+
+// Executive call macros for WINS
+
+#define EXECUTIVE_FAST	0x00800000
+#define EXECUTIVE_SLOW	0x00000000
+
+#define __DISPATCH(func)			\
+	__asm lea	edx, [esp + 0x4]	\
+	__asm mov	ecx, (func)			\
+	__asm jmp  [TheDispatcher]
+
+#define	FAST_EXEC0(n)	__DISPATCH((n)|EXECUTIVE_FAST)
+#define	FAST_EXEC1(n)	__DISPATCH((n)|EXECUTIVE_FAST)
+#define	SLOW_EXEC0(n)	__DISPATCH((n)|EXECUTIVE_SLOW)
+#define	SLOW_EXEC1(n)	__DISPATCH((n)|EXECUTIVE_SLOW)
+#define	SLOW_EXEC2(n)	__DISPATCH((n)|EXECUTIVE_SLOW)
+#define SLOW_EXEC3(n)	__DISPATCH((n)|EXECUTIVE_SLOW)
+#define SLOW_EXEC4(n)	__DISPATCH((n)|EXECUTIVE_SLOW)
+
+#define	KFAST_EXEC0(n)	__DISPATCH((n)|EXECUTIVE_FAST)
+#define	KFAST_EXEC1(n)	__DISPATCH((n)|EXECUTIVE_FAST)
+#define	KSLOW_EXEC0(n)	__DISPATCH((n)|EXECUTIVE_SLOW)
+#define	KSLOW_EXEC1(n)	__DISPATCH((n)|EXECUTIVE_SLOW)
+#define	KSLOW_EXEC2(n)	__DISPATCH((n)|EXECUTIVE_SLOW)
+#define KSLOW_EXEC3(n)	__DISPATCH((n)|EXECUTIVE_SLOW)
+#define KSLOW_EXEC4(n)	__DISPATCH((n)|EXECUTIVE_SLOW)
+
+#elif defined(__CPU_X86)
+
+// Executive call macros for X86
+#ifdef __GCC32__
+#define	FAST_EXEC0(n)	asm("mov eax, %0": :"i"(n)); \
+						asm("int 0x20 \n ret")
+#define	FAST_EXEC1(n)	asm("mov eax, %0": :"i"(n)); \
+						asm("mov ecx, [esp+4] \n int 0x20 \n ret")
+#define	SLOW_EXEC0(n)	asm("mov eax, %0": :"i"(n)); \
+						asm("int 0x21 \n ret")
+#define	SLOW_EXEC1(n)	asm("mov eax, %0": :"i"(n)); \
+						asm("mov ecx, [esp+4] \n int 0x21 \n ret")
+#define	SLOW_EXEC2(n)	asm("mov eax, %0": :"i"(n)); \
+						asm("mov ecx, [esp+4] \n mov edx, [esp+8] \n int 0x21 \n ret")
+#define SLOW_EXEC3(n)	asm("mov eax, %0": :"i"(n)); \
+						asm("push ebx         \n" \
+							"mov ecx, [esp+8] \n" \
+							"mov edx, [esp+12]\n" \
+							"mov ebx, [esp+16]\n" \
+							"int 0x21         \n" \
+							"pop ebx          \n" \
+						    "ret")
+
+#define SLOW_EXEC4(n)	asm("mov eax, %0": :"i"(n)); \
+						asm("push ebx         \n" \
+							"push esi         \n" \
+							"mov ecx, [esp+12]\n" \
+							"mov edx, [esp+16]\n" \
+							"mov ebx, [esp+20]\n" \
+							"mov esi, [esp+24]\n" \
+							"int 0x21         \n" \
+							"pop esi          \n" \
+							"pop ebx          \n" \
+							"ret")
+#else
+#define	FAST_EXEC0(n)	_asm mov eax, n _asm int 20h _asm ret
+#define	FAST_EXEC1(n)	_asm mov eax, n _asm mov ecx, [esp+4] _asm int 20h _asm ret
+
+#define	SLOW_EXEC0(n)	_asm mov eax, n _asm int 21h _asm ret
+#define	SLOW_EXEC1(n)	_asm mov eax, n _asm mov ecx, [esp+4] _asm int 21h _asm ret
+#define	SLOW_EXEC2(n)	_asm mov eax, n _asm mov ecx, [esp+4] _asm mov edx, [esp+8] _asm int 21h _asm ret
+
+#define SLOW_EXEC3(n)	_asm mov eax, n			\
+						_asm push ebx			\
+						_asm mov ecx, [esp+8]	\
+						_asm mov edx, [esp+12]	\
+						_asm mov ebx, [esp+16]	\
+						_asm int 21h			\
+						_asm pop ebx			\
+						_asm ret
+
+#define SLOW_EXEC4(n)	_asm mov eax, n			\
+						_asm push ebx			\
+						_asm push esi			\
+						_asm mov ecx, [esp+12]	\
+						_asm mov edx, [esp+16]	\
+						_asm mov ebx, [esp+20]	\
+						_asm mov esi, [esp+24]	\
+						_asm int 21h			\
+						_asm pop esi			\
+						_asm pop ebx			\
+						_asm ret
+#endif
+
+#define	KFAST_EXEC0(n)	FAST_EXEC0(n)
+#define	KFAST_EXEC1(n)	FAST_EXEC1(n)
+#define	KSLOW_EXEC0(n)	SLOW_EXEC0(n)
+#define	KSLOW_EXEC1(n)	SLOW_EXEC1(n)
+#define	KSLOW_EXEC2(n)	SLOW_EXEC2(n)
+#define KSLOW_EXEC3(n)	SLOW_EXEC3(n)
+#define KSLOW_EXEC4(n)	SLOW_EXEC4(n)
+
+#elif defined(__CPU_ARM)
+
+// Executive call macros for ARM
+
+#define EXECUTIVE_FAST	0x00800000
+#define EXECUTIVE_SLOW	0x00000000
+
+#define __DISPATCH(n)				\
+	asm("swi %a0" : : "i" (n));     \
+	__JUMP(,lr);
+
+#define	FAST_EXEC0(n)		__DISPATCH((n)|EXECUTIVE_FAST)
+#define	FAST_EXEC1(n)		__DISPATCH((n)|EXECUTIVE_FAST)
+#define	SLOW_EXEC0(n)		__DISPATCH((n)|EXECUTIVE_SLOW)
+#define	SLOW_EXEC1(n)		__DISPATCH((n)|EXECUTIVE_SLOW)
+#define	SLOW_EXEC2(n)		__DISPATCH((n)|EXECUTIVE_SLOW)
+#define SLOW_EXEC3(n)		__DISPATCH((n)|EXECUTIVE_SLOW)
+#define SLOW_EXEC4(n)		__DISPATCH((n)|EXECUTIVE_SLOW)
+
+#define __KDISPATCH(n)				\
+	asm("stmfd sp!, {ip,lr} ");		\
+	asm("swi %a0" : : "i" (n));     \
+	__POPRET("ip,");
+
+#define	KFAST_EXEC0(n)		__KDISPATCH((n)|EXECUTIVE_FAST)
+#define	KFAST_EXEC1(n)		__KDISPATCH((n)|EXECUTIVE_FAST)
+#define	KSLOW_EXEC0(n)		__KDISPATCH((n)|EXECUTIVE_SLOW)
+#define	KSLOW_EXEC1(n)		__KDISPATCH((n)|EXECUTIVE_SLOW)
+#define	KSLOW_EXEC2(n)		__KDISPATCH((n)|EXECUTIVE_SLOW)
+#define KSLOW_EXEC3(n)		__KDISPATCH((n)|EXECUTIVE_SLOW)
+#define KSLOW_EXEC4(n)		__KDISPATCH((n)|EXECUTIVE_SLOW)
+
+#define __DISPATCH_NR(n)			\
+	asm("swi %a0" : : "i" (n));
+
+#define	FAST_EXEC0_NR(n)	__DISPATCH_NR((n)|EXECUTIVE_FAST)
+#define	FAST_EXEC1_NR(n)	__DISPATCH_NR((n)|EXECUTIVE_FAST)
+#define	SLOW_EXEC0_NR(n)	__DISPATCH_NR((n)|EXECUTIVE_SLOW)
+#define	SLOW_EXEC1_NR(n)	__DISPATCH_NR((n)|EXECUTIVE_SLOW)
+#define	SLOW_EXEC2_NR(n)	__DISPATCH_NR((n)|EXECUTIVE_SLOW)
+#define SLOW_EXEC3_NR(n)	__DISPATCH_NR((n)|EXECUTIVE_SLOW)
+#define SLOW_EXEC4_NR(n)	__DISPATCH_NR((n)|EXECUTIVE_SLOW)
+
+#define __KDISPATCH_NR(n)			\
+	asm("swi %a0" : : "i" (n));
+
+#define	KFAST_EXEC0_NR(n)	__KDISPATCH_NR((n)|EXECUTIVE_FAST)
+#define	KFAST_EXEC1_NR(n)	__KDISPATCH_NR((n)|EXECUTIVE_FAST)
+#define	KSLOW_EXEC0_NR(n)	__KDISPATCH_NR((n)|EXECUTIVE_SLOW)
+#define	KSLOW_EXEC1_NR(n)	__KDISPATCH_NR((n)|EXECUTIVE_SLOW)
+#define	KSLOW_EXEC2_NR(n)	__KDISPATCH_NR((n)|EXECUTIVE_SLOW)
+#define KSLOW_EXEC3_NR(n)	__KDISPATCH_NR((n)|EXECUTIVE_SLOW)
+#define KSLOW_EXEC4_NR(n)	__KDISPATCH_NR((n)|EXECUTIVE_SLOW)
+
+#else
+#error Unknown CPU
+#endif
+
+#ifdef __LEAVE_EQUALS_THROW__
+// Hide TTrap to catch unwary uses of the old cleanup
+// mechanism at compile time
+class TTrap;
+#endif //__LEAVE_EQUALS_THROW__
+
+#include <exec_enum.h>
+#ifndef __TOOLS2__
+#include <e32btrace.h>
+#endif
+#include <exec_user.h>
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32/include/u32hal.h	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,2969 @@
+// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32\include\u32hal.h
+// 
+//
+
+#ifndef __U32HAL_H__
+#define __U32HAL_H__
+
+#include <e32cmn.h>
+
+//
+// Classes used for in functions
+//
+
+/**
+Used for TVariantInfoV01::iLedCapabilities
+@publishedPartner
+@released
+*/
+const TUint KLedMaskRed1=0x00000001;
+
+/**
+Used for TVariantInfoV01::iLedCapabilities
+@publishedPartner
+@released
+*/
+const TUint KLedMaskGreen1=0x00000002;
+
+/**
+Used for TVariantInfoV01::iLedCapabilities
+@publishedPartner
+@released
+*/
+const TUint KLedMaskYellow1=0x00000004;
+
+/**
+Used for TSupplyInfoV1.iFlags
+@publishedPartner
+@deprecated Unused by Symbian code
+*/
+const TUint KSupplyFlagSoundWarning=0x00000001;
+
+/**
+Used for TSupplyInfoV1.iFlags
+@publishedPartner
+@deprecated Unused by Symbian code
+*/
+const TUint KSupplyFlagBacklightWarning=0x00000002;
+
+/**
+Used for TSupplyInfoV1.iFlags
+@publishedPartner
+@deprecated Unused by Symbian code
+*/
+const TUint KSupplyFlagTimeChanged=0x80000000;
+
+/**
+@internalComponent
+@deprecated Unused by Symbian code
+*/
+class TClearSetMask
+	{
+public:
+	TUint iClearMask;
+	TUint iSetMask;
+	};
+
+/**
+@internalTechnology
+@deprecated Unused by Symbian code
+*/
+enum TSupplyStatus
+	{
+	EZero,EVeryLow,ELow,EGood
+	};
+
+/**
+@internalTechnology
+@deprecated Unused by Symbian code
+*/
+class TSupplyInfoV1
+	{
+public:
+	SInt64 iMainBatteryInsertionTime;
+	TSupplyStatus iMainBatteryStatus;
+	SInt64 iMainBatteryInUseMicroSeconds;
+	TInt iCurrentConsumptionMilliAmps;
+	TInt iMainBatteryConsumedMilliAmpSeconds;
+	TInt iMainBatteryMilliVolts;
+	TInt iMainBatteryMaxMilliVolts;
+	TSupplyStatus iBackupBatteryStatus;
+	TInt iBackupBatteryMilliVolts;
+	TInt iBackupBatteryMaxMilliVolts;
+	TBool iExternalPowerPresent;
+	SInt64 iExternalPowerInUseMicroSeconds;
+	TUint iFlags;
+	};
+
+/**
+@internalTechnology
+@deprecated Unused by Symbian code
+*/
+typedef TPckgBuf<TSupplyInfoV1> TSupplyInfoV1Buf;
+
+/**
+@publishedPartner
+@deprecated Unused by Symbian code
+*/
+class TMouseProperties
+	{
+public:
+	TUint8 iSpeed;
+	TUint8 iAcceleration;
+	};
+
+/**
+@internalTechnology Used by Symbian base ports
+@deprecated Unused by Symbian code
+*/
+class TSoundInfoV1
+	{
+public:
+	TBool iKeyClickEnabled;
+	TBool iKeyClickLoud;
+	TBool iKeyClickOverridden;
+	TBool iPointerClickEnabled;
+	TBool iPointerClickLoud;
+	TBool iBeepEnabled;
+	TBool iBeepLoud;
+	TBool iSoundDriverEnabled;
+	TBool iSoundDriverLoud;
+	TBool iSoundEnabled;
+	};
+
+/**
+@internalTechnology
+@deprecated Unused by Symbian code
+*/
+typedef TPckgBuf<TSoundInfoV1> TSoundInfoV1Buf;
+
+/**
+@internalTechnology Used by Symbian base ports
+*/
+class TOnOffInfoV1
+	{
+public:
+	TBool iPointerSwitchesOn;
+	TBool iCaseOpenSwitchesOn;
+	TBool iCaseCloseSwitchesOff;
+	};
+
+/**
+@internalTechnology
+@deprecated Unused by Symbian code
+*/
+typedef TPckgBuf<TOnOffInfoV1> TOnOffInfoV1Buf;
+
+/**
+@internalTechnology
+@removed Unused by Symbian code
+*/
+enum TUserMediaFunction {EUserMediaRemount,EUserMediaNotifyChange};
+
+
+
+
+//
+// Hal function enumerations
+//
+
+/**
+@publishedPartner
+@released
+
+Defines the set of HAL groups.
+
+Each HAL group has an associated HAL handler. Note that the
+HAL handlers for EHalGroupKernel and EHalGroupEmulator are internal
+to Symbian OS.
+
+See the Base Porting Guide documentation in the developer library for
+more information on HAL groups.
+*/
+enum THalFunctionGroup
+	{
+	/**
+	@internalComponent
+	
+	The HAL group associated with kernel related information; for example
+	the reason for the most recent system boot.
+	
+	The function-ids associated with this HAL group are defined by the set
+    of TKernelHalFunction enum values.
+    */
+	EHalGroupKernel=0,
+
+
+    /**
+    The HAL group associated with Variant specific hardware.
+    
+    This HAL handler is implemented by the Variant, specifically by
+    the base port's implementation of Asic::VariantHal().
+    
+    The function-ids associated with this HAL group are defined by the set
+    of TVariantHalFunction enum values. See the individual function-ids for
+    the associated capabilities.
+
+    @see TVariantHalFunction
+    @see Asic::VariantHal()
+    */
+	EHalGroupVariant=1,
+
+
+    /**
+    The HAL group associated with the media driver.
+    
+    It is used internally by the media driver LDD.
+    
+    The function-ids associated with this HAL group are defined by the set
+    of TMediaHalFunction enum values. See the individual function-ids for
+    the associated capabilities.
+    
+    @see TMediaHalFunction
+    */
+	EHalGroupMedia=2,
+
+
+    /**
+    The HAL group associated with power handling.
+    
+    This HAL handler is implemented by the power model.
+    
+    The function-ids associated with this HAL group are defined by the set
+    of TPowerHalFunction enum values. See the individual function-ids for
+    the associated capabilities.
+		
+	@see TPowerHalFunction
+    */
+	EHalGroupPower=3,
+	
+	
+	/**
+	The HAL group associated with the main screen display.
+	
+	This HAL handler is implemented by the screen (i.e. LCD or video driver).
+	
+    The function-ids associated with this HAL group are defined by the set
+    of TDisplayHalFunction enum values. See the individual function-ids for
+    the associated capabilities.
+		
+	@see TDisplayHalFunction
+	*/
+	EHalGroupDisplay=4,
+
+
+    /**
+    The HAL group associated with the digitiser (i.e. pen or stylus).
+    
+    This HAL handler is implemented by the digitiser.
+    
+    The function-ids associated with this HAL group are defined by the set
+    of TDigitiserHalFunction enum values. See the individual function-ids for
+    the associated capabilities.
+    
+    @see TDigitiserHalFunction
+    */
+	EHalGroupDigitiser=5,
+
+
+    /**
+    The HAL group associated with a sound driver.
+    	
+   	This group is provided by Symbian OS for backwards compatibility with
+   	the Psion Series 5MX devices.
+   	
+   	The function-ids associated with this HAL group are defined by the set
+    of TSoundHalFunction enum values. See the individual function-ids for
+    the associated capabilities.
+    
+    @see TSoundHalFunction
+    */
+	EHalGroupSound=6,
+
+
+    /**
+	The HAL group associated with a mouse-type device.
+	
+	In Symbian OS, the the only example of a mouse device is in the emulator,
+	and this is a port of Symbian OS maintained by Symbian.
+	
+    The function-ids associated with this HAL group are defined by the set
+    of TMouseHalFunction enum values. See the individual function-ids for
+    the associated capabilities.
+		
+	@see TMouseHalFunction
+    */
+	EHalGroupMouse=7,
+
+
+	/**
+	@internalComponent
+	
+	The HAL group associated with the emulator.
+	
+	The function-ids associated with this HAL group are defined by the set
+    of TEmulatorHalFunction enum values.
+	*/
+	EHalGroupEmulator=8,
+
+
+    /**
+    The HAL group associated with the keyboard.
+    
+    This HAL handler is implemented by the keyboard driver.
+    
+    The function-ids associated with this HAL group are defined by the set
+    of TKeyboardHalFunction enum values. See the individual function-ids for
+    the associated capabilities.
+    
+    @see TKeyboardHalFunction
+    */
+	EHalGroupKeyboard=9,
+
+	/*
+    The HAL group associated with the virtual memory system.
+
+	The function-ids associated with this HAL group are defined by the set
+    of TVMHalFunction enum values.
+
+    @see TVMHalFunction
+	*/
+	EHalGroupVM=10,
+
+	/*
+    The HAL group associated with the RAM Zone configuration.
+
+	The function-ids associated with this HAL group are defined by the set
+    of TRamHalFunction enum values.
+
+    @see TRamHalFunction
+	*/
+	EHalGroupRam=11,
+
+	/**
+	Reserved for platform specific use.
+	*/
+	EHalGroupPlatformSpecific1=29,
+
+	/**
+	Reserved for platform specific use.
+	*/
+	EHalGroupPlatformSpecific2=30
+	};
+
+
+
+
+/**
+@internalComponent
+*/
+enum TKernelHalFunction
+	{
+	EKernelHalMemoryInfo,
+	EKernelHalRomInfo,
+	EKernelHalStartupReason,
+	EKernelHalFaultReason,
+	EKernelHalExceptionId,
+	EKernelHalExceptionInfo,
+	EKernelHalCpuInfo,
+	EKernelHalPageSizeInBytes,
+	EKernelHalTickPeriod,
+	EKernelHalMemModelInfo,
+	EKernelHalFastCounterFrequency,
+	EKernelHalNTickPeriod,
+	EKernelHalHardwareFloatingPoint,
+	EKernelHalGetNonsecureClockOffset,
+	EKernelHalSetNonsecureClockOffset,
+	EKernelHalSmpSupported,
+	EKernelHalNumLogicalCpus,
+	EKernelHalSupervisorBarrier,
+	EKernelHalFloatingPointSystemId,
+	EKernelHalLockThreadToCpu,
+	EKernelHalConfigFlags,
+	};
+
+
+
+
+/**
+@publishedPartner
+@released
+
+The set of function-ids that are  associated with the EHalGroupVariant
+HAL group.
+
+Each enum value represents a specific characteristic of the Variant,
+and is passed as the second parameter to
+the HAL handler function dealing with this group.
+ 
+@see EHalGroupVariant
+*/
+enum TVariantHalFunction
+	{
+	/**
+	Gets Variant specifc information.
+	
+	Requirements of the HAL function handler's 2nd, 3rd and 4th parameters:
+	
+	- TInt aFunction : This enum value.
+	    
+	- TAny* a1 : This is a pointer to a package buffer (TPckgBuf) containing a
+	TVariantInfoV01 structure. The HAL function needs to fill the members of
+	this structure with the appropriate information.
+									
+	- TAny* a2 : NULL.
+
+	An example of this function can be found in the Variant template;
+	see the function: 
+	@code
+	Template::VariantHal()
+	@endcode
+	in  
+	@code
+	...\template\template_variant\specific\variant.cpp
+	@endcode
+	
+	@see TVariantInfoV01
+    @see TPckgBuf
+	*/
+	EVariantHalVariantInfo,
+
+
+	/**
+	Sets the debug port number.
+	
+	Requirements of the HAL function handler's 2nd, 3rd and 4th parameters:
+	
+	- TInt aFunction : This enum value.
+
+	- TAny* a1 : A TInt value containing the debug port number.
+									
+	- TAny* a2 : NULL.
+
+	An example of this function can be found in the Variant template;
+	see the function: 
+	@code
+	Template::VariantHal()
+	@endcode
+	in  
+	@code
+	...\template\template_variant\specific\variant.cpp
+	@endcode
+	*/
+	EVariantHalDebugPortSet,
+
+
+	/**
+	Gets the debug port number.
+	
+	Requirements of the HAL function handler's 2nd, 3rd and 4th parameters:
+	
+	- TInt aFunction : This enum value.
+
+    - TAny* a1 : A TInt value into which the HAL handler puts the debug port value
+    									
+	- TAny* a2 : NULL.
+
+	An example of this function can be found in the Variant template;
+	see the function: 
+	@code
+	Template::VariantHal()
+	@endcode
+	in  
+	@code
+	...\template\template_variant\specific\variant.cpp
+	@endcode
+	*/
+	EVariantHalDebugPortGet,
+
+
+	/**
+	Sets the current state of each LED. 
+	
+	Requirements of the HAL function handler's 2nd, 3rd and 4th parameters:
+	
+	- TInt aFunction : This enum value.
+
+    - TAny* a1 : A TUint value containing the bitmask that
+    describes the state of the LEDs. For each bit in the mask, 0 = OFF, 1 = ON.
+    									
+	- TAny* a2 : NULL.
+	
+	An example of this function can be found in the Variant template;
+	see the function: 
+	@code
+	Template::VariantHal()
+	@endcode
+	in  
+	@code
+	...\template\template_variant\specific\variant.cpp
+	@endcode
+	*/
+	EVariantHalLedMaskSet,
+
+
+	/**
+	Gets the current state of each LED.
+	
+	Requirements of the HAL function handler's 2nd, 3rd and 4th parameters:
+	
+	- TInt aFunction : This enum value.
+
+    - TAny* a1 : A TUint value into which the HAL handler puts the bitmask that
+    describes the state of the LEDs. For each bit in the mask, 0 = OFF, 1 = ON.
+    									
+	- TAny* a2 : NULL.
+
+	An example of this function can be found in the Variant template;
+	see the function: 
+	@code
+	Template::VariantHal()
+	@endcode
+	in  
+	@code
+	...\template\template_variant\specific\variant.cpp
+	@endcode
+	*/
+	EVariantHalLedMaskGet,
+
+
+	/**
+	Gets the current state of any Variant specific switches. 
+	
+	Requirements of the HAL function handler's 2nd, 3rd and 4th parameters:
+	
+	- TInt aFunction : This enum value.
+
+    - TAny* a1 : A TUint value into which the HAL handler puts the bits that
+    describe the state of the switches. The meaning of the switches is entirely
+    hardware dependent.
+    									
+	- TAny* a2 : NULL.
+
+	An example of this function can be found in the Variant template;
+	see the function: 
+	@code
+	Template::VariantHal()
+	@endcode
+	in  
+	@code
+	...\template\template_variant\specific\variant.cpp
+	@endcode
+	*/
+	EVariantHalSwitches,
+
+
+	/**
+	Restarts the system.
+	
+	Requirements of the HAL function handler's 2nd, 3rd and 4th parameters:
+	
+	- TInt aFunction : This enum value.
+
+    - TAny* a1 : A TUint value containing the bits defining the custom restart reasons
+    that can be passed to Kern::Restart().
+    									
+	- TAny* a2 : NULL.
+
+	An example of this function can be found in the Variant template;
+	see the function: 
+	@code
+	Template::VariantHal()
+	@endcode
+	in  
+	@code
+	...\template\template_variant\specific\variant.cpp
+	@endcode
+		
+	@capability PowerMgmt
+	
+	@see Kern::Restart()
+	*/
+	EVariantHalCustomRestart,
+
+
+	/**
+	Gets the reason for the system restart.
+			
+	Requirements of the HAL function handler's 2nd, 3rd and 4th parameters:
+	
+	- TInt aFunction : This enum value.
+
+    - TAny* a1 : A TInt value into which the handler will put a value
+    representing the restart reason.
+        									
+	- TAny* a2 : NULL.
+	
+	An example of this function can be found in the Variant template;
+	see the function: 
+	@code
+	Template::VariantHal()
+	@endcode
+	in the file
+	@code
+	...\template\template_variant\specific\variant.cpp
+	@endcode
+	*/
+	EVariantHalCustomRestartReason,
+
+
+	/**
+	Gets the current state of the case.
+	
+	Requirements of the HAL function handler's 2nd, 3rd and 4th parameters:
+	
+	- TInt aFunction : This enum value.
+
+    - TAny* a1 : A TUint value into which the HAL handler puts a value representing the case state.
+      Possible values are 0 for closed, and 1 for open.
+    									
+	- TAny* a2 : NULL.
+
+	An example of this function can be found in the Variant template;
+	see the function: 
+	@code
+	Template::VariantHal()
+	@endcode
+	in  
+	@code
+	...\template\template_variant\specific\variant.cpp
+	@endcode
+	*/
+	EVariantHalCaseState,
+
+
+	/**
+	Gets the number of screens on this platform.
+	
+	Requirements of the HAL function handler's 2nd, 3rd and 4th parameters:
+	
+	- TInt aFunction : This enum value.
+	    
+	- TAny* a1 : This is a pointer to TInt that will contain the number of screens
+									
+	- TAny* a2 : NULL.
+
+	*/
+	EVariantHalCurrentNumberOfScreens,
+
+	/**
+	Sets the startup reason for the system restart.
+	
+	Requirements of the HAL function handler's 2nd, 3rd and 4th parameters:
+	
+	- TInt aFunction : This enum value.
+
+    - TAny* a1 : A TUint value containing the bits defining the startup mode
+    that will be passed to Kern::Restart().
+    									
+	- TAny* a2 : NULL.
+	
+	An example of this function can be found in the Variant template;
+	see the function: 
+	@code
+	Template::VariantHal()
+	@endcode
+	in  
+	@code
+	...\template\template_variant\specific\variant.cpp
+	@endcode
+		
+	@capability WriteDeviceData
+	
+	@see Kern::Restart()
+	*/	
+	EVariantHalPersistStartupMode,
+
+	/**
+	Gets the startup mode after a system restart.
+			
+	Requirements of the HAL function handler's 2nd, 3rd and 4th parameters:
+	
+	- TInt aFunction : This enum value.
+
+    - TAny* a1 : A TInt that will hold the returned value
+        									
+	- TAny* a2 : NULL.
+	
+	An example of this function can be found in the Variant template;
+	see the function: 
+	@code
+	Template::VariantHal()
+	@endcode
+	in the file
+	@code
+	...\template\template_variant\specific\variant.cpp
+	@endcode
+	*/
+	EVariantHalGetPersistedStartupMode,
+
+	/**
+	Returns the maximum number of values that can be used to store the startup reason required for a custom restart.
+	
+	Requirements of the HAL function handler's 2nd, 3rd and 4th parameters:
+	
+	- TInt aFunction : This enum value.
+
+    - TAny* a1 : A TInt that will hold the returned value
+    									
+	- TAny* a2 : NULL.
+
+	An example of this function can be found in the Variant template;
+	see the function: 
+	@code
+	Template::VariantHal()
+	@endcode
+	in  
+	@code
+	...\template\template_variant\specific\variant.cpp
+	@endcode
+	*/
+	EVariantHalGetMaximumCustomRestartReasons,
+
+	/**
+	Returns the maximum number of values that can be used to store the startup mode required for a transition to
+	a EPwRestart power state.
+	
+	Requirements of the HAL function handler's 2nd, 3rd and 4th parameters:
+	
+	- TInt aFunction : This enum value.
+
+    - TAny* a1 : A TInt that will hold the returned value
+    									
+	- TAny* a2 : NULL.
+
+	An example of this function can be found in the Variant template;
+	see the function: 
+	@code
+	Template::VariantHal()
+	@endcode
+	in  
+	@code
+	...\template\template_variant\specific\variant.cpp
+	@endcode
+	*/
+	EVariantHalGetMaximumRestartStartupModes,
+	};
+
+
+
+
+/**
+@publishedPartner
+@released
+
+The set of function-ids that are  associated with the EHalGroupMedia
+HAL group.
+
+Each enum value represents a specific characteristic of the media driver,
+and is passed as the second parameter to
+the HAL handler function dealing with this group.
+ 
+@see EHalGroupMedia
+*/
+enum TMediaHalFunction
+	{
+	/**
+	Gets drive information.
+
+	Requirements of the HAL function handler's 2nd, 3rd and 4th parameters:
+	
+	- TInt aFunction : This enum value.
+	    
+	- TAny* a1 : This is a pointer to a package buffer (TPckgBuf) containing a
+    TDriveInfoV1 structure. The HAL function needs to fill the members of
+	this structure with the appropriate information.
+									
+	- TAny* a2 : NULL.
+
+	Note that the HAL handler is implemented by Symbian OS
+	
+	@see TDriveInfoV1
+    @see TPckgBuf
+	*/
+	EMediaHalDriveInfo,
+
+	/**
+	@internalTechnology
+	@test
+	*/
+	EMediaHalGetROMConcurrencyInfo,
+
+	/**
+	@internalTechnology
+	@test
+	*/
+	EMediaHalGetCodeConcurrencyInfo,
+
+	/**
+	@internalTechnology
+	@test
+	*/
+	EMediaHalResetConcurrencyInfo,
+
+	/**
+	@internalTechnology
+	@test
+	*/
+	EMediaHalGetROMPagingBenchmark,
+
+	/**
+	@internalTechnology
+	@test
+	*/
+	EMediaHalGetCodePagingBenchmark,
+
+	/**
+	@internalTechnology
+	@test
+	*/
+	EMediaHalResetPagingBenchmark
+	};
+
+
+
+
+/**
+@publishedPartner
+@released
+
+The set of function-ids that are  associated with the EHalGroupPower
+HAL group.
+
+Each enum value represents a specific aspect of power handling on the device.
+
+@see EHalGroupPower
+*/
+enum TPowerHalFunction
+	{
+	
+	/**
+	This is used internally by Symbian
+	*/
+	EPowerHalOnOffInfo,
+	
+	
+	/**
+	This is not currently used.
+	*/
+	EPowerHalSupplyInfo,
+
+
+	/**
+	This is not currently used.
+	
+	@capability PowerMgmt
+	*/
+	EPowerHalSetAutoSwitchOffBehavior,
+    
+    
+    /**
+    This is not currently used.
+    */
+	EPowerHalAutoSwitchOffBehavior,
+
+
+	/**
+	This is not currently used.
+	
+	@capability PowerMgmt
+	*/
+	EPowerHalSetAutoSwitchOffTime,
+
+
+    /**
+    This is not currently used.
+    */
+	EPowerHalAutoSwitchOffTime,
+
+
+	/**
+	This is not currently used.
+	
+	@capability PowerMgmt
+	*/
+	EPowerHalResetAutoSwitchOffTimer,
+
+
+	/** 
+	Switches the device off.
+	
+	Requirements of the HAL function handler's 2nd, 3rd and 4th parameters:
+	
+	- TInt aFunction : This enum value.
+	    
+    - TAny* a1 : NULL.
+									
+	- TAny* a2 : NULL.
+	
+	@capability PowerMgmt
+	*/
+	EPowerHalSwitchOff,
+
+
+	/**
+	Sets whether touching the screen with a pen or stylus will cause
+    the device to switch on.
+    	
+	Requirements of the HAL function handler's 2nd, 3rd and 4th parameters:
+	
+	- TInt aFunction : This enum value.
+	    
+    - TAny* a1 : A TBool that needs to be set to ETrue (if touching the screen
+    is to cause a power on), or EFalse (if touching the screen is not to cause
+    a power on).
+									
+	- TAny* a2 : NULL.
+
+	@capability WriteDeviceData
+	*/
+	EPowerHalSetPointerSwitchesOn,
+
+
+    /**
+    Tests whether touching the screen with a pen or stylus will cause
+    the device to switch on.
+    
+    Requirements of the HAL function handler's 2nd, 3rd and 4th parameters:
+	
+	- TInt aFunction : This enum value.
+	    
+    - TAny* a1 : A TBool into which the HAL handler puts ETrue (if touching
+    the screen will cause a power on), or EFalse (if touching the screen will
+    not cause a power on).
+									
+	- TAny* a2 : NULL.
+    */
+	EPowerHalPointerSwitchesOn,
+
+
+	/**
+	Sets whether the opening of a 'device case' will cause
+    the device to switch on.
+    
+	Note that the meaning attached to a 'device case' depends on the hardware.
+	
+	Requirements of the HAL function handler's 2nd, 3rd and 4th parameters:
+	
+	- TInt aFunction : This enum value.
+	    
+    - TAny* a1 : A TBool that needs to be set to ETrue (if opening
+    the case is to cause a power on), or EFalse (if opening
+    the case is not to cause a power on).
+									
+	- TAny* a2 : NULL.
+
+	@capability WriteDeviceData
+	*/
+	EPowerHalSetCaseOpenSwitchesOn,
+
+
+    /**
+    Tests whether the opening of a 'device case' will cause
+    the device to switch on.
+    
+    Note that the meaning attached to a 'device case' depends on the hardware.
+    
+    Requirements of the HAL function handler's 2nd, 3rd and 4th parameters:
+	
+	- TInt aFunction : This enum value.
+	    
+    - TAny* a1 : A TBool into which the HAL handler puts ETrue (if opening
+    the case will cause a power on), or EFalse (if opening
+    the case will not cause a power on).
+									
+	- TAny* a2 : NULL.
+    */
+	EPowerHalCaseOpenSwitchesOn,
+
+
+	/**
+	Sets whether the closing of a 'device case' will cause
+    the device to switch off.
+    
+	Note that the meaning attached to a 'device case' depends on the hardware.
+	
+	Requirements of the HAL function handler's 2nd, 3rd and 4th parameters:
+	
+	- TInt aFunction : This enum value.
+	    
+    - TAny* a1 : A TBool that needs to be set to ETrue (if closing
+    the case is to cause a power off), or EFalse (if closing
+    the case is not to cause a power off).
+									
+	- TAny* a2 : NULL.
+	
+	@capability WriteDeviceData
+	*/
+	EPowerHalSetCaseCloseSwitchesOff,
+    
+    
+    /**
+    Tests whether the closing of a 'device case' will cause
+    the device to switch off.
+    
+    Note that the meaning attached to a 'device case' depends on the hardware.
+    
+    Requirements of the HAL function handler's 2nd, 3rd and 4th parameters:
+	
+	- TInt aFunction : This enum value.
+	    
+    - TAny* a1 : A TBool into which the HAL handler puts ETrue (if closing
+    the case will cause a power off), or EFalse (if closing
+    the case will not cause a power off).
+									
+	- TAny* a2 : NULL.
+	*/
+	EPowerHalCaseCloseSwitchesOff,
+
+
+	/**
+	This is not currently used.
+	
+	@capability PowerMgmt
+	*/
+	EPowerHalSetBatteryType,
+    
+    
+    /**
+    This is not currently used.
+    */
+	EPowerHalBatteryType,
+
+
+	/**
+	This is not currently used.
+	
+	@capability PowerMgmt
+	*/
+	EPowerHalSetBatteryCapacity,
+
+
+    /**
+    This is not currently used.
+    */
+	EPowerHalBatteryCapacity,
+
+
+    /**
+    This is not currently used.
+    */
+	EPowerHalAutoSwitchOffType,
+	
+	
+	/**
+    This is used internally by Symbian.
+	*/
+	EPowerHalTestBootSequence,
+
+	
+	/**
+    Tests whether a backup power supply is present or not.
+    
+    Requirements of the HAL function handler's 2nd, 3rd and 4th parameters:
+	
+	- TInt aFunction : This enum value.
+	    
+    - TAny* a1 : A TBool into which the HAL handler puts ETrue (if backup 
+    power is present), or EFalse (if backup power is not present).
+									
+	- TAny* a2 : NULL.
+	*/
+	EPowerHalBackupPresent,
+
+	
+	/**
+    Tests whether accessory power is present or not.
+    	
+	Requirements of the HAL function handler's 2nd, 3rd and 4th parameters:
+	
+	- TInt aFunction : This enum value.
+	    
+    - TAny* a1 : A TBool into which the HAL handler puts ETrue (if accessory 
+    power is present), or EFalse (if accessory power is not present).
+									
+	- TAny* a2 : NULL.
+	*/
+	EPowerHalAcessoryPowerPresent,
+	};
+
+
+
+
+/**
+@publishedPartner
+@released
+
+The set of function-ids that are  associated with the EHalGroupDisplay
+HAL group.
+
+Each enum value represents a specific characteristic of the hardware display,
+i.e. the screen or the LCD, and is passed as the second parameter to
+the HAL handler function dealing with this group.
+ 
+@see EHalGroupDisplay
+*/
+enum TDisplayHalFunction
+	{
+	
+	/**
+	Gets the screen display properties.
+	
+	Requirements of the HAL function handler's 2nd, 3rd and 4th parameters:
+
+    - TInt aFunction : This enum value.
+	
+	- TAny* a1 : This is a pointer to a package buffer (TPckgBuf) containing a
+	TScreenInfoV01 structure. The HAL function needs to fill the members of
+	this structure with the appropriate information.
+	
+	- TAny* a2 : NULL.
+	
+	For example:
+	@code
+	...
+	case EDisplayHalScreenInfo:
+	    TPckgBuf<TScreenInfoV01> vPckg;
+	    // Fill details
+	    Kern::InfoCopy(*(TDes8*)a1,vPckg);
+	...
+	@endcode
+	
+	@see TScreenInfoV01
+    @see TPckgBuf
+	*/
+	EDisplayHalScreenInfo,
+	
+	
+	/**
+	Registers whether it is the Window Server's responsibility to turn
+	the screen display on or off.
+	
+	Requirements of the HAL function handler's 2nd, 3rd and 4th parameters:
+	
+	- TInt aFunction : This enum value.
+	
+	- TAny* a1 : This is a TBool value that needs to be set to ETrue or EFalse.
+	
+	- TAny* a2 : NULL.
+	
+	For example:
+	@code
+	...
+	case EDisplayHalWsRegisterSwitchOnScreenHandling:
+	    iWsSwitchOnScreen=(TBool)a1;
+	...
+	@endcode
+	
+	@see TBool
+	*/
+	EDisplayHalWsRegisterSwitchOnScreenHandling,
+	
+	
+	/**
+	Requests that the Window Server turn the screen display on.
+	
+	Requirements of the HAL function handler's 2nd, 3rd and 4th parameters:
+	
+	- TInt aFunction : This enum value.
+	
+	- TAny* a1 : NULL
+		
+	- TAny* a2 : NULL
+	*/
+	EDisplayHalWsSwitchOnScreen,
+	
+	
+	/**
+	Gets the maximum screen display contrast value.
+	
+	Requirements of the HAL function handler's 2nd, 3rd and 4th parameters:
+	
+	- TInt aFunction : This enum value.
+	
+	- TAny* a1 : A TInt value into which the HAL handler puts the maximum
+	display contrast value.
+		
+	- TAny* a2 : NULL
+	*/
+	EDisplayHalMaxDisplayContrast,
+
+
+	/**
+	Sets the screen display contrast value.
+	
+	Requirements of the HAL function handler's 2nd, 3rd and 4th parameters:
+	
+	- TInt aFunction : This enum value.
+	
+	- TAny* a1 : A TInt value containing the display contrast value.
+	Typically, this needs to lie within a range that is valid for the device.
+			
+	- TAny* a2 : NULL
+	
+	@capability WriteDeviceData 
+	*/
+	EDisplayHalSetDisplayContrast,
+    
+    
+    /**
+    Gets the screen display's current contrast value.
+    
+    Requirements of the HAL function handler's 2nd, 3rd and 4th parameters:
+	
+	- TInt aFunction : This enum value.
+	
+	- TAny* a1 : A TInt value into which the HAL handler puts the
+	display contrast value.
+			
+	- TAny* a2 : NULL
+	*/
+	EDisplayHalDisplayContrast,
+
+
+	/**
+	Sets the backlight behaviour.
+	
+	Requirements of the HAL function handler's 2nd, 3rd and 4th parameters:
+	
+	- TInt aFunction : This enum value.
+	
+	- TAny* a1 : Not specified; depends on the manufacturer's implementation.
+				
+	- TAny* a2 : Not specified; depends on the manufacturer's implementation.
+	
+	@capability WriteDeviceData
+	*/
+	EDisplayHalSetBacklightBehavior,
+
+
+	/**
+	Gets information about the backlight behaviour.
+	
+	Requirements of the HAL function handler's 2nd, 3rd and 4th parameters:
+	
+	- TInt aFunction : This enum value.
+	
+	- TAny* a1 : Not specified; depends on the manufacturer's implementation.
+				
+	- TAny* a2 : Not specified; depends on the manufacturer's implementation.
+	*/
+	EDisplayHalBacklightBehavior,
+
+
+	/**
+	Sets the backlight timeout value, i.e. the length of time that the backlight
+	will stay on.
+	
+	Requirements of the HAL function handler's 2nd, 3rd and 4th parameters:
+	
+	- TInt aFunction : This enum value.
+	
+	- TAny* a1 : Not specified; depends on the manufacturer's implementation.
+				
+	- TAny* a2 : Not specified; depends on the manufacturer's implementation.
+	
+	@capability WriteDeviceData
+	*/
+	EDisplayHalSetBacklightOnTime,
+
+
+    /**
+    Gets information about the backlight timeout value, i.e. the length
+    of time that the backlight will stay on.
+    
+    Requirements of the HAL function handler's 2nd, 3rd and 4th parameters:
+	
+	- TInt aFunction : This enum value.
+	
+	- TAny* a1 : Not specified; depends on the manufacturer's implementation.
+				
+	- TAny* a2 : Not specified; depends on the manufacturer's implementation.
+    */
+	EDisplayHalBacklightOnTime,
+
+
+	/**
+	Sets the backlight on or off.
+	
+	Requirements of the HAL function handler's 2nd, 3rd and 4th parameters:
+	
+	- TInt aFunction : This enum value.
+	
+    - TAny* a1 : A TBool that needs to be set to ETrue or EFalse.
+			
+	- TAny* a2 : NULL
+	
+	@capability WriteDeviceData
+	*/
+	EDisplayHalSetBacklightOn,
+
+
+	/**
+	Gets the current state of the backlight.
+	
+	Requirements of the HAL function handler's 2nd, 3rd and 4th parameters:
+	
+	- TInt aFunction : This enum value.
+	
+    - TAny* a1 : A TBool into which the HAL handler
+    puts ETrue (for On) or EFalse (for Off).
+				
+	- TAny* a2 : NULL
+	*/
+	EDisplayHalBacklightOn,
+	
+	
+	/**
+	Gets the screen display's maximum brightness value.
+	
+	Requirements of the HAL function handler's 2nd, 3rd and 4th parameters:
+	
+	- TInt aFunction : This enum value.
+	
+	- TAny* a1 : A TInt value into which the HAL handler puts the
+	maximum brightness value.
+			
+	- TAny* a2 : NULL
+	*/
+	EDisplayHalMaxDisplayBrightness,
+
+
+	/**
+	Sets the screen display's brightness value.
+	
+	Requirements of the HAL function handler's 2nd, 3rd and 4th parameters:
+	
+	- TInt aFunction : This enum value.
+	
+	- TAny* a1 : A TInt value containing the brightness value.
+	Typically, this needs to lie within a range that is valid for the device.
+			
+	- TAny* a2 : NULL
+	
+	@capability WriteDeviceData
+	*/
+	EDisplayHalSetDisplayBrightness,
+
+
+    /**
+    Gets the screen display's current brightness value.
+	
+	Requirements of the HAL function handler's 2nd, 3rd and 4th parameters:
+	
+	- TInt aFunction : This enum value.
+	
+	- TAny* a1 : A TInt value into which the HAL handler puts the
+	brightness value.
+			
+	- TAny* a2 : NULL
+    */
+	EDisplayHalDisplayBrightness,
+//
+
+    /**
+    Gets the number of available display modes.
+    
+    Requirements of the HAL function handler's 2nd, 3rd and 4th parameters:
+	
+	- TInt aFunction : This enum value.
+	
+	- TAny* a1 : A TInt value into which the HAL handler puts the
+	number of display modes value.
+			
+	- TAny* a2 : NULL
+    */
+	EDisplayHalModeCount,
+
+
+	/**
+	Sets the display mode.
+	
+	This will normally update the information maintained by the screen driver
+	in the form of a TScreenInfoV01 struct.
+		
+	Requirements of the HAL function handler's 2nd, 3rd and 4th parameters:
+	
+	- TInt aFunction : This enum value.
+	
+	- TAny* a1 : A TInt value containing a number representing the display mode.
+	Typically, this needs to lie within a range that is valid for the device.
+	For example, the value usually needs to be positive, and be less than
+	the number of display modes.
+			
+	- TAny* a2 : NULL
+	
+	@capability MultimediaDD
+	
+	@see TScreenInfoV01
+	*/
+	EDisplayHalSetMode,
+
+
+    /**
+    Gets the current screen display mode.
+    
+    Requirements of the HAL function handler's 2nd, 3rd and 4th parameters:
+    
+    - TInt aFunction : This enum value.
+	
+	- TAny* a1 : A TInt value into which the HAL handler puts the 
+	the current display mode value.
+			
+	- TAny* a2 : NULL
+    */
+	EDisplayHalMode,
+
+
+	/**
+	Sets a colour value for the specified palette entry. 
+	
+	Requirements of the HAL function handler's 2nd, 3rd and 4th parameters:
+    
+    - TInt aFunction : This enum value.
+	
+	- TAny* a1 : A TInt value that identifies the palette entry. The value
+	occupies the junior 8 bits of the integer. The senior 24 bits are all 0.
+					
+	- TAny* a2 : A TInt value containing the colour value; it represents
+	a standard Symbian OS RGB colour value, and occupies the junior 24 bits
+	of the integer. The senior 8 bits are not defined.
+	
+	@capability MultimediaDD
+	*/
+	EDisplayHalSetPaletteEntry,
+    
+    
+    /**
+    Gets the colour value for the specified palette entry.
+    
+    Requirements of the HAL function handler's 2nd, 3rd and 4th parameters:
+    
+    - TInt aFunction : This enum value.
+	
+	- TAny* a1 : A TInt value that identifies the palette entry. The value
+	is expected to occupy the junior 8 bits of the integer. The senior 24 bits
+	are not defined.
+					
+	- TAny* a2 : On return from the HAL function, a TInt value containing
+    the colour value. The value occupies the junior 24 bits of the integer.
+    The senior 8 bits are not defined.
+    */
+	EDisplayHalPaletteEntry,
+
+
+	/**
+	Sets the screen display on or off.
+
+    Requirements of the HAL function handler's 2nd, 3rd and 4th parameters:
+    
+    - TInt aFunction : This enum value.
+	
+	- TAny* a1 : A TBool that needs to be set to ETrue (for On),
+	or EFalse (for Off).
+					
+	- TAny* a2 : NULL.
+	
+	@capability PowerMgmt
+	*/
+	EDisplayHalSetState,
+
+
+    /**
+    Gets the state of the screen display, i.e. whether the display is on or off.
+    
+    Requirements of the HAL function handler's 2nd, 3rd and 4th parameters:
+    
+    - TInt aFunction : This enum value.
+	
+    - TAny* a1 : A TBool into which the HAL handler puts ETrue (for On),
+    or EFalse (for Off).
+									
+	- TAny* a2 : NULL.
+    */
+	EDisplayHalState,
+	
+	
+	/**
+	Gets the maximum number of colours that the screen display supports.
+	
+	Requirements of the HAL function handler's 2nd, 3rd and 4th parameters:
+	
+	- TInt aFunction : This enum value.
+	
+	- TAny* a1 : A TInt value into which the HAL handler puts the maximum
+	number of colours.
+		
+	- TAny* a2 : NULL
+	*/
+	EDisplayHalColors,
+	
+	
+	/**
+	Gets information about the current display mode.
+	
+	Requirements of the HAL function handler's 2nd, 3rd and 4th parameters:
+	
+	- TInt aFunction : This enum value.
+	
+	- TAny* a1 : This is a pointer to a package buffer (TPckgBuf) containing a
+	TVideoInfoV01 structure. The HAL function needs to fill the members of
+	this structure with the appropriate information.
+	
+    - TAny* a2 : NULL.
+		
+	@see TVideoInfoV01
+    @see TPckgBuf
+	*/
+	EDisplayHalCurrentModeInfo,
+	
+	
+	/**
+	Gets information about the specified display mode.
+	
+	Requirements of the HAL function handler's 2nd, 3rd and 4th parameters:
+	
+	- TInt aFunction : This enum value.
+	
+	- TAny* a1 : A TInt value containing the number of the display mode for which
+	information is to be fetched.
+	
+	- TAny* a2 : This is a pointer to a package buffer (TPckgBuf) containing a
+	TVideoInfoV01 structure. The HAL function needs to fill the members of
+	this structure with the appropriate information.
+			
+	@see TVideoInfoV01
+    @see TPckgBuf
+	*/
+	EDisplayHalSpecifiedModeInfo,
+
+//	EDisplaySwitchOffScreen,
+
+
+    /**
+    Fills/copies an area of the screen display with a rectangle of a specified colour.
+    
+    Requirements of the HAL function handler's 2nd, 3rd and 4th parameters:
+	
+	- TInt aFunction : This enum value.
+			
+	- TAny* a1 : This is a pointer to a package buffer (TPckgBuf) containing a
+	SRectOpInfo structure. The structure contains the information that
+	is needed for the operation.
+    
+    - TAny* a1 : NULL.
+    
+	@see SRectOpInfo
+    @see TPckgBuf
+    */
+	EDisplayHalBlockFill,
+	
+	
+    /**
+    Fills/copies an area of the screen display with a rectangle of a specified colour.
+    
+    Requirements of the HAL function handler's 2nd, 3rd and 4th parameters:
+	
+	- TInt aFunction : This enum value.
+			
+	- TAny* a1 : This is a pointer to a package buffer (TPckgBuf) containing a
+	SRectOpInfo structure. The structure contains the information that
+	is needed for the operation.
+    
+    - TAny* a1 : NULL.
+    
+	@see SRectOpInfo
+    @see TPckgBuf
+    */
+	EDisplayHalBlockCopy,
+	
+	
+	/**
+	Tests whether the screen display is secure.
+	
+	Requirements of the HAL function handler's 2nd, 3rd and 4th parameters:
+	
+	- TInt aFunction : This enum value.
+	    
+    - TAny* a1 : A TBool into which the HAL handler puts ETrue (for secure mode),
+    or EFalse (for non-secure mode).
+									
+	- TAny* a2 : NULL.
+	*/
+	EDisplayHalSecure,
+
+
+	/**
+    Sets the screen display into secure or non-secure mode.
+    
+    Requirements of the HAL function handler's 2nd, 3rd and 4th parameters:
+	
+	- TInt aFunction : This enum value.
+	
+	- TAny* a1 : A TBool that needs to be set to ETrue (for secure mode),
+	or EFalse (for non-secure mode).
+									
+	- TAny* a2 : NULL.
+	
+	@capability MultimediaDD
+	*/
+	EDisplayHalSetSecure,
+
+	
+	/**
+	Gets the address of the DSA buffer
+	
+	Requirements of the HAL function handler's 2nd, 3rd and 4th parameters:
+	
+	- TInt aFunction : This enum value.
+	
+	- TAny* a1 : A TInt value into which the HAL handler puts the address
+		
+	- TAny* a2 : NULL
+	*/
+	EDisplayHalGetDisplayMemoryAddress,
+	/**
+	Gets a handle to the DSA buffer memory
+	
+	Requirements of the HAL function handler's 2nd, 3rd and 4th parameters:
+	
+	- TInt aFunction : This enum value.
+	
+	- TAny* a1 : A TInt value into which the HAL handler puts the handle value
+		
+	- TAny* a2 : NULL
+	*/
+	EDisplayHalGetDisplayMemoryHandle,
+	};
+
+
+
+
+/**
+@publishedPartner
+@released
+
+The set of function-ids that are  associated with the EHalGroupDigitiser
+HAL group.
+
+Each enum value represents a specific characteristic of the digitiser,
+and is passed as the second parameter to the HAL handler function
+dealing with this group.
+
+@see EHalGroupDigitiser
+*/
+enum TDigitiserHalFunction
+	{
+	
+	/**
+	Sets the calibration data (i.e. the values of the digitiser to
+	screen constants) for the digitiser device.
+	
+	Requirements of the HAL function handler's 2nd, 3rd and 4th parameters:
+	
+	- TInt aFunction : This enum value.
+	
+    - TAny* a1 : A pointer to a TDigitizerCalibration object.
+				
+	- TAny* a2 : NULL	
+	
+	@see TDigitizerCalibration
+	
+	@capability WriteDeviceData
+	*/
+	EDigitiserHalSetXYInputCalibration,
+
+
+    /**
+    Gets the calibration data (i.e. the values of the digitiser to
+	screen constants) for the digitiser device.
+	
+	Requirements of the HAL function handler's 2nd, 3rd and 4th parameters:
+	
+	- TInt aFunction : This enum value.
+	
+    - TAny* a1 : A pointer to a TDigitizerCalibration object; the HAL function
+    needs to fill the members of this structure with
+    the appropriate information.
+				
+	- TAny* a2 : NULL	
+	
+	@see TDigitizerCalibration
+    */
+	EDigitiserHalCalibrationPoints,
+
+
+    /**
+    Saves the calibration data (i.e. the values of the digitiser to
+	screen constants) for the digitiser device in a persistent memory area so
+	that they can be restored after a power cycle.
+	
+	Requirements of the HAL function handler's 2nd, 3rd and 4th parameters:
+	
+	- TInt aFunction : This enum value.
+	
+    - TAny* a1 : NULL.
+				
+	- TAny* a2 : NULL	
+    */
+	EDigitiserHalSaveXYInputCalibration,
+
+
+	/**
+	Restores the calibration data (i.e. the values of the digitiser to
+	screen constants) for the digitiser device from a persistent memory area so
+	that they can be restored after a power cycle.
+
+    Requirements of the HAL function handler's 2nd, 3rd and 4th parameters:
+	
+	- TInt aFunction : This enum value.
+	
+    - TAny* a1 : NULL.
+				
+	- TAny* a2 : NULL	
+	
+	@capability WriteDeviceData
+	*/
+	EDigitiserHalRestoreXYInputCalibration,
+
+
+    /**
+    Gets digitiser information as defined by the content of
+    a TDigitiserInfoV01 (or TDigitiserInfoV02) struct.
+    
+    Requirements of the HAL function handler's 2nd, 3rd and 4th parameters:
+	
+	- TInt aFunction : This enum value.
+	
+   	- TAny* a1 : This is a pointer to a package buffer (TPckgBuf) containing a
+	TDigitiserInfoV01 (or TDigitiserInfoV02) structure. The HAL function needs 
+	to fill the members of this structure with the appropriate information.
+				
+	- TAny* a2 : NULL	
+    
+    @see TPckgBuf
+    @see TDigitiserInfoV01
+    */
+	EDigitiserHalXYInfo,
+
+
+    /**
+    Tests whether the digitiser is on or off.
+    
+    Requirements of the HAL function handler's 2nd, 3rd and 4th parameters:
+	
+	- TInt aFunction : This enum value.
+	
+   	- TAny* a1 : A TBool value that needs to be set to ETrue (On), or EFalse (Off).
+	
+	- TAny* a2 : NULL	
+    */
+	EDigitiserHalXYState,
+
+
+	/**
+	Sets the digitiser either on or off.
+	
+	Requirements of the HAL function handler's 2nd, 3rd and 4th parameters:
+	
+	- TInt aFunction : This enum value.
+	
+	- TAny* a1 : A TBool that needs to be set to ETrue (On), or EFalse (Off).
+	
+	- TAny* a2 : NULL	
+	
+	@capability PowerMgmt
+	*/
+	EDigitiserHalSetXYState,
+
+    /**
+	Checks whether the pointing device supports 3rd dimension.
+    
+    Requirements of the HAL function handler's 2nd, 3rd and 4th parameters:
+	
+	- TInt aFunction : This enum value.
+	
+   	- TAny* a1 : A TBool value that needs to be set to ETrue (3D supported), or EFalse (3D not supported).
+	
+	- TAny* a2 : NULL	
+    */
+	EDigitiserHal3DPointer,
+
+    /**	
+    Sets the detection range above the screen.
+    
+    Requirements of the HAL function handler's 2nd, 3rd and 4th parameters:
+	
+	- TInt aFunction : This enum value.
+	
+   	- TAny* a1 : A TInt value that is the detection range in units of distance above the screen.
+	
+	- TAny* a2 : NULL	
+    */
+	EDigitiserHalSetZRange,
+    
+	/**
+	@prototype
+	
+    Sets the  number of pointers it supports on the digitiser.
+    
+    Requirements of the HAL function handler's 2nd, 3rd and 4th parameters:
+	
+	- TInt aFunction : This enum value.
+	
+   	- TAny* a1 : A TInt value that 	sets the number of pointer to be supported by the digitiser driver
+	
+	- TAny* a2 : NULL	
+    */
+	EDigitiserHalSetNumberOfPointers,
+	
+	/**
+	@prototype
+
+    Gets digitiser information as defined by the content of
+    a  TDigitiserInfoV02 struct.
+    
+    Requirements of the HAL function handler's 2nd, 3rd and 4th parameters:
+	
+	- TInt aFunction : This enum value.
+	
+   	- TAny* a1 : This is a pointer to a package buffer (TPckgBuf) containing a
+	 TDigitiserInfoV02 structure. The HAL function needs 
+	to fill the members of this structure with the appropriate information.
+				
+	- TAny* a2 : NULL	
+    
+    @see TPckgBuf
+    @see TDigitiserInfoV02
+    */
+	EDigitiserHal3DInfo
+
+	};
+
+
+
+
+/**
+@publishedPartner
+@released
+
+The set of function-ids that are  associated with the EHalGroupSound
+HAL group.
+
+Each enum value represents a specific characteristic of the sound driver,
+and is passed as the second parameter to the HAL handler function
+dealing with this group.
+
+Note that a sound driver in Symbian OS is only maintained for backwards
+compatibility with the Psion Series 5MX devices.
+
+@see EHalGroupSound
+*/
+enum TSoundHalFunction
+	{
+	/**
+	Gets sound driver information.
+	
+	Requirements of the HAL function handler's 2nd, 3rd and 4th parameters:
+	
+	- TInt aFunction : This enum value.
+	    
+	- TAny* a1 : This is a pointer to a package buffer (TPckgBuf) containing a
+    TSoundInfoV1 structure. The HAL function needs to fill the members of
+	this structure with the appropriate information.
+									
+	- TAny* a2 : NULL.
+	
+	@see TSoundInfoV1
+    @see TPckgBuf
+	*/
+	ESoundHalSoundInfo,
+
+
+	/**
+	Sets whether a click is to be sounded on a key press.
+	
+	Requirements of the HAL function handler's 2nd, 3rd and 4th parameters:
+	
+	- TInt aFunction : This enum value.
+	    
+	- TAny* a1 : A TBool that needs to be set to ETrue (click is to be sounded),
+	or EFalse (click is not to be sounded).
+									
+	- TAny* a2 : NULL.
+	
+	@capability WriteDeviceData
+	*/
+	ESoundHalSetKeyClickEnabled,
+
+
+	/**
+	Sets whether a click that is to be sounded on a key press, is loud or not.
+
+	Requirements of the HAL function handler's 2nd, 3rd and 4th parameters:
+	
+	- TInt aFunction : This enum value.
+	    
+	- TAny* a1 : A TBool that needs to be set to ETrue (click is to be loud),
+	or EFalse (click is not to be loud).
+									
+	- TAny* a2 : NULL.
+	
+	@capability WriteDeviceData
+	*/
+	ESoundHalSetKeyClickLoud,
+
+
+	/**
+	Sets whether a click is to be sounded when a pointing device touches
+	the screen.
+
+	Requirements of the HAL function handler's 2nd, 3rd and 4th parameters:
+	
+	- TInt aFunction : This enum value.
+	    
+	- TAny* a1 : A TBool that needs to be set to ETrue (click is to be sounded),
+	or EFalse (click is not to be sounded).
+									
+	- TAny* a2 : NULL.
+	
+	@capability WriteDeviceData
+	*/
+	ESoundHalSetPointerClickEnabled,
+
+
+	/**
+	Sets whether a click that is to be sounded when a pointing device touches
+	the screen, is loud or not.
+	
+	Requirements of the HAL function handler's 2nd, 3rd and 4th parameters:
+	
+	- TInt aFunction : This enum value.
+	    
+	- TAny* a1 : A TBool that needs to be set to ETrue (click is to be loud),
+	or EFalse (click is not to be loud).
+									
+	- TAny* a2 : NULL.
+	
+	@capability WriteDeviceData
+	*/
+	ESoundHalSetPointerClickLoud,
+
+
+	/**
+	Sets whether the beep sound is enabled.
+	
+	Requirements of the HAL function handler's 2nd, 3rd and 4th parameters:
+	
+	- TInt aFunction : This enum value.
+	    
+	- TAny* a1 : A TBool that needs to be set to ETrue (beep is enabled),
+	or EFalse (beep is not enabled).
+									
+	- TAny* a2 : NULL.
+	
+	@capability WriteDeviceData
+	*/
+	ESoundHalSetBeepEnabled,
+
+
+	/**
+	Sets whether the beep sound is to be loud.
+	
+	Requirements of the HAL function handler's 2nd, 3rd and 4th parameters:
+	
+	- TInt aFunction : This enum value.
+	    
+	- TAny* a1 : A TBool that needs to be set to ETrue (beep is loud),
+	or EFalse (beep is not loud).
+									
+	- TAny* a2 : NULL.
+	
+	@capability WriteDeviceData
+	*/
+	ESoundHalSetBeepLoud,
+
+
+	/**
+	Sets whether the sound driver is enabled.
+	
+	Requirements of the HAL function handler's 2nd, 3rd and 4th parameters:
+	
+	- TInt aFunction : This enum value.
+	    
+	- TAny* a1 : A TBool that needs to be set to ETrue (driver is enabled),
+	or EFalse (driver is not enabled).
+									
+	- TAny* a2 : NULL.
+	
+	@capability PowerMgmt
+	*/
+	ESoundHalSetSoundDriverEnabled,
+
+
+	/**
+	Sets whether the sound driver is to generate loud sounds.
+	
+	Requirements of the HAL function handler's 2nd, 3rd and 4th parameters:
+	
+	- TInt aFunction : This enum value.
+	    
+	- TAny* a1 : A TBool that needs to be set to ETrue (driver is to generate loud sounds),
+	or EFalse (driver is not to generate loud sounds).
+									
+	- TAny* a2 : NULL.
+	
+	@capability WriteDeviceData
+	*/
+	ESoundHalSetSoundDriverLoud,
+
+
+	/**
+	Sets whether sound generation is enabled.
+	
+	Requirements of the HAL function handler's 2nd, 3rd and 4th parameters:
+	
+	- TInt aFunction : This enum value.
+	    
+	- TAny* a1 : A TBool that needs to be set to ETrue (sound generation is enabled),
+	or EFalse (sound generation is not enabled).
+									
+	- TAny* a2 : NULL.
+	
+	@capability WriteDeviceData
+	*/
+	ESoundHalSetSoundEnabled,
+
+
+	/**
+	Sets whether generation of key clicks is to be overridden.
+	
+	Requirements of the HAL function handler's 2nd, 3rd and 4th parameters:
+	
+	- TInt aFunction : This enum value.
+	    
+	- TAny* a1 : A TBool that needs to be set to ETrue (key clicks to be overridden),
+	or EFalse (key clicks not to be overridden).
+									
+	- TAny* a2 : NULL.
+		
+	@capability WriteDeviceData
+	*/
+	ESoundHalSetKeyClickOverridden,
+
+
+    /**
+    Tests whether the generation of key clicks is overridden.
+    	
+	Requirements of the HAL function handler's 2nd, 3rd and 4th parameters:
+	
+	- TInt aFunction : This enum value.
+	    
+	- TAny* a1 : A TBool into which the HAL handler puts ETrue (key clicks are overridden),
+	or EFalse (key clicks are not overridden).
+									
+	- TAny* a2 : NULL.
+    */
+	ESoundHalKeyClickOverridden,
+
+
+    /**
+    Tests whether a click that is to be sounded on a key press, is loud or not.
+
+	Requirements of the HAL function handler's 2nd, 3rd and 4th parameters:
+	
+	- TInt aFunction : This enum value.
+	    
+	- TAny* a1 : A TBool into which the HAL handler puts ETrue (click is loud),
+	or EFalse (click is not loud).
+									
+	- TAny* a2 : NULL.
+    */
+	ESoundHalKeyClickLoud,
+
+
+    /**
+    Tests whether a click is to be sounded on a key press.
+	
+	Requirements of the HAL function handler's 2nd, 3rd and 4th parameters:
+	
+	- TInt aFunction : This enum value.
+	    
+	- TAny* a1 : A TBool into which the HAL handler puts ETrue (click is sounded),
+	or EFalse (click is not sounded).
+									
+	- TAny* a2 : NULL.
+    */
+	ESoundHalKeyClickEnabled,
+
+
+    /**
+    Tests whether a click that is to be sounded when a pointing device touches
+	the screen, is loud or not.
+	
+	Requirements of the HAL function handler's 2nd, 3rd and 4th parameters:
+	
+	- TInt aFunction : This enum value.
+	    
+	- TAny* a1 : A TBool into which the HAL handler puts ETrue (click is loud),
+	or EFalse (click is not loud).
+									
+	- TAny* a2 : NULL.
+    */
+	ESoundHalPointerClickLoud,
+
+
+    /**
+    Tests whether a click is to be sounded when a pointing device touches
+	the screen.
+
+	Requirements of the HAL function handler's 2nd, 3rd and 4th parameters:
+	
+	- TInt aFunction : This enum value.
+	    
+	- TAny* a1 : A TBool into which teh HAL handler puts ETrue (click is to be sounded),
+	or EFalse (click is not to be sounded).
+									
+	- TAny* a2 : NULL.
+    */
+	ESoundHalPointerClickEnabled,
+
+
+    /**
+    Generates a key click sound.
+    
+    Requirements of the HAL function handler's 2nd, 3rd and 4th parameters:
+	
+	- TInt aFunction : This enum value.
+	    
+	- TAny* a1 : NULL.
+									
+	- TAny* a2 : NULL.
+    */
+	ESoundHalKeyClick,
+
+
+    /**
+    Generates a pointer click sound.
+    
+    Requirements of the HAL function handler's 2nd, 3rd and 4th parameters:
+	
+	- TInt aFunction : This enum value.
+	    
+	- TAny* a1 : NULL.
+									
+	- TAny* a2 : NULL.
+    */
+	ESoundHalPointerClick,
+
+
+    /**
+    Generates a beep sound.
+    
+    Requirements of the HAL function handler's 2nd, 3rd and 4th parameters:
+	
+	- TInt aFunction : This enum value.
+	    
+	- TAny* a1 : NULL.
+									
+	- TAny* a2 : NULL.
+    */
+	ESoundHalBeep,
+
+
+    /**
+    Gets the maximum volume of the key click.
+    
+    Requirements of the HAL function handler's 2nd, 3rd and 4th parameters:
+	
+	- TInt aFunction : This enum value.
+	    
+	- TAny* a1 : A TInt value into which the HAL handler puts the maximum volume value.
+									
+	- TAny* a2 : NULL.
+    */
+	ESoundHalKeyClickVolumeMax,
+
+
+    /**
+    Gets the maximum volume of the pointer click.
+    
+    Requirements of the HAL function handler's 2nd, 3rd and 4th parameters:
+	
+	- TInt aFunction : This enum value.
+	    
+	- TAny* a1 : A TInt value into which the HAL handler puts the maximum volume value.
+									
+	- TAny* a2 : NULL.
+    */
+	ESoundHalPointerClickVolumeMax,
+	};
+
+
+
+
+/**
+@publishedPartner
+@released
+
+The set of function-ids that are  associated with the EHalGroupMouse
+HAL group.
+
+Each enum value represents a specific characteristic of the mouse device,
+and is passed as the second parameter to the HAL handler function
+dealing with this group.
+ 
+@see EHalGroupMouse
+*/
+enum TMouseHalFunction
+	{
+	
+	
+	/**
+	Tests whether a mouse device is visible.
+	
+	Requirements of the HAL function handler's 2nd, 3rd and 4th parameters:
+	
+	- TInt aFunction : This enum value.
+	
+    - TAny* a1 : A TBool into which the HAL handler
+    puts ETrue (for visible) or EFalse (for not-visible).
+				
+	- TAny* a2 : NULL
+	*/
+	EMouseHalMouseState,
+
+
+	/**
+	Sets the state of the mouse device, i.e. whether it is visible or invisible.
+	
+	Requirements of the HAL function handler's 2nd, 3rd and 4th parameters:
+	
+	- TInt aFunction : This enum value.
+	
+    - TAny* a1 : A TBool that needs to be set to ETrue (for visible)
+    or EFalse (for not-visible).
+				
+	- TAny* a2 : NULL
+	
+	@capability MultimediaDD
+	*/
+	EMouseHalSetMouseState,
+
+
+    /**
+    Gets the mouse speed, i.e. how fast the mouse pointer moves.
+    
+    Requirements of the HAL function handler's 2nd, 3rd and 4th parameters:
+	
+	- TInt aFunction : This enum value.
+	
+    - TAny* a1 : A TInt value into which the HAL handler puts the speed value.
+    This is expected to be a value in the range 0 to 255.
+				
+	- TAny* a2 : NULL
+    */
+	EMouseHalMouseSpeed,
+
+
+	/**
+	Sets the mouse speed, i.e. how fast the mouse pointer moves.
+	
+	Requirements of the HAL function handler's 2nd, 3rd and 4th parameters:
+	
+	- TInt aFunction : This enum value.
+	
+    - TAny* a1 : A TInt value containing the speed value to be set
+    This is expected to be a value in the range 0 to 255.
+				
+	- TAny* a2 : NULL
+	
+	@capability MultimediaDD
+	*/
+	EMouseHalSetMouseSpeed,
+ 
+ 
+    /**
+    Gets the mouse acceleration, i.e. how much the mouse pointer accelerates
+    as the user moves it faster.
+    
+    Requirements of the HAL function handler's 2nd, 3rd and 4th parameters:
+	
+	- TInt aFunction : This enum value.
+	
+    - TAny* a1 : A TInt value into which the HAL handler puts the acceleration value.
+    This is expected to be a value in the range 0 to 255.
+				
+	- TAny* a2 : NULL
+    */
+	EMouseHalMouseAcceleration,
+
+
+	/**
+	Sets the mouse acceleration, i.e. how much the mouse pointer accelerates
+    as the user moves it faster.
+	
+	Requirements of the HAL function handler's 2nd, 3rd and 4th parameters:
+	
+	- TInt aFunction : This enum value.
+	
+    - TAny* a1 : A TInt value containing the acceleration value to be set
+    This is expected to be a value in the range 0 to 255.
+				
+	- TAny* a2 : NULL
+	
+	@capability MultimediaDD
+	*/
+	EMouseHalSetMouseAcceleration,
+
+
+    /**
+    Gets the state of the mouse buttons.
+    
+    This is not currently supported.
+	*/
+	EMouseHalMouseButtonState,
+	
+	
+	/**
+	Gets information about the mouse display characteristics. 
+	
+	Requirements of the HAL function handler's 2nd, 3rd and 4th parameters:
+	
+	- TInt aFunction : This enum value.
+	
+	- TAny* a1 : This is a pointer to a package buffer (TPckgBuf) containing a
+	TMouseInfoV01 structure. The HAL function needs to fill the members of
+	this structure with the appropriate information.
+	
+    - TAny* a2 : NULL.
+    
+    @see TMouseInfoV01
+    @see TPckgBuf
+	*/
+	EMouseHalMouseInfo,
+	};
+
+/**
+@internalComponent
+*/
+enum TEmulatorHalFunction
+	{
+	EEmulatorHalStringProperty,
+	EEmulatorHalIntProperty,
+	EEmulatorHalBoolProperty,
+	EEmulatorHalMapFilename,
+	EEmulatorHalColorDepth,
+	EEmulatorHalSetFlip,
+	EEmulatorHalCPUSpeed,
+	EEmulatorHalNumberOfScreens,
+	EEmulatorHalSetDisplayChannel,
+	};
+
+/**
+@publishedPartner
+@released
+
+The set of function-ids that are  associated with the EHalGroupKeyboard
+HAL group.
+
+Each enum value represents a specific characteristic of the keyboard,
+and is passed as the second parameter to the HAL handler function
+dealing with this group.
+  
+@see EHalGroupKeyboard
+*/
+enum TKeyboardHalFunction
+	{
+	
+	/**
+    Tests whether the keyboard is on or off.
+    
+    Requirements of the HAL function handler's 2nd, 3rd and 4th parameters:
+	
+	- TInt aFunction : This enum value.
+	
+   	- TAny* a1 : A TBool into which the HAL handler puts ETrue (for On),
+    or EFalse (for Off).
+	
+	- TAny* a2 : NULL	
+	*/
+	EKeyboardHalKeyboardState,
+
+
+	/**
+	Sets the keyboard either on or off.
+	
+	Requirements of the HAL function handler's 2nd, 3rd and 4th parameters:
+	
+	- TInt aFunction : This enum value.
+	
+	- TAny* a1 :A TBool that needs to be set to ETrue (On), or EFalse (Off).
+	
+	- TAny* a2 : NULL	
+	
+	@capability PowerMgmt
+	*/
+	EKeyboardHalSetKeyboardState,
+
+
+    /**
+    Gets information about the keyboard.
+    
+    Requirements of the HAL function handler's 2nd, 3rd and 4th parameters:
+	
+	- TInt aFunction : This enum value.
+	
+	- TAny* a1 : This is a pointer to a package buffer (TPckgBuf) containing a
+	TKeyboardInfoV01 structure. The HAL function needs to fill the members of
+	this structure with the appropriate information.
+	
+    - TAny* a2 : NULL.
+    
+    @see TKeyboardInfoV01
+    @see TPckgBuf
+    */
+	EKeyboardHalKeyboardInfo,
+	};
+
+/**
+@publishedPartner
+@released
+
+The set of function-ids that are  associated with the EHalGroupVM
+HAL group.
+
+@see EHalGroupVM
+*/
+enum TVMHalFunction
+	{
+	/**
+	Evict the contents of the virtual memory cache and reduce it to its minimum size.
+
+	@capability WriteDeviceData
+	@test
+	*/
+	EVMHalFlushCache,
+
+	/**
+	Change the minimum and maximum RAM sizes used for the virtual memory cache.
+	These values may be silently restricted to platforn specific limits.
+	If required, GetCacheSize can be used to verify sizes actually applied to the system.
+
+	If there is not enough memory to set the specified cache size then KErrNoMemory is
+	returned, however the cache size may still have been modified in an attempt to 
+	service the request.
+
+	This hal function expects two TUint arguments.
+	The first argument (a1)	is the minimum size for cache in bytes.
+	The second argument (a2) is the maximum size for cache in bytes; using zero for
+	this value will restore cache sizes to the initial values used after boot.
+
+	The return value from the function is one of:
+			KErrNone, if successful; 
+			KErrNoMemory if the is not enough memory;
+			KErrArgument if a1>a2;
+			otherwise one of the other system wide error codes.
+
+	Example usage:
+	@code
+	TUint minRam = 128*1024; // 128k
+	TUint maxRam = KMaxTUint; // unlimited
+	TInt r = UserSvr::HalFunction(EHalGroupVM,EVMHalSetCacheSize,(TAny*)minRam,(TAny*)maxRam));
+	if(r!=KErrNone)
+		anErrorOccured();
+	@endcode
+
+	@capability WriteDeviceData
+	@test
+	*/
+	EVMHalSetCacheSize,
+
+	/**
+	Get the sizes for the virtual memory cache.
+	The first argument (a1) is a pointer to a #SVMCacheInfo object.
+	The second argument (a2) must be zero.
+	@test
+	*/
+	EVMHalGetCacheSize,
+
+	/**
+	Get paging event information.
+	The first argument (a1) is a pointer to a descriptor whose contents will be filled
+	with a #SVMEventInfo object.
+	The second argument (a2) must be zero.
+	@test
+	*/
+	EVMHalGetEventInfo,
+
+	/**
+	Reset the counters obtained with EVMHalGetEventInfo.
+	@test
+	*/
+	EVMHalResetEventInfo,
+
+	/**
+	@internalTechnology
+	@test
+	*/
+	EVMHalGetOriginalRomPages,
+
+	/**
+	@internalTechnology
+	@test
+	*/
+	EVMPageState,
+
+	/**
+	@internalTechnology
+	@test
+	*/
+	EVMHalGetConcurrencyInfo,
+
+	/**
+	@internalTechnology
+	@test
+	*/
+	EVMHalResetConcurrencyInfo,
+
+	/**
+	@internalTechnology
+	@test
+	*/
+	EVMHalGetPagingBenchmark,
+
+	/**
+	@internalTechnology
+	@test
+	*/
+	EVMHalResetPagingBenchmark,
+
+	};
+
+
+/**
+Paging event information.
+@publishedPartner
+@test
+*/
+struct SVMEventInfo
+	{
+	/**
+	The total number of page faults which have occurred.
+	*/
+	TUint64 iPageFaultCount;
+
+	/**
+	The total number of page faults which resulted in reading a page
+	from storage media.
+	*/
+	TUint64 iPageInReadCount;
+
+	// do not add new members to this struct.
+	// instead, derive a new SVMEventInfoV2 class from this and add new members to that.
+	};
+
+	
+/**
+VM cache information.
+@publishedPartner
+@test
+*/
+struct SVMCacheInfo
+	{
+	/**
+	The minimum size of virtual memory cache, in bytes.
+	*/
+	TUint32 iMinSize;
+
+	/**
+	The maximum size of virtual memory cache, in bytes.
+	*/
+	TUint32 iMaxSize;
+
+	/**
+	The current size of virtual memory cache, in bytes.
+	This may be larger than iMaxSize.
+	*/
+	TUint32 iCurrentSize;
+
+	/**
+	The current size of the freeable memory in the virtual memory cache, in bytes.
+	*/
+	TUint32 iMaxFreeSize;
+
+	// do not add new members to this struct, this is a compatability break
+	};
+
+
+/**
+Enumeration defining the bitmask returned from a call to the demnd paging HAL function
+EDemandPagingGetPageState.
+
+@internalComponent
+@test
+*/
+enum TDemandPagingPageState
+	{
+	// Values common to both moving and multiple memory models
+	EPageStateInRom					= 1<<16,
+	EPageStateInRamCode				= 1<<17,
+	EPageStatePaged					= 1<<18,
+	EPageStatePageTablePresent		= 1<<19,
+	EPageStatePtePresent			= 1<<20,
+	EPageStatePteValid				= 1<<21,
+	// Values specific to multiple memory model
+	EPageStateCodeChunkPresent		= 1<<22,		
+	EPageStatePhysAddrPresent		= 1<<23
+	};
+
+
+/**
+Information about concurrency in the demand paging system.
+
+@internalComponent
+@test
+*/
+struct SPagingConcurrencyInfo
+	{
+	/**
+	The maximum observed number of threads waiting to page in.
+	*/
+	TInt iMaxWaitingCount;
+
+	/**
+	The maximum observed number of threads paging in.
+	*/
+	TInt iMaxPagingCount;
+	};
+
+
+/**
+Enumeration of demand paging benchmarks.
+
+@internalComponent
+@test
+*/
+enum TPagingBenchmark
+	{
+	EPagingBmReadRomPage,
+	EPagingBmReadCodePage,
+	EPagingBmDecompress,
+	EPagingBmSetCodePageFree,
+	EPagingBmSetCodePageOld,
+	EPagingBmReadMedia,
+	EPagingBmFixupCodePage,
+		
+	EMaxPagingBm
+	};
+
+
+/**
+Benchmark information for a specific operation.  All times are in terms of the system's fast timer.
+
+@internalComponent
+@test
+*/
+struct SPagingBenchmarkInfo
+	{
+	/**
+	Number of times the operation has been executed.
+	*/
+	TInt iCount;
+	
+	/**
+	Total time elapsed while executing the operation.
+	*/
+	TInt64 iTotalTime;
+
+	/**
+	Maximum time recorded for a single execution.
+	*/
+	TInt iMaxTime;
+
+	/**
+	Minimum time recorded for a single execution.
+	*/
+	TInt iMinTime;
+	};
+
+/**
+Information about concurrency of ROM demand paging requests in the media subsystem.
+
+@internalComponent
+@test
+*/
+struct SMediaROMPagingConcurrencyInfo
+	{
+	/**
+	The maximum number of pending page in requests in the main queue any time during this session.
+	*/
+	TUint8 iMaxReqsInPending;
+
+	/**
+	The maximum number of pending page in requests in the deferred queue any time during this session.
+	*/
+	TUint8 iMaxReqsInDeferred;
+
+	/**
+	The maximum number of deferrals of any single page in request during this session.
+	*/
+	TUint8 iMaxDeferrals;
+
+	/**
+	The total number of times the page in DFC run with an empty main queue during this session.
+	*/
+	TUint8 iTotalRunDry;
+
+	/**
+	The total number of page in requests first-time deferred during this session.
+	*/
+	TUint iTotalFirstTimeDeferrals;
+
+	/**
+	The total number of page in requests re-deferred during this session (deferred again after being picked out of deferred queue).
+	*/
+	TUint iTotalReDeferrals;
+
+	/**
+	The total number of page in requests serviced from main queue when completing an asynchronous request.
+	*/
+	TUint iTotalSynchServicedFromMainQ;
+
+	/**
+	The total number of page in requests deferred after being picked out of main queue when completing an asynchronous request.
+	*/
+	TUint iTotalSynchDeferredFromMainQ;
+	
+	/**
+	The total number of page in requests issued whilst processing other page in requests.
+	*/
+	TUint iTotalConcurrentReqs;
+
+	/**
+	The total number of page in requests issued with at least one queue not empty.
+	*/
+	TUint iTotalReqIssuedNonEmptyQ;
+
+	/**
+	The total number of times the main queue was emptied when completing an asynchronous request during this session.
+	*/
+	TUint iTotalSynchEmptiedMainQ;
+
+	/**
+	The total number of times the page in DFC was cancelled because the main queue was synchronously emptied.
+	*/
+	TUint iTotalDryRunsAvoided;
+	};
+
+/**
+Information about concurrency of Code demand paging requests in the media subsystem.
+
+@internalComponent
+@test
+*/
+struct SMediaCodePagingConcurrencyInfo
+	{
+	/**
+	The maximum number of pending page in requests in the main queue any time during this session.
+	*/
+	TUint8 iMaxReqsInPending;
+
+	/**
+	The maximum number of pending page in requests in the deferred queue any time during this session.
+	*/
+	TUint8 iMaxReqsInDeferred;
+
+	/**
+	The maximum number of deferrals of any single page in request during this session.
+	*/
+	TUint8 iMaxDeferrals;
+
+	/**
+	Spare field
+	*/
+	TUint8 iSpare;
+
+	/**
+	The total number of page in requests first-time deferred during this session.
+	*/
+	TUint iTotalFirstTimeDeferrals;
+
+	/**
+	The total number of page in requests re-deferred during this session (deferred again after being picked out of deferred queue).
+	*/
+	TUint iTotalReDeferrals;
+
+	/**
+	The total number of page in requests serviced from main queue when completing an asynchronous request.
+	*/
+	TUint iTotalSynchServicedFromMainQ;
+
+	/**
+	The total number of page in requests deferred after being picked out of main queue when completing an asynchronous request.
+	*/
+	TUint iTotalSynchDeferredFromMainQ;
+	
+	/**
+	The total number of page in requests issued whilst processing other page in requests.
+	*/
+	TUint iTotalConcurrentReqs;
+
+	/**
+	The total number of page in requests issued with at least one queue not empty.
+	*/
+	TUint iTotalReqIssuedNonEmptyQ;
+	};
+
+
+/**
+@internalComponent
+
+The set of function-ids that are  associated with the EHalGroupRam
+HAL group.
+
+@see EHalGroupRam
+@test
+*/
+enum TRamHalFunction
+	{
+	/**
+	Retrieve the number of RAM Zones configured for this variant.
+
+	The first argument (a1) is a TUint in which to store the zone count.
+	The second argument (a2) must be zero.
+	@test
+	*/
+	ERamHalGetZoneCount,
+	
+	/**
+	Retrieve configuration information about a zone.
+
+	The first argument (a1) is a TUint indicating the index of the zone into the zone array.
+	The second argument (a2) is a pointer to a struct SRamZoneConfig in which to store the data.
+	@test
+	*/
+	ERamHalGetZoneConfig,
+	
+	/**
+	Retrieve utilisation information about a zone.
+
+	The first argument (a1) is a TUint indicating the index of the zone into the zone array.
+	The second argument (a2) is a pointer to a struct SRamZoneUtilisation in which to store the data.
+	@test
+	*/
+	ERamHalGetZoneUtilisation,
+
+	};
+
+/**
+Ram zone configuration information.
+@internalComponent
+@test
+*/
+struct SRamZoneConfig
+	{
+	/**
+	ID number of the RAM zone
+	*/
+	TUint iZoneId;
+
+	/**
+	The index of the RAM zone in the RAM zone array 
+	*/
+	TUint8 iZoneIndex;
+
+	/**
+	Physical base address of the RAM zone
+	*/
+	TUint32 iPhysBase;
+
+	/**
+	Physical end address of the RAM zone
+	*/
+	TUint32 iPhysEnd;
+
+	/**
+	The total number of pages that are in the RAM zone
+	*/
+	TUint32 iPhysPages;
+	
+	/**
+	Preference value for the RAM zone, lower preference RAM zones are used first
+	*/
+	TUint8 iPref;	
+
+	/**
+	Zone flags - specify whether the RAM zone should be reserved for contiguous buffer or h/w etc
+	*/
+	TUint iFlags;
+
+	};
+
+/**
+Ram zone utilisation information.
+@internalComponent
+@test
+*/
+struct SRamZoneUtilisation
+	{
+	/**
+	ID number of the RAM zone
+	*/
+	TUint iZoneId;			
+
+	/**
+	The index of the RAM zone in the zone array 
+	*/
+	TUint8 iZoneIndex;		
+
+	/**
+	The total number of pages that are in the RAM zone
+	*/
+	TUint32 iPhysPages;		
+
+	/**
+	The number of pages free in the RAM zone 
+	*/
+	TUint32 iFreePages;	
+	
+	/**
+	The number of 'unknown' (reserved at startup or holes in the zone) pages allocated in the RAM zone
+	*/
+	TUint32 iAllocUnknown;
+
+	/**
+	The number of fixed pages allocated in the RAM zone 
+	*/
+	TUint32 iAllocFixed; 
+
+	/**
+	The number of movable pages allocated in the RAM zone 
+	*/
+	TUint32 iAllocMovable; 
+
+	/**
+	The number of discardable pages allocated in the RAM zone 
+	*/
+	TUint32 iAllocDiscardable; 
+
+	/**
+	The number of other pages allocated in the RAM zone 
+	*/
+	TUint32 iAllocOther; 
+
+	};
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32/include/u32property.h	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,36 @@
+// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// \e32\include\u32property.h
+// 
+//
+
+#ifndef __U32PROPERTY_H__
+#define __U32PROPERTY_H__
+
+#include <e32cmn.h>
+
+/**
+@internalComponent
+*/
+class TPropertyInfo
+	{
+public:
+	TUint					iAttr;
+	TUint16					iSize;
+	RProperty::TType		iType;
+	TSecurityPolicy			iReadPolicy;
+	TSecurityPolicy			iWritePolicy;
+	};
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32/include/u32std.h	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,771 @@
+// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32\include\u32std.h
+// 
+//
+
+/**
+ @file
+ @internalComponent
+ @released
+*/
+
+#ifndef __U32STD_H__
+#define __U32STD_H__
+#include <e32cmn.h>
+#include <e32cmn_private.h>
+#include <e32hal.h>
+#include <e32lmsg.h>
+#include <e32event.h>
+#include <e32ldr.h>
+#include <e32power.h>
+#include <e32shbufcmn.h>
+#include <e32property.h>
+#include <u32property.h>
+#include <u32hal.h>
+
+#include <cpudefs.h>
+
+#ifdef __MARM__
+#define	EKA2_ENTRY_POINT_VERSION_IDENTIFIER	\
+	asm("tst pc, #%a0" : : "i" ((TInt)0) )
+#endif
+
+struct TUnicodeDataSet;                 // forward declaration
+struct TCollationDataSet;               // forward declaration
+
+/*
+The LCharSet structure is used in Unicode builds to supply locale-specific
+character attribute and collation data.
+
+The structure is defined in both builds to avoid having to have a dummy ExecHandler::GetLocaleCharSet function
+with a different signature in the 8-bit build.
+*/
+struct LCharSet
+	{
+	const TUnicodeDataSet* iCharDataSet;			// if non-null, character data overriding standard Unicode data
+	const TCollationDataSet* iCollationDataSet;		// if non-null, locale-specific collation data
+	};
+
+extern const LCharSet* GetLocaleCharSet();
+
+/** @internalTechnology */
+const TInt KNumLocaleExports = 22;
+
+//
+// The bits in the type table (non-Unicode build only)
+//
+#ifndef _UNICODE
+
+/** @internalTechnology */
+const TUint __U=0x01; // Uppercase letter
+
+/** @internalTechnology */
+const TUint __L=0x02; // Lowercase letter
+
+/** @internalTechnology */
+const TUint __D=0x04; // Decimal digit
+
+/** @internalTechnology */
+const TUint __S=0x08; // Space
+
+/** @internalTechnology */
+const TUint __P=0x10; // Punctuation
+
+/** @internalTechnology */
+const TUint __C=0x20; // Control character
+
+/** @internalTechnology */
+const TUint __X=0x40; // Hex digit
+
+/** @internalTechnology */
+const TUint __B=0x80; // A blank character
+
+#endif
+
+//
+// Time set mode parameters for setting system time and offset
+// 
+enum TTimeSetMode
+	{
+	ETimeSetTime = 1,    // set the time to the value given, else leave it unchanged
+	ETimeSetOffset = 2,  // set the offset to the value given, else leave it unchanged
+	ETimeSetAllowTimeReversal = 4,  // allow time to go backwards
+	ETimeSetNoTimeUpdate = 8,       // Don't restart second queue or notify changes - not valid with ESetTime, used early in boot only
+	ETimeSetLocalTime = 16,			// Set time in local time, instead of UTC
+	ETimeSetSecure = 32,  // use when setting the secure hardware clock
+	};
+
+//
+enum TMatchType {EMatchNormal,EMatchFolded,EMatchCollated};
+
+//
+// Constants for descriptor implementation code
+//
+enum TDesType {EBufC,EPtrC,EPtr,EBuf,EBufCPtr};
+const TUint KMaskDesLength=0xfffffff;
+const TInt KShiftDesType=28;
+
+//
+// Constants for iFlags in DProcess and DThread
+//
+const TUint KThreadFlagProcessCritical		= 0x00000001;	// thread panic panics process
+const TUint KThreadFlagProcessPermanent		= 0x00000002;	// thread exit of any kind causes process to exit (=main)
+const TUint KThreadFlagSystemCritical		= 0x00000004;	// thread panic reboots entire system
+const TUint KThreadFlagSystemPermanent		= 0x00000008;	// thread exit of any kind reboots entire system
+const TUint KThreadFlagOriginal				= 0x00000010;
+const TUint KThreadFlagLastChance			= 0x00000020;
+const TUint KThreadFlagRealtime				= 0x00000040;	// thread will be panicked when using some non-realtime functions
+const TUint KThreadFlagRealtimeTest			= 0x00000080;	// non-realtime functions only warn rather than panic
+const TUint KProcessFlagPriorityControl		= 0x40000000;
+const TUint KProcessFlagJustInTime			= 0x80000000;
+const TUint KProcessFlagSystemCritical		= KThreadFlagSystemCritical;	// process panic reboots entire system
+const TUint KProcessFlagSystemPermanent		= KThreadFlagSystemPermanent;	// process exit of any kind reboots entire system
+//
+const TUint KThreadHandle=0x40000000;
+//
+struct SPtrC8 {TInt length;const TUint8 *ptr;};
+struct SBufC8 {TInt length;TUint8 buf[1];};
+struct SPtr8 {TInt length;TInt maxLength;TUint8 *ptr;};
+struct SBuf8 {TInt length;TInt maxLength;TUint8 buf[1];};
+struct SBufCPtr8 {TInt length;TInt maxLength;SBufC8 *ptr;};
+
+struct SPtrC16 {TInt length;const TUint16 *ptr;};
+struct SBufC16 {TInt length;TUint16 buf[1];};
+struct SPtr16 {TInt length;TInt maxLength;TUint16 *ptr;};
+struct SBuf16 {TInt length;TInt maxLength;TUint16 buf[1];};
+struct SBufCPtr16 {TInt length;TInt maxLength;SBufC16 *ptr;};
+
+//
+// Flags used for IPC copy functions
+//
+const TInt KChunkShiftBy0=0;
+const TInt KChunkShiftBy1=KMinTInt;
+const TInt KIpcDirRead=0;
+const TInt KIpcDirWrite=0x10000000;
+
+class TChunkCreate
+	{
+public:
+	enum TChunkCreateAtt
+		{
+		ENormal=0x00,
+		EDoubleEnded=0x01,
+		EDisconnected=0x02,
+		EMappingMask=0x0f,
+		ELocal=0x00,
+		EGlobal=0x10,
+		EData=0x00,
+		ECode=0x20,
+
+		EChunkCreateAttMask = EMappingMask | EGlobal | ECode,
+		};
+public:
+	TUint iAtt;
+	TBool iForceFixed;
+	TInt iInitialBottom;
+	TInt iInitialTop;
+	TInt iMaxSize;
+	TUint8 iClearByte;
+	};
+
+enum TChunkRestrictions
+	{
+	// Keep this in sync with definitions in RChunk
+	EChunkPreventAdjust = 0x01,  // Disallow Adjust, Commit, Allocate and Decommit
+	};
+
+class TChannelDoCreate
+	{
+public:
+	TVersion iVer;
+	const TDesC *iName;
+	const TDesC *iPhysicalDevice;
+	const TDesC8 *iInfo;
+	};
+
+class TCreateSession
+	{
+public:
+	TVersion iVer;
+	TInt iMessageSlots;
+	};
+
+enum TObjectType
+	{
+	EThread=0,
+	EProcess,
+	EChunk,
+	ELibrary,
+	ESemaphore,
+	EMutex,
+	ETimer,
+	EServer,
+	ESession,
+	ELogicalDevice,
+	EPhysicalDevice,
+	ELogicalChannel,
+	EChangeNotifier,
+	EUndertaker,
+	EMsgQueue,	
+	EPropertyRef,
+	ECondVar,
+	EShPool,
+	EShBuf,
+	ENumObjectTypes,	// number of DObject-derived types
+	EObjectTypeAny=-1,
+
+	EIpcMessageD=0x20,	// lookup IPC message handle, allow disconnect
+	EIpcMessage=0x21,	// lookup IPC message handle, don't allow disconnect
+	EIpcClient=0x22,	// lookup IPC message client, don't allow disconnect
+	};
+
+class TObjectOpenInfo
+	{
+public:
+	TObjectType iObjType;
+	TBool isReadOnly;
+	};
+
+class TChannelCreateInfo
+	{
+public:
+	TVersion iVersion;
+	TInt iUnit;
+	const TDesC* iPhysicalDevice;
+	const TDesC8* iInfo;
+	};
+
+#if defined(_UNICODE) && !defined(__KERNEL_MODE__)
+class TChannelCreateInfo8
+	{
+public:
+	TVersion iVersion;
+	TInt iUnit;
+	const TDesC8* iPhysicalDevice;
+	const TDesC8* iInfo;
+	};
+#else
+typedef TChannelCreateInfo TChannelCreateInfo8;
+#endif
+
+const TInt KMaxThreadCreateInfo = 256;
+struct SThreadCreateInfo
+	{
+	TAny* iHandle;
+	TInt iType;
+	TThreadFunction iFunction;
+	TAny* iPtr;
+	TAny* iSupervisorStack;
+	TInt iSupervisorStackSize;
+	TAny* iUserStack;
+	TInt iUserStackSize;
+	TInt iInitialThreadPriority;
+	TPtrC iName;
+	TInt iTotalSize;	// Size including any extras (must be a multiple of 8 bytes)
+	};
+
+enum EThreadCreationFlags
+	{
+	ETraceHeapAllocs = 1,
+	EMonitorHeapMemory = 2,
+	};
+
+struct SStdEpocThreadCreateInfo : public SThreadCreateInfo
+	{
+	RAllocator* iAllocator;
+	TInt iHeapInitialSize;
+	TInt iHeapMaxSize;
+	TUint iFlags;
+	};
+
+#if defined(_UNICODE) && !defined(__KERNEL_MODE__)
+struct SThreadCreateInfo8
+	{
+	TAny* iHandle;
+	TInt iType;
+	TThreadFunction iFunction;
+	TAny* iPtr;
+	TAny* iSupervisorStack;
+	TInt iSupervisorStackSize;
+	TAny* iUserStack;
+	TInt iUserStackSize;
+	TInt iInitialThreadPriority;
+	TPtrC8 iName;
+	TInt iTotalSize;	// size including any extras
+	};
+
+struct SStdEpocThreadCreateInfo8 : public SThreadCreateInfo8
+	{
+	RAllocator* iAllocator;
+	TInt iHeapInitialSize;
+	TInt iHeapMaxSize;
+	TInt iPadding;		// Make structure size a multiple of 8 bytes
+	};
+#else
+typedef SThreadCreateInfo SThreadCreateInfo8;
+typedef SStdEpocThreadCreateInfo SStdEpocThreadCreateInfo8;
+#endif
+
+struct SIpcCopyInfo
+	{
+	TUint8* iLocalPtr;
+	TInt iLocalLen;
+	TInt iFlags;
+	};
+
+enum TChunkAdjust
+	{
+	EChunkAdjust=0,
+	EChunkAdjustDoubleEnded=1,
+	EChunkCommit=2,
+	EChunkDecommit=3,
+	EChunkAllocate=4,
+	EChunkUnlock=5,
+	EChunkLock=6
+	};
+
+enum TMemModelAttributes
+	{
+	EMemModelTypeMask=0xf,					// bottom 4 bits give type of memory model
+	EMemModelTypeDirect=0,					// direct memory model on hardware
+	EMemModelTypeMoving=1,					// moving memory model on hardware
+	EMemModelTypeMultiple=2,				// multiple memory model on hardware
+	EMemModelTypeEmul=3,					// emulation using single host process
+	EMemModelTypeFlexible=4,				// flexible memory model on hardware
+
+	EMemModelAttrRomPaging=0x10,			// Demand paging of XIP ROM
+	EMemModelAttrCodePaging=0x20,			// Demand paging of RAM loaded code
+	EMemModelAttrDataPaging=0x40,			// Demand paging of all RAM
+	EMemModelAttrPagingMask=0xf0,			// Mask for demand paging attributes
+
+	EMemModelAttrNonExProt=(TInt)0x80000000,// accesses to nonexistent addresses are trapped
+	EMemModelAttrKernProt=0x40000000,		// accesses to kernel memory from user mode are trapped
+	EMemModelAttrWriteProt=0x20000000,		// addresses can be marked as read-only; writes to these are trapped
+	EMemModelAttrVA=0x10000000,				// system supports virtual addresses
+	EMemModelAttrProcessProt=0x08000000,	// accesses to other processes' memory are trapped
+	EMemModelAttrSameVA=0x04000000,			// different processes map the same virtual address to different physical addresses
+	EMemModelAttrSupportFixed=0x02000000,	// 'fixed' processes are supported
+	EMemModelAttrSvKernProt=0x01000000,		// unexpected accesses to kernel memory within an executive call are trapped
+	EMemModelAttrIPCKernProt=0x00800000,	// accesses to kernel memory via IPC are trapped
+	EMemModelAttrIPCFullProt=0x00400000,	// accesses via IPC have same protection as user mode
+	EMemModelAttrRamCodeProt=0x00200000,	// RAM-loaded code is only visible to processes which have loaded it
+	};
+
+/** @test */
+enum TKernelHeapDebugFunction {EDbgMarkStart,EDbgMarkCheck,EDbgMarkEnd,EDbgSetAllocFail,EDbgSetBurstAllocFail,EDbgCheckFailure};
+
+/** @test */
+class TKernelHeapMarkCheckInfo
+	{
+public:
+	TBool iCountAll;
+	const TDesC8* iFileName;
+	TInt iLineNum;
+	};
+//
+class TTrapHandler;
+class CActiveScheduler;
+class TLocale;
+
+//
+//
+//
+// Handler below is used by test prints to trucate rather than panic the caller.
+//
+#if defined(_UNICODE) && !defined(__KERNEL_MODE__)
+NONSHARABLE_CLASS(TestOverflowTruncate) : public TDes16Overflow
+	{
+public:
+	virtual void Overflow(TDes16 &aDes);
+	};
+#else
+NONSHARABLE_CLASS(TestOverflowTruncate) : public TDes8Overflow
+	{
+public:
+	virtual void Overflow(TDes8 &aDes);
+	};
+#endif
+//
+
+/********************************************
+ * Thread local storage entry
+ ********************************************/
+struct STls
+	{
+	TInt	iHandle;
+	TInt	iDllUid;
+	TAny*	iPtr;
+	};
+
+const TInt KDllUid_Default = 0;		// for ROM DLLs and direct calls to UserSvr::DllTls
+const TInt KDllUid_Special = -1;	// used on emulator to instruct the kernel to get the DLL UID from the module handle
+
+/********************************************
+ * Entry point call values
+ ********************************************/
+const TInt	KModuleEntryReasonProcessInit		=0;		// Process start
+const TInt	KModuleEntryReasonThreadInit		=1;		// Start new thread
+const TInt	KModuleEntryReasonProcessAttach		=2;		// Process attach (init static data)
+const TInt	KModuleEntryReasonProcessDetach		=3;		// Process detach (destroy static data)
+const TInt	KModuleEntryReasonException			=4;		// Handle exception
+const TInt	KModuleEntryReasonVariantInit0		=-3;	// Call variant static constructors
+
+/** @publishedPartner
+	@released
+*/
+const TInt	KModuleEntryReasonExtensionInit0	=-2;	// Extension early initialisation check
+
+/** @publishedPartner
+	@released
+*/
+const TInt	KModuleEntryReasonExtensionInit1	=-1;	// Extension initialisation
+
+/**
+	Flags returned by Exec::KernelConfigFlags()
+*/
+enum TKernelConfigFlags
+	{
+	EKernelConfigIpcV1Available = 1<<0,
+	EKernelConfigPlatSecEnforcement = 1<<1,
+	EKernelConfigPlatSecDiagnostics = 1<<2,
+	EKernelConfigPlatSecProcessIsolation = 1<<3,
+	EKernelConfigPlatSecEnforceSysBin = 1<<4,
+
+	EKernelConfigPagingPolicyMask = 3<<5,
+	EKernelConfigPagingPolicyNoPaging = 0<<5,
+	EKernelConfigPagingPolicyAlwaysPage = 1<<5,
+	EKernelConfigPagingPolicyDefaultUnpaged = 2<<5,
+	EKernelConfigPagingPolicyDefaultPaged = 3<<5,
+
+	EKernelConfigPlatSecLocked = 1<<7,					// Primarily used by __PLATSEC_UNLOCKED__ (q.v.) test code
+
+	EKernelConfigCrazyScheduling = 1<<8,				// Enables thread priority/timeslice craziness
+
+	EKernelConfigDisableAPs = 1u<<30,
+
+	EKernelConfigTest = 1u<<31,							// Only used by test code for __PLATSEC_UNLOCKED__
+	};
+
+/**
+	If __PLATSEC_UNLOCKED__ is not defined, these flags must always
+	be considered to be set.  See KernelConfigFlags() in kern_priv.h.
+
+	@see KernelConfigFlags()
+
+	@internalTechnology
+*/
+#ifdef __PLATSEC_UNLOCKED__
+#define __PLATSEC_FORCED_FLAGS__	 0
+#else
+#define __PLATSEC_FORCED_FLAGS__	(EKernelConfigPlatSecEnforcement|EKernelConfigPlatSecProcessIsolation|EKernelConfigPlatSecEnforceSysBin)
+#endif
+
+/**
+@internalTechnology
+*/
+enum TGlobalUserData
+	{
+	ELocaleDefaultCharSet,
+	ELocalePreferredCharSet,
+	EMaxGlobalUserData
+	};
+
+typedef void (*TGlobalDestructorFunc)(void);
+
+// This must not conflict with any possible valid TLS keys
+const TInt KGlobalDestructorTlsKey = -1;
+
+GLREF_C void ExitCurrentThread(TExitType, TInt, const TDesC8*);
+
+#ifndef __REMOVE_PLATSEC_DIAGNOSTICS__
+/**
+@internalTechnology
+*/
+class TPlatSecDiagnostic
+	{
+public:
+	enum TType
+		{
+		ELoaderCapabilityViolation1,
+		ELoaderCapabilityViolation2,
+		EThreadCapabilityCheckFail,
+		EProcessCapabilityCheckFail,
+		EKernelSecureIdCheckFail,
+		EKernelObjectPolicyCheckFail,
+		EHandleCapabilityCheckFail,
+		ECreatorCapabilityCheckFail,
+		EMessageCapabilityCheckFail,
+		EKernelProcessIsolationFail,
+		EKernelProcessIsolationIPCFail,
+		ECreatorPolicyCheckFail,		
+		};
+public:
+	inline TPlatSecDiagnostic();
+	inline TPlatSecDiagnostic(TType aType);
+	inline TPlatSecDiagnostic(TType aType, TInt aInt1, TInt aInt2, const SCapabilitySet& aCaps);
+	inline TPlatSecDiagnostic(TType aType, TInt aInt1, const SSecurityInfo& aCaps);
+	inline TPlatSecDiagnostic(TType aType, TInt aInt, const TDesC8& aString, const SCapabilitySet& aCaps);
+	inline TPlatSecDiagnostic(TType aType, const TDesC8& aString1, const TDesC8& aString2, const SCapabilitySet& aCaps);
+	inline TPlatSecDiagnostic(TType aType, TInt aInt1, TInt aInt2);
+	inline TPlatSecDiagnostic(TType aType, TInt aInt1);
+	inline const TDesC8* String1();
+	inline const TDesC8* String2();
+public:
+	TType iType;
+	TInt iArg1;
+	TInt iArg2;
+	const char* iContextText;
+	TInt iContextTextLength;
+	SSecurityInfo iSecurityInfo;
+	};
+
+inline TPlatSecDiagnostic::TPlatSecDiagnostic()
+	{}
+
+inline TPlatSecDiagnostic::TPlatSecDiagnostic(TType aType)
+	: iType(aType)
+	{}
+
+inline TPlatSecDiagnostic::TPlatSecDiagnostic(TType aType,TInt aInt1)
+	: iType(aType), iArg1(aInt1)
+	{}
+
+inline TPlatSecDiagnostic::TPlatSecDiagnostic(TType aType, TInt aInt1, TInt aInt2, const SCapabilitySet& aCaps)
+	: iType(aType), iArg1(aInt1), iArg2(aInt2), iContextText(0) 
+	{
+	iSecurityInfo.iSecureId = 0;
+	iSecurityInfo.iVendorId = 0;
+	iSecurityInfo.iCaps = aCaps;
+	};
+inline TPlatSecDiagnostic::TPlatSecDiagnostic(TType aType, TInt aInt1, const SSecurityInfo& aInfo)
+	: iType(aType), iArg1(aInt1), iArg2(ECapability_None), iContextText(0), iSecurityInfo(aInfo) 
+	{
+	};
+
+inline TPlatSecDiagnostic::TPlatSecDiagnostic(TType aType, TInt aInt, const TDesC8& aString, const SCapabilitySet& aCaps)
+	: iType(aType), iArg1(aInt), iArg2((TInt)&aString), iContextText(0) 
+	{
+	iSecurityInfo.iSecureId = 0;
+	iSecurityInfo.iVendorId = 0;
+	iSecurityInfo.iCaps = aCaps;
+	};
+
+inline TPlatSecDiagnostic::TPlatSecDiagnostic(TType aType, const TDesC8& aString1, const TDesC8& aString2, const SCapabilitySet& aCaps)
+	: iType(aType), iArg1((TInt)&aString1), iArg2((TInt)&aString2), iContextText(0) 
+	{
+	iSecurityInfo.iSecureId = 0;
+	iSecurityInfo.iVendorId = 0;
+	iSecurityInfo.iCaps = aCaps;
+	};
+
+inline TPlatSecDiagnostic::TPlatSecDiagnostic(TType aType, TInt aInt1, TInt aInt2)
+	: iType(aType), iArg1(aInt1), iArg2(aInt2) 
+	{
+	iSecurityInfo.iSecureId = 0;
+	iSecurityInfo.iVendorId = 0;
+	iSecurityInfo.iCaps[0] = 0;
+	iSecurityInfo.iCaps[1] = 0;
+	};
+
+inline const TDesC8* TPlatSecDiagnostic::String1()
+	{ return (const TDesC8*)iArg1; }
+
+inline const TDesC8* TPlatSecDiagnostic::String2()
+	{ return (const TDesC8*)iArg2; }
+
+inline TInt PlatSec::LoaderCapabilityViolation(const TDesC8& aImporterName, const TDesC8& aFileName, const SCapabilitySet& aMissingCaps)
+	{
+	TPlatSecDiagnostic d(TPlatSecDiagnostic::ELoaderCapabilityViolation2,aImporterName,aFileName,aMissingCaps);
+	return EmitDiagnostic(d, NULL);
+	}
+
+#ifdef __KERNEL_MODE__
+
+inline TInt PlatSec::CapabilityCheckFail(const DProcess* aViolatingProcess, TCapability aCapability, const char* aContextText)
+	{
+	TPlatSecDiagnostic d(TPlatSecDiagnostic::EProcessCapabilityCheckFail,(TInt)aViolatingProcess,(TInt)aCapability);
+	return EmitDiagnostic(d,aContextText);
+	}
+
+inline TInt PlatSec::CapabilityCheckFail(const DThread* aViolatingThread, TCapability aCapability, const char* aContextText)
+	{
+	TPlatSecDiagnostic d(TPlatSecDiagnostic::EThreadCapabilityCheckFail,(TInt)aViolatingThread,(TInt)aCapability);
+	return EmitDiagnostic(d,aContextText);
+	}
+
+inline TInt PlatSec::SecureIdCheckFail(const DProcess* aViolatingProcess, TSecureId aSid, const char* aContextText)
+	{
+	TPlatSecDiagnostic d(TPlatSecDiagnostic::EKernelSecureIdCheckFail,(TInt)aViolatingProcess,(TInt)aSid);
+	return EmitDiagnostic(d,aContextText);
+	}
+
+inline TInt PlatSec::PolicyCheckFail(const DProcess* aProcess, const SSecurityInfo& aMissingSecurityInfo, const char* aContextText)
+	{
+	TPlatSecDiagnostic d(TPlatSecDiagnostic::EKernelObjectPolicyCheckFail,(TInt)aProcess,(const SSecurityInfo&)aMissingSecurityInfo);
+	return EmitDiagnostic(d,aContextText);
+	}
+
+inline TInt PlatSec::PolicyCheckFail(const DThread* aThread, const SSecurityInfo& aMissingSecurityInfo, const char* aContextText)
+	{
+	TPlatSecDiagnostic d(TPlatSecDiagnostic::EKernelObjectPolicyCheckFail,(TInt)aThread,(const SSecurityInfo&)aMissingSecurityInfo);
+	return EmitDiagnostic(d,aContextText);
+	}
+
+inline TInt PlatSec::ProcessIsolationFail(const char* aContextText)
+	{
+	TPlatSecDiagnostic d(TPlatSecDiagnostic::EKernelProcessIsolationFail);
+	return EmitDiagnostic(d,aContextText);
+	}
+
+inline TInt PlatSec::ProcessIsolationIPCFail(RMessageK* aMessage, const char* aContextText)
+	{
+	TPlatSecDiagnostic d(TPlatSecDiagnostic::EKernelProcessIsolationIPCFail,(TInt)aMessage);
+	return EmitDiagnostic(d,aContextText);
+	}
+
+#else // !__KERNEL_MODE__
+
+inline TInt PlatSec::LoaderCapabilityViolation(RProcess aLoadingProcess, const TDesC8& aFileName, const SCapabilitySet& aMissingCaps)
+	{
+	TPlatSecDiagnostic d(TPlatSecDiagnostic::ELoaderCapabilityViolation1,aLoadingProcess.Handle(),aFileName,aMissingCaps);
+	return EmitDiagnostic(d, NULL);
+	}
+
+inline TInt PlatSec::CreatorCapabilityCheckFail(TCapability aCapability, const char* aContextText)
+	{
+	TPlatSecDiagnostic d(TPlatSecDiagnostic::ECreatorCapabilityCheckFail,(TInt)0,aCapability);
+	return EmitDiagnostic(d,aContextText);
+	}
+
+inline TInt PlatSec::CreatorCapabilityCheckFail(const TCapabilitySet& aMissingCaps, const char* aContextText)
+	{
+	TPlatSecDiagnostic d(TPlatSecDiagnostic::ECreatorCapabilityCheckFail,(TInt)0,ECapability_None,(const SCapabilitySet&)aMissingCaps);
+	return EmitDiagnostic(d,aContextText);
+	}
+
+inline TInt PlatSec::CapabilityCheckFail(TInt aHandle, TCapability aCapability, const char* aContextText)
+	{
+	TPlatSecDiagnostic d(TPlatSecDiagnostic::EHandleCapabilityCheckFail,aHandle,aCapability);
+	return EmitDiagnostic(d,aContextText);
+	}
+
+inline TInt PlatSec::CapabilityCheckFail(TInt aHandle, const TCapabilitySet& aMissingCaps, const char* aContextText)
+	{
+	TPlatSecDiagnostic d(TPlatSecDiagnostic::EHandleCapabilityCheckFail,aHandle,ECapability_None,(const SCapabilitySet&)aMissingCaps);
+	return EmitDiagnostic(d,aContextText);
+	}
+
+inline TInt PlatSec::PolicyCheckFail(TInt aHandle, const SSecurityInfo& aMissingSecurityInfo, const char* aContextText)
+	{
+	TPlatSecDiagnostic d(TPlatSecDiagnostic::EHandleCapabilityCheckFail,aHandle,(const SSecurityInfo&)aMissingSecurityInfo);
+	return EmitDiagnostic(d,aContextText);
+	}
+
+inline TInt PlatSec::CapabilityCheckFail(RMessagePtr2 aMessage, TCapability aCapability, const char* aContextText)
+	{
+	TPlatSecDiagnostic d(TPlatSecDiagnostic::EMessageCapabilityCheckFail,(TInt)aMessage.Handle(),aCapability);
+	return EmitDiagnostic(d,aContextText);
+	}
+
+inline TInt PlatSec::CapabilityCheckFail(RMessagePtr2 aMessage, const TCapabilitySet& aMissingCaps, const char* aContextText)
+	{
+	TPlatSecDiagnostic d(TPlatSecDiagnostic::EMessageCapabilityCheckFail,(TInt)aMessage.Handle(),ECapability_None,(const SCapabilitySet&)aMissingCaps);
+	return EmitDiagnostic(d,aContextText);
+	}
+
+inline TInt PlatSec::PolicyCheckFail(RMessagePtr2 aMessage, const SSecurityInfo& aMissing, const char* aContextText)
+	{
+	TPlatSecDiagnostic d(TPlatSecDiagnostic::EMessageCapabilityCheckFail,(TInt)aMessage.Handle(),(const SSecurityInfo&)aMissing);
+	return EmitDiagnostic(d,aContextText);
+	}
+
+inline TInt PlatSec::CreatorPolicyCheckFail(const SSecurityInfo& aMissing, const char* aContextText)
+	{
+	TPlatSecDiagnostic d(TPlatSecDiagnostic::ECreatorPolicyCheckFail,(TInt)0,(const SSecurityInfo&)aMissing);
+	return EmitDiagnostic(d,aContextText);
+	}
+
+#endif //__KERNEL_MODE__
+#endif // !__REMOVE_PLATSEC_DIAGNOSTICS__
+
+const TInt KTlsArrayGranularity=2;
+
+#ifdef __CPU_HAS_CP15_THREAD_ID_REG
+
+#ifndef __TOOLS2__
+#define __USERSIDE_THREAD_DATA__
+#endif // __TOOLS2__
+
+class TLocalThreadData
+	{
+public:
+	void Close();
+#ifndef __KERNEL_MODE__
+	TAny* DllTls(TInt aHandle, TInt aDllUid);
+	TInt DllSetTls(TInt aHandle, TInt aDllUid, TAny* aPtr);
+	void DllFreeTls(TInt aHandle);
+#endif
+public:
+#ifndef __TOOLS2__
+	RAllocator* iHeap;				///< The thread's current heap
+#endif // __TOOLS2__
+	CActiveScheduler* iScheduler;	///< The thread's current active scheduler
+	TTrapHandler* iTrapHandler;		///< The thread's current trap handler
+private:
+	RAllocator* iTlsHeap; 			///< The heap that the DLL TLS data is stored on
+	RArray<STls> iTls; 				///< DLL TLS data
+	};
+
+const TInt KLocalThreadDataSize = _ALIGN_UP(sizeof(TLocalThreadData), 8);
+
+#endif
+
+#ifdef __WINS__
+
+enum TWin32RuntimeReason
+	{
+	// Same values as passed to DllMain
+	EWin32RuntimeProcessAttach = 1,
+	EWin32RuntimeThreadAttach = 2,
+	EWin32RuntimeThreadDetach = 3,
+	EWin32RuntimeProcessDetach = 4,
+	};
+
+typedef TBool (*TWin32RuntimeHook)(TWin32RuntimeReason);
+
+#endif
+
+struct SAtomicOpInfo64
+	{
+	TAny*		iA;
+	TAny*		iQ;
+	TUint64		i1;
+	TUint64		i2;
+	TUint64		i3;
+	};
+
+struct SAtomicOpInfo32
+	{
+	TAny*		iA;
+	union
+		{
+		TAny*	iQ;
+		TUint32	i0;
+		};
+	TUint32		i1;
+	TUint32		i2;
+	};
+
+#endif //__U32STD_H__
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32/include/unicode.h	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,168 @@
+// Copyright (c) 1997-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32\include\unicode.h
+// The TUnicode class contains a Unicode value. It is provided for convenience in implementing the
+// character attribute retrieval functions. It also contains:
+// structures used to store and search the tables of character information:
+// when modifying these, please remember that they form part of tables that must be initialised as aggregates,
+// so they cannot have constructors, non-public members, base classes or virtual functions. I have used 'struct'
+// rather than class to make that clear.
+// default constructor that sets the stored Unicode value to 0xFFFF - an invalid character
+// constructors and conversion functions for converting between integers and TUnicode objects
+// functions to retrieve the categories and attributes
+// The categories are explained in 'unicode_fields.txt', which is a key to the fields of the data file
+// 'unidata2.txt'; these files are supplied on the CD-ROM that comes with the book 'The Unicode Standard,
+// Version 2.0'.
+// Because the category constants must be available to users they are defined not here but in the TChar
+// class in e32std.h.
+// 
+//
+
+/**
+ @file
+ @internalTechnology
+*/
+
+
+#ifndef __UNICODE_H__
+#define __UNICODE_H__ 1
+
+#include <e32cmn.h>
+
+/*
+A structure to contain the raw data about a Unicode character:
+it must not have a constructor because an array of these in unitable.cpp is initialised as an aggregate.
+*/
+struct TUnicodeData
+	{
+	// bit values for iFlags
+	enum
+		{
+		EHasLowerCase = 1,			// adding the case offset gives the lower case form
+		EHasUpperCase = 2,			// subtracting the case offset gives the upper case form
+		EHasTitleCase = 4,			// a title case form exists that is distinct from the upper case form
+		EMirrored = 8,				// this character is replaced by a mirror-image in right-to-left text
+		ENumericFlags = 0x70,		// one of these flags is set if this number has a numeric value
+		ENonNumeric = 0x00,			// this character has no numeric value
+		ESmallNumeric = 0x10,		// numeric in the range 0..255 (see iDigitOffset)
+		EFiveHundred = 0x20,		// numeric with the value 500
+		EOneThousand = 0x30,		// numeric with the value 1000
+		EFiveThousand = 0x40,		// numeric with the value 5000
+		ETenThousand = 0x50,		// numeric with the value 10000
+		EHundredThousand = 0x60,	// numeric with the value 100000
+		EFraction = 0x70			// numeric with a fractional value
+		};
+
+	TUint8 iCategory;					// general category
+	TUint8 iBdCategory;					// bidirectional category
+	TUint8 iCombiningClass;				// combining class
+	TInt8 iDigitOffset;					// if this character has a small numeric value, the difference between the low
+										// 8 bits of the character code and the numeric value
+	TInt16 iCaseOffset;					// offset to other case; subtract to get upper case, add to get lower
+										// case (this makes it more likely that characters
+										// differing only by case have the same	data, making the table smaller)
+	TUint8 iFlags;						// flags: does this character have a lower case form, etc.
+	};
+
+/*
+A structure for a range of Unicode characters with the same raw data; must not have a
+constructor because an array of these in unitable.cpp is initialised as an aggregate.
+*/
+struct TUnicodeDataRange
+	{
+	TUint16 iRangeStart;	// Unicode value of the start of the range of characters
+	TInt16 iIndex;			// index into an array of character information structures (-1 means data no available)
+	};
+
+/*
+A structure to hold a set of overriding character data
+*/
+struct TUnicodeDataSet
+	{
+	const TUnicodeData *iData;			// array of character data structures
+	const TUnicodeDataRange *iRange;	// array of ranges referring to elements of iData
+	TInt iRanges;						// number of elements in the array of ranges
+	};
+
+// A structure to hold the standard character data
+struct TStandardUnicodeDataSet
+	{
+	const TUint16* iIndex1;				// first trie index: 4096 elements indexed by high 12 bits of Unicode value
+	const TUint16* iIndex2;				// second trie index, indexed by values in iIndex1
+	const TUnicodeData *iData;			// array of character data structures, indexed by values in iIndex2, offset
+										// by low 4 bits of Unicode value
+	};
+
+/*
+A class to hold a Unicode character and provide functions for characterisation (e.g., is this character lowercase?)
+composition (e.g., create a character from a base character and an accent), and decomposition
+(e.g., remove the accent from this character if there is one).
+*/
+class TUnicode
+	{
+	public:
+
+	// Constructors
+	TUnicode() { iCode = 0xFFFF; }
+	TUnicode(TUint c) : iCode(c) {}
+	operator TUint() const { return iCode; }
+
+	// Attribute retrieval (functions used by the ExecHandler class, etc., in ekern.dll take IMPORT_C)
+	void GetInfo(TChar::TCharInfo& aInfo,const TUnicodeDataSet *aOverridingDataSet) const;
+	IMPORT_C TChar::TCategory GetCategory(const TUnicodeDataSet *aOverridingDataSet) const;
+	TChar::TBdCategory GetBdCategory(const TUnicodeDataSet *aOverridingDataSet) const;
+	TInt GetCombiningClass(const TUnicodeDataSet *aOverridingDataSet) const;
+	IMPORT_C TUint GetLowerCase(const TUnicodeDataSet *aOverridingDataSet) const;
+	IMPORT_C TUint GetUpperCase(const TUnicodeDataSet *aOverridingDataSet) const;
+	TUint GetTitleCase(const TUnicodeDataSet *aOverridingDataSet) const;
+	TBool IsMirrored(const TUnicodeDataSet *aOverridingDataSet) const;
+	TInt GetNumericValue(const TUnicodeDataSet *aOverridingDataSet) const;
+	TChar::TCjkWidth GetCjkWidth() const;
+	IMPORT_C TUint Fold(TInt aFlags,const TUnicodeDataSet *aOverridingDataSet) const;
+	
+	// Utilities
+	static TInt Compare(const TUint16 *aString1,TInt aLength1,const TUint16 *aString2,TInt aLength2);
+
+	private:
+	const TUnicodeData& GetData(const TUnicodeDataSet *aOverridingDataSet) const;
+	const TUnicodeData *GetDataFromDataSet(const TUnicodeDataSet& aDataSet) const;
+	TUint GetLowerCase(const TUnicodeData& aData) const;
+	TUint GetUpperCase(const TUnicodeData& aData) const;
+	TUint GetTitleCase(const TUnicodeData& aData) const;
+	TInt GetNumericValue(const TUnicodeData& aData) const;
+
+	TUint iCode; // not TUint16 because values in the extended range from 0x10000 to 0xFFFFF may be used.
+
+	public:
+#ifndef __KERNEL_MODE__
+	static const TUint16 FoldTable[256];		// fold table (strip accents, fold case) for the range 0..255
+	static const TUint16 CjkWidthFoldTable[256];// width fold table (convert from width variants) for range 0xFF00..0xFFFF
+#else
+	static const TUint16* FoldTable;
+	static const TUint16* CjkWidthFoldTable;
+#endif
+	};
+
+// Declarations for tables held in unitable.cpp and used by unicode.cpp.
+#ifndef __KERNEL_MODE__
+extern const TStandardUnicodeDataSet TheStandardUnicodeDataSet;
+extern const TUint16 TheUnicodeCompositionBuffer[];
+extern const TInt TheUnicodeCompositions;
+#else
+extern const TStandardUnicodeDataSet* pStandardUnicodeDataSet;
+extern const TUint16* TheUnicodeCompositionBuffer;
+extern TInt TheUnicodeCompositions;
+#endif
+
+#endif // __UNICODE_H__
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32/include/videodriver.h	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,78 @@
+// Copyright (c) 2001-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+/**
+ @file
+ @publishedPartner
+ @released
+*/
+
+#ifndef __VIDEODRIVER_H__
+#define __VIDEODRIVER_H__
+
+#include <e32cmn.h>
+
+struct SRectOpInfo
+	{
+	TInt	iX;
+	TInt	iY;
+	TInt	iWidth;
+	TInt	iHeight;
+	TInt	iSrcX;
+	TInt	iSrcY;
+	TUint32	iColor;
+	};
+
+
+/**
+Encapsulates information about the screen display mode.
+
+An object of this type is passed, via a TPckgBuf, to the HAL handler
+that deals with the HAL group,function-id pair:
+- EHalGroupDisplay, EDisplayHalCurrentModeInfo;
+- EHalGroupDisplay, EDisplayHalSpecifiedModeInfo;
+
+@see EDisplayHalCurrentModeInfo
+@see EDisplayHalSpecifiedModeInfo
+@see TDisplayHalFunction
+@see EHalGroupDisplay
+@see TPckgBuf
+*/
+class TVideoInfoV01
+	{
+public:
+	TSize	iSizeInPixels;				/**< The visible width/height of the display in pixels. */
+	TSize	iSizeInTwips;				/**< The visible width/height of the display in twips. */
+	TBool	iIsMono;					/**< True if display is monochrome; false otherwise. */
+	TBool	iIsPalettized;				/**< True if display is palettized (in current display mode); false otherwise. */
+	TInt	iBitsPerPixel;				/**< The number of bits in one pixel. */
+	TInt	iVideoAddress;				/**< The virtual address of screen memory. */
+	TInt	iOffsetToFirstPixel;		/**< Number of bytes from iVideoAddress for the first displayed pixel. */
+	TInt	iOffsetBetweenLines;		/**< Number of bytes between start of one line and start of next. */
+	TBool	iIsPixelOrderRGB;			/**< The orientation of sub pixels on the screen; True if RBG, False if BGR. */
+	TBool	iIsPixelOrderLandscape;		/**< True if display pixels are landscape. */
+	TInt	iDisplayMode;				/**< The current display mode. */
+	};
+
+
+/**
+Package buffer for a TVideoInfoV01 object.
+
+@see TVideoInfoV01
+*/
+typedef TPckgBuf<TVideoInfoV01> TVideoInfoV01Buf;
+
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32/include/x86hlp_gcc.inl	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,455 @@
+// Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32\common\x86\x86hlp_gcc.inl
+// If there are no exports then GCC 3.4.x does not generate a .reloc 
+// section, without which rombuild can't relocate the .code section
+// to its ROM address. Your ROM then goes boom early in the boot sequence.
+// This unused export forces the PE to be generated with a .reloc section.
+// 
+//
+
+EXPORT_C void __ignore_this_export()
+	{
+	}
+
+static void DivisionByZero()
+	{
+	asm("int 0");
+	}
+
+extern "C" {
+
+void __NAKED__ _alloca()
+{
+	// GCC passes the param in eax and expects no return value
+	asm("pop ecx");
+	asm("sub esp, eax");
+	asm("push ecx");
+	asm("ret");
+}
+
+void __NAKED__ _allmul()
+//
+// Multiply two 64 bit integers returning a 64 bit result
+// On entry:
+//		[esp+4], [esp+8] = arg 1
+//		[esp+12], [esp+16] = arg 1
+// Return result in edx:eax
+// Remove arguments from stack
+//
+	{
+	asm("mov eax, [esp+4]");		// eax = low1
+	asm("mul dword ptr [esp+16]");	// edx:eax = low1*high2
+	asm("mov ecx, eax");			// keep low 32 bits of product
+	asm("mov eax, [esp+8]");		// eax = high1
+	asm("mul dword ptr [esp+12]");	// edx:eax = high1*low2
+	asm("add ecx, eax");			// accumulate low 32 bits of product
+	asm("mov eax, [esp+4]");		// eax = low1
+	asm("mul dword ptr [esp+12]");	// edx:eax = low1*low2
+	asm("add edx, ecx");			// add cross terms to high 32 bits
+	asm("ret");
+	}
+
+void __NAKED__ udiv64_divby0()
+	{
+	asm("int 0");					// division by zero exception
+	asm("ret");
+	}
+
+__NAKED__ /*LOCAL_C*/ void UDiv64()
+	{
+	// unsigned divide edx:eax by edi:esi
+	// quotient in ebx:eax, remainder in edi:edx
+	// ecx, ebp, esi also modified
+	asm("test edi, edi");
+	asm("jnz short UDiv64a");			// branch if divisor >= 2^32
+	asm("test esi, esi");
+	asm("jz %a0": : "i"(&DivisionByZero)); // if divisor=0, branch to error routine
+	asm("mov ebx, eax");				// ebx=dividend low
+	asm("mov eax, edx");				// eax=dividend high
+	asm("xor edx, edx");				// edx=0
+	asm("div esi");						// quotient high now in eax
+	asm("xchg eax, ebx");				// quotient high in ebx, dividend low in eax
+	asm("div esi");						// quotient now in ebx:eax, remainder in edi:edx
+	asm("ret");
+	asm("UDiv64e:");
+	asm("xor eax, eax");				// set result to 0xFFFFFFFF
+	asm("dec eax");
+	asm("jmp short UDiv64f");
+	asm("UDiv64a:");
+	asm("js short UDiv64b");			// skip if divisor msb set
+	asm("bsr ecx, edi");				// ecx=bit number of divisor msb - 32
+	asm("inc cl");
+	asm("push edi");					// save divisor high
+	asm("push esi");					// save divisor low
+	asm("shrd esi, edi, cl");			// shift divisor right so that msb is bit 31
+	asm("mov ebx, edx");				// dividend into ebx:ebp
+	asm("mov ebp, eax");
+	asm("shrd eax, edx, cl");			// shift dividend right same number of bits
+	asm("shr edx, cl");
+	asm("cmp edx, esi");				// check if approx quotient will be 2^32
+	asm("jae short UDiv64e");			// if so, true result must be 0xFFFFFFFF
+	asm("div esi");						// approximate quotient now in eax
+	asm("UDiv64f:");
+	asm("mov ecx, eax");				// into ecx
+	asm("mul edi");						// multiply approx. quotient by divisor high
+	asm("mov esi, eax");				// ls dword into esi, ms into edi
+	asm("mov edi, edx");
+	asm("mov eax, ecx");				// approx. quotient into eax
+	asm("mul dword ptr [esp]");			// multiply approx. quotient by divisor low
+	asm("add edx, esi");				// edi:edx:eax now equals approx. quotient * divisor
+	asm("adc edi, 0");
+	asm("xor esi, esi");
+	asm("sub ebp, eax");				// subtract dividend - approx. quotient *divisor
+	asm("sbb ebx, edx");
+	asm("sbb esi, edi");
+	asm("jnc short UDiv64c");			// if no borrow, result OK
+	asm("dec ecx");						// else result is one too big
+	asm("add ebp, [esp]");				// and add divisor to get correct remainder
+	asm("adc ebx, [esp+4]");
+	asm("UDiv64c:");
+	asm("mov eax, ecx");				// result into ebx:eax, remainder into edi:edx
+	asm("mov edi, ebx");
+	asm("mov edx, ebp");
+	asm("xor ebx, ebx");
+	asm("add esp, 8");					// remove temporary values from stack
+	asm("ret");
+	asm("UDiv64b:");
+	asm("mov ebx, 1");
+	asm("sub eax, esi");				// subtract divisor from dividend
+	asm("sbb edx, edi");
+	asm("jnc short UDiv64d");			// if no borrow, result=1, remainder in edx:eax
+	asm("add eax, esi");				// else add back
+	asm("adc edx, edi");
+	asm("dec ebx");						// and decrement quotient
+	asm("UDiv64d:");
+	asm("mov edi, edx");				// remainder into edi:edx
+	asm("mov edx, eax");
+	asm("mov eax, ebx");				// result in ebx:eax
+	asm("xor ebx, ebx");
+	asm("ret");
+	}
+
+__NAKED__ void _aulldvrm()
+//
+// Divide two 64 bit unsigned integers, returning a 64 bit result
+// and a 64 bit remainder
+//
+// On entry:
+//		[esp+4], [esp+8] = dividend
+//		[esp+12], [esp+16] = divisor
+//
+// Return (dividend / divisor) in edx:eax
+// Return (dividend % divisor) in ebx:ecx
+//
+// Remove arguments from stack
+//
+	{
+	asm("push ebp");
+	asm("push edi");
+	asm("push esi");
+	asm("mov eax, [esp+16]");
+	asm("mov edx, [esp+20]");
+	asm("mov esi, [esp+24]");
+	asm("mov edi, [esp+28]");
+	asm("call %a0": : "i"(&UDiv64));
+	asm("mov ecx, edx");
+	asm("mov edx, ebx");
+	asm("mov ebx, edi");
+	asm("pop esi");
+	asm("pop edi");
+	asm("pop ebp");
+	asm("ret");
+	}
+
+__NAKED__ void _alldvrm()
+//
+// Divide two 64 bit signed integers, returning a 64 bit result
+// and a 64 bit remainder
+//
+// On entry:
+//		[esp+4], [esp+8] = dividend
+//		[esp+12], [esp+16] = divisor
+//
+// Return (dividend / divisor) in edx:eax
+// Return (dividend % divisor) in ebx:ecx
+//
+// Remove arguments from stack
+//
+	{
+	asm("push ebp");
+	asm("push edi");
+	asm("push esi");
+	asm("mov eax, [esp+16]");
+	asm("mov edx, [esp+20]");
+	asm("mov esi, [esp+24]");
+	asm("mov edi, [esp+28]");
+	asm("test edx, edx");
+	asm("jns alldrvm_dividend_nonnegative");
+	asm("neg edx");
+	asm("neg eax");
+	asm("sbb edx, 0");
+	asm("alldrvm_dividend_nonnegative:");
+	asm("test edi, edi");
+	asm("jns alldrvm_divisor_nonnegative");
+	asm("neg edi");
+	asm("neg esi");
+	asm("sbb edi, 0");
+	asm("alldrvm_divisor_nonnegative:");
+	asm("call %a0": : "i"(&UDiv64));
+	asm("mov ebp, [esp+20]");
+	asm("mov ecx, edx");
+	asm("xor ebp, [esp+28]");
+	asm("mov edx, ebx");
+	asm("mov ebx, edi");
+	asm("jns alldrvm_quotient_nonnegative");
+	asm("neg edx");
+	asm("neg eax");
+	asm("sbb edx, 0");
+	asm("alldrvm_quotient_nonnegative:");
+	asm("cmp dword ptr [esp+20], 0");
+	asm("jns alldrvm_rem_nonnegative");
+	asm("neg ebx");
+	asm("neg ecx");
+	asm("sbb ebx, 0");
+	asm("alldrvm_rem_nonnegative:");
+	asm("pop esi");
+	asm("pop edi");
+	asm("pop ebp");
+	asm("ret");
+	}
+
+//__NAKED__ void _aulldiv()
+__NAKED__ void __udivdi3 ()
+//
+// Divide two 64 bit unsigned integers returning a 64 bit result
+// On entry:
+//		[esp+4], [esp+8] = dividend
+//		[esp+12], [esp+16] = divisor
+// Return result in edx:eax
+// Remove arguments from stack
+//
+	{
+	asm("push ebp");
+	asm("push edi");
+	asm("push esi");
+	asm("push ebx");
+	asm("mov eax, [esp+20]");
+	asm("mov edx, [esp+24]");
+	asm("mov esi, [esp+28]");
+	asm("mov edi, [esp+32]");
+	asm("call %a0": : "i"(&UDiv64));
+	asm("mov edx, ebx");
+	asm("pop ebx");
+	asm("pop esi");
+	asm("pop edi");
+	asm("pop ebp");
+	asm("ret");
+	}
+
+
+__NAKED__ void __divdi3()
+
+//
+// Divide two 64 bit signed integers returning a 64 bit result
+// On entry:
+//		[esp+4], [esp+8] = dividend
+//		[esp+12], [esp+16] = divisor
+// Return result in edx:eax
+// Remove arguments from stack
+//
+	{
+	asm("push ebp");
+	asm("push edi");
+	asm("push esi");
+	asm("push ebx");
+	asm("mov eax, [esp+20]");
+	asm("mov edx, [esp+24]");
+	asm("mov esi, [esp+28]");
+	asm("mov edi, [esp+32]");
+	asm("test edx, edx");
+	asm("jns divdi_dividend_nonnegative");
+	asm("neg edx");
+	asm("neg eax");
+	asm("sbb edx, 0");
+	asm("divdi_dividend_nonnegative:");
+	asm("test edi, edi");
+	asm("jns divdi_divisor_nonnegative");
+	asm("neg edi");
+	asm("neg esi");
+	asm("sbb edi, 0");
+	asm("divdi_divisor_nonnegative:");
+	asm("call %a0": : "i"(&UDiv64));
+	asm("mov ecx, [esp+24]");
+	asm("mov edx, ebx");
+	asm("xor ecx, [esp+32]");
+	asm("jns divdi_quotient_nonnegative");
+	asm("neg edx");
+	asm("neg eax");
+	asm("sbb edx, 0");
+	asm("divdi_quotient_nonnegative:");
+	asm("pop ebx");
+	asm("pop esi");
+	asm("pop edi");
+	asm("pop ebp");
+	asm("ret");
+	}
+
+__NAKED__ void __umoddi3()
+//
+// Divide two 64 bit unsigned integers and return 64 bit remainder
+// On entry:
+//		[esp+4], [esp+8] = dividend
+//		[esp+12], [esp+16] = divisor
+// Return result in edx:eax
+// Remove arguments from stack
+//
+	{
+	asm("push ebp");
+	asm("push edi");
+	asm("push esi");
+	asm("push ebx");
+	asm("mov eax, [esp+20]");
+	asm("mov edx, [esp+24]");
+	asm("mov esi, [esp+28]");
+	asm("mov edi, [esp+32]");
+	asm("call %a0": : "i"(&UDiv64));
+	asm("mov eax, edx");
+	asm("mov edx, edi");
+	asm("pop ebx");
+	asm("pop esi");
+	asm("pop edi");
+	asm("pop ebp");
+	asm("ret");
+	}
+
+__NAKED__ void __moddi3()
+//
+// Divide two 64 bit signed integers and return 64 bit remainder
+// On entry:
+//		[esp+4], [esp+8] = dividend
+//		[esp+12], [esp+16] = divisor
+// Return result in edx:eax
+// Remove arguments from stack
+//
+	{
+	asm("push ebp");
+	asm("push edi");
+	asm("push esi");
+	asm("push ebx");
+	asm("mov eax, [esp+20]");
+	asm("mov edx, [esp+24]");
+	asm("mov esi, [esp+28]");
+	asm("mov edi, [esp+32]");
+	asm("test edx, edx");
+	asm("jns dividend_nonnegative");
+	asm("neg edx");
+	asm("neg eax");
+	asm("sbb edx, 0");
+	asm("dividend_nonnegative:");
+	asm("test edi, edi");
+	asm("jns divisor_nonnegative");
+	asm("neg edi");
+	asm("neg esi");
+	asm("sbb edi, 0");
+	asm("divisor_nonnegative:");
+	asm("call %a0": : "i"(&UDiv64));
+	asm("mov eax, edx");
+	asm("mov edx, edi");
+	asm("cmp dword ptr [esp+24], 0");
+	asm("jns rem_nonnegative");
+	asm("neg edx");
+	asm("neg eax");
+	asm("sbb edx, 0");
+	asm("rem_nonnegative:");
+	asm("pop ebx");
+	asm("pop esi");
+	asm("pop edi");
+	asm("pop ebp");
+	asm("ret");
+	}
+
+__NAKED__ void _allshr()
+//
+// Arithmetic shift right EDX:EAX by CL
+//
+	{
+	asm("cmp cl, 64");
+	asm("jae asr_count_ge_64");
+	asm("cmp cl, 32");
+	asm("jae asr_count_ge_32");
+	asm("shrd eax, edx, cl");
+	asm("sar edx, cl");
+	asm("ret");
+	asm("asr_count_ge_32:");
+	asm("sub cl, 32");
+	asm("mov eax, edx");
+	asm("cdq");
+	asm("sar eax, cl");
+	asm("ret");
+	asm("asr_count_ge_64:");
+	asm("sar edx, 32");
+	asm("mov eax, edx");
+	asm("ret");
+	}
+
+__NAKED__ void _allshl()
+//
+// shift left EDX:EAX by CL
+//
+	{
+	asm("cmp cl, 64");
+	asm("jae lsl_count_ge_64");
+	asm("cmp cl, 32");
+	asm("jae lsl_count_ge_32");
+	asm("shld edx, eax, cl");
+	asm("shl eax, cl");
+	asm("ret");
+	asm("lsl_count_ge_32:");
+	asm("sub cl, 32");
+	asm("mov edx, eax");
+	asm("xor eax, eax");
+	asm("shl edx, cl");
+	asm("ret");
+	asm("lsl_count_ge_64:");
+	asm("xor edx, edx");
+	asm("xor eax, eax");
+	asm("ret");
+	}
+
+__NAKED__ void _aullshr()
+//
+// Logical shift right EDX:EAX by CL
+//
+	{
+	asm("cmp cl, 64");
+	asm("jae lsr_count_ge_64");
+	asm("cmp cl, 32");
+	asm("jae lsr_count_ge_32");
+	asm("shrd eax, edx, cl");
+	asm("shr edx, cl");
+	asm("ret");
+	asm("lsr_count_ge_32:");
+	asm("sub cl, 32");
+	asm("mov eax, edx");
+	asm("xor edx, edx");
+	asm("shr eax, cl");
+	asm("ret");
+	asm("lsr_count_ge_64:");
+	asm("xor edx, edx");
+	asm("xor eax, eax");
+	asm("ret");
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32test/buffer/T_FoldPerf.cpp	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,712 @@
+// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+#include <e32test.h>
+
+static RTest TheTest(_L("T_FoldPerf"));
+
+#define ARRAY_SIZE(ar) (sizeof(ar) / (sizeof(ar[0])))
+
+const TText16 KText16[] = {'1', 'f', 'A', 0x01D5, 'k', '5', 'g', 'U', 'W', 'q', 'a', 
+                           0x095E, 0x01D5, 'a', 'B', 'c', 'd', 'E', 'F', 0};
+//0x095E - DEVANAGARI LETTER FA
+//decomposed to: 0x092B 0x093C
+//0x01D5 - LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON
+//decomposed to: 0x0075 0x0308 0x0304
+
+_LIT16(KPlainText, "abcdefghijklmnopqrst");
+
+/**
+@SYMTestCaseID SYSLIB-UNICODE-CT-0108
+@SYMTestCaseDesc FindF - performance test
+@SYMTestPriority High
+@SYMTestActions  FindF - performance test
+@SYMTestExpectedResults The test must not fail.
+@SYMPREQ814 Optimise folded string comparisons.
+*/
+static void FindF_PerformanceTest()
+    {
+	TheTest.Next(_L("FindF test"));
+
+    TBufC16<ARRAY_SIZE(KText16) - 1> text(KText16);
+
+    TBufC16<3> searchStr1(_L16("gUw"));
+
+    const TText16 searchText2[] = {0x01D5, 'A', 'b', 0};
+    TBufC16<ARRAY_SIZE(searchText2) - 1> searchStr2(searchText2);
+
+    const TText16 searchText3[] = {0x0075, 0x0308, 0x0304, 'A', 'b', 0};
+    TBufC16<ARRAY_SIZE(searchText3) - 1> searchStr3(searchText3);
+
+    const TText16 searchText4[] = {0x095E, 'd', 'A', 'b', 0};
+    TBufC16<ARRAY_SIZE(searchText4) - 1> searchStr4(searchText4);
+
+    const TText16 searchText5[] = {0x095E, 0x0055, 0x0308, 0x0304, 'A', 'b', 'C', 0};
+    TBufC16<ARRAY_SIZE(searchText5) - 1> searchStr5(searchText5);
+
+    TBufC16<4> searchStr6(_L16("CDEF"));
+
+    TUint timeStart = User::TickCount();
+    for(TInt i=0;i<10000;++i)
+        {
+        TInt res = text.FindF(searchStr1);
+        TheTest(res == 6);//searchStr1 starts at position 6
+
+        res = text.FindF(searchStr2);
+        TheTest(res == 12);
+
+        res = text.FindF(searchStr3);
+        TheTest(res == 12);
+
+        res = text.FindF(searchStr4);
+        TheTest(res == KErrNotFound);
+
+        res = text.FindF(searchStr5);
+        TheTest(res == 11);
+
+        res = text.FindF(searchStr6);
+        TheTest(res == 15);
+        }
+	TUint timeEnd = User::TickCount();
+	TheTest.Printf(_L("Time = %d ticks\n"), timeEnd - timeStart);
+    }
+
+/**
+@SYMTestCaseID SYSLIB-UNICODE-CT-0109
+@SYMTestCaseDesc MatchF - performance test
+@SYMTestPriority High
+@SYMTestActions  MatchF - performance test
+@SYMTestExpectedResults The test must not fail.
+@SYMPREQ814 Optimise folded string comparisons.
+*/
+static void MatchF_PerformanceTest()
+    {
+	TheTest.Next(_L("MatchF test"));
+
+    TBufC16<ARRAY_SIZE(KText16) - 1> text(KText16);
+
+    TBufC16<11> searchStr1(_L16("*fa??5*W*a*"));
+
+    const TText16 searchText2[] = {'*', 0x01D5, 'A', '?', 'C', '*', 0};
+    TBufC16<ARRAY_SIZE(searchText2) - 1> searchStr2(searchText2);
+
+    const TText16 searchText3[] = {'*', 0x0075, 0x0308, 0x0304, '*', 'e', 'F', 0};
+    TBufC16<ARRAY_SIZE(searchText3) - 1> searchStr3(searchText3);
+
+    const TText16 searchText4[] = {'1', '*', 'A', 'b', '*', 0};
+    TBufC16<ARRAY_SIZE(searchText4) - 1> searchStr4(searchText4);
+
+    TBufC16<11> searchStr5(_L16("*fa?z5*W*a*"));
+
+    TBufC16<5> searchStr6(_L16("a?v?T"));
+
+    TUint timeStart = User::TickCount();
+    for(TInt i=0;i<10000;++i)
+        {
+        TInt res = text.MatchF(searchStr1);
+        TheTest(res == 1);
+
+        res = text.MatchF(searchStr2);
+        TheTest(res == 12);
+
+        res = text.MatchF(searchStr3);
+        TheTest(res == 3);
+
+        res = text.MatchF(searchStr4);
+        TheTest(res == 0);
+
+        res = text.MatchF(searchStr5);
+        TheTest(res == KErrNotFound);
+
+        res = text.MatchF(searchStr6);
+        TheTest(res == KErrNotFound);
+        }
+	TUint timeEnd = User::TickCount();
+	TheTest.Printf(_L("Time = %d ticks\n"), timeEnd - timeStart);
+    }
+
+/**
+@SYMTestCaseID SYSLIB-UNICODE-CT-0110
+@SYMTestCaseDesc CompareF - performance test
+@SYMTestPriority High
+@SYMTestActions  CompareF - performance test
+@SYMTestExpectedResults The test must not fail.
+@SYMPREQ814 Optimise folded string comparisons.
+*/
+static void CompareF_PerformanceTest()
+    {
+	TheTest.Next(_L("CompareF test"));
+
+    TBufC16<ARRAY_SIZE(KText16) - 1> text(KText16);
+
+    const TText16 text1[] = {'1', 'F', 'A', 0x01D5, 'k', '5', 'G', 'U', 'W', 'Q', 'A', 
+                             0x095E, 0x01D5, 'a', 'B', 'C', 'd', 'E', 'F', 0};
+    TBufC16<ARRAY_SIZE(text1) - 1> str1(text1);
+
+    TBufC16<19> str2(_L16("1234567890123456789"));
+
+    TBufC16<19> str3(_L16("1fA4G6789r1d34z6789"));
+
+    TUint timeStart = User::TickCount();
+    TInt i;
+    for(i=0;i<10000;++i)
+        {
+        TInt res = text.CompareF(str1);
+        TheTest(res == 0);
+
+        res = text.CompareF(str2);
+        TheTest(res != 0);
+
+        res = text.CompareF(str3);
+        TheTest(res != 0);
+        }
+	TUint timeEnd = User::TickCount();
+	TheTest.Printf(_L("1. Time = %d ticks\n"), timeEnd - timeStart);
+
+    TBufC16<20> str4(_L16("abc3456hijklmnopqrst"));
+    timeStart = User::TickCount();
+    for(i=0;i<10000;++i)
+        {
+        TInt res = str4.CompareF(KPlainText);
+        TheTest(res != 0);
+        }
+	timeEnd = User::TickCount();
+	TheTest.Printf(_L("2. Time = %d ticks\n"), timeEnd - timeStart);
+
+    }
+
+/**
+@SYMTestCaseID SYSLIB-UNICODE-CT-0114
+@SYMTestCaseDesc FindF(), CompareF(), MatchF() on plain (no combining characters) text
+@SYMTestPriority High
+@SYMTestActions  Performance test
+@SYMTestExpectedResults The test must not fail.
+@SYMPREQ814 Optimise folded string comparisons.
+*/
+static void PlainTextPerformanceTest()
+    {
+	TheTest.Next(_L("Plain text - performance test"));
+
+    TInt res;
+    TInt i;
+
+    TBufC16<20> str1(_L16("abcdefghijklmnopqrst"));
+    TBufC16<20> str2(_L16("abcDefghIjklmNOpqrsT"));
+    TBufC16<20> str3(_L16("abcDefghIjKlmNOp2rsT"));
+
+    TUint timeStart = User::TickCount();
+    for(i=0;i<10000;++i)
+        {
+        res = KPlainText().CompareF(str1);
+        TheTest(res == 0);
+        res = KPlainText().CompareF(str2);
+        TheTest(res == 0);
+        res = KPlainText().CompareF(str3);
+        TheTest(res != 0);
+        }
+	TUint timeEnd = User::TickCount();
+	TheTest.Printf(_L("CompareF() Time = %d ticks\n"), timeEnd - timeStart);
+
+    TBufC16<20> str4(_L16("gHiJk"));
+    TBufC16<20> str5(_L16("Opqr"));
+    TBufC16<20> str6(_L16("2rsT"));
+
+    timeStart = User::TickCount();
+    for(i=0;i<10000;++i)
+        {
+        res = KPlainText().FindF(str4);
+        TheTest(res == 6);
+        res = KPlainText().FindF(str5);
+        TheTest(res == 14);
+        res = KPlainText().FindF(str6);
+        TheTest(res == KErrNotFound);
+        }
+	timeEnd = User::TickCount();
+	TheTest.Printf(_L("FindF() Time = %d ticks\n"), timeEnd - timeStart);
+
+    TBufC16<20> str7(_L16("*gHiJk*op??sT"));
+    TBufC16<20> str8(_L16("aBC*rst"));
+    TBufC16<20> str9(_L16("ab?D*2rsT"));
+
+    timeStart = User::TickCount();
+    for(i=0;i<10000;++i)
+        {
+        res = KPlainText().MatchF(str7);
+        TheTest(res == 6);
+        res = KPlainText().MatchF(str8);
+        TheTest(res == 0);
+        res = KPlainText().MatchF(str9);
+        TheTest(res == KErrNotFound);
+        }
+	timeEnd = User::TickCount();
+	TheTest.Printf(_L("MatchF() Time = %d ticks\n"), timeEnd - timeStart);
+
+    TBufC16<21> str10(_L16("abcdefghijklmnopqrst"));
+    TBufC16<20> str11(_L16("*xyz*"));
+    TBufC16<20> str12(_L16("xyz"));
+
+    timeStart = User::TickCount();
+    for(i=0;i<10000;++i)
+        {
+        res = str10.FindF(str12);
+        TheTest(res == KErrNotFound);
+        }
+	timeEnd = User::TickCount();
+	TheTest.Printf(_L("Nonmatching string. FindF() Time = %d ticks\n"), timeEnd - timeStart);
+
+    timeStart = User::TickCount();
+    for(i=0;i<10000;++i)
+        {
+        res = str10.MatchF(str11);
+        TheTest(res == KErrNotFound);
+        res = str10.MatchF(str12);
+        TheTest(res == KErrNotFound);
+        }
+	timeEnd = User::TickCount();
+	TheTest.Printf(_L("Nonmatching string. MatchF() Time = %d ticks\n"), timeEnd - timeStart);
+    }
+    
+static void RunComparison_PerformanceTest(TInt aNumberOfTimes, TDesC& aOriginalText, TDesC& aToCompareText, TBool aCase, TInt aValue = 0)
+	{
+	TUint timeStart;
+	TUint timeEnd;
+	TInt res = 0;
+	TInt i;
+	
+	// CompareF() case...
+	timeStart = User::TickCount();
+	
+	for(i=0; i<aNumberOfTimes; ++i)
+        {
+        res = aOriginalText.CompareF(aToCompareText);
+        
+        if(aCase)
+        	TheTest(res == 0);
+        else
+        	TheTest(res != 0);
+        }
+ 
+    timeEnd = User::TickCount();
+    
+    TheTest.Printf(_L("Time to run (x%d) 16-bit CompareF() = %d ticks\n"), aNumberOfTimes, timeEnd - timeStart);
+    
+    // Check return value
+    
+    TheTest(res == aValue);
+	
+	// Compare() case...
+	timeStart = User::TickCount();
+	
+	for(i=0; i<aNumberOfTimes; ++i)
+        {
+        res = aOriginalText.Compare(aToCompareText);
+        
+        if(aCase)
+        	TheTest(res == 0);
+        else
+        	TheTest(res != 0);
+        }
+        
+    timeEnd = User::TickCount();
+    
+    TheTest.Printf(_L("Time to run (x%d) 16-bit Compare() = %d ticks\n"), aNumberOfTimes, timeEnd - timeStart);
+	}
+    
+static void RunComparison_PerformanceTest(TInt aNumberOfTimes, TDesC8& aOriginalText, TDesC8& aToCompareText, TBool aCase, TInt aValue = 0)
+	{
+	TUint timeStart;
+	TUint timeEnd;
+	TInt res = 0;
+	TInt i;
+	
+	// CompareF() case...
+	timeStart = User::TickCount();
+	
+	for(i=0; i<aNumberOfTimes; ++i)
+        {
+        res = aOriginalText.CompareF(aToCompareText);
+        
+        if(aCase)
+        	TheTest(res == 0);
+        else
+        	TheTest(res != 0);
+        }
+ 
+    timeEnd = User::TickCount();
+    
+    TheTest.Printf(_L("Time to run (x%d) 8-bit CompareF() = %d ticks\n"), aNumberOfTimes, timeEnd - timeStart);
+
+    // Check return value
+    
+    TheTest(res == aValue);
+	
+	// Compare() case...
+	timeStart = User::TickCount();
+	
+	for(i=0; i<aNumberOfTimes; ++i)
+        {
+        res = aOriginalText.Compare(aToCompareText);
+        
+        if(aCase)
+        	TheTest(res == 0);
+        else
+        	TheTest(res != 0);
+        }
+        
+    timeEnd = User::TickCount();
+    
+    TheTest.Printf(_L("Time to run (x%d) 8-bit Compare() = %d ticks\n"), aNumberOfTimes, timeEnd - timeStart);
+	}  
+  
+static void CompareVsCompareF_PerformanceTest()
+	{
+	TheTest.Next(_L("Compare verses CompareF test"));
+
+	// Declare variables...
+	
+	TInt numberOfTimes = 100000;
+
+	const TText16 smallUnicodeText16[] = {0x01D5, 0x0308, 0x0304, 0x095E, 0x01D5, 0}; // 5 Characters
+	
+	const TText16 largeUnicodeText16[] = {0x01D5, 0x0308, 0x0304, 0x095E, 0x01D5, 
+						   		 		  0x01D5, 0x0308, 0x0304, 0x095E, 0x01D5, 
+								 		  0x01D5, 0x0308, 0x0304, 0x095E, 0x01D5, 
+								 		  0x01D5, 0x0308, 0x0304, 0x095E, 0x01D5, 
+								 		  0x01D5, 0x0308, 0x0304, 0x095E, 0x01D5, 
+								 		  0x01D5, 0x0308, 0x0304, 0x095E, 0x01D5, 
+								 		  0x01D5, 0x0308, 0x0304, 0x095E, 0x01D5, 
+								 		  0x01D5, 0x0308, 0x0304, 0x095E, 0x01D5, 
+								 		  0x01D5, 0x0308, 0x0304, 0x095E, 0x01D5, 
+								 		  0x01D5, 0x0308, 0x0304, 0x095E, 0x01D5, 0};	// 50 Characters
+	
+	const TText16 smallErrUnicodeTextLast16[] = {0x01D5, 0x0308, 0x0304, 0x095E, 'X', 0}; // 5 Characters
+	
+	const TText16 smallErrUnicodeTextFirst16[] = {'X', 0x0308, 0x0304, 0x095E, 0x01D5, 0}; // 5 Characters
+	
+	const TText16 largeErrUnicodeTextLast16[] = {0x01D5, 0x0308, 0x0304, 0x095E, 0x01D5, 
+						   		 		  		 0x01D5, 0x0308, 0x0304, 0x095E, 0x01D5, 
+								 		  		 0x01D5, 0x0308, 0x0304, 0x095E, 0x01D5, 
+								 		  		 0x01D5, 0x0308, 0x0304, 0x095E, 0x01D5, 
+								 		  		 0x01D5, 0x0308, 0x0304, 0x095E, 0x01D5, 
+								 		  		 0x01D5, 0x0308, 0x0304, 0x095E, 0x01D5, 
+								 		  		 0x01D5, 0x0308, 0x0304, 0x095E, 0x01D5, 
+								 		  		 0x01D5, 0x0308, 0x0304, 0x095E, 0x01D5, 
+								 		  		 0x01D5, 0x0308, 0x0304, 0x095E, 0x01D5, 
+								 		  		 0x01D5, 0x0308, 0x0304, 0x095E, 'X', 0};	// 50 Characters
+	
+	const TText16 largeErrUnicodeTextFirst16[] = {'X', 0x0308, 0x0304, 0x095E, 0x01D5, 
+						   		 		  		  0x01D5, 0x0308, 0x0304, 0x095E, 0x01D5, 
+								 		  		  0x01D5, 0x0308, 0x0304, 0x095E, 0x01D5, 
+								 		  		  0x01D5, 0x0308, 0x0304, 0x095E, 0x01D5, 
+								 		  		  0x01D5, 0x0308, 0x0304, 0x095E, 0x01D5, 
+								 		  		  0x01D5, 0x0308, 0x0304, 0x095E, 0x01D5, 
+								 		  		  0x01D5, 0x0308, 0x0304, 0x095E, 0x01D5, 
+								 		  		  0x01D5, 0x0308, 0x0304, 0x095E, 0x01D5, 
+								 		  		  0x01D5, 0x0308, 0x0304, 0x095E, 0x01D5, 
+								 		  		  0x01D5, 0x0308, 0x0304, 0x095E, 0x01D5, 0};	// 50 Characters
+	
+	const TText16 smallMixedText16[] = {'A', 'B', 'C', 0x095E, 0x01D5,  0}; // 5 Characters
+	
+	const TText16 largeMixedText16[] = {'A', 'B', 'C', 0x095E, 0x01D5, 
+						   		 		'F', 'G', 'H', 'I', 'J', 
+								 		'K', 'L', 'M', 'N', 'O', 
+								 		'P', 'Q', 'R', 'S', 'T', 
+								 		'U', 'V', 'W', 'X', 'Y', 
+								 		'Z', '1', '2', '3', '4', 
+								 		'5', '6', '7', '8', '9', 
+								 		'a', 'b', 'c', 'd', 'e', 
+								 		'f', 'g', 'h', 'i', 'j', 
+								 		'k', 'l', 'm', 0x095E, 0x01D5, 0}; // 50 Characters
+								 		
+	const TText16 smallErrMixedTextLast16[] = {'A', 'B', 'C', 0x095E, 0x0304,  0}; // 5 Characters
+	
+	const TText16 smallErrMixedTextFirst16[] = {0x0304, 'B', 'C', 0x095E, 0x01D5,  0}; // 5 Characters
+	
+	const TText16 largeErrMixedTextLast16[] = {'A', 'B', 'C', 0x095E, 0x01D5, 
+						   		 			   'F', 'G', 'H', 'I', 'J', 
+								 			   'K', 'L', 'M', 'N', 'O', 
+								 			   'P', 'Q', 'R', 'S', 'T', 
+								 			   'U', 'V', 'W', 'X', 'Y', 
+								 			   'Z', '1', '2', '3', '4', 
+								 			   '5', '6', '7', '8', '9', 
+								 			   'a', 'b', 'c', 'd', 'e', 
+								 			   'f', 'g', 'h', 'i', 'j', 
+								 			   'k', 'l', 'm', 0x095E, 0x0304, 0}; // 50 Characters
+	
+	const TText16 largeErrMixedTextFirst16[] = {0x0304, 'B', 'C', 0x095E, 0x01D5, 
+						   		 				'F', 'G', 'H', 'I', 'J', 
+						   		 				'K', 'L', 'M', 'N', 'O', 
+						   		 				'P', 'Q', 'R', 'S', 'T', 
+						   		 				'U', 'V', 'W', 'X', 'Y', 
+						   		 				'Z', '1', '2', '3', '4', 
+						   		 				'5', '6', '7', '8', '9', 
+						   		 				'a', 'b', 'c', 'd', 'e', 
+						   		 				'f', 'g', 'h', 'i', 'j', 
+						   		 				'k', 'l', 'm', 0x095E, 0x01D5, 0}; // 50 Characters
+	
+	// (16-bit) Ascii Set of variables
+	
+	TBufC16<50> oriAsciiLargeText(_L("ABCDEFGHIJKLMNOPQRSTUVWXYZ123456789abcdefghijklmno")); 
+	TBufC16<5> oriAsciiSmallText(_L("ABCDE"));
+	
+	TBufC16<50> matchAsciiLargeText(_L("ABCDEFGHIJKLMNOPQRSTUVWXYZ123456789abcdefghijklmno"));
+	TBufC16<5> matchAsciiSmallText(_L("ABCDE"));
+		
+	TBufC16<50> nonMatchAsciiLargeTextLast(_L("ABCDEFGHIJKLMNOPQRSTUVWXYZ123456789abcdefghijklmnX"));
+	TBufC16<50> nonMatchAsciiLargeTextFirst(_L("XBCDEFGHIJKLMNOPQRSTUVWXYZ123456789abcdefghijklmno"));
+	
+	TBufC16<5> nonMatchAsciiSmallTextLast(_L("ABCDX"));
+	TBufC16<5> nonMatchAsciiSmallTextFirst(_L("XBCDE"));
+	
+	// (8-bit) Ascii Set of variables
+	
+	TBufC8<50> oriAsciiLargeText8(_L8("ABCDEFGHIJKLMNOPQRSTUVWXYZ123456789abcdefghijklmno"));
+	TBufC8<5> oriAsciiSmallText8(_L8("ABCDE"));
+	
+	TBufC8<50> matchAsciiLargeText8(_L8("ABCDEFGHIJKLMNOPQRSTUVWXYZ123456789abcdefghijklmno"));
+	TBufC8<5> matchAsciiSmallText8(_L8("ABCDE"));
+	
+	TBufC8<50> nonMatchAsciiLargeTextLast8(_L8("ABCDEFGHIJKLMNOPQRSTUVWXYZ123456789abcdefghijklmnX"));
+	TBufC8<50> nonMatchAsciiLargeTextFirst8(_L8("XBCDEFGHIJKLMNOPQRSTUVWXYZ123456789abcdefghijklmno"));
+	
+	TBufC8<5> nonMatchAsciiSmallTextLast8(_L8("ABCDX"));
+	TBufC8<5> nonMatchAsciiSmallTextFirst8(_L8("XBCDE"));
+	
+	// (16-bit) Unicode Set of variables
+	
+	TBufC16<ARRAY_SIZE(largeUnicodeText16) - 1> oriUnicodeLargeText(largeUnicodeText16);
+	TBufC16<ARRAY_SIZE(smallUnicodeText16) - 1> oriUnicodeSmallText(smallUnicodeText16);
+	
+	TBufC16<ARRAY_SIZE(largeUnicodeText16) - 1> matchUnicodeLargeText(largeUnicodeText16);
+	TBufC16<ARRAY_SIZE(smallUnicodeText16) - 1> matchUnicodeSmallText(smallUnicodeText16);
+	
+	TBufC16<ARRAY_SIZE(largeErrUnicodeTextLast16) - 1> nonMatchUnicodeLargeTextLast(largeErrUnicodeTextLast16);
+	TBufC16<ARRAY_SIZE(largeErrUnicodeTextFirst16) - 1> nonMatchUnicodeLargeTextFirst(largeErrUnicodeTextFirst16);
+	
+	TBufC16<ARRAY_SIZE(smallErrUnicodeTextLast16) - 1> nonMatchUnicodeSmallTextLast(smallErrUnicodeTextLast16);
+	TBufC16<ARRAY_SIZE(smallErrUnicodeTextFirst16) - 1> nonMatchUnicodeSmallTextFirst(smallErrUnicodeTextFirst16);
+	
+	// (16-bit) Unicode/Ascii Set of variables
+	
+	TBufC16<ARRAY_SIZE(largeMixedText16) - 1> oriMixedLargeText(largeMixedText16);
+	TBufC16<ARRAY_SIZE(smallMixedText16) - 1> oriMixedSmallText(smallMixedText16);
+	
+	TBufC16<ARRAY_SIZE(largeMixedText16) - 1> matchMixedLargeText(largeMixedText16);
+	TBufC16<ARRAY_SIZE(smallMixedText16) - 1> matchMixedSmallText(smallMixedText16);
+	
+	TBufC16<ARRAY_SIZE(largeErrMixedTextLast16) - 1> nonMatchMixedLargeTextLast(largeErrMixedTextLast16);
+	TBufC16<ARRAY_SIZE(largeErrMixedTextFirst16) - 1> nonMatchMixedLargeTextFirst(largeErrMixedTextFirst16);
+	
+	TBufC16<ARRAY_SIZE(smallErrMixedTextLast16) - 1> nonMatchMixedSmallTextLast(smallErrMixedTextLast16);
+	TBufC16<ARRAY_SIZE(smallErrMixedTextFirst16) - 1> nonMatchMixedSmallTextFirst(smallErrMixedTextFirst16);
+		
+	// Run performance tests...
+	
+	TheTest.Printf(_L("\n====== (8-bit) Ascii Performance tests ======"));
+	
+	// Matching (8-bit) Ascii
+	
+	TheTest.Printf(_L("\nComparing Performance Times For: \nMatching Large Ascii Text\n"));
+	RunComparison_PerformanceTest(numberOfTimes, oriAsciiLargeText8, matchAsciiLargeText8, ETrue);
+	
+	TheTest.Printf(_L("\nComparing Performance Times For: \nMatching Small Ascii Text\n"));
+	RunComparison_PerformanceTest(numberOfTimes, oriAsciiSmallText8, matchAsciiSmallText8, ETrue);
+	
+	// Non Matching (8-bit) Ascii
+	
+	TheTest.Printf(_L("\nComparing Performance Times For: \nNON Matching Large Ascii Text / Last Char Diff / Large Vs Large\n"));
+	RunComparison_PerformanceTest(numberOfTimes, oriAsciiLargeText8, nonMatchAsciiLargeTextLast8, EFalse, -9);
+	
+	TheTest.Printf(_L("\nComparing Performance Times For: \nNON Matching Large Ascii Text / First Char Diff / Large Vs Large\n"));
+	RunComparison_PerformanceTest(numberOfTimes, oriAsciiLargeText8, nonMatchAsciiLargeTextFirst8, EFalse, -23);
+	
+	TheTest.Printf(_L("\nComparing Performance Times For: \nNON Matching Small Ascii Text / Last Char Diff / Small Vs Small\n"));
+	RunComparison_PerformanceTest(numberOfTimes, oriAsciiSmallText8, nonMatchAsciiSmallTextLast8, EFalse, -19);
+	
+	TheTest.Printf(_L("\nComparing Performance Times For: \nNON Matching Small Ascii Text / First Char Diff / Small Vs Small\n"));
+	RunComparison_PerformanceTest(numberOfTimes, oriAsciiSmallText8, nonMatchAsciiSmallTextFirst8, EFalse, -23);
+	
+	TheTest.Printf(_L("\nComparing Performance Times For: \nNON Matching Large Ascii Text / Last Char Diff / Large Vs Small\n"));
+	RunComparison_PerformanceTest(numberOfTimes, oriAsciiLargeText8, nonMatchAsciiSmallTextLast8, EFalse, -19);
+	
+	TheTest.Printf(_L("\nComparing Performance Times For: \nNON Matching Large Ascii Text / First Char Diff / Large Vs Small\n"));
+	RunComparison_PerformanceTest(numberOfTimes, oriAsciiLargeText8, nonMatchAsciiSmallTextFirst8, EFalse, -23);
+	
+	TheTest.Printf(_L("\nComparing Performance Times For: \nNON Matching Small Ascii Text / Last Char Diff / Small Vs Large\n"));
+	RunComparison_PerformanceTest(numberOfTimes, oriAsciiSmallText8, nonMatchAsciiLargeTextLast8, EFalse, -45);
+	
+	TheTest.Printf(_L("\nComparing Performance Times For: \nNON Matching Small Ascii Text / First Char Diff / Small Vs Large\n"));
+	RunComparison_PerformanceTest(numberOfTimes, oriAsciiSmallText8, nonMatchAsciiLargeTextFirst8, EFalse, -23);
+	
+	// Mismatching length (8-bit) Ascii
+	
+	TheTest.Printf(_L("\nComparing Performance Times For: \nNON Matching Small Ascii Text / Length Mismatch / Small Vs Large\n"));
+	RunComparison_PerformanceTest(numberOfTimes, oriAsciiSmallText8, oriAsciiLargeText8, EFalse, -45);
+	
+	TheTest.Printf(_L("\nComparing Performance Times For: \nNON Matching Large Ascii Text / Length Mismatch / Large Vs Small\n"));
+	RunComparison_PerformanceTest(numberOfTimes, oriAsciiLargeText8, oriAsciiSmallText8, EFalse, 45);	
+	
+	TheTest.Printf(_L("\n====== (16-bit) Ascii Performance tests ======"));
+	
+	// Matching (16-bit) Ascii
+		
+	TheTest.Printf(_L("\nComparing Performance Times For: \nMatching Large Ascii Text\n"));
+	RunComparison_PerformanceTest(numberOfTimes, oriAsciiLargeText, matchAsciiLargeText, ETrue);
+	
+	TheTest.Printf(_L("\nComparing Performance Times For: \nMatching Small Ascii Text\n"));
+	RunComparison_PerformanceTest(numberOfTimes, oriAsciiSmallText, matchAsciiSmallText, ETrue); 
+	
+	// Non Matching (16-bit) Ascii
+		   
+	TheTest.Printf(_L("\nComparing Performance Times For: \nNON Matching Large Ascii Text / Last Char Diff / Large Vs Large\n"));
+	RunComparison_PerformanceTest(numberOfTimes, oriAsciiLargeText, nonMatchAsciiLargeTextLast, EFalse, -9);
+	
+	TheTest.Printf(_L("\nComparing Performance Times For: \nNON Matching Large Ascii Text / First Char Diff / Large Vs Large\n"));
+	RunComparison_PerformanceTest(numberOfTimes, oriAsciiLargeText, nonMatchAsciiLargeTextFirst, EFalse, -23);
+	
+	TheTest.Printf(_L("\nComparing Performance Times For: \nNON Matching Small Ascii Text / Last Char Diff / Small Vs Small\n"));
+	RunComparison_PerformanceTest(numberOfTimes, oriAsciiSmallText, nonMatchAsciiSmallTextLast, EFalse, -19);
+	
+	TheTest.Printf(_L("\nComparing Performance Times For: \nNON Matching Small Ascii Text / First Char Diff / Small Vs Small\n"));
+	RunComparison_PerformanceTest(numberOfTimes, oriAsciiSmallText, nonMatchAsciiSmallTextFirst, EFalse, -23);
+	
+	TheTest.Printf(_L("\nComparing Performance Times For: \nNON Matching Large Ascii Text / Last Char Diff / Large Vs Small\n"));
+	RunComparison_PerformanceTest(numberOfTimes, oriAsciiLargeText, nonMatchAsciiSmallTextLast, EFalse, -19);
+	
+	TheTest.Printf(_L("\nComparing Performance Times For: \nNON Matching Large Ascii Text / First Char Diff / Large Vs Small\n"));
+	RunComparison_PerformanceTest(numberOfTimes, oriAsciiLargeText, nonMatchAsciiSmallTextFirst, EFalse, -23);
+	
+	TheTest.Printf(_L("\nComparing Performance Times For: \nNON Matching Small Ascii Text / Last Char Diff / Small Vs Large\n"));
+	RunComparison_PerformanceTest(numberOfTimes, oriAsciiSmallText, nonMatchAsciiLargeTextLast, EFalse, -1);
+	
+	TheTest.Printf(_L("\nComparing Performance Times For: \nNON Matching Small Ascii Text / First Char Diff / Small Vs Large\n"));
+	RunComparison_PerformanceTest(numberOfTimes, oriAsciiSmallText, nonMatchAsciiLargeTextFirst, EFalse, -23);
+	
+	// Mismatching length (16-bit) Ascii
+	
+	TheTest.Printf(_L("\nComparing Performance Times For: \nNON Matching Small Ascii Text / Length Mismatch / Small Vs Large\n"));
+	RunComparison_PerformanceTest(numberOfTimes, oriAsciiSmallText, oriAsciiLargeText, EFalse, -1);
+	
+	TheTest.Printf(_L("\nComparing Performance Times For: \nNON Matching Large Ascii Text / Length Mismatch / Large Vs Small\n"));
+	RunComparison_PerformanceTest(numberOfTimes, oriAsciiLargeText, oriAsciiSmallText, EFalse, 1);
+	
+	TheTest.Printf(_L("\n====== (16-bit) Unicode Performance tests ======"));
+	
+	// Matching (16-bit) Unicode
+	
+	TheTest.Printf(_L("\nComparing Performance Times For: \nMatching Large Unicode Text\n"));
+	RunComparison_PerformanceTest(numberOfTimes, oriUnicodeLargeText, matchUnicodeLargeText, ETrue);
+	
+	TheTest.Printf(_L("\nComparing Performance Times For: \nMatching Small Unicode Text\n"));
+	RunComparison_PerformanceTest(numberOfTimes, oriUnicodeSmallText, matchUnicodeSmallText, ETrue);
+
+	// Non Matching (16-bit) Unicode
+	
+	TheTest.Printf(_L("\nComparing Performance Times For: \nNON Matching Large Unicode Text / Last Char Diff / Large Vs Large\n"));
+	RunComparison_PerformanceTest(numberOfTimes, oriUnicodeLargeText, nonMatchUnicodeLargeTextLast, EFalse, -3);
+	
+	TheTest.Printf(_L("\nComparing Performance Times For: \nNON Matching Large Unicode Text / First Char Diff / Large Vs Large\n"));
+	RunComparison_PerformanceTest(numberOfTimes, oriUnicodeLargeText, nonMatchUnicodeLargeTextFirst, EFalse, -3);
+	
+	TheTest.Printf(_L("\nComparing Performance Times For: \nNON Matching Small Unicode Text / Last Char Diff / Small Vs Small\n"));
+	RunComparison_PerformanceTest(numberOfTimes, oriUnicodeSmallText, nonMatchUnicodeSmallTextLast, EFalse, -3);
+	
+	TheTest.Printf(_L("\nComparing Performance Times For: \nNON Matching Small Unicode Text / First Char Diff / Small Vs Small\n"));
+	RunComparison_PerformanceTest(numberOfTimes, oriUnicodeSmallText, nonMatchUnicodeSmallTextFirst, EFalse, -3);
+	
+	TheTest.Printf(_L("\nComparing Performance Times For: \nNON Matching Large Unicode Text / Last Char Diff / Large Vs Small\n"));
+	RunComparison_PerformanceTest(numberOfTimes, oriUnicodeLargeText, nonMatchUnicodeSmallTextLast, EFalse, -3);
+	
+	TheTest.Printf(_L("\nComparing Performance Times For: \nNON Matching Large Unicode Text / First Char Diff / Large Vs Small\n"));
+	RunComparison_PerformanceTest(numberOfTimes, oriUnicodeLargeText, nonMatchUnicodeSmallTextFirst, EFalse, -3);
+	
+	TheTest.Printf(_L("\nComparing Performance Times For: \nNON Matching Small Unicode Text / Last Char Diff / Small Vs Large\n"));
+	RunComparison_PerformanceTest(numberOfTimes, oriUnicodeSmallText, nonMatchUnicodeLargeTextLast, EFalse, -1);
+	
+	TheTest.Printf(_L("\nComparing Performance Times For: \nNON Matching Small Unicode Text / First Char Diff / Small Vs Large\n"));
+	RunComparison_PerformanceTest(numberOfTimes, oriUnicodeSmallText, nonMatchUnicodeLargeTextFirst, EFalse, -3);
+
+	// Mismatching length (16-bit) Unicode
+
+	TheTest.Printf(_L("\nComparing Performance Times For: \nNON Matching Small Unicode Text / Length Mismatch / Small Vs Large\n"));
+	RunComparison_PerformanceTest(numberOfTimes, oriUnicodeSmallText, oriUnicodeLargeText, EFalse, -1);
+
+	TheTest.Printf(_L("\nComparing Performance Times For: \nNON Matching Large Unicode Text / Length Mismatch / Large Vs Small\n"));
+	RunComparison_PerformanceTest(numberOfTimes, oriUnicodeLargeText, oriUnicodeSmallText, EFalse, 1);
+	
+	TheTest.Printf(_L("\n====== (16-bit) Mixed Performance tests ======"));
+	
+	// Matching (16-bit) Mixed
+	
+	TheTest.Printf(_L("\nComparing Performance Times For: \nMatching Large Mixed Text\n"));
+	RunComparison_PerformanceTest(numberOfTimes, oriMixedLargeText, matchMixedLargeText, ETrue);
+	
+	TheTest.Printf(_L("\nComparing Performance Times For: \nMatching Small Mixed Text\n"));
+	RunComparison_PerformanceTest(numberOfTimes, oriMixedSmallText, matchMixedSmallText, ETrue);
+
+	// Non Matching (16-bit) Mixed
+	   
+	TheTest.Printf(_L("\nComparing Performance Times For: \nNON Matching Large Mixed Text / Last Char Diff / Large Vs Large\n"));
+	RunComparison_PerformanceTest(numberOfTimes, oriMixedLargeText, nonMatchMixedLargeTextLast, EFalse, -655);
+	
+	TheTest.Printf(_L("\nComparing Performance Times For: \nNON Matching Large Mixed Text / First Char Diff / Large Vs Large\n"));
+	RunComparison_PerformanceTest(numberOfTimes, oriMixedLargeText, nonMatchMixedLargeTextFirst, EFalse, -675);
+	
+	TheTest.Printf(_L("\nComparing Performance Times For: \nNON Matching Small Mixed Text / Last Char Diff / Small Vs Small\n"));
+	RunComparison_PerformanceTest(numberOfTimes, oriMixedSmallText, nonMatchMixedSmallTextLast, EFalse, -655);
+	
+	TheTest.Printf(_L("\nComparing Performance Times For: \nNON Matching Small Mixed Text / First Char Diff / Small Vs Small\n"));
+	RunComparison_PerformanceTest(numberOfTimes, oriMixedSmallText, nonMatchMixedSmallTextFirst, EFalse, -675);
+	
+	TheTest.Printf(_L("\nComparing Performance Times For: \nNON Matching Large Mixed Text / Last Char Diff / Large Vs Small\n"));
+	RunComparison_PerformanceTest(numberOfTimes, oriMixedLargeText, nonMatchMixedSmallTextLast, EFalse, -655);
+	
+	TheTest.Printf(_L("\nComparing Performance Times For: \nNON Matching Large Mixed Text / First Char Diff / Large Vs Small\n"));
+	RunComparison_PerformanceTest(numberOfTimes, oriMixedLargeText, nonMatchMixedSmallTextFirst, EFalse, -675);
+	
+	TheTest.Printf(_L("\nComparing Performance Times For: \nNON Matching Small Mixed Text / Last Char Diff / Small Vs Large\n"));
+	RunComparison_PerformanceTest(numberOfTimes, oriMixedSmallText, nonMatchMixedLargeTextLast, EFalse, -1);
+	
+	TheTest.Printf(_L("\nComparing Performance Times For: \nNON Matching Small Mixed Text / First Char Diff / Small Vs Large\n"));
+	RunComparison_PerformanceTest(numberOfTimes, oriMixedSmallText, nonMatchMixedLargeTextFirst, EFalse, -675);
+	
+	// Mismatching length (16-bit) Mixed
+	
+	TheTest.Printf(_L("\nComparing Performance Times For: \nNON Matching Small Mixed Text / Length Mismatch / Small Vs Large\n"));
+	RunComparison_PerformanceTest(numberOfTimes, oriMixedSmallText, oriMixedLargeText, EFalse, -1);
+
+	TheTest.Printf(_L("\nComparing Performance Times For: \nNON Matching Large Mixed Text / Length Mismatch / Large Vs Small\n"));
+	RunComparison_PerformanceTest(numberOfTimes, oriMixedLargeText, oriMixedSmallText, EFalse, 1);
+	}
+	
+
+
+TInt E32Main()
+    {
+	TheTest.Title();
+
+	TheTest.Start(_L("Folding - performance tests"));
+
+    ::FindF_PerformanceTest();
+    ::MatchF_PerformanceTest();
+    ::CompareF_PerformanceTest();
+    ::PlainTextPerformanceTest();
+	::CompareVsCompareF_PerformanceTest();
+
+	TheTest.End();
+	TheTest.Close();
+
+	return KErrNone;
+    }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32test/buffer/UnicodeData.txt	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,10621 @@
+0000;<control>;Cc;0;BN;;;;;N;NULL;;;;
+0001;<control>;Cc;0;BN;;;;;N;START OF HEADING;;;;
+0002;<control>;Cc;0;BN;;;;;N;START OF TEXT;;;;
+0003;<control>;Cc;0;BN;;;;;N;END OF TEXT;;;;
+0004;<control>;Cc;0;BN;;;;;N;END OF TRANSMISSION;;;;
+0005;<control>;Cc;0;BN;;;;;N;ENQUIRY;;;;
+0006;<control>;Cc;0;BN;;;;;N;ACKNOWLEDGE;;;;
+0007;<control>;Cc;0;BN;;;;;N;BELL;;;;
+0008;<control>;Cc;0;BN;;;;;N;BACKSPACE;;;;
+0009;<control>;Cc;0;S;;;;;N;HORIZONTAL TABULATION;;;;
+000A;<control>;Cc;0;B;;;;;N;LINE FEED;;;;
+000B;<control>;Cc;0;S;;;;;N;VERTICAL TABULATION;;;;
+000C;<control>;Cc;0;WS;;;;;N;FORM FEED;;;;
+000D;<control>;Cc;0;B;;;;;N;CARRIAGE RETURN;;;;
+000E;<control>;Cc;0;BN;;;;;N;SHIFT OUT;;;;
+000F;<control>;Cc;0;BN;;;;;N;SHIFT IN;;;;
+0010;<control>;Cc;0;BN;;;;;N;DATA LINK ESCAPE;;;;
+0011;<control>;Cc;0;BN;;;;;N;DEVICE CONTROL ONE;;;;
+0012;<control>;Cc;0;BN;;;;;N;DEVICE CONTROL TWO;;;;
+0013;<control>;Cc;0;BN;;;;;N;DEVICE CONTROL THREE;;;;
+0014;<control>;Cc;0;BN;;;;;N;DEVICE CONTROL FOUR;;;;
+0015;<control>;Cc;0;BN;;;;;N;NEGATIVE ACKNOWLEDGE;;;;
+0016;<control>;Cc;0;BN;;;;;N;SYNCHRONOUS IDLE;;;;
+0017;<control>;Cc;0;BN;;;;;N;END OF TRANSMISSION BLOCK;;;;
+0018;<control>;Cc;0;BN;;;;;N;CANCEL;;;;
+0019;<control>;Cc;0;BN;;;;;N;END OF MEDIUM;;;;
+001A;<control>;Cc;0;BN;;;;;N;SUBSTITUTE;;;;
+001B;<control>;Cc;0;BN;;;;;N;ESCAPE;;;;
+001C;<control>;Cc;0;B;;;;;N;FILE SEPARATOR;;;;
+001D;<control>;Cc;0;B;;;;;N;GROUP SEPARATOR;;;;
+001E;<control>;Cc;0;B;;;;;N;RECORD SEPARATOR;;;;
+001F;<control>;Cc;0;S;;;;;N;UNIT SEPARATOR;;;;
+0020;SPACE;Zs;0;WS;;;;;N;;;;;
+0021;EXCLAMATION MARK;Po;0;ON;;;;;N;;;;;
+0022;QUOTATION MARK;Po;0;ON;;;;;N;;;;;
+0023;NUMBER SIGN;Po;0;ET;;;;;N;;;;;
+0024;DOLLAR SIGN;Sc;0;ET;;;;;N;;;;;
+0025;PERCENT SIGN;Po;0;ET;;;;;N;;;;;
+0026;AMPERSAND;Po;0;ON;;;;;N;;;;;
+0027;APOSTROPHE;Po;0;ON;;;;;N;APOSTROPHE-QUOTE;;;;
+0028;LEFT PARENTHESIS;Ps;0;ON;;;;;Y;OPENING PARENTHESIS;;;;
+0029;RIGHT PARENTHESIS;Pe;0;ON;;;;;Y;CLOSING PARENTHESIS;;;;
+002A;ASTERISK;Po;0;ON;;;;;N;;;;;
+002B;PLUS SIGN;Sm;0;ET;;;;;N;;;;;
+002C;COMMA;Po;0;CS;;;;;N;;;;;
+002D;HYPHEN-MINUS;Pd;0;ET;;;;;N;;;;;
+002E;FULL STOP;Po;0;CS;;;;;N;PERIOD;;;;
+002F;SOLIDUS;Po;0;ES;;;;;N;SLASH;;;;
+0030;DIGIT ZERO;Nd;0;EN;;0;0;0;N;;;;;
+0031;DIGIT ONE;Nd;0;EN;;1;1;1;N;;;;;
+0032;DIGIT TWO;Nd;0;EN;;2;2;2;N;;;;;
+0033;DIGIT THREE;Nd;0;EN;;3;3;3;N;;;;;
+0034;DIGIT FOUR;Nd;0;EN;;4;4;4;N;;;;;
+0035;DIGIT FIVE;Nd;0;EN;;5;5;5;N;;;;;
+0036;DIGIT SIX;Nd;0;EN;;6;6;6;N;;;;;
+0037;DIGIT SEVEN;Nd;0;EN;;7;7;7;N;;;;;
+0038;DIGIT EIGHT;Nd;0;EN;;8;8;8;N;;;;;
+0039;DIGIT NINE;Nd;0;EN;;9;9;9;N;;;;;
+003A;COLON;Po;0;CS;;;;;N;;;;;
+003B;SEMICOLON;Po;0;ON;;;;;N;;;;;
+003C;LESS-THAN SIGN;Sm;0;ON;;;;;Y;;;;;
+003D;EQUALS SIGN;Sm;0;ON;;;;;N;;;;;
+003E;GREATER-THAN SIGN;Sm;0;ON;;;;;Y;;;;;
+003F;QUESTION MARK;Po;0;ON;;;;;N;;;;;
+0040;COMMERCIAL AT;Po;0;ON;;;;;N;;;;;
+0041;LATIN CAPITAL LETTER A;Lu;0;L;;;;;N;;;;0061;
+0042;LATIN CAPITAL LETTER B;Lu;0;L;;;;;N;;;;0062;
+0043;LATIN CAPITAL LETTER C;Lu;0;L;;;;;N;;;;0063;
+0044;LATIN CAPITAL LETTER D;Lu;0;L;;;;;N;;;;0064;
+0045;LATIN CAPITAL LETTER E;Lu;0;L;;;;;N;;;;0065;
+0046;LATIN CAPITAL LETTER F;Lu;0;L;;;;;N;;;;0066;
+0047;LATIN CAPITAL LETTER G;Lu;0;L;;;;;N;;;;0067;
+0048;LATIN CAPITAL LETTER H;Lu;0;L;;;;;N;;;;0068;
+0049;LATIN CAPITAL LETTER I;Lu;0;L;;;;;N;;;;0069;
+004A;LATIN CAPITAL LETTER J;Lu;0;L;;;;;N;;;;006A;
+004B;LATIN CAPITAL LETTER K;Lu;0;L;;;;;N;;;;006B;
+004C;LATIN CAPITAL LETTER L;Lu;0;L;;;;;N;;;;006C;
+004D;LATIN CAPITAL LETTER M;Lu;0;L;;;;;N;;;;006D;
+004E;LATIN CAPITAL LETTER N;Lu;0;L;;;;;N;;;;006E;
+004F;LATIN CAPITAL LETTER O;Lu;0;L;;;;;N;;;;006F;
+0050;LATIN CAPITAL LETTER P;Lu;0;L;;;;;N;;;;0070;
+0051;LATIN CAPITAL LETTER Q;Lu;0;L;;;;;N;;;;0071;
+0052;LATIN CAPITAL LETTER R;Lu;0;L;;;;;N;;;;0072;
+0053;LATIN CAPITAL LETTER S;Lu;0;L;;;;;N;;;;0073;
+0054;LATIN CAPITAL LETTER T;Lu;0;L;;;;;N;;;;0074;
+0055;LATIN CAPITAL LETTER U;Lu;0;L;;;;;N;;;;0075;
+0056;LATIN CAPITAL LETTER V;Lu;0;L;;;;;N;;;;0076;
+0057;LATIN CAPITAL LETTER W;Lu;0;L;;;;;N;;;;0077;
+0058;LATIN CAPITAL LETTER X;Lu;0;L;;;;;N;;;;0078;
+0059;LATIN CAPITAL LETTER Y;Lu;0;L;;;;;N;;;;0079;
+005A;LATIN CAPITAL LETTER Z;Lu;0;L;;;;;N;;;;007A;
+005B;LEFT SQUARE BRACKET;Ps;0;ON;;;;;Y;OPENING SQUARE BRACKET;;;;
+005C;REVERSE SOLIDUS;Po;0;ON;;;;;N;BACKSLASH;;;;
+005D;RIGHT SQUARE BRACKET;Pe;0;ON;;;;;Y;CLOSING SQUARE BRACKET;;;;
+005E;CIRCUMFLEX ACCENT;Sk;0;ON;;;;;N;SPACING CIRCUMFLEX;;;;
+005F;LOW LINE;Pc;0;ON;;;;;N;SPACING UNDERSCORE;;;;
+0060;GRAVE ACCENT;Sk;0;ON;;;;;N;SPACING GRAVE;;;;
+0061;LATIN SMALL LETTER A;Ll;0;L;;;;;N;;;0041;;0041
+0062;LATIN SMALL LETTER B;Ll;0;L;;;;;N;;;0042;;0042
+0063;LATIN SMALL LETTER C;Ll;0;L;;;;;N;;;0043;;0043
+0064;LATIN SMALL LETTER D;Ll;0;L;;;;;N;;;0044;;0044
+0065;LATIN SMALL LETTER E;Ll;0;L;;;;;N;;;0045;;0045
+0066;LATIN SMALL LETTER F;Ll;0;L;;;;;N;;;0046;;0046
+0067;LATIN SMALL LETTER G;Ll;0;L;;;;;N;;;0047;;0047
+0068;LATIN SMALL LETTER H;Ll;0;L;;;;;N;;;0048;;0048
+0069;LATIN SMALL LETTER I;Ll;0;L;;;;;N;;;0049;;0049
+006A;LATIN SMALL LETTER J;Ll;0;L;;;;;N;;;004A;;004A
+006B;LATIN SMALL LETTER K;Ll;0;L;;;;;N;;;004B;;004B
+006C;LATIN SMALL LETTER L;Ll;0;L;;;;;N;;;004C;;004C
+006D;LATIN SMALL LETTER M;Ll;0;L;;;;;N;;;004D;;004D
+006E;LATIN SMALL LETTER N;Ll;0;L;;;;;N;;;004E;;004E
+006F;LATIN SMALL LETTER O;Ll;0;L;;;;;N;;;004F;;004F
+0070;LATIN SMALL LETTER P;Ll;0;L;;;;;N;;;0050;;0050
+0071;LATIN SMALL LETTER Q;Ll;0;L;;;;;N;;;0051;;0051
+0072;LATIN SMALL LETTER R;Ll;0;L;;;;;N;;;0052;;0052
+0073;LATIN SMALL LETTER S;Ll;0;L;;;;;N;;;0053;;0053
+0074;LATIN SMALL LETTER T;Ll;0;L;;;;;N;;;0054;;0054
+0075;LATIN SMALL LETTER U;Ll;0;L;;;;;N;;;0055;;0055
+0076;LATIN SMALL LETTER V;Ll;0;L;;;;;N;;;0056;;0056
+0077;LATIN SMALL LETTER W;Ll;0;L;;;;;N;;;0057;;0057
+0078;LATIN SMALL LETTER X;Ll;0;L;;;;;N;;;0058;;0058
+0079;LATIN SMALL LETTER Y;Ll;0;L;;;;;N;;;0059;;0059
+007A;LATIN SMALL LETTER Z;Ll;0;L;;;;;N;;;005A;;005A
+007B;LEFT CURLY BRACKET;Ps;0;ON;;;;;Y;OPENING CURLY BRACKET;;;;
+007C;VERTICAL LINE;Sm;0;ON;;;;;N;VERTICAL BAR;;;;
+007D;RIGHT CURLY BRACKET;Pe;0;ON;;;;;Y;CLOSING CURLY BRACKET;;;;
+007E;TILDE;Sm;0;ON;;;;;N;;;;;
+007F;<control>;Cc;0;BN;;;;;N;DELETE;;;;
+0080;<control>;Cc;0;BN;;;;;N;;;;;
+0081;<control>;Cc;0;BN;;;;;N;;;;;
+0082;<control>;Cc;0;BN;;;;;N;BREAK PERMITTED HERE;;;;
+0083;<control>;Cc;0;BN;;;;;N;NO BREAK HERE;;;;
+0084;<control>;Cc;0;BN;;;;;N;;;;;
+0085;<control>;Cc;0;B;;;;;N;NEXT LINE;;;;
+0086;<control>;Cc;0;BN;;;;;N;START OF SELECTED AREA;;;;
+0087;<control>;Cc;0;BN;;;;;N;END OF SELECTED AREA;;;;
+0088;<control>;Cc;0;BN;;;;;N;CHARACTER TABULATION SET;;;;
+0089;<control>;Cc;0;BN;;;;;N;CHARACTER TABULATION WITH JUSTIFICATION;;;;
+008A;<control>;Cc;0;BN;;;;;N;LINE TABULATION SET;;;;
+008B;<control>;Cc;0;BN;;;;;N;PARTIAL LINE DOWN;;;;
+008C;<control>;Cc;0;BN;;;;;N;PARTIAL LINE UP;;;;
+008D;<control>;Cc;0;BN;;;;;N;REVERSE LINE FEED;;;;
+008E;<control>;Cc;0;BN;;;;;N;SINGLE SHIFT TWO;;;;
+008F;<control>;Cc;0;BN;;;;;N;SINGLE SHIFT THREE;;;;
+0090;<control>;Cc;0;BN;;;;;N;DEVICE CONTROL STRING;;;;
+0091;<control>;Cc;0;BN;;;;;N;PRIVATE USE ONE;;;;
+0092;<control>;Cc;0;BN;;;;;N;PRIVATE USE TWO;;;;
+0093;<control>;Cc;0;BN;;;;;N;SET TRANSMIT STATE;;;;
+0094;<control>;Cc;0;BN;;;;;N;CANCEL CHARACTER;;;;
+0095;<control>;Cc;0;BN;;;;;N;MESSAGE WAITING;;;;
+0096;<control>;Cc;0;BN;;;;;N;START OF GUARDED AREA;;;;
+0097;<control>;Cc;0;BN;;;;;N;END OF GUARDED AREA;;;;
+0098;<control>;Cc;0;BN;;;;;N;START OF STRING;;;;
+0099;<control>;Cc;0;BN;;;;;N;;;;;
+009A;<control>;Cc;0;BN;;;;;N;SINGLE CHARACTER INTRODUCER;;;;
+009B;<control>;Cc;0;BN;;;;;N;CONTROL SEQUENCE INTRODUCER;;;;
+009C;<control>;Cc;0;BN;;;;;N;STRING TERMINATOR;;;;
+009D;<control>;Cc;0;BN;;;;;N;OPERATING SYSTEM COMMAND;;;;
+009E;<control>;Cc;0;BN;;;;;N;PRIVACY MESSAGE;;;;
+009F;<control>;Cc;0;BN;;;;;N;APPLICATION PROGRAM COMMAND;;;;
+00A0;NO-BREAK SPACE;Zs;0;CS;<noBreak> 0020;;;;N;NON-BREAKING SPACE;;;;
+00A1;INVERTED EXCLAMATION MARK;Po;0;ON;;;;;N;;;;;
+00A2;CENT SIGN;Sc;0;ET;;;;;N;;;;;
+00A3;POUND SIGN;Sc;0;ET;;;;;N;;;;;
+00A4;CURRENCY SIGN;Sc;0;ET;;;;;N;;;;;
+00A5;YEN SIGN;Sc;0;ET;;;;;N;;;;;
+00A6;BROKEN BAR;So;0;ON;;;;;N;BROKEN VERTICAL BAR;;;;
+00A7;SECTION SIGN;So;0;ON;;;;;N;;;;;
+00A8;DIAERESIS;Sk;0;ON;<compat> 0020 0308;;;;N;SPACING DIAERESIS;;;;
+00A9;COPYRIGHT SIGN;So;0;ON;;;;;N;;;;;
+00AA;FEMININE ORDINAL INDICATOR;Ll;0;L;<super> 0061;;;;N;;;;;
+00AB;LEFT-POINTING DOUBLE ANGLE QUOTATION MARK;Pi;0;ON;;;;;Y;LEFT POINTING GUILLEMET;*;;;
+00AC;NOT SIGN;Sm;0;ON;;;;;N;;;;;
+00AD;SOFT HYPHEN;Pd;0;ON;;;;;N;;;;;
+00AE;REGISTERED SIGN;So;0;ON;;;;;N;REGISTERED TRADE MARK SIGN;;;;
+00AF;MACRON;Sk;0;ON;<compat> 0020 0304;;;;N;SPACING MACRON;;;;
+00B0;DEGREE SIGN;So;0;ET;;;;;N;;;;;
+00B1;PLUS-MINUS SIGN;Sm;0;ET;;;;;N;PLUS-OR-MINUS SIGN;;;;
+00B2;SUPERSCRIPT TWO;No;0;EN;<super> 0032;2;2;2;N;SUPERSCRIPT DIGIT TWO;;;;
+00B3;SUPERSCRIPT THREE;No;0;EN;<super> 0033;3;3;3;N;SUPERSCRIPT DIGIT THREE;;;;
+00B4;ACUTE ACCENT;Sk;0;ON;<compat> 0020 0301;;;;N;SPACING ACUTE;;;;
+00B5;MICRO SIGN;Ll;0;L;<compat> 03BC;;;;N;;;039C;;039C
+00B6;PILCROW SIGN;So;0;ON;;;;;N;PARAGRAPH SIGN;;;;
+00B7;MIDDLE DOT;Po;0;ON;;;;;N;;;;;
+00B8;CEDILLA;Sk;0;ON;<compat> 0020 0327;;;;N;SPACING CEDILLA;;;;
+00B9;SUPERSCRIPT ONE;No;0;EN;<super> 0031;1;1;1;N;SUPERSCRIPT DIGIT ONE;;;;
+00BA;MASCULINE ORDINAL INDICATOR;Ll;0;L;<super> 006F;;;;N;;;;;
+00BB;RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK;Pf;0;ON;;;;;Y;RIGHT POINTING GUILLEMET;*;;;
+00BC;VULGAR FRACTION ONE QUARTER;No;0;ON;<fraction> 0031 2044 0034;;;1/4;N;FRACTION ONE QUARTER;;;;
+00BD;VULGAR FRACTION ONE HALF;No;0;ON;<fraction> 0031 2044 0032;;;1/2;N;FRACTION ONE HALF;;;;
+00BE;VULGAR FRACTION THREE QUARTERS;No;0;ON;<fraction> 0033 2044 0034;;;3/4;N;FRACTION THREE QUARTERS;;;;
+00BF;INVERTED QUESTION MARK;Po;0;ON;;;;;N;;;;;
+00C0;LATIN CAPITAL LETTER A WITH GRAVE;Lu;0;L;0041 0300;;;;N;LATIN CAPITAL LETTER A GRAVE;;;00E0;
+00C1;LATIN CAPITAL LETTER A WITH ACUTE;Lu;0;L;0041 0301;;;;N;LATIN CAPITAL LETTER A ACUTE;;;00E1;
+00C2;LATIN CAPITAL LETTER A WITH CIRCUMFLEX;Lu;0;L;0041 0302;;;;N;LATIN CAPITAL LETTER A CIRCUMFLEX;;;00E2;
+00C3;LATIN CAPITAL LETTER A WITH TILDE;Lu;0;L;0041 0303;;;;N;LATIN CAPITAL LETTER A TILDE;;;00E3;
+00C4;LATIN CAPITAL LETTER A WITH DIAERESIS;Lu;0;L;0041 0308;;;;N;LATIN CAPITAL LETTER A DIAERESIS;;;00E4;
+00C5;LATIN CAPITAL LETTER A WITH RING ABOVE;Lu;0;L;0041 030A;;;;N;LATIN CAPITAL LETTER A RING;;;00E5;
+00C6;LATIN CAPITAL LETTER AE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER A E;ash *;;00E6;
+00C7;LATIN CAPITAL LETTER C WITH CEDILLA;Lu;0;L;0043 0327;;;;N;LATIN CAPITAL LETTER C CEDILLA;;;00E7;
+00C8;LATIN CAPITAL LETTER E WITH GRAVE;Lu;0;L;0045 0300;;;;N;LATIN CAPITAL LETTER E GRAVE;;;00E8;
+00C9;LATIN CAPITAL LETTER E WITH ACUTE;Lu;0;L;0045 0301;;;;N;LATIN CAPITAL LETTER E ACUTE;;;00E9;
+00CA;LATIN CAPITAL LETTER E WITH CIRCUMFLEX;Lu;0;L;0045 0302;;;;N;LATIN CAPITAL LETTER E CIRCUMFLEX;;;00EA;
+00CB;LATIN CAPITAL LETTER E WITH DIAERESIS;Lu;0;L;0045 0308;;;;N;LATIN CAPITAL LETTER E DIAERESIS;;;00EB;
+00CC;LATIN CAPITAL LETTER I WITH GRAVE;Lu;0;L;0049 0300;;;;N;LATIN CAPITAL LETTER I GRAVE;;;00EC;
+00CD;LATIN CAPITAL LETTER I WITH ACUTE;Lu;0;L;0049 0301;;;;N;LATIN CAPITAL LETTER I ACUTE;;;00ED;
+00CE;LATIN CAPITAL LETTER I WITH CIRCUMFLEX;Lu;0;L;0049 0302;;;;N;LATIN CAPITAL LETTER I CIRCUMFLEX;;;00EE;
+00CF;LATIN CAPITAL LETTER I WITH DIAERESIS;Lu;0;L;0049 0308;;;;N;LATIN CAPITAL LETTER I DIAERESIS;;;00EF;
+00D0;LATIN CAPITAL LETTER ETH;Lu;0;L;;;;;N;;Icelandic;;00F0;
+00D1;LATIN CAPITAL LETTER N WITH TILDE;Lu;0;L;004E 0303;;;;N;LATIN CAPITAL LETTER N TILDE;;;00F1;
+00D2;LATIN CAPITAL LETTER O WITH GRAVE;Lu;0;L;004F 0300;;;;N;LATIN CAPITAL LETTER O GRAVE;;;00F2;
+00D3;LATIN CAPITAL LETTER O WITH ACUTE;Lu;0;L;004F 0301;;;;N;LATIN CAPITAL LETTER O ACUTE;;;00F3;
+00D4;LATIN CAPITAL LETTER O WITH CIRCUMFLEX;Lu;0;L;004F 0302;;;;N;LATIN CAPITAL LETTER O CIRCUMFLEX;;;00F4;
+00D5;LATIN CAPITAL LETTER O WITH TILDE;Lu;0;L;004F 0303;;;;N;LATIN CAPITAL LETTER O TILDE;;;00F5;
+00D6;LATIN CAPITAL LETTER O WITH DIAERESIS;Lu;0;L;004F 0308;;;;N;LATIN CAPITAL LETTER O DIAERESIS;;;00F6;
+00D7;MULTIPLICATION SIGN;Sm;0;ON;;;;;N;;;;;
+00D8;LATIN CAPITAL LETTER O WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER O SLASH;;;00F8;
+00D9;LATIN CAPITAL LETTER U WITH GRAVE;Lu;0;L;0055 0300;;;;N;LATIN CAPITAL LETTER U GRAVE;;;00F9;
+00DA;LATIN CAPITAL LETTER U WITH ACUTE;Lu;0;L;0055 0301;;;;N;LATIN CAPITAL LETTER U ACUTE;;;00FA;
+00DB;LATIN CAPITAL LETTER U WITH CIRCUMFLEX;Lu;0;L;0055 0302;;;;N;LATIN CAPITAL LETTER U CIRCUMFLEX;;;00FB;
+00DC;LATIN CAPITAL LETTER U WITH DIAERESIS;Lu;0;L;0055 0308;;;;N;LATIN CAPITAL LETTER U DIAERESIS;;;00FC;
+00DD;LATIN CAPITAL LETTER Y WITH ACUTE;Lu;0;L;0059 0301;;;;N;LATIN CAPITAL LETTER Y ACUTE;;;00FD;
+00DE;LATIN CAPITAL LETTER THORN;Lu;0;L;;;;;N;;Icelandic;;00FE;
+00DF;LATIN SMALL LETTER SHARP S;Ll;0;L;;;;;N;;German;;;
+00E0;LATIN SMALL LETTER A WITH GRAVE;Ll;0;L;0061 0300;;;;N;LATIN SMALL LETTER A GRAVE;;00C0;;00C0
+00E1;LATIN SMALL LETTER A WITH ACUTE;Ll;0;L;0061 0301;;;;N;LATIN SMALL LETTER A ACUTE;;00C1;;00C1
+00E2;LATIN SMALL LETTER A WITH CIRCUMFLEX;Ll;0;L;0061 0302;;;;N;LATIN SMALL LETTER A CIRCUMFLEX;;00C2;;00C2
+00E3;LATIN SMALL LETTER A WITH TILDE;Ll;0;L;0061 0303;;;;N;LATIN SMALL LETTER A TILDE;;00C3;;00C3
+00E4;LATIN SMALL LETTER A WITH DIAERESIS;Ll;0;L;0061 0308;;;;N;LATIN SMALL LETTER A DIAERESIS;;00C4;;00C4
+00E5;LATIN SMALL LETTER A WITH RING ABOVE;Ll;0;L;0061 030A;;;;N;LATIN SMALL LETTER A RING;;00C5;;00C5
+00E6;LATIN SMALL LETTER AE;Ll;0;L;;;;;N;LATIN SMALL LETTER A E;ash *;00C6;;00C6
+00E7;LATIN SMALL LETTER C WITH CEDILLA;Ll;0;L;0063 0327;;;;N;LATIN SMALL LETTER C CEDILLA;;00C7;;00C7
+00E8;LATIN SMALL LETTER E WITH GRAVE;Ll;0;L;0065 0300;;;;N;LATIN SMALL LETTER E GRAVE;;00C8;;00C8
+00E9;LATIN SMALL LETTER E WITH ACUTE;Ll;0;L;0065 0301;;;;N;LATIN SMALL LETTER E ACUTE;;00C9;;00C9
+00EA;LATIN SMALL LETTER E WITH CIRCUMFLEX;Ll;0;L;0065 0302;;;;N;LATIN SMALL LETTER E CIRCUMFLEX;;00CA;;00CA
+00EB;LATIN SMALL LETTER E WITH DIAERESIS;Ll;0;L;0065 0308;;;;N;LATIN SMALL LETTER E DIAERESIS;;00CB;;00CB
+00EC;LATIN SMALL LETTER I WITH GRAVE;Ll;0;L;0069 0300;;;;N;LATIN SMALL LETTER I GRAVE;;00CC;;00CC
+00ED;LATIN SMALL LETTER I WITH ACUTE;Ll;0;L;0069 0301;;;;N;LATIN SMALL LETTER I ACUTE;;00CD;;00CD
+00EE;LATIN SMALL LETTER I WITH CIRCUMFLEX;Ll;0;L;0069 0302;;;;N;LATIN SMALL LETTER I CIRCUMFLEX;;00CE;;00CE
+00EF;LATIN SMALL LETTER I WITH DIAERESIS;Ll;0;L;0069 0308;;;;N;LATIN SMALL LETTER I DIAERESIS;;00CF;;00CF
+00F0;LATIN SMALL LETTER ETH;Ll;0;L;;;;;N;;Icelandic;00D0;;00D0
+00F1;LATIN SMALL LETTER N WITH TILDE;Ll;0;L;006E 0303;;;;N;LATIN SMALL LETTER N TILDE;;00D1;;00D1
+00F2;LATIN SMALL LETTER O WITH GRAVE;Ll;0;L;006F 0300;;;;N;LATIN SMALL LETTER O GRAVE;;00D2;;00D2
+00F3;LATIN SMALL LETTER O WITH ACUTE;Ll;0;L;006F 0301;;;;N;LATIN SMALL LETTER O ACUTE;;00D3;;00D3
+00F4;LATIN SMALL LETTER O WITH CIRCUMFLEX;Ll;0;L;006F 0302;;;;N;LATIN SMALL LETTER O CIRCUMFLEX;;00D4;;00D4
+00F5;LATIN SMALL LETTER O WITH TILDE;Ll;0;L;006F 0303;;;;N;LATIN SMALL LETTER O TILDE;;00D5;;00D5
+00F6;LATIN SMALL LETTER O WITH DIAERESIS;Ll;0;L;006F 0308;;;;N;LATIN SMALL LETTER O DIAERESIS;;00D6;;00D6
+00F7;DIVISION SIGN;Sm;0;ON;;;;;N;;;;;
+00F8;LATIN SMALL LETTER O WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER O SLASH;;00D8;;00D8
+00F9;LATIN SMALL LETTER U WITH GRAVE;Ll;0;L;0075 0300;;;;N;LATIN SMALL LETTER U GRAVE;;00D9;;00D9
+00FA;LATIN SMALL LETTER U WITH ACUTE;Ll;0;L;0075 0301;;;;N;LATIN SMALL LETTER U ACUTE;;00DA;;00DA
+00FB;LATIN SMALL LETTER U WITH CIRCUMFLEX;Ll;0;L;0075 0302;;;;N;LATIN SMALL LETTER U CIRCUMFLEX;;00DB;;00DB
+00FC;LATIN SMALL LETTER U WITH DIAERESIS;Ll;0;L;0075 0308;;;;N;LATIN SMALL LETTER U DIAERESIS;;00DC;;00DC
+00FD;LATIN SMALL LETTER Y WITH ACUTE;Ll;0;L;0079 0301;;;;N;LATIN SMALL LETTER Y ACUTE;;00DD;;00DD
+00FE;LATIN SMALL LETTER THORN;Ll;0;L;;;;;N;;Icelandic;00DE;;00DE
+00FF;LATIN SMALL LETTER Y WITH DIAERESIS;Ll;0;L;0079 0308;;;;N;LATIN SMALL LETTER Y DIAERESIS;;0178;;0178
+0100;LATIN CAPITAL LETTER A WITH MACRON;Lu;0;L;0041 0304;;;;N;LATIN CAPITAL LETTER A MACRON;;;0101;
+0101;LATIN SMALL LETTER A WITH MACRON;Ll;0;L;0061 0304;;;;N;LATIN SMALL LETTER A MACRON;;0100;;0100
+0102;LATIN CAPITAL LETTER A WITH BREVE;Lu;0;L;0041 0306;;;;N;LATIN CAPITAL LETTER A BREVE;;;0103;
+0103;LATIN SMALL LETTER A WITH BREVE;Ll;0;L;0061 0306;;;;N;LATIN SMALL LETTER A BREVE;;0102;;0102
+0104;LATIN CAPITAL LETTER A WITH OGONEK;Lu;0;L;0041 0328;;;;N;LATIN CAPITAL LETTER A OGONEK;;;0105;
+0105;LATIN SMALL LETTER A WITH OGONEK;Ll;0;L;0061 0328;;;;N;LATIN SMALL LETTER A OGONEK;;0104;;0104
+0106;LATIN CAPITAL LETTER C WITH ACUTE;Lu;0;L;0043 0301;;;;N;LATIN CAPITAL LETTER C ACUTE;;;0107;
+0107;LATIN SMALL LETTER C WITH ACUTE;Ll;0;L;0063 0301;;;;N;LATIN SMALL LETTER C ACUTE;;0106;;0106
+0108;LATIN CAPITAL LETTER C WITH CIRCUMFLEX;Lu;0;L;0043 0302;;;;N;LATIN CAPITAL LETTER C CIRCUMFLEX;;;0109;
+0109;LATIN SMALL LETTER C WITH CIRCUMFLEX;Ll;0;L;0063 0302;;;;N;LATIN SMALL LETTER C CIRCUMFLEX;;0108;;0108
+010A;LATIN CAPITAL LETTER C WITH DOT ABOVE;Lu;0;L;0043 0307;;;;N;LATIN CAPITAL LETTER C DOT;;;010B;
+010B;LATIN SMALL LETTER C WITH DOT ABOVE;Ll;0;L;0063 0307;;;;N;LATIN SMALL LETTER C DOT;;010A;;010A
+010C;LATIN CAPITAL LETTER C WITH CARON;Lu;0;L;0043 030C;;;;N;LATIN CAPITAL LETTER C HACEK;;;010D;
+010D;LATIN SMALL LETTER C WITH CARON;Ll;0;L;0063 030C;;;;N;LATIN SMALL LETTER C HACEK;;010C;;010C
+010E;LATIN CAPITAL LETTER D WITH CARON;Lu;0;L;0044 030C;;;;N;LATIN CAPITAL LETTER D HACEK;;;010F;
+010F;LATIN SMALL LETTER D WITH CARON;Ll;0;L;0064 030C;;;;N;LATIN SMALL LETTER D HACEK;;010E;;010E
+0110;LATIN CAPITAL LETTER D WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER D BAR;;;0111;
+0111;LATIN SMALL LETTER D WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER D BAR;;0110;;0110
+0112;LATIN CAPITAL LETTER E WITH MACRON;Lu;0;L;0045 0304;;;;N;LATIN CAPITAL LETTER E MACRON;;;0113;
+0113;LATIN SMALL LETTER E WITH MACRON;Ll;0;L;0065 0304;;;;N;LATIN SMALL LETTER E MACRON;;0112;;0112
+0114;LATIN CAPITAL LETTER E WITH BREVE;Lu;0;L;0045 0306;;;;N;LATIN CAPITAL LETTER E BREVE;;;0115;
+0115;LATIN SMALL LETTER E WITH BREVE;Ll;0;L;0065 0306;;;;N;LATIN SMALL LETTER E BREVE;;0114;;0114
+0116;LATIN CAPITAL LETTER E WITH DOT ABOVE;Lu;0;L;0045 0307;;;;N;LATIN CAPITAL LETTER E DOT;;;0117;
+0117;LATIN SMALL LETTER E WITH DOT ABOVE;Ll;0;L;0065 0307;;;;N;LATIN SMALL LETTER E DOT;;0116;;0116
+0118;LATIN CAPITAL LETTER E WITH OGONEK;Lu;0;L;0045 0328;;;;N;LATIN CAPITAL LETTER E OGONEK;;;0119;
+0119;LATIN SMALL LETTER E WITH OGONEK;Ll;0;L;0065 0328;;;;N;LATIN SMALL LETTER E OGONEK;;0118;;0118
+011A;LATIN CAPITAL LETTER E WITH CARON;Lu;0;L;0045 030C;;;;N;LATIN CAPITAL LETTER E HACEK;;;011B;
+011B;LATIN SMALL LETTER E WITH CARON;Ll;0;L;0065 030C;;;;N;LATIN SMALL LETTER E HACEK;;011A;;011A
+011C;LATIN CAPITAL LETTER G WITH CIRCUMFLEX;Lu;0;L;0047 0302;;;;N;LATIN CAPITAL LETTER G CIRCUMFLEX;;;011D;
+011D;LATIN SMALL LETTER G WITH CIRCUMFLEX;Ll;0;L;0067 0302;;;;N;LATIN SMALL LETTER G CIRCUMFLEX;;011C;;011C
+011E;LATIN CAPITAL LETTER G WITH BREVE;Lu;0;L;0047 0306;;;;N;LATIN CAPITAL LETTER G BREVE;;;011F;
+011F;LATIN SMALL LETTER G WITH BREVE;Ll;0;L;0067 0306;;;;N;LATIN SMALL LETTER G BREVE;;011E;;011E
+0120;LATIN CAPITAL LETTER G WITH DOT ABOVE;Lu;0;L;0047 0307;;;;N;LATIN CAPITAL LETTER G DOT;;;0121;
+0121;LATIN SMALL LETTER G WITH DOT ABOVE;Ll;0;L;0067 0307;;;;N;LATIN SMALL LETTER G DOT;;0120;;0120
+0122;LATIN CAPITAL LETTER G WITH CEDILLA;Lu;0;L;0047 0327;;;;N;LATIN CAPITAL LETTER G CEDILLA;;;0123;
+0123;LATIN SMALL LETTER G WITH CEDILLA;Ll;0;L;0067 0327;;;;N;LATIN SMALL LETTER G CEDILLA;;0122;;0122
+0124;LATIN CAPITAL LETTER H WITH CIRCUMFLEX;Lu;0;L;0048 0302;;;;N;LATIN CAPITAL LETTER H CIRCUMFLEX;;;0125;
+0125;LATIN SMALL LETTER H WITH CIRCUMFLEX;Ll;0;L;0068 0302;;;;N;LATIN SMALL LETTER H CIRCUMFLEX;;0124;;0124
+0126;LATIN CAPITAL LETTER H WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER H BAR;;;0127;
+0127;LATIN SMALL LETTER H WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER H BAR;;0126;;0126
+0128;LATIN CAPITAL LETTER I WITH TILDE;Lu;0;L;0049 0303;;;;N;LATIN CAPITAL LETTER I TILDE;;;0129;
+0129;LATIN SMALL LETTER I WITH TILDE;Ll;0;L;0069 0303;;;;N;LATIN SMALL LETTER I TILDE;;0128;;0128
+012A;LATIN CAPITAL LETTER I WITH MACRON;Lu;0;L;0049 0304;;;;N;LATIN CAPITAL LETTER I MACRON;;;012B;
+012B;LATIN SMALL LETTER I WITH MACRON;Ll;0;L;0069 0304;;;;N;LATIN SMALL LETTER I MACRON;;012A;;012A
+012C;LATIN CAPITAL LETTER I WITH BREVE;Lu;0;L;0049 0306;;;;N;LATIN CAPITAL LETTER I BREVE;;;012D;
+012D;LATIN SMALL LETTER I WITH BREVE;Ll;0;L;0069 0306;;;;N;LATIN SMALL LETTER I BREVE;;012C;;012C
+012E;LATIN CAPITAL LETTER I WITH OGONEK;Lu;0;L;0049 0328;;;;N;LATIN CAPITAL LETTER I OGONEK;;;012F;
+012F;LATIN SMALL LETTER I WITH OGONEK;Ll;0;L;0069 0328;;;;N;LATIN SMALL LETTER I OGONEK;;012E;;012E
+0130;LATIN CAPITAL LETTER I WITH DOT ABOVE;Lu;0;L;0049 0307;;;;N;LATIN CAPITAL LETTER I DOT;;;0069;
+0131;LATIN SMALL LETTER DOTLESS I;Ll;0;L;;;;;N;;;0049;;0049
+0132;LATIN CAPITAL LIGATURE IJ;Lu;0;L;<compat> 0049 004A;;;;N;LATIN CAPITAL LETTER I J;;;0133;
+0133;LATIN SMALL LIGATURE IJ;Ll;0;L;<compat> 0069 006A;;;;N;LATIN SMALL LETTER I J;;0132;;0132
+0134;LATIN CAPITAL LETTER J WITH CIRCUMFLEX;Lu;0;L;004A 0302;;;;N;LATIN CAPITAL LETTER J CIRCUMFLEX;;;0135;
+0135;LATIN SMALL LETTER J WITH CIRCUMFLEX;Ll;0;L;006A 0302;;;;N;LATIN SMALL LETTER J CIRCUMFLEX;;0134;;0134
+0136;LATIN CAPITAL LETTER K WITH CEDILLA;Lu;0;L;004B 0327;;;;N;LATIN CAPITAL LETTER K CEDILLA;;;0137;
+0137;LATIN SMALL LETTER K WITH CEDILLA;Ll;0;L;006B 0327;;;;N;LATIN SMALL LETTER K CEDILLA;;0136;;0136
+0138;LATIN SMALL LETTER KRA;Ll;0;L;;;;;N;;Greenlandic;;;
+0139;LATIN CAPITAL LETTER L WITH ACUTE;Lu;0;L;004C 0301;;;;N;LATIN CAPITAL LETTER L ACUTE;;;013A;
+013A;LATIN SMALL LETTER L WITH ACUTE;Ll;0;L;006C 0301;;;;N;LATIN SMALL LETTER L ACUTE;;0139;;0139
+013B;LATIN CAPITAL LETTER L WITH CEDILLA;Lu;0;L;004C 0327;;;;N;LATIN CAPITAL LETTER L CEDILLA;;;013C;
+013C;LATIN SMALL LETTER L WITH CEDILLA;Ll;0;L;006C 0327;;;;N;LATIN SMALL LETTER L CEDILLA;;013B;;013B
+013D;LATIN CAPITAL LETTER L WITH CARON;Lu;0;L;004C 030C;;;;N;LATIN CAPITAL LETTER L HACEK;;;013E;
+013E;LATIN SMALL LETTER L WITH CARON;Ll;0;L;006C 030C;;;;N;LATIN SMALL LETTER L HACEK;;013D;;013D
+013F;LATIN CAPITAL LETTER L WITH MIDDLE DOT;Lu;0;L;<compat> 004C 00B7;;;;N;;;;0140;
+0140;LATIN SMALL LETTER L WITH MIDDLE DOT;Ll;0;L;<compat> 006C 00B7;;;;N;;;013F;;013F
+0141;LATIN CAPITAL LETTER L WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER L SLASH;;;0142;
+0142;LATIN SMALL LETTER L WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER L SLASH;;0141;;0141
+0143;LATIN CAPITAL LETTER N WITH ACUTE;Lu;0;L;004E 0301;;;;N;LATIN CAPITAL LETTER N ACUTE;;;0144;
+0144;LATIN SMALL LETTER N WITH ACUTE;Ll;0;L;006E 0301;;;;N;LATIN SMALL LETTER N ACUTE;;0143;;0143
+0145;LATIN CAPITAL LETTER N WITH CEDILLA;Lu;0;L;004E 0327;;;;N;LATIN CAPITAL LETTER N CEDILLA;;;0146;
+0146;LATIN SMALL LETTER N WITH CEDILLA;Ll;0;L;006E 0327;;;;N;LATIN SMALL LETTER N CEDILLA;;0145;;0145
+0147;LATIN CAPITAL LETTER N WITH CARON;Lu;0;L;004E 030C;;;;N;LATIN CAPITAL LETTER N HACEK;;;0148;
+0148;LATIN SMALL LETTER N WITH CARON;Ll;0;L;006E 030C;;;;N;LATIN SMALL LETTER N HACEK;;0147;;0147
+0149;LATIN SMALL LETTER N PRECEDED BY APOSTROPHE;Ll;0;L;<compat> 02BC 006E;;;;N;LATIN SMALL LETTER APOSTROPHE N;;;;
+014A;LATIN CAPITAL LETTER ENG;Lu;0;L;;;;;N;;Sami;;014B;
+014B;LATIN SMALL LETTER ENG;Ll;0;L;;;;;N;;Sami;014A;;014A
+014C;LATIN CAPITAL LETTER O WITH MACRON;Lu;0;L;004F 0304;;;;N;LATIN CAPITAL LETTER O MACRON;;;014D;
+014D;LATIN SMALL LETTER O WITH MACRON;Ll;0;L;006F 0304;;;;N;LATIN SMALL LETTER O MACRON;;014C;;014C
+014E;LATIN CAPITAL LETTER O WITH BREVE;Lu;0;L;004F 0306;;;;N;LATIN CAPITAL LETTER O BREVE;;;014F;
+014F;LATIN SMALL LETTER O WITH BREVE;Ll;0;L;006F 0306;;;;N;LATIN SMALL LETTER O BREVE;;014E;;014E
+0150;LATIN CAPITAL LETTER O WITH DOUBLE ACUTE;Lu;0;L;004F 030B;;;;N;LATIN CAPITAL LETTER O DOUBLE ACUTE;;;0151;
+0151;LATIN SMALL LETTER O WITH DOUBLE ACUTE;Ll;0;L;006F 030B;;;;N;LATIN SMALL LETTER O DOUBLE ACUTE;;0150;;0150
+0152;LATIN CAPITAL LIGATURE OE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER O E;;;0153;
+0153;LATIN SMALL LIGATURE OE;Ll;0;L;;;;;N;LATIN SMALL LETTER O E;;0152;;0152
+0154;LATIN CAPITAL LETTER R WITH ACUTE;Lu;0;L;0052 0301;;;;N;LATIN CAPITAL LETTER R ACUTE;;;0155;
+0155;LATIN SMALL LETTER R WITH ACUTE;Ll;0;L;0072 0301;;;;N;LATIN SMALL LETTER R ACUTE;;0154;;0154
+0156;LATIN CAPITAL LETTER R WITH CEDILLA;Lu;0;L;0052 0327;;;;N;LATIN CAPITAL LETTER R CEDILLA;;;0157;
+0157;LATIN SMALL LETTER R WITH CEDILLA;Ll;0;L;0072 0327;;;;N;LATIN SMALL LETTER R CEDILLA;;0156;;0156
+0158;LATIN CAPITAL LETTER R WITH CARON;Lu;0;L;0052 030C;;;;N;LATIN CAPITAL LETTER R HACEK;;;0159;
+0159;LATIN SMALL LETTER R WITH CARON;Ll;0;L;0072 030C;;;;N;LATIN SMALL LETTER R HACEK;;0158;;0158
+015A;LATIN CAPITAL LETTER S WITH ACUTE;Lu;0;L;0053 0301;;;;N;LATIN CAPITAL LETTER S ACUTE;;;015B;
+015B;LATIN SMALL LETTER S WITH ACUTE;Ll;0;L;0073 0301;;;;N;LATIN SMALL LETTER S ACUTE;;015A;;015A
+015C;LATIN CAPITAL LETTER S WITH CIRCUMFLEX;Lu;0;L;0053 0302;;;;N;LATIN CAPITAL LETTER S CIRCUMFLEX;;;015D;
+015D;LATIN SMALL LETTER S WITH CIRCUMFLEX;Ll;0;L;0073 0302;;;;N;LATIN SMALL LETTER S CIRCUMFLEX;;015C;;015C
+015E;LATIN CAPITAL LETTER S WITH CEDILLA;Lu;0;L;0053 0327;;;;N;LATIN CAPITAL LETTER S CEDILLA;*;;015F;
+015F;LATIN SMALL LETTER S WITH CEDILLA;Ll;0;L;0073 0327;;;;N;LATIN SMALL LETTER S CEDILLA;*;015E;;015E
+0160;LATIN CAPITAL LETTER S WITH CARON;Lu;0;L;0053 030C;;;;N;LATIN CAPITAL LETTER S HACEK;;;0161;
+0161;LATIN SMALL LETTER S WITH CARON;Ll;0;L;0073 030C;;;;N;LATIN SMALL LETTER S HACEK;;0160;;0160
+0162;LATIN CAPITAL LETTER T WITH CEDILLA;Lu;0;L;0054 0327;;;;N;LATIN CAPITAL LETTER T CEDILLA;*;;0163;
+0163;LATIN SMALL LETTER T WITH CEDILLA;Ll;0;L;0074 0327;;;;N;LATIN SMALL LETTER T CEDILLA;*;0162;;0162
+0164;LATIN CAPITAL LETTER T WITH CARON;Lu;0;L;0054 030C;;;;N;LATIN CAPITAL LETTER T HACEK;;;0165;
+0165;LATIN SMALL LETTER T WITH CARON;Ll;0;L;0074 030C;;;;N;LATIN SMALL LETTER T HACEK;;0164;;0164
+0166;LATIN CAPITAL LETTER T WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER T BAR;;;0167;
+0167;LATIN SMALL LETTER T WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER T BAR;;0166;;0166
+0168;LATIN CAPITAL LETTER U WITH TILDE;Lu;0;L;0055 0303;;;;N;LATIN CAPITAL LETTER U TILDE;;;0169;
+0169;LATIN SMALL LETTER U WITH TILDE;Ll;0;L;0075 0303;;;;N;LATIN SMALL LETTER U TILDE;;0168;;0168
+016A;LATIN CAPITAL LETTER U WITH MACRON;Lu;0;L;0055 0304;;;;N;LATIN CAPITAL LETTER U MACRON;;;016B;
+016B;LATIN SMALL LETTER U WITH MACRON;Ll;0;L;0075 0304;;;;N;LATIN SMALL LETTER U MACRON;;016A;;016A
+016C;LATIN CAPITAL LETTER U WITH BREVE;Lu;0;L;0055 0306;;;;N;LATIN CAPITAL LETTER U BREVE;;;016D;
+016D;LATIN SMALL LETTER U WITH BREVE;Ll;0;L;0075 0306;;;;N;LATIN SMALL LETTER U BREVE;;016C;;016C
+016E;LATIN CAPITAL LETTER U WITH RING ABOVE;Lu;0;L;0055 030A;;;;N;LATIN CAPITAL LETTER U RING;;;016F;
+016F;LATIN SMALL LETTER U WITH RING ABOVE;Ll;0;L;0075 030A;;;;N;LATIN SMALL LETTER U RING;;016E;;016E
+0170;LATIN CAPITAL LETTER U WITH DOUBLE ACUTE;Lu;0;L;0055 030B;;;;N;LATIN CAPITAL LETTER U DOUBLE ACUTE;;;0171;
+0171;LATIN SMALL LETTER U WITH DOUBLE ACUTE;Ll;0;L;0075 030B;;;;N;LATIN SMALL LETTER U DOUBLE ACUTE;;0170;;0170
+0172;LATIN CAPITAL LETTER U WITH OGONEK;Lu;0;L;0055 0328;;;;N;LATIN CAPITAL LETTER U OGONEK;;;0173;
+0173;LATIN SMALL LETTER U WITH OGONEK;Ll;0;L;0075 0328;;;;N;LATIN SMALL LETTER U OGONEK;;0172;;0172
+0174;LATIN CAPITAL LETTER W WITH CIRCUMFLEX;Lu;0;L;0057 0302;;;;N;LATIN CAPITAL LETTER W CIRCUMFLEX;;;0175;
+0175;LATIN SMALL LETTER W WITH CIRCUMFLEX;Ll;0;L;0077 0302;;;;N;LATIN SMALL LETTER W CIRCUMFLEX;;0174;;0174
+0176;LATIN CAPITAL LETTER Y WITH CIRCUMFLEX;Lu;0;L;0059 0302;;;;N;LATIN CAPITAL LETTER Y CIRCUMFLEX;;;0177;
+0177;LATIN SMALL LETTER Y WITH CIRCUMFLEX;Ll;0;L;0079 0302;;;;N;LATIN SMALL LETTER Y CIRCUMFLEX;;0176;;0176
+0178;LATIN CAPITAL LETTER Y WITH DIAERESIS;Lu;0;L;0059 0308;;;;N;LATIN CAPITAL LETTER Y DIAERESIS;;;00FF;
+0179;LATIN CAPITAL LETTER Z WITH ACUTE;Lu;0;L;005A 0301;;;;N;LATIN CAPITAL LETTER Z ACUTE;;;017A;
+017A;LATIN SMALL LETTER Z WITH ACUTE;Ll;0;L;007A 0301;;;;N;LATIN SMALL LETTER Z ACUTE;;0179;;0179
+017B;LATIN CAPITAL LETTER Z WITH DOT ABOVE;Lu;0;L;005A 0307;;;;N;LATIN CAPITAL LETTER Z DOT;;;017C;
+017C;LATIN SMALL LETTER Z WITH DOT ABOVE;Ll;0;L;007A 0307;;;;N;LATIN SMALL LETTER Z DOT;;017B;;017B
+017D;LATIN CAPITAL LETTER Z WITH CARON;Lu;0;L;005A 030C;;;;N;LATIN CAPITAL LETTER Z HACEK;;;017E;
+017E;LATIN SMALL LETTER Z WITH CARON;Ll;0;L;007A 030C;;;;N;LATIN SMALL LETTER Z HACEK;;017D;;017D
+017F;LATIN SMALL LETTER LONG S;Ll;0;L;<compat> 0073;;;;N;;;0053;;0053
+0180;LATIN SMALL LETTER B WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER B BAR;;;;
+0181;LATIN CAPITAL LETTER B WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER B HOOK;;;0253;
+0182;LATIN CAPITAL LETTER B WITH TOPBAR;Lu;0;L;;;;;N;LATIN CAPITAL LETTER B TOPBAR;;;0183;
+0183;LATIN SMALL LETTER B WITH TOPBAR;Ll;0;L;;;;;N;LATIN SMALL LETTER B TOPBAR;;0182;;0182
+0184;LATIN CAPITAL LETTER TONE SIX;Lu;0;L;;;;;N;;;;0185;
+0185;LATIN SMALL LETTER TONE SIX;Ll;0;L;;;;;N;;;0184;;0184
+0186;LATIN CAPITAL LETTER OPEN O;Lu;0;L;;;;;N;;;;0254;
+0187;LATIN CAPITAL LETTER C WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER C HOOK;;;0188;
+0188;LATIN SMALL LETTER C WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER C HOOK;;0187;;0187
+0189;LATIN CAPITAL LETTER AFRICAN D;Lu;0;L;;;;;N;;*;;0256;
+018A;LATIN CAPITAL LETTER D WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER D HOOK;;;0257;
+018B;LATIN CAPITAL LETTER D WITH TOPBAR;Lu;0;L;;;;;N;LATIN CAPITAL LETTER D TOPBAR;;;018C;
+018C;LATIN SMALL LETTER D WITH TOPBAR;Ll;0;L;;;;;N;LATIN SMALL LETTER D TOPBAR;;018B;;018B
+018D;LATIN SMALL LETTER TURNED DELTA;Ll;0;L;;;;;N;;;;;
+018E;LATIN CAPITAL LETTER REVERSED E;Lu;0;L;;;;;N;LATIN CAPITAL LETTER TURNED E;;;01DD;
+018F;LATIN CAPITAL LETTER SCHWA;Lu;0;L;;;;;N;;;;0259;
+0190;LATIN CAPITAL LETTER OPEN E;Lu;0;L;;;;;N;LATIN CAPITAL LETTER EPSILON;;;025B;
+0191;LATIN CAPITAL LETTER F WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER F HOOK;;;0192;
+0192;LATIN SMALL LETTER F WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER SCRIPT F;;0191;;0191
+0193;LATIN CAPITAL LETTER G WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER G HOOK;;;0260;
+0194;LATIN CAPITAL LETTER GAMMA;Lu;0;L;;;;;N;;;;0263;
+0195;LATIN SMALL LETTER HV;Ll;0;L;;;;;N;LATIN SMALL LETTER H V;hwair;01F6;;01F6
+0196;LATIN CAPITAL LETTER IOTA;Lu;0;L;;;;;N;;;;0269;
+0197;LATIN CAPITAL LETTER I WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER BARRED I;;;0268;
+0198;LATIN CAPITAL LETTER K WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER K HOOK;;;0199;
+0199;LATIN SMALL LETTER K WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER K HOOK;;0198;;0198
+019A;LATIN SMALL LETTER L WITH BAR;Ll;0;L;;;;;N;LATIN SMALL LETTER BARRED L;;;;
+019B;LATIN SMALL LETTER LAMBDA WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER BARRED LAMBDA;;;;
+019C;LATIN CAPITAL LETTER TURNED M;Lu;0;L;;;;;N;;;;026F;
+019D;LATIN CAPITAL LETTER N WITH LEFT HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER N HOOK;;;0272;
+019E;LATIN SMALL LETTER N WITH LONG RIGHT LEG;Ll;0;L;;;;;N;;;;;
+019F;LATIN CAPITAL LETTER O WITH MIDDLE TILDE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER BARRED O;*;;0275;
+01A0;LATIN CAPITAL LETTER O WITH HORN;Lu;0;L;004F 031B;;;;N;LATIN CAPITAL LETTER O HORN;;;01A1;
+01A1;LATIN SMALL LETTER O WITH HORN;Ll;0;L;006F 031B;;;;N;LATIN SMALL LETTER O HORN;;01A0;;01A0
+01A2;LATIN CAPITAL LETTER OI;Lu;0;L;;;;;N;LATIN CAPITAL LETTER O I;gha;;01A3;
+01A3;LATIN SMALL LETTER OI;Ll;0;L;;;;;N;LATIN SMALL LETTER O I;gha;01A2;;01A2
+01A4;LATIN CAPITAL LETTER P WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER P HOOK;;;01A5;
+01A5;LATIN SMALL LETTER P WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER P HOOK;;01A4;;01A4
+01A6;LATIN LETTER YR;Lu;0;L;;;;;N;LATIN LETTER Y R;*;;0280;
+01A7;LATIN CAPITAL LETTER TONE TWO;Lu;0;L;;;;;N;;;;01A8;
+01A8;LATIN SMALL LETTER TONE TWO;Ll;0;L;;;;;N;;;01A7;;01A7
+01A9;LATIN CAPITAL LETTER ESH;Lu;0;L;;;;;N;;;;0283;
+01AA;LATIN LETTER REVERSED ESH LOOP;Ll;0;L;;;;;N;;;;;
+01AB;LATIN SMALL LETTER T WITH PALATAL HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER T PALATAL HOOK;;;;
+01AC;LATIN CAPITAL LETTER T WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER T HOOK;;;01AD;
+01AD;LATIN SMALL LETTER T WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER T HOOK;;01AC;;01AC
+01AE;LATIN CAPITAL LETTER T WITH RETROFLEX HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER T RETROFLEX HOOK;;;0288;
+01AF;LATIN CAPITAL LETTER U WITH HORN;Lu;0;L;0055 031B;;;;N;LATIN CAPITAL LETTER U HORN;;;01B0;
+01B0;LATIN SMALL LETTER U WITH HORN;Ll;0;L;0075 031B;;;;N;LATIN SMALL LETTER U HORN;;01AF;;01AF
+01B1;LATIN CAPITAL LETTER UPSILON;Lu;0;L;;;;;N;;;;028A;
+01B2;LATIN CAPITAL LETTER V WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER SCRIPT V;;;028B;
+01B3;LATIN CAPITAL LETTER Y WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER Y HOOK;;;01B4;
+01B4;LATIN SMALL LETTER Y WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER Y HOOK;;01B3;;01B3
+01B5;LATIN CAPITAL LETTER Z WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER Z BAR;;;01B6;
+01B6;LATIN SMALL LETTER Z WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER Z BAR;;01B5;;01B5
+01B7;LATIN CAPITAL LETTER EZH;Lu;0;L;;;;;N;LATIN CAPITAL LETTER YOGH;;;0292;
+01B8;LATIN CAPITAL LETTER EZH REVERSED;Lu;0;L;;;;;N;LATIN CAPITAL LETTER REVERSED YOGH;;;01B9;
+01B9;LATIN SMALL LETTER EZH REVERSED;Ll;0;L;;;;;N;LATIN SMALL LETTER REVERSED YOGH;;01B8;;01B8
+01BA;LATIN SMALL LETTER EZH WITH TAIL;Ll;0;L;;;;;N;LATIN SMALL LETTER YOGH WITH TAIL;;;;
+01BB;LATIN LETTER TWO WITH STROKE;Lo;0;L;;;;;N;LATIN LETTER TWO BAR;;;;
+01BC;LATIN CAPITAL LETTER TONE FIVE;Lu;0;L;;;;;N;;;;01BD;
+01BD;LATIN SMALL LETTER TONE FIVE;Ll;0;L;;;;;N;;;01BC;;01BC
+01BE;LATIN LETTER INVERTED GLOTTAL STOP WITH STROKE;Ll;0;L;;;;;N;LATIN LETTER INVERTED GLOTTAL STOP BAR;;;;
+01BF;LATIN LETTER WYNN;Ll;0;L;;;;;N;;;01F7;;01F7
+01C0;LATIN LETTER DENTAL CLICK;Lo;0;L;;;;;N;LATIN LETTER PIPE;;;;
+01C1;LATIN LETTER LATERAL CLICK;Lo;0;L;;;;;N;LATIN LETTER DOUBLE PIPE;;;;
+01C2;LATIN LETTER ALVEOLAR CLICK;Lo;0;L;;;;;N;LATIN LETTER PIPE DOUBLE BAR;;;;
+01C3;LATIN LETTER RETROFLEX CLICK;Lo;0;L;;;;;N;LATIN LETTER EXCLAMATION MARK;;;;
+01C4;LATIN CAPITAL LETTER DZ WITH CARON;Lu;0;L;<compat> 0044 017D;;;;N;LATIN CAPITAL LETTER D Z HACEK;;;01C6;01C5
+01C5;LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON;Lt;0;L;<compat> 0044 017E;;;;N;LATIN LETTER CAPITAL D SMALL Z HACEK;;01C4;01C6;
+01C6;LATIN SMALL LETTER DZ WITH CARON;Ll;0;L;<compat> 0064 017E;;;;N;LATIN SMALL LETTER D Z HACEK;;01C4;;01C5
+01C7;LATIN CAPITAL LETTER LJ;Lu;0;L;<compat> 004C 004A;;;;N;LATIN CAPITAL LETTER L J;;;01C9;01C8
+01C8;LATIN CAPITAL LETTER L WITH SMALL LETTER J;Lt;0;L;<compat> 004C 006A;;;;N;LATIN LETTER CAPITAL L SMALL J;;01C7;01C9;
+01C9;LATIN SMALL LETTER LJ;Ll;0;L;<compat> 006C 006A;;;;N;LATIN SMALL LETTER L J;;01C7;;01C8
+01CA;LATIN CAPITAL LETTER NJ;Lu;0;L;<compat> 004E 004A;;;;N;LATIN CAPITAL LETTER N J;;;01CC;01CB
+01CB;LATIN CAPITAL LETTER N WITH SMALL LETTER J;Lt;0;L;<compat> 004E 006A;;;;N;LATIN LETTER CAPITAL N SMALL J;;01CA;01CC;
+01CC;LATIN SMALL LETTER NJ;Ll;0;L;<compat> 006E 006A;;;;N;LATIN SMALL LETTER N J;;01CA;;01CB
+01CD;LATIN CAPITAL LETTER A WITH CARON;Lu;0;L;0041 030C;;;;N;LATIN CAPITAL LETTER A HACEK;;;01CE;
+01CE;LATIN SMALL LETTER A WITH CARON;Ll;0;L;0061 030C;;;;N;LATIN SMALL LETTER A HACEK;;01CD;;01CD
+01CF;LATIN CAPITAL LETTER I WITH CARON;Lu;0;L;0049 030C;;;;N;LATIN CAPITAL LETTER I HACEK;;;01D0;
+01D0;LATIN SMALL LETTER I WITH CARON;Ll;0;L;0069 030C;;;;N;LATIN SMALL LETTER I HACEK;;01CF;;01CF
+01D1;LATIN CAPITAL LETTER O WITH CARON;Lu;0;L;004F 030C;;;;N;LATIN CAPITAL LETTER O HACEK;;;01D2;
+01D2;LATIN SMALL LETTER O WITH CARON;Ll;0;L;006F 030C;;;;N;LATIN SMALL LETTER O HACEK;;01D1;;01D1
+01D3;LATIN CAPITAL LETTER U WITH CARON;Lu;0;L;0055 030C;;;;N;LATIN CAPITAL LETTER U HACEK;;;01D4;
+01D4;LATIN SMALL LETTER U WITH CARON;Ll;0;L;0075 030C;;;;N;LATIN SMALL LETTER U HACEK;;01D3;;01D3
+01D5;LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON;Lu;0;L;00DC 0304;;;;N;LATIN CAPITAL LETTER U DIAERESIS MACRON;;;01D6;
+01D6;LATIN SMALL LETTER U WITH DIAERESIS AND MACRON;Ll;0;L;00FC 0304;;;;N;LATIN SMALL LETTER U DIAERESIS MACRON;;01D5;;01D5
+01D7;LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE;Lu;0;L;00DC 0301;;;;N;LATIN CAPITAL LETTER U DIAERESIS ACUTE;;;01D8;
+01D8;LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE;Ll;0;L;00FC 0301;;;;N;LATIN SMALL LETTER U DIAERESIS ACUTE;;01D7;;01D7
+01D9;LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON;Lu;0;L;00DC 030C;;;;N;LATIN CAPITAL LETTER U DIAERESIS HACEK;;;01DA;
+01DA;LATIN SMALL LETTER U WITH DIAERESIS AND CARON;Ll;0;L;00FC 030C;;;;N;LATIN SMALL LETTER U DIAERESIS HACEK;;01D9;;01D9
+01DB;LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE;Lu;0;L;00DC 0300;;;;N;LATIN CAPITAL LETTER U DIAERESIS GRAVE;;;01DC;
+01DC;LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE;Ll;0;L;00FC 0300;;;;N;LATIN SMALL LETTER U DIAERESIS GRAVE;;01DB;;01DB
+01DD;LATIN SMALL LETTER TURNED E;Ll;0;L;;;;;N;;;018E;;018E
+01DE;LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON;Lu;0;L;00C4 0304;;;;N;LATIN CAPITAL LETTER A DIAERESIS MACRON;;;01DF;
+01DF;LATIN SMALL LETTER A WITH DIAERESIS AND MACRON;Ll;0;L;00E4 0304;;;;N;LATIN SMALL LETTER A DIAERESIS MACRON;;01DE;;01DE
+01E0;LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON;Lu;0;L;0226 0304;;;;N;LATIN CAPITAL LETTER A DOT MACRON;;;01E1;
+01E1;LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON;Ll;0;L;0227 0304;;;;N;LATIN SMALL LETTER A DOT MACRON;;01E0;;01E0
+01E2;LATIN CAPITAL LETTER AE WITH MACRON;Lu;0;L;00C6 0304;;;;N;LATIN CAPITAL LETTER A E MACRON;ash *;;01E3;
+01E3;LATIN SMALL LETTER AE WITH MACRON;Ll;0;L;00E6 0304;;;;N;LATIN SMALL LETTER A E MACRON;ash *;01E2;;01E2
+01E4;LATIN CAPITAL LETTER G WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER G BAR;;;01E5;
+01E5;LATIN SMALL LETTER G WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER G BAR;;01E4;;01E4
+01E6;LATIN CAPITAL LETTER G WITH CARON;Lu;0;L;0047 030C;;;;N;LATIN CAPITAL LETTER G HACEK;;;01E7;
+01E7;LATIN SMALL LETTER G WITH CARON;Ll;0;L;0067 030C;;;;N;LATIN SMALL LETTER G HACEK;;01E6;;01E6
+01E8;LATIN CAPITAL LETTER K WITH CARON;Lu;0;L;004B 030C;;;;N;LATIN CAPITAL LETTER K HACEK;;;01E9;
+01E9;LATIN SMALL LETTER K WITH CARON;Ll;0;L;006B 030C;;;;N;LATIN SMALL LETTER K HACEK;;01E8;;01E8
+01EA;LATIN CAPITAL LETTER O WITH OGONEK;Lu;0;L;004F 0328;;;;N;LATIN CAPITAL LETTER O OGONEK;;;01EB;
+01EB;LATIN SMALL LETTER O WITH OGONEK;Ll;0;L;006F 0328;;;;N;LATIN SMALL LETTER O OGONEK;;01EA;;01EA
+01EC;LATIN CAPITAL LETTER O WITH OGONEK AND MACRON;Lu;0;L;01EA 0304;;;;N;LATIN CAPITAL LETTER O OGONEK MACRON;;;01ED;
+01ED;LATIN SMALL LETTER O WITH OGONEK AND MACRON;Ll;0;L;01EB 0304;;;;N;LATIN SMALL LETTER O OGONEK MACRON;;01EC;;01EC
+01EE;LATIN CAPITAL LETTER EZH WITH CARON;Lu;0;L;01B7 030C;;;;N;LATIN CAPITAL LETTER YOGH HACEK;;;01EF;
+01EF;LATIN SMALL LETTER EZH WITH CARON;Ll;0;L;0292 030C;;;;N;LATIN SMALL LETTER YOGH HACEK;;01EE;;01EE
+01F0;LATIN SMALL LETTER J WITH CARON;Ll;0;L;006A 030C;;;;N;LATIN SMALL LETTER J HACEK;;;;
+01F1;LATIN CAPITAL LETTER DZ;Lu;0;L;<compat> 0044 005A;;;;N;;;;01F3;01F2
+01F2;LATIN CAPITAL LETTER D WITH SMALL LETTER Z;Lt;0;L;<compat> 0044 007A;;;;N;;;01F1;01F3;
+01F3;LATIN SMALL LETTER DZ;Ll;0;L;<compat> 0064 007A;;;;N;;;01F1;;01F2
+01F4;LATIN CAPITAL LETTER G WITH ACUTE;Lu;0;L;0047 0301;;;;N;;;;01F5;
+01F5;LATIN SMALL LETTER G WITH ACUTE;Ll;0;L;0067 0301;;;;N;;;01F4;;01F4
+01F6;LATIN CAPITAL LETTER HWAIR;Lu;0;L;;;;;N;;;;0195;
+01F7;LATIN CAPITAL LETTER WYNN;Lu;0;L;;;;;N;;;;01BF;
+01F8;LATIN CAPITAL LETTER N WITH GRAVE;Lu;0;L;004E 0300;;;;N;;;;01F9;
+01F9;LATIN SMALL LETTER N WITH GRAVE;Ll;0;L;006E 0300;;;;N;;;01F8;;01F8
+01FA;LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE;Lu;0;L;00C5 0301;;;;N;;;;01FB;
+01FB;LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE;Ll;0;L;00E5 0301;;;;N;;;01FA;;01FA
+01FC;LATIN CAPITAL LETTER AE WITH ACUTE;Lu;0;L;00C6 0301;;;;N;;ash *;;01FD;
+01FD;LATIN SMALL LETTER AE WITH ACUTE;Ll;0;L;00E6 0301;;;;N;;ash *;01FC;;01FC
+01FE;LATIN CAPITAL LETTER O WITH STROKE AND ACUTE;Lu;0;L;00D8 0301;;;;N;;;;01FF;
+01FF;LATIN SMALL LETTER O WITH STROKE AND ACUTE;Ll;0;L;00F8 0301;;;;N;;;01FE;;01FE
+0200;LATIN CAPITAL LETTER A WITH DOUBLE GRAVE;Lu;0;L;0041 030F;;;;N;;;;0201;
+0201;LATIN SMALL LETTER A WITH DOUBLE GRAVE;Ll;0;L;0061 030F;;;;N;;;0200;;0200
+0202;LATIN CAPITAL LETTER A WITH INVERTED BREVE;Lu;0;L;0041 0311;;;;N;;;;0203;
+0203;LATIN SMALL LETTER A WITH INVERTED BREVE;Ll;0;L;0061 0311;;;;N;;;0202;;0202
+0204;LATIN CAPITAL LETTER E WITH DOUBLE GRAVE;Lu;0;L;0045 030F;;;;N;;;;0205;
+0205;LATIN SMALL LETTER E WITH DOUBLE GRAVE;Ll;0;L;0065 030F;;;;N;;;0204;;0204
+0206;LATIN CAPITAL LETTER E WITH INVERTED BREVE;Lu;0;L;0045 0311;;;;N;;;;0207;
+0207;LATIN SMALL LETTER E WITH INVERTED BREVE;Ll;0;L;0065 0311;;;;N;;;0206;;0206
+0208;LATIN CAPITAL LETTER I WITH DOUBLE GRAVE;Lu;0;L;0049 030F;;;;N;;;;0209;
+0209;LATIN SMALL LETTER I WITH DOUBLE GRAVE;Ll;0;L;0069 030F;;;;N;;;0208;;0208
+020A;LATIN CAPITAL LETTER I WITH INVERTED BREVE;Lu;0;L;0049 0311;;;;N;;;;020B;
+020B;LATIN SMALL LETTER I WITH INVERTED BREVE;Ll;0;L;0069 0311;;;;N;;;020A;;020A
+020C;LATIN CAPITAL LETTER O WITH DOUBLE GRAVE;Lu;0;L;004F 030F;;;;N;;;;020D;
+020D;LATIN SMALL LETTER O WITH DOUBLE GRAVE;Ll;0;L;006F 030F;;;;N;;;020C;;020C
+020E;LATIN CAPITAL LETTER O WITH INVERTED BREVE;Lu;0;L;004F 0311;;;;N;;;;020F;
+020F;LATIN SMALL LETTER O WITH INVERTED BREVE;Ll;0;L;006F 0311;;;;N;;;020E;;020E
+0210;LATIN CAPITAL LETTER R WITH DOUBLE GRAVE;Lu;0;L;0052 030F;;;;N;;;;0211;
+0211;LATIN SMALL LETTER R WITH DOUBLE GRAVE;Ll;0;L;0072 030F;;;;N;;;0210;;0210
+0212;LATIN CAPITAL LETTER R WITH INVERTED BREVE;Lu;0;L;0052 0311;;;;N;;;;0213;
+0213;LATIN SMALL LETTER R WITH INVERTED BREVE;Ll;0;L;0072 0311;;;;N;;;0212;;0212
+0214;LATIN CAPITAL LETTER U WITH DOUBLE GRAVE;Lu;0;L;0055 030F;;;;N;;;;0215;
+0215;LATIN SMALL LETTER U WITH DOUBLE GRAVE;Ll;0;L;0075 030F;;;;N;;;0214;;0214
+0216;LATIN CAPITAL LETTER U WITH INVERTED BREVE;Lu;0;L;0055 0311;;;;N;;;;0217;
+0217;LATIN SMALL LETTER U WITH INVERTED BREVE;Ll;0;L;0075 0311;;;;N;;;0216;;0216
+0218;LATIN CAPITAL LETTER S WITH COMMA BELOW;Lu;0;L;0053 0326;;;;N;;*;;0219;
+0219;LATIN SMALL LETTER S WITH COMMA BELOW;Ll;0;L;0073 0326;;;;N;;*;0218;;0218
+021A;LATIN CAPITAL LETTER T WITH COMMA BELOW;Lu;0;L;0054 0326;;;;N;;*;;021B;
+021B;LATIN SMALL LETTER T WITH COMMA BELOW;Ll;0;L;0074 0326;;;;N;;*;021A;;021A
+021C;LATIN CAPITAL LETTER YOGH;Lu;0;L;;;;;N;;;;021D;
+021D;LATIN SMALL LETTER YOGH;Ll;0;L;;;;;N;;;021C;;021C
+021E;LATIN CAPITAL LETTER H WITH CARON;Lu;0;L;0048 030C;;;;N;;;;021F;
+021F;LATIN SMALL LETTER H WITH CARON;Ll;0;L;0068 030C;;;;N;;;021E;;021E
+0222;LATIN CAPITAL LETTER OU;Lu;0;L;;;;;N;;;;0223;
+0223;LATIN SMALL LETTER OU;Ll;0;L;;;;;N;;;0222;;0222
+0224;LATIN CAPITAL LETTER Z WITH HOOK;Lu;0;L;;;;;N;;;;0225;
+0225;LATIN SMALL LETTER Z WITH HOOK;Ll;0;L;;;;;N;;;0224;;0224
+0226;LATIN CAPITAL LETTER A WITH DOT ABOVE;Lu;0;L;0041 0307;;;;N;;;;0227;
+0227;LATIN SMALL LETTER A WITH DOT ABOVE;Ll;0;L;0061 0307;;;;N;;;0226;;0226
+0228;LATIN CAPITAL LETTER E WITH CEDILLA;Lu;0;L;0045 0327;;;;N;;;;0229;
+0229;LATIN SMALL LETTER E WITH CEDILLA;Ll;0;L;0065 0327;;;;N;;;0228;;0228
+022A;LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON;Lu;0;L;00D6 0304;;;;N;;;;022B;
+022B;LATIN SMALL LETTER O WITH DIAERESIS AND MACRON;Ll;0;L;00F6 0304;;;;N;;;022A;;022A
+022C;LATIN CAPITAL LETTER O WITH TILDE AND MACRON;Lu;0;L;00D5 0304;;;;N;;;;022D;
+022D;LATIN SMALL LETTER O WITH TILDE AND MACRON;Ll;0;L;00F5 0304;;;;N;;;022C;;022C
+022E;LATIN CAPITAL LETTER O WITH DOT ABOVE;Lu;0;L;004F 0307;;;;N;;;;022F;
+022F;LATIN SMALL LETTER O WITH DOT ABOVE;Ll;0;L;006F 0307;;;;N;;;022E;;022E
+0230;LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON;Lu;0;L;022E 0304;;;;N;;;;0231;
+0231;LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON;Ll;0;L;022F 0304;;;;N;;;0230;;0230
+0232;LATIN CAPITAL LETTER Y WITH MACRON;Lu;0;L;0059 0304;;;;N;;;;0233;
+0233;LATIN SMALL LETTER Y WITH MACRON;Ll;0;L;0079 0304;;;;N;;;0232;;0232
+0250;LATIN SMALL LETTER TURNED A;Ll;0;L;;;;;N;;;;;
+0251;LATIN SMALL LETTER ALPHA;Ll;0;L;;;;;N;LATIN SMALL LETTER SCRIPT A;;;;
+0252;LATIN SMALL LETTER TURNED ALPHA;Ll;0;L;;;;;N;LATIN SMALL LETTER TURNED SCRIPT A;;;;
+0253;LATIN SMALL LETTER B WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER B HOOK;;0181;;0181
+0254;LATIN SMALL LETTER OPEN O;Ll;0;L;;;;;N;;;0186;;0186
+0255;LATIN SMALL LETTER C WITH CURL;Ll;0;L;;;;;N;LATIN SMALL LETTER C CURL;;;;
+0256;LATIN SMALL LETTER D WITH TAIL;Ll;0;L;;;;;N;LATIN SMALL LETTER D RETROFLEX HOOK;;0189;;0189
+0257;LATIN SMALL LETTER D WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER D HOOK;;018A;;018A
+0258;LATIN SMALL LETTER REVERSED E;Ll;0;L;;;;;N;;;;;
+0259;LATIN SMALL LETTER SCHWA;Ll;0;L;;;;;N;;;018F;;018F
+025A;LATIN SMALL LETTER SCHWA WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER SCHWA HOOK;;;;
+025B;LATIN SMALL LETTER OPEN E;Ll;0;L;;;;;N;LATIN SMALL LETTER EPSILON;;0190;;0190
+025C;LATIN SMALL LETTER REVERSED OPEN E;Ll;0;L;;;;;N;LATIN SMALL LETTER REVERSED EPSILON;;;;
+025D;LATIN SMALL LETTER REVERSED OPEN E WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER REVERSED EPSILON HOOK;;;;
+025E;LATIN SMALL LETTER CLOSED REVERSED OPEN E;Ll;0;L;;;;;N;LATIN SMALL LETTER CLOSED REVERSED EPSILON;;;;
+025F;LATIN SMALL LETTER DOTLESS J WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER DOTLESS J BAR;;;;
+0260;LATIN SMALL LETTER G WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER G HOOK;;0193;;0193
+0261;LATIN SMALL LETTER SCRIPT G;Ll;0;L;;;;;N;;;;;
+0262;LATIN LETTER SMALL CAPITAL G;Ll;0;L;;;;;N;;;;;
+0263;LATIN SMALL LETTER GAMMA;Ll;0;L;;;;;N;;;0194;;0194
+0264;LATIN SMALL LETTER RAMS HORN;Ll;0;L;;;;;N;LATIN SMALL LETTER BABY GAMMA;;;;
+0265;LATIN SMALL LETTER TURNED H;Ll;0;L;;;;;N;;;;;
+0266;LATIN SMALL LETTER H WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER H HOOK;;;;
+0267;LATIN SMALL LETTER HENG WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER HENG HOOK;;;;
+0268;LATIN SMALL LETTER I WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER BARRED I;;0197;;0197
+0269;LATIN SMALL LETTER IOTA;Ll;0;L;;;;;N;;;0196;;0196
+026A;LATIN LETTER SMALL CAPITAL I;Ll;0;L;;;;;N;;;;;
+026B;LATIN SMALL LETTER L WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;;
+026C;LATIN SMALL LETTER L WITH BELT;Ll;0;L;;;;;N;LATIN SMALL LETTER L BELT;;;;
+026D;LATIN SMALL LETTER L WITH RETROFLEX HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER L RETROFLEX HOOK;;;;
+026E;LATIN SMALL LETTER LEZH;Ll;0;L;;;;;N;LATIN SMALL LETTER L YOGH;;;;
+026F;LATIN SMALL LETTER TURNED M;Ll;0;L;;;;;N;;;019C;;019C
+0270;LATIN SMALL LETTER TURNED M WITH LONG LEG;Ll;0;L;;;;;N;;;;;
+0271;LATIN SMALL LETTER M WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER M HOOK;;;;
+0272;LATIN SMALL LETTER N WITH LEFT HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER N HOOK;;019D;;019D
+0273;LATIN SMALL LETTER N WITH RETROFLEX HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER N RETROFLEX HOOK;;;;
+0274;LATIN LETTER SMALL CAPITAL N;Ll;0;L;;;;;N;;;;;
+0275;LATIN SMALL LETTER BARRED O;Ll;0;L;;;;;N;;;019F;;019F
+0276;LATIN LETTER SMALL CAPITAL OE;Ll;0;L;;;;;N;LATIN LETTER SMALL CAPITAL O E;;;;
+0277;LATIN SMALL LETTER CLOSED OMEGA;Ll;0;L;;;;;N;;;;;
+0278;LATIN SMALL LETTER PHI;Ll;0;L;;;;;N;;;;;
+0279;LATIN SMALL LETTER TURNED R;Ll;0;L;;;;;N;;;;;
+027A;LATIN SMALL LETTER TURNED R WITH LONG LEG;Ll;0;L;;;;;N;;;;;
+027B;LATIN SMALL LETTER TURNED R WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER TURNED R HOOK;;;;
+027C;LATIN SMALL LETTER R WITH LONG LEG;Ll;0;L;;;;;N;;;;;
+027D;LATIN SMALL LETTER R WITH TAIL;Ll;0;L;;;;;N;LATIN SMALL LETTER R HOOK;;;;
+027E;LATIN SMALL LETTER R WITH FISHHOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER FISHHOOK R;;;;
+027F;LATIN SMALL LETTER REVERSED R WITH FISHHOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER REVERSED FISHHOOK R;;;;
+0280;LATIN LETTER SMALL CAPITAL R;Ll;0;L;;;;;N;;*;01A6;;01A6
+0281;LATIN LETTER SMALL CAPITAL INVERTED R;Ll;0;L;;;;;N;;;;;
+0282;LATIN SMALL LETTER S WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER S HOOK;;;;
+0283;LATIN SMALL LETTER ESH;Ll;0;L;;;;;N;;;01A9;;01A9
+0284;LATIN SMALL LETTER DOTLESS J WITH STROKE AND HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER DOTLESS J BAR HOOK;;;;
+0285;LATIN SMALL LETTER SQUAT REVERSED ESH;Ll;0;L;;;;;N;;;;;
+0286;LATIN SMALL LETTER ESH WITH CURL;Ll;0;L;;;;;N;LATIN SMALL LETTER ESH CURL;;;;
+0287;LATIN SMALL LETTER TURNED T;Ll;0;L;;;;;N;;;;;
+0288;LATIN SMALL LETTER T WITH RETROFLEX HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER T RETROFLEX HOOK;;01AE;;01AE
+0289;LATIN SMALL LETTER U BAR;Ll;0;L;;;;;N;;;;;
+028A;LATIN SMALL LETTER UPSILON;Ll;0;L;;;;;N;;;01B1;;01B1
+028B;LATIN SMALL LETTER V WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER SCRIPT V;;01B2;;01B2
+028C;LATIN SMALL LETTER TURNED V;Ll;0;L;;;;;N;;;;;
+028D;LATIN SMALL LETTER TURNED W;Ll;0;L;;;;;N;;;;;
+028E;LATIN SMALL LETTER TURNED Y;Ll;0;L;;;;;N;;;;;
+028F;LATIN LETTER SMALL CAPITAL Y;Ll;0;L;;;;;N;;;;;
+0290;LATIN SMALL LETTER Z WITH RETROFLEX HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER Z RETROFLEX HOOK;;;;
+0291;LATIN SMALL LETTER Z WITH CURL;Ll;0;L;;;;;N;LATIN SMALL LETTER Z CURL;;;;
+0292;LATIN SMALL LETTER EZH;Ll;0;L;;;;;N;LATIN SMALL LETTER YOGH;;01B7;;01B7
+0293;LATIN SMALL LETTER EZH WITH CURL;Ll;0;L;;;;;N;LATIN SMALL LETTER YOGH CURL;;;;
+0294;LATIN LETTER GLOTTAL STOP;Ll;0;L;;;;;N;;;;;
+0295;LATIN LETTER PHARYNGEAL VOICED FRICATIVE;Ll;0;L;;;;;N;LATIN LETTER REVERSED GLOTTAL STOP;;;;
+0296;LATIN LETTER INVERTED GLOTTAL STOP;Ll;0;L;;;;;N;;;;;
+0297;LATIN LETTER STRETCHED C;Ll;0;L;;;;;N;;;;;
+0298;LATIN LETTER BILABIAL CLICK;Ll;0;L;;;;;N;LATIN LETTER BULLSEYE;;;;
+0299;LATIN LETTER SMALL CAPITAL B;Ll;0;L;;;;;N;;;;;
+029A;LATIN SMALL LETTER CLOSED OPEN E;Ll;0;L;;;;;N;LATIN SMALL LETTER CLOSED EPSILON;;;;
+029B;LATIN LETTER SMALL CAPITAL G WITH HOOK;Ll;0;L;;;;;N;LATIN LETTER SMALL CAPITAL G HOOK;;;;
+029C;LATIN LETTER SMALL CAPITAL H;Ll;0;L;;;;;N;;;;;
+029D;LATIN SMALL LETTER J WITH CROSSED-TAIL;Ll;0;L;;;;;N;LATIN SMALL LETTER CROSSED-TAIL J;;;;
+029E;LATIN SMALL LETTER TURNED K;Ll;0;L;;;;;N;;;;;
+029F;LATIN LETTER SMALL CAPITAL L;Ll;0;L;;;;;N;;;;;
+02A0;LATIN SMALL LETTER Q WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER Q HOOK;;;;
+02A1;LATIN LETTER GLOTTAL STOP WITH STROKE;Ll;0;L;;;;;N;LATIN LETTER GLOTTAL STOP BAR;;;;
+02A2;LATIN LETTER REVERSED GLOTTAL STOP WITH STROKE;Ll;0;L;;;;;N;LATIN LETTER REVERSED GLOTTAL STOP BAR;;;;
+02A3;LATIN SMALL LETTER DZ DIGRAPH;Ll;0;L;;;;;N;LATIN SMALL LETTER D Z;;;;
+02A4;LATIN SMALL LETTER DEZH DIGRAPH;Ll;0;L;;;;;N;LATIN SMALL LETTER D YOGH;;;;
+02A5;LATIN SMALL LETTER DZ DIGRAPH WITH CURL;Ll;0;L;;;;;N;LATIN SMALL LETTER D Z CURL;;;;
+02A6;LATIN SMALL LETTER TS DIGRAPH;Ll;0;L;;;;;N;LATIN SMALL LETTER T S;;;;
+02A7;LATIN SMALL LETTER TESH DIGRAPH;Ll;0;L;;;;;N;LATIN SMALL LETTER T ESH;;;;
+02A8;LATIN SMALL LETTER TC DIGRAPH WITH CURL;Ll;0;L;;;;;N;LATIN SMALL LETTER T C CURL;;;;
+02A9;LATIN SMALL LETTER FENG DIGRAPH;Ll;0;L;;;;;N;;;;;
+02AA;LATIN SMALL LETTER LS DIGRAPH;Ll;0;L;;;;;N;;;;;
+02AB;LATIN SMALL LETTER LZ DIGRAPH;Ll;0;L;;;;;N;;;;;
+02AC;LATIN LETTER BILABIAL PERCUSSIVE;Ll;0;L;;;;;N;;;;;
+02AD;LATIN LETTER BIDENTAL PERCUSSIVE;Ll;0;L;;;;;N;;;;;
+02B0;MODIFIER LETTER SMALL H;Lm;0;L;<super> 0068;;;;N;;;;;
+02B1;MODIFIER LETTER SMALL H WITH HOOK;Lm;0;L;<super> 0266;;;;N;MODIFIER LETTER SMALL H HOOK;;;;
+02B2;MODIFIER LETTER SMALL J;Lm;0;L;<super> 006A;;;;N;;;;;
+02B3;MODIFIER LETTER SMALL R;Lm;0;L;<super> 0072;;;;N;;;;;
+02B4;MODIFIER LETTER SMALL TURNED R;Lm;0;L;<super> 0279;;;;N;;;;;
+02B5;MODIFIER LETTER SMALL TURNED R WITH HOOK;Lm;0;L;<super> 027B;;;;N;MODIFIER LETTER SMALL TURNED R HOOK;;;;
+02B6;MODIFIER LETTER SMALL CAPITAL INVERTED R;Lm;0;L;<super> 0281;;;;N;;;;;
+02B7;MODIFIER LETTER SMALL W;Lm;0;L;<super> 0077;;;;N;;;;;
+02B8;MODIFIER LETTER SMALL Y;Lm;0;L;<super> 0079;;;;N;;;;;
+02B9;MODIFIER LETTER PRIME;Sk;0;ON;;;;;N;;;;;
+02BA;MODIFIER LETTER DOUBLE PRIME;Sk;0;ON;;;;;N;;;;;
+02BB;MODIFIER LETTER TURNED COMMA;Lm;0;L;;;;;N;;;;;
+02BC;MODIFIER LETTER APOSTROPHE;Lm;0;L;;;;;N;;;;;
+02BD;MODIFIER LETTER REVERSED COMMA;Lm;0;L;;;;;N;;;;;
+02BE;MODIFIER LETTER RIGHT HALF RING;Lm;0;L;;;;;N;;;;;
+02BF;MODIFIER LETTER LEFT HALF RING;Lm;0;L;;;;;N;;;;;
+02C0;MODIFIER LETTER GLOTTAL STOP;Lm;0;L;;;;;N;;;;;
+02C1;MODIFIER LETTER REVERSED GLOTTAL STOP;Lm;0;L;;;;;N;;;;;
+02C2;MODIFIER LETTER LEFT ARROWHEAD;Sk;0;ON;;;;;N;;;;;
+02C3;MODIFIER LETTER RIGHT ARROWHEAD;Sk;0;ON;;;;;N;;;;;
+02C4;MODIFIER LETTER UP ARROWHEAD;Sk;0;ON;;;;;N;;;;;
+02C5;MODIFIER LETTER DOWN ARROWHEAD;Sk;0;ON;;;;;N;;;;;
+02C6;MODIFIER LETTER CIRCUMFLEX ACCENT;Sk;0;ON;;;;;N;MODIFIER LETTER CIRCUMFLEX;;;;
+02C7;CARON;Sk;0;ON;;;;;N;MODIFIER LETTER HACEK;Mandarin Chinese third tone;;;
+02C8;MODIFIER LETTER VERTICAL LINE;Sk;0;ON;;;;;N;;;;;
+02C9;MODIFIER LETTER MACRON;Sk;0;ON;;;;;N;;Mandarin Chinese first tone;;;
+02CA;MODIFIER LETTER ACUTE ACCENT;Sk;0;ON;;;;;N;MODIFIER LETTER ACUTE;Mandarin Chinese second tone;;;
+02CB;MODIFIER LETTER GRAVE ACCENT;Sk;0;ON;;;;;N;MODIFIER LETTER GRAVE;Mandarin Chinese fourth tone;;;
+02CC;MODIFIER LETTER LOW VERTICAL LINE;Sk;0;ON;;;;;N;;;;;
+02CD;MODIFIER LETTER LOW MACRON;Sk;0;ON;;;;;N;;;;;
+02CE;MODIFIER LETTER LOW GRAVE ACCENT;Sk;0;ON;;;;;N;MODIFIER LETTER LOW GRAVE;;;;
+02CF;MODIFIER LETTER LOW ACUTE ACCENT;Sk;0;ON;;;;;N;MODIFIER LETTER LOW ACUTE;;;;
+02D0;MODIFIER LETTER TRIANGULAR COLON;Lm;0;L;;;;;N;;;;;
+02D1;MODIFIER LETTER HALF TRIANGULAR COLON;Lm;0;L;;;;;N;;;;;
+02D2;MODIFIER LETTER CENTRED RIGHT HALF RING;Sk;0;ON;;;;;N;MODIFIER LETTER CENTERED RIGHT HALF RING;;;;
+02D3;MODIFIER LETTER CENTRED LEFT HALF RING;Sk;0;ON;;;;;N;MODIFIER LETTER CENTERED LEFT HALF RING;;;;
+02D4;MODIFIER LETTER UP TACK;Sk;0;ON;;;;;N;;;;;
+02D5;MODIFIER LETTER DOWN TACK;Sk;0;ON;;;;;N;;;;;
+02D6;MODIFIER LETTER PLUS SIGN;Sk;0;ON;;;;;N;;;;;
+02D7;MODIFIER LETTER MINUS SIGN;Sk;0;ON;;;;;N;;;;;
+02D8;BREVE;Sk;0;ON;<compat> 0020 0306;;;;N;SPACING BREVE;;;;
+02D9;DOT ABOVE;Sk;0;ON;<compat> 0020 0307;;;;N;SPACING DOT ABOVE;Mandarin Chinese light tone;;;
+02DA;RING ABOVE;Sk;0;ON;<compat> 0020 030A;;;;N;SPACING RING ABOVE;;;;
+02DB;OGONEK;Sk;0;ON;<compat> 0020 0328;;;;N;SPACING OGONEK;;;;
+02DC;SMALL TILDE;Sk;0;ON;<compat> 0020 0303;;;;N;SPACING TILDE;;;;
+02DD;DOUBLE ACUTE ACCENT;Sk;0;ON;<compat> 0020 030B;;;;N;SPACING DOUBLE ACUTE;;;;
+02DE;MODIFIER LETTER RHOTIC HOOK;Sk;0;ON;;;;;N;;;;;
+02DF;MODIFIER LETTER CROSS ACCENT;Sk;0;ON;;;;;N;;;;;
+02E0;MODIFIER LETTER SMALL GAMMA;Lm;0;L;<super> 0263;;;;N;;;;;
+02E1;MODIFIER LETTER SMALL L;Lm;0;L;<super> 006C;;;;N;;;;;
+02E2;MODIFIER LETTER SMALL S;Lm;0;L;<super> 0073;;;;N;;;;;
+02E3;MODIFIER LETTER SMALL X;Lm;0;L;<super> 0078;;;;N;;;;;
+02E4;MODIFIER LETTER SMALL REVERSED GLOTTAL STOP;Lm;0;L;<super> 0295;;;;N;;;;;
+02E5;MODIFIER LETTER EXTRA-HIGH TONE BAR;Sk;0;ON;;;;;N;;;;;
+02E6;MODIFIER LETTER HIGH TONE BAR;Sk;0;ON;;;;;N;;;;;
+02E7;MODIFIER LETTER MID TONE BAR;Sk;0;ON;;;;;N;;;;;
+02E8;MODIFIER LETTER LOW TONE BAR;Sk;0;ON;;;;;N;;;;;
+02E9;MODIFIER LETTER EXTRA-LOW TONE BAR;Sk;0;ON;;;;;N;;;;;
+02EA;MODIFIER LETTER YIN DEPARTING TONE MARK;Sk;0;ON;;;;;N;;;;;
+02EB;MODIFIER LETTER YANG DEPARTING TONE MARK;Sk;0;ON;;;;;N;;;;;
+02EC;MODIFIER LETTER VOICING;Sk;0;ON;;;;;N;;;;;
+02ED;MODIFIER LETTER UNASPIRATED;Sk;0;ON;;;;;N;;;;;
+02EE;MODIFIER LETTER DOUBLE APOSTROPHE;Lm;0;L;;;;;N;;;;;
+0300;COMBINING GRAVE ACCENT;Mn;230;NSM;;;;;N;NON-SPACING GRAVE;Varia;;;
+0301;COMBINING ACUTE ACCENT;Mn;230;NSM;;;;;N;NON-SPACING ACUTE;Oxia;;;
+0302;COMBINING CIRCUMFLEX ACCENT;Mn;230;NSM;;;;;N;NON-SPACING CIRCUMFLEX;;;;
+0303;COMBINING TILDE;Mn;230;NSM;;;;;N;NON-SPACING TILDE;;;;
+0304;COMBINING MACRON;Mn;230;NSM;;;;;N;NON-SPACING MACRON;;;;
+0305;COMBINING OVERLINE;Mn;230;NSM;;;;;N;NON-SPACING OVERSCORE;;;;
+0306;COMBINING BREVE;Mn;230;NSM;;;;;N;NON-SPACING BREVE;Vrachy;;;
+0307;COMBINING DOT ABOVE;Mn;230;NSM;;;;;N;NON-SPACING DOT ABOVE;;;;
+0308;COMBINING DIAERESIS;Mn;230;NSM;;;;;N;NON-SPACING DIAERESIS;Dialytika;;;
+0309;COMBINING HOOK ABOVE;Mn;230;NSM;;;;;N;NON-SPACING HOOK ABOVE;;;;
+030A;COMBINING RING ABOVE;Mn;230;NSM;;;;;N;NON-SPACING RING ABOVE;;;;
+030B;COMBINING DOUBLE ACUTE ACCENT;Mn;230;NSM;;;;;N;NON-SPACING DOUBLE ACUTE;;;;
+030C;COMBINING CARON;Mn;230;NSM;;;;;N;NON-SPACING HACEK;;;;
+030D;COMBINING VERTICAL LINE ABOVE;Mn;230;NSM;;;;;N;NON-SPACING VERTICAL LINE ABOVE;Tonos;;;
+030E;COMBINING DOUBLE VERTICAL LINE ABOVE;Mn;230;NSM;;;;;N;NON-SPACING DOUBLE VERTICAL LINE ABOVE;;;;
+030F;COMBINING DOUBLE GRAVE ACCENT;Mn;230;NSM;;;;;N;NON-SPACING DOUBLE GRAVE;;;;
+0310;COMBINING CANDRABINDU;Mn;230;NSM;;;;;N;NON-SPACING CANDRABINDU;;;;
+0311;COMBINING INVERTED BREVE;Mn;230;NSM;;;;;N;NON-SPACING INVERTED BREVE;;;;
+0312;COMBINING TURNED COMMA ABOVE;Mn;230;NSM;;;;;N;NON-SPACING TURNED COMMA ABOVE;;;;
+0313;COMBINING COMMA ABOVE;Mn;230;NSM;;;;;N;NON-SPACING COMMA ABOVE;Psili;;;
+0314;COMBINING REVERSED COMMA ABOVE;Mn;230;NSM;;;;;N;NON-SPACING REVERSED COMMA ABOVE;Dasia;;;
+0315;COMBINING COMMA ABOVE RIGHT;Mn;232;NSM;;;;;N;NON-SPACING COMMA ABOVE RIGHT;;;;
+0316;COMBINING GRAVE ACCENT BELOW;Mn;220;NSM;;;;;N;NON-SPACING GRAVE BELOW;;;;
+0317;COMBINING ACUTE ACCENT BELOW;Mn;220;NSM;;;;;N;NON-SPACING ACUTE BELOW;;;;
+0318;COMBINING LEFT TACK BELOW;Mn;220;NSM;;;;;N;NON-SPACING LEFT TACK BELOW;;;;
+0319;COMBINING RIGHT TACK BELOW;Mn;220;NSM;;;;;N;NON-SPACING RIGHT TACK BELOW;;;;
+031A;COMBINING LEFT ANGLE ABOVE;Mn;232;NSM;;;;;N;NON-SPACING LEFT ANGLE ABOVE;;;;
+031B;COMBINING HORN;Mn;216;NSM;;;;;N;NON-SPACING HORN;;;;
+031C;COMBINING LEFT HALF RING BELOW;Mn;220;NSM;;;;;N;NON-SPACING LEFT HALF RING BELOW;;;;
+031D;COMBINING UP TACK BELOW;Mn;220;NSM;;;;;N;NON-SPACING UP TACK BELOW;;;;
+031E;COMBINING DOWN TACK BELOW;Mn;220;NSM;;;;;N;NON-SPACING DOWN TACK BELOW;;;;
+031F;COMBINING PLUS SIGN BELOW;Mn;220;NSM;;;;;N;NON-SPACING PLUS SIGN BELOW;;;;
+0320;COMBINING MINUS SIGN BELOW;Mn;220;NSM;;;;;N;NON-SPACING MINUS SIGN BELOW;;;;
+0321;COMBINING PALATALIZED HOOK BELOW;Mn;202;NSM;;;;;N;NON-SPACING PALATALIZED HOOK BELOW;;;;
+0322;COMBINING RETROFLEX HOOK BELOW;Mn;202;NSM;;;;;N;NON-SPACING RETROFLEX HOOK BELOW;;;;
+0323;COMBINING DOT BELOW;Mn;220;NSM;;;;;N;NON-SPACING DOT BELOW;;;;
+0324;COMBINING DIAERESIS BELOW;Mn;220;NSM;;;;;N;NON-SPACING DOUBLE DOT BELOW;;;;
+0325;COMBINING RING BELOW;Mn;220;NSM;;;;;N;NON-SPACING RING BELOW;;;;
+0326;COMBINING COMMA BELOW;Mn;220;NSM;;;;;N;NON-SPACING COMMA BELOW;;;;
+0327;COMBINING CEDILLA;Mn;202;NSM;;;;;N;NON-SPACING CEDILLA;;;;
+0328;COMBINING OGONEK;Mn;202;NSM;;;;;N;NON-SPACING OGONEK;;;;
+0329;COMBINING VERTICAL LINE BELOW;Mn;220;NSM;;;;;N;NON-SPACING VERTICAL LINE BELOW;;;;
+032A;COMBINING BRIDGE BELOW;Mn;220;NSM;;;;;N;NON-SPACING BRIDGE BELOW;;;;
+032B;COMBINING INVERTED DOUBLE ARCH BELOW;Mn;220;NSM;;;;;N;NON-SPACING INVERTED DOUBLE ARCH BELOW;;;;
+032C;COMBINING CARON BELOW;Mn;220;NSM;;;;;N;NON-SPACING HACEK BELOW;;;;
+032D;COMBINING CIRCUMFLEX ACCENT BELOW;Mn;220;NSM;;;;;N;NON-SPACING CIRCUMFLEX BELOW;;;;
+032E;COMBINING BREVE BELOW;Mn;220;NSM;;;;;N;NON-SPACING BREVE BELOW;;;;
+032F;COMBINING INVERTED BREVE BELOW;Mn;220;NSM;;;;;N;NON-SPACING INVERTED BREVE BELOW;;;;
+0330;COMBINING TILDE BELOW;Mn;220;NSM;;;;;N;NON-SPACING TILDE BELOW;;;;
+0331;COMBINING MACRON BELOW;Mn;220;NSM;;;;;N;NON-SPACING MACRON BELOW;;;;
+0332;COMBINING LOW LINE;Mn;220;NSM;;;;;N;NON-SPACING UNDERSCORE;;;;
+0333;COMBINING DOUBLE LOW LINE;Mn;220;NSM;;;;;N;NON-SPACING DOUBLE UNDERSCORE;;;;
+0334;COMBINING TILDE OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING TILDE OVERLAY;;;;
+0335;COMBINING SHORT STROKE OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING SHORT BAR OVERLAY;;;;
+0336;COMBINING LONG STROKE OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING LONG BAR OVERLAY;;;;
+0337;COMBINING SHORT SOLIDUS OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING SHORT SLASH OVERLAY;;;;
+0338;COMBINING LONG SOLIDUS OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING LONG SLASH OVERLAY;;;;
+0339;COMBINING RIGHT HALF RING BELOW;Mn;220;NSM;;;;;N;NON-SPACING RIGHT HALF RING BELOW;;;;
+033A;COMBINING INVERTED BRIDGE BELOW;Mn;220;NSM;;;;;N;NON-SPACING INVERTED BRIDGE BELOW;;;;
+033B;COMBINING SQUARE BELOW;Mn;220;NSM;;;;;N;NON-SPACING SQUARE BELOW;;;;
+033C;COMBINING SEAGULL BELOW;Mn;220;NSM;;;;;N;NON-SPACING SEAGULL BELOW;;;;
+033D;COMBINING X ABOVE;Mn;230;NSM;;;;;N;NON-SPACING X ABOVE;;;;
+033E;COMBINING VERTICAL TILDE;Mn;230;NSM;;;;;N;NON-SPACING VERTICAL TILDE;;;;
+033F;COMBINING DOUBLE OVERLINE;Mn;230;NSM;;;;;N;NON-SPACING DOUBLE OVERSCORE;;;;
+0340;COMBINING GRAVE TONE MARK;Mn;230;NSM;0300;;;;N;NON-SPACING GRAVE TONE MARK;Vietnamese;;;
+0341;COMBINING ACUTE TONE MARK;Mn;230;NSM;0301;;;;N;NON-SPACING ACUTE TONE MARK;Vietnamese;;;
+0342;COMBINING GREEK PERISPOMENI;Mn;230;NSM;;;;;N;;;;;
+0343;COMBINING GREEK KORONIS;Mn;230;NSM;0313;;;;N;;;;;
+0344;COMBINING GREEK DIALYTIKA TONOS;Mn;230;NSM;0308 0301;;;;N;GREEK NON-SPACING DIAERESIS TONOS;;;;
+0345;COMBINING GREEK YPOGEGRAMMENI;Mn;240;NSM;;;;;N;GREEK NON-SPACING IOTA BELOW;;0399;;0399
+0346;COMBINING BRIDGE ABOVE;Mn;230;NSM;;;;;N;;;;;
+0347;COMBINING EQUALS SIGN BELOW;Mn;220;NSM;;;;;N;;;;;
+0348;COMBINING DOUBLE VERTICAL LINE BELOW;Mn;220;NSM;;;;;N;;;;;
+0349;COMBINING LEFT ANGLE BELOW;Mn;220;NSM;;;;;N;;;;;
+034A;COMBINING NOT TILDE ABOVE;Mn;230;NSM;;;;;N;;;;;
+034B;COMBINING HOMOTHETIC ABOVE;Mn;230;NSM;;;;;N;;;;;
+034C;COMBINING ALMOST EQUAL TO ABOVE;Mn;230;NSM;;;;;N;;;;;
+034D;COMBINING LEFT RIGHT ARROW BELOW;Mn;220;NSM;;;;;N;;;;;
+034E;COMBINING UPWARDS ARROW BELOW;Mn;220;NSM;;;;;N;;;;;
+0360;COMBINING DOUBLE TILDE;Mn;234;NSM;;;;;N;;;;;
+0361;COMBINING DOUBLE INVERTED BREVE;Mn;234;NSM;;;;;N;;;;;
+0362;COMBINING DOUBLE RIGHTWARDS ARROW BELOW;Mn;233;NSM;;;;;N;;;;;
+0374;GREEK NUMERAL SIGN;Sk;0;ON;02B9;;;;N;GREEK UPPER NUMERAL SIGN;Dexia keraia;;;
+0375;GREEK LOWER NUMERAL SIGN;Sk;0;ON;;;;;N;;Aristeri keraia;;;
+037A;GREEK YPOGEGRAMMENI;Lm;0;L;<compat> 0020 0345;;;;N;GREEK SPACING IOTA BELOW;;;;
+037E;GREEK QUESTION MARK;Po;0;ON;003B;;;;N;;Erotimatiko;;;
+0384;GREEK TONOS;Sk;0;ON;<compat> 0020 0301;;;;N;GREEK SPACING TONOS;;;;
+0385;GREEK DIALYTIKA TONOS;Sk;0;ON;00A8 0301;;;;N;GREEK SPACING DIAERESIS TONOS;;;;
+0386;GREEK CAPITAL LETTER ALPHA WITH TONOS;Lu;0;L;0391 0301;;;;N;GREEK CAPITAL LETTER ALPHA TONOS;;;03AC;
+0387;GREEK ANO TELEIA;Po;0;ON;00B7;;;;N;;;;;
+0388;GREEK CAPITAL LETTER EPSILON WITH TONOS;Lu;0;L;0395 0301;;;;N;GREEK CAPITAL LETTER EPSILON TONOS;;;03AD;
+0389;GREEK CAPITAL LETTER ETA WITH TONOS;Lu;0;L;0397 0301;;;;N;GREEK CAPITAL LETTER ETA TONOS;;;03AE;
+038A;GREEK CAPITAL LETTER IOTA WITH TONOS;Lu;0;L;0399 0301;;;;N;GREEK CAPITAL LETTER IOTA TONOS;;;03AF;
+038C;GREEK CAPITAL LETTER OMICRON WITH TONOS;Lu;0;L;039F 0301;;;;N;GREEK CAPITAL LETTER OMICRON TONOS;;;03CC;
+038E;GREEK CAPITAL LETTER UPSILON WITH TONOS;Lu;0;L;03A5 0301;;;;N;GREEK CAPITAL LETTER UPSILON TONOS;;;03CD;
+038F;GREEK CAPITAL LETTER OMEGA WITH TONOS;Lu;0;L;03A9 0301;;;;N;GREEK CAPITAL LETTER OMEGA TONOS;;;03CE;
+0390;GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS;Ll;0;L;03CA 0301;;;;N;GREEK SMALL LETTER IOTA DIAERESIS TONOS;;;;
+0391;GREEK CAPITAL LETTER ALPHA;Lu;0;L;;;;;N;;;;03B1;
+0392;GREEK CAPITAL LETTER BETA;Lu;0;L;;;;;N;;;;03B2;
+0393;GREEK CAPITAL LETTER GAMMA;Lu;0;L;;;;;N;;;;03B3;
+0394;GREEK CAPITAL LETTER DELTA;Lu;0;L;;;;;N;;;;03B4;
+0395;GREEK CAPITAL LETTER EPSILON;Lu;0;L;;;;;N;;;;03B5;
+0396;GREEK CAPITAL LETTER ZETA;Lu;0;L;;;;;N;;;;03B6;
+0397;GREEK CAPITAL LETTER ETA;Lu;0;L;;;;;N;;;;03B7;
+0398;GREEK CAPITAL LETTER THETA;Lu;0;L;;;;;N;;;;03B8;
+0399;GREEK CAPITAL LETTER IOTA;Lu;0;L;;;;;N;;;;03B9;
+039A;GREEK CAPITAL LETTER KAPPA;Lu;0;L;;;;;N;;;;03BA;
+039B;GREEK CAPITAL LETTER LAMDA;Lu;0;L;;;;;N;GREEK CAPITAL LETTER LAMBDA;;;03BB;
+039C;GREEK CAPITAL LETTER MU;Lu;0;L;;;;;N;;;;03BC;
+039D;GREEK CAPITAL LETTER NU;Lu;0;L;;;;;N;;;;03BD;
+039E;GREEK CAPITAL LETTER XI;Lu;0;L;;;;;N;;;;03BE;
+039F;GREEK CAPITAL LETTER OMICRON;Lu;0;L;;;;;N;;;;03BF;
+03A0;GREEK CAPITAL LETTER PI;Lu;0;L;;;;;N;;;;03C0;
+03A1;GREEK CAPITAL LETTER RHO;Lu;0;L;;;;;N;;;;03C1;
+03A3;GREEK CAPITAL LETTER SIGMA;Lu;0;L;;;;;N;;;;03C3;
+03A4;GREEK CAPITAL LETTER TAU;Lu;0;L;;;;;N;;;;03C4;
+03A5;GREEK CAPITAL LETTER UPSILON;Lu;0;L;;;;;N;;;;03C5;
+03A6;GREEK CAPITAL LETTER PHI;Lu;0;L;;;;;N;;;;03C6;
+03A7;GREEK CAPITAL LETTER CHI;Lu;0;L;;;;;N;;;;03C7;
+03A8;GREEK CAPITAL LETTER PSI;Lu;0;L;;;;;N;;;;03C8;
+03A9;GREEK CAPITAL LETTER OMEGA;Lu;0;L;;;;;N;;;;03C9;
+03AA;GREEK CAPITAL LETTER IOTA WITH DIALYTIKA;Lu;0;L;0399 0308;;;;N;GREEK CAPITAL LETTER IOTA DIAERESIS;;;03CA;
+03AB;GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA;Lu;0;L;03A5 0308;;;;N;GREEK CAPITAL LETTER UPSILON DIAERESIS;;;03CB;
+03AC;GREEK SMALL LETTER ALPHA WITH TONOS;Ll;0;L;03B1 0301;;;;N;GREEK SMALL LETTER ALPHA TONOS;;0386;;0386
+03AD;GREEK SMALL LETTER EPSILON WITH TONOS;Ll;0;L;03B5 0301;;;;N;GREEK SMALL LETTER EPSILON TONOS;;0388;;0388
+03AE;GREEK SMALL LETTER ETA WITH TONOS;Ll;0;L;03B7 0301;;;;N;GREEK SMALL LETTER ETA TONOS;;0389;;0389
+03AF;GREEK SMALL LETTER IOTA WITH TONOS;Ll;0;L;03B9 0301;;;;N;GREEK SMALL LETTER IOTA TONOS;;038A;;038A
+03B0;GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS;Ll;0;L;03CB 0301;;;;N;GREEK SMALL LETTER UPSILON DIAERESIS TONOS;;;;
+03B1;GREEK SMALL LETTER ALPHA;Ll;0;L;;;;;N;;;0391;;0391
+03B2;GREEK SMALL LETTER BETA;Ll;0;L;;;;;N;;;0392;;0392
+03B3;GREEK SMALL LETTER GAMMA;Ll;0;L;;;;;N;;;0393;;0393
+03B4;GREEK SMALL LETTER DELTA;Ll;0;L;;;;;N;;;0394;;0394
+03B5;GREEK SMALL LETTER EPSILON;Ll;0;L;;;;;N;;;0395;;0395
+03B6;GREEK SMALL LETTER ZETA;Ll;0;L;;;;;N;;;0396;;0396
+03B7;GREEK SMALL LETTER ETA;Ll;0;L;;;;;N;;;0397;;0397
+03B8;GREEK SMALL LETTER THETA;Ll;0;L;;;;;N;;;0398;;0398
+03B9;GREEK SMALL LETTER IOTA;Ll;0;L;;;;;N;;;0399;;0399
+03BA;GREEK SMALL LETTER KAPPA;Ll;0;L;;;;;N;;;039A;;039A
+03BB;GREEK SMALL LETTER LAMDA;Ll;0;L;;;;;N;GREEK SMALL LETTER LAMBDA;;039B;;039B
+03BC;GREEK SMALL LETTER MU;Ll;0;L;;;;;N;;;039C;;039C
+03BD;GREEK SMALL LETTER NU;Ll;0;L;;;;;N;;;039D;;039D
+03BE;GREEK SMALL LETTER XI;Ll;0;L;;;;;N;;;039E;;039E
+03BF;GREEK SMALL LETTER OMICRON;Ll;0;L;;;;;N;;;039F;;039F
+03C0;GREEK SMALL LETTER PI;Ll;0;L;;;;;N;;;03A0;;03A0
+03C1;GREEK SMALL LETTER RHO;Ll;0;L;;;;;N;;;03A1;;03A1
+03C2;GREEK SMALL LETTER FINAL SIGMA;Ll;0;L;;;;;N;;;03A3;;03A3
+03C3;GREEK SMALL LETTER SIGMA;Ll;0;L;;;;;N;;;03A3;;03A3
+03C4;GREEK SMALL LETTER TAU;Ll;0;L;;;;;N;;;03A4;;03A4
+03C5;GREEK SMALL LETTER UPSILON;Ll;0;L;;;;;N;;;03A5;;03A5
+03C6;GREEK SMALL LETTER PHI;Ll;0;L;;;;;N;;;03A6;;03A6
+03C7;GREEK SMALL LETTER CHI;Ll;0;L;;;;;N;;;03A7;;03A7
+03C8;GREEK SMALL LETTER PSI;Ll;0;L;;;;;N;;;03A8;;03A8
+03C9;GREEK SMALL LETTER OMEGA;Ll;0;L;;;;;N;;;03A9;;03A9
+03CA;GREEK SMALL LETTER IOTA WITH DIALYTIKA;Ll;0;L;03B9 0308;;;;N;GREEK SMALL LETTER IOTA DIAERESIS;;03AA;;03AA
+03CB;GREEK SMALL LETTER UPSILON WITH DIALYTIKA;Ll;0;L;03C5 0308;;;;N;GREEK SMALL LETTER UPSILON DIAERESIS;;03AB;;03AB
+03CC;GREEK SMALL LETTER OMICRON WITH TONOS;Ll;0;L;03BF 0301;;;;N;GREEK SMALL LETTER OMICRON TONOS;;038C;;038C
+03CD;GREEK SMALL LETTER UPSILON WITH TONOS;Ll;0;L;03C5 0301;;;;N;GREEK SMALL LETTER UPSILON TONOS;;038E;;038E
+03CE;GREEK SMALL LETTER OMEGA WITH TONOS;Ll;0;L;03C9 0301;;;;N;GREEK SMALL LETTER OMEGA TONOS;;038F;;038F
+03D0;GREEK BETA SYMBOL;Ll;0;L;<compat> 03B2;;;;N;GREEK SMALL LETTER CURLED BETA;;0392;;0392
+03D1;GREEK THETA SYMBOL;Ll;0;L;<compat> 03B8;;;;N;GREEK SMALL LETTER SCRIPT THETA;;0398;;0398
+03D2;GREEK UPSILON WITH HOOK SYMBOL;Lu;0;L;<compat> 03A5;;;;N;GREEK CAPITAL LETTER UPSILON HOOK;;;;
+03D3;GREEK UPSILON WITH ACUTE AND HOOK SYMBOL;Lu;0;L;03D2 0301;;;;N;GREEK CAPITAL LETTER UPSILON HOOK TONOS;;;;
+03D4;GREEK UPSILON WITH DIAERESIS AND HOOK SYMBOL;Lu;0;L;03D2 0308;;;;N;GREEK CAPITAL LETTER UPSILON HOOK DIAERESIS;;;;
+03D5;GREEK PHI SYMBOL;Ll;0;L;<compat> 03C6;;;;N;GREEK SMALL LETTER SCRIPT PHI;;03A6;;03A6
+03D6;GREEK PI SYMBOL;Ll;0;L;<compat> 03C0;;;;N;GREEK SMALL LETTER OMEGA PI;;03A0;;03A0
+03D7;GREEK KAI SYMBOL;Ll;0;L;;;;;N;;;;;
+03DA;GREEK LETTER STIGMA;Lu;0;L;;;;;N;GREEK CAPITAL LETTER STIGMA;;;03DB;
+03DB;GREEK SMALL LETTER STIGMA;Ll;0;L;;;;;N;;;03DA;;03DA
+03DC;GREEK LETTER DIGAMMA;Lu;0;L;;;;;N;GREEK CAPITAL LETTER DIGAMMA;;;03DD;
+03DD;GREEK SMALL LETTER DIGAMMA;Ll;0;L;;;;;N;;;03DC;;03DC
+03DE;GREEK LETTER KOPPA;Lu;0;L;;;;;N;GREEK CAPITAL LETTER KOPPA;;;03DF;
+03DF;GREEK SMALL LETTER KOPPA;Ll;0;L;;;;;N;;;03DE;;03DE
+03E0;GREEK LETTER SAMPI;Lu;0;L;;;;;N;GREEK CAPITAL LETTER SAMPI;;;03E1;
+03E1;GREEK SMALL LETTER SAMPI;Ll;0;L;;;;;N;;;03E0;;03E0
+03E2;COPTIC CAPITAL LETTER SHEI;Lu;0;L;;;;;N;GREEK CAPITAL LETTER SHEI;;;03E3;
+03E3;COPTIC SMALL LETTER SHEI;Ll;0;L;;;;;N;GREEK SMALL LETTER SHEI;;03E2;;03E2
+03E4;COPTIC CAPITAL LETTER FEI;Lu;0;L;;;;;N;GREEK CAPITAL LETTER FEI;;;03E5;
+03E5;COPTIC SMALL LETTER FEI;Ll;0;L;;;;;N;GREEK SMALL LETTER FEI;;03E4;;03E4
+03E6;COPTIC CAPITAL LETTER KHEI;Lu;0;L;;;;;N;GREEK CAPITAL LETTER KHEI;;;03E7;
+03E7;COPTIC SMALL LETTER KHEI;Ll;0;L;;;;;N;GREEK SMALL LETTER KHEI;;03E6;;03E6
+03E8;COPTIC CAPITAL LETTER HORI;Lu;0;L;;;;;N;GREEK CAPITAL LETTER HORI;;;03E9;
+03E9;COPTIC SMALL LETTER HORI;Ll;0;L;;;;;N;GREEK SMALL LETTER HORI;;03E8;;03E8
+03EA;COPTIC CAPITAL LETTER GANGIA;Lu;0;L;;;;;N;GREEK CAPITAL LETTER GANGIA;;;03EB;
+03EB;COPTIC SMALL LETTER GANGIA;Ll;0;L;;;;;N;GREEK SMALL LETTER GANGIA;;03EA;;03EA
+03EC;COPTIC CAPITAL LETTER SHIMA;Lu;0;L;;;;;N;GREEK CAPITAL LETTER SHIMA;;;03ED;
+03ED;COPTIC SMALL LETTER SHIMA;Ll;0;L;;;;;N;GREEK SMALL LETTER SHIMA;;03EC;;03EC
+03EE;COPTIC CAPITAL LETTER DEI;Lu;0;L;;;;;N;GREEK CAPITAL LETTER DEI;;;03EF;
+03EF;COPTIC SMALL LETTER DEI;Ll;0;L;;;;;N;GREEK SMALL LETTER DEI;;03EE;;03EE
+03F0;GREEK KAPPA SYMBOL;Ll;0;L;<compat> 03BA;;;;N;GREEK SMALL LETTER SCRIPT KAPPA;;039A;;039A
+03F1;GREEK RHO SYMBOL;Ll;0;L;<compat> 03C1;;;;N;GREEK SMALL LETTER TAILED RHO;;03A1;;03A1
+03F2;GREEK LUNATE SIGMA SYMBOL;Ll;0;L;<compat> 03C2;;;;N;GREEK SMALL LETTER LUNATE SIGMA;;03A3;;03A3
+03F3;GREEK LETTER YOT;Ll;0;L;;;;;N;;;;;
+0400;CYRILLIC CAPITAL LETTER IE WITH GRAVE;Lu;0;L;0415 0300;;;;N;;;;0450;
+0401;CYRILLIC CAPITAL LETTER IO;Lu;0;L;0415 0308;;;;N;;;;0451;
+0402;CYRILLIC CAPITAL LETTER DJE;Lu;0;L;;;;;N;;Serbocroatian;;0452;
+0403;CYRILLIC CAPITAL LETTER GJE;Lu;0;L;0413 0301;;;;N;;;;0453;
+0404;CYRILLIC CAPITAL LETTER UKRAINIAN IE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER E;;;0454;
+0405;CYRILLIC CAPITAL LETTER DZE;Lu;0;L;;;;;N;;;;0455;
+0406;CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER I;;;0456;
+0407;CYRILLIC CAPITAL LETTER YI;Lu;0;L;0406 0308;;;;N;;Ukrainian;;0457;
+0408;CYRILLIC CAPITAL LETTER JE;Lu;0;L;;;;;N;;;;0458;
+0409;CYRILLIC CAPITAL LETTER LJE;Lu;0;L;;;;;N;;;;0459;
+040A;CYRILLIC CAPITAL LETTER NJE;Lu;0;L;;;;;N;;;;045A;
+040B;CYRILLIC CAPITAL LETTER TSHE;Lu;0;L;;;;;N;;Serbocroatian;;045B;
+040C;CYRILLIC CAPITAL LETTER KJE;Lu;0;L;041A 0301;;;;N;;;;045C;
+040D;CYRILLIC CAPITAL LETTER I WITH GRAVE;Lu;0;L;0418 0300;;;;N;;;;045D;
+040E;CYRILLIC CAPITAL LETTER SHORT U;Lu;0;L;0423 0306;;;;N;;Byelorussian;;045E;
+040F;CYRILLIC CAPITAL LETTER DZHE;Lu;0;L;;;;;N;;;;045F;
+0410;CYRILLIC CAPITAL LETTER A;Lu;0;L;;;;;N;;;;0430;
+0411;CYRILLIC CAPITAL LETTER BE;Lu;0;L;;;;;N;;;;0431;
+0412;CYRILLIC CAPITAL LETTER VE;Lu;0;L;;;;;N;;;;0432;
+0413;CYRILLIC CAPITAL LETTER GHE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER GE;;;0433;
+0414;CYRILLIC CAPITAL LETTER DE;Lu;0;L;;;;;N;;;;0434;
+0415;CYRILLIC CAPITAL LETTER IE;Lu;0;L;;;;;N;;;;0435;
+0416;CYRILLIC CAPITAL LETTER ZHE;Lu;0;L;;;;;N;;;;0436;
+0417;CYRILLIC CAPITAL LETTER ZE;Lu;0;L;;;;;N;;;;0437;
+0418;CYRILLIC CAPITAL LETTER I;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER II;;;0438;
+0419;CYRILLIC CAPITAL LETTER SHORT I;Lu;0;L;0418 0306;;;;N;CYRILLIC CAPITAL LETTER SHORT II;;;0439;
+041A;CYRILLIC CAPITAL LETTER KA;Lu;0;L;;;;;N;;;;043A;
+041B;CYRILLIC CAPITAL LETTER EL;Lu;0;L;;;;;N;;;;043B;
+041C;CYRILLIC CAPITAL LETTER EM;Lu;0;L;;;;;N;;;;043C;
+041D;CYRILLIC CAPITAL LETTER EN;Lu;0;L;;;;;N;;;;043D;
+041E;CYRILLIC CAPITAL LETTER O;Lu;0;L;;;;;N;;;;043E;
+041F;CYRILLIC CAPITAL LETTER PE;Lu;0;L;;;;;N;;;;043F;
+0420;CYRILLIC CAPITAL LETTER ER;Lu;0;L;;;;;N;;;;0440;
+0421;CYRILLIC CAPITAL LETTER ES;Lu;0;L;;;;;N;;;;0441;
+0422;CYRILLIC CAPITAL LETTER TE;Lu;0;L;;;;;N;;;;0442;
+0423;CYRILLIC CAPITAL LETTER U;Lu;0;L;;;;;N;;;;0443;
+0424;CYRILLIC CAPITAL LETTER EF;Lu;0;L;;;;;N;;;;0444;
+0425;CYRILLIC CAPITAL LETTER HA;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER KHA;;;0445;
+0426;CYRILLIC CAPITAL LETTER TSE;Lu;0;L;;;;;N;;;;0446;
+0427;CYRILLIC CAPITAL LETTER CHE;Lu;0;L;;;;;N;;;;0447;
+0428;CYRILLIC CAPITAL LETTER SHA;Lu;0;L;;;;;N;;;;0448;
+0429;CYRILLIC CAPITAL LETTER SHCHA;Lu;0;L;;;;;N;;;;0449;
+042A;CYRILLIC CAPITAL LETTER HARD SIGN;Lu;0;L;;;;;N;;;;044A;
+042B;CYRILLIC CAPITAL LETTER YERU;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER YERI;;;044B;
+042C;CYRILLIC CAPITAL LETTER SOFT SIGN;Lu;0;L;;;;;N;;;;044C;
+042D;CYRILLIC CAPITAL LETTER E;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER REVERSED E;;;044D;
+042E;CYRILLIC CAPITAL LETTER YU;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER IU;;;044E;
+042F;CYRILLIC CAPITAL LETTER YA;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER IA;;;044F;
+0430;CYRILLIC SMALL LETTER A;Ll;0;L;;;;;N;;;0410;;0410
+0431;CYRILLIC SMALL LETTER BE;Ll;0;L;;;;;N;;;0411;;0411
+0432;CYRILLIC SMALL LETTER VE;Ll;0;L;;;;;N;;;0412;;0412
+0433;CYRILLIC SMALL LETTER GHE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER GE;;0413;;0413
+0434;CYRILLIC SMALL LETTER DE;Ll;0;L;;;;;N;;;0414;;0414
+0435;CYRILLIC SMALL LETTER IE;Ll;0;L;;;;;N;;;0415;;0415
+0436;CYRILLIC SMALL LETTER ZHE;Ll;0;L;;;;;N;;;0416;;0416
+0437;CYRILLIC SMALL LETTER ZE;Ll;0;L;;;;;N;;;0417;;0417
+0438;CYRILLIC SMALL LETTER I;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER II;;0418;;0418
+0439;CYRILLIC SMALL LETTER SHORT I;Ll;0;L;0438 0306;;;;N;CYRILLIC SMALL LETTER SHORT II;;0419;;0419
+043A;CYRILLIC SMALL LETTER KA;Ll;0;L;;;;;N;;;041A;;041A
+043B;CYRILLIC SMALL LETTER EL;Ll;0;L;;;;;N;;;041B;;041B
+043C;CYRILLIC SMALL LETTER EM;Ll;0;L;;;;;N;;;041C;;041C
+043D;CYRILLIC SMALL LETTER EN;Ll;0;L;;;;;N;;;041D;;041D
+043E;CYRILLIC SMALL LETTER O;Ll;0;L;;;;;N;;;041E;;041E
+043F;CYRILLIC SMALL LETTER PE;Ll;0;L;;;;;N;;;041F;;041F
+0440;CYRILLIC SMALL LETTER ER;Ll;0;L;;;;;N;;;0420;;0420
+0441;CYRILLIC SMALL LETTER ES;Ll;0;L;;;;;N;;;0421;;0421
+0442;CYRILLIC SMALL LETTER TE;Ll;0;L;;;;;N;;;0422;;0422
+0443;CYRILLIC SMALL LETTER U;Ll;0;L;;;;;N;;;0423;;0423
+0444;CYRILLIC SMALL LETTER EF;Ll;0;L;;;;;N;;;0424;;0424
+0445;CYRILLIC SMALL LETTER HA;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER KHA;;0425;;0425
+0446;CYRILLIC SMALL LETTER TSE;Ll;0;L;;;;;N;;;0426;;0426
+0447;CYRILLIC SMALL LETTER CHE;Ll;0;L;;;;;N;;;0427;;0427
+0448;CYRILLIC SMALL LETTER SHA;Ll;0;L;;;;;N;;;0428;;0428
+0449;CYRILLIC SMALL LETTER SHCHA;Ll;0;L;;;;;N;;;0429;;0429
+044A;CYRILLIC SMALL LETTER HARD SIGN;Ll;0;L;;;;;N;;;042A;;042A
+044B;CYRILLIC SMALL LETTER YERU;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER YERI;;042B;;042B
+044C;CYRILLIC SMALL LETTER SOFT SIGN;Ll;0;L;;;;;N;;;042C;;042C
+044D;CYRILLIC SMALL LETTER E;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER REVERSED E;;042D;;042D
+044E;CYRILLIC SMALL LETTER YU;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER IU;;042E;;042E
+044F;CYRILLIC SMALL LETTER YA;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER IA;;042F;;042F
+0450;CYRILLIC SMALL LETTER IE WITH GRAVE;Ll;0;L;0435 0300;;;;N;;;0400;;0400
+0451;CYRILLIC SMALL LETTER IO;Ll;0;L;0435 0308;;;;N;;;0401;;0401
+0452;CYRILLIC SMALL LETTER DJE;Ll;0;L;;;;;N;;Serbocroatian;0402;;0402
+0453;CYRILLIC SMALL LETTER GJE;Ll;0;L;0433 0301;;;;N;;;0403;;0403
+0454;CYRILLIC SMALL LETTER UKRAINIAN IE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER E;;0404;;0404
+0455;CYRILLIC SMALL LETTER DZE;Ll;0;L;;;;;N;;;0405;;0405
+0456;CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER I;;0406;;0406
+0457;CYRILLIC SMALL LETTER YI;Ll;0;L;0456 0308;;;;N;;Ukrainian;0407;;0407
+0458;CYRILLIC SMALL LETTER JE;Ll;0;L;;;;;N;;;0408;;0408
+0459;CYRILLIC SMALL LETTER LJE;Ll;0;L;;;;;N;;;0409;;0409
+045A;CYRILLIC SMALL LETTER NJE;Ll;0;L;;;;;N;;;040A;;040A
+045B;CYRILLIC SMALL LETTER TSHE;Ll;0;L;;;;;N;;Serbocroatian;040B;;040B
+045C;CYRILLIC SMALL LETTER KJE;Ll;0;L;043A 0301;;;;N;;;040C;;040C
+045D;CYRILLIC SMALL LETTER I WITH GRAVE;Ll;0;L;0438 0300;;;;N;;;040D;;040D
+045E;CYRILLIC SMALL LETTER SHORT U;Ll;0;L;0443 0306;;;;N;;Byelorussian;040E;;040E
+045F;CYRILLIC SMALL LETTER DZHE;Ll;0;L;;;;;N;;;040F;;040F
+0460;CYRILLIC CAPITAL LETTER OMEGA;Lu;0;L;;;;;N;;;;0461;
+0461;CYRILLIC SMALL LETTER OMEGA;Ll;0;L;;;;;N;;;0460;;0460
+0462;CYRILLIC CAPITAL LETTER YAT;Lu;0;L;;;;;N;;;;0463;
+0463;CYRILLIC SMALL LETTER YAT;Ll;0;L;;;;;N;;;0462;;0462
+0464;CYRILLIC CAPITAL LETTER IOTIFIED E;Lu;0;L;;;;;N;;;;0465;
+0465;CYRILLIC SMALL LETTER IOTIFIED E;Ll;0;L;;;;;N;;;0464;;0464
+0466;CYRILLIC CAPITAL LETTER LITTLE YUS;Lu;0;L;;;;;N;;;;0467;
+0467;CYRILLIC SMALL LETTER LITTLE YUS;Ll;0;L;;;;;N;;;0466;;0466
+0468;CYRILLIC CAPITAL LETTER IOTIFIED LITTLE YUS;Lu;0;L;;;;;N;;;;0469;
+0469;CYRILLIC SMALL LETTER IOTIFIED LITTLE YUS;Ll;0;L;;;;;N;;;0468;;0468
+046A;CYRILLIC CAPITAL LETTER BIG YUS;Lu;0;L;;;;;N;;;;046B;
+046B;CYRILLIC SMALL LETTER BIG YUS;Ll;0;L;;;;;N;;;046A;;046A
+046C;CYRILLIC CAPITAL LETTER IOTIFIED BIG YUS;Lu;0;L;;;;;N;;;;046D;
+046D;CYRILLIC SMALL LETTER IOTIFIED BIG YUS;Ll;0;L;;;;;N;;;046C;;046C
+046E;CYRILLIC CAPITAL LETTER KSI;Lu;0;L;;;;;N;;;;046F;
+046F;CYRILLIC SMALL LETTER KSI;Ll;0;L;;;;;N;;;046E;;046E
+0470;CYRILLIC CAPITAL LETTER PSI;Lu;0;L;;;;;N;;;;0471;
+0471;CYRILLIC SMALL LETTER PSI;Ll;0;L;;;;;N;;;0470;;0470
+0472;CYRILLIC CAPITAL LETTER FITA;Lu;0;L;;;;;N;;;;0473;
+0473;CYRILLIC SMALL LETTER FITA;Ll;0;L;;;;;N;;;0472;;0472
+0474;CYRILLIC CAPITAL LETTER IZHITSA;Lu;0;L;;;;;N;;;;0475;
+0475;CYRILLIC SMALL LETTER IZHITSA;Ll;0;L;;;;;N;;;0474;;0474
+0476;CYRILLIC CAPITAL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT;Lu;0;L;0474 030F;;;;N;CYRILLIC CAPITAL LETTER IZHITSA DOUBLE GRAVE;;;0477;
+0477;CYRILLIC SMALL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT;Ll;0;L;0475 030F;;;;N;CYRILLIC SMALL LETTER IZHITSA DOUBLE GRAVE;;0476;;0476
+0478;CYRILLIC CAPITAL LETTER UK;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER UK DIGRAPH;;;0479;
+0479;CYRILLIC SMALL LETTER UK;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER UK DIGRAPH;;0478;;0478
+047A;CYRILLIC CAPITAL LETTER ROUND OMEGA;Lu;0;L;;;;;N;;;;047B;
+047B;CYRILLIC SMALL LETTER ROUND OMEGA;Ll;0;L;;;;;N;;;047A;;047A
+047C;CYRILLIC CAPITAL LETTER OMEGA WITH TITLO;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER OMEGA TITLO;;;047D;
+047D;CYRILLIC SMALL LETTER OMEGA WITH TITLO;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER OMEGA TITLO;;047C;;047C
+047E;CYRILLIC CAPITAL LETTER OT;Lu;0;L;;;;;N;;;;047F;
+047F;CYRILLIC SMALL LETTER OT;Ll;0;L;;;;;N;;;047E;;047E
+0480;CYRILLIC CAPITAL LETTER KOPPA;Lu;0;L;;;;;N;;;;0481;
+0481;CYRILLIC SMALL LETTER KOPPA;Ll;0;L;;;;;N;;;0480;;0480
+0482;CYRILLIC THOUSANDS SIGN;So;0;L;;;;;N;;;;;
+0483;COMBINING CYRILLIC TITLO;Mn;230;NSM;;;;;N;CYRILLIC NON-SPACING TITLO;;;;
+0484;COMBINING CYRILLIC PALATALIZATION;Mn;230;NSM;;;;;N;CYRILLIC NON-SPACING PALATALIZATION;;;;
+0485;COMBINING CYRILLIC DASIA PNEUMATA;Mn;230;NSM;;;;;N;CYRILLIC NON-SPACING DASIA PNEUMATA;;;;
+0486;COMBINING CYRILLIC PSILI PNEUMATA;Mn;230;NSM;;;;;N;CYRILLIC NON-SPACING PSILI PNEUMATA;;;;
+0488;COMBINING CYRILLIC HUNDRED THOUSANDS SIGN;Me;0;NSM;;;;;N;;;;;
+0489;COMBINING CYRILLIC MILLIONS SIGN;Me;0;NSM;;;;;N;;;;;
+048C;CYRILLIC CAPITAL LETTER SEMISOFT SIGN;Lu;0;L;;;;;N;;;;048D;
+048D;CYRILLIC SMALL LETTER SEMISOFT SIGN;Ll;0;L;;;;;N;;;048C;;048C
+048E;CYRILLIC CAPITAL LETTER ER WITH TICK;Lu;0;L;;;;;N;;;;048F;
+048F;CYRILLIC SMALL LETTER ER WITH TICK;Ll;0;L;;;;;N;;;048E;;048E
+0490;CYRILLIC CAPITAL LETTER GHE WITH UPTURN;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER GE WITH UPTURN;;;0491;
+0491;CYRILLIC SMALL LETTER GHE WITH UPTURN;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER GE WITH UPTURN;;0490;;0490
+0492;CYRILLIC CAPITAL LETTER GHE WITH STROKE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER GE BAR;;;0493;
+0493;CYRILLIC SMALL LETTER GHE WITH STROKE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER GE BAR;;0492;;0492
+0494;CYRILLIC CAPITAL LETTER GHE WITH MIDDLE HOOK;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER GE HOOK;;;0495;
+0495;CYRILLIC SMALL LETTER GHE WITH MIDDLE HOOK;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER GE HOOK;;0494;;0494
+0496;CYRILLIC CAPITAL LETTER ZHE WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER ZHE WITH RIGHT DESCENDER;;;0497;
+0497;CYRILLIC SMALL LETTER ZHE WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER ZHE WITH RIGHT DESCENDER;;0496;;0496
+0498;CYRILLIC CAPITAL LETTER ZE WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER ZE CEDILLA;;;0499;
+0499;CYRILLIC SMALL LETTER ZE WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER ZE CEDILLA;;0498;;0498
+049A;CYRILLIC CAPITAL LETTER KA WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER KA WITH RIGHT DESCENDER;;;049B;
+049B;CYRILLIC SMALL LETTER KA WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER KA WITH RIGHT DESCENDER;;049A;;049A
+049C;CYRILLIC CAPITAL LETTER KA WITH VERTICAL STROKE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER KA VERTICAL BAR;;;049D;
+049D;CYRILLIC SMALL LETTER KA WITH VERTICAL STROKE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER KA VERTICAL BAR;;049C;;049C
+049E;CYRILLIC CAPITAL LETTER KA WITH STROKE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER KA BAR;;;049F;
+049F;CYRILLIC SMALL LETTER KA WITH STROKE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER KA BAR;;049E;;049E
+04A0;CYRILLIC CAPITAL LETTER BASHKIR KA;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER REVERSED GE KA;;;04A1;
+04A1;CYRILLIC SMALL LETTER BASHKIR KA;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER REVERSED GE KA;;04A0;;04A0
+04A2;CYRILLIC CAPITAL LETTER EN WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER EN WITH RIGHT DESCENDER;;;04A3;
+04A3;CYRILLIC SMALL LETTER EN WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER EN WITH RIGHT DESCENDER;;04A2;;04A2
+04A4;CYRILLIC CAPITAL LIGATURE EN GHE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER EN GE;;;04A5;
+04A5;CYRILLIC SMALL LIGATURE EN GHE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER EN GE;;04A4;;04A4
+04A6;CYRILLIC CAPITAL LETTER PE WITH MIDDLE HOOK;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER PE HOOK;Abkhasian;;04A7;
+04A7;CYRILLIC SMALL LETTER PE WITH MIDDLE HOOK;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER PE HOOK;Abkhasian;04A6;;04A6
+04A8;CYRILLIC CAPITAL LETTER ABKHASIAN HA;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER O HOOK;;;04A9;
+04A9;CYRILLIC SMALL LETTER ABKHASIAN HA;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER O HOOK;;04A8;;04A8
+04AA;CYRILLIC CAPITAL LETTER ES WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER ES CEDILLA;;;04AB;
+04AB;CYRILLIC SMALL LETTER ES WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER ES CEDILLA;;04AA;;04AA
+04AC;CYRILLIC CAPITAL LETTER TE WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER TE WITH RIGHT DESCENDER;;;04AD;
+04AD;CYRILLIC SMALL LETTER TE WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER TE WITH RIGHT DESCENDER;;04AC;;04AC
+04AE;CYRILLIC CAPITAL LETTER STRAIGHT U;Lu;0;L;;;;;N;;;;04AF;
+04AF;CYRILLIC SMALL LETTER STRAIGHT U;Ll;0;L;;;;;N;;;04AE;;04AE
+04B0;CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER STRAIGHT U BAR;;;04B1;
+04B1;CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER STRAIGHT U BAR;;04B0;;04B0
+04B2;CYRILLIC CAPITAL LETTER HA WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER KHA WITH RIGHT DESCENDER;;;04B3;
+04B3;CYRILLIC SMALL LETTER HA WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER KHA WITH RIGHT DESCENDER;;04B2;;04B2
+04B4;CYRILLIC CAPITAL LIGATURE TE TSE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER TE TSE;Abkhasian;;04B5;
+04B5;CYRILLIC SMALL LIGATURE TE TSE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER TE TSE;Abkhasian;04B4;;04B4
+04B6;CYRILLIC CAPITAL LETTER CHE WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER CHE WITH RIGHT DESCENDER;;;04B7;
+04B7;CYRILLIC SMALL LETTER CHE WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER CHE WITH RIGHT DESCENDER;;04B6;;04B6
+04B8;CYRILLIC CAPITAL LETTER CHE WITH VERTICAL STROKE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER CHE VERTICAL BAR;;;04B9;
+04B9;CYRILLIC SMALL LETTER CHE WITH VERTICAL STROKE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER CHE VERTICAL BAR;;04B8;;04B8
+04BA;CYRILLIC CAPITAL LETTER SHHA;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER H;;;04BB;
+04BB;CYRILLIC SMALL LETTER SHHA;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER H;;04BA;;04BA
+04BC;CYRILLIC CAPITAL LETTER ABKHASIAN CHE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER IE HOOK;;;04BD;
+04BD;CYRILLIC SMALL LETTER ABKHASIAN CHE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER IE HOOK;;04BC;;04BC
+04BE;CYRILLIC CAPITAL LETTER ABKHASIAN CHE WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER IE HOOK OGONEK;;;04BF;
+04BF;CYRILLIC SMALL LETTER ABKHASIAN CHE WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER IE HOOK OGONEK;;04BE;;04BE
+04C0;CYRILLIC LETTER PALOCHKA;Lu;0;L;;;;;N;CYRILLIC LETTER I;;;;
+04C1;CYRILLIC CAPITAL LETTER ZHE WITH BREVE;Lu;0;L;0416 0306;;;;N;CYRILLIC CAPITAL LETTER SHORT ZHE;;;04C2;
+04C2;CYRILLIC SMALL LETTER ZHE WITH BREVE;Ll;0;L;0436 0306;;;;N;CYRILLIC SMALL LETTER SHORT ZHE;;04C1;;04C1
+04C3;CYRILLIC CAPITAL LETTER KA WITH HOOK;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER KA HOOK;;;04C4;
+04C4;CYRILLIC SMALL LETTER KA WITH HOOK;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER KA HOOK;;04C3;;04C3
+04C7;CYRILLIC CAPITAL LETTER EN WITH HOOK;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER EN HOOK;;;04C8;
+04C8;CYRILLIC SMALL LETTER EN WITH HOOK;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER EN HOOK;;04C7;;04C7
+04CB;CYRILLIC CAPITAL LETTER KHAKASSIAN CHE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER CHE WITH LEFT DESCENDER;;;04CC;
+04CC;CYRILLIC SMALL LETTER KHAKASSIAN CHE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER CHE WITH LEFT DESCENDER;;04CB;;04CB
+04D0;CYRILLIC CAPITAL LETTER A WITH BREVE;Lu;0;L;0410 0306;;;;N;;;;04D1;
+04D1;CYRILLIC SMALL LETTER A WITH BREVE;Ll;0;L;0430 0306;;;;N;;;04D0;;04D0
+04D2;CYRILLIC CAPITAL LETTER A WITH DIAERESIS;Lu;0;L;0410 0308;;;;N;;;;04D3;
+04D3;CYRILLIC SMALL LETTER A WITH DIAERESIS;Ll;0;L;0430 0308;;;;N;;;04D2;;04D2
+04D4;CYRILLIC CAPITAL LIGATURE A IE;Lu;0;L;;;;;N;;;;04D5;
+04D5;CYRILLIC SMALL LIGATURE A IE;Ll;0;L;;;;;N;;;04D4;;04D4
+04D6;CYRILLIC CAPITAL LETTER IE WITH BREVE;Lu;0;L;0415 0306;;;;N;;;;04D7;
+04D7;CYRILLIC SMALL LETTER IE WITH BREVE;Ll;0;L;0435 0306;;;;N;;;04D6;;04D6
+04D8;CYRILLIC CAPITAL LETTER SCHWA;Lu;0;L;;;;;N;;;;04D9;
+04D9;CYRILLIC SMALL LETTER SCHWA;Ll;0;L;;;;;N;;;04D8;;04D8
+04DA;CYRILLIC CAPITAL LETTER SCHWA WITH DIAERESIS;Lu;0;L;04D8 0308;;;;N;;;;04DB;
+04DB;CYRILLIC SMALL LETTER SCHWA WITH DIAERESIS;Ll;0;L;04D9 0308;;;;N;;;04DA;;04DA
+04DC;CYRILLIC CAPITAL LETTER ZHE WITH DIAERESIS;Lu;0;L;0416 0308;;;;N;;;;04DD;
+04DD;CYRILLIC SMALL LETTER ZHE WITH DIAERESIS;Ll;0;L;0436 0308;;;;N;;;04DC;;04DC
+04DE;CYRILLIC CAPITAL LETTER ZE WITH DIAERESIS;Lu;0;L;0417 0308;;;;N;;;;04DF;
+04DF;CYRILLIC SMALL LETTER ZE WITH DIAERESIS;Ll;0;L;0437 0308;;;;N;;;04DE;;04DE
+04E0;CYRILLIC CAPITAL LETTER ABKHASIAN DZE;Lu;0;L;;;;;N;;;;04E1;
+04E1;CYRILLIC SMALL LETTER ABKHASIAN DZE;Ll;0;L;;;;;N;;;04E0;;04E0
+04E2;CYRILLIC CAPITAL LETTER I WITH MACRON;Lu;0;L;0418 0304;;;;N;;;;04E3;
+04E3;CYRILLIC SMALL LETTER I WITH MACRON;Ll;0;L;0438 0304;;;;N;;;04E2;;04E2
+04E4;CYRILLIC CAPITAL LETTER I WITH DIAERESIS;Lu;0;L;0418 0308;;;;N;;;;04E5;
+04E5;CYRILLIC SMALL LETTER I WITH DIAERESIS;Ll;0;L;0438 0308;;;;N;;;04E4;;04E4
+04E6;CYRILLIC CAPITAL LETTER O WITH DIAERESIS;Lu;0;L;041E 0308;;;;N;;;;04E7;
+04E7;CYRILLIC SMALL LETTER O WITH DIAERESIS;Ll;0;L;043E 0308;;;;N;;;04E6;;04E6
+04E8;CYRILLIC CAPITAL LETTER BARRED O;Lu;0;L;;;;;N;;;;04E9;
+04E9;CYRILLIC SMALL LETTER BARRED O;Ll;0;L;;;;;N;;;04E8;;04E8
+04EA;CYRILLIC CAPITAL LETTER BARRED O WITH DIAERESIS;Lu;0;L;04E8 0308;;;;N;;;;04EB;
+04EB;CYRILLIC SMALL LETTER BARRED O WITH DIAERESIS;Ll;0;L;04E9 0308;;;;N;;;04EA;;04EA
+04EC;CYRILLIC CAPITAL LETTER E WITH DIAERESIS;Lu;0;L;042D 0308;;;;N;;;;04ED;
+04ED;CYRILLIC SMALL LETTER E WITH DIAERESIS;Ll;0;L;044D 0308;;;;N;;;04EC;;04EC
+04EE;CYRILLIC CAPITAL LETTER U WITH MACRON;Lu;0;L;0423 0304;;;;N;;;;04EF;
+04EF;CYRILLIC SMALL LETTER U WITH MACRON;Ll;0;L;0443 0304;;;;N;;;04EE;;04EE
+04F0;CYRILLIC CAPITAL LETTER U WITH DIAERESIS;Lu;0;L;0423 0308;;;;N;;;;04F1;
+04F1;CYRILLIC SMALL LETTER U WITH DIAERESIS;Ll;0;L;0443 0308;;;;N;;;04F0;;04F0
+04F2;CYRILLIC CAPITAL LETTER U WITH DOUBLE ACUTE;Lu;0;L;0423 030B;;;;N;;;;04F3;
+04F3;CYRILLIC SMALL LETTER U WITH DOUBLE ACUTE;Ll;0;L;0443 030B;;;;N;;;04F2;;04F2
+04F4;CYRILLIC CAPITAL LETTER CHE WITH DIAERESIS;Lu;0;L;0427 0308;;;;N;;;;04F5;
+04F5;CYRILLIC SMALL LETTER CHE WITH DIAERESIS;Ll;0;L;0447 0308;;;;N;;;04F4;;04F4
+04F8;CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS;Lu;0;L;042B 0308;;;;N;;;;04F9;
+04F9;CYRILLIC SMALL LETTER YERU WITH DIAERESIS;Ll;0;L;044B 0308;;;;N;;;04F8;;04F8
+0531;ARMENIAN CAPITAL LETTER AYB;Lu;0;L;;;;;N;;;;0561;
+0532;ARMENIAN CAPITAL LETTER BEN;Lu;0;L;;;;;N;;;;0562;
+0533;ARMENIAN CAPITAL LETTER GIM;Lu;0;L;;;;;N;;;;0563;
+0534;ARMENIAN CAPITAL LETTER DA;Lu;0;L;;;;;N;;;;0564;
+0535;ARMENIAN CAPITAL LETTER ECH;Lu;0;L;;;;;N;;;;0565;
+0536;ARMENIAN CAPITAL LETTER ZA;Lu;0;L;;;;;N;;;;0566;
+0537;ARMENIAN CAPITAL LETTER EH;Lu;0;L;;;;;N;;;;0567;
+0538;ARMENIAN CAPITAL LETTER ET;Lu;0;L;;;;;N;;;;0568;
+0539;ARMENIAN CAPITAL LETTER TO;Lu;0;L;;;;;N;;;;0569;
+053A;ARMENIAN CAPITAL LETTER ZHE;Lu;0;L;;;;;N;;;;056A;
+053B;ARMENIAN CAPITAL LETTER INI;Lu;0;L;;;;;N;;;;056B;
+053C;ARMENIAN CAPITAL LETTER LIWN;Lu;0;L;;;;;N;;;;056C;
+053D;ARMENIAN CAPITAL LETTER XEH;Lu;0;L;;;;;N;;;;056D;
+053E;ARMENIAN CAPITAL LETTER CA;Lu;0;L;;;;;N;;;;056E;
+053F;ARMENIAN CAPITAL LETTER KEN;Lu;0;L;;;;;N;;;;056F;
+0540;ARMENIAN CAPITAL LETTER HO;Lu;0;L;;;;;N;;;;0570;
+0541;ARMENIAN CAPITAL LETTER JA;Lu;0;L;;;;;N;;;;0571;
+0542;ARMENIAN CAPITAL LETTER GHAD;Lu;0;L;;;;;N;ARMENIAN CAPITAL LETTER LAD;;;0572;
+0543;ARMENIAN CAPITAL LETTER CHEH;Lu;0;L;;;;;N;;;;0573;
+0544;ARMENIAN CAPITAL LETTER MEN;Lu;0;L;;;;;N;;;;0574;
+0545;ARMENIAN CAPITAL LETTER YI;Lu;0;L;;;;;N;;;;0575;
+0546;ARMENIAN CAPITAL LETTER NOW;Lu;0;L;;;;;N;;;;0576;
+0547;ARMENIAN CAPITAL LETTER SHA;Lu;0;L;;;;;N;;;;0577;
+0548;ARMENIAN CAPITAL LETTER VO;Lu;0;L;;;;;N;;;;0578;
+0549;ARMENIAN CAPITAL LETTER CHA;Lu;0;L;;;;;N;;;;0579;
+054A;ARMENIAN CAPITAL LETTER PEH;Lu;0;L;;;;;N;;;;057A;
+054B;ARMENIAN CAPITAL LETTER JHEH;Lu;0;L;;;;;N;;;;057B;
+054C;ARMENIAN CAPITAL LETTER RA;Lu;0;L;;;;;N;;;;057C;
+054D;ARMENIAN CAPITAL LETTER SEH;Lu;0;L;;;;;N;;;;057D;
+054E;ARMENIAN CAPITAL LETTER VEW;Lu;0;L;;;;;N;;;;057E;
+054F;ARMENIAN CAPITAL LETTER TIWN;Lu;0;L;;;;;N;;;;057F;
+0550;ARMENIAN CAPITAL LETTER REH;Lu;0;L;;;;;N;;;;0580;
+0551;ARMENIAN CAPITAL LETTER CO;Lu;0;L;;;;;N;;;;0581;
+0552;ARMENIAN CAPITAL LETTER YIWN;Lu;0;L;;;;;N;;;;0582;
+0553;ARMENIAN CAPITAL LETTER PIWR;Lu;0;L;;;;;N;;;;0583;
+0554;ARMENIAN CAPITAL LETTER KEH;Lu;0;L;;;;;N;;;;0584;
+0555;ARMENIAN CAPITAL LETTER OH;Lu;0;L;;;;;N;;;;0585;
+0556;ARMENIAN CAPITAL LETTER FEH;Lu;0;L;;;;;N;;;;0586;
+0559;ARMENIAN MODIFIER LETTER LEFT HALF RING;Lm;0;L;;;;;N;;;;;
+055A;ARMENIAN APOSTROPHE;Po;0;L;;;;;N;ARMENIAN MODIFIER LETTER RIGHT HALF RING;;;;
+055B;ARMENIAN EMPHASIS MARK;Po;0;L;;;;;N;;;;;
+055C;ARMENIAN EXCLAMATION MARK;Po;0;L;;;;;N;;;;;
+055D;ARMENIAN COMMA;Po;0;L;;;;;N;;;;;
+055E;ARMENIAN QUESTION MARK;Po;0;L;;;;;N;;;;;
+055F;ARMENIAN ABBREVIATION MARK;Po;0;L;;;;;N;;;;;
+0561;ARMENIAN SMALL LETTER AYB;Ll;0;L;;;;;N;;;0531;;0531
+0562;ARMENIAN SMALL LETTER BEN;Ll;0;L;;;;;N;;;0532;;0532
+0563;ARMENIAN SMALL LETTER GIM;Ll;0;L;;;;;N;;;0533;;0533
+0564;ARMENIAN SMALL LETTER DA;Ll;0;L;;;;;N;;;0534;;0534
+0565;ARMENIAN SMALL LETTER ECH;Ll;0;L;;;;;N;;;0535;;0535
+0566;ARMENIAN SMALL LETTER ZA;Ll;0;L;;;;;N;;;0536;;0536
+0567;ARMENIAN SMALL LETTER EH;Ll;0;L;;;;;N;;;0537;;0537
+0568;ARMENIAN SMALL LETTER ET;Ll;0;L;;;;;N;;;0538;;0538
+0569;ARMENIAN SMALL LETTER TO;Ll;0;L;;;;;N;;;0539;;0539
+056A;ARMENIAN SMALL LETTER ZHE;Ll;0;L;;;;;N;;;053A;;053A
+056B;ARMENIAN SMALL LETTER INI;Ll;0;L;;;;;N;;;053B;;053B
+056C;ARMENIAN SMALL LETTER LIWN;Ll;0;L;;;;;N;;;053C;;053C
+056D;ARMENIAN SMALL LETTER XEH;Ll;0;L;;;;;N;;;053D;;053D
+056E;ARMENIAN SMALL LETTER CA;Ll;0;L;;;;;N;;;053E;;053E
+056F;ARMENIAN SMALL LETTER KEN;Ll;0;L;;;;;N;;;053F;;053F
+0570;ARMENIAN SMALL LETTER HO;Ll;0;L;;;;;N;;;0540;;0540
+0571;ARMENIAN SMALL LETTER JA;Ll;0;L;;;;;N;;;0541;;0541
+0572;ARMENIAN SMALL LETTER GHAD;Ll;0;L;;;;;N;ARMENIAN SMALL LETTER LAD;;0542;;0542
+0573;ARMENIAN SMALL LETTER CHEH;Ll;0;L;;;;;N;;;0543;;0543
+0574;ARMENIAN SMALL LETTER MEN;Ll;0;L;;;;;N;;;0544;;0544
+0575;ARMENIAN SMALL LETTER YI;Ll;0;L;;;;;N;;;0545;;0545
+0576;ARMENIAN SMALL LETTER NOW;Ll;0;L;;;;;N;;;0546;;0546
+0577;ARMENIAN SMALL LETTER SHA;Ll;0;L;;;;;N;;;0547;;0547
+0578;ARMENIAN SMALL LETTER VO;Ll;0;L;;;;;N;;;0548;;0548
+0579;ARMENIAN SMALL LETTER CHA;Ll;0;L;;;;;N;;;0549;;0549
+057A;ARMENIAN SMALL LETTER PEH;Ll;0;L;;;;;N;;;054A;;054A
+057B;ARMENIAN SMALL LETTER JHEH;Ll;0;L;;;;;N;;;054B;;054B
+057C;ARMENIAN SMALL LETTER RA;Ll;0;L;;;;;N;;;054C;;054C
+057D;ARMENIAN SMALL LETTER SEH;Ll;0;L;;;;;N;;;054D;;054D
+057E;ARMENIAN SMALL LETTER VEW;Ll;0;L;;;;;N;;;054E;;054E
+057F;ARMENIAN SMALL LETTER TIWN;Ll;0;L;;;;;N;;;054F;;054F
+0580;ARMENIAN SMALL LETTER REH;Ll;0;L;;;;;N;;;0550;;0550
+0581;ARMENIAN SMALL LETTER CO;Ll;0;L;;;;;N;;;0551;;0551
+0582;ARMENIAN SMALL LETTER YIWN;Ll;0;L;;;;;N;;;0552;;0552
+0583;ARMENIAN SMALL LETTER PIWR;Ll;0;L;;;;;N;;;0553;;0553
+0584;ARMENIAN SMALL LETTER KEH;Ll;0;L;;;;;N;;;0554;;0554
+0585;ARMENIAN SMALL LETTER OH;Ll;0;L;;;;;N;;;0555;;0555
+0586;ARMENIAN SMALL LETTER FEH;Ll;0;L;;;;;N;;;0556;;0556
+0587;ARMENIAN SMALL LIGATURE ECH YIWN;Ll;0;L;<compat> 0565 0582;;;;N;;;;;
+0589;ARMENIAN FULL STOP;Po;0;L;;;;;N;ARMENIAN PERIOD;;;;
+058A;ARMENIAN HYPHEN;Pd;0;ON;;;;;N;;;;;
+0591;HEBREW ACCENT ETNAHTA;Mn;220;NSM;;;;;N;;;;;
+0592;HEBREW ACCENT SEGOL;Mn;230;NSM;;;;;N;;;;;
+0593;HEBREW ACCENT SHALSHELET;Mn;230;NSM;;;;;N;;;;;
+0594;HEBREW ACCENT ZAQEF QATAN;Mn;230;NSM;;;;;N;;;;;
+0595;HEBREW ACCENT ZAQEF GADOL;Mn;230;NSM;;;;;N;;;;;
+0596;HEBREW ACCENT TIPEHA;Mn;220;NSM;;;;;N;;*;;;
+0597;HEBREW ACCENT REVIA;Mn;230;NSM;;;;;N;;;;;
+0598;HEBREW ACCENT ZARQA;Mn;230;NSM;;;;;N;;*;;;
+0599;HEBREW ACCENT PASHTA;Mn;230;NSM;;;;;N;;;;;
+059A;HEBREW ACCENT YETIV;Mn;222;NSM;;;;;N;;;;;
+059B;HEBREW ACCENT TEVIR;Mn;220;NSM;;;;;N;;;;;
+059C;HEBREW ACCENT GERESH;Mn;230;NSM;;;;;N;;;;;
+059D;HEBREW ACCENT GERESH MUQDAM;Mn;230;NSM;;;;;N;;;;;
+059E;HEBREW ACCENT GERSHAYIM;Mn;230;NSM;;;;;N;;;;;
+059F;HEBREW ACCENT QARNEY PARA;Mn;230;NSM;;;;;N;;;;;
+05A0;HEBREW ACCENT TELISHA GEDOLA;Mn;230;NSM;;;;;N;;;;;
+05A1;HEBREW ACCENT PAZER;Mn;230;NSM;;;;;N;;;;;
+05A3;HEBREW ACCENT MUNAH;Mn;220;NSM;;;;;N;;;;;
+05A4;HEBREW ACCENT MAHAPAKH;Mn;220;NSM;;;;;N;;;;;
+05A5;HEBREW ACCENT MERKHA;Mn;220;NSM;;;;;N;;*;;;
+05A6;HEBREW ACCENT MERKHA KEFULA;Mn;220;NSM;;;;;N;;;;;
+05A7;HEBREW ACCENT DARGA;Mn;220;NSM;;;;;N;;;;;
+05A8;HEBREW ACCENT QADMA;Mn;230;NSM;;;;;N;;*;;;
+05A9;HEBREW ACCENT TELISHA QETANA;Mn;230;NSM;;;;;N;;;;;
+05AA;HEBREW ACCENT YERAH BEN YOMO;Mn;220;NSM;;;;;N;;*;;;
+05AB;HEBREW ACCENT OLE;Mn;230;NSM;;;;;N;;;;;
+05AC;HEBREW ACCENT ILUY;Mn;230;NSM;;;;;N;;;;;
+05AD;HEBREW ACCENT DEHI;Mn;222;NSM;;;;;N;;;;;
+05AE;HEBREW ACCENT ZINOR;Mn;228;NSM;;;;;N;;;;;
+05AF;HEBREW MARK MASORA CIRCLE;Mn;230;NSM;;;;;N;;;;;
+05B0;HEBREW POINT SHEVA;Mn;10;NSM;;;;;N;;;;;
+05B1;HEBREW POINT HATAF SEGOL;Mn;11;NSM;;;;;N;;;;;
+05B2;HEBREW POINT HATAF PATAH;Mn;12;NSM;;;;;N;;;;;
+05B3;HEBREW POINT HATAF QAMATS;Mn;13;NSM;;;;;N;;;;;
+05B4;HEBREW POINT HIRIQ;Mn;14;NSM;;;;;N;;;;;
+05B5;HEBREW POINT TSERE;Mn;15;NSM;;;;;N;;;;;
+05B6;HEBREW POINT SEGOL;Mn;16;NSM;;;;;N;;;;;
+05B7;HEBREW POINT PATAH;Mn;17;NSM;;;;;N;;;;;
+05B8;HEBREW POINT QAMATS;Mn;18;NSM;;;;;N;;;;;
+05B9;HEBREW POINT HOLAM;Mn;19;NSM;;;;;N;;;;;
+05BB;HEBREW POINT QUBUTS;Mn;20;NSM;;;;;N;;;;;
+05BC;HEBREW POINT DAGESH OR MAPIQ;Mn;21;NSM;;;;;N;HEBREW POINT DAGESH;or shuruq;;;
+05BD;HEBREW POINT METEG;Mn;22;NSM;;;;;N;;*;;;
+05BE;HEBREW PUNCTUATION MAQAF;Po;0;R;;;;;N;;;;;
+05BF;HEBREW POINT RAFE;Mn;23;NSM;;;;;N;;;;;
+05C0;HEBREW PUNCTUATION PASEQ;Po;0;R;;;;;N;HEBREW POINT PASEQ;*;;;
+05C1;HEBREW POINT SHIN DOT;Mn;24;NSM;;;;;N;;;;;
+05C2;HEBREW POINT SIN DOT;Mn;25;NSM;;;;;N;;;;;
+05C3;HEBREW PUNCTUATION SOF PASUQ;Po;0;R;;;;;N;;*;;;
+05C4;HEBREW MARK UPPER DOT;Mn;230;NSM;;;;;N;;;;;
+05D0;HEBREW LETTER ALEF;Lo;0;R;;;;;N;;;;;
+05D1;HEBREW LETTER BET;Lo;0;R;;;;;N;;;;;
+05D2;HEBREW LETTER GIMEL;Lo;0;R;;;;;N;;;;;
+05D3;HEBREW LETTER DALET;Lo;0;R;;;;;N;;;;;
+05D4;HEBREW LETTER HE;Lo;0;R;;;;;N;;;;;
+05D5;HEBREW LETTER VAV;Lo;0;R;;;;;N;;;;;
+05D6;HEBREW LETTER ZAYIN;Lo;0;R;;;;;N;;;;;
+05D7;HEBREW LETTER HET;Lo;0;R;;;;;N;;;;;
+05D8;HEBREW LETTER TET;Lo;0;R;;;;;N;;;;;
+05D9;HEBREW LETTER YOD;Lo;0;R;;;;;N;;;;;
+05DA;HEBREW LETTER FINAL KAF;Lo;0;R;;;;;N;;;;;
+05DB;HEBREW LETTER KAF;Lo;0;R;;;;;N;;;;;
+05DC;HEBREW LETTER LAMED;Lo;0;R;;;;;N;;;;;
+05DD;HEBREW LETTER FINAL MEM;Lo;0;R;;;;;N;;;;;
+05DE;HEBREW LETTER MEM;Lo;0;R;;;;;N;;;;;
+05DF;HEBREW LETTER FINAL NUN;Lo;0;R;;;;;N;;;;;
+05E0;HEBREW LETTER NUN;Lo;0;R;;;;;N;;;;;
+05E1;HEBREW LETTER SAMEKH;Lo;0;R;;;;;N;;;;;
+05E2;HEBREW LETTER AYIN;Lo;0;R;;;;;N;;;;;
+05E3;HEBREW LETTER FINAL PE;Lo;0;R;;;;;N;;;;;
+05E4;HEBREW LETTER PE;Lo;0;R;;;;;N;;;;;
+05E5;HEBREW LETTER FINAL TSADI;Lo;0;R;;;;;N;;;;;
+05E6;HEBREW LETTER TSADI;Lo;0;R;;;;;N;;;;;
+05E7;HEBREW LETTER QOF;Lo;0;R;;;;;N;;;;;
+05E8;HEBREW LETTER RESH;Lo;0;R;;;;;N;;;;;
+05E9;HEBREW LETTER SHIN;Lo;0;R;;;;;N;;;;;
+05EA;HEBREW LETTER TAV;Lo;0;R;;;;;N;;;;;
+05F0;HEBREW LIGATURE YIDDISH DOUBLE VAV;Lo;0;R;;;;;N;HEBREW LETTER DOUBLE VAV;;;;
+05F1;HEBREW LIGATURE YIDDISH VAV YOD;Lo;0;R;;;;;N;HEBREW LETTER VAV YOD;;;;
+05F2;HEBREW LIGATURE YIDDISH DOUBLE YOD;Lo;0;R;;;;;N;HEBREW LETTER DOUBLE YOD;;;;
+05F3;HEBREW PUNCTUATION GERESH;Po;0;R;;;;;N;;;;;
+05F4;HEBREW PUNCTUATION GERSHAYIM;Po;0;R;;;;;N;;;;;
+060C;ARABIC COMMA;Po;0;CS;;;;;N;;;;;
+061B;ARABIC SEMICOLON;Po;0;AL;;;;;N;;;;;
+061F;ARABIC QUESTION MARK;Po;0;AL;;;;;N;;;;;
+0621;ARABIC LETTER HAMZA;Lo;0;AL;;;;;N;ARABIC LETTER HAMZAH;;;;
+0622;ARABIC LETTER ALEF WITH MADDA ABOVE;Lo;0;AL;0627 0653;;;;N;ARABIC LETTER MADDAH ON ALEF;;;;
+0623;ARABIC LETTER ALEF WITH HAMZA ABOVE;Lo;0;AL;0627 0654;;;;N;ARABIC LETTER HAMZAH ON ALEF;;;;
+0624;ARABIC LETTER WAW WITH HAMZA ABOVE;Lo;0;AL;0648 0654;;;;N;ARABIC LETTER HAMZAH ON WAW;;;;
+0625;ARABIC LETTER ALEF WITH HAMZA BELOW;Lo;0;AL;0627 0655;;;;N;ARABIC LETTER HAMZAH UNDER ALEF;;;;
+0626;ARABIC LETTER YEH WITH HAMZA ABOVE;Lo;0;AL;064A 0654;;;;N;ARABIC LETTER HAMZAH ON YA;;;;
+0627;ARABIC LETTER ALEF;Lo;0;AL;;;;;N;;;;;
+0628;ARABIC LETTER BEH;Lo;0;AL;;;;;N;ARABIC LETTER BAA;;;;
+0629;ARABIC LETTER TEH MARBUTA;Lo;0;AL;;;;;N;ARABIC LETTER TAA MARBUTAH;;;;
+062A;ARABIC LETTER TEH;Lo;0;AL;;;;;N;ARABIC LETTER TAA;;;;
+062B;ARABIC LETTER THEH;Lo;0;AL;;;;;N;ARABIC LETTER THAA;;;;
+062C;ARABIC LETTER JEEM;Lo;0;AL;;;;;N;;;;;
+062D;ARABIC LETTER HAH;Lo;0;AL;;;;;N;ARABIC LETTER HAA;;;;
+062E;ARABIC LETTER KHAH;Lo;0;AL;;;;;N;ARABIC LETTER KHAA;;;;
+062F;ARABIC LETTER DAL;Lo;0;AL;;;;;N;;;;;
+0630;ARABIC LETTER THAL;Lo;0;AL;;;;;N;;;;;
+0631;ARABIC LETTER REH;Lo;0;AL;;;;;N;ARABIC LETTER RA;;;;
+0632;ARABIC LETTER ZAIN;Lo;0;AL;;;;;N;;;;;
+0633;ARABIC LETTER SEEN;Lo;0;AL;;;;;N;;;;;
+0634;ARABIC LETTER SHEEN;Lo;0;AL;;;;;N;;;;;
+0635;ARABIC LETTER SAD;Lo;0;AL;;;;;N;;;;;
+0636;ARABIC LETTER DAD;Lo;0;AL;;;;;N;;;;;
+0637;ARABIC LETTER TAH;Lo;0;AL;;;;;N;;;;;
+0638;ARABIC LETTER ZAH;Lo;0;AL;;;;;N;ARABIC LETTER DHAH;;;;
+0639;ARABIC LETTER AIN;Lo;0;AL;;;;;N;;;;;
+063A;ARABIC LETTER GHAIN;Lo;0;AL;;;;;N;;;;;
+0640;ARABIC TATWEEL;Lm;0;AL;;;;;N;;;;;
+0641;ARABIC LETTER FEH;Lo;0;AL;;;;;N;ARABIC LETTER FA;;;;
+0642;ARABIC LETTER QAF;Lo;0;AL;;;;;N;;;;;
+0643;ARABIC LETTER KAF;Lo;0;AL;;;;;N;ARABIC LETTER CAF;;;;
+0644;ARABIC LETTER LAM;Lo;0;AL;;;;;N;;;;;
+0645;ARABIC LETTER MEEM;Lo;0;AL;;;;;N;;;;;
+0646;ARABIC LETTER NOON;Lo;0;AL;;;;;N;;;;;
+0647;ARABIC LETTER HEH;Lo;0;AL;;;;;N;ARABIC LETTER HA;;;;
+0648;ARABIC LETTER WAW;Lo;0;AL;;;;;N;;;;;
+0649;ARABIC LETTER ALEF MAKSURA;Lo;0;AL;;;;;N;ARABIC LETTER ALEF MAQSURAH;;;;
+064A;ARABIC LETTER YEH;Lo;0;AL;;;;;N;ARABIC LETTER YA;;;;
+064B;ARABIC FATHATAN;Mn;27;NSM;;;;;N;;;;;
+064C;ARABIC DAMMATAN;Mn;28;NSM;;;;;N;;;;;
+064D;ARABIC KASRATAN;Mn;29;NSM;;;;;N;;;;;
+064E;ARABIC FATHA;Mn;30;NSM;;;;;N;ARABIC FATHAH;;;;
+064F;ARABIC DAMMA;Mn;31;NSM;;;;;N;ARABIC DAMMAH;;;;
+0650;ARABIC KASRA;Mn;32;NSM;;;;;N;ARABIC KASRAH;;;;
+0651;ARABIC SHADDA;Mn;33;NSM;;;;;N;ARABIC SHADDAH;;;;
+0652;ARABIC SUKUN;Mn;34;NSM;;;;;N;;;;;
+0653;ARABIC MADDAH ABOVE;Mn;230;NSM;;;;;N;;;;;
+0654;ARABIC HAMZA ABOVE;Mn;230;NSM;;;;;N;;;;;
+0655;ARABIC HAMZA BELOW;Mn;220;NSM;;;;;N;;;;;
+0660;ARABIC-INDIC DIGIT ZERO;Nd;0;AN;;0;0;0;N;;;;;
+0661;ARABIC-INDIC DIGIT ONE;Nd;0;AN;;1;1;1;N;;;;;
+0662;ARABIC-INDIC DIGIT TWO;Nd;0;AN;;2;2;2;N;;;;;
+0663;ARABIC-INDIC DIGIT THREE;Nd;0;AN;;3;3;3;N;;;;;
+0664;ARABIC-INDIC DIGIT FOUR;Nd;0;AN;;4;4;4;N;;;;;
+0665;ARABIC-INDIC DIGIT FIVE;Nd;0;AN;;5;5;5;N;;;;;
+0666;ARABIC-INDIC DIGIT SIX;Nd;0;AN;;6;6;6;N;;;;;
+0667;ARABIC-INDIC DIGIT SEVEN;Nd;0;AN;;7;7;7;N;;;;;
+0668;ARABIC-INDIC DIGIT EIGHT;Nd;0;AN;;8;8;8;N;;;;;
+0669;ARABIC-INDIC DIGIT NINE;Nd;0;AN;;9;9;9;N;;;;;
+066A;ARABIC PERCENT SIGN;Po;0;ET;;;;;N;;;;;
+066B;ARABIC DECIMAL SEPARATOR;Po;0;AN;;;;;N;;;;;
+066C;ARABIC THOUSANDS SEPARATOR;Po;0;AN;;;;;N;;;;;
+066D;ARABIC FIVE POINTED STAR;Po;0;AL;;;;;N;;;;;
+0670;ARABIC LETTER SUPERSCRIPT ALEF;Mn;35;NSM;;;;;N;ARABIC ALEF ABOVE;;;;
+0671;ARABIC LETTER ALEF WASLA;Lo;0;AL;;;;;N;ARABIC LETTER HAMZAT WASL ON ALEF;;;;
+0672;ARABIC LETTER ALEF WITH WAVY HAMZA ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER WAVY HAMZAH ON ALEF;;;;
+0673;ARABIC LETTER ALEF WITH WAVY HAMZA BELOW;Lo;0;AL;;;;;N;ARABIC LETTER WAVY HAMZAH UNDER ALEF;;;;
+0674;ARABIC LETTER HIGH HAMZA;Lo;0;AL;;;;;N;ARABIC LETTER HIGH HAMZAH;;;;
+0675;ARABIC LETTER HIGH HAMZA ALEF;Lo;0;AL;<compat> 0627 0674;;;;N;ARABIC LETTER HIGH HAMZAH ALEF;;;;
+0676;ARABIC LETTER HIGH HAMZA WAW;Lo;0;AL;<compat> 0648 0674;;;;N;ARABIC LETTER HIGH HAMZAH WAW;;;;
+0677;ARABIC LETTER U WITH HAMZA ABOVE;Lo;0;AL;<compat> 06C7 0674;;;;N;ARABIC LETTER HIGH HAMZAH WAW WITH DAMMAH;;;;
+0678;ARABIC LETTER HIGH HAMZA YEH;Lo;0;AL;<compat> 064A 0674;;;;N;ARABIC LETTER HIGH HAMZAH YA;;;;
+0679;ARABIC LETTER TTEH;Lo;0;AL;;;;;N;ARABIC LETTER TAA WITH SMALL TAH;;;;
+067A;ARABIC LETTER TTEHEH;Lo;0;AL;;;;;N;ARABIC LETTER TAA WITH TWO DOTS VERTICAL ABOVE;;;;
+067B;ARABIC LETTER BEEH;Lo;0;AL;;;;;N;ARABIC LETTER BAA WITH TWO DOTS VERTICAL BELOW;;;;
+067C;ARABIC LETTER TEH WITH RING;Lo;0;AL;;;;;N;ARABIC LETTER TAA WITH RING;;;;
+067D;ARABIC LETTER TEH WITH THREE DOTS ABOVE DOWNWARDS;Lo;0;AL;;;;;N;ARABIC LETTER TAA WITH THREE DOTS ABOVE DOWNWARD;;;;
+067E;ARABIC LETTER PEH;Lo;0;AL;;;;;N;ARABIC LETTER TAA WITH THREE DOTS BELOW;;;;
+067F;ARABIC LETTER TEHEH;Lo;0;AL;;;;;N;ARABIC LETTER TAA WITH FOUR DOTS ABOVE;;;;
+0680;ARABIC LETTER BEHEH;Lo;0;AL;;;;;N;ARABIC LETTER BAA WITH FOUR DOTS BELOW;;;;
+0681;ARABIC LETTER HAH WITH HAMZA ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER HAMZAH ON HAA;;;;
+0682;ARABIC LETTER HAH WITH TWO DOTS VERTICAL ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER HAA WITH TWO DOTS VERTICAL ABOVE;;;;
+0683;ARABIC LETTER NYEH;Lo;0;AL;;;;;N;ARABIC LETTER HAA WITH MIDDLE TWO DOTS;;;;
+0684;ARABIC LETTER DYEH;Lo;0;AL;;;;;N;ARABIC LETTER HAA WITH MIDDLE TWO DOTS VERTICAL;;;;
+0685;ARABIC LETTER HAH WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER HAA WITH THREE DOTS ABOVE;;;;
+0686;ARABIC LETTER TCHEH;Lo;0;AL;;;;;N;ARABIC LETTER HAA WITH MIDDLE THREE DOTS DOWNWARD;;;;
+0687;ARABIC LETTER TCHEHEH;Lo;0;AL;;;;;N;ARABIC LETTER HAA WITH MIDDLE FOUR DOTS;;;;
+0688;ARABIC LETTER DDAL;Lo;0;AL;;;;;N;ARABIC LETTER DAL WITH SMALL TAH;;;;
+0689;ARABIC LETTER DAL WITH RING;Lo;0;AL;;;;;N;;;;;
+068A;ARABIC LETTER DAL WITH DOT BELOW;Lo;0;AL;;;;;N;;;;;
+068B;ARABIC LETTER DAL WITH DOT BELOW AND SMALL TAH;Lo;0;AL;;;;;N;;;;;
+068C;ARABIC LETTER DAHAL;Lo;0;AL;;;;;N;ARABIC LETTER DAL WITH TWO DOTS ABOVE;;;;
+068D;ARABIC LETTER DDAHAL;Lo;0;AL;;;;;N;ARABIC LETTER DAL WITH TWO DOTS BELOW;;;;
+068E;ARABIC LETTER DUL;Lo;0;AL;;;;;N;ARABIC LETTER DAL WITH THREE DOTS ABOVE;;;;
+068F;ARABIC LETTER DAL WITH THREE DOTS ABOVE DOWNWARDS;Lo;0;AL;;;;;N;ARABIC LETTER DAL WITH THREE DOTS ABOVE DOWNWARD;;;;
+0690;ARABIC LETTER DAL WITH FOUR DOTS ABOVE;Lo;0;AL;;;;;N;;;;;
+0691;ARABIC LETTER RREH;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH SMALL TAH;;;;
+0692;ARABIC LETTER REH WITH SMALL V;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH SMALL V;;;;
+0693;ARABIC LETTER REH WITH RING;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH RING;;;;
+0694;ARABIC LETTER REH WITH DOT BELOW;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH DOT BELOW;;;;
+0695;ARABIC LETTER REH WITH SMALL V BELOW;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH SMALL V BELOW;;;;
+0696;ARABIC LETTER REH WITH DOT BELOW AND DOT ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH DOT BELOW AND DOT ABOVE;;;;
+0697;ARABIC LETTER REH WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH TWO DOTS ABOVE;;;;
+0698;ARABIC LETTER JEH;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH THREE DOTS ABOVE;;;;
+0699;ARABIC LETTER REH WITH FOUR DOTS ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH FOUR DOTS ABOVE;;;;
+069A;ARABIC LETTER SEEN WITH DOT BELOW AND DOT ABOVE;Lo;0;AL;;;;;N;;;;;
+069B;ARABIC LETTER SEEN WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;;;;;
+069C;ARABIC LETTER SEEN WITH THREE DOTS BELOW AND THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;;
+069D;ARABIC LETTER SAD WITH TWO DOTS BELOW;Lo;0;AL;;;;;N;;;;;
+069E;ARABIC LETTER SAD WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;;
+069F;ARABIC LETTER TAH WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;;
+06A0;ARABIC LETTER AIN WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;;
+06A1;ARABIC LETTER DOTLESS FEH;Lo;0;AL;;;;;N;ARABIC LETTER DOTLESS FA;;;;
+06A2;ARABIC LETTER FEH WITH DOT MOVED BELOW;Lo;0;AL;;;;;N;ARABIC LETTER FA WITH DOT MOVED BELOW;;;;
+06A3;ARABIC LETTER FEH WITH DOT BELOW;Lo;0;AL;;;;;N;ARABIC LETTER FA WITH DOT BELOW;;;;
+06A4;ARABIC LETTER VEH;Lo;0;AL;;;;;N;ARABIC LETTER FA WITH THREE DOTS ABOVE;;;;
+06A5;ARABIC LETTER FEH WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;ARABIC LETTER FA WITH THREE DOTS BELOW;;;;
+06A6;ARABIC LETTER PEHEH;Lo;0;AL;;;;;N;ARABIC LETTER FA WITH FOUR DOTS ABOVE;;;;
+06A7;ARABIC LETTER QAF WITH DOT ABOVE;Lo;0;AL;;;;;N;;;;;
+06A8;ARABIC LETTER QAF WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;;
+06A9;ARABIC LETTER KEHEH;Lo;0;AL;;;;;N;ARABIC LETTER OPEN CAF;;;;
+06AA;ARABIC LETTER SWASH KAF;Lo;0;AL;;;;;N;ARABIC LETTER SWASH CAF;;;;
+06AB;ARABIC LETTER KAF WITH RING;Lo;0;AL;;;;;N;ARABIC LETTER CAF WITH RING;;;;
+06AC;ARABIC LETTER KAF WITH DOT ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER CAF WITH DOT ABOVE;;;;
+06AD;ARABIC LETTER NG;Lo;0;AL;;;;;N;ARABIC LETTER CAF WITH THREE DOTS ABOVE;;;;
+06AE;ARABIC LETTER KAF WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;ARABIC LETTER CAF WITH THREE DOTS BELOW;;;;
+06AF;ARABIC LETTER GAF;Lo;0;AL;;;;;N;;*;;;
+06B0;ARABIC LETTER GAF WITH RING;Lo;0;AL;;;;;N;;;;;
+06B1;ARABIC LETTER NGOEH;Lo;0;AL;;;;;N;ARABIC LETTER GAF WITH TWO DOTS ABOVE;;;;
+06B2;ARABIC LETTER GAF WITH TWO DOTS BELOW;Lo;0;AL;;;;;N;;;;;
+06B3;ARABIC LETTER GUEH;Lo;0;AL;;;;;N;ARABIC LETTER GAF WITH TWO DOTS VERTICAL BELOW;;;;
+06B4;ARABIC LETTER GAF WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;;
+06B5;ARABIC LETTER LAM WITH SMALL V;Lo;0;AL;;;;;N;;;;;
+06B6;ARABIC LETTER LAM WITH DOT ABOVE;Lo;0;AL;;;;;N;;;;;
+06B7;ARABIC LETTER LAM WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;;
+06B8;ARABIC LETTER LAM WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;;;;;
+06B9;ARABIC LETTER NOON WITH DOT BELOW;Lo;0;AL;;;;;N;;;;;
+06BA;ARABIC LETTER NOON GHUNNA;Lo;0;AL;;;;;N;ARABIC LETTER DOTLESS NOON;;;;
+06BB;ARABIC LETTER RNOON;Lo;0;AL;;;;;N;ARABIC LETTER DOTLESS NOON WITH SMALL TAH;;;;
+06BC;ARABIC LETTER NOON WITH RING;Lo;0;AL;;;;;N;;;;;
+06BD;ARABIC LETTER NOON WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;;
+06BE;ARABIC LETTER HEH DOACHASHMEE;Lo;0;AL;;;;;N;ARABIC LETTER KNOTTED HA;;;;
+06BF;ARABIC LETTER TCHEH WITH DOT ABOVE;Lo;0;AL;;;;;N;;;;;
+06C0;ARABIC LETTER HEH WITH YEH ABOVE;Lo;0;AL;06D5 0654;;;;N;ARABIC LETTER HAMZAH ON HA;;;;
+06C1;ARABIC LETTER HEH GOAL;Lo;0;AL;;;;;N;ARABIC LETTER HA GOAL;;;;
+06C2;ARABIC LETTER HEH GOAL WITH HAMZA ABOVE;Lo;0;AL;06C1 0654;;;;N;ARABIC LETTER HAMZAH ON HA GOAL;;;;
+06C3;ARABIC LETTER TEH MARBUTA GOAL;Lo;0;AL;;;;;N;ARABIC LETTER TAA MARBUTAH GOAL;;;;
+06C4;ARABIC LETTER WAW WITH RING;Lo;0;AL;;;;;N;;;;;
+06C5;ARABIC LETTER KIRGHIZ OE;Lo;0;AL;;;;;N;ARABIC LETTER WAW WITH BAR;;;;
+06C6;ARABIC LETTER OE;Lo;0;AL;;;;;N;ARABIC LETTER WAW WITH SMALL V;;;;
+06C7;ARABIC LETTER U;Lo;0;AL;;;;;N;ARABIC LETTER WAW WITH DAMMAH;;;;
+06C8;ARABIC LETTER YU;Lo;0;AL;;;;;N;ARABIC LETTER WAW WITH ALEF ABOVE;;;;
+06C9;ARABIC LETTER KIRGHIZ YU;Lo;0;AL;;;;;N;ARABIC LETTER WAW WITH INVERTED SMALL V;;;;
+06CA;ARABIC LETTER WAW WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;;
+06CB;ARABIC LETTER VE;Lo;0;AL;;;;;N;ARABIC LETTER WAW WITH THREE DOTS ABOVE;;;;
+06CC;ARABIC LETTER FARSI YEH;Lo;0;AL;;;;;N;ARABIC LETTER DOTLESS YA;;;;
+06CD;ARABIC LETTER YEH WITH TAIL;Lo;0;AL;;;;;N;ARABIC LETTER YA WITH TAIL;;;;
+06CE;ARABIC LETTER YEH WITH SMALL V;Lo;0;AL;;;;;N;ARABIC LETTER YA WITH SMALL V;;;;
+06CF;ARABIC LETTER WAW WITH DOT ABOVE;Lo;0;AL;;;;;N;;;;;
+06D0;ARABIC LETTER E;Lo;0;AL;;;;;N;ARABIC LETTER YA WITH TWO DOTS VERTICAL BELOW;*;;;
+06D1;ARABIC LETTER YEH WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;ARABIC LETTER YA WITH THREE DOTS BELOW;;;;
+06D2;ARABIC LETTER YEH BARREE;Lo;0;AL;;;;;N;ARABIC LETTER YA BARREE;;;;
+06D3;ARABIC LETTER YEH BARREE WITH HAMZA ABOVE;Lo;0;AL;06D2 0654;;;;N;ARABIC LETTER HAMZAH ON YA BARREE;;;;
+06D4;ARABIC FULL STOP;Po;0;AL;;;;;N;ARABIC PERIOD;;;;
+06D5;ARABIC LETTER AE;Lo;0;AL;;;;;N;;;;;
+06D6;ARABIC SMALL HIGH LIGATURE SAD WITH LAM WITH ALEF MAKSURA;Mn;230;NSM;;;;;N;;;;;
+06D7;ARABIC SMALL HIGH LIGATURE QAF WITH LAM WITH ALEF MAKSURA;Mn;230;NSM;;;;;N;;;;;
+06D8;ARABIC SMALL HIGH MEEM INITIAL FORM;Mn;230;NSM;;;;;N;;;;;
+06D9;ARABIC SMALL HIGH LAM ALEF;Mn;230;NSM;;;;;N;;;;;
+06DA;ARABIC SMALL HIGH JEEM;Mn;230;NSM;;;;;N;;;;;
+06DB;ARABIC SMALL HIGH THREE DOTS;Mn;230;NSM;;;;;N;;;;;
+06DC;ARABIC SMALL HIGH SEEN;Mn;230;NSM;;;;;N;;;;;
+06DD;ARABIC END OF AYAH;Me;0;NSM;;;;;N;;;;;
+06DE;ARABIC START OF RUB EL HIZB;Me;0;NSM;;;;;N;;;;;
+06DF;ARABIC SMALL HIGH ROUNDED ZERO;Mn;230;NSM;;;;;N;;;;;
+06E0;ARABIC SMALL HIGH UPRIGHT RECTANGULAR ZERO;Mn;230;NSM;;;;;N;;;;;
+06E1;ARABIC SMALL HIGH DOTLESS HEAD OF KHAH;Mn;230;NSM;;;;;N;;;;;
+06E2;ARABIC SMALL HIGH MEEM ISOLATED FORM;Mn;230;NSM;;;;;N;;;;;
+06E3;ARABIC SMALL LOW SEEN;Mn;220;NSM;;;;;N;;;;;
+06E4;ARABIC SMALL HIGH MADDA;Mn;230;NSM;;;;;N;;;;;
+06E5;ARABIC SMALL WAW;Lm;0;AL;;;;;N;;;;;
+06E6;ARABIC SMALL YEH;Lm;0;AL;;;;;N;;;;;
+06E7;ARABIC SMALL HIGH YEH;Mn;230;NSM;;;;;N;;;;;
+06E8;ARABIC SMALL HIGH NOON;Mn;230;NSM;;;;;N;;;;;
+06E9;ARABIC PLACE OF SAJDAH;So;0;ON;;;;;N;;;;;
+06EA;ARABIC EMPTY CENTRE LOW STOP;Mn;220;NSM;;;;;N;;;;;
+06EB;ARABIC EMPTY CENTRE HIGH STOP;Mn;230;NSM;;;;;N;;;;;
+06EC;ARABIC ROUNDED HIGH STOP WITH FILLED CENTRE;Mn;230;NSM;;;;;N;;;;;
+06ED;ARABIC SMALL LOW MEEM;Mn;220;NSM;;;;;N;;;;;
+06F0;EXTENDED ARABIC-INDIC DIGIT ZERO;Nd;0;EN;;0;0;0;N;EASTERN ARABIC-INDIC DIGIT ZERO;;;;
+06F1;EXTENDED ARABIC-INDIC DIGIT ONE;Nd;0;EN;;1;1;1;N;EASTERN ARABIC-INDIC DIGIT ONE;;;;
+06F2;EXTENDED ARABIC-INDIC DIGIT TWO;Nd;0;EN;;2;2;2;N;EASTERN ARABIC-INDIC DIGIT TWO;;;;
+06F3;EXTENDED ARABIC-INDIC DIGIT THREE;Nd;0;EN;;3;3;3;N;EASTERN ARABIC-INDIC DIGIT THREE;;;;
+06F4;EXTENDED ARABIC-INDIC DIGIT FOUR;Nd;0;EN;;4;4;4;N;EASTERN ARABIC-INDIC DIGIT FOUR;;;;
+06F5;EXTENDED ARABIC-INDIC DIGIT FIVE;Nd;0;EN;;5;5;5;N;EASTERN ARABIC-INDIC DIGIT FIVE;;;;
+06F6;EXTENDED ARABIC-INDIC DIGIT SIX;Nd;0;EN;;6;6;6;N;EASTERN ARABIC-INDIC DIGIT SIX;;;;
+06F7;EXTENDED ARABIC-INDIC DIGIT SEVEN;Nd;0;EN;;7;7;7;N;EASTERN ARABIC-INDIC DIGIT SEVEN;;;;
+06F8;EXTENDED ARABIC-INDIC DIGIT EIGHT;Nd;0;EN;;8;8;8;N;EASTERN ARABIC-INDIC DIGIT EIGHT;;;;
+06F9;EXTENDED ARABIC-INDIC DIGIT NINE;Nd;0;EN;;9;9;9;N;EASTERN ARABIC-INDIC DIGIT NINE;;;;
+06FA;ARABIC LETTER SHEEN WITH DOT BELOW;Lo;0;AL;;;;;N;;;;;
+06FB;ARABIC LETTER DAD WITH DOT BELOW;Lo;0;AL;;;;;N;;;;;
+06FC;ARABIC LETTER GHAIN WITH DOT BELOW;Lo;0;AL;;;;;N;;;;;
+06FD;ARABIC SIGN SINDHI AMPERSAND;So;0;AL;;;;;N;;;;;
+06FE;ARABIC SIGN SINDHI POSTPOSITION MEN;So;0;AL;;;;;N;;;;;
+0700;SYRIAC END OF PARAGRAPH;Po;0;AL;;;;;N;;;;;
+0701;SYRIAC SUPRALINEAR FULL STOP;Po;0;AL;;;;;N;;;;;
+0702;SYRIAC SUBLINEAR FULL STOP;Po;0;AL;;;;;N;;;;;
+0703;SYRIAC SUPRALINEAR COLON;Po;0;AL;;;;;N;;;;;
+0704;SYRIAC SUBLINEAR COLON;Po;0;AL;;;;;N;;;;;
+0705;SYRIAC HORIZONTAL COLON;Po;0;AL;;;;;N;;;;;
+0706;SYRIAC COLON SKEWED LEFT;Po;0;AL;;;;;N;;;;;
+0707;SYRIAC COLON SKEWED RIGHT;Po;0;AL;;;;;N;;;;;
+0708;SYRIAC SUPRALINEAR COLON SKEWED LEFT;Po;0;AL;;;;;N;;;;;
+0709;SYRIAC SUBLINEAR COLON SKEWED RIGHT;Po;0;AL;;;;;N;;;;;
+070A;SYRIAC CONTRACTION;Po;0;AL;;;;;N;;;;;
+070B;SYRIAC HARKLEAN OBELUS;Po;0;AL;;;;;N;;;;;
+070C;SYRIAC HARKLEAN METOBELUS;Po;0;AL;;;;;N;;;;;
+070D;SYRIAC HARKLEAN ASTERISCUS;Po;0;AL;;;;;N;;;;;
+070F;SYRIAC ABBREVIATION MARK;Cf;0;BN;;;;;N;;;;;
+0710;SYRIAC LETTER ALAPH;Lo;0;AL;;;;;N;;;;;
+0711;SYRIAC LETTER SUPERSCRIPT ALAPH;Mn;36;NSM;;;;;N;;;;;
+0712;SYRIAC LETTER BETH;Lo;0;AL;;;;;N;;;;;
+0713;SYRIAC LETTER GAMAL;Lo;0;AL;;;;;N;;;;;
+0714;SYRIAC LETTER GAMAL GARSHUNI;Lo;0;AL;;;;;N;;;;;
+0715;SYRIAC LETTER DALATH;Lo;0;AL;;;;;N;;;;;
+0716;SYRIAC LETTER DOTLESS DALATH RISH;Lo;0;AL;;;;;N;;;;;
+0717;SYRIAC LETTER HE;Lo;0;AL;;;;;N;;;;;
+0718;SYRIAC LETTER WAW;Lo;0;AL;;;;;N;;;;;
+0719;SYRIAC LETTER ZAIN;Lo;0;AL;;;;;N;;;;;
+071A;SYRIAC LETTER HETH;Lo;0;AL;;;;;N;;;;;
+071B;SYRIAC LETTER TETH;Lo;0;AL;;;;;N;;;;;
+071C;SYRIAC LETTER TETH GARSHUNI;Lo;0;AL;;;;;N;;;;;
+071D;SYRIAC LETTER YUDH;Lo;0;AL;;;;;N;;;;;
+071E;SYRIAC LETTER YUDH HE;Lo;0;AL;;;;;N;;;;;
+071F;SYRIAC LETTER KAPH;Lo;0;AL;;;;;N;;;;;
+0720;SYRIAC LETTER LAMADH;Lo;0;AL;;;;;N;;;;;
+0721;SYRIAC LETTER MIM;Lo;0;AL;;;;;N;;;;;
+0722;SYRIAC LETTER NUN;Lo;0;AL;;;;;N;;;;;
+0723;SYRIAC LETTER SEMKATH;Lo;0;AL;;;;;N;;;;;
+0724;SYRIAC LETTER FINAL SEMKATH;Lo;0;AL;;;;;N;;;;;
+0725;SYRIAC LETTER E;Lo;0;AL;;;;;N;;;;;
+0726;SYRIAC LETTER PE;Lo;0;AL;;;;;N;;;;;
+0727;SYRIAC LETTER REVERSED PE;Lo;0;AL;;;;;N;;;;;
+0728;SYRIAC LETTER SADHE;Lo;0;AL;;;;;N;;;;;
+0729;SYRIAC LETTER QAPH;Lo;0;AL;;;;;N;;;;;
+072A;SYRIAC LETTER RISH;Lo;0;AL;;;;;N;;;;;
+072B;SYRIAC LETTER SHIN;Lo;0;AL;;;;;N;;;;;
+072C;SYRIAC LETTER TAW;Lo;0;AL;;;;;N;;;;;
+0730;SYRIAC PTHAHA ABOVE;Mn;230;NSM;;;;;N;;;;;
+0731;SYRIAC PTHAHA BELOW;Mn;220;NSM;;;;;N;;;;;
+0732;SYRIAC PTHAHA DOTTED;Mn;230;NSM;;;;;N;;;;;
+0733;SYRIAC ZQAPHA ABOVE;Mn;230;NSM;;;;;N;;;;;
+0734;SYRIAC ZQAPHA BELOW;Mn;220;NSM;;;;;N;;;;;
+0735;SYRIAC ZQAPHA DOTTED;Mn;230;NSM;;;;;N;;;;;
+0736;SYRIAC RBASA ABOVE;Mn;230;NSM;;;;;N;;;;;
+0737;SYRIAC RBASA BELOW;Mn;220;NSM;;;;;N;;;;;
+0738;SYRIAC DOTTED ZLAMA HORIZONTAL;Mn;220;NSM;;;;;N;;;;;
+0739;SYRIAC DOTTED ZLAMA ANGULAR;Mn;220;NSM;;;;;N;;;;;
+073A;SYRIAC HBASA ABOVE;Mn;230;NSM;;;;;N;;;;;
+073B;SYRIAC HBASA BELOW;Mn;220;NSM;;;;;N;;;;;
+073C;SYRIAC HBASA-ESASA DOTTED;Mn;220;NSM;;;;;N;;;;;
+073D;SYRIAC ESASA ABOVE;Mn;230;NSM;;;;;N;;;;;
+073E;SYRIAC ESASA BELOW;Mn;220;NSM;;;;;N;;;;;
+073F;SYRIAC RWAHA;Mn;230;NSM;;;;;N;;;;;
+0740;SYRIAC FEMININE DOT;Mn;230;NSM;;;;;N;;;;;
+0741;SYRIAC QUSHSHAYA;Mn;230;NSM;;;;;N;;;;;
+0742;SYRIAC RUKKAKHA;Mn;220;NSM;;;;;N;;;;;
+0743;SYRIAC TWO VERTICAL DOTS ABOVE;Mn;230;NSM;;;;;N;;;;;
+0744;SYRIAC TWO VERTICAL DOTS BELOW;Mn;220;NSM;;;;;N;;;;;
+0745;SYRIAC THREE DOTS ABOVE;Mn;230;NSM;;;;;N;;;;;
+0746;SYRIAC THREE DOTS BELOW;Mn;220;NSM;;;;;N;;;;;
+0747;SYRIAC OBLIQUE LINE ABOVE;Mn;230;NSM;;;;;N;;;;;
+0748;SYRIAC OBLIQUE LINE BELOW;Mn;220;NSM;;;;;N;;;;;
+0749;SYRIAC MUSIC;Mn;230;NSM;;;;;N;;;;;
+074A;SYRIAC BARREKH;Mn;230;NSM;;;;;N;;;;;
+0780;THAANA LETTER HAA;Lo;0;AL;;;;;N;;;;;
+0781;THAANA LETTER SHAVIYANI;Lo;0;AL;;;;;N;;;;;
+0782;THAANA LETTER NOONU;Lo;0;AL;;;;;N;;;;;
+0783;THAANA LETTER RAA;Lo;0;AL;;;;;N;;;;;
+0784;THAANA LETTER BAA;Lo;0;AL;;;;;N;;;;;
+0785;THAANA LETTER LHAVIYANI;Lo;0;AL;;;;;N;;;;;
+0786;THAANA LETTER KAAFU;Lo;0;AL;;;;;N;;;;;
+0787;THAANA LETTER ALIFU;Lo;0;AL;;;;;N;;;;;
+0788;THAANA LETTER VAAVU;Lo;0;AL;;;;;N;;;;;
+0789;THAANA LETTER MEEMU;Lo;0;AL;;;;;N;;;;;
+078A;THAANA LETTER FAAFU;Lo;0;AL;;;;;N;;;;;
+078B;THAANA LETTER DHAALU;Lo;0;AL;;;;;N;;;;;
+078C;THAANA LETTER THAA;Lo;0;AL;;;;;N;;;;;
+078D;THAANA LETTER LAAMU;Lo;0;AL;;;;;N;;;;;
+078E;THAANA LETTER GAAFU;Lo;0;AL;;;;;N;;;;;
+078F;THAANA LETTER GNAVIYANI;Lo;0;AL;;;;;N;;;;;
+0790;THAANA LETTER SEENU;Lo;0;AL;;;;;N;;;;;
+0791;THAANA LETTER DAVIYANI;Lo;0;AL;;;;;N;;;;;
+0792;THAANA LETTER ZAVIYANI;Lo;0;AL;;;;;N;;;;;
+0793;THAANA LETTER TAVIYANI;Lo;0;AL;;;;;N;;;;;
+0794;THAANA LETTER YAA;Lo;0;AL;;;;;N;;;;;
+0795;THAANA LETTER PAVIYANI;Lo;0;AL;;;;;N;;;;;
+0796;THAANA LETTER JAVIYANI;Lo;0;AL;;;;;N;;;;;
+0797;THAANA LETTER CHAVIYANI;Lo;0;AL;;;;;N;;;;;
+0798;THAANA LETTER TTAA;Lo;0;AL;;;;;N;;;;;
+0799;THAANA LETTER HHAA;Lo;0;AL;;;;;N;;;;;
+079A;THAANA LETTER KHAA;Lo;0;AL;;;;;N;;;;;
+079B;THAANA LETTER THAALU;Lo;0;AL;;;;;N;;;;;
+079C;THAANA LETTER ZAA;Lo;0;AL;;;;;N;;;;;
+079D;THAANA LETTER SHEENU;Lo;0;AL;;;;;N;;;;;
+079E;THAANA LETTER SAADHU;Lo;0;AL;;;;;N;;;;;
+079F;THAANA LETTER DAADHU;Lo;0;AL;;;;;N;;;;;
+07A0;THAANA LETTER TO;Lo;0;AL;;;;;N;;;;;
+07A1;THAANA LETTER ZO;Lo;0;AL;;;;;N;;;;;
+07A2;THAANA LETTER AINU;Lo;0;AL;;;;;N;;;;;
+07A3;THAANA LETTER GHAINU;Lo;0;AL;;;;;N;;;;;
+07A4;THAANA LETTER QAAFU;Lo;0;AL;;;;;N;;;;;
+07A5;THAANA LETTER WAAVU;Lo;0;AL;;;;;N;;;;;
+07A6;THAANA ABAFILI;Mn;0;NSM;;;;;N;;;;;
+07A7;THAANA AABAAFILI;Mn;0;NSM;;;;;N;;;;;
+07A8;THAANA IBIFILI;Mn;0;NSM;;;;;N;;;;;
+07A9;THAANA EEBEEFILI;Mn;0;NSM;;;;;N;;;;;
+07AA;THAANA UBUFILI;Mn;0;NSM;;;;;N;;;;;
+07AB;THAANA OOBOOFILI;Mn;0;NSM;;;;;N;;;;;
+07AC;THAANA EBEFILI;Mn;0;NSM;;;;;N;;;;;
+07AD;THAANA EYBEYFILI;Mn;0;NSM;;;;;N;;;;;
+07AE;THAANA OBOFILI;Mn;0;NSM;;;;;N;;;;;
+07AF;THAANA OABOAFILI;Mn;0;NSM;;;;;N;;;;;
+07B0;THAANA SUKUN;Mn;0;NSM;;;;;N;;;;;
+0901;DEVANAGARI SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;;
+0902;DEVANAGARI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;;
+0903;DEVANAGARI SIGN VISARGA;Mc;0;L;;;;;N;;;;;
+0905;DEVANAGARI LETTER A;Lo;0;L;;;;;N;;;;;
+0906;DEVANAGARI LETTER AA;Lo;0;L;;;;;N;;;;;
+0907;DEVANAGARI LETTER I;Lo;0;L;;;;;N;;;;;
+0908;DEVANAGARI LETTER II;Lo;0;L;;;;;N;;;;;
+0909;DEVANAGARI LETTER U;Lo;0;L;;;;;N;;;;;
+090A;DEVANAGARI LETTER UU;Lo;0;L;;;;;N;;;;;
+090B;DEVANAGARI LETTER VOCALIC R;Lo;0;L;;;;;N;;;;;
+090C;DEVANAGARI LETTER VOCALIC L;Lo;0;L;;;;;N;;;;;
+090D;DEVANAGARI LETTER CANDRA E;Lo;0;L;;;;;N;;;;;
+090E;DEVANAGARI LETTER SHORT E;Lo;0;L;;;;;N;;;;;
+090F;DEVANAGARI LETTER E;Lo;0;L;;;;;N;;;;;
+0910;DEVANAGARI LETTER AI;Lo;0;L;;;;;N;;;;;
+0911;DEVANAGARI LETTER CANDRA O;Lo;0;L;;;;;N;;;;;
+0912;DEVANAGARI LETTER SHORT O;Lo;0;L;;;;;N;;;;;
+0913;DEVANAGARI LETTER O;Lo;0;L;;;;;N;;;;;
+0914;DEVANAGARI LETTER AU;Lo;0;L;;;;;N;;;;;
+0915;DEVANAGARI LETTER KA;Lo;0;L;;;;;N;;;;;
+0916;DEVANAGARI LETTER KHA;Lo;0;L;;;;;N;;;;;
+0917;DEVANAGARI LETTER GA;Lo;0;L;;;;;N;;;;;
+0918;DEVANAGARI LETTER GHA;Lo;0;L;;;;;N;;;;;
+0919;DEVANAGARI LETTER NGA;Lo;0;L;;;;;N;;;;;
+091A;DEVANAGARI LETTER CA;Lo;0;L;;;;;N;;;;;
+091B;DEVANAGARI LETTER CHA;Lo;0;L;;;;;N;;;;;
+091C;DEVANAGARI LETTER JA;Lo;0;L;;;;;N;;;;;
+091D;DEVANAGARI LETTER JHA;Lo;0;L;;;;;N;;;;;
+091E;DEVANAGARI LETTER NYA;Lo;0;L;;;;;N;;;;;
+091F;DEVANAGARI LETTER TTA;Lo;0;L;;;;;N;;;;;
+0920;DEVANAGARI LETTER TTHA;Lo;0;L;;;;;N;;;;;
+0921;DEVANAGARI LETTER DDA;Lo;0;L;;;;;N;;;;;
+0922;DEVANAGARI LETTER DDHA;Lo;0;L;;;;;N;;;;;
+0923;DEVANAGARI LETTER NNA;Lo;0;L;;;;;N;;;;;
+0924;DEVANAGARI LETTER TA;Lo;0;L;;;;;N;;;;;
+0925;DEVANAGARI LETTER THA;Lo;0;L;;;;;N;;;;;
+0926;DEVANAGARI LETTER DA;Lo;0;L;;;;;N;;;;;
+0927;DEVANAGARI LETTER DHA;Lo;0;L;;;;;N;;;;;
+0928;DEVANAGARI LETTER NA;Lo;0;L;;;;;N;;;;;
+0929;DEVANAGARI LETTER NNNA;Lo;0;L;0928 093C;;;;N;;;;;
+092A;DEVANAGARI LETTER PA;Lo;0;L;;;;;N;;;;;
+092B;DEVANAGARI LETTER PHA;Lo;0;L;;;;;N;;;;;
+092C;DEVANAGARI LETTER BA;Lo;0;L;;;;;N;;;;;
+092D;DEVANAGARI LETTER BHA;Lo;0;L;;;;;N;;;;;
+092E;DEVANAGARI LETTER MA;Lo;0;L;;;;;N;;;;;
+092F;DEVANAGARI LETTER YA;Lo;0;L;;;;;N;;;;;
+0930;DEVANAGARI LETTER RA;Lo;0;L;;;;;N;;;;;
+0931;DEVANAGARI LETTER RRA;Lo;0;L;0930 093C;;;;N;;;;;
+0932;DEVANAGARI LETTER LA;Lo;0;L;;;;;N;;;;;
+0933;DEVANAGARI LETTER LLA;Lo;0;L;;;;;N;;;;;
+0934;DEVANAGARI LETTER LLLA;Lo;0;L;0933 093C;;;;N;;;;;
+0935;DEVANAGARI LETTER VA;Lo;0;L;;;;;N;;;;;
+0936;DEVANAGARI LETTER SHA;Lo;0;L;;;;;N;;;;;
+0937;DEVANAGARI LETTER SSA;Lo;0;L;;;;;N;;;;;
+0938;DEVANAGARI LETTER SA;Lo;0;L;;;;;N;;;;;
+0939;DEVANAGARI LETTER HA;Lo;0;L;;;;;N;;;;;
+093C;DEVANAGARI SIGN NUKTA;Mn;7;NSM;;;;;N;;;;;
+093D;DEVANAGARI SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;;
+093E;DEVANAGARI VOWEL SIGN AA;Mc;0;L;;;;;N;;;;;
+093F;DEVANAGARI VOWEL SIGN I;Mc;0;L;;;;;N;;;;;
+0940;DEVANAGARI VOWEL SIGN II;Mc;0;L;;;;;N;;;;;
+0941;DEVANAGARI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;;
+0942;DEVANAGARI VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;;
+0943;DEVANAGARI VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;;
+0944;DEVANAGARI VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;;
+0945;DEVANAGARI VOWEL SIGN CANDRA E;Mn;0;NSM;;;;;N;;;;;
+0946;DEVANAGARI VOWEL SIGN SHORT E;Mn;0;NSM;;;;;N;;;;;
+0947;DEVANAGARI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;;
+0948;DEVANAGARI VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;;
+0949;DEVANAGARI VOWEL SIGN CANDRA O;Mc;0;L;;;;;N;;;;;
+094A;DEVANAGARI VOWEL SIGN SHORT O;Mc;0;L;;;;;N;;;;;
+094B;DEVANAGARI VOWEL SIGN O;Mc;0;L;;;;;N;;;;;
+094C;DEVANAGARI VOWEL SIGN AU;Mc;0;L;;;;;N;;;;;
+094D;DEVANAGARI SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;;
+0950;DEVANAGARI OM;Lo;0;L;;;;;N;;;;;
+0951;DEVANAGARI STRESS SIGN UDATTA;Mn;230;NSM;;;;;N;;;;;
+0952;DEVANAGARI STRESS SIGN ANUDATTA;Mn;220;NSM;;;;;N;;;;;
+0953;DEVANAGARI GRAVE ACCENT;Mn;230;NSM;;;;;N;;;;;
+0954;DEVANAGARI ACUTE ACCENT;Mn;230;NSM;;;;;N;;;;;
+0958;DEVANAGARI LETTER QA;Lo;0;L;0915 093C;;;;N;;;;;
+0959;DEVANAGARI LETTER KHHA;Lo;0;L;0916 093C;;;;N;;;;;
+095A;DEVANAGARI LETTER GHHA;Lo;0;L;0917 093C;;;;N;;;;;
+095B;DEVANAGARI LETTER ZA;Lo;0;L;091C 093C;;;;N;;;;;
+095C;DEVANAGARI LETTER DDDHA;Lo;0;L;0921 093C;;;;N;;;;;
+095D;DEVANAGARI LETTER RHA;Lo;0;L;0922 093C;;;;N;;;;;
+095E;DEVANAGARI LETTER FA;Lo;0;L;092B 093C;;;;N;;;;;
+095F;DEVANAGARI LETTER YYA;Lo;0;L;092F 093C;;;;N;;;;;
+0960;DEVANAGARI LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;;
+0961;DEVANAGARI LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;;
+0962;DEVANAGARI VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;;
+0963;DEVANAGARI VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;;
+0964;DEVANAGARI DANDA;Po;0;L;;;;;N;;;;;
+0965;DEVANAGARI DOUBLE DANDA;Po;0;L;;;;;N;;;;;
+0966;DEVANAGARI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+0967;DEVANAGARI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+0968;DEVANAGARI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+0969;DEVANAGARI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+096A;DEVANAGARI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+096B;DEVANAGARI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+096C;DEVANAGARI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+096D;DEVANAGARI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+096E;DEVANAGARI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+096F;DEVANAGARI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+0970;DEVANAGARI ABBREVIATION SIGN;Po;0;L;;;;;N;;;;;
+0981;BENGALI SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;;
+0982;BENGALI SIGN ANUSVARA;Mc;0;L;;;;;N;;;;;
+0983;BENGALI SIGN VISARGA;Mc;0;L;;;;;N;;;;;
+0985;BENGALI LETTER A;Lo;0;L;;;;;N;;;;;
+0986;BENGALI LETTER AA;Lo;0;L;;;;;N;;;;;
+0987;BENGALI LETTER I;Lo;0;L;;;;;N;;;;;
+0988;BENGALI LETTER II;Lo;0;L;;;;;N;;;;;
+0989;BENGALI LETTER U;Lo;0;L;;;;;N;;;;;
+098A;BENGALI LETTER UU;Lo;0;L;;;;;N;;;;;
+098B;BENGALI LETTER VOCALIC R;Lo;0;L;;;;;N;;;;;
+098C;BENGALI LETTER VOCALIC L;Lo;0;L;;;;;N;;;;;
+098F;BENGALI LETTER E;Lo;0;L;;;;;N;;;;;
+0990;BENGALI LETTER AI;Lo;0;L;;;;;N;;;;;
+0993;BENGALI LETTER O;Lo;0;L;;;;;N;;;;;
+0994;BENGALI LETTER AU;Lo;0;L;;;;;N;;;;;
+0995;BENGALI LETTER KA;Lo;0;L;;;;;N;;;;;
+0996;BENGALI LETTER KHA;Lo;0;L;;;;;N;;;;;
+0997;BENGALI LETTER GA;Lo;0;L;;;;;N;;;;;
+0998;BENGALI LETTER GHA;Lo;0;L;;;;;N;;;;;
+0999;BENGALI LETTER NGA;Lo;0;L;;;;;N;;;;;
+099A;BENGALI LETTER CA;Lo;0;L;;;;;N;;;;;
+099B;BENGALI LETTER CHA;Lo;0;L;;;;;N;;;;;
+099C;BENGALI LETTER JA;Lo;0;L;;;;;N;;;;;
+099D;BENGALI LETTER JHA;Lo;0;L;;;;;N;;;;;
+099E;BENGALI LETTER NYA;Lo;0;L;;;;;N;;;;;
+099F;BENGALI LETTER TTA;Lo;0;L;;;;;N;;;;;
+09A0;BENGALI LETTER TTHA;Lo;0;L;;;;;N;;;;;
+09A1;BENGALI LETTER DDA;Lo;0;L;;;;;N;;;;;
+09A2;BENGALI LETTER DDHA;Lo;0;L;;;;;N;;;;;
+09A3;BENGALI LETTER NNA;Lo;0;L;;;;;N;;;;;
+09A4;BENGALI LETTER TA;Lo;0;L;;;;;N;;;;;
+09A5;BENGALI LETTER THA;Lo;0;L;;;;;N;;;;;
+09A6;BENGALI LETTER DA;Lo;0;L;;;;;N;;;;;
+09A7;BENGALI LETTER DHA;Lo;0;L;;;;;N;;;;;
+09A8;BENGALI LETTER NA;Lo;0;L;;;;;N;;;;;
+09AA;BENGALI LETTER PA;Lo;0;L;;;;;N;;;;;
+09AB;BENGALI LETTER PHA;Lo;0;L;;;;;N;;;;;
+09AC;BENGALI LETTER BA;Lo;0;L;;;;;N;;;;;
+09AD;BENGALI LETTER BHA;Lo;0;L;;;;;N;;;;;
+09AE;BENGALI LETTER MA;Lo;0;L;;;;;N;;;;;
+09AF;BENGALI LETTER YA;Lo;0;L;;;;;N;;;;;
+09B0;BENGALI LETTER RA;Lo;0;L;;;;;N;;;;;
+09B2;BENGALI LETTER LA;Lo;0;L;;;;;N;;;;;
+09B6;BENGALI LETTER SHA;Lo;0;L;;;;;N;;;;;
+09B7;BENGALI LETTER SSA;Lo;0;L;;;;;N;;;;;
+09B8;BENGALI LETTER SA;Lo;0;L;;;;;N;;;;;
+09B9;BENGALI LETTER HA;Lo;0;L;;;;;N;;;;;
+09BC;BENGALI SIGN NUKTA;Mn;7;NSM;;;;;N;;;;;
+09BE;BENGALI VOWEL SIGN AA;Mc;0;L;;;;;N;;;;;
+09BF;BENGALI VOWEL SIGN I;Mc;0;L;;;;;N;;;;;
+09C0;BENGALI VOWEL SIGN II;Mc;0;L;;;;;N;;;;;
+09C1;BENGALI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;;
+09C2;BENGALI VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;;
+09C3;BENGALI VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;;
+09C4;BENGALI VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;;
+09C7;BENGALI VOWEL SIGN E;Mc;0;L;;;;;N;;;;;
+09C8;BENGALI VOWEL SIGN AI;Mc;0;L;;;;;N;;;;;
+09CB;BENGALI VOWEL SIGN O;Mc;0;L;09C7 09BE;;;;N;;;;;
+09CC;BENGALI VOWEL SIGN AU;Mc;0;L;09C7 09D7;;;;N;;;;;
+09CD;BENGALI SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;;
+09D7;BENGALI AU LENGTH MARK;Mc;0;L;;;;;N;;;;;
+09DC;BENGALI LETTER RRA;Lo;0;L;09A1 09BC;;;;N;;;;;
+09DD;BENGALI LETTER RHA;Lo;0;L;09A2 09BC;;;;N;;;;;
+09DF;BENGALI LETTER YYA;Lo;0;L;09AF 09BC;;;;N;;;;;
+09E0;BENGALI LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;;
+09E1;BENGALI LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;;
+09E2;BENGALI VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;;
+09E3;BENGALI VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;;
+09E6;BENGALI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+09E7;BENGALI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+09E8;BENGALI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+09E9;BENGALI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+09EA;BENGALI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+09EB;BENGALI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+09EC;BENGALI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+09ED;BENGALI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+09EE;BENGALI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+09EF;BENGALI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+09F0;BENGALI LETTER RA WITH MIDDLE DIAGONAL;Lo;0;L;;;;;N;;Assamese;;;
+09F1;BENGALI LETTER RA WITH LOWER DIAGONAL;Lo;0;L;;;;;N;BENGALI LETTER VA WITH LOWER DIAGONAL;Assamese;;;
+09F2;BENGALI RUPEE MARK;Sc;0;ET;;;;;N;;;;;
+09F3;BENGALI RUPEE SIGN;Sc;0;ET;;;;;N;;;;;
+09F4;BENGALI CURRENCY NUMERATOR ONE;No;0;L;;;;1;N;;;;;
+09F5;BENGALI CURRENCY NUMERATOR TWO;No;0;L;;;;2;N;;;;;
+09F6;BENGALI CURRENCY NUMERATOR THREE;No;0;L;;;;3;N;;;;;
+09F7;BENGALI CURRENCY NUMERATOR FOUR;No;0;L;;;;4;N;;;;;
+09F8;BENGALI CURRENCY NUMERATOR ONE LESS THAN THE DENOMINATOR;No;0;L;;;;;N;;;;;
+09F9;BENGALI CURRENCY DENOMINATOR SIXTEEN;No;0;L;;;;16;N;;;;;
+09FA;BENGALI ISSHAR;So;0;L;;;;;N;;;;;
+0A02;GURMUKHI SIGN BINDI;Mn;0;NSM;;;;;N;;;;;
+0A05;GURMUKHI LETTER A;Lo;0;L;;;;;N;;;;;
+0A06;GURMUKHI LETTER AA;Lo;0;L;;;;;N;;;;;
+0A07;GURMUKHI LETTER I;Lo;0;L;;;;;N;;;;;
+0A08;GURMUKHI LETTER II;Lo;0;L;;;;;N;;;;;
+0A09;GURMUKHI LETTER U;Lo;0;L;;;;;N;;;;;
+0A0A;GURMUKHI LETTER UU;Lo;0;L;;;;;N;;;;;
+0A0F;GURMUKHI LETTER EE;Lo;0;L;;;;;N;;;;;
+0A10;GURMUKHI LETTER AI;Lo;0;L;;;;;N;;;;;
+0A13;GURMUKHI LETTER OO;Lo;0;L;;;;;N;;;;;
+0A14;GURMUKHI LETTER AU;Lo;0;L;;;;;N;;;;;
+0A15;GURMUKHI LETTER KA;Lo;0;L;;;;;N;;;;;
+0A16;GURMUKHI LETTER KHA;Lo;0;L;;;;;N;;;;;
+0A17;GURMUKHI LETTER GA;Lo;0;L;;;;;N;;;;;
+0A18;GURMUKHI LETTER GHA;Lo;0;L;;;;;N;;;;;
+0A19;GURMUKHI LETTER NGA;Lo;0;L;;;;;N;;;;;
+0A1A;GURMUKHI LETTER CA;Lo;0;L;;;;;N;;;;;
+0A1B;GURMUKHI LETTER CHA;Lo;0;L;;;;;N;;;;;
+0A1C;GURMUKHI LETTER JA;Lo;0;L;;;;;N;;;;;
+0A1D;GURMUKHI LETTER JHA;Lo;0;L;;;;;N;;;;;
+0A1E;GURMUKHI LETTER NYA;Lo;0;L;;;;;N;;;;;
+0A1F;GURMUKHI LETTER TTA;Lo;0;L;;;;;N;;;;;
+0A20;GURMUKHI LETTER TTHA;Lo;0;L;;;;;N;;;;;
+0A21;GURMUKHI LETTER DDA;Lo;0;L;;;;;N;;;;;
+0A22;GURMUKHI LETTER DDHA;Lo;0;L;;;;;N;;;;;
+0A23;GURMUKHI LETTER NNA;Lo;0;L;;;;;N;;;;;
+0A24;GURMUKHI LETTER TA;Lo;0;L;;;;;N;;;;;
+0A25;GURMUKHI LETTER THA;Lo;0;L;;;;;N;;;;;
+0A26;GURMUKHI LETTER DA;Lo;0;L;;;;;N;;;;;
+0A27;GURMUKHI LETTER DHA;Lo;0;L;;;;;N;;;;;
+0A28;GURMUKHI LETTER NA;Lo;0;L;;;;;N;;;;;
+0A2A;GURMUKHI LETTER PA;Lo;0;L;;;;;N;;;;;
+0A2B;GURMUKHI LETTER PHA;Lo;0;L;;;;;N;;;;;
+0A2C;GURMUKHI LETTER BA;Lo;0;L;;;;;N;;;;;
+0A2D;GURMUKHI LETTER BHA;Lo;0;L;;;;;N;;;;;
+0A2E;GURMUKHI LETTER MA;Lo;0;L;;;;;N;;;;;
+0A2F;GURMUKHI LETTER YA;Lo;0;L;;;;;N;;;;;
+0A30;GURMUKHI LETTER RA;Lo;0;L;;;;;N;;;;;
+0A32;GURMUKHI LETTER LA;Lo;0;L;;;;;N;;;;;
+0A33;GURMUKHI LETTER LLA;Lo;0;L;0A32 0A3C;;;;N;;;;;
+0A35;GURMUKHI LETTER VA;Lo;0;L;;;;;N;;;;;
+0A36;GURMUKHI LETTER SHA;Lo;0;L;0A38 0A3C;;;;N;;;;;
+0A38;GURMUKHI LETTER SA;Lo;0;L;;;;;N;;;;;
+0A39;GURMUKHI LETTER HA;Lo;0;L;;;;;N;;;;;
+0A3C;GURMUKHI SIGN NUKTA;Mn;7;NSM;;;;;N;;;;;
+0A3E;GURMUKHI VOWEL SIGN AA;Mc;0;L;;;;;N;;;;;
+0A3F;GURMUKHI VOWEL SIGN I;Mc;0;L;;;;;N;;;;;
+0A40;GURMUKHI VOWEL SIGN II;Mc;0;L;;;;;N;;;;;
+0A41;GURMUKHI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;;
+0A42;GURMUKHI VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;;
+0A47;GURMUKHI VOWEL SIGN EE;Mn;0;NSM;;;;;N;;;;;
+0A48;GURMUKHI VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;;
+0A4B;GURMUKHI VOWEL SIGN OO;Mn;0;NSM;;;;;N;;;;;
+0A4C;GURMUKHI VOWEL SIGN AU;Mn;0;NSM;;;;;N;;;;;
+0A4D;GURMUKHI SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;;
+0A59;GURMUKHI LETTER KHHA;Lo;0;L;0A16 0A3C;;;;N;;;;;
+0A5A;GURMUKHI LETTER GHHA;Lo;0;L;0A17 0A3C;;;;N;;;;;
+0A5B;GURMUKHI LETTER ZA;Lo;0;L;0A1C 0A3C;;;;N;;;;;
+0A5C;GURMUKHI LETTER RRA;Lo;0;L;;;;;N;;;;;
+0A5E;GURMUKHI LETTER FA;Lo;0;L;0A2B 0A3C;;;;N;;;;;
+0A66;GURMUKHI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+0A67;GURMUKHI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+0A68;GURMUKHI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+0A69;GURMUKHI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+0A6A;GURMUKHI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+0A6B;GURMUKHI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+0A6C;GURMUKHI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+0A6D;GURMUKHI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+0A6E;GURMUKHI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+0A6F;GURMUKHI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+0A70;GURMUKHI TIPPI;Mn;0;NSM;;;;;N;;;;;
+0A71;GURMUKHI ADDAK;Mn;0;NSM;;;;;N;;;;;
+0A72;GURMUKHI IRI;Lo;0;L;;;;;N;;;;;
+0A73;GURMUKHI URA;Lo;0;L;;;;;N;;;;;
+0A74;GURMUKHI EK ONKAR;Lo;0;L;;;;;N;;;;;
+0A81;GUJARATI SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;;
+0A82;GUJARATI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;;
+0A83;GUJARATI SIGN VISARGA;Mc;0;L;;;;;N;;;;;
+0A85;GUJARATI LETTER A;Lo;0;L;;;;;N;;;;;
+0A86;GUJARATI LETTER AA;Lo;0;L;;;;;N;;;;;
+0A87;GUJARATI LETTER I;Lo;0;L;;;;;N;;;;;
+0A88;GUJARATI LETTER II;Lo;0;L;;;;;N;;;;;
+0A89;GUJARATI LETTER U;Lo;0;L;;;;;N;;;;;
+0A8A;GUJARATI LETTER UU;Lo;0;L;;;;;N;;;;;
+0A8B;GUJARATI LETTER VOCALIC R;Lo;0;L;;;;;N;;;;;
+0A8D;GUJARATI VOWEL CANDRA E;Lo;0;L;;;;;N;;;;;
+0A8F;GUJARATI LETTER E;Lo;0;L;;;;;N;;;;;
+0A90;GUJARATI LETTER AI;Lo;0;L;;;;;N;;;;;
+0A91;GUJARATI VOWEL CANDRA O;Lo;0;L;;;;;N;;;;;
+0A93;GUJARATI LETTER O;Lo;0;L;;;;;N;;;;;
+0A94;GUJARATI LETTER AU;Lo;0;L;;;;;N;;;;;
+0A95;GUJARATI LETTER KA;Lo;0;L;;;;;N;;;;;
+0A96;GUJARATI LETTER KHA;Lo;0;L;;;;;N;;;;;
+0A97;GUJARATI LETTER GA;Lo;0;L;;;;;N;;;;;
+0A98;GUJARATI LETTER GHA;Lo;0;L;;;;;N;;;;;
+0A99;GUJARATI LETTER NGA;Lo;0;L;;;;;N;;;;;
+0A9A;GUJARATI LETTER CA;Lo;0;L;;;;;N;;;;;
+0A9B;GUJARATI LETTER CHA;Lo;0;L;;;;;N;;;;;
+0A9C;GUJARATI LETTER JA;Lo;0;L;;;;;N;;;;;
+0A9D;GUJARATI LETTER JHA;Lo;0;L;;;;;N;;;;;
+0A9E;GUJARATI LETTER NYA;Lo;0;L;;;;;N;;;;;
+0A9F;GUJARATI LETTER TTA;Lo;0;L;;;;;N;;;;;
+0AA0;GUJARATI LETTER TTHA;Lo;0;L;;;;;N;;;;;
+0AA1;GUJARATI LETTER DDA;Lo;0;L;;;;;N;;;;;
+0AA2;GUJARATI LETTER DDHA;Lo;0;L;;;;;N;;;;;
+0AA3;GUJARATI LETTER NNA;Lo;0;L;;;;;N;;;;;
+0AA4;GUJARATI LETTER TA;Lo;0;L;;;;;N;;;;;
+0AA5;GUJARATI LETTER THA;Lo;0;L;;;;;N;;;;;
+0AA6;GUJARATI LETTER DA;Lo;0;L;;;;;N;;;;;
+0AA7;GUJARATI LETTER DHA;Lo;0;L;;;;;N;;;;;
+0AA8;GUJARATI LETTER NA;Lo;0;L;;;;;N;;;;;
+0AAA;GUJARATI LETTER PA;Lo;0;L;;;;;N;;;;;
+0AAB;GUJARATI LETTER PHA;Lo;0;L;;;;;N;;;;;
+0AAC;GUJARATI LETTER BA;Lo;0;L;;;;;N;;;;;
+0AAD;GUJARATI LETTER BHA;Lo;0;L;;;;;N;;;;;
+0AAE;GUJARATI LETTER MA;Lo;0;L;;;;;N;;;;;
+0AAF;GUJARATI LETTER YA;Lo;0;L;;;;;N;;;;;
+0AB0;GUJARATI LETTER RA;Lo;0;L;;;;;N;;;;;
+0AB2;GUJARATI LETTER LA;Lo;0;L;;;;;N;;;;;
+0AB3;GUJARATI LETTER LLA;Lo;0;L;;;;;N;;;;;
+0AB5;GUJARATI LETTER VA;Lo;0;L;;;;;N;;;;;
+0AB6;GUJARATI LETTER SHA;Lo;0;L;;;;;N;;;;;
+0AB7;GUJARATI LETTER SSA;Lo;0;L;;;;;N;;;;;
+0AB8;GUJARATI LETTER SA;Lo;0;L;;;;;N;;;;;
+0AB9;GUJARATI LETTER HA;Lo;0;L;;;;;N;;;;;
+0ABC;GUJARATI SIGN NUKTA;Mn;7;NSM;;;;;N;;;;;
+0ABD;GUJARATI SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;;
+0ABE;GUJARATI VOWEL SIGN AA;Mc;0;L;;;;;N;;;;;
+0ABF;GUJARATI VOWEL SIGN I;Mc;0;L;;;;;N;;;;;
+0AC0;GUJARATI VOWEL SIGN II;Mc;0;L;;;;;N;;;;;
+0AC1;GUJARATI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;;
+0AC2;GUJARATI VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;;
+0AC3;GUJARATI VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;;
+0AC4;GUJARATI VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;;
+0AC5;GUJARATI VOWEL SIGN CANDRA E;Mn;0;NSM;;;;;N;;;;;
+0AC7;GUJARATI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;;
+0AC8;GUJARATI VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;;
+0AC9;GUJARATI VOWEL SIGN CANDRA O;Mc;0;L;;;;;N;;;;;
+0ACB;GUJARATI VOWEL SIGN O;Mc;0;L;;;;;N;;;;;
+0ACC;GUJARATI VOWEL SIGN AU;Mc;0;L;;;;;N;;;;;
+0ACD;GUJARATI SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;;
+0AD0;GUJARATI OM;Lo;0;L;;;;;N;;;;;
+0AE0;GUJARATI LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;;
+0AE6;GUJARATI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+0AE7;GUJARATI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+0AE8;GUJARATI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+0AE9;GUJARATI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+0AEA;GUJARATI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+0AEB;GUJARATI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+0AEC;GUJARATI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+0AED;GUJARATI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+0AEE;GUJARATI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+0AEF;GUJARATI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+0B01;ORIYA SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;;
+0B02;ORIYA SIGN ANUSVARA;Mc;0;L;;;;;N;;;;;
+0B03;ORIYA SIGN VISARGA;Mc;0;L;;;;;N;;;;;
+0B05;ORIYA LETTER A;Lo;0;L;;;;;N;;;;;
+0B06;ORIYA LETTER AA;Lo;0;L;;;;;N;;;;;
+0B07;ORIYA LETTER I;Lo;0;L;;;;;N;;;;;
+0B08;ORIYA LETTER II;Lo;0;L;;;;;N;;;;;
+0B09;ORIYA LETTER U;Lo;0;L;;;;;N;;;;;
+0B0A;ORIYA LETTER UU;Lo;0;L;;;;;N;;;;;
+0B0B;ORIYA LETTER VOCALIC R;Lo;0;L;;;;;N;;;;;
+0B0C;ORIYA LETTER VOCALIC L;Lo;0;L;;;;;N;;;;;
+0B0F;ORIYA LETTER E;Lo;0;L;;;;;N;;;;;
+0B10;ORIYA LETTER AI;Lo;0;L;;;;;N;;;;;
+0B13;ORIYA LETTER O;Lo;0;L;;;;;N;;;;;
+0B14;ORIYA LETTER AU;Lo;0;L;;;;;N;;;;;
+0B15;ORIYA LETTER KA;Lo;0;L;;;;;N;;;;;
+0B16;ORIYA LETTER KHA;Lo;0;L;;;;;N;;;;;
+0B17;ORIYA LETTER GA;Lo;0;L;;;;;N;;;;;
+0B18;ORIYA LETTER GHA;Lo;0;L;;;;;N;;;;;
+0B19;ORIYA LETTER NGA;Lo;0;L;;;;;N;;;;;
+0B1A;ORIYA LETTER CA;Lo;0;L;;;;;N;;;;;
+0B1B;ORIYA LETTER CHA;Lo;0;L;;;;;N;;;;;
+0B1C;ORIYA LETTER JA;Lo;0;L;;;;;N;;;;;
+0B1D;ORIYA LETTER JHA;Lo;0;L;;;;;N;;;;;
+0B1E;ORIYA LETTER NYA;Lo;0;L;;;;;N;;;;;
+0B1F;ORIYA LETTER TTA;Lo;0;L;;;;;N;;;;;
+0B20;ORIYA LETTER TTHA;Lo;0;L;;;;;N;;;;;
+0B21;ORIYA LETTER DDA;Lo;0;L;;;;;N;;;;;
+0B22;ORIYA LETTER DDHA;Lo;0;L;;;;;N;;;;;
+0B23;ORIYA LETTER NNA;Lo;0;L;;;;;N;;;;;
+0B24;ORIYA LETTER TA;Lo;0;L;;;;;N;;;;;
+0B25;ORIYA LETTER THA;Lo;0;L;;;;;N;;;;;
+0B26;ORIYA LETTER DA;Lo;0;L;;;;;N;;;;;
+0B27;ORIYA LETTER DHA;Lo;0;L;;;;;N;;;;;
+0B28;ORIYA LETTER NA;Lo;0;L;;;;;N;;;;;
+0B2A;ORIYA LETTER PA;Lo;0;L;;;;;N;;;;;
+0B2B;ORIYA LETTER PHA;Lo;0;L;;;;;N;;;;;
+0B2C;ORIYA LETTER BA;Lo;0;L;;;;;N;;;;;
+0B2D;ORIYA LETTER BHA;Lo;0;L;;;;;N;;;;;
+0B2E;ORIYA LETTER MA;Lo;0;L;;;;;N;;;;;
+0B2F;ORIYA LETTER YA;Lo;0;L;;;;;N;;;;;
+0B30;ORIYA LETTER RA;Lo;0;L;;;;;N;;;;;
+0B32;ORIYA LETTER LA;Lo;0;L;;;;;N;;;;;
+0B33;ORIYA LETTER LLA;Lo;0;L;;;;;N;;;;;
+0B36;ORIYA LETTER SHA;Lo;0;L;;;;;N;;;;;
+0B37;ORIYA LETTER SSA;Lo;0;L;;;;;N;;;;;
+0B38;ORIYA LETTER SA;Lo;0;L;;;;;N;;;;;
+0B39;ORIYA LETTER HA;Lo;0;L;;;;;N;;;;;
+0B3C;ORIYA SIGN NUKTA;Mn;7;NSM;;;;;N;;;;;
+0B3D;ORIYA SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;;
+0B3E;ORIYA VOWEL SIGN AA;Mc;0;L;;;;;N;;;;;
+0B3F;ORIYA VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;;
+0B40;ORIYA VOWEL SIGN II;Mc;0;L;;;;;N;;;;;
+0B41;ORIYA VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;;
+0B42;ORIYA VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;;
+0B43;ORIYA VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;;
+0B47;ORIYA VOWEL SIGN E;Mc;0;L;;;;;N;;;;;
+0B48;ORIYA VOWEL SIGN AI;Mc;0;L;0B47 0B56;;;;N;;;;;
+0B4B;ORIYA VOWEL SIGN O;Mc;0;L;0B47 0B3E;;;;N;;;;;
+0B4C;ORIYA VOWEL SIGN AU;Mc;0;L;0B47 0B57;;;;N;;;;;
+0B4D;ORIYA SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;;
+0B56;ORIYA AI LENGTH MARK;Mn;0;NSM;;;;;N;;;;;
+0B57;ORIYA AU LENGTH MARK;Mc;0;L;;;;;N;;;;;
+0B5C;ORIYA LETTER RRA;Lo;0;L;0B21 0B3C;;;;N;;;;;
+0B5D;ORIYA LETTER RHA;Lo;0;L;0B22 0B3C;;;;N;;;;;
+0B5F;ORIYA LETTER YYA;Lo;0;L;;;;;N;;;;;
+0B60;ORIYA LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;;
+0B61;ORIYA LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;;
+0B66;ORIYA DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+0B67;ORIYA DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+0B68;ORIYA DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+0B69;ORIYA DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+0B6A;ORIYA DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+0B6B;ORIYA DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+0B6C;ORIYA DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+0B6D;ORIYA DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+0B6E;ORIYA DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+0B6F;ORIYA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+0B70;ORIYA ISSHAR;So;0;L;;;;;N;;;;;
+0B82;TAMIL SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;;
+0B83;TAMIL SIGN VISARGA;Mc;0;L;;;;;N;;;;;
+0B85;TAMIL LETTER A;Lo;0;L;;;;;N;;;;;
+0B86;TAMIL LETTER AA;Lo;0;L;;;;;N;;;;;
+0B87;TAMIL LETTER I;Lo;0;L;;;;;N;;;;;
+0B88;TAMIL LETTER II;Lo;0;L;;;;;N;;;;;
+0B89;TAMIL LETTER U;Lo;0;L;;;;;N;;;;;
+0B8A;TAMIL LETTER UU;Lo;0;L;;;;;N;;;;;
+0B8E;TAMIL LETTER E;Lo;0;L;;;;;N;;;;;
+0B8F;TAMIL LETTER EE;Lo;0;L;;;;;N;;;;;
+0B90;TAMIL LETTER AI;Lo;0;L;;;;;N;;;;;
+0B92;TAMIL LETTER O;Lo;0;L;;;;;N;;;;;
+0B93;TAMIL LETTER OO;Lo;0;L;;;;;N;;;;;
+0B94;TAMIL LETTER AU;Lo;0;L;0B92 0BD7;;;;N;;;;;
+0B95;TAMIL LETTER KA;Lo;0;L;;;;;N;;;;;
+0B99;TAMIL LETTER NGA;Lo;0;L;;;;;N;;;;;
+0B9A;TAMIL LETTER CA;Lo;0;L;;;;;N;;;;;
+0B9C;TAMIL LETTER JA;Lo;0;L;;;;;N;;;;;
+0B9E;TAMIL LETTER NYA;Lo;0;L;;;;;N;;;;;
+0B9F;TAMIL LETTER TTA;Lo;0;L;;;;;N;;;;;
+0BA3;TAMIL LETTER NNA;Lo;0;L;;;;;N;;;;;
+0BA4;TAMIL LETTER TA;Lo;0;L;;;;;N;;;;;
+0BA8;TAMIL LETTER NA;Lo;0;L;;;;;N;;;;;
+0BA9;TAMIL LETTER NNNA;Lo;0;L;;;;;N;;;;;
+0BAA;TAMIL LETTER PA;Lo;0;L;;;;;N;;;;;
+0BAE;TAMIL LETTER MA;Lo;0;L;;;;;N;;;;;
+0BAF;TAMIL LETTER YA;Lo;0;L;;;;;N;;;;;
+0BB0;TAMIL LETTER RA;Lo;0;L;;;;;N;;;;;
+0BB1;TAMIL LETTER RRA;Lo;0;L;;;;;N;;;;;
+0BB2;TAMIL LETTER LA;Lo;0;L;;;;;N;;;;;
+0BB3;TAMIL LETTER LLA;Lo;0;L;;;;;N;;;;;
+0BB4;TAMIL LETTER LLLA;Lo;0;L;;;;;N;;;;;
+0BB5;TAMIL LETTER VA;Lo;0;L;;;;;N;;;;;
+0BB7;TAMIL LETTER SSA;Lo;0;L;;;;;N;;;;;
+0BB8;TAMIL LETTER SA;Lo;0;L;;;;;N;;;;;
+0BB9;TAMIL LETTER HA;Lo;0;L;;;;;N;;;;;
+0BBE;TAMIL VOWEL SIGN AA;Mc;0;L;;;;;N;;;;;
+0BBF;TAMIL VOWEL SIGN I;Mc;0;L;;;;;N;;;;;
+0BC0;TAMIL VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;;
+0BC1;TAMIL VOWEL SIGN U;Mc;0;L;;;;;N;;;;;
+0BC2;TAMIL VOWEL SIGN UU;Mc;0;L;;;;;N;;;;;
+0BC6;TAMIL VOWEL SIGN E;Mc;0;L;;;;;N;;;;;
+0BC7;TAMIL VOWEL SIGN EE;Mc;0;L;;;;;N;;;;;
+0BC8;TAMIL VOWEL SIGN AI;Mc;0;L;;;;;N;;;;;
+0BCA;TAMIL VOWEL SIGN O;Mc;0;L;0BC6 0BBE;;;;N;;;;;
+0BCB;TAMIL VOWEL SIGN OO;Mc;0;L;0BC7 0BBE;;;;N;;;;;
+0BCC;TAMIL VOWEL SIGN AU;Mc;0;L;0BC6 0BD7;;;;N;;;;;
+0BCD;TAMIL SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;;
+0BD7;TAMIL AU LENGTH MARK;Mc;0;L;;;;;N;;;;;
+0BE7;TAMIL DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+0BE8;TAMIL DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+0BE9;TAMIL DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+0BEA;TAMIL DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+0BEB;TAMIL DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+0BEC;TAMIL DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+0BED;TAMIL DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+0BEE;TAMIL DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+0BEF;TAMIL DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+0BF0;TAMIL NUMBER TEN;No;0;L;;;;10;N;;;;;
+0BF1;TAMIL NUMBER ONE HUNDRED;No;0;L;;;;100;N;;;;;
+0BF2;TAMIL NUMBER ONE THOUSAND;No;0;L;;;;1000;N;;;;;
+0C01;TELUGU SIGN CANDRABINDU;Mc;0;L;;;;;N;;;;;
+0C02;TELUGU SIGN ANUSVARA;Mc;0;L;;;;;N;;;;;
+0C03;TELUGU SIGN VISARGA;Mc;0;L;;;;;N;;;;;
+0C05;TELUGU LETTER A;Lo;0;L;;;;;N;;;;;
+0C06;TELUGU LETTER AA;Lo;0;L;;;;;N;;;;;
+0C07;TELUGU LETTER I;Lo;0;L;;;;;N;;;;;
+0C08;TELUGU LETTER II;Lo;0;L;;;;;N;;;;;
+0C09;TELUGU LETTER U;Lo;0;L;;;;;N;;;;;
+0C0A;TELUGU LETTER UU;Lo;0;L;;;;;N;;;;;
+0C0B;TELUGU LETTER VOCALIC R;Lo;0;L;;;;;N;;;;;
+0C0C;TELUGU LETTER VOCALIC L;Lo;0;L;;;;;N;;;;;
+0C0E;TELUGU LETTER E;Lo;0;L;;;;;N;;;;;
+0C0F;TELUGU LETTER EE;Lo;0;L;;;;;N;;;;;
+0C10;TELUGU LETTER AI;Lo;0;L;;;;;N;;;;;
+0C12;TELUGU LETTER O;Lo;0;L;;;;;N;;;;;
+0C13;TELUGU LETTER OO;Lo;0;L;;;;;N;;;;;
+0C14;TELUGU LETTER AU;Lo;0;L;;;;;N;;;;;
+0C15;TELUGU LETTER KA;Lo;0;L;;;;;N;;;;;
+0C16;TELUGU LETTER KHA;Lo;0;L;;;;;N;;;;;
+0C17;TELUGU LETTER GA;Lo;0;L;;;;;N;;;;;
+0C18;TELUGU LETTER GHA;Lo;0;L;;;;;N;;;;;
+0C19;TELUGU LETTER NGA;Lo;0;L;;;;;N;;;;;
+0C1A;TELUGU LETTER CA;Lo;0;L;;;;;N;;;;;
+0C1B;TELUGU LETTER CHA;Lo;0;L;;;;;N;;;;;
+0C1C;TELUGU LETTER JA;Lo;0;L;;;;;N;;;;;
+0C1D;TELUGU LETTER JHA;Lo;0;L;;;;;N;;;;;
+0C1E;TELUGU LETTER NYA;Lo;0;L;;;;;N;;;;;
+0C1F;TELUGU LETTER TTA;Lo;0;L;;;;;N;;;;;
+0C20;TELUGU LETTER TTHA;Lo;0;L;;;;;N;;;;;
+0C21;TELUGU LETTER DDA;Lo;0;L;;;;;N;;;;;
+0C22;TELUGU LETTER DDHA;Lo;0;L;;;;;N;;;;;
+0C23;TELUGU LETTER NNA;Lo;0;L;;;;;N;;;;;
+0C24;TELUGU LETTER TA;Lo;0;L;;;;;N;;;;;
+0C25;TELUGU LETTER THA;Lo;0;L;;;;;N;;;;;
+0C26;TELUGU LETTER DA;Lo;0;L;;;;;N;;;;;
+0C27;TELUGU LETTER DHA;Lo;0;L;;;;;N;;;;;
+0C28;TELUGU LETTER NA;Lo;0;L;;;;;N;;;;;
+0C2A;TELUGU LETTER PA;Lo;0;L;;;;;N;;;;;
+0C2B;TELUGU LETTER PHA;Lo;0;L;;;;;N;;;;;
+0C2C;TELUGU LETTER BA;Lo;0;L;;;;;N;;;;;
+0C2D;TELUGU LETTER BHA;Lo;0;L;;;;;N;;;;;
+0C2E;TELUGU LETTER MA;Lo;0;L;;;;;N;;;;;
+0C2F;TELUGU LETTER YA;Lo;0;L;;;;;N;;;;;
+0C30;TELUGU LETTER RA;Lo;0;L;;;;;N;;;;;
+0C31;TELUGU LETTER RRA;Lo;0;L;;;;;N;;;;;
+0C32;TELUGU LETTER LA;Lo;0;L;;;;;N;;;;;
+0C33;TELUGU LETTER LLA;Lo;0;L;;;;;N;;;;;
+0C35;TELUGU LETTER VA;Lo;0;L;;;;;N;;;;;
+0C36;TELUGU LETTER SHA;Lo;0;L;;;;;N;;;;;
+0C37;TELUGU LETTER SSA;Lo;0;L;;;;;N;;;;;
+0C38;TELUGU LETTER SA;Lo;0;L;;;;;N;;;;;
+0C39;TELUGU LETTER HA;Lo;0;L;;;;;N;;;;;
+0C3E;TELUGU VOWEL SIGN AA;Mn;0;NSM;;;;;N;;;;;
+0C3F;TELUGU VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;;
+0C40;TELUGU VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;;
+0C41;TELUGU VOWEL SIGN U;Mc;0;L;;;;;N;;;;;
+0C42;TELUGU VOWEL SIGN UU;Mc;0;L;;;;;N;;;;;
+0C43;TELUGU VOWEL SIGN VOCALIC R;Mc;0;L;;;;;N;;;;;
+0C44;TELUGU VOWEL SIGN VOCALIC RR;Mc;0;L;;;;;N;;;;;
+0C46;TELUGU VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;;
+0C47;TELUGU VOWEL SIGN EE;Mn;0;NSM;;;;;N;;;;;
+0C48;TELUGU VOWEL SIGN AI;Mn;0;NSM;0C46 0C56;;;;N;;;;;
+0C4A;TELUGU VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;;
+0C4B;TELUGU VOWEL SIGN OO;Mn;0;NSM;;;;;N;;;;;
+0C4C;TELUGU VOWEL SIGN AU;Mn;0;NSM;;;;;N;;;;;
+0C4D;TELUGU SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;;
+0C55;TELUGU LENGTH MARK;Mn;84;NSM;;;;;N;;;;;
+0C56;TELUGU AI LENGTH MARK;Mn;91;NSM;;;;;N;;;;;
+0C60;TELUGU LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;;
+0C61;TELUGU LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;;
+0C66;TELUGU DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+0C67;TELUGU DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+0C68;TELUGU DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+0C69;TELUGU DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+0C6A;TELUGU DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+0C6B;TELUGU DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+0C6C;TELUGU DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+0C6D;TELUGU DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+0C6E;TELUGU DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+0C6F;TELUGU DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+0C82;KANNADA SIGN ANUSVARA;Mc;0;L;;;;;N;;;;;
+0C83;KANNADA SIGN VISARGA;Mc;0;L;;;;;N;;;;;
+0C85;KANNADA LETTER A;Lo;0;L;;;;;N;;;;;
+0C86;KANNADA LETTER AA;Lo;0;L;;;;;N;;;;;
+0C87;KANNADA LETTER I;Lo;0;L;;;;;N;;;;;
+0C88;KANNADA LETTER II;Lo;0;L;;;;;N;;;;;
+0C89;KANNADA LETTER U;Lo;0;L;;;;;N;;;;;
+0C8A;KANNADA LETTER UU;Lo;0;L;;;;;N;;;;;
+0C8B;KANNADA LETTER VOCALIC R;Lo;0;L;;;;;N;;;;;
+0C8C;KANNADA LETTER VOCALIC L;Lo;0;L;;;;;N;;;;;
+0C8E;KANNADA LETTER E;Lo;0;L;;;;;N;;;;;
+0C8F;KANNADA LETTER EE;Lo;0;L;;;;;N;;;;;
+0C90;KANNADA LETTER AI;Lo;0;L;;;;;N;;;;;
+0C92;KANNADA LETTER O;Lo;0;L;;;;;N;;;;;
+0C93;KANNADA LETTER OO;Lo;0;L;;;;;N;;;;;
+0C94;KANNADA LETTER AU;Lo;0;L;;;;;N;;;;;
+0C95;KANNADA LETTER KA;Lo;0;L;;;;;N;;;;;
+0C96;KANNADA LETTER KHA;Lo;0;L;;;;;N;;;;;
+0C97;KANNADA LETTER GA;Lo;0;L;;;;;N;;;;;
+0C98;KANNADA LETTER GHA;Lo;0;L;;;;;N;;;;;
+0C99;KANNADA LETTER NGA;Lo;0;L;;;;;N;;;;;
+0C9A;KANNADA LETTER CA;Lo;0;L;;;;;N;;;;;
+0C9B;KANNADA LETTER CHA;Lo;0;L;;;;;N;;;;;
+0C9C;KANNADA LETTER JA;Lo;0;L;;;;;N;;;;;
+0C9D;KANNADA LETTER JHA;Lo;0;L;;;;;N;;;;;
+0C9E;KANNADA LETTER NYA;Lo;0;L;;;;;N;;;;;
+0C9F;KANNADA LETTER TTA;Lo;0;L;;;;;N;;;;;
+0CA0;KANNADA LETTER TTHA;Lo;0;L;;;;;N;;;;;
+0CA1;KANNADA LETTER DDA;Lo;0;L;;;;;N;;;;;
+0CA2;KANNADA LETTER DDHA;Lo;0;L;;;;;N;;;;;
+0CA3;KANNADA LETTER NNA;Lo;0;L;;;;;N;;;;;
+0CA4;KANNADA LETTER TA;Lo;0;L;;;;;N;;;;;
+0CA5;KANNADA LETTER THA;Lo;0;L;;;;;N;;;;;
+0CA6;KANNADA LETTER DA;Lo;0;L;;;;;N;;;;;
+0CA7;KANNADA LETTER DHA;Lo;0;L;;;;;N;;;;;
+0CA8;KANNADA LETTER NA;Lo;0;L;;;;;N;;;;;
+0CAA;KANNADA LETTER PA;Lo;0;L;;;;;N;;;;;
+0CAB;KANNADA LETTER PHA;Lo;0;L;;;;;N;;;;;
+0CAC;KANNADA LETTER BA;Lo;0;L;;;;;N;;;;;
+0CAD;KANNADA LETTER BHA;Lo;0;L;;;;;N;;;;;
+0CAE;KANNADA LETTER MA;Lo;0;L;;;;;N;;;;;
+0CAF;KANNADA LETTER YA;Lo;0;L;;;;;N;;;;;
+0CB0;KANNADA LETTER RA;Lo;0;L;;;;;N;;;;;
+0CB1;KANNADA LETTER RRA;Lo;0;L;;;;;N;;;;;
+0CB2;KANNADA LETTER LA;Lo;0;L;;;;;N;;;;;
+0CB3;KANNADA LETTER LLA;Lo;0;L;;;;;N;;;;;
+0CB5;KANNADA LETTER VA;Lo;0;L;;;;;N;;;;;
+0CB6;KANNADA LETTER SHA;Lo;0;L;;;;;N;;;;;
+0CB7;KANNADA LETTER SSA;Lo;0;L;;;;;N;;;;;
+0CB8;KANNADA LETTER SA;Lo;0;L;;;;;N;;;;;
+0CB9;KANNADA LETTER HA;Lo;0;L;;;;;N;;;;;
+0CBE;KANNADA VOWEL SIGN AA;Mc;0;L;;;;;N;;;;;
+0CBF;KANNADA VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;;
+0CC0;KANNADA VOWEL SIGN II;Mc;0;L;0CBF 0CD5;;;;N;;;;;
+0CC1;KANNADA VOWEL SIGN U;Mc;0;L;;;;;N;;;;;
+0CC2;KANNADA VOWEL SIGN UU;Mc;0;L;;;;;N;;;;;
+0CC3;KANNADA VOWEL SIGN VOCALIC R;Mc;0;L;;;;;N;;;;;
+0CC4;KANNADA VOWEL SIGN VOCALIC RR;Mc;0;L;;;;;N;;;;;
+0CC6;KANNADA VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;;
+0CC7;KANNADA VOWEL SIGN EE;Mc;0;L;0CC6 0CD5;;;;N;;;;;
+0CC8;KANNADA VOWEL SIGN AI;Mc;0;L;0CC6 0CD6;;;;N;;;;;
+0CCA;KANNADA VOWEL SIGN O;Mc;0;L;0CC6 0CC2;;;;N;;;;;
+0CCB;KANNADA VOWEL SIGN OO;Mc;0;L;0CCA 0CD5;;;;N;;;;;
+0CCC;KANNADA VOWEL SIGN AU;Mn;0;NSM;;;;;N;;;;;
+0CCD;KANNADA SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;;
+0CD5;KANNADA LENGTH MARK;Mc;0;L;;;;;N;;;;;
+0CD6;KANNADA AI LENGTH MARK;Mc;0;L;;;;;N;;;;;
+0CDE;KANNADA LETTER FA;Lo;0;L;;;;;N;;;;;
+0CE0;KANNADA LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;;
+0CE1;KANNADA LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;;
+0CE6;KANNADA DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+0CE7;KANNADA DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+0CE8;KANNADA DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+0CE9;KANNADA DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+0CEA;KANNADA DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+0CEB;KANNADA DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+0CEC;KANNADA DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+0CED;KANNADA DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+0CEE;KANNADA DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+0CEF;KANNADA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+0D02;MALAYALAM SIGN ANUSVARA;Mc;0;L;;;;;N;;;;;
+0D03;MALAYALAM SIGN VISARGA;Mc;0;L;;;;;N;;;;;
+0D05;MALAYALAM LETTER A;Lo;0;L;;;;;N;;;;;
+0D06;MALAYALAM LETTER AA;Lo;0;L;;;;;N;;;;;
+0D07;MALAYALAM LETTER I;Lo;0;L;;;;;N;;;;;
+0D08;MALAYALAM LETTER II;Lo;0;L;;;;;N;;;;;
+0D09;MALAYALAM LETTER U;Lo;0;L;;;;;N;;;;;
+0D0A;MALAYALAM LETTER UU;Lo;0;L;;;;;N;;;;;
+0D0B;MALAYALAM LETTER VOCALIC R;Lo;0;L;;;;;N;;;;;
+0D0C;MALAYALAM LETTER VOCALIC L;Lo;0;L;;;;;N;;;;;
+0D0E;MALAYALAM LETTER E;Lo;0;L;;;;;N;;;;;
+0D0F;MALAYALAM LETTER EE;Lo;0;L;;;;;N;;;;;
+0D10;MALAYALAM LETTER AI;Lo;0;L;;;;;N;;;;;
+0D12;MALAYALAM LETTER O;Lo;0;L;;;;;N;;;;;
+0D13;MALAYALAM LETTER OO;Lo;0;L;;;;;N;;;;;
+0D14;MALAYALAM LETTER AU;Lo;0;L;;;;;N;;;;;
+0D15;MALAYALAM LETTER KA;Lo;0;L;;;;;N;;;;;
+0D16;MALAYALAM LETTER KHA;Lo;0;L;;;;;N;;;;;
+0D17;MALAYALAM LETTER GA;Lo;0;L;;;;;N;;;;;
+0D18;MALAYALAM LETTER GHA;Lo;0;L;;;;;N;;;;;
+0D19;MALAYALAM LETTER NGA;Lo;0;L;;;;;N;;;;;
+0D1A;MALAYALAM LETTER CA;Lo;0;L;;;;;N;;;;;
+0D1B;MALAYALAM LETTER CHA;Lo;0;L;;;;;N;;;;;
+0D1C;MALAYALAM LETTER JA;Lo;0;L;;;;;N;;;;;
+0D1D;MALAYALAM LETTER JHA;Lo;0;L;;;;;N;;;;;
+0D1E;MALAYALAM LETTER NYA;Lo;0;L;;;;;N;;;;;
+0D1F;MALAYALAM LETTER TTA;Lo;0;L;;;;;N;;;;;
+0D20;MALAYALAM LETTER TTHA;Lo;0;L;;;;;N;;;;;
+0D21;MALAYALAM LETTER DDA;Lo;0;L;;;;;N;;;;;
+0D22;MALAYALAM LETTER DDHA;Lo;0;L;;;;;N;;;;;
+0D23;MALAYALAM LETTER NNA;Lo;0;L;;;;;N;;;;;
+0D24;MALAYALAM LETTER TA;Lo;0;L;;;;;N;;;;;
+0D25;MALAYALAM LETTER THA;Lo;0;L;;;;;N;;;;;
+0D26;MALAYALAM LETTER DA;Lo;0;L;;;;;N;;;;;
+0D27;MALAYALAM LETTER DHA;Lo;0;L;;;;;N;;;;;
+0D28;MALAYALAM LETTER NA;Lo;0;L;;;;;N;;;;;
+0D2A;MALAYALAM LETTER PA;Lo;0;L;;;;;N;;;;;
+0D2B;MALAYALAM LETTER PHA;Lo;0;L;;;;;N;;;;;
+0D2C;MALAYALAM LETTER BA;Lo;0;L;;;;;N;;;;;
+0D2D;MALAYALAM LETTER BHA;Lo;0;L;;;;;N;;;;;
+0D2E;MALAYALAM LETTER MA;Lo;0;L;;;;;N;;;;;
+0D2F;MALAYALAM LETTER YA;Lo;0;L;;;;;N;;;;;
+0D30;MALAYALAM LETTER RA;Lo;0;L;;;;;N;;;;;
+0D31;MALAYALAM LETTER RRA;Lo;0;L;;;;;N;;;;;
+0D32;MALAYALAM LETTER LA;Lo;0;L;;;;;N;;;;;
+0D33;MALAYALAM LETTER LLA;Lo;0;L;;;;;N;;;;;
+0D34;MALAYALAM LETTER LLLA;Lo;0;L;;;;;N;;;;;
+0D35;MALAYALAM LETTER VA;Lo;0;L;;;;;N;;;;;
+0D36;MALAYALAM LETTER SHA;Lo;0;L;;;;;N;;;;;
+0D37;MALAYALAM LETTER SSA;Lo;0;L;;;;;N;;;;;
+0D38;MALAYALAM LETTER SA;Lo;0;L;;;;;N;;;;;
+0D39;MALAYALAM LETTER HA;Lo;0;L;;;;;N;;;;;
+0D3E;MALAYALAM VOWEL SIGN AA;Mc;0;L;;;;;N;;;;;
+0D3F;MALAYALAM VOWEL SIGN I;Mc;0;L;;;;;N;;;;;
+0D40;MALAYALAM VOWEL SIGN II;Mc;0;L;;;;;N;;;;;
+0D41;MALAYALAM VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;;
+0D42;MALAYALAM VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;;
+0D43;MALAYALAM VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;;
+0D46;MALAYALAM VOWEL SIGN E;Mc;0;L;;;;;N;;;;;
+0D47;MALAYALAM VOWEL SIGN EE;Mc;0;L;;;;;N;;;;;
+0D48;MALAYALAM VOWEL SIGN AI;Mc;0;L;;;;;N;;;;;
+0D4A;MALAYALAM VOWEL SIGN O;Mc;0;L;0D46 0D3E;;;;N;;;;;
+0D4B;MALAYALAM VOWEL SIGN OO;Mc;0;L;0D47 0D3E;;;;N;;;;;
+0D4C;MALAYALAM VOWEL SIGN AU;Mc;0;L;0D46 0D57;;;;N;;;;;
+0D4D;MALAYALAM SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;;
+0D57;MALAYALAM AU LENGTH MARK;Mc;0;L;;;;;N;;;;;
+0D60;MALAYALAM LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;;
+0D61;MALAYALAM LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;;
+0D66;MALAYALAM DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+0D67;MALAYALAM DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+0D68;MALAYALAM DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+0D69;MALAYALAM DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+0D6A;MALAYALAM DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+0D6B;MALAYALAM DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+0D6C;MALAYALAM DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+0D6D;MALAYALAM DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+0D6E;MALAYALAM DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+0D6F;MALAYALAM DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+0D82;SINHALA SIGN ANUSVARAYA;Mc;0;L;;;;;N;;;;;
+0D83;SINHALA SIGN VISARGAYA;Mc;0;L;;;;;N;;;;;
+0D85;SINHALA LETTER AYANNA;Lo;0;L;;;;;N;;;;;
+0D86;SINHALA LETTER AAYANNA;Lo;0;L;;;;;N;;;;;
+0D87;SINHALA LETTER AEYANNA;Lo;0;L;;;;;N;;;;;
+0D88;SINHALA LETTER AEEYANNA;Lo;0;L;;;;;N;;;;;
+0D89;SINHALA LETTER IYANNA;Lo;0;L;;;;;N;;;;;
+0D8A;SINHALA LETTER IIYANNA;Lo;0;L;;;;;N;;;;;
+0D8B;SINHALA LETTER UYANNA;Lo;0;L;;;;;N;;;;;
+0D8C;SINHALA LETTER UUYANNA;Lo;0;L;;;;;N;;;;;
+0D8D;SINHALA LETTER IRUYANNA;Lo;0;L;;;;;N;;;;;
+0D8E;SINHALA LETTER IRUUYANNA;Lo;0;L;;;;;N;;;;;
+0D8F;SINHALA LETTER ILUYANNA;Lo;0;L;;;;;N;;;;;
+0D90;SINHALA LETTER ILUUYANNA;Lo;0;L;;;;;N;;;;;
+0D91;SINHALA LETTER EYANNA;Lo;0;L;;;;;N;;;;;
+0D92;SINHALA LETTER EEYANNA;Lo;0;L;;;;;N;;;;;
+0D93;SINHALA LETTER AIYANNA;Lo;0;L;;;;;N;;;;;
+0D94;SINHALA LETTER OYANNA;Lo;0;L;;;;;N;;;;;
+0D95;SINHALA LETTER OOYANNA;Lo;0;L;;;;;N;;;;;
+0D96;SINHALA LETTER AUYANNA;Lo;0;L;;;;;N;;;;;
+0D9A;SINHALA LETTER ALPAPRAANA KAYANNA;Lo;0;L;;;;;N;;;;;
+0D9B;SINHALA LETTER MAHAAPRAANA KAYANNA;Lo;0;L;;;;;N;;;;;
+0D9C;SINHALA LETTER ALPAPRAANA GAYANNA;Lo;0;L;;;;;N;;;;;
+0D9D;SINHALA LETTER MAHAAPRAANA GAYANNA;Lo;0;L;;;;;N;;;;;
+0D9E;SINHALA LETTER KANTAJA NAASIKYAYA;Lo;0;L;;;;;N;;;;;
+0D9F;SINHALA LETTER SANYAKA GAYANNA;Lo;0;L;;;;;N;;;;;
+0DA0;SINHALA LETTER ALPAPRAANA CAYANNA;Lo;0;L;;;;;N;;;;;
+0DA1;SINHALA LETTER MAHAAPRAANA CAYANNA;Lo;0;L;;;;;N;;;;;
+0DA2;SINHALA LETTER ALPAPRAANA JAYANNA;Lo;0;L;;;;;N;;;;;
+0DA3;SINHALA LETTER MAHAAPRAANA JAYANNA;Lo;0;L;;;;;N;;;;;
+0DA4;SINHALA LETTER TAALUJA NAASIKYAYA;Lo;0;L;;;;;N;;;;;
+0DA5;SINHALA LETTER TAALUJA SANYOOGA NAAKSIKYAYA;Lo;0;L;;;;;N;;;;;
+0DA6;SINHALA LETTER SANYAKA JAYANNA;Lo;0;L;;;;;N;;;;;
+0DA7;SINHALA LETTER ALPAPRAANA TTAYANNA;Lo;0;L;;;;;N;;;;;
+0DA8;SINHALA LETTER MAHAAPRAANA TTAYANNA;Lo;0;L;;;;;N;;;;;
+0DA9;SINHALA LETTER ALPAPRAANA DDAYANNA;Lo;0;L;;;;;N;;;;;
+0DAA;SINHALA LETTER MAHAAPRAANA DDAYANNA;Lo;0;L;;;;;N;;;;;
+0DAB;SINHALA LETTER MUURDHAJA NAYANNA;Lo;0;L;;;;;N;;;;;
+0DAC;SINHALA LETTER SANYAKA DDAYANNA;Lo;0;L;;;;;N;;;;;
+0DAD;SINHALA LETTER ALPAPRAANA TAYANNA;Lo;0;L;;;;;N;;;;;
+0DAE;SINHALA LETTER MAHAAPRAANA TAYANNA;Lo;0;L;;;;;N;;;;;
+0DAF;SINHALA LETTER ALPAPRAANA DAYANNA;Lo;0;L;;;;;N;;;;;
+0DB0;SINHALA LETTER MAHAAPRAANA DAYANNA;Lo;0;L;;;;;N;;;;;
+0DB1;SINHALA LETTER DANTAJA NAYANNA;Lo;0;L;;;;;N;;;;;
+0DB3;SINHALA LETTER SANYAKA DAYANNA;Lo;0;L;;;;;N;;;;;
+0DB4;SINHALA LETTER ALPAPRAANA PAYANNA;Lo;0;L;;;;;N;;;;;
+0DB5;SINHALA LETTER MAHAAPRAANA PAYANNA;Lo;0;L;;;;;N;;;;;
+0DB6;SINHALA LETTER ALPAPRAANA BAYANNA;Lo;0;L;;;;;N;;;;;
+0DB7;SINHALA LETTER MAHAAPRAANA BAYANNA;Lo;0;L;;;;;N;;;;;
+0DB8;SINHALA LETTER MAYANNA;Lo;0;L;;;;;N;;;;;
+0DB9;SINHALA LETTER AMBA BAYANNA;Lo;0;L;;;;;N;;;;;
+0DBA;SINHALA LETTER YAYANNA;Lo;0;L;;;;;N;;;;;
+0DBB;SINHALA LETTER RAYANNA;Lo;0;L;;;;;N;;;;;
+0DBD;SINHALA LETTER DANTAJA LAYANNA;Lo;0;L;;;;;N;;;;;
+0DC0;SINHALA LETTER VAYANNA;Lo;0;L;;;;;N;;;;;
+0DC1;SINHALA LETTER TAALUJA SAYANNA;Lo;0;L;;;;;N;;;;;
+0DC2;SINHALA LETTER MUURDHAJA SAYANNA;Lo;0;L;;;;;N;;;;;
+0DC3;SINHALA LETTER DANTAJA SAYANNA;Lo;0;L;;;;;N;;;;;
+0DC4;SINHALA LETTER HAYANNA;Lo;0;L;;;;;N;;;;;
+0DC5;SINHALA LETTER MUURDHAJA LAYANNA;Lo;0;L;;;;;N;;;;;
+0DC6;SINHALA LETTER FAYANNA;Lo;0;L;;;;;N;;;;;
+0DCA;SINHALA SIGN AL-LAKUNA;Mn;9;NSM;;;;;N;;;;;
+0DCF;SINHALA VOWEL SIGN AELA-PILLA;Mc;0;L;;;;;N;;;;;
+0DD0;SINHALA VOWEL SIGN KETTI AEDA-PILLA;Mc;0;L;;;;;N;;;;;
+0DD1;SINHALA VOWEL SIGN DIGA AEDA-PILLA;Mc;0;L;;;;;N;;;;;
+0DD2;SINHALA VOWEL SIGN KETTI IS-PILLA;Mn;0;NSM;;;;;N;;;;;
+0DD3;SINHALA VOWEL SIGN DIGA IS-PILLA;Mn;0;NSM;;;;;N;;;;;
+0DD4;SINHALA VOWEL SIGN KETTI PAA-PILLA;Mn;0;NSM;;;;;N;;;;;
+0DD6;SINHALA VOWEL SIGN DIGA PAA-PILLA;Mn;0;NSM;;;;;N;;;;;
+0DD8;SINHALA VOWEL SIGN GAETTA-PILLA;Mc;0;L;;;;;N;;;;;
+0DD9;SINHALA VOWEL SIGN KOMBUVA;Mc;0;L;;;;;N;;;;;
+0DDA;SINHALA VOWEL SIGN DIGA KOMBUVA;Mc;0;L;0DD9 0DCA;;;;N;;;;;
+0DDB;SINHALA VOWEL SIGN KOMBU DEKA;Mc;0;L;;;;;N;;;;;
+0DDC;SINHALA VOWEL SIGN KOMBUVA HAA AELA-PILLA;Mc;0;L;0DD9 0DCF;;;;N;;;;;
+0DDD;SINHALA VOWEL SIGN KOMBUVA HAA DIGA AELA-PILLA;Mc;0;L;0DDC 0DCA;;;;N;;;;;
+0DDE;SINHALA VOWEL SIGN KOMBUVA HAA GAYANUKITTA;Mc;0;L;0DD9 0DDF;;;;N;;;;;
+0DDF;SINHALA VOWEL SIGN GAYANUKITTA;Mc;0;L;;;;;N;;;;;
+0DF2;SINHALA VOWEL SIGN DIGA GAETTA-PILLA;Mc;0;L;;;;;N;;;;;
+0DF3;SINHALA VOWEL SIGN DIGA GAYANUKITTA;Mc;0;L;;;;;N;;;;;
+0DF4;SINHALA PUNCTUATION KUNDDALIYA;Po;0;L;;;;;N;;;;;
+0E01;THAI CHARACTER KO KAI;Lo;0;L;;;;;N;THAI LETTER KO KAI;;;;
+0E02;THAI CHARACTER KHO KHAI;Lo;0;L;;;;;N;THAI LETTER KHO KHAI;;;;
+0E03;THAI CHARACTER KHO KHUAT;Lo;0;L;;;;;N;THAI LETTER KHO KHUAT;;;;
+0E04;THAI CHARACTER KHO KHWAI;Lo;0;L;;;;;N;THAI LETTER KHO KHWAI;;;;
+0E05;THAI CHARACTER KHO KHON;Lo;0;L;;;;;N;THAI LETTER KHO KHON;;;;
+0E06;THAI CHARACTER KHO RAKHANG;Lo;0;L;;;;;N;THAI LETTER KHO RAKHANG;;;;
+0E07;THAI CHARACTER NGO NGU;Lo;0;L;;;;;N;THAI LETTER NGO NGU;;;;
+0E08;THAI CHARACTER CHO CHAN;Lo;0;L;;;;;N;THAI LETTER CHO CHAN;;;;
+0E09;THAI CHARACTER CHO CHING;Lo;0;L;;;;;N;THAI LETTER CHO CHING;;;;
+0E0A;THAI CHARACTER CHO CHANG;Lo;0;L;;;;;N;THAI LETTER CHO CHANG;;;;
+0E0B;THAI CHARACTER SO SO;Lo;0;L;;;;;N;THAI LETTER SO SO;;;;
+0E0C;THAI CHARACTER CHO CHOE;Lo;0;L;;;;;N;THAI LETTER CHO CHOE;;;;
+0E0D;THAI CHARACTER YO YING;Lo;0;L;;;;;N;THAI LETTER YO YING;;;;
+0E0E;THAI CHARACTER DO CHADA;Lo;0;L;;;;;N;THAI LETTER DO CHADA;;;;
+0E0F;THAI CHARACTER TO PATAK;Lo;0;L;;;;;N;THAI LETTER TO PATAK;;;;
+0E10;THAI CHARACTER THO THAN;Lo;0;L;;;;;N;THAI LETTER THO THAN;;;;
+0E11;THAI CHARACTER THO NANGMONTHO;Lo;0;L;;;;;N;THAI LETTER THO NANGMONTHO;;;;
+0E12;THAI CHARACTER THO PHUTHAO;Lo;0;L;;;;;N;THAI LETTER THO PHUTHAO;;;;
+0E13;THAI CHARACTER NO NEN;Lo;0;L;;;;;N;THAI LETTER NO NEN;;;;
+0E14;THAI CHARACTER DO DEK;Lo;0;L;;;;;N;THAI LETTER DO DEK;;;;
+0E15;THAI CHARACTER TO TAO;Lo;0;L;;;;;N;THAI LETTER TO TAO;;;;
+0E16;THAI CHARACTER THO THUNG;Lo;0;L;;;;;N;THAI LETTER THO THUNG;;;;
+0E17;THAI CHARACTER THO THAHAN;Lo;0;L;;;;;N;THAI LETTER THO THAHAN;;;;
+0E18;THAI CHARACTER THO THONG;Lo;0;L;;;;;N;THAI LETTER THO THONG;;;;
+0E19;THAI CHARACTER NO NU;Lo;0;L;;;;;N;THAI LETTER NO NU;;;;
+0E1A;THAI CHARACTER BO BAIMAI;Lo;0;L;;;;;N;THAI LETTER BO BAIMAI;;;;
+0E1B;THAI CHARACTER PO PLA;Lo;0;L;;;;;N;THAI LETTER PO PLA;;;;
+0E1C;THAI CHARACTER PHO PHUNG;Lo;0;L;;;;;N;THAI LETTER PHO PHUNG;;;;
+0E1D;THAI CHARACTER FO FA;Lo;0;L;;;;;N;THAI LETTER FO FA;;;;
+0E1E;THAI CHARACTER PHO PHAN;Lo;0;L;;;;;N;THAI LETTER PHO PHAN;;;;
+0E1F;THAI CHARACTER FO FAN;Lo;0;L;;;;;N;THAI LETTER FO FAN;;;;
+0E20;THAI CHARACTER PHO SAMPHAO;Lo;0;L;;;;;N;THAI LETTER PHO SAMPHAO;;;;
+0E21;THAI CHARACTER MO MA;Lo;0;L;;;;;N;THAI LETTER MO MA;;;;
+0E22;THAI CHARACTER YO YAK;Lo;0;L;;;;;N;THAI LETTER YO YAK;;;;
+0E23;THAI CHARACTER RO RUA;Lo;0;L;;;;;N;THAI LETTER RO RUA;;;;
+0E24;THAI CHARACTER RU;Lo;0;L;;;;;N;THAI LETTER RU;;;;
+0E25;THAI CHARACTER LO LING;Lo;0;L;;;;;N;THAI LETTER LO LING;;;;
+0E26;THAI CHARACTER LU;Lo;0;L;;;;;N;THAI LETTER LU;;;;
+0E27;THAI CHARACTER WO WAEN;Lo;0;L;;;;;N;THAI LETTER WO WAEN;;;;
+0E28;THAI CHARACTER SO SALA;Lo;0;L;;;;;N;THAI LETTER SO SALA;;;;
+0E29;THAI CHARACTER SO RUSI;Lo;0;L;;;;;N;THAI LETTER SO RUSI;;;;
+0E2A;THAI CHARACTER SO SUA;Lo;0;L;;;;;N;THAI LETTER SO SUA;;;;
+0E2B;THAI CHARACTER HO HIP;Lo;0;L;;;;;N;THAI LETTER HO HIP;;;;
+0E2C;THAI CHARACTER LO CHULA;Lo;0;L;;;;;N;THAI LETTER LO CHULA;;;;
+0E2D;THAI CHARACTER O ANG;Lo;0;L;;;;;N;THAI LETTER O ANG;;;;
+0E2E;THAI CHARACTER HO NOKHUK;Lo;0;L;;;;;N;THAI LETTER HO NOK HUK;;;;
+0E2F;THAI CHARACTER PAIYANNOI;Lo;0;L;;;;;N;THAI PAI YAN NOI;paiyan noi;;;
+0E30;THAI CHARACTER SARA A;Lo;0;L;;;;;N;THAI VOWEL SIGN SARA A;;;;
+0E31;THAI CHARACTER MAI HAN-AKAT;Mn;0;NSM;;;;;N;THAI VOWEL SIGN MAI HAN-AKAT;;;;
+0E32;THAI CHARACTER SARA AA;Lo;0;L;;;;;N;THAI VOWEL SIGN SARA AA;;;;
+0E33;THAI CHARACTER SARA AM;Lo;0;L;<compat> 0E4D 0E32;;;;N;THAI VOWEL SIGN SARA AM;;;;
+0E34;THAI CHARACTER SARA I;Mn;0;NSM;;;;;N;THAI VOWEL SIGN SARA I;;;;
+0E35;THAI CHARACTER SARA II;Mn;0;NSM;;;;;N;THAI VOWEL SIGN SARA II;;;;
+0E36;THAI CHARACTER SARA UE;Mn;0;NSM;;;;;N;THAI VOWEL SIGN SARA UE;;;;
+0E37;THAI CHARACTER SARA UEE;Mn;0;NSM;;;;;N;THAI VOWEL SIGN SARA UEE;sara uue;;;
+0E38;THAI CHARACTER SARA U;Mn;103;NSM;;;;;N;THAI VOWEL SIGN SARA U;;;;
+0E39;THAI CHARACTER SARA UU;Mn;103;NSM;;;;;N;THAI VOWEL SIGN SARA UU;;;;
+0E3A;THAI CHARACTER PHINTHU;Mn;9;NSM;;;;;N;THAI VOWEL SIGN PHINTHU;;;;
+0E3F;THAI CURRENCY SYMBOL BAHT;Sc;0;ET;;;;;N;THAI BAHT SIGN;;;;
+0E40;THAI CHARACTER SARA E;Lo;0;L;;;;;N;THAI VOWEL SIGN SARA E;;;;
+0E41;THAI CHARACTER SARA AE;Lo;0;L;;;;;N;THAI VOWEL SIGN SARA AE;;;;
+0E42;THAI CHARACTER SARA O;Lo;0;L;;;;;N;THAI VOWEL SIGN SARA O;;;;
+0E43;THAI CHARACTER SARA AI MAIMUAN;Lo;0;L;;;;;N;THAI VOWEL SIGN SARA MAI MUAN;sara ai mai muan;;;
+0E44;THAI CHARACTER SARA AI MAIMALAI;Lo;0;L;;;;;N;THAI VOWEL SIGN SARA MAI MALAI;sara ai mai malai;;;
+0E45;THAI CHARACTER LAKKHANGYAO;Lo;0;L;;;;;N;THAI LAK KHANG YAO;lakkhang yao;;;
+0E46;THAI CHARACTER MAIYAMOK;Lm;0;L;;;;;N;THAI MAI YAMOK;mai yamok;;;
+0E47;THAI CHARACTER MAITAIKHU;Mn;0;NSM;;;;;N;THAI VOWEL SIGN MAI TAI KHU;mai taikhu;;;
+0E48;THAI CHARACTER MAI EK;Mn;107;NSM;;;;;N;THAI TONE MAI EK;;;;
+0E49;THAI CHARACTER MAI THO;Mn;107;NSM;;;;;N;THAI TONE MAI THO;;;;
+0E4A;THAI CHARACTER MAI TRI;Mn;107;NSM;;;;;N;THAI TONE MAI TRI;;;;
+0E4B;THAI CHARACTER MAI CHATTAWA;Mn;107;NSM;;;;;N;THAI TONE MAI CHATTAWA;;;;
+0E4C;THAI CHARACTER THANTHAKHAT;Mn;0;NSM;;;;;N;THAI THANTHAKHAT;;;;
+0E4D;THAI CHARACTER NIKHAHIT;Mn;0;NSM;;;;;N;THAI NIKKHAHIT;nikkhahit;;;
+0E4E;THAI CHARACTER YAMAKKAN;Mn;0;NSM;;;;;N;THAI YAMAKKAN;;;;
+0E4F;THAI CHARACTER FONGMAN;Po;0;L;;;;;N;THAI FONGMAN;;;;
+0E50;THAI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+0E51;THAI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+0E52;THAI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+0E53;THAI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+0E54;THAI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+0E55;THAI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+0E56;THAI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+0E57;THAI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+0E58;THAI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+0E59;THAI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+0E5A;THAI CHARACTER ANGKHANKHU;Po;0;L;;;;;N;THAI ANGKHANKHU;;;;
+0E5B;THAI CHARACTER KHOMUT;Po;0;L;;;;;N;THAI KHOMUT;;;;
+0E81;LAO LETTER KO;Lo;0;L;;;;;N;;;;;
+0E82;LAO LETTER KHO SUNG;Lo;0;L;;;;;N;;;;;
+0E84;LAO LETTER KHO TAM;Lo;0;L;;;;;N;;;;;
+0E87;LAO LETTER NGO;Lo;0;L;;;;;N;;;;;
+0E88;LAO LETTER CO;Lo;0;L;;;;;N;;;;;
+0E8A;LAO LETTER SO TAM;Lo;0;L;;;;;N;;;;;
+0E8D;LAO LETTER NYO;Lo;0;L;;;;;N;;;;;
+0E94;LAO LETTER DO;Lo;0;L;;;;;N;;;;;
+0E95;LAO LETTER TO;Lo;0;L;;;;;N;;;;;
+0E96;LAO LETTER THO SUNG;Lo;0;L;;;;;N;;;;;
+0E97;LAO LETTER THO TAM;Lo;0;L;;;;;N;;;;;
+0E99;LAO LETTER NO;Lo;0;L;;;;;N;;;;;
+0E9A;LAO LETTER BO;Lo;0;L;;;;;N;;;;;
+0E9B;LAO LETTER PO;Lo;0;L;;;;;N;;;;;
+0E9C;LAO LETTER PHO SUNG;Lo;0;L;;;;;N;;;;;
+0E9D;LAO LETTER FO TAM;Lo;0;L;;;;;N;;;;;
+0E9E;LAO LETTER PHO TAM;Lo;0;L;;;;;N;;;;;
+0E9F;LAO LETTER FO SUNG;Lo;0;L;;;;;N;;;;;
+0EA1;LAO LETTER MO;Lo;0;L;;;;;N;;;;;
+0EA2;LAO LETTER YO;Lo;0;L;;;;;N;;;;;
+0EA3;LAO LETTER LO LING;Lo;0;L;;;;;N;;;;;
+0EA5;LAO LETTER LO LOOT;Lo;0;L;;;;;N;;;;;
+0EA7;LAO LETTER WO;Lo;0;L;;;;;N;;;;;
+0EAA;LAO LETTER SO SUNG;Lo;0;L;;;;;N;;;;;
+0EAB;LAO LETTER HO SUNG;Lo;0;L;;;;;N;;;;;
+0EAD;LAO LETTER O;Lo;0;L;;;;;N;;;;;
+0EAE;LAO LETTER HO TAM;Lo;0;L;;;;;N;;;;;
+0EAF;LAO ELLIPSIS;Lo;0;L;;;;;N;;;;;
+0EB0;LAO VOWEL SIGN A;Lo;0;L;;;;;N;;;;;
+0EB1;LAO VOWEL SIGN MAI KAN;Mn;0;NSM;;;;;N;;;;;
+0EB2;LAO VOWEL SIGN AA;Lo;0;L;;;;;N;;;;;
+0EB3;LAO VOWEL SIGN AM;Lo;0;L;<compat> 0ECD 0EB2;;;;N;;;;;
+0EB4;LAO VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;;
+0EB5;LAO VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;;
+0EB6;LAO VOWEL SIGN Y;Mn;0;NSM;;;;;N;;;;;
+0EB7;LAO VOWEL SIGN YY;Mn;0;NSM;;;;;N;;;;;
+0EB8;LAO VOWEL SIGN U;Mn;118;NSM;;;;;N;;;;;
+0EB9;LAO VOWEL SIGN UU;Mn;118;NSM;;;;;N;;;;;
+0EBB;LAO VOWEL SIGN MAI KON;Mn;0;NSM;;;;;N;;;;;
+0EBC;LAO SEMIVOWEL SIGN LO;Mn;0;NSM;;;;;N;;;;;
+0EBD;LAO SEMIVOWEL SIGN NYO;Lo;0;L;;;;;N;;;;;
+0EC0;LAO VOWEL SIGN E;Lo;0;L;;;;;N;;;;;
+0EC1;LAO VOWEL SIGN EI;Lo;0;L;;;;;N;;;;;
+0EC2;LAO VOWEL SIGN O;Lo;0;L;;;;;N;;;;;
+0EC3;LAO VOWEL SIGN AY;Lo;0;L;;;;;N;;;;;
+0EC4;LAO VOWEL SIGN AI;Lo;0;L;;;;;N;;;;;
+0EC6;LAO KO LA;Lm;0;L;;;;;N;;;;;
+0EC8;LAO TONE MAI EK;Mn;122;NSM;;;;;N;;;;;
+0EC9;LAO TONE MAI THO;Mn;122;NSM;;;;;N;;;;;
+0ECA;LAO TONE MAI TI;Mn;122;NSM;;;;;N;;;;;
+0ECB;LAO TONE MAI CATAWA;Mn;122;NSM;;;;;N;;;;;
+0ECC;LAO CANCELLATION MARK;Mn;0;NSM;;;;;N;;;;;
+0ECD;LAO NIGGAHITA;Mn;0;NSM;;;;;N;;;;;
+0ED0;LAO DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+0ED1;LAO DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+0ED2;LAO DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+0ED3;LAO DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+0ED4;LAO DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+0ED5;LAO DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+0ED6;LAO DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+0ED7;LAO DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+0ED8;LAO DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+0ED9;LAO DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+0EDC;LAO HO NO;Lo;0;L;<compat> 0EAB 0E99;;;;N;;;;;
+0EDD;LAO HO MO;Lo;0;L;<compat> 0EAB 0EA1;;;;N;;;;;
+0F00;TIBETAN SYLLABLE OM;Lo;0;L;;;;;N;;;;;
+0F01;TIBETAN MARK GTER YIG MGO TRUNCATED A;So;0;L;;;;;N;;ter yik go a thung;;;
+0F02;TIBETAN MARK GTER YIG MGO -UM RNAM BCAD MA;So;0;L;;;;;N;;ter yik go wum nam chey ma;;;
+0F03;TIBETAN MARK GTER YIG MGO -UM GTER TSHEG MA;So;0;L;;;;;N;;ter yik go wum ter tsek ma;;;
+0F04;TIBETAN MARK INITIAL YIG MGO MDUN MA;Po;0;L;;;;;N;TIBETAN SINGLE ORNAMENT;yik go dun ma;;;
+0F05;TIBETAN MARK CLOSING YIG MGO SGAB MA;Po;0;L;;;;;N;;yik go kab ma;;;
+0F06;TIBETAN MARK CARET YIG MGO PHUR SHAD MA;Po;0;L;;;;;N;;yik go pur shey ma;;;
+0F07;TIBETAN MARK YIG MGO TSHEG SHAD MA;Po;0;L;;;;;N;;yik go tsek shey ma;;;
+0F08;TIBETAN MARK SBRUL SHAD;Po;0;L;;;;;N;TIBETAN RGYANSHAD;drul shey;;;
+0F09;TIBETAN MARK BSKUR YIG MGO;Po;0;L;;;;;N;;kur yik go;;;
+0F0A;TIBETAN MARK BKA- SHOG YIG MGO;Po;0;L;;;;;N;;ka sho yik go;;;
+0F0B;TIBETAN MARK INTERSYLLABIC TSHEG;Po;0;L;;;;;N;TIBETAN TSEG;tsek;;;
+0F0C;TIBETAN MARK DELIMITER TSHEG BSTAR;Po;0;L;<noBreak> 0F0B;;;;N;;tsek tar;;;
+0F0D;TIBETAN MARK SHAD;Po;0;L;;;;;N;TIBETAN SHAD;shey;;;
+0F0E;TIBETAN MARK NYIS SHAD;Po;0;L;;;;;N;TIBETAN DOUBLE SHAD;nyi shey;;;
+0F0F;TIBETAN MARK TSHEG SHAD;Po;0;L;;;;;N;;tsek shey;;;
+0F10;TIBETAN MARK NYIS TSHEG SHAD;Po;0;L;;;;;N;;nyi tsek shey;;;
+0F11;TIBETAN MARK RIN CHEN SPUNGS SHAD;Po;0;L;;;;;N;TIBETAN RINCHANPHUNGSHAD;rinchen pung shey;;;
+0F12;TIBETAN MARK RGYA GRAM SHAD;Po;0;L;;;;;N;;gya tram shey;;;
+0F13;TIBETAN MARK CARET -DZUD RTAGS ME LONG CAN;So;0;L;;;;;N;;dzu ta me long chen;;;
+0F14;TIBETAN MARK GTER TSHEG;So;0;L;;;;;N;TIBETAN COMMA;ter tsek;;;
+0F15;TIBETAN LOGOTYPE SIGN CHAD RTAGS;So;0;L;;;;;N;;che ta;;;
+0F16;TIBETAN LOGOTYPE SIGN LHAG RTAGS;So;0;L;;;;;N;;hlak ta;;;
+0F17;TIBETAN ASTROLOGICAL SIGN SGRA GCAN -CHAR RTAGS;So;0;L;;;;;N;;trachen char ta;;;
+0F18;TIBETAN ASTROLOGICAL SIGN -KHYUD PA;Mn;220;NSM;;;;;N;;kyu pa;;;
+0F19;TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS;Mn;220;NSM;;;;;N;;dong tsu;;;
+0F1A;TIBETAN SIGN RDEL DKAR GCIG;So;0;L;;;;;N;;deka chig;;;
+0F1B;TIBETAN SIGN RDEL DKAR GNYIS;So;0;L;;;;;N;;deka nyi;;;
+0F1C;TIBETAN SIGN RDEL DKAR GSUM;So;0;L;;;;;N;;deka sum;;;
+0F1D;TIBETAN SIGN RDEL NAG GCIG;So;0;L;;;;;N;;dena chig;;;
+0F1E;TIBETAN SIGN RDEL NAG GNYIS;So;0;L;;;;;N;;dena nyi;;;
+0F1F;TIBETAN SIGN RDEL DKAR RDEL NAG;So;0;L;;;;;N;;deka dena;;;
+0F20;TIBETAN DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+0F21;TIBETAN DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+0F22;TIBETAN DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+0F23;TIBETAN DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+0F24;TIBETAN DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+0F25;TIBETAN DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+0F26;TIBETAN DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+0F27;TIBETAN DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+0F28;TIBETAN DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+0F29;TIBETAN DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+0F2A;TIBETAN DIGIT HALF ONE;No;0;L;;;;1/2;N;;;;;
+0F2B;TIBETAN DIGIT HALF TWO;No;0;L;;;;3/2;N;;;;;
+0F2C;TIBETAN DIGIT HALF THREE;No;0;L;;;;5/2;N;;;;;
+0F2D;TIBETAN DIGIT HALF FOUR;No;0;L;;;;7/2;N;;;;;
+0F2E;TIBETAN DIGIT HALF FIVE;No;0;L;;;;9/2;N;;;;;
+0F2F;TIBETAN DIGIT HALF SIX;No;0;L;;;;11/2;N;;;;;
+0F30;TIBETAN DIGIT HALF SEVEN;No;0;L;;;;13/2;N;;;;;
+0F31;TIBETAN DIGIT HALF EIGHT;No;0;L;;;;15/2;N;;;;;
+0F32;TIBETAN DIGIT HALF NINE;No;0;L;;;;17/2;N;;;;;
+0F33;TIBETAN DIGIT HALF ZERO;No;0;L;;;;-1/2;N;;;;;
+0F34;TIBETAN MARK BSDUS RTAGS;So;0;L;;;;;N;;du ta;;;
+0F35;TIBETAN MARK NGAS BZUNG NYI ZLA;Mn;220;NSM;;;;;N;TIBETAN HONORIFIC UNDER RING;nge zung nyi da;;;
+0F36;TIBETAN MARK CARET -DZUD RTAGS BZHI MIG CAN;So;0;L;;;;;N;;dzu ta shi mig chen;;;
+0F37;TIBETAN MARK NGAS BZUNG SGOR RTAGS;Mn;220;NSM;;;;;N;TIBETAN UNDER RING;nge zung gor ta;;;
+0F38;TIBETAN MARK CHE MGO;So;0;L;;;;;N;;che go;;;
+0F39;TIBETAN MARK TSA -PHRU;Mn;216;NSM;;;;;N;TIBETAN LENITION MARK;tsa tru;;;
+0F3A;TIBETAN MARK GUG RTAGS GYON;Ps;0;ON;;;;;N;;gug ta yun;;;
+0F3B;TIBETAN MARK GUG RTAGS GYAS;Pe;0;ON;;;;;N;;gug ta ye;;;
+0F3C;TIBETAN MARK ANG KHANG GYON;Ps;0;ON;;;;;N;TIBETAN LEFT BRACE;ang kang yun;;;
+0F3D;TIBETAN MARK ANG KHANG GYAS;Pe;0;ON;;;;;N;TIBETAN RIGHT BRACE;ang kang ye;;;
+0F3E;TIBETAN SIGN YAR TSHES;Mc;0;L;;;;;N;;yar tse;;;
+0F3F;TIBETAN SIGN MAR TSHES;Mc;0;L;;;;;N;;mar tse;;;
+0F40;TIBETAN LETTER KA;Lo;0;L;;;;;N;;;;;
+0F41;TIBETAN LETTER KHA;Lo;0;L;;;;;N;;;;;
+0F42;TIBETAN LETTER GA;Lo;0;L;;;;;N;;;;;
+0F43;TIBETAN LETTER GHA;Lo;0;L;0F42 0FB7;;;;N;;;;;
+0F44;TIBETAN LETTER NGA;Lo;0;L;;;;;N;;;;;
+0F45;TIBETAN LETTER CA;Lo;0;L;;;;;N;;;;;
+0F46;TIBETAN LETTER CHA;Lo;0;L;;;;;N;;;;;
+0F47;TIBETAN LETTER JA;Lo;0;L;;;;;N;;;;;
+0F49;TIBETAN LETTER NYA;Lo;0;L;;;;;N;;;;;
+0F4A;TIBETAN LETTER TTA;Lo;0;L;;;;;N;TIBETAN LETTER REVERSED TA;;;;
+0F4B;TIBETAN LETTER TTHA;Lo;0;L;;;;;N;TIBETAN LETTER REVERSED THA;;;;
+0F4C;TIBETAN LETTER DDA;Lo;0;L;;;;;N;TIBETAN LETTER REVERSED DA;;;;
+0F4D;TIBETAN LETTER DDHA;Lo;0;L;0F4C 0FB7;;;;N;;;;;
+0F4E;TIBETAN LETTER NNA;Lo;0;L;;;;;N;TIBETAN LETTER REVERSED NA;;;;
+0F4F;TIBETAN LETTER TA;Lo;0;L;;;;;N;;;;;
+0F50;TIBETAN LETTER THA;Lo;0;L;;;;;N;;;;;
+0F51;TIBETAN LETTER DA;Lo;0;L;;;;;N;;;;;
+0F52;TIBETAN LETTER DHA;Lo;0;L;0F51 0FB7;;;;N;;;;;
+0F53;TIBETAN LETTER NA;Lo;0;L;;;;;N;;;;;
+0F54;TIBETAN LETTER PA;Lo;0;L;;;;;N;;;;;
+0F55;TIBETAN LETTER PHA;Lo;0;L;;;;;N;;;;;
+0F56;TIBETAN LETTER BA;Lo;0;L;;;;;N;;;;;
+0F57;TIBETAN LETTER BHA;Lo;0;L;0F56 0FB7;;;;N;;;;;
+0F58;TIBETAN LETTER MA;Lo;0;L;;;;;N;;;;;
+0F59;TIBETAN LETTER TSA;Lo;0;L;;;;;N;;;;;
+0F5A;TIBETAN LETTER TSHA;Lo;0;L;;;;;N;;;;;
+0F5B;TIBETAN LETTER DZA;Lo;0;L;;;;;N;;;;;
+0F5C;TIBETAN LETTER DZHA;Lo;0;L;0F5B 0FB7;;;;N;;;;;
+0F5D;TIBETAN LETTER WA;Lo;0;L;;;;;N;;;;;
+0F5E;TIBETAN LETTER ZHA;Lo;0;L;;;;;N;;;;;
+0F5F;TIBETAN LETTER ZA;Lo;0;L;;;;;N;;;;;
+0F60;TIBETAN LETTER -A;Lo;0;L;;;;;N;TIBETAN LETTER AA;;;;
+0F61;TIBETAN LETTER YA;Lo;0;L;;;;;N;;;;;
+0F62;TIBETAN LETTER RA;Lo;0;L;;;;;N;;*;;;
+0F63;TIBETAN LETTER LA;Lo;0;L;;;;;N;;;;;
+0F64;TIBETAN LETTER SHA;Lo;0;L;;;;;N;;;;;
+0F65;TIBETAN LETTER SSA;Lo;0;L;;;;;N;TIBETAN LETTER REVERSED SHA;;;;
+0F66;TIBETAN LETTER SA;Lo;0;L;;;;;N;;;;;
+0F67;TIBETAN LETTER HA;Lo;0;L;;;;;N;;;;;
+0F68;TIBETAN LETTER A;Lo;0;L;;;;;N;;;;;
+0F69;TIBETAN LETTER KSSA;Lo;0;L;0F40 0FB5;;;;N;;;;;
+0F6A;TIBETAN LETTER FIXED-FORM RA;Lo;0;L;;;;;N;;*;;;
+0F71;TIBETAN VOWEL SIGN AA;Mn;129;NSM;;;;;N;;;;;
+0F72;TIBETAN VOWEL SIGN I;Mn;130;NSM;;;;;N;;;;;
+0F73;TIBETAN VOWEL SIGN II;Mn;0;NSM;0F71 0F72;;;;N;;;;;
+0F74;TIBETAN VOWEL SIGN U;Mn;132;NSM;;;;;N;;;;;
+0F75;TIBETAN VOWEL SIGN UU;Mn;0;NSM;0F71 0F74;;;;N;;;;;
+0F76;TIBETAN VOWEL SIGN VOCALIC R;Mn;0;NSM;0FB2 0F80;;;;N;;;;;
+0F77;TIBETAN VOWEL SIGN VOCALIC RR;Mn;0;NSM;<compat> 0FB2 0F81;;;;N;;;;;
+0F78;TIBETAN VOWEL SIGN VOCALIC L;Mn;0;NSM;0FB3 0F80;;;;N;;;;;
+0F79;TIBETAN VOWEL SIGN VOCALIC LL;Mn;0;NSM;<compat> 0FB3 0F81;;;;N;;;;;
+0F7A;TIBETAN VOWEL SIGN E;Mn;130;NSM;;;;;N;;;;;
+0F7B;TIBETAN VOWEL SIGN EE;Mn;130;NSM;;;;;N;TIBETAN VOWEL SIGN AI;;;;
+0F7C;TIBETAN VOWEL SIGN O;Mn;130;NSM;;;;;N;;;;;
+0F7D;TIBETAN VOWEL SIGN OO;Mn;130;NSM;;;;;N;TIBETAN VOWEL SIGN AU;;;;
+0F7E;TIBETAN SIGN RJES SU NGA RO;Mn;0;NSM;;;;;N;TIBETAN ANUSVARA;je su nga ro;;;
+0F7F;TIBETAN SIGN RNAM BCAD;Mc;0;L;;;;;N;TIBETAN VISARGA;nam chey;;;
+0F80;TIBETAN VOWEL SIGN REVERSED I;Mn;130;NSM;;;;;N;TIBETAN VOWEL SIGN SHORT I;;;;
+0F81;TIBETAN VOWEL SIGN REVERSED II;Mn;0;NSM;0F71 0F80;;;;N;;;;;
+0F82;TIBETAN SIGN NYI ZLA NAA DA;Mn;230;NSM;;;;;N;TIBETAN CANDRABINDU WITH ORNAMENT;nyi da na da;;;
+0F83;TIBETAN SIGN SNA LDAN;Mn;230;NSM;;;;;N;TIBETAN CANDRABINDU;nan de;;;
+0F84;TIBETAN MARK HALANTA;Mn;9;NSM;;;;;N;TIBETAN VIRAMA;;;;
+0F85;TIBETAN MARK PALUTA;Po;0;L;;;;;N;TIBETAN CHUCHENYIGE;;;;
+0F86;TIBETAN SIGN LCI RTAGS;Mn;230;NSM;;;;;N;;ji ta;;;
+0F87;TIBETAN SIGN YANG RTAGS;Mn;230;NSM;;;;;N;;yang ta;;;
+0F88;TIBETAN SIGN LCE TSA CAN;Lo;0;L;;;;;N;;che tsa chen;;;
+0F89;TIBETAN SIGN MCHU CAN;Lo;0;L;;;;;N;;chu chen;;;
+0F8A;TIBETAN SIGN GRU CAN RGYINGS;Lo;0;L;;;;;N;;tru chen ging;;;
+0F8B;TIBETAN SIGN GRU MED RGYINGS;Lo;0;L;;;;;N;;tru me ging;;;
+0F90;TIBETAN SUBJOINED LETTER KA;Mn;0;NSM;;;;;N;;;;;
+0F91;TIBETAN SUBJOINED LETTER KHA;Mn;0;NSM;;;;;N;;;;;
+0F92;TIBETAN SUBJOINED LETTER GA;Mn;0;NSM;;;;;N;;;;;
+0F93;TIBETAN SUBJOINED LETTER GHA;Mn;0;NSM;0F92 0FB7;;;;N;;;;;
+0F94;TIBETAN SUBJOINED LETTER NGA;Mn;0;NSM;;;;;N;;;;;
+0F95;TIBETAN SUBJOINED LETTER CA;Mn;0;NSM;;;;;N;;;;;
+0F96;TIBETAN SUBJOINED LETTER CHA;Mn;0;NSM;;;;;N;;;;;
+0F97;TIBETAN SUBJOINED LETTER JA;Mn;0;NSM;;;;;N;;;;;
+0F99;TIBETAN SUBJOINED LETTER NYA;Mn;0;NSM;;;;;N;;;;;
+0F9A;TIBETAN SUBJOINED LETTER TTA;Mn;0;NSM;;;;;N;;;;;
+0F9B;TIBETAN SUBJOINED LETTER TTHA;Mn;0;NSM;;;;;N;;;;;
+0F9C;TIBETAN SUBJOINED LETTER DDA;Mn;0;NSM;;;;;N;;;;;
+0F9D;TIBETAN SUBJOINED LETTER DDHA;Mn;0;NSM;0F9C 0FB7;;;;N;;;;;
+0F9E;TIBETAN SUBJOINED LETTER NNA;Mn;0;NSM;;;;;N;;;;;
+0F9F;TIBETAN SUBJOINED LETTER TA;Mn;0;NSM;;;;;N;;;;;
+0FA0;TIBETAN SUBJOINED LETTER THA;Mn;0;NSM;;;;;N;;;;;
+0FA1;TIBETAN SUBJOINED LETTER DA;Mn;0;NSM;;;;;N;;;;;
+0FA2;TIBETAN SUBJOINED LETTER DHA;Mn;0;NSM;0FA1 0FB7;;;;N;;;;;
+0FA3;TIBETAN SUBJOINED LETTER NA;Mn;0;NSM;;;;;N;;;;;
+0FA4;TIBETAN SUBJOINED LETTER PA;Mn;0;NSM;;;;;N;;;;;
+0FA5;TIBETAN SUBJOINED LETTER PHA;Mn;0;NSM;;;;;N;;;;;
+0FA6;TIBETAN SUBJOINED LETTER BA;Mn;0;NSM;;;;;N;;;;;
+0FA7;TIBETAN SUBJOINED LETTER BHA;Mn;0;NSM;0FA6 0FB7;;;;N;;;;;
+0FA8;TIBETAN SUBJOINED LETTER MA;Mn;0;NSM;;;;;N;;;;;
+0FA9;TIBETAN SUBJOINED LETTER TSA;Mn;0;NSM;;;;;N;;;;;
+0FAA;TIBETAN SUBJOINED LETTER TSHA;Mn;0;NSM;;;;;N;;;;;
+0FAB;TIBETAN SUBJOINED LETTER DZA;Mn;0;NSM;;;;;N;;;;;
+0FAC;TIBETAN SUBJOINED LETTER DZHA;Mn;0;NSM;0FAB 0FB7;;;;N;;;;;
+0FAD;TIBETAN SUBJOINED LETTER WA;Mn;0;NSM;;;;;N;;*;;;
+0FAE;TIBETAN SUBJOINED LETTER ZHA;Mn;0;NSM;;;;;N;;;;;
+0FAF;TIBETAN SUBJOINED LETTER ZA;Mn;0;NSM;;;;;N;;;;;
+0FB0;TIBETAN SUBJOINED LETTER -A;Mn;0;NSM;;;;;N;;;;;
+0FB1;TIBETAN SUBJOINED LETTER YA;Mn;0;NSM;;;;;N;;*;;;
+0FB2;TIBETAN SUBJOINED LETTER RA;Mn;0;NSM;;;;;N;;*;;;
+0FB3;TIBETAN SUBJOINED LETTER LA;Mn;0;NSM;;;;;N;;;;;
+0FB4;TIBETAN SUBJOINED LETTER SHA;Mn;0;NSM;;;;;N;;;;;
+0FB5;TIBETAN SUBJOINED LETTER SSA;Mn;0;NSM;;;;;N;;;;;
+0FB6;TIBETAN SUBJOINED LETTER SA;Mn;0;NSM;;;;;N;;;;;
+0FB7;TIBETAN SUBJOINED LETTER HA;Mn;0;NSM;;;;;N;;;;;
+0FB8;TIBETAN SUBJOINED LETTER A;Mn;0;NSM;;;;;N;;;;;
+0FB9;TIBETAN SUBJOINED LETTER KSSA;Mn;0;NSM;0F90 0FB5;;;;N;;;;;
+0FBA;TIBETAN SUBJOINED LETTER FIXED-FORM WA;Mn;0;NSM;;;;;N;;*;;;
+0FBB;TIBETAN SUBJOINED LETTER FIXED-FORM YA;Mn;0;NSM;;;;;N;;*;;;
+0FBC;TIBETAN SUBJOINED LETTER FIXED-FORM RA;Mn;0;NSM;;;;;N;;*;;;
+0FBE;TIBETAN KU RU KHA;So;0;L;;;;;N;;kuruka;;;
+0FBF;TIBETAN KU RU KHA BZHI MIG CAN;So;0;L;;;;;N;;kuruka shi mik chen;;;
+0FC0;TIBETAN CANTILLATION SIGN HEAVY BEAT;So;0;L;;;;;N;;;;;
+0FC1;TIBETAN CANTILLATION SIGN LIGHT BEAT;So;0;L;;;;;N;;;;;
+0FC2;TIBETAN CANTILLATION SIGN CANG TE-U;So;0;L;;;;;N;;chang tyu;;;
+0FC3;TIBETAN CANTILLATION SIGN SBUB -CHAL;So;0;L;;;;;N;;bub chey;;;
+0FC4;TIBETAN SYMBOL DRIL BU;So;0;L;;;;;N;;drilbu;;;
+0FC5;TIBETAN SYMBOL RDO RJE;So;0;L;;;;;N;;dorje;;;
+0FC6;TIBETAN SYMBOL PADMA GDAN;Mn;220;NSM;;;;;N;;pema den;;;
+0FC7;TIBETAN SYMBOL RDO RJE RGYA GRAM;So;0;L;;;;;N;;dorje gya dram;;;
+0FC8;TIBETAN SYMBOL PHUR PA;So;0;L;;;;;N;;phurba;;;
+0FC9;TIBETAN SYMBOL NOR BU;So;0;L;;;;;N;;norbu;;;
+0FCA;TIBETAN SYMBOL NOR BU NYIS -KHYIL;So;0;L;;;;;N;;norbu nyi khyi;;;
+0FCB;TIBETAN SYMBOL NOR BU GSUM -KHYIL;So;0;L;;;;;N;;norbu sum khyi;;;
+0FCC;TIBETAN SYMBOL NOR BU BZHI -KHYIL;So;0;L;;;;;N;;norbu shi khyi;;;
+0FCF;TIBETAN SIGN RDEL NAG GSUM;So;0;L;;;;;N;;dena sum;;;
+1000;MYANMAR LETTER KA;Lo;0;L;;;;;N;;;;;
+1001;MYANMAR LETTER KHA;Lo;0;L;;;;;N;;;;;
+1002;MYANMAR LETTER GA;Lo;0;L;;;;;N;;;;;
+1003;MYANMAR LETTER GHA;Lo;0;L;;;;;N;;;;;
+1004;MYANMAR LETTER NGA;Lo;0;L;;;;;N;;;;;
+1005;MYANMAR LETTER CA;Lo;0;L;;;;;N;;;;;
+1006;MYANMAR LETTER CHA;Lo;0;L;;;;;N;;;;;
+1007;MYANMAR LETTER JA;Lo;0;L;;;;;N;;;;;
+1008;MYANMAR LETTER JHA;Lo;0;L;;;;;N;;;;;
+1009;MYANMAR LETTER NYA;Lo;0;L;;;;;N;;;;;
+100A;MYANMAR LETTER NNYA;Lo;0;L;;;;;N;;;;;
+100B;MYANMAR LETTER TTA;Lo;0;L;;;;;N;;;;;
+100C;MYANMAR LETTER TTHA;Lo;0;L;;;;;N;;;;;
+100D;MYANMAR LETTER DDA;Lo;0;L;;;;;N;;;;;
+100E;MYANMAR LETTER DDHA;Lo;0;L;;;;;N;;;;;
+100F;MYANMAR LETTER NNA;Lo;0;L;;;;;N;;;;;
+1010;MYANMAR LETTER TA;Lo;0;L;;;;;N;;;;;
+1011;MYANMAR LETTER THA;Lo;0;L;;;;;N;;;;;
+1012;MYANMAR LETTER DA;Lo;0;L;;;;;N;;;;;
+1013;MYANMAR LETTER DHA;Lo;0;L;;;;;N;;;;;
+1014;MYANMAR LETTER NA;Lo;0;L;;;;;N;;;;;
+1015;MYANMAR LETTER PA;Lo;0;L;;;;;N;;;;;
+1016;MYANMAR LETTER PHA;Lo;0;L;;;;;N;;;;;
+1017;MYANMAR LETTER BA;Lo;0;L;;;;;N;;;;;
+1018;MYANMAR LETTER BHA;Lo;0;L;;;;;N;;;;;
+1019;MYANMAR LETTER MA;Lo;0;L;;;;;N;;;;;
+101A;MYANMAR LETTER YA;Lo;0;L;;;;;N;;;;;
+101B;MYANMAR LETTER RA;Lo;0;L;;;;;N;;;;;
+101C;MYANMAR LETTER LA;Lo;0;L;;;;;N;;;;;
+101D;MYANMAR LETTER WA;Lo;0;L;;;;;N;;;;;
+101E;MYANMAR LETTER SA;Lo;0;L;;;;;N;;;;;
+101F;MYANMAR LETTER HA;Lo;0;L;;;;;N;;;;;
+1020;MYANMAR LETTER LLA;Lo;0;L;;;;;N;;;;;
+1021;MYANMAR LETTER A;Lo;0;L;;;;;N;;;;;
+1023;MYANMAR LETTER I;Lo;0;L;;;;;N;;;;;
+1024;MYANMAR LETTER II;Lo;0;L;;;;;N;;;;;
+1025;MYANMAR LETTER U;Lo;0;L;;;;;N;;;;;
+1026;MYANMAR LETTER UU;Lo;0;L;1025 102E;;;;N;;;;;
+1027;MYANMAR LETTER E;Lo;0;L;;;;;N;;;;;
+1029;MYANMAR LETTER O;Lo;0;L;;;;;N;;;;;
+102A;MYANMAR LETTER AU;Lo;0;L;;;;;N;;;;;
+102C;MYANMAR VOWEL SIGN AA;Mc;0;L;;;;;N;;;;;
+102D;MYANMAR VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;;
+102E;MYANMAR VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;;
+102F;MYANMAR VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;;
+1030;MYANMAR VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;;
+1031;MYANMAR VOWEL SIGN E;Mc;0;L;;;;;N;;;;;
+1032;MYANMAR VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;;
+1036;MYANMAR SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;;
+1037;MYANMAR SIGN DOT BELOW;Mn;7;NSM;;;;;N;;;;;
+1038;MYANMAR SIGN VISARGA;Mc;0;L;;;;;N;;;;;
+1039;MYANMAR SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;;
+1040;MYANMAR DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+1041;MYANMAR DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+1042;MYANMAR DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+1043;MYANMAR DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+1044;MYANMAR DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+1045;MYANMAR DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+1046;MYANMAR DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+1047;MYANMAR DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+1048;MYANMAR DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+1049;MYANMAR DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+104A;MYANMAR SIGN LITTLE SECTION;Po;0;L;;;;;N;;;;;
+104B;MYANMAR SIGN SECTION;Po;0;L;;;;;N;;;;;
+104C;MYANMAR SYMBOL LOCATIVE;Po;0;L;;;;;N;;;;;
+104D;MYANMAR SYMBOL COMPLETED;Po;0;L;;;;;N;;;;;
+104E;MYANMAR SYMBOL AFOREMENTIONED;Po;0;L;;;;;N;;;;;
+104F;MYANMAR SYMBOL GENITIVE;Po;0;L;;;;;N;;;;;
+1050;MYANMAR LETTER SHA;Lo;0;L;;;;;N;;;;;
+1051;MYANMAR LETTER SSA;Lo;0;L;;;;;N;;;;;
+1052;MYANMAR LETTER VOCALIC R;Lo;0;L;;;;;N;;;;;
+1053;MYANMAR LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;;
+1054;MYANMAR LETTER VOCALIC L;Lo;0;L;;;;;N;;;;;
+1055;MYANMAR LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;;
+1056;MYANMAR VOWEL SIGN VOCALIC R;Mc;0;L;;;;;N;;;;;
+1057;MYANMAR VOWEL SIGN VOCALIC RR;Mc;0;L;;;;;N;;;;;
+1058;MYANMAR VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;;
+1059;MYANMAR VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;;
+10A0;GEORGIAN CAPITAL LETTER AN;Lu;0;L;;;;;N;;Khutsuri;;;
+10A1;GEORGIAN CAPITAL LETTER BAN;Lu;0;L;;;;;N;;Khutsuri;;;
+10A2;GEORGIAN CAPITAL LETTER GAN;Lu;0;L;;;;;N;;Khutsuri;;;
+10A3;GEORGIAN CAPITAL LETTER DON;Lu;0;L;;;;;N;;Khutsuri;;;
+10A4;GEORGIAN CAPITAL LETTER EN;Lu;0;L;;;;;N;;Khutsuri;;;
+10A5;GEORGIAN CAPITAL LETTER VIN;Lu;0;L;;;;;N;;Khutsuri;;;
+10A6;GEORGIAN CAPITAL LETTER ZEN;Lu;0;L;;;;;N;;Khutsuri;;;
+10A7;GEORGIAN CAPITAL LETTER TAN;Lu;0;L;;;;;N;;Khutsuri;;;
+10A8;GEORGIAN CAPITAL LETTER IN;Lu;0;L;;;;;N;;Khutsuri;;;
+10A9;GEORGIAN CAPITAL LETTER KAN;Lu;0;L;;;;;N;;Khutsuri;;;
+10AA;GEORGIAN CAPITAL LETTER LAS;Lu;0;L;;;;;N;;Khutsuri;;;
+10AB;GEORGIAN CAPITAL LETTER MAN;Lu;0;L;;;;;N;;Khutsuri;;;
+10AC;GEORGIAN CAPITAL LETTER NAR;Lu;0;L;;;;;N;;Khutsuri;;;
+10AD;GEORGIAN CAPITAL LETTER ON;Lu;0;L;;;;;N;;Khutsuri;;;
+10AE;GEORGIAN CAPITAL LETTER PAR;Lu;0;L;;;;;N;;Khutsuri;;;
+10AF;GEORGIAN CAPITAL LETTER ZHAR;Lu;0;L;;;;;N;;Khutsuri;;;
+10B0;GEORGIAN CAPITAL LETTER RAE;Lu;0;L;;;;;N;;Khutsuri;;;
+10B1;GEORGIAN CAPITAL LETTER SAN;Lu;0;L;;;;;N;;Khutsuri;;;
+10B2;GEORGIAN CAPITAL LETTER TAR;Lu;0;L;;;;;N;;Khutsuri;;;
+10B3;GEORGIAN CAPITAL LETTER UN;Lu;0;L;;;;;N;;Khutsuri;;;
+10B4;GEORGIAN CAPITAL LETTER PHAR;Lu;0;L;;;;;N;;Khutsuri;;;
+10B5;GEORGIAN CAPITAL LETTER KHAR;Lu;0;L;;;;;N;;Khutsuri;;;
+10B6;GEORGIAN CAPITAL LETTER GHAN;Lu;0;L;;;;;N;;Khutsuri;;;
+10B7;GEORGIAN CAPITAL LETTER QAR;Lu;0;L;;;;;N;;Khutsuri;;;
+10B8;GEORGIAN CAPITAL LETTER SHIN;Lu;0;L;;;;;N;;Khutsuri;;;
+10B9;GEORGIAN CAPITAL LETTER CHIN;Lu;0;L;;;;;N;;Khutsuri;;;
+10BA;GEORGIAN CAPITAL LETTER CAN;Lu;0;L;;;;;N;;Khutsuri;;;
+10BB;GEORGIAN CAPITAL LETTER JIL;Lu;0;L;;;;;N;;Khutsuri;;;
+10BC;GEORGIAN CAPITAL LETTER CIL;Lu;0;L;;;;;N;;Khutsuri;;;
+10BD;GEORGIAN CAPITAL LETTER CHAR;Lu;0;L;;;;;N;;Khutsuri;;;
+10BE;GEORGIAN CAPITAL LETTER XAN;Lu;0;L;;;;;N;;Khutsuri;;;
+10BF;GEORGIAN CAPITAL LETTER JHAN;Lu;0;L;;;;;N;;Khutsuri;;;
+10C0;GEORGIAN CAPITAL LETTER HAE;Lu;0;L;;;;;N;;Khutsuri;;;
+10C1;GEORGIAN CAPITAL LETTER HE;Lu;0;L;;;;;N;;Khutsuri;;;
+10C2;GEORGIAN CAPITAL LETTER HIE;Lu;0;L;;;;;N;;Khutsuri;;;
+10C3;GEORGIAN CAPITAL LETTER WE;Lu;0;L;;;;;N;;Khutsuri;;;
+10C4;GEORGIAN CAPITAL LETTER HAR;Lu;0;L;;;;;N;;Khutsuri;;;
+10C5;GEORGIAN CAPITAL LETTER HOE;Lu;0;L;;;;;N;;Khutsuri;;;
+10D0;GEORGIAN LETTER AN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER AN;;;;
+10D1;GEORGIAN LETTER BAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER BAN;;;;
+10D2;GEORGIAN LETTER GAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER GAN;;;;
+10D3;GEORGIAN LETTER DON;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER DON;;;;
+10D4;GEORGIAN LETTER EN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER EN;;;;
+10D5;GEORGIAN LETTER VIN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER VIN;;;;
+10D6;GEORGIAN LETTER ZEN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER ZEN;;;;
+10D7;GEORGIAN LETTER TAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER TAN;;;;
+10D8;GEORGIAN LETTER IN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER IN;;;;
+10D9;GEORGIAN LETTER KAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER KAN;;;;
+10DA;GEORGIAN LETTER LAS;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER LAS;;;;
+10DB;GEORGIAN LETTER MAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER MAN;;;;
+10DC;GEORGIAN LETTER NAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER NAR;;;;
+10DD;GEORGIAN LETTER ON;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER ON;;;;
+10DE;GEORGIAN LETTER PAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER PAR;;;;
+10DF;GEORGIAN LETTER ZHAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER ZHAR;;;;
+10E0;GEORGIAN LETTER RAE;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER RAE;;;;
+10E1;GEORGIAN LETTER SAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER SAN;;;;
+10E2;GEORGIAN LETTER TAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER TAR;;;;
+10E3;GEORGIAN LETTER UN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER UN;;;;
+10E4;GEORGIAN LETTER PHAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER PHAR;;;;
+10E5;GEORGIAN LETTER KHAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER KHAR;;;;
+10E6;GEORGIAN LETTER GHAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER GHAN;;;;
+10E7;GEORGIAN LETTER QAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER QAR;;;;
+10E8;GEORGIAN LETTER SHIN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER SHIN;;;;
+10E9;GEORGIAN LETTER CHIN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER CHIN;;;;
+10EA;GEORGIAN LETTER CAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER CAN;;;;
+10EB;GEORGIAN LETTER JIL;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER JIL;;;;
+10EC;GEORGIAN LETTER CIL;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER CIL;;;;
+10ED;GEORGIAN LETTER CHAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER CHAR;;;;
+10EE;GEORGIAN LETTER XAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER XAN;;;;
+10EF;GEORGIAN LETTER JHAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER JHAN;;;;
+10F0;GEORGIAN LETTER HAE;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER HAE;;;;
+10F1;GEORGIAN LETTER HE;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER HE;;;;
+10F2;GEORGIAN LETTER HIE;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER HIE;;;;
+10F3;GEORGIAN LETTER WE;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER WE;;;;
+10F4;GEORGIAN LETTER HAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER HAR;;;;
+10F5;GEORGIAN LETTER HOE;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER HOE;;;;
+10F6;GEORGIAN LETTER FI;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER FI;;;;
+10FB;GEORGIAN PARAGRAPH SEPARATOR;Po;0;L;;;;;N;;;;;
+1100;HANGUL CHOSEONG KIYEOK;Lo;0;L;;;;;N;;g *;;;
+1101;HANGUL CHOSEONG SSANGKIYEOK;Lo;0;L;;;;;N;;gg *;;;
+1102;HANGUL CHOSEONG NIEUN;Lo;0;L;;;;;N;;n *;;;
+1103;HANGUL CHOSEONG TIKEUT;Lo;0;L;;;;;N;;d *;;;
+1104;HANGUL CHOSEONG SSANGTIKEUT;Lo;0;L;;;;;N;;dd *;;;
+1105;HANGUL CHOSEONG RIEUL;Lo;0;L;;;;;N;;r *;;;
+1106;HANGUL CHOSEONG MIEUM;Lo;0;L;;;;;N;;m *;;;
+1107;HANGUL CHOSEONG PIEUP;Lo;0;L;;;;;N;;b *;;;
+1108;HANGUL CHOSEONG SSANGPIEUP;Lo;0;L;;;;;N;;bb *;;;
+1109;HANGUL CHOSEONG SIOS;Lo;0;L;;;;;N;;s *;;;
+110A;HANGUL CHOSEONG SSANGSIOS;Lo;0;L;;;;;N;;ss *;;;
+110B;HANGUL CHOSEONG IEUNG;Lo;0;L;;;;;N;;;;;
+110C;HANGUL CHOSEONG CIEUC;Lo;0;L;;;;;N;;j *;;;
+110D;HANGUL CHOSEONG SSANGCIEUC;Lo;0;L;;;;;N;;jj *;;;
+110E;HANGUL CHOSEONG CHIEUCH;Lo;0;L;;;;;N;;c *;;;
+110F;HANGUL CHOSEONG KHIEUKH;Lo;0;L;;;;;N;;k *;;;
+1110;HANGUL CHOSEONG THIEUTH;Lo;0;L;;;;;N;;t *;;;
+1111;HANGUL CHOSEONG PHIEUPH;Lo;0;L;;;;;N;;p *;;;
+1112;HANGUL CHOSEONG HIEUH;Lo;0;L;;;;;N;;h *;;;
+1113;HANGUL CHOSEONG NIEUN-KIYEOK;Lo;0;L;;;;;N;;;;;
+1114;HANGUL CHOSEONG SSANGNIEUN;Lo;0;L;;;;;N;;;;;
+1115;HANGUL CHOSEONG NIEUN-TIKEUT;Lo;0;L;;;;;N;;;;;
+1116;HANGUL CHOSEONG NIEUN-PIEUP;Lo;0;L;;;;;N;;;;;
+1117;HANGUL CHOSEONG TIKEUT-KIYEOK;Lo;0;L;;;;;N;;;;;
+1118;HANGUL CHOSEONG RIEUL-NIEUN;Lo;0;L;;;;;N;;;;;
+1119;HANGUL CHOSEONG SSANGRIEUL;Lo;0;L;;;;;N;;;;;
+111A;HANGUL CHOSEONG RIEUL-HIEUH;Lo;0;L;;;;;N;;;;;
+111B;HANGUL CHOSEONG KAPYEOUNRIEUL;Lo;0;L;;;;;N;;;;;
+111C;HANGUL CHOSEONG MIEUM-PIEUP;Lo;0;L;;;;;N;;;;;
+111D;HANGUL CHOSEONG KAPYEOUNMIEUM;Lo;0;L;;;;;N;;;;;
+111E;HANGUL CHOSEONG PIEUP-KIYEOK;Lo;0;L;;;;;N;;;;;
+111F;HANGUL CHOSEONG PIEUP-NIEUN;Lo;0;L;;;;;N;;;;;
+1120;HANGUL CHOSEONG PIEUP-TIKEUT;Lo;0;L;;;;;N;;;;;
+1121;HANGUL CHOSEONG PIEUP-SIOS;Lo;0;L;;;;;N;;;;;
+1122;HANGUL CHOSEONG PIEUP-SIOS-KIYEOK;Lo;0;L;;;;;N;;;;;
+1123;HANGUL CHOSEONG PIEUP-SIOS-TIKEUT;Lo;0;L;;;;;N;;;;;
+1124;HANGUL CHOSEONG PIEUP-SIOS-PIEUP;Lo;0;L;;;;;N;;;;;
+1125;HANGUL CHOSEONG PIEUP-SSANGSIOS;Lo;0;L;;;;;N;;;;;
+1126;HANGUL CHOSEONG PIEUP-SIOS-CIEUC;Lo;0;L;;;;;N;;;;;
+1127;HANGUL CHOSEONG PIEUP-CIEUC;Lo;0;L;;;;;N;;;;;
+1128;HANGUL CHOSEONG PIEUP-CHIEUCH;Lo;0;L;;;;;N;;;;;
+1129;HANGUL CHOSEONG PIEUP-THIEUTH;Lo;0;L;;;;;N;;;;;
+112A;HANGUL CHOSEONG PIEUP-PHIEUPH;Lo;0;L;;;;;N;;;;;
+112B;HANGUL CHOSEONG KAPYEOUNPIEUP;Lo;0;L;;;;;N;;;;;
+112C;HANGUL CHOSEONG KAPYEOUNSSANGPIEUP;Lo;0;L;;;;;N;;;;;
+112D;HANGUL CHOSEONG SIOS-KIYEOK;Lo;0;L;;;;;N;;;;;
+112E;HANGUL CHOSEONG SIOS-NIEUN;Lo;0;L;;;;;N;;;;;
+112F;HANGUL CHOSEONG SIOS-TIKEUT;Lo;0;L;;;;;N;;;;;
+1130;HANGUL CHOSEONG SIOS-RIEUL;Lo;0;L;;;;;N;;;;;
+1131;HANGUL CHOSEONG SIOS-MIEUM;Lo;0;L;;;;;N;;;;;
+1132;HANGUL CHOSEONG SIOS-PIEUP;Lo;0;L;;;;;N;;;;;
+1133;HANGUL CHOSEONG SIOS-PIEUP-KIYEOK;Lo;0;L;;;;;N;;;;;
+1134;HANGUL CHOSEONG SIOS-SSANGSIOS;Lo;0;L;;;;;N;;;;;
+1135;HANGUL CHOSEONG SIOS-IEUNG;Lo;0;L;;;;;N;;;;;
+1136;HANGUL CHOSEONG SIOS-CIEUC;Lo;0;L;;;;;N;;;;;
+1137;HANGUL CHOSEONG SIOS-CHIEUCH;Lo;0;L;;;;;N;;;;;
+1138;HANGUL CHOSEONG SIOS-KHIEUKH;Lo;0;L;;;;;N;;;;;
+1139;HANGUL CHOSEONG SIOS-THIEUTH;Lo;0;L;;;;;N;;;;;
+113A;HANGUL CHOSEONG SIOS-PHIEUPH;Lo;0;L;;;;;N;;;;;
+113B;HANGUL CHOSEONG SIOS-HIEUH;Lo;0;L;;;;;N;;;;;
+113C;HANGUL CHOSEONG CHITUEUMSIOS;Lo;0;L;;;;;N;;;;;
+113D;HANGUL CHOSEONG CHITUEUMSSANGSIOS;Lo;0;L;;;;;N;;;;;
+113E;HANGUL CHOSEONG CEONGCHIEUMSIOS;Lo;0;L;;;;;N;;;;;
+113F;HANGUL CHOSEONG CEONGCHIEUMSSANGSIOS;Lo;0;L;;;;;N;;;;;
+1140;HANGUL CHOSEONG PANSIOS;Lo;0;L;;;;;N;;;;;
+1141;HANGUL CHOSEONG IEUNG-KIYEOK;Lo;0;L;;;;;N;;;;;
+1142;HANGUL CHOSEONG IEUNG-TIKEUT;Lo;0;L;;;;;N;;;;;
+1143;HANGUL CHOSEONG IEUNG-MIEUM;Lo;0;L;;;;;N;;;;;
+1144;HANGUL CHOSEONG IEUNG-PIEUP;Lo;0;L;;;;;N;;;;;
+1145;HANGUL CHOSEONG IEUNG-SIOS;Lo;0;L;;;;;N;;;;;
+1146;HANGUL CHOSEONG IEUNG-PANSIOS;Lo;0;L;;;;;N;;;;;
+1147;HANGUL CHOSEONG SSANGIEUNG;Lo;0;L;;;;;N;;;;;
+1148;HANGUL CHOSEONG IEUNG-CIEUC;Lo;0;L;;;;;N;;;;;
+1149;HANGUL CHOSEONG IEUNG-CHIEUCH;Lo;0;L;;;;;N;;;;;
+114A;HANGUL CHOSEONG IEUNG-THIEUTH;Lo;0;L;;;;;N;;;;;
+114B;HANGUL CHOSEONG IEUNG-PHIEUPH;Lo;0;L;;;;;N;;;;;
+114C;HANGUL CHOSEONG YESIEUNG;Lo;0;L;;;;;N;;;;;
+114D;HANGUL CHOSEONG CIEUC-IEUNG;Lo;0;L;;;;;N;;;;;
+114E;HANGUL CHOSEONG CHITUEUMCIEUC;Lo;0;L;;;;;N;;;;;
+114F;HANGUL CHOSEONG CHITUEUMSSANGCIEUC;Lo;0;L;;;;;N;;;;;
+1150;HANGUL CHOSEONG CEONGCHIEUMCIEUC;Lo;0;L;;;;;N;;;;;
+1151;HANGUL CHOSEONG CEONGCHIEUMSSANGCIEUC;Lo;0;L;;;;;N;;;;;
+1152;HANGUL CHOSEONG CHIEUCH-KHIEUKH;Lo;0;L;;;;;N;;;;;
+1153;HANGUL CHOSEONG CHIEUCH-HIEUH;Lo;0;L;;;;;N;;;;;
+1154;HANGUL CHOSEONG CHITUEUMCHIEUCH;Lo;0;L;;;;;N;;;;;
+1155;HANGUL CHOSEONG CEONGCHIEUMCHIEUCH;Lo;0;L;;;;;N;;;;;
+1156;HANGUL CHOSEONG PHIEUPH-PIEUP;Lo;0;L;;;;;N;;;;;
+1157;HANGUL CHOSEONG KAPYEOUNPHIEUPH;Lo;0;L;;;;;N;;;;;
+1158;HANGUL CHOSEONG SSANGHIEUH;Lo;0;L;;;;;N;;;;;
+1159;HANGUL CHOSEONG YEORINHIEUH;Lo;0;L;;;;;N;;;;;
+115F;HANGUL CHOSEONG FILLER;Lo;0;L;;;;;N;;;;;
+1160;HANGUL JUNGSEONG FILLER;Lo;0;L;;;;;N;;;;;
+1161;HANGUL JUNGSEONG A;Lo;0;L;;;;;N;;;;;
+1162;HANGUL JUNGSEONG AE;Lo;0;L;;;;;N;;;;;
+1163;HANGUL JUNGSEONG YA;Lo;0;L;;;;;N;;;;;
+1164;HANGUL JUNGSEONG YAE;Lo;0;L;;;;;N;;;;;
+1165;HANGUL JUNGSEONG EO;Lo;0;L;;;;;N;;;;;
+1166;HANGUL JUNGSEONG E;Lo;0;L;;;;;N;;;;;
+1167;HANGUL JUNGSEONG YEO;Lo;0;L;;;;;N;;;;;
+1168;HANGUL JUNGSEONG YE;Lo;0;L;;;;;N;;;;;
+1169;HANGUL JUNGSEONG O;Lo;0;L;;;;;N;;;;;
+116A;HANGUL JUNGSEONG WA;Lo;0;L;;;;;N;;;;;
+116B;HANGUL JUNGSEONG WAE;Lo;0;L;;;;;N;;;;;
+116C;HANGUL JUNGSEONG OE;Lo;0;L;;;;;N;;;;;
+116D;HANGUL JUNGSEONG YO;Lo;0;L;;;;;N;;;;;
+116E;HANGUL JUNGSEONG U;Lo;0;L;;;;;N;;;;;
+116F;HANGUL JUNGSEONG WEO;Lo;0;L;;;;;N;;;;;
+1170;HANGUL JUNGSEONG WE;Lo;0;L;;;;;N;;;;;
+1171;HANGUL JUNGSEONG WI;Lo;0;L;;;;;N;;;;;
+1172;HANGUL JUNGSEONG YU;Lo;0;L;;;;;N;;;;;
+1173;HANGUL JUNGSEONG EU;Lo;0;L;;;;;N;;;;;
+1174;HANGUL JUNGSEONG YI;Lo;0;L;;;;;N;;;;;
+1175;HANGUL JUNGSEONG I;Lo;0;L;;;;;N;;;;;
+1176;HANGUL JUNGSEONG A-O;Lo;0;L;;;;;N;;;;;
+1177;HANGUL JUNGSEONG A-U;Lo;0;L;;;;;N;;;;;
+1178;HANGUL JUNGSEONG YA-O;Lo;0;L;;;;;N;;;;;
+1179;HANGUL JUNGSEONG YA-YO;Lo;0;L;;;;;N;;;;;
+117A;HANGUL JUNGSEONG EO-O;Lo;0;L;;;;;N;;;;;
+117B;HANGUL JUNGSEONG EO-U;Lo;0;L;;;;;N;;;;;
+117C;HANGUL JUNGSEONG EO-EU;Lo;0;L;;;;;N;;;;;
+117D;HANGUL JUNGSEONG YEO-O;Lo;0;L;;;;;N;;;;;
+117E;HANGUL JUNGSEONG YEO-U;Lo;0;L;;;;;N;;;;;
+117F;HANGUL JUNGSEONG O-EO;Lo;0;L;;;;;N;;;;;
+1180;HANGUL JUNGSEONG O-E;Lo;0;L;;;;;N;;;;;
+1181;HANGUL JUNGSEONG O-YE;Lo;0;L;;;;;N;;;;;
+1182;HANGUL JUNGSEONG O-O;Lo;0;L;;;;;N;;;;;
+1183;HANGUL JUNGSEONG O-U;Lo;0;L;;;;;N;;;;;
+1184;HANGUL JUNGSEONG YO-YA;Lo;0;L;;;;;N;;;;;
+1185;HANGUL JUNGSEONG YO-YAE;Lo;0;L;;;;;N;;;;;
+1186;HANGUL JUNGSEONG YO-YEO;Lo;0;L;;;;;N;;;;;
+1187;HANGUL JUNGSEONG YO-O;Lo;0;L;;;;;N;;;;;
+1188;HANGUL JUNGSEONG YO-I;Lo;0;L;;;;;N;;;;;
+1189;HANGUL JUNGSEONG U-A;Lo;0;L;;;;;N;;;;;
+118A;HANGUL JUNGSEONG U-AE;Lo;0;L;;;;;N;;;;;
+118B;HANGUL JUNGSEONG U-EO-EU;Lo;0;L;;;;;N;;;;;
+118C;HANGUL JUNGSEONG U-YE;Lo;0;L;;;;;N;;;;;
+118D;HANGUL JUNGSEONG U-U;Lo;0;L;;;;;N;;;;;
+118E;HANGUL JUNGSEONG YU-A;Lo;0;L;;;;;N;;;;;
+118F;HANGUL JUNGSEONG YU-EO;Lo;0;L;;;;;N;;;;;
+1190;HANGUL JUNGSEONG YU-E;Lo;0;L;;;;;N;;;;;
+1191;HANGUL JUNGSEONG YU-YEO;Lo;0;L;;;;;N;;;;;
+1192;HANGUL JUNGSEONG YU-YE;Lo;0;L;;;;;N;;;;;
+1193;HANGUL JUNGSEONG YU-U;Lo;0;L;;;;;N;;;;;
+1194;HANGUL JUNGSEONG YU-I;Lo;0;L;;;;;N;;;;;
+1195;HANGUL JUNGSEONG EU-U;Lo;0;L;;;;;N;;;;;
+1196;HANGUL JUNGSEONG EU-EU;Lo;0;L;;;;;N;;;;;
+1197;HANGUL JUNGSEONG YI-U;Lo;0;L;;;;;N;;;;;
+1198;HANGUL JUNGSEONG I-A;Lo;0;L;;;;;N;;;;;
+1199;HANGUL JUNGSEONG I-YA;Lo;0;L;;;;;N;;;;;
+119A;HANGUL JUNGSEONG I-O;Lo;0;L;;;;;N;;;;;
+119B;HANGUL JUNGSEONG I-U;Lo;0;L;;;;;N;;;;;
+119C;HANGUL JUNGSEONG I-EU;Lo;0;L;;;;;N;;;;;
+119D;HANGUL JUNGSEONG I-ARAEA;Lo;0;L;;;;;N;;;;;
+119E;HANGUL JUNGSEONG ARAEA;Lo;0;L;;;;;N;;;;;
+119F;HANGUL JUNGSEONG ARAEA-EO;Lo;0;L;;;;;N;;;;;
+11A0;HANGUL JUNGSEONG ARAEA-U;Lo;0;L;;;;;N;;;;;
+11A1;HANGUL JUNGSEONG ARAEA-I;Lo;0;L;;;;;N;;;;;
+11A2;HANGUL JUNGSEONG SSANGARAEA;Lo;0;L;;;;;N;;;;;
+11A8;HANGUL JONGSEONG KIYEOK;Lo;0;L;;;;;N;;g *;;;
+11A9;HANGUL JONGSEONG SSANGKIYEOK;Lo;0;L;;;;;N;;gg *;;;
+11AA;HANGUL JONGSEONG KIYEOK-SIOS;Lo;0;L;;;;;N;;gs *;;;
+11AB;HANGUL JONGSEONG NIEUN;Lo;0;L;;;;;N;;n *;;;
+11AC;HANGUL JONGSEONG NIEUN-CIEUC;Lo;0;L;;;;;N;;nj *;;;
+11AD;HANGUL JONGSEONG NIEUN-HIEUH;Lo;0;L;;;;;N;;nh *;;;
+11AE;HANGUL JONGSEONG TIKEUT;Lo;0;L;;;;;N;;d *;;;
+11AF;HANGUL JONGSEONG RIEUL;Lo;0;L;;;;;N;;l *;;;
+11B0;HANGUL JONGSEONG RIEUL-KIYEOK;Lo;0;L;;;;;N;;lg *;;;
+11B1;HANGUL JONGSEONG RIEUL-MIEUM;Lo;0;L;;;;;N;;lm *;;;
+11B2;HANGUL JONGSEONG RIEUL-PIEUP;Lo;0;L;;;;;N;;lb *;;;
+11B3;HANGUL JONGSEONG RIEUL-SIOS;Lo;0;L;;;;;N;;ls *;;;
+11B4;HANGUL JONGSEONG RIEUL-THIEUTH;Lo;0;L;;;;;N;;lt *;;;
+11B5;HANGUL JONGSEONG RIEUL-PHIEUPH;Lo;0;L;;;;;N;;lp *;;;
+11B6;HANGUL JONGSEONG RIEUL-HIEUH;Lo;0;L;;;;;N;;lh *;;;
+11B7;HANGUL JONGSEONG MIEUM;Lo;0;L;;;;;N;;m *;;;
+11B8;HANGUL JONGSEONG PIEUP;Lo;0;L;;;;;N;;b *;;;
+11B9;HANGUL JONGSEONG PIEUP-SIOS;Lo;0;L;;;;;N;;bs *;;;
+11BA;HANGUL JONGSEONG SIOS;Lo;0;L;;;;;N;;s *;;;
+11BB;HANGUL JONGSEONG SSANGSIOS;Lo;0;L;;;;;N;;ss *;;;
+11BC;HANGUL JONGSEONG IEUNG;Lo;0;L;;;;;N;;ng *;;;
+11BD;HANGUL JONGSEONG CIEUC;Lo;0;L;;;;;N;;j *;;;
+11BE;HANGUL JONGSEONG CHIEUCH;Lo;0;L;;;;;N;;c *;;;
+11BF;HANGUL JONGSEONG KHIEUKH;Lo;0;L;;;;;N;;k *;;;
+11C0;HANGUL JONGSEONG THIEUTH;Lo;0;L;;;;;N;;t *;;;
+11C1;HANGUL JONGSEONG PHIEUPH;Lo;0;L;;;;;N;;p *;;;
+11C2;HANGUL JONGSEONG HIEUH;Lo;0;L;;;;;N;;h *;;;
+11C3;HANGUL JONGSEONG KIYEOK-RIEUL;Lo;0;L;;;;;N;;;;;
+11C4;HANGUL JONGSEONG KIYEOK-SIOS-KIYEOK;Lo;0;L;;;;;N;;;;;
+11C5;HANGUL JONGSEONG NIEUN-KIYEOK;Lo;0;L;;;;;N;;;;;
+11C6;HANGUL JONGSEONG NIEUN-TIKEUT;Lo;0;L;;;;;N;;;;;
+11C7;HANGUL JONGSEONG NIEUN-SIOS;Lo;0;L;;;;;N;;;;;
+11C8;HANGUL JONGSEONG NIEUN-PANSIOS;Lo;0;L;;;;;N;;;;;
+11C9;HANGUL JONGSEONG NIEUN-THIEUTH;Lo;0;L;;;;;N;;;;;
+11CA;HANGUL JONGSEONG TIKEUT-KIYEOK;Lo;0;L;;;;;N;;;;;
+11CB;HANGUL JONGSEONG TIKEUT-RIEUL;Lo;0;L;;;;;N;;;;;
+11CC;HANGUL JONGSEONG RIEUL-KIYEOK-SIOS;Lo;0;L;;;;;N;;;;;
+11CD;HANGUL JONGSEONG RIEUL-NIEUN;Lo;0;L;;;;;N;;;;;
+11CE;HANGUL JONGSEONG RIEUL-TIKEUT;Lo;0;L;;;;;N;;;;;
+11CF;HANGUL JONGSEONG RIEUL-TIKEUT-HIEUH;Lo;0;L;;;;;N;;;;;
+11D0;HANGUL JONGSEONG SSANGRIEUL;Lo;0;L;;;;;N;;;;;
+11D1;HANGUL JONGSEONG RIEUL-MIEUM-KIYEOK;Lo;0;L;;;;;N;;;;;
+11D2;HANGUL JONGSEONG RIEUL-MIEUM-SIOS;Lo;0;L;;;;;N;;;;;
+11D3;HANGUL JONGSEONG RIEUL-PIEUP-SIOS;Lo;0;L;;;;;N;;;;;
+11D4;HANGUL JONGSEONG RIEUL-PIEUP-HIEUH;Lo;0;L;;;;;N;;;;;
+11D5;HANGUL JONGSEONG RIEUL-KAPYEOUNPIEUP;Lo;0;L;;;;;N;;;;;
+11D6;HANGUL JONGSEONG RIEUL-SSANGSIOS;Lo;0;L;;;;;N;;;;;
+11D7;HANGUL JONGSEONG RIEUL-PANSIOS;Lo;0;L;;;;;N;;;;;
+11D8;HANGUL JONGSEONG RIEUL-KHIEUKH;Lo;0;L;;;;;N;;;;;
+11D9;HANGUL JONGSEONG RIEUL-YEORINHIEUH;Lo;0;L;;;;;N;;;;;
+11DA;HANGUL JONGSEONG MIEUM-KIYEOK;Lo;0;L;;;;;N;;;;;
+11DB;HANGUL JONGSEONG MIEUM-RIEUL;Lo;0;L;;;;;N;;;;;
+11DC;HANGUL JONGSEONG MIEUM-PIEUP;Lo;0;L;;;;;N;;;;;
+11DD;HANGUL JONGSEONG MIEUM-SIOS;Lo;0;L;;;;;N;;;;;
+11DE;HANGUL JONGSEONG MIEUM-SSANGSIOS;Lo;0;L;;;;;N;;;;;
+11DF;HANGUL JONGSEONG MIEUM-PANSIOS;Lo;0;L;;;;;N;;;;;
+11E0;HANGUL JONGSEONG MIEUM-CHIEUCH;Lo;0;L;;;;;N;;;;;
+11E1;HANGUL JONGSEONG MIEUM-HIEUH;Lo;0;L;;;;;N;;;;;
+11E2;HANGUL JONGSEONG KAPYEOUNMIEUM;Lo;0;L;;;;;N;;;;;
+11E3;HANGUL JONGSEONG PIEUP-RIEUL;Lo;0;L;;;;;N;;;;;
+11E4;HANGUL JONGSEONG PIEUP-PHIEUPH;Lo;0;L;;;;;N;;;;;
+11E5;HANGUL JONGSEONG PIEUP-HIEUH;Lo;0;L;;;;;N;;;;;
+11E6;HANGUL JONGSEONG KAPYEOUNPIEUP;Lo;0;L;;;;;N;;;;;
+11E7;HANGUL JONGSEONG SIOS-KIYEOK;Lo;0;L;;;;;N;;;;;
+11E8;HANGUL JONGSEONG SIOS-TIKEUT;Lo;0;L;;;;;N;;;;;
+11E9;HANGUL JONGSEONG SIOS-RIEUL;Lo;0;L;;;;;N;;;;;
+11EA;HANGUL JONGSEONG SIOS-PIEUP;Lo;0;L;;;;;N;;;;;
+11EB;HANGUL JONGSEONG PANSIOS;Lo;0;L;;;;;N;;;;;
+11EC;HANGUL JONGSEONG IEUNG-KIYEOK;Lo;0;L;;;;;N;;;;;
+11ED;HANGUL JONGSEONG IEUNG-SSANGKIYEOK;Lo;0;L;;;;;N;;;;;
+11EE;HANGUL JONGSEONG SSANGIEUNG;Lo;0;L;;;;;N;;;;;
+11EF;HANGUL JONGSEONG IEUNG-KHIEUKH;Lo;0;L;;;;;N;;;;;
+11F0;HANGUL JONGSEONG YESIEUNG;Lo;0;L;;;;;N;;;;;
+11F1;HANGUL JONGSEONG YESIEUNG-SIOS;Lo;0;L;;;;;N;;;;;
+11F2;HANGUL JONGSEONG YESIEUNG-PANSIOS;Lo;0;L;;;;;N;;;;;
+11F3;HANGUL JONGSEONG PHIEUPH-PIEUP;Lo;0;L;;;;;N;;;;;
+11F4;HANGUL JONGSEONG KAPYEOUNPHIEUPH;Lo;0;L;;;;;N;;;;;
+11F5;HANGUL JONGSEONG HIEUH-NIEUN;Lo;0;L;;;;;N;;;;;
+11F6;HANGUL JONGSEONG HIEUH-RIEUL;Lo;0;L;;;;;N;;;;;
+11F7;HANGUL JONGSEONG HIEUH-MIEUM;Lo;0;L;;;;;N;;;;;
+11F8;HANGUL JONGSEONG HIEUH-PIEUP;Lo;0;L;;;;;N;;;;;
+11F9;HANGUL JONGSEONG YEORINHIEUH;Lo;0;L;;;;;N;;;;;
+1200;ETHIOPIC SYLLABLE HA;Lo;0;L;;;;;N;;;;;
+1201;ETHIOPIC SYLLABLE HU;Lo;0;L;;;;;N;;;;;
+1202;ETHIOPIC SYLLABLE HI;Lo;0;L;;;;;N;;;;;
+1203;ETHIOPIC SYLLABLE HAA;Lo;0;L;;;;;N;;;;;
+1204;ETHIOPIC SYLLABLE HEE;Lo;0;L;;;;;N;;;;;
+1205;ETHIOPIC SYLLABLE HE;Lo;0;L;;;;;N;;;;;
+1206;ETHIOPIC SYLLABLE HO;Lo;0;L;;;;;N;;;;;
+1208;ETHIOPIC SYLLABLE LA;Lo;0;L;;;;;N;;;;;
+1209;ETHIOPIC SYLLABLE LU;Lo;0;L;;;;;N;;;;;
+120A;ETHIOPIC SYLLABLE LI;Lo;0;L;;;;;N;;;;;
+120B;ETHIOPIC SYLLABLE LAA;Lo;0;L;;;;;N;;;;;
+120C;ETHIOPIC SYLLABLE LEE;Lo;0;L;;;;;N;;;;;
+120D;ETHIOPIC SYLLABLE LE;Lo;0;L;;;;;N;;;;;
+120E;ETHIOPIC SYLLABLE LO;Lo;0;L;;;;;N;;;;;
+120F;ETHIOPIC SYLLABLE LWA;Lo;0;L;;;;;N;;;;;
+1210;ETHIOPIC SYLLABLE HHA;Lo;0;L;;;;;N;;;;;
+1211;ETHIOPIC SYLLABLE HHU;Lo;0;L;;;;;N;;;;;
+1212;ETHIOPIC SYLLABLE HHI;Lo;0;L;;;;;N;;;;;
+1213;ETHIOPIC SYLLABLE HHAA;Lo;0;L;;;;;N;;;;;
+1214;ETHIOPIC SYLLABLE HHEE;Lo;0;L;;;;;N;;;;;
+1215;ETHIOPIC SYLLABLE HHE;Lo;0;L;;;;;N;;;;;
+1216;ETHIOPIC SYLLABLE HHO;Lo;0;L;;;;;N;;;;;
+1217;ETHIOPIC SYLLABLE HHWA;Lo;0;L;;;;;N;;;;;
+1218;ETHIOPIC SYLLABLE MA;Lo;0;L;;;;;N;;;;;
+1219;ETHIOPIC SYLLABLE MU;Lo;0;L;;;;;N;;;;;
+121A;ETHIOPIC SYLLABLE MI;Lo;0;L;;;;;N;;;;;
+121B;ETHIOPIC SYLLABLE MAA;Lo;0;L;;;;;N;;;;;
+121C;ETHIOPIC SYLLABLE MEE;Lo;0;L;;;;;N;;;;;
+121D;ETHIOPIC SYLLABLE ME;Lo;0;L;;;;;N;;;;;
+121E;ETHIOPIC SYLLABLE MO;Lo;0;L;;;;;N;;;;;
+121F;ETHIOPIC SYLLABLE MWA;Lo;0;L;;;;;N;;;;;
+1220;ETHIOPIC SYLLABLE SZA;Lo;0;L;;;;;N;;;;;
+1221;ETHIOPIC SYLLABLE SZU;Lo;0;L;;;;;N;;;;;
+1222;ETHIOPIC SYLLABLE SZI;Lo;0;L;;;;;N;;;;;
+1223;ETHIOPIC SYLLABLE SZAA;Lo;0;L;;;;;N;;;;;
+1224;ETHIOPIC SYLLABLE SZEE;Lo;0;L;;;;;N;;;;;
+1225;ETHIOPIC SYLLABLE SZE;Lo;0;L;;;;;N;;;;;
+1226;ETHIOPIC SYLLABLE SZO;Lo;0;L;;;;;N;;;;;
+1227;ETHIOPIC SYLLABLE SZWA;Lo;0;L;;;;;N;;;;;
+1228;ETHIOPIC SYLLABLE RA;Lo;0;L;;;;;N;;;;;
+1229;ETHIOPIC SYLLABLE RU;Lo;0;L;;;;;N;;;;;
+122A;ETHIOPIC SYLLABLE RI;Lo;0;L;;;;;N;;;;;
+122B;ETHIOPIC SYLLABLE RAA;Lo;0;L;;;;;N;;;;;
+122C;ETHIOPIC SYLLABLE REE;Lo;0;L;;;;;N;;;;;
+122D;ETHIOPIC SYLLABLE RE;Lo;0;L;;;;;N;;;;;
+122E;ETHIOPIC SYLLABLE RO;Lo;0;L;;;;;N;;;;;
+122F;ETHIOPIC SYLLABLE RWA;Lo;0;L;;;;;N;;;;;
+1230;ETHIOPIC SYLLABLE SA;Lo;0;L;;;;;N;;;;;
+1231;ETHIOPIC SYLLABLE SU;Lo;0;L;;;;;N;;;;;
+1232;ETHIOPIC SYLLABLE SI;Lo;0;L;;;;;N;;;;;
+1233;ETHIOPIC SYLLABLE SAA;Lo;0;L;;;;;N;;;;;
+1234;ETHIOPIC SYLLABLE SEE;Lo;0;L;;;;;N;;;;;
+1235;ETHIOPIC SYLLABLE SE;Lo;0;L;;;;;N;;;;;
+1236;ETHIOPIC SYLLABLE SO;Lo;0;L;;;;;N;;;;;
+1237;ETHIOPIC SYLLABLE SWA;Lo;0;L;;;;;N;;;;;
+1238;ETHIOPIC SYLLABLE SHA;Lo;0;L;;;;;N;;;;;
+1239;ETHIOPIC SYLLABLE SHU;Lo;0;L;;;;;N;;;;;
+123A;ETHIOPIC SYLLABLE SHI;Lo;0;L;;;;;N;;;;;
+123B;ETHIOPIC SYLLABLE SHAA;Lo;0;L;;;;;N;;;;;
+123C;ETHIOPIC SYLLABLE SHEE;Lo;0;L;;;;;N;;;;;
+123D;ETHIOPIC SYLLABLE SHE;Lo;0;L;;;;;N;;;;;
+123E;ETHIOPIC SYLLABLE SHO;Lo;0;L;;;;;N;;;;;
+123F;ETHIOPIC SYLLABLE SHWA;Lo;0;L;;;;;N;;;;;
+1240;ETHIOPIC SYLLABLE QA;Lo;0;L;;;;;N;;;;;
+1241;ETHIOPIC SYLLABLE QU;Lo;0;L;;;;;N;;;;;
+1242;ETHIOPIC SYLLABLE QI;Lo;0;L;;;;;N;;;;;
+1243;ETHIOPIC SYLLABLE QAA;Lo;0;L;;;;;N;;;;;
+1244;ETHIOPIC SYLLABLE QEE;Lo;0;L;;;;;N;;;;;
+1245;ETHIOPIC SYLLABLE QE;Lo;0;L;;;;;N;;;;;
+1246;ETHIOPIC SYLLABLE QO;Lo;0;L;;;;;N;;;;;
+1248;ETHIOPIC SYLLABLE QWA;Lo;0;L;;;;;N;;;;;
+124A;ETHIOPIC SYLLABLE QWI;Lo;0;L;;;;;N;;;;;
+124B;ETHIOPIC SYLLABLE QWAA;Lo;0;L;;;;;N;;;;;
+124C;ETHIOPIC SYLLABLE QWEE;Lo;0;L;;;;;N;;;;;
+124D;ETHIOPIC SYLLABLE QWE;Lo;0;L;;;;;N;;;;;
+1250;ETHIOPIC SYLLABLE QHA;Lo;0;L;;;;;N;;;;;
+1251;ETHIOPIC SYLLABLE QHU;Lo;0;L;;;;;N;;;;;
+1252;ETHIOPIC SYLLABLE QHI;Lo;0;L;;;;;N;;;;;
+1253;ETHIOPIC SYLLABLE QHAA;Lo;0;L;;;;;N;;;;;
+1254;ETHIOPIC SYLLABLE QHEE;Lo;0;L;;;;;N;;;;;
+1255;ETHIOPIC SYLLABLE QHE;Lo;0;L;;;;;N;;;;;
+1256;ETHIOPIC SYLLABLE QHO;Lo;0;L;;;;;N;;;;;
+1258;ETHIOPIC SYLLABLE QHWA;Lo;0;L;;;;;N;;;;;
+125A;ETHIOPIC SYLLABLE QHWI;Lo;0;L;;;;;N;;;;;
+125B;ETHIOPIC SYLLABLE QHWAA;Lo;0;L;;;;;N;;;;;
+125C;ETHIOPIC SYLLABLE QHWEE;Lo;0;L;;;;;N;;;;;
+125D;ETHIOPIC SYLLABLE QHWE;Lo;0;L;;;;;N;;;;;
+1260;ETHIOPIC SYLLABLE BA;Lo;0;L;;;;;N;;;;;
+1261;ETHIOPIC SYLLABLE BU;Lo;0;L;;;;;N;;;;;
+1262;ETHIOPIC SYLLABLE BI;Lo;0;L;;;;;N;;;;;
+1263;ETHIOPIC SYLLABLE BAA;Lo;0;L;;;;;N;;;;;
+1264;ETHIOPIC SYLLABLE BEE;Lo;0;L;;;;;N;;;;;
+1265;ETHIOPIC SYLLABLE BE;Lo;0;L;;;;;N;;;;;
+1266;ETHIOPIC SYLLABLE BO;Lo;0;L;;;;;N;;;;;
+1267;ETHIOPIC SYLLABLE BWA;Lo;0;L;;;;;N;;;;;
+1268;ETHIOPIC SYLLABLE VA;Lo;0;L;;;;;N;;;;;
+1269;ETHIOPIC SYLLABLE VU;Lo;0;L;;;;;N;;;;;
+126A;ETHIOPIC SYLLABLE VI;Lo;0;L;;;;;N;;;;;
+126B;ETHIOPIC SYLLABLE VAA;Lo;0;L;;;;;N;;;;;
+126C;ETHIOPIC SYLLABLE VEE;Lo;0;L;;;;;N;;;;;
+126D;ETHIOPIC SYLLABLE VE;Lo;0;L;;;;;N;;;;;
+126E;ETHIOPIC SYLLABLE VO;Lo;0;L;;;;;N;;;;;
+126F;ETHIOPIC SYLLABLE VWA;Lo;0;L;;;;;N;;;;;
+1270;ETHIOPIC SYLLABLE TA;Lo;0;L;;;;;N;;;;;
+1271;ETHIOPIC SYLLABLE TU;Lo;0;L;;;;;N;;;;;
+1272;ETHIOPIC SYLLABLE TI;Lo;0;L;;;;;N;;;;;
+1273;ETHIOPIC SYLLABLE TAA;Lo;0;L;;;;;N;;;;;
+1274;ETHIOPIC SYLLABLE TEE;Lo;0;L;;;;;N;;;;;
+1275;ETHIOPIC SYLLABLE TE;Lo;0;L;;;;;N;;;;;
+1276;ETHIOPIC SYLLABLE TO;Lo;0;L;;;;;N;;;;;
+1277;ETHIOPIC SYLLABLE TWA;Lo;0;L;;;;;N;;;;;
+1278;ETHIOPIC SYLLABLE CA;Lo;0;L;;;;;N;;;;;
+1279;ETHIOPIC SYLLABLE CU;Lo;0;L;;;;;N;;;;;
+127A;ETHIOPIC SYLLABLE CI;Lo;0;L;;;;;N;;;;;
+127B;ETHIOPIC SYLLABLE CAA;Lo;0;L;;;;;N;;;;;
+127C;ETHIOPIC SYLLABLE CEE;Lo;0;L;;;;;N;;;;;
+127D;ETHIOPIC SYLLABLE CE;Lo;0;L;;;;;N;;;;;
+127E;ETHIOPIC SYLLABLE CO;Lo;0;L;;;;;N;;;;;
+127F;ETHIOPIC SYLLABLE CWA;Lo;0;L;;;;;N;;;;;
+1280;ETHIOPIC SYLLABLE XA;Lo;0;L;;;;;N;;;;;
+1281;ETHIOPIC SYLLABLE XU;Lo;0;L;;;;;N;;;;;
+1282;ETHIOPIC SYLLABLE XI;Lo;0;L;;;;;N;;;;;
+1283;ETHIOPIC SYLLABLE XAA;Lo;0;L;;;;;N;;;;;
+1284;ETHIOPIC SYLLABLE XEE;Lo;0;L;;;;;N;;;;;
+1285;ETHIOPIC SYLLABLE XE;Lo;0;L;;;;;N;;;;;
+1286;ETHIOPIC SYLLABLE XO;Lo;0;L;;;;;N;;;;;
+1288;ETHIOPIC SYLLABLE XWA;Lo;0;L;;;;;N;;;;;
+128A;ETHIOPIC SYLLABLE XWI;Lo;0;L;;;;;N;;;;;
+128B;ETHIOPIC SYLLABLE XWAA;Lo;0;L;;;;;N;;;;;
+128C;ETHIOPIC SYLLABLE XWEE;Lo;0;L;;;;;N;;;;;
+128D;ETHIOPIC SYLLABLE XWE;Lo;0;L;;;;;N;;;;;
+1290;ETHIOPIC SYLLABLE NA;Lo;0;L;;;;;N;;;;;
+1291;ETHIOPIC SYLLABLE NU;Lo;0;L;;;;;N;;;;;
+1292;ETHIOPIC SYLLABLE NI;Lo;0;L;;;;;N;;;;;
+1293;ETHIOPIC SYLLABLE NAA;Lo;0;L;;;;;N;;;;;
+1294;ETHIOPIC SYLLABLE NEE;Lo;0;L;;;;;N;;;;;
+1295;ETHIOPIC SYLLABLE NE;Lo;0;L;;;;;N;;;;;
+1296;ETHIOPIC SYLLABLE NO;Lo;0;L;;;;;N;;;;;
+1297;ETHIOPIC SYLLABLE NWA;Lo;0;L;;;;;N;;;;;
+1298;ETHIOPIC SYLLABLE NYA;Lo;0;L;;;;;N;;;;;
+1299;ETHIOPIC SYLLABLE NYU;Lo;0;L;;;;;N;;;;;
+129A;ETHIOPIC SYLLABLE NYI;Lo;0;L;;;;;N;;;;;
+129B;ETHIOPIC SYLLABLE NYAA;Lo;0;L;;;;;N;;;;;
+129C;ETHIOPIC SYLLABLE NYEE;Lo;0;L;;;;;N;;;;;
+129D;ETHIOPIC SYLLABLE NYE;Lo;0;L;;;;;N;;;;;
+129E;ETHIOPIC SYLLABLE NYO;Lo;0;L;;;;;N;;;;;
+129F;ETHIOPIC SYLLABLE NYWA;Lo;0;L;;;;;N;;;;;
+12A0;ETHIOPIC SYLLABLE GLOTTAL A;Lo;0;L;;;;;N;;;;;
+12A1;ETHIOPIC SYLLABLE GLOTTAL U;Lo;0;L;;;;;N;;;;;
+12A2;ETHIOPIC SYLLABLE GLOTTAL I;Lo;0;L;;;;;N;;;;;
+12A3;ETHIOPIC SYLLABLE GLOTTAL AA;Lo;0;L;;;;;N;;;;;
+12A4;ETHIOPIC SYLLABLE GLOTTAL EE;Lo;0;L;;;;;N;;;;;
+12A5;ETHIOPIC SYLLABLE GLOTTAL E;Lo;0;L;;;;;N;;;;;
+12A6;ETHIOPIC SYLLABLE GLOTTAL O;Lo;0;L;;;;;N;;;;;
+12A7;ETHIOPIC SYLLABLE GLOTTAL WA;Lo;0;L;;;;;N;;;;;
+12A8;ETHIOPIC SYLLABLE KA;Lo;0;L;;;;;N;;;;;
+12A9;ETHIOPIC SYLLABLE KU;Lo;0;L;;;;;N;;;;;
+12AA;ETHIOPIC SYLLABLE KI;Lo;0;L;;;;;N;;;;;
+12AB;ETHIOPIC SYLLABLE KAA;Lo;0;L;;;;;N;;;;;
+12AC;ETHIOPIC SYLLABLE KEE;Lo;0;L;;;;;N;;;;;
+12AD;ETHIOPIC SYLLABLE KE;Lo;0;L;;;;;N;;;;;
+12AE;ETHIOPIC SYLLABLE KO;Lo;0;L;;;;;N;;;;;
+12B0;ETHIOPIC SYLLABLE KWA;Lo;0;L;;;;;N;;;;;
+12B2;ETHIOPIC SYLLABLE KWI;Lo;0;L;;;;;N;;;;;
+12B3;ETHIOPIC SYLLABLE KWAA;Lo;0;L;;;;;N;;;;;
+12B4;ETHIOPIC SYLLABLE KWEE;Lo;0;L;;;;;N;;;;;
+12B5;ETHIOPIC SYLLABLE KWE;Lo;0;L;;;;;N;;;;;
+12B8;ETHIOPIC SYLLABLE KXA;Lo;0;L;;;;;N;;;;;
+12B9;ETHIOPIC SYLLABLE KXU;Lo;0;L;;;;;N;;;;;
+12BA;ETHIOPIC SYLLABLE KXI;Lo;0;L;;;;;N;;;;;
+12BB;ETHIOPIC SYLLABLE KXAA;Lo;0;L;;;;;N;;;;;
+12BC;ETHIOPIC SYLLABLE KXEE;Lo;0;L;;;;;N;;;;;
+12BD;ETHIOPIC SYLLABLE KXE;Lo;0;L;;;;;N;;;;;
+12BE;ETHIOPIC SYLLABLE KXO;Lo;0;L;;;;;N;;;;;
+12C0;ETHIOPIC SYLLABLE KXWA;Lo;0;L;;;;;N;;;;;
+12C2;ETHIOPIC SYLLABLE KXWI;Lo;0;L;;;;;N;;;;;
+12C3;ETHIOPIC SYLLABLE KXWAA;Lo;0;L;;;;;N;;;;;
+12C4;ETHIOPIC SYLLABLE KXWEE;Lo;0;L;;;;;N;;;;;
+12C5;ETHIOPIC SYLLABLE KXWE;Lo;0;L;;;;;N;;;;;
+12C8;ETHIOPIC SYLLABLE WA;Lo;0;L;;;;;N;;;;;
+12C9;ETHIOPIC SYLLABLE WU;Lo;0;L;;;;;N;;;;;
+12CA;ETHIOPIC SYLLABLE WI;Lo;0;L;;;;;N;;;;;
+12CB;ETHIOPIC SYLLABLE WAA;Lo;0;L;;;;;N;;;;;
+12CC;ETHIOPIC SYLLABLE WEE;Lo;0;L;;;;;N;;;;;
+12CD;ETHIOPIC SYLLABLE WE;Lo;0;L;;;;;N;;;;;
+12CE;ETHIOPIC SYLLABLE WO;Lo;0;L;;;;;N;;;;;
+12D0;ETHIOPIC SYLLABLE PHARYNGEAL A;Lo;0;L;;;;;N;;;;;
+12D1;ETHIOPIC SYLLABLE PHARYNGEAL U;Lo;0;L;;;;;N;;;;;
+12D2;ETHIOPIC SYLLABLE PHARYNGEAL I;Lo;0;L;;;;;N;;;;;
+12D3;ETHIOPIC SYLLABLE PHARYNGEAL AA;Lo;0;L;;;;;N;;;;;
+12D4;ETHIOPIC SYLLABLE PHARYNGEAL EE;Lo;0;L;;;;;N;;;;;
+12D5;ETHIOPIC SYLLABLE PHARYNGEAL E;Lo;0;L;;;;;N;;;;;
+12D6;ETHIOPIC SYLLABLE PHARYNGEAL O;Lo;0;L;;;;;N;;;;;
+12D8;ETHIOPIC SYLLABLE ZA;Lo;0;L;;;;;N;;;;;
+12D9;ETHIOPIC SYLLABLE ZU;Lo;0;L;;;;;N;;;;;
+12DA;ETHIOPIC SYLLABLE ZI;Lo;0;L;;;;;N;;;;;
+12DB;ETHIOPIC SYLLABLE ZAA;Lo;0;L;;;;;N;;;;;
+12DC;ETHIOPIC SYLLABLE ZEE;Lo;0;L;;;;;N;;;;;
+12DD;ETHIOPIC SYLLABLE ZE;Lo;0;L;;;;;N;;;;;
+12DE;ETHIOPIC SYLLABLE ZO;Lo;0;L;;;;;N;;;;;
+12DF;ETHIOPIC SYLLABLE ZWA;Lo;0;L;;;;;N;;;;;
+12E0;ETHIOPIC SYLLABLE ZHA;Lo;0;L;;;;;N;;;;;
+12E1;ETHIOPIC SYLLABLE ZHU;Lo;0;L;;;;;N;;;;;
+12E2;ETHIOPIC SYLLABLE ZHI;Lo;0;L;;;;;N;;;;;
+12E3;ETHIOPIC SYLLABLE ZHAA;Lo;0;L;;;;;N;;;;;
+12E4;ETHIOPIC SYLLABLE ZHEE;Lo;0;L;;;;;N;;;;;
+12E5;ETHIOPIC SYLLABLE ZHE;Lo;0;L;;;;;N;;;;;
+12E6;ETHIOPIC SYLLABLE ZHO;Lo;0;L;;;;;N;;;;;
+12E7;ETHIOPIC SYLLABLE ZHWA;Lo;0;L;;;;;N;;;;;
+12E8;ETHIOPIC SYLLABLE YA;Lo;0;L;;;;;N;;;;;
+12E9;ETHIOPIC SYLLABLE YU;Lo;0;L;;;;;N;;;;;
+12EA;ETHIOPIC SYLLABLE YI;Lo;0;L;;;;;N;;;;;
+12EB;ETHIOPIC SYLLABLE YAA;Lo;0;L;;;;;N;;;;;
+12EC;ETHIOPIC SYLLABLE YEE;Lo;0;L;;;;;N;;;;;
+12ED;ETHIOPIC SYLLABLE YE;Lo;0;L;;;;;N;;;;;
+12EE;ETHIOPIC SYLLABLE YO;Lo;0;L;;;;;N;;;;;
+12F0;ETHIOPIC SYLLABLE DA;Lo;0;L;;;;;N;;;;;
+12F1;ETHIOPIC SYLLABLE DU;Lo;0;L;;;;;N;;;;;
+12F2;ETHIOPIC SYLLABLE DI;Lo;0;L;;;;;N;;;;;
+12F3;ETHIOPIC SYLLABLE DAA;Lo;0;L;;;;;N;;;;;
+12F4;ETHIOPIC SYLLABLE DEE;Lo;0;L;;;;;N;;;;;
+12F5;ETHIOPIC SYLLABLE DE;Lo;0;L;;;;;N;;;;;
+12F6;ETHIOPIC SYLLABLE DO;Lo;0;L;;;;;N;;;;;
+12F7;ETHIOPIC SYLLABLE DWA;Lo;0;L;;;;;N;;;;;
+12F8;ETHIOPIC SYLLABLE DDA;Lo;0;L;;;;;N;;;;;
+12F9;ETHIOPIC SYLLABLE DDU;Lo;0;L;;;;;N;;;;;
+12FA;ETHIOPIC SYLLABLE DDI;Lo;0;L;;;;;N;;;;;
+12FB;ETHIOPIC SYLLABLE DDAA;Lo;0;L;;;;;N;;;;;
+12FC;ETHIOPIC SYLLABLE DDEE;Lo;0;L;;;;;N;;;;;
+12FD;ETHIOPIC SYLLABLE DDE;Lo;0;L;;;;;N;;;;;
+12FE;ETHIOPIC SYLLABLE DDO;Lo;0;L;;;;;N;;;;;
+12FF;ETHIOPIC SYLLABLE DDWA;Lo;0;L;;;;;N;;;;;
+1300;ETHIOPIC SYLLABLE JA;Lo;0;L;;;;;N;;;;;
+1301;ETHIOPIC SYLLABLE JU;Lo;0;L;;;;;N;;;;;
+1302;ETHIOPIC SYLLABLE JI;Lo;0;L;;;;;N;;;;;
+1303;ETHIOPIC SYLLABLE JAA;Lo;0;L;;;;;N;;;;;
+1304;ETHIOPIC SYLLABLE JEE;Lo;0;L;;;;;N;;;;;
+1305;ETHIOPIC SYLLABLE JE;Lo;0;L;;;;;N;;;;;
+1306;ETHIOPIC SYLLABLE JO;Lo;0;L;;;;;N;;;;;
+1307;ETHIOPIC SYLLABLE JWA;Lo;0;L;;;;;N;;;;;
+1308;ETHIOPIC SYLLABLE GA;Lo;0;L;;;;;N;;;;;
+1309;ETHIOPIC SYLLABLE GU;Lo;0;L;;;;;N;;;;;
+130A;ETHIOPIC SYLLABLE GI;Lo;0;L;;;;;N;;;;;
+130B;ETHIOPIC SYLLABLE GAA;Lo;0;L;;;;;N;;;;;
+130C;ETHIOPIC SYLLABLE GEE;Lo;0;L;;;;;N;;;;;
+130D;ETHIOPIC SYLLABLE GE;Lo;0;L;;;;;N;;;;;
+130E;ETHIOPIC SYLLABLE GO;Lo;0;L;;;;;N;;;;;
+1310;ETHIOPIC SYLLABLE GWA;Lo;0;L;;;;;N;;;;;
+1312;ETHIOPIC SYLLABLE GWI;Lo;0;L;;;;;N;;;;;
+1313;ETHIOPIC SYLLABLE GWAA;Lo;0;L;;;;;N;;;;;
+1314;ETHIOPIC SYLLABLE GWEE;Lo;0;L;;;;;N;;;;;
+1315;ETHIOPIC SYLLABLE GWE;Lo;0;L;;;;;N;;;;;
+1318;ETHIOPIC SYLLABLE GGA;Lo;0;L;;;;;N;;;;;
+1319;ETHIOPIC SYLLABLE GGU;Lo;0;L;;;;;N;;;;;
+131A;ETHIOPIC SYLLABLE GGI;Lo;0;L;;;;;N;;;;;
+131B;ETHIOPIC SYLLABLE GGAA;Lo;0;L;;;;;N;;;;;
+131C;ETHIOPIC SYLLABLE GGEE;Lo;0;L;;;;;N;;;;;
+131D;ETHIOPIC SYLLABLE GGE;Lo;0;L;;;;;N;;;;;
+131E;ETHIOPIC SYLLABLE GGO;Lo;0;L;;;;;N;;;;;
+1320;ETHIOPIC SYLLABLE THA;Lo;0;L;;;;;N;;;;;
+1321;ETHIOPIC SYLLABLE THU;Lo;0;L;;;;;N;;;;;
+1322;ETHIOPIC SYLLABLE THI;Lo;0;L;;;;;N;;;;;
+1323;ETHIOPIC SYLLABLE THAA;Lo;0;L;;;;;N;;;;;
+1324;ETHIOPIC SYLLABLE THEE;Lo;0;L;;;;;N;;;;;
+1325;ETHIOPIC SYLLABLE THE;Lo;0;L;;;;;N;;;;;
+1326;ETHIOPIC SYLLABLE THO;Lo;0;L;;;;;N;;;;;
+1327;ETHIOPIC SYLLABLE THWA;Lo;0;L;;;;;N;;;;;
+1328;ETHIOPIC SYLLABLE CHA;Lo;0;L;;;;;N;;;;;
+1329;ETHIOPIC SYLLABLE CHU;Lo;0;L;;;;;N;;;;;
+132A;ETHIOPIC SYLLABLE CHI;Lo;0;L;;;;;N;;;;;
+132B;ETHIOPIC SYLLABLE CHAA;Lo;0;L;;;;;N;;;;;
+132C;ETHIOPIC SYLLABLE CHEE;Lo;0;L;;;;;N;;;;;
+132D;ETHIOPIC SYLLABLE CHE;Lo;0;L;;;;;N;;;;;
+132E;ETHIOPIC SYLLABLE CHO;Lo;0;L;;;;;N;;;;;
+132F;ETHIOPIC SYLLABLE CHWA;Lo;0;L;;;;;N;;;;;
+1330;ETHIOPIC SYLLABLE PHA;Lo;0;L;;;;;N;;;;;
+1331;ETHIOPIC SYLLABLE PHU;Lo;0;L;;;;;N;;;;;
+1332;ETHIOPIC SYLLABLE PHI;Lo;0;L;;;;;N;;;;;
+1333;ETHIOPIC SYLLABLE PHAA;Lo;0;L;;;;;N;;;;;
+1334;ETHIOPIC SYLLABLE PHEE;Lo;0;L;;;;;N;;;;;
+1335;ETHIOPIC SYLLABLE PHE;Lo;0;L;;;;;N;;;;;
+1336;ETHIOPIC SYLLABLE PHO;Lo;0;L;;;;;N;;;;;
+1337;ETHIOPIC SYLLABLE PHWA;Lo;0;L;;;;;N;;;;;
+1338;ETHIOPIC SYLLABLE TSA;Lo;0;L;;;;;N;;;;;
+1339;ETHIOPIC SYLLABLE TSU;Lo;0;L;;;;;N;;;;;
+133A;ETHIOPIC SYLLABLE TSI;Lo;0;L;;;;;N;;;;;
+133B;ETHIOPIC SYLLABLE TSAA;Lo;0;L;;;;;N;;;;;
+133C;ETHIOPIC SYLLABLE TSEE;Lo;0;L;;;;;N;;;;;
+133D;ETHIOPIC SYLLABLE TSE;Lo;0;L;;;;;N;;;;;
+133E;ETHIOPIC SYLLABLE TSO;Lo;0;L;;;;;N;;;;;
+133F;ETHIOPIC SYLLABLE TSWA;Lo;0;L;;;;;N;;;;;
+1340;ETHIOPIC SYLLABLE TZA;Lo;0;L;;;;;N;;;;;
+1341;ETHIOPIC SYLLABLE TZU;Lo;0;L;;;;;N;;;;;
+1342;ETHIOPIC SYLLABLE TZI;Lo;0;L;;;;;N;;;;;
+1343;ETHIOPIC SYLLABLE TZAA;Lo;0;L;;;;;N;;;;;
+1344;ETHIOPIC SYLLABLE TZEE;Lo;0;L;;;;;N;;;;;
+1345;ETHIOPIC SYLLABLE TZE;Lo;0;L;;;;;N;;;;;
+1346;ETHIOPIC SYLLABLE TZO;Lo;0;L;;;;;N;;;;;
+1348;ETHIOPIC SYLLABLE FA;Lo;0;L;;;;;N;;;;;
+1349;ETHIOPIC SYLLABLE FU;Lo;0;L;;;;;N;;;;;
+134A;ETHIOPIC SYLLABLE FI;Lo;0;L;;;;;N;;;;;
+134B;ETHIOPIC SYLLABLE FAA;Lo;0;L;;;;;N;;;;;
+134C;ETHIOPIC SYLLABLE FEE;Lo;0;L;;;;;N;;;;;
+134D;ETHIOPIC SYLLABLE FE;Lo;0;L;;;;;N;;;;;
+134E;ETHIOPIC SYLLABLE FO;Lo;0;L;;;;;N;;;;;
+134F;ETHIOPIC SYLLABLE FWA;Lo;0;L;;;;;N;;;;;
+1350;ETHIOPIC SYLLABLE PA;Lo;0;L;;;;;N;;;;;
+1351;ETHIOPIC SYLLABLE PU;Lo;0;L;;;;;N;;;;;
+1352;ETHIOPIC SYLLABLE PI;Lo;0;L;;;;;N;;;;;
+1353;ETHIOPIC SYLLABLE PAA;Lo;0;L;;;;;N;;;;;
+1354;ETHIOPIC SYLLABLE PEE;Lo;0;L;;;;;N;;;;;
+1355;ETHIOPIC SYLLABLE PE;Lo;0;L;;;;;N;;;;;
+1356;ETHIOPIC SYLLABLE PO;Lo;0;L;;;;;N;;;;;
+1357;ETHIOPIC SYLLABLE PWA;Lo;0;L;;;;;N;;;;;
+1358;ETHIOPIC SYLLABLE RYA;Lo;0;L;;;;;N;;;;;
+1359;ETHIOPIC SYLLABLE MYA;Lo;0;L;;;;;N;;;;;
+135A;ETHIOPIC SYLLABLE FYA;Lo;0;L;;;;;N;;;;;
+1361;ETHIOPIC WORDSPACE;Po;0;L;;;;;N;;;;;
+1362;ETHIOPIC FULL STOP;Po;0;L;;;;;N;;;;;
+1363;ETHIOPIC COMMA;Po;0;L;;;;;N;;;;;
+1364;ETHIOPIC SEMICOLON;Po;0;L;;;;;N;;;;;
+1365;ETHIOPIC COLON;Po;0;L;;;;;N;;;;;
+1366;ETHIOPIC PREFACE COLON;Po;0;L;;;;;N;;;;;
+1367;ETHIOPIC QUESTION MARK;Po;0;L;;;;;N;;;;;
+1368;ETHIOPIC PARAGRAPH SEPARATOR;Po;0;L;;;;;N;;;;;
+1369;ETHIOPIC DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+136A;ETHIOPIC DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+136B;ETHIOPIC DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+136C;ETHIOPIC DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+136D;ETHIOPIC DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+136E;ETHIOPIC DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+136F;ETHIOPIC DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+1370;ETHIOPIC DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+1371;ETHIOPIC DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+1372;ETHIOPIC NUMBER TEN;No;0;L;;;;10;N;;;;;
+1373;ETHIOPIC NUMBER TWENTY;No;0;L;;;;20;N;;;;;
+1374;ETHIOPIC NUMBER THIRTY;No;0;L;;;;30;N;;;;;
+1375;ETHIOPIC NUMBER FORTY;No;0;L;;;;40;N;;;;;
+1376;ETHIOPIC NUMBER FIFTY;No;0;L;;;;50;N;;;;;
+1377;ETHIOPIC NUMBER SIXTY;No;0;L;;;;60;N;;;;;
+1378;ETHIOPIC NUMBER SEVENTY;No;0;L;;;;70;N;;;;;
+1379;ETHIOPIC NUMBER EIGHTY;No;0;L;;;;80;N;;;;;
+137A;ETHIOPIC NUMBER NINETY;No;0;L;;;;90;N;;;;;
+137B;ETHIOPIC NUMBER HUNDRED;No;0;L;;;;100;N;;;;;
+137C;ETHIOPIC NUMBER TEN THOUSAND;No;0;L;;;;10000;N;;;;;
+13A0;CHEROKEE LETTER A;Lo;0;L;;;;;N;;;;;
+13A1;CHEROKEE LETTER E;Lo;0;L;;;;;N;;;;;
+13A2;CHEROKEE LETTER I;Lo;0;L;;;;;N;;;;;
+13A3;CHEROKEE LETTER O;Lo;0;L;;;;;N;;;;;
+13A4;CHEROKEE LETTER U;Lo;0;L;;;;;N;;;;;
+13A5;CHEROKEE LETTER V;Lo;0;L;;;;;N;;;;;
+13A6;CHEROKEE LETTER GA;Lo;0;L;;;;;N;;;;;
+13A7;CHEROKEE LETTER KA;Lo;0;L;;;;;N;;;;;
+13A8;CHEROKEE LETTER GE;Lo;0;L;;;;;N;;;;;
+13A9;CHEROKEE LETTER GI;Lo;0;L;;;;;N;;;;;
+13AA;CHEROKEE LETTER GO;Lo;0;L;;;;;N;;;;;
+13AB;CHEROKEE LETTER GU;Lo;0;L;;;;;N;;;;;
+13AC;CHEROKEE LETTER GV;Lo;0;L;;;;;N;;;;;
+13AD;CHEROKEE LETTER HA;Lo;0;L;;;;;N;;;;;
+13AE;CHEROKEE LETTER HE;Lo;0;L;;;;;N;;;;;
+13AF;CHEROKEE LETTER HI;Lo;0;L;;;;;N;;;;;
+13B0;CHEROKEE LETTER HO;Lo;0;L;;;;;N;;;;;
+13B1;CHEROKEE LETTER HU;Lo;0;L;;;;;N;;;;;
+13B2;CHEROKEE LETTER HV;Lo;0;L;;;;;N;;;;;
+13B3;CHEROKEE LETTER LA;Lo;0;L;;;;;N;;;;;
+13B4;CHEROKEE LETTER LE;Lo;0;L;;;;;N;;;;;
+13B5;CHEROKEE LETTER LI;Lo;0;L;;;;;N;;;;;
+13B6;CHEROKEE LETTER LO;Lo;0;L;;;;;N;;;;;
+13B7;CHEROKEE LETTER LU;Lo;0;L;;;;;N;;;;;
+13B8;CHEROKEE LETTER LV;Lo;0;L;;;;;N;;;;;
+13B9;CHEROKEE LETTER MA;Lo;0;L;;;;;N;;;;;
+13BA;CHEROKEE LETTER ME;Lo;0;L;;;;;N;;;;;
+13BB;CHEROKEE LETTER MI;Lo;0;L;;;;;N;;;;;
+13BC;CHEROKEE LETTER MO;Lo;0;L;;;;;N;;;;;
+13BD;CHEROKEE LETTER MU;Lo;0;L;;;;;N;;;;;
+13BE;CHEROKEE LETTER NA;Lo;0;L;;;;;N;;;;;
+13BF;CHEROKEE LETTER HNA;Lo;0;L;;;;;N;;;;;
+13C0;CHEROKEE LETTER NAH;Lo;0;L;;;;;N;;;;;
+13C1;CHEROKEE LETTER NE;Lo;0;L;;;;;N;;;;;
+13C2;CHEROKEE LETTER NI;Lo;0;L;;;;;N;;;;;
+13C3;CHEROKEE LETTER NO;Lo;0;L;;;;;N;;;;;
+13C4;CHEROKEE LETTER NU;Lo;0;L;;;;;N;;;;;
+13C5;CHEROKEE LETTER NV;Lo;0;L;;;;;N;;;;;
+13C6;CHEROKEE LETTER QUA;Lo;0;L;;;;;N;;;;;
+13C7;CHEROKEE LETTER QUE;Lo;0;L;;;;;N;;;;;
+13C8;CHEROKEE LETTER QUI;Lo;0;L;;;;;N;;;;;
+13C9;CHEROKEE LETTER QUO;Lo;0;L;;;;;N;;;;;
+13CA;CHEROKEE LETTER QUU;Lo;0;L;;;;;N;;;;;
+13CB;CHEROKEE LETTER QUV;Lo;0;L;;;;;N;;;;;
+13CC;CHEROKEE LETTER SA;Lo;0;L;;;;;N;;;;;
+13CD;CHEROKEE LETTER S;Lo;0;L;;;;;N;;;;;
+13CE;CHEROKEE LETTER SE;Lo;0;L;;;;;N;;;;;
+13CF;CHEROKEE LETTER SI;Lo;0;L;;;;;N;;;;;
+13D0;CHEROKEE LETTER SO;Lo;0;L;;;;;N;;;;;
+13D1;CHEROKEE LETTER SU;Lo;0;L;;;;;N;;;;;
+13D2;CHEROKEE LETTER SV;Lo;0;L;;;;;N;;;;;
+13D3;CHEROKEE LETTER DA;Lo;0;L;;;;;N;;;;;
+13D4;CHEROKEE LETTER TA;Lo;0;L;;;;;N;;;;;
+13D5;CHEROKEE LETTER DE;Lo;0;L;;;;;N;;;;;
+13D6;CHEROKEE LETTER TE;Lo;0;L;;;;;N;;;;;
+13D7;CHEROKEE LETTER DI;Lo;0;L;;;;;N;;;;;
+13D8;CHEROKEE LETTER TI;Lo;0;L;;;;;N;;;;;
+13D9;CHEROKEE LETTER DO;Lo;0;L;;;;;N;;;;;
+13DA;CHEROKEE LETTER DU;Lo;0;L;;;;;N;;;;;
+13DB;CHEROKEE LETTER DV;Lo;0;L;;;;;N;;;;;
+13DC;CHEROKEE LETTER DLA;Lo;0;L;;;;;N;;;;;
+13DD;CHEROKEE LETTER TLA;Lo;0;L;;;;;N;;;;;
+13DE;CHEROKEE LETTER TLE;Lo;0;L;;;;;N;;;;;
+13DF;CHEROKEE LETTER TLI;Lo;0;L;;;;;N;;;;;
+13E0;CHEROKEE LETTER TLO;Lo;0;L;;;;;N;;;;;
+13E1;CHEROKEE LETTER TLU;Lo;0;L;;;;;N;;;;;
+13E2;CHEROKEE LETTER TLV;Lo;0;L;;;;;N;;;;;
+13E3;CHEROKEE LETTER TSA;Lo;0;L;;;;;N;;;;;
+13E4;CHEROKEE LETTER TSE;Lo;0;L;;;;;N;;;;;
+13E5;CHEROKEE LETTER TSI;Lo;0;L;;;;;N;;;;;
+13E6;CHEROKEE LETTER TSO;Lo;0;L;;;;;N;;;;;
+13E7;CHEROKEE LETTER TSU;Lo;0;L;;;;;N;;;;;
+13E8;CHEROKEE LETTER TSV;Lo;0;L;;;;;N;;;;;
+13E9;CHEROKEE LETTER WA;Lo;0;L;;;;;N;;;;;
+13EA;CHEROKEE LETTER WE;Lo;0;L;;;;;N;;;;;
+13EB;CHEROKEE LETTER WI;Lo;0;L;;;;;N;;;;;
+13EC;CHEROKEE LETTER WO;Lo;0;L;;;;;N;;;;;
+13ED;CHEROKEE LETTER WU;Lo;0;L;;;;;N;;;;;
+13EE;CHEROKEE LETTER WV;Lo;0;L;;;;;N;;;;;
+13EF;CHEROKEE LETTER YA;Lo;0;L;;;;;N;;;;;
+13F0;CHEROKEE LETTER YE;Lo;0;L;;;;;N;;;;;
+13F1;CHEROKEE LETTER YI;Lo;0;L;;;;;N;;;;;
+13F2;CHEROKEE LETTER YO;Lo;0;L;;;;;N;;;;;
+13F3;CHEROKEE LETTER YU;Lo;0;L;;;;;N;;;;;
+13F4;CHEROKEE LETTER YV;Lo;0;L;;;;;N;;;;;
+1401;CANADIAN SYLLABICS E;Lo;0;L;;;;;N;;;;;
+1402;CANADIAN SYLLABICS AAI;Lo;0;L;;;;;N;;;;;
+1403;CANADIAN SYLLABICS I;Lo;0;L;;;;;N;;;;;
+1404;CANADIAN SYLLABICS II;Lo;0;L;;;;;N;;;;;
+1405;CANADIAN SYLLABICS O;Lo;0;L;;;;;N;;;;;
+1406;CANADIAN SYLLABICS OO;Lo;0;L;;;;;N;;;;;
+1407;CANADIAN SYLLABICS Y-CREE OO;Lo;0;L;;;;;N;;;;;
+1408;CANADIAN SYLLABICS CARRIER EE;Lo;0;L;;;;;N;;;;;
+1409;CANADIAN SYLLABICS CARRIER I;Lo;0;L;;;;;N;;;;;
+140A;CANADIAN SYLLABICS A;Lo;0;L;;;;;N;;;;;
+140B;CANADIAN SYLLABICS AA;Lo;0;L;;;;;N;;;;;
+140C;CANADIAN SYLLABICS WE;Lo;0;L;;;;;N;;;;;
+140D;CANADIAN SYLLABICS WEST-CREE WE;Lo;0;L;;;;;N;;;;;
+140E;CANADIAN SYLLABICS WI;Lo;0;L;;;;;N;;;;;
+140F;CANADIAN SYLLABICS WEST-CREE WI;Lo;0;L;;;;;N;;;;;
+1410;CANADIAN SYLLABICS WII;Lo;0;L;;;;;N;;;;;
+1411;CANADIAN SYLLABICS WEST-CREE WII;Lo;0;L;;;;;N;;;;;
+1412;CANADIAN SYLLABICS WO;Lo;0;L;;;;;N;;;;;
+1413;CANADIAN SYLLABICS WEST-CREE WO;Lo;0;L;;;;;N;;;;;
+1414;CANADIAN SYLLABICS WOO;Lo;0;L;;;;;N;;;;;
+1415;CANADIAN SYLLABICS WEST-CREE WOO;Lo;0;L;;;;;N;;;;;
+1416;CANADIAN SYLLABICS NASKAPI WOO;Lo;0;L;;;;;N;;;;;
+1417;CANADIAN SYLLABICS WA;Lo;0;L;;;;;N;;;;;
+1418;CANADIAN SYLLABICS WEST-CREE WA;Lo;0;L;;;;;N;;;;;
+1419;CANADIAN SYLLABICS WAA;Lo;0;L;;;;;N;;;;;
+141A;CANADIAN SYLLABICS WEST-CREE WAA;Lo;0;L;;;;;N;;;;;
+141B;CANADIAN SYLLABICS NASKAPI WAA;Lo;0;L;;;;;N;;;;;
+141C;CANADIAN SYLLABICS AI;Lo;0;L;;;;;N;;;;;
+141D;CANADIAN SYLLABICS Y-CREE W;Lo;0;L;;;;;N;;;;;
+141E;CANADIAN SYLLABICS GLOTTAL STOP;Lo;0;L;;;;;N;;;;;
+141F;CANADIAN SYLLABICS FINAL ACUTE;Lo;0;L;;;;;N;;;;;
+1420;CANADIAN SYLLABICS FINAL GRAVE;Lo;0;L;;;;;N;;;;;
+1421;CANADIAN SYLLABICS FINAL BOTTOM HALF RING;Lo;0;L;;;;;N;;;;;
+1422;CANADIAN SYLLABICS FINAL TOP HALF RING;Lo;0;L;;;;;N;;;;;
+1423;CANADIAN SYLLABICS FINAL RIGHT HALF RING;Lo;0;L;;;;;N;;;;;
+1424;CANADIAN SYLLABICS FINAL RING;Lo;0;L;;;;;N;;;;;
+1425;CANADIAN SYLLABICS FINAL DOUBLE ACUTE;Lo;0;L;;;;;N;;;;;
+1426;CANADIAN SYLLABICS FINAL DOUBLE SHORT VERTICAL STROKES;Lo;0;L;;;;;N;;;;;
+1427;CANADIAN SYLLABICS FINAL MIDDLE DOT;Lo;0;L;;;;;N;;;;;
+1428;CANADIAN SYLLABICS FINAL SHORT HORIZONTAL STROKE;Lo;0;L;;;;;N;;;;;
+1429;CANADIAN SYLLABICS FINAL PLUS;Lo;0;L;;;;;N;;;;;
+142A;CANADIAN SYLLABICS FINAL DOWN TACK;Lo;0;L;;;;;N;;;;;
+142B;CANADIAN SYLLABICS EN;Lo;0;L;;;;;N;;;;;
+142C;CANADIAN SYLLABICS IN;Lo;0;L;;;;;N;;;;;
+142D;CANADIAN SYLLABICS ON;Lo;0;L;;;;;N;;;;;
+142E;CANADIAN SYLLABICS AN;Lo;0;L;;;;;N;;;;;
+142F;CANADIAN SYLLABICS PE;Lo;0;L;;;;;N;;;;;
+1430;CANADIAN SYLLABICS PAAI;Lo;0;L;;;;;N;;;;;
+1431;CANADIAN SYLLABICS PI;Lo;0;L;;;;;N;;;;;
+1432;CANADIAN SYLLABICS PII;Lo;0;L;;;;;N;;;;;
+1433;CANADIAN SYLLABICS PO;Lo;0;L;;;;;N;;;;;
+1434;CANADIAN SYLLABICS POO;Lo;0;L;;;;;N;;;;;
+1435;CANADIAN SYLLABICS Y-CREE POO;Lo;0;L;;;;;N;;;;;
+1436;CANADIAN SYLLABICS CARRIER HEE;Lo;0;L;;;;;N;;;;;
+1437;CANADIAN SYLLABICS CARRIER HI;Lo;0;L;;;;;N;;;;;
+1438;CANADIAN SYLLABICS PA;Lo;0;L;;;;;N;;;;;
+1439;CANADIAN SYLLABICS PAA;Lo;0;L;;;;;N;;;;;
+143A;CANADIAN SYLLABICS PWE;Lo;0;L;;;;;N;;;;;
+143B;CANADIAN SYLLABICS WEST-CREE PWE;Lo;0;L;;;;;N;;;;;
+143C;CANADIAN SYLLABICS PWI;Lo;0;L;;;;;N;;;;;
+143D;CANADIAN SYLLABICS WEST-CREE PWI;Lo;0;L;;;;;N;;;;;
+143E;CANADIAN SYLLABICS PWII;Lo;0;L;;;;;N;;;;;
+143F;CANADIAN SYLLABICS WEST-CREE PWII;Lo;0;L;;;;;N;;;;;
+1440;CANADIAN SYLLABICS PWO;Lo;0;L;;;;;N;;;;;
+1441;CANADIAN SYLLABICS WEST-CREE PWO;Lo;0;L;;;;;N;;;;;
+1442;CANADIAN SYLLABICS PWOO;Lo;0;L;;;;;N;;;;;
+1443;CANADIAN SYLLABICS WEST-CREE PWOO;Lo;0;L;;;;;N;;;;;
+1444;CANADIAN SYLLABICS PWA;Lo;0;L;;;;;N;;;;;
+1445;CANADIAN SYLLABICS WEST-CREE PWA;Lo;0;L;;;;;N;;;;;
+1446;CANADIAN SYLLABICS PWAA;Lo;0;L;;;;;N;;;;;
+1447;CANADIAN SYLLABICS WEST-CREE PWAA;Lo;0;L;;;;;N;;;;;
+1448;CANADIAN SYLLABICS Y-CREE PWAA;Lo;0;L;;;;;N;;;;;
+1449;CANADIAN SYLLABICS P;Lo;0;L;;;;;N;;;;;
+144A;CANADIAN SYLLABICS WEST-CREE P;Lo;0;L;;;;;N;;;;;
+144B;CANADIAN SYLLABICS CARRIER H;Lo;0;L;;;;;N;;;;;
+144C;CANADIAN SYLLABICS TE;Lo;0;L;;;;;N;;;;;
+144D;CANADIAN SYLLABICS TAAI;Lo;0;L;;;;;N;;;;;
+144E;CANADIAN SYLLABICS TI;Lo;0;L;;;;;N;;;;;
+144F;CANADIAN SYLLABICS TII;Lo;0;L;;;;;N;;;;;
+1450;CANADIAN SYLLABICS TO;Lo;0;L;;;;;N;;;;;
+1451;CANADIAN SYLLABICS TOO;Lo;0;L;;;;;N;;;;;
+1452;CANADIAN SYLLABICS Y-CREE TOO;Lo;0;L;;;;;N;;;;;
+1453;CANADIAN SYLLABICS CARRIER DEE;Lo;0;L;;;;;N;;;;;
+1454;CANADIAN SYLLABICS CARRIER DI;Lo;0;L;;;;;N;;;;;
+1455;CANADIAN SYLLABICS TA;Lo;0;L;;;;;N;;;;;
+1456;CANADIAN SYLLABICS TAA;Lo;0;L;;;;;N;;;;;
+1457;CANADIAN SYLLABICS TWE;Lo;0;L;;;;;N;;;;;
+1458;CANADIAN SYLLABICS WEST-CREE TWE;Lo;0;L;;;;;N;;;;;
+1459;CANADIAN SYLLABICS TWI;Lo;0;L;;;;;N;;;;;
+145A;CANADIAN SYLLABICS WEST-CREE TWI;Lo;0;L;;;;;N;;;;;
+145B;CANADIAN SYLLABICS TWII;Lo;0;L;;;;;N;;;;;
+145C;CANADIAN SYLLABICS WEST-CREE TWII;Lo;0;L;;;;;N;;;;;
+145D;CANADIAN SYLLABICS TWO;Lo;0;L;;;;;N;;;;;
+145E;CANADIAN SYLLABICS WEST-CREE TWO;Lo;0;L;;;;;N;;;;;
+145F;CANADIAN SYLLABICS TWOO;Lo;0;L;;;;;N;;;;;
+1460;CANADIAN SYLLABICS WEST-CREE TWOO;Lo;0;L;;;;;N;;;;;
+1461;CANADIAN SYLLABICS TWA;Lo;0;L;;;;;N;;;;;
+1462;CANADIAN SYLLABICS WEST-CREE TWA;Lo;0;L;;;;;N;;;;;
+1463;CANADIAN SYLLABICS TWAA;Lo;0;L;;;;;N;;;;;
+1464;CANADIAN SYLLABICS WEST-CREE TWAA;Lo;0;L;;;;;N;;;;;
+1465;CANADIAN SYLLABICS NASKAPI TWAA;Lo;0;L;;;;;N;;;;;
+1466;CANADIAN SYLLABICS T;Lo;0;L;;;;;N;;;;;
+1467;CANADIAN SYLLABICS TTE;Lo;0;L;;;;;N;;;;;
+1468;CANADIAN SYLLABICS TTI;Lo;0;L;;;;;N;;;;;
+1469;CANADIAN SYLLABICS TTO;Lo;0;L;;;;;N;;;;;
+146A;CANADIAN SYLLABICS TTA;Lo;0;L;;;;;N;;;;;
+146B;CANADIAN SYLLABICS KE;Lo;0;L;;;;;N;;;;;
+146C;CANADIAN SYLLABICS KAAI;Lo;0;L;;;;;N;;;;;
+146D;CANADIAN SYLLABICS KI;Lo;0;L;;;;;N;;;;;
+146E;CANADIAN SYLLABICS KII;Lo;0;L;;;;;N;;;;;
+146F;CANADIAN SYLLABICS KO;Lo;0;L;;;;;N;;;;;
+1470;CANADIAN SYLLABICS KOO;Lo;0;L;;;;;N;;;;;
+1471;CANADIAN SYLLABICS Y-CREE KOO;Lo;0;L;;;;;N;;;;;
+1472;CANADIAN SYLLABICS KA;Lo;0;L;;;;;N;;;;;
+1473;CANADIAN SYLLABICS KAA;Lo;0;L;;;;;N;;;;;
+1474;CANADIAN SYLLABICS KWE;Lo;0;L;;;;;N;;;;;
+1475;CANADIAN SYLLABICS WEST-CREE KWE;Lo;0;L;;;;;N;;;;;
+1476;CANADIAN SYLLABICS KWI;Lo;0;L;;;;;N;;;;;
+1477;CANADIAN SYLLABICS WEST-CREE KWI;Lo;0;L;;;;;N;;;;;
+1478;CANADIAN SYLLABICS KWII;Lo;0;L;;;;;N;;;;;
+1479;CANADIAN SYLLABICS WEST-CREE KWII;Lo;0;L;;;;;N;;;;;
+147A;CANADIAN SYLLABICS KWO;Lo;0;L;;;;;N;;;;;
+147B;CANADIAN SYLLABICS WEST-CREE KWO;Lo;0;L;;;;;N;;;;;
+147C;CANADIAN SYLLABICS KWOO;Lo;0;L;;;;;N;;;;;
+147D;CANADIAN SYLLABICS WEST-CREE KWOO;Lo;0;L;;;;;N;;;;;
+147E;CANADIAN SYLLABICS KWA;Lo;0;L;;;;;N;;;;;
+147F;CANADIAN SYLLABICS WEST-CREE KWA;Lo;0;L;;;;;N;;;;;
+1480;CANADIAN SYLLABICS KWAA;Lo;0;L;;;;;N;;;;;
+1481;CANADIAN SYLLABICS WEST-CREE KWAA;Lo;0;L;;;;;N;;;;;
+1482;CANADIAN SYLLABICS NASKAPI KWAA;Lo;0;L;;;;;N;;;;;
+1483;CANADIAN SYLLABICS K;Lo;0;L;;;;;N;;;;;
+1484;CANADIAN SYLLABICS KW;Lo;0;L;;;;;N;;;;;
+1485;CANADIAN SYLLABICS SOUTH-SLAVEY KEH;Lo;0;L;;;;;N;;;;;
+1486;CANADIAN SYLLABICS SOUTH-SLAVEY KIH;Lo;0;L;;;;;N;;;;;
+1487;CANADIAN SYLLABICS SOUTH-SLAVEY KOH;Lo;0;L;;;;;N;;;;;
+1488;CANADIAN SYLLABICS SOUTH-SLAVEY KAH;Lo;0;L;;;;;N;;;;;
+1489;CANADIAN SYLLABICS CE;Lo;0;L;;;;;N;;;;;
+148A;CANADIAN SYLLABICS CAAI;Lo;0;L;;;;;N;;;;;
+148B;CANADIAN SYLLABICS CI;Lo;0;L;;;;;N;;;;;
+148C;CANADIAN SYLLABICS CII;Lo;0;L;;;;;N;;;;;
+148D;CANADIAN SYLLABICS CO;Lo;0;L;;;;;N;;;;;
+148E;CANADIAN SYLLABICS COO;Lo;0;L;;;;;N;;;;;
+148F;CANADIAN SYLLABICS Y-CREE COO;Lo;0;L;;;;;N;;;;;
+1490;CANADIAN SYLLABICS CA;Lo;0;L;;;;;N;;;;;
+1491;CANADIAN SYLLABICS CAA;Lo;0;L;;;;;N;;;;;
+1492;CANADIAN SYLLABICS CWE;Lo;0;L;;;;;N;;;;;
+1493;CANADIAN SYLLABICS WEST-CREE CWE;Lo;0;L;;;;;N;;;;;
+1494;CANADIAN SYLLABICS CWI;Lo;0;L;;;;;N;;;;;
+1495;CANADIAN SYLLABICS WEST-CREE CWI;Lo;0;L;;;;;N;;;;;
+1496;CANADIAN SYLLABICS CWII;Lo;0;L;;;;;N;;;;;
+1497;CANADIAN SYLLABICS WEST-CREE CWII;Lo;0;L;;;;;N;;;;;
+1498;CANADIAN SYLLABICS CWO;Lo;0;L;;;;;N;;;;;
+1499;CANADIAN SYLLABICS WEST-CREE CWO;Lo;0;L;;;;;N;;;;;
+149A;CANADIAN SYLLABICS CWOO;Lo;0;L;;;;;N;;;;;
+149B;CANADIAN SYLLABICS WEST-CREE CWOO;Lo;0;L;;;;;N;;;;;
+149C;CANADIAN SYLLABICS CWA;Lo;0;L;;;;;N;;;;;
+149D;CANADIAN SYLLABICS WEST-CREE CWA;Lo;0;L;;;;;N;;;;;
+149E;CANADIAN SYLLABICS CWAA;Lo;0;L;;;;;N;;;;;
+149F;CANADIAN SYLLABICS WEST-CREE CWAA;Lo;0;L;;;;;N;;;;;
+14A0;CANADIAN SYLLABICS NASKAPI CWAA;Lo;0;L;;;;;N;;;;;
+14A1;CANADIAN SYLLABICS C;Lo;0;L;;;;;N;;;;;
+14A2;CANADIAN SYLLABICS SAYISI TH;Lo;0;L;;;;;N;;;;;
+14A3;CANADIAN SYLLABICS ME;Lo;0;L;;;;;N;;;;;
+14A4;CANADIAN SYLLABICS MAAI;Lo;0;L;;;;;N;;;;;
+14A5;CANADIAN SYLLABICS MI;Lo;0;L;;;;;N;;;;;
+14A6;CANADIAN SYLLABICS MII;Lo;0;L;;;;;N;;;;;
+14A7;CANADIAN SYLLABICS MO;Lo;0;L;;;;;N;;;;;
+14A8;CANADIAN SYLLABICS MOO;Lo;0;L;;;;;N;;;;;
+14A9;CANADIAN SYLLABICS Y-CREE MOO;Lo;0;L;;;;;N;;;;;
+14AA;CANADIAN SYLLABICS MA;Lo;0;L;;;;;N;;;;;
+14AB;CANADIAN SYLLABICS MAA;Lo;0;L;;;;;N;;;;;
+14AC;CANADIAN SYLLABICS MWE;Lo;0;L;;;;;N;;;;;
+14AD;CANADIAN SYLLABICS WEST-CREE MWE;Lo;0;L;;;;;N;;;;;
+14AE;CANADIAN SYLLABICS MWI;Lo;0;L;;;;;N;;;;;
+14AF;CANADIAN SYLLABICS WEST-CREE MWI;Lo;0;L;;;;;N;;;;;
+14B0;CANADIAN SYLLABICS MWII;Lo;0;L;;;;;N;;;;;
+14B1;CANADIAN SYLLABICS WEST-CREE MWII;Lo;0;L;;;;;N;;;;;
+14B2;CANADIAN SYLLABICS MWO;Lo;0;L;;;;;N;;;;;
+14B3;CANADIAN SYLLABICS WEST-CREE MWO;Lo;0;L;;;;;N;;;;;
+14B4;CANADIAN SYLLABICS MWOO;Lo;0;L;;;;;N;;;;;
+14B5;CANADIAN SYLLABICS WEST-CREE MWOO;Lo;0;L;;;;;N;;;;;
+14B6;CANADIAN SYLLABICS MWA;Lo;0;L;;;;;N;;;;;
+14B7;CANADIAN SYLLABICS WEST-CREE MWA;Lo;0;L;;;;;N;;;;;
+14B8;CANADIAN SYLLABICS MWAA;Lo;0;L;;;;;N;;;;;
+14B9;CANADIAN SYLLABICS WEST-CREE MWAA;Lo;0;L;;;;;N;;;;;
+14BA;CANADIAN SYLLABICS NASKAPI MWAA;Lo;0;L;;;;;N;;;;;
+14BB;CANADIAN SYLLABICS M;Lo;0;L;;;;;N;;;;;
+14BC;CANADIAN SYLLABICS WEST-CREE M;Lo;0;L;;;;;N;;;;;
+14BD;CANADIAN SYLLABICS MH;Lo;0;L;;;;;N;;;;;
+14BE;CANADIAN SYLLABICS ATHAPASCAN M;Lo;0;L;;;;;N;;;;;
+14BF;CANADIAN SYLLABICS SAYISI M;Lo;0;L;;;;;N;;;;;
+14C0;CANADIAN SYLLABICS NE;Lo;0;L;;;;;N;;;;;
+14C1;CANADIAN SYLLABICS NAAI;Lo;0;L;;;;;N;;;;;
+14C2;CANADIAN SYLLABICS NI;Lo;0;L;;;;;N;;;;;
+14C3;CANADIAN SYLLABICS NII;Lo;0;L;;;;;N;;;;;
+14C4;CANADIAN SYLLABICS NO;Lo;0;L;;;;;N;;;;;
+14C5;CANADIAN SYLLABICS NOO;Lo;0;L;;;;;N;;;;;
+14C6;CANADIAN SYLLABICS Y-CREE NOO;Lo;0;L;;;;;N;;;;;
+14C7;CANADIAN SYLLABICS NA;Lo;0;L;;;;;N;;;;;
+14C8;CANADIAN SYLLABICS NAA;Lo;0;L;;;;;N;;;;;
+14C9;CANADIAN SYLLABICS NWE;Lo;0;L;;;;;N;;;;;
+14CA;CANADIAN SYLLABICS WEST-CREE NWE;Lo;0;L;;;;;N;;;;;
+14CB;CANADIAN SYLLABICS NWA;Lo;0;L;;;;;N;;;;;
+14CC;CANADIAN SYLLABICS WEST-CREE NWA;Lo;0;L;;;;;N;;;;;
+14CD;CANADIAN SYLLABICS NWAA;Lo;0;L;;;;;N;;;;;
+14CE;CANADIAN SYLLABICS WEST-CREE NWAA;Lo;0;L;;;;;N;;;;;
+14CF;CANADIAN SYLLABICS NASKAPI NWAA;Lo;0;L;;;;;N;;;;;
+14D0;CANADIAN SYLLABICS N;Lo;0;L;;;;;N;;;;;
+14D1;CANADIAN SYLLABICS CARRIER NG;Lo;0;L;;;;;N;;;;;
+14D2;CANADIAN SYLLABICS NH;Lo;0;L;;;;;N;;;;;
+14D3;CANADIAN SYLLABICS LE;Lo;0;L;;;;;N;;;;;
+14D4;CANADIAN SYLLABICS LAAI;Lo;0;L;;;;;N;;;;;
+14D5;CANADIAN SYLLABICS LI;Lo;0;L;;;;;N;;;;;
+14D6;CANADIAN SYLLABICS LII;Lo;0;L;;;;;N;;;;;
+14D7;CANADIAN SYLLABICS LO;Lo;0;L;;;;;N;;;;;
+14D8;CANADIAN SYLLABICS LOO;Lo;0;L;;;;;N;;;;;
+14D9;CANADIAN SYLLABICS Y-CREE LOO;Lo;0;L;;;;;N;;;;;
+14DA;CANADIAN SYLLABICS LA;Lo;0;L;;;;;N;;;;;
+14DB;CANADIAN SYLLABICS LAA;Lo;0;L;;;;;N;;;;;
+14DC;CANADIAN SYLLABICS LWE;Lo;0;L;;;;;N;;;;;
+14DD;CANADIAN SYLLABICS WEST-CREE LWE;Lo;0;L;;;;;N;;;;;
+14DE;CANADIAN SYLLABICS LWI;Lo;0;L;;;;;N;;;;;
+14DF;CANADIAN SYLLABICS WEST-CREE LWI;Lo;0;L;;;;;N;;;;;
+14E0;CANADIAN SYLLABICS LWII;Lo;0;L;;;;;N;;;;;
+14E1;CANADIAN SYLLABICS WEST-CREE LWII;Lo;0;L;;;;;N;;;;;
+14E2;CANADIAN SYLLABICS LWO;Lo;0;L;;;;;N;;;;;
+14E3;CANADIAN SYLLABICS WEST-CREE LWO;Lo;0;L;;;;;N;;;;;
+14E4;CANADIAN SYLLABICS LWOO;Lo;0;L;;;;;N;;;;;
+14E5;CANADIAN SYLLABICS WEST-CREE LWOO;Lo;0;L;;;;;N;;;;;
+14E6;CANADIAN SYLLABICS LWA;Lo;0;L;;;;;N;;;;;
+14E7;CANADIAN SYLLABICS WEST-CREE LWA;Lo;0;L;;;;;N;;;;;
+14E8;CANADIAN SYLLABICS LWAA;Lo;0;L;;;;;N;;;;;
+14E9;CANADIAN SYLLABICS WEST-CREE LWAA;Lo;0;L;;;;;N;;;;;
+14EA;CANADIAN SYLLABICS L;Lo;0;L;;;;;N;;;;;
+14EB;CANADIAN SYLLABICS WEST-CREE L;Lo;0;L;;;;;N;;;;;
+14EC;CANADIAN SYLLABICS MEDIAL L;Lo;0;L;;;;;N;;;;;
+14ED;CANADIAN SYLLABICS SE;Lo;0;L;;;;;N;;;;;
+14EE;CANADIAN SYLLABICS SAAI;Lo;0;L;;;;;N;;;;;
+14EF;CANADIAN SYLLABICS SI;Lo;0;L;;;;;N;;;;;
+14F0;CANADIAN SYLLABICS SII;Lo;0;L;;;;;N;;;;;
+14F1;CANADIAN SYLLABICS SO;Lo;0;L;;;;;N;;;;;
+14F2;CANADIAN SYLLABICS SOO;Lo;0;L;;;;;N;;;;;
+14F3;CANADIAN SYLLABICS Y-CREE SOO;Lo;0;L;;;;;N;;;;;
+14F4;CANADIAN SYLLABICS SA;Lo;0;L;;;;;N;;;;;
+14F5;CANADIAN SYLLABICS SAA;Lo;0;L;;;;;N;;;;;
+14F6;CANADIAN SYLLABICS SWE;Lo;0;L;;;;;N;;;;;
+14F7;CANADIAN SYLLABICS WEST-CREE SWE;Lo;0;L;;;;;N;;;;;
+14F8;CANADIAN SYLLABICS SWI;Lo;0;L;;;;;N;;;;;
+14F9;CANADIAN SYLLABICS WEST-CREE SWI;Lo;0;L;;;;;N;;;;;
+14FA;CANADIAN SYLLABICS SWII;Lo;0;L;;;;;N;;;;;
+14FB;CANADIAN SYLLABICS WEST-CREE SWII;Lo;0;L;;;;;N;;;;;
+14FC;CANADIAN SYLLABICS SWO;Lo;0;L;;;;;N;;;;;
+14FD;CANADIAN SYLLABICS WEST-CREE SWO;Lo;0;L;;;;;N;;;;;
+14FE;CANADIAN SYLLABICS SWOO;Lo;0;L;;;;;N;;;;;
+14FF;CANADIAN SYLLABICS WEST-CREE SWOO;Lo;0;L;;;;;N;;;;;
+1500;CANADIAN SYLLABICS SWA;Lo;0;L;;;;;N;;;;;
+1501;CANADIAN SYLLABICS WEST-CREE SWA;Lo;0;L;;;;;N;;;;;
+1502;CANADIAN SYLLABICS SWAA;Lo;0;L;;;;;N;;;;;
+1503;CANADIAN SYLLABICS WEST-CREE SWAA;Lo;0;L;;;;;N;;;;;
+1504;CANADIAN SYLLABICS NASKAPI SWAA;Lo;0;L;;;;;N;;;;;
+1505;CANADIAN SYLLABICS S;Lo;0;L;;;;;N;;;;;
+1506;CANADIAN SYLLABICS ATHAPASCAN S;Lo;0;L;;;;;N;;;;;
+1507;CANADIAN SYLLABICS SW;Lo;0;L;;;;;N;;;;;
+1508;CANADIAN SYLLABICS BLACKFOOT S;Lo;0;L;;;;;N;;;;;
+1509;CANADIAN SYLLABICS MOOSE-CREE SK;Lo;0;L;;;;;N;;;;;
+150A;CANADIAN SYLLABICS NASKAPI SKW;Lo;0;L;;;;;N;;;;;
+150B;CANADIAN SYLLABICS NASKAPI S-W;Lo;0;L;;;;;N;;;;;
+150C;CANADIAN SYLLABICS NASKAPI SPWA;Lo;0;L;;;;;N;;;;;
+150D;CANADIAN SYLLABICS NASKAPI STWA;Lo;0;L;;;;;N;;;;;
+150E;CANADIAN SYLLABICS NASKAPI SKWA;Lo;0;L;;;;;N;;;;;
+150F;CANADIAN SYLLABICS NASKAPI SCWA;Lo;0;L;;;;;N;;;;;
+1510;CANADIAN SYLLABICS SHE;Lo;0;L;;;;;N;;;;;
+1511;CANADIAN SYLLABICS SHI;Lo;0;L;;;;;N;;;;;
+1512;CANADIAN SYLLABICS SHII;Lo;0;L;;;;;N;;;;;
+1513;CANADIAN SYLLABICS SHO;Lo;0;L;;;;;N;;;;;
+1514;CANADIAN SYLLABICS SHOO;Lo;0;L;;;;;N;;;;;
+1515;CANADIAN SYLLABICS SHA;Lo;0;L;;;;;N;;;;;
+1516;CANADIAN SYLLABICS SHAA;Lo;0;L;;;;;N;;;;;
+1517;CANADIAN SYLLABICS SHWE;Lo;0;L;;;;;N;;;;;
+1518;CANADIAN SYLLABICS WEST-CREE SHWE;Lo;0;L;;;;;N;;;;;
+1519;CANADIAN SYLLABICS SHWI;Lo;0;L;;;;;N;;;;;
+151A;CANADIAN SYLLABICS WEST-CREE SHWI;Lo;0;L;;;;;N;;;;;
+151B;CANADIAN SYLLABICS SHWII;Lo;0;L;;;;;N;;;;;
+151C;CANADIAN SYLLABICS WEST-CREE SHWII;Lo;0;L;;;;;N;;;;;
+151D;CANADIAN SYLLABICS SHWO;Lo;0;L;;;;;N;;;;;
+151E;CANADIAN SYLLABICS WEST-CREE SHWO;Lo;0;L;;;;;N;;;;;
+151F;CANADIAN SYLLABICS SHWOO;Lo;0;L;;;;;N;;;;;
+1520;CANADIAN SYLLABICS WEST-CREE SHWOO;Lo;0;L;;;;;N;;;;;
+1521;CANADIAN SYLLABICS SHWA;Lo;0;L;;;;;N;;;;;
+1522;CANADIAN SYLLABICS WEST-CREE SHWA;Lo;0;L;;;;;N;;;;;
+1523;CANADIAN SYLLABICS SHWAA;Lo;0;L;;;;;N;;;;;
+1524;CANADIAN SYLLABICS WEST-CREE SHWAA;Lo;0;L;;;;;N;;;;;
+1525;CANADIAN SYLLABICS SH;Lo;0;L;;;;;N;;;;;
+1526;CANADIAN SYLLABICS YE;Lo;0;L;;;;;N;;;;;
+1527;CANADIAN SYLLABICS YAAI;Lo;0;L;;;;;N;;;;;
+1528;CANADIAN SYLLABICS YI;Lo;0;L;;;;;N;;;;;
+1529;CANADIAN SYLLABICS YII;Lo;0;L;;;;;N;;;;;
+152A;CANADIAN SYLLABICS YO;Lo;0;L;;;;;N;;;;;
+152B;CANADIAN SYLLABICS YOO;Lo;0;L;;;;;N;;;;;
+152C;CANADIAN SYLLABICS Y-CREE YOO;Lo;0;L;;;;;N;;;;;
+152D;CANADIAN SYLLABICS YA;Lo;0;L;;;;;N;;;;;
+152E;CANADIAN SYLLABICS YAA;Lo;0;L;;;;;N;;;;;
+152F;CANADIAN SYLLABICS YWE;Lo;0;L;;;;;N;;;;;
+1530;CANADIAN SYLLABICS WEST-CREE YWE;Lo;0;L;;;;;N;;;;;
+1531;CANADIAN SYLLABICS YWI;Lo;0;L;;;;;N;;;;;
+1532;CANADIAN SYLLABICS WEST-CREE YWI;Lo;0;L;;;;;N;;;;;
+1533;CANADIAN SYLLABICS YWII;Lo;0;L;;;;;N;;;;;
+1534;CANADIAN SYLLABICS WEST-CREE YWII;Lo;0;L;;;;;N;;;;;
+1535;CANADIAN SYLLABICS YWO;Lo;0;L;;;;;N;;;;;
+1536;CANADIAN SYLLABICS WEST-CREE YWO;Lo;0;L;;;;;N;;;;;
+1537;CANADIAN SYLLABICS YWOO;Lo;0;L;;;;;N;;;;;
+1538;CANADIAN SYLLABICS WEST-CREE YWOO;Lo;0;L;;;;;N;;;;;
+1539;CANADIAN SYLLABICS YWA;Lo;0;L;;;;;N;;;;;
+153A;CANADIAN SYLLABICS WEST-CREE YWA;Lo;0;L;;;;;N;;;;;
+153B;CANADIAN SYLLABICS YWAA;Lo;0;L;;;;;N;;;;;
+153C;CANADIAN SYLLABICS WEST-CREE YWAA;Lo;0;L;;;;;N;;;;;
+153D;CANADIAN SYLLABICS NASKAPI YWAA;Lo;0;L;;;;;N;;;;;
+153E;CANADIAN SYLLABICS Y;Lo;0;L;;;;;N;;;;;
+153F;CANADIAN SYLLABICS BIBLE-CREE Y;Lo;0;L;;;;;N;;;;;
+1540;CANADIAN SYLLABICS WEST-CREE Y;Lo;0;L;;;;;N;;;;;
+1541;CANADIAN SYLLABICS SAYISI YI;Lo;0;L;;;;;N;;;;;
+1542;CANADIAN SYLLABICS RE;Lo;0;L;;;;;N;;;;;
+1543;CANADIAN SYLLABICS R-CREE RE;Lo;0;L;;;;;N;;;;;
+1544;CANADIAN SYLLABICS WEST-CREE LE;Lo;0;L;;;;;N;;;;;
+1545;CANADIAN SYLLABICS RAAI;Lo;0;L;;;;;N;;;;;
+1546;CANADIAN SYLLABICS RI;Lo;0;L;;;;;N;;;;;
+1547;CANADIAN SYLLABICS RII;Lo;0;L;;;;;N;;;;;
+1548;CANADIAN SYLLABICS RO;Lo;0;L;;;;;N;;;;;
+1549;CANADIAN SYLLABICS ROO;Lo;0;L;;;;;N;;;;;
+154A;CANADIAN SYLLABICS WEST-CREE LO;Lo;0;L;;;;;N;;;;;
+154B;CANADIAN SYLLABICS RA;Lo;0;L;;;;;N;;;;;
+154C;CANADIAN SYLLABICS RAA;Lo;0;L;;;;;N;;;;;
+154D;CANADIAN SYLLABICS WEST-CREE LA;Lo;0;L;;;;;N;;;;;
+154E;CANADIAN SYLLABICS RWAA;Lo;0;L;;;;;N;;;;;
+154F;CANADIAN SYLLABICS WEST-CREE RWAA;Lo;0;L;;;;;N;;;;;
+1550;CANADIAN SYLLABICS R;Lo;0;L;;;;;N;;;;;
+1551;CANADIAN SYLLABICS WEST-CREE R;Lo;0;L;;;;;N;;;;;
+1552;CANADIAN SYLLABICS MEDIAL R;Lo;0;L;;;;;N;;;;;
+1553;CANADIAN SYLLABICS FE;Lo;0;L;;;;;N;;;;;
+1554;CANADIAN SYLLABICS FAAI;Lo;0;L;;;;;N;;;;;
+1555;CANADIAN SYLLABICS FI;Lo;0;L;;;;;N;;;;;
+1556;CANADIAN SYLLABICS FII;Lo;0;L;;;;;N;;;;;
+1557;CANADIAN SYLLABICS FO;Lo;0;L;;;;;N;;;;;
+1558;CANADIAN SYLLABICS FOO;Lo;0;L;;;;;N;;;;;
+1559;CANADIAN SYLLABICS FA;Lo;0;L;;;;;N;;;;;
+155A;CANADIAN SYLLABICS FAA;Lo;0;L;;;;;N;;;;;
+155B;CANADIAN SYLLABICS FWAA;Lo;0;L;;;;;N;;;;;
+155C;CANADIAN SYLLABICS WEST-CREE FWAA;Lo;0;L;;;;;N;;;;;
+155D;CANADIAN SYLLABICS F;Lo;0;L;;;;;N;;;;;
+155E;CANADIAN SYLLABICS THE;Lo;0;L;;;;;N;;;;;
+155F;CANADIAN SYLLABICS N-CREE THE;Lo;0;L;;;;;N;;;;;
+1560;CANADIAN SYLLABICS THI;Lo;0;L;;;;;N;;;;;
+1561;CANADIAN SYLLABICS N-CREE THI;Lo;0;L;;;;;N;;;;;
+1562;CANADIAN SYLLABICS THII;Lo;0;L;;;;;N;;;;;
+1563;CANADIAN SYLLABICS N-CREE THII;Lo;0;L;;;;;N;;;;;
+1564;CANADIAN SYLLABICS THO;Lo;0;L;;;;;N;;;;;
+1565;CANADIAN SYLLABICS THOO;Lo;0;L;;;;;N;;;;;
+1566;CANADIAN SYLLABICS THA;Lo;0;L;;;;;N;;;;;
+1567;CANADIAN SYLLABICS THAA;Lo;0;L;;;;;N;;;;;
+1568;CANADIAN SYLLABICS THWAA;Lo;0;L;;;;;N;;;;;
+1569;CANADIAN SYLLABICS WEST-CREE THWAA;Lo;0;L;;;;;N;;;;;
+156A;CANADIAN SYLLABICS TH;Lo;0;L;;;;;N;;;;;
+156B;CANADIAN SYLLABICS TTHE;Lo;0;L;;;;;N;;;;;
+156C;CANADIAN SYLLABICS TTHI;Lo;0;L;;;;;N;;;;;
+156D;CANADIAN SYLLABICS TTHO;Lo;0;L;;;;;N;;;;;
+156E;CANADIAN SYLLABICS TTHA;Lo;0;L;;;;;N;;;;;
+156F;CANADIAN SYLLABICS TTH;Lo;0;L;;;;;N;;;;;
+1570;CANADIAN SYLLABICS TYE;Lo;0;L;;;;;N;;;;;
+1571;CANADIAN SYLLABICS TYI;Lo;0;L;;;;;N;;;;;
+1572;CANADIAN SYLLABICS TYO;Lo;0;L;;;;;N;;;;;
+1573;CANADIAN SYLLABICS TYA;Lo;0;L;;;;;N;;;;;
+1574;CANADIAN SYLLABICS NUNAVIK HE;Lo;0;L;;;;;N;;;;;
+1575;CANADIAN SYLLABICS NUNAVIK HI;Lo;0;L;;;;;N;;;;;
+1576;CANADIAN SYLLABICS NUNAVIK HII;Lo;0;L;;;;;N;;;;;
+1577;CANADIAN SYLLABICS NUNAVIK HO;Lo;0;L;;;;;N;;;;;
+1578;CANADIAN SYLLABICS NUNAVIK HOO;Lo;0;L;;;;;N;;;;;
+1579;CANADIAN SYLLABICS NUNAVIK HA;Lo;0;L;;;;;N;;;;;
+157A;CANADIAN SYLLABICS NUNAVIK HAA;Lo;0;L;;;;;N;;;;;
+157B;CANADIAN SYLLABICS NUNAVIK H;Lo;0;L;;;;;N;;;;;
+157C;CANADIAN SYLLABICS NUNAVUT H;Lo;0;L;;;;;N;;;;;
+157D;CANADIAN SYLLABICS HK;Lo;0;L;;;;;N;;;;;
+157E;CANADIAN SYLLABICS QAAI;Lo;0;L;;;;;N;;;;;
+157F;CANADIAN SYLLABICS QI;Lo;0;L;;;;;N;;;;;
+1580;CANADIAN SYLLABICS QII;Lo;0;L;;;;;N;;;;;
+1581;CANADIAN SYLLABICS QO;Lo;0;L;;;;;N;;;;;
+1582;CANADIAN SYLLABICS QOO;Lo;0;L;;;;;N;;;;;
+1583;CANADIAN SYLLABICS QA;Lo;0;L;;;;;N;;;;;
+1584;CANADIAN SYLLABICS QAA;Lo;0;L;;;;;N;;;;;
+1585;CANADIAN SYLLABICS Q;Lo;0;L;;;;;N;;;;;
+1586;CANADIAN SYLLABICS TLHE;Lo;0;L;;;;;N;;;;;
+1587;CANADIAN SYLLABICS TLHI;Lo;0;L;;;;;N;;;;;
+1588;CANADIAN SYLLABICS TLHO;Lo;0;L;;;;;N;;;;;
+1589;CANADIAN SYLLABICS TLHA;Lo;0;L;;;;;N;;;;;
+158A;CANADIAN SYLLABICS WEST-CREE RE;Lo;0;L;;;;;N;;;;;
+158B;CANADIAN SYLLABICS WEST-CREE RI;Lo;0;L;;;;;N;;;;;
+158C;CANADIAN SYLLABICS WEST-CREE RO;Lo;0;L;;;;;N;;;;;
+158D;CANADIAN SYLLABICS WEST-CREE RA;Lo;0;L;;;;;N;;;;;
+158E;CANADIAN SYLLABICS NGAAI;Lo;0;L;;;;;N;;;;;
+158F;CANADIAN SYLLABICS NGI;Lo;0;L;;;;;N;;;;;
+1590;CANADIAN SYLLABICS NGII;Lo;0;L;;;;;N;;;;;
+1591;CANADIAN SYLLABICS NGO;Lo;0;L;;;;;N;;;;;
+1592;CANADIAN SYLLABICS NGOO;Lo;0;L;;;;;N;;;;;
+1593;CANADIAN SYLLABICS NGA;Lo;0;L;;;;;N;;;;;
+1594;CANADIAN SYLLABICS NGAA;Lo;0;L;;;;;N;;;;;
+1595;CANADIAN SYLLABICS NG;Lo;0;L;;;;;N;;;;;
+1596;CANADIAN SYLLABICS NNG;Lo;0;L;;;;;N;;;;;
+1597;CANADIAN SYLLABICS SAYISI SHE;Lo;0;L;;;;;N;;;;;
+1598;CANADIAN SYLLABICS SAYISI SHI;Lo;0;L;;;;;N;;;;;
+1599;CANADIAN SYLLABICS SAYISI SHO;Lo;0;L;;;;;N;;;;;
+159A;CANADIAN SYLLABICS SAYISI SHA;Lo;0;L;;;;;N;;;;;
+159B;CANADIAN SYLLABICS WOODS-CREE THE;Lo;0;L;;;;;N;;;;;
+159C;CANADIAN SYLLABICS WOODS-CREE THI;Lo;0;L;;;;;N;;;;;
+159D;CANADIAN SYLLABICS WOODS-CREE THO;Lo;0;L;;;;;N;;;;;
+159E;CANADIAN SYLLABICS WOODS-CREE THA;Lo;0;L;;;;;N;;;;;
+159F;CANADIAN SYLLABICS WOODS-CREE TH;Lo;0;L;;;;;N;;;;;
+15A0;CANADIAN SYLLABICS LHI;Lo;0;L;;;;;N;;;;;
+15A1;CANADIAN SYLLABICS LHII;Lo;0;L;;;;;N;;;;;
+15A2;CANADIAN SYLLABICS LHO;Lo;0;L;;;;;N;;;;;
+15A3;CANADIAN SYLLABICS LHOO;Lo;0;L;;;;;N;;;;;
+15A4;CANADIAN SYLLABICS LHA;Lo;0;L;;;;;N;;;;;
+15A5;CANADIAN SYLLABICS LHAA;Lo;0;L;;;;;N;;;;;
+15A6;CANADIAN SYLLABICS LH;Lo;0;L;;;;;N;;;;;
+15A7;CANADIAN SYLLABICS TH-CREE THE;Lo;0;L;;;;;N;;;;;
+15A8;CANADIAN SYLLABICS TH-CREE THI;Lo;0;L;;;;;N;;;;;
+15A9;CANADIAN SYLLABICS TH-CREE THII;Lo;0;L;;;;;N;;;;;
+15AA;CANADIAN SYLLABICS TH-CREE THO;Lo;0;L;;;;;N;;;;;
+15AB;CANADIAN SYLLABICS TH-CREE THOO;Lo;0;L;;;;;N;;;;;
+15AC;CANADIAN SYLLABICS TH-CREE THA;Lo;0;L;;;;;N;;;;;
+15AD;CANADIAN SYLLABICS TH-CREE THAA;Lo;0;L;;;;;N;;;;;
+15AE;CANADIAN SYLLABICS TH-CREE TH;Lo;0;L;;;;;N;;;;;
+15AF;CANADIAN SYLLABICS AIVILIK B;Lo;0;L;;;;;N;;;;;
+15B0;CANADIAN SYLLABICS BLACKFOOT E;Lo;0;L;;;;;N;;;;;
+15B1;CANADIAN SYLLABICS BLACKFOOT I;Lo;0;L;;;;;N;;;;;
+15B2;CANADIAN SYLLABICS BLACKFOOT O;Lo;0;L;;;;;N;;;;;
+15B3;CANADIAN SYLLABICS BLACKFOOT A;Lo;0;L;;;;;N;;;;;
+15B4;CANADIAN SYLLABICS BLACKFOOT WE;Lo;0;L;;;;;N;;;;;
+15B5;CANADIAN SYLLABICS BLACKFOOT WI;Lo;0;L;;;;;N;;;;;
+15B6;CANADIAN SYLLABICS BLACKFOOT WO;Lo;0;L;;;;;N;;;;;
+15B7;CANADIAN SYLLABICS BLACKFOOT WA;Lo;0;L;;;;;N;;;;;
+15B8;CANADIAN SYLLABICS BLACKFOOT NE;Lo;0;L;;;;;N;;;;;
+15B9;CANADIAN SYLLABICS BLACKFOOT NI;Lo;0;L;;;;;N;;;;;
+15BA;CANADIAN SYLLABICS BLACKFOOT NO;Lo;0;L;;;;;N;;;;;
+15BB;CANADIAN SYLLABICS BLACKFOOT NA;Lo;0;L;;;;;N;;;;;
+15BC;CANADIAN SYLLABICS BLACKFOOT KE;Lo;0;L;;;;;N;;;;;
+15BD;CANADIAN SYLLABICS BLACKFOOT KI;Lo;0;L;;;;;N;;;;;
+15BE;CANADIAN SYLLABICS BLACKFOOT KO;Lo;0;L;;;;;N;;;;;
+15BF;CANADIAN SYLLABICS BLACKFOOT KA;Lo;0;L;;;;;N;;;;;
+15C0;CANADIAN SYLLABICS SAYISI HE;Lo;0;L;;;;;N;;;;;
+15C1;CANADIAN SYLLABICS SAYISI HI;Lo;0;L;;;;;N;;;;;
+15C2;CANADIAN SYLLABICS SAYISI HO;Lo;0;L;;;;;N;;;;;
+15C3;CANADIAN SYLLABICS SAYISI HA;Lo;0;L;;;;;N;;;;;
+15C4;CANADIAN SYLLABICS CARRIER GHU;Lo;0;L;;;;;N;;;;;
+15C5;CANADIAN SYLLABICS CARRIER GHO;Lo;0;L;;;;;N;;;;;
+15C6;CANADIAN SYLLABICS CARRIER GHE;Lo;0;L;;;;;N;;;;;
+15C7;CANADIAN SYLLABICS CARRIER GHEE;Lo;0;L;;;;;N;;;;;
+15C8;CANADIAN SYLLABICS CARRIER GHI;Lo;0;L;;;;;N;;;;;
+15C9;CANADIAN SYLLABICS CARRIER GHA;Lo;0;L;;;;;N;;;;;
+15CA;CANADIAN SYLLABICS CARRIER RU;Lo;0;L;;;;;N;;;;;
+15CB;CANADIAN SYLLABICS CARRIER RO;Lo;0;L;;;;;N;;;;;
+15CC;CANADIAN SYLLABICS CARRIER RE;Lo;0;L;;;;;N;;;;;
+15CD;CANADIAN SYLLABICS CARRIER REE;Lo;0;L;;;;;N;;;;;
+15CE;CANADIAN SYLLABICS CARRIER RI;Lo;0;L;;;;;N;;;;;
+15CF;CANADIAN SYLLABICS CARRIER RA;Lo;0;L;;;;;N;;;;;
+15D0;CANADIAN SYLLABICS CARRIER WU;Lo;0;L;;;;;N;;;;;
+15D1;CANADIAN SYLLABICS CARRIER WO;Lo;0;L;;;;;N;;;;;
+15D2;CANADIAN SYLLABICS CARRIER WE;Lo;0;L;;;;;N;;;;;
+15D3;CANADIAN SYLLABICS CARRIER WEE;Lo;0;L;;;;;N;;;;;
+15D4;CANADIAN SYLLABICS CARRIER WI;Lo;0;L;;;;;N;;;;;
+15D5;CANADIAN SYLLABICS CARRIER WA;Lo;0;L;;;;;N;;;;;
+15D6;CANADIAN SYLLABICS CARRIER HWU;Lo;0;L;;;;;N;;;;;
+15D7;CANADIAN SYLLABICS CARRIER HWO;Lo;0;L;;;;;N;;;;;
+15D8;CANADIAN SYLLABICS CARRIER HWE;Lo;0;L;;;;;N;;;;;
+15D9;CANADIAN SYLLABICS CARRIER HWEE;Lo;0;L;;;;;N;;;;;
+15DA;CANADIAN SYLLABICS CARRIER HWI;Lo;0;L;;;;;N;;;;;
+15DB;CANADIAN SYLLABICS CARRIER HWA;Lo;0;L;;;;;N;;;;;
+15DC;CANADIAN SYLLABICS CARRIER THU;Lo;0;L;;;;;N;;;;;
+15DD;CANADIAN SYLLABICS CARRIER THO;Lo;0;L;;;;;N;;;;;
+15DE;CANADIAN SYLLABICS CARRIER THE;Lo;0;L;;;;;N;;;;;
+15DF;CANADIAN SYLLABICS CARRIER THEE;Lo;0;L;;;;;N;;;;;
+15E0;CANADIAN SYLLABICS CARRIER THI;Lo;0;L;;;;;N;;;;;
+15E1;CANADIAN SYLLABICS CARRIER THA;Lo;0;L;;;;;N;;;;;
+15E2;CANADIAN SYLLABICS CARRIER TTU;Lo;0;L;;;;;N;;;;;
+15E3;CANADIAN SYLLABICS CARRIER TTO;Lo;0;L;;;;;N;;;;;
+15E4;CANADIAN SYLLABICS CARRIER TTE;Lo;0;L;;;;;N;;;;;
+15E5;CANADIAN SYLLABICS CARRIER TTEE;Lo;0;L;;;;;N;;;;;
+15E6;CANADIAN SYLLABICS CARRIER TTI;Lo;0;L;;;;;N;;;;;
+15E7;CANADIAN SYLLABICS CARRIER TTA;Lo;0;L;;;;;N;;;;;
+15E8;CANADIAN SYLLABICS CARRIER PU;Lo;0;L;;;;;N;;;;;
+15E9;CANADIAN SYLLABICS CARRIER PO;Lo;0;L;;;;;N;;;;;
+15EA;CANADIAN SYLLABICS CARRIER PE;Lo;0;L;;;;;N;;;;;
+15EB;CANADIAN SYLLABICS CARRIER PEE;Lo;0;L;;;;;N;;;;;
+15EC;CANADIAN SYLLABICS CARRIER PI;Lo;0;L;;;;;N;;;;;
+15ED;CANADIAN SYLLABICS CARRIER PA;Lo;0;L;;;;;N;;;;;
+15EE;CANADIAN SYLLABICS CARRIER P;Lo;0;L;;;;;N;;;;;
+15EF;CANADIAN SYLLABICS CARRIER GU;Lo;0;L;;;;;N;;;;;
+15F0;CANADIAN SYLLABICS CARRIER GO;Lo;0;L;;;;;N;;;;;
+15F1;CANADIAN SYLLABICS CARRIER GE;Lo;0;L;;;;;N;;;;;
+15F2;CANADIAN SYLLABICS CARRIER GEE;Lo;0;L;;;;;N;;;;;
+15F3;CANADIAN SYLLABICS CARRIER GI;Lo;0;L;;;;;N;;;;;
+15F4;CANADIAN SYLLABICS CARRIER GA;Lo;0;L;;;;;N;;;;;
+15F5;CANADIAN SYLLABICS CARRIER KHU;Lo;0;L;;;;;N;;;;;
+15F6;CANADIAN SYLLABICS CARRIER KHO;Lo;0;L;;;;;N;;;;;
+15F7;CANADIAN SYLLABICS CARRIER KHE;Lo;0;L;;;;;N;;;;;
+15F8;CANADIAN SYLLABICS CARRIER KHEE;Lo;0;L;;;;;N;;;;;
+15F9;CANADIAN SYLLABICS CARRIER KHI;Lo;0;L;;;;;N;;;;;
+15FA;CANADIAN SYLLABICS CARRIER KHA;Lo;0;L;;;;;N;;;;;
+15FB;CANADIAN SYLLABICS CARRIER KKU;Lo;0;L;;;;;N;;;;;
+15FC;CANADIAN SYLLABICS CARRIER KKO;Lo;0;L;;;;;N;;;;;
+15FD;CANADIAN SYLLABICS CARRIER KKE;Lo;0;L;;;;;N;;;;;
+15FE;CANADIAN SYLLABICS CARRIER KKEE;Lo;0;L;;;;;N;;;;;
+15FF;CANADIAN SYLLABICS CARRIER KKI;Lo;0;L;;;;;N;;;;;
+1600;CANADIAN SYLLABICS CARRIER KKA;Lo;0;L;;;;;N;;;;;
+1601;CANADIAN SYLLABICS CARRIER KK;Lo;0;L;;;;;N;;;;;
+1602;CANADIAN SYLLABICS CARRIER NU;Lo;0;L;;;;;N;;;;;
+1603;CANADIAN SYLLABICS CARRIER NO;Lo;0;L;;;;;N;;;;;
+1604;CANADIAN SYLLABICS CARRIER NE;Lo;0;L;;;;;N;;;;;
+1605;CANADIAN SYLLABICS CARRIER NEE;Lo;0;L;;;;;N;;;;;
+1606;CANADIAN SYLLABICS CARRIER NI;Lo;0;L;;;;;N;;;;;
+1607;CANADIAN SYLLABICS CARRIER NA;Lo;0;L;;;;;N;;;;;
+1608;CANADIAN SYLLABICS CARRIER MU;Lo;0;L;;;;;N;;;;;
+1609;CANADIAN SYLLABICS CARRIER MO;Lo;0;L;;;;;N;;;;;
+160A;CANADIAN SYLLABICS CARRIER ME;Lo;0;L;;;;;N;;;;;
+160B;CANADIAN SYLLABICS CARRIER MEE;Lo;0;L;;;;;N;;;;;
+160C;CANADIAN SYLLABICS CARRIER MI;Lo;0;L;;;;;N;;;;;
+160D;CANADIAN SYLLABICS CARRIER MA;Lo;0;L;;;;;N;;;;;
+160E;CANADIAN SYLLABICS CARRIER YU;Lo;0;L;;;;;N;;;;;
+160F;CANADIAN SYLLABICS CARRIER YO;Lo;0;L;;;;;N;;;;;
+1610;CANADIAN SYLLABICS CARRIER YE;Lo;0;L;;;;;N;;;;;
+1611;CANADIAN SYLLABICS CARRIER YEE;Lo;0;L;;;;;N;;;;;
+1612;CANADIAN SYLLABICS CARRIER YI;Lo;0;L;;;;;N;;;;;
+1613;CANADIAN SYLLABICS CARRIER YA;Lo;0;L;;;;;N;;;;;
+1614;CANADIAN SYLLABICS CARRIER JU;Lo;0;L;;;;;N;;;;;
+1615;CANADIAN SYLLABICS SAYISI JU;Lo;0;L;;;;;N;;;;;
+1616;CANADIAN SYLLABICS CARRIER JO;Lo;0;L;;;;;N;;;;;
+1617;CANADIAN SYLLABICS CARRIER JE;Lo;0;L;;;;;N;;;;;
+1618;CANADIAN SYLLABICS CARRIER JEE;Lo;0;L;;;;;N;;;;;
+1619;CANADIAN SYLLABICS CARRIER JI;Lo;0;L;;;;;N;;;;;
+161A;CANADIAN SYLLABICS SAYISI JI;Lo;0;L;;;;;N;;;;;
+161B;CANADIAN SYLLABICS CARRIER JA;Lo;0;L;;;;;N;;;;;
+161C;CANADIAN SYLLABICS CARRIER JJU;Lo;0;L;;;;;N;;;;;
+161D;CANADIAN SYLLABICS CARRIER JJO;Lo;0;L;;;;;N;;;;;
+161E;CANADIAN SYLLABICS CARRIER JJE;Lo;0;L;;;;;N;;;;;
+161F;CANADIAN SYLLABICS CARRIER JJEE;Lo;0;L;;;;;N;;;;;
+1620;CANADIAN SYLLABICS CARRIER JJI;Lo;0;L;;;;;N;;;;;
+1621;CANADIAN SYLLABICS CARRIER JJA;Lo;0;L;;;;;N;;;;;
+1622;CANADIAN SYLLABICS CARRIER LU;Lo;0;L;;;;;N;;;;;
+1623;CANADIAN SYLLABICS CARRIER LO;Lo;0;L;;;;;N;;;;;
+1624;CANADIAN SYLLABICS CARRIER LE;Lo;0;L;;;;;N;;;;;
+1625;CANADIAN SYLLABICS CARRIER LEE;Lo;0;L;;;;;N;;;;;
+1626;CANADIAN SYLLABICS CARRIER LI;Lo;0;L;;;;;N;;;;;
+1627;CANADIAN SYLLABICS CARRIER LA;Lo;0;L;;;;;N;;;;;
+1628;CANADIAN SYLLABICS CARRIER DLU;Lo;0;L;;;;;N;;;;;
+1629;CANADIAN SYLLABICS CARRIER DLO;Lo;0;L;;;;;N;;;;;
+162A;CANADIAN SYLLABICS CARRIER DLE;Lo;0;L;;;;;N;;;;;
+162B;CANADIAN SYLLABICS CARRIER DLEE;Lo;0;L;;;;;N;;;;;
+162C;CANADIAN SYLLABICS CARRIER DLI;Lo;0;L;;;;;N;;;;;
+162D;CANADIAN SYLLABICS CARRIER DLA;Lo;0;L;;;;;N;;;;;
+162E;CANADIAN SYLLABICS CARRIER LHU;Lo;0;L;;;;;N;;;;;
+162F;CANADIAN SYLLABICS CARRIER LHO;Lo;0;L;;;;;N;;;;;
+1630;CANADIAN SYLLABICS CARRIER LHE;Lo;0;L;;;;;N;;;;;
+1631;CANADIAN SYLLABICS CARRIER LHEE;Lo;0;L;;;;;N;;;;;
+1632;CANADIAN SYLLABICS CARRIER LHI;Lo;0;L;;;;;N;;;;;
+1633;CANADIAN SYLLABICS CARRIER LHA;Lo;0;L;;;;;N;;;;;
+1634;CANADIAN SYLLABICS CARRIER TLHU;Lo;0;L;;;;;N;;;;;
+1635;CANADIAN SYLLABICS CARRIER TLHO;Lo;0;L;;;;;N;;;;;
+1636;CANADIAN SYLLABICS CARRIER TLHE;Lo;0;L;;;;;N;;;;;
+1637;CANADIAN SYLLABICS CARRIER TLHEE;Lo;0;L;;;;;N;;;;;
+1638;CANADIAN SYLLABICS CARRIER TLHI;Lo;0;L;;;;;N;;;;;
+1639;CANADIAN SYLLABICS CARRIER TLHA;Lo;0;L;;;;;N;;;;;
+163A;CANADIAN SYLLABICS CARRIER TLU;Lo;0;L;;;;;N;;;;;
+163B;CANADIAN SYLLABICS CARRIER TLO;Lo;0;L;;;;;N;;;;;
+163C;CANADIAN SYLLABICS CARRIER TLE;Lo;0;L;;;;;N;;;;;
+163D;CANADIAN SYLLABICS CARRIER TLEE;Lo;0;L;;;;;N;;;;;
+163E;CANADIAN SYLLABICS CARRIER TLI;Lo;0;L;;;;;N;;;;;
+163F;CANADIAN SYLLABICS CARRIER TLA;Lo;0;L;;;;;N;;;;;
+1640;CANADIAN SYLLABICS CARRIER ZU;Lo;0;L;;;;;N;;;;;
+1641;CANADIAN SYLLABICS CARRIER ZO;Lo;0;L;;;;;N;;;;;
+1642;CANADIAN SYLLABICS CARRIER ZE;Lo;0;L;;;;;N;;;;;
+1643;CANADIAN SYLLABICS CARRIER ZEE;Lo;0;L;;;;;N;;;;;
+1644;CANADIAN SYLLABICS CARRIER ZI;Lo;0;L;;;;;N;;;;;
+1645;CANADIAN SYLLABICS CARRIER ZA;Lo;0;L;;;;;N;;;;;
+1646;CANADIAN SYLLABICS CARRIER Z;Lo;0;L;;;;;N;;;;;
+1647;CANADIAN SYLLABICS CARRIER INITIAL Z;Lo;0;L;;;;;N;;;;;
+1648;CANADIAN SYLLABICS CARRIER DZU;Lo;0;L;;;;;N;;;;;
+1649;CANADIAN SYLLABICS CARRIER DZO;Lo;0;L;;;;;N;;;;;
+164A;CANADIAN SYLLABICS CARRIER DZE;Lo;0;L;;;;;N;;;;;
+164B;CANADIAN SYLLABICS CARRIER DZEE;Lo;0;L;;;;;N;;;;;
+164C;CANADIAN SYLLABICS CARRIER DZI;Lo;0;L;;;;;N;;;;;
+164D;CANADIAN SYLLABICS CARRIER DZA;Lo;0;L;;;;;N;;;;;
+164E;CANADIAN SYLLABICS CARRIER SU;Lo;0;L;;;;;N;;;;;
+164F;CANADIAN SYLLABICS CARRIER SO;Lo;0;L;;;;;N;;;;;
+1650;CANADIAN SYLLABICS CARRIER SE;Lo;0;L;;;;;N;;;;;
+1651;CANADIAN SYLLABICS CARRIER SEE;Lo;0;L;;;;;N;;;;;
+1652;CANADIAN SYLLABICS CARRIER SI;Lo;0;L;;;;;N;;;;;
+1653;CANADIAN SYLLABICS CARRIER SA;Lo;0;L;;;;;N;;;;;
+1654;CANADIAN SYLLABICS CARRIER SHU;Lo;0;L;;;;;N;;;;;
+1655;CANADIAN SYLLABICS CARRIER SHO;Lo;0;L;;;;;N;;;;;
+1656;CANADIAN SYLLABICS CARRIER SHE;Lo;0;L;;;;;N;;;;;
+1657;CANADIAN SYLLABICS CARRIER SHEE;Lo;0;L;;;;;N;;;;;
+1658;CANADIAN SYLLABICS CARRIER SHI;Lo;0;L;;;;;N;;;;;
+1659;CANADIAN SYLLABICS CARRIER SHA;Lo;0;L;;;;;N;;;;;
+165A;CANADIAN SYLLABICS CARRIER SH;Lo;0;L;;;;;N;;;;;
+165B;CANADIAN SYLLABICS CARRIER TSU;Lo;0;L;;;;;N;;;;;
+165C;CANADIAN SYLLABICS CARRIER TSO;Lo;0;L;;;;;N;;;;;
+165D;CANADIAN SYLLABICS CARRIER TSE;Lo;0;L;;;;;N;;;;;
+165E;CANADIAN SYLLABICS CARRIER TSEE;Lo;0;L;;;;;N;;;;;
+165F;CANADIAN SYLLABICS CARRIER TSI;Lo;0;L;;;;;N;;;;;
+1660;CANADIAN SYLLABICS CARRIER TSA;Lo;0;L;;;;;N;;;;;
+1661;CANADIAN SYLLABICS CARRIER CHU;Lo;0;L;;;;;N;;;;;
+1662;CANADIAN SYLLABICS CARRIER CHO;Lo;0;L;;;;;N;;;;;
+1663;CANADIAN SYLLABICS CARRIER CHE;Lo;0;L;;;;;N;;;;;
+1664;CANADIAN SYLLABICS CARRIER CHEE;Lo;0;L;;;;;N;;;;;
+1665;CANADIAN SYLLABICS CARRIER CHI;Lo;0;L;;;;;N;;;;;
+1666;CANADIAN SYLLABICS CARRIER CHA;Lo;0;L;;;;;N;;;;;
+1667;CANADIAN SYLLABICS CARRIER TTSU;Lo;0;L;;;;;N;;;;;
+1668;CANADIAN SYLLABICS CARRIER TTSO;Lo;0;L;;;;;N;;;;;
+1669;CANADIAN SYLLABICS CARRIER TTSE;Lo;0;L;;;;;N;;;;;
+166A;CANADIAN SYLLABICS CARRIER TTSEE;Lo;0;L;;;;;N;;;;;
+166B;CANADIAN SYLLABICS CARRIER TTSI;Lo;0;L;;;;;N;;;;;
+166C;CANADIAN SYLLABICS CARRIER TTSA;Lo;0;L;;;;;N;;;;;
+166D;CANADIAN SYLLABICS CHI SIGN;Po;0;L;;;;;N;;;;;
+166E;CANADIAN SYLLABICS FULL STOP;Po;0;L;;;;;N;;;;;
+166F;CANADIAN SYLLABICS QAI;Lo;0;L;;;;;N;;;;;
+1670;CANADIAN SYLLABICS NGAI;Lo;0;L;;;;;N;;;;;
+1671;CANADIAN SYLLABICS NNGI;Lo;0;L;;;;;N;;;;;
+1672;CANADIAN SYLLABICS NNGII;Lo;0;L;;;;;N;;;;;
+1673;CANADIAN SYLLABICS NNGO;Lo;0;L;;;;;N;;;;;
+1674;CANADIAN SYLLABICS NNGOO;Lo;0;L;;;;;N;;;;;
+1675;CANADIAN SYLLABICS NNGA;Lo;0;L;;;;;N;;;;;
+1676;CANADIAN SYLLABICS NNGAA;Lo;0;L;;;;;N;;;;;
+1680;OGHAM SPACE MARK;Zs;0;WS;;;;;N;;;;;
+1681;OGHAM LETTER BEITH;Lo;0;L;;;;;N;;;;;
+1682;OGHAM LETTER LUIS;Lo;0;L;;;;;N;;;;;
+1683;OGHAM LETTER FEARN;Lo;0;L;;;;;N;;;;;
+1684;OGHAM LETTER SAIL;Lo;0;L;;;;;N;;;;;
+1685;OGHAM LETTER NION;Lo;0;L;;;;;N;;;;;
+1686;OGHAM LETTER UATH;Lo;0;L;;;;;N;;;;;
+1687;OGHAM LETTER DAIR;Lo;0;L;;;;;N;;;;;
+1688;OGHAM LETTER TINNE;Lo;0;L;;;;;N;;;;;
+1689;OGHAM LETTER COLL;Lo;0;L;;;;;N;;;;;
+168A;OGHAM LETTER CEIRT;Lo;0;L;;;;;N;;;;;
+168B;OGHAM LETTER MUIN;Lo;0;L;;;;;N;;;;;
+168C;OGHAM LETTER GORT;Lo;0;L;;;;;N;;;;;
+168D;OGHAM LETTER NGEADAL;Lo;0;L;;;;;N;;;;;
+168E;OGHAM LETTER STRAIF;Lo;0;L;;;;;N;;;;;
+168F;OGHAM LETTER RUIS;Lo;0;L;;;;;N;;;;;
+1690;OGHAM LETTER AILM;Lo;0;L;;;;;N;;;;;
+1691;OGHAM LETTER ONN;Lo;0;L;;;;;N;;;;;
+1692;OGHAM LETTER UR;Lo;0;L;;;;;N;;;;;
+1693;OGHAM LETTER EADHADH;Lo;0;L;;;;;N;;;;;
+1694;OGHAM LETTER IODHADH;Lo;0;L;;;;;N;;;;;
+1695;OGHAM LETTER EABHADH;Lo;0;L;;;;;N;;;;;
+1696;OGHAM LETTER OR;Lo;0;L;;;;;N;;;;;
+1697;OGHAM LETTER UILLEANN;Lo;0;L;;;;;N;;;;;
+1698;OGHAM LETTER IFIN;Lo;0;L;;;;;N;;;;;
+1699;OGHAM LETTER EAMHANCHOLL;Lo;0;L;;;;;N;;;;;
+169A;OGHAM LETTER PEITH;Lo;0;L;;;;;N;;;;;
+169B;OGHAM FEATHER MARK;Ps;0;ON;;;;;N;;;;;
+169C;OGHAM REVERSED FEATHER MARK;Pe;0;ON;;;;;N;;;;;
+16A0;RUNIC LETTER FEHU FEOH FE F;Lo;0;L;;;;;N;;;;;
+16A1;RUNIC LETTER V;Lo;0;L;;;;;N;;;;;
+16A2;RUNIC LETTER URUZ UR U;Lo;0;L;;;;;N;;;;;
+16A3;RUNIC LETTER YR;Lo;0;L;;;;;N;;;;;
+16A4;RUNIC LETTER Y;Lo;0;L;;;;;N;;;;;
+16A5;RUNIC LETTER W;Lo;0;L;;;;;N;;;;;
+16A6;RUNIC LETTER THURISAZ THURS THORN;Lo;0;L;;;;;N;;;;;
+16A7;RUNIC LETTER ETH;Lo;0;L;;;;;N;;;;;
+16A8;RUNIC LETTER ANSUZ A;Lo;0;L;;;;;N;;;;;
+16A9;RUNIC LETTER OS O;Lo;0;L;;;;;N;;;;;
+16AA;RUNIC LETTER AC A;Lo;0;L;;;;;N;;;;;
+16AB;RUNIC LETTER AESC;Lo;0;L;;;;;N;;;;;
+16AC;RUNIC LETTER LONG-BRANCH-OSS O;Lo;0;L;;;;;N;;;;;
+16AD;RUNIC LETTER SHORT-TWIG-OSS O;Lo;0;L;;;;;N;;;;;
+16AE;RUNIC LETTER O;Lo;0;L;;;;;N;;;;;
+16AF;RUNIC LETTER OE;Lo;0;L;;;;;N;;;;;
+16B0;RUNIC LETTER ON;Lo;0;L;;;;;N;;;;;
+16B1;RUNIC LETTER RAIDO RAD REID R;Lo;0;L;;;;;N;;;;;
+16B2;RUNIC LETTER KAUNA;Lo;0;L;;;;;N;;;;;
+16B3;RUNIC LETTER CEN;Lo;0;L;;;;;N;;;;;
+16B4;RUNIC LETTER KAUN K;Lo;0;L;;;;;N;;;;;
+16B5;RUNIC LETTER G;Lo;0;L;;;;;N;;;;;
+16B6;RUNIC LETTER ENG;Lo;0;L;;;;;N;;;;;
+16B7;RUNIC LETTER GEBO GYFU G;Lo;0;L;;;;;N;;;;;
+16B8;RUNIC LETTER GAR;Lo;0;L;;;;;N;;;;;
+16B9;RUNIC LETTER WUNJO WYNN W;Lo;0;L;;;;;N;;;;;
+16BA;RUNIC LETTER HAGLAZ H;Lo;0;L;;;;;N;;;;;
+16BB;RUNIC LETTER HAEGL H;Lo;0;L;;;;;N;;;;;
+16BC;RUNIC LETTER LONG-BRANCH-HAGALL H;Lo;0;L;;;;;N;;;;;
+16BD;RUNIC LETTER SHORT-TWIG-HAGALL H;Lo;0;L;;;;;N;;;;;
+16BE;RUNIC LETTER NAUDIZ NYD NAUD N;Lo;0;L;;;;;N;;;;;
+16BF;RUNIC LETTER SHORT-TWIG-NAUD N;Lo;0;L;;;;;N;;;;;
+16C0;RUNIC LETTER DOTTED-N;Lo;0;L;;;;;N;;;;;
+16C1;RUNIC LETTER ISAZ IS ISS I;Lo;0;L;;;;;N;;;;;
+16C2;RUNIC LETTER E;Lo;0;L;;;;;N;;;;;
+16C3;RUNIC LETTER JERAN J;Lo;0;L;;;;;N;;;;;
+16C4;RUNIC LETTER GER;Lo;0;L;;;;;N;;;;;
+16C5;RUNIC LETTER LONG-BRANCH-AR AE;Lo;0;L;;;;;N;;;;;
+16C6;RUNIC LETTER SHORT-TWIG-AR A;Lo;0;L;;;;;N;;;;;
+16C7;RUNIC LETTER IWAZ EOH;Lo;0;L;;;;;N;;;;;
+16C8;RUNIC LETTER PERTHO PEORTH P;Lo;0;L;;;;;N;;;;;
+16C9;RUNIC LETTER ALGIZ EOLHX;Lo;0;L;;;;;N;;;;;
+16CA;RUNIC LETTER SOWILO S;Lo;0;L;;;;;N;;;;;
+16CB;RUNIC LETTER SIGEL LONG-BRANCH-SOL S;Lo;0;L;;;;;N;;;;;
+16CC;RUNIC LETTER SHORT-TWIG-SOL S;Lo;0;L;;;;;N;;;;;
+16CD;RUNIC LETTER C;Lo;0;L;;;;;N;;;;;
+16CE;RUNIC LETTER Z;Lo;0;L;;;;;N;;;;;
+16CF;RUNIC LETTER TIWAZ TIR TYR T;Lo;0;L;;;;;N;;;;;
+16D0;RUNIC LETTER SHORT-TWIG-TYR T;Lo;0;L;;;;;N;;;;;
+16D1;RUNIC LETTER D;Lo;0;L;;;;;N;;;;;
+16D2;RUNIC LETTER BERKANAN BEORC BJARKAN B;Lo;0;L;;;;;N;;;;;
+16D3;RUNIC LETTER SHORT-TWIG-BJARKAN B;Lo;0;L;;;;;N;;;;;
+16D4;RUNIC LETTER DOTTED-P;Lo;0;L;;;;;N;;;;;
+16D5;RUNIC LETTER OPEN-P;Lo;0;L;;;;;N;;;;;
+16D6;RUNIC LETTER EHWAZ EH E;Lo;0;L;;;;;N;;;;;
+16D7;RUNIC LETTER MANNAZ MAN M;Lo;0;L;;;;;N;;;;;
+16D8;RUNIC LETTER LONG-BRANCH-MADR M;Lo;0;L;;;;;N;;;;;
+16D9;RUNIC LETTER SHORT-TWIG-MADR M;Lo;0;L;;;;;N;;;;;
+16DA;RUNIC LETTER LAUKAZ LAGU LOGR L;Lo;0;L;;;;;N;;;;;
+16DB;RUNIC LETTER DOTTED-L;Lo;0;L;;;;;N;;;;;
+16DC;RUNIC LETTER INGWAZ;Lo;0;L;;;;;N;;;;;
+16DD;RUNIC LETTER ING;Lo;0;L;;;;;N;;;;;
+16DE;RUNIC LETTER DAGAZ DAEG D;Lo;0;L;;;;;N;;;;;
+16DF;RUNIC LETTER OTHALAN ETHEL O;Lo;0;L;;;;;N;;;;;
+16E0;RUNIC LETTER EAR;Lo;0;L;;;;;N;;;;;
+16E1;RUNIC LETTER IOR;Lo;0;L;;;;;N;;;;;
+16E2;RUNIC LETTER CWEORTH;Lo;0;L;;;;;N;;;;;
+16E3;RUNIC LETTER CALC;Lo;0;L;;;;;N;;;;;
+16E4;RUNIC LETTER CEALC;Lo;0;L;;;;;N;;;;;
+16E5;RUNIC LETTER STAN;Lo;0;L;;;;;N;;;;;
+16E6;RUNIC LETTER LONG-BRANCH-YR;Lo;0;L;;;;;N;;;;;
+16E7;RUNIC LETTER SHORT-TWIG-YR;Lo;0;L;;;;;N;;;;;
+16E8;RUNIC LETTER ICELANDIC-YR;Lo;0;L;;;;;N;;;;;
+16E9;RUNIC LETTER Q;Lo;0;L;;;;;N;;;;;
+16EA;RUNIC LETTER X;Lo;0;L;;;;;N;;;;;
+16EB;RUNIC SINGLE PUNCTUATION;Po;0;L;;;;;N;;;;;
+16EC;RUNIC MULTIPLE PUNCTUATION;Po;0;L;;;;;N;;;;;
+16ED;RUNIC CROSS PUNCTUATION;Po;0;L;;;;;N;;;;;
+16EE;RUNIC ARLAUG SYMBOL;No;0;L;;;;17;N;;golden number 17;;;
+16EF;RUNIC TVIMADUR SYMBOL;No;0;L;;;;18;N;;golden number 18;;;
+16F0;RUNIC BELGTHOR SYMBOL;No;0;L;;;;19;N;;golden number 19;;;
+1780;KHMER LETTER KA;Lo;0;L;;;;;N;;;;;
+1781;KHMER LETTER KHA;Lo;0;L;;;;;N;;;;;
+1782;KHMER LETTER KO;Lo;0;L;;;;;N;;;;;
+1783;KHMER LETTER KHO;Lo;0;L;;;;;N;;;;;
+1784;KHMER LETTER NGO;Lo;0;L;;;;;N;;;;;
+1785;KHMER LETTER CA;Lo;0;L;;;;;N;;;;;
+1786;KHMER LETTER CHA;Lo;0;L;;;;;N;;;;;
+1787;KHMER LETTER CO;Lo;0;L;;;;;N;;;;;
+1788;KHMER LETTER CHO;Lo;0;L;;;;;N;;;;;
+1789;KHMER LETTER NYO;Lo;0;L;;;;;N;;;;;
+178A;KHMER LETTER DA;Lo;0;L;;;;;N;;;;;
+178B;KHMER LETTER TTHA;Lo;0;L;;;;;N;;;;;
+178C;KHMER LETTER DO;Lo;0;L;;;;;N;;;;;
+178D;KHMER LETTER TTHO;Lo;0;L;;;;;N;;;;;
+178E;KHMER LETTER NNO;Lo;0;L;;;;;N;;;;;
+178F;KHMER LETTER TA;Lo;0;L;;;;;N;;;;;
+1790;KHMER LETTER THA;Lo;0;L;;;;;N;;;;;
+1791;KHMER LETTER TO;Lo;0;L;;;;;N;;;;;
+1792;KHMER LETTER THO;Lo;0;L;;;;;N;;;;;
+1793;KHMER LETTER NO;Lo;0;L;;;;;N;;;;;
+1794;KHMER LETTER BA;Lo;0;L;;;;;N;;;;;
+1795;KHMER LETTER PHA;Lo;0;L;;;;;N;;;;;
+1796;KHMER LETTER PO;Lo;0;L;;;;;N;;;;;
+1797;KHMER LETTER PHO;Lo;0;L;;;;;N;;;;;
+1798;KHMER LETTER MO;Lo;0;L;;;;;N;;;;;
+1799;KHMER LETTER YO;Lo;0;L;;;;;N;;;;;
+179A;KHMER LETTER RO;Lo;0;L;;;;;N;;;;;
+179B;KHMER LETTER LO;Lo;0;L;;;;;N;;;;;
+179C;KHMER LETTER VO;Lo;0;L;;;;;N;;;;;
+179D;KHMER LETTER SHA;Lo;0;L;;;;;N;;;;;
+179E;KHMER LETTER SSO;Lo;0;L;;;;;N;;;;;
+179F;KHMER LETTER SA;Lo;0;L;;;;;N;;;;;
+17A0;KHMER LETTER HA;Lo;0;L;;;;;N;;;;;
+17A1;KHMER LETTER LA;Lo;0;L;;;;;N;;;;;
+17A2;KHMER LETTER QA;Lo;0;L;;;;;N;;;;;
+17A3;KHMER INDEPENDENT VOWEL QAQ;Lo;0;L;;;;;N;;;;;
+17A4;KHMER INDEPENDENT VOWEL QAA;Lo;0;L;;;;;N;;;;;
+17A5;KHMER INDEPENDENT VOWEL QI;Lo;0;L;;;;;N;;;;;
+17A6;KHMER INDEPENDENT VOWEL QII;Lo;0;L;;;;;N;;;;;
+17A7;KHMER INDEPENDENT VOWEL QU;Lo;0;L;;;;;N;;;;;
+17A8;KHMER INDEPENDENT VOWEL QUK;Lo;0;L;;;;;N;;;;;
+17A9;KHMER INDEPENDENT VOWEL QUU;Lo;0;L;;;;;N;;;;;
+17AA;KHMER INDEPENDENT VOWEL QUUV;Lo;0;L;;;;;N;;;;;
+17AB;KHMER INDEPENDENT VOWEL RY;Lo;0;L;;;;;N;;;;;
+17AC;KHMER INDEPENDENT VOWEL RYY;Lo;0;L;;;;;N;;;;;
+17AD;KHMER INDEPENDENT VOWEL LY;Lo;0;L;;;;;N;;;;;
+17AE;KHMER INDEPENDENT VOWEL LYY;Lo;0;L;;;;;N;;;;;
+17AF;KHMER INDEPENDENT VOWEL QE;Lo;0;L;;;;;N;;;;;
+17B0;KHMER INDEPENDENT VOWEL QAI;Lo;0;L;;;;;N;;;;;
+17B1;KHMER INDEPENDENT VOWEL QOO TYPE ONE;Lo;0;L;;;;;N;;;;;
+17B2;KHMER INDEPENDENT VOWEL QOO TYPE TWO;Lo;0;L;;;;;N;;;;;
+17B3;KHMER INDEPENDENT VOWEL QAU;Lo;0;L;;;;;N;;;;;
+17B4;KHMER VOWEL INHERENT AQ;Mc;0;L;;;;;N;;;;;
+17B5;KHMER VOWEL INHERENT AA;Mc;0;L;;;;;N;;;;;
+17B6;KHMER VOWEL SIGN AA;Mc;0;L;;;;;N;;;;;
+17B7;KHMER VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;;
+17B8;KHMER VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;;
+17B9;KHMER VOWEL SIGN Y;Mn;0;NSM;;;;;N;;;;;
+17BA;KHMER VOWEL SIGN YY;Mn;0;NSM;;;;;N;;;;;
+17BB;KHMER VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;;
+17BC;KHMER VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;;
+17BD;KHMER VOWEL SIGN UA;Mn;0;NSM;;;;;N;;;;;
+17BE;KHMER VOWEL SIGN OE;Mc;0;L;;;;;N;;;;;
+17BF;KHMER VOWEL SIGN YA;Mc;0;L;;;;;N;;;;;
+17C0;KHMER VOWEL SIGN IE;Mc;0;L;;;;;N;;;;;
+17C1;KHMER VOWEL SIGN E;Mc;0;L;;;;;N;;;;;
+17C2;KHMER VOWEL SIGN AE;Mc;0;L;;;;;N;;;;;
+17C3;KHMER VOWEL SIGN AI;Mc;0;L;;;;;N;;;;;
+17C4;KHMER VOWEL SIGN OO;Mc;0;L;;;;;N;;;;;
+17C5;KHMER VOWEL SIGN AU;Mc;0;L;;;;;N;;;;;
+17C6;KHMER SIGN NIKAHIT;Mn;0;NSM;;;;;N;;;;;
+17C7;KHMER SIGN REAHMUK;Mc;0;L;;;;;N;;;;;
+17C8;KHMER SIGN YUUKALEAPINTU;Mc;0;L;;;;;N;;;;;
+17C9;KHMER SIGN MUUSIKATOAN;Mn;0;NSM;;;;;N;;;;;
+17CA;KHMER SIGN TRIISAP;Mn;0;NSM;;;;;N;;;;;
+17CB;KHMER SIGN BANTOC;Mn;0;NSM;;;;;N;;;;;
+17CC;KHMER SIGN ROBAT;Mn;0;NSM;;;;;N;;;;;
+17CD;KHMER SIGN TOANDAKHIAT;Mn;0;NSM;;;;;N;;;;;
+17CE;KHMER SIGN KAKABAT;Mn;0;NSM;;;;;N;;;;;
+17CF;KHMER SIGN AHSDA;Mn;0;NSM;;;;;N;;;;;
+17D0;KHMER SIGN SAMYOK SANNYA;Mn;0;NSM;;;;;N;;;;;
+17D1;KHMER SIGN VIRIAM;Mn;0;NSM;;;;;N;;;;;
+17D2;KHMER SIGN COENG;Mn;9;NSM;;;;;N;;;;;
+17D3;KHMER SIGN BATHAMASAT;Mn;0;NSM;;;;;N;;;;;
+17D4;KHMER SIGN KHAN;Po;0;L;;;;;N;;;;;
+17D5;KHMER SIGN BARIYOOSAN;Po;0;L;;;;;N;;;;;
+17D6;KHMER SIGN CAMNUC PII KUUH;Po;0;L;;;;;N;;;;;
+17D7;KHMER SIGN LEK TOO;Po;0;L;;;;;N;;;;;
+17D8;KHMER SIGN BEYYAL;Po;0;L;;;;;N;;;;;
+17D9;KHMER SIGN PHNAEK MUAN;Po;0;L;;;;;N;;;;;
+17DA;KHMER SIGN KOOMUUT;Po;0;L;;;;;N;;;;;
+17DB;KHMER CURRENCY SYMBOL RIEL;Sc;0;ET;;;;;N;;;;;
+17DC;KHMER SIGN AVAKRAHASANYA;Po;0;L;;;;;N;;;;;
+17E0;KHMER DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+17E1;KHMER DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+17E2;KHMER DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+17E3;KHMER DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+17E4;KHMER DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+17E5;KHMER DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+17E6;KHMER DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+17E7;KHMER DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+17E8;KHMER DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+17E9;KHMER DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+1800;MONGOLIAN BIRGA;Po;0;ON;;;;;N;;;;;
+1801;MONGOLIAN ELLIPSIS;Po;0;ON;;;;;N;;;;;
+1802;MONGOLIAN COMMA;Po;0;ON;;;;;N;;;;;
+1803;MONGOLIAN FULL STOP;Po;0;ON;;;;;N;;;;;
+1804;MONGOLIAN COLON;Po;0;ON;;;;;N;;;;;
+1805;MONGOLIAN FOUR DOTS;Po;0;ON;;;;;N;;;;;
+1806;MONGOLIAN TODO SOFT HYPHEN;Pd;0;ON;;;;;N;;;;;
+1807;MONGOLIAN SIBE SYLLABLE BOUNDARY MARKER;Po;0;ON;;;;;N;;;;;
+1808;MONGOLIAN MANCHU COMMA;Po;0;ON;;;;;N;;;;;
+1809;MONGOLIAN MANCHU FULL STOP;Po;0;ON;;;;;N;;;;;
+180A;MONGOLIAN NIRUGU;Po;0;ON;;;;;N;;;;;
+180B;MONGOLIAN FREE VARIATION SELECTOR ONE;Cf;0;BN;;;;;N;;;;;
+180C;MONGOLIAN FREE VARIATION SELECTOR TWO;Cf;0;BN;;;;;N;;;;;
+180D;MONGOLIAN FREE VARIATION SELECTOR THREE;Cf;0;BN;;;;;N;;;;;
+180E;MONGOLIAN VOWEL SEPARATOR;Cf;0;BN;;;;;N;;;;;
+1810;MONGOLIAN DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+1811;MONGOLIAN DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+1812;MONGOLIAN DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+1813;MONGOLIAN DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+1814;MONGOLIAN DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+1815;MONGOLIAN DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+1816;MONGOLIAN DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+1817;MONGOLIAN DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+1818;MONGOLIAN DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+1819;MONGOLIAN DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+1820;MONGOLIAN LETTER A;Lo;0;L;;;;;N;;;;;
+1821;MONGOLIAN LETTER E;Lo;0;L;;;;;N;;;;;
+1822;MONGOLIAN LETTER I;Lo;0;L;;;;;N;;;;;
+1823;MONGOLIAN LETTER O;Lo;0;L;;;;;N;;;;;
+1824;MONGOLIAN LETTER U;Lo;0;L;;;;;N;;;;;
+1825;MONGOLIAN LETTER OE;Lo;0;L;;;;;N;;;;;
+1826;MONGOLIAN LETTER UE;Lo;0;L;;;;;N;;;;;
+1827;MONGOLIAN LETTER EE;Lo;0;L;;;;;N;;;;;
+1828;MONGOLIAN LETTER NA;Lo;0;L;;;;;N;;;;;
+1829;MONGOLIAN LETTER ANG;Lo;0;L;;;;;N;;;;;
+182A;MONGOLIAN LETTER BA;Lo;0;L;;;;;N;;;;;
+182B;MONGOLIAN LETTER PA;Lo;0;L;;;;;N;;;;;
+182C;MONGOLIAN LETTER QA;Lo;0;L;;;;;N;;;;;
+182D;MONGOLIAN LETTER GA;Lo;0;L;;;;;N;;;;;
+182E;MONGOLIAN LETTER MA;Lo;0;L;;;;;N;;;;;
+182F;MONGOLIAN LETTER LA;Lo;0;L;;;;;N;;;;;
+1830;MONGOLIAN LETTER SA;Lo;0;L;;;;;N;;;;;
+1831;MONGOLIAN LETTER SHA;Lo;0;L;;;;;N;;;;;
+1832;MONGOLIAN LETTER TA;Lo;0;L;;;;;N;;;;;
+1833;MONGOLIAN LETTER DA;Lo;0;L;;;;;N;;;;;
+1834;MONGOLIAN LETTER CHA;Lo;0;L;;;;;N;;;;;
+1835;MONGOLIAN LETTER JA;Lo;0;L;;;;;N;;;;;
+1836;MONGOLIAN LETTER YA;Lo;0;L;;;;;N;;;;;
+1837;MONGOLIAN LETTER RA;Lo;0;L;;;;;N;;;;;
+1838;MONGOLIAN LETTER WA;Lo;0;L;;;;;N;;;;;
+1839;MONGOLIAN LETTER FA;Lo;0;L;;;;;N;;;;;
+183A;MONGOLIAN LETTER KA;Lo;0;L;;;;;N;;;;;
+183B;MONGOLIAN LETTER KHA;Lo;0;L;;;;;N;;;;;
+183C;MONGOLIAN LETTER TSA;Lo;0;L;;;;;N;;;;;
+183D;MONGOLIAN LETTER ZA;Lo;0;L;;;;;N;;;;;
+183E;MONGOLIAN LETTER HAA;Lo;0;L;;;;;N;;;;;
+183F;MONGOLIAN LETTER ZRA;Lo;0;L;;;;;N;;;;;
+1840;MONGOLIAN LETTER LHA;Lo;0;L;;;;;N;;;;;
+1841;MONGOLIAN LETTER ZHI;Lo;0;L;;;;;N;;;;;
+1842;MONGOLIAN LETTER CHI;Lo;0;L;;;;;N;;;;;
+1843;MONGOLIAN LETTER TODO LONG VOWEL SIGN;Lm;0;L;;;;;N;;;;;
+1844;MONGOLIAN LETTER TODO E;Lo;0;L;;;;;N;;;;;
+1845;MONGOLIAN LETTER TODO I;Lo;0;L;;;;;N;;;;;
+1846;MONGOLIAN LETTER TODO O;Lo;0;L;;;;;N;;;;;
+1847;MONGOLIAN LETTER TODO U;Lo;0;L;;;;;N;;;;;
+1848;MONGOLIAN LETTER TODO OE;Lo;0;L;;;;;N;;;;;
+1849;MONGOLIAN LETTER TODO UE;Lo;0;L;;;;;N;;;;;
+184A;MONGOLIAN LETTER TODO ANG;Lo;0;L;;;;;N;;;;;
+184B;MONGOLIAN LETTER TODO BA;Lo;0;L;;;;;N;;;;;
+184C;MONGOLIAN LETTER TODO PA;Lo;0;L;;;;;N;;;;;
+184D;MONGOLIAN LETTER TODO QA;Lo;0;L;;;;;N;;;;;
+184E;MONGOLIAN LETTER TODO GA;Lo;0;L;;;;;N;;;;;
+184F;MONGOLIAN LETTER TODO MA;Lo;0;L;;;;;N;;;;;
+1850;MONGOLIAN LETTER TODO TA;Lo;0;L;;;;;N;;;;;
+1851;MONGOLIAN LETTER TODO DA;Lo;0;L;;;;;N;;;;;
+1852;MONGOLIAN LETTER TODO CHA;Lo;0;L;;;;;N;;;;;
+1853;MONGOLIAN LETTER TODO JA;Lo;0;L;;;;;N;;;;;
+1854;MONGOLIAN LETTER TODO TSA;Lo;0;L;;;;;N;;;;;
+1855;MONGOLIAN LETTER TODO YA;Lo;0;L;;;;;N;;;;;
+1856;MONGOLIAN LETTER TODO WA;Lo;0;L;;;;;N;;;;;
+1857;MONGOLIAN LETTER TODO KA;Lo;0;L;;;;;N;;;;;
+1858;MONGOLIAN LETTER TODO GAA;Lo;0;L;;;;;N;;;;;
+1859;MONGOLIAN LETTER TODO HAA;Lo;0;L;;;;;N;;;;;
+185A;MONGOLIAN LETTER TODO JIA;Lo;0;L;;;;;N;;;;;
+185B;MONGOLIAN LETTER TODO NIA;Lo;0;L;;;;;N;;;;;
+185C;MONGOLIAN LETTER TODO DZA;Lo;0;L;;;;;N;;;;;
+185D;MONGOLIAN LETTER SIBE E;Lo;0;L;;;;;N;;;;;
+185E;MONGOLIAN LETTER SIBE I;Lo;0;L;;;;;N;;;;;
+185F;MONGOLIAN LETTER SIBE IY;Lo;0;L;;;;;N;;;;;
+1860;MONGOLIAN LETTER SIBE UE;Lo;0;L;;;;;N;;;;;
+1861;MONGOLIAN LETTER SIBE U;Lo;0;L;;;;;N;;;;;
+1862;MONGOLIAN LETTER SIBE ANG;Lo;0;L;;;;;N;;;;;
+1863;MONGOLIAN LETTER SIBE KA;Lo;0;L;;;;;N;;;;;
+1864;MONGOLIAN LETTER SIBE GA;Lo;0;L;;;;;N;;;;;
+1865;MONGOLIAN LETTER SIBE HA;Lo;0;L;;;;;N;;;;;
+1866;MONGOLIAN LETTER SIBE PA;Lo;0;L;;;;;N;;;;;
+1867;MONGOLIAN LETTER SIBE SHA;Lo;0;L;;;;;N;;;;;
+1868;MONGOLIAN LETTER SIBE TA;Lo;0;L;;;;;N;;;;;
+1869;MONGOLIAN LETTER SIBE DA;Lo;0;L;;;;;N;;;;;
+186A;MONGOLIAN LETTER SIBE JA;Lo;0;L;;;;;N;;;;;
+186B;MONGOLIAN LETTER SIBE FA;Lo;0;L;;;;;N;;;;;
+186C;MONGOLIAN LETTER SIBE GAA;Lo;0;L;;;;;N;;;;;
+186D;MONGOLIAN LETTER SIBE HAA;Lo;0;L;;;;;N;;;;;
+186E;MONGOLIAN LETTER SIBE TSA;Lo;0;L;;;;;N;;;;;
+186F;MONGOLIAN LETTER SIBE ZA;Lo;0;L;;;;;N;;;;;
+1870;MONGOLIAN LETTER SIBE RAA;Lo;0;L;;;;;N;;;;;
+1871;MONGOLIAN LETTER SIBE CHA;Lo;0;L;;;;;N;;;;;
+1872;MONGOLIAN LETTER SIBE ZHA;Lo;0;L;;;;;N;;;;;
+1873;MONGOLIAN LETTER MANCHU I;Lo;0;L;;;;;N;;;;;
+1874;MONGOLIAN LETTER MANCHU KA;Lo;0;L;;;;;N;;;;;
+1875;MONGOLIAN LETTER MANCHU RA;Lo;0;L;;;;;N;;;;;
+1876;MONGOLIAN LETTER MANCHU FA;Lo;0;L;;;;;N;;;;;
+1877;MONGOLIAN LETTER MANCHU ZHA;Lo;0;L;;;;;N;;;;;
+1880;MONGOLIAN LETTER ALI GALI ANUSVARA ONE;Lo;0;L;;;;;N;;;;;
+1881;MONGOLIAN LETTER ALI GALI VISARGA ONE;Lo;0;L;;;;;N;;;;;
+1882;MONGOLIAN LETTER ALI GALI DAMARU;Lo;0;L;;;;;N;;;;;
+1883;MONGOLIAN LETTER ALI GALI UBADAMA;Lo;0;L;;;;;N;;;;;
+1884;MONGOLIAN LETTER ALI GALI INVERTED UBADAMA;Lo;0;L;;;;;N;;;;;
+1885;MONGOLIAN LETTER ALI GALI BALUDA;Lo;0;L;;;;;N;;;;;
+1886;MONGOLIAN LETTER ALI GALI THREE BALUDA;Lo;0;L;;;;;N;;;;;
+1887;MONGOLIAN LETTER ALI GALI A;Lo;0;L;;;;;N;;;;;
+1888;MONGOLIAN LETTER ALI GALI I;Lo;0;L;;;;;N;;;;;
+1889;MONGOLIAN LETTER ALI GALI KA;Lo;0;L;;;;;N;;;;;
+188A;MONGOLIAN LETTER ALI GALI NGA;Lo;0;L;;;;;N;;;;;
+188B;MONGOLIAN LETTER ALI GALI CA;Lo;0;L;;;;;N;;;;;
+188C;MONGOLIAN LETTER ALI GALI TTA;Lo;0;L;;;;;N;;;;;
+188D;MONGOLIAN LETTER ALI GALI TTHA;Lo;0;L;;;;;N;;;;;
+188E;MONGOLIAN LETTER ALI GALI DDA;Lo;0;L;;;;;N;;;;;
+188F;MONGOLIAN LETTER ALI GALI NNA;Lo;0;L;;;;;N;;;;;
+1890;MONGOLIAN LETTER ALI GALI TA;Lo;0;L;;;;;N;;;;;
+1891;MONGOLIAN LETTER ALI GALI DA;Lo;0;L;;;;;N;;;;;
+1892;MONGOLIAN LETTER ALI GALI PA;Lo;0;L;;;;;N;;;;;
+1893;MONGOLIAN LETTER ALI GALI PHA;Lo;0;L;;;;;N;;;;;
+1894;MONGOLIAN LETTER ALI GALI SSA;Lo;0;L;;;;;N;;;;;
+1895;MONGOLIAN LETTER ALI GALI ZHA;Lo;0;L;;;;;N;;;;;
+1896;MONGOLIAN LETTER ALI GALI ZA;Lo;0;L;;;;;N;;;;;
+1897;MONGOLIAN LETTER ALI GALI AH;Lo;0;L;;;;;N;;;;;
+1898;MONGOLIAN LETTER TODO ALI GALI TA;Lo;0;L;;;;;N;;;;;
+1899;MONGOLIAN LETTER TODO ALI GALI ZHA;Lo;0;L;;;;;N;;;;;
+189A;MONGOLIAN LETTER MANCHU ALI GALI GHA;Lo;0;L;;;;;N;;;;;
+189B;MONGOLIAN LETTER MANCHU ALI GALI NGA;Lo;0;L;;;;;N;;;;;
+189C;MONGOLIAN LETTER MANCHU ALI GALI CA;Lo;0;L;;;;;N;;;;;
+189D;MONGOLIAN LETTER MANCHU ALI GALI JHA;Lo;0;L;;;;;N;;;;;
+189E;MONGOLIAN LETTER MANCHU ALI GALI TTA;Lo;0;L;;;;;N;;;;;
+189F;MONGOLIAN LETTER MANCHU ALI GALI DDHA;Lo;0;L;;;;;N;;;;;
+18A0;MONGOLIAN LETTER MANCHU ALI GALI TA;Lo;0;L;;;;;N;;;;;
+18A1;MONGOLIAN LETTER MANCHU ALI GALI DHA;Lo;0;L;;;;;N;;;;;
+18A2;MONGOLIAN LETTER MANCHU ALI GALI SSA;Lo;0;L;;;;;N;;;;;
+18A3;MONGOLIAN LETTER MANCHU ALI GALI CYA;Lo;0;L;;;;;N;;;;;
+18A4;MONGOLIAN LETTER MANCHU ALI GALI ZHA;Lo;0;L;;;;;N;;;;;
+18A5;MONGOLIAN LETTER MANCHU ALI GALI ZA;Lo;0;L;;;;;N;;;;;
+18A6;MONGOLIAN LETTER ALI GALI HALF U;Lo;0;L;;;;;N;;;;;
+18A7;MONGOLIAN LETTER ALI GALI HALF YA;Lo;0;L;;;;;N;;;;;
+18A8;MONGOLIAN LETTER MANCHU ALI GALI BHA;Lo;0;L;;;;;N;;;;;
+18A9;MONGOLIAN LETTER ALI GALI DAGALGA;Mn;228;NSM;;;;;N;;;;;
+1E00;LATIN CAPITAL LETTER A WITH RING BELOW;Lu;0;L;0041 0325;;;;N;;;;1E01;
+1E01;LATIN SMALL LETTER A WITH RING BELOW;Ll;0;L;0061 0325;;;;N;;;1E00;;1E00
+1E02;LATIN CAPITAL LETTER B WITH DOT ABOVE;Lu;0;L;0042 0307;;;;N;;;;1E03;
+1E03;LATIN SMALL LETTER B WITH DOT ABOVE;Ll;0;L;0062 0307;;;;N;;;1E02;;1E02
+1E04;LATIN CAPITAL LETTER B WITH DOT BELOW;Lu;0;L;0042 0323;;;;N;;;;1E05;
+1E05;LATIN SMALL LETTER B WITH DOT BELOW;Ll;0;L;0062 0323;;;;N;;;1E04;;1E04
+1E06;LATIN CAPITAL LETTER B WITH LINE BELOW;Lu;0;L;0042 0331;;;;N;;;;1E07;
+1E07;LATIN SMALL LETTER B WITH LINE BELOW;Ll;0;L;0062 0331;;;;N;;;1E06;;1E06
+1E08;LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE;Lu;0;L;00C7 0301;;;;N;;;;1E09;
+1E09;LATIN SMALL LETTER C WITH CEDILLA AND ACUTE;Ll;0;L;00E7 0301;;;;N;;;1E08;;1E08
+1E0A;LATIN CAPITAL LETTER D WITH DOT ABOVE;Lu;0;L;0044 0307;;;;N;;;;1E0B;
+1E0B;LATIN SMALL LETTER D WITH DOT ABOVE;Ll;0;L;0064 0307;;;;N;;;1E0A;;1E0A
+1E0C;LATIN CAPITAL LETTER D WITH DOT BELOW;Lu;0;L;0044 0323;;;;N;;;;1E0D;
+1E0D;LATIN SMALL LETTER D WITH DOT BELOW;Ll;0;L;0064 0323;;;;N;;;1E0C;;1E0C
+1E0E;LATIN CAPITAL LETTER D WITH LINE BELOW;Lu;0;L;0044 0331;;;;N;;;;1E0F;
+1E0F;LATIN SMALL LETTER D WITH LINE BELOW;Ll;0;L;0064 0331;;;;N;;;1E0E;;1E0E
+1E10;LATIN CAPITAL LETTER D WITH CEDILLA;Lu;0;L;0044 0327;;;;N;;;;1E11;
+1E11;LATIN SMALL LETTER D WITH CEDILLA;Ll;0;L;0064 0327;;;;N;;;1E10;;1E10
+1E12;LATIN CAPITAL LETTER D WITH CIRCUMFLEX BELOW;Lu;0;L;0044 032D;;;;N;;;;1E13;
+1E13;LATIN SMALL LETTER D WITH CIRCUMFLEX BELOW;Ll;0;L;0064 032D;;;;N;;;1E12;;1E12
+1E14;LATIN CAPITAL LETTER E WITH MACRON AND GRAVE;Lu;0;L;0112 0300;;;;N;;;;1E15;
+1E15;LATIN SMALL LETTER E WITH MACRON AND GRAVE;Ll;0;L;0113 0300;;;;N;;;1E14;;1E14
+1E16;LATIN CAPITAL LETTER E WITH MACRON AND ACUTE;Lu;0;L;0112 0301;;;;N;;;;1E17;
+1E17;LATIN SMALL LETTER E WITH MACRON AND ACUTE;Ll;0;L;0113 0301;;;;N;;;1E16;;1E16
+1E18;LATIN CAPITAL LETTER E WITH CIRCUMFLEX BELOW;Lu;0;L;0045 032D;;;;N;;;;1E19;
+1E19;LATIN SMALL LETTER E WITH CIRCUMFLEX BELOW;Ll;0;L;0065 032D;;;;N;;;1E18;;1E18
+1E1A;LATIN CAPITAL LETTER E WITH TILDE BELOW;Lu;0;L;0045 0330;;;;N;;;;1E1B;
+1E1B;LATIN SMALL LETTER E WITH TILDE BELOW;Ll;0;L;0065 0330;;;;N;;;1E1A;;1E1A
+1E1C;LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE;Lu;0;L;0228 0306;;;;N;;;;1E1D;
+1E1D;LATIN SMALL LETTER E WITH CEDILLA AND BREVE;Ll;0;L;0229 0306;;;;N;;;1E1C;;1E1C
+1E1E;LATIN CAPITAL LETTER F WITH DOT ABOVE;Lu;0;L;0046 0307;;;;N;;;;1E1F;
+1E1F;LATIN SMALL LETTER F WITH DOT ABOVE;Ll;0;L;0066 0307;;;;N;;;1E1E;;1E1E
+1E20;LATIN CAPITAL LETTER G WITH MACRON;Lu;0;L;0047 0304;;;;N;;;;1E21;
+1E21;LATIN SMALL LETTER G WITH MACRON;Ll;0;L;0067 0304;;;;N;;;1E20;;1E20
+1E22;LATIN CAPITAL LETTER H WITH DOT ABOVE;Lu;0;L;0048 0307;;;;N;;;;1E23;
+1E23;LATIN SMALL LETTER H WITH DOT ABOVE;Ll;0;L;0068 0307;;;;N;;;1E22;;1E22
+1E24;LATIN CAPITAL LETTER H WITH DOT BELOW;Lu;0;L;0048 0323;;;;N;;;;1E25;
+1E25;LATIN SMALL LETTER H WITH DOT BELOW;Ll;0;L;0068 0323;;;;N;;;1E24;;1E24
+1E26;LATIN CAPITAL LETTER H WITH DIAERESIS;Lu;0;L;0048 0308;;;;N;;;;1E27;
+1E27;LATIN SMALL LETTER H WITH DIAERESIS;Ll;0;L;0068 0308;;;;N;;;1E26;;1E26
+1E28;LATIN CAPITAL LETTER H WITH CEDILLA;Lu;0;L;0048 0327;;;;N;;;;1E29;
+1E29;LATIN SMALL LETTER H WITH CEDILLA;Ll;0;L;0068 0327;;;;N;;;1E28;;1E28
+1E2A;LATIN CAPITAL LETTER H WITH BREVE BELOW;Lu;0;L;0048 032E;;;;N;;;;1E2B;
+1E2B;LATIN SMALL LETTER H WITH BREVE BELOW;Ll;0;L;0068 032E;;;;N;;;1E2A;;1E2A
+1E2C;LATIN CAPITAL LETTER I WITH TILDE BELOW;Lu;0;L;0049 0330;;;;N;;;;1E2D;
+1E2D;LATIN SMALL LETTER I WITH TILDE BELOW;Ll;0;L;0069 0330;;;;N;;;1E2C;;1E2C
+1E2E;LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE;Lu;0;L;00CF 0301;;;;N;;;;1E2F;
+1E2F;LATIN SMALL LETTER I WITH DIAERESIS AND ACUTE;Ll;0;L;00EF 0301;;;;N;;;1E2E;;1E2E
+1E30;LATIN CAPITAL LETTER K WITH ACUTE;Lu;0;L;004B 0301;;;;N;;;;1E31;
+1E31;LATIN SMALL LETTER K WITH ACUTE;Ll;0;L;006B 0301;;;;N;;;1E30;;1E30
+1E32;LATIN CAPITAL LETTER K WITH DOT BELOW;Lu;0;L;004B 0323;;;;N;;;;1E33;
+1E33;LATIN SMALL LETTER K WITH DOT BELOW;Ll;0;L;006B 0323;;;;N;;;1E32;;1E32
+1E34;LATIN CAPITAL LETTER K WITH LINE BELOW;Lu;0;L;004B 0331;;;;N;;;;1E35;
+1E35;LATIN SMALL LETTER K WITH LINE BELOW;Ll;0;L;006B 0331;;;;N;;;1E34;;1E34
+1E36;LATIN CAPITAL LETTER L WITH DOT BELOW;Lu;0;L;004C 0323;;;;N;;;;1E37;
+1E37;LATIN SMALL LETTER L WITH DOT BELOW;Ll;0;L;006C 0323;;;;N;;;1E36;;1E36
+1E38;LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON;Lu;0;L;1E36 0304;;;;N;;;;1E39;
+1E39;LATIN SMALL LETTER L WITH DOT BELOW AND MACRON;Ll;0;L;1E37 0304;;;;N;;;1E38;;1E38
+1E3A;LATIN CAPITAL LETTER L WITH LINE BELOW;Lu;0;L;004C 0331;;;;N;;;;1E3B;
+1E3B;LATIN SMALL LETTER L WITH LINE BELOW;Ll;0;L;006C 0331;;;;N;;;1E3A;;1E3A
+1E3C;LATIN CAPITAL LETTER L WITH CIRCUMFLEX BELOW;Lu;0;L;004C 032D;;;;N;;;;1E3D;
+1E3D;LATIN SMALL LETTER L WITH CIRCUMFLEX BELOW;Ll;0;L;006C 032D;;;;N;;;1E3C;;1E3C
+1E3E;LATIN CAPITAL LETTER M WITH ACUTE;Lu;0;L;004D 0301;;;;N;;;;1E3F;
+1E3F;LATIN SMALL LETTER M WITH ACUTE;Ll;0;L;006D 0301;;;;N;;;1E3E;;1E3E
+1E40;LATIN CAPITAL LETTER M WITH DOT ABOVE;Lu;0;L;004D 0307;;;;N;;;;1E41;
+1E41;LATIN SMALL LETTER M WITH DOT ABOVE;Ll;0;L;006D 0307;;;;N;;;1E40;;1E40
+1E42;LATIN CAPITAL LETTER M WITH DOT BELOW;Lu;0;L;004D 0323;;;;N;;;;1E43;
+1E43;LATIN SMALL LETTER M WITH DOT BELOW;Ll;0;L;006D 0323;;;;N;;;1E42;;1E42
+1E44;LATIN CAPITAL LETTER N WITH DOT ABOVE;Lu;0;L;004E 0307;;;;N;;;;1E45;
+1E45;LATIN SMALL LETTER N WITH DOT ABOVE;Ll;0;L;006E 0307;;;;N;;;1E44;;1E44
+1E46;LATIN CAPITAL LETTER N WITH DOT BELOW;Lu;0;L;004E 0323;;;;N;;;;1E47;
+1E47;LATIN SMALL LETTER N WITH DOT BELOW;Ll;0;L;006E 0323;;;;N;;;1E46;;1E46
+1E48;LATIN CAPITAL LETTER N WITH LINE BELOW;Lu;0;L;004E 0331;;;;N;;;;1E49;
+1E49;LATIN SMALL LETTER N WITH LINE BELOW;Ll;0;L;006E 0331;;;;N;;;1E48;;1E48
+1E4A;LATIN CAPITAL LETTER N WITH CIRCUMFLEX BELOW;Lu;0;L;004E 032D;;;;N;;;;1E4B;
+1E4B;LATIN SMALL LETTER N WITH CIRCUMFLEX BELOW;Ll;0;L;006E 032D;;;;N;;;1E4A;;1E4A
+1E4C;LATIN CAPITAL LETTER O WITH TILDE AND ACUTE;Lu;0;L;00D5 0301;;;;N;;;;1E4D;
+1E4D;LATIN SMALL LETTER O WITH TILDE AND ACUTE;Ll;0;L;00F5 0301;;;;N;;;1E4C;;1E4C
+1E4E;LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS;Lu;0;L;00D5 0308;;;;N;;;;1E4F;
+1E4F;LATIN SMALL LETTER O WITH TILDE AND DIAERESIS;Ll;0;L;00F5 0308;;;;N;;;1E4E;;1E4E
+1E50;LATIN CAPITAL LETTER O WITH MACRON AND GRAVE;Lu;0;L;014C 0300;;;;N;;;;1E51;
+1E51;LATIN SMALL LETTER O WITH MACRON AND GRAVE;Ll;0;L;014D 0300;;;;N;;;1E50;;1E50
+1E52;LATIN CAPITAL LETTER O WITH MACRON AND ACUTE;Lu;0;L;014C 0301;;;;N;;;;1E53;
+1E53;LATIN SMALL LETTER O WITH MACRON AND ACUTE;Ll;0;L;014D 0301;;;;N;;;1E52;;1E52
+1E54;LATIN CAPITAL LETTER P WITH ACUTE;Lu;0;L;0050 0301;;;;N;;;;1E55;
+1E55;LATIN SMALL LETTER P WITH ACUTE;Ll;0;L;0070 0301;;;;N;;;1E54;;1E54
+1E56;LATIN CAPITAL LETTER P WITH DOT ABOVE;Lu;0;L;0050 0307;;;;N;;;;1E57;
+1E57;LATIN SMALL LETTER P WITH DOT ABOVE;Ll;0;L;0070 0307;;;;N;;;1E56;;1E56
+1E58;LATIN CAPITAL LETTER R WITH DOT ABOVE;Lu;0;L;0052 0307;;;;N;;;;1E59;
+1E59;LATIN SMALL LETTER R WITH DOT ABOVE;Ll;0;L;0072 0307;;;;N;;;1E58;;1E58
+1E5A;LATIN CAPITAL LETTER R WITH DOT BELOW;Lu;0;L;0052 0323;;;;N;;;;1E5B;
+1E5B;LATIN SMALL LETTER R WITH DOT BELOW;Ll;0;L;0072 0323;;;;N;;;1E5A;;1E5A
+1E5C;LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON;Lu;0;L;1E5A 0304;;;;N;;;;1E5D;
+1E5D;LATIN SMALL LETTER R WITH DOT BELOW AND MACRON;Ll;0;L;1E5B 0304;;;;N;;;1E5C;;1E5C
+1E5E;LATIN CAPITAL LETTER R WITH LINE BELOW;Lu;0;L;0052 0331;;;;N;;;;1E5F;
+1E5F;LATIN SMALL LETTER R WITH LINE BELOW;Ll;0;L;0072 0331;;;;N;;;1E5E;;1E5E
+1E60;LATIN CAPITAL LETTER S WITH DOT ABOVE;Lu;0;L;0053 0307;;;;N;;;;1E61;
+1E61;LATIN SMALL LETTER S WITH DOT ABOVE;Ll;0;L;0073 0307;;;;N;;;1E60;;1E60
+1E62;LATIN CAPITAL LETTER S WITH DOT BELOW;Lu;0;L;0053 0323;;;;N;;;;1E63;
+1E63;LATIN SMALL LETTER S WITH DOT BELOW;Ll;0;L;0073 0323;;;;N;;;1E62;;1E62
+1E64;LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE;Lu;0;L;015A 0307;;;;N;;;;1E65;
+1E65;LATIN SMALL LETTER S WITH ACUTE AND DOT ABOVE;Ll;0;L;015B 0307;;;;N;;;1E64;;1E64
+1E66;LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE;Lu;0;L;0160 0307;;;;N;;;;1E67;
+1E67;LATIN SMALL LETTER S WITH CARON AND DOT ABOVE;Ll;0;L;0161 0307;;;;N;;;1E66;;1E66
+1E68;LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE;Lu;0;L;1E62 0307;;;;N;;;;1E69;
+1E69;LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE;Ll;0;L;1E63 0307;;;;N;;;1E68;;1E68
+1E6A;LATIN CAPITAL LETTER T WITH DOT ABOVE;Lu;0;L;0054 0307;;;;N;;;;1E6B;
+1E6B;LATIN SMALL LETTER T WITH DOT ABOVE;Ll;0;L;0074 0307;;;;N;;;1E6A;;1E6A
+1E6C;LATIN CAPITAL LETTER T WITH DOT BELOW;Lu;0;L;0054 0323;;;;N;;;;1E6D;
+1E6D;LATIN SMALL LETTER T WITH DOT BELOW;Ll;0;L;0074 0323;;;;N;;;1E6C;;1E6C
+1E6E;LATIN CAPITAL LETTER T WITH LINE BELOW;Lu;0;L;0054 0331;;;;N;;;;1E6F;
+1E6F;LATIN SMALL LETTER T WITH LINE BELOW;Ll;0;L;0074 0331;;;;N;;;1E6E;;1E6E
+1E70;LATIN CAPITAL LETTER T WITH CIRCUMFLEX BELOW;Lu;0;L;0054 032D;;;;N;;;;1E71;
+1E71;LATIN SMALL LETTER T WITH CIRCUMFLEX BELOW;Ll;0;L;0074 032D;;;;N;;;1E70;;1E70
+1E72;LATIN CAPITAL LETTER U WITH DIAERESIS BELOW;Lu;0;L;0055 0324;;;;N;;;;1E73;
+1E73;LATIN SMALL LETTER U WITH DIAERESIS BELOW;Ll;0;L;0075 0324;;;;N;;;1E72;;1E72
+1E74;LATIN CAPITAL LETTER U WITH TILDE BELOW;Lu;0;L;0055 0330;;;;N;;;;1E75;
+1E75;LATIN SMALL LETTER U WITH TILDE BELOW;Ll;0;L;0075 0330;;;;N;;;1E74;;1E74
+1E76;LATIN CAPITAL LETTER U WITH CIRCUMFLEX BELOW;Lu;0;L;0055 032D;;;;N;;;;1E77;
+1E77;LATIN SMALL LETTER U WITH CIRCUMFLEX BELOW;Ll;0;L;0075 032D;;;;N;;;1E76;;1E76
+1E78;LATIN CAPITAL LETTER U WITH TILDE AND ACUTE;Lu;0;L;0168 0301;;;;N;;;;1E79;
+1E79;LATIN SMALL LETTER U WITH TILDE AND ACUTE;Ll;0;L;0169 0301;;;;N;;;1E78;;1E78
+1E7A;LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS;Lu;0;L;016A 0308;;;;N;;;;1E7B;
+1E7B;LATIN SMALL LETTER U WITH MACRON AND DIAERESIS;Ll;0;L;016B 0308;;;;N;;;1E7A;;1E7A
+1E7C;LATIN CAPITAL LETTER V WITH TILDE;Lu;0;L;0056 0303;;;;N;;;;1E7D;
+1E7D;LATIN SMALL LETTER V WITH TILDE;Ll;0;L;0076 0303;;;;N;;;1E7C;;1E7C
+1E7E;LATIN CAPITAL LETTER V WITH DOT BELOW;Lu;0;L;0056 0323;;;;N;;;;1E7F;
+1E7F;LATIN SMALL LETTER V WITH DOT BELOW;Ll;0;L;0076 0323;;;;N;;;1E7E;;1E7E
+1E80;LATIN CAPITAL LETTER W WITH GRAVE;Lu;0;L;0057 0300;;;;N;;;;1E81;
+1E81;LATIN SMALL LETTER W WITH GRAVE;Ll;0;L;0077 0300;;;;N;;;1E80;;1E80
+1E82;LATIN CAPITAL LETTER W WITH ACUTE;Lu;0;L;0057 0301;;;;N;;;;1E83;
+1E83;LATIN SMALL LETTER W WITH ACUTE;Ll;0;L;0077 0301;;;;N;;;1E82;;1E82
+1E84;LATIN CAPITAL LETTER W WITH DIAERESIS;Lu;0;L;0057 0308;;;;N;;;;1E85;
+1E85;LATIN SMALL LETTER W WITH DIAERESIS;Ll;0;L;0077 0308;;;;N;;;1E84;;1E84
+1E86;LATIN CAPITAL LETTER W WITH DOT ABOVE;Lu;0;L;0057 0307;;;;N;;;;1E87;
+1E87;LATIN SMALL LETTER W WITH DOT ABOVE;Ll;0;L;0077 0307;;;;N;;;1E86;;1E86
+1E88;LATIN CAPITAL LETTER W WITH DOT BELOW;Lu;0;L;0057 0323;;;;N;;;;1E89;
+1E89;LATIN SMALL LETTER W WITH DOT BELOW;Ll;0;L;0077 0323;;;;N;;;1E88;;1E88
+1E8A;LATIN CAPITAL LETTER X WITH DOT ABOVE;Lu;0;L;0058 0307;;;;N;;;;1E8B;
+1E8B;LATIN SMALL LETTER X WITH DOT ABOVE;Ll;0;L;0078 0307;;;;N;;;1E8A;;1E8A
+1E8C;LATIN CAPITAL LETTER X WITH DIAERESIS;Lu;0;L;0058 0308;;;;N;;;;1E8D;
+1E8D;LATIN SMALL LETTER X WITH DIAERESIS;Ll;0;L;0078 0308;;;;N;;;1E8C;;1E8C
+1E8E;LATIN CAPITAL LETTER Y WITH DOT ABOVE;Lu;0;L;0059 0307;;;;N;;;;1E8F;
+1E8F;LATIN SMALL LETTER Y WITH DOT ABOVE;Ll;0;L;0079 0307;;;;N;;;1E8E;;1E8E
+1E90;LATIN CAPITAL LETTER Z WITH CIRCUMFLEX;Lu;0;L;005A 0302;;;;N;;;;1E91;
+1E91;LATIN SMALL LETTER Z WITH CIRCUMFLEX;Ll;0;L;007A 0302;;;;N;;;1E90;;1E90
+1E92;LATIN CAPITAL LETTER Z WITH DOT BELOW;Lu;0;L;005A 0323;;;;N;;;;1E93;
+1E93;LATIN SMALL LETTER Z WITH DOT BELOW;Ll;0;L;007A 0323;;;;N;;;1E92;;1E92
+1E94;LATIN CAPITAL LETTER Z WITH LINE BELOW;Lu;0;L;005A 0331;;;;N;;;;1E95;
+1E95;LATIN SMALL LETTER Z WITH LINE BELOW;Ll;0;L;007A 0331;;;;N;;;1E94;;1E94
+1E96;LATIN SMALL LETTER H WITH LINE BELOW;Ll;0;L;0068 0331;;;;N;;;;;
+1E97;LATIN SMALL LETTER T WITH DIAERESIS;Ll;0;L;0074 0308;;;;N;;;;;
+1E98;LATIN SMALL LETTER W WITH RING ABOVE;Ll;0;L;0077 030A;;;;N;;;;;
+1E99;LATIN SMALL LETTER Y WITH RING ABOVE;Ll;0;L;0079 030A;;;;N;;;;;
+1E9A;LATIN SMALL LETTER A WITH RIGHT HALF RING;Ll;0;L;<compat> 0061 02BE;;;;N;;;;;
+1E9B;LATIN SMALL LETTER LONG S WITH DOT ABOVE;Ll;0;L;017F 0307;;;;N;;;1E60;;1E60
+1EA0;LATIN CAPITAL LETTER A WITH DOT BELOW;Lu;0;L;0041 0323;;;;N;;;;1EA1;
+1EA1;LATIN SMALL LETTER A WITH DOT BELOW;Ll;0;L;0061 0323;;;;N;;;1EA0;;1EA0
+1EA2;LATIN CAPITAL LETTER A WITH HOOK ABOVE;Lu;0;L;0041 0309;;;;N;;;;1EA3;
+1EA3;LATIN SMALL LETTER A WITH HOOK ABOVE;Ll;0;L;0061 0309;;;;N;;;1EA2;;1EA2
+1EA4;LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE;Lu;0;L;00C2 0301;;;;N;;;;1EA5;
+1EA5;LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE;Ll;0;L;00E2 0301;;;;N;;;1EA4;;1EA4
+1EA6;LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE;Lu;0;L;00C2 0300;;;;N;;;;1EA7;
+1EA7;LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE;Ll;0;L;00E2 0300;;;;N;;;1EA6;;1EA6
+1EA8;LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE;Lu;0;L;00C2 0309;;;;N;;;;1EA9;
+1EA9;LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE;Ll;0;L;00E2 0309;;;;N;;;1EA8;;1EA8
+1EAA;LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE;Lu;0;L;00C2 0303;;;;N;;;;1EAB;
+1EAB;LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE;Ll;0;L;00E2 0303;;;;N;;;1EAA;;1EAA
+1EAC;LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW;Lu;0;L;1EA0 0302;;;;N;;;;1EAD;
+1EAD;LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW;Ll;0;L;1EA1 0302;;;;N;;;1EAC;;1EAC
+1EAE;LATIN CAPITAL LETTER A WITH BREVE AND ACUTE;Lu;0;L;0102 0301;;;;N;;;;1EAF;
+1EAF;LATIN SMALL LETTER A WITH BREVE AND ACUTE;Ll;0;L;0103 0301;;;;N;;;1EAE;;1EAE
+1EB0;LATIN CAPITAL LETTER A WITH BREVE AND GRAVE;Lu;0;L;0102 0300;;;;N;;;;1EB1;
+1EB1;LATIN SMALL LETTER A WITH BREVE AND GRAVE;Ll;0;L;0103 0300;;;;N;;;1EB0;;1EB0
+1EB2;LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE;Lu;0;L;0102 0309;;;;N;;;;1EB3;
+1EB3;LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE;Ll;0;L;0103 0309;;;;N;;;1EB2;;1EB2
+1EB4;LATIN CAPITAL LETTER A WITH BREVE AND TILDE;Lu;0;L;0102 0303;;;;N;;;;1EB5;
+1EB5;LATIN SMALL LETTER A WITH BREVE AND TILDE;Ll;0;L;0103 0303;;;;N;;;1EB4;;1EB4
+1EB6;LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW;Lu;0;L;1EA0 0306;;;;N;;;;1EB7;
+1EB7;LATIN SMALL LETTER A WITH BREVE AND DOT BELOW;Ll;0;L;1EA1 0306;;;;N;;;1EB6;;1EB6
+1EB8;LATIN CAPITAL LETTER E WITH DOT BELOW;Lu;0;L;0045 0323;;;;N;;;;1EB9;
+1EB9;LATIN SMALL LETTER E WITH DOT BELOW;Ll;0;L;0065 0323;;;;N;;;1EB8;;1EB8
+1EBA;LATIN CAPITAL LETTER E WITH HOOK ABOVE;Lu;0;L;0045 0309;;;;N;;;;1EBB;
+1EBB;LATIN SMALL LETTER E WITH HOOK ABOVE;Ll;0;L;0065 0309;;;;N;;;1EBA;;1EBA
+1EBC;LATIN CAPITAL LETTER E WITH TILDE;Lu;0;L;0045 0303;;;;N;;;;1EBD;
+1EBD;LATIN SMALL LETTER E WITH TILDE;Ll;0;L;0065 0303;;;;N;;;1EBC;;1EBC
+1EBE;LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE;Lu;0;L;00CA 0301;;;;N;;;;1EBF;
+1EBF;LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE;Ll;0;L;00EA 0301;;;;N;;;1EBE;;1EBE
+1EC0;LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE;Lu;0;L;00CA 0300;;;;N;;;;1EC1;
+1EC1;LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE;Ll;0;L;00EA 0300;;;;N;;;1EC0;;1EC0
+1EC2;LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE;Lu;0;L;00CA 0309;;;;N;;;;1EC3;
+1EC3;LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE;Ll;0;L;00EA 0309;;;;N;;;1EC2;;1EC2
+1EC4;LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE;Lu;0;L;00CA 0303;;;;N;;;;1EC5;
+1EC5;LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE;Ll;0;L;00EA 0303;;;;N;;;1EC4;;1EC4
+1EC6;LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW;Lu;0;L;1EB8 0302;;;;N;;;;1EC7;
+1EC7;LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW;Ll;0;L;1EB9 0302;;;;N;;;1EC6;;1EC6
+1EC8;LATIN CAPITAL LETTER I WITH HOOK ABOVE;Lu;0;L;0049 0309;;;;N;;;;1EC9;
+1EC9;LATIN SMALL LETTER I WITH HOOK ABOVE;Ll;0;L;0069 0309;;;;N;;;1EC8;;1EC8
+1ECA;LATIN CAPITAL LETTER I WITH DOT BELOW;Lu;0;L;0049 0323;;;;N;;;;1ECB;
+1ECB;LATIN SMALL LETTER I WITH DOT BELOW;Ll;0;L;0069 0323;;;;N;;;1ECA;;1ECA
+1ECC;LATIN CAPITAL LETTER O WITH DOT BELOW;Lu;0;L;004F 0323;;;;N;;;;1ECD;
+1ECD;LATIN SMALL LETTER O WITH DOT BELOW;Ll;0;L;006F 0323;;;;N;;;1ECC;;1ECC
+1ECE;LATIN CAPITAL LETTER O WITH HOOK ABOVE;Lu;0;L;004F 0309;;;;N;;;;1ECF;
+1ECF;LATIN SMALL LETTER O WITH HOOK ABOVE;Ll;0;L;006F 0309;;;;N;;;1ECE;;1ECE
+1ED0;LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE;Lu;0;L;00D4 0301;;;;N;;;;1ED1;
+1ED1;LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE;Ll;0;L;00F4 0301;;;;N;;;1ED0;;1ED0
+1ED2;LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE;Lu;0;L;00D4 0300;;;;N;;;;1ED3;
+1ED3;LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE;Ll;0;L;00F4 0300;;;;N;;;1ED2;;1ED2
+1ED4;LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE;Lu;0;L;00D4 0309;;;;N;;;;1ED5;
+1ED5;LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE;Ll;0;L;00F4 0309;;;;N;;;1ED4;;1ED4
+1ED6;LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE;Lu;0;L;00D4 0303;;;;N;;;;1ED7;
+1ED7;LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE;Ll;0;L;00F4 0303;;;;N;;;1ED6;;1ED6
+1ED8;LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW;Lu;0;L;1ECC 0302;;;;N;;;;1ED9;
+1ED9;LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW;Ll;0;L;1ECD 0302;;;;N;;;1ED8;;1ED8
+1EDA;LATIN CAPITAL LETTER O WITH HORN AND ACUTE;Lu;0;L;01A0 0301;;;;N;;;;1EDB;
+1EDB;LATIN SMALL LETTER O WITH HORN AND ACUTE;Ll;0;L;01A1 0301;;;;N;;;1EDA;;1EDA
+1EDC;LATIN CAPITAL LETTER O WITH HORN AND GRAVE;Lu;0;L;01A0 0300;;;;N;;;;1EDD;
+1EDD;LATIN SMALL LETTER O WITH HORN AND GRAVE;Ll;0;L;01A1 0300;;;;N;;;1EDC;;1EDC
+1EDE;LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE;Lu;0;L;01A0 0309;;;;N;;;;1EDF;
+1EDF;LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE;Ll;0;L;01A1 0309;;;;N;;;1EDE;;1EDE
+1EE0;LATIN CAPITAL LETTER O WITH HORN AND TILDE;Lu;0;L;01A0 0303;;;;N;;;;1EE1;
+1EE1;LATIN SMALL LETTER O WITH HORN AND TILDE;Ll;0;L;01A1 0303;;;;N;;;1EE0;;1EE0
+1EE2;LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW;Lu;0;L;01A0 0323;;;;N;;;;1EE3;
+1EE3;LATIN SMALL LETTER O WITH HORN AND DOT BELOW;Ll;0;L;01A1 0323;;;;N;;;1EE2;;1EE2
+1EE4;LATIN CAPITAL LETTER U WITH DOT BELOW;Lu;0;L;0055 0323;;;;N;;;;1EE5;
+1EE5;LATIN SMALL LETTER U WITH DOT BELOW;Ll;0;L;0075 0323;;;;N;;;1EE4;;1EE4
+1EE6;LATIN CAPITAL LETTER U WITH HOOK ABOVE;Lu;0;L;0055 0309;;;;N;;;;1EE7;
+1EE7;LATIN SMALL LETTER U WITH HOOK ABOVE;Ll;0;L;0075 0309;;;;N;;;1EE6;;1EE6
+1EE8;LATIN CAPITAL LETTER U WITH HORN AND ACUTE;Lu;0;L;01AF 0301;;;;N;;;;1EE9;
+1EE9;LATIN SMALL LETTER U WITH HORN AND ACUTE;Ll;0;L;01B0 0301;;;;N;;;1EE8;;1EE8
+1EEA;LATIN CAPITAL LETTER U WITH HORN AND GRAVE;Lu;0;L;01AF 0300;;;;N;;;;1EEB;
+1EEB;LATIN SMALL LETTER U WITH HORN AND GRAVE;Ll;0;L;01B0 0300;;;;N;;;1EEA;;1EEA
+1EEC;LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE;Lu;0;L;01AF 0309;;;;N;;;;1EED;
+1EED;LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE;Ll;0;L;01B0 0309;;;;N;;;1EEC;;1EEC
+1EEE;LATIN CAPITAL LETTER U WITH HORN AND TILDE;Lu;0;L;01AF 0303;;;;N;;;;1EEF;
+1EEF;LATIN SMALL LETTER U WITH HORN AND TILDE;Ll;0;L;01B0 0303;;;;N;;;1EEE;;1EEE
+1EF0;LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW;Lu;0;L;01AF 0323;;;;N;;;;1EF1;
+1EF1;LATIN SMALL LETTER U WITH HORN AND DOT BELOW;Ll;0;L;01B0 0323;;;;N;;;1EF0;;1EF0
+1EF2;LATIN CAPITAL LETTER Y WITH GRAVE;Lu;0;L;0059 0300;;;;N;;;;1EF3;
+1EF3;LATIN SMALL LETTER Y WITH GRAVE;Ll;0;L;0079 0300;;;;N;;;1EF2;;1EF2
+1EF4;LATIN CAPITAL LETTER Y WITH DOT BELOW;Lu;0;L;0059 0323;;;;N;;;;1EF5;
+1EF5;LATIN SMALL LETTER Y WITH DOT BELOW;Ll;0;L;0079 0323;;;;N;;;1EF4;;1EF4
+1EF6;LATIN CAPITAL LETTER Y WITH HOOK ABOVE;Lu;0;L;0059 0309;;;;N;;;;1EF7;
+1EF7;LATIN SMALL LETTER Y WITH HOOK ABOVE;Ll;0;L;0079 0309;;;;N;;;1EF6;;1EF6
+1EF8;LATIN CAPITAL LETTER Y WITH TILDE;Lu;0;L;0059 0303;;;;N;;;;1EF9;
+1EF9;LATIN SMALL LETTER Y WITH TILDE;Ll;0;L;0079 0303;;;;N;;;1EF8;;1EF8
+1F00;GREEK SMALL LETTER ALPHA WITH PSILI;Ll;0;L;03B1 0313;;;;N;;;1F08;;1F08
+1F01;GREEK SMALL LETTER ALPHA WITH DASIA;Ll;0;L;03B1 0314;;;;N;;;1F09;;1F09
+1F02;GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA;Ll;0;L;1F00 0300;;;;N;;;1F0A;;1F0A
+1F03;GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA;Ll;0;L;1F01 0300;;;;N;;;1F0B;;1F0B
+1F04;GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA;Ll;0;L;1F00 0301;;;;N;;;1F0C;;1F0C
+1F05;GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA;Ll;0;L;1F01 0301;;;;N;;;1F0D;;1F0D
+1F06;GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI;Ll;0;L;1F00 0342;;;;N;;;1F0E;;1F0E
+1F07;GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI;Ll;0;L;1F01 0342;;;;N;;;1F0F;;1F0F
+1F08;GREEK CAPITAL LETTER ALPHA WITH PSILI;Lu;0;L;0391 0313;;;;N;;;;1F00;
+1F09;GREEK CAPITAL LETTER ALPHA WITH DASIA;Lu;0;L;0391 0314;;;;N;;;;1F01;
+1F0A;GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA;Lu;0;L;1F08 0300;;;;N;;;;1F02;
+1F0B;GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA;Lu;0;L;1F09 0300;;;;N;;;;1F03;
+1F0C;GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA;Lu;0;L;1F08 0301;;;;N;;;;1F04;
+1F0D;GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA;Lu;0;L;1F09 0301;;;;N;;;;1F05;
+1F0E;GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI;Lu;0;L;1F08 0342;;;;N;;;;1F06;
+1F0F;GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI;Lu;0;L;1F09 0342;;;;N;;;;1F07;
+1F10;GREEK SMALL LETTER EPSILON WITH PSILI;Ll;0;L;03B5 0313;;;;N;;;1F18;;1F18
+1F11;GREEK SMALL LETTER EPSILON WITH DASIA;Ll;0;L;03B5 0314;;;;N;;;1F19;;1F19
+1F12;GREEK SMALL LETTER EPSILON WITH PSILI AND VARIA;Ll;0;L;1F10 0300;;;;N;;;1F1A;;1F1A
+1F13;GREEK SMALL LETTER EPSILON WITH DASIA AND VARIA;Ll;0;L;1F11 0300;;;;N;;;1F1B;;1F1B
+1F14;GREEK SMALL LETTER EPSILON WITH PSILI AND OXIA;Ll;0;L;1F10 0301;;;;N;;;1F1C;;1F1C
+1F15;GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA;Ll;0;L;1F11 0301;;;;N;;;1F1D;;1F1D
+1F18;GREEK CAPITAL LETTER EPSILON WITH PSILI;Lu;0;L;0395 0313;;;;N;;;;1F10;
+1F19;GREEK CAPITAL LETTER EPSILON WITH DASIA;Lu;0;L;0395 0314;;;;N;;;;1F11;
+1F1A;GREEK CAPITAL LETTER EPSILON WITH PSILI AND VARIA;Lu;0;L;1F18 0300;;;;N;;;;1F12;
+1F1B;GREEK CAPITAL LETTER EPSILON WITH DASIA AND VARIA;Lu;0;L;1F19 0300;;;;N;;;;1F13;
+1F1C;GREEK CAPITAL LETTER EPSILON WITH PSILI AND OXIA;Lu;0;L;1F18 0301;;;;N;;;;1F14;
+1F1D;GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA;Lu;0;L;1F19 0301;;;;N;;;;1F15;
+1F20;GREEK SMALL LETTER ETA WITH PSILI;Ll;0;L;03B7 0313;;;;N;;;1F28;;1F28
+1F21;GREEK SMALL LETTER ETA WITH DASIA;Ll;0;L;03B7 0314;;;;N;;;1F29;;1F29
+1F22;GREEK SMALL LETTER ETA WITH PSILI AND VARIA;Ll;0;L;1F20 0300;;;;N;;;1F2A;;1F2A
+1F23;GREEK SMALL LETTER ETA WITH DASIA AND VARIA;Ll;0;L;1F21 0300;;;;N;;;1F2B;;1F2B
+1F24;GREEK SMALL LETTER ETA WITH PSILI AND OXIA;Ll;0;L;1F20 0301;;;;N;;;1F2C;;1F2C
+1F25;GREEK SMALL LETTER ETA WITH DASIA AND OXIA;Ll;0;L;1F21 0301;;;;N;;;1F2D;;1F2D
+1F26;GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI;Ll;0;L;1F20 0342;;;;N;;;1F2E;;1F2E
+1F27;GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI;Ll;0;L;1F21 0342;;;;N;;;1F2F;;1F2F
+1F28;GREEK CAPITAL LETTER ETA WITH PSILI;Lu;0;L;0397 0313;;;;N;;;;1F20;
+1F29;GREEK CAPITAL LETTER ETA WITH DASIA;Lu;0;L;0397 0314;;;;N;;;;1F21;
+1F2A;GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA;Lu;0;L;1F28 0300;;;;N;;;;1F22;
+1F2B;GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA;Lu;0;L;1F29 0300;;;;N;;;;1F23;
+1F2C;GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA;Lu;0;L;1F28 0301;;;;N;;;;1F24;
+1F2D;GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA;Lu;0;L;1F29 0301;;;;N;;;;1F25;
+1F2E;GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI;Lu;0;L;1F28 0342;;;;N;;;;1F26;
+1F2F;GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI;Lu;0;L;1F29 0342;;;;N;;;;1F27;
+1F30;GREEK SMALL LETTER IOTA WITH PSILI;Ll;0;L;03B9 0313;;;;N;;;1F38;;1F38
+1F31;GREEK SMALL LETTER IOTA WITH DASIA;Ll;0;L;03B9 0314;;;;N;;;1F39;;1F39
+1F32;GREEK SMALL LETTER IOTA WITH PSILI AND VARIA;Ll;0;L;1F30 0300;;;;N;;;1F3A;;1F3A
+1F33;GREEK SMALL LETTER IOTA WITH DASIA AND VARIA;Ll;0;L;1F31 0300;;;;N;;;1F3B;;1F3B
+1F34;GREEK SMALL LETTER IOTA WITH PSILI AND OXIA;Ll;0;L;1F30 0301;;;;N;;;1F3C;;1F3C
+1F35;GREEK SMALL LETTER IOTA WITH DASIA AND OXIA;Ll;0;L;1F31 0301;;;;N;;;1F3D;;1F3D
+1F36;GREEK SMALL LETTER IOTA WITH PSILI AND PERISPOMENI;Ll;0;L;1F30 0342;;;;N;;;1F3E;;1F3E
+1F37;GREEK SMALL LETTER IOTA WITH DASIA AND PERISPOMENI;Ll;0;L;1F31 0342;;;;N;;;1F3F;;1F3F
+1F38;GREEK CAPITAL LETTER IOTA WITH PSILI;Lu;0;L;0399 0313;;;;N;;;;1F30;
+1F39;GREEK CAPITAL LETTER IOTA WITH DASIA;Lu;0;L;0399 0314;;;;N;;;;1F31;
+1F3A;GREEK CAPITAL LETTER IOTA WITH PSILI AND VARIA;Lu;0;L;1F38 0300;;;;N;;;;1F32;
+1F3B;GREEK CAPITAL LETTER IOTA WITH DASIA AND VARIA;Lu;0;L;1F39 0300;;;;N;;;;1F33;
+1F3C;GREEK CAPITAL LETTER IOTA WITH PSILI AND OXIA;Lu;0;L;1F38 0301;;;;N;;;;1F34;
+1F3D;GREEK CAPITAL LETTER IOTA WITH DASIA AND OXIA;Lu;0;L;1F39 0301;;;;N;;;;1F35;
+1F3E;GREEK CAPITAL LETTER IOTA WITH PSILI AND PERISPOMENI;Lu;0;L;1F38 0342;;;;N;;;;1F36;
+1F3F;GREEK CAPITAL LETTER IOTA WITH DASIA AND PERISPOMENI;Lu;0;L;1F39 0342;;;;N;;;;1F37;
+1F40;GREEK SMALL LETTER OMICRON WITH PSILI;Ll;0;L;03BF 0313;;;;N;;;1F48;;1F48
+1F41;GREEK SMALL LETTER OMICRON WITH DASIA;Ll;0;L;03BF 0314;;;;N;;;1F49;;1F49
+1F42;GREEK SMALL LETTER OMICRON WITH PSILI AND VARIA;Ll;0;L;1F40 0300;;;;N;;;1F4A;;1F4A
+1F43;GREEK SMALL LETTER OMICRON WITH DASIA AND VARIA;Ll;0;L;1F41 0300;;;;N;;;1F4B;;1F4B
+1F44;GREEK SMALL LETTER OMICRON WITH PSILI AND OXIA;Ll;0;L;1F40 0301;;;;N;;;1F4C;;1F4C
+1F45;GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA;Ll;0;L;1F41 0301;;;;N;;;1F4D;;1F4D
+1F48;GREEK CAPITAL LETTER OMICRON WITH PSILI;Lu;0;L;039F 0313;;;;N;;;;1F40;
+1F49;GREEK CAPITAL LETTER OMICRON WITH DASIA;Lu;0;L;039F 0314;;;;N;;;;1F41;
+1F4A;GREEK CAPITAL LETTER OMICRON WITH PSILI AND VARIA;Lu;0;L;1F48 0300;;;;N;;;;1F42;
+1F4B;GREEK CAPITAL LETTER OMICRON WITH DASIA AND VARIA;Lu;0;L;1F49 0300;;;;N;;;;1F43;
+1F4C;GREEK CAPITAL LETTER OMICRON WITH PSILI AND OXIA;Lu;0;L;1F48 0301;;;;N;;;;1F44;
+1F4D;GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA;Lu;0;L;1F49 0301;;;;N;;;;1F45;
+1F50;GREEK SMALL LETTER UPSILON WITH PSILI;Ll;0;L;03C5 0313;;;;N;;;;;
+1F51;GREEK SMALL LETTER UPSILON WITH DASIA;Ll;0;L;03C5 0314;;;;N;;;1F59;;1F59
+1F52;GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA;Ll;0;L;1F50 0300;;;;N;;;;;
+1F53;GREEK SMALL LETTER UPSILON WITH DASIA AND VARIA;Ll;0;L;1F51 0300;;;;N;;;1F5B;;1F5B
+1F54;GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA;Ll;0;L;1F50 0301;;;;N;;;;;
+1F55;GREEK SMALL LETTER UPSILON WITH DASIA AND OXIA;Ll;0;L;1F51 0301;;;;N;;;1F5D;;1F5D
+1F56;GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI;Ll;0;L;1F50 0342;;;;N;;;;;
+1F57;GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI;Ll;0;L;1F51 0342;;;;N;;;1F5F;;1F5F
+1F59;GREEK CAPITAL LETTER UPSILON WITH DASIA;Lu;0;L;03A5 0314;;;;N;;;;1F51;
+1F5B;GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA;Lu;0;L;1F59 0300;;;;N;;;;1F53;
+1F5D;GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA;Lu;0;L;1F59 0301;;;;N;;;;1F55;
+1F5F;GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI;Lu;0;L;1F59 0342;;;;N;;;;1F57;
+1F60;GREEK SMALL LETTER OMEGA WITH PSILI;Ll;0;L;03C9 0313;;;;N;;;1F68;;1F68
+1F61;GREEK SMALL LETTER OMEGA WITH DASIA;Ll;0;L;03C9 0314;;;;N;;;1F69;;1F69
+1F62;GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA;Ll;0;L;1F60 0300;;;;N;;;1F6A;;1F6A
+1F63;GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA;Ll;0;L;1F61 0300;;;;N;;;1F6B;;1F6B
+1F64;GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA;Ll;0;L;1F60 0301;;;;N;;;1F6C;;1F6C
+1F65;GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA;Ll;0;L;1F61 0301;;;;N;;;1F6D;;1F6D
+1F66;GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI;Ll;0;L;1F60 0342;;;;N;;;1F6E;;1F6E
+1F67;GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI;Ll;0;L;1F61 0342;;;;N;;;1F6F;;1F6F
+1F68;GREEK CAPITAL LETTER OMEGA WITH PSILI;Lu;0;L;03A9 0313;;;;N;;;;1F60;
+1F69;GREEK CAPITAL LETTER OMEGA WITH DASIA;Lu;0;L;03A9 0314;;;;N;;;;1F61;
+1F6A;GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA;Lu;0;L;1F68 0300;;;;N;;;;1F62;
+1F6B;GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA;Lu;0;L;1F69 0300;;;;N;;;;1F63;
+1F6C;GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA;Lu;0;L;1F68 0301;;;;N;;;;1F64;
+1F6D;GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA;Lu;0;L;1F69 0301;;;;N;;;;1F65;
+1F6E;GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI;Lu;0;L;1F68 0342;;;;N;;;;1F66;
+1F6F;GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI;Lu;0;L;1F69 0342;;;;N;;;;1F67;
+1F70;GREEK SMALL LETTER ALPHA WITH VARIA;Ll;0;L;03B1 0300;;;;N;;;1FBA;;1FBA
+1F71;GREEK SMALL LETTER ALPHA WITH OXIA;Ll;0;L;03AC;;;;N;;;1FBB;;1FBB
+1F72;GREEK SMALL LETTER EPSILON WITH VARIA;Ll;0;L;03B5 0300;;;;N;;;1FC8;;1FC8
+1F73;GREEK SMALL LETTER EPSILON WITH OXIA;Ll;0;L;03AD;;;;N;;;1FC9;;1FC9
+1F74;GREEK SMALL LETTER ETA WITH VARIA;Ll;0;L;03B7 0300;;;;N;;;1FCA;;1FCA
+1F75;GREEK SMALL LETTER ETA WITH OXIA;Ll;0;L;03AE;;;;N;;;1FCB;;1FCB
+1F76;GREEK SMALL LETTER IOTA WITH VARIA;Ll;0;L;03B9 0300;;;;N;;;1FDA;;1FDA
+1F77;GREEK SMALL LETTER IOTA WITH OXIA;Ll;0;L;03AF;;;;N;;;1FDB;;1FDB
+1F78;GREEK SMALL LETTER OMICRON WITH VARIA;Ll;0;L;03BF 0300;;;;N;;;1FF8;;1FF8
+1F79;GREEK SMALL LETTER OMICRON WITH OXIA;Ll;0;L;03CC;;;;N;;;1FF9;;1FF9
+1F7A;GREEK SMALL LETTER UPSILON WITH VARIA;Ll;0;L;03C5 0300;;;;N;;;1FEA;;1FEA
+1F7B;GREEK SMALL LETTER UPSILON WITH OXIA;Ll;0;L;03CD;;;;N;;;1FEB;;1FEB
+1F7C;GREEK SMALL LETTER OMEGA WITH VARIA;Ll;0;L;03C9 0300;;;;N;;;1FFA;;1FFA
+1F7D;GREEK SMALL LETTER OMEGA WITH OXIA;Ll;0;L;03CE;;;;N;;;1FFB;;1FFB
+1F80;GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI;Ll;0;L;1F00 0345;;;;N;;;1F88;;1F88
+1F81;GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI;Ll;0;L;1F01 0345;;;;N;;;1F89;;1F89
+1F82;GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI;Ll;0;L;1F02 0345;;;;N;;;1F8A;;1F8A
+1F83;GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI;Ll;0;L;1F03 0345;;;;N;;;1F8B;;1F8B
+1F84;GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI;Ll;0;L;1F04 0345;;;;N;;;1F8C;;1F8C
+1F85;GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI;Ll;0;L;1F05 0345;;;;N;;;1F8D;;1F8D
+1F86;GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1F06 0345;;;;N;;;1F8E;;1F8E
+1F87;GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1F07 0345;;;;N;;;1F8F;;1F8F
+1F88;GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI;Lt;0;L;1F08 0345;;;;N;;;;1F80;
+1F89;GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI;Lt;0;L;1F09 0345;;;;N;;;;1F81;
+1F8A;GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI;Lt;0;L;1F0A 0345;;;;N;;;;1F82;
+1F8B;GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI;Lt;0;L;1F0B 0345;;;;N;;;;1F83;
+1F8C;GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI;Lt;0;L;1F0C 0345;;;;N;;;;1F84;
+1F8D;GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI;Lt;0;L;1F0D 0345;;;;N;;;;1F85;
+1F8E;GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI;Lt;0;L;1F0E 0345;;;;N;;;;1F86;
+1F8F;GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI;Lt;0;L;1F0F 0345;;;;N;;;;1F87;
+1F90;GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI;Ll;0;L;1F20 0345;;;;N;;;1F98;;1F98
+1F91;GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI;Ll;0;L;1F21 0345;;;;N;;;1F99;;1F99
+1F92;GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI;Ll;0;L;1F22 0345;;;;N;;;1F9A;;1F9A
+1F93;GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI;Ll;0;L;1F23 0345;;;;N;;;1F9B;;1F9B
+1F94;GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI;Ll;0;L;1F24 0345;;;;N;;;1F9C;;1F9C
+1F95;GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI;Ll;0;L;1F25 0345;;;;N;;;1F9D;;1F9D
+1F96;GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1F26 0345;;;;N;;;1F9E;;1F9E
+1F97;GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1F27 0345;;;;N;;;1F9F;;1F9F
+1F98;GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI;Lt;0;L;1F28 0345;;;;N;;;;1F90;
+1F99;GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI;Lt;0;L;1F29 0345;;;;N;;;;1F91;
+1F9A;GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI;Lt;0;L;1F2A 0345;;;;N;;;;1F92;
+1F9B;GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI;Lt;0;L;1F2B 0345;;;;N;;;;1F93;
+1F9C;GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI;Lt;0;L;1F2C 0345;;;;N;;;;1F94;
+1F9D;GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI;Lt;0;L;1F2D 0345;;;;N;;;;1F95;
+1F9E;GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI;Lt;0;L;1F2E 0345;;;;N;;;;1F96;
+1F9F;GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI;Lt;0;L;1F2F 0345;;;;N;;;;1F97;
+1FA0;GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI;Ll;0;L;1F60 0345;;;;N;;;1FA8;;1FA8
+1FA1;GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI;Ll;0;L;1F61 0345;;;;N;;;1FA9;;1FA9
+1FA2;GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI;Ll;0;L;1F62 0345;;;;N;;;1FAA;;1FAA
+1FA3;GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI;Ll;0;L;1F63 0345;;;;N;;;1FAB;;1FAB
+1FA4;GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI;Ll;0;L;1F64 0345;;;;N;;;1FAC;;1FAC
+1FA5;GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI;Ll;0;L;1F65 0345;;;;N;;;1FAD;;1FAD
+1FA6;GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1F66 0345;;;;N;;;1FAE;;1FAE
+1FA7;GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1F67 0345;;;;N;;;1FAF;;1FAF
+1FA8;GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI;Lt;0;L;1F68 0345;;;;N;;;;1FA0;
+1FA9;GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI;Lt;0;L;1F69 0345;;;;N;;;;1FA1;
+1FAA;GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI;Lt;0;L;1F6A 0345;;;;N;;;;1FA2;
+1FAB;GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI;Lt;0;L;1F6B 0345;;;;N;;;;1FA3;
+1FAC;GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI;Lt;0;L;1F6C 0345;;;;N;;;;1FA4;
+1FAD;GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI;Lt;0;L;1F6D 0345;;;;N;;;;1FA5;
+1FAE;GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI;Lt;0;L;1F6E 0345;;;;N;;;;1FA6;
+1FAF;GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI;Lt;0;L;1F6F 0345;;;;N;;;;1FA7;
+1FB0;GREEK SMALL LETTER ALPHA WITH VRACHY;Ll;0;L;03B1 0306;;;;N;;;1FB8;;1FB8
+1FB1;GREEK SMALL LETTER ALPHA WITH MACRON;Ll;0;L;03B1 0304;;;;N;;;1FB9;;1FB9
+1FB2;GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI;Ll;0;L;1F70 0345;;;;N;;;;;
+1FB3;GREEK SMALL LETTER ALPHA WITH YPOGEGRAMMENI;Ll;0;L;03B1 0345;;;;N;;;1FBC;;1FBC
+1FB4;GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI;Ll;0;L;03AC 0345;;;;N;;;;;
+1FB6;GREEK SMALL LETTER ALPHA WITH PERISPOMENI;Ll;0;L;03B1 0342;;;;N;;;;;
+1FB7;GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1FB6 0345;;;;N;;;;;
+1FB8;GREEK CAPITAL LETTER ALPHA WITH VRACHY;Lu;0;L;0391 0306;;;;N;;;;1FB0;
+1FB9;GREEK CAPITAL LETTER ALPHA WITH MACRON;Lu;0;L;0391 0304;;;;N;;;;1FB1;
+1FBA;GREEK CAPITAL LETTER ALPHA WITH VARIA;Lu;0;L;0391 0300;;;;N;;;;1F70;
+1FBB;GREEK CAPITAL LETTER ALPHA WITH OXIA;Lu;0;L;0386;;;;N;;;;1F71;
+1FBC;GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI;Lt;0;L;0391 0345;;;;N;;;;1FB3;
+1FBD;GREEK KORONIS;Sk;0;ON;<compat> 0020 0313;;;;N;;;;;
+1FBE;GREEK PROSGEGRAMMENI;Ll;0;L;03B9;;;;N;;;0399;;0399
+1FBF;GREEK PSILI;Sk;0;ON;<compat> 0020 0313;;;;N;;;;;
+1FC0;GREEK PERISPOMENI;Sk;0;ON;<compat> 0020 0342;;;;N;;;;;
+1FC1;GREEK DIALYTIKA AND PERISPOMENI;Sk;0;ON;00A8 0342;;;;N;;;;;
+1FC2;GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI;Ll;0;L;1F74 0345;;;;N;;;;;
+1FC3;GREEK SMALL LETTER ETA WITH YPOGEGRAMMENI;Ll;0;L;03B7 0345;;;;N;;;1FCC;;1FCC
+1FC4;GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI;Ll;0;L;03AE 0345;;;;N;;;;;
+1FC6;GREEK SMALL LETTER ETA WITH PERISPOMENI;Ll;0;L;03B7 0342;;;;N;;;;;
+1FC7;GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1FC6 0345;;;;N;;;;;
+1FC8;GREEK CAPITAL LETTER EPSILON WITH VARIA;Lu;0;L;0395 0300;;;;N;;;;1F72;
+1FC9;GREEK CAPITAL LETTER EPSILON WITH OXIA;Lu;0;L;0388;;;;N;;;;1F73;
+1FCA;GREEK CAPITAL LETTER ETA WITH VARIA;Lu;0;L;0397 0300;;;;N;;;;1F74;
+1FCB;GREEK CAPITAL LETTER ETA WITH OXIA;Lu;0;L;0389;;;;N;;;;1F75;
+1FCC;GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI;Lt;0;L;0397 0345;;;;N;;;;1FC3;
+1FCD;GREEK PSILI AND VARIA;Sk;0;ON;1FBF 0300;;;;N;;;;;
+1FCE;GREEK PSILI AND OXIA;Sk;0;ON;1FBF 0301;;;;N;;;;;
+1FCF;GREEK PSILI AND PERISPOMENI;Sk;0;ON;1FBF 0342;;;;N;;;;;
+1FD0;GREEK SMALL LETTER IOTA WITH VRACHY;Ll;0;L;03B9 0306;;;;N;;;1FD8;;1FD8
+1FD1;GREEK SMALL LETTER IOTA WITH MACRON;Ll;0;L;03B9 0304;;;;N;;;1FD9;;1FD9
+1FD2;GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA;Ll;0;L;03CA 0300;;;;N;;;;;
+1FD3;GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA;Ll;0;L;0390;;;;N;;;;;
+1FD6;GREEK SMALL LETTER IOTA WITH PERISPOMENI;Ll;0;L;03B9 0342;;;;N;;;;;
+1FD7;GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI;Ll;0;L;03CA 0342;;;;N;;;;;
+1FD8;GREEK CAPITAL LETTER IOTA WITH VRACHY;Lu;0;L;0399 0306;;;;N;;;;1FD0;
+1FD9;GREEK CAPITAL LETTER IOTA WITH MACRON;Lu;0;L;0399 0304;;;;N;;;;1FD1;
+1FDA;GREEK CAPITAL LETTER IOTA WITH VARIA;Lu;0;L;0399 0300;;;;N;;;;1F76;
+1FDB;GREEK CAPITAL LETTER IOTA WITH OXIA;Lu;0;L;038A;;;;N;;;;1F77;
+1FDD;GREEK DASIA AND VARIA;Sk;0;ON;1FFE 0300;;;;N;;;;;
+1FDE;GREEK DASIA AND OXIA;Sk;0;ON;1FFE 0301;;;;N;;;;;
+1FDF;GREEK DASIA AND PERISPOMENI;Sk;0;ON;1FFE 0342;;;;N;;;;;
+1FE0;GREEK SMALL LETTER UPSILON WITH VRACHY;Ll;0;L;03C5 0306;;;;N;;;1FE8;;1FE8
+1FE1;GREEK SMALL LETTER UPSILON WITH MACRON;Ll;0;L;03C5 0304;;;;N;;;1FE9;;1FE9
+1FE2;GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA;Ll;0;L;03CB 0300;;;;N;;;;;
+1FE3;GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA;Ll;0;L;03B0;;;;N;;;;;
+1FE4;GREEK SMALL LETTER RHO WITH PSILI;Ll;0;L;03C1 0313;;;;N;;;;;
+1FE5;GREEK SMALL LETTER RHO WITH DASIA;Ll;0;L;03C1 0314;;;;N;;;1FEC;;1FEC
+1FE6;GREEK SMALL LETTER UPSILON WITH PERISPOMENI;Ll;0;L;03C5 0342;;;;N;;;;;
+1FE7;GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI;Ll;0;L;03CB 0342;;;;N;;;;;
+1FE8;GREEK CAPITAL LETTER UPSILON WITH VRACHY;Lu;0;L;03A5 0306;;;;N;;;;1FE0;
+1FE9;GREEK CAPITAL LETTER UPSILON WITH MACRON;Lu;0;L;03A5 0304;;;;N;;;;1FE1;
+1FEA;GREEK CAPITAL LETTER UPSILON WITH VARIA;Lu;0;L;03A5 0300;;;;N;;;;1F7A;
+1FEB;GREEK CAPITAL LETTER UPSILON WITH OXIA;Lu;0;L;038E;;;;N;;;;1F7B;
+1FEC;GREEK CAPITAL LETTER RHO WITH DASIA;Lu;0;L;03A1 0314;;;;N;;;;1FE5;
+1FED;GREEK DIALYTIKA AND VARIA;Sk;0;ON;00A8 0300;;;;N;;;;;
+1FEE;GREEK DIALYTIKA AND OXIA;Sk;0;ON;0385;;;;N;;;;;
+1FEF;GREEK VARIA;Sk;0;ON;0060;;;;N;;;;;
+1FF2;GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI;Ll;0;L;1F7C 0345;;;;N;;;;;
+1FF3;GREEK SMALL LETTER OMEGA WITH YPOGEGRAMMENI;Ll;0;L;03C9 0345;;;;N;;;1FFC;;1FFC
+1FF4;GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI;Ll;0;L;03CE 0345;;;;N;;;;;
+1FF6;GREEK SMALL LETTER OMEGA WITH PERISPOMENI;Ll;0;L;03C9 0342;;;;N;;;;;
+1FF7;GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1FF6 0345;;;;N;;;;;
+1FF8;GREEK CAPITAL LETTER OMICRON WITH VARIA;Lu;0;L;039F 0300;;;;N;;;;1F78;
+1FF9;GREEK CAPITAL LETTER OMICRON WITH OXIA;Lu;0;L;038C;;;;N;;;;1F79;
+1FFA;GREEK CAPITAL LETTER OMEGA WITH VARIA;Lu;0;L;03A9 0300;;;;N;;;;1F7C;
+1FFB;GREEK CAPITAL LETTER OMEGA WITH OXIA;Lu;0;L;038F;;;;N;;;;1F7D;
+1FFC;GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI;Lt;0;L;03A9 0345;;;;N;;;;1FF3;
+1FFD;GREEK OXIA;Sk;0;ON;00B4;;;;N;;;;;
+1FFE;GREEK DASIA;Sk;0;ON;<compat> 0020 0314;;;;N;;;;;
+2000;EN QUAD;Zs;0;WS;2002;;;;N;;;;;
+2001;EM QUAD;Zs;0;WS;2003;;;;N;;;;;
+2002;EN SPACE;Zs;0;WS;<compat> 0020;;;;N;;;;;
+2003;EM SPACE;Zs;0;WS;<compat> 0020;;;;N;;;;;
+2004;THREE-PER-EM SPACE;Zs;0;WS;<compat> 0020;;;;N;;;;;
+2005;FOUR-PER-EM SPACE;Zs;0;WS;<compat> 0020;;;;N;;;;;
+2006;SIX-PER-EM SPACE;Zs;0;WS;<compat> 0020;;;;N;;;;;
+2007;FIGURE SPACE;Zs;0;WS;<noBreak> 0020;;;;N;;;;;
+2008;PUNCTUATION SPACE;Zs;0;WS;<compat> 0020;;;;N;;;;;
+2009;THIN SPACE;Zs;0;WS;<compat> 0020;;;;N;;;;;
+200A;HAIR SPACE;Zs;0;WS;<compat> 0020;;;;N;;;;;
+200B;ZERO WIDTH SPACE;Zs;0;BN;;;;;N;;;;;
+200C;ZERO WIDTH NON-JOINER;Cf;0;BN;;;;;N;;;;;
+200D;ZERO WIDTH JOINER;Cf;0;BN;;;;;N;;;;;
+200E;LEFT-TO-RIGHT MARK;Cf;0;L;;;;;N;;;;;
+200F;RIGHT-TO-LEFT MARK;Cf;0;R;;;;;N;;;;;
+2010;HYPHEN;Pd;0;ON;;;;;N;;;;;
+2011;NON-BREAKING HYPHEN;Pd;0;ON;<noBreak> 2010;;;;N;;;;;
+2012;FIGURE DASH;Pd;0;ON;;;;;N;;;;;
+2013;EN DASH;Pd;0;ON;;;;;N;;;;;
+2014;EM DASH;Pd;0;ON;;;;;N;;;;;
+2015;HORIZONTAL BAR;Pd;0;ON;;;;;N;QUOTATION DASH;;;;
+2016;DOUBLE VERTICAL LINE;Po;0;ON;;;;;N;DOUBLE VERTICAL BAR;;;;
+2017;DOUBLE LOW LINE;Po;0;ON;<compat> 0020 0333;;;;N;SPACING DOUBLE UNDERSCORE;;;;
+2018;LEFT SINGLE QUOTATION MARK;Pi;0;ON;;;;;N;SINGLE TURNED COMMA QUOTATION MARK;;;;
+2019;RIGHT SINGLE QUOTATION MARK;Pf;0;ON;;;;;N;SINGLE COMMA QUOTATION MARK;;;;
+201A;SINGLE LOW-9 QUOTATION MARK;Ps;0;ON;;;;;N;LOW SINGLE COMMA QUOTATION MARK;;;;
+201B;SINGLE HIGH-REVERSED-9 QUOTATION MARK;Pi;0;ON;;;;;N;SINGLE REVERSED COMMA QUOTATION MARK;;;;
+201C;LEFT DOUBLE QUOTATION MARK;Pi;0;ON;;;;;N;DOUBLE TURNED COMMA QUOTATION MARK;;;;
+201D;RIGHT DOUBLE QUOTATION MARK;Pf;0;ON;;;;;N;DOUBLE COMMA QUOTATION MARK;;;;
+201E;DOUBLE LOW-9 QUOTATION MARK;Ps;0;ON;;;;;N;LOW DOUBLE COMMA QUOTATION MARK;;;;
+201F;DOUBLE HIGH-REVERSED-9 QUOTATION MARK;Pi;0;ON;;;;;N;DOUBLE REVERSED COMMA QUOTATION MARK;;;;
+2020;DAGGER;Po;0;ON;;;;;N;;;;;
+2021;DOUBLE DAGGER;Po;0;ON;;;;;N;;;;;
+2022;BULLET;Po;0;ON;;;;;N;;;;;
+2023;TRIANGULAR BULLET;Po;0;ON;;;;;N;;;;;
+2024;ONE DOT LEADER;Po;0;ON;<compat> 002E;;;;N;;;;;
+2025;TWO DOT LEADER;Po;0;ON;<compat> 002E 002E;;;;N;;;;;
+2026;HORIZONTAL ELLIPSIS;Po;0;ON;<compat> 002E 002E 002E;;;;N;;;;;
+2027;HYPHENATION POINT;Po;0;ON;;;;;N;;;;;
+2028;LINE SEPARATOR;Zl;0;WS;;;;;N;;;;;
+2029;PARAGRAPH SEPARATOR;Zp;0;B;;;;;N;;;;;
+202A;LEFT-TO-RIGHT EMBEDDING;Cf;0;LRE;;;;;N;;;;;
+202B;RIGHT-TO-LEFT EMBEDDING;Cf;0;RLE;;;;;N;;;;;
+202C;POP DIRECTIONAL FORMATTING;Cf;0;PDF;;;;;N;;;;;
+202D;LEFT-TO-RIGHT OVERRIDE;Cf;0;LRO;;;;;N;;;;;
+202E;RIGHT-TO-LEFT OVERRIDE;Cf;0;RLO;;;;;N;;;;;
+202F;NARROW NO-BREAK SPACE;Zs;0;WS;<noBreak> 0020;;;;N;;;;;
+2030;PER MILLE SIGN;Po;0;ET;;;;;N;;;;;
+2031;PER TEN THOUSAND SIGN;Po;0;ET;;;;;N;;;;;
+2032;PRIME;Po;0;ET;;;;;N;;;;;
+2033;DOUBLE PRIME;Po;0;ET;<compat> 2032 2032;;;;N;;;;;
+2034;TRIPLE PRIME;Po;0;ET;<compat> 2032 2032 2032;;;;N;;;;;
+2035;REVERSED PRIME;Po;0;ON;;;;;N;;;;;
+2036;REVERSED DOUBLE PRIME;Po;0;ON;<compat> 2035 2035;;;;N;;;;;
+2037;REVERSED TRIPLE PRIME;Po;0;ON;<compat> 2035 2035 2035;;;;N;;;;;
+2038;CARET;Po;0;ON;;;;;N;;;;;
+2039;SINGLE LEFT-POINTING ANGLE QUOTATION MARK;Pi;0;ON;;;;;Y;LEFT POINTING SINGLE GUILLEMET;;;;
+203A;SINGLE RIGHT-POINTING ANGLE QUOTATION MARK;Pf;0;ON;;;;;Y;RIGHT POINTING SINGLE GUILLEMET;;;;
+203B;REFERENCE MARK;Po;0;ON;;;;;N;;;;;
+203C;DOUBLE EXCLAMATION MARK;Po;0;ON;<compat> 0021 0021;;;;N;;;;;
+203D;INTERROBANG;Po;0;ON;;;;;N;;;;;
+203E;OVERLINE;Po;0;ON;<compat> 0020 0305;;;;N;SPACING OVERSCORE;;;;
+203F;UNDERTIE;Pc;0;ON;;;;;N;;Enotikon;;;
+2040;CHARACTER TIE;Pc;0;ON;;;;;N;;;;;
+2041;CARET INSERTION POINT;Po;0;ON;;;;;N;;;;;
+2042;ASTERISM;Po;0;ON;;;;;N;;;;;
+2043;HYPHEN BULLET;Po;0;ON;;;;;N;;;;;
+2044;FRACTION SLASH;Sm;0;ON;;;;;N;;;;;
+2045;LEFT SQUARE BRACKET WITH QUILL;Ps;0;ON;;;;;Y;;;;;
+2046;RIGHT SQUARE BRACKET WITH QUILL;Pe;0;ON;;;;;Y;;;;;
+2048;QUESTION EXCLAMATION MARK;Po;0;ON;<compat> 003F 0021;;;;N;;;;;
+2049;EXCLAMATION QUESTION MARK;Po;0;ON;<compat> 0021 003F;;;;N;;;;;
+204A;TIRONIAN SIGN ET;Po;0;ON;;;;;N;;;;;
+204B;REVERSED PILCROW SIGN;Po;0;ON;;;;;N;;;;;
+204C;BLACK LEFTWARDS BULLET;Po;0;ON;;;;;N;;;;;
+204D;BLACK RIGHTWARDS BULLET;Po;0;ON;;;;;N;;;;;
+206A;INHIBIT SYMMETRIC SWAPPING;Cf;0;BN;;;;;N;;;;;
+206B;ACTIVATE SYMMETRIC SWAPPING;Cf;0;BN;;;;;N;;;;;
+206C;INHIBIT ARABIC FORM SHAPING;Cf;0;BN;;;;;N;;;;;
+206D;ACTIVATE ARABIC FORM SHAPING;Cf;0;BN;;;;;N;;;;;
+206E;NATIONAL DIGIT SHAPES;Cf;0;BN;;;;;N;;;;;
+206F;NOMINAL DIGIT SHAPES;Cf;0;BN;;;;;N;;;;;
+2070;SUPERSCRIPT ZERO;No;0;EN;<super> 0030;0;0;0;N;SUPERSCRIPT DIGIT ZERO;;;;
+2074;SUPERSCRIPT FOUR;No;0;EN;<super> 0034;4;4;4;N;SUPERSCRIPT DIGIT FOUR;;;;
+2075;SUPERSCRIPT FIVE;No;0;EN;<super> 0035;5;5;5;N;SUPERSCRIPT DIGIT FIVE;;;;
+2076;SUPERSCRIPT SIX;No;0;EN;<super> 0036;6;6;6;N;SUPERSCRIPT DIGIT SIX;;;;
+2077;SUPERSCRIPT SEVEN;No;0;EN;<super> 0037;7;7;7;N;SUPERSCRIPT DIGIT SEVEN;;;;
+2078;SUPERSCRIPT EIGHT;No;0;EN;<super> 0038;8;8;8;N;SUPERSCRIPT DIGIT EIGHT;;;;
+2079;SUPERSCRIPT NINE;No;0;EN;<super> 0039;9;9;9;N;SUPERSCRIPT DIGIT NINE;;;;
+207A;SUPERSCRIPT PLUS SIGN;Sm;0;ET;<super> 002B;;;;N;;;;;
+207B;SUPERSCRIPT MINUS;Sm;0;ET;<super> 2212;;;;N;SUPERSCRIPT HYPHEN-MINUS;;;;
+207C;SUPERSCRIPT EQUALS SIGN;Sm;0;ON;<super> 003D;;;;N;;;;;
+207D;SUPERSCRIPT LEFT PARENTHESIS;Ps;0;ON;<super> 0028;;;;Y;SUPERSCRIPT OPENING PARENTHESIS;;;;
+207E;SUPERSCRIPT RIGHT PARENTHESIS;Pe;0;ON;<super> 0029;;;;Y;SUPERSCRIPT CLOSING PARENTHESIS;;;;
+207F;SUPERSCRIPT LATIN SMALL LETTER N;Ll;0;L;<super> 006E;;;;N;;;;;
+2080;SUBSCRIPT ZERO;No;0;EN;<sub> 0030;0;0;0;N;SUBSCRIPT DIGIT ZERO;;;;
+2081;SUBSCRIPT ONE;No;0;EN;<sub> 0031;1;1;1;N;SUBSCRIPT DIGIT ONE;;;;
+2082;SUBSCRIPT TWO;No;0;EN;<sub> 0032;2;2;2;N;SUBSCRIPT DIGIT TWO;;;;
+2083;SUBSCRIPT THREE;No;0;EN;<sub> 0033;3;3;3;N;SUBSCRIPT DIGIT THREE;;;;
+2084;SUBSCRIPT FOUR;No;0;EN;<sub> 0034;4;4;4;N;SUBSCRIPT DIGIT FOUR;;;;
+2085;SUBSCRIPT FIVE;No;0;EN;<sub> 0035;5;5;5;N;SUBSCRIPT DIGIT FIVE;;;;
+2086;SUBSCRIPT SIX;No;0;EN;<sub> 0036;6;6;6;N;SUBSCRIPT DIGIT SIX;;;;
+2087;SUBSCRIPT SEVEN;No;0;EN;<sub> 0037;7;7;7;N;SUBSCRIPT DIGIT SEVEN;;;;
+2088;SUBSCRIPT EIGHT;No;0;EN;<sub> 0038;8;8;8;N;SUBSCRIPT DIGIT EIGHT;;;;
+2089;SUBSCRIPT NINE;No;0;EN;<sub> 0039;9;9;9;N;SUBSCRIPT DIGIT NINE;;;;
+208A;SUBSCRIPT PLUS SIGN;Sm;0;ET;<sub> 002B;;;;N;;;;;
+208B;SUBSCRIPT MINUS;Sm;0;ET;<sub> 2212;;;;N;SUBSCRIPT HYPHEN-MINUS;;;;
+208C;SUBSCRIPT EQUALS SIGN;Sm;0;ON;<sub> 003D;;;;N;;;;;
+208D;SUBSCRIPT LEFT PARENTHESIS;Ps;0;ON;<sub> 0028;;;;Y;SUBSCRIPT OPENING PARENTHESIS;;;;
+208E;SUBSCRIPT RIGHT PARENTHESIS;Pe;0;ON;<sub> 0029;;;;Y;SUBSCRIPT CLOSING PARENTHESIS;;;;
+20A0;EURO-CURRENCY SIGN;Sc;0;ET;;;;;N;;;;;
+20A1;COLON SIGN;Sc;0;ET;;;;;N;;;;;
+20A2;CRUZEIRO SIGN;Sc;0;ET;;;;;N;;;;;
+20A3;FRENCH FRANC SIGN;Sc;0;ET;;;;;N;;;;;
+20A4;LIRA SIGN;Sc;0;ET;;;;;N;;;;;
+20A5;MILL SIGN;Sc;0;ET;;;;;N;;;;;
+20A6;NAIRA SIGN;Sc;0;ET;;;;;N;;;;;
+20A7;PESETA SIGN;Sc;0;ET;;;;;N;;;;;
+20A8;RUPEE SIGN;Sc;0;ET;<compat> 0052 0073;;;;N;;;;;
+20A9;WON SIGN;Sc;0;ET;;;;;N;;;;;
+20AA;NEW SHEQEL SIGN;Sc;0;ET;;;;;N;;;;;
+20AB;DONG SIGN;Sc;0;ET;;;;;N;;;;;
+20AC;EURO SIGN;Sc;0;ET;;;;;N;;;;;
+20AD;KIP SIGN;Sc;0;ET;;;;;N;;;;;
+20AE;TUGRIK SIGN;Sc;0;ET;;;;;N;;;;;
+20AF;DRACHMA SIGN;Sc;0;ET;;;;;N;;;;;
+20D0;COMBINING LEFT HARPOON ABOVE;Mn;230;NSM;;;;;N;NON-SPACING LEFT HARPOON ABOVE;;;;
+20D1;COMBINING RIGHT HARPOON ABOVE;Mn;230;NSM;;;;;N;NON-SPACING RIGHT HARPOON ABOVE;;;;
+20D2;COMBINING LONG VERTICAL LINE OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING LONG VERTICAL BAR OVERLAY;;;;
+20D3;COMBINING SHORT VERTICAL LINE OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING SHORT VERTICAL BAR OVERLAY;;;;
+20D4;COMBINING ANTICLOCKWISE ARROW ABOVE;Mn;230;NSM;;;;;N;NON-SPACING ANTICLOCKWISE ARROW ABOVE;;;;
+20D5;COMBINING CLOCKWISE ARROW ABOVE;Mn;230;NSM;;;;;N;NON-SPACING CLOCKWISE ARROW ABOVE;;;;
+20D6;COMBINING LEFT ARROW ABOVE;Mn;230;NSM;;;;;N;NON-SPACING LEFT ARROW ABOVE;;;;
+20D7;COMBINING RIGHT ARROW ABOVE;Mn;230;NSM;;;;;N;NON-SPACING RIGHT ARROW ABOVE;;;;
+20D8;COMBINING RING OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING RING OVERLAY;;;;
+20D9;COMBINING CLOCKWISE RING OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING CLOCKWISE RING OVERLAY;;;;
+20DA;COMBINING ANTICLOCKWISE RING OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING ANTICLOCKWISE RING OVERLAY;;;;
+20DB;COMBINING THREE DOTS ABOVE;Mn;230;NSM;;;;;N;NON-SPACING THREE DOTS ABOVE;;;;
+20DC;COMBINING FOUR DOTS ABOVE;Mn;230;NSM;;;;;N;NON-SPACING FOUR DOTS ABOVE;;;;
+20DD;COMBINING ENCLOSING CIRCLE;Me;0;NSM;;;;;N;ENCLOSING CIRCLE;;;;
+20DE;COMBINING ENCLOSING SQUARE;Me;0;NSM;;;;;N;ENCLOSING SQUARE;;;;
+20DF;COMBINING ENCLOSING DIAMOND;Me;0;NSM;;;;;N;ENCLOSING DIAMOND;;;;
+20E0;COMBINING ENCLOSING CIRCLE BACKSLASH;Me;0;NSM;;;;;N;ENCLOSING CIRCLE SLASH;;;;
+20E1;COMBINING LEFT RIGHT ARROW ABOVE;Mn;230;NSM;;;;;N;NON-SPACING LEFT RIGHT ARROW ABOVE;;;;
+20E2;COMBINING ENCLOSING SCREEN;Me;0;NSM;;;;;N;;;;;
+20E3;COMBINING ENCLOSING KEYCAP;Me;0;NSM;;;;;N;;;;;
+2100;ACCOUNT OF;So;0;ON;<compat> 0061 002F 0063;;;;N;;;;;
+2101;ADDRESSED TO THE SUBJECT;So;0;ON;<compat> 0061 002F 0073;;;;N;;;;;
+2102;DOUBLE-STRUCK CAPITAL C;Lu;0;L;<font> 0043;;;;N;DOUBLE-STRUCK C;;;;
+2103;DEGREE CELSIUS;So;0;ON;<compat> 00B0 0043;;;;N;DEGREES CENTIGRADE;;;;
+2104;CENTRE LINE SYMBOL;So;0;ON;;;;;N;C L SYMBOL;;;;
+2105;CARE OF;So;0;ON;<compat> 0063 002F 006F;;;;N;;;;;
+2106;CADA UNA;So;0;ON;<compat> 0063 002F 0075;;;;N;;;;;
+2107;EULER CONSTANT;Lu;0;L;<compat> 0190;;;;N;EULERS;;;;
+2108;SCRUPLE;So;0;ON;;;;;N;;;;;
+2109;DEGREE FAHRENHEIT;So;0;ON;<compat> 00B0 0046;;;;N;DEGREES FAHRENHEIT;;;;
+210A;SCRIPT SMALL G;Ll;0;L;<font> 0067;;;;N;;;;;
+210B;SCRIPT CAPITAL H;Lu;0;L;<font> 0048;;;;N;SCRIPT H;;;;
+210C;BLACK-LETTER CAPITAL H;Lu;0;L;<font> 0048;;;;N;BLACK-LETTER H;;;;
+210D;DOUBLE-STRUCK CAPITAL H;Lu;0;L;<font> 0048;;;;N;DOUBLE-STRUCK H;;;;
+210E;PLANCK CONSTANT;Ll;0;L;<font> 0068;;;;N;;;;;
+210F;PLANCK CONSTANT OVER TWO PI;Ll;0;L;<font> 0127;;;;N;PLANCK CONSTANT OVER 2 PI;;;;
+2110;SCRIPT CAPITAL I;Lu;0;L;<font> 0049;;;;N;SCRIPT I;;;;
+2111;BLACK-LETTER CAPITAL I;Lu;0;L;<font> 0049;;;;N;BLACK-LETTER I;;;;
+2112;SCRIPT CAPITAL L;Lu;0;L;<font> 004C;;;;N;SCRIPT L;;;;
+2113;SCRIPT SMALL L;Ll;0;L;<font> 006C;;;;N;;;;;
+2114;L B BAR SYMBOL;So;0;ON;;;;;N;;;;;
+2115;DOUBLE-STRUCK CAPITAL N;Lu;0;L;<font> 004E;;;;N;DOUBLE-STRUCK N;;;;
+2116;NUMERO SIGN;So;0;ON;<compat> 004E 006F;;;;N;NUMERO;;;;
+2117;SOUND RECORDING COPYRIGHT;So;0;ON;;;;;N;;;;;
+2118;SCRIPT CAPITAL P;So;0;ON;;;;;N;SCRIPT P;;;;
+2119;DOUBLE-STRUCK CAPITAL P;Lu;0;L;<font> 0050;;;;N;DOUBLE-STRUCK P;;;;
+211A;DOUBLE-STRUCK CAPITAL Q;Lu;0;L;<font> 0051;;;;N;DOUBLE-STRUCK Q;;;;
+211B;SCRIPT CAPITAL R;Lu;0;L;<font> 0052;;;;N;SCRIPT R;;;;
+211C;BLACK-LETTER CAPITAL R;Lu;0;L;<font> 0052;;;;N;BLACK-LETTER R;;;;
+211D;DOUBLE-STRUCK CAPITAL R;Lu;0;L;<font> 0052;;;;N;DOUBLE-STRUCK R;;;;
+211E;PRESCRIPTION TAKE;So;0;ON;;;;;N;;;;;
+211F;RESPONSE;So;0;ON;;;;;N;;;;;
+2120;SERVICE MARK;So;0;ON;<super> 0053 004D;;;;N;;;;;
+2121;TELEPHONE SIGN;So;0;ON;<compat> 0054 0045 004C;;;;N;T E L SYMBOL;;;;
+2122;TRADE MARK SIGN;So;0;ON;<super> 0054 004D;;;;N;TRADEMARK;;;;
+2123;VERSICLE;So;0;ON;;;;;N;;;;;
+2124;DOUBLE-STRUCK CAPITAL Z;Lu;0;L;<font> 005A;;;;N;DOUBLE-STRUCK Z;;;;
+2125;OUNCE SIGN;So;0;ON;;;;;N;OUNCE;;;;
+2126;OHM SIGN;Lu;0;L;03A9;;;;N;OHM;;;03C9;
+2127;INVERTED OHM SIGN;So;0;ON;;;;;N;MHO;;;;
+2128;BLACK-LETTER CAPITAL Z;Lu;0;L;<font> 005A;;;;N;BLACK-LETTER Z;;;;
+2129;TURNED GREEK SMALL LETTER IOTA;So;0;ON;;;;;N;;;;;
+212A;KELVIN SIGN;Lu;0;L;004B;;;;N;DEGREES KELVIN;;;006B;
+212B;ANGSTROM SIGN;Lu;0;L;00C5;;;;N;ANGSTROM UNIT;;;00E5;
+212C;SCRIPT CAPITAL B;Lu;0;L;<font> 0042;;;;N;SCRIPT B;;;;
+212D;BLACK-LETTER CAPITAL C;Lu;0;L;<font> 0043;;;;N;BLACK-LETTER C;;;;
+212E;ESTIMATED SYMBOL;So;0;ET;;;;;N;;;;;
+212F;SCRIPT SMALL E;Ll;0;L;<font> 0065;;;;N;;;;;
+2130;SCRIPT CAPITAL E;Lu;0;L;<font> 0045;;;;N;SCRIPT E;;;;
+2131;SCRIPT CAPITAL F;Lu;0;L;<font> 0046;;;;N;SCRIPT F;;;;
+2132;TURNED CAPITAL F;So;0;ON;;;;;N;TURNED F;;;;
+2133;SCRIPT CAPITAL M;Lu;0;L;<font> 004D;;;;N;SCRIPT M;;;;
+2134;SCRIPT SMALL O;Ll;0;L;<font> 006F;;;;N;;;;;
+2135;ALEF SYMBOL;Lo;0;L;<compat> 05D0;;;;N;FIRST TRANSFINITE CARDINAL;;;;
+2136;BET SYMBOL;Lo;0;L;<compat> 05D1;;;;N;SECOND TRANSFINITE CARDINAL;;;;
+2137;GIMEL SYMBOL;Lo;0;L;<compat> 05D2;;;;N;THIRD TRANSFINITE CARDINAL;;;;
+2138;DALET SYMBOL;Lo;0;L;<compat> 05D3;;;;N;FOURTH TRANSFINITE CARDINAL;;;;
+2139;INFORMATION SOURCE;Ll;0;L;<font> 0069;;;;N;;;;;
+213A;ROTATED CAPITAL Q;So;0;ON;;;;;N;;;;;
+2153;VULGAR FRACTION ONE THIRD;No;0;ON;<fraction> 0031 2044 0033;;;1/3;N;FRACTION ONE THIRD;;;;
+2154;VULGAR FRACTION TWO THIRDS;No;0;ON;<fraction> 0032 2044 0033;;;2/3;N;FRACTION TWO THIRDS;;;;
+2155;VULGAR FRACTION ONE FIFTH;No;0;ON;<fraction> 0031 2044 0035;;;1/5;N;FRACTION ONE FIFTH;;;;
+2156;VULGAR FRACTION TWO FIFTHS;No;0;ON;<fraction> 0032 2044 0035;;;2/5;N;FRACTION TWO FIFTHS;;;;
+2157;VULGAR FRACTION THREE FIFTHS;No;0;ON;<fraction> 0033 2044 0035;;;3/5;N;FRACTION THREE FIFTHS;;;;
+2158;VULGAR FRACTION FOUR FIFTHS;No;0;ON;<fraction> 0034 2044 0035;;;4/5;N;FRACTION FOUR FIFTHS;;;;
+2159;VULGAR FRACTION ONE SIXTH;No;0;ON;<fraction> 0031 2044 0036;;;1/6;N;FRACTION ONE SIXTH;;;;
+215A;VULGAR FRACTION FIVE SIXTHS;No;0;ON;<fraction> 0035 2044 0036;;;5/6;N;FRACTION FIVE SIXTHS;;;;
+215B;VULGAR FRACTION ONE EIGHTH;No;0;ON;<fraction> 0031 2044 0038;;;1/8;N;FRACTION ONE EIGHTH;;;;
+215C;VULGAR FRACTION THREE EIGHTHS;No;0;ON;<fraction> 0033 2044 0038;;;3/8;N;FRACTION THREE EIGHTHS;;;;
+215D;VULGAR FRACTION FIVE EIGHTHS;No;0;ON;<fraction> 0035 2044 0038;;;5/8;N;FRACTION FIVE EIGHTHS;;;;
+215E;VULGAR FRACTION SEVEN EIGHTHS;No;0;ON;<fraction> 0037 2044 0038;;;7/8;N;FRACTION SEVEN EIGHTHS;;;;
+215F;FRACTION NUMERATOR ONE;No;0;ON;<fraction> 0031 2044;;;1;N;;;;;
+2160;ROMAN NUMERAL ONE;Nl;0;L;<compat> 0049;;;1;N;;;;2170;
+2161;ROMAN NUMERAL TWO;Nl;0;L;<compat> 0049 0049;;;2;N;;;;2171;
+2162;ROMAN NUMERAL THREE;Nl;0;L;<compat> 0049 0049 0049;;;3;N;;;;2172;
+2163;ROMAN NUMERAL FOUR;Nl;0;L;<compat> 0049 0056;;;4;N;;;;2173;
+2164;ROMAN NUMERAL FIVE;Nl;0;L;<compat> 0056;;;5;N;;;;2174;
+2165;ROMAN NUMERAL SIX;Nl;0;L;<compat> 0056 0049;;;6;N;;;;2175;
+2166;ROMAN NUMERAL SEVEN;Nl;0;L;<compat> 0056 0049 0049;;;7;N;;;;2176;
+2167;ROMAN NUMERAL EIGHT;Nl;0;L;<compat> 0056 0049 0049 0049;;;8;N;;;;2177;
+2168;ROMAN NUMERAL NINE;Nl;0;L;<compat> 0049 0058;;;9;N;;;;2178;
+2169;ROMAN NUMERAL TEN;Nl;0;L;<compat> 0058;;;10;N;;;;2179;
+216A;ROMAN NUMERAL ELEVEN;Nl;0;L;<compat> 0058 0049;;;11;N;;;;217A;
+216B;ROMAN NUMERAL TWELVE;Nl;0;L;<compat> 0058 0049 0049;;;12;N;;;;217B;
+216C;ROMAN NUMERAL FIFTY;Nl;0;L;<compat> 004C;;;50;N;;;;217C;
+216D;ROMAN NUMERAL ONE HUNDRED;Nl;0;L;<compat> 0043;;;100;N;;;;217D;
+216E;ROMAN NUMERAL FIVE HUNDRED;Nl;0;L;<compat> 0044;;;500;N;;;;217E;
+216F;ROMAN NUMERAL ONE THOUSAND;Nl;0;L;<compat> 004D;;;1000;N;;;;217F;
+2170;SMALL ROMAN NUMERAL ONE;Nl;0;L;<compat> 0069;;;1;N;;;2160;;2160
+2171;SMALL ROMAN NUMERAL TWO;Nl;0;L;<compat> 0069 0069;;;2;N;;;2161;;2161
+2172;SMALL ROMAN NUMERAL THREE;Nl;0;L;<compat> 0069 0069 0069;;;3;N;;;2162;;2162
+2173;SMALL ROMAN NUMERAL FOUR;Nl;0;L;<compat> 0069 0076;;;4;N;;;2163;;2163
+2174;SMALL ROMAN NUMERAL FIVE;Nl;0;L;<compat> 0076;;;5;N;;;2164;;2164
+2175;SMALL ROMAN NUMERAL SIX;Nl;0;L;<compat> 0076 0069;;;6;N;;;2165;;2165
+2176;SMALL ROMAN NUMERAL SEVEN;Nl;0;L;<compat> 0076 0069 0069;;;7;N;;;2166;;2166
+2177;SMALL ROMAN NUMERAL EIGHT;Nl;0;L;<compat> 0076 0069 0069 0069;;;8;N;;;2167;;2167
+2178;SMALL ROMAN NUMERAL NINE;Nl;0;L;<compat> 0069 0078;;;9;N;;;2168;;2168
+2179;SMALL ROMAN NUMERAL TEN;Nl;0;L;<compat> 0078;;;10;N;;;2169;;2169
+217A;SMALL ROMAN NUMERAL ELEVEN;Nl;0;L;<compat> 0078 0069;;;11;N;;;216A;;216A
+217B;SMALL ROMAN NUMERAL TWELVE;Nl;0;L;<compat> 0078 0069 0069;;;12;N;;;216B;;216B
+217C;SMALL ROMAN NUMERAL FIFTY;Nl;0;L;<compat> 006C;;;50;N;;;216C;;216C
+217D;SMALL ROMAN NUMERAL ONE HUNDRED;Nl;0;L;<compat> 0063;;;100;N;;;216D;;216D
+217E;SMALL ROMAN NUMERAL FIVE HUNDRED;Nl;0;L;<compat> 0064;;;500;N;;;216E;;216E
+217F;SMALL ROMAN NUMERAL ONE THOUSAND;Nl;0;L;<compat> 006D;;;1000;N;;;216F;;216F
+2180;ROMAN NUMERAL ONE THOUSAND C D;Nl;0;L;;;;1000;N;;;;;
+2181;ROMAN NUMERAL FIVE THOUSAND;Nl;0;L;;;;5000;N;;;;;
+2182;ROMAN NUMERAL TEN THOUSAND;Nl;0;L;;;;10000;N;;;;;
+2183;ROMAN NUMERAL REVERSED ONE HUNDRED;Nl;0;L;;;;;N;;;;;
+2190;LEFTWARDS ARROW;Sm;0;ON;;;;;N;LEFT ARROW;;;;
+2191;UPWARDS ARROW;Sm;0;ON;;;;;N;UP ARROW;;;;
+2192;RIGHTWARDS ARROW;Sm;0;ON;;;;;N;RIGHT ARROW;;;;
+2193;DOWNWARDS ARROW;Sm;0;ON;;;;;N;DOWN ARROW;;;;
+2194;LEFT RIGHT ARROW;Sm;0;ON;;;;;N;;;;;
+2195;UP DOWN ARROW;So;0;ON;;;;;N;;;;;
+2196;NORTH WEST ARROW;So;0;ON;;;;;N;UPPER LEFT ARROW;;;;
+2197;NORTH EAST ARROW;So;0;ON;;;;;N;UPPER RIGHT ARROW;;;;
+2198;SOUTH EAST ARROW;So;0;ON;;;;;N;LOWER RIGHT ARROW;;;;
+2199;SOUTH WEST ARROW;So;0;ON;;;;;N;LOWER LEFT ARROW;;;;
+219A;LEFTWARDS ARROW WITH STROKE;Sm;0;ON;2190 0338;;;;N;LEFT ARROW WITH STROKE;;;;
+219B;RIGHTWARDS ARROW WITH STROKE;Sm;0;ON;2192 0338;;;;N;RIGHT ARROW WITH STROKE;;;;
+219C;LEFTWARDS WAVE ARROW;So;0;ON;;;;;N;LEFT WAVE ARROW;;;;
+219D;RIGHTWARDS WAVE ARROW;So;0;ON;;;;;N;RIGHT WAVE ARROW;;;;
+219E;LEFTWARDS TWO HEADED ARROW;So;0;ON;;;;;N;LEFT TWO HEADED ARROW;;;;
+219F;UPWARDS TWO HEADED ARROW;So;0;ON;;;;;N;UP TWO HEADED ARROW;;;;
+21A0;RIGHTWARDS TWO HEADED ARROW;Sm;0;ON;;;;;N;RIGHT TWO HEADED ARROW;;;;
+21A1;DOWNWARDS TWO HEADED ARROW;So;0;ON;;;;;N;DOWN TWO HEADED ARROW;;;;
+21A2;LEFTWARDS ARROW WITH TAIL;So;0;ON;;;;;N;LEFT ARROW WITH TAIL;;;;
+21A3;RIGHTWARDS ARROW WITH TAIL;Sm;0;ON;;;;;N;RIGHT ARROW WITH TAIL;;;;
+21A4;LEFTWARDS ARROW FROM BAR;So;0;ON;;;;;N;LEFT ARROW FROM BAR;;;;
+21A5;UPWARDS ARROW FROM BAR;So;0;ON;;;;;N;UP ARROW FROM BAR;;;;
+21A6;RIGHTWARDS ARROW FROM BAR;Sm;0;ON;;;;;N;RIGHT ARROW FROM BAR;;;;
+21A7;DOWNWARDS ARROW FROM BAR;So;0;ON;;;;;N;DOWN ARROW FROM BAR;;;;
+21A8;UP DOWN ARROW WITH BASE;So;0;ON;;;;;N;;;;;
+21A9;LEFTWARDS ARROW WITH HOOK;So;0;ON;;;;;N;LEFT ARROW WITH HOOK;;;;
+21AA;RIGHTWARDS ARROW WITH HOOK;So;0;ON;;;;;N;RIGHT ARROW WITH HOOK;;;;
+21AB;LEFTWARDS ARROW WITH LOOP;So;0;ON;;;;;N;LEFT ARROW WITH LOOP;;;;
+21AC;RIGHTWARDS ARROW WITH LOOP;So;0;ON;;;;;N;RIGHT ARROW WITH LOOP;;;;
+21AD;LEFT RIGHT WAVE ARROW;So;0;ON;;;;;N;;;;;
+21AE;LEFT RIGHT ARROW WITH STROKE;Sm;0;ON;2194 0338;;;;N;;;;;
+21AF;DOWNWARDS ZIGZAG ARROW;So;0;ON;;;;;N;DOWN ZIGZAG ARROW;;;;
+21B0;UPWARDS ARROW WITH TIP LEFTWARDS;So;0;ON;;;;;N;UP ARROW WITH TIP LEFT;;;;
+21B1;UPWARDS ARROW WITH TIP RIGHTWARDS;So;0;ON;;;;;N;UP ARROW WITH TIP RIGHT;;;;
+21B2;DOWNWARDS ARROW WITH TIP LEFTWARDS;So;0;ON;;;;;N;DOWN ARROW WITH TIP LEFT;;;;
+21B3;DOWNWARDS ARROW WITH TIP RIGHTWARDS;So;0;ON;;;;;N;DOWN ARROW WITH TIP RIGHT;;;;
+21B4;RIGHTWARDS ARROW WITH CORNER DOWNWARDS;So;0;ON;;;;;N;RIGHT ARROW WITH CORNER DOWN;;;;
+21B5;DOWNWARDS ARROW WITH CORNER LEFTWARDS;So;0;ON;;;;;N;DOWN ARROW WITH CORNER LEFT;;;;
+21B6;ANTICLOCKWISE TOP SEMICIRCLE ARROW;So;0;ON;;;;;N;;;;;
+21B7;CLOCKWISE TOP SEMICIRCLE ARROW;So;0;ON;;;;;N;;;;;
+21B8;NORTH WEST ARROW TO LONG BAR;So;0;ON;;;;;N;UPPER LEFT ARROW TO LONG BAR;;;;
+21B9;LEFTWARDS ARROW TO BAR OVER RIGHTWARDS ARROW TO BAR;So;0;ON;;;;;N;LEFT ARROW TO BAR OVER RIGHT ARROW TO BAR;;;;
+21BA;ANTICLOCKWISE OPEN CIRCLE ARROW;So;0;ON;;;;;N;;;;;
+21BB;CLOCKWISE OPEN CIRCLE ARROW;So;0;ON;;;;;N;;;;;
+21BC;LEFTWARDS HARPOON WITH BARB UPWARDS;So;0;ON;;;;;N;LEFT HARPOON WITH BARB UP;;;;
+21BD;LEFTWARDS HARPOON WITH BARB DOWNWARDS;So;0;ON;;;;;N;LEFT HARPOON WITH BARB DOWN;;;;
+21BE;UPWARDS HARPOON WITH BARB RIGHTWARDS;So;0;ON;;;;;N;UP HARPOON WITH BARB RIGHT;;;;
+21BF;UPWARDS HARPOON WITH BARB LEFTWARDS;So;0;ON;;;;;N;UP HARPOON WITH BARB LEFT;;;;
+21C0;RIGHTWARDS HARPOON WITH BARB UPWARDS;So;0;ON;;;;;N;RIGHT HARPOON WITH BARB UP;;;;
+21C1;RIGHTWARDS HARPOON WITH BARB DOWNWARDS;So;0;ON;;;;;N;RIGHT HARPOON WITH BARB DOWN;;;;
+21C2;DOWNWARDS HARPOON WITH BARB RIGHTWARDS;So;0;ON;;;;;N;DOWN HARPOON WITH BARB RIGHT;;;;
+21C3;DOWNWARDS HARPOON WITH BARB LEFTWARDS;So;0;ON;;;;;N;DOWN HARPOON WITH BARB LEFT;;;;
+21C4;RIGHTWARDS ARROW OVER LEFTWARDS ARROW;So;0;ON;;;;;N;RIGHT ARROW OVER LEFT ARROW;;;;
+21C5;UPWARDS ARROW LEFTWARDS OF DOWNWARDS ARROW;So;0;ON;;;;;N;UP ARROW LEFT OF DOWN ARROW;;;;
+21C6;LEFTWARDS ARROW OVER RIGHTWARDS ARROW;So;0;ON;;;;;N;LEFT ARROW OVER RIGHT ARROW;;;;
+21C7;LEFTWARDS PAIRED ARROWS;So;0;ON;;;;;N;LEFT PAIRED ARROWS;;;;
+21C8;UPWARDS PAIRED ARROWS;So;0;ON;;;;;N;UP PAIRED ARROWS;;;;
+21C9;RIGHTWARDS PAIRED ARROWS;So;0;ON;;;;;N;RIGHT PAIRED ARROWS;;;;
+21CA;DOWNWARDS PAIRED ARROWS;So;0;ON;;;;;N;DOWN PAIRED ARROWS;;;;
+21CB;LEFTWARDS HARPOON OVER RIGHTWARDS HARPOON;So;0;ON;;;;;N;LEFT HARPOON OVER RIGHT HARPOON;;;;
+21CC;RIGHTWARDS HARPOON OVER LEFTWARDS HARPOON;So;0;ON;;;;;N;RIGHT HARPOON OVER LEFT HARPOON;;;;
+21CD;LEFTWARDS DOUBLE ARROW WITH STROKE;So;0;ON;21D0 0338;;;;N;LEFT DOUBLE ARROW WITH STROKE;;;;
+21CE;LEFT RIGHT DOUBLE ARROW WITH STROKE;Sm;0;ON;21D4 0338;;;;N;;;;;
+21CF;RIGHTWARDS DOUBLE ARROW WITH STROKE;Sm;0;ON;21D2 0338;;;;N;RIGHT DOUBLE ARROW WITH STROKE;;;;
+21D0;LEFTWARDS DOUBLE ARROW;So;0;ON;;;;;N;LEFT DOUBLE ARROW;;;;
+21D1;UPWARDS DOUBLE ARROW;So;0;ON;;;;;N;UP DOUBLE ARROW;;;;
+21D2;RIGHTWARDS DOUBLE ARROW;Sm;0;ON;;;;;N;RIGHT DOUBLE ARROW;;;;
+21D3;DOWNWARDS DOUBLE ARROW;So;0;ON;;;;;N;DOWN DOUBLE ARROW;;;;
+21D4;LEFT RIGHT DOUBLE ARROW;Sm;0;ON;;;;;N;;;;;
+21D5;UP DOWN DOUBLE ARROW;So;0;ON;;;;;N;;;;;
+21D6;NORTH WEST DOUBLE ARROW;So;0;ON;;;;;N;UPPER LEFT DOUBLE ARROW;;;;
+21D7;NORTH EAST DOUBLE ARROW;So;0;ON;;;;;N;UPPER RIGHT DOUBLE ARROW;;;;
+21D8;SOUTH EAST DOUBLE ARROW;So;0;ON;;;;;N;LOWER RIGHT DOUBLE ARROW;;;;
+21D9;SOUTH WEST DOUBLE ARROW;So;0;ON;;;;;N;LOWER LEFT DOUBLE ARROW;;;;
+21DA;LEFTWARDS TRIPLE ARROW;So;0;ON;;;;;N;LEFT TRIPLE ARROW;;;;
+21DB;RIGHTWARDS TRIPLE ARROW;So;0;ON;;;;;N;RIGHT TRIPLE ARROW;;;;
+21DC;LEFTWARDS SQUIGGLE ARROW;So;0;ON;;;;;N;LEFT SQUIGGLE ARROW;;;;
+21DD;RIGHTWARDS SQUIGGLE ARROW;So;0;ON;;;;;N;RIGHT SQUIGGLE ARROW;;;;
+21DE;UPWARDS ARROW WITH DOUBLE STROKE;So;0;ON;;;;;N;UP ARROW WITH DOUBLE STROKE;;;;
+21DF;DOWNWARDS ARROW WITH DOUBLE STROKE;So;0;ON;;;;;N;DOWN ARROW WITH DOUBLE STROKE;;;;
+21E0;LEFTWARDS DASHED ARROW;So;0;ON;;;;;N;LEFT DASHED ARROW;;;;
+21E1;UPWARDS DASHED ARROW;So;0;ON;;;;;N;UP DASHED ARROW;;;;
+21E2;RIGHTWARDS DASHED ARROW;So;0;ON;;;;;N;RIGHT DASHED ARROW;;;;
+21E3;DOWNWARDS DASHED ARROW;So;0;ON;;;;;N;DOWN DASHED ARROW;;;;
+21E4;LEFTWARDS ARROW TO BAR;So;0;ON;;;;;N;LEFT ARROW TO BAR;;;;
+21E5;RIGHTWARDS ARROW TO BAR;So;0;ON;;;;;N;RIGHT ARROW TO BAR;;;;
+21E6;LEFTWARDS WHITE ARROW;So;0;ON;;;;;N;WHITE LEFT ARROW;;;;
+21E7;UPWARDS WHITE ARROW;So;0;ON;;;;;N;WHITE UP ARROW;;;;
+21E8;RIGHTWARDS WHITE ARROW;So;0;ON;;;;;N;WHITE RIGHT ARROW;;;;
+21E9;DOWNWARDS WHITE ARROW;So;0;ON;;;;;N;WHITE DOWN ARROW;;;;
+21EA;UPWARDS WHITE ARROW FROM BAR;So;0;ON;;;;;N;WHITE UP ARROW FROM BAR;;;;
+21EB;UPWARDS WHITE ARROW ON PEDESTAL;So;0;ON;;;;;N;;;;;
+21EC;UPWARDS WHITE ARROW ON PEDESTAL WITH HORIZONTAL BAR;So;0;ON;;;;;N;;;;;
+21ED;UPWARDS WHITE ARROW ON PEDESTAL WITH VERTICAL BAR;So;0;ON;;;;;N;;;;;
+21EE;UPWARDS WHITE DOUBLE ARROW;So;0;ON;;;;;N;;;;;
+21EF;UPWARDS WHITE DOUBLE ARROW ON PEDESTAL;So;0;ON;;;;;N;;;;;
+21F0;RIGHTWARDS WHITE ARROW FROM WALL;So;0;ON;;;;;N;;;;;
+21F1;NORTH WEST ARROW TO CORNER;So;0;ON;;;;;N;;;;;
+21F2;SOUTH EAST ARROW TO CORNER;So;0;ON;;;;;N;;;;;
+21F3;UP DOWN WHITE ARROW;So;0;ON;;;;;N;;;;;
+2200;FOR ALL;Sm;0;ON;;;;;N;;;;;
+2201;COMPLEMENT;Sm;0;ON;;;;;Y;;;;;
+2202;PARTIAL DIFFERENTIAL;Sm;0;ON;;;;;Y;;;;;
+2203;THERE EXISTS;Sm;0;ON;;;;;Y;;;;;
+2204;THERE DOES NOT EXIST;Sm;0;ON;2203 0338;;;;Y;;;;;
+2205;EMPTY SET;Sm;0;ON;;;;;N;;;;;
+2206;INCREMENT;Sm;0;ON;;;;;N;;;;;
+2207;NABLA;Sm;0;ON;;;;;N;;;;;
+2208;ELEMENT OF;Sm;0;ON;;;;;Y;;;;;
+2209;NOT AN ELEMENT OF;Sm;0;ON;2208 0338;;;;Y;;;;;
+220A;SMALL ELEMENT OF;Sm;0;ON;;;;;Y;;;;;
+220B;CONTAINS AS MEMBER;Sm;0;ON;;;;;Y;;;;;
+220C;DOES NOT CONTAIN AS MEMBER;Sm;0;ON;220B 0338;;;;Y;;;;;
+220D;SMALL CONTAINS AS MEMBER;Sm;0;ON;;;;;Y;;;;;
+220E;END OF PROOF;Sm;0;ON;;;;;N;;;;;
+220F;N-ARY PRODUCT;Sm;0;ON;;;;;N;;;;;
+2210;N-ARY COPRODUCT;Sm;0;ON;;;;;N;;;;;
+2211;N-ARY SUMMATION;Sm;0;ON;;;;;Y;;;;;
+2212;MINUS SIGN;Sm;0;ET;;;;;N;;;;;
+2213;MINUS-OR-PLUS SIGN;Sm;0;ET;;;;;N;;;;;
+2214;DOT PLUS;Sm;0;ON;;;;;N;;;;;
+2215;DIVISION SLASH;Sm;0;ON;;;;;Y;;;;;
+2216;SET MINUS;Sm;0;ON;;;;;Y;;;;;
+2217;ASTERISK OPERATOR;Sm;0;ON;;;;;N;;;;;
+2218;RING OPERATOR;Sm;0;ON;;;;;N;;;;;
+2219;BULLET OPERATOR;Sm;0;ON;;;;;N;;;;;
+221A;SQUARE ROOT;Sm;0;ON;;;;;Y;;;;;
+221B;CUBE ROOT;Sm;0;ON;;;;;Y;;;;;
+221C;FOURTH ROOT;Sm;0;ON;;;;;Y;;;;;
+221D;PROPORTIONAL TO;Sm;0;ON;;;;;Y;;;;;
+221E;INFINITY;Sm;0;ON;;;;;N;;;;;
+221F;RIGHT ANGLE;Sm;0;ON;;;;;Y;;;;;
+2220;ANGLE;Sm;0;ON;;;;;Y;;;;;
+2221;MEASURED ANGLE;Sm;0;ON;;;;;Y;;;;;
+2222;SPHERICAL ANGLE;Sm;0;ON;;;;;Y;;;;;
+2223;DIVIDES;Sm;0;ON;;;;;N;;;;;
+2224;DOES NOT DIVIDE;Sm;0;ON;2223 0338;;;;Y;;;;;
+2225;PARALLEL TO;Sm;0;ON;;;;;N;;;;;
+2226;NOT PARALLEL TO;Sm;0;ON;2225 0338;;;;Y;;;;;
+2227;LOGICAL AND;Sm;0;ON;;;;;N;;;;;
+2228;LOGICAL OR;Sm;0;ON;;;;;N;;;;;
+2229;INTERSECTION;Sm;0;ON;;;;;N;;;;;
+222A;UNION;Sm;0;ON;;;;;N;;;;;
+222B;INTEGRAL;Sm;0;ON;;;;;Y;;;;;
+222C;DOUBLE INTEGRAL;Sm;0;ON;<compat> 222B 222B;;;;Y;;;;;
+222D;TRIPLE INTEGRAL;Sm;0;ON;<compat> 222B 222B 222B;;;;Y;;;;;
+222E;CONTOUR INTEGRAL;Sm;0;ON;;;;;Y;;;;;
+222F;SURFACE INTEGRAL;Sm;0;ON;<compat> 222E 222E;;;;Y;;;;;
+2230;VOLUME INTEGRAL;Sm;0;ON;<compat> 222E 222E 222E;;;;Y;;;;;
+2231;CLOCKWISE INTEGRAL;Sm;0;ON;;;;;Y;;;;;
+2232;CLOCKWISE CONTOUR INTEGRAL;Sm;0;ON;;;;;Y;;;;;
+2233;ANTICLOCKWISE CONTOUR INTEGRAL;Sm;0;ON;;;;;Y;;;;;
+2234;THEREFORE;Sm;0;ON;;;;;N;;;;;
+2235;BECAUSE;Sm;0;ON;;;;;N;;;;;
+2236;RATIO;Sm;0;ON;;;;;N;;;;;
+2237;PROPORTION;Sm;0;ON;;;;;N;;;;;
+2238;DOT MINUS;Sm;0;ON;;;;;N;;;;;
+2239;EXCESS;Sm;0;ON;;;;;Y;;;;;
+223A;GEOMETRIC PROPORTION;Sm;0;ON;;;;;N;;;;;
+223B;HOMOTHETIC;Sm;0;ON;;;;;Y;;;;;
+223C;TILDE OPERATOR;Sm;0;ON;;;;;Y;;;;;
+223D;REVERSED TILDE;Sm;0;ON;;;;;Y;;lazy S;;;
+223E;INVERTED LAZY S;Sm;0;ON;;;;;Y;;;;;
+223F;SINE WAVE;Sm;0;ON;;;;;Y;;;;;
+2240;WREATH PRODUCT;Sm;0;ON;;;;;Y;;;;;
+2241;NOT TILDE;Sm;0;ON;223C 0338;;;;Y;;;;;
+2242;MINUS TILDE;Sm;0;ON;;;;;Y;;;;;
+2243;ASYMPTOTICALLY EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2244;NOT ASYMPTOTICALLY EQUAL TO;Sm;0;ON;2243 0338;;;;Y;;;;;
+2245;APPROXIMATELY EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2246;APPROXIMATELY BUT NOT ACTUALLY EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2247;NEITHER APPROXIMATELY NOR ACTUALLY EQUAL TO;Sm;0;ON;2245 0338;;;;Y;;;;;
+2248;ALMOST EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2249;NOT ALMOST EQUAL TO;Sm;0;ON;2248 0338;;;;Y;;;;;
+224A;ALMOST EQUAL OR EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+224B;TRIPLE TILDE;Sm;0;ON;;;;;Y;;;;;
+224C;ALL EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+224D;EQUIVALENT TO;Sm;0;ON;;;;;N;;;;;
+224E;GEOMETRICALLY EQUIVALENT TO;Sm;0;ON;;;;;N;;;;;
+224F;DIFFERENCE BETWEEN;Sm;0;ON;;;;;N;;;;;
+2250;APPROACHES THE LIMIT;Sm;0;ON;;;;;N;;;;;
+2251;GEOMETRICALLY EQUAL TO;Sm;0;ON;;;;;N;;;;;
+2252;APPROXIMATELY EQUAL TO OR THE IMAGE OF;Sm;0;ON;;;;;Y;;;;;
+2253;IMAGE OF OR APPROXIMATELY EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2254;COLON EQUALS;Sm;0;ON;;;;;Y;COLON EQUAL;;;;
+2255;EQUALS COLON;Sm;0;ON;;;;;Y;EQUAL COLON;;;;
+2256;RING IN EQUAL TO;Sm;0;ON;;;;;N;;;;;
+2257;RING EQUAL TO;Sm;0;ON;;;;;N;;;;;
+2258;CORRESPONDS TO;Sm;0;ON;;;;;N;;;;;
+2259;ESTIMATES;Sm;0;ON;;;;;N;;;;;
+225A;EQUIANGULAR TO;Sm;0;ON;;;;;N;;;;;
+225B;STAR EQUALS;Sm;0;ON;;;;;N;;;;;
+225C;DELTA EQUAL TO;Sm;0;ON;;;;;N;;;;;
+225D;EQUAL TO BY DEFINITION;Sm;0;ON;;;;;N;;;;;
+225E;MEASURED BY;Sm;0;ON;;;;;N;;;;;
+225F;QUESTIONED EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2260;NOT EQUAL TO;Sm;0;ON;003D 0338;;;;Y;;;;;
+2261;IDENTICAL TO;Sm;0;ON;;;;;N;;;;;
+2262;NOT IDENTICAL TO;Sm;0;ON;2261 0338;;;;Y;;;;;
+2263;STRICTLY EQUIVALENT TO;Sm;0;ON;;;;;N;;;;;
+2264;LESS-THAN OR EQUAL TO;Sm;0;ON;;;;;Y;LESS THAN OR EQUAL TO;;;;
+2265;GREATER-THAN OR EQUAL TO;Sm;0;ON;;;;;Y;GREATER THAN OR EQUAL TO;;;;
+2266;LESS-THAN OVER EQUAL TO;Sm;0;ON;;;;;Y;LESS THAN OVER EQUAL TO;;;;
+2267;GREATER-THAN OVER EQUAL TO;Sm;0;ON;;;;;Y;GREATER THAN OVER EQUAL TO;;;;
+2268;LESS-THAN BUT NOT EQUAL TO;Sm;0;ON;;;;;Y;LESS THAN BUT NOT EQUAL TO;;;;
+2269;GREATER-THAN BUT NOT EQUAL TO;Sm;0;ON;;;;;Y;GREATER THAN BUT NOT EQUAL TO;;;;
+226A;MUCH LESS-THAN;Sm;0;ON;;;;;Y;MUCH LESS THAN;;;;
+226B;MUCH GREATER-THAN;Sm;0;ON;;;;;Y;MUCH GREATER THAN;;;;
+226C;BETWEEN;Sm;0;ON;;;;;N;;;;;
+226D;NOT EQUIVALENT TO;Sm;0;ON;224D 0338;;;;N;;;;;
+226E;NOT LESS-THAN;Sm;0;ON;003C 0338;;;;Y;NOT LESS THAN;;;;
+226F;NOT GREATER-THAN;Sm;0;ON;003E 0338;;;;Y;NOT GREATER THAN;;;;
+2270;NEITHER LESS-THAN NOR EQUAL TO;Sm;0;ON;2264 0338;;;;Y;NEITHER LESS THAN NOR EQUAL TO;;;;
+2271;NEITHER GREATER-THAN NOR EQUAL TO;Sm;0;ON;2265 0338;;;;Y;NEITHER GREATER THAN NOR EQUAL TO;;;;
+2272;LESS-THAN OR EQUIVALENT TO;Sm;0;ON;;;;;Y;LESS THAN OR EQUIVALENT TO;;;;
+2273;GREATER-THAN OR EQUIVALENT TO;Sm;0;ON;;;;;Y;GREATER THAN OR EQUIVALENT TO;;;;
+2274;NEITHER LESS-THAN NOR EQUIVALENT TO;Sm;0;ON;2272 0338;;;;Y;NEITHER LESS THAN NOR EQUIVALENT TO;;;;
+2275;NEITHER GREATER-THAN NOR EQUIVALENT TO;Sm;0;ON;2273 0338;;;;Y;NEITHER GREATER THAN NOR EQUIVALENT TO;;;;
+2276;LESS-THAN OR GREATER-THAN;Sm;0;ON;;;;;Y;LESS THAN OR GREATER THAN;;;;
+2277;GREATER-THAN OR LESS-THAN;Sm;0;ON;;;;;Y;GREATER THAN OR LESS THAN;;;;
+2278;NEITHER LESS-THAN NOR GREATER-THAN;Sm;0;ON;2276 0338;;;;Y;NEITHER LESS THAN NOR GREATER THAN;;;;
+2279;NEITHER GREATER-THAN NOR LESS-THAN;Sm;0;ON;2277 0338;;;;Y;NEITHER GREATER THAN NOR LESS THAN;;;;
+227A;PRECEDES;Sm;0;ON;;;;;Y;;;;;
+227B;SUCCEEDS;Sm;0;ON;;;;;Y;;;;;
+227C;PRECEDES OR EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+227D;SUCCEEDS OR EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+227E;PRECEDES OR EQUIVALENT TO;Sm;0;ON;;;;;Y;;;;;
+227F;SUCCEEDS OR EQUIVALENT TO;Sm;0;ON;;;;;Y;;;;;
+2280;DOES NOT PRECEDE;Sm;0;ON;227A 0338;;;;Y;;;;;
+2281;DOES NOT SUCCEED;Sm;0;ON;227B 0338;;;;Y;;;;;
+2282;SUBSET OF;Sm;0;ON;;;;;Y;;;;;
+2283;SUPERSET OF;Sm;0;ON;;;;;Y;;;;;
+2284;NOT A SUBSET OF;Sm;0;ON;2282 0338;;;;Y;;;;;
+2285;NOT A SUPERSET OF;Sm;0;ON;2283 0338;;;;Y;;;;;
+2286;SUBSET OF OR EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2287;SUPERSET OF OR EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2288;NEITHER A SUBSET OF NOR EQUAL TO;Sm;0;ON;2286 0338;;;;Y;;;;;
+2289;NEITHER A SUPERSET OF NOR EQUAL TO;Sm;0;ON;2287 0338;;;;Y;;;;;
+228A;SUBSET OF WITH NOT EQUAL TO;Sm;0;ON;;;;;Y;SUBSET OF OR NOT EQUAL TO;;;;
+228B;SUPERSET OF WITH NOT EQUAL TO;Sm;0;ON;;;;;Y;SUPERSET OF OR NOT EQUAL TO;;;;
+228C;MULTISET;Sm;0;ON;;;;;Y;;;;;
+228D;MULTISET MULTIPLICATION;Sm;0;ON;;;;;N;;;;;
+228E;MULTISET UNION;Sm;0;ON;;;;;N;;;;;
+228F;SQUARE IMAGE OF;Sm;0;ON;;;;;Y;;;;;
+2290;SQUARE ORIGINAL OF;Sm;0;ON;;;;;Y;;;;;
+2291;SQUARE IMAGE OF OR EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2292;SQUARE ORIGINAL OF OR EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2293;SQUARE CAP;Sm;0;ON;;;;;N;;;;;
+2294;SQUARE CUP;Sm;0;ON;;;;;N;;;;;
+2295;CIRCLED PLUS;Sm;0;ON;;;;;N;;;;;
+2296;CIRCLED MINUS;Sm;0;ON;;;;;N;;;;;
+2297;CIRCLED TIMES;Sm;0;ON;;;;;N;;;;;
+2298;CIRCLED DIVISION SLASH;Sm;0;ON;;;;;Y;;;;;
+2299;CIRCLED DOT OPERATOR;Sm;0;ON;;;;;N;;;;;
+229A;CIRCLED RING OPERATOR;Sm;0;ON;;;;;N;;;;;
+229B;CIRCLED ASTERISK OPERATOR;Sm;0;ON;;;;;N;;;;;
+229C;CIRCLED EQUALS;Sm;0;ON;;;;;N;;;;;
+229D;CIRCLED DASH;Sm;0;ON;;;;;N;;;;;
+229E;SQUARED PLUS;Sm;0;ON;;;;;N;;;;;
+229F;SQUARED MINUS;Sm;0;ON;;;;;N;;;;;
+22A0;SQUARED TIMES;Sm;0;ON;;;;;N;;;;;
+22A1;SQUARED DOT OPERATOR;Sm;0;ON;;;;;N;;;;;
+22A2;RIGHT TACK;Sm;0;ON;;;;;Y;;;;;
+22A3;LEFT TACK;Sm;0;ON;;;;;Y;;;;;
+22A4;DOWN TACK;Sm;0;ON;;;;;N;;;;;
+22A5;UP TACK;Sm;0;ON;;;;;N;;;;;
+22A6;ASSERTION;Sm;0;ON;;;;;Y;;;;;
+22A7;MODELS;Sm;0;ON;;;;;Y;;;;;
+22A8;TRUE;Sm;0;ON;;;;;Y;;;;;
+22A9;FORCES;Sm;0;ON;;;;;Y;;;;;
+22AA;TRIPLE VERTICAL BAR RIGHT TURNSTILE;Sm;0;ON;;;;;Y;;;;;
+22AB;DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE;Sm;0;ON;;;;;Y;;;;;
+22AC;DOES NOT PROVE;Sm;0;ON;22A2 0338;;;;Y;;;;;
+22AD;NOT TRUE;Sm;0;ON;22A8 0338;;;;Y;;;;;
+22AE;DOES NOT FORCE;Sm;0;ON;22A9 0338;;;;Y;;;;;
+22AF;NEGATED DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE;Sm;0;ON;22AB 0338;;;;Y;;;;;
+22B0;PRECEDES UNDER RELATION;Sm;0;ON;;;;;Y;;;;;
+22B1;SUCCEEDS UNDER RELATION;Sm;0;ON;;;;;Y;;;;;
+22B2;NORMAL SUBGROUP OF;Sm;0;ON;;;;;Y;;;;;
+22B3;CONTAINS AS NORMAL SUBGROUP;Sm;0;ON;;;;;Y;;;;;
+22B4;NORMAL SUBGROUP OF OR EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+22B5;CONTAINS AS NORMAL SUBGROUP OR EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+22B6;ORIGINAL OF;Sm;0;ON;;;;;Y;;;;;
+22B7;IMAGE OF;Sm;0;ON;;;;;Y;;;;;
+22B8;MULTIMAP;Sm;0;ON;;;;;Y;;;;;
+22B9;HERMITIAN CONJUGATE MATRIX;Sm;0;ON;;;;;N;;;;;
+22BA;INTERCALATE;Sm;0;ON;;;;;N;;;;;
+22BB;XOR;Sm;0;ON;;;;;N;;;;;
+22BC;NAND;Sm;0;ON;;;;;N;;;;;
+22BD;NOR;Sm;0;ON;;;;;N;;;;;
+22BE;RIGHT ANGLE WITH ARC;Sm;0;ON;;;;;Y;;;;;
+22BF;RIGHT TRIANGLE;Sm;0;ON;;;;;Y;;;;;
+22C0;N-ARY LOGICAL AND;Sm;0;ON;;;;;N;;;;;
+22C1;N-ARY LOGICAL OR;Sm;0;ON;;;;;N;;;;;
+22C2;N-ARY INTERSECTION;Sm;0;ON;;;;;N;;;;;
+22C3;N-ARY UNION;Sm;0;ON;;;;;N;;;;;
+22C4;DIAMOND OPERATOR;Sm;0;ON;;;;;N;;;;;
+22C5;DOT OPERATOR;Sm;0;ON;;;;;N;;;;;
+22C6;STAR OPERATOR;Sm;0;ON;;;;;N;;;;;
+22C7;DIVISION TIMES;Sm;0;ON;;;;;N;;;;;
+22C8;BOWTIE;Sm;0;ON;;;;;N;;;;;
+22C9;LEFT NORMAL FACTOR SEMIDIRECT PRODUCT;Sm;0;ON;;;;;Y;;;;;
+22CA;RIGHT NORMAL FACTOR SEMIDIRECT PRODUCT;Sm;0;ON;;;;;Y;;;;;
+22CB;LEFT SEMIDIRECT PRODUCT;Sm;0;ON;;;;;Y;;;;;
+22CC;RIGHT SEMIDIRECT PRODUCT;Sm;0;ON;;;;;Y;;;;;
+22CD;REVERSED TILDE EQUALS;Sm;0;ON;;;;;Y;;;;;
+22CE;CURLY LOGICAL OR;Sm;0;ON;;;;;N;;;;;
+22CF;CURLY LOGICAL AND;Sm;0;ON;;;;;N;;;;;
+22D0;DOUBLE SUBSET;Sm;0;ON;;;;;Y;;;;;
+22D1;DOUBLE SUPERSET;Sm;0;ON;;;;;Y;;;;;
+22D2;DOUBLE INTERSECTION;Sm;0;ON;;;;;N;;;;;
+22D3;DOUBLE UNION;Sm;0;ON;;;;;N;;;;;
+22D4;PITCHFORK;Sm;0;ON;;;;;N;;;;;
+22D5;EQUAL AND PARALLEL TO;Sm;0;ON;;;;;N;;;;;
+22D6;LESS-THAN WITH DOT;Sm;0;ON;;;;;Y;LESS THAN WITH DOT;;;;
+22D7;GREATER-THAN WITH DOT;Sm;0;ON;;;;;Y;GREATER THAN WITH DOT;;;;
+22D8;VERY MUCH LESS-THAN;Sm;0;ON;;;;;Y;VERY MUCH LESS THAN;;;;
+22D9;VERY MUCH GREATER-THAN;Sm;0;ON;;;;;Y;VERY MUCH GREATER THAN;;;;
+22DA;LESS-THAN EQUAL TO OR GREATER-THAN;Sm;0;ON;;;;;Y;LESS THAN EQUAL TO OR GREATER THAN;;;;
+22DB;GREATER-THAN EQUAL TO OR LESS-THAN;Sm;0;ON;;;;;Y;GREATER THAN EQUAL TO OR LESS THAN;;;;
+22DC;EQUAL TO OR LESS-THAN;Sm;0;ON;;;;;Y;EQUAL TO OR LESS THAN;;;;
+22DD;EQUAL TO OR GREATER-THAN;Sm;0;ON;;;;;Y;EQUAL TO OR GREATER THAN;;;;
+22DE;EQUAL TO OR PRECEDES;Sm;0;ON;;;;;Y;;;;;
+22DF;EQUAL TO OR SUCCEEDS;Sm;0;ON;;;;;Y;;;;;
+22E0;DOES NOT PRECEDE OR EQUAL;Sm;0;ON;227C 0338;;;;Y;;;;;
+22E1;DOES NOT SUCCEED OR EQUAL;Sm;0;ON;227D 0338;;;;Y;;;;;
+22E2;NOT SQUARE IMAGE OF OR EQUAL TO;Sm;0;ON;2291 0338;;;;Y;;;;;
+22E3;NOT SQUARE ORIGINAL OF OR EQUAL TO;Sm;0;ON;2292 0338;;;;Y;;;;;
+22E4;SQUARE IMAGE OF OR NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+22E5;SQUARE ORIGINAL OF OR NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+22E6;LESS-THAN BUT NOT EQUIVALENT TO;Sm;0;ON;;;;;Y;LESS THAN BUT NOT EQUIVALENT TO;;;;
+22E7;GREATER-THAN BUT NOT EQUIVALENT TO;Sm;0;ON;;;;;Y;GREATER THAN BUT NOT EQUIVALENT TO;;;;
+22E8;PRECEDES BUT NOT EQUIVALENT TO;Sm;0;ON;;;;;Y;;;;;
+22E9;SUCCEEDS BUT NOT EQUIVALENT TO;Sm;0;ON;;;;;Y;;;;;
+22EA;NOT NORMAL SUBGROUP OF;Sm;0;ON;22B2 0338;;;;Y;;;;;
+22EB;DOES NOT CONTAIN AS NORMAL SUBGROUP;Sm;0;ON;22B3 0338;;;;Y;;;;;
+22EC;NOT NORMAL SUBGROUP OF OR EQUAL TO;Sm;0;ON;22B4 0338;;;;Y;;;;;
+22ED;DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL;Sm;0;ON;22B5 0338;;;;Y;;;;;
+22EE;VERTICAL ELLIPSIS;Sm;0;ON;;;;;N;;;;;
+22EF;MIDLINE HORIZONTAL ELLIPSIS;Sm;0;ON;;;;;N;;;;;
+22F0;UP RIGHT DIAGONAL ELLIPSIS;Sm;0;ON;;;;;Y;;;;;
+22F1;DOWN RIGHT DIAGONAL ELLIPSIS;Sm;0;ON;;;;;Y;;;;;
+2300;DIAMETER SIGN;So;0;ON;;;;;N;;;;;
+2301;ELECTRIC ARROW;So;0;ON;;;;;N;;;;;
+2302;HOUSE;So;0;ON;;;;;N;;;;;
+2303;UP ARROWHEAD;So;0;ON;;;;;N;;;;;
+2304;DOWN ARROWHEAD;So;0;ON;;;;;N;;;;;
+2305;PROJECTIVE;So;0;ON;;;;;N;;;;;
+2306;PERSPECTIVE;So;0;ON;;;;;N;;;;;
+2307;WAVY LINE;So;0;ON;;;;;N;;;;;
+2308;LEFT CEILING;Sm;0;ON;;;;;Y;;;;;
+2309;RIGHT CEILING;Sm;0;ON;;;;;Y;;;;;
+230A;LEFT FLOOR;Sm;0;ON;;;;;Y;;;;;
+230B;RIGHT FLOOR;Sm;0;ON;;;;;Y;;;;;
+230C;BOTTOM RIGHT CROP;So;0;ON;;;;;N;;;;;
+230D;BOTTOM LEFT CROP;So;0;ON;;;;;N;;;;;
+230E;TOP RIGHT CROP;So;0;ON;;;;;N;;;;;
+230F;TOP LEFT CROP;So;0;ON;;;;;N;;;;;
+2310;REVERSED NOT SIGN;So;0;ON;;;;;N;;;;;
+2311;SQUARE LOZENGE;So;0;ON;;;;;N;;;;;
+2312;ARC;So;0;ON;;;;;N;;;;;
+2313;SEGMENT;So;0;ON;;;;;N;;;;;
+2314;SECTOR;So;0;ON;;;;;N;;;;;
+2315;TELEPHONE RECORDER;So;0;ON;;;;;N;;;;;
+2316;POSITION INDICATOR;So;0;ON;;;;;N;;;;;
+2317;VIEWDATA SQUARE;So;0;ON;;;;;N;;;;;
+2318;PLACE OF INTEREST SIGN;So;0;ON;;;;;N;COMMAND KEY;;;;
+2319;TURNED NOT SIGN;So;0;ON;;;;;N;;;;;
+231A;WATCH;So;0;ON;;;;;N;;;;;
+231B;HOURGLASS;So;0;ON;;;;;N;;;;;
+231C;TOP LEFT CORNER;So;0;ON;;;;;N;;;;;
+231D;TOP RIGHT CORNER;So;0;ON;;;;;N;;;;;
+231E;BOTTOM LEFT CORNER;So;0;ON;;;;;N;;;;;
+231F;BOTTOM RIGHT CORNER;So;0;ON;;;;;N;;;;;
+2320;TOP HALF INTEGRAL;Sm;0;ON;;;;;Y;;;;;
+2321;BOTTOM HALF INTEGRAL;Sm;0;ON;;;;;Y;;;;;
+2322;FROWN;So;0;ON;;;;;N;;;;;
+2323;SMILE;So;0;ON;;;;;N;;;;;
+2324;UP ARROWHEAD BETWEEN TWO HORIZONTAL BARS;So;0;ON;;;;;N;ENTER KEY;;;;
+2325;OPTION KEY;So;0;ON;;;;;N;;;;;
+2326;ERASE TO THE RIGHT;So;0;ON;;;;;N;DELETE TO THE RIGHT KEY;;;;
+2327;X IN A RECTANGLE BOX;So;0;ON;;;;;N;CLEAR KEY;;;;
+2328;KEYBOARD;So;0;ON;;;;;N;;;;;
+2329;LEFT-POINTING ANGLE BRACKET;Ps;0;ON;3008;;;;Y;BRA;;;;
+232A;RIGHT-POINTING ANGLE BRACKET;Pe;0;ON;3009;;;;Y;KET;;;;
+232B;ERASE TO THE LEFT;So;0;ON;;;;;N;DELETE TO THE LEFT KEY;;;;
+232C;BENZENE RING;So;0;ON;;;;;N;;;;;
+232D;CYLINDRICITY;So;0;ON;;;;;N;;;;;
+232E;ALL AROUND-PROFILE;So;0;ON;;;;;N;;;;;
+232F;SYMMETRY;So;0;ON;;;;;N;;;;;
+2330;TOTAL RUNOUT;So;0;ON;;;;;N;;;;;
+2331;DIMENSION ORIGIN;So;0;ON;;;;;N;;;;;
+2332;CONICAL TAPER;So;0;ON;;;;;N;;;;;
+2333;SLOPE;So;0;ON;;;;;N;;;;;
+2334;COUNTERBORE;So;0;ON;;;;;N;;;;;
+2335;COUNTERSINK;So;0;ON;;;;;N;;;;;
+2336;APL FUNCTIONAL SYMBOL I-BEAM;So;0;L;;;;;N;;;;;
+2337;APL FUNCTIONAL SYMBOL SQUISH QUAD;So;0;L;;;;;N;;;;;
+2338;APL FUNCTIONAL SYMBOL QUAD EQUAL;So;0;L;;;;;N;;;;;
+2339;APL FUNCTIONAL SYMBOL QUAD DIVIDE;So;0;L;;;;;N;;;;;
+233A;APL FUNCTIONAL SYMBOL QUAD DIAMOND;So;0;L;;;;;N;;;;;
+233B;APL FUNCTIONAL SYMBOL QUAD JOT;So;0;L;;;;;N;;;;;
+233C;APL FUNCTIONAL SYMBOL QUAD CIRCLE;So;0;L;;;;;N;;;;;
+233D;APL FUNCTIONAL SYMBOL CIRCLE STILE;So;0;L;;;;;N;;;;;
+233E;APL FUNCTIONAL SYMBOL CIRCLE JOT;So;0;L;;;;;N;;;;;
+233F;APL FUNCTIONAL SYMBOL SLASH BAR;So;0;L;;;;;N;;;;;
+2340;APL FUNCTIONAL SYMBOL BACKSLASH BAR;So;0;L;;;;;N;;;;;
+2341;APL FUNCTIONAL SYMBOL QUAD SLASH;So;0;L;;;;;N;;;;;
+2342;APL FUNCTIONAL SYMBOL QUAD BACKSLASH;So;0;L;;;;;N;;;;;
+2343;APL FUNCTIONAL SYMBOL QUAD LESS-THAN;So;0;L;;;;;N;;;;;
+2344;APL FUNCTIONAL SYMBOL QUAD GREATER-THAN;So;0;L;;;;;N;;;;;
+2345;APL FUNCTIONAL SYMBOL LEFTWARDS VANE;So;0;L;;;;;N;;;;;
+2346;APL FUNCTIONAL SYMBOL RIGHTWARDS VANE;So;0;L;;;;;N;;;;;
+2347;APL FUNCTIONAL SYMBOL QUAD LEFTWARDS ARROW;So;0;L;;;;;N;;;;;
+2348;APL FUNCTIONAL SYMBOL QUAD RIGHTWARDS ARROW;So;0;L;;;;;N;;;;;
+2349;APL FUNCTIONAL SYMBOL CIRCLE BACKSLASH;So;0;L;;;;;N;;;;;
+234A;APL FUNCTIONAL SYMBOL DOWN TACK UNDERBAR;So;0;L;;;;;N;;*;;;
+234B;APL FUNCTIONAL SYMBOL DELTA STILE;So;0;L;;;;;N;;;;;
+234C;APL FUNCTIONAL SYMBOL QUAD DOWN CARET;So;0;L;;;;;N;;;;;
+234D;APL FUNCTIONAL SYMBOL QUAD DELTA;So;0;L;;;;;N;;;;;
+234E;APL FUNCTIONAL SYMBOL DOWN TACK JOT;So;0;L;;;;;N;;*;;;
+234F;APL FUNCTIONAL SYMBOL UPWARDS VANE;So;0;L;;;;;N;;;;;
+2350;APL FUNCTIONAL SYMBOL QUAD UPWARDS ARROW;So;0;L;;;;;N;;;;;
+2351;APL FUNCTIONAL SYMBOL UP TACK OVERBAR;So;0;L;;;;;N;;*;;;
+2352;APL FUNCTIONAL SYMBOL DEL STILE;So;0;L;;;;;N;;;;;
+2353;APL FUNCTIONAL SYMBOL QUAD UP CARET;So;0;L;;;;;N;;;;;
+2354;APL FUNCTIONAL SYMBOL QUAD DEL;So;0;L;;;;;N;;;;;
+2355;APL FUNCTIONAL SYMBOL UP TACK JOT;So;0;L;;;;;N;;*;;;
+2356;APL FUNCTIONAL SYMBOL DOWNWARDS VANE;So;0;L;;;;;N;;;;;
+2357;APL FUNCTIONAL SYMBOL QUAD DOWNWARDS ARROW;So;0;L;;;;;N;;;;;
+2358;APL FUNCTIONAL SYMBOL QUOTE UNDERBAR;So;0;L;;;;;N;;;;;
+2359;APL FUNCTIONAL SYMBOL DELTA UNDERBAR;So;0;L;;;;;N;;;;;
+235A;APL FUNCTIONAL SYMBOL DIAMOND UNDERBAR;So;0;L;;;;;N;;;;;
+235B;APL FUNCTIONAL SYMBOL JOT UNDERBAR;So;0;L;;;;;N;;;;;
+235C;APL FUNCTIONAL SYMBOL CIRCLE UNDERBAR;So;0;L;;;;;N;;;;;
+235D;APL FUNCTIONAL SYMBOL UP SHOE JOT;So;0;L;;;;;N;;;;;
+235E;APL FUNCTIONAL SYMBOL QUOTE QUAD;So;0;L;;;;;N;;;;;
+235F;APL FUNCTIONAL SYMBOL CIRCLE STAR;So;0;L;;;;;N;;;;;
+2360;APL FUNCTIONAL SYMBOL QUAD COLON;So;0;L;;;;;N;;;;;
+2361;APL FUNCTIONAL SYMBOL UP TACK DIAERESIS;So;0;L;;;;;N;;*;;;
+2362;APL FUNCTIONAL SYMBOL DEL DIAERESIS;So;0;L;;;;;N;;;;;
+2363;APL FUNCTIONAL SYMBOL STAR DIAERESIS;So;0;L;;;;;N;;;;;
+2364;APL FUNCTIONAL SYMBOL JOT DIAERESIS;So;0;L;;;;;N;;;;;
+2365;APL FUNCTIONAL SYMBOL CIRCLE DIAERESIS;So;0;L;;;;;N;;;;;
+2366;APL FUNCTIONAL SYMBOL DOWN SHOE STILE;So;0;L;;;;;N;;;;;
+2367;APL FUNCTIONAL SYMBOL LEFT SHOE STILE;So;0;L;;;;;N;;;;;
+2368;APL FUNCTIONAL SYMBOL TILDE DIAERESIS;So;0;L;;;;;N;;;;;
+2369;APL FUNCTIONAL SYMBOL GREATER-THAN DIAERESIS;So;0;L;;;;;N;;;;;
+236A;APL FUNCTIONAL SYMBOL COMMA BAR;So;0;L;;;;;N;;;;;
+236B;APL FUNCTIONAL SYMBOL DEL TILDE;So;0;L;;;;;N;;;;;
+236C;APL FUNCTIONAL SYMBOL ZILDE;So;0;L;;;;;N;;;;;
+236D;APL FUNCTIONAL SYMBOL STILE TILDE;So;0;L;;;;;N;;;;;
+236E;APL FUNCTIONAL SYMBOL SEMICOLON UNDERBAR;So;0;L;;;;;N;;;;;
+236F;APL FUNCTIONAL SYMBOL QUAD NOT EQUAL;So;0;L;;;;;N;;;;;
+2370;APL FUNCTIONAL SYMBOL QUAD QUESTION;So;0;L;;;;;N;;;;;
+2371;APL FUNCTIONAL SYMBOL DOWN CARET TILDE;So;0;L;;;;;N;;;;;
+2372;APL FUNCTIONAL SYMBOL UP CARET TILDE;So;0;L;;;;;N;;;;;
+2373;APL FUNCTIONAL SYMBOL IOTA;So;0;L;;;;;N;;;;;
+2374;APL FUNCTIONAL SYMBOL RHO;So;0;L;;;;;N;;;;;
+2375;APL FUNCTIONAL SYMBOL OMEGA;So;0;L;;;;;N;;;;;
+2376;APL FUNCTIONAL SYMBOL ALPHA UNDERBAR;So;0;L;;;;;N;;;;;
+2377;APL FUNCTIONAL SYMBOL EPSILON UNDERBAR;So;0;L;;;;;N;;;;;
+2378;APL FUNCTIONAL SYMBOL IOTA UNDERBAR;So;0;L;;;;;N;;;;;
+2379;APL FUNCTIONAL SYMBOL OMEGA UNDERBAR;So;0;L;;;;;N;;;;;
+237A;APL FUNCTIONAL SYMBOL ALPHA;So;0;L;;;;;N;;;;;
+237B;NOT CHECK MARK;So;0;ON;;;;;N;;;;;
+237D;SHOULDERED OPEN BOX;So;0;ON;;;;;N;;;;;
+237E;BELL SYMBOL;So;0;ON;;;;;N;;;;;
+237F;VERTICAL LINE WITH MIDDLE DOT;So;0;ON;;;;;N;;;;;
+2380;INSERTION SYMBOL;So;0;ON;;;;;N;;;;;
+2381;CONTINUOUS UNDERLINE SYMBOL;So;0;ON;;;;;N;;;;;
+2382;DISCONTINUOUS UNDERLINE SYMBOL;So;0;ON;;;;;N;;;;;
+2383;EMPHASIS SYMBOL;So;0;ON;;;;;N;;;;;
+2384;COMPOSITION SYMBOL;So;0;ON;;;;;N;;;;;
+2385;WHITE SQUARE WITH CENTRE VERTICAL LINE;So;0;ON;;;;;N;;;;;
+2386;ENTER SYMBOL;So;0;ON;;;;;N;;;;;
+2387;ALTERNATIVE KEY SYMBOL;So;0;ON;;;;;N;;;;;
+2388;HELM SYMBOL;So;0;ON;;;;;N;;;;;
+2389;CIRCLED HORIZONTAL BAR WITH NOTCH;So;0;ON;;;;;N;;pause;;;
+238A;CIRCLED TRIANGLE DOWN;So;0;ON;;;;;N;;break;;;
+238B;BROKEN CIRCLE WITH NORTHWEST ARROW;So;0;ON;;;;;N;;escape;;;
+238C;UNDO SYMBOL;So;0;ON;;;;;N;;;;;
+238D;MONOSTABLE SYMBOL;So;0;ON;;;;;N;;;;;
+238E;HYSTERESIS SYMBOL;So;0;ON;;;;;N;;;;;
+238F;OPEN-CIRCUIT-OUTPUT H-TYPE SYMBOL;So;0;ON;;;;;N;;;;;
+2390;OPEN-CIRCUIT-OUTPUT L-TYPE SYMBOL;So;0;ON;;;;;N;;;;;
+2391;PASSIVE-PULL-DOWN-OUTPUT SYMBOL;So;0;ON;;;;;N;;;;;
+2392;PASSIVE-PULL-UP-OUTPUT SYMBOL;So;0;ON;;;;;N;;;;;
+2393;DIRECT CURRENT SYMBOL FORM TWO;So;0;ON;;;;;N;;;;;
+2394;SOFTWARE-FUNCTION SYMBOL;So;0;ON;;;;;N;;;;;
+2395;APL FUNCTIONAL SYMBOL QUAD;So;0;L;;;;;N;;;;;
+2396;DECIMAL SEPARATOR KEY SYMBOL;So;0;ON;;;;;N;;;;;
+2397;PREVIOUS PAGE;So;0;ON;;;;;N;;;;;
+2398;NEXT PAGE;So;0;ON;;;;;N;;;;;
+2399;PRINT SCREEN SYMBOL;So;0;ON;;;;;N;;;;;
+239A;CLEAR SCREEN SYMBOL;So;0;ON;;;;;N;;;;;
+2400;SYMBOL FOR NULL;So;0;ON;;;;;N;GRAPHIC FOR NULL;;;;
+2401;SYMBOL FOR START OF HEADING;So;0;ON;;;;;N;GRAPHIC FOR START OF HEADING;;;;
+2402;SYMBOL FOR START OF TEXT;So;0;ON;;;;;N;GRAPHIC FOR START OF TEXT;;;;
+2403;SYMBOL FOR END OF TEXT;So;0;ON;;;;;N;GRAPHIC FOR END OF TEXT;;;;
+2404;SYMBOL FOR END OF TRANSMISSION;So;0;ON;;;;;N;GRAPHIC FOR END OF TRANSMISSION;;;;
+2405;SYMBOL FOR ENQUIRY;So;0;ON;;;;;N;GRAPHIC FOR ENQUIRY;;;;
+2406;SYMBOL FOR ACKNOWLEDGE;So;0;ON;;;;;N;GRAPHIC FOR ACKNOWLEDGE;;;;
+2407;SYMBOL FOR BELL;So;0;ON;;;;;N;GRAPHIC FOR BELL;;;;
+2408;SYMBOL FOR BACKSPACE;So;0;ON;;;;;N;GRAPHIC FOR BACKSPACE;;;;
+2409;SYMBOL FOR HORIZONTAL TABULATION;So;0;ON;;;;;N;GRAPHIC FOR HORIZONTAL TABULATION;;;;
+240A;SYMBOL FOR LINE FEED;So;0;ON;;;;;N;GRAPHIC FOR LINE FEED;;;;
+240B;SYMBOL FOR VERTICAL TABULATION;So;0;ON;;;;;N;GRAPHIC FOR VERTICAL TABULATION;;;;
+240C;SYMBOL FOR FORM FEED;So;0;ON;;;;;N;GRAPHIC FOR FORM FEED;;;;
+240D;SYMBOL FOR CARRIAGE RETURN;So;0;ON;;;;;N;GRAPHIC FOR CARRIAGE RETURN;;;;
+240E;SYMBOL FOR SHIFT OUT;So;0;ON;;;;;N;GRAPHIC FOR SHIFT OUT;;;;
+240F;SYMBOL FOR SHIFT IN;So;0;ON;;;;;N;GRAPHIC FOR SHIFT IN;;;;
+2410;SYMBOL FOR DATA LINK ESCAPE;So;0;ON;;;;;N;GRAPHIC FOR DATA LINK ESCAPE;;;;
+2411;SYMBOL FOR DEVICE CONTROL ONE;So;0;ON;;;;;N;GRAPHIC FOR DEVICE CONTROL ONE;;;;
+2412;SYMBOL FOR DEVICE CONTROL TWO;So;0;ON;;;;;N;GRAPHIC FOR DEVICE CONTROL TWO;;;;
+2413;SYMBOL FOR DEVICE CONTROL THREE;So;0;ON;;;;;N;GRAPHIC FOR DEVICE CONTROL THREE;;;;
+2414;SYMBOL FOR DEVICE CONTROL FOUR;So;0;ON;;;;;N;GRAPHIC FOR DEVICE CONTROL FOUR;;;;
+2415;SYMBOL FOR NEGATIVE ACKNOWLEDGE;So;0;ON;;;;;N;GRAPHIC FOR NEGATIVE ACKNOWLEDGE;;;;
+2416;SYMBOL FOR SYNCHRONOUS IDLE;So;0;ON;;;;;N;GRAPHIC FOR SYNCHRONOUS IDLE;;;;
+2417;SYMBOL FOR END OF TRANSMISSION BLOCK;So;0;ON;;;;;N;GRAPHIC FOR END OF TRANSMISSION BLOCK;;;;
+2418;SYMBOL FOR CANCEL;So;0;ON;;;;;N;GRAPHIC FOR CANCEL;;;;
+2419;SYMBOL FOR END OF MEDIUM;So;0;ON;;;;;N;GRAPHIC FOR END OF MEDIUM;;;;
+241A;SYMBOL FOR SUBSTITUTE;So;0;ON;;;;;N;GRAPHIC FOR SUBSTITUTE;;;;
+241B;SYMBOL FOR ESCAPE;So;0;ON;;;;;N;GRAPHIC FOR ESCAPE;;;;
+241C;SYMBOL FOR FILE SEPARATOR;So;0;ON;;;;;N;GRAPHIC FOR FILE SEPARATOR;;;;
+241D;SYMBOL FOR GROUP SEPARATOR;So;0;ON;;;;;N;GRAPHIC FOR GROUP SEPARATOR;;;;
+241E;SYMBOL FOR RECORD SEPARATOR;So;0;ON;;;;;N;GRAPHIC FOR RECORD SEPARATOR;;;;
+241F;SYMBOL FOR UNIT SEPARATOR;So;0;ON;;;;;N;GRAPHIC FOR UNIT SEPARATOR;;;;
+2420;SYMBOL FOR SPACE;So;0;ON;;;;;N;GRAPHIC FOR SPACE;;;;
+2421;SYMBOL FOR DELETE;So;0;ON;;;;;N;GRAPHIC FOR DELETE;;;;
+2422;BLANK SYMBOL;So;0;ON;;;;;N;BLANK;;;;
+2423;OPEN BOX;So;0;ON;;;;;N;;;;;
+2424;SYMBOL FOR NEWLINE;So;0;ON;;;;;N;GRAPHIC FOR NEWLINE;;;;
+2425;SYMBOL FOR DELETE FORM TWO;So;0;ON;;;;;N;;;;;
+2426;SYMBOL FOR SUBSTITUTE FORM TWO;So;0;ON;;;;;N;;;;;
+2440;OCR HOOK;So;0;ON;;;;;N;;;;;
+2441;OCR CHAIR;So;0;ON;;;;;N;;;;;
+2442;OCR FORK;So;0;ON;;;;;N;;;;;
+2443;OCR INVERTED FORK;So;0;ON;;;;;N;;;;;
+2444;OCR BELT BUCKLE;So;0;ON;;;;;N;;;;;
+2445;OCR BOW TIE;So;0;ON;;;;;N;;;;;
+2446;OCR BRANCH BANK IDENTIFICATION;So;0;ON;;;;;N;;;;;
+2447;OCR AMOUNT OF CHECK;So;0;ON;;;;;N;;;;;
+2448;OCR DASH;So;0;ON;;;;;N;;;;;
+2449;OCR CUSTOMER ACCOUNT NUMBER;So;0;ON;;;;;N;;;;;
+244A;OCR DOUBLE BACKSLASH;So;0;ON;;;;;N;;;;;
+2460;CIRCLED DIGIT ONE;No;0;EN;<circle> 0031;;1;1;N;;;;;
+2461;CIRCLED DIGIT TWO;No;0;EN;<circle> 0032;;2;2;N;;;;;
+2462;CIRCLED DIGIT THREE;No;0;EN;<circle> 0033;;3;3;N;;;;;
+2463;CIRCLED DIGIT FOUR;No;0;EN;<circle> 0034;;4;4;N;;;;;
+2464;CIRCLED DIGIT FIVE;No;0;EN;<circle> 0035;;5;5;N;;;;;
+2465;CIRCLED DIGIT SIX;No;0;EN;<circle> 0036;;6;6;N;;;;;
+2466;CIRCLED DIGIT SEVEN;No;0;EN;<circle> 0037;;7;7;N;;;;;
+2467;CIRCLED DIGIT EIGHT;No;0;EN;<circle> 0038;;8;8;N;;;;;
+2468;CIRCLED DIGIT NINE;No;0;EN;<circle> 0039;;9;9;N;;;;;
+2469;CIRCLED NUMBER TEN;No;0;EN;<circle> 0031 0030;;;10;N;;;;;
+246A;CIRCLED NUMBER ELEVEN;No;0;EN;<circle> 0031 0031;;;11;N;;;;;
+246B;CIRCLED NUMBER TWELVE;No;0;EN;<circle> 0031 0032;;;12;N;;;;;
+246C;CIRCLED NUMBER THIRTEEN;No;0;EN;<circle> 0031 0033;;;13;N;;;;;
+246D;CIRCLED NUMBER FOURTEEN;No;0;EN;<circle> 0031 0034;;;14;N;;;;;
+246E;CIRCLED NUMBER FIFTEEN;No;0;EN;<circle> 0031 0035;;;15;N;;;;;
+246F;CIRCLED NUMBER SIXTEEN;No;0;EN;<circle> 0031 0036;;;16;N;;;;;
+2470;CIRCLED NUMBER SEVENTEEN;No;0;EN;<circle> 0031 0037;;;17;N;;;;;
+2471;CIRCLED NUMBER EIGHTEEN;No;0;EN;<circle> 0031 0038;;;18;N;;;;;
+2472;CIRCLED NUMBER NINETEEN;No;0;EN;<circle> 0031 0039;;;19;N;;;;;
+2473;CIRCLED NUMBER TWENTY;No;0;EN;<circle> 0032 0030;;;20;N;;;;;
+2474;PARENTHESIZED DIGIT ONE;No;0;EN;<compat> 0028 0031 0029;;1;1;N;;;;;
+2475;PARENTHESIZED DIGIT TWO;No;0;EN;<compat> 0028 0032 0029;;2;2;N;;;;;
+2476;PARENTHESIZED DIGIT THREE;No;0;EN;<compat> 0028 0033 0029;;3;3;N;;;;;
+2477;PARENTHESIZED DIGIT FOUR;No;0;EN;<compat> 0028 0034 0029;;4;4;N;;;;;
+2478;PARENTHESIZED DIGIT FIVE;No;0;EN;<compat> 0028 0035 0029;;5;5;N;;;;;
+2479;PARENTHESIZED DIGIT SIX;No;0;EN;<compat> 0028 0036 0029;;6;6;N;;;;;
+247A;PARENTHESIZED DIGIT SEVEN;No;0;EN;<compat> 0028 0037 0029;;7;7;N;;;;;
+247B;PARENTHESIZED DIGIT EIGHT;No;0;EN;<compat> 0028 0038 0029;;8;8;N;;;;;
+247C;PARENTHESIZED DIGIT NINE;No;0;EN;<compat> 0028 0039 0029;;9;9;N;;;;;
+247D;PARENTHESIZED NUMBER TEN;No;0;EN;<compat> 0028 0031 0030 0029;;;10;N;;;;;
+247E;PARENTHESIZED NUMBER ELEVEN;No;0;EN;<compat> 0028 0031 0031 0029;;;11;N;;;;;
+247F;PARENTHESIZED NUMBER TWELVE;No;0;EN;<compat> 0028 0031 0032 0029;;;12;N;;;;;
+2480;PARENTHESIZED NUMBER THIRTEEN;No;0;EN;<compat> 0028 0031 0033 0029;;;13;N;;;;;
+2481;PARENTHESIZED NUMBER FOURTEEN;No;0;EN;<compat> 0028 0031 0034 0029;;;14;N;;;;;
+2482;PARENTHESIZED NUMBER FIFTEEN;No;0;EN;<compat> 0028 0031 0035 0029;;;15;N;;;;;
+2483;PARENTHESIZED NUMBER SIXTEEN;No;0;EN;<compat> 0028 0031 0036 0029;;;16;N;;;;;
+2484;PARENTHESIZED NUMBER SEVENTEEN;No;0;EN;<compat> 0028 0031 0037 0029;;;17;N;;;;;
+2485;PARENTHESIZED NUMBER EIGHTEEN;No;0;EN;<compat> 0028 0031 0038 0029;;;18;N;;;;;
+2486;PARENTHESIZED NUMBER NINETEEN;No;0;EN;<compat> 0028 0031 0039 0029;;;19;N;;;;;
+2487;PARENTHESIZED NUMBER TWENTY;No;0;EN;<compat> 0028 0032 0030 0029;;;20;N;;;;;
+2488;DIGIT ONE FULL STOP;No;0;EN;<compat> 0031 002E;;1;1;N;DIGIT ONE PERIOD;;;;
+2489;DIGIT TWO FULL STOP;No;0;EN;<compat> 0032 002E;;2;2;N;DIGIT TWO PERIOD;;;;
+248A;DIGIT THREE FULL STOP;No;0;EN;<compat> 0033 002E;;3;3;N;DIGIT THREE PERIOD;;;;
+248B;DIGIT FOUR FULL STOP;No;0;EN;<compat> 0034 002E;;4;4;N;DIGIT FOUR PERIOD;;;;
+248C;DIGIT FIVE FULL STOP;No;0;EN;<compat> 0035 002E;;5;5;N;DIGIT FIVE PERIOD;;;;
+248D;DIGIT SIX FULL STOP;No;0;EN;<compat> 0036 002E;;6;6;N;DIGIT SIX PERIOD;;;;
+248E;DIGIT SEVEN FULL STOP;No;0;EN;<compat> 0037 002E;;7;7;N;DIGIT SEVEN PERIOD;;;;
+248F;DIGIT EIGHT FULL STOP;No;0;EN;<compat> 0038 002E;;8;8;N;DIGIT EIGHT PERIOD;;;;
+2490;DIGIT NINE FULL STOP;No;0;EN;<compat> 0039 002E;;9;9;N;DIGIT NINE PERIOD;;;;
+2491;NUMBER TEN FULL STOP;No;0;EN;<compat> 0031 0030 002E;;;10;N;NUMBER TEN PERIOD;;;;
+2492;NUMBER ELEVEN FULL STOP;No;0;EN;<compat> 0031 0031 002E;;;11;N;NUMBER ELEVEN PERIOD;;;;
+2493;NUMBER TWELVE FULL STOP;No;0;EN;<compat> 0031 0032 002E;;;12;N;NUMBER TWELVE PERIOD;;;;
+2494;NUMBER THIRTEEN FULL STOP;No;0;EN;<compat> 0031 0033 002E;;;13;N;NUMBER THIRTEEN PERIOD;;;;
+2495;NUMBER FOURTEEN FULL STOP;No;0;EN;<compat> 0031 0034 002E;;;14;N;NUMBER FOURTEEN PERIOD;;;;
+2496;NUMBER FIFTEEN FULL STOP;No;0;EN;<compat> 0031 0035 002E;;;15;N;NUMBER FIFTEEN PERIOD;;;;
+2497;NUMBER SIXTEEN FULL STOP;No;0;EN;<compat> 0031 0036 002E;;;16;N;NUMBER SIXTEEN PERIOD;;;;
+2498;NUMBER SEVENTEEN FULL STOP;No;0;EN;<compat> 0031 0037 002E;;;17;N;NUMBER SEVENTEEN PERIOD;;;;
+2499;NUMBER EIGHTEEN FULL STOP;No;0;EN;<compat> 0031 0038 002E;;;18;N;NUMBER EIGHTEEN PERIOD;;;;
+249A;NUMBER NINETEEN FULL STOP;No;0;EN;<compat> 0031 0039 002E;;;19;N;NUMBER NINETEEN PERIOD;;;;
+249B;NUMBER TWENTY FULL STOP;No;0;EN;<compat> 0032 0030 002E;;;20;N;NUMBER TWENTY PERIOD;;;;
+249C;PARENTHESIZED LATIN SMALL LETTER A;So;0;L;<compat> 0028 0061 0029;;;;N;;;;;
+249D;PARENTHESIZED LATIN SMALL LETTER B;So;0;L;<compat> 0028 0062 0029;;;;N;;;;;
+249E;PARENTHESIZED LATIN SMALL LETTER C;So;0;L;<compat> 0028 0063 0029;;;;N;;;;;
+249F;PARENTHESIZED LATIN SMALL LETTER D;So;0;L;<compat> 0028 0064 0029;;;;N;;;;;
+24A0;PARENTHESIZED LATIN SMALL LETTER E;So;0;L;<compat> 0028 0065 0029;;;;N;;;;;
+24A1;PARENTHESIZED LATIN SMALL LETTER F;So;0;L;<compat> 0028 0066 0029;;;;N;;;;;
+24A2;PARENTHESIZED LATIN SMALL LETTER G;So;0;L;<compat> 0028 0067 0029;;;;N;;;;;
+24A3;PARENTHESIZED LATIN SMALL LETTER H;So;0;L;<compat> 0028 0068 0029;;;;N;;;;;
+24A4;PARENTHESIZED LATIN SMALL LETTER I;So;0;L;<compat> 0028 0069 0029;;;;N;;;;;
+24A5;PARENTHESIZED LATIN SMALL LETTER J;So;0;L;<compat> 0028 006A 0029;;;;N;;;;;
+24A6;PARENTHESIZED LATIN SMALL LETTER K;So;0;L;<compat> 0028 006B 0029;;;;N;;;;;
+24A7;PARENTHESIZED LATIN SMALL LETTER L;So;0;L;<compat> 0028 006C 0029;;;;N;;;;;
+24A8;PARENTHESIZED LATIN SMALL LETTER M;So;0;L;<compat> 0028 006D 0029;;;;N;;;;;
+24A9;PARENTHESIZED LATIN SMALL LETTER N;So;0;L;<compat> 0028 006E 0029;;;;N;;;;;
+24AA;PARENTHESIZED LATIN SMALL LETTER O;So;0;L;<compat> 0028 006F 0029;;;;N;;;;;
+24AB;PARENTHESIZED LATIN SMALL LETTER P;So;0;L;<compat> 0028 0070 0029;;;;N;;;;;
+24AC;PARENTHESIZED LATIN SMALL LETTER Q;So;0;L;<compat> 0028 0071 0029;;;;N;;;;;
+24AD;PARENTHESIZED LATIN SMALL LETTER R;So;0;L;<compat> 0028 0072 0029;;;;N;;;;;
+24AE;PARENTHESIZED LATIN SMALL LETTER S;So;0;L;<compat> 0028 0073 0029;;;;N;;;;;
+24AF;PARENTHESIZED LATIN SMALL LETTER T;So;0;L;<compat> 0028 0074 0029;;;;N;;;;;
+24B0;PARENTHESIZED LATIN SMALL LETTER U;So;0;L;<compat> 0028 0075 0029;;;;N;;;;;
+24B1;PARENTHESIZED LATIN SMALL LETTER V;So;0;L;<compat> 0028 0076 0029;;;;N;;;;;
+24B2;PARENTHESIZED LATIN SMALL LETTER W;So;0;L;<compat> 0028 0077 0029;;;;N;;;;;
+24B3;PARENTHESIZED LATIN SMALL LETTER X;So;0;L;<compat> 0028 0078 0029;;;;N;;;;;
+24B4;PARENTHESIZED LATIN SMALL LETTER Y;So;0;L;<compat> 0028 0079 0029;;;;N;;;;;
+24B5;PARENTHESIZED LATIN SMALL LETTER Z;So;0;L;<compat> 0028 007A 0029;;;;N;;;;;
+24B6;CIRCLED LATIN CAPITAL LETTER A;So;0;L;<circle> 0041;;;;N;;;;24D0;
+24B7;CIRCLED LATIN CAPITAL LETTER B;So;0;L;<circle> 0042;;;;N;;;;24D1;
+24B8;CIRCLED LATIN CAPITAL LETTER C;So;0;L;<circle> 0043;;;;N;;;;24D2;
+24B9;CIRCLED LATIN CAPITAL LETTER D;So;0;L;<circle> 0044;;;;N;;;;24D3;
+24BA;CIRCLED LATIN CAPITAL LETTER E;So;0;L;<circle> 0045;;;;N;;;;24D4;
+24BB;CIRCLED LATIN CAPITAL LETTER F;So;0;L;<circle> 0046;;;;N;;;;24D5;
+24BC;CIRCLED LATIN CAPITAL LETTER G;So;0;L;<circle> 0047;;;;N;;;;24D6;
+24BD;CIRCLED LATIN CAPITAL LETTER H;So;0;L;<circle> 0048;;;;N;;;;24D7;
+24BE;CIRCLED LATIN CAPITAL LETTER I;So;0;L;<circle> 0049;;;;N;;;;24D8;
+24BF;CIRCLED LATIN CAPITAL LETTER J;So;0;L;<circle> 004A;;;;N;;;;24D9;
+24C0;CIRCLED LATIN CAPITAL LETTER K;So;0;L;<circle> 004B;;;;N;;;;24DA;
+24C1;CIRCLED LATIN CAPITAL LETTER L;So;0;L;<circle> 004C;;;;N;;;;24DB;
+24C2;CIRCLED LATIN CAPITAL LETTER M;So;0;L;<circle> 004D;;;;N;;;;24DC;
+24C3;CIRCLED LATIN CAPITAL LETTER N;So;0;L;<circle> 004E;;;;N;;;;24DD;
+24C4;CIRCLED LATIN CAPITAL LETTER O;So;0;L;<circle> 004F;;;;N;;;;24DE;
+24C5;CIRCLED LATIN CAPITAL LETTER P;So;0;L;<circle> 0050;;;;N;;;;24DF;
+24C6;CIRCLED LATIN CAPITAL LETTER Q;So;0;L;<circle> 0051;;;;N;;;;24E0;
+24C7;CIRCLED LATIN CAPITAL LETTER R;So;0;L;<circle> 0052;;;;N;;;;24E1;
+24C8;CIRCLED LATIN CAPITAL LETTER S;So;0;L;<circle> 0053;;;;N;;;;24E2;
+24C9;CIRCLED LATIN CAPITAL LETTER T;So;0;L;<circle> 0054;;;;N;;;;24E3;
+24CA;CIRCLED LATIN CAPITAL LETTER U;So;0;L;<circle> 0055;;;;N;;;;24E4;
+24CB;CIRCLED LATIN CAPITAL LETTER V;So;0;L;<circle> 0056;;;;N;;;;24E5;
+24CC;CIRCLED LATIN CAPITAL LETTER W;So;0;L;<circle> 0057;;;;N;;;;24E6;
+24CD;CIRCLED LATIN CAPITAL LETTER X;So;0;L;<circle> 0058;;;;N;;;;24E7;
+24CE;CIRCLED LATIN CAPITAL LETTER Y;So;0;L;<circle> 0059;;;;N;;;;24E8;
+24CF;CIRCLED LATIN CAPITAL LETTER Z;So;0;L;<circle> 005A;;;;N;;;;24E9;
+24D0;CIRCLED LATIN SMALL LETTER A;So;0;L;<circle> 0061;;;;N;;;24B6;;24B6
+24D1;CIRCLED LATIN SMALL LETTER B;So;0;L;<circle> 0062;;;;N;;;24B7;;24B7
+24D2;CIRCLED LATIN SMALL LETTER C;So;0;L;<circle> 0063;;;;N;;;24B8;;24B8
+24D3;CIRCLED LATIN SMALL LETTER D;So;0;L;<circle> 0064;;;;N;;;24B9;;24B9
+24D4;CIRCLED LATIN SMALL LETTER E;So;0;L;<circle> 0065;;;;N;;;24BA;;24BA
+24D5;CIRCLED LATIN SMALL LETTER F;So;0;L;<circle> 0066;;;;N;;;24BB;;24BB
+24D6;CIRCLED LATIN SMALL LETTER G;So;0;L;<circle> 0067;;;;N;;;24BC;;24BC
+24D7;CIRCLED LATIN SMALL LETTER H;So;0;L;<circle> 0068;;;;N;;;24BD;;24BD
+24D8;CIRCLED LATIN SMALL LETTER I;So;0;L;<circle> 0069;;;;N;;;24BE;;24BE
+24D9;CIRCLED LATIN SMALL LETTER J;So;0;L;<circle> 006A;;;;N;;;24BF;;24BF
+24DA;CIRCLED LATIN SMALL LETTER K;So;0;L;<circle> 006B;;;;N;;;24C0;;24C0
+24DB;CIRCLED LATIN SMALL LETTER L;So;0;L;<circle> 006C;;;;N;;;24C1;;24C1
+24DC;CIRCLED LATIN SMALL LETTER M;So;0;L;<circle> 006D;;;;N;;;24C2;;24C2
+24DD;CIRCLED LATIN SMALL LETTER N;So;0;L;<circle> 006E;;;;N;;;24C3;;24C3
+24DE;CIRCLED LATIN SMALL LETTER O;So;0;L;<circle> 006F;;;;N;;;24C4;;24C4
+24DF;CIRCLED LATIN SMALL LETTER P;So;0;L;<circle> 0070;;;;N;;;24C5;;24C5
+24E0;CIRCLED LATIN SMALL LETTER Q;So;0;L;<circle> 0071;;;;N;;;24C6;;24C6
+24E1;CIRCLED LATIN SMALL LETTER R;So;0;L;<circle> 0072;;;;N;;;24C7;;24C7
+24E2;CIRCLED LATIN SMALL LETTER S;So;0;L;<circle> 0073;;;;N;;;24C8;;24C8
+24E3;CIRCLED LATIN SMALL LETTER T;So;0;L;<circle> 0074;;;;N;;;24C9;;24C9
+24E4;CIRCLED LATIN SMALL LETTER U;So;0;L;<circle> 0075;;;;N;;;24CA;;24CA
+24E5;CIRCLED LATIN SMALL LETTER V;So;0;L;<circle> 0076;;;;N;;;24CB;;24CB
+24E6;CIRCLED LATIN SMALL LETTER W;So;0;L;<circle> 0077;;;;N;;;24CC;;24CC
+24E7;CIRCLED LATIN SMALL LETTER X;So;0;L;<circle> 0078;;;;N;;;24CD;;24CD
+24E8;CIRCLED LATIN SMALL LETTER Y;So;0;L;<circle> 0079;;;;N;;;24CE;;24CE
+24E9;CIRCLED LATIN SMALL LETTER Z;So;0;L;<circle> 007A;;;;N;;;24CF;;24CF
+24EA;CIRCLED DIGIT ZERO;No;0;EN;<circle> 0030;;0;0;N;;;;;
+2500;BOX DRAWINGS LIGHT HORIZONTAL;So;0;ON;;;;;N;FORMS LIGHT HORIZONTAL;;;;
+2501;BOX DRAWINGS HEAVY HORIZONTAL;So;0;ON;;;;;N;FORMS HEAVY HORIZONTAL;;;;
+2502;BOX DRAWINGS LIGHT VERTICAL;So;0;ON;;;;;N;FORMS LIGHT VERTICAL;;;;
+2503;BOX DRAWINGS HEAVY VERTICAL;So;0;ON;;;;;N;FORMS HEAVY VERTICAL;;;;
+2504;BOX DRAWINGS LIGHT TRIPLE DASH HORIZONTAL;So;0;ON;;;;;N;FORMS LIGHT TRIPLE DASH HORIZONTAL;;;;
+2505;BOX DRAWINGS HEAVY TRIPLE DASH HORIZONTAL;So;0;ON;;;;;N;FORMS HEAVY TRIPLE DASH HORIZONTAL;;;;
+2506;BOX DRAWINGS LIGHT TRIPLE DASH VERTICAL;So;0;ON;;;;;N;FORMS LIGHT TRIPLE DASH VERTICAL;;;;
+2507;BOX DRAWINGS HEAVY TRIPLE DASH VERTICAL;So;0;ON;;;;;N;FORMS HEAVY TRIPLE DASH VERTICAL;;;;
+2508;BOX DRAWINGS LIGHT QUADRUPLE DASH HORIZONTAL;So;0;ON;;;;;N;FORMS LIGHT QUADRUPLE DASH HORIZONTAL;;;;
+2509;BOX DRAWINGS HEAVY QUADRUPLE DASH HORIZONTAL;So;0;ON;;;;;N;FORMS HEAVY QUADRUPLE DASH HORIZONTAL;;;;
+250A;BOX DRAWINGS LIGHT QUADRUPLE DASH VERTICAL;So;0;ON;;;;;N;FORMS LIGHT QUADRUPLE DASH VERTICAL;;;;
+250B;BOX DRAWINGS HEAVY QUADRUPLE DASH VERTICAL;So;0;ON;;;;;N;FORMS HEAVY QUADRUPLE DASH VERTICAL;;;;
+250C;BOX DRAWINGS LIGHT DOWN AND RIGHT;So;0;ON;;;;;N;FORMS LIGHT DOWN AND RIGHT;;;;
+250D;BOX DRAWINGS DOWN LIGHT AND RIGHT HEAVY;So;0;ON;;;;;N;FORMS DOWN LIGHT AND RIGHT HEAVY;;;;
+250E;BOX DRAWINGS DOWN HEAVY AND RIGHT LIGHT;So;0;ON;;;;;N;FORMS DOWN HEAVY AND RIGHT LIGHT;;;;
+250F;BOX DRAWINGS HEAVY DOWN AND RIGHT;So;0;ON;;;;;N;FORMS HEAVY DOWN AND RIGHT;;;;
+2510;BOX DRAWINGS LIGHT DOWN AND LEFT;So;0;ON;;;;;N;FORMS LIGHT DOWN AND LEFT;;;;
+2511;BOX DRAWINGS DOWN LIGHT AND LEFT HEAVY;So;0;ON;;;;;N;FORMS DOWN LIGHT AND LEFT HEAVY;;;;
+2512;BOX DRAWINGS DOWN HEAVY AND LEFT LIGHT;So;0;ON;;;;;N;FORMS DOWN HEAVY AND LEFT LIGHT;;;;
+2513;BOX DRAWINGS HEAVY DOWN AND LEFT;So;0;ON;;;;;N;FORMS HEAVY DOWN AND LEFT;;;;
+2514;BOX DRAWINGS LIGHT UP AND RIGHT;So;0;ON;;;;;N;FORMS LIGHT UP AND RIGHT;;;;
+2515;BOX DRAWINGS UP LIGHT AND RIGHT HEAVY;So;0;ON;;;;;N;FORMS UP LIGHT AND RIGHT HEAVY;;;;
+2516;BOX DRAWINGS UP HEAVY AND RIGHT LIGHT;So;0;ON;;;;;N;FORMS UP HEAVY AND RIGHT LIGHT;;;;
+2517;BOX DRAWINGS HEAVY UP AND RIGHT;So;0;ON;;;;;N;FORMS HEAVY UP AND RIGHT;;;;
+2518;BOX DRAWINGS LIGHT UP AND LEFT;So;0;ON;;;;;N;FORMS LIGHT UP AND LEFT;;;;
+2519;BOX DRAWINGS UP LIGHT AND LEFT HEAVY;So;0;ON;;;;;N;FORMS UP LIGHT AND LEFT HEAVY;;;;
+251A;BOX DRAWINGS UP HEAVY AND LEFT LIGHT;So;0;ON;;;;;N;FORMS UP HEAVY AND LEFT LIGHT;;;;
+251B;BOX DRAWINGS HEAVY UP AND LEFT;So;0;ON;;;;;N;FORMS HEAVY UP AND LEFT;;;;
+251C;BOX DRAWINGS LIGHT VERTICAL AND RIGHT;So;0;ON;;;;;N;FORMS LIGHT VERTICAL AND RIGHT;;;;
+251D;BOX DRAWINGS VERTICAL LIGHT AND RIGHT HEAVY;So;0;ON;;;;;N;FORMS VERTICAL LIGHT AND RIGHT HEAVY;;;;
+251E;BOX DRAWINGS UP HEAVY AND RIGHT DOWN LIGHT;So;0;ON;;;;;N;FORMS UP HEAVY AND RIGHT DOWN LIGHT;;;;
+251F;BOX DRAWINGS DOWN HEAVY AND RIGHT UP LIGHT;So;0;ON;;;;;N;FORMS DOWN HEAVY AND RIGHT UP LIGHT;;;;
+2520;BOX DRAWINGS VERTICAL HEAVY AND RIGHT LIGHT;So;0;ON;;;;;N;FORMS VERTICAL HEAVY AND RIGHT LIGHT;;;;
+2521;BOX DRAWINGS DOWN LIGHT AND RIGHT UP HEAVY;So;0;ON;;;;;N;FORMS DOWN LIGHT AND RIGHT UP HEAVY;;;;
+2522;BOX DRAWINGS UP LIGHT AND RIGHT DOWN HEAVY;So;0;ON;;;;;N;FORMS UP LIGHT AND RIGHT DOWN HEAVY;;;;
+2523;BOX DRAWINGS HEAVY VERTICAL AND RIGHT;So;0;ON;;;;;N;FORMS HEAVY VERTICAL AND RIGHT;;;;
+2524;BOX DRAWINGS LIGHT VERTICAL AND LEFT;So;0;ON;;;;;N;FORMS LIGHT VERTICAL AND LEFT;;;;
+2525;BOX DRAWINGS VERTICAL LIGHT AND LEFT HEAVY;So;0;ON;;;;;N;FORMS VERTICAL LIGHT AND LEFT HEAVY;;;;
+2526;BOX DRAWINGS UP HEAVY AND LEFT DOWN LIGHT;So;0;ON;;;;;N;FORMS UP HEAVY AND LEFT DOWN LIGHT;;;;
+2527;BOX DRAWINGS DOWN HEAVY AND LEFT UP LIGHT;So;0;ON;;;;;N;FORMS DOWN HEAVY AND LEFT UP LIGHT;;;;
+2528;BOX DRAWINGS VERTICAL HEAVY AND LEFT LIGHT;So;0;ON;;;;;N;FORMS VERTICAL HEAVY AND LEFT LIGHT;;;;
+2529;BOX DRAWINGS DOWN LIGHT AND LEFT UP HEAVY;So;0;ON;;;;;N;FORMS DOWN LIGHT AND LEFT UP HEAVY;;;;
+252A;BOX DRAWINGS UP LIGHT AND LEFT DOWN HEAVY;So;0;ON;;;;;N;FORMS UP LIGHT AND LEFT DOWN HEAVY;;;;
+252B;BOX DRAWINGS HEAVY VERTICAL AND LEFT;So;0;ON;;;;;N;FORMS HEAVY VERTICAL AND LEFT;;;;
+252C;BOX DRAWINGS LIGHT DOWN AND HORIZONTAL;So;0;ON;;;;;N;FORMS LIGHT DOWN AND HORIZONTAL;;;;
+252D;BOX DRAWINGS LEFT HEAVY AND RIGHT DOWN LIGHT;So;0;ON;;;;;N;FORMS LEFT HEAVY AND RIGHT DOWN LIGHT;;;;
+252E;BOX DRAWINGS RIGHT HEAVY AND LEFT DOWN LIGHT;So;0;ON;;;;;N;FORMS RIGHT HEAVY AND LEFT DOWN LIGHT;;;;
+252F;BOX DRAWINGS DOWN LIGHT AND HORIZONTAL HEAVY;So;0;ON;;;;;N;FORMS DOWN LIGHT AND HORIZONTAL HEAVY;;;;
+2530;BOX DRAWINGS DOWN HEAVY AND HORIZONTAL LIGHT;So;0;ON;;;;;N;FORMS DOWN HEAVY AND HORIZONTAL LIGHT;;;;
+2531;BOX DRAWINGS RIGHT LIGHT AND LEFT DOWN HEAVY;So;0;ON;;;;;N;FORMS RIGHT LIGHT AND LEFT DOWN HEAVY;;;;
+2532;BOX DRAWINGS LEFT LIGHT AND RIGHT DOWN HEAVY;So;0;ON;;;;;N;FORMS LEFT LIGHT AND RIGHT DOWN HEAVY;;;;
+2533;BOX DRAWINGS HEAVY DOWN AND HORIZONTAL;So;0;ON;;;;;N;FORMS HEAVY DOWN AND HORIZONTAL;;;;
+2534;BOX DRAWINGS LIGHT UP AND HORIZONTAL;So;0;ON;;;;;N;FORMS LIGHT UP AND HORIZONTAL;;;;
+2535;BOX DRAWINGS LEFT HEAVY AND RIGHT UP LIGHT;So;0;ON;;;;;N;FORMS LEFT HEAVY AND RIGHT UP LIGHT;;;;
+2536;BOX DRAWINGS RIGHT HEAVY AND LEFT UP LIGHT;So;0;ON;;;;;N;FORMS RIGHT HEAVY AND LEFT UP LIGHT;;;;
+2537;BOX DRAWINGS UP LIGHT AND HORIZONTAL HEAVY;So;0;ON;;;;;N;FORMS UP LIGHT AND HORIZONTAL HEAVY;;;;
+2538;BOX DRAWINGS UP HEAVY AND HORIZONTAL LIGHT;So;0;ON;;;;;N;FORMS UP HEAVY AND HORIZONTAL LIGHT;;;;
+2539;BOX DRAWINGS RIGHT LIGHT AND LEFT UP HEAVY;So;0;ON;;;;;N;FORMS RIGHT LIGHT AND LEFT UP HEAVY;;;;
+253A;BOX DRAWINGS LEFT LIGHT AND RIGHT UP HEAVY;So;0;ON;;;;;N;FORMS LEFT LIGHT AND RIGHT UP HEAVY;;;;
+253B;BOX DRAWINGS HEAVY UP AND HORIZONTAL;So;0;ON;;;;;N;FORMS HEAVY UP AND HORIZONTAL;;;;
+253C;BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL;So;0;ON;;;;;N;FORMS LIGHT VERTICAL AND HORIZONTAL;;;;
+253D;BOX DRAWINGS LEFT HEAVY AND RIGHT VERTICAL LIGHT;So;0;ON;;;;;N;FORMS LEFT HEAVY AND RIGHT VERTICAL LIGHT;;;;
+253E;BOX DRAWINGS RIGHT HEAVY AND LEFT VERTICAL LIGHT;So;0;ON;;;;;N;FORMS RIGHT HEAVY AND LEFT VERTICAL LIGHT;;;;
+253F;BOX DRAWINGS VERTICAL LIGHT AND HORIZONTAL HEAVY;So;0;ON;;;;;N;FORMS VERTICAL LIGHT AND HORIZONTAL HEAVY;;;;
+2540;BOX DRAWINGS UP HEAVY AND DOWN HORIZONTAL LIGHT;So;0;ON;;;;;N;FORMS UP HEAVY AND DOWN HORIZONTAL LIGHT;;;;
+2541;BOX DRAWINGS DOWN HEAVY AND UP HORIZONTAL LIGHT;So;0;ON;;;;;N;FORMS DOWN HEAVY AND UP HORIZONTAL LIGHT;;;;
+2542;BOX DRAWINGS VERTICAL HEAVY AND HORIZONTAL LIGHT;So;0;ON;;;;;N;FORMS VERTICAL HEAVY AND HORIZONTAL LIGHT;;;;
+2543;BOX DRAWINGS LEFT UP HEAVY AND RIGHT DOWN LIGHT;So;0;ON;;;;;N;FORMS LEFT UP HEAVY AND RIGHT DOWN LIGHT;;;;
+2544;BOX DRAWINGS RIGHT UP HEAVY AND LEFT DOWN LIGHT;So;0;ON;;;;;N;FORMS RIGHT UP HEAVY AND LEFT DOWN LIGHT;;;;
+2545;BOX DRAWINGS LEFT DOWN HEAVY AND RIGHT UP LIGHT;So;0;ON;;;;;N;FORMS LEFT DOWN HEAVY AND RIGHT UP LIGHT;;;;
+2546;BOX DRAWINGS RIGHT DOWN HEAVY AND LEFT UP LIGHT;So;0;ON;;;;;N;FORMS RIGHT DOWN HEAVY AND LEFT UP LIGHT;;;;
+2547;BOX DRAWINGS DOWN LIGHT AND UP HORIZONTAL HEAVY;So;0;ON;;;;;N;FORMS DOWN LIGHT AND UP HORIZONTAL HEAVY;;;;
+2548;BOX DRAWINGS UP LIGHT AND DOWN HORIZONTAL HEAVY;So;0;ON;;;;;N;FORMS UP LIGHT AND DOWN HORIZONTAL HEAVY;;;;
+2549;BOX DRAWINGS RIGHT LIGHT AND LEFT VERTICAL HEAVY;So;0;ON;;;;;N;FORMS RIGHT LIGHT AND LEFT VERTICAL HEAVY;;;;
+254A;BOX DRAWINGS LEFT LIGHT AND RIGHT VERTICAL HEAVY;So;0;ON;;;;;N;FORMS LEFT LIGHT AND RIGHT VERTICAL HEAVY;;;;
+254B;BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL;So;0;ON;;;;;N;FORMS HEAVY VERTICAL AND HORIZONTAL;;;;
+254C;BOX DRAWINGS LIGHT DOUBLE DASH HORIZONTAL;So;0;ON;;;;;N;FORMS LIGHT DOUBLE DASH HORIZONTAL;;;;
+254D;BOX DRAWINGS HEAVY DOUBLE DASH HORIZONTAL;So;0;ON;;;;;N;FORMS HEAVY DOUBLE DASH HORIZONTAL;;;;
+254E;BOX DRAWINGS LIGHT DOUBLE DASH VERTICAL;So;0;ON;;;;;N;FORMS LIGHT DOUBLE DASH VERTICAL;;;;
+254F;BOX DRAWINGS HEAVY DOUBLE DASH VERTICAL;So;0;ON;;;;;N;FORMS HEAVY DOUBLE DASH VERTICAL;;;;
+2550;BOX DRAWINGS DOUBLE HORIZONTAL;So;0;ON;;;;;N;FORMS DOUBLE HORIZONTAL;;;;
+2551;BOX DRAWINGS DOUBLE VERTICAL;So;0;ON;;;;;N;FORMS DOUBLE VERTICAL;;;;
+2552;BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE;So;0;ON;;;;;N;FORMS DOWN SINGLE AND RIGHT DOUBLE;;;;
+2553;BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE;So;0;ON;;;;;N;FORMS DOWN DOUBLE AND RIGHT SINGLE;;;;
+2554;BOX DRAWINGS DOUBLE DOWN AND RIGHT;So;0;ON;;;;;N;FORMS DOUBLE DOWN AND RIGHT;;;;
+2555;BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE;So;0;ON;;;;;N;FORMS DOWN SINGLE AND LEFT DOUBLE;;;;
+2556;BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE;So;0;ON;;;;;N;FORMS DOWN DOUBLE AND LEFT SINGLE;;;;
+2557;BOX DRAWINGS DOUBLE DOWN AND LEFT;So;0;ON;;;;;N;FORMS DOUBLE DOWN AND LEFT;;;;
+2558;BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE;So;0;ON;;;;;N;FORMS UP SINGLE AND RIGHT DOUBLE;;;;
+2559;BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE;So;0;ON;;;;;N;FORMS UP DOUBLE AND RIGHT SINGLE;;;;
+255A;BOX DRAWINGS DOUBLE UP AND RIGHT;So;0;ON;;;;;N;FORMS DOUBLE UP AND RIGHT;;;;
+255B;BOX DRAWINGS UP SINGLE AND LEFT DOUBLE;So;0;ON;;;;;N;FORMS UP SINGLE AND LEFT DOUBLE;;;;
+255C;BOX DRAWINGS UP DOUBLE AND LEFT SINGLE;So;0;ON;;;;;N;FORMS UP DOUBLE AND LEFT SINGLE;;;;
+255D;BOX DRAWINGS DOUBLE UP AND LEFT;So;0;ON;;;;;N;FORMS DOUBLE UP AND LEFT;;;;
+255E;BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE;So;0;ON;;;;;N;FORMS VERTICAL SINGLE AND RIGHT DOUBLE;;;;
+255F;BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE;So;0;ON;;;;;N;FORMS VERTICAL DOUBLE AND RIGHT SINGLE;;;;
+2560;BOX DRAWINGS DOUBLE VERTICAL AND RIGHT;So;0;ON;;;;;N;FORMS DOUBLE VERTICAL AND RIGHT;;;;
+2561;BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE;So;0;ON;;;;;N;FORMS VERTICAL SINGLE AND LEFT DOUBLE;;;;
+2562;BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE;So;0;ON;;;;;N;FORMS VERTICAL DOUBLE AND LEFT SINGLE;;;;
+2563;BOX DRAWINGS DOUBLE VERTICAL AND LEFT;So;0;ON;;;;;N;FORMS DOUBLE VERTICAL AND LEFT;;;;
+2564;BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE;So;0;ON;;;;;N;FORMS DOWN SINGLE AND HORIZONTAL DOUBLE;;;;
+2565;BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE;So;0;ON;;;;;N;FORMS DOWN DOUBLE AND HORIZONTAL SINGLE;;;;
+2566;BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL;So;0;ON;;;;;N;FORMS DOUBLE DOWN AND HORIZONTAL;;;;
+2567;BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE;So;0;ON;;;;;N;FORMS UP SINGLE AND HORIZONTAL DOUBLE;;;;
+2568;BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE;So;0;ON;;;;;N;FORMS UP DOUBLE AND HORIZONTAL SINGLE;;;;
+2569;BOX DRAWINGS DOUBLE UP AND HORIZONTAL;So;0;ON;;;;;N;FORMS DOUBLE UP AND HORIZONTAL;;;;
+256A;BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE;So;0;ON;;;;;N;FORMS VERTICAL SINGLE AND HORIZONTAL DOUBLE;;;;
+256B;BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE;So;0;ON;;;;;N;FORMS VERTICAL DOUBLE AND HORIZONTAL SINGLE;;;;
+256C;BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL;So;0;ON;;;;;N;FORMS DOUBLE VERTICAL AND HORIZONTAL;;;;
+256D;BOX DRAWINGS LIGHT ARC DOWN AND RIGHT;So;0;ON;;;;;N;FORMS LIGHT ARC DOWN AND RIGHT;;;;
+256E;BOX DRAWINGS LIGHT ARC DOWN AND LEFT;So;0;ON;;;;;N;FORMS LIGHT ARC DOWN AND LEFT;;;;
+256F;BOX DRAWINGS LIGHT ARC UP AND LEFT;So;0;ON;;;;;N;FORMS LIGHT ARC UP AND LEFT;;;;
+2570;BOX DRAWINGS LIGHT ARC UP AND RIGHT;So;0;ON;;;;;N;FORMS LIGHT ARC UP AND RIGHT;;;;
+2571;BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT;So;0;ON;;;;;N;FORMS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT;;;;
+2572;BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO LOWER RIGHT;So;0;ON;;;;;N;FORMS LIGHT DIAGONAL UPPER LEFT TO LOWER RIGHT;;;;
+2573;BOX DRAWINGS LIGHT DIAGONAL CROSS;So;0;ON;;;;;N;FORMS LIGHT DIAGONAL CROSS;;;;
+2574;BOX DRAWINGS LIGHT LEFT;So;0;ON;;;;;N;FORMS LIGHT LEFT;;;;
+2575;BOX DRAWINGS LIGHT UP;So;0;ON;;;;;N;FORMS LIGHT UP;;;;
+2576;BOX DRAWINGS LIGHT RIGHT;So;0;ON;;;;;N;FORMS LIGHT RIGHT;;;;
+2577;BOX DRAWINGS LIGHT DOWN;So;0;ON;;;;;N;FORMS LIGHT DOWN;;;;
+2578;BOX DRAWINGS HEAVY LEFT;So;0;ON;;;;;N;FORMS HEAVY LEFT;;;;
+2579;BOX DRAWINGS HEAVY UP;So;0;ON;;;;;N;FORMS HEAVY UP;;;;
+257A;BOX DRAWINGS HEAVY RIGHT;So;0;ON;;;;;N;FORMS HEAVY RIGHT;;;;
+257B;BOX DRAWINGS HEAVY DOWN;So;0;ON;;;;;N;FORMS HEAVY DOWN;;;;
+257C;BOX DRAWINGS LIGHT LEFT AND HEAVY RIGHT;So;0;ON;;;;;N;FORMS LIGHT LEFT AND HEAVY RIGHT;;;;
+257D;BOX DRAWINGS LIGHT UP AND HEAVY DOWN;So;0;ON;;;;;N;FORMS LIGHT UP AND HEAVY DOWN;;;;
+257E;BOX DRAWINGS HEAVY LEFT AND LIGHT RIGHT;So;0;ON;;;;;N;FORMS HEAVY LEFT AND LIGHT RIGHT;;;;
+257F;BOX DRAWINGS HEAVY UP AND LIGHT DOWN;So;0;ON;;;;;N;FORMS HEAVY UP AND LIGHT DOWN;;;;
+2580;UPPER HALF BLOCK;So;0;ON;;;;;N;;;;;
+2581;LOWER ONE EIGHTH BLOCK;So;0;ON;;;;;N;;;;;
+2582;LOWER ONE QUARTER BLOCK;So;0;ON;;;;;N;;;;;
+2583;LOWER THREE EIGHTHS BLOCK;So;0;ON;;;;;N;;;;;
+2584;LOWER HALF BLOCK;So;0;ON;;;;;N;;;;;
+2585;LOWER FIVE EIGHTHS BLOCK;So;0;ON;;;;;N;;;;;
+2586;LOWER THREE QUARTERS BLOCK;So;0;ON;;;;;N;LOWER THREE QUARTER BLOCK;;;;
+2587;LOWER SEVEN EIGHTHS BLOCK;So;0;ON;;;;;N;;;;;
+2588;FULL BLOCK;So;0;ON;;;;;N;;;;;
+2589;LEFT SEVEN EIGHTHS BLOCK;So;0;ON;;;;;N;;;;;
+258A;LEFT THREE QUARTERS BLOCK;So;0;ON;;;;;N;LEFT THREE QUARTER BLOCK;;;;
+258B;LEFT FIVE EIGHTHS BLOCK;So;0;ON;;;;;N;;;;;
+258C;LEFT HALF BLOCK;So;0;ON;;;;;N;;;;;
+258D;LEFT THREE EIGHTHS BLOCK;So;0;ON;;;;;N;;;;;
+258E;LEFT ONE QUARTER BLOCK;So;0;ON;;;;;N;;;;;
+258F;LEFT ONE EIGHTH BLOCK;So;0;ON;;;;;N;;;;;
+2590;RIGHT HALF BLOCK;So;0;ON;;;;;N;;;;;
+2591;LIGHT SHADE;So;0;ON;;;;;N;;;;;
+2592;MEDIUM SHADE;So;0;ON;;;;;N;;;;;
+2593;DARK SHADE;So;0;ON;;;;;N;;;;;
+2594;UPPER ONE EIGHTH BLOCK;So;0;ON;;;;;N;;;;;
+2595;RIGHT ONE EIGHTH BLOCK;So;0;ON;;;;;N;;;;;
+25A0;BLACK SQUARE;So;0;ON;;;;;N;;;;;
+25A1;WHITE SQUARE;So;0;ON;;;;;N;;;;;
+25A2;WHITE SQUARE WITH ROUNDED CORNERS;So;0;ON;;;;;N;;;;;
+25A3;WHITE SQUARE CONTAINING BLACK SMALL SQUARE;So;0;ON;;;;;N;;;;;
+25A4;SQUARE WITH HORIZONTAL FILL;So;0;ON;;;;;N;;;;;
+25A5;SQUARE WITH VERTICAL FILL;So;0;ON;;;;;N;;;;;
+25A6;SQUARE WITH ORTHOGONAL CROSSHATCH FILL;So;0;ON;;;;;N;;;;;
+25A7;SQUARE WITH UPPER LEFT TO LOWER RIGHT FILL;So;0;ON;;;;;N;;;;;
+25A8;SQUARE WITH UPPER RIGHT TO LOWER LEFT FILL;So;0;ON;;;;;N;;;;;
+25A9;SQUARE WITH DIAGONAL CROSSHATCH FILL;So;0;ON;;;;;N;;;;;
+25AA;BLACK SMALL SQUARE;So;0;ON;;;;;N;;;;;
+25AB;WHITE SMALL SQUARE;So;0;ON;;;;;N;;;;;
+25AC;BLACK RECTANGLE;So;0;ON;;;;;N;;;;;
+25AD;WHITE RECTANGLE;So;0;ON;;;;;N;;;;;
+25AE;BLACK VERTICAL RECTANGLE;So;0;ON;;;;;N;;;;;
+25AF;WHITE VERTICAL RECTANGLE;So;0;ON;;;;;N;;;;;
+25B0;BLACK PARALLELOGRAM;So;0;ON;;;;;N;;;;;
+25B1;WHITE PARALLELOGRAM;So;0;ON;;;;;N;;;;;
+25B2;BLACK UP-POINTING TRIANGLE;So;0;ON;;;;;N;BLACK UP POINTING TRIANGLE;;;;
+25B3;WHITE UP-POINTING TRIANGLE;So;0;ON;;;;;N;WHITE UP POINTING TRIANGLE;;;;
+25B4;BLACK UP-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;BLACK UP POINTING SMALL TRIANGLE;;;;
+25B5;WHITE UP-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;WHITE UP POINTING SMALL TRIANGLE;;;;
+25B6;BLACK RIGHT-POINTING TRIANGLE;So;0;ON;;;;;N;BLACK RIGHT POINTING TRIANGLE;;;;
+25B7;WHITE RIGHT-POINTING TRIANGLE;Sm;0;ON;;;;;N;WHITE RIGHT POINTING TRIANGLE;;;;
+25B8;BLACK RIGHT-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;BLACK RIGHT POINTING SMALL TRIANGLE;;;;
+25B9;WHITE RIGHT-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;WHITE RIGHT POINTING SMALL TRIANGLE;;;;
+25BA;BLACK RIGHT-POINTING POINTER;So;0;ON;;;;;N;BLACK RIGHT POINTING POINTER;;;;
+25BB;WHITE RIGHT-POINTING POINTER;So;0;ON;;;;;N;WHITE RIGHT POINTING POINTER;;;;
+25BC;BLACK DOWN-POINTING TRIANGLE;So;0;ON;;;;;N;BLACK DOWN POINTING TRIANGLE;;;;
+25BD;WHITE DOWN-POINTING TRIANGLE;So;0;ON;;;;;N;WHITE DOWN POINTING TRIANGLE;;;;
+25BE;BLACK DOWN-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;BLACK DOWN POINTING SMALL TRIANGLE;;;;
+25BF;WHITE DOWN-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;WHITE DOWN POINTING SMALL TRIANGLE;;;;
+25C0;BLACK LEFT-POINTING TRIANGLE;So;0;ON;;;;;N;BLACK LEFT POINTING TRIANGLE;;;;
+25C1;WHITE LEFT-POINTING TRIANGLE;Sm;0;ON;;;;;N;WHITE LEFT POINTING TRIANGLE;;;;
+25C2;BLACK LEFT-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;BLACK LEFT POINTING SMALL TRIANGLE;;;;
+25C3;WHITE LEFT-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;WHITE LEFT POINTING SMALL TRIANGLE;;;;
+25C4;BLACK LEFT-POINTING POINTER;So;0;ON;;;;;N;BLACK LEFT POINTING POINTER;;;;
+25C5;WHITE LEFT-POINTING POINTER;So;0;ON;;;;;N;WHITE LEFT POINTING POINTER;;;;
+25C6;BLACK DIAMOND;So;0;ON;;;;;N;;;;;
+25C7;WHITE DIAMOND;So;0;ON;;;;;N;;;;;
+25C8;WHITE DIAMOND CONTAINING BLACK SMALL DIAMOND;So;0;ON;;;;;N;;;;;
+25C9;FISHEYE;So;0;ON;;;;;N;;;;;
+25CA;LOZENGE;So;0;ON;;;;;N;;;;;
+25CB;WHITE CIRCLE;So;0;ON;;;;;N;;;;;
+25CC;DOTTED CIRCLE;So;0;ON;;;;;N;;;;;
+25CD;CIRCLE WITH VERTICAL FILL;So;0;ON;;;;;N;;;;;
+25CE;BULLSEYE;So;0;ON;;;;;N;;;;;
+25CF;BLACK CIRCLE;So;0;ON;;;;;N;;;;;
+25D0;CIRCLE WITH LEFT HALF BLACK;So;0;ON;;;;;N;;;;;
+25D1;CIRCLE WITH RIGHT HALF BLACK;So;0;ON;;;;;N;;;;;
+25D2;CIRCLE WITH LOWER HALF BLACK;So;0;ON;;;;;N;;;;;
+25D3;CIRCLE WITH UPPER HALF BLACK;So;0;ON;;;;;N;;;;;
+25D4;CIRCLE WITH UPPER RIGHT QUADRANT BLACK;So;0;ON;;;;;N;;;;;
+25D5;CIRCLE WITH ALL BUT UPPER LEFT QUADRANT BLACK;So;0;ON;;;;;N;;;;;
+25D6;LEFT HALF BLACK CIRCLE;So;0;ON;;;;;N;;;;;
+25D7;RIGHT HALF BLACK CIRCLE;So;0;ON;;;;;N;;;;;
+25D8;INVERSE BULLET;So;0;ON;;;;;N;;;;;
+25D9;INVERSE WHITE CIRCLE;So;0;ON;;;;;N;;;;;
+25DA;UPPER HALF INVERSE WHITE CIRCLE;So;0;ON;;;;;N;;;;;
+25DB;LOWER HALF INVERSE WHITE CIRCLE;So;0;ON;;;;;N;;;;;
+25DC;UPPER LEFT QUADRANT CIRCULAR ARC;So;0;ON;;;;;N;;;;;
+25DD;UPPER RIGHT QUADRANT CIRCULAR ARC;So;0;ON;;;;;N;;;;;
+25DE;LOWER RIGHT QUADRANT CIRCULAR ARC;So;0;ON;;;;;N;;;;;
+25DF;LOWER LEFT QUADRANT CIRCULAR ARC;So;0;ON;;;;;N;;;;;
+25E0;UPPER HALF CIRCLE;So;0;ON;;;;;N;;;;;
+25E1;LOWER HALF CIRCLE;So;0;ON;;;;;N;;;;;
+25E2;BLACK LOWER RIGHT TRIANGLE;So;0;ON;;;;;N;;;;;
+25E3;BLACK LOWER LEFT TRIANGLE;So;0;ON;;;;;N;;;;;
+25E4;BLACK UPPER LEFT TRIANGLE;So;0;ON;;;;;N;;;;;
+25E5;BLACK UPPER RIGHT TRIANGLE;So;0;ON;;;;;N;;;;;
+25E6;WHITE BULLET;So;0;ON;;;;;N;;;;;
+25E7;SQUARE WITH LEFT HALF BLACK;So;0;ON;;;;;N;;;;;
+25E8;SQUARE WITH RIGHT HALF BLACK;So;0;ON;;;;;N;;;;;
+25E9;SQUARE WITH UPPER LEFT DIAGONAL HALF BLACK;So;0;ON;;;;;N;;;;;
+25EA;SQUARE WITH LOWER RIGHT DIAGONAL HALF BLACK;So;0;ON;;;;;N;;;;;
+25EB;WHITE SQUARE WITH VERTICAL BISECTING LINE;So;0;ON;;;;;N;;;;;
+25EC;WHITE UP-POINTING TRIANGLE WITH DOT;So;0;ON;;;;;N;WHITE UP POINTING TRIANGLE WITH DOT;;;;
+25ED;UP-POINTING TRIANGLE WITH LEFT HALF BLACK;So;0;ON;;;;;N;UP POINTING TRIANGLE WITH LEFT HALF BLACK;;;;
+25EE;UP-POINTING TRIANGLE WITH RIGHT HALF BLACK;So;0;ON;;;;;N;UP POINTING TRIANGLE WITH RIGHT HALF BLACK;;;;
+25EF;LARGE CIRCLE;So;0;ON;;;;;N;;;;;
+25F0;WHITE SQUARE WITH UPPER LEFT QUADRANT;So;0;ON;;;;;N;;;;;
+25F1;WHITE SQUARE WITH LOWER LEFT QUADRANT;So;0;ON;;;;;N;;;;;
+25F2;WHITE SQUARE WITH LOWER RIGHT QUADRANT;So;0;ON;;;;;N;;;;;
+25F3;WHITE SQUARE WITH UPPER RIGHT QUADRANT;So;0;ON;;;;;N;;;;;
+25F4;WHITE CIRCLE WITH UPPER LEFT QUADRANT;So;0;ON;;;;;N;;;;;
+25F5;WHITE CIRCLE WITH LOWER LEFT QUADRANT;So;0;ON;;;;;N;;;;;
+25F6;WHITE CIRCLE WITH LOWER RIGHT QUADRANT;So;0;ON;;;;;N;;;;;
+25F7;WHITE CIRCLE WITH UPPER RIGHT QUADRANT;So;0;ON;;;;;N;;;;;
+2600;BLACK SUN WITH RAYS;So;0;ON;;;;;N;;;;;
+2601;CLOUD;So;0;ON;;;;;N;;;;;
+2602;UMBRELLA;So;0;ON;;;;;N;;;;;
+2603;SNOWMAN;So;0;ON;;;;;N;;;;;
+2604;COMET;So;0;ON;;;;;N;;;;;
+2605;BLACK STAR;So;0;ON;;;;;N;;;;;
+2606;WHITE STAR;So;0;ON;;;;;N;;;;;
+2607;LIGHTNING;So;0;ON;;;;;N;;;;;
+2608;THUNDERSTORM;So;0;ON;;;;;N;;;;;
+2609;SUN;So;0;ON;;;;;N;;;;;
+260A;ASCENDING NODE;So;0;ON;;;;;N;;;;;
+260B;DESCENDING NODE;So;0;ON;;;;;N;;;;;
+260C;CONJUNCTION;So;0;ON;;;;;N;;;;;
+260D;OPPOSITION;So;0;ON;;;;;N;;;;;
+260E;BLACK TELEPHONE;So;0;ON;;;;;N;;;;;
+260F;WHITE TELEPHONE;So;0;ON;;;;;N;;;;;
+2610;BALLOT BOX;So;0;ON;;;;;N;;;;;
+2611;BALLOT BOX WITH CHECK;So;0;ON;;;;;N;;;;;
+2612;BALLOT BOX WITH X;So;0;ON;;;;;N;;;;;
+2613;SALTIRE;So;0;ON;;;;;N;;;;;
+2619;REVERSED ROTATED FLORAL HEART BULLET;So;0;ON;;;;;N;;;;;
+261A;BLACK LEFT POINTING INDEX;So;0;ON;;;;;N;;;;;
+261B;BLACK RIGHT POINTING INDEX;So;0;ON;;;;;N;;;;;
+261C;WHITE LEFT POINTING INDEX;So;0;ON;;;;;N;;;;;
+261D;WHITE UP POINTING INDEX;So;0;ON;;;;;N;;;;;
+261E;WHITE RIGHT POINTING INDEX;So;0;ON;;;;;N;;;;;
+261F;WHITE DOWN POINTING INDEX;So;0;ON;;;;;N;;;;;
+2620;SKULL AND CROSSBONES;So;0;ON;;;;;N;;;;;
+2621;CAUTION SIGN;So;0;ON;;;;;N;;;;;
+2622;RADIOACTIVE SIGN;So;0;ON;;;;;N;;;;;
+2623;BIOHAZARD SIGN;So;0;ON;;;;;N;;;;;
+2624;CADUCEUS;So;0;ON;;;;;N;;;;;
+2625;ANKH;So;0;ON;;;;;N;;;;;
+2626;ORTHODOX CROSS;So;0;ON;;;;;N;;;;;
+2627;CHI RHO;So;0;ON;;;;;N;;;;;
+2628;CROSS OF LORRAINE;So;0;ON;;;;;N;;;;;
+2629;CROSS OF JERUSALEM;So;0;ON;;;;;N;;;;;
+262A;STAR AND CRESCENT;So;0;ON;;;;;N;;;;;
+262B;FARSI SYMBOL;So;0;ON;;;;;N;SYMBOL OF IRAN;;;;
+262C;ADI SHAKTI;So;0;ON;;;;;N;;;;;
+262D;HAMMER AND SICKLE;So;0;ON;;;;;N;;;;;
+262E;PEACE SYMBOL;So;0;ON;;;;;N;;;;;
+262F;YIN YANG;So;0;ON;;;;;N;;;;;
+2630;TRIGRAM FOR HEAVEN;So;0;ON;;;;;N;;;;;
+2631;TRIGRAM FOR LAKE;So;0;ON;;;;;N;;;;;
+2632;TRIGRAM FOR FIRE;So;0;ON;;;;;N;;;;;
+2633;TRIGRAM FOR THUNDER;So;0;ON;;;;;N;;;;;
+2634;TRIGRAM FOR WIND;So;0;ON;;;;;N;;;;;
+2635;TRIGRAM FOR WATER;So;0;ON;;;;;N;;;;;
+2636;TRIGRAM FOR MOUNTAIN;So;0;ON;;;;;N;;;;;
+2637;TRIGRAM FOR EARTH;So;0;ON;;;;;N;;;;;
+2638;WHEEL OF DHARMA;So;0;ON;;;;;N;;;;;
+2639;WHITE FROWNING FACE;So;0;ON;;;;;N;;;;;
+263A;WHITE SMILING FACE;So;0;ON;;;;;N;;;;;
+263B;BLACK SMILING FACE;So;0;ON;;;;;N;;;;;
+263C;WHITE SUN WITH RAYS;So;0;ON;;;;;N;;;;;
+263D;FIRST QUARTER MOON;So;0;ON;;;;;N;;;;;
+263E;LAST QUARTER MOON;So;0;ON;;;;;N;;;;;
+263F;MERCURY;So;0;ON;;;;;N;;;;;
+2640;FEMALE SIGN;So;0;ON;;;;;N;;;;;
+2641;EARTH;So;0;ON;;;;;N;;;;;
+2642;MALE SIGN;So;0;ON;;;;;N;;;;;
+2643;JUPITER;So;0;ON;;;;;N;;;;;
+2644;SATURN;So;0;ON;;;;;N;;;;;
+2645;URANUS;So;0;ON;;;;;N;;;;;
+2646;NEPTUNE;So;0;ON;;;;;N;;;;;
+2647;PLUTO;So;0;ON;;;;;N;;;;;
+2648;ARIES;So;0;ON;;;;;N;;;;;
+2649;TAURUS;So;0;ON;;;;;N;;;;;
+264A;GEMINI;So;0;ON;;;;;N;;;;;
+264B;CANCER;So;0;ON;;;;;N;;;;;
+264C;LEO;So;0;ON;;;;;N;;;;;
+264D;VIRGO;So;0;ON;;;;;N;;;;;
+264E;LIBRA;So;0;ON;;;;;N;;;;;
+264F;SCORPIUS;So;0;ON;;;;;N;;;;;
+2650;SAGITTARIUS;So;0;ON;;;;;N;;;;;
+2651;CAPRICORN;So;0;ON;;;;;N;;;;;
+2652;AQUARIUS;So;0;ON;;;;;N;;;;;
+2653;PISCES;So;0;ON;;;;;N;;;;;
+2654;WHITE CHESS KING;So;0;ON;;;;;N;;;;;
+2655;WHITE CHESS QUEEN;So;0;ON;;;;;N;;;;;
+2656;WHITE CHESS ROOK;So;0;ON;;;;;N;;;;;
+2657;WHITE CHESS BISHOP;So;0;ON;;;;;N;;;;;
+2658;WHITE CHESS KNIGHT;So;0;ON;;;;;N;;;;;
+2659;WHITE CHESS PAWN;So;0;ON;;;;;N;;;;;
+265A;BLACK CHESS KING;So;0;ON;;;;;N;;;;;
+265B;BLACK CHESS QUEEN;So;0;ON;;;;;N;;;;;
+265C;BLACK CHESS ROOK;So;0;ON;;;;;N;;;;;
+265D;BLACK CHESS BISHOP;So;0;ON;;;;;N;;;;;
+265E;BLACK CHESS KNIGHT;So;0;ON;;;;;N;;;;;
+265F;BLACK CHESS PAWN;So;0;ON;;;;;N;;;;;
+2660;BLACK SPADE SUIT;So;0;ON;;;;;N;;;;;
+2661;WHITE HEART SUIT;So;0;ON;;;;;N;;;;;
+2662;WHITE DIAMOND SUIT;So;0;ON;;;;;N;;;;;
+2663;BLACK CLUB SUIT;So;0;ON;;;;;N;;;;;
+2664;WHITE SPADE SUIT;So;0;ON;;;;;N;;;;;
+2665;BLACK HEART SUIT;So;0;ON;;;;;N;;;;;
+2666;BLACK DIAMOND SUIT;So;0;ON;;;;;N;;;;;
+2667;WHITE CLUB SUIT;So;0;ON;;;;;N;;;;;
+2668;HOT SPRINGS;So;0;ON;;;;;N;;;;;
+2669;QUARTER NOTE;So;0;ON;;;;;N;;;;;
+266A;EIGHTH NOTE;So;0;ON;;;;;N;;;;;
+266B;BEAMED EIGHTH NOTES;So;0;ON;;;;;N;BARRED EIGHTH NOTES;;;;
+266C;BEAMED SIXTEENTH NOTES;So;0;ON;;;;;N;BARRED SIXTEENTH NOTES;;;;
+266D;MUSIC FLAT SIGN;So;0;ON;;;;;N;FLAT;;;;
+266E;MUSIC NATURAL SIGN;So;0;ON;;;;;N;NATURAL;;;;
+266F;MUSIC SHARP SIGN;Sm;0;ON;;;;;N;SHARP;;;;
+2670;WEST SYRIAC CROSS;So;0;ON;;;;;N;;;;;
+2671;EAST SYRIAC CROSS;So;0;ON;;;;;N;;;;;
+2701;UPPER BLADE SCISSORS;So;0;ON;;;;;N;;;;;
+2702;BLACK SCISSORS;So;0;ON;;;;;N;;;;;
+2703;LOWER BLADE SCISSORS;So;0;ON;;;;;N;;;;;
+2704;WHITE SCISSORS;So;0;ON;;;;;N;;;;;
+2706;TELEPHONE LOCATION SIGN;So;0;ON;;;;;N;;;;;
+2707;TAPE DRIVE;So;0;ON;;;;;N;;;;;
+2708;AIRPLANE;So;0;ON;;;;;N;;;;;
+2709;ENVELOPE;So;0;ON;;;;;N;;;;;
+270C;VICTORY HAND;So;0;ON;;;;;N;;;;;
+270D;WRITING HAND;So;0;ON;;;;;N;;;;;
+270E;LOWER RIGHT PENCIL;So;0;ON;;;;;N;;;;;
+270F;PENCIL;So;0;ON;;;;;N;;;;;
+2710;UPPER RIGHT PENCIL;So;0;ON;;;;;N;;;;;
+2711;WHITE NIB;So;0;ON;;;;;N;;;;;
+2712;BLACK NIB;So;0;ON;;;;;N;;;;;
+2713;CHECK MARK;So;0;ON;;;;;N;;;;;
+2714;HEAVY CHECK MARK;So;0;ON;;;;;N;;;;;
+2715;MULTIPLICATION X;So;0;ON;;;;;N;;;;;
+2716;HEAVY MULTIPLICATION X;So;0;ON;;;;;N;;;;;
+2717;BALLOT X;So;0;ON;;;;;N;;;;;
+2718;HEAVY BALLOT X;So;0;ON;;;;;N;;;;;
+2719;OUTLINED GREEK CROSS;So;0;ON;;;;;N;;;;;
+271A;HEAVY GREEK CROSS;So;0;ON;;;;;N;;;;;
+271B;OPEN CENTRE CROSS;So;0;ON;;;;;N;OPEN CENTER CROSS;;;;
+271C;HEAVY OPEN CENTRE CROSS;So;0;ON;;;;;N;HEAVY OPEN CENTER CROSS;;;;
+271D;LATIN CROSS;So;0;ON;;;;;N;;;;;
+271E;SHADOWED WHITE LATIN CROSS;So;0;ON;;;;;N;;;;;
+271F;OUTLINED LATIN CROSS;So;0;ON;;;;;N;;;;;
+2720;MALTESE CROSS;So;0;ON;;;;;N;;;;;
+2721;STAR OF DAVID;So;0;ON;;;;;N;;;;;
+2722;FOUR TEARDROP-SPOKED ASTERISK;So;0;ON;;;;;N;;;;;
+2723;FOUR BALLOON-SPOKED ASTERISK;So;0;ON;;;;;N;;;;;
+2724;HEAVY FOUR BALLOON-SPOKED ASTERISK;So;0;ON;;;;;N;;;;;
+2725;FOUR CLUB-SPOKED ASTERISK;So;0;ON;;;;;N;;;;;
+2726;BLACK FOUR POINTED STAR;So;0;ON;;;;;N;;;;;
+2727;WHITE FOUR POINTED STAR;So;0;ON;;;;;N;;;;;
+2729;STRESS OUTLINED WHITE STAR;So;0;ON;;;;;N;;;;;
+272A;CIRCLED WHITE STAR;So;0;ON;;;;;N;;;;;
+272B;OPEN CENTRE BLACK STAR;So;0;ON;;;;;N;OPEN CENTER BLACK STAR;;;;
+272C;BLACK CENTRE WHITE STAR;So;0;ON;;;;;N;BLACK CENTER WHITE STAR;;;;
+272D;OUTLINED BLACK STAR;So;0;ON;;;;;N;;;;;
+272E;HEAVY OUTLINED BLACK STAR;So;0;ON;;;;;N;;;;;
+272F;PINWHEEL STAR;So;0;ON;;;;;N;;;;;
+2730;SHADOWED WHITE STAR;So;0;ON;;;;;N;;;;;
+2731;HEAVY ASTERISK;So;0;ON;;;;;N;;;;;
+2732;OPEN CENTRE ASTERISK;So;0;ON;;;;;N;OPEN CENTER ASTERISK;;;;
+2733;EIGHT SPOKED ASTERISK;So;0;ON;;;;;N;;;;;
+2734;EIGHT POINTED BLACK STAR;So;0;ON;;;;;N;;;;;
+2735;EIGHT POINTED PINWHEEL STAR;So;0;ON;;;;;N;;;;;
+2736;SIX POINTED BLACK STAR;So;0;ON;;;;;N;;;;;
+2737;EIGHT POINTED RECTILINEAR BLACK STAR;So;0;ON;;;;;N;;;;;
+2738;HEAVY EIGHT POINTED RECTILINEAR BLACK STAR;So;0;ON;;;;;N;;;;;
+2739;TWELVE POINTED BLACK STAR;So;0;ON;;;;;N;;;;;
+273A;SIXTEEN POINTED ASTERISK;So;0;ON;;;;;N;;;;;
+273B;TEARDROP-SPOKED ASTERISK;So;0;ON;;;;;N;;;;;
+273C;OPEN CENTRE TEARDROP-SPOKED ASTERISK;So;0;ON;;;;;N;OPEN CENTER TEARDROP-SPOKED ASTERISK;;;;
+273D;HEAVY TEARDROP-SPOKED ASTERISK;So;0;ON;;;;;N;;;;;
+273E;SIX PETALLED BLACK AND WHITE FLORETTE;So;0;ON;;;;;N;;;;;
+273F;BLACK FLORETTE;So;0;ON;;;;;N;;;;;
+2740;WHITE FLORETTE;So;0;ON;;;;;N;;;;;
+2741;EIGHT PETALLED OUTLINED BLACK FLORETTE;So;0;ON;;;;;N;;;;;
+2742;CIRCLED OPEN CENTRE EIGHT POINTED STAR;So;0;ON;;;;;N;CIRCLED OPEN CENTER EIGHT POINTED STAR;;;;
+2743;HEAVY TEARDROP-SPOKED PINWHEEL ASTERISK;So;0;ON;;;;;N;;;;;
+2744;SNOWFLAKE;So;0;ON;;;;;N;;;;;
+2745;TIGHT TRIFOLIATE SNOWFLAKE;So;0;ON;;;;;N;;;;;
+2746;HEAVY CHEVRON SNOWFLAKE;So;0;ON;;;;;N;;;;;
+2747;SPARKLE;So;0;ON;;;;;N;;;;;
+2748;HEAVY SPARKLE;So;0;ON;;;;;N;;;;;
+2749;BALLOON-SPOKED ASTERISK;So;0;ON;;;;;N;;;;;
+274A;EIGHT TEARDROP-SPOKED PROPELLER ASTERISK;So;0;ON;;;;;N;;;;;
+274B;HEAVY EIGHT TEARDROP-SPOKED PROPELLER ASTERISK;So;0;ON;;;;;N;;;;;
+274D;SHADOWED WHITE CIRCLE;So;0;ON;;;;;N;;;;;
+274F;LOWER RIGHT DROP-SHADOWED WHITE SQUARE;So;0;ON;;;;;N;;;;;
+2750;UPPER RIGHT DROP-SHADOWED WHITE SQUARE;So;0;ON;;;;;N;;;;;
+2751;LOWER RIGHT SHADOWED WHITE SQUARE;So;0;ON;;;;;N;;;;;
+2752;UPPER RIGHT SHADOWED WHITE SQUARE;So;0;ON;;;;;N;;;;;
+2756;BLACK DIAMOND MINUS WHITE X;So;0;ON;;;;;N;;;;;
+2758;LIGHT VERTICAL BAR;So;0;ON;;;;;N;;;;;
+2759;MEDIUM VERTICAL BAR;So;0;ON;;;;;N;;;;;
+275A;HEAVY VERTICAL BAR;So;0;ON;;;;;N;;;;;
+275B;HEAVY SINGLE TURNED COMMA QUOTATION MARK ORNAMENT;So;0;ON;;;;;N;;;;;
+275C;HEAVY SINGLE COMMA QUOTATION MARK ORNAMENT;So;0;ON;;;;;N;;;;;
+275D;HEAVY DOUBLE TURNED COMMA QUOTATION MARK ORNAMENT;So;0;ON;;;;;N;;;;;
+275E;HEAVY DOUBLE COMMA QUOTATION MARK ORNAMENT;So;0;ON;;;;;N;;;;;
+2761;CURVED STEM PARAGRAPH SIGN ORNAMENT;So;0;ON;;;;;N;;;;;
+2762;HEAVY EXCLAMATION MARK ORNAMENT;So;0;ON;;;;;N;;;;;
+2763;HEAVY HEART EXCLAMATION MARK ORNAMENT;So;0;ON;;;;;N;;;;;
+2764;HEAVY BLACK HEART;So;0;ON;;;;;N;;;;;
+2765;ROTATED HEAVY BLACK HEART BULLET;So;0;ON;;;;;N;;;;;
+2766;FLORAL HEART;So;0;ON;;;;;N;;;;;
+2767;ROTATED FLORAL HEART BULLET;So;0;ON;;;;;N;;;;;
+2776;DINGBAT NEGATIVE CIRCLED DIGIT ONE;No;0;ON;;;1;1;N;INVERSE CIRCLED DIGIT ONE;;;;
+2777;DINGBAT NEGATIVE CIRCLED DIGIT TWO;No;0;ON;;;2;2;N;INVERSE CIRCLED DIGIT TWO;;;;
+2778;DINGBAT NEGATIVE CIRCLED DIGIT THREE;No;0;ON;;;3;3;N;INVERSE CIRCLED DIGIT THREE;;;;
+2779;DINGBAT NEGATIVE CIRCLED DIGIT FOUR;No;0;ON;;;4;4;N;INVERSE CIRCLED DIGIT FOUR;;;;
+277A;DINGBAT NEGATIVE CIRCLED DIGIT FIVE;No;0;ON;;;5;5;N;INVERSE CIRCLED DIGIT FIVE;;;;
+277B;DINGBAT NEGATIVE CIRCLED DIGIT SIX;No;0;ON;;;6;6;N;INVERSE CIRCLED DIGIT SIX;;;;
+277C;DINGBAT NEGATIVE CIRCLED DIGIT SEVEN;No;0;ON;;;7;7;N;INVERSE CIRCLED DIGIT SEVEN;;;;
+277D;DINGBAT NEGATIVE CIRCLED DIGIT EIGHT;No;0;ON;;;8;8;N;INVERSE CIRCLED DIGIT EIGHT;;;;
+277E;DINGBAT NEGATIVE CIRCLED DIGIT NINE;No;0;ON;;;9;9;N;INVERSE CIRCLED DIGIT NINE;;;;
+277F;DINGBAT NEGATIVE CIRCLED NUMBER TEN;No;0;ON;;;;10;N;INVERSE CIRCLED NUMBER TEN;;;;
+2780;DINGBAT CIRCLED SANS-SERIF DIGIT ONE;No;0;ON;;;1;1;N;CIRCLED SANS-SERIF DIGIT ONE;;;;
+2781;DINGBAT CIRCLED SANS-SERIF DIGIT TWO;No;0;ON;;;2;2;N;CIRCLED SANS-SERIF DIGIT TWO;;;;
+2782;DINGBAT CIRCLED SANS-SERIF DIGIT THREE;No;0;ON;;;3;3;N;CIRCLED SANS-SERIF DIGIT THREE;;;;
+2783;DINGBAT CIRCLED SANS-SERIF DIGIT FOUR;No;0;ON;;;4;4;N;CIRCLED SANS-SERIF DIGIT FOUR;;;;
+2784;DINGBAT CIRCLED SANS-SERIF DIGIT FIVE;No;0;ON;;;5;5;N;CIRCLED SANS-SERIF DIGIT FIVE;;;;
+2785;DINGBAT CIRCLED SANS-SERIF DIGIT SIX;No;0;ON;;;6;6;N;CIRCLED SANS-SERIF DIGIT SIX;;;;
+2786;DINGBAT CIRCLED SANS-SERIF DIGIT SEVEN;No;0;ON;;;7;7;N;CIRCLED SANS-SERIF DIGIT SEVEN;;;;
+2787;DINGBAT CIRCLED SANS-SERIF DIGIT EIGHT;No;0;ON;;;8;8;N;CIRCLED SANS-SERIF DIGIT EIGHT;;;;
+2788;DINGBAT CIRCLED SANS-SERIF DIGIT NINE;No;0;ON;;;9;9;N;CIRCLED SANS-SERIF DIGIT NINE;;;;
+2789;DINGBAT CIRCLED SANS-SERIF NUMBER TEN;No;0;ON;;;;10;N;CIRCLED SANS-SERIF NUMBER TEN;;;;
+278A;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT ONE;No;0;ON;;;1;1;N;INVERSE CIRCLED SANS-SERIF DIGIT ONE;;;;
+278B;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT TWO;No;0;ON;;;2;2;N;INVERSE CIRCLED SANS-SERIF DIGIT TWO;;;;
+278C;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT THREE;No;0;ON;;;3;3;N;INVERSE CIRCLED SANS-SERIF DIGIT THREE;;;;
+278D;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FOUR;No;0;ON;;;4;4;N;INVERSE CIRCLED SANS-SERIF DIGIT FOUR;;;;
+278E;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FIVE;No;0;ON;;;5;5;N;INVERSE CIRCLED SANS-SERIF DIGIT FIVE;;;;
+278F;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SIX;No;0;ON;;;6;6;N;INVERSE CIRCLED SANS-SERIF DIGIT SIX;;;;
+2790;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SEVEN;No;0;ON;;;7;7;N;INVERSE CIRCLED SANS-SERIF DIGIT SEVEN;;;;
+2791;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT EIGHT;No;0;ON;;;8;8;N;INVERSE CIRCLED SANS-SERIF DIGIT EIGHT;;;;
+2792;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT NINE;No;0;ON;;;9;9;N;INVERSE CIRCLED SANS-SERIF DIGIT NINE;;;;
+2793;DINGBAT NEGATIVE CIRCLED SANS-SERIF NUMBER TEN;No;0;ON;;;;10;N;INVERSE CIRCLED SANS-SERIF NUMBER TEN;;;;
+2794;HEAVY WIDE-HEADED RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY WIDE-HEADED RIGHT ARROW;;;;
+2798;HEAVY SOUTH EAST ARROW;So;0;ON;;;;;N;HEAVY LOWER RIGHT ARROW;;;;
+2799;HEAVY RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY RIGHT ARROW;;;;
+279A;HEAVY NORTH EAST ARROW;So;0;ON;;;;;N;HEAVY UPPER RIGHT ARROW;;;;
+279B;DRAFTING POINT RIGHTWARDS ARROW;So;0;ON;;;;;N;DRAFTING POINT RIGHT ARROW;;;;
+279C;HEAVY ROUND-TIPPED RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY ROUND-TIPPED RIGHT ARROW;;;;
+279D;TRIANGLE-HEADED RIGHTWARDS ARROW;So;0;ON;;;;;N;TRIANGLE-HEADED RIGHT ARROW;;;;
+279E;HEAVY TRIANGLE-HEADED RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY TRIANGLE-HEADED RIGHT ARROW;;;;
+279F;DASHED TRIANGLE-HEADED RIGHTWARDS ARROW;So;0;ON;;;;;N;DASHED TRIANGLE-HEADED RIGHT ARROW;;;;
+27A0;HEAVY DASHED TRIANGLE-HEADED RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY DASHED TRIANGLE-HEADED RIGHT ARROW;;;;
+27A1;BLACK RIGHTWARDS ARROW;So;0;ON;;;;;N;BLACK RIGHT ARROW;;;;
+27A2;THREE-D TOP-LIGHTED RIGHTWARDS ARROWHEAD;So;0;ON;;;;;N;THREE-D TOP-LIGHTED RIGHT ARROWHEAD;;;;
+27A3;THREE-D BOTTOM-LIGHTED RIGHTWARDS ARROWHEAD;So;0;ON;;;;;N;THREE-D BOTTOM-LIGHTED RIGHT ARROWHEAD;;;;
+27A4;BLACK RIGHTWARDS ARROWHEAD;So;0;ON;;;;;N;BLACK RIGHT ARROWHEAD;;;;
+27A5;HEAVY BLACK CURVED DOWNWARDS AND RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY BLACK CURVED DOWN AND RIGHT ARROW;;;;
+27A6;HEAVY BLACK CURVED UPWARDS AND RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY BLACK CURVED UP AND RIGHT ARROW;;;;
+27A7;SQUAT BLACK RIGHTWARDS ARROW;So;0;ON;;;;;N;SQUAT BLACK RIGHT ARROW;;;;
+27A8;HEAVY CONCAVE-POINTED BLACK RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY CONCAVE-POINTED BLACK RIGHT ARROW;;;;
+27A9;RIGHT-SHADED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;RIGHT-SHADED WHITE RIGHT ARROW;;;;
+27AA;LEFT-SHADED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;LEFT-SHADED WHITE RIGHT ARROW;;;;
+27AB;BACK-TILTED SHADOWED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;BACK-TILTED SHADOWED WHITE RIGHT ARROW;;;;
+27AC;FRONT-TILTED SHADOWED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;FRONT-TILTED SHADOWED WHITE RIGHT ARROW;;;;
+27AD;HEAVY LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY LOWER RIGHT-SHADOWED WHITE RIGHT ARROW;;;;
+27AE;HEAVY UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY UPPER RIGHT-SHADOWED WHITE RIGHT ARROW;;;;
+27AF;NOTCHED LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;NOTCHED LOWER RIGHT-SHADOWED WHITE RIGHT ARROW;;;;
+27B1;NOTCHED UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;NOTCHED UPPER RIGHT-SHADOWED WHITE RIGHT ARROW;;;;
+27B2;CIRCLED HEAVY WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;CIRCLED HEAVY WHITE RIGHT ARROW;;;;
+27B3;WHITE-FEATHERED RIGHTWARDS ARROW;So;0;ON;;;;;N;WHITE-FEATHERED RIGHT ARROW;;;;
+27B4;BLACK-FEATHERED SOUTH EAST ARROW;So;0;ON;;;;;N;BLACK-FEATHERED LOWER RIGHT ARROW;;;;
+27B5;BLACK-FEATHERED RIGHTWARDS ARROW;So;0;ON;;;;;N;BLACK-FEATHERED RIGHT ARROW;;;;
+27B6;BLACK-FEATHERED NORTH EAST ARROW;So;0;ON;;;;;N;BLACK-FEATHERED UPPER RIGHT ARROW;;;;
+27B7;HEAVY BLACK-FEATHERED SOUTH EAST ARROW;So;0;ON;;;;;N;HEAVY BLACK-FEATHERED LOWER RIGHT ARROW;;;;
+27B8;HEAVY BLACK-FEATHERED RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY BLACK-FEATHERED RIGHT ARROW;;;;
+27B9;HEAVY BLACK-FEATHERED NORTH EAST ARROW;So;0;ON;;;;;N;HEAVY BLACK-FEATHERED UPPER RIGHT ARROW;;;;
+27BA;TEARDROP-BARBED RIGHTWARDS ARROW;So;0;ON;;;;;N;TEARDROP-BARBED RIGHT ARROW;;;;
+27BB;HEAVY TEARDROP-SHANKED RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY TEARDROP-SHANKED RIGHT ARROW;;;;
+27BC;WEDGE-TAILED RIGHTWARDS ARROW;So;0;ON;;;;;N;WEDGE-TAILED RIGHT ARROW;;;;
+27BD;HEAVY WEDGE-TAILED RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY WEDGE-TAILED RIGHT ARROW;;;;
+27BE;OPEN-OUTLINED RIGHTWARDS ARROW;So;0;ON;;;;;N;OPEN-OUTLINED RIGHT ARROW;;;;
+2800;BRAILLE PATTERN BLANK;So;0;ON;;;;;N;;;;;
+2801;BRAILLE PATTERN DOTS-1;So;0;ON;;;;;N;;;;;
+2802;BRAILLE PATTERN DOTS-2;So;0;ON;;;;;N;;;;;
+2803;BRAILLE PATTERN DOTS-12;So;0;ON;;;;;N;;;;;
+2804;BRAILLE PATTERN DOTS-3;So;0;ON;;;;;N;;;;;
+2805;BRAILLE PATTERN DOTS-13;So;0;ON;;;;;N;;;;;
+2806;BRAILLE PATTERN DOTS-23;So;0;ON;;;;;N;;;;;
+2807;BRAILLE PATTERN DOTS-123;So;0;ON;;;;;N;;;;;
+2808;BRAILLE PATTERN DOTS-4;So;0;ON;;;;;N;;;;;
+2809;BRAILLE PATTERN DOTS-14;So;0;ON;;;;;N;;;;;
+280A;BRAILLE PATTERN DOTS-24;So;0;ON;;;;;N;;;;;
+280B;BRAILLE PATTERN DOTS-124;So;0;ON;;;;;N;;;;;
+280C;BRAILLE PATTERN DOTS-34;So;0;ON;;;;;N;;;;;
+280D;BRAILLE PATTERN DOTS-134;So;0;ON;;;;;N;;;;;
+280E;BRAILLE PATTERN DOTS-234;So;0;ON;;;;;N;;;;;
+280F;BRAILLE PATTERN DOTS-1234;So;0;ON;;;;;N;;;;;
+2810;BRAILLE PATTERN DOTS-5;So;0;ON;;;;;N;;;;;
+2811;BRAILLE PATTERN DOTS-15;So;0;ON;;;;;N;;;;;
+2812;BRAILLE PATTERN DOTS-25;So;0;ON;;;;;N;;;;;
+2813;BRAILLE PATTERN DOTS-125;So;0;ON;;;;;N;;;;;
+2814;BRAILLE PATTERN DOTS-35;So;0;ON;;;;;N;;;;;
+2815;BRAILLE PATTERN DOTS-135;So;0;ON;;;;;N;;;;;
+2816;BRAILLE PATTERN DOTS-235;So;0;ON;;;;;N;;;;;
+2817;BRAILLE PATTERN DOTS-1235;So;0;ON;;;;;N;;;;;
+2818;BRAILLE PATTERN DOTS-45;So;0;ON;;;;;N;;;;;
+2819;BRAILLE PATTERN DOTS-145;So;0;ON;;;;;N;;;;;
+281A;BRAILLE PATTERN DOTS-245;So;0;ON;;;;;N;;;;;
+281B;BRAILLE PATTERN DOTS-1245;So;0;ON;;;;;N;;;;;
+281C;BRAILLE PATTERN DOTS-345;So;0;ON;;;;;N;;;;;
+281D;BRAILLE PATTERN DOTS-1345;So;0;ON;;;;;N;;;;;
+281E;BRAILLE PATTERN DOTS-2345;So;0;ON;;;;;N;;;;;
+281F;BRAILLE PATTERN DOTS-12345;So;0;ON;;;;;N;;;;;
+2820;BRAILLE PATTERN DOTS-6;So;0;ON;;;;;N;;;;;
+2821;BRAILLE PATTERN DOTS-16;So;0;ON;;;;;N;;;;;
+2822;BRAILLE PATTERN DOTS-26;So;0;ON;;;;;N;;;;;
+2823;BRAILLE PATTERN DOTS-126;So;0;ON;;;;;N;;;;;
+2824;BRAILLE PATTERN DOTS-36;So;0;ON;;;;;N;;;;;
+2825;BRAILLE PATTERN DOTS-136;So;0;ON;;;;;N;;;;;
+2826;BRAILLE PATTERN DOTS-236;So;0;ON;;;;;N;;;;;
+2827;BRAILLE PATTERN DOTS-1236;So;0;ON;;;;;N;;;;;
+2828;BRAILLE PATTERN DOTS-46;So;0;ON;;;;;N;;;;;
+2829;BRAILLE PATTERN DOTS-146;So;0;ON;;;;;N;;;;;
+282A;BRAILLE PATTERN DOTS-246;So;0;ON;;;;;N;;;;;
+282B;BRAILLE PATTERN DOTS-1246;So;0;ON;;;;;N;;;;;
+282C;BRAILLE PATTERN DOTS-346;So;0;ON;;;;;N;;;;;
+282D;BRAILLE PATTERN DOTS-1346;So;0;ON;;;;;N;;;;;
+282E;BRAILLE PATTERN DOTS-2346;So;0;ON;;;;;N;;;;;
+282F;BRAILLE PATTERN DOTS-12346;So;0;ON;;;;;N;;;;;
+2830;BRAILLE PATTERN DOTS-56;So;0;ON;;;;;N;;;;;
+2831;BRAILLE PATTERN DOTS-156;So;0;ON;;;;;N;;;;;
+2832;BRAILLE PATTERN DOTS-256;So;0;ON;;;;;N;;;;;
+2833;BRAILLE PATTERN DOTS-1256;So;0;ON;;;;;N;;;;;
+2834;BRAILLE PATTERN DOTS-356;So;0;ON;;;;;N;;;;;
+2835;BRAILLE PATTERN DOTS-1356;So;0;ON;;;;;N;;;;;
+2836;BRAILLE PATTERN DOTS-2356;So;0;ON;;;;;N;;;;;
+2837;BRAILLE PATTERN DOTS-12356;So;0;ON;;;;;N;;;;;
+2838;BRAILLE PATTERN DOTS-456;So;0;ON;;;;;N;;;;;
+2839;BRAILLE PATTERN DOTS-1456;So;0;ON;;;;;N;;;;;
+283A;BRAILLE PATTERN DOTS-2456;So;0;ON;;;;;N;;;;;
+283B;BRAILLE PATTERN DOTS-12456;So;0;ON;;;;;N;;;;;
+283C;BRAILLE PATTERN DOTS-3456;So;0;ON;;;;;N;;;;;
+283D;BRAILLE PATTERN DOTS-13456;So;0;ON;;;;;N;;;;;
+283E;BRAILLE PATTERN DOTS-23456;So;0;ON;;;;;N;;;;;
+283F;BRAILLE PATTERN DOTS-123456;So;0;ON;;;;;N;;;;;
+2840;BRAILLE PATTERN DOTS-7;So;0;ON;;;;;N;;;;;
+2841;BRAILLE PATTERN DOTS-17;So;0;ON;;;;;N;;;;;
+2842;BRAILLE PATTERN DOTS-27;So;0;ON;;;;;N;;;;;
+2843;BRAILLE PATTERN DOTS-127;So;0;ON;;;;;N;;;;;
+2844;BRAILLE PATTERN DOTS-37;So;0;ON;;;;;N;;;;;
+2845;BRAILLE PATTERN DOTS-137;So;0;ON;;;;;N;;;;;
+2846;BRAILLE PATTERN DOTS-237;So;0;ON;;;;;N;;;;;
+2847;BRAILLE PATTERN DOTS-1237;So;0;ON;;;;;N;;;;;
+2848;BRAILLE PATTERN DOTS-47;So;0;ON;;;;;N;;;;;
+2849;BRAILLE PATTERN DOTS-147;So;0;ON;;;;;N;;;;;
+284A;BRAILLE PATTERN DOTS-247;So;0;ON;;;;;N;;;;;
+284B;BRAILLE PATTERN DOTS-1247;So;0;ON;;;;;N;;;;;
+284C;BRAILLE PATTERN DOTS-347;So;0;ON;;;;;N;;;;;
+284D;BRAILLE PATTERN DOTS-1347;So;0;ON;;;;;N;;;;;
+284E;BRAILLE PATTERN DOTS-2347;So;0;ON;;;;;N;;;;;
+284F;BRAILLE PATTERN DOTS-12347;So;0;ON;;;;;N;;;;;
+2850;BRAILLE PATTERN DOTS-57;So;0;ON;;;;;N;;;;;
+2851;BRAILLE PATTERN DOTS-157;So;0;ON;;;;;N;;;;;
+2852;BRAILLE PATTERN DOTS-257;So;0;ON;;;;;N;;;;;
+2853;BRAILLE PATTERN DOTS-1257;So;0;ON;;;;;N;;;;;
+2854;BRAILLE PATTERN DOTS-357;So;0;ON;;;;;N;;;;;
+2855;BRAILLE PATTERN DOTS-1357;So;0;ON;;;;;N;;;;;
+2856;BRAILLE PATTERN DOTS-2357;So;0;ON;;;;;N;;;;;
+2857;BRAILLE PATTERN DOTS-12357;So;0;ON;;;;;N;;;;;
+2858;BRAILLE PATTERN DOTS-457;So;0;ON;;;;;N;;;;;
+2859;BRAILLE PATTERN DOTS-1457;So;0;ON;;;;;N;;;;;
+285A;BRAILLE PATTERN DOTS-2457;So;0;ON;;;;;N;;;;;
+285B;BRAILLE PATTERN DOTS-12457;So;0;ON;;;;;N;;;;;
+285C;BRAILLE PATTERN DOTS-3457;So;0;ON;;;;;N;;;;;
+285D;BRAILLE PATTERN DOTS-13457;So;0;ON;;;;;N;;;;;
+285E;BRAILLE PATTERN DOTS-23457;So;0;ON;;;;;N;;;;;
+285F;BRAILLE PATTERN DOTS-123457;So;0;ON;;;;;N;;;;;
+2860;BRAILLE PATTERN DOTS-67;So;0;ON;;;;;N;;;;;
+2861;BRAILLE PATTERN DOTS-167;So;0;ON;;;;;N;;;;;
+2862;BRAILLE PATTERN DOTS-267;So;0;ON;;;;;N;;;;;
+2863;BRAILLE PATTERN DOTS-1267;So;0;ON;;;;;N;;;;;
+2864;BRAILLE PATTERN DOTS-367;So;0;ON;;;;;N;;;;;
+2865;BRAILLE PATTERN DOTS-1367;So;0;ON;;;;;N;;;;;
+2866;BRAILLE PATTERN DOTS-2367;So;0;ON;;;;;N;;;;;
+2867;BRAILLE PATTERN DOTS-12367;So;0;ON;;;;;N;;;;;
+2868;BRAILLE PATTERN DOTS-467;So;0;ON;;;;;N;;;;;
+2869;BRAILLE PATTERN DOTS-1467;So;0;ON;;;;;N;;;;;
+286A;BRAILLE PATTERN DOTS-2467;So;0;ON;;;;;N;;;;;
+286B;BRAILLE PATTERN DOTS-12467;So;0;ON;;;;;N;;;;;
+286C;BRAILLE PATTERN DOTS-3467;So;0;ON;;;;;N;;;;;
+286D;BRAILLE PATTERN DOTS-13467;So;0;ON;;;;;N;;;;;
+286E;BRAILLE PATTERN DOTS-23467;So;0;ON;;;;;N;;;;;
+286F;BRAILLE PATTERN DOTS-123467;So;0;ON;;;;;N;;;;;
+2870;BRAILLE PATTERN DOTS-567;So;0;ON;;;;;N;;;;;
+2871;BRAILLE PATTERN DOTS-1567;So;0;ON;;;;;N;;;;;
+2872;BRAILLE PATTERN DOTS-2567;So;0;ON;;;;;N;;;;;
+2873;BRAILLE PATTERN DOTS-12567;So;0;ON;;;;;N;;;;;
+2874;BRAILLE PATTERN DOTS-3567;So;0;ON;;;;;N;;;;;
+2875;BRAILLE PATTERN DOTS-13567;So;0;ON;;;;;N;;;;;
+2876;BRAILLE PATTERN DOTS-23567;So;0;ON;;;;;N;;;;;
+2877;BRAILLE PATTERN DOTS-123567;So;0;ON;;;;;N;;;;;
+2878;BRAILLE PATTERN DOTS-4567;So;0;ON;;;;;N;;;;;
+2879;BRAILLE PATTERN DOTS-14567;So;0;ON;;;;;N;;;;;
+287A;BRAILLE PATTERN DOTS-24567;So;0;ON;;;;;N;;;;;
+287B;BRAILLE PATTERN DOTS-124567;So;0;ON;;;;;N;;;;;
+287C;BRAILLE PATTERN DOTS-34567;So;0;ON;;;;;N;;;;;
+287D;BRAILLE PATTERN DOTS-134567;So;0;ON;;;;;N;;;;;
+287E;BRAILLE PATTERN DOTS-234567;So;0;ON;;;;;N;;;;;
+287F;BRAILLE PATTERN DOTS-1234567;So;0;ON;;;;;N;;;;;
+2880;BRAILLE PATTERN DOTS-8;So;0;ON;;;;;N;;;;;
+2881;BRAILLE PATTERN DOTS-18;So;0;ON;;;;;N;;;;;
+2882;BRAILLE PATTERN DOTS-28;So;0;ON;;;;;N;;;;;
+2883;BRAILLE PATTERN DOTS-128;So;0;ON;;;;;N;;;;;
+2884;BRAILLE PATTERN DOTS-38;So;0;ON;;;;;N;;;;;
+2885;BRAILLE PATTERN DOTS-138;So;0;ON;;;;;N;;;;;
+2886;BRAILLE PATTERN DOTS-238;So;0;ON;;;;;N;;;;;
+2887;BRAILLE PATTERN DOTS-1238;So;0;ON;;;;;N;;;;;
+2888;BRAILLE PATTERN DOTS-48;So;0;ON;;;;;N;;;;;
+2889;BRAILLE PATTERN DOTS-148;So;0;ON;;;;;N;;;;;
+288A;BRAILLE PATTERN DOTS-248;So;0;ON;;;;;N;;;;;
+288B;BRAILLE PATTERN DOTS-1248;So;0;ON;;;;;N;;;;;
+288C;BRAILLE PATTERN DOTS-348;So;0;ON;;;;;N;;;;;
+288D;BRAILLE PATTERN DOTS-1348;So;0;ON;;;;;N;;;;;
+288E;BRAILLE PATTERN DOTS-2348;So;0;ON;;;;;N;;;;;
+288F;BRAILLE PATTERN DOTS-12348;So;0;ON;;;;;N;;;;;
+2890;BRAILLE PATTERN DOTS-58;So;0;ON;;;;;N;;;;;
+2891;BRAILLE PATTERN DOTS-158;So;0;ON;;;;;N;;;;;
+2892;BRAILLE PATTERN DOTS-258;So;0;ON;;;;;N;;;;;
+2893;BRAILLE PATTERN DOTS-1258;So;0;ON;;;;;N;;;;;
+2894;BRAILLE PATTERN DOTS-358;So;0;ON;;;;;N;;;;;
+2895;BRAILLE PATTERN DOTS-1358;So;0;ON;;;;;N;;;;;
+2896;BRAILLE PATTERN DOTS-2358;So;0;ON;;;;;N;;;;;
+2897;BRAILLE PATTERN DOTS-12358;So;0;ON;;;;;N;;;;;
+2898;BRAILLE PATTERN DOTS-458;So;0;ON;;;;;N;;;;;
+2899;BRAILLE PATTERN DOTS-1458;So;0;ON;;;;;N;;;;;
+289A;BRAILLE PATTERN DOTS-2458;So;0;ON;;;;;N;;;;;
+289B;BRAILLE PATTERN DOTS-12458;So;0;ON;;;;;N;;;;;
+289C;BRAILLE PATTERN DOTS-3458;So;0;ON;;;;;N;;;;;
+289D;BRAILLE PATTERN DOTS-13458;So;0;ON;;;;;N;;;;;
+289E;BRAILLE PATTERN DOTS-23458;So;0;ON;;;;;N;;;;;
+289F;BRAILLE PATTERN DOTS-123458;So;0;ON;;;;;N;;;;;
+28A0;BRAILLE PATTERN DOTS-68;So;0;ON;;;;;N;;;;;
+28A1;BRAILLE PATTERN DOTS-168;So;0;ON;;;;;N;;;;;
+28A2;BRAILLE PATTERN DOTS-268;So;0;ON;;;;;N;;;;;
+28A3;BRAILLE PATTERN DOTS-1268;So;0;ON;;;;;N;;;;;
+28A4;BRAILLE PATTERN DOTS-368;So;0;ON;;;;;N;;;;;
+28A5;BRAILLE PATTERN DOTS-1368;So;0;ON;;;;;N;;;;;
+28A6;BRAILLE PATTERN DOTS-2368;So;0;ON;;;;;N;;;;;
+28A7;BRAILLE PATTERN DOTS-12368;So;0;ON;;;;;N;;;;;
+28A8;BRAILLE PATTERN DOTS-468;So;0;ON;;;;;N;;;;;
+28A9;BRAILLE PATTERN DOTS-1468;So;0;ON;;;;;N;;;;;
+28AA;BRAILLE PATTERN DOTS-2468;So;0;ON;;;;;N;;;;;
+28AB;BRAILLE PATTERN DOTS-12468;So;0;ON;;;;;N;;;;;
+28AC;BRAILLE PATTERN DOTS-3468;So;0;ON;;;;;N;;;;;
+28AD;BRAILLE PATTERN DOTS-13468;So;0;ON;;;;;N;;;;;
+28AE;BRAILLE PATTERN DOTS-23468;So;0;ON;;;;;N;;;;;
+28AF;BRAILLE PATTERN DOTS-123468;So;0;ON;;;;;N;;;;;
+28B0;BRAILLE PATTERN DOTS-568;So;0;ON;;;;;N;;;;;
+28B1;BRAILLE PATTERN DOTS-1568;So;0;ON;;;;;N;;;;;
+28B2;BRAILLE PATTERN DOTS-2568;So;0;ON;;;;;N;;;;;
+28B3;BRAILLE PATTERN DOTS-12568;So;0;ON;;;;;N;;;;;
+28B4;BRAILLE PATTERN DOTS-3568;So;0;ON;;;;;N;;;;;
+28B5;BRAILLE PATTERN DOTS-13568;So;0;ON;;;;;N;;;;;
+28B6;BRAILLE PATTERN DOTS-23568;So;0;ON;;;;;N;;;;;
+28B7;BRAILLE PATTERN DOTS-123568;So;0;ON;;;;;N;;;;;
+28B8;BRAILLE PATTERN DOTS-4568;So;0;ON;;;;;N;;;;;
+28B9;BRAILLE PATTERN DOTS-14568;So;0;ON;;;;;N;;;;;
+28BA;BRAILLE PATTERN DOTS-24568;So;0;ON;;;;;N;;;;;
+28BB;BRAILLE PATTERN DOTS-124568;So;0;ON;;;;;N;;;;;
+28BC;BRAILLE PATTERN DOTS-34568;So;0;ON;;;;;N;;;;;
+28BD;BRAILLE PATTERN DOTS-134568;So;0;ON;;;;;N;;;;;
+28BE;BRAILLE PATTERN DOTS-234568;So;0;ON;;;;;N;;;;;
+28BF;BRAILLE PATTERN DOTS-1234568;So;0;ON;;;;;N;;;;;
+28C0;BRAILLE PATTERN DOTS-78;So;0;ON;;;;;N;;;;;
+28C1;BRAILLE PATTERN DOTS-178;So;0;ON;;;;;N;;;;;
+28C2;BRAILLE PATTERN DOTS-278;So;0;ON;;;;;N;;;;;
+28C3;BRAILLE PATTERN DOTS-1278;So;0;ON;;;;;N;;;;;
+28C4;BRAILLE PATTERN DOTS-378;So;0;ON;;;;;N;;;;;
+28C5;BRAILLE PATTERN DOTS-1378;So;0;ON;;;;;N;;;;;
+28C6;BRAILLE PATTERN DOTS-2378;So;0;ON;;;;;N;;;;;
+28C7;BRAILLE PATTERN DOTS-12378;So;0;ON;;;;;N;;;;;
+28C8;BRAILLE PATTERN DOTS-478;So;0;ON;;;;;N;;;;;
+28C9;BRAILLE PATTERN DOTS-1478;So;0;ON;;;;;N;;;;;
+28CA;BRAILLE PATTERN DOTS-2478;So;0;ON;;;;;N;;;;;
+28CB;BRAILLE PATTERN DOTS-12478;So;0;ON;;;;;N;;;;;
+28CC;BRAILLE PATTERN DOTS-3478;So;0;ON;;;;;N;;;;;
+28CD;BRAILLE PATTERN DOTS-13478;So;0;ON;;;;;N;;;;;
+28CE;BRAILLE PATTERN DOTS-23478;So;0;ON;;;;;N;;;;;
+28CF;BRAILLE PATTERN DOTS-123478;So;0;ON;;;;;N;;;;;
+28D0;BRAILLE PATTERN DOTS-578;So;0;ON;;;;;N;;;;;
+28D1;BRAILLE PATTERN DOTS-1578;So;0;ON;;;;;N;;;;;
+28D2;BRAILLE PATTERN DOTS-2578;So;0;ON;;;;;N;;;;;
+28D3;BRAILLE PATTERN DOTS-12578;So;0;ON;;;;;N;;;;;
+28D4;BRAILLE PATTERN DOTS-3578;So;0;ON;;;;;N;;;;;
+28D5;BRAILLE PATTERN DOTS-13578;So;0;ON;;;;;N;;;;;
+28D6;BRAILLE PATTERN DOTS-23578;So;0;ON;;;;;N;;;;;
+28D7;BRAILLE PATTERN DOTS-123578;So;0;ON;;;;;N;;;;;
+28D8;BRAILLE PATTERN DOTS-4578;So;0;ON;;;;;N;;;;;
+28D9;BRAILLE PATTERN DOTS-14578;So;0;ON;;;;;N;;;;;
+28DA;BRAILLE PATTERN DOTS-24578;So;0;ON;;;;;N;;;;;
+28DB;BRAILLE PATTERN DOTS-124578;So;0;ON;;;;;N;;;;;
+28DC;BRAILLE PATTERN DOTS-34578;So;0;ON;;;;;N;;;;;
+28DD;BRAILLE PATTERN DOTS-134578;So;0;ON;;;;;N;;;;;
+28DE;BRAILLE PATTERN DOTS-234578;So;0;ON;;;;;N;;;;;
+28DF;BRAILLE PATTERN DOTS-1234578;So;0;ON;;;;;N;;;;;
+28E0;BRAILLE PATTERN DOTS-678;So;0;ON;;;;;N;;;;;
+28E1;BRAILLE PATTERN DOTS-1678;So;0;ON;;;;;N;;;;;
+28E2;BRAILLE PATTERN DOTS-2678;So;0;ON;;;;;N;;;;;
+28E3;BRAILLE PATTERN DOTS-12678;So;0;ON;;;;;N;;;;;
+28E4;BRAILLE PATTERN DOTS-3678;So;0;ON;;;;;N;;;;;
+28E5;BRAILLE PATTERN DOTS-13678;So;0;ON;;;;;N;;;;;
+28E6;BRAILLE PATTERN DOTS-23678;So;0;ON;;;;;N;;;;;
+28E7;BRAILLE PATTERN DOTS-123678;So;0;ON;;;;;N;;;;;
+28E8;BRAILLE PATTERN DOTS-4678;So;0;ON;;;;;N;;;;;
+28E9;BRAILLE PATTERN DOTS-14678;So;0;ON;;;;;N;;;;;
+28EA;BRAILLE PATTERN DOTS-24678;So;0;ON;;;;;N;;;;;
+28EB;BRAILLE PATTERN DOTS-124678;So;0;ON;;;;;N;;;;;
+28EC;BRAILLE PATTERN DOTS-34678;So;0;ON;;;;;N;;;;;
+28ED;BRAILLE PATTERN DOTS-134678;So;0;ON;;;;;N;;;;;
+28EE;BRAILLE PATTERN DOTS-234678;So;0;ON;;;;;N;;;;;
+28EF;BRAILLE PATTERN DOTS-1234678;So;0;ON;;;;;N;;;;;
+28F0;BRAILLE PATTERN DOTS-5678;So;0;ON;;;;;N;;;;;
+28F1;BRAILLE PATTERN DOTS-15678;So;0;ON;;;;;N;;;;;
+28F2;BRAILLE PATTERN DOTS-25678;So;0;ON;;;;;N;;;;;
+28F3;BRAILLE PATTERN DOTS-125678;So;0;ON;;;;;N;;;;;
+28F4;BRAILLE PATTERN DOTS-35678;So;0;ON;;;;;N;;;;;
+28F5;BRAILLE PATTERN DOTS-135678;So;0;ON;;;;;N;;;;;
+28F6;BRAILLE PATTERN DOTS-235678;So;0;ON;;;;;N;;;;;
+28F7;BRAILLE PATTERN DOTS-1235678;So;0;ON;;;;;N;;;;;
+28F8;BRAILLE PATTERN DOTS-45678;So;0;ON;;;;;N;;;;;
+28F9;BRAILLE PATTERN DOTS-145678;So;0;ON;;;;;N;;;;;
+28FA;BRAILLE PATTERN DOTS-245678;So;0;ON;;;;;N;;;;;
+28FB;BRAILLE PATTERN DOTS-1245678;So;0;ON;;;;;N;;;;;
+28FC;BRAILLE PATTERN DOTS-345678;So;0;ON;;;;;N;;;;;
+28FD;BRAILLE PATTERN DOTS-1345678;So;0;ON;;;;;N;;;;;
+28FE;BRAILLE PATTERN DOTS-2345678;So;0;ON;;;;;N;;;;;
+28FF;BRAILLE PATTERN DOTS-12345678;So;0;ON;;;;;N;;;;;
+2E80;CJK RADICAL REPEAT;So;0;ON;;;;;N;;;;;
+2E81;CJK RADICAL CLIFF;So;0;ON;;;;;N;;;;;
+2E82;CJK RADICAL SECOND ONE;So;0;ON;;;;;N;;;;;
+2E83;CJK RADICAL SECOND TWO;So;0;ON;;;;;N;;;;;
+2E84;CJK RADICAL SECOND THREE;So;0;ON;;;;;N;;;;;
+2E85;CJK RADICAL PERSON;So;0;ON;;;;;N;;;;;
+2E86;CJK RADICAL BOX;So;0;ON;;;;;N;;;;;
+2E87;CJK RADICAL TABLE;So;0;ON;;;;;N;;;;;
+2E88;CJK RADICAL KNIFE ONE;So;0;ON;;;;;N;;;;;
+2E89;CJK RADICAL KNIFE TWO;So;0;ON;;;;;N;;;;;
+2E8A;CJK RADICAL DIVINATION;So;0;ON;;;;;N;;;;;
+2E8B;CJK RADICAL SEAL;So;0;ON;;;;;N;;;;;
+2E8C;CJK RADICAL SMALL ONE;So;0;ON;;;;;N;;;;;
+2E8D;CJK RADICAL SMALL TWO;So;0;ON;;;;;N;;;;;
+2E8E;CJK RADICAL LAME ONE;So;0;ON;;;;;N;;;;;
+2E8F;CJK RADICAL LAME TWO;So;0;ON;;;;;N;;;;;
+2E90;CJK RADICAL LAME THREE;So;0;ON;;;;;N;;;;;
+2E91;CJK RADICAL LAME FOUR;So;0;ON;;;;;N;;;;;
+2E92;CJK RADICAL SNAKE;So;0;ON;;;;;N;;;;;
+2E93;CJK RADICAL THREAD;So;0;ON;;;;;N;;;;;
+2E94;CJK RADICAL SNOUT ONE;So;0;ON;;;;;N;;;;;
+2E95;CJK RADICAL SNOUT TWO;So;0;ON;;;;;N;;;;;
+2E96;CJK RADICAL HEART ONE;So;0;ON;;;;;N;;;;;
+2E97;CJK RADICAL HEART TWO;So;0;ON;;;;;N;;;;;
+2E98;CJK RADICAL HAND;So;0;ON;;;;;N;;;;;
+2E99;CJK RADICAL RAP;So;0;ON;;;;;N;;;;;
+2E9B;CJK RADICAL CHOKE;So;0;ON;;;;;N;;;;;
+2E9C;CJK RADICAL SUN;So;0;ON;;;;;N;;;;;
+2E9D;CJK RADICAL MOON;So;0;ON;;;;;N;;;;;
+2E9E;CJK RADICAL DEATH;So;0;ON;;;;;N;;;;;
+2E9F;CJK RADICAL MOTHER;So;0;ON;<compat> 6BCD;;;;N;;;;;
+2EA0;CJK RADICAL CIVILIAN;So;0;ON;;;;;N;;;;;
+2EA1;CJK RADICAL WATER ONE;So;0;ON;;;;;N;;;;;
+2EA2;CJK RADICAL WATER TWO;So;0;ON;;;;;N;;;;;
+2EA3;CJK RADICAL FIRE;So;0;ON;;;;;N;;;;;
+2EA4;CJK RADICAL PAW ONE;So;0;ON;;;;;N;;;;;
+2EA5;CJK RADICAL PAW TWO;So;0;ON;;;;;N;;;;;
+2EA6;CJK RADICAL SIMPLIFIED HALF TREE TRUNK;So;0;ON;;;;;N;;;;;
+2EA7;CJK RADICAL COW;So;0;ON;;;;;N;;;;;
+2EA8;CJK RADICAL DOG;So;0;ON;;;;;N;;;;;
+2EA9;CJK RADICAL JADE;So;0;ON;;;;;N;;;;;
+2EAA;CJK RADICAL BOLT OF CLOTH;So;0;ON;;;;;N;;;;;
+2EAB;CJK RADICAL EYE;So;0;ON;;;;;N;;;;;
+2EAC;CJK RADICAL SPIRIT ONE;So;0;ON;;;;;N;;;;;
+2EAD;CJK RADICAL SPIRIT TWO;So;0;ON;;;;;N;;;;;
+2EAE;CJK RADICAL BAMBOO;So;0;ON;;;;;N;;;;;
+2EAF;CJK RADICAL SILK;So;0;ON;;;;;N;;;;;
+2EB0;CJK RADICAL C-SIMPLIFIED SILK;So;0;ON;;;;;N;;;;;
+2EB1;CJK RADICAL NET ONE;So;0;ON;;;;;N;;;;;
+2EB2;CJK RADICAL NET TWO;So;0;ON;;;;;N;;;;;
+2EB3;CJK RADICAL NET THREE;So;0;ON;;;;;N;;;;;
+2EB4;CJK RADICAL NET FOUR;So;0;ON;;;;;N;;;;;
+2EB5;CJK RADICAL MESH;So;0;ON;;;;;N;;;;;
+2EB6;CJK RADICAL SHEEP;So;0;ON;;;;;N;;;;;
+2EB7;CJK RADICAL RAM;So;0;ON;;;;;N;;;;;
+2EB8;CJK RADICAL EWE;So;0;ON;;;;;N;;;;;
+2EB9;CJK RADICAL OLD;So;0;ON;;;;;N;;;;;
+2EBA;CJK RADICAL BRUSH ONE;So;0;ON;;;;;N;;;;;
+2EBB;CJK RADICAL BRUSH TWO;So;0;ON;;;;;N;;;;;
+2EBC;CJK RADICAL MEAT;So;0;ON;;;;;N;;;;;
+2EBD;CJK RADICAL MORTAR;So;0;ON;;;;;N;;;;;
+2EBE;CJK RADICAL GRASS ONE;So;0;ON;;;;;N;;;;;
+2EBF;CJK RADICAL GRASS TWO;So;0;ON;;;;;N;;;;;
+2EC0;CJK RADICAL GRASS THREE;So;0;ON;;;;;N;;;;;
+2EC1;CJK RADICAL TIGER;So;0;ON;;;;;N;;;;;
+2EC2;CJK RADICAL CLOTHES;So;0;ON;;;;;N;;;;;
+2EC3;CJK RADICAL WEST ONE;So;0;ON;;;;;N;;;;;
+2EC4;CJK RADICAL WEST TWO;So;0;ON;;;;;N;;;;;
+2EC5;CJK RADICAL C-SIMPLIFIED SEE;So;0;ON;;;;;N;;;;;
+2EC6;CJK RADICAL SIMPLIFIED HORN;So;0;ON;;;;;N;;;;;
+2EC7;CJK RADICAL HORN;So;0;ON;;;;;N;;;;;
+2EC8;CJK RADICAL C-SIMPLIFIED SPEECH;So;0;ON;;;;;N;;;;;
+2EC9;CJK RADICAL C-SIMPLIFIED SHELL;So;0;ON;;;;;N;;;;;
+2ECA;CJK RADICAL FOOT;So;0;ON;;;;;N;;;;;
+2ECB;CJK RADICAL C-SIMPLIFIED CART;So;0;ON;;;;;N;;;;;
+2ECC;CJK RADICAL SIMPLIFIED WALK;So;0;ON;;;;;N;;;;;
+2ECD;CJK RADICAL WALK ONE;So;0;ON;;;;;N;;;;;
+2ECE;CJK RADICAL WALK TWO;So;0;ON;;;;;N;;;;;
+2ECF;CJK RADICAL CITY;So;0;ON;;;;;N;;;;;
+2ED0;CJK RADICAL C-SIMPLIFIED GOLD;So;0;ON;;;;;N;;;;;
+2ED1;CJK RADICAL LONG ONE;So;0;ON;;;;;N;;;;;
+2ED2;CJK RADICAL LONG TWO;So;0;ON;;;;;N;;;;;
+2ED3;CJK RADICAL C-SIMPLIFIED LONG;So;0;ON;;;;;N;;;;;
+2ED4;CJK RADICAL C-SIMPLIFIED GATE;So;0;ON;;;;;N;;;;;
+2ED5;CJK RADICAL MOUND ONE;So;0;ON;;;;;N;;;;;
+2ED6;CJK RADICAL MOUND TWO;So;0;ON;;;;;N;;;;;
+2ED7;CJK RADICAL RAIN;So;0;ON;;;;;N;;;;;
+2ED8;CJK RADICAL BLUE;So;0;ON;;;;;N;;;;;
+2ED9;CJK RADICAL C-SIMPLIFIED TANNED LEATHER;So;0;ON;;;;;N;;;;;
+2EDA;CJK RADICAL C-SIMPLIFIED LEAF;So;0;ON;;;;;N;;;;;
+2EDB;CJK RADICAL C-SIMPLIFIED WIND;So;0;ON;;;;;N;;;;;
+2EDC;CJK RADICAL C-SIMPLIFIED FLY;So;0;ON;;;;;N;;;;;
+2EDD;CJK RADICAL EAT ONE;So;0;ON;;;;;N;;;;;
+2EDE;CJK RADICAL EAT TWO;So;0;ON;;;;;N;;;;;
+2EDF;CJK RADICAL EAT THREE;So;0;ON;;;;;N;;;;;
+2EE0;CJK RADICAL C-SIMPLIFIED EAT;So;0;ON;;;;;N;;;;;
+2EE1;CJK RADICAL HEAD;So;0;ON;;;;;N;;;;;
+2EE2;CJK RADICAL C-SIMPLIFIED HORSE;So;0;ON;;;;;N;;;;;
+2EE3;CJK RADICAL BONE;So;0;ON;;;;;N;;;;;
+2EE4;CJK RADICAL GHOST;So;0;ON;;;;;N;;;;;
+2EE5;CJK RADICAL C-SIMPLIFIED FISH;So;0;ON;;;;;N;;;;;
+2EE6;CJK RADICAL C-SIMPLIFIED BIRD;So;0;ON;;;;;N;;;;;
+2EE7;CJK RADICAL C-SIMPLIFIED SALT;So;0;ON;;;;;N;;;;;
+2EE8;CJK RADICAL SIMPLIFIED WHEAT;So;0;ON;;;;;N;;;;;
+2EE9;CJK RADICAL SIMPLIFIED YELLOW;So;0;ON;;;;;N;;;;;
+2EEA;CJK RADICAL C-SIMPLIFIED FROG;So;0;ON;;;;;N;;;;;
+2EEB;CJK RADICAL J-SIMPLIFIED EVEN;So;0;ON;;;;;N;;;;;
+2EEC;CJK RADICAL C-SIMPLIFIED EVEN;So;0;ON;;;;;N;;;;;
+2EED;CJK RADICAL J-SIMPLIFIED TOOTH;So;0;ON;;;;;N;;;;;
+2EEE;CJK RADICAL C-SIMPLIFIED TOOTH;So;0;ON;;;;;N;;;;;
+2EEF;CJK RADICAL J-SIMPLIFIED DRAGON;So;0;ON;;;;;N;;;;;
+2EF0;CJK RADICAL C-SIMPLIFIED DRAGON;So;0;ON;;;;;N;;;;;
+2EF1;CJK RADICAL TURTLE;So;0;ON;;;;;N;;;;;
+2EF2;CJK RADICAL J-SIMPLIFIED TURTLE;So;0;ON;;;;;N;;;;;
+2EF3;CJK RADICAL C-SIMPLIFIED TURTLE;So;0;ON;<compat> 9F9F;;;;N;;;;;
+2F00;KANGXI RADICAL ONE;So;0;ON;<compat> 4E00;;;;N;;;;;
+2F01;KANGXI RADICAL LINE;So;0;ON;<compat> 4E28;;;;N;;;;;
+2F02;KANGXI RADICAL DOT;So;0;ON;<compat> 4E36;;;;N;;;;;
+2F03;KANGXI RADICAL SLASH;So;0;ON;<compat> 4E3F;;;;N;;;;;
+2F04;KANGXI RADICAL SECOND;So;0;ON;<compat> 4E59;;;;N;;;;;
+2F05;KANGXI RADICAL HOOK;So;0;ON;<compat> 4E85;;;;N;;;;;
+2F06;KANGXI RADICAL TWO;So;0;ON;<compat> 4E8C;;;;N;;;;;
+2F07;KANGXI RADICAL LID;So;0;ON;<compat> 4EA0;;;;N;;;;;
+2F08;KANGXI RADICAL MAN;So;0;ON;<compat> 4EBA;;;;N;;;;;
+2F09;KANGXI RADICAL LEGS;So;0;ON;<compat> 513F;;;;N;;;;;
+2F0A;KANGXI RADICAL ENTER;So;0;ON;<compat> 5165;;;;N;;;;;
+2F0B;KANGXI RADICAL EIGHT;So;0;ON;<compat> 516B;;;;N;;;;;
+2F0C;KANGXI RADICAL DOWN BOX;So;0;ON;<compat> 5182;;;;N;;;;;
+2F0D;KANGXI RADICAL COVER;So;0;ON;<compat> 5196;;;;N;;;;;
+2F0E;KANGXI RADICAL ICE;So;0;ON;<compat> 51AB;;;;N;;;;;
+2F0F;KANGXI RADICAL TABLE;So;0;ON;<compat> 51E0;;;;N;;;;;
+2F10;KANGXI RADICAL OPEN BOX;So;0;ON;<compat> 51F5;;;;N;;;;;
+2F11;KANGXI RADICAL KNIFE;So;0;ON;<compat> 5200;;;;N;;;;;
+2F12;KANGXI RADICAL POWER;So;0;ON;<compat> 529B;;;;N;;;;;
+2F13;KANGXI RADICAL WRAP;So;0;ON;<compat> 52F9;;;;N;;;;;
+2F14;KANGXI RADICAL SPOON;So;0;ON;<compat> 5315;;;;N;;;;;
+2F15;KANGXI RADICAL RIGHT OPEN BOX;So;0;ON;<compat> 531A;;;;N;;;;;
+2F16;KANGXI RADICAL HIDING ENCLOSURE;So;0;ON;<compat> 5338;;;;N;;;;;
+2F17;KANGXI RADICAL TEN;So;0;ON;<compat> 5341;;;;N;;;;;
+2F18;KANGXI RADICAL DIVINATION;So;0;ON;<compat> 535C;;;;N;;;;;
+2F19;KANGXI RADICAL SEAL;So;0;ON;<compat> 5369;;;;N;;;;;
+2F1A;KANGXI RADICAL CLIFF;So;0;ON;<compat> 5382;;;;N;;;;;
+2F1B;KANGXI RADICAL PRIVATE;So;0;ON;<compat> 53B6;;;;N;;;;;
+2F1C;KANGXI RADICAL AGAIN;So;0;ON;<compat> 53C8;;;;N;;;;;
+2F1D;KANGXI RADICAL MOUTH;So;0;ON;<compat> 53E3;;;;N;;;;;
+2F1E;KANGXI RADICAL ENCLOSURE;So;0;ON;<compat> 56D7;;;;N;;;;;
+2F1F;KANGXI RADICAL EARTH;So;0;ON;<compat> 571F;;;;N;;;;;
+2F20;KANGXI RADICAL SCHOLAR;So;0;ON;<compat> 58EB;;;;N;;;;;
+2F21;KANGXI RADICAL GO;So;0;ON;<compat> 5902;;;;N;;;;;
+2F22;KANGXI RADICAL GO SLOWLY;So;0;ON;<compat> 590A;;;;N;;;;;
+2F23;KANGXI RADICAL EVENING;So;0;ON;<compat> 5915;;;;N;;;;;
+2F24;KANGXI RADICAL BIG;So;0;ON;<compat> 5927;;;;N;;;;;
+2F25;KANGXI RADICAL WOMAN;So;0;ON;<compat> 5973;;;;N;;;;;
+2F26;KANGXI RADICAL CHILD;So;0;ON;<compat> 5B50;;;;N;;;;;
+2F27;KANGXI RADICAL ROOF;So;0;ON;<compat> 5B80;;;;N;;;;;
+2F28;KANGXI RADICAL INCH;So;0;ON;<compat> 5BF8;;;;N;;;;;
+2F29;KANGXI RADICAL SMALL;So;0;ON;<compat> 5C0F;;;;N;;;;;
+2F2A;KANGXI RADICAL LAME;So;0;ON;<compat> 5C22;;;;N;;;;;
+2F2B;KANGXI RADICAL CORPSE;So;0;ON;<compat> 5C38;;;;N;;;;;
+2F2C;KANGXI RADICAL SPROUT;So;0;ON;<compat> 5C6E;;;;N;;;;;
+2F2D;KANGXI RADICAL MOUNTAIN;So;0;ON;<compat> 5C71;;;;N;;;;;
+2F2E;KANGXI RADICAL RIVER;So;0;ON;<compat> 5DDB;;;;N;;;;;
+2F2F;KANGXI RADICAL WORK;So;0;ON;<compat> 5DE5;;;;N;;;;;
+2F30;KANGXI RADICAL ONESELF;So;0;ON;<compat> 5DF1;;;;N;;;;;
+2F31;KANGXI RADICAL TURBAN;So;0;ON;<compat> 5DFE;;;;N;;;;;
+2F32;KANGXI RADICAL DRY;So;0;ON;<compat> 5E72;;;;N;;;;;
+2F33;KANGXI RADICAL SHORT THREAD;So;0;ON;<compat> 5E7A;;;;N;;;;;
+2F34;KANGXI RADICAL DOTTED CLIFF;So;0;ON;<compat> 5E7F;;;;N;;;;;
+2F35;KANGXI RADICAL LONG STRIDE;So;0;ON;<compat> 5EF4;;;;N;;;;;
+2F36;KANGXI RADICAL TWO HANDS;So;0;ON;<compat> 5EFE;;;;N;;;;;
+2F37;KANGXI RADICAL SHOOT;So;0;ON;<compat> 5F0B;;;;N;;;;;
+2F38;KANGXI RADICAL BOW;So;0;ON;<compat> 5F13;;;;N;;;;;
+2F39;KANGXI RADICAL SNOUT;So;0;ON;<compat> 5F50;;;;N;;;;;
+2F3A;KANGXI RADICAL BRISTLE;So;0;ON;<compat> 5F61;;;;N;;;;;
+2F3B;KANGXI RADICAL STEP;So;0;ON;<compat> 5F73;;;;N;;;;;
+2F3C;KANGXI RADICAL HEART;So;0;ON;<compat> 5FC3;;;;N;;;;;
+2F3D;KANGXI RADICAL HALBERD;So;0;ON;<compat> 6208;;;;N;;;;;
+2F3E;KANGXI RADICAL DOOR;So;0;ON;<compat> 6236;;;;N;;;;;
+2F3F;KANGXI RADICAL HAND;So;0;ON;<compat> 624B;;;;N;;;;;
+2F40;KANGXI RADICAL BRANCH;So;0;ON;<compat> 652F;;;;N;;;;;
+2F41;KANGXI RADICAL RAP;So;0;ON;<compat> 6534;;;;N;;;;;
+2F42;KANGXI RADICAL SCRIPT;So;0;ON;<compat> 6587;;;;N;;;;;
+2F43;KANGXI RADICAL DIPPER;So;0;ON;<compat> 6597;;;;N;;;;;
+2F44;KANGXI RADICAL AXE;So;0;ON;<compat> 65A4;;;;N;;;;;
+2F45;KANGXI RADICAL SQUARE;So;0;ON;<compat> 65B9;;;;N;;;;;
+2F46;KANGXI RADICAL NOT;So;0;ON;<compat> 65E0;;;;N;;;;;
+2F47;KANGXI RADICAL SUN;So;0;ON;<compat> 65E5;;;;N;;;;;
+2F48;KANGXI RADICAL SAY;So;0;ON;<compat> 66F0;;;;N;;;;;
+2F49;KANGXI RADICAL MOON;So;0;ON;<compat> 6708;;;;N;;;;;
+2F4A;KANGXI RADICAL TREE;So;0;ON;<compat> 6728;;;;N;;;;;
+2F4B;KANGXI RADICAL LACK;So;0;ON;<compat> 6B20;;;;N;;;;;
+2F4C;KANGXI RADICAL STOP;So;0;ON;<compat> 6B62;;;;N;;;;;
+2F4D;KANGXI RADICAL DEATH;So;0;ON;<compat> 6B79;;;;N;;;;;
+2F4E;KANGXI RADICAL WEAPON;So;0;ON;<compat> 6BB3;;;;N;;;;;
+2F4F;KANGXI RADICAL DO NOT;So;0;ON;<compat> 6BCB;;;;N;;;;;
+2F50;KANGXI RADICAL COMPARE;So;0;ON;<compat> 6BD4;;;;N;;;;;
+2F51;KANGXI RADICAL FUR;So;0;ON;<compat> 6BDB;;;;N;;;;;
+2F52;KANGXI RADICAL CLAN;So;0;ON;<compat> 6C0F;;;;N;;;;;
+2F53;KANGXI RADICAL STEAM;So;0;ON;<compat> 6C14;;;;N;;;;;
+2F54;KANGXI RADICAL WATER;So;0;ON;<compat> 6C34;;;;N;;;;;
+2F55;KANGXI RADICAL FIRE;So;0;ON;<compat> 706B;;;;N;;;;;
+2F56;KANGXI RADICAL CLAW;So;0;ON;<compat> 722A;;;;N;;;;;
+2F57;KANGXI RADICAL FATHER;So;0;ON;<compat> 7236;;;;N;;;;;
+2F58;KANGXI RADICAL DOUBLE X;So;0;ON;<compat> 723B;;;;N;;;;;
+2F59;KANGXI RADICAL HALF TREE TRUNK;So;0;ON;<compat> 723F;;;;N;;;;;
+2F5A;KANGXI RADICAL SLICE;So;0;ON;<compat> 7247;;;;N;;;;;
+2F5B;KANGXI RADICAL FANG;So;0;ON;<compat> 7259;;;;N;;;;;
+2F5C;KANGXI RADICAL COW;So;0;ON;<compat> 725B;;;;N;;;;;
+2F5D;KANGXI RADICAL DOG;So;0;ON;<compat> 72AC;;;;N;;;;;
+2F5E;KANGXI RADICAL PROFOUND;So;0;ON;<compat> 7384;;;;N;;;;;
+2F5F;KANGXI RADICAL JADE;So;0;ON;<compat> 7389;;;;N;;;;;
+2F60;KANGXI RADICAL MELON;So;0;ON;<compat> 74DC;;;;N;;;;;
+2F61;KANGXI RADICAL TILE;So;0;ON;<compat> 74E6;;;;N;;;;;
+2F62;KANGXI RADICAL SWEET;So;0;ON;<compat> 7518;;;;N;;;;;
+2F63;KANGXI RADICAL LIFE;So;0;ON;<compat> 751F;;;;N;;;;;
+2F64;KANGXI RADICAL USE;So;0;ON;<compat> 7528;;;;N;;;;;
+2F65;KANGXI RADICAL FIELD;So;0;ON;<compat> 7530;;;;N;;;;;
+2F66;KANGXI RADICAL BOLT OF CLOTH;So;0;ON;<compat> 758B;;;;N;;;;;
+2F67;KANGXI RADICAL SICKNESS;So;0;ON;<compat> 7592;;;;N;;;;;
+2F68;KANGXI RADICAL DOTTED TENT;So;0;ON;<compat> 7676;;;;N;;;;;
+2F69;KANGXI RADICAL WHITE;So;0;ON;<compat> 767D;;;;N;;;;;
+2F6A;KANGXI RADICAL SKIN;So;0;ON;<compat> 76AE;;;;N;;;;;
+2F6B;KANGXI RADICAL DISH;So;0;ON;<compat> 76BF;;;;N;;;;;
+2F6C;KANGXI RADICAL EYE;So;0;ON;<compat> 76EE;;;;N;;;;;
+2F6D;KANGXI RADICAL SPEAR;So;0;ON;<compat> 77DB;;;;N;;;;;
+2F6E;KANGXI RADICAL ARROW;So;0;ON;<compat> 77E2;;;;N;;;;;
+2F6F;KANGXI RADICAL STONE;So;0;ON;<compat> 77F3;;;;N;;;;;
+2F70;KANGXI RADICAL SPIRIT;So;0;ON;<compat> 793A;;;;N;;;;;
+2F71;KANGXI RADICAL TRACK;So;0;ON;<compat> 79B8;;;;N;;;;;
+2F72;KANGXI RADICAL GRAIN;So;0;ON;<compat> 79BE;;;;N;;;;;
+2F73;KANGXI RADICAL CAVE;So;0;ON;<compat> 7A74;;;;N;;;;;
+2F74;KANGXI RADICAL STAND;So;0;ON;<compat> 7ACB;;;;N;;;;;
+2F75;KANGXI RADICAL BAMBOO;So;0;ON;<compat> 7AF9;;;;N;;;;;
+2F76;KANGXI RADICAL RICE;So;0;ON;<compat> 7C73;;;;N;;;;;
+2F77;KANGXI RADICAL SILK;So;0;ON;<compat> 7CF8;;;;N;;;;;
+2F78;KANGXI RADICAL JAR;So;0;ON;<compat> 7F36;;;;N;;;;;
+2F79;KANGXI RADICAL NET;So;0;ON;<compat> 7F51;;;;N;;;;;
+2F7A;KANGXI RADICAL SHEEP;So;0;ON;<compat> 7F8A;;;;N;;;;;
+2F7B;KANGXI RADICAL FEATHER;So;0;ON;<compat> 7FBD;;;;N;;;;;
+2F7C;KANGXI RADICAL OLD;So;0;ON;<compat> 8001;;;;N;;;;;
+2F7D;KANGXI RADICAL AND;So;0;ON;<compat> 800C;;;;N;;;;;
+2F7E;KANGXI RADICAL PLOW;So;0;ON;<compat> 8012;;;;N;;;;;
+2F7F;KANGXI RADICAL EAR;So;0;ON;<compat> 8033;;;;N;;;;;
+2F80;KANGXI RADICAL BRUSH;So;0;ON;<compat> 807F;;;;N;;;;;
+2F81;KANGXI RADICAL MEAT;So;0;ON;<compat> 8089;;;;N;;;;;
+2F82;KANGXI RADICAL MINISTER;So;0;ON;<compat> 81E3;;;;N;;;;;
+2F83;KANGXI RADICAL SELF;So;0;ON;<compat> 81EA;;;;N;;;;;
+2F84;KANGXI RADICAL ARRIVE;So;0;ON;<compat> 81F3;;;;N;;;;;
+2F85;KANGXI RADICAL MORTAR;So;0;ON;<compat> 81FC;;;;N;;;;;
+2F86;KANGXI RADICAL TONGUE;So;0;ON;<compat> 820C;;;;N;;;;;
+2F87;KANGXI RADICAL OPPOSE;So;0;ON;<compat> 821B;;;;N;;;;;
+2F88;KANGXI RADICAL BOAT;So;0;ON;<compat> 821F;;;;N;;;;;
+2F89;KANGXI RADICAL STOPPING;So;0;ON;<compat> 826E;;;;N;;;;;
+2F8A;KANGXI RADICAL COLOR;So;0;ON;<compat> 8272;;;;N;;;;;
+2F8B;KANGXI RADICAL GRASS;So;0;ON;<compat> 8278;;;;N;;;;;
+2F8C;KANGXI RADICAL TIGER;So;0;ON;<compat> 864D;;;;N;;;;;
+2F8D;KANGXI RADICAL INSECT;So;0;ON;<compat> 866B;;;;N;;;;;
+2F8E;KANGXI RADICAL BLOOD;So;0;ON;<compat> 8840;;;;N;;;;;
+2F8F;KANGXI RADICAL WALK ENCLOSURE;So;0;ON;<compat> 884C;;;;N;;;;;
+2F90;KANGXI RADICAL CLOTHES;So;0;ON;<compat> 8863;;;;N;;;;;
+2F91;KANGXI RADICAL WEST;So;0;ON;<compat> 897E;;;;N;;;;;
+2F92;KANGXI RADICAL SEE;So;0;ON;<compat> 898B;;;;N;;;;;
+2F93;KANGXI RADICAL HORN;So;0;ON;<compat> 89D2;;;;N;;;;;
+2F94;KANGXI RADICAL SPEECH;So;0;ON;<compat> 8A00;;;;N;;;;;
+2F95;KANGXI RADICAL VALLEY;So;0;ON;<compat> 8C37;;;;N;;;;;
+2F96;KANGXI RADICAL BEAN;So;0;ON;<compat> 8C46;;;;N;;;;;
+2F97;KANGXI RADICAL PIG;So;0;ON;<compat> 8C55;;;;N;;;;;
+2F98;KANGXI RADICAL BADGER;So;0;ON;<compat> 8C78;;;;N;;;;;
+2F99;KANGXI RADICAL SHELL;So;0;ON;<compat> 8C9D;;;;N;;;;;
+2F9A;KANGXI RADICAL RED;So;0;ON;<compat> 8D64;;;;N;;;;;
+2F9B;KANGXI RADICAL RUN;So;0;ON;<compat> 8D70;;;;N;;;;;
+2F9C;KANGXI RADICAL FOOT;So;0;ON;<compat> 8DB3;;;;N;;;;;
+2F9D;KANGXI RADICAL BODY;So;0;ON;<compat> 8EAB;;;;N;;;;;
+2F9E;KANGXI RADICAL CART;So;0;ON;<compat> 8ECA;;;;N;;;;;
+2F9F;KANGXI RADICAL BITTER;So;0;ON;<compat> 8F9B;;;;N;;;;;
+2FA0;KANGXI RADICAL MORNING;So;0;ON;<compat> 8FB0;;;;N;;;;;
+2FA1;KANGXI RADICAL WALK;So;0;ON;<compat> 8FB5;;;;N;;;;;
+2FA2;KANGXI RADICAL CITY;So;0;ON;<compat> 9091;;;;N;;;;;
+2FA3;KANGXI RADICAL WINE;So;0;ON;<compat> 9149;;;;N;;;;;
+2FA4;KANGXI RADICAL DISTINGUISH;So;0;ON;<compat> 91C6;;;;N;;;;;
+2FA5;KANGXI RADICAL VILLAGE;So;0;ON;<compat> 91CC;;;;N;;;;;
+2FA6;KANGXI RADICAL GOLD;So;0;ON;<compat> 91D1;;;;N;;;;;
+2FA7;KANGXI RADICAL LONG;So;0;ON;<compat> 9577;;;;N;;;;;
+2FA8;KANGXI RADICAL GATE;So;0;ON;<compat> 9580;;;;N;;;;;
+2FA9;KANGXI RADICAL MOUND;So;0;ON;<compat> 961C;;;;N;;;;;
+2FAA;KANGXI RADICAL SLAVE;So;0;ON;<compat> 96B6;;;;N;;;;;
+2FAB;KANGXI RADICAL SHORT TAILED BIRD;So;0;ON;<compat> 96B9;;;;N;;;;;
+2FAC;KANGXI RADICAL RAIN;So;0;ON;<compat> 96E8;;;;N;;;;;
+2FAD;KANGXI RADICAL BLUE;So;0;ON;<compat> 9751;;;;N;;;;;
+2FAE;KANGXI RADICAL WRONG;So;0;ON;<compat> 975E;;;;N;;;;;
+2FAF;KANGXI RADICAL FACE;So;0;ON;<compat> 9762;;;;N;;;;;
+2FB0;KANGXI RADICAL LEATHER;So;0;ON;<compat> 9769;;;;N;;;;;
+2FB1;KANGXI RADICAL TANNED LEATHER;So;0;ON;<compat> 97CB;;;;N;;;;;
+2FB2;KANGXI RADICAL LEEK;So;0;ON;<compat> 97ED;;;;N;;;;;
+2FB3;KANGXI RADICAL SOUND;So;0;ON;<compat> 97F3;;;;N;;;;;
+2FB4;KANGXI RADICAL LEAF;So;0;ON;<compat> 9801;;;;N;;;;;
+2FB5;KANGXI RADICAL WIND;So;0;ON;<compat> 98A8;;;;N;;;;;
+2FB6;KANGXI RADICAL FLY;So;0;ON;<compat> 98DB;;;;N;;;;;
+2FB7;KANGXI RADICAL EAT;So;0;ON;<compat> 98DF;;;;N;;;;;
+2FB8;KANGXI RADICAL HEAD;So;0;ON;<compat> 9996;;;;N;;;;;
+2FB9;KANGXI RADICAL FRAGRANT;So;0;ON;<compat> 9999;;;;N;;;;;
+2FBA;KANGXI RADICAL HORSE;So;0;ON;<compat> 99AC;;;;N;;;;;
+2FBB;KANGXI RADICAL BONE;So;0;ON;<compat> 9AA8;;;;N;;;;;
+2FBC;KANGXI RADICAL TALL;So;0;ON;<compat> 9AD8;;;;N;;;;;
+2FBD;KANGXI RADICAL HAIR;So;0;ON;<compat> 9ADF;;;;N;;;;;
+2FBE;KANGXI RADICAL FIGHT;So;0;ON;<compat> 9B25;;;;N;;;;;
+2FBF;KANGXI RADICAL SACRIFICIAL WINE;So;0;ON;<compat> 9B2F;;;;N;;;;;
+2FC0;KANGXI RADICAL CAULDRON;So;0;ON;<compat> 9B32;;;;N;;;;;
+2FC1;KANGXI RADICAL GHOST;So;0;ON;<compat> 9B3C;;;;N;;;;;
+2FC2;KANGXI RADICAL FISH;So;0;ON;<compat> 9B5A;;;;N;;;;;
+2FC3;KANGXI RADICAL BIRD;So;0;ON;<compat> 9CE5;;;;N;;;;;
+2FC4;KANGXI RADICAL SALT;So;0;ON;<compat> 9E75;;;;N;;;;;
+2FC5;KANGXI RADICAL DEER;So;0;ON;<compat> 9E7F;;;;N;;;;;
+2FC6;KANGXI RADICAL WHEAT;So;0;ON;<compat> 9EA5;;;;N;;;;;
+2FC7;KANGXI RADICAL HEMP;So;0;ON;<compat> 9EBB;;;;N;;;;;
+2FC8;KANGXI RADICAL YELLOW;So;0;ON;<compat> 9EC3;;;;N;;;;;
+2FC9;KANGXI RADICAL MILLET;So;0;ON;<compat> 9ECD;;;;N;;;;;
+2FCA;KANGXI RADICAL BLACK;So;0;ON;<compat> 9ED1;;;;N;;;;;
+2FCB;KANGXI RADICAL EMBROIDERY;So;0;ON;<compat> 9EF9;;;;N;;;;;
+2FCC;KANGXI RADICAL FROG;So;0;ON;<compat> 9EFD;;;;N;;;;;
+2FCD;KANGXI RADICAL TRIPOD;So;0;ON;<compat> 9F0E;;;;N;;;;;
+2FCE;KANGXI RADICAL DRUM;So;0;ON;<compat> 9F13;;;;N;;;;;
+2FCF;KANGXI RADICAL RAT;So;0;ON;<compat> 9F20;;;;N;;;;;
+2FD0;KANGXI RADICAL NOSE;So;0;ON;<compat> 9F3B;;;;N;;;;;
+2FD1;KANGXI RADICAL EVEN;So;0;ON;<compat> 9F4A;;;;N;;;;;
+2FD2;KANGXI RADICAL TOOTH;So;0;ON;<compat> 9F52;;;;N;;;;;
+2FD3;KANGXI RADICAL DRAGON;So;0;ON;<compat> 9F8D;;;;N;;;;;
+2FD4;KANGXI RADICAL TURTLE;So;0;ON;<compat> 9F9C;;;;N;;;;;
+2FD5;KANGXI RADICAL FLUTE;So;0;ON;<compat> 9FA0;;;;N;;;;;
+2FF0;IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO RIGHT;So;0;ON;;;;;N;;;;;
+2FF1;IDEOGRAPHIC DESCRIPTION CHARACTER ABOVE TO BELOW;So;0;ON;;;;;N;;;;;
+2FF2;IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO MIDDLE AND RIGHT;So;0;ON;;;;;N;;;;;
+2FF3;IDEOGRAPHIC DESCRIPTION CHARACTER ABOVE TO MIDDLE AND BELOW;So;0;ON;;;;;N;;;;;
+2FF4;IDEOGRAPHIC DESCRIPTION CHARACTER FULL SURROUND;So;0;ON;;;;;N;;;;;
+2FF5;IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM ABOVE;So;0;ON;;;;;N;;;;;
+2FF6;IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM BELOW;So;0;ON;;;;;N;;;;;
+2FF7;IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM LEFT;So;0;ON;;;;;N;;;;;
+2FF8;IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM UPPER LEFT;So;0;ON;;;;;N;;;;;
+2FF9;IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM UPPER RIGHT;So;0;ON;;;;;N;;;;;
+2FFA;IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM LOWER LEFT;So;0;ON;;;;;N;;;;;
+2FFB;IDEOGRAPHIC DESCRIPTION CHARACTER OVERLAID;So;0;ON;;;;;N;;;;;
+3000;IDEOGRAPHIC SPACE;Zs;0;WS;<wide> 0020;;;;N;;;;;
+3001;IDEOGRAPHIC COMMA;Po;0;ON;;;;;N;;;;;
+3002;IDEOGRAPHIC FULL STOP;Po;0;ON;;;;;N;IDEOGRAPHIC PERIOD;;;;
+3003;DITTO MARK;Po;0;ON;;;;;N;;;;;
+3004;JAPANESE INDUSTRIAL STANDARD SYMBOL;So;0;ON;;;;;N;;;;;
+3005;IDEOGRAPHIC ITERATION MARK;Lm;0;L;;;;;N;;;;;
+3006;IDEOGRAPHIC CLOSING MARK;Lo;0;L;;;;;N;;;;;
+3007;IDEOGRAPHIC NUMBER ZERO;Nl;0;L;;;;0;N;;;;;
+3008;LEFT ANGLE BRACKET;Ps;0;ON;;;;;Y;OPENING ANGLE BRACKET;;;;
+3009;RIGHT ANGLE BRACKET;Pe;0;ON;;;;;Y;CLOSING ANGLE BRACKET;;;;
+300A;LEFT DOUBLE ANGLE BRACKET;Ps;0;ON;;;;;Y;OPENING DOUBLE ANGLE BRACKET;;;;
+300B;RIGHT DOUBLE ANGLE BRACKET;Pe;0;ON;;;;;Y;CLOSING DOUBLE ANGLE BRACKET;;;;
+300C;LEFT CORNER BRACKET;Ps;0;ON;;;;;Y;OPENING CORNER BRACKET;;;;
+300D;RIGHT CORNER BRACKET;Pe;0;ON;;;;;Y;CLOSING CORNER BRACKET;;;;
+300E;LEFT WHITE CORNER BRACKET;Ps;0;ON;;;;;Y;OPENING WHITE CORNER BRACKET;;;;
+300F;RIGHT WHITE CORNER BRACKET;Pe;0;ON;;;;;Y;CLOSING WHITE CORNER BRACKET;;;;
+3010;LEFT BLACK LENTICULAR BRACKET;Ps;0;ON;;;;;Y;OPENING BLACK LENTICULAR BRACKET;;;;
+3011;RIGHT BLACK LENTICULAR BRACKET;Pe;0;ON;;;;;Y;CLOSING BLACK LENTICULAR BRACKET;;;;
+3012;POSTAL MARK;So;0;ON;;;;;N;;;;;
+3013;GETA MARK;So;0;ON;;;;;N;;;;;
+3014;LEFT TORTOISE SHELL BRACKET;Ps;0;ON;;;;;Y;OPENING TORTOISE SHELL BRACKET;;;;
+3015;RIGHT TORTOISE SHELL BRACKET;Pe;0;ON;;;;;Y;CLOSING TORTOISE SHELL BRACKET;;;;
+3016;LEFT WHITE LENTICULAR BRACKET;Ps;0;ON;;;;;Y;OPENING WHITE LENTICULAR BRACKET;;;;
+3017;RIGHT WHITE LENTICULAR BRACKET;Pe;0;ON;;;;;Y;CLOSING WHITE LENTICULAR BRACKET;;;;
+3018;LEFT WHITE TORTOISE SHELL BRACKET;Ps;0;ON;;;;;Y;OPENING WHITE TORTOISE SHELL BRACKET;;;;
+3019;RIGHT WHITE TORTOISE SHELL BRACKET;Pe;0;ON;;;;;Y;CLOSING WHITE TORTOISE SHELL BRACKET;;;;
+301A;LEFT WHITE SQUARE BRACKET;Ps;0;ON;;;;;Y;OPENING WHITE SQUARE BRACKET;;;;
+301B;RIGHT WHITE SQUARE BRACKET;Pe;0;ON;;;;;Y;CLOSING WHITE SQUARE BRACKET;;;;
+301C;WAVE DASH;Pd;0;ON;;;;;N;;;;;
+301D;REVERSED DOUBLE PRIME QUOTATION MARK;Ps;0;ON;;;;;N;;;;;
+301E;DOUBLE PRIME QUOTATION MARK;Pe;0;ON;;;;;N;;;;;
+301F;LOW DOUBLE PRIME QUOTATION MARK;Pe;0;ON;;;;;N;;;;;
+3020;POSTAL MARK FACE;So;0;ON;;;;;N;;;;;
+3021;HANGZHOU NUMERAL ONE;Nl;0;L;;;;1;N;;;;;
+3022;HANGZHOU NUMERAL TWO;Nl;0;L;;;;2;N;;;;;
+3023;HANGZHOU NUMERAL THREE;Nl;0;L;;;;3;N;;;;;
+3024;HANGZHOU NUMERAL FOUR;Nl;0;L;;;;4;N;;;;;
+3025;HANGZHOU NUMERAL FIVE;Nl;0;L;;;;5;N;;;;;
+3026;HANGZHOU NUMERAL SIX;Nl;0;L;;;;6;N;;;;;
+3027;HANGZHOU NUMERAL SEVEN;Nl;0;L;;;;7;N;;;;;
+3028;HANGZHOU NUMERAL EIGHT;Nl;0;L;;;;8;N;;;;;
+3029;HANGZHOU NUMERAL NINE;Nl;0;L;;;;9;N;;;;;
+302A;IDEOGRAPHIC LEVEL TONE MARK;Mn;218;NSM;;;;;N;;;;;
+302B;IDEOGRAPHIC RISING TONE MARK;Mn;228;NSM;;;;;N;;;;;
+302C;IDEOGRAPHIC DEPARTING TONE MARK;Mn;232;NSM;;;;;N;;;;;
+302D;IDEOGRAPHIC ENTERING TONE MARK;Mn;222;NSM;;;;;N;;;;;
+302E;HANGUL SINGLE DOT TONE MARK;Mn;224;NSM;;;;;N;;;;;
+302F;HANGUL DOUBLE DOT TONE MARK;Mn;224;NSM;;;;;N;;;;;
+3030;WAVY DASH;Pd;0;ON;;;;;N;;;;;
+3031;VERTICAL KANA REPEAT MARK;Lm;0;L;;;;;N;;;;;
+3032;VERTICAL KANA REPEAT WITH VOICED SOUND MARK;Lm;0;L;;;;;N;;;;;
+3033;VERTICAL KANA REPEAT MARK UPPER HALF;Lm;0;L;;;;;N;;;;;
+3034;VERTICAL KANA REPEAT WITH VOICED SOUND MARK UPPER HALF;Lm;0;L;;;;;N;;;;;
+3035;VERTICAL KANA REPEAT MARK LOWER HALF;Lm;0;L;;;;;N;;;;;
+3036;CIRCLED POSTAL MARK;So;0;ON;<compat> 3012;;;;N;;;;;
+3037;IDEOGRAPHIC TELEGRAPH LINE FEED SEPARATOR SYMBOL;So;0;ON;;;;;N;;;;;
+3038;HANGZHOU NUMERAL TEN;Nl;0;L;<compat> 5341;;;10;N;;;;;
+3039;HANGZHOU NUMERAL TWENTY;Nl;0;L;<compat> 5344;;;20;N;;;;;
+303A;HANGZHOU NUMERAL THIRTY;Nl;0;L;<compat> 5345;;;30;N;;;;;
+303E;IDEOGRAPHIC VARIATION INDICATOR;So;0;ON;;;;;N;;;;;
+303F;IDEOGRAPHIC HALF FILL SPACE;So;0;ON;;;;;N;;;;;
+3041;HIRAGANA LETTER SMALL A;Lo;0;L;;;;;N;;;;;
+3042;HIRAGANA LETTER A;Lo;0;L;;;;;N;;;;;
+3043;HIRAGANA LETTER SMALL I;Lo;0;L;;;;;N;;;;;
+3044;HIRAGANA LETTER I;Lo;0;L;;;;;N;;;;;
+3045;HIRAGANA LETTER SMALL U;Lo;0;L;;;;;N;;;;;
+3046;HIRAGANA LETTER U;Lo;0;L;;;;;N;;;;;
+3047;HIRAGANA LETTER SMALL E;Lo;0;L;;;;;N;;;;;
+3048;HIRAGANA LETTER E;Lo;0;L;;;;;N;;;;;
+3049;HIRAGANA LETTER SMALL O;Lo;0;L;;;;;N;;;;;
+304A;HIRAGANA LETTER O;Lo;0;L;;;;;N;;;;;
+304B;HIRAGANA LETTER KA;Lo;0;L;;;;;N;;;;;
+304C;HIRAGANA LETTER GA;Lo;0;L;304B 3099;;;;N;;;;;
+304D;HIRAGANA LETTER KI;Lo;0;L;;;;;N;;;;;
+304E;HIRAGANA LETTER GI;Lo;0;L;304D 3099;;;;N;;;;;
+304F;HIRAGANA LETTER KU;Lo;0;L;;;;;N;;;;;
+3050;HIRAGANA LETTER GU;Lo;0;L;304F 3099;;;;N;;;;;
+3051;HIRAGANA LETTER KE;Lo;0;L;;;;;N;;;;;
+3052;HIRAGANA LETTER GE;Lo;0;L;3051 3099;;;;N;;;;;
+3053;HIRAGANA LETTER KO;Lo;0;L;;;;;N;;;;;
+3054;HIRAGANA LETTER GO;Lo;0;L;3053 3099;;;;N;;;;;
+3055;HIRAGANA LETTER SA;Lo;0;L;;;;;N;;;;;
+3056;HIRAGANA LETTER ZA;Lo;0;L;3055 3099;;;;N;;;;;
+3057;HIRAGANA LETTER SI;Lo;0;L;;;;;N;;;;;
+3058;HIRAGANA LETTER ZI;Lo;0;L;3057 3099;;;;N;;;;;
+3059;HIRAGANA LETTER SU;Lo;0;L;;;;;N;;;;;
+305A;HIRAGANA LETTER ZU;Lo;0;L;3059 3099;;;;N;;;;;
+305B;HIRAGANA LETTER SE;Lo;0;L;;;;;N;;;;;
+305C;HIRAGANA LETTER ZE;Lo;0;L;305B 3099;;;;N;;;;;
+305D;HIRAGANA LETTER SO;Lo;0;L;;;;;N;;;;;
+305E;HIRAGANA LETTER ZO;Lo;0;L;305D 3099;;;;N;;;;;
+305F;HIRAGANA LETTER TA;Lo;0;L;;;;;N;;;;;
+3060;HIRAGANA LETTER DA;Lo;0;L;305F 3099;;;;N;;;;;
+3061;HIRAGANA LETTER TI;Lo;0;L;;;;;N;;;;;
+3062;HIRAGANA LETTER DI;Lo;0;L;3061 3099;;;;N;;;;;
+3063;HIRAGANA LETTER SMALL TU;Lo;0;L;;;;;N;;;;;
+3064;HIRAGANA LETTER TU;Lo;0;L;;;;;N;;;;;
+3065;HIRAGANA LETTER DU;Lo;0;L;3064 3099;;;;N;;;;;
+3066;HIRAGANA LETTER TE;Lo;0;L;;;;;N;;;;;
+3067;HIRAGANA LETTER DE;Lo;0;L;3066 3099;;;;N;;;;;
+3068;HIRAGANA LETTER TO;Lo;0;L;;;;;N;;;;;
+3069;HIRAGANA LETTER DO;Lo;0;L;3068 3099;;;;N;;;;;
+306A;HIRAGANA LETTER NA;Lo;0;L;;;;;N;;;;;
+306B;HIRAGANA LETTER NI;Lo;0;L;;;;;N;;;;;
+306C;HIRAGANA LETTER NU;Lo;0;L;;;;;N;;;;;
+306D;HIRAGANA LETTER NE;Lo;0;L;;;;;N;;;;;
+306E;HIRAGANA LETTER NO;Lo;0;L;;;;;N;;;;;
+306F;HIRAGANA LETTER HA;Lo;0;L;;;;;N;;;;;
+3070;HIRAGANA LETTER BA;Lo;0;L;306F 3099;;;;N;;;;;
+3071;HIRAGANA LETTER PA;Lo;0;L;306F 309A;;;;N;;;;;
+3072;HIRAGANA LETTER HI;Lo;0;L;;;;;N;;;;;
+3073;HIRAGANA LETTER BI;Lo;0;L;3072 3099;;;;N;;;;;
+3074;HIRAGANA LETTER PI;Lo;0;L;3072 309A;;;;N;;;;;
+3075;HIRAGANA LETTER HU;Lo;0;L;;;;;N;;;;;
+3076;HIRAGANA LETTER BU;Lo;0;L;3075 3099;;;;N;;;;;
+3077;HIRAGANA LETTER PU;Lo;0;L;3075 309A;;;;N;;;;;
+3078;HIRAGANA LETTER HE;Lo;0;L;;;;;N;;;;;
+3079;HIRAGANA LETTER BE;Lo;0;L;3078 3099;;;;N;;;;;
+307A;HIRAGANA LETTER PE;Lo;0;L;3078 309A;;;;N;;;;;
+307B;HIRAGANA LETTER HO;Lo;0;L;;;;;N;;;;;
+307C;HIRAGANA LETTER BO;Lo;0;L;307B 3099;;;;N;;;;;
+307D;HIRAGANA LETTER PO;Lo;0;L;307B 309A;;;;N;;;;;
+307E;HIRAGANA LETTER MA;Lo;0;L;;;;;N;;;;;
+307F;HIRAGANA LETTER MI;Lo;0;L;;;;;N;;;;;
+3080;HIRAGANA LETTER MU;Lo;0;L;;;;;N;;;;;
+3081;HIRAGANA LETTER ME;Lo;0;L;;;;;N;;;;;
+3082;HIRAGANA LETTER MO;Lo;0;L;;;;;N;;;;;
+3083;HIRAGANA LETTER SMALL YA;Lo;0;L;;;;;N;;;;;
+3084;HIRAGANA LETTER YA;Lo;0;L;;;;;N;;;;;
+3085;HIRAGANA LETTER SMALL YU;Lo;0;L;;;;;N;;;;;
+3086;HIRAGANA LETTER YU;Lo;0;L;;;;;N;;;;;
+3087;HIRAGANA LETTER SMALL YO;Lo;0;L;;;;;N;;;;;
+3088;HIRAGANA LETTER YO;Lo;0;L;;;;;N;;;;;
+3089;HIRAGANA LETTER RA;Lo;0;L;;;;;N;;;;;
+308A;HIRAGANA LETTER RI;Lo;0;L;;;;;N;;;;;
+308B;HIRAGANA LETTER RU;Lo;0;L;;;;;N;;;;;
+308C;HIRAGANA LETTER RE;Lo;0;L;;;;;N;;;;;
+308D;HIRAGANA LETTER RO;Lo;0;L;;;;;N;;;;;
+308E;HIRAGANA LETTER SMALL WA;Lo;0;L;;;;;N;;;;;
+308F;HIRAGANA LETTER WA;Lo;0;L;;;;;N;;;;;
+3090;HIRAGANA LETTER WI;Lo;0;L;;;;;N;;;;;
+3091;HIRAGANA LETTER WE;Lo;0;L;;;;;N;;;;;
+3092;HIRAGANA LETTER WO;Lo;0;L;;;;;N;;;;;
+3093;HIRAGANA LETTER N;Lo;0;L;;;;;N;;;;;
+3094;HIRAGANA LETTER VU;Lo;0;L;3046 3099;;;;N;;;;;
+3099;COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK;Mn;8;NSM;;;;;N;NON-SPACING KATAKANA-HIRAGANA VOICED SOUND MARK;;;;
+309A;COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK;Mn;8;NSM;;;;;N;NON-SPACING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK;;;;
+309B;KATAKANA-HIRAGANA VOICED SOUND MARK;Sk;0;ON;<compat> 0020 3099;;;;N;;;;;
+309C;KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK;Sk;0;ON;<compat> 0020 309A;;;;N;;;;;
+309D;HIRAGANA ITERATION MARK;Lm;0;L;;;;;N;;;;;
+309E;HIRAGANA VOICED ITERATION MARK;Lm;0;L;309D 3099;;;;N;;;;;
+30A1;KATAKANA LETTER SMALL A;Lo;0;L;;;;;N;;;;;
+30A2;KATAKANA LETTER A;Lo;0;L;;;;;N;;;;;
+30A3;KATAKANA LETTER SMALL I;Lo;0;L;;;;;N;;;;;
+30A4;KATAKANA LETTER I;Lo;0;L;;;;;N;;;;;
+30A5;KATAKANA LETTER SMALL U;Lo;0;L;;;;;N;;;;;
+30A6;KATAKANA LETTER U;Lo;0;L;;;;;N;;;;;
+30A7;KATAKANA LETTER SMALL E;Lo;0;L;;;;;N;;;;;
+30A8;KATAKANA LETTER E;Lo;0;L;;;;;N;;;;;
+30A9;KATAKANA LETTER SMALL O;Lo;0;L;;;;;N;;;;;
+30AA;KATAKANA LETTER O;Lo;0;L;;;;;N;;;;;
+30AB;KATAKANA LETTER KA;Lo;0;L;;;;;N;;;;;
+30AC;KATAKANA LETTER GA;Lo;0;L;30AB 3099;;;;N;;;;;
+30AD;KATAKANA LETTER KI;Lo;0;L;;;;;N;;;;;
+30AE;KATAKANA LETTER GI;Lo;0;L;30AD 3099;;;;N;;;;;
+30AF;KATAKANA LETTER KU;Lo;0;L;;;;;N;;;;;
+30B0;KATAKANA LETTER GU;Lo;0;L;30AF 3099;;;;N;;;;;
+30B1;KATAKANA LETTER KE;Lo;0;L;;;;;N;;;;;
+30B2;KATAKANA LETTER GE;Lo;0;L;30B1 3099;;;;N;;;;;
+30B3;KATAKANA LETTER KO;Lo;0;L;;;;;N;;;;;
+30B4;KATAKANA LETTER GO;Lo;0;L;30B3 3099;;;;N;;;;;
+30B5;KATAKANA LETTER SA;Lo;0;L;;;;;N;;;;;
+30B6;KATAKANA LETTER ZA;Lo;0;L;30B5 3099;;;;N;;;;;
+30B7;KATAKANA LETTER SI;Lo;0;L;;;;;N;;;;;
+30B8;KATAKANA LETTER ZI;Lo;0;L;30B7 3099;;;;N;;;;;
+30B9;KATAKANA LETTER SU;Lo;0;L;;;;;N;;;;;
+30BA;KATAKANA LETTER ZU;Lo;0;L;30B9 3099;;;;N;;;;;
+30BB;KATAKANA LETTER SE;Lo;0;L;;;;;N;;;;;
+30BC;KATAKANA LETTER ZE;Lo;0;L;30BB 3099;;;;N;;;;;
+30BD;KATAKANA LETTER SO;Lo;0;L;;;;;N;;;;;
+30BE;KATAKANA LETTER ZO;Lo;0;L;30BD 3099;;;;N;;;;;
+30BF;KATAKANA LETTER TA;Lo;0;L;;;;;N;;;;;
+30C0;KATAKANA LETTER DA;Lo;0;L;30BF 3099;;;;N;;;;;
+30C1;KATAKANA LETTER TI;Lo;0;L;;;;;N;;;;;
+30C2;KATAKANA LETTER DI;Lo;0;L;30C1 3099;;;;N;;;;;
+30C3;KATAKANA LETTER SMALL TU;Lo;0;L;;;;;N;;;;;
+30C4;KATAKANA LETTER TU;Lo;0;L;;;;;N;;;;;
+30C5;KATAKANA LETTER DU;Lo;0;L;30C4 3099;;;;N;;;;;
+30C6;KATAKANA LETTER TE;Lo;0;L;;;;;N;;;;;
+30C7;KATAKANA LETTER DE;Lo;0;L;30C6 3099;;;;N;;;;;
+30C8;KATAKANA LETTER TO;Lo;0;L;;;;;N;;;;;
+30C9;KATAKANA LETTER DO;Lo;0;L;30C8 3099;;;;N;;;;;
+30CA;KATAKANA LETTER NA;Lo;0;L;;;;;N;;;;;
+30CB;KATAKANA LETTER NI;Lo;0;L;;;;;N;;;;;
+30CC;KATAKANA LETTER NU;Lo;0;L;;;;;N;;;;;
+30CD;KATAKANA LETTER NE;Lo;0;L;;;;;N;;;;;
+30CE;KATAKANA LETTER NO;Lo;0;L;;;;;N;;;;;
+30CF;KATAKANA LETTER HA;Lo;0;L;;;;;N;;;;;
+30D0;KATAKANA LETTER BA;Lo;0;L;30CF 3099;;;;N;;;;;
+30D1;KATAKANA LETTER PA;Lo;0;L;30CF 309A;;;;N;;;;;
+30D2;KATAKANA LETTER HI;Lo;0;L;;;;;N;;;;;
+30D3;KATAKANA LETTER BI;Lo;0;L;30D2 3099;;;;N;;;;;
+30D4;KATAKANA LETTER PI;Lo;0;L;30D2 309A;;;;N;;;;;
+30D5;KATAKANA LETTER HU;Lo;0;L;;;;;N;;;;;
+30D6;KATAKANA LETTER BU;Lo;0;L;30D5 3099;;;;N;;;;;
+30D7;KATAKANA LETTER PU;Lo;0;L;30D5 309A;;;;N;;;;;
+30D8;KATAKANA LETTER HE;Lo;0;L;;;;;N;;;;;
+30D9;KATAKANA LETTER BE;Lo;0;L;30D8 3099;;;;N;;;;;
+30DA;KATAKANA LETTER PE;Lo;0;L;30D8 309A;;;;N;;;;;
+30DB;KATAKANA LETTER HO;Lo;0;L;;;;;N;;;;;
+30DC;KATAKANA LETTER BO;Lo;0;L;30DB 3099;;;;N;;;;;
+30DD;KATAKANA LETTER PO;Lo;0;L;30DB 309A;;;;N;;;;;
+30DE;KATAKANA LETTER MA;Lo;0;L;;;;;N;;;;;
+30DF;KATAKANA LETTER MI;Lo;0;L;;;;;N;;;;;
+30E0;KATAKANA LETTER MU;Lo;0;L;;;;;N;;;;;
+30E1;KATAKANA LETTER ME;Lo;0;L;;;;;N;;;;;
+30E2;KATAKANA LETTER MO;Lo;0;L;;;;;N;;;;;
+30E3;KATAKANA LETTER SMALL YA;Lo;0;L;;;;;N;;;;;
+30E4;KATAKANA LETTER YA;Lo;0;L;;;;;N;;;;;
+30E5;KATAKANA LETTER SMALL YU;Lo;0;L;;;;;N;;;;;
+30E6;KATAKANA LETTER YU;Lo;0;L;;;;;N;;;;;
+30E7;KATAKANA LETTER SMALL YO;Lo;0;L;;;;;N;;;;;
+30E8;KATAKANA LETTER YO;Lo;0;L;;;;;N;;;;;
+30E9;KATAKANA LETTER RA;Lo;0;L;;;;;N;;;;;
+30EA;KATAKANA LETTER RI;Lo;0;L;;;;;N;;;;;
+30EB;KATAKANA LETTER RU;Lo;0;L;;;;;N;;;;;
+30EC;KATAKANA LETTER RE;Lo;0;L;;;;;N;;;;;
+30ED;KATAKANA LETTER RO;Lo;0;L;;;;;N;;;;;
+30EE;KATAKANA LETTER SMALL WA;Lo;0;L;;;;;N;;;;;
+30EF;KATAKANA LETTER WA;Lo;0;L;;;;;N;;;;;
+30F0;KATAKANA LETTER WI;Lo;0;L;;;;;N;;;;;
+30F1;KATAKANA LETTER WE;Lo;0;L;;;;;N;;;;;
+30F2;KATAKANA LETTER WO;Lo;0;L;;;;;N;;;;;
+30F3;KATAKANA LETTER N;Lo;0;L;;;;;N;;;;;
+30F4;KATAKANA LETTER VU;Lo;0;L;30A6 3099;;;;N;;;;;
+30F5;KATAKANA LETTER SMALL KA;Lo;0;L;;;;;N;;;;;
+30F6;KATAKANA LETTER SMALL KE;Lo;0;L;;;;;N;;;;;
+30F7;KATAKANA LETTER VA;Lo;0;L;30EF 3099;;;;N;;;;;
+30F8;KATAKANA LETTER VI;Lo;0;L;30F0 3099;;;;N;;;;;
+30F9;KATAKANA LETTER VE;Lo;0;L;30F1 3099;;;;N;;;;;
+30FA;KATAKANA LETTER VO;Lo;0;L;30F2 3099;;;;N;;;;;
+30FB;KATAKANA MIDDLE DOT;Pc;0;ON;;;;;N;;;;;
+30FC;KATAKANA-HIRAGANA PROLONGED SOUND MARK;Lm;0;L;;;;;N;;;;;
+30FD;KATAKANA ITERATION MARK;Lm;0;L;;;;;N;;;;;
+30FE;KATAKANA VOICED ITERATION MARK;Lm;0;L;30FD 3099;;;;N;;;;;
+3105;BOPOMOFO LETTER B;Lo;0;L;;;;;N;;;;;
+3106;BOPOMOFO LETTER P;Lo;0;L;;;;;N;;;;;
+3107;BOPOMOFO LETTER M;Lo;0;L;;;;;N;;;;;
+3108;BOPOMOFO LETTER F;Lo;0;L;;;;;N;;;;;
+3109;BOPOMOFO LETTER D;Lo;0;L;;;;;N;;;;;
+310A;BOPOMOFO LETTER T;Lo;0;L;;;;;N;;;;;
+310B;BOPOMOFO LETTER N;Lo;0;L;;;;;N;;;;;
+310C;BOPOMOFO LETTER L;Lo;0;L;;;;;N;;;;;
+310D;BOPOMOFO LETTER G;Lo;0;L;;;;;N;;;;;
+310E;BOPOMOFO LETTER K;Lo;0;L;;;;;N;;;;;
+310F;BOPOMOFO LETTER H;Lo;0;L;;;;;N;;;;;
+3110;BOPOMOFO LETTER J;Lo;0;L;;;;;N;;;;;
+3111;BOPOMOFO LETTER Q;Lo;0;L;;;;;N;;;;;
+3112;BOPOMOFO LETTER X;Lo;0;L;;;;;N;;;;;
+3113;BOPOMOFO LETTER ZH;Lo;0;L;;;;;N;;;;;
+3114;BOPOMOFO LETTER CH;Lo;0;L;;;;;N;;;;;
+3115;BOPOMOFO LETTER SH;Lo;0;L;;;;;N;;;;;
+3116;BOPOMOFO LETTER R;Lo;0;L;;;;;N;;;;;
+3117;BOPOMOFO LETTER Z;Lo;0;L;;;;;N;;;;;
+3118;BOPOMOFO LETTER C;Lo;0;L;;;;;N;;;;;
+3119;BOPOMOFO LETTER S;Lo;0;L;;;;;N;;;;;
+311A;BOPOMOFO LETTER A;Lo;0;L;;;;;N;;;;;
+311B;BOPOMOFO LETTER O;Lo;0;L;;;;;N;;;;;
+311C;BOPOMOFO LETTER E;Lo;0;L;;;;;N;;;;;
+311D;BOPOMOFO LETTER EH;Lo;0;L;;;;;N;;;;;
+311E;BOPOMOFO LETTER AI;Lo;0;L;;;;;N;;;;;
+311F;BOPOMOFO LETTER EI;Lo;0;L;;;;;N;;;;;
+3120;BOPOMOFO LETTER AU;Lo;0;L;;;;;N;;;;;
+3121;BOPOMOFO LETTER OU;Lo;0;L;;;;;N;;;;;
+3122;BOPOMOFO LETTER AN;Lo;0;L;;;;;N;;;;;
+3123;BOPOMOFO LETTER EN;Lo;0;L;;;;;N;;;;;
+3124;BOPOMOFO LETTER ANG;Lo;0;L;;;;;N;;;;;
+3125;BOPOMOFO LETTER ENG;Lo;0;L;;;;;N;;;;;
+3126;BOPOMOFO LETTER ER;Lo;0;L;;;;;N;;;;;
+3127;BOPOMOFO LETTER I;Lo;0;L;;;;;N;;;;;
+3128;BOPOMOFO LETTER U;Lo;0;L;;;;;N;;;;;
+3129;BOPOMOFO LETTER IU;Lo;0;L;;;;;N;;;;;
+312A;BOPOMOFO LETTER V;Lo;0;L;;;;;N;;;;;
+312B;BOPOMOFO LETTER NG;Lo;0;L;;;;;N;;;;;
+312C;BOPOMOFO LETTER GN;Lo;0;L;;;;;N;;;;;
+3131;HANGUL LETTER KIYEOK;Lo;0;L;<compat> 1100;;;;N;HANGUL LETTER GIYEOG;;;;
+3132;HANGUL LETTER SSANGKIYEOK;Lo;0;L;<compat> 1101;;;;N;HANGUL LETTER SSANG GIYEOG;;;;
+3133;HANGUL LETTER KIYEOK-SIOS;Lo;0;L;<compat> 11AA;;;;N;HANGUL LETTER GIYEOG SIOS;;;;
+3134;HANGUL LETTER NIEUN;Lo;0;L;<compat> 1102;;;;N;;;;;
+3135;HANGUL LETTER NIEUN-CIEUC;Lo;0;L;<compat> 11AC;;;;N;HANGUL LETTER NIEUN JIEUJ;;;;
+3136;HANGUL LETTER NIEUN-HIEUH;Lo;0;L;<compat> 11AD;;;;N;HANGUL LETTER NIEUN HIEUH;;;;
+3137;HANGUL LETTER TIKEUT;Lo;0;L;<compat> 1103;;;;N;HANGUL LETTER DIGEUD;;;;
+3138;HANGUL LETTER SSANGTIKEUT;Lo;0;L;<compat> 1104;;;;N;HANGUL LETTER SSANG DIGEUD;;;;
+3139;HANGUL LETTER RIEUL;Lo;0;L;<compat> 1105;;;;N;HANGUL LETTER LIEUL;;;;
+313A;HANGUL LETTER RIEUL-KIYEOK;Lo;0;L;<compat> 11B0;;;;N;HANGUL LETTER LIEUL GIYEOG;;;;
+313B;HANGUL LETTER RIEUL-MIEUM;Lo;0;L;<compat> 11B1;;;;N;HANGUL LETTER LIEUL MIEUM;;;;
+313C;HANGUL LETTER RIEUL-PIEUP;Lo;0;L;<compat> 11B2;;;;N;HANGUL LETTER LIEUL BIEUB;;;;
+313D;HANGUL LETTER RIEUL-SIOS;Lo;0;L;<compat> 11B3;;;;N;HANGUL LETTER LIEUL SIOS;;;;
+313E;HANGUL LETTER RIEUL-THIEUTH;Lo;0;L;<compat> 11B4;;;;N;HANGUL LETTER LIEUL TIEUT;;;;
+313F;HANGUL LETTER RIEUL-PHIEUPH;Lo;0;L;<compat> 11B5;;;;N;HANGUL LETTER LIEUL PIEUP;;;;
+3140;HANGUL LETTER RIEUL-HIEUH;Lo;0;L;<compat> 111A;;;;N;HANGUL LETTER LIEUL HIEUH;;;;
+3141;HANGUL LETTER MIEUM;Lo;0;L;<compat> 1106;;;;N;;;;;
+3142;HANGUL LETTER PIEUP;Lo;0;L;<compat> 1107;;;;N;HANGUL LETTER BIEUB;;;;
+3143;HANGUL LETTER SSANGPIEUP;Lo;0;L;<compat> 1108;;;;N;HANGUL LETTER SSANG BIEUB;;;;
+3144;HANGUL LETTER PIEUP-SIOS;Lo;0;L;<compat> 1121;;;;N;HANGUL LETTER BIEUB SIOS;;;;
+3145;HANGUL LETTER SIOS;Lo;0;L;<compat> 1109;;;;N;;;;;
+3146;HANGUL LETTER SSANGSIOS;Lo;0;L;<compat> 110A;;;;N;HANGUL LETTER SSANG SIOS;;;;
+3147;HANGUL LETTER IEUNG;Lo;0;L;<compat> 110B;;;;N;;;;;
+3148;HANGUL LETTER CIEUC;Lo;0;L;<compat> 110C;;;;N;HANGUL LETTER JIEUJ;;;;
+3149;HANGUL LETTER SSANGCIEUC;Lo;0;L;<compat> 110D;;;;N;HANGUL LETTER SSANG JIEUJ;;;;
+314A;HANGUL LETTER CHIEUCH;Lo;0;L;<compat> 110E;;;;N;HANGUL LETTER CIEUC;;;;
+314B;HANGUL LETTER KHIEUKH;Lo;0;L;<compat> 110F;;;;N;HANGUL LETTER KIYEOK;;;;
+314C;HANGUL LETTER THIEUTH;Lo;0;L;<compat> 1110;;;;N;HANGUL LETTER TIEUT;;;;
+314D;HANGUL LETTER PHIEUPH;Lo;0;L;<compat> 1111;;;;N;HANGUL LETTER PIEUP;;;;
+314E;HANGUL LETTER HIEUH;Lo;0;L;<compat> 1112;;;;N;;;;;
+314F;HANGUL LETTER A;Lo;0;L;<compat> 1161;;;;N;;;;;
+3150;HANGUL LETTER AE;Lo;0;L;<compat> 1162;;;;N;;;;;
+3151;HANGUL LETTER YA;Lo;0;L;<compat> 1163;;;;N;;;;;
+3152;HANGUL LETTER YAE;Lo;0;L;<compat> 1164;;;;N;;;;;
+3153;HANGUL LETTER EO;Lo;0;L;<compat> 1165;;;;N;;;;;
+3154;HANGUL LETTER E;Lo;0;L;<compat> 1166;;;;N;;;;;
+3155;HANGUL LETTER YEO;Lo;0;L;<compat> 1167;;;;N;;;;;
+3156;HANGUL LETTER YE;Lo;0;L;<compat> 1168;;;;N;;;;;
+3157;HANGUL LETTER O;Lo;0;L;<compat> 1169;;;;N;;;;;
+3158;HANGUL LETTER WA;Lo;0;L;<compat> 116A;;;;N;;;;;
+3159;HANGUL LETTER WAE;Lo;0;L;<compat> 116B;;;;N;;;;;
+315A;HANGUL LETTER OE;Lo;0;L;<compat> 116C;;;;N;;;;;
+315B;HANGUL LETTER YO;Lo;0;L;<compat> 116D;;;;N;;;;;
+315C;HANGUL LETTER U;Lo;0;L;<compat> 116E;;;;N;;;;;
+315D;HANGUL LETTER WEO;Lo;0;L;<compat> 116F;;;;N;;;;;
+315E;HANGUL LETTER WE;Lo;0;L;<compat> 1170;;;;N;;;;;
+315F;HANGUL LETTER WI;Lo;0;L;<compat> 1171;;;;N;;;;;
+3160;HANGUL LETTER YU;Lo;0;L;<compat> 1172;;;;N;;;;;
+3161;HANGUL LETTER EU;Lo;0;L;<compat> 1173;;;;N;;;;;
+3162;HANGUL LETTER YI;Lo;0;L;<compat> 1174;;;;N;;;;;
+3163;HANGUL LETTER I;Lo;0;L;<compat> 1175;;;;N;;;;;
+3164;HANGUL FILLER;Lo;0;L;<compat> 1160;;;;N;HANGUL CAE OM;;;;
+3165;HANGUL LETTER SSANGNIEUN;Lo;0;L;<compat> 1114;;;;N;HANGUL LETTER SSANG NIEUN;;;;
+3166;HANGUL LETTER NIEUN-TIKEUT;Lo;0;L;<compat> 1115;;;;N;HANGUL LETTER NIEUN DIGEUD;;;;
+3167;HANGUL LETTER NIEUN-SIOS;Lo;0;L;<compat> 11C7;;;;N;HANGUL LETTER NIEUN SIOS;;;;
+3168;HANGUL LETTER NIEUN-PANSIOS;Lo;0;L;<compat> 11C8;;;;N;HANGUL LETTER NIEUN BAN CHI EUM;;;;
+3169;HANGUL LETTER RIEUL-KIYEOK-SIOS;Lo;0;L;<compat> 11CC;;;;N;HANGUL LETTER LIEUL GIYEOG SIOS;;;;
+316A;HANGUL LETTER RIEUL-TIKEUT;Lo;0;L;<compat> 11CE;;;;N;HANGUL LETTER LIEUL DIGEUD;;;;
+316B;HANGUL LETTER RIEUL-PIEUP-SIOS;Lo;0;L;<compat> 11D3;;;;N;HANGUL LETTER LIEUL BIEUB SIOS;;;;
+316C;HANGUL LETTER RIEUL-PANSIOS;Lo;0;L;<compat> 11D7;;;;N;HANGUL LETTER LIEUL BAN CHI EUM;;;;
+316D;HANGUL LETTER RIEUL-YEORINHIEUH;Lo;0;L;<compat> 11D9;;;;N;HANGUL LETTER LIEUL YEOLIN HIEUH;;;;
+316E;HANGUL LETTER MIEUM-PIEUP;Lo;0;L;<compat> 111C;;;;N;HANGUL LETTER MIEUM BIEUB;;;;
+316F;HANGUL LETTER MIEUM-SIOS;Lo;0;L;<compat> 11DD;;;;N;HANGUL LETTER MIEUM SIOS;;;;
+3170;HANGUL LETTER MIEUM-PANSIOS;Lo;0;L;<compat> 11DF;;;;N;HANGUL LETTER BIEUB BAN CHI EUM;;;;
+3171;HANGUL LETTER KAPYEOUNMIEUM;Lo;0;L;<compat> 111D;;;;N;HANGUL LETTER MIEUM SUN GYEONG EUM;;;;
+3172;HANGUL LETTER PIEUP-KIYEOK;Lo;0;L;<compat> 111E;;;;N;HANGUL LETTER BIEUB GIYEOG;;;;
+3173;HANGUL LETTER PIEUP-TIKEUT;Lo;0;L;<compat> 1120;;;;N;HANGUL LETTER BIEUB DIGEUD;;;;
+3174;HANGUL LETTER PIEUP-SIOS-KIYEOK;Lo;0;L;<compat> 1122;;;;N;HANGUL LETTER BIEUB SIOS GIYEOG;;;;
+3175;HANGUL LETTER PIEUP-SIOS-TIKEUT;Lo;0;L;<compat> 1123;;;;N;HANGUL LETTER BIEUB SIOS DIGEUD;;;;
+3176;HANGUL LETTER PIEUP-CIEUC;Lo;0;L;<compat> 1127;;;;N;HANGUL LETTER BIEUB JIEUJ;;;;
+3177;HANGUL LETTER PIEUP-THIEUTH;Lo;0;L;<compat> 1129;;;;N;HANGUL LETTER BIEUB TIEUT;;;;
+3178;HANGUL LETTER KAPYEOUNPIEUP;Lo;0;L;<compat> 112B;;;;N;HANGUL LETTER BIEUB SUN GYEONG EUM;;;;
+3179;HANGUL LETTER KAPYEOUNSSANGPIEUP;Lo;0;L;<compat> 112C;;;;N;HANGUL LETTER SSANG BIEUB SUN GYEONG EUM;;;;
+317A;HANGUL LETTER SIOS-KIYEOK;Lo;0;L;<compat> 112D;;;;N;HANGUL LETTER SIOS GIYEOG;;;;
+317B;HANGUL LETTER SIOS-NIEUN;Lo;0;L;<compat> 112E;;;;N;HANGUL LETTER SIOS NIEUN;;;;
+317C;HANGUL LETTER SIOS-TIKEUT;Lo;0;L;<compat> 112F;;;;N;HANGUL LETTER SIOS DIGEUD;;;;
+317D;HANGUL LETTER SIOS-PIEUP;Lo;0;L;<compat> 1132;;;;N;HANGUL LETTER SIOS BIEUB;;;;
+317E;HANGUL LETTER SIOS-CIEUC;Lo;0;L;<compat> 1136;;;;N;HANGUL LETTER SIOS JIEUJ;;;;
+317F;HANGUL LETTER PANSIOS;Lo;0;L;<compat> 1140;;;;N;HANGUL LETTER BAN CHI EUM;;;;
+3180;HANGUL LETTER SSANGIEUNG;Lo;0;L;<compat> 1147;;;;N;HANGUL LETTER SSANG IEUNG;;;;
+3181;HANGUL LETTER YESIEUNG;Lo;0;L;<compat> 114C;;;;N;HANGUL LETTER NGIEUNG;;;;
+3182;HANGUL LETTER YESIEUNG-SIOS;Lo;0;L;<compat> 11F1;;;;N;HANGUL LETTER NGIEUNG SIOS;;;;
+3183;HANGUL LETTER YESIEUNG-PANSIOS;Lo;0;L;<compat> 11F2;;;;N;HANGUL LETTER NGIEUNG BAN CHI EUM;;;;
+3184;HANGUL LETTER KAPYEOUNPHIEUPH;Lo;0;L;<compat> 1157;;;;N;HANGUL LETTER PIEUP SUN GYEONG EUM;;;;
+3185;HANGUL LETTER SSANGHIEUH;Lo;0;L;<compat> 1158;;;;N;HANGUL LETTER SSANG HIEUH;;;;
+3186;HANGUL LETTER YEORINHIEUH;Lo;0;L;<compat> 1159;;;;N;HANGUL LETTER YEOLIN HIEUH;;;;
+3187;HANGUL LETTER YO-YA;Lo;0;L;<compat> 1184;;;;N;HANGUL LETTER YOYA;;;;
+3188;HANGUL LETTER YO-YAE;Lo;0;L;<compat> 1185;;;;N;HANGUL LETTER YOYAE;;;;
+3189;HANGUL LETTER YO-I;Lo;0;L;<compat> 1188;;;;N;HANGUL LETTER YOI;;;;
+318A;HANGUL LETTER YU-YEO;Lo;0;L;<compat> 1191;;;;N;HANGUL LETTER YUYEO;;;;
+318B;HANGUL LETTER YU-YE;Lo;0;L;<compat> 1192;;;;N;HANGUL LETTER YUYE;;;;
+318C;HANGUL LETTER YU-I;Lo;0;L;<compat> 1194;;;;N;HANGUL LETTER YUI;;;;
+318D;HANGUL LETTER ARAEA;Lo;0;L;<compat> 119E;;;;N;HANGUL LETTER ALAE A;;;;
+318E;HANGUL LETTER ARAEAE;Lo;0;L;<compat> 11A1;;;;N;HANGUL LETTER ALAE AE;;;;
+3190;IDEOGRAPHIC ANNOTATION LINKING MARK;So;0;L;;;;;N;KANBUN TATETEN;Kanbun Tateten;;;
+3191;IDEOGRAPHIC ANNOTATION REVERSE MARK;So;0;L;;;;;N;KAERITEN RE;Kaeriten;;;
+3192;IDEOGRAPHIC ANNOTATION ONE MARK;No;0;L;<super> 4E00;;;1;N;KAERITEN ITI;Kaeriten;;;
+3193;IDEOGRAPHIC ANNOTATION TWO MARK;No;0;L;<super> 4E8C;;;2;N;KAERITEN NI;Kaeriten;;;
+3194;IDEOGRAPHIC ANNOTATION THREE MARK;No;0;L;<super> 4E09;;;3;N;KAERITEN SAN;Kaeriten;;;
+3195;IDEOGRAPHIC ANNOTATION FOUR MARK;No;0;L;<super> 56DB;;;4;N;KAERITEN SI;Kaeriten;;;
+3196;IDEOGRAPHIC ANNOTATION TOP MARK;So;0;L;<super> 4E0A;;;;N;KAERITEN ZYOU;Kaeriten;;;
+3197;IDEOGRAPHIC ANNOTATION MIDDLE MARK;So;0;L;<super> 4E2D;;;;N;KAERITEN TYUU;Kaeriten;;;
+3198;IDEOGRAPHIC ANNOTATION BOTTOM MARK;So;0;L;<super> 4E0B;;;;N;KAERITEN GE;Kaeriten;;;
+3199;IDEOGRAPHIC ANNOTATION FIRST MARK;So;0;L;<super> 7532;;;;N;KAERITEN KOU;Kaeriten;;;
+319A;IDEOGRAPHIC ANNOTATION SECOND MARK;So;0;L;<super> 4E59;;;;N;KAERITEN OTU;Kaeriten;;;
+319B;IDEOGRAPHIC ANNOTATION THIRD MARK;So;0;L;<super> 4E19;;;;N;KAERITEN HEI;Kaeriten;;;
+319C;IDEOGRAPHIC ANNOTATION FOURTH MARK;So;0;L;<super> 4E01;;;;N;KAERITEN TEI;Kaeriten;;;
+319D;IDEOGRAPHIC ANNOTATION HEAVEN MARK;So;0;L;<super> 5929;;;;N;KAERITEN TEN;Kaeriten;;;
+319E;IDEOGRAPHIC ANNOTATION EARTH MARK;So;0;L;<super> 5730;;;;N;KAERITEN TI;Kaeriten;;;
+319F;IDEOGRAPHIC ANNOTATION MAN MARK;So;0;L;<super> 4EBA;;;;N;KAERITEN ZIN;Kaeriten;;;
+31A0;BOPOMOFO LETTER BU;Lo;0;L;;;;;N;;;;;
+31A1;BOPOMOFO LETTER ZI;Lo;0;L;;;;;N;;;;;
+31A2;BOPOMOFO LETTER JI;Lo;0;L;;;;;N;;;;;
+31A3;BOPOMOFO LETTER GU;Lo;0;L;;;;;N;;;;;
+31A4;BOPOMOFO LETTER EE;Lo;0;L;;;;;N;;;;;
+31A5;BOPOMOFO LETTER ENN;Lo;0;L;;;;;N;;;;;
+31A6;BOPOMOFO LETTER OO;Lo;0;L;;;;;N;;;;;
+31A7;BOPOMOFO LETTER ONN;Lo;0;L;;;;;N;;;;;
+31A8;BOPOMOFO LETTER IR;Lo;0;L;;;;;N;;;;;
+31A9;BOPOMOFO LETTER ANN;Lo;0;L;;;;;N;;;;;
+31AA;BOPOMOFO LETTER INN;Lo;0;L;;;;;N;;;;;
+31AB;BOPOMOFO LETTER UNN;Lo;0;L;;;;;N;;;;;
+31AC;BOPOMOFO LETTER IM;Lo;0;L;;;;;N;;;;;
+31AD;BOPOMOFO LETTER NGG;Lo;0;L;;;;;N;;;;;
+31AE;BOPOMOFO LETTER AINN;Lo;0;L;;;;;N;;;;;
+31AF;BOPOMOFO LETTER AUNN;Lo;0;L;;;;;N;;;;;
+31B0;BOPOMOFO LETTER AM;Lo;0;L;;;;;N;;;;;
+31B1;BOPOMOFO LETTER OM;Lo;0;L;;;;;N;;;;;
+31B2;BOPOMOFO LETTER ONG;Lo;0;L;;;;;N;;;;;
+31B3;BOPOMOFO LETTER INNN;Lo;0;L;;;;;N;;;;;
+31B4;BOPOMOFO FINAL LETTER P;Lo;0;L;;;;;N;;;;;
+31B5;BOPOMOFO FINAL LETTER T;Lo;0;L;;;;;N;;;;;
+31B6;BOPOMOFO FINAL LETTER K;Lo;0;L;;;;;N;;;;;
+31B7;BOPOMOFO FINAL LETTER H;Lo;0;L;;;;;N;;;;;
+3200;PARENTHESIZED HANGUL KIYEOK;So;0;L;<compat> 0028 1100 0029;;;;N;PARENTHESIZED HANGUL GIYEOG;;;;
+3201;PARENTHESIZED HANGUL NIEUN;So;0;L;<compat> 0028 1102 0029;;;;N;;;;;
+3202;PARENTHESIZED HANGUL TIKEUT;So;0;L;<compat> 0028 1103 0029;;;;N;PARENTHESIZED HANGUL DIGEUD;;;;
+3203;PARENTHESIZED HANGUL RIEUL;So;0;L;<compat> 0028 1105 0029;;;;N;PARENTHESIZED HANGUL LIEUL;;;;
+3204;PARENTHESIZED HANGUL MIEUM;So;0;L;<compat> 0028 1106 0029;;;;N;;;;;
+3205;PARENTHESIZED HANGUL PIEUP;So;0;L;<compat> 0028 1107 0029;;;;N;PARENTHESIZED HANGUL BIEUB;;;;
+3206;PARENTHESIZED HANGUL SIOS;So;0;L;<compat> 0028 1109 0029;;;;N;;;;;
+3207;PARENTHESIZED HANGUL IEUNG;So;0;L;<compat> 0028 110B 0029;;;;N;;;;;
+3208;PARENTHESIZED HANGUL CIEUC;So;0;L;<compat> 0028 110C 0029;;;;N;PARENTHESIZED HANGUL JIEUJ;;;;
+3209;PARENTHESIZED HANGUL CHIEUCH;So;0;L;<compat> 0028 110E 0029;;;;N;PARENTHESIZED HANGUL CIEUC;;;;
+320A;PARENTHESIZED HANGUL KHIEUKH;So;0;L;<compat> 0028 110F 0029;;;;N;PARENTHESIZED HANGUL KIYEOK;;;;
+320B;PARENTHESIZED HANGUL THIEUTH;So;0;L;<compat> 0028 1110 0029;;;;N;PARENTHESIZED HANGUL TIEUT;;;;
+320C;PARENTHESIZED HANGUL PHIEUPH;So;0;L;<compat> 0028 1111 0029;;;;N;PARENTHESIZED HANGUL PIEUP;;;;
+320D;PARENTHESIZED HANGUL HIEUH;So;0;L;<compat> 0028 1112 0029;;;;N;;;;;
+320E;PARENTHESIZED HANGUL KIYEOK A;So;0;L;<compat> 0028 1100 1161 0029;;;;N;PARENTHESIZED HANGUL GA;;;;
+320F;PARENTHESIZED HANGUL NIEUN A;So;0;L;<compat> 0028 1102 1161 0029;;;;N;PARENTHESIZED HANGUL NA;;;;
+3210;PARENTHESIZED HANGUL TIKEUT A;So;0;L;<compat> 0028 1103 1161 0029;;;;N;PARENTHESIZED HANGUL DA;;;;
+3211;PARENTHESIZED HANGUL RIEUL A;So;0;L;<compat> 0028 1105 1161 0029;;;;N;PARENTHESIZED HANGUL LA;;;;
+3212;PARENTHESIZED HANGUL MIEUM A;So;0;L;<compat> 0028 1106 1161 0029;;;;N;PARENTHESIZED HANGUL MA;;;;
+3213;PARENTHESIZED HANGUL PIEUP A;So;0;L;<compat> 0028 1107 1161 0029;;;;N;PARENTHESIZED HANGUL BA;;;;
+3214;PARENTHESIZED HANGUL SIOS A;So;0;L;<compat> 0028 1109 1161 0029;;;;N;PARENTHESIZED HANGUL SA;;;;
+3215;PARENTHESIZED HANGUL IEUNG A;So;0;L;<compat> 0028 110B 1161 0029;;;;N;PARENTHESIZED HANGUL A;;;;
+3216;PARENTHESIZED HANGUL CIEUC A;So;0;L;<compat> 0028 110C 1161 0029;;;;N;PARENTHESIZED HANGUL JA;;;;
+3217;PARENTHESIZED HANGUL CHIEUCH A;So;0;L;<compat> 0028 110E 1161 0029;;;;N;PARENTHESIZED HANGUL CA;;;;
+3218;PARENTHESIZED HANGUL KHIEUKH A;So;0;L;<compat> 0028 110F 1161 0029;;;;N;PARENTHESIZED HANGUL KA;;;;
+3219;PARENTHESIZED HANGUL THIEUTH A;So;0;L;<compat> 0028 1110 1161 0029;;;;N;PARENTHESIZED HANGUL TA;;;;
+321A;PARENTHESIZED HANGUL PHIEUPH A;So;0;L;<compat> 0028 1111 1161 0029;;;;N;PARENTHESIZED HANGUL PA;;;;
+321B;PARENTHESIZED HANGUL HIEUH A;So;0;L;<compat> 0028 1112 1161 0029;;;;N;PARENTHESIZED HANGUL HA;;;;
+321C;PARENTHESIZED HANGUL CIEUC U;So;0;L;<compat> 0028 110C 116E 0029;;;;N;PARENTHESIZED HANGUL JU;;;;
+3220;PARENTHESIZED IDEOGRAPH ONE;No;0;L;<compat> 0028 4E00 0029;;;1;N;;;;;
+3221;PARENTHESIZED IDEOGRAPH TWO;No;0;L;<compat> 0028 4E8C 0029;;;2;N;;;;;
+3222;PARENTHESIZED IDEOGRAPH THREE;No;0;L;<compat> 0028 4E09 0029;;;3;N;;;;;
+3223;PARENTHESIZED IDEOGRAPH FOUR;No;0;L;<compat> 0028 56DB 0029;;;4;N;;;;;
+3224;PARENTHESIZED IDEOGRAPH FIVE;No;0;L;<compat> 0028 4E94 0029;;;5;N;;;;;
+3225;PARENTHESIZED IDEOGRAPH SIX;No;0;L;<compat> 0028 516D 0029;;;6;N;;;;;
+3226;PARENTHESIZED IDEOGRAPH SEVEN;No;0;L;<compat> 0028 4E03 0029;;;7;N;;;;;
+3227;PARENTHESIZED IDEOGRAPH EIGHT;No;0;L;<compat> 0028 516B 0029;;;8;N;;;;;
+3228;PARENTHESIZED IDEOGRAPH NINE;No;0;L;<compat> 0028 4E5D 0029;;;9;N;;;;;
+3229;PARENTHESIZED IDEOGRAPH TEN;No;0;L;<compat> 0028 5341 0029;;;10;N;;;;;
+322A;PARENTHESIZED IDEOGRAPH MOON;So;0;L;<compat> 0028 6708 0029;;;;N;;;;;
+322B;PARENTHESIZED IDEOGRAPH FIRE;So;0;L;<compat> 0028 706B 0029;;;;N;;;;;
+322C;PARENTHESIZED IDEOGRAPH WATER;So;0;L;<compat> 0028 6C34 0029;;;;N;;;;;
+322D;PARENTHESIZED IDEOGRAPH WOOD;So;0;L;<compat> 0028 6728 0029;;;;N;;;;;
+322E;PARENTHESIZED IDEOGRAPH METAL;So;0;L;<compat> 0028 91D1 0029;;;;N;;;;;
+322F;PARENTHESIZED IDEOGRAPH EARTH;So;0;L;<compat> 0028 571F 0029;;;;N;;;;;
+3230;PARENTHESIZED IDEOGRAPH SUN;So;0;L;<compat> 0028 65E5 0029;;;;N;;;;;
+3231;PARENTHESIZED IDEOGRAPH STOCK;So;0;L;<compat> 0028 682A 0029;;;;N;;;;;
+3232;PARENTHESIZED IDEOGRAPH HAVE;So;0;L;<compat> 0028 6709 0029;;;;N;;;;;
+3233;PARENTHESIZED IDEOGRAPH SOCIETY;So;0;L;<compat> 0028 793E 0029;;;;N;;;;;
+3234;PARENTHESIZED IDEOGRAPH NAME;So;0;L;<compat> 0028 540D 0029;;;;N;;;;;
+3235;PARENTHESIZED IDEOGRAPH SPECIAL;So;0;L;<compat> 0028 7279 0029;;;;N;;;;;
+3236;PARENTHESIZED IDEOGRAPH FINANCIAL;So;0;L;<compat> 0028 8CA1 0029;;;;N;;;;;
+3237;PARENTHESIZED IDEOGRAPH CONGRATULATION;So;0;L;<compat> 0028 795D 0029;;;;N;;;;;
+3238;PARENTHESIZED IDEOGRAPH LABOR;So;0;L;<compat> 0028 52B4 0029;;;;N;;;;;
+3239;PARENTHESIZED IDEOGRAPH REPRESENT;So;0;L;<compat> 0028 4EE3 0029;;;;N;;;;;
+323A;PARENTHESIZED IDEOGRAPH CALL;So;0;L;<compat> 0028 547C 0029;;;;N;;;;;
+323B;PARENTHESIZED IDEOGRAPH STUDY;So;0;L;<compat> 0028 5B66 0029;;;;N;;;;;
+323C;PARENTHESIZED IDEOGRAPH SUPERVISE;So;0;L;<compat> 0028 76E3 0029;;;;N;;;;;
+323D;PARENTHESIZED IDEOGRAPH ENTERPRISE;So;0;L;<compat> 0028 4F01 0029;;;;N;;;;;
+323E;PARENTHESIZED IDEOGRAPH RESOURCE;So;0;L;<compat> 0028 8CC7 0029;;;;N;;;;;
+323F;PARENTHESIZED IDEOGRAPH ALLIANCE;So;0;L;<compat> 0028 5354 0029;;;;N;;;;;
+3240;PARENTHESIZED IDEOGRAPH FESTIVAL;So;0;L;<compat> 0028 796D 0029;;;;N;;;;;
+3241;PARENTHESIZED IDEOGRAPH REST;So;0;L;<compat> 0028 4F11 0029;;;;N;;;;;
+3242;PARENTHESIZED IDEOGRAPH SELF;So;0;L;<compat> 0028 81EA 0029;;;;N;;;;;
+3243;PARENTHESIZED IDEOGRAPH REACH;So;0;L;<compat> 0028 81F3 0029;;;;N;;;;;
+3260;CIRCLED HANGUL KIYEOK;So;0;L;<circle> 1100;;;;N;CIRCLED HANGUL GIYEOG;;;;
+3261;CIRCLED HANGUL NIEUN;So;0;L;<circle> 1102;;;;N;;;;;
+3262;CIRCLED HANGUL TIKEUT;So;0;L;<circle> 1103;;;;N;CIRCLED HANGUL DIGEUD;;;;
+3263;CIRCLED HANGUL RIEUL;So;0;L;<circle> 1105;;;;N;CIRCLED HANGUL LIEUL;;;;
+3264;CIRCLED HANGUL MIEUM;So;0;L;<circle> 1106;;;;N;;;;;
+3265;CIRCLED HANGUL PIEUP;So;0;L;<circle> 1107;;;;N;CIRCLED HANGUL BIEUB;;;;
+3266;CIRCLED HANGUL SIOS;So;0;L;<circle> 1109;;;;N;;;;;
+3267;CIRCLED HANGUL IEUNG;So;0;L;<circle> 110B;;;;N;;;;;
+3268;CIRCLED HANGUL CIEUC;So;0;L;<circle> 110C;;;;N;CIRCLED HANGUL JIEUJ;;;;
+3269;CIRCLED HANGUL CHIEUCH;So;0;L;<circle> 110E;;;;N;CIRCLED HANGUL CIEUC;;;;
+326A;CIRCLED HANGUL KHIEUKH;So;0;L;<circle> 110F;;;;N;CIRCLED HANGUL KIYEOK;;;;
+326B;CIRCLED HANGUL THIEUTH;So;0;L;<circle> 1110;;;;N;CIRCLED HANGUL TIEUT;;;;
+326C;CIRCLED HANGUL PHIEUPH;So;0;L;<circle> 1111;;;;N;CIRCLED HANGUL PIEUP;;;;
+326D;CIRCLED HANGUL HIEUH;So;0;L;<circle> 1112;;;;N;;;;;
+326E;CIRCLED HANGUL KIYEOK A;So;0;L;<circle> 1100 1161;;;;N;CIRCLED HANGUL GA;;;;
+326F;CIRCLED HANGUL NIEUN A;So;0;L;<circle> 1102 1161;;;;N;CIRCLED HANGUL NA;;;;
+3270;CIRCLED HANGUL TIKEUT A;So;0;L;<circle> 1103 1161;;;;N;CIRCLED HANGUL DA;;;;
+3271;CIRCLED HANGUL RIEUL A;So;0;L;<circle> 1105 1161;;;;N;CIRCLED HANGUL LA;;;;
+3272;CIRCLED HANGUL MIEUM A;So;0;L;<circle> 1106 1161;;;;N;CIRCLED HANGUL MA;;;;
+3273;CIRCLED HANGUL PIEUP A;So;0;L;<circle> 1107 1161;;;;N;CIRCLED HANGUL BA;;;;
+3274;CIRCLED HANGUL SIOS A;So;0;L;<circle> 1109 1161;;;;N;CIRCLED HANGUL SA;;;;
+3275;CIRCLED HANGUL IEUNG A;So;0;L;<circle> 110B 1161;;;;N;CIRCLED HANGUL A;;;;
+3276;CIRCLED HANGUL CIEUC A;So;0;L;<circle> 110C 1161;;;;N;CIRCLED HANGUL JA;;;;
+3277;CIRCLED HANGUL CHIEUCH A;So;0;L;<circle> 110E 1161;;;;N;CIRCLED HANGUL CA;;;;
+3278;CIRCLED HANGUL KHIEUKH A;So;0;L;<circle> 110F 1161;;;;N;CIRCLED HANGUL KA;;;;
+3279;CIRCLED HANGUL THIEUTH A;So;0;L;<circle> 1110 1161;;;;N;CIRCLED HANGUL TA;;;;
+327A;CIRCLED HANGUL PHIEUPH A;So;0;L;<circle> 1111 1161;;;;N;CIRCLED HANGUL PA;;;;
+327B;CIRCLED HANGUL HIEUH A;So;0;L;<circle> 1112 1161;;;;N;CIRCLED HANGUL HA;;;;
+327F;KOREAN STANDARD SYMBOL;So;0;L;;;;;N;;;;;
+3280;CIRCLED IDEOGRAPH ONE;No;0;L;<circle> 4E00;;;1;N;;;;;
+3281;CIRCLED IDEOGRAPH TWO;No;0;L;<circle> 4E8C;;;2;N;;;;;
+3282;CIRCLED IDEOGRAPH THREE;No;0;L;<circle> 4E09;;;3;N;;;;;
+3283;CIRCLED IDEOGRAPH FOUR;No;0;L;<circle> 56DB;;;4;N;;;;;
+3284;CIRCLED IDEOGRAPH FIVE;No;0;L;<circle> 4E94;;;5;N;;;;;
+3285;CIRCLED IDEOGRAPH SIX;No;0;L;<circle> 516D;;;6;N;;;;;
+3286;CIRCLED IDEOGRAPH SEVEN;No;0;L;<circle> 4E03;;;7;N;;;;;
+3287;CIRCLED IDEOGRAPH EIGHT;No;0;L;<circle> 516B;;;8;N;;;;;
+3288;CIRCLED IDEOGRAPH NINE;No;0;L;<circle> 4E5D;;;9;N;;;;;
+3289;CIRCLED IDEOGRAPH TEN;No;0;L;<circle> 5341;;;10;N;;;;;
+328A;CIRCLED IDEOGRAPH MOON;So;0;L;<circle> 6708;;;;N;;;;;
+328B;CIRCLED IDEOGRAPH FIRE;So;0;L;<circle> 706B;;;;N;;;;;
+328C;CIRCLED IDEOGRAPH WATER;So;0;L;<circle> 6C34;;;;N;;;;;
+328D;CIRCLED IDEOGRAPH WOOD;So;0;L;<circle> 6728;;;;N;;;;;
+328E;CIRCLED IDEOGRAPH METAL;So;0;L;<circle> 91D1;;;;N;;;;;
+328F;CIRCLED IDEOGRAPH EARTH;So;0;L;<circle> 571F;;;;N;;;;;
+3290;CIRCLED IDEOGRAPH SUN;So;0;L;<circle> 65E5;;;;N;;;;;
+3291;CIRCLED IDEOGRAPH STOCK;So;0;L;<circle> 682A;;;;N;;;;;
+3292;CIRCLED IDEOGRAPH HAVE;So;0;L;<circle> 6709;;;;N;;;;;
+3293;CIRCLED IDEOGRAPH SOCIETY;So;0;L;<circle> 793E;;;;N;;;;;
+3294;CIRCLED IDEOGRAPH NAME;So;0;L;<circle> 540D;;;;N;;;;;
+3295;CIRCLED IDEOGRAPH SPECIAL;So;0;L;<circle> 7279;;;;N;;;;;
+3296;CIRCLED IDEOGRAPH FINANCIAL;So;0;L;<circle> 8CA1;;;;N;;;;;
+3297;CIRCLED IDEOGRAPH CONGRATULATION;So;0;L;<circle> 795D;;;;N;;;;;
+3298;CIRCLED IDEOGRAPH LABOR;So;0;L;<circle> 52B4;;;;N;;;;;
+3299;CIRCLED IDEOGRAPH SECRET;So;0;L;<circle> 79D8;;;;N;;;;;
+329A;CIRCLED IDEOGRAPH MALE;So;0;L;<circle> 7537;;;;N;;;;;
+329B;CIRCLED IDEOGRAPH FEMALE;So;0;L;<circle> 5973;;;;N;;;;;
+329C;CIRCLED IDEOGRAPH SUITABLE;So;0;L;<circle> 9069;;;;N;;;;;
+329D;CIRCLED IDEOGRAPH EXCELLENT;So;0;L;<circle> 512A;;;;N;;;;;
+329E;CIRCLED IDEOGRAPH PRINT;So;0;L;<circle> 5370;;;;N;;;;;
+329F;CIRCLED IDEOGRAPH ATTENTION;So;0;L;<circle> 6CE8;;;;N;;;;;
+32A0;CIRCLED IDEOGRAPH ITEM;So;0;L;<circle> 9805;;;;N;;;;;
+32A1;CIRCLED IDEOGRAPH REST;So;0;L;<circle> 4F11;;;;N;;;;;
+32A2;CIRCLED IDEOGRAPH COPY;So;0;L;<circle> 5199;;;;N;;;;;
+32A3;CIRCLED IDEOGRAPH CORRECT;So;0;L;<circle> 6B63;;;;N;;;;;
+32A4;CIRCLED IDEOGRAPH HIGH;So;0;L;<circle> 4E0A;;;;N;;;;;
+32A5;CIRCLED IDEOGRAPH CENTRE;So;0;L;<circle> 4E2D;;;;N;CIRCLED IDEOGRAPH CENTER;;;;
+32A6;CIRCLED IDEOGRAPH LOW;So;0;L;<circle> 4E0B;;;;N;;;;;
+32A7;CIRCLED IDEOGRAPH LEFT;So;0;L;<circle> 5DE6;;;;N;;;;;
+32A8;CIRCLED IDEOGRAPH RIGHT;So;0;L;<circle> 53F3;;;;N;;;;;
+32A9;CIRCLED IDEOGRAPH MEDICINE;So;0;L;<circle> 533B;;;;N;;;;;
+32AA;CIRCLED IDEOGRAPH RELIGION;So;0;L;<circle> 5B97;;;;N;;;;;
+32AB;CIRCLED IDEOGRAPH STUDY;So;0;L;<circle> 5B66;;;;N;;;;;
+32AC;CIRCLED IDEOGRAPH SUPERVISE;So;0;L;<circle> 76E3;;;;N;;;;;
+32AD;CIRCLED IDEOGRAPH ENTERPRISE;So;0;L;<circle> 4F01;;;;N;;;;;
+32AE;CIRCLED IDEOGRAPH RESOURCE;So;0;L;<circle> 8CC7;;;;N;;;;;
+32AF;CIRCLED IDEOGRAPH ALLIANCE;So;0;L;<circle> 5354;;;;N;;;;;
+32B0;CIRCLED IDEOGRAPH NIGHT;So;0;L;<circle> 591C;;;;N;;;;;
+32C0;IDEOGRAPHIC TELEGRAPH SYMBOL FOR JANUARY;So;0;L;<compat> 0031 6708;;;;N;;;;;
+32C1;IDEOGRAPHIC TELEGRAPH SYMBOL FOR FEBRUARY;So;0;L;<compat> 0032 6708;;;;N;;;;;
+32C2;IDEOGRAPHIC TELEGRAPH SYMBOL FOR MARCH;So;0;L;<compat> 0033 6708;;;;N;;;;;
+32C3;IDEOGRAPHIC TELEGRAPH SYMBOL FOR APRIL;So;0;L;<compat> 0034 6708;;;;N;;;;;
+32C4;IDEOGRAPHIC TELEGRAPH SYMBOL FOR MAY;So;0;L;<compat> 0035 6708;;;;N;;;;;
+32C5;IDEOGRAPHIC TELEGRAPH SYMBOL FOR JUNE;So;0;L;<compat> 0036 6708;;;;N;;;;;
+32C6;IDEOGRAPHIC TELEGRAPH SYMBOL FOR JULY;So;0;L;<compat> 0037 6708;;;;N;;;;;
+32C7;IDEOGRAPHIC TELEGRAPH SYMBOL FOR AUGUST;So;0;L;<compat> 0038 6708;;;;N;;;;;
+32C8;IDEOGRAPHIC TELEGRAPH SYMBOL FOR SEPTEMBER;So;0;L;<compat> 0039 6708;;;;N;;;;;
+32C9;IDEOGRAPHIC TELEGRAPH SYMBOL FOR OCTOBER;So;0;L;<compat> 0031 0030 6708;;;;N;;;;;
+32CA;IDEOGRAPHIC TELEGRAPH SYMBOL FOR NOVEMBER;So;0;L;<compat> 0031 0031 6708;;;;N;;;;;
+32CB;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DECEMBER;So;0;L;<compat> 0031 0032 6708;;;;N;;;;;
+32D0;CIRCLED KATAKANA A;So;0;L;<circle> 30A2;;;;N;;;;;
+32D1;CIRCLED KATAKANA I;So;0;L;<circle> 30A4;;;;N;;;;;
+32D2;CIRCLED KATAKANA U;So;0;L;<circle> 30A6;;;;N;;;;;
+32D3;CIRCLED KATAKANA E;So;0;L;<circle> 30A8;;;;N;;;;;
+32D4;CIRCLED KATAKANA O;So;0;L;<circle> 30AA;;;;N;;;;;
+32D5;CIRCLED KATAKANA KA;So;0;L;<circle> 30AB;;;;N;;;;;
+32D6;CIRCLED KATAKANA KI;So;0;L;<circle> 30AD;;;;N;;;;;
+32D7;CIRCLED KATAKANA KU;So;0;L;<circle> 30AF;;;;N;;;;;
+32D8;CIRCLED KATAKANA KE;So;0;L;<circle> 30B1;;;;N;;;;;
+32D9;CIRCLED KATAKANA KO;So;0;L;<circle> 30B3;;;;N;;;;;
+32DA;CIRCLED KATAKANA SA;So;0;L;<circle> 30B5;;;;N;;;;;
+32DB;CIRCLED KATAKANA SI;So;0;L;<circle> 30B7;;;;N;;;;;
+32DC;CIRCLED KATAKANA SU;So;0;L;<circle> 30B9;;;;N;;;;;
+32DD;CIRCLED KATAKANA SE;So;0;L;<circle> 30BB;;;;N;;;;;
+32DE;CIRCLED KATAKANA SO;So;0;L;<circle> 30BD;;;;N;;;;;
+32DF;CIRCLED KATAKANA TA;So;0;L;<circle> 30BF;;;;N;;;;;
+32E0;CIRCLED KATAKANA TI;So;0;L;<circle> 30C1;;;;N;;;;;
+32E1;CIRCLED KATAKANA TU;So;0;L;<circle> 30C4;;;;N;;;;;
+32E2;CIRCLED KATAKANA TE;So;0;L;<circle> 30C6;;;;N;;;;;
+32E3;CIRCLED KATAKANA TO;So;0;L;<circle> 30C8;;;;N;;;;;
+32E4;CIRCLED KATAKANA NA;So;0;L;<circle> 30CA;;;;N;;;;;
+32E5;CIRCLED KATAKANA NI;So;0;L;<circle> 30CB;;;;N;;;;;
+32E6;CIRCLED KATAKANA NU;So;0;L;<circle> 30CC;;;;N;;;;;
+32E7;CIRCLED KATAKANA NE;So;0;L;<circle> 30CD;;;;N;;;;;
+32E8;CIRCLED KATAKANA NO;So;0;L;<circle> 30CE;;;;N;;;;;
+32E9;CIRCLED KATAKANA HA;So;0;L;<circle> 30CF;;;;N;;;;;
+32EA;CIRCLED KATAKANA HI;So;0;L;<circle> 30D2;;;;N;;;;;
+32EB;CIRCLED KATAKANA HU;So;0;L;<circle> 30D5;;;;N;;;;;
+32EC;CIRCLED KATAKANA HE;So;0;L;<circle> 30D8;;;;N;;;;;
+32ED;CIRCLED KATAKANA HO;So;0;L;<circle> 30DB;;;;N;;;;;
+32EE;CIRCLED KATAKANA MA;So;0;L;<circle> 30DE;;;;N;;;;;
+32EF;CIRCLED KATAKANA MI;So;0;L;<circle> 30DF;;;;N;;;;;
+32F0;CIRCLED KATAKANA MU;So;0;L;<circle> 30E0;;;;N;;;;;
+32F1;CIRCLED KATAKANA ME;So;0;L;<circle> 30E1;;;;N;;;;;
+32F2;CIRCLED KATAKANA MO;So;0;L;<circle> 30E2;;;;N;;;;;
+32F3;CIRCLED KATAKANA YA;So;0;L;<circle> 30E4;;;;N;;;;;
+32F4;CIRCLED KATAKANA YU;So;0;L;<circle> 30E6;;;;N;;;;;
+32F5;CIRCLED KATAKANA YO;So;0;L;<circle> 30E8;;;;N;;;;;
+32F6;CIRCLED KATAKANA RA;So;0;L;<circle> 30E9;;;;N;;;;;
+32F7;CIRCLED KATAKANA RI;So;0;L;<circle> 30EA;;;;N;;;;;
+32F8;CIRCLED KATAKANA RU;So;0;L;<circle> 30EB;;;;N;;;;;
+32F9;CIRCLED KATAKANA RE;So;0;L;<circle> 30EC;;;;N;;;;;
+32FA;CIRCLED KATAKANA RO;So;0;L;<circle> 30ED;;;;N;;;;;
+32FB;CIRCLED KATAKANA WA;So;0;L;<circle> 30EF;;;;N;;;;;
+32FC;CIRCLED KATAKANA WI;So;0;L;<circle> 30F0;;;;N;;;;;
+32FD;CIRCLED KATAKANA WE;So;0;L;<circle> 30F1;;;;N;;;;;
+32FE;CIRCLED KATAKANA WO;So;0;L;<circle> 30F2;;;;N;;;;;
+3300;SQUARE APAATO;So;0;L;<square> 30A2 30D1 30FC 30C8;;;;N;SQUARED APAATO;;;;
+3301;SQUARE ARUHUA;So;0;L;<square> 30A2 30EB 30D5 30A1;;;;N;SQUARED ARUHUA;;;;
+3302;SQUARE ANPEA;So;0;L;<square> 30A2 30F3 30DA 30A2;;;;N;SQUARED ANPEA;;;;
+3303;SQUARE AARU;So;0;L;<square> 30A2 30FC 30EB;;;;N;SQUARED AARU;;;;
+3304;SQUARE ININGU;So;0;L;<square> 30A4 30CB 30F3 30B0;;;;N;SQUARED ININGU;;;;
+3305;SQUARE INTI;So;0;L;<square> 30A4 30F3 30C1;;;;N;SQUARED INTI;;;;
+3306;SQUARE UON;So;0;L;<square> 30A6 30A9 30F3;;;;N;SQUARED UON;;;;
+3307;SQUARE ESUKUUDO;So;0;L;<square> 30A8 30B9 30AF 30FC 30C9;;;;N;SQUARED ESUKUUDO;;;;
+3308;SQUARE EEKAA;So;0;L;<square> 30A8 30FC 30AB 30FC;;;;N;SQUARED EEKAA;;;;
+3309;SQUARE ONSU;So;0;L;<square> 30AA 30F3 30B9;;;;N;SQUARED ONSU;;;;
+330A;SQUARE OOMU;So;0;L;<square> 30AA 30FC 30E0;;;;N;SQUARED OOMU;;;;
+330B;SQUARE KAIRI;So;0;L;<square> 30AB 30A4 30EA;;;;N;SQUARED KAIRI;;;;
+330C;SQUARE KARATTO;So;0;L;<square> 30AB 30E9 30C3 30C8;;;;N;SQUARED KARATTO;;;;
+330D;SQUARE KARORII;So;0;L;<square> 30AB 30ED 30EA 30FC;;;;N;SQUARED KARORII;;;;
+330E;SQUARE GARON;So;0;L;<square> 30AC 30ED 30F3;;;;N;SQUARED GARON;;;;
+330F;SQUARE GANMA;So;0;L;<square> 30AC 30F3 30DE;;;;N;SQUARED GANMA;;;;
+3310;SQUARE GIGA;So;0;L;<square> 30AE 30AC;;;;N;SQUARED GIGA;;;;
+3311;SQUARE GINII;So;0;L;<square> 30AE 30CB 30FC;;;;N;SQUARED GINII;;;;
+3312;SQUARE KYURII;So;0;L;<square> 30AD 30E5 30EA 30FC;;;;N;SQUARED KYURII;;;;
+3313;SQUARE GIRUDAA;So;0;L;<square> 30AE 30EB 30C0 30FC;;;;N;SQUARED GIRUDAA;;;;
+3314;SQUARE KIRO;So;0;L;<square> 30AD 30ED;;;;N;SQUARED KIRO;;;;
+3315;SQUARE KIROGURAMU;So;0;L;<square> 30AD 30ED 30B0 30E9 30E0;;;;N;SQUARED KIROGURAMU;;;;
+3316;SQUARE KIROMEETORU;So;0;L;<square> 30AD 30ED 30E1 30FC 30C8 30EB;;;;N;SQUARED KIROMEETORU;;;;
+3317;SQUARE KIROWATTO;So;0;L;<square> 30AD 30ED 30EF 30C3 30C8;;;;N;SQUARED KIROWATTO;;;;
+3318;SQUARE GURAMU;So;0;L;<square> 30B0 30E9 30E0;;;;N;SQUARED GURAMU;;;;
+3319;SQUARE GURAMUTON;So;0;L;<square> 30B0 30E9 30E0 30C8 30F3;;;;N;SQUARED GURAMUTON;;;;
+331A;SQUARE KURUZEIRO;So;0;L;<square> 30AF 30EB 30BC 30A4 30ED;;;;N;SQUARED KURUZEIRO;;;;
+331B;SQUARE KUROONE;So;0;L;<square> 30AF 30ED 30FC 30CD;;;;N;SQUARED KUROONE;;;;
+331C;SQUARE KEESU;So;0;L;<square> 30B1 30FC 30B9;;;;N;SQUARED KEESU;;;;
+331D;SQUARE KORUNA;So;0;L;<square> 30B3 30EB 30CA;;;;N;SQUARED KORUNA;;;;
+331E;SQUARE KOOPO;So;0;L;<square> 30B3 30FC 30DD;;;;N;SQUARED KOOPO;;;;
+331F;SQUARE SAIKURU;So;0;L;<square> 30B5 30A4 30AF 30EB;;;;N;SQUARED SAIKURU;;;;
+3320;SQUARE SANTIIMU;So;0;L;<square> 30B5 30F3 30C1 30FC 30E0;;;;N;SQUARED SANTIIMU;;;;
+3321;SQUARE SIRINGU;So;0;L;<square> 30B7 30EA 30F3 30B0;;;;N;SQUARED SIRINGU;;;;
+3322;SQUARE SENTI;So;0;L;<square> 30BB 30F3 30C1;;;;N;SQUARED SENTI;;;;
+3323;SQUARE SENTO;So;0;L;<square> 30BB 30F3 30C8;;;;N;SQUARED SENTO;;;;
+3324;SQUARE DAASU;So;0;L;<square> 30C0 30FC 30B9;;;;N;SQUARED DAASU;;;;
+3325;SQUARE DESI;So;0;L;<square> 30C7 30B7;;;;N;SQUARED DESI;;;;
+3326;SQUARE DORU;So;0;L;<square> 30C9 30EB;;;;N;SQUARED DORU;;;;
+3327;SQUARE TON;So;0;L;<square> 30C8 30F3;;;;N;SQUARED TON;;;;
+3328;SQUARE NANO;So;0;L;<square> 30CA 30CE;;;;N;SQUARED NANO;;;;
+3329;SQUARE NOTTO;So;0;L;<square> 30CE 30C3 30C8;;;;N;SQUARED NOTTO;;;;
+332A;SQUARE HAITU;So;0;L;<square> 30CF 30A4 30C4;;;;N;SQUARED HAITU;;;;
+332B;SQUARE PAASENTO;So;0;L;<square> 30D1 30FC 30BB 30F3 30C8;;;;N;SQUARED PAASENTO;;;;
+332C;SQUARE PAATU;So;0;L;<square> 30D1 30FC 30C4;;;;N;SQUARED PAATU;;;;
+332D;SQUARE BAARERU;So;0;L;<square> 30D0 30FC 30EC 30EB;;;;N;SQUARED BAARERU;;;;
+332E;SQUARE PIASUTORU;So;0;L;<square> 30D4 30A2 30B9 30C8 30EB;;;;N;SQUARED PIASUTORU;;;;
+332F;SQUARE PIKURU;So;0;L;<square> 30D4 30AF 30EB;;;;N;SQUARED PIKURU;;;;
+3330;SQUARE PIKO;So;0;L;<square> 30D4 30B3;;;;N;SQUARED PIKO;;;;
+3331;SQUARE BIRU;So;0;L;<square> 30D3 30EB;;;;N;SQUARED BIRU;;;;
+3332;SQUARE HUARADDO;So;0;L;<square> 30D5 30A1 30E9 30C3 30C9;;;;N;SQUARED HUARADDO;;;;
+3333;SQUARE HUIITO;So;0;L;<square> 30D5 30A3 30FC 30C8;;;;N;SQUARED HUIITO;;;;
+3334;SQUARE BUSSYERU;So;0;L;<square> 30D6 30C3 30B7 30A7 30EB;;;;N;SQUARED BUSSYERU;;;;
+3335;SQUARE HURAN;So;0;L;<square> 30D5 30E9 30F3;;;;N;SQUARED HURAN;;;;
+3336;SQUARE HEKUTAARU;So;0;L;<square> 30D8 30AF 30BF 30FC 30EB;;;;N;SQUARED HEKUTAARU;;;;
+3337;SQUARE PESO;So;0;L;<square> 30DA 30BD;;;;N;SQUARED PESO;;;;
+3338;SQUARE PENIHI;So;0;L;<square> 30DA 30CB 30D2;;;;N;SQUARED PENIHI;;;;
+3339;SQUARE HERUTU;So;0;L;<square> 30D8 30EB 30C4;;;;N;SQUARED HERUTU;;;;
+333A;SQUARE PENSU;So;0;L;<square> 30DA 30F3 30B9;;;;N;SQUARED PENSU;;;;
+333B;SQUARE PEEZI;So;0;L;<square> 30DA 30FC 30B8;;;;N;SQUARED PEEZI;;;;
+333C;SQUARE BEETA;So;0;L;<square> 30D9 30FC 30BF;;;;N;SQUARED BEETA;;;;
+333D;SQUARE POINTO;So;0;L;<square> 30DD 30A4 30F3 30C8;;;;N;SQUARED POINTO;;;;
+333E;SQUARE BORUTO;So;0;L;<square> 30DC 30EB 30C8;;;;N;SQUARED BORUTO;;;;
+333F;SQUARE HON;So;0;L;<square> 30DB 30F3;;;;N;SQUARED HON;;;;
+3340;SQUARE PONDO;So;0;L;<square> 30DD 30F3 30C9;;;;N;SQUARED PONDO;;;;
+3341;SQUARE HOORU;So;0;L;<square> 30DB 30FC 30EB;;;;N;SQUARED HOORU;;;;
+3342;SQUARE HOON;So;0;L;<square> 30DB 30FC 30F3;;;;N;SQUARED HOON;;;;
+3343;SQUARE MAIKURO;So;0;L;<square> 30DE 30A4 30AF 30ED;;;;N;SQUARED MAIKURO;;;;
+3344;SQUARE MAIRU;So;0;L;<square> 30DE 30A4 30EB;;;;N;SQUARED MAIRU;;;;
+3345;SQUARE MAHHA;So;0;L;<square> 30DE 30C3 30CF;;;;N;SQUARED MAHHA;;;;
+3346;SQUARE MARUKU;So;0;L;<square> 30DE 30EB 30AF;;;;N;SQUARED MARUKU;;;;
+3347;SQUARE MANSYON;So;0;L;<square> 30DE 30F3 30B7 30E7 30F3;;;;N;SQUARED MANSYON;;;;
+3348;SQUARE MIKURON;So;0;L;<square> 30DF 30AF 30ED 30F3;;;;N;SQUARED MIKURON;;;;
+3349;SQUARE MIRI;So;0;L;<square> 30DF 30EA;;;;N;SQUARED MIRI;;;;
+334A;SQUARE MIRIBAARU;So;0;L;<square> 30DF 30EA 30D0 30FC 30EB;;;;N;SQUARED MIRIBAARU;;;;
+334B;SQUARE MEGA;So;0;L;<square> 30E1 30AC;;;;N;SQUARED MEGA;;;;
+334C;SQUARE MEGATON;So;0;L;<square> 30E1 30AC 30C8 30F3;;;;N;SQUARED MEGATON;;;;
+334D;SQUARE MEETORU;So;0;L;<square> 30E1 30FC 30C8 30EB;;;;N;SQUARED MEETORU;;;;
+334E;SQUARE YAADO;So;0;L;<square> 30E4 30FC 30C9;;;;N;SQUARED YAADO;;;;
+334F;SQUARE YAARU;So;0;L;<square> 30E4 30FC 30EB;;;;N;SQUARED YAARU;;;;
+3350;SQUARE YUAN;So;0;L;<square> 30E6 30A2 30F3;;;;N;SQUARED YUAN;;;;
+3351;SQUARE RITTORU;So;0;L;<square> 30EA 30C3 30C8 30EB;;;;N;SQUARED RITTORU;;;;
+3352;SQUARE RIRA;So;0;L;<square> 30EA 30E9;;;;N;SQUARED RIRA;;;;
+3353;SQUARE RUPII;So;0;L;<square> 30EB 30D4 30FC;;;;N;SQUARED RUPII;;;;
+3354;SQUARE RUUBURU;So;0;L;<square> 30EB 30FC 30D6 30EB;;;;N;SQUARED RUUBURU;;;;
+3355;SQUARE REMU;So;0;L;<square> 30EC 30E0;;;;N;SQUARED REMU;;;;
+3356;SQUARE RENTOGEN;So;0;L;<square> 30EC 30F3 30C8 30B2 30F3;;;;N;SQUARED RENTOGEN;;;;
+3357;SQUARE WATTO;So;0;L;<square> 30EF 30C3 30C8;;;;N;SQUARED WATTO;;;;
+3358;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ZERO;So;0;L;<compat> 0030 70B9;;;;N;;;;;
+3359;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ONE;So;0;L;<compat> 0031 70B9;;;;N;;;;;
+335A;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWO;So;0;L;<compat> 0032 70B9;;;;N;;;;;
+335B;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THREE;So;0;L;<compat> 0033 70B9;;;;N;;;;;
+335C;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOUR;So;0;L;<compat> 0034 70B9;;;;N;;;;;
+335D;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIVE;So;0;L;<compat> 0035 70B9;;;;N;;;;;
+335E;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIX;So;0;L;<compat> 0036 70B9;;;;N;;;;;
+335F;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVEN;So;0;L;<compat> 0037 70B9;;;;N;;;;;
+3360;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHT;So;0;L;<compat> 0038 70B9;;;;N;;;;;
+3361;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINE;So;0;L;<compat> 0039 70B9;;;;N;;;;;
+3362;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TEN;So;0;L;<compat> 0031 0030 70B9;;;;N;;;;;
+3363;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ELEVEN;So;0;L;<compat> 0031 0031 70B9;;;;N;;;;;
+3364;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWELVE;So;0;L;<compat> 0031 0032 70B9;;;;N;;;;;
+3365;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THIRTEEN;So;0;L;<compat> 0031 0033 70B9;;;;N;;;;;
+3366;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOURTEEN;So;0;L;<compat> 0031 0034 70B9;;;;N;;;;;
+3367;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIFTEEN;So;0;L;<compat> 0031 0035 70B9;;;;N;;;;;
+3368;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIXTEEN;So;0;L;<compat> 0031 0036 70B9;;;;N;;;;;
+3369;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVENTEEN;So;0;L;<compat> 0031 0037 70B9;;;;N;;;;;
+336A;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHTEEN;So;0;L;<compat> 0031 0038 70B9;;;;N;;;;;
+336B;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINETEEN;So;0;L;<compat> 0031 0039 70B9;;;;N;;;;;
+336C;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY;So;0;L;<compat> 0032 0030 70B9;;;;N;;;;;
+336D;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-ONE;So;0;L;<compat> 0032 0031 70B9;;;;N;;;;;
+336E;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-TWO;So;0;L;<compat> 0032 0032 70B9;;;;N;;;;;
+336F;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-THREE;So;0;L;<compat> 0032 0033 70B9;;;;N;;;;;
+3370;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-FOUR;So;0;L;<compat> 0032 0034 70B9;;;;N;;;;;
+3371;SQUARE HPA;So;0;L;<square> 0068 0050 0061;;;;N;;;;;
+3372;SQUARE DA;So;0;L;<square> 0064 0061;;;;N;;;;;
+3373;SQUARE AU;So;0;L;<square> 0041 0055;;;;N;;;;;
+3374;SQUARE BAR;So;0;L;<square> 0062 0061 0072;;;;N;;;;;
+3375;SQUARE OV;So;0;L;<square> 006F 0056;;;;N;;;;;
+3376;SQUARE PC;So;0;L;<square> 0070 0063;;;;N;;;;;
+337B;SQUARE ERA NAME HEISEI;So;0;L;<square> 5E73 6210;;;;N;SQUARED TWO IDEOGRAPHS ERA NAME HEISEI;;;;
+337C;SQUARE ERA NAME SYOUWA;So;0;L;<square> 662D 548C;;;;N;SQUARED TWO IDEOGRAPHS ERA NAME SYOUWA;;;;
+337D;SQUARE ERA NAME TAISYOU;So;0;L;<square> 5927 6B63;;;;N;SQUARED TWO IDEOGRAPHS ERA NAME TAISYOU;;;;
+337E;SQUARE ERA NAME MEIZI;So;0;L;<square> 660E 6CBB;;;;N;SQUARED TWO IDEOGRAPHS ERA NAME MEIZI;;;;
+337F;SQUARE CORPORATION;So;0;L;<square> 682A 5F0F 4F1A 793E;;;;N;SQUARED FOUR IDEOGRAPHS CORPORATION;;;;
+3380;SQUARE PA AMPS;So;0;L;<square> 0070 0041;;;;N;SQUARED PA AMPS;;;;
+3381;SQUARE NA;So;0;L;<square> 006E 0041;;;;N;SQUARED NA;;;;
+3382;SQUARE MU A;So;0;L;<square> 03BC 0041;;;;N;SQUARED MU A;;;;
+3383;SQUARE MA;So;0;L;<square> 006D 0041;;;;N;SQUARED MA;;;;
+3384;SQUARE KA;So;0;L;<square> 006B 0041;;;;N;SQUARED KA;;;;
+3385;SQUARE KB;So;0;L;<square> 004B 0042;;;;N;SQUARED KB;;;;
+3386;SQUARE MB;So;0;L;<square> 004D 0042;;;;N;SQUARED MB;;;;
+3387;SQUARE GB;So;0;L;<square> 0047 0042;;;;N;SQUARED GB;;;;
+3388;SQUARE CAL;So;0;L;<square> 0063 0061 006C;;;;N;SQUARED CAL;;;;
+3389;SQUARE KCAL;So;0;L;<square> 006B 0063 0061 006C;;;;N;SQUARED KCAL;;;;
+338A;SQUARE PF;So;0;L;<square> 0070 0046;;;;N;SQUARED PF;;;;
+338B;SQUARE NF;So;0;L;<square> 006E 0046;;;;N;SQUARED NF;;;;
+338C;SQUARE MU F;So;0;L;<square> 03BC 0046;;;;N;SQUARED MU F;;;;
+338D;SQUARE MU G;So;0;L;<square> 03BC 0067;;;;N;SQUARED MU G;;;;
+338E;SQUARE MG;So;0;L;<square> 006D 0067;;;;N;SQUARED MG;;;;
+338F;SQUARE KG;So;0;L;<square> 006B 0067;;;;N;SQUARED KG;;;;
+3390;SQUARE HZ;So;0;L;<square> 0048 007A;;;;N;SQUARED HZ;;;;
+3391;SQUARE KHZ;So;0;L;<square> 006B 0048 007A;;;;N;SQUARED KHZ;;;;
+3392;SQUARE MHZ;So;0;L;<square> 004D 0048 007A;;;;N;SQUARED MHZ;;;;
+3393;SQUARE GHZ;So;0;L;<square> 0047 0048 007A;;;;N;SQUARED GHZ;;;;
+3394;SQUARE THZ;So;0;L;<square> 0054 0048 007A;;;;N;SQUARED THZ;;;;
+3395;SQUARE MU L;So;0;L;<square> 03BC 2113;;;;N;SQUARED MU L;;;;
+3396;SQUARE ML;So;0;L;<square> 006D 2113;;;;N;SQUARED ML;;;;
+3397;SQUARE DL;So;0;L;<square> 0064 2113;;;;N;SQUARED DL;;;;
+3398;SQUARE KL;So;0;L;<square> 006B 2113;;;;N;SQUARED KL;;;;
+3399;SQUARE FM;So;0;L;<square> 0066 006D;;;;N;SQUARED FM;;;;
+339A;SQUARE NM;So;0;L;<square> 006E 006D;;;;N;SQUARED NM;;;;
+339B;SQUARE MU M;So;0;L;<square> 03BC 006D;;;;N;SQUARED MU M;;;;
+339C;SQUARE MM;So;0;L;<square> 006D 006D;;;;N;SQUARED MM;;;;
+339D;SQUARE CM;So;0;L;<square> 0063 006D;;;;N;SQUARED CM;;;;
+339E;SQUARE KM;So;0;L;<square> 006B 006D;;;;N;SQUARED KM;;;;
+339F;SQUARE MM SQUARED;So;0;L;<square> 006D 006D 00B2;;;;N;SQUARED MM SQUARED;;;;
+33A0;SQUARE CM SQUARED;So;0;L;<square> 0063 006D 00B2;;;;N;SQUARED CM SQUARED;;;;
+33A1;SQUARE M SQUARED;So;0;L;<square> 006D 00B2;;;;N;SQUARED M SQUARED;;;;
+33A2;SQUARE KM SQUARED;So;0;L;<square> 006B 006D 00B2;;;;N;SQUARED KM SQUARED;;;;
+33A3;SQUARE MM CUBED;So;0;L;<square> 006D 006D 00B3;;;;N;SQUARED MM CUBED;;;;
+33A4;SQUARE CM CUBED;So;0;L;<square> 0063 006D 00B3;;;;N;SQUARED CM CUBED;;;;
+33A5;SQUARE M CUBED;So;0;L;<square> 006D 00B3;;;;N;SQUARED M CUBED;;;;
+33A6;SQUARE KM CUBED;So;0;L;<square> 006B 006D 00B3;;;;N;SQUARED KM CUBED;;;;
+33A7;SQUARE M OVER S;So;0;L;<square> 006D 2215 0073;;;;N;SQUARED M OVER S;;;;
+33A8;SQUARE M OVER S SQUARED;So;0;L;<square> 006D 2215 0073 00B2;;;;N;SQUARED M OVER S SQUARED;;;;
+33A9;SQUARE PA;So;0;L;<square> 0050 0061;;;;N;SQUARED PA;;;;
+33AA;SQUARE KPA;So;0;L;<square> 006B 0050 0061;;;;N;SQUARED KPA;;;;
+33AB;SQUARE MPA;So;0;L;<square> 004D 0050 0061;;;;N;SQUARED MPA;;;;
+33AC;SQUARE GPA;So;0;L;<square> 0047 0050 0061;;;;N;SQUARED GPA;;;;
+33AD;SQUARE RAD;So;0;L;<square> 0072 0061 0064;;;;N;SQUARED RAD;;;;
+33AE;SQUARE RAD OVER S;So;0;L;<square> 0072 0061 0064 2215 0073;;;;N;SQUARED RAD OVER S;;;;
+33AF;SQUARE RAD OVER S SQUARED;So;0;L;<square> 0072 0061 0064 2215 0073 00B2;;;;N;SQUARED RAD OVER S SQUARED;;;;
+33B0;SQUARE PS;So;0;L;<square> 0070 0073;;;;N;SQUARED PS;;;;
+33B1;SQUARE NS;So;0;L;<square> 006E 0073;;;;N;SQUARED NS;;;;
+33B2;SQUARE MU S;So;0;L;<square> 03BC 0073;;;;N;SQUARED MU S;;;;
+33B3;SQUARE MS;So;0;L;<square> 006D 0073;;;;N;SQUARED MS;;;;
+33B4;SQUARE PV;So;0;L;<square> 0070 0056;;;;N;SQUARED PV;;;;
+33B5;SQUARE NV;So;0;L;<square> 006E 0056;;;;N;SQUARED NV;;;;
+33B6;SQUARE MU V;So;0;L;<square> 03BC 0056;;;;N;SQUARED MU V;;;;
+33B7;SQUARE MV;So;0;L;<square> 006D 0056;;;;N;SQUARED MV;;;;
+33B8;SQUARE KV;So;0;L;<square> 006B 0056;;;;N;SQUARED KV;;;;
+33B9;SQUARE MV MEGA;So;0;L;<square> 004D 0056;;;;N;SQUARED MV MEGA;;;;
+33BA;SQUARE PW;So;0;L;<square> 0070 0057;;;;N;SQUARED PW;;;;
+33BB;SQUARE NW;So;0;L;<square> 006E 0057;;;;N;SQUARED NW;;;;
+33BC;SQUARE MU W;So;0;L;<square> 03BC 0057;;;;N;SQUARED MU W;;;;
+33BD;SQUARE MW;So;0;L;<square> 006D 0057;;;;N;SQUARED MW;;;;
+33BE;SQUARE KW;So;0;L;<square> 006B 0057;;;;N;SQUARED KW;;;;
+33BF;SQUARE MW MEGA;So;0;L;<square> 004D 0057;;;;N;SQUARED MW MEGA;;;;
+33C0;SQUARE K OHM;So;0;L;<square> 006B 03A9;;;;N;SQUARED K OHM;;;;
+33C1;SQUARE M OHM;So;0;L;<square> 004D 03A9;;;;N;SQUARED M OHM;;;;
+33C2;SQUARE AM;So;0;L;<square> 0061 002E 006D 002E;;;;N;SQUARED AM;;;;
+33C3;SQUARE BQ;So;0;L;<square> 0042 0071;;;;N;SQUARED BQ;;;;
+33C4;SQUARE CC;So;0;L;<square> 0063 0063;;;;N;SQUARED CC;;;;
+33C5;SQUARE CD;So;0;L;<square> 0063 0064;;;;N;SQUARED CD;;;;
+33C6;SQUARE C OVER KG;So;0;L;<square> 0043 2215 006B 0067;;;;N;SQUARED C OVER KG;;;;
+33C7;SQUARE CO;So;0;L;<square> 0043 006F 002E;;;;N;SQUARED CO;;;;
+33C8;SQUARE DB;So;0;L;<square> 0064 0042;;;;N;SQUARED DB;;;;
+33C9;SQUARE GY;So;0;L;<square> 0047 0079;;;;N;SQUARED GY;;;;
+33CA;SQUARE HA;So;0;L;<square> 0068 0061;;;;N;SQUARED HA;;;;
+33CB;SQUARE HP;So;0;L;<square> 0048 0050;;;;N;SQUARED HP;;;;
+33CC;SQUARE IN;So;0;L;<square> 0069 006E;;;;N;SQUARED IN;;;;
+33CD;SQUARE KK;So;0;L;<square> 004B 004B;;;;N;SQUARED KK;;;;
+33CE;SQUARE KM CAPITAL;So;0;L;<square> 004B 004D;;;;N;SQUARED KM CAPITAL;;;;
+33CF;SQUARE KT;So;0;L;<square> 006B 0074;;;;N;SQUARED KT;;;;
+33D0;SQUARE LM;So;0;L;<square> 006C 006D;;;;N;SQUARED LM;;;;
+33D1;SQUARE LN;So;0;L;<square> 006C 006E;;;;N;SQUARED LN;;;;
+33D2;SQUARE LOG;So;0;L;<square> 006C 006F 0067;;;;N;SQUARED LOG;;;;
+33D3;SQUARE LX;So;0;L;<square> 006C 0078;;;;N;SQUARED LX;;;;
+33D4;SQUARE MB SMALL;So;0;L;<square> 006D 0062;;;;N;SQUARED MB SMALL;;;;
+33D5;SQUARE MIL;So;0;L;<square> 006D 0069 006C;;;;N;SQUARED MIL;;;;
+33D6;SQUARE MOL;So;0;L;<square> 006D 006F 006C;;;;N;SQUARED MOL;;;;
+33D7;SQUARE PH;So;0;L;<square> 0050 0048;;;;N;SQUARED PH;;;;
+33D8;SQUARE PM;So;0;L;<square> 0070 002E 006D 002E;;;;N;SQUARED PM;;;;
+33D9;SQUARE PPM;So;0;L;<square> 0050 0050 004D;;;;N;SQUARED PPM;;;;
+33DA;SQUARE PR;So;0;L;<square> 0050 0052;;;;N;SQUARED PR;;;;
+33DB;SQUARE SR;So;0;L;<square> 0073 0072;;;;N;SQUARED SR;;;;
+33DC;SQUARE SV;So;0;L;<square> 0053 0076;;;;N;SQUARED SV;;;;
+33DD;SQUARE WB;So;0;L;<square> 0057 0062;;;;N;SQUARED WB;;;;
+33E0;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ONE;So;0;L;<compat> 0031 65E5;;;;N;;;;;
+33E1;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWO;So;0;L;<compat> 0032 65E5;;;;N;;;;;
+33E2;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THREE;So;0;L;<compat> 0033 65E5;;;;N;;;;;
+33E3;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOUR;So;0;L;<compat> 0034 65E5;;;;N;;;;;
+33E4;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIVE;So;0;L;<compat> 0035 65E5;;;;N;;;;;
+33E5;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIX;So;0;L;<compat> 0036 65E5;;;;N;;;;;
+33E6;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVEN;So;0;L;<compat> 0037 65E5;;;;N;;;;;
+33E7;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHT;So;0;L;<compat> 0038 65E5;;;;N;;;;;
+33E8;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINE;So;0;L;<compat> 0039 65E5;;;;N;;;;;
+33E9;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TEN;So;0;L;<compat> 0031 0030 65E5;;;;N;;;;;
+33EA;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ELEVEN;So;0;L;<compat> 0031 0031 65E5;;;;N;;;;;
+33EB;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWELVE;So;0;L;<compat> 0031 0032 65E5;;;;N;;;;;
+33EC;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTEEN;So;0;L;<compat> 0031 0033 65E5;;;;N;;;;;
+33ED;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOURTEEN;So;0;L;<compat> 0031 0034 65E5;;;;N;;;;;
+33EE;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIFTEEN;So;0;L;<compat> 0031 0035 65E5;;;;N;;;;;
+33EF;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIXTEEN;So;0;L;<compat> 0031 0036 65E5;;;;N;;;;;
+33F0;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVENTEEN;So;0;L;<compat> 0031 0037 65E5;;;;N;;;;;
+33F1;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHTEEN;So;0;L;<compat> 0031 0038 65E5;;;;N;;;;;
+33F2;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINETEEN;So;0;L;<compat> 0031 0039 65E5;;;;N;;;;;
+33F3;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY;So;0;L;<compat> 0032 0030 65E5;;;;N;;;;;
+33F4;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-ONE;So;0;L;<compat> 0032 0031 65E5;;;;N;;;;;
+33F5;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-TWO;So;0;L;<compat> 0032 0032 65E5;;;;N;;;;;
+33F6;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-THREE;So;0;L;<compat> 0032 0033 65E5;;;;N;;;;;
+33F7;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FOUR;So;0;L;<compat> 0032 0034 65E5;;;;N;;;;;
+33F8;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FIVE;So;0;L;<compat> 0032 0035 65E5;;;;N;;;;;
+33F9;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SIX;So;0;L;<compat> 0032 0036 65E5;;;;N;;;;;
+33FA;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SEVEN;So;0;L;<compat> 0032 0037 65E5;;;;N;;;;;
+33FB;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-EIGHT;So;0;L;<compat> 0032 0038 65E5;;;;N;;;;;
+33FC;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-NINE;So;0;L;<compat> 0032 0039 65E5;;;;N;;;;;
+33FD;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY;So;0;L;<compat> 0033 0030 65E5;;;;N;;;;;
+33FE;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY-ONE;So;0;L;<compat> 0033 0031 65E5;;;;N;;;;;
+3400;<CJK Ideograph Extension A, First>;Lo;0;L;;;;;N;;;;;
+4DB5;<CJK Ideograph Extension A, Last>;Lo;0;L;;;;;N;;;;;
+4E00;<CJK Ideograph, First>;Lo;0;L;;;;;N;;;;;
+9FA5;<CJK Ideograph, Last>;Lo;0;L;;;;;N;;;;;
+A000;YI SYLLABLE IT;Lo;0;L;;;;;N;;;;;
+A001;YI SYLLABLE IX;Lo;0;L;;;;;N;;;;;
+A002;YI SYLLABLE I;Lo;0;L;;;;;N;;;;;
+A003;YI SYLLABLE IP;Lo;0;L;;;;;N;;;;;
+A004;YI SYLLABLE IET;Lo;0;L;;;;;N;;;;;
+A005;YI SYLLABLE IEX;Lo;0;L;;;;;N;;;;;
+A006;YI SYLLABLE IE;Lo;0;L;;;;;N;;;;;
+A007;YI SYLLABLE IEP;Lo;0;L;;;;;N;;;;;
+A008;YI SYLLABLE AT;Lo;0;L;;;;;N;;;;;
+A009;YI SYLLABLE AX;Lo;0;L;;;;;N;;;;;
+A00A;YI SYLLABLE A;Lo;0;L;;;;;N;;;;;
+A00B;YI SYLLABLE AP;Lo;0;L;;;;;N;;;;;
+A00C;YI SYLLABLE UOX;Lo;0;L;;;;;N;;;;;
+A00D;YI SYLLABLE UO;Lo;0;L;;;;;N;;;;;
+A00E;YI SYLLABLE UOP;Lo;0;L;;;;;N;;;;;
+A00F;YI SYLLABLE OT;Lo;0;L;;;;;N;;;;;
+A010;YI SYLLABLE OX;Lo;0;L;;;;;N;;;;;
+A011;YI SYLLABLE O;Lo;0;L;;;;;N;;;;;
+A012;YI SYLLABLE OP;Lo;0;L;;;;;N;;;;;
+A013;YI SYLLABLE EX;Lo;0;L;;;;;N;;;;;
+A014;YI SYLLABLE E;Lo;0;L;;;;;N;;;;;
+A015;YI SYLLABLE WU;Lo;0;L;;;;;N;;;;;
+A016;YI SYLLABLE BIT;Lo;0;L;;;;;N;;;;;
+A017;YI SYLLABLE BIX;Lo;0;L;;;;;N;;;;;
+A018;YI SYLLABLE BI;Lo;0;L;;;;;N;;;;;
+A019;YI SYLLABLE BIP;Lo;0;L;;;;;N;;;;;
+A01A;YI SYLLABLE BIET;Lo;0;L;;;;;N;;;;;
+A01B;YI SYLLABLE BIEX;Lo;0;L;;;;;N;;;;;
+A01C;YI SYLLABLE BIE;Lo;0;L;;;;;N;;;;;
+A01D;YI SYLLABLE BIEP;Lo;0;L;;;;;N;;;;;
+A01E;YI SYLLABLE BAT;Lo;0;L;;;;;N;;;;;
+A01F;YI SYLLABLE BAX;Lo;0;L;;;;;N;;;;;
+A020;YI SYLLABLE BA;Lo;0;L;;;;;N;;;;;
+A021;YI SYLLABLE BAP;Lo;0;L;;;;;N;;;;;
+A022;YI SYLLABLE BUOX;Lo;0;L;;;;;N;;;;;
+A023;YI SYLLABLE BUO;Lo;0;L;;;;;N;;;;;
+A024;YI SYLLABLE BUOP;Lo;0;L;;;;;N;;;;;
+A025;YI SYLLABLE BOT;Lo;0;L;;;;;N;;;;;
+A026;YI SYLLABLE BOX;Lo;0;L;;;;;N;;;;;
+A027;YI SYLLABLE BO;Lo;0;L;;;;;N;;;;;
+A028;YI SYLLABLE BOP;Lo;0;L;;;;;N;;;;;
+A029;YI SYLLABLE BEX;Lo;0;L;;;;;N;;;;;
+A02A;YI SYLLABLE BE;Lo;0;L;;;;;N;;;;;
+A02B;YI SYLLABLE BEP;Lo;0;L;;;;;N;;;;;
+A02C;YI SYLLABLE BUT;Lo;0;L;;;;;N;;;;;
+A02D;YI SYLLABLE BUX;Lo;0;L;;;;;N;;;;;
+A02E;YI SYLLABLE BU;Lo;0;L;;;;;N;;;;;
+A02F;YI SYLLABLE BUP;Lo;0;L;;;;;N;;;;;
+A030;YI SYLLABLE BURX;Lo;0;L;;;;;N;;;;;
+A031;YI SYLLABLE BUR;Lo;0;L;;;;;N;;;;;
+A032;YI SYLLABLE BYT;Lo;0;L;;;;;N;;;;;
+A033;YI SYLLABLE BYX;Lo;0;L;;;;;N;;;;;
+A034;YI SYLLABLE BY;Lo;0;L;;;;;N;;;;;
+A035;YI SYLLABLE BYP;Lo;0;L;;;;;N;;;;;
+A036;YI SYLLABLE BYRX;Lo;0;L;;;;;N;;;;;
+A037;YI SYLLABLE BYR;Lo;0;L;;;;;N;;;;;
+A038;YI SYLLABLE PIT;Lo;0;L;;;;;N;;;;;
+A039;YI SYLLABLE PIX;Lo;0;L;;;;;N;;;;;
+A03A;YI SYLLABLE PI;Lo;0;L;;;;;N;;;;;
+A03B;YI SYLLABLE PIP;Lo;0;L;;;;;N;;;;;
+A03C;YI SYLLABLE PIEX;Lo;0;L;;;;;N;;;;;
+A03D;YI SYLLABLE PIE;Lo;0;L;;;;;N;;;;;
+A03E;YI SYLLABLE PIEP;Lo;0;L;;;;;N;;;;;
+A03F;YI SYLLABLE PAT;Lo;0;L;;;;;N;;;;;
+A040;YI SYLLABLE PAX;Lo;0;L;;;;;N;;;;;
+A041;YI SYLLABLE PA;Lo;0;L;;;;;N;;;;;
+A042;YI SYLLABLE PAP;Lo;0;L;;;;;N;;;;;
+A043;YI SYLLABLE PUOX;Lo;0;L;;;;;N;;;;;
+A044;YI SYLLABLE PUO;Lo;0;L;;;;;N;;;;;
+A045;YI SYLLABLE PUOP;Lo;0;L;;;;;N;;;;;
+A046;YI SYLLABLE POT;Lo;0;L;;;;;N;;;;;
+A047;YI SYLLABLE POX;Lo;0;L;;;;;N;;;;;
+A048;YI SYLLABLE PO;Lo;0;L;;;;;N;;;;;
+A049;YI SYLLABLE POP;Lo;0;L;;;;;N;;;;;
+A04A;YI SYLLABLE PUT;Lo;0;L;;;;;N;;;;;
+A04B;YI SYLLABLE PUX;Lo;0;L;;;;;N;;;;;
+A04C;YI SYLLABLE PU;Lo;0;L;;;;;N;;;;;
+A04D;YI SYLLABLE PUP;Lo;0;L;;;;;N;;;;;
+A04E;YI SYLLABLE PURX;Lo;0;L;;;;;N;;;;;
+A04F;YI SYLLABLE PUR;Lo;0;L;;;;;N;;;;;
+A050;YI SYLLABLE PYT;Lo;0;L;;;;;N;;;;;
+A051;YI SYLLABLE PYX;Lo;0;L;;;;;N;;;;;
+A052;YI SYLLABLE PY;Lo;0;L;;;;;N;;;;;
+A053;YI SYLLABLE PYP;Lo;0;L;;;;;N;;;;;
+A054;YI SYLLABLE PYRX;Lo;0;L;;;;;N;;;;;
+A055;YI SYLLABLE PYR;Lo;0;L;;;;;N;;;;;
+A056;YI SYLLABLE BBIT;Lo;0;L;;;;;N;;;;;
+A057;YI SYLLABLE BBIX;Lo;0;L;;;;;N;;;;;
+A058;YI SYLLABLE BBI;Lo;0;L;;;;;N;;;;;
+A059;YI SYLLABLE BBIP;Lo;0;L;;;;;N;;;;;
+A05A;YI SYLLABLE BBIET;Lo;0;L;;;;;N;;;;;
+A05B;YI SYLLABLE BBIEX;Lo;0;L;;;;;N;;;;;
+A05C;YI SYLLABLE BBIE;Lo;0;L;;;;;N;;;;;
+A05D;YI SYLLABLE BBIEP;Lo;0;L;;;;;N;;;;;
+A05E;YI SYLLABLE BBAT;Lo;0;L;;;;;N;;;;;
+A05F;YI SYLLABLE BBAX;Lo;0;L;;;;;N;;;;;
+A060;YI SYLLABLE BBA;Lo;0;L;;;;;N;;;;;
+A061;YI SYLLABLE BBAP;Lo;0;L;;;;;N;;;;;
+A062;YI SYLLABLE BBUOX;Lo;0;L;;;;;N;;;;;
+A063;YI SYLLABLE BBUO;Lo;0;L;;;;;N;;;;;
+A064;YI SYLLABLE BBUOP;Lo;0;L;;;;;N;;;;;
+A065;YI SYLLABLE BBOT;Lo;0;L;;;;;N;;;;;
+A066;YI SYLLABLE BBOX;Lo;0;L;;;;;N;;;;;
+A067;YI SYLLABLE BBO;Lo;0;L;;;;;N;;;;;
+A068;YI SYLLABLE BBOP;Lo;0;L;;;;;N;;;;;
+A069;YI SYLLABLE BBEX;Lo;0;L;;;;;N;;;;;
+A06A;YI SYLLABLE BBE;Lo;0;L;;;;;N;;;;;
+A06B;YI SYLLABLE BBEP;Lo;0;L;;;;;N;;;;;
+A06C;YI SYLLABLE BBUT;Lo;0;L;;;;;N;;;;;
+A06D;YI SYLLABLE BBUX;Lo;0;L;;;;;N;;;;;
+A06E;YI SYLLABLE BBU;Lo;0;L;;;;;N;;;;;
+A06F;YI SYLLABLE BBUP;Lo;0;L;;;;;N;;;;;
+A070;YI SYLLABLE BBURX;Lo;0;L;;;;;N;;;;;
+A071;YI SYLLABLE BBUR;Lo;0;L;;;;;N;;;;;
+A072;YI SYLLABLE BBYT;Lo;0;L;;;;;N;;;;;
+A073;YI SYLLABLE BBYX;Lo;0;L;;;;;N;;;;;
+A074;YI SYLLABLE BBY;Lo;0;L;;;;;N;;;;;
+A075;YI SYLLABLE BBYP;Lo;0;L;;;;;N;;;;;
+A076;YI SYLLABLE NBIT;Lo;0;L;;;;;N;;;;;
+A077;YI SYLLABLE NBIX;Lo;0;L;;;;;N;;;;;
+A078;YI SYLLABLE NBI;Lo;0;L;;;;;N;;;;;
+A079;YI SYLLABLE NBIP;Lo;0;L;;;;;N;;;;;
+A07A;YI SYLLABLE NBIEX;Lo;0;L;;;;;N;;;;;
+A07B;YI SYLLABLE NBIE;Lo;0;L;;;;;N;;;;;
+A07C;YI SYLLABLE NBIEP;Lo;0;L;;;;;N;;;;;
+A07D;YI SYLLABLE NBAT;Lo;0;L;;;;;N;;;;;
+A07E;YI SYLLABLE NBAX;Lo;0;L;;;;;N;;;;;
+A07F;YI SYLLABLE NBA;Lo;0;L;;;;;N;;;;;
+A080;YI SYLLABLE NBAP;Lo;0;L;;;;;N;;;;;
+A081;YI SYLLABLE NBOT;Lo;0;L;;;;;N;;;;;
+A082;YI SYLLABLE NBOX;Lo;0;L;;;;;N;;;;;
+A083;YI SYLLABLE NBO;Lo;0;L;;;;;N;;;;;
+A084;YI SYLLABLE NBOP;Lo;0;L;;;;;N;;;;;
+A085;YI SYLLABLE NBUT;Lo;0;L;;;;;N;;;;;
+A086;YI SYLLABLE NBUX;Lo;0;L;;;;;N;;;;;
+A087;YI SYLLABLE NBU;Lo;0;L;;;;;N;;;;;
+A088;YI SYLLABLE NBUP;Lo;0;L;;;;;N;;;;;
+A089;YI SYLLABLE NBURX;Lo;0;L;;;;;N;;;;;
+A08A;YI SYLLABLE NBUR;Lo;0;L;;;;;N;;;;;
+A08B;YI SYLLABLE NBYT;Lo;0;L;;;;;N;;;;;
+A08C;YI SYLLABLE NBYX;Lo;0;L;;;;;N;;;;;
+A08D;YI SYLLABLE NBY;Lo;0;L;;;;;N;;;;;
+A08E;YI SYLLABLE NBYP;Lo;0;L;;;;;N;;;;;
+A08F;YI SYLLABLE NBYRX;Lo;0;L;;;;;N;;;;;
+A090;YI SYLLABLE NBYR;Lo;0;L;;;;;N;;;;;
+A091;YI SYLLABLE HMIT;Lo;0;L;;;;;N;;;;;
+A092;YI SYLLABLE HMIX;Lo;0;L;;;;;N;;;;;
+A093;YI SYLLABLE HMI;Lo;0;L;;;;;N;;;;;
+A094;YI SYLLABLE HMIP;Lo;0;L;;;;;N;;;;;
+A095;YI SYLLABLE HMIEX;Lo;0;L;;;;;N;;;;;
+A096;YI SYLLABLE HMIE;Lo;0;L;;;;;N;;;;;
+A097;YI SYLLABLE HMIEP;Lo;0;L;;;;;N;;;;;
+A098;YI SYLLABLE HMAT;Lo;0;L;;;;;N;;;;;
+A099;YI SYLLABLE HMAX;Lo;0;L;;;;;N;;;;;
+A09A;YI SYLLABLE HMA;Lo;0;L;;;;;N;;;;;
+A09B;YI SYLLABLE HMAP;Lo;0;L;;;;;N;;;;;
+A09C;YI SYLLABLE HMUOX;Lo;0;L;;;;;N;;;;;
+A09D;YI SYLLABLE HMUO;Lo;0;L;;;;;N;;;;;
+A09E;YI SYLLABLE HMUOP;Lo;0;L;;;;;N;;;;;
+A09F;YI SYLLABLE HMOT;Lo;0;L;;;;;N;;;;;
+A0A0;YI SYLLABLE HMOX;Lo;0;L;;;;;N;;;;;
+A0A1;YI SYLLABLE HMO;Lo;0;L;;;;;N;;;;;
+A0A2;YI SYLLABLE HMOP;Lo;0;L;;;;;N;;;;;
+A0A3;YI SYLLABLE HMUT;Lo;0;L;;;;;N;;;;;
+A0A4;YI SYLLABLE HMUX;Lo;0;L;;;;;N;;;;;
+A0A5;YI SYLLABLE HMU;Lo;0;L;;;;;N;;;;;
+A0A6;YI SYLLABLE HMUP;Lo;0;L;;;;;N;;;;;
+A0A7;YI SYLLABLE HMURX;Lo;0;L;;;;;N;;;;;
+A0A8;YI SYLLABLE HMUR;Lo;0;L;;;;;N;;;;;
+A0A9;YI SYLLABLE HMYX;Lo;0;L;;;;;N;;;;;
+A0AA;YI SYLLABLE HMY;Lo;0;L;;;;;N;;;;;
+A0AB;YI SYLLABLE HMYP;Lo;0;L;;;;;N;;;;;
+A0AC;YI SYLLABLE HMYRX;Lo;0;L;;;;;N;;;;;
+A0AD;YI SYLLABLE HMYR;Lo;0;L;;;;;N;;;;;
+A0AE;YI SYLLABLE MIT;Lo;0;L;;;;;N;;;;;
+A0AF;YI SYLLABLE MIX;Lo;0;L;;;;;N;;;;;
+A0B0;YI SYLLABLE MI;Lo;0;L;;;;;N;;;;;
+A0B1;YI SYLLABLE MIP;Lo;0;L;;;;;N;;;;;
+A0B2;YI SYLLABLE MIEX;Lo;0;L;;;;;N;;;;;
+A0B3;YI SYLLABLE MIE;Lo;0;L;;;;;N;;;;;
+A0B4;YI SYLLABLE MIEP;Lo;0;L;;;;;N;;;;;
+A0B5;YI SYLLABLE MAT;Lo;0;L;;;;;N;;;;;
+A0B6;YI SYLLABLE MAX;Lo;0;L;;;;;N;;;;;
+A0B7;YI SYLLABLE MA;Lo;0;L;;;;;N;;;;;
+A0B8;YI SYLLABLE MAP;Lo;0;L;;;;;N;;;;;
+A0B9;YI SYLLABLE MUOT;Lo;0;L;;;;;N;;;;;
+A0BA;YI SYLLABLE MUOX;Lo;0;L;;;;;N;;;;;
+A0BB;YI SYLLABLE MUO;Lo;0;L;;;;;N;;;;;
+A0BC;YI SYLLABLE MUOP;Lo;0;L;;;;;N;;;;;
+A0BD;YI SYLLABLE MOT;Lo;0;L;;;;;N;;;;;
+A0BE;YI SYLLABLE MOX;Lo;0;L;;;;;N;;;;;
+A0BF;YI SYLLABLE MO;Lo;0;L;;;;;N;;;;;
+A0C0;YI SYLLABLE MOP;Lo;0;L;;;;;N;;;;;
+A0C1;YI SYLLABLE MEX;Lo;0;L;;;;;N;;;;;
+A0C2;YI SYLLABLE ME;Lo;0;L;;;;;N;;;;;
+A0C3;YI SYLLABLE MUT;Lo;0;L;;;;;N;;;;;
+A0C4;YI SYLLABLE MUX;Lo;0;L;;;;;N;;;;;
+A0C5;YI SYLLABLE MU;Lo;0;L;;;;;N;;;;;
+A0C6;YI SYLLABLE MUP;Lo;0;L;;;;;N;;;;;
+A0C7;YI SYLLABLE MURX;Lo;0;L;;;;;N;;;;;
+A0C8;YI SYLLABLE MUR;Lo;0;L;;;;;N;;;;;
+A0C9;YI SYLLABLE MYT;Lo;0;L;;;;;N;;;;;
+A0CA;YI SYLLABLE MYX;Lo;0;L;;;;;N;;;;;
+A0CB;YI SYLLABLE MY;Lo;0;L;;;;;N;;;;;
+A0CC;YI SYLLABLE MYP;Lo;0;L;;;;;N;;;;;
+A0CD;YI SYLLABLE FIT;Lo;0;L;;;;;N;;;;;
+A0CE;YI SYLLABLE FIX;Lo;0;L;;;;;N;;;;;
+A0CF;YI SYLLABLE FI;Lo;0;L;;;;;N;;;;;
+A0D0;YI SYLLABLE FIP;Lo;0;L;;;;;N;;;;;
+A0D1;YI SYLLABLE FAT;Lo;0;L;;;;;N;;;;;
+A0D2;YI SYLLABLE FAX;Lo;0;L;;;;;N;;;;;
+A0D3;YI SYLLABLE FA;Lo;0;L;;;;;N;;;;;
+A0D4;YI SYLLABLE FAP;Lo;0;L;;;;;N;;;;;
+A0D5;YI SYLLABLE FOX;Lo;0;L;;;;;N;;;;;
+A0D6;YI SYLLABLE FO;Lo;0;L;;;;;N;;;;;
+A0D7;YI SYLLABLE FOP;Lo;0;L;;;;;N;;;;;
+A0D8;YI SYLLABLE FUT;Lo;0;L;;;;;N;;;;;
+A0D9;YI SYLLABLE FUX;Lo;0;L;;;;;N;;;;;
+A0DA;YI SYLLABLE FU;Lo;0;L;;;;;N;;;;;
+A0DB;YI SYLLABLE FUP;Lo;0;L;;;;;N;;;;;
+A0DC;YI SYLLABLE FURX;Lo;0;L;;;;;N;;;;;
+A0DD;YI SYLLABLE FUR;Lo;0;L;;;;;N;;;;;
+A0DE;YI SYLLABLE FYT;Lo;0;L;;;;;N;;;;;
+A0DF;YI SYLLABLE FYX;Lo;0;L;;;;;N;;;;;
+A0E0;YI SYLLABLE FY;Lo;0;L;;;;;N;;;;;
+A0E1;YI SYLLABLE FYP;Lo;0;L;;;;;N;;;;;
+A0E2;YI SYLLABLE VIT;Lo;0;L;;;;;N;;;;;
+A0E3;YI SYLLABLE VIX;Lo;0;L;;;;;N;;;;;
+A0E4;YI SYLLABLE VI;Lo;0;L;;;;;N;;;;;
+A0E5;YI SYLLABLE VIP;Lo;0;L;;;;;N;;;;;
+A0E6;YI SYLLABLE VIET;Lo;0;L;;;;;N;;;;;
+A0E7;YI SYLLABLE VIEX;Lo;0;L;;;;;N;;;;;
+A0E8;YI SYLLABLE VIE;Lo;0;L;;;;;N;;;;;
+A0E9;YI SYLLABLE VIEP;Lo;0;L;;;;;N;;;;;
+A0EA;YI SYLLABLE VAT;Lo;0;L;;;;;N;;;;;
+A0EB;YI SYLLABLE VAX;Lo;0;L;;;;;N;;;;;
+A0EC;YI SYLLABLE VA;Lo;0;L;;;;;N;;;;;
+A0ED;YI SYLLABLE VAP;Lo;0;L;;;;;N;;;;;
+A0EE;YI SYLLABLE VOT;Lo;0;L;;;;;N;;;;;
+A0EF;YI SYLLABLE VOX;Lo;0;L;;;;;N;;;;;
+A0F0;YI SYLLABLE VO;Lo;0;L;;;;;N;;;;;
+A0F1;YI SYLLABLE VOP;Lo;0;L;;;;;N;;;;;
+A0F2;YI SYLLABLE VEX;Lo;0;L;;;;;N;;;;;
+A0F3;YI SYLLABLE VEP;Lo;0;L;;;;;N;;;;;
+A0F4;YI SYLLABLE VUT;Lo;0;L;;;;;N;;;;;
+A0F5;YI SYLLABLE VUX;Lo;0;L;;;;;N;;;;;
+A0F6;YI SYLLABLE VU;Lo;0;L;;;;;N;;;;;
+A0F7;YI SYLLABLE VUP;Lo;0;L;;;;;N;;;;;
+A0F8;YI SYLLABLE VURX;Lo;0;L;;;;;N;;;;;
+A0F9;YI SYLLABLE VUR;Lo;0;L;;;;;N;;;;;
+A0FA;YI SYLLABLE VYT;Lo;0;L;;;;;N;;;;;
+A0FB;YI SYLLABLE VYX;Lo;0;L;;;;;N;;;;;
+A0FC;YI SYLLABLE VY;Lo;0;L;;;;;N;;;;;
+A0FD;YI SYLLABLE VYP;Lo;0;L;;;;;N;;;;;
+A0FE;YI SYLLABLE VYRX;Lo;0;L;;;;;N;;;;;
+A0FF;YI SYLLABLE VYR;Lo;0;L;;;;;N;;;;;
+A100;YI SYLLABLE DIT;Lo;0;L;;;;;N;;;;;
+A101;YI SYLLABLE DIX;Lo;0;L;;;;;N;;;;;
+A102;YI SYLLABLE DI;Lo;0;L;;;;;N;;;;;
+A103;YI SYLLABLE DIP;Lo;0;L;;;;;N;;;;;
+A104;YI SYLLABLE DIEX;Lo;0;L;;;;;N;;;;;
+A105;YI SYLLABLE DIE;Lo;0;L;;;;;N;;;;;
+A106;YI SYLLABLE DIEP;Lo;0;L;;;;;N;;;;;
+A107;YI SYLLABLE DAT;Lo;0;L;;;;;N;;;;;
+A108;YI SYLLABLE DAX;Lo;0;L;;;;;N;;;;;
+A109;YI SYLLABLE DA;Lo;0;L;;;;;N;;;;;
+A10A;YI SYLLABLE DAP;Lo;0;L;;;;;N;;;;;
+A10B;YI SYLLABLE DUOX;Lo;0;L;;;;;N;;;;;
+A10C;YI SYLLABLE DUO;Lo;0;L;;;;;N;;;;;
+A10D;YI SYLLABLE DOT;Lo;0;L;;;;;N;;;;;
+A10E;YI SYLLABLE DOX;Lo;0;L;;;;;N;;;;;
+A10F;YI SYLLABLE DO;Lo;0;L;;;;;N;;;;;
+A110;YI SYLLABLE DOP;Lo;0;L;;;;;N;;;;;
+A111;YI SYLLABLE DEX;Lo;0;L;;;;;N;;;;;
+A112;YI SYLLABLE DE;Lo;0;L;;;;;N;;;;;
+A113;YI SYLLABLE DEP;Lo;0;L;;;;;N;;;;;
+A114;YI SYLLABLE DUT;Lo;0;L;;;;;N;;;;;
+A115;YI SYLLABLE DUX;Lo;0;L;;;;;N;;;;;
+A116;YI SYLLABLE DU;Lo;0;L;;;;;N;;;;;
+A117;YI SYLLABLE DUP;Lo;0;L;;;;;N;;;;;
+A118;YI SYLLABLE DURX;Lo;0;L;;;;;N;;;;;
+A119;YI SYLLABLE DUR;Lo;0;L;;;;;N;;;;;
+A11A;YI SYLLABLE TIT;Lo;0;L;;;;;N;;;;;
+A11B;YI SYLLABLE TIX;Lo;0;L;;;;;N;;;;;
+A11C;YI SYLLABLE TI;Lo;0;L;;;;;N;;;;;
+A11D;YI SYLLABLE TIP;Lo;0;L;;;;;N;;;;;
+A11E;YI SYLLABLE TIEX;Lo;0;L;;;;;N;;;;;
+A11F;YI SYLLABLE TIE;Lo;0;L;;;;;N;;;;;
+A120;YI SYLLABLE TIEP;Lo;0;L;;;;;N;;;;;
+A121;YI SYLLABLE TAT;Lo;0;L;;;;;N;;;;;
+A122;YI SYLLABLE TAX;Lo;0;L;;;;;N;;;;;
+A123;YI SYLLABLE TA;Lo;0;L;;;;;N;;;;;
+A124;YI SYLLABLE TAP;Lo;0;L;;;;;N;;;;;
+A125;YI SYLLABLE TUOT;Lo;0;L;;;;;N;;;;;
+A126;YI SYLLABLE TUOX;Lo;0;L;;;;;N;;;;;
+A127;YI SYLLABLE TUO;Lo;0;L;;;;;N;;;;;
+A128;YI SYLLABLE TUOP;Lo;0;L;;;;;N;;;;;
+A129;YI SYLLABLE TOT;Lo;0;L;;;;;N;;;;;
+A12A;YI SYLLABLE TOX;Lo;0;L;;;;;N;;;;;
+A12B;YI SYLLABLE TO;Lo;0;L;;;;;N;;;;;
+A12C;YI SYLLABLE TOP;Lo;0;L;;;;;N;;;;;
+A12D;YI SYLLABLE TEX;Lo;0;L;;;;;N;;;;;
+A12E;YI SYLLABLE TE;Lo;0;L;;;;;N;;;;;
+A12F;YI SYLLABLE TEP;Lo;0;L;;;;;N;;;;;
+A130;YI SYLLABLE TUT;Lo;0;L;;;;;N;;;;;
+A131;YI SYLLABLE TUX;Lo;0;L;;;;;N;;;;;
+A132;YI SYLLABLE TU;Lo;0;L;;;;;N;;;;;
+A133;YI SYLLABLE TUP;Lo;0;L;;;;;N;;;;;
+A134;YI SYLLABLE TURX;Lo;0;L;;;;;N;;;;;
+A135;YI SYLLABLE TUR;Lo;0;L;;;;;N;;;;;
+A136;YI SYLLABLE DDIT;Lo;0;L;;;;;N;;;;;
+A137;YI SYLLABLE DDIX;Lo;0;L;;;;;N;;;;;
+A138;YI SYLLABLE DDI;Lo;0;L;;;;;N;;;;;
+A139;YI SYLLABLE DDIP;Lo;0;L;;;;;N;;;;;
+A13A;YI SYLLABLE DDIEX;Lo;0;L;;;;;N;;;;;
+A13B;YI SYLLABLE DDIE;Lo;0;L;;;;;N;;;;;
+A13C;YI SYLLABLE DDIEP;Lo;0;L;;;;;N;;;;;
+A13D;YI SYLLABLE DDAT;Lo;0;L;;;;;N;;;;;
+A13E;YI SYLLABLE DDAX;Lo;0;L;;;;;N;;;;;
+A13F;YI SYLLABLE DDA;Lo;0;L;;;;;N;;;;;
+A140;YI SYLLABLE DDAP;Lo;0;L;;;;;N;;;;;
+A141;YI SYLLABLE DDUOX;Lo;0;L;;;;;N;;;;;
+A142;YI SYLLABLE DDUO;Lo;0;L;;;;;N;;;;;
+A143;YI SYLLABLE DDUOP;Lo;0;L;;;;;N;;;;;
+A144;YI SYLLABLE DDOT;Lo;0;L;;;;;N;;;;;
+A145;YI SYLLABLE DDOX;Lo;0;L;;;;;N;;;;;
+A146;YI SYLLABLE DDO;Lo;0;L;;;;;N;;;;;
+A147;YI SYLLABLE DDOP;Lo;0;L;;;;;N;;;;;
+A148;YI SYLLABLE DDEX;Lo;0;L;;;;;N;;;;;
+A149;YI SYLLABLE DDE;Lo;0;L;;;;;N;;;;;
+A14A;YI SYLLABLE DDEP;Lo;0;L;;;;;N;;;;;
+A14B;YI SYLLABLE DDUT;Lo;0;L;;;;;N;;;;;
+A14C;YI SYLLABLE DDUX;Lo;0;L;;;;;N;;;;;
+A14D;YI SYLLABLE DDU;Lo;0;L;;;;;N;;;;;
+A14E;YI SYLLABLE DDUP;Lo;0;L;;;;;N;;;;;
+A14F;YI SYLLABLE DDURX;Lo;0;L;;;;;N;;;;;
+A150;YI SYLLABLE DDUR;Lo;0;L;;;;;N;;;;;
+A151;YI SYLLABLE NDIT;Lo;0;L;;;;;N;;;;;
+A152;YI SYLLABLE NDIX;Lo;0;L;;;;;N;;;;;
+A153;YI SYLLABLE NDI;Lo;0;L;;;;;N;;;;;
+A154;YI SYLLABLE NDIP;Lo;0;L;;;;;N;;;;;
+A155;YI SYLLABLE NDIEX;Lo;0;L;;;;;N;;;;;
+A156;YI SYLLABLE NDIE;Lo;0;L;;;;;N;;;;;
+A157;YI SYLLABLE NDAT;Lo;0;L;;;;;N;;;;;
+A158;YI SYLLABLE NDAX;Lo;0;L;;;;;N;;;;;
+A159;YI SYLLABLE NDA;Lo;0;L;;;;;N;;;;;
+A15A;YI SYLLABLE NDAP;Lo;0;L;;;;;N;;;;;
+A15B;YI SYLLABLE NDOT;Lo;0;L;;;;;N;;;;;
+A15C;YI SYLLABLE NDOX;Lo;0;L;;;;;N;;;;;
+A15D;YI SYLLABLE NDO;Lo;0;L;;;;;N;;;;;
+A15E;YI SYLLABLE NDOP;Lo;0;L;;;;;N;;;;;
+A15F;YI SYLLABLE NDEX;Lo;0;L;;;;;N;;;;;
+A160;YI SYLLABLE NDE;Lo;0;L;;;;;N;;;;;
+A161;YI SYLLABLE NDEP;Lo;0;L;;;;;N;;;;;
+A162;YI SYLLABLE NDUT;Lo;0;L;;;;;N;;;;;
+A163;YI SYLLABLE NDUX;Lo;0;L;;;;;N;;;;;
+A164;YI SYLLABLE NDU;Lo;0;L;;;;;N;;;;;
+A165;YI SYLLABLE NDUP;Lo;0;L;;;;;N;;;;;
+A166;YI SYLLABLE NDURX;Lo;0;L;;;;;N;;;;;
+A167;YI SYLLABLE NDUR;Lo;0;L;;;;;N;;;;;
+A168;YI SYLLABLE HNIT;Lo;0;L;;;;;N;;;;;
+A169;YI SYLLABLE HNIX;Lo;0;L;;;;;N;;;;;
+A16A;YI SYLLABLE HNI;Lo;0;L;;;;;N;;;;;
+A16B;YI SYLLABLE HNIP;Lo;0;L;;;;;N;;;;;
+A16C;YI SYLLABLE HNIET;Lo;0;L;;;;;N;;;;;
+A16D;YI SYLLABLE HNIEX;Lo;0;L;;;;;N;;;;;
+A16E;YI SYLLABLE HNIE;Lo;0;L;;;;;N;;;;;
+A16F;YI SYLLABLE HNIEP;Lo;0;L;;;;;N;;;;;
+A170;YI SYLLABLE HNAT;Lo;0;L;;;;;N;;;;;
+A171;YI SYLLABLE HNAX;Lo;0;L;;;;;N;;;;;
+A172;YI SYLLABLE HNA;Lo;0;L;;;;;N;;;;;
+A173;YI SYLLABLE HNAP;Lo;0;L;;;;;N;;;;;
+A174;YI SYLLABLE HNUOX;Lo;0;L;;;;;N;;;;;
+A175;YI SYLLABLE HNUO;Lo;0;L;;;;;N;;;;;
+A176;YI SYLLABLE HNOT;Lo;0;L;;;;;N;;;;;
+A177;YI SYLLABLE HNOX;Lo;0;L;;;;;N;;;;;
+A178;YI SYLLABLE HNOP;Lo;0;L;;;;;N;;;;;
+A179;YI SYLLABLE HNEX;Lo;0;L;;;;;N;;;;;
+A17A;YI SYLLABLE HNE;Lo;0;L;;;;;N;;;;;
+A17B;YI SYLLABLE HNEP;Lo;0;L;;;;;N;;;;;
+A17C;YI SYLLABLE HNUT;Lo;0;L;;;;;N;;;;;
+A17D;YI SYLLABLE NIT;Lo;0;L;;;;;N;;;;;
+A17E;YI SYLLABLE NIX;Lo;0;L;;;;;N;;;;;
+A17F;YI SYLLABLE NI;Lo;0;L;;;;;N;;;;;
+A180;YI SYLLABLE NIP;Lo;0;L;;;;;N;;;;;
+A181;YI SYLLABLE NIEX;Lo;0;L;;;;;N;;;;;
+A182;YI SYLLABLE NIE;Lo;0;L;;;;;N;;;;;
+A183;YI SYLLABLE NIEP;Lo;0;L;;;;;N;;;;;
+A184;YI SYLLABLE NAX;Lo;0;L;;;;;N;;;;;
+A185;YI SYLLABLE NA;Lo;0;L;;;;;N;;;;;
+A186;YI SYLLABLE NAP;Lo;0;L;;;;;N;;;;;
+A187;YI SYLLABLE NUOX;Lo;0;L;;;;;N;;;;;
+A188;YI SYLLABLE NUO;Lo;0;L;;;;;N;;;;;
+A189;YI SYLLABLE NUOP;Lo;0;L;;;;;N;;;;;
+A18A;YI SYLLABLE NOT;Lo;0;L;;;;;N;;;;;
+A18B;YI SYLLABLE NOX;Lo;0;L;;;;;N;;;;;
+A18C;YI SYLLABLE NO;Lo;0;L;;;;;N;;;;;
+A18D;YI SYLLABLE NOP;Lo;0;L;;;;;N;;;;;
+A18E;YI SYLLABLE NEX;Lo;0;L;;;;;N;;;;;
+A18F;YI SYLLABLE NE;Lo;0;L;;;;;N;;;;;
+A190;YI SYLLABLE NEP;Lo;0;L;;;;;N;;;;;
+A191;YI SYLLABLE NUT;Lo;0;L;;;;;N;;;;;
+A192;YI SYLLABLE NUX;Lo;0;L;;;;;N;;;;;
+A193;YI SYLLABLE NU;Lo;0;L;;;;;N;;;;;
+A194;YI SYLLABLE NUP;Lo;0;L;;;;;N;;;;;
+A195;YI SYLLABLE NURX;Lo;0;L;;;;;N;;;;;
+A196;YI SYLLABLE NUR;Lo;0;L;;;;;N;;;;;
+A197;YI SYLLABLE HLIT;Lo;0;L;;;;;N;;;;;
+A198;YI SYLLABLE HLIX;Lo;0;L;;;;;N;;;;;
+A199;YI SYLLABLE HLI;Lo;0;L;;;;;N;;;;;
+A19A;YI SYLLABLE HLIP;Lo;0;L;;;;;N;;;;;
+A19B;YI SYLLABLE HLIEX;Lo;0;L;;;;;N;;;;;
+A19C;YI SYLLABLE HLIE;Lo;0;L;;;;;N;;;;;
+A19D;YI SYLLABLE HLIEP;Lo;0;L;;;;;N;;;;;
+A19E;YI SYLLABLE HLAT;Lo;0;L;;;;;N;;;;;
+A19F;YI SYLLABLE HLAX;Lo;0;L;;;;;N;;;;;
+A1A0;YI SYLLABLE HLA;Lo;0;L;;;;;N;;;;;
+A1A1;YI SYLLABLE HLAP;Lo;0;L;;;;;N;;;;;
+A1A2;YI SYLLABLE HLUOX;Lo;0;L;;;;;N;;;;;
+A1A3;YI SYLLABLE HLUO;Lo;0;L;;;;;N;;;;;
+A1A4;YI SYLLABLE HLUOP;Lo;0;L;;;;;N;;;;;
+A1A5;YI SYLLABLE HLOX;Lo;0;L;;;;;N;;;;;
+A1A6;YI SYLLABLE HLO;Lo;0;L;;;;;N;;;;;
+A1A7;YI SYLLABLE HLOP;Lo;0;L;;;;;N;;;;;
+A1A8;YI SYLLABLE HLEX;Lo;0;L;;;;;N;;;;;
+A1A9;YI SYLLABLE HLE;Lo;0;L;;;;;N;;;;;
+A1AA;YI SYLLABLE HLEP;Lo;0;L;;;;;N;;;;;
+A1AB;YI SYLLABLE HLUT;Lo;0;L;;;;;N;;;;;
+A1AC;YI SYLLABLE HLUX;Lo;0;L;;;;;N;;;;;
+A1AD;YI SYLLABLE HLU;Lo;0;L;;;;;N;;;;;
+A1AE;YI SYLLABLE HLUP;Lo;0;L;;;;;N;;;;;
+A1AF;YI SYLLABLE HLURX;Lo;0;L;;;;;N;;;;;
+A1B0;YI SYLLABLE HLUR;Lo;0;L;;;;;N;;;;;
+A1B1;YI SYLLABLE HLYT;Lo;0;L;;;;;N;;;;;
+A1B2;YI SYLLABLE HLYX;Lo;0;L;;;;;N;;;;;
+A1B3;YI SYLLABLE HLY;Lo;0;L;;;;;N;;;;;
+A1B4;YI SYLLABLE HLYP;Lo;0;L;;;;;N;;;;;
+A1B5;YI SYLLABLE HLYRX;Lo;0;L;;;;;N;;;;;
+A1B6;YI SYLLABLE HLYR;Lo;0;L;;;;;N;;;;;
+A1B7;YI SYLLABLE LIT;Lo;0;L;;;;;N;;;;;
+A1B8;YI SYLLABLE LIX;Lo;0;L;;;;;N;;;;;
+A1B9;YI SYLLABLE LI;Lo;0;L;;;;;N;;;;;
+A1BA;YI SYLLABLE LIP;Lo;0;L;;;;;N;;;;;
+A1BB;YI SYLLABLE LIET;Lo;0;L;;;;;N;;;;;
+A1BC;YI SYLLABLE LIEX;Lo;0;L;;;;;N;;;;;
+A1BD;YI SYLLABLE LIE;Lo;0;L;;;;;N;;;;;
+A1BE;YI SYLLABLE LIEP;Lo;0;L;;;;;N;;;;;
+A1BF;YI SYLLABLE LAT;Lo;0;L;;;;;N;;;;;
+A1C0;YI SYLLABLE LAX;Lo;0;L;;;;;N;;;;;
+A1C1;YI SYLLABLE LA;Lo;0;L;;;;;N;;;;;
+A1C2;YI SYLLABLE LAP;Lo;0;L;;;;;N;;;;;
+A1C3;YI SYLLABLE LUOT;Lo;0;L;;;;;N;;;;;
+A1C4;YI SYLLABLE LUOX;Lo;0;L;;;;;N;;;;;
+A1C5;YI SYLLABLE LUO;Lo;0;L;;;;;N;;;;;
+A1C6;YI SYLLABLE LUOP;Lo;0;L;;;;;N;;;;;
+A1C7;YI SYLLABLE LOT;Lo;0;L;;;;;N;;;;;
+A1C8;YI SYLLABLE LOX;Lo;0;L;;;;;N;;;;;
+A1C9;YI SYLLABLE LO;Lo;0;L;;;;;N;;;;;
+A1CA;YI SYLLABLE LOP;Lo;0;L;;;;;N;;;;;
+A1CB;YI SYLLABLE LEX;Lo;0;L;;;;;N;;;;;
+A1CC;YI SYLLABLE LE;Lo;0;L;;;;;N;;;;;
+A1CD;YI SYLLABLE LEP;Lo;0;L;;;;;N;;;;;
+A1CE;YI SYLLABLE LUT;Lo;0;L;;;;;N;;;;;
+A1CF;YI SYLLABLE LUX;Lo;0;L;;;;;N;;;;;
+A1D0;YI SYLLABLE LU;Lo;0;L;;;;;N;;;;;
+A1D1;YI SYLLABLE LUP;Lo;0;L;;;;;N;;;;;
+A1D2;YI SYLLABLE LURX;Lo;0;L;;;;;N;;;;;
+A1D3;YI SYLLABLE LUR;Lo;0;L;;;;;N;;;;;
+A1D4;YI SYLLABLE LYT;Lo;0;L;;;;;N;;;;;
+A1D5;YI SYLLABLE LYX;Lo;0;L;;;;;N;;;;;
+A1D6;YI SYLLABLE LY;Lo;0;L;;;;;N;;;;;
+A1D7;YI SYLLABLE LYP;Lo;0;L;;;;;N;;;;;
+A1D8;YI SYLLABLE LYRX;Lo;0;L;;;;;N;;;;;
+A1D9;YI SYLLABLE LYR;Lo;0;L;;;;;N;;;;;
+A1DA;YI SYLLABLE GIT;Lo;0;L;;;;;N;;;;;
+A1DB;YI SYLLABLE GIX;Lo;0;L;;;;;N;;;;;
+A1DC;YI SYLLABLE GI;Lo;0;L;;;;;N;;;;;
+A1DD;YI SYLLABLE GIP;Lo;0;L;;;;;N;;;;;
+A1DE;YI SYLLABLE GIET;Lo;0;L;;;;;N;;;;;
+A1DF;YI SYLLABLE GIEX;Lo;0;L;;;;;N;;;;;
+A1E0;YI SYLLABLE GIE;Lo;0;L;;;;;N;;;;;
+A1E1;YI SYLLABLE GIEP;Lo;0;L;;;;;N;;;;;
+A1E2;YI SYLLABLE GAT;Lo;0;L;;;;;N;;;;;
+A1E3;YI SYLLABLE GAX;Lo;0;L;;;;;N;;;;;
+A1E4;YI SYLLABLE GA;Lo;0;L;;;;;N;;;;;
+A1E5;YI SYLLABLE GAP;Lo;0;L;;;;;N;;;;;
+A1E6;YI SYLLABLE GUOT;Lo;0;L;;;;;N;;;;;
+A1E7;YI SYLLABLE GUOX;Lo;0;L;;;;;N;;;;;
+A1E8;YI SYLLABLE GUO;Lo;0;L;;;;;N;;;;;
+A1E9;YI SYLLABLE GUOP;Lo;0;L;;;;;N;;;;;
+A1EA;YI SYLLABLE GOT;Lo;0;L;;;;;N;;;;;
+A1EB;YI SYLLABLE GOX;Lo;0;L;;;;;N;;;;;
+A1EC;YI SYLLABLE GO;Lo;0;L;;;;;N;;;;;
+A1ED;YI SYLLABLE GOP;Lo;0;L;;;;;N;;;;;
+A1EE;YI SYLLABLE GET;Lo;0;L;;;;;N;;;;;
+A1EF;YI SYLLABLE GEX;Lo;0;L;;;;;N;;;;;
+A1F0;YI SYLLABLE GE;Lo;0;L;;;;;N;;;;;
+A1F1;YI SYLLABLE GEP;Lo;0;L;;;;;N;;;;;
+A1F2;YI SYLLABLE GUT;Lo;0;L;;;;;N;;;;;
+A1F3;YI SYLLABLE GUX;Lo;0;L;;;;;N;;;;;
+A1F4;YI SYLLABLE GU;Lo;0;L;;;;;N;;;;;
+A1F5;YI SYLLABLE GUP;Lo;0;L;;;;;N;;;;;
+A1F6;YI SYLLABLE GURX;Lo;0;L;;;;;N;;;;;
+A1F7;YI SYLLABLE GUR;Lo;0;L;;;;;N;;;;;
+A1F8;YI SYLLABLE KIT;Lo;0;L;;;;;N;;;;;
+A1F9;YI SYLLABLE KIX;Lo;0;L;;;;;N;;;;;
+A1FA;YI SYLLABLE KI;Lo;0;L;;;;;N;;;;;
+A1FB;YI SYLLABLE KIP;Lo;0;L;;;;;N;;;;;
+A1FC;YI SYLLABLE KIEX;Lo;0;L;;;;;N;;;;;
+A1FD;YI SYLLABLE KIE;Lo;0;L;;;;;N;;;;;
+A1FE;YI SYLLABLE KIEP;Lo;0;L;;;;;N;;;;;
+A1FF;YI SYLLABLE KAT;Lo;0;L;;;;;N;;;;;
+A200;YI SYLLABLE KAX;Lo;0;L;;;;;N;;;;;
+A201;YI SYLLABLE KA;Lo;0;L;;;;;N;;;;;
+A202;YI SYLLABLE KAP;Lo;0;L;;;;;N;;;;;
+A203;YI SYLLABLE KUOX;Lo;0;L;;;;;N;;;;;
+A204;YI SYLLABLE KUO;Lo;0;L;;;;;N;;;;;
+A205;YI SYLLABLE KUOP;Lo;0;L;;;;;N;;;;;
+A206;YI SYLLABLE KOT;Lo;0;L;;;;;N;;;;;
+A207;YI SYLLABLE KOX;Lo;0;L;;;;;N;;;;;
+A208;YI SYLLABLE KO;Lo;0;L;;;;;N;;;;;
+A209;YI SYLLABLE KOP;Lo;0;L;;;;;N;;;;;
+A20A;YI SYLLABLE KET;Lo;0;L;;;;;N;;;;;
+A20B;YI SYLLABLE KEX;Lo;0;L;;;;;N;;;;;
+A20C;YI SYLLABLE KE;Lo;0;L;;;;;N;;;;;
+A20D;YI SYLLABLE KEP;Lo;0;L;;;;;N;;;;;
+A20E;YI SYLLABLE KUT;Lo;0;L;;;;;N;;;;;
+A20F;YI SYLLABLE KUX;Lo;0;L;;;;;N;;;;;
+A210;YI SYLLABLE KU;Lo;0;L;;;;;N;;;;;
+A211;YI SYLLABLE KUP;Lo;0;L;;;;;N;;;;;
+A212;YI SYLLABLE KURX;Lo;0;L;;;;;N;;;;;
+A213;YI SYLLABLE KUR;Lo;0;L;;;;;N;;;;;
+A214;YI SYLLABLE GGIT;Lo;0;L;;;;;N;;;;;
+A215;YI SYLLABLE GGIX;Lo;0;L;;;;;N;;;;;
+A216;YI SYLLABLE GGI;Lo;0;L;;;;;N;;;;;
+A217;YI SYLLABLE GGIEX;Lo;0;L;;;;;N;;;;;
+A218;YI SYLLABLE GGIE;Lo;0;L;;;;;N;;;;;
+A219;YI SYLLABLE GGIEP;Lo;0;L;;;;;N;;;;;
+A21A;YI SYLLABLE GGAT;Lo;0;L;;;;;N;;;;;
+A21B;YI SYLLABLE GGAX;Lo;0;L;;;;;N;;;;;
+A21C;YI SYLLABLE GGA;Lo;0;L;;;;;N;;;;;
+A21D;YI SYLLABLE GGAP;Lo;0;L;;;;;N;;;;;
+A21E;YI SYLLABLE GGUOT;Lo;0;L;;;;;N;;;;;
+A21F;YI SYLLABLE GGUOX;Lo;0;L;;;;;N;;;;;
+A220;YI SYLLABLE GGUO;Lo;0;L;;;;;N;;;;;
+A221;YI SYLLABLE GGUOP;Lo;0;L;;;;;N;;;;;
+A222;YI SYLLABLE GGOT;Lo;0;L;;;;;N;;;;;
+A223;YI SYLLABLE GGOX;Lo;0;L;;;;;N;;;;;
+A224;YI SYLLABLE GGO;Lo;0;L;;;;;N;;;;;
+A225;YI SYLLABLE GGOP;Lo;0;L;;;;;N;;;;;
+A226;YI SYLLABLE GGET;Lo;0;L;;;;;N;;;;;
+A227;YI SYLLABLE GGEX;Lo;0;L;;;;;N;;;;;
+A228;YI SYLLABLE GGE;Lo;0;L;;;;;N;;;;;
+A229;YI SYLLABLE GGEP;Lo;0;L;;;;;N;;;;;
+A22A;YI SYLLABLE GGUT;Lo;0;L;;;;;N;;;;;
+A22B;YI SYLLABLE GGUX;Lo;0;L;;;;;N;;;;;
+A22C;YI SYLLABLE GGU;Lo;0;L;;;;;N;;;;;
+A22D;YI SYLLABLE GGUP;Lo;0;L;;;;;N;;;;;
+A22E;YI SYLLABLE GGURX;Lo;0;L;;;;;N;;;;;
+A22F;YI SYLLABLE GGUR;Lo;0;L;;;;;N;;;;;
+A230;YI SYLLABLE MGIEX;Lo;0;L;;;;;N;;;;;
+A231;YI SYLLABLE MGIE;Lo;0;L;;;;;N;;;;;
+A232;YI SYLLABLE MGAT;Lo;0;L;;;;;N;;;;;
+A233;YI SYLLABLE MGAX;Lo;0;L;;;;;N;;;;;
+A234;YI SYLLABLE MGA;Lo;0;L;;;;;N;;;;;
+A235;YI SYLLABLE MGAP;Lo;0;L;;;;;N;;;;;
+A236;YI SYLLABLE MGUOX;Lo;0;L;;;;;N;;;;;
+A237;YI SYLLABLE MGUO;Lo;0;L;;;;;N;;;;;
+A238;YI SYLLABLE MGUOP;Lo;0;L;;;;;N;;;;;
+A239;YI SYLLABLE MGOT;Lo;0;L;;;;;N;;;;;
+A23A;YI SYLLABLE MGOX;Lo;0;L;;;;;N;;;;;
+A23B;YI SYLLABLE MGO;Lo;0;L;;;;;N;;;;;
+A23C;YI SYLLABLE MGOP;Lo;0;L;;;;;N;;;;;
+A23D;YI SYLLABLE MGEX;Lo;0;L;;;;;N;;;;;
+A23E;YI SYLLABLE MGE;Lo;0;L;;;;;N;;;;;
+A23F;YI SYLLABLE MGEP;Lo;0;L;;;;;N;;;;;
+A240;YI SYLLABLE MGUT;Lo;0;L;;;;;N;;;;;
+A241;YI SYLLABLE MGUX;Lo;0;L;;;;;N;;;;;
+A242;YI SYLLABLE MGU;Lo;0;L;;;;;N;;;;;
+A243;YI SYLLABLE MGUP;Lo;0;L;;;;;N;;;;;
+A244;YI SYLLABLE MGURX;Lo;0;L;;;;;N;;;;;
+A245;YI SYLLABLE MGUR;Lo;0;L;;;;;N;;;;;
+A246;YI SYLLABLE HXIT;Lo;0;L;;;;;N;;;;;
+A247;YI SYLLABLE HXIX;Lo;0;L;;;;;N;;;;;
+A248;YI SYLLABLE HXI;Lo;0;L;;;;;N;;;;;
+A249;YI SYLLABLE HXIP;Lo;0;L;;;;;N;;;;;
+A24A;YI SYLLABLE HXIET;Lo;0;L;;;;;N;;;;;
+A24B;YI SYLLABLE HXIEX;Lo;0;L;;;;;N;;;;;
+A24C;YI SYLLABLE HXIE;Lo;0;L;;;;;N;;;;;
+A24D;YI SYLLABLE HXIEP;Lo;0;L;;;;;N;;;;;
+A24E;YI SYLLABLE HXAT;Lo;0;L;;;;;N;;;;;
+A24F;YI SYLLABLE HXAX;Lo;0;L;;;;;N;;;;;
+A250;YI SYLLABLE HXA;Lo;0;L;;;;;N;;;;;
+A251;YI SYLLABLE HXAP;Lo;0;L;;;;;N;;;;;
+A252;YI SYLLABLE HXUOT;Lo;0;L;;;;;N;;;;;
+A253;YI SYLLABLE HXUOX;Lo;0;L;;;;;N;;;;;
+A254;YI SYLLABLE HXUO;Lo;0;L;;;;;N;;;;;
+A255;YI SYLLABLE HXUOP;Lo;0;L;;;;;N;;;;;
+A256;YI SYLLABLE HXOT;Lo;0;L;;;;;N;;;;;
+A257;YI SYLLABLE HXOX;Lo;0;L;;;;;N;;;;;
+A258;YI SYLLABLE HXO;Lo;0;L;;;;;N;;;;;
+A259;YI SYLLABLE HXOP;Lo;0;L;;;;;N;;;;;
+A25A;YI SYLLABLE HXEX;Lo;0;L;;;;;N;;;;;
+A25B;YI SYLLABLE HXE;Lo;0;L;;;;;N;;;;;
+A25C;YI SYLLABLE HXEP;Lo;0;L;;;;;N;;;;;
+A25D;YI SYLLABLE NGIEX;Lo;0;L;;;;;N;;;;;
+A25E;YI SYLLABLE NGIE;Lo;0;L;;;;;N;;;;;
+A25F;YI SYLLABLE NGIEP;Lo;0;L;;;;;N;;;;;
+A260;YI SYLLABLE NGAT;Lo;0;L;;;;;N;;;;;
+A261;YI SYLLABLE NGAX;Lo;0;L;;;;;N;;;;;
+A262;YI SYLLABLE NGA;Lo;0;L;;;;;N;;;;;
+A263;YI SYLLABLE NGAP;Lo;0;L;;;;;N;;;;;
+A264;YI SYLLABLE NGUOT;Lo;0;L;;;;;N;;;;;
+A265;YI SYLLABLE NGUOX;Lo;0;L;;;;;N;;;;;
+A266;YI SYLLABLE NGUO;Lo;0;L;;;;;N;;;;;
+A267;YI SYLLABLE NGOT;Lo;0;L;;;;;N;;;;;
+A268;YI SYLLABLE NGOX;Lo;0;L;;;;;N;;;;;
+A269;YI SYLLABLE NGO;Lo;0;L;;;;;N;;;;;
+A26A;YI SYLLABLE NGOP;Lo;0;L;;;;;N;;;;;
+A26B;YI SYLLABLE NGEX;Lo;0;L;;;;;N;;;;;
+A26C;YI SYLLABLE NGE;Lo;0;L;;;;;N;;;;;
+A26D;YI SYLLABLE NGEP;Lo;0;L;;;;;N;;;;;
+A26E;YI SYLLABLE HIT;Lo;0;L;;;;;N;;;;;
+A26F;YI SYLLABLE HIEX;Lo;0;L;;;;;N;;;;;
+A270;YI SYLLABLE HIE;Lo;0;L;;;;;N;;;;;
+A271;YI SYLLABLE HAT;Lo;0;L;;;;;N;;;;;
+A272;YI SYLLABLE HAX;Lo;0;L;;;;;N;;;;;
+A273;YI SYLLABLE HA;Lo;0;L;;;;;N;;;;;
+A274;YI SYLLABLE HAP;Lo;0;L;;;;;N;;;;;
+A275;YI SYLLABLE HUOT;Lo;0;L;;;;;N;;;;;
+A276;YI SYLLABLE HUOX;Lo;0;L;;;;;N;;;;;
+A277;YI SYLLABLE HUO;Lo;0;L;;;;;N;;;;;
+A278;YI SYLLABLE HUOP;Lo;0;L;;;;;N;;;;;
+A279;YI SYLLABLE HOT;Lo;0;L;;;;;N;;;;;
+A27A;YI SYLLABLE HOX;Lo;0;L;;;;;N;;;;;
+A27B;YI SYLLABLE HO;Lo;0;L;;;;;N;;;;;
+A27C;YI SYLLABLE HOP;Lo;0;L;;;;;N;;;;;
+A27D;YI SYLLABLE HEX;Lo;0;L;;;;;N;;;;;
+A27E;YI SYLLABLE HE;Lo;0;L;;;;;N;;;;;
+A27F;YI SYLLABLE HEP;Lo;0;L;;;;;N;;;;;
+A280;YI SYLLABLE WAT;Lo;0;L;;;;;N;;;;;
+A281;YI SYLLABLE WAX;Lo;0;L;;;;;N;;;;;
+A282;YI SYLLABLE WA;Lo;0;L;;;;;N;;;;;
+A283;YI SYLLABLE WAP;Lo;0;L;;;;;N;;;;;
+A284;YI SYLLABLE WUOX;Lo;0;L;;;;;N;;;;;
+A285;YI SYLLABLE WUO;Lo;0;L;;;;;N;;;;;
+A286;YI SYLLABLE WUOP;Lo;0;L;;;;;N;;;;;
+A287;YI SYLLABLE WOX;Lo;0;L;;;;;N;;;;;
+A288;YI SYLLABLE WO;Lo;0;L;;;;;N;;;;;
+A289;YI SYLLABLE WOP;Lo;0;L;;;;;N;;;;;
+A28A;YI SYLLABLE WEX;Lo;0;L;;;;;N;;;;;
+A28B;YI SYLLABLE WE;Lo;0;L;;;;;N;;;;;
+A28C;YI SYLLABLE WEP;Lo;0;L;;;;;N;;;;;
+A28D;YI SYLLABLE ZIT;Lo;0;L;;;;;N;;;;;
+A28E;YI SYLLABLE ZIX;Lo;0;L;;;;;N;;;;;
+A28F;YI SYLLABLE ZI;Lo;0;L;;;;;N;;;;;
+A290;YI SYLLABLE ZIP;Lo;0;L;;;;;N;;;;;
+A291;YI SYLLABLE ZIEX;Lo;0;L;;;;;N;;;;;
+A292;YI SYLLABLE ZIE;Lo;0;L;;;;;N;;;;;
+A293;YI SYLLABLE ZIEP;Lo;0;L;;;;;N;;;;;
+A294;YI SYLLABLE ZAT;Lo;0;L;;;;;N;;;;;
+A295;YI SYLLABLE ZAX;Lo;0;L;;;;;N;;;;;
+A296;YI SYLLABLE ZA;Lo;0;L;;;;;N;;;;;
+A297;YI SYLLABLE ZAP;Lo;0;L;;;;;N;;;;;
+A298;YI SYLLABLE ZUOX;Lo;0;L;;;;;N;;;;;
+A299;YI SYLLABLE ZUO;Lo;0;L;;;;;N;;;;;
+A29A;YI SYLLABLE ZUOP;Lo;0;L;;;;;N;;;;;
+A29B;YI SYLLABLE ZOT;Lo;0;L;;;;;N;;;;;
+A29C;YI SYLLABLE ZOX;Lo;0;L;;;;;N;;;;;
+A29D;YI SYLLABLE ZO;Lo;0;L;;;;;N;;;;;
+A29E;YI SYLLABLE ZOP;Lo;0;L;;;;;N;;;;;
+A29F;YI SYLLABLE ZEX;Lo;0;L;;;;;N;;;;;
+A2A0;YI SYLLABLE ZE;Lo;0;L;;;;;N;;;;;
+A2A1;YI SYLLABLE ZEP;Lo;0;L;;;;;N;;;;;
+A2A2;YI SYLLABLE ZUT;Lo;0;L;;;;;N;;;;;
+A2A3;YI SYLLABLE ZUX;Lo;0;L;;;;;N;;;;;
+A2A4;YI SYLLABLE ZU;Lo;0;L;;;;;N;;;;;
+A2A5;YI SYLLABLE ZUP;Lo;0;L;;;;;N;;;;;
+A2A6;YI SYLLABLE ZURX;Lo;0;L;;;;;N;;;;;
+A2A7;YI SYLLABLE ZUR;Lo;0;L;;;;;N;;;;;
+A2A8;YI SYLLABLE ZYT;Lo;0;L;;;;;N;;;;;
+A2A9;YI SYLLABLE ZYX;Lo;0;L;;;;;N;;;;;
+A2AA;YI SYLLABLE ZY;Lo;0;L;;;;;N;;;;;
+A2AB;YI SYLLABLE ZYP;Lo;0;L;;;;;N;;;;;
+A2AC;YI SYLLABLE ZYRX;Lo;0;L;;;;;N;;;;;
+A2AD;YI SYLLABLE ZYR;Lo;0;L;;;;;N;;;;;
+A2AE;YI SYLLABLE CIT;Lo;0;L;;;;;N;;;;;
+A2AF;YI SYLLABLE CIX;Lo;0;L;;;;;N;;;;;
+A2B0;YI SYLLABLE CI;Lo;0;L;;;;;N;;;;;
+A2B1;YI SYLLABLE CIP;Lo;0;L;;;;;N;;;;;
+A2B2;YI SYLLABLE CIET;Lo;0;L;;;;;N;;;;;
+A2B3;YI SYLLABLE CIEX;Lo;0;L;;;;;N;;;;;
+A2B4;YI SYLLABLE CIE;Lo;0;L;;;;;N;;;;;
+A2B5;YI SYLLABLE CIEP;Lo;0;L;;;;;N;;;;;
+A2B6;YI SYLLABLE CAT;Lo;0;L;;;;;N;;;;;
+A2B7;YI SYLLABLE CAX;Lo;0;L;;;;;N;;;;;
+A2B8;YI SYLLABLE CA;Lo;0;L;;;;;N;;;;;
+A2B9;YI SYLLABLE CAP;Lo;0;L;;;;;N;;;;;
+A2BA;YI SYLLABLE CUOX;Lo;0;L;;;;;N;;;;;
+A2BB;YI SYLLABLE CUO;Lo;0;L;;;;;N;;;;;
+A2BC;YI SYLLABLE CUOP;Lo;0;L;;;;;N;;;;;
+A2BD;YI SYLLABLE COT;Lo;0;L;;;;;N;;;;;
+A2BE;YI SYLLABLE COX;Lo;0;L;;;;;N;;;;;
+A2BF;YI SYLLABLE CO;Lo;0;L;;;;;N;;;;;
+A2C0;YI SYLLABLE COP;Lo;0;L;;;;;N;;;;;
+A2C1;YI SYLLABLE CEX;Lo;0;L;;;;;N;;;;;
+A2C2;YI SYLLABLE CE;Lo;0;L;;;;;N;;;;;
+A2C3;YI SYLLABLE CEP;Lo;0;L;;;;;N;;;;;
+A2C4;YI SYLLABLE CUT;Lo;0;L;;;;;N;;;;;
+A2C5;YI SYLLABLE CUX;Lo;0;L;;;;;N;;;;;
+A2C6;YI SYLLABLE CU;Lo;0;L;;;;;N;;;;;
+A2C7;YI SYLLABLE CUP;Lo;0;L;;;;;N;;;;;
+A2C8;YI SYLLABLE CURX;Lo;0;L;;;;;N;;;;;
+A2C9;YI SYLLABLE CUR;Lo;0;L;;;;;N;;;;;
+A2CA;YI SYLLABLE CYT;Lo;0;L;;;;;N;;;;;
+A2CB;YI SYLLABLE CYX;Lo;0;L;;;;;N;;;;;
+A2CC;YI SYLLABLE CY;Lo;0;L;;;;;N;;;;;
+A2CD;YI SYLLABLE CYP;Lo;0;L;;;;;N;;;;;
+A2CE;YI SYLLABLE CYRX;Lo;0;L;;;;;N;;;;;
+A2CF;YI SYLLABLE CYR;Lo;0;L;;;;;N;;;;;
+A2D0;YI SYLLABLE ZZIT;Lo;0;L;;;;;N;;;;;
+A2D1;YI SYLLABLE ZZIX;Lo;0;L;;;;;N;;;;;
+A2D2;YI SYLLABLE ZZI;Lo;0;L;;;;;N;;;;;
+A2D3;YI SYLLABLE ZZIP;Lo;0;L;;;;;N;;;;;
+A2D4;YI SYLLABLE ZZIET;Lo;0;L;;;;;N;;;;;
+A2D5;YI SYLLABLE ZZIEX;Lo;0;L;;;;;N;;;;;
+A2D6;YI SYLLABLE ZZIE;Lo;0;L;;;;;N;;;;;
+A2D7;YI SYLLABLE ZZIEP;Lo;0;L;;;;;N;;;;;
+A2D8;YI SYLLABLE ZZAT;Lo;0;L;;;;;N;;;;;
+A2D9;YI SYLLABLE ZZAX;Lo;0;L;;;;;N;;;;;
+A2DA;YI SYLLABLE ZZA;Lo;0;L;;;;;N;;;;;
+A2DB;YI SYLLABLE ZZAP;Lo;0;L;;;;;N;;;;;
+A2DC;YI SYLLABLE ZZOX;Lo;0;L;;;;;N;;;;;
+A2DD;YI SYLLABLE ZZO;Lo;0;L;;;;;N;;;;;
+A2DE;YI SYLLABLE ZZOP;Lo;0;L;;;;;N;;;;;
+A2DF;YI SYLLABLE ZZEX;Lo;0;L;;;;;N;;;;;
+A2E0;YI SYLLABLE ZZE;Lo;0;L;;;;;N;;;;;
+A2E1;YI SYLLABLE ZZEP;Lo;0;L;;;;;N;;;;;
+A2E2;YI SYLLABLE ZZUX;Lo;0;L;;;;;N;;;;;
+A2E3;YI SYLLABLE ZZU;Lo;0;L;;;;;N;;;;;
+A2E4;YI SYLLABLE ZZUP;Lo;0;L;;;;;N;;;;;
+A2E5;YI SYLLABLE ZZURX;Lo;0;L;;;;;N;;;;;
+A2E6;YI SYLLABLE ZZUR;Lo;0;L;;;;;N;;;;;
+A2E7;YI SYLLABLE ZZYT;Lo;0;L;;;;;N;;;;;
+A2E8;YI SYLLABLE ZZYX;Lo;0;L;;;;;N;;;;;
+A2E9;YI SYLLABLE ZZY;Lo;0;L;;;;;N;;;;;
+A2EA;YI SYLLABLE ZZYP;Lo;0;L;;;;;N;;;;;
+A2EB;YI SYLLABLE ZZYRX;Lo;0;L;;;;;N;;;;;
+A2EC;YI SYLLABLE ZZYR;Lo;0;L;;;;;N;;;;;
+A2ED;YI SYLLABLE NZIT;Lo;0;L;;;;;N;;;;;
+A2EE;YI SYLLABLE NZIX;Lo;0;L;;;;;N;;;;;
+A2EF;YI SYLLABLE NZI;Lo;0;L;;;;;N;;;;;
+A2F0;YI SYLLABLE NZIP;Lo;0;L;;;;;N;;;;;
+A2F1;YI SYLLABLE NZIEX;Lo;0;L;;;;;N;;;;;
+A2F2;YI SYLLABLE NZIE;Lo;0;L;;;;;N;;;;;
+A2F3;YI SYLLABLE NZIEP;Lo;0;L;;;;;N;;;;;
+A2F4;YI SYLLABLE NZAT;Lo;0;L;;;;;N;;;;;
+A2F5;YI SYLLABLE NZAX;Lo;0;L;;;;;N;;;;;
+A2F6;YI SYLLABLE NZA;Lo;0;L;;;;;N;;;;;
+A2F7;YI SYLLABLE NZAP;Lo;0;L;;;;;N;;;;;
+A2F8;YI SYLLABLE NZUOX;Lo;0;L;;;;;N;;;;;
+A2F9;YI SYLLABLE NZUO;Lo;0;L;;;;;N;;;;;
+A2FA;YI SYLLABLE NZOX;Lo;0;L;;;;;N;;;;;
+A2FB;YI SYLLABLE NZOP;Lo;0;L;;;;;N;;;;;
+A2FC;YI SYLLABLE NZEX;Lo;0;L;;;;;N;;;;;
+A2FD;YI SYLLABLE NZE;Lo;0;L;;;;;N;;;;;
+A2FE;YI SYLLABLE NZUX;Lo;0;L;;;;;N;;;;;
+A2FF;YI SYLLABLE NZU;Lo;0;L;;;;;N;;;;;
+A300;YI SYLLABLE NZUP;Lo;0;L;;;;;N;;;;;
+A301;YI SYLLABLE NZURX;Lo;0;L;;;;;N;;;;;
+A302;YI SYLLABLE NZUR;Lo;0;L;;;;;N;;;;;
+A303;YI SYLLABLE NZYT;Lo;0;L;;;;;N;;;;;
+A304;YI SYLLABLE NZYX;Lo;0;L;;;;;N;;;;;
+A305;YI SYLLABLE NZY;Lo;0;L;;;;;N;;;;;
+A306;YI SYLLABLE NZYP;Lo;0;L;;;;;N;;;;;
+A307;YI SYLLABLE NZYRX;Lo;0;L;;;;;N;;;;;
+A308;YI SYLLABLE NZYR;Lo;0;L;;;;;N;;;;;
+A309;YI SYLLABLE SIT;Lo;0;L;;;;;N;;;;;
+A30A;YI SYLLABLE SIX;Lo;0;L;;;;;N;;;;;
+A30B;YI SYLLABLE SI;Lo;0;L;;;;;N;;;;;
+A30C;YI SYLLABLE SIP;Lo;0;L;;;;;N;;;;;
+A30D;YI SYLLABLE SIEX;Lo;0;L;;;;;N;;;;;
+A30E;YI SYLLABLE SIE;Lo;0;L;;;;;N;;;;;
+A30F;YI SYLLABLE SIEP;Lo;0;L;;;;;N;;;;;
+A310;YI SYLLABLE SAT;Lo;0;L;;;;;N;;;;;
+A311;YI SYLLABLE SAX;Lo;0;L;;;;;N;;;;;
+A312;YI SYLLABLE SA;Lo;0;L;;;;;N;;;;;
+A313;YI SYLLABLE SAP;Lo;0;L;;;;;N;;;;;
+A314;YI SYLLABLE SUOX;Lo;0;L;;;;;N;;;;;
+A315;YI SYLLABLE SUO;Lo;0;L;;;;;N;;;;;
+A316;YI SYLLABLE SUOP;Lo;0;L;;;;;N;;;;;
+A317;YI SYLLABLE SOT;Lo;0;L;;;;;N;;;;;
+A318;YI SYLLABLE SOX;Lo;0;L;;;;;N;;;;;
+A319;YI SYLLABLE SO;Lo;0;L;;;;;N;;;;;
+A31A;YI SYLLABLE SOP;Lo;0;L;;;;;N;;;;;
+A31B;YI SYLLABLE SEX;Lo;0;L;;;;;N;;;;;
+A31C;YI SYLLABLE SE;Lo;0;L;;;;;N;;;;;
+A31D;YI SYLLABLE SEP;Lo;0;L;;;;;N;;;;;
+A31E;YI SYLLABLE SUT;Lo;0;L;;;;;N;;;;;
+A31F;YI SYLLABLE SUX;Lo;0;L;;;;;N;;;;;
+A320;YI SYLLABLE SU;Lo;0;L;;;;;N;;;;;
+A321;YI SYLLABLE SUP;Lo;0;L;;;;;N;;;;;
+A322;YI SYLLABLE SURX;Lo;0;L;;;;;N;;;;;
+A323;YI SYLLABLE SUR;Lo;0;L;;;;;N;;;;;
+A324;YI SYLLABLE SYT;Lo;0;L;;;;;N;;;;;
+A325;YI SYLLABLE SYX;Lo;0;L;;;;;N;;;;;
+A326;YI SYLLABLE SY;Lo;0;L;;;;;N;;;;;
+A327;YI SYLLABLE SYP;Lo;0;L;;;;;N;;;;;
+A328;YI SYLLABLE SYRX;Lo;0;L;;;;;N;;;;;
+A329;YI SYLLABLE SYR;Lo;0;L;;;;;N;;;;;
+A32A;YI SYLLABLE SSIT;Lo;0;L;;;;;N;;;;;
+A32B;YI SYLLABLE SSIX;Lo;0;L;;;;;N;;;;;
+A32C;YI SYLLABLE SSI;Lo;0;L;;;;;N;;;;;
+A32D;YI SYLLABLE SSIP;Lo;0;L;;;;;N;;;;;
+A32E;YI SYLLABLE SSIEX;Lo;0;L;;;;;N;;;;;
+A32F;YI SYLLABLE SSIE;Lo;0;L;;;;;N;;;;;
+A330;YI SYLLABLE SSIEP;Lo;0;L;;;;;N;;;;;
+A331;YI SYLLABLE SSAT;Lo;0;L;;;;;N;;;;;
+A332;YI SYLLABLE SSAX;Lo;0;L;;;;;N;;;;;
+A333;YI SYLLABLE SSA;Lo;0;L;;;;;N;;;;;
+A334;YI SYLLABLE SSAP;Lo;0;L;;;;;N;;;;;
+A335;YI SYLLABLE SSOT;Lo;0;L;;;;;N;;;;;
+A336;YI SYLLABLE SSOX;Lo;0;L;;;;;N;;;;;
+A337;YI SYLLABLE SSO;Lo;0;L;;;;;N;;;;;
+A338;YI SYLLABLE SSOP;Lo;0;L;;;;;N;;;;;
+A339;YI SYLLABLE SSEX;Lo;0;L;;;;;N;;;;;
+A33A;YI SYLLABLE SSE;Lo;0;L;;;;;N;;;;;
+A33B;YI SYLLABLE SSEP;Lo;0;L;;;;;N;;;;;
+A33C;YI SYLLABLE SSUT;Lo;0;L;;;;;N;;;;;
+A33D;YI SYLLABLE SSUX;Lo;0;L;;;;;N;;;;;
+A33E;YI SYLLABLE SSU;Lo;0;L;;;;;N;;;;;
+A33F;YI SYLLABLE SSUP;Lo;0;L;;;;;N;;;;;
+A340;YI SYLLABLE SSYT;Lo;0;L;;;;;N;;;;;
+A341;YI SYLLABLE SSYX;Lo;0;L;;;;;N;;;;;
+A342;YI SYLLABLE SSY;Lo;0;L;;;;;N;;;;;
+A343;YI SYLLABLE SSYP;Lo;0;L;;;;;N;;;;;
+A344;YI SYLLABLE SSYRX;Lo;0;L;;;;;N;;;;;
+A345;YI SYLLABLE SSYR;Lo;0;L;;;;;N;;;;;
+A346;YI SYLLABLE ZHAT;Lo;0;L;;;;;N;;;;;
+A347;YI SYLLABLE ZHAX;Lo;0;L;;;;;N;;;;;
+A348;YI SYLLABLE ZHA;Lo;0;L;;;;;N;;;;;
+A349;YI SYLLABLE ZHAP;Lo;0;L;;;;;N;;;;;
+A34A;YI SYLLABLE ZHUOX;Lo;0;L;;;;;N;;;;;
+A34B;YI SYLLABLE ZHUO;Lo;0;L;;;;;N;;;;;
+A34C;YI SYLLABLE ZHUOP;Lo;0;L;;;;;N;;;;;
+A34D;YI SYLLABLE ZHOT;Lo;0;L;;;;;N;;;;;
+A34E;YI SYLLABLE ZHOX;Lo;0;L;;;;;N;;;;;
+A34F;YI SYLLABLE ZHO;Lo;0;L;;;;;N;;;;;
+A350;YI SYLLABLE ZHOP;Lo;0;L;;;;;N;;;;;
+A351;YI SYLLABLE ZHET;Lo;0;L;;;;;N;;;;;
+A352;YI SYLLABLE ZHEX;Lo;0;L;;;;;N;;;;;
+A353;YI SYLLABLE ZHE;Lo;0;L;;;;;N;;;;;
+A354;YI SYLLABLE ZHEP;Lo;0;L;;;;;N;;;;;
+A355;YI SYLLABLE ZHUT;Lo;0;L;;;;;N;;;;;
+A356;YI SYLLABLE ZHUX;Lo;0;L;;;;;N;;;;;
+A357;YI SYLLABLE ZHU;Lo;0;L;;;;;N;;;;;
+A358;YI SYLLABLE ZHUP;Lo;0;L;;;;;N;;;;;
+A359;YI SYLLABLE ZHURX;Lo;0;L;;;;;N;;;;;
+A35A;YI SYLLABLE ZHUR;Lo;0;L;;;;;N;;;;;
+A35B;YI SYLLABLE ZHYT;Lo;0;L;;;;;N;;;;;
+A35C;YI SYLLABLE ZHYX;Lo;0;L;;;;;N;;;;;
+A35D;YI SYLLABLE ZHY;Lo;0;L;;;;;N;;;;;
+A35E;YI SYLLABLE ZHYP;Lo;0;L;;;;;N;;;;;
+A35F;YI SYLLABLE ZHYRX;Lo;0;L;;;;;N;;;;;
+A360;YI SYLLABLE ZHYR;Lo;0;L;;;;;N;;;;;
+A361;YI SYLLABLE CHAT;Lo;0;L;;;;;N;;;;;
+A362;YI SYLLABLE CHAX;Lo;0;L;;;;;N;;;;;
+A363;YI SYLLABLE CHA;Lo;0;L;;;;;N;;;;;
+A364;YI SYLLABLE CHAP;Lo;0;L;;;;;N;;;;;
+A365;YI SYLLABLE CHUOT;Lo;0;L;;;;;N;;;;;
+A366;YI SYLLABLE CHUOX;Lo;0;L;;;;;N;;;;;
+A367;YI SYLLABLE CHUO;Lo;0;L;;;;;N;;;;;
+A368;YI SYLLABLE CHUOP;Lo;0;L;;;;;N;;;;;
+A369;YI SYLLABLE CHOT;Lo;0;L;;;;;N;;;;;
+A36A;YI SYLLABLE CHOX;Lo;0;L;;;;;N;;;;;
+A36B;YI SYLLABLE CHO;Lo;0;L;;;;;N;;;;;
+A36C;YI SYLLABLE CHOP;Lo;0;L;;;;;N;;;;;
+A36D;YI SYLLABLE CHET;Lo;0;L;;;;;N;;;;;
+A36E;YI SYLLABLE CHEX;Lo;0;L;;;;;N;;;;;
+A36F;YI SYLLABLE CHE;Lo;0;L;;;;;N;;;;;
+A370;YI SYLLABLE CHEP;Lo;0;L;;;;;N;;;;;
+A371;YI SYLLABLE CHUX;Lo;0;L;;;;;N;;;;;
+A372;YI SYLLABLE CHU;Lo;0;L;;;;;N;;;;;
+A373;YI SYLLABLE CHUP;Lo;0;L;;;;;N;;;;;
+A374;YI SYLLABLE CHURX;Lo;0;L;;;;;N;;;;;
+A375;YI SYLLABLE CHUR;Lo;0;L;;;;;N;;;;;
+A376;YI SYLLABLE CHYT;Lo;0;L;;;;;N;;;;;
+A377;YI SYLLABLE CHYX;Lo;0;L;;;;;N;;;;;
+A378;YI SYLLABLE CHY;Lo;0;L;;;;;N;;;;;
+A379;YI SYLLABLE CHYP;Lo;0;L;;;;;N;;;;;
+A37A;YI SYLLABLE CHYRX;Lo;0;L;;;;;N;;;;;
+A37B;YI SYLLABLE CHYR;Lo;0;L;;;;;N;;;;;
+A37C;YI SYLLABLE RRAX;Lo;0;L;;;;;N;;;;;
+A37D;YI SYLLABLE RRA;Lo;0;L;;;;;N;;;;;
+A37E;YI SYLLABLE RRUOX;Lo;0;L;;;;;N;;;;;
+A37F;YI SYLLABLE RRUO;Lo;0;L;;;;;N;;;;;
+A380;YI SYLLABLE RROT;Lo;0;L;;;;;N;;;;;
+A381;YI SYLLABLE RROX;Lo;0;L;;;;;N;;;;;
+A382;YI SYLLABLE RRO;Lo;0;L;;;;;N;;;;;
+A383;YI SYLLABLE RROP;Lo;0;L;;;;;N;;;;;
+A384;YI SYLLABLE RRET;Lo;0;L;;;;;N;;;;;
+A385;YI SYLLABLE RREX;Lo;0;L;;;;;N;;;;;
+A386;YI SYLLABLE RRE;Lo;0;L;;;;;N;;;;;
+A387;YI SYLLABLE RREP;Lo;0;L;;;;;N;;;;;
+A388;YI SYLLABLE RRUT;Lo;0;L;;;;;N;;;;;
+A389;YI SYLLABLE RRUX;Lo;0;L;;;;;N;;;;;
+A38A;YI SYLLABLE RRU;Lo;0;L;;;;;N;;;;;
+A38B;YI SYLLABLE RRUP;Lo;0;L;;;;;N;;;;;
+A38C;YI SYLLABLE RRURX;Lo;0;L;;;;;N;;;;;
+A38D;YI SYLLABLE RRUR;Lo;0;L;;;;;N;;;;;
+A38E;YI SYLLABLE RRYT;Lo;0;L;;;;;N;;;;;
+A38F;YI SYLLABLE RRYX;Lo;0;L;;;;;N;;;;;
+A390;YI SYLLABLE RRY;Lo;0;L;;;;;N;;;;;
+A391;YI SYLLABLE RRYP;Lo;0;L;;;;;N;;;;;
+A392;YI SYLLABLE RRYRX;Lo;0;L;;;;;N;;;;;
+A393;YI SYLLABLE RRYR;Lo;0;L;;;;;N;;;;;
+A394;YI SYLLABLE NRAT;Lo;0;L;;;;;N;;;;;
+A395;YI SYLLABLE NRAX;Lo;0;L;;;;;N;;;;;
+A396;YI SYLLABLE NRA;Lo;0;L;;;;;N;;;;;
+A397;YI SYLLABLE NRAP;Lo;0;L;;;;;N;;;;;
+A398;YI SYLLABLE NROX;Lo;0;L;;;;;N;;;;;
+A399;YI SYLLABLE NRO;Lo;0;L;;;;;N;;;;;
+A39A;YI SYLLABLE NROP;Lo;0;L;;;;;N;;;;;
+A39B;YI SYLLABLE NRET;Lo;0;L;;;;;N;;;;;
+A39C;YI SYLLABLE NREX;Lo;0;L;;;;;N;;;;;
+A39D;YI SYLLABLE NRE;Lo;0;L;;;;;N;;;;;
+A39E;YI SYLLABLE NREP;Lo;0;L;;;;;N;;;;;
+A39F;YI SYLLABLE NRUT;Lo;0;L;;;;;N;;;;;
+A3A0;YI SYLLABLE NRUX;Lo;0;L;;;;;N;;;;;
+A3A1;YI SYLLABLE NRU;Lo;0;L;;;;;N;;;;;
+A3A2;YI SYLLABLE NRUP;Lo;0;L;;;;;N;;;;;
+A3A3;YI SYLLABLE NRURX;Lo;0;L;;;;;N;;;;;
+A3A4;YI SYLLABLE NRUR;Lo;0;L;;;;;N;;;;;
+A3A5;YI SYLLABLE NRYT;Lo;0;L;;;;;N;;;;;
+A3A6;YI SYLLABLE NRYX;Lo;0;L;;;;;N;;;;;
+A3A7;YI SYLLABLE NRY;Lo;0;L;;;;;N;;;;;
+A3A8;YI SYLLABLE NRYP;Lo;0;L;;;;;N;;;;;
+A3A9;YI SYLLABLE NRYRX;Lo;0;L;;;;;N;;;;;
+A3AA;YI SYLLABLE NRYR;Lo;0;L;;;;;N;;;;;
+A3AB;YI SYLLABLE SHAT;Lo;0;L;;;;;N;;;;;
+A3AC;YI SYLLABLE SHAX;Lo;0;L;;;;;N;;;;;
+A3AD;YI SYLLABLE SHA;Lo;0;L;;;;;N;;;;;
+A3AE;YI SYLLABLE SHAP;Lo;0;L;;;;;N;;;;;
+A3AF;YI SYLLABLE SHUOX;Lo;0;L;;;;;N;;;;;
+A3B0;YI SYLLABLE SHUO;Lo;0;L;;;;;N;;;;;
+A3B1;YI SYLLABLE SHUOP;Lo;0;L;;;;;N;;;;;
+A3B2;YI SYLLABLE SHOT;Lo;0;L;;;;;N;;;;;
+A3B3;YI SYLLABLE SHOX;Lo;0;L;;;;;N;;;;;
+A3B4;YI SYLLABLE SHO;Lo;0;L;;;;;N;;;;;
+A3B5;YI SYLLABLE SHOP;Lo;0;L;;;;;N;;;;;
+A3B6;YI SYLLABLE SHET;Lo;0;L;;;;;N;;;;;
+A3B7;YI SYLLABLE SHEX;Lo;0;L;;;;;N;;;;;
+A3B8;YI SYLLABLE SHE;Lo;0;L;;;;;N;;;;;
+A3B9;YI SYLLABLE SHEP;Lo;0;L;;;;;N;;;;;
+A3BA;YI SYLLABLE SHUT;Lo;0;L;;;;;N;;;;;
+A3BB;YI SYLLABLE SHUX;Lo;0;L;;;;;N;;;;;
+A3BC;YI SYLLABLE SHU;Lo;0;L;;;;;N;;;;;
+A3BD;YI SYLLABLE SHUP;Lo;0;L;;;;;N;;;;;
+A3BE;YI SYLLABLE SHURX;Lo;0;L;;;;;N;;;;;
+A3BF;YI SYLLABLE SHUR;Lo;0;L;;;;;N;;;;;
+A3C0;YI SYLLABLE SHYT;Lo;0;L;;;;;N;;;;;
+A3C1;YI SYLLABLE SHYX;Lo;0;L;;;;;N;;;;;
+A3C2;YI SYLLABLE SHY;Lo;0;L;;;;;N;;;;;
+A3C3;YI SYLLABLE SHYP;Lo;0;L;;;;;N;;;;;
+A3C4;YI SYLLABLE SHYRX;Lo;0;L;;;;;N;;;;;
+A3C5;YI SYLLABLE SHYR;Lo;0;L;;;;;N;;;;;
+A3C6;YI SYLLABLE RAT;Lo;0;L;;;;;N;;;;;
+A3C7;YI SYLLABLE RAX;Lo;0;L;;;;;N;;;;;
+A3C8;YI SYLLABLE RA;Lo;0;L;;;;;N;;;;;
+A3C9;YI SYLLABLE RAP;Lo;0;L;;;;;N;;;;;
+A3CA;YI SYLLABLE RUOX;Lo;0;L;;;;;N;;;;;
+A3CB;YI SYLLABLE RUO;Lo;0;L;;;;;N;;;;;
+A3CC;YI SYLLABLE RUOP;Lo;0;L;;;;;N;;;;;
+A3CD;YI SYLLABLE ROT;Lo;0;L;;;;;N;;;;;
+A3CE;YI SYLLABLE ROX;Lo;0;L;;;;;N;;;;;
+A3CF;YI SYLLABLE RO;Lo;0;L;;;;;N;;;;;
+A3D0;YI SYLLABLE ROP;Lo;0;L;;;;;N;;;;;
+A3D1;YI SYLLABLE REX;Lo;0;L;;;;;N;;;;;
+A3D2;YI SYLLABLE RE;Lo;0;L;;;;;N;;;;;
+A3D3;YI SYLLABLE REP;Lo;0;L;;;;;N;;;;;
+A3D4;YI SYLLABLE RUT;Lo;0;L;;;;;N;;;;;
+A3D5;YI SYLLABLE RUX;Lo;0;L;;;;;N;;;;;
+A3D6;YI SYLLABLE RU;Lo;0;L;;;;;N;;;;;
+A3D7;YI SYLLABLE RUP;Lo;0;L;;;;;N;;;;;
+A3D8;YI SYLLABLE RURX;Lo;0;L;;;;;N;;;;;
+A3D9;YI SYLLABLE RUR;Lo;0;L;;;;;N;;;;;
+A3DA;YI SYLLABLE RYT;Lo;0;L;;;;;N;;;;;
+A3DB;YI SYLLABLE RYX;Lo;0;L;;;;;N;;;;;
+A3DC;YI SYLLABLE RY;Lo;0;L;;;;;N;;;;;
+A3DD;YI SYLLABLE RYP;Lo;0;L;;;;;N;;;;;
+A3DE;YI SYLLABLE RYRX;Lo;0;L;;;;;N;;;;;
+A3DF;YI SYLLABLE RYR;Lo;0;L;;;;;N;;;;;
+A3E0;YI SYLLABLE JIT;Lo;0;L;;;;;N;;;;;
+A3E1;YI SYLLABLE JIX;Lo;0;L;;;;;N;;;;;
+A3E2;YI SYLLABLE JI;Lo;0;L;;;;;N;;;;;
+A3E3;YI SYLLABLE JIP;Lo;0;L;;;;;N;;;;;
+A3E4;YI SYLLABLE JIET;Lo;0;L;;;;;N;;;;;
+A3E5;YI SYLLABLE JIEX;Lo;0;L;;;;;N;;;;;
+A3E6;YI SYLLABLE JIE;Lo;0;L;;;;;N;;;;;
+A3E7;YI SYLLABLE JIEP;Lo;0;L;;;;;N;;;;;
+A3E8;YI SYLLABLE JUOT;Lo;0;L;;;;;N;;;;;
+A3E9;YI SYLLABLE JUOX;Lo;0;L;;;;;N;;;;;
+A3EA;YI SYLLABLE JUO;Lo;0;L;;;;;N;;;;;
+A3EB;YI SYLLABLE JUOP;Lo;0;L;;;;;N;;;;;
+A3EC;YI SYLLABLE JOT;Lo;0;L;;;;;N;;;;;
+A3ED;YI SYLLABLE JOX;Lo;0;L;;;;;N;;;;;
+A3EE;YI SYLLABLE JO;Lo;0;L;;;;;N;;;;;
+A3EF;YI SYLLABLE JOP;Lo;0;L;;;;;N;;;;;
+A3F0;YI SYLLABLE JUT;Lo;0;L;;;;;N;;;;;
+A3F1;YI SYLLABLE JUX;Lo;0;L;;;;;N;;;;;
+A3F2;YI SYLLABLE JU;Lo;0;L;;;;;N;;;;;
+A3F3;YI SYLLABLE JUP;Lo;0;L;;;;;N;;;;;
+A3F4;YI SYLLABLE JURX;Lo;0;L;;;;;N;;;;;
+A3F5;YI SYLLABLE JUR;Lo;0;L;;;;;N;;;;;
+A3F6;YI SYLLABLE JYT;Lo;0;L;;;;;N;;;;;
+A3F7;YI SYLLABLE JYX;Lo;0;L;;;;;N;;;;;
+A3F8;YI SYLLABLE JY;Lo;0;L;;;;;N;;;;;
+A3F9;YI SYLLABLE JYP;Lo;0;L;;;;;N;;;;;
+A3FA;YI SYLLABLE JYRX;Lo;0;L;;;;;N;;;;;
+A3FB;YI SYLLABLE JYR;Lo;0;L;;;;;N;;;;;
+A3FC;YI SYLLABLE QIT;Lo;0;L;;;;;N;;;;;
+A3FD;YI SYLLABLE QIX;Lo;0;L;;;;;N;;;;;
+A3FE;YI SYLLABLE QI;Lo;0;L;;;;;N;;;;;
+A3FF;YI SYLLABLE QIP;Lo;0;L;;;;;N;;;;;
+A400;YI SYLLABLE QIET;Lo;0;L;;;;;N;;;;;
+A401;YI SYLLABLE QIEX;Lo;0;L;;;;;N;;;;;
+A402;YI SYLLABLE QIE;Lo;0;L;;;;;N;;;;;
+A403;YI SYLLABLE QIEP;Lo;0;L;;;;;N;;;;;
+A404;YI SYLLABLE QUOT;Lo;0;L;;;;;N;;;;;
+A405;YI SYLLABLE QUOX;Lo;0;L;;;;;N;;;;;
+A406;YI SYLLABLE QUO;Lo;0;L;;;;;N;;;;;
+A407;YI SYLLABLE QUOP;Lo;0;L;;;;;N;;;;;
+A408;YI SYLLABLE QOT;Lo;0;L;;;;;N;;;;;
+A409;YI SYLLABLE QOX;Lo;0;L;;;;;N;;;;;
+A40A;YI SYLLABLE QO;Lo;0;L;;;;;N;;;;;
+A40B;YI SYLLABLE QOP;Lo;0;L;;;;;N;;;;;
+A40C;YI SYLLABLE QUT;Lo;0;L;;;;;N;;;;;
+A40D;YI SYLLABLE QUX;Lo;0;L;;;;;N;;;;;
+A40E;YI SYLLABLE QU;Lo;0;L;;;;;N;;;;;
+A40F;YI SYLLABLE QUP;Lo;0;L;;;;;N;;;;;
+A410;YI SYLLABLE QURX;Lo;0;L;;;;;N;;;;;
+A411;YI SYLLABLE QUR;Lo;0;L;;;;;N;;;;;
+A412;YI SYLLABLE QYT;Lo;0;L;;;;;N;;;;;
+A413;YI SYLLABLE QYX;Lo;0;L;;;;;N;;;;;
+A414;YI SYLLABLE QY;Lo;0;L;;;;;N;;;;;
+A415;YI SYLLABLE QYP;Lo;0;L;;;;;N;;;;;
+A416;YI SYLLABLE QYRX;Lo;0;L;;;;;N;;;;;
+A417;YI SYLLABLE QYR;Lo;0;L;;;;;N;;;;;
+A418;YI SYLLABLE JJIT;Lo;0;L;;;;;N;;;;;
+A419;YI SYLLABLE JJIX;Lo;0;L;;;;;N;;;;;
+A41A;YI SYLLABLE JJI;Lo;0;L;;;;;N;;;;;
+A41B;YI SYLLABLE JJIP;Lo;0;L;;;;;N;;;;;
+A41C;YI SYLLABLE JJIET;Lo;0;L;;;;;N;;;;;
+A41D;YI SYLLABLE JJIEX;Lo;0;L;;;;;N;;;;;
+A41E;YI SYLLABLE JJIE;Lo;0;L;;;;;N;;;;;
+A41F;YI SYLLABLE JJIEP;Lo;0;L;;;;;N;;;;;
+A420;YI SYLLABLE JJUOX;Lo;0;L;;;;;N;;;;;
+A421;YI SYLLABLE JJUO;Lo;0;L;;;;;N;;;;;
+A422;YI SYLLABLE JJUOP;Lo;0;L;;;;;N;;;;;
+A423;YI SYLLABLE JJOT;Lo;0;L;;;;;N;;;;;
+A424;YI SYLLABLE JJOX;Lo;0;L;;;;;N;;;;;
+A425;YI SYLLABLE JJO;Lo;0;L;;;;;N;;;;;
+A426;YI SYLLABLE JJOP;Lo;0;L;;;;;N;;;;;
+A427;YI SYLLABLE JJUT;Lo;0;L;;;;;N;;;;;
+A428;YI SYLLABLE JJUX;Lo;0;L;;;;;N;;;;;
+A429;YI SYLLABLE JJU;Lo;0;L;;;;;N;;;;;
+A42A;YI SYLLABLE JJUP;Lo;0;L;;;;;N;;;;;
+A42B;YI SYLLABLE JJURX;Lo;0;L;;;;;N;;;;;
+A42C;YI SYLLABLE JJUR;Lo;0;L;;;;;N;;;;;
+A42D;YI SYLLABLE JJYT;Lo;0;L;;;;;N;;;;;
+A42E;YI SYLLABLE JJYX;Lo;0;L;;;;;N;;;;;
+A42F;YI SYLLABLE JJY;Lo;0;L;;;;;N;;;;;
+A430;YI SYLLABLE JJYP;Lo;0;L;;;;;N;;;;;
+A431;YI SYLLABLE NJIT;Lo;0;L;;;;;N;;;;;
+A432;YI SYLLABLE NJIX;Lo;0;L;;;;;N;;;;;
+A433;YI SYLLABLE NJI;Lo;0;L;;;;;N;;;;;
+A434;YI SYLLABLE NJIP;Lo;0;L;;;;;N;;;;;
+A435;YI SYLLABLE NJIET;Lo;0;L;;;;;N;;;;;
+A436;YI SYLLABLE NJIEX;Lo;0;L;;;;;N;;;;;
+A437;YI SYLLABLE NJIE;Lo;0;L;;;;;N;;;;;
+A438;YI SYLLABLE NJIEP;Lo;0;L;;;;;N;;;;;
+A439;YI SYLLABLE NJUOX;Lo;0;L;;;;;N;;;;;
+A43A;YI SYLLABLE NJUO;Lo;0;L;;;;;N;;;;;
+A43B;YI SYLLABLE NJOT;Lo;0;L;;;;;N;;;;;
+A43C;YI SYLLABLE NJOX;Lo;0;L;;;;;N;;;;;
+A43D;YI SYLLABLE NJO;Lo;0;L;;;;;N;;;;;
+A43E;YI SYLLABLE NJOP;Lo;0;L;;;;;N;;;;;
+A43F;YI SYLLABLE NJUX;Lo;0;L;;;;;N;;;;;
+A440;YI SYLLABLE NJU;Lo;0;L;;;;;N;;;;;
+A441;YI SYLLABLE NJUP;Lo;0;L;;;;;N;;;;;
+A442;YI SYLLABLE NJURX;Lo;0;L;;;;;N;;;;;
+A443;YI SYLLABLE NJUR;Lo;0;L;;;;;N;;;;;
+A444;YI SYLLABLE NJYT;Lo;0;L;;;;;N;;;;;
+A445;YI SYLLABLE NJYX;Lo;0;L;;;;;N;;;;;
+A446;YI SYLLABLE NJY;Lo;0;L;;;;;N;;;;;
+A447;YI SYLLABLE NJYP;Lo;0;L;;;;;N;;;;;
+A448;YI SYLLABLE NJYRX;Lo;0;L;;;;;N;;;;;
+A449;YI SYLLABLE NJYR;Lo;0;L;;;;;N;;;;;
+A44A;YI SYLLABLE NYIT;Lo;0;L;;;;;N;;;;;
+A44B;YI SYLLABLE NYIX;Lo;0;L;;;;;N;;;;;
+A44C;YI SYLLABLE NYI;Lo;0;L;;;;;N;;;;;
+A44D;YI SYLLABLE NYIP;Lo;0;L;;;;;N;;;;;
+A44E;YI SYLLABLE NYIET;Lo;0;L;;;;;N;;;;;
+A44F;YI SYLLABLE NYIEX;Lo;0;L;;;;;N;;;;;
+A450;YI SYLLABLE NYIE;Lo;0;L;;;;;N;;;;;
+A451;YI SYLLABLE NYIEP;Lo;0;L;;;;;N;;;;;
+A452;YI SYLLABLE NYUOX;Lo;0;L;;;;;N;;;;;
+A453;YI SYLLABLE NYUO;Lo;0;L;;;;;N;;;;;
+A454;YI SYLLABLE NYUOP;Lo;0;L;;;;;N;;;;;
+A455;YI SYLLABLE NYOT;Lo;0;L;;;;;N;;;;;
+A456;YI SYLLABLE NYOX;Lo;0;L;;;;;N;;;;;
+A457;YI SYLLABLE NYO;Lo;0;L;;;;;N;;;;;
+A458;YI SYLLABLE NYOP;Lo;0;L;;;;;N;;;;;
+A459;YI SYLLABLE NYUT;Lo;0;L;;;;;N;;;;;
+A45A;YI SYLLABLE NYUX;Lo;0;L;;;;;N;;;;;
+A45B;YI SYLLABLE NYU;Lo;0;L;;;;;N;;;;;
+A45C;YI SYLLABLE NYUP;Lo;0;L;;;;;N;;;;;
+A45D;YI SYLLABLE XIT;Lo;0;L;;;;;N;;;;;
+A45E;YI SYLLABLE XIX;Lo;0;L;;;;;N;;;;;
+A45F;YI SYLLABLE XI;Lo;0;L;;;;;N;;;;;
+A460;YI SYLLABLE XIP;Lo;0;L;;;;;N;;;;;
+A461;YI SYLLABLE XIET;Lo;0;L;;;;;N;;;;;
+A462;YI SYLLABLE XIEX;Lo;0;L;;;;;N;;;;;
+A463;YI SYLLABLE XIE;Lo;0;L;;;;;N;;;;;
+A464;YI SYLLABLE XIEP;Lo;0;L;;;;;N;;;;;
+A465;YI SYLLABLE XUOX;Lo;0;L;;;;;N;;;;;
+A466;YI SYLLABLE XUO;Lo;0;L;;;;;N;;;;;
+A467;YI SYLLABLE XOT;Lo;0;L;;;;;N;;;;;
+A468;YI SYLLABLE XOX;Lo;0;L;;;;;N;;;;;
+A469;YI SYLLABLE XO;Lo;0;L;;;;;N;;;;;
+A46A;YI SYLLABLE XOP;Lo;0;L;;;;;N;;;;;
+A46B;YI SYLLABLE XYT;Lo;0;L;;;;;N;;;;;
+A46C;YI SYLLABLE XYX;Lo;0;L;;;;;N;;;;;
+A46D;YI SYLLABLE XY;Lo;0;L;;;;;N;;;;;
+A46E;YI SYLLABLE XYP;Lo;0;L;;;;;N;;;;;
+A46F;YI SYLLABLE XYRX;Lo;0;L;;;;;N;;;;;
+A470;YI SYLLABLE XYR;Lo;0;L;;;;;N;;;;;
+A471;YI SYLLABLE YIT;Lo;0;L;;;;;N;;;;;
+A472;YI SYLLABLE YIX;Lo;0;L;;;;;N;;;;;
+A473;YI SYLLABLE YI;Lo;0;L;;;;;N;;;;;
+A474;YI SYLLABLE YIP;Lo;0;L;;;;;N;;;;;
+A475;YI SYLLABLE YIET;Lo;0;L;;;;;N;;;;;
+A476;YI SYLLABLE YIEX;Lo;0;L;;;;;N;;;;;
+A477;YI SYLLABLE YIE;Lo;0;L;;;;;N;;;;;
+A478;YI SYLLABLE YIEP;Lo;0;L;;;;;N;;;;;
+A479;YI SYLLABLE YUOT;Lo;0;L;;;;;N;;;;;
+A47A;YI SYLLABLE YUOX;Lo;0;L;;;;;N;;;;;
+A47B;YI SYLLABLE YUO;Lo;0;L;;;;;N;;;;;
+A47C;YI SYLLABLE YUOP;Lo;0;L;;;;;N;;;;;
+A47D;YI SYLLABLE YOT;Lo;0;L;;;;;N;;;;;
+A47E;YI SYLLABLE YOX;Lo;0;L;;;;;N;;;;;
+A47F;YI SYLLABLE YO;Lo;0;L;;;;;N;;;;;
+A480;YI SYLLABLE YOP;Lo;0;L;;;;;N;;;;;
+A481;YI SYLLABLE YUT;Lo;0;L;;;;;N;;;;;
+A482;YI SYLLABLE YUX;Lo;0;L;;;;;N;;;;;
+A483;YI SYLLABLE YU;Lo;0;L;;;;;N;;;;;
+A484;YI SYLLABLE YUP;Lo;0;L;;;;;N;;;;;
+A485;YI SYLLABLE YURX;Lo;0;L;;;;;N;;;;;
+A486;YI SYLLABLE YUR;Lo;0;L;;;;;N;;;;;
+A487;YI SYLLABLE YYT;Lo;0;L;;;;;N;;;;;
+A488;YI SYLLABLE YYX;Lo;0;L;;;;;N;;;;;
+A489;YI SYLLABLE YY;Lo;0;L;;;;;N;;;;;
+A48A;YI SYLLABLE YYP;Lo;0;L;;;;;N;;;;;
+A48B;YI SYLLABLE YYRX;Lo;0;L;;;;;N;;;;;
+A48C;YI SYLLABLE YYR;Lo;0;L;;;;;N;;;;;
+A490;YI RADICAL QOT;So;0;ON;;;;;N;;;;;
+A491;YI RADICAL LI;So;0;ON;;;;;N;;;;;
+A492;YI RADICAL KIT;So;0;ON;;;;;N;;;;;
+A493;YI RADICAL NYIP;So;0;ON;;;;;N;;;;;
+A494;YI RADICAL CYP;So;0;ON;;;;;N;;;;;
+A495;YI RADICAL SSI;So;0;ON;;;;;N;;;;;
+A496;YI RADICAL GGOP;So;0;ON;;;;;N;;;;;
+A497;YI RADICAL GEP;So;0;ON;;;;;N;;;;;
+A498;YI RADICAL MI;So;0;ON;;;;;N;;;;;
+A499;YI RADICAL HXIT;So;0;ON;;;;;N;;;;;
+A49A;YI RADICAL LYR;So;0;ON;;;;;N;;;;;
+A49B;YI RADICAL BBUT;So;0;ON;;;;;N;;;;;
+A49C;YI RADICAL MOP;So;0;ON;;;;;N;;;;;
+A49D;YI RADICAL YO;So;0;ON;;;;;N;;;;;
+A49E;YI RADICAL PUT;So;0;ON;;;;;N;;;;;
+A49F;YI RADICAL HXUO;So;0;ON;;;;;N;;;;;
+A4A0;YI RADICAL TAT;So;0;ON;;;;;N;;;;;
+A4A1;YI RADICAL GA;So;0;ON;;;;;N;;;;;
+A4A4;YI RADICAL DDUR;So;0;ON;;;;;N;;;;;
+A4A5;YI RADICAL BUR;So;0;ON;;;;;N;;;;;
+A4A6;YI RADICAL GGUO;So;0;ON;;;;;N;;;;;
+A4A7;YI RADICAL NYOP;So;0;ON;;;;;N;;;;;
+A4A8;YI RADICAL TU;So;0;ON;;;;;N;;;;;
+A4A9;YI RADICAL OP;So;0;ON;;;;;N;;;;;
+A4AA;YI RADICAL JJUT;So;0;ON;;;;;N;;;;;
+A4AB;YI RADICAL ZOT;So;0;ON;;;;;N;;;;;
+A4AC;YI RADICAL PYT;So;0;ON;;;;;N;;;;;
+A4AD;YI RADICAL HMO;So;0;ON;;;;;N;;;;;
+A4AE;YI RADICAL YIT;So;0;ON;;;;;N;;;;;
+A4AF;YI RADICAL VUR;So;0;ON;;;;;N;;;;;
+A4B0;YI RADICAL SHY;So;0;ON;;;;;N;;;;;
+A4B1;YI RADICAL VEP;So;0;ON;;;;;N;;;;;
+A4B2;YI RADICAL ZA;So;0;ON;;;;;N;;;;;
+A4B3;YI RADICAL JO;So;0;ON;;;;;N;;;;;
+A4B5;YI RADICAL JJY;So;0;ON;;;;;N;;;;;
+A4B6;YI RADICAL GOT;So;0;ON;;;;;N;;;;;
+A4B7;YI RADICAL JJIE;So;0;ON;;;;;N;;;;;
+A4B8;YI RADICAL WO;So;0;ON;;;;;N;;;;;
+A4B9;YI RADICAL DU;So;0;ON;;;;;N;;;;;
+A4BA;YI RADICAL SHUR;So;0;ON;;;;;N;;;;;
+A4BB;YI RADICAL LIE;So;0;ON;;;;;N;;;;;
+A4BC;YI RADICAL CY;So;0;ON;;;;;N;;;;;
+A4BD;YI RADICAL CUOP;So;0;ON;;;;;N;;;;;
+A4BE;YI RADICAL CIP;So;0;ON;;;;;N;;;;;
+A4BF;YI RADICAL HXOP;So;0;ON;;;;;N;;;;;
+A4C0;YI RADICAL SHAT;So;0;ON;;;;;N;;;;;
+A4C2;YI RADICAL SHOP;So;0;ON;;;;;N;;;;;
+A4C3;YI RADICAL CHE;So;0;ON;;;;;N;;;;;
+A4C4;YI RADICAL ZZIET;So;0;ON;;;;;N;;;;;
+A4C6;YI RADICAL KE;So;0;ON;;;;;N;;;;;
+AC00;<Hangul Syllable, First>;Lo;0;L;;;;;N;;;;;
+D7A3;<Hangul Syllable, Last>;Lo;0;L;;;;;N;;;;;
+D800;<Non Private Use High Surrogate, First>;Cs;0;L;;;;;N;;;;;
+DB7F;<Non Private Use High Surrogate, Last>;Cs;0;L;;;;;N;;;;;
+DB80;<Private Use High Surrogate, First>;Cs;0;L;;;;;N;;;;;
+DBFF;<Private Use High Surrogate, Last>;Cs;0;L;;;;;N;;;;;
+DC00;<Low Surrogate, First>;Cs;0;L;;;;;N;;;;;
+DFFF;<Low Surrogate, Last>;Cs;0;L;;;;;N;;;;;
+E000;<Private Use, First>;Co;0;L;;;;;N;;;;;
+F8FF;<Private Use, Last>;Co;0;L;;;;;N;;;;;
+F900;CJK COMPATIBILITY IDEOGRAPH-F900;Lo;0;L;8C48;;;;N;;;;;
+F901;CJK COMPATIBILITY IDEOGRAPH-F901;Lo;0;L;66F4;;;;N;;;;;
+F902;CJK COMPATIBILITY IDEOGRAPH-F902;Lo;0;L;8ECA;;;;N;;;;;
+F903;CJK COMPATIBILITY IDEOGRAPH-F903;Lo;0;L;8CC8;;;;N;;;;;
+F904;CJK COMPATIBILITY IDEOGRAPH-F904;Lo;0;L;6ED1;;;;N;;;;;
+F905;CJK COMPATIBILITY IDEOGRAPH-F905;Lo;0;L;4E32;;;;N;;;;;
+F906;CJK COMPATIBILITY IDEOGRAPH-F906;Lo;0;L;53E5;;;;N;;;;;
+F907;CJK COMPATIBILITY IDEOGRAPH-F907;Lo;0;L;9F9C;;;;N;;;;;
+F908;CJK COMPATIBILITY IDEOGRAPH-F908;Lo;0;L;9F9C;;;;N;;;;;
+F909;CJK COMPATIBILITY IDEOGRAPH-F909;Lo;0;L;5951;;;;N;;;;;
+F90A;CJK COMPATIBILITY IDEOGRAPH-F90A;Lo;0;L;91D1;;;;N;;;;;
+F90B;CJK COMPATIBILITY IDEOGRAPH-F90B;Lo;0;L;5587;;;;N;;;;;
+F90C;CJK COMPATIBILITY IDEOGRAPH-F90C;Lo;0;L;5948;;;;N;;;;;
+F90D;CJK COMPATIBILITY IDEOGRAPH-F90D;Lo;0;L;61F6;;;;N;;;;;
+F90E;CJK COMPATIBILITY IDEOGRAPH-F90E;Lo;0;L;7669;;;;N;;;;;
+F90F;CJK COMPATIBILITY IDEOGRAPH-F90F;Lo;0;L;7F85;;;;N;;;;;
+F910;CJK COMPATIBILITY IDEOGRAPH-F910;Lo;0;L;863F;;;;N;;;;;
+F911;CJK COMPATIBILITY IDEOGRAPH-F911;Lo;0;L;87BA;;;;N;;;;;
+F912;CJK COMPATIBILITY IDEOGRAPH-F912;Lo;0;L;88F8;;;;N;;;;;
+F913;CJK COMPATIBILITY IDEOGRAPH-F913;Lo;0;L;908F;;;;N;;;;;
+F914;CJK COMPATIBILITY IDEOGRAPH-F914;Lo;0;L;6A02;;;;N;;;;;
+F915;CJK COMPATIBILITY IDEOGRAPH-F915;Lo;0;L;6D1B;;;;N;;;;;
+F916;CJK COMPATIBILITY IDEOGRAPH-F916;Lo;0;L;70D9;;;;N;;;;;
+F917;CJK COMPATIBILITY IDEOGRAPH-F917;Lo;0;L;73DE;;;;N;;;;;
+F918;CJK COMPATIBILITY IDEOGRAPH-F918;Lo;0;L;843D;;;;N;;;;;
+F919;CJK COMPATIBILITY IDEOGRAPH-F919;Lo;0;L;916A;;;;N;;;;;
+F91A;CJK COMPATIBILITY IDEOGRAPH-F91A;Lo;0;L;99F1;;;;N;;;;;
+F91B;CJK COMPATIBILITY IDEOGRAPH-F91B;Lo;0;L;4E82;;;;N;;;;;
+F91C;CJK COMPATIBILITY IDEOGRAPH-F91C;Lo;0;L;5375;;;;N;;;;;
+F91D;CJK COMPATIBILITY IDEOGRAPH-F91D;Lo;0;L;6B04;;;;N;;;;;
+F91E;CJK COMPATIBILITY IDEOGRAPH-F91E;Lo;0;L;721B;;;;N;;;;;
+F91F;CJK COMPATIBILITY IDEOGRAPH-F91F;Lo;0;L;862D;;;;N;;;;;
+F920;CJK COMPATIBILITY IDEOGRAPH-F920;Lo;0;L;9E1E;;;;N;;;;;
+F921;CJK COMPATIBILITY IDEOGRAPH-F921;Lo;0;L;5D50;;;;N;;;;;
+F922;CJK COMPATIBILITY IDEOGRAPH-F922;Lo;0;L;6FEB;;;;N;;;;;
+F923;CJK COMPATIBILITY IDEOGRAPH-F923;Lo;0;L;85CD;;;;N;;;;;
+F924;CJK COMPATIBILITY IDEOGRAPH-F924;Lo;0;L;8964;;;;N;;;;;
+F925;CJK COMPATIBILITY IDEOGRAPH-F925;Lo;0;L;62C9;;;;N;;;;;
+F926;CJK COMPATIBILITY IDEOGRAPH-F926;Lo;0;L;81D8;;;;N;;;;;
+F927;CJK COMPATIBILITY IDEOGRAPH-F927;Lo;0;L;881F;;;;N;;;;;
+F928;CJK COMPATIBILITY IDEOGRAPH-F928;Lo;0;L;5ECA;;;;N;;;;;
+F929;CJK COMPATIBILITY IDEOGRAPH-F929;Lo;0;L;6717;;;;N;;;;;
+F92A;CJK COMPATIBILITY IDEOGRAPH-F92A;Lo;0;L;6D6A;;;;N;;;;;
+F92B;CJK COMPATIBILITY IDEOGRAPH-F92B;Lo;0;L;72FC;;;;N;;;;;
+F92C;CJK COMPATIBILITY IDEOGRAPH-F92C;Lo;0;L;90CE;;;;N;;;;;
+F92D;CJK COMPATIBILITY IDEOGRAPH-F92D;Lo;0;L;4F86;;;;N;;;;;
+F92E;CJK COMPATIBILITY IDEOGRAPH-F92E;Lo;0;L;51B7;;;;N;;;;;
+F92F;CJK COMPATIBILITY IDEOGRAPH-F92F;Lo;0;L;52DE;;;;N;;;;;
+F930;CJK COMPATIBILITY IDEOGRAPH-F930;Lo;0;L;64C4;;;;N;;;;;
+F931;CJK COMPATIBILITY IDEOGRAPH-F931;Lo;0;L;6AD3;;;;N;;;;;
+F932;CJK COMPATIBILITY IDEOGRAPH-F932;Lo;0;L;7210;;;;N;;;;;
+F933;CJK COMPATIBILITY IDEOGRAPH-F933;Lo;0;L;76E7;;;;N;;;;;
+F934;CJK COMPATIBILITY IDEOGRAPH-F934;Lo;0;L;8001;;;;N;;;;;
+F935;CJK COMPATIBILITY IDEOGRAPH-F935;Lo;0;L;8606;;;;N;;;;;
+F936;CJK COMPATIBILITY IDEOGRAPH-F936;Lo;0;L;865C;;;;N;;;;;
+F937;CJK COMPATIBILITY IDEOGRAPH-F937;Lo;0;L;8DEF;;;;N;;;;;
+F938;CJK COMPATIBILITY IDEOGRAPH-F938;Lo;0;L;9732;;;;N;;;;;
+F939;CJK COMPATIBILITY IDEOGRAPH-F939;Lo;0;L;9B6F;;;;N;;;;;
+F93A;CJK COMPATIBILITY IDEOGRAPH-F93A;Lo;0;L;9DFA;;;;N;;;;;
+F93B;CJK COMPATIBILITY IDEOGRAPH-F93B;Lo;0;L;788C;;;;N;;;;;
+F93C;CJK COMPATIBILITY IDEOGRAPH-F93C;Lo;0;L;797F;;;;N;;;;;
+F93D;CJK COMPATIBILITY IDEOGRAPH-F93D;Lo;0;L;7DA0;;;;N;;;;;
+F93E;CJK COMPATIBILITY IDEOGRAPH-F93E;Lo;0;L;83C9;;;;N;;;;;
+F93F;CJK COMPATIBILITY IDEOGRAPH-F93F;Lo;0;L;9304;;;;N;;;;;
+F940;CJK COMPATIBILITY IDEOGRAPH-F940;Lo;0;L;9E7F;;;;N;;;;;
+F941;CJK COMPATIBILITY IDEOGRAPH-F941;Lo;0;L;8AD6;;;;N;;;;;
+F942;CJK COMPATIBILITY IDEOGRAPH-F942;Lo;0;L;58DF;;;;N;;;;;
+F943;CJK COMPATIBILITY IDEOGRAPH-F943;Lo;0;L;5F04;;;;N;;;;;
+F944;CJK COMPATIBILITY IDEOGRAPH-F944;Lo;0;L;7C60;;;;N;;;;;
+F945;CJK COMPATIBILITY IDEOGRAPH-F945;Lo;0;L;807E;;;;N;;;;;
+F946;CJK COMPATIBILITY IDEOGRAPH-F946;Lo;0;L;7262;;;;N;;;;;
+F947;CJK COMPATIBILITY IDEOGRAPH-F947;Lo;0;L;78CA;;;;N;;;;;
+F948;CJK COMPATIBILITY IDEOGRAPH-F948;Lo;0;L;8CC2;;;;N;;;;;
+F949;CJK COMPATIBILITY IDEOGRAPH-F949;Lo;0;L;96F7;;;;N;;;;;
+F94A;CJK COMPATIBILITY IDEOGRAPH-F94A;Lo;0;L;58D8;;;;N;;;;;
+F94B;CJK COMPATIBILITY IDEOGRAPH-F94B;Lo;0;L;5C62;;;;N;;;;;
+F94C;CJK COMPATIBILITY IDEOGRAPH-F94C;Lo;0;L;6A13;;;;N;;;;;
+F94D;CJK COMPATIBILITY IDEOGRAPH-F94D;Lo;0;L;6DDA;;;;N;;;;;
+F94E;CJK COMPATIBILITY IDEOGRAPH-F94E;Lo;0;L;6F0F;;;;N;;;;;
+F94F;CJK COMPATIBILITY IDEOGRAPH-F94F;Lo;0;L;7D2F;;;;N;;;;;
+F950;CJK COMPATIBILITY IDEOGRAPH-F950;Lo;0;L;7E37;;;;N;;;;;
+F951;CJK COMPATIBILITY IDEOGRAPH-F951;Lo;0;L;96FB;;;;N;;;;;
+F952;CJK COMPATIBILITY IDEOGRAPH-F952;Lo;0;L;52D2;;;;N;;;;;
+F953;CJK COMPATIBILITY IDEOGRAPH-F953;Lo;0;L;808B;;;;N;;;;;
+F954;CJK COMPATIBILITY IDEOGRAPH-F954;Lo;0;L;51DC;;;;N;;;;;
+F955;CJK COMPATIBILITY IDEOGRAPH-F955;Lo;0;L;51CC;;;;N;;;;;
+F956;CJK COMPATIBILITY IDEOGRAPH-F956;Lo;0;L;7A1C;;;;N;;;;;
+F957;CJK COMPATIBILITY IDEOGRAPH-F957;Lo;0;L;7DBE;;;;N;;;;;
+F958;CJK COMPATIBILITY IDEOGRAPH-F958;Lo;0;L;83F1;;;;N;;;;;
+F959;CJK COMPATIBILITY IDEOGRAPH-F959;Lo;0;L;9675;;;;N;;;;;
+F95A;CJK COMPATIBILITY IDEOGRAPH-F95A;Lo;0;L;8B80;;;;N;;;;;
+F95B;CJK COMPATIBILITY IDEOGRAPH-F95B;Lo;0;L;62CF;;;;N;;;;;
+F95C;CJK COMPATIBILITY IDEOGRAPH-F95C;Lo;0;L;6A02;;;;N;;;;;
+F95D;CJK COMPATIBILITY IDEOGRAPH-F95D;Lo;0;L;8AFE;;;;N;;;;;
+F95E;CJK COMPATIBILITY IDEOGRAPH-F95E;Lo;0;L;4E39;;;;N;;;;;
+F95F;CJK COMPATIBILITY IDEOGRAPH-F95F;Lo;0;L;5BE7;;;;N;;;;;
+F960;CJK COMPATIBILITY IDEOGRAPH-F960;Lo;0;L;6012;;;;N;;;;;
+F961;CJK COMPATIBILITY IDEOGRAPH-F961;Lo;0;L;7387;;;;N;;;;;
+F962;CJK COMPATIBILITY IDEOGRAPH-F962;Lo;0;L;7570;;;;N;;;;;
+F963;CJK COMPATIBILITY IDEOGRAPH-F963;Lo;0;L;5317;;;;N;;;;;
+F964;CJK COMPATIBILITY IDEOGRAPH-F964;Lo;0;L;78FB;;;;N;;;;;
+F965;CJK COMPATIBILITY IDEOGRAPH-F965;Lo;0;L;4FBF;;;;N;;;;;
+F966;CJK COMPATIBILITY IDEOGRAPH-F966;Lo;0;L;5FA9;;;;N;;;;;
+F967;CJK COMPATIBILITY IDEOGRAPH-F967;Lo;0;L;4E0D;;;;N;;;;;
+F968;CJK COMPATIBILITY IDEOGRAPH-F968;Lo;0;L;6CCC;;;;N;;;;;
+F969;CJK COMPATIBILITY IDEOGRAPH-F969;Lo;0;L;6578;;;;N;;;;;
+F96A;CJK COMPATIBILITY IDEOGRAPH-F96A;Lo;0;L;7D22;;;;N;;;;;
+F96B;CJK COMPATIBILITY IDEOGRAPH-F96B;Lo;0;L;53C3;;;;N;;;;;
+F96C;CJK COMPATIBILITY IDEOGRAPH-F96C;Lo;0;L;585E;;;;N;;;;;
+F96D;CJK COMPATIBILITY IDEOGRAPH-F96D;Lo;0;L;7701;;;;N;;;;;
+F96E;CJK COMPATIBILITY IDEOGRAPH-F96E;Lo;0;L;8449;;;;N;;;;;
+F96F;CJK COMPATIBILITY IDEOGRAPH-F96F;Lo;0;L;8AAA;;;;N;;;;;
+F970;CJK COMPATIBILITY IDEOGRAPH-F970;Lo;0;L;6BBA;;;;N;;;;;
+F971;CJK COMPATIBILITY IDEOGRAPH-F971;Lo;0;L;8FB0;;;;N;;;;;
+F972;CJK COMPATIBILITY IDEOGRAPH-F972;Lo;0;L;6C88;;;;N;;;;;
+F973;CJK COMPATIBILITY IDEOGRAPH-F973;Lo;0;L;62FE;;;;N;;;;;
+F974;CJK COMPATIBILITY IDEOGRAPH-F974;Lo;0;L;82E5;;;;N;;;;;
+F975;CJK COMPATIBILITY IDEOGRAPH-F975;Lo;0;L;63A0;;;;N;;;;;
+F976;CJK COMPATIBILITY IDEOGRAPH-F976;Lo;0;L;7565;;;;N;;;;;
+F977;CJK COMPATIBILITY IDEOGRAPH-F977;Lo;0;L;4EAE;;;;N;;;;;
+F978;CJK COMPATIBILITY IDEOGRAPH-F978;Lo;0;L;5169;;;;N;;;;;
+F979;CJK COMPATIBILITY IDEOGRAPH-F979;Lo;0;L;51C9;;;;N;;;;;
+F97A;CJK COMPATIBILITY IDEOGRAPH-F97A;Lo;0;L;6881;;;;N;;;;;
+F97B;CJK COMPATIBILITY IDEOGRAPH-F97B;Lo;0;L;7CE7;;;;N;;;;;
+F97C;CJK COMPATIBILITY IDEOGRAPH-F97C;Lo;0;L;826F;;;;N;;;;;
+F97D;CJK COMPATIBILITY IDEOGRAPH-F97D;Lo;0;L;8AD2;;;;N;;;;;
+F97E;CJK COMPATIBILITY IDEOGRAPH-F97E;Lo;0;L;91CF;;;;N;;;;;
+F97F;CJK COMPATIBILITY IDEOGRAPH-F97F;Lo;0;L;52F5;;;;N;;;;;
+F980;CJK COMPATIBILITY IDEOGRAPH-F980;Lo;0;L;5442;;;;N;;;;;
+F981;CJK COMPATIBILITY IDEOGRAPH-F981;Lo;0;L;5973;;;;N;;;;;
+F982;CJK COMPATIBILITY IDEOGRAPH-F982;Lo;0;L;5EEC;;;;N;;;;;
+F983;CJK COMPATIBILITY IDEOGRAPH-F983;Lo;0;L;65C5;;;;N;;;;;
+F984;CJK COMPATIBILITY IDEOGRAPH-F984;Lo;0;L;6FFE;;;;N;;;;;
+F985;CJK COMPATIBILITY IDEOGRAPH-F985;Lo;0;L;792A;;;;N;;;;;
+F986;CJK COMPATIBILITY IDEOGRAPH-F986;Lo;0;L;95AD;;;;N;;;;;
+F987;CJK COMPATIBILITY IDEOGRAPH-F987;Lo;0;L;9A6A;;;;N;;;;;
+F988;CJK COMPATIBILITY IDEOGRAPH-F988;Lo;0;L;9E97;;;;N;;;;;
+F989;CJK COMPATIBILITY IDEOGRAPH-F989;Lo;0;L;9ECE;;;;N;;;;;
+F98A;CJK COMPATIBILITY IDEOGRAPH-F98A;Lo;0;L;529B;;;;N;;;;;
+F98B;CJK COMPATIBILITY IDEOGRAPH-F98B;Lo;0;L;66C6;;;;N;;;;;
+F98C;CJK COMPATIBILITY IDEOGRAPH-F98C;Lo;0;L;6B77;;;;N;;;;;
+F98D;CJK COMPATIBILITY IDEOGRAPH-F98D;Lo;0;L;8F62;;;;N;;;;;
+F98E;CJK COMPATIBILITY IDEOGRAPH-F98E;Lo;0;L;5E74;;;;N;;;;;
+F98F;CJK COMPATIBILITY IDEOGRAPH-F98F;Lo;0;L;6190;;;;N;;;;;
+F990;CJK COMPATIBILITY IDEOGRAPH-F990;Lo;0;L;6200;;;;N;;;;;
+F991;CJK COMPATIBILITY IDEOGRAPH-F991;Lo;0;L;649A;;;;N;;;;;
+F992;CJK COMPATIBILITY IDEOGRAPH-F992;Lo;0;L;6F23;;;;N;;;;;
+F993;CJK COMPATIBILITY IDEOGRAPH-F993;Lo;0;L;7149;;;;N;;;;;
+F994;CJK COMPATIBILITY IDEOGRAPH-F994;Lo;0;L;7489;;;;N;;;;;
+F995;CJK COMPATIBILITY IDEOGRAPH-F995;Lo;0;L;79CA;;;;N;;;;;
+F996;CJK COMPATIBILITY IDEOGRAPH-F996;Lo;0;L;7DF4;;;;N;;;;;
+F997;CJK COMPATIBILITY IDEOGRAPH-F997;Lo;0;L;806F;;;;N;;;;;
+F998;CJK COMPATIBILITY IDEOGRAPH-F998;Lo;0;L;8F26;;;;N;;;;;
+F999;CJK COMPATIBILITY IDEOGRAPH-F999;Lo;0;L;84EE;;;;N;;;;;
+F99A;CJK COMPATIBILITY IDEOGRAPH-F99A;Lo;0;L;9023;;;;N;;;;;
+F99B;CJK COMPATIBILITY IDEOGRAPH-F99B;Lo;0;L;934A;;;;N;;;;;
+F99C;CJK COMPATIBILITY IDEOGRAPH-F99C;Lo;0;L;5217;;;;N;;;;;
+F99D;CJK COMPATIBILITY IDEOGRAPH-F99D;Lo;0;L;52A3;;;;N;;;;;
+F99E;CJK COMPATIBILITY IDEOGRAPH-F99E;Lo;0;L;54BD;;;;N;;;;;
+F99F;CJK COMPATIBILITY IDEOGRAPH-F99F;Lo;0;L;70C8;;;;N;;;;;
+F9A0;CJK COMPATIBILITY IDEOGRAPH-F9A0;Lo;0;L;88C2;;;;N;;;;;
+F9A1;CJK COMPATIBILITY IDEOGRAPH-F9A1;Lo;0;L;8AAA;;;;N;;;;;
+F9A2;CJK COMPATIBILITY IDEOGRAPH-F9A2;Lo;0;L;5EC9;;;;N;;;;;
+F9A3;CJK COMPATIBILITY IDEOGRAPH-F9A3;Lo;0;L;5FF5;;;;N;;;;;
+F9A4;CJK COMPATIBILITY IDEOGRAPH-F9A4;Lo;0;L;637B;;;;N;;;;;
+F9A5;CJK COMPATIBILITY IDEOGRAPH-F9A5;Lo;0;L;6BAE;;;;N;;;;;
+F9A6;CJK COMPATIBILITY IDEOGRAPH-F9A6;Lo;0;L;7C3E;;;;N;;;;;
+F9A7;CJK COMPATIBILITY IDEOGRAPH-F9A7;Lo;0;L;7375;;;;N;;;;;
+F9A8;CJK COMPATIBILITY IDEOGRAPH-F9A8;Lo;0;L;4EE4;;;;N;;;;;
+F9A9;CJK COMPATIBILITY IDEOGRAPH-F9A9;Lo;0;L;56F9;;;;N;;;;;
+F9AA;CJK COMPATIBILITY IDEOGRAPH-F9AA;Lo;0;L;5BE7;;;;N;;;;;
+F9AB;CJK COMPATIBILITY IDEOGRAPH-F9AB;Lo;0;L;5DBA;;;;N;;;;;
+F9AC;CJK COMPATIBILITY IDEOGRAPH-F9AC;Lo;0;L;601C;;;;N;;;;;
+F9AD;CJK COMPATIBILITY IDEOGRAPH-F9AD;Lo;0;L;73B2;;;;N;;;;;
+F9AE;CJK COMPATIBILITY IDEOGRAPH-F9AE;Lo;0;L;7469;;;;N;;;;;
+F9AF;CJK COMPATIBILITY IDEOGRAPH-F9AF;Lo;0;L;7F9A;;;;N;;;;;
+F9B0;CJK COMPATIBILITY IDEOGRAPH-F9B0;Lo;0;L;8046;;;;N;;;;;
+F9B1;CJK COMPATIBILITY IDEOGRAPH-F9B1;Lo;0;L;9234;;;;N;;;;;
+F9B2;CJK COMPATIBILITY IDEOGRAPH-F9B2;Lo;0;L;96F6;;;;N;;;;;
+F9B3;CJK COMPATIBILITY IDEOGRAPH-F9B3;Lo;0;L;9748;;;;N;;;;;
+F9B4;CJK COMPATIBILITY IDEOGRAPH-F9B4;Lo;0;L;9818;;;;N;;;;;
+F9B5;CJK COMPATIBILITY IDEOGRAPH-F9B5;Lo;0;L;4F8B;;;;N;;;;;
+F9B6;CJK COMPATIBILITY IDEOGRAPH-F9B6;Lo;0;L;79AE;;;;N;;;;;
+F9B7;CJK COMPATIBILITY IDEOGRAPH-F9B7;Lo;0;L;91B4;;;;N;;;;;
+F9B8;CJK COMPATIBILITY IDEOGRAPH-F9B8;Lo;0;L;96B8;;;;N;;;;;
+F9B9;CJK COMPATIBILITY IDEOGRAPH-F9B9;Lo;0;L;60E1;;;;N;;;;;
+F9BA;CJK COMPATIBILITY IDEOGRAPH-F9BA;Lo;0;L;4E86;;;;N;;;;;
+F9BB;CJK COMPATIBILITY IDEOGRAPH-F9BB;Lo;0;L;50DA;;;;N;;;;;
+F9BC;CJK COMPATIBILITY IDEOGRAPH-F9BC;Lo;0;L;5BEE;;;;N;;;;;
+F9BD;CJK COMPATIBILITY IDEOGRAPH-F9BD;Lo;0;L;5C3F;;;;N;;;;;
+F9BE;CJK COMPATIBILITY IDEOGRAPH-F9BE;Lo;0;L;6599;;;;N;;;;;
+F9BF;CJK COMPATIBILITY IDEOGRAPH-F9BF;Lo;0;L;6A02;;;;N;;;;;
+F9C0;CJK COMPATIBILITY IDEOGRAPH-F9C0;Lo;0;L;71CE;;;;N;;;;;
+F9C1;CJK COMPATIBILITY IDEOGRAPH-F9C1;Lo;0;L;7642;;;;N;;;;;
+F9C2;CJK COMPATIBILITY IDEOGRAPH-F9C2;Lo;0;L;84FC;;;;N;;;;;
+F9C3;CJK COMPATIBILITY IDEOGRAPH-F9C3;Lo;0;L;907C;;;;N;;;;;
+F9C4;CJK COMPATIBILITY IDEOGRAPH-F9C4;Lo;0;L;9F8D;;;;N;;;;;
+F9C5;CJK COMPATIBILITY IDEOGRAPH-F9C5;Lo;0;L;6688;;;;N;;;;;
+F9C6;CJK COMPATIBILITY IDEOGRAPH-F9C6;Lo;0;L;962E;;;;N;;;;;
+F9C7;CJK COMPATIBILITY IDEOGRAPH-F9C7;Lo;0;L;5289;;;;N;;;;;
+F9C8;CJK COMPATIBILITY IDEOGRAPH-F9C8;Lo;0;L;677B;;;;N;;;;;
+F9C9;CJK COMPATIBILITY IDEOGRAPH-F9C9;Lo;0;L;67F3;;;;N;;;;;
+F9CA;CJK COMPATIBILITY IDEOGRAPH-F9CA;Lo;0;L;6D41;;;;N;;;;;
+F9CB;CJK COMPATIBILITY IDEOGRAPH-F9CB;Lo;0;L;6E9C;;;;N;;;;;
+F9CC;CJK COMPATIBILITY IDEOGRAPH-F9CC;Lo;0;L;7409;;;;N;;;;;
+F9CD;CJK COMPATIBILITY IDEOGRAPH-F9CD;Lo;0;L;7559;;;;N;;;;;
+F9CE;CJK COMPATIBILITY IDEOGRAPH-F9CE;Lo;0;L;786B;;;;N;;;;;
+F9CF;CJK COMPATIBILITY IDEOGRAPH-F9CF;Lo;0;L;7D10;;;;N;;;;;
+F9D0;CJK COMPATIBILITY IDEOGRAPH-F9D0;Lo;0;L;985E;;;;N;;;;;
+F9D1;CJK COMPATIBILITY IDEOGRAPH-F9D1;Lo;0;L;516D;;;;N;;;;;
+F9D2;CJK COMPATIBILITY IDEOGRAPH-F9D2;Lo;0;L;622E;;;;N;;;;;
+F9D3;CJK COMPATIBILITY IDEOGRAPH-F9D3;Lo;0;L;9678;;;;N;;;;;
+F9D4;CJK COMPATIBILITY IDEOGRAPH-F9D4;Lo;0;L;502B;;;;N;;;;;
+F9D5;CJK COMPATIBILITY IDEOGRAPH-F9D5;Lo;0;L;5D19;;;;N;;;;;
+F9D6;CJK COMPATIBILITY IDEOGRAPH-F9D6;Lo;0;L;6DEA;;;;N;;;;;
+F9D7;CJK COMPATIBILITY IDEOGRAPH-F9D7;Lo;0;L;8F2A;;;;N;;;;;
+F9D8;CJK COMPATIBILITY IDEOGRAPH-F9D8;Lo;0;L;5F8B;;;;N;;;;;
+F9D9;CJK COMPATIBILITY IDEOGRAPH-F9D9;Lo;0;L;6144;;;;N;;;;;
+F9DA;CJK COMPATIBILITY IDEOGRAPH-F9DA;Lo;0;L;6817;;;;N;;;;;
+F9DB;CJK COMPATIBILITY IDEOGRAPH-F9DB;Lo;0;L;7387;;;;N;;;;;
+F9DC;CJK COMPATIBILITY IDEOGRAPH-F9DC;Lo;0;L;9686;;;;N;;;;;
+F9DD;CJK COMPATIBILITY IDEOGRAPH-F9DD;Lo;0;L;5229;;;;N;;;;;
+F9DE;CJK COMPATIBILITY IDEOGRAPH-F9DE;Lo;0;L;540F;;;;N;;;;;
+F9DF;CJK COMPATIBILITY IDEOGRAPH-F9DF;Lo;0;L;5C65;;;;N;;;;;
+F9E0;CJK COMPATIBILITY IDEOGRAPH-F9E0;Lo;0;L;6613;;;;N;;;;;
+F9E1;CJK COMPATIBILITY IDEOGRAPH-F9E1;Lo;0;L;674E;;;;N;;;;;
+F9E2;CJK COMPATIBILITY IDEOGRAPH-F9E2;Lo;0;L;68A8;;;;N;;;;;
+F9E3;CJK COMPATIBILITY IDEOGRAPH-F9E3;Lo;0;L;6CE5;;;;N;;;;;
+F9E4;CJK COMPATIBILITY IDEOGRAPH-F9E4;Lo;0;L;7406;;;;N;;;;;
+F9E5;CJK COMPATIBILITY IDEOGRAPH-F9E5;Lo;0;L;75E2;;;;N;;;;;
+F9E6;CJK COMPATIBILITY IDEOGRAPH-F9E6;Lo;0;L;7F79;;;;N;;;;;
+F9E7;CJK COMPATIBILITY IDEOGRAPH-F9E7;Lo;0;L;88CF;;;;N;;;;;
+F9E8;CJK COMPATIBILITY IDEOGRAPH-F9E8;Lo;0;L;88E1;;;;N;;;;;
+F9E9;CJK COMPATIBILITY IDEOGRAPH-F9E9;Lo;0;L;91CC;;;;N;;;;;
+F9EA;CJK COMPATIBILITY IDEOGRAPH-F9EA;Lo;0;L;96E2;;;;N;;;;;
+F9EB;CJK COMPATIBILITY IDEOGRAPH-F9EB;Lo;0;L;533F;;;;N;;;;;
+F9EC;CJK COMPATIBILITY IDEOGRAPH-F9EC;Lo;0;L;6EBA;;;;N;;;;;
+F9ED;CJK COMPATIBILITY IDEOGRAPH-F9ED;Lo;0;L;541D;;;;N;;;;;
+F9EE;CJK COMPATIBILITY IDEOGRAPH-F9EE;Lo;0;L;71D0;;;;N;;;;;
+F9EF;CJK COMPATIBILITY IDEOGRAPH-F9EF;Lo;0;L;7498;;;;N;;;;;
+F9F0;CJK COMPATIBILITY IDEOGRAPH-F9F0;Lo;0;L;85FA;;;;N;;;;;
+F9F1;CJK COMPATIBILITY IDEOGRAPH-F9F1;Lo;0;L;96A3;;;;N;;;;;
+F9F2;CJK COMPATIBILITY IDEOGRAPH-F9F2;Lo;0;L;9C57;;;;N;;;;;
+F9F3;CJK COMPATIBILITY IDEOGRAPH-F9F3;Lo;0;L;9E9F;;;;N;;;;;
+F9F4;CJK COMPATIBILITY IDEOGRAPH-F9F4;Lo;0;L;6797;;;;N;;;;;
+F9F5;CJK COMPATIBILITY IDEOGRAPH-F9F5;Lo;0;L;6DCB;;;;N;;;;;
+F9F6;CJK COMPATIBILITY IDEOGRAPH-F9F6;Lo;0;L;81E8;;;;N;;;;;
+F9F7;CJK COMPATIBILITY IDEOGRAPH-F9F7;Lo;0;L;7ACB;;;;N;;;;;
+F9F8;CJK COMPATIBILITY IDEOGRAPH-F9F8;Lo;0;L;7B20;;;;N;;;;;
+F9F9;CJK COMPATIBILITY IDEOGRAPH-F9F9;Lo;0;L;7C92;;;;N;;;;;
+F9FA;CJK COMPATIBILITY IDEOGRAPH-F9FA;Lo;0;L;72C0;;;;N;;;;;
+F9FB;CJK COMPATIBILITY IDEOGRAPH-F9FB;Lo;0;L;7099;;;;N;;;;;
+F9FC;CJK COMPATIBILITY IDEOGRAPH-F9FC;Lo;0;L;8B58;;;;N;;;;;
+F9FD;CJK COMPATIBILITY IDEOGRAPH-F9FD;Lo;0;L;4EC0;;;;N;;;;;
+F9FE;CJK COMPATIBILITY IDEOGRAPH-F9FE;Lo;0;L;8336;;;;N;;;;;
+F9FF;CJK COMPATIBILITY IDEOGRAPH-F9FF;Lo;0;L;523A;;;;N;;;;;
+FA00;CJK COMPATIBILITY IDEOGRAPH-FA00;Lo;0;L;5207;;;;N;;;;;
+FA01;CJK COMPATIBILITY IDEOGRAPH-FA01;Lo;0;L;5EA6;;;;N;;;;;
+FA02;CJK COMPATIBILITY IDEOGRAPH-FA02;Lo;0;L;62D3;;;;N;;;;;
+FA03;CJK COMPATIBILITY IDEOGRAPH-FA03;Lo;0;L;7CD6;;;;N;;;;;
+FA04;CJK COMPATIBILITY IDEOGRAPH-FA04;Lo;0;L;5B85;;;;N;;;;;
+FA05;CJK COMPATIBILITY IDEOGRAPH-FA05;Lo;0;L;6D1E;;;;N;;;;;
+FA06;CJK COMPATIBILITY IDEOGRAPH-FA06;Lo;0;L;66B4;;;;N;;;;;
+FA07;CJK COMPATIBILITY IDEOGRAPH-FA07;Lo;0;L;8F3B;;;;N;;;;;
+FA08;CJK COMPATIBILITY IDEOGRAPH-FA08;Lo;0;L;884C;;;;N;;;;;
+FA09;CJK COMPATIBILITY IDEOGRAPH-FA09;Lo;0;L;964D;;;;N;;;;;
+FA0A;CJK COMPATIBILITY IDEOGRAPH-FA0A;Lo;0;L;898B;;;;N;;;;;
+FA0B;CJK COMPATIBILITY IDEOGRAPH-FA0B;Lo;0;L;5ED3;;;;N;;;;;
+FA0C;CJK COMPATIBILITY IDEOGRAPH-FA0C;Lo;0;L;5140;;;;N;;;;;
+FA0D;CJK COMPATIBILITY IDEOGRAPH-FA0D;Lo;0;L;55C0;;;;N;;;;;
+FA0E;CJK COMPATIBILITY IDEOGRAPH-FA0E;Lo;0;L;;;;;N;;;;;
+FA0F;CJK COMPATIBILITY IDEOGRAPH-FA0F;Lo;0;L;;;;;N;;;;;
+FA10;CJK COMPATIBILITY IDEOGRAPH-FA10;Lo;0;L;585A;;;;N;;;;;
+FA11;CJK COMPATIBILITY IDEOGRAPH-FA11;Lo;0;L;;;;;N;;;;;
+FA12;CJK COMPATIBILITY IDEOGRAPH-FA12;Lo;0;L;6674;;;;N;;;;;
+FA13;CJK COMPATIBILITY IDEOGRAPH-FA13;Lo;0;L;;;;;N;;;;;
+FA14;CJK COMPATIBILITY IDEOGRAPH-FA14;Lo;0;L;;;;;N;;;;;
+FA15;CJK COMPATIBILITY IDEOGRAPH-FA15;Lo;0;L;51DE;;;;N;;;;;
+FA16;CJK COMPATIBILITY IDEOGRAPH-FA16;Lo;0;L;732A;;;;N;;;;;
+FA17;CJK COMPATIBILITY IDEOGRAPH-FA17;Lo;0;L;76CA;;;;N;;;;;
+FA18;CJK COMPATIBILITY IDEOGRAPH-FA18;Lo;0;L;793C;;;;N;;;;;
+FA19;CJK COMPATIBILITY IDEOGRAPH-FA19;Lo;0;L;795E;;;;N;;;;;
+FA1A;CJK COMPATIBILITY IDEOGRAPH-FA1A;Lo;0;L;7965;;;;N;;;;;
+FA1B;CJK COMPATIBILITY IDEOGRAPH-FA1B;Lo;0;L;798F;;;;N;;;;;
+FA1C;CJK COMPATIBILITY IDEOGRAPH-FA1C;Lo;0;L;9756;;;;N;;;;;
+FA1D;CJK COMPATIBILITY IDEOGRAPH-FA1D;Lo;0;L;7CBE;;;;N;;;;;
+FA1E;CJK COMPATIBILITY IDEOGRAPH-FA1E;Lo;0;L;7FBD;;;;N;;;;;
+FA1F;CJK COMPATIBILITY IDEOGRAPH-FA1F;Lo;0;L;;;;;N;;*;;;
+FA20;CJK COMPATIBILITY IDEOGRAPH-FA20;Lo;0;L;8612;;;;N;;;;;
+FA21;CJK COMPATIBILITY IDEOGRAPH-FA21;Lo;0;L;;;;;N;;;;;
+FA22;CJK COMPATIBILITY IDEOGRAPH-FA22;Lo;0;L;8AF8;;;;N;;;;;
+FA23;CJK COMPATIBILITY IDEOGRAPH-FA23;Lo;0;L;;;;;N;;*;;;
+FA24;CJK COMPATIBILITY IDEOGRAPH-FA24;Lo;0;L;;;;;N;;;;;
+FA25;CJK COMPATIBILITY IDEOGRAPH-FA25;Lo;0;L;9038;;;;N;;;;;
+FA26;CJK COMPATIBILITY IDEOGRAPH-FA26;Lo;0;L;90FD;;;;N;;;;;
+FA27;CJK COMPATIBILITY IDEOGRAPH-FA27;Lo;0;L;;;;;N;;;;;
+FA28;CJK COMPATIBILITY IDEOGRAPH-FA28;Lo;0;L;;;;;N;;;;;
+FA29;CJK COMPATIBILITY IDEOGRAPH-FA29;Lo;0;L;;;;;N;;;;;
+FA2A;CJK COMPATIBILITY IDEOGRAPH-FA2A;Lo;0;L;98EF;;;;N;;;;;
+FA2B;CJK COMPATIBILITY IDEOGRAPH-FA2B;Lo;0;L;98FC;;;;N;;;;;
+FA2C;CJK COMPATIBILITY IDEOGRAPH-FA2C;Lo;0;L;9928;;;;N;;;;;
+FA2D;CJK COMPATIBILITY IDEOGRAPH-FA2D;Lo;0;L;9DB4;;;;N;;;;;
+FB00;LATIN SMALL LIGATURE FF;Ll;0;L;<compat> 0066 0066;;;;N;;;;;
+FB01;LATIN SMALL LIGATURE FI;Ll;0;L;<compat> 0066 0069;;;;N;;;;;
+FB02;LATIN SMALL LIGATURE FL;Ll;0;L;<compat> 0066 006C;;;;N;;;;;
+FB03;LATIN SMALL LIGATURE FFI;Ll;0;L;<compat> 0066 0066 0069;;;;N;;;;;
+FB04;LATIN SMALL LIGATURE FFL;Ll;0;L;<compat> 0066 0066 006C;;;;N;;;;;
+FB05;LATIN SMALL LIGATURE LONG S T;Ll;0;L;<compat> 017F 0074;;;;N;;;;;
+FB06;LATIN SMALL LIGATURE ST;Ll;0;L;<compat> 0073 0074;;;;N;;;;;
+FB13;ARMENIAN SMALL LIGATURE MEN NOW;Ll;0;L;<compat> 0574 0576;;;;N;;;;;
+FB14;ARMENIAN SMALL LIGATURE MEN ECH;Ll;0;L;<compat> 0574 0565;;;;N;;;;;
+FB15;ARMENIAN SMALL LIGATURE MEN INI;Ll;0;L;<compat> 0574 056B;;;;N;;;;;
+FB16;ARMENIAN SMALL LIGATURE VEW NOW;Ll;0;L;<compat> 057E 0576;;;;N;;;;;
+FB17;ARMENIAN SMALL LIGATURE MEN XEH;Ll;0;L;<compat> 0574 056D;;;;N;;;;;
+FB1D;HEBREW LETTER YOD WITH HIRIQ;Lo;0;R;05D9 05B4;;;;N;;;;;
+FB1E;HEBREW POINT JUDEO-SPANISH VARIKA;Mn;26;NSM;;;;;N;HEBREW POINT VARIKA;;;;
+FB1F;HEBREW LIGATURE YIDDISH YOD YOD PATAH;Lo;0;R;05F2 05B7;;;;N;;;;;
+FB20;HEBREW LETTER ALTERNATIVE AYIN;Lo;0;R;<font> 05E2;;;;N;;;;;
+FB21;HEBREW LETTER WIDE ALEF;Lo;0;R;<font> 05D0;;;;N;;;;;
+FB22;HEBREW LETTER WIDE DALET;Lo;0;R;<font> 05D3;;;;N;;;;;
+FB23;HEBREW LETTER WIDE HE;Lo;0;R;<font> 05D4;;;;N;;;;;
+FB24;HEBREW LETTER WIDE KAF;Lo;0;R;<font> 05DB;;;;N;;;;;
+FB25;HEBREW LETTER WIDE LAMED;Lo;0;R;<font> 05DC;;;;N;;;;;
+FB26;HEBREW LETTER WIDE FINAL MEM;Lo;0;R;<font> 05DD;;;;N;;;;;
+FB27;HEBREW LETTER WIDE RESH;Lo;0;R;<font> 05E8;;;;N;;;;;
+FB28;HEBREW LETTER WIDE TAV;Lo;0;R;<font> 05EA;;;;N;;;;;
+FB29;HEBREW LETTER ALTERNATIVE PLUS SIGN;Sm;0;ET;<font> 002B;;;;N;;;;;
+FB2A;HEBREW LETTER SHIN WITH SHIN DOT;Lo;0;R;05E9 05C1;;;;N;;;;;
+FB2B;HEBREW LETTER SHIN WITH SIN DOT;Lo;0;R;05E9 05C2;;;;N;;;;;
+FB2C;HEBREW LETTER SHIN WITH DAGESH AND SHIN DOT;Lo;0;R;FB49 05C1;;;;N;;;;;
+FB2D;HEBREW LETTER SHIN WITH DAGESH AND SIN DOT;Lo;0;R;FB49 05C2;;;;N;;;;;
+FB2E;HEBREW LETTER ALEF WITH PATAH;Lo;0;R;05D0 05B7;;;;N;;;;;
+FB2F;HEBREW LETTER ALEF WITH QAMATS;Lo;0;R;05D0 05B8;;;;N;;;;;
+FB30;HEBREW LETTER ALEF WITH MAPIQ;Lo;0;R;05D0 05BC;;;;N;;;;;
+FB31;HEBREW LETTER BET WITH DAGESH;Lo;0;R;05D1 05BC;;;;N;;;;;
+FB32;HEBREW LETTER GIMEL WITH DAGESH;Lo;0;R;05D2 05BC;;;;N;;;;;
+FB33;HEBREW LETTER DALET WITH DAGESH;Lo;0;R;05D3 05BC;;;;N;;;;;
+FB34;HEBREW LETTER HE WITH MAPIQ;Lo;0;R;05D4 05BC;;;;N;;;;;
+FB35;HEBREW LETTER VAV WITH DAGESH;Lo;0;R;05D5 05BC;;;;N;;;;;
+FB36;HEBREW LETTER ZAYIN WITH DAGESH;Lo;0;R;05D6 05BC;;;;N;;;;;
+FB38;HEBREW LETTER TET WITH DAGESH;Lo;0;R;05D8 05BC;;;;N;;;;;
+FB39;HEBREW LETTER YOD WITH DAGESH;Lo;0;R;05D9 05BC;;;;N;;;;;
+FB3A;HEBREW LETTER FINAL KAF WITH DAGESH;Lo;0;R;05DA 05BC;;;;N;;;;;
+FB3B;HEBREW LETTER KAF WITH DAGESH;Lo;0;R;05DB 05BC;;;;N;;;;;
+FB3C;HEBREW LETTER LAMED WITH DAGESH;Lo;0;R;05DC 05BC;;;;N;;;;;
+FB3E;HEBREW LETTER MEM WITH DAGESH;Lo;0;R;05DE 05BC;;;;N;;;;;
+FB40;HEBREW LETTER NUN WITH DAGESH;Lo;0;R;05E0 05BC;;;;N;;;;;
+FB41;HEBREW LETTER SAMEKH WITH DAGESH;Lo;0;R;05E1 05BC;;;;N;;;;;
+FB43;HEBREW LETTER FINAL PE WITH DAGESH;Lo;0;R;05E3 05BC;;;;N;;;;;
+FB44;HEBREW LETTER PE WITH DAGESH;Lo;0;R;05E4 05BC;;;;N;;;;;
+FB46;HEBREW LETTER TSADI WITH DAGESH;Lo;0;R;05E6 05BC;;;;N;;;;;
+FB47;HEBREW LETTER QOF WITH DAGESH;Lo;0;R;05E7 05BC;;;;N;;;;;
+FB48;HEBREW LETTER RESH WITH DAGESH;Lo;0;R;05E8 05BC;;;;N;;;;;
+FB49;HEBREW LETTER SHIN WITH DAGESH;Lo;0;R;05E9 05BC;;;;N;;;;;
+FB4A;HEBREW LETTER TAV WITH DAGESH;Lo;0;R;05EA 05BC;;;;N;;;;;
+FB4B;HEBREW LETTER VAV WITH HOLAM;Lo;0;R;05D5 05B9;;;;N;;;;;
+FB4C;HEBREW LETTER BET WITH RAFE;Lo;0;R;05D1 05BF;;;;N;;;;;
+FB4D;HEBREW LETTER KAF WITH RAFE;Lo;0;R;05DB 05BF;;;;N;;;;;
+FB4E;HEBREW LETTER PE WITH RAFE;Lo;0;R;05E4 05BF;;;;N;;;;;
+FB4F;HEBREW LIGATURE ALEF LAMED;Lo;0;R;<compat> 05D0 05DC;;;;N;;;;;
+FB50;ARABIC LETTER ALEF WASLA ISOLATED FORM;Lo;0;AL;<isolated> 0671;;;;N;;;;;
+FB51;ARABIC LETTER ALEF WASLA FINAL FORM;Lo;0;AL;<final> 0671;;;;N;;;;;
+FB52;ARABIC LETTER BEEH ISOLATED FORM;Lo;0;AL;<isolated> 067B;;;;N;;;;;
+FB53;ARABIC LETTER BEEH FINAL FORM;Lo;0;AL;<final> 067B;;;;N;;;;;
+FB54;ARABIC LETTER BEEH INITIAL FORM;Lo;0;AL;<initial> 067B;;;;N;;;;;
+FB55;ARABIC LETTER BEEH MEDIAL FORM;Lo;0;AL;<medial> 067B;;;;N;;;;;
+FB56;ARABIC LETTER PEH ISOLATED FORM;Lo;0;AL;<isolated> 067E;;;;N;;;;;
+FB57;ARABIC LETTER PEH FINAL FORM;Lo;0;AL;<final> 067E;;;;N;;;;;
+FB58;ARABIC LETTER PEH INITIAL FORM;Lo;0;AL;<initial> 067E;;;;N;;;;;
+FB59;ARABIC LETTER PEH MEDIAL FORM;Lo;0;AL;<medial> 067E;;;;N;;;;;
+FB5A;ARABIC LETTER BEHEH ISOLATED FORM;Lo;0;AL;<isolated> 0680;;;;N;;;;;
+FB5B;ARABIC LETTER BEHEH FINAL FORM;Lo;0;AL;<final> 0680;;;;N;;;;;
+FB5C;ARABIC LETTER BEHEH INITIAL FORM;Lo;0;AL;<initial> 0680;;;;N;;;;;
+FB5D;ARABIC LETTER BEHEH MEDIAL FORM;Lo;0;AL;<medial> 0680;;;;N;;;;;
+FB5E;ARABIC LETTER TTEHEH ISOLATED FORM;Lo;0;AL;<isolated> 067A;;;;N;;;;;
+FB5F;ARABIC LETTER TTEHEH FINAL FORM;Lo;0;AL;<final> 067A;;;;N;;;;;
+FB60;ARABIC LETTER TTEHEH INITIAL FORM;Lo;0;AL;<initial> 067A;;;;N;;;;;
+FB61;ARABIC LETTER TTEHEH MEDIAL FORM;Lo;0;AL;<medial> 067A;;;;N;;;;;
+FB62;ARABIC LETTER TEHEH ISOLATED FORM;Lo;0;AL;<isolated> 067F;;;;N;;;;;
+FB63;ARABIC LETTER TEHEH FINAL FORM;Lo;0;AL;<final> 067F;;;;N;;;;;
+FB64;ARABIC LETTER TEHEH INITIAL FORM;Lo;0;AL;<initial> 067F;;;;N;;;;;
+FB65;ARABIC LETTER TEHEH MEDIAL FORM;Lo;0;AL;<medial> 067F;;;;N;;;;;
+FB66;ARABIC LETTER TTEH ISOLATED FORM;Lo;0;AL;<isolated> 0679;;;;N;;;;;
+FB67;ARABIC LETTER TTEH FINAL FORM;Lo;0;AL;<final> 0679;;;;N;;;;;
+FB68;ARABIC LETTER TTEH INITIAL FORM;Lo;0;AL;<initial> 0679;;;;N;;;;;
+FB69;ARABIC LETTER TTEH MEDIAL FORM;Lo;0;AL;<medial> 0679;;;;N;;;;;
+FB6A;ARABIC LETTER VEH ISOLATED FORM;Lo;0;AL;<isolated> 06A4;;;;N;;;;;
+FB6B;ARABIC LETTER VEH FINAL FORM;Lo;0;AL;<final> 06A4;;;;N;;;;;
+FB6C;ARABIC LETTER VEH INITIAL FORM;Lo;0;AL;<initial> 06A4;;;;N;;;;;
+FB6D;ARABIC LETTER VEH MEDIAL FORM;Lo;0;AL;<medial> 06A4;;;;N;;;;;
+FB6E;ARABIC LETTER PEHEH ISOLATED FORM;Lo;0;AL;<isolated> 06A6;;;;N;;;;;
+FB6F;ARABIC LETTER PEHEH FINAL FORM;Lo;0;AL;<final> 06A6;;;;N;;;;;
+FB70;ARABIC LETTER PEHEH INITIAL FORM;Lo;0;AL;<initial> 06A6;;;;N;;;;;
+FB71;ARABIC LETTER PEHEH MEDIAL FORM;Lo;0;AL;<medial> 06A6;;;;N;;;;;
+FB72;ARABIC LETTER DYEH ISOLATED FORM;Lo;0;AL;<isolated> 0684;;;;N;;;;;
+FB73;ARABIC LETTER DYEH FINAL FORM;Lo;0;AL;<final> 0684;;;;N;;;;;
+FB74;ARABIC LETTER DYEH INITIAL FORM;Lo;0;AL;<initial> 0684;;;;N;;;;;
+FB75;ARABIC LETTER DYEH MEDIAL FORM;Lo;0;AL;<medial> 0684;;;;N;;;;;
+FB76;ARABIC LETTER NYEH ISOLATED FORM;Lo;0;AL;<isolated> 0683;;;;N;;;;;
+FB77;ARABIC LETTER NYEH FINAL FORM;Lo;0;AL;<final> 0683;;;;N;;;;;
+FB78;ARABIC LETTER NYEH INITIAL FORM;Lo;0;AL;<initial> 0683;;;;N;;;;;
+FB79;ARABIC LETTER NYEH MEDIAL FORM;Lo;0;AL;<medial> 0683;;;;N;;;;;
+FB7A;ARABIC LETTER TCHEH ISOLATED FORM;Lo;0;AL;<isolated> 0686;;;;N;;;;;
+FB7B;ARABIC LETTER TCHEH FINAL FORM;Lo;0;AL;<final> 0686;;;;N;;;;;
+FB7C;ARABIC LETTER TCHEH INITIAL FORM;Lo;0;AL;<initial> 0686;;;;N;;;;;
+FB7D;ARABIC LETTER TCHEH MEDIAL FORM;Lo;0;AL;<medial> 0686;;;;N;;;;;
+FB7E;ARABIC LETTER TCHEHEH ISOLATED FORM;Lo;0;AL;<isolated> 0687;;;;N;;;;;
+FB7F;ARABIC LETTER TCHEHEH FINAL FORM;Lo;0;AL;<final> 0687;;;;N;;;;;
+FB80;ARABIC LETTER TCHEHEH INITIAL FORM;Lo;0;AL;<initial> 0687;;;;N;;;;;
+FB81;ARABIC LETTER TCHEHEH MEDIAL FORM;Lo;0;AL;<medial> 0687;;;;N;;;;;
+FB82;ARABIC LETTER DDAHAL ISOLATED FORM;Lo;0;AL;<isolated> 068D;;;;N;;;;;
+FB83;ARABIC LETTER DDAHAL FINAL FORM;Lo;0;AL;<final> 068D;;;;N;;;;;
+FB84;ARABIC LETTER DAHAL ISOLATED FORM;Lo;0;AL;<isolated> 068C;;;;N;;;;;
+FB85;ARABIC LETTER DAHAL FINAL FORM;Lo;0;AL;<final> 068C;;;;N;;;;;
+FB86;ARABIC LETTER DUL ISOLATED FORM;Lo;0;AL;<isolated> 068E;;;;N;;;;;
+FB87;ARABIC LETTER DUL FINAL FORM;Lo;0;AL;<final> 068E;;;;N;;;;;
+FB88;ARABIC LETTER DDAL ISOLATED FORM;Lo;0;AL;<isolated> 0688;;;;N;;;;;
+FB89;ARABIC LETTER DDAL FINAL FORM;Lo;0;AL;<final> 0688;;;;N;;;;;
+FB8A;ARABIC LETTER JEH ISOLATED FORM;Lo;0;AL;<isolated> 0698;;;;N;;;;;
+FB8B;ARABIC LETTER JEH FINAL FORM;Lo;0;AL;<final> 0698;;;;N;;;;;
+FB8C;ARABIC LETTER RREH ISOLATED FORM;Lo;0;AL;<isolated> 0691;;;;N;;;;;
+FB8D;ARABIC LETTER RREH FINAL FORM;Lo;0;AL;<final> 0691;;;;N;;;;;
+FB8E;ARABIC LETTER KEHEH ISOLATED FORM;Lo;0;AL;<isolated> 06A9;;;;N;;;;;
+FB8F;ARABIC LETTER KEHEH FINAL FORM;Lo;0;AL;<final> 06A9;;;;N;;;;;
+FB90;ARABIC LETTER KEHEH INITIAL FORM;Lo;0;AL;<initial> 06A9;;;;N;;;;;
+FB91;ARABIC LETTER KEHEH MEDIAL FORM;Lo;0;AL;<medial> 06A9;;;;N;;;;;
+FB92;ARABIC LETTER GAF ISOLATED FORM;Lo;0;AL;<isolated> 06AF;;;;N;;;;;
+FB93;ARABIC LETTER GAF FINAL FORM;Lo;0;AL;<final> 06AF;;;;N;;;;;
+FB94;ARABIC LETTER GAF INITIAL FORM;Lo;0;AL;<initial> 06AF;;;;N;;;;;
+FB95;ARABIC LETTER GAF MEDIAL FORM;Lo;0;AL;<medial> 06AF;;;;N;;;;;
+FB96;ARABIC LETTER GUEH ISOLATED FORM;Lo;0;AL;<isolated> 06B3;;;;N;;;;;
+FB97;ARABIC LETTER GUEH FINAL FORM;Lo;0;AL;<final> 06B3;;;;N;;;;;
+FB98;ARABIC LETTER GUEH INITIAL FORM;Lo;0;AL;<initial> 06B3;;;;N;;;;;
+FB99;ARABIC LETTER GUEH MEDIAL FORM;Lo;0;AL;<medial> 06B3;;;;N;;;;;
+FB9A;ARABIC LETTER NGOEH ISOLATED FORM;Lo;0;AL;<isolated> 06B1;;;;N;;;;;
+FB9B;ARABIC LETTER NGOEH FINAL FORM;Lo;0;AL;<final> 06B1;;;;N;;;;;
+FB9C;ARABIC LETTER NGOEH INITIAL FORM;Lo;0;AL;<initial> 06B1;;;;N;;;;;
+FB9D;ARABIC LETTER NGOEH MEDIAL FORM;Lo;0;AL;<medial> 06B1;;;;N;;;;;
+FB9E;ARABIC LETTER NOON GHUNNA ISOLATED FORM;Lo;0;AL;<isolated> 06BA;;;;N;;;;;
+FB9F;ARABIC LETTER NOON GHUNNA FINAL FORM;Lo;0;AL;<final> 06BA;;;;N;;;;;
+FBA0;ARABIC LETTER RNOON ISOLATED FORM;Lo;0;AL;<isolated> 06BB;;;;N;;;;;
+FBA1;ARABIC LETTER RNOON FINAL FORM;Lo;0;AL;<final> 06BB;;;;N;;;;;
+FBA2;ARABIC LETTER RNOON INITIAL FORM;Lo;0;AL;<initial> 06BB;;;;N;;;;;
+FBA3;ARABIC LETTER RNOON MEDIAL FORM;Lo;0;AL;<medial> 06BB;;;;N;;;;;
+FBA4;ARABIC LETTER HEH WITH YEH ABOVE ISOLATED FORM;Lo;0;AL;<isolated> 06C0;;;;N;;;;;
+FBA5;ARABIC LETTER HEH WITH YEH ABOVE FINAL FORM;Lo;0;AL;<final> 06C0;;;;N;;;;;
+FBA6;ARABIC LETTER HEH GOAL ISOLATED FORM;Lo;0;AL;<isolated> 06C1;;;;N;;;;;
+FBA7;ARABIC LETTER HEH GOAL FINAL FORM;Lo;0;AL;<final> 06C1;;;;N;;;;;
+FBA8;ARABIC LETTER HEH GOAL INITIAL FORM;Lo;0;AL;<initial> 06C1;;;;N;;;;;
+FBA9;ARABIC LETTER HEH GOAL MEDIAL FORM;Lo;0;AL;<medial> 06C1;;;;N;;;;;
+FBAA;ARABIC LETTER HEH DOACHASHMEE ISOLATED FORM;Lo;0;AL;<isolated> 06BE;;;;N;;;;;
+FBAB;ARABIC LETTER HEH DOACHASHMEE FINAL FORM;Lo;0;AL;<final> 06BE;;;;N;;;;;
+FBAC;ARABIC LETTER HEH DOACHASHMEE INITIAL FORM;Lo;0;AL;<initial> 06BE;;;;N;;;;;
+FBAD;ARABIC LETTER HEH DOACHASHMEE MEDIAL FORM;Lo;0;AL;<medial> 06BE;;;;N;;;;;
+FBAE;ARABIC LETTER YEH BARREE ISOLATED FORM;Lo;0;AL;<isolated> 06D2;;;;N;;;;;
+FBAF;ARABIC LETTER YEH BARREE FINAL FORM;Lo;0;AL;<final> 06D2;;;;N;;;;;
+FBB0;ARABIC LETTER YEH BARREE WITH HAMZA ABOVE ISOLATED FORM;Lo;0;AL;<isolated> 06D3;;;;N;;;;;
+FBB1;ARABIC LETTER YEH BARREE WITH HAMZA ABOVE FINAL FORM;Lo;0;AL;<final> 06D3;;;;N;;;;;
+FBD3;ARABIC LETTER NG ISOLATED FORM;Lo;0;AL;<isolated> 06AD;;;;N;;;;;
+FBD4;ARABIC LETTER NG FINAL FORM;Lo;0;AL;<final> 06AD;;;;N;;;;;
+FBD5;ARABIC LETTER NG INITIAL FORM;Lo;0;AL;<initial> 06AD;;;;N;;;;;
+FBD6;ARABIC LETTER NG MEDIAL FORM;Lo;0;AL;<medial> 06AD;;;;N;;;;;
+FBD7;ARABIC LETTER U ISOLATED FORM;Lo;0;AL;<isolated> 06C7;;;;N;;;;;
+FBD8;ARABIC LETTER U FINAL FORM;Lo;0;AL;<final> 06C7;;;;N;;;;;
+FBD9;ARABIC LETTER OE ISOLATED FORM;Lo;0;AL;<isolated> 06C6;;;;N;;;;;
+FBDA;ARABIC LETTER OE FINAL FORM;Lo;0;AL;<final> 06C6;;;;N;;;;;
+FBDB;ARABIC LETTER YU ISOLATED FORM;Lo;0;AL;<isolated> 06C8;;;;N;;;;;
+FBDC;ARABIC LETTER YU FINAL FORM;Lo;0;AL;<final> 06C8;;;;N;;;;;
+FBDD;ARABIC LETTER U WITH HAMZA ABOVE ISOLATED FORM;Lo;0;AL;<isolated> 0677;;;;N;;;;;
+FBDE;ARABIC LETTER VE ISOLATED FORM;Lo;0;AL;<isolated> 06CB;;;;N;;;;;
+FBDF;ARABIC LETTER VE FINAL FORM;Lo;0;AL;<final> 06CB;;;;N;;;;;
+FBE0;ARABIC LETTER KIRGHIZ OE ISOLATED FORM;Lo;0;AL;<isolated> 06C5;;;;N;;;;;
+FBE1;ARABIC LETTER KIRGHIZ OE FINAL FORM;Lo;0;AL;<final> 06C5;;;;N;;;;;
+FBE2;ARABIC LETTER KIRGHIZ YU ISOLATED FORM;Lo;0;AL;<isolated> 06C9;;;;N;;;;;
+FBE3;ARABIC LETTER KIRGHIZ YU FINAL FORM;Lo;0;AL;<final> 06C9;;;;N;;;;;
+FBE4;ARABIC LETTER E ISOLATED FORM;Lo;0;AL;<isolated> 06D0;;;;N;;;;;
+FBE5;ARABIC LETTER E FINAL FORM;Lo;0;AL;<final> 06D0;;;;N;;;;;
+FBE6;ARABIC LETTER E INITIAL FORM;Lo;0;AL;<initial> 06D0;;;;N;;;;;
+FBE7;ARABIC LETTER E MEDIAL FORM;Lo;0;AL;<medial> 06D0;;;;N;;;;;
+FBE8;ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA INITIAL FORM;Lo;0;AL;<initial> 0649;;;;N;;;;;
+FBE9;ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA MEDIAL FORM;Lo;0;AL;<medial> 0649;;;;N;;;;;
+FBEA;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF ISOLATED FORM;Lo;0;AL;<isolated> 0626 0627;;;;N;;;;;
+FBEB;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF FINAL FORM;Lo;0;AL;<final> 0626 0627;;;;N;;;;;
+FBEC;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE ISOLATED FORM;Lo;0;AL;<isolated> 0626 06D5;;;;N;;;;;
+FBED;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE FINAL FORM;Lo;0;AL;<final> 0626 06D5;;;;N;;;;;
+FBEE;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW ISOLATED FORM;Lo;0;AL;<isolated> 0626 0648;;;;N;;;;;
+FBEF;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW FINAL FORM;Lo;0;AL;<final> 0626 0648;;;;N;;;;;
+FBF0;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U ISOLATED FORM;Lo;0;AL;<isolated> 0626 06C7;;;;N;;;;;
+FBF1;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U FINAL FORM;Lo;0;AL;<final> 0626 06C7;;;;N;;;;;
+FBF2;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE ISOLATED FORM;Lo;0;AL;<isolated> 0626 06C6;;;;N;;;;;
+FBF3;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE FINAL FORM;Lo;0;AL;<final> 0626 06C6;;;;N;;;;;
+FBF4;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU ISOLATED FORM;Lo;0;AL;<isolated> 0626 06C8;;;;N;;;;;
+FBF5;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU FINAL FORM;Lo;0;AL;<final> 0626 06C8;;;;N;;;;;
+FBF6;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E ISOLATED FORM;Lo;0;AL;<isolated> 0626 06D0;;;;N;;;;;
+FBF7;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E FINAL FORM;Lo;0;AL;<final> 0626 06D0;;;;N;;;;;
+FBF8;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E INITIAL FORM;Lo;0;AL;<initial> 0626 06D0;;;;N;;;;;
+FBF9;ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0626 0649;;;;N;;;;;
+FBFA;ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0626 0649;;;;N;;;;;
+FBFB;ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA INITIAL FORM;Lo;0;AL;<initial> 0626 0649;;;;N;;;;;
+FBFC;ARABIC LETTER FARSI YEH ISOLATED FORM;Lo;0;AL;<isolated> 06CC;;;;N;;;;;
+FBFD;ARABIC LETTER FARSI YEH FINAL FORM;Lo;0;AL;<final> 06CC;;;;N;;;;;
+FBFE;ARABIC LETTER FARSI YEH INITIAL FORM;Lo;0;AL;<initial> 06CC;;;;N;;;;;
+FBFF;ARABIC LETTER FARSI YEH MEDIAL FORM;Lo;0;AL;<medial> 06CC;;;;N;;;;;
+FC00;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 0626 062C;;;;N;;;;;
+FC01;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 0626 062D;;;;N;;;;;
+FC02;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0626 0645;;;;N;;;;;
+FC03;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0626 0649;;;;N;;;;;
+FC04;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0626 064A;;;;N;;;;;
+FC05;ARABIC LIGATURE BEH WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 0628 062C;;;;N;;;;;
+FC06;ARABIC LIGATURE BEH WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 0628 062D;;;;N;;;;;
+FC07;ARABIC LIGATURE BEH WITH KHAH ISOLATED FORM;Lo;0;AL;<isolated> 0628 062E;;;;N;;;;;
+FC08;ARABIC LIGATURE BEH WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0628 0645;;;;N;;;;;
+FC09;ARABIC LIGATURE BEH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0628 0649;;;;N;;;;;
+FC0A;ARABIC LIGATURE BEH WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0628 064A;;;;N;;;;;
+FC0B;ARABIC LIGATURE TEH WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 062A 062C;;;;N;;;;;
+FC0C;ARABIC LIGATURE TEH WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 062A 062D;;;;N;;;;;
+FC0D;ARABIC LIGATURE TEH WITH KHAH ISOLATED FORM;Lo;0;AL;<isolated> 062A 062E;;;;N;;;;;
+FC0E;ARABIC LIGATURE TEH WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 062A 0645;;;;N;;;;;
+FC0F;ARABIC LIGATURE TEH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 062A 0649;;;;N;;;;;
+FC10;ARABIC LIGATURE TEH WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 062A 064A;;;;N;;;;;
+FC11;ARABIC LIGATURE THEH WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 062B 062C;;;;N;;;;;
+FC12;ARABIC LIGATURE THEH WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 062B 0645;;;;N;;;;;
+FC13;ARABIC LIGATURE THEH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 062B 0649;;;;N;;;;;
+FC14;ARABIC LIGATURE THEH WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 062B 064A;;;;N;;;;;
+FC15;ARABIC LIGATURE JEEM WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 062C 062D;;;;N;;;;;
+FC16;ARABIC LIGATURE JEEM WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 062C 0645;;;;N;;;;;
+FC17;ARABIC LIGATURE HAH WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 062D 062C;;;;N;;;;;
+FC18;ARABIC LIGATURE HAH WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 062D 0645;;;;N;;;;;
+FC19;ARABIC LIGATURE KHAH WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 062E 062C;;;;N;;;;;
+FC1A;ARABIC LIGATURE KHAH WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 062E 062D;;;;N;;;;;
+FC1B;ARABIC LIGATURE KHAH WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 062E 0645;;;;N;;;;;
+FC1C;ARABIC LIGATURE SEEN WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 0633 062C;;;;N;;;;;
+FC1D;ARABIC LIGATURE SEEN WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 0633 062D;;;;N;;;;;
+FC1E;ARABIC LIGATURE SEEN WITH KHAH ISOLATED FORM;Lo;0;AL;<isolated> 0633 062E;;;;N;;;;;
+FC1F;ARABIC LIGATURE SEEN WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0633 0645;;;;N;;;;;
+FC20;ARABIC LIGATURE SAD WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 0635 062D;;;;N;;;;;
+FC21;ARABIC LIGATURE SAD WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0635 0645;;;;N;;;;;
+FC22;ARABIC LIGATURE DAD WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 0636 062C;;;;N;;;;;
+FC23;ARABIC LIGATURE DAD WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 0636 062D;;;;N;;;;;
+FC24;ARABIC LIGATURE DAD WITH KHAH ISOLATED FORM;Lo;0;AL;<isolated> 0636 062E;;;;N;;;;;
+FC25;ARABIC LIGATURE DAD WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0636 0645;;;;N;;;;;
+FC26;ARABIC LIGATURE TAH WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 0637 062D;;;;N;;;;;
+FC27;ARABIC LIGATURE TAH WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0637 0645;;;;N;;;;;
+FC28;ARABIC LIGATURE ZAH WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0638 0645;;;;N;;;;;
+FC29;ARABIC LIGATURE AIN WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 0639 062C;;;;N;;;;;
+FC2A;ARABIC LIGATURE AIN WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0639 0645;;;;N;;;;;
+FC2B;ARABIC LIGATURE GHAIN WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 063A 062C;;;;N;;;;;
+FC2C;ARABIC LIGATURE GHAIN WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 063A 0645;;;;N;;;;;
+FC2D;ARABIC LIGATURE FEH WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 0641 062C;;;;N;;;;;
+FC2E;ARABIC LIGATURE FEH WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 0641 062D;;;;N;;;;;
+FC2F;ARABIC LIGATURE FEH WITH KHAH ISOLATED FORM;Lo;0;AL;<isolated> 0641 062E;;;;N;;;;;
+FC30;ARABIC LIGATURE FEH WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0641 0645;;;;N;;;;;
+FC31;ARABIC LIGATURE FEH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0641 0649;;;;N;;;;;
+FC32;ARABIC LIGATURE FEH WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0641 064A;;;;N;;;;;
+FC33;ARABIC LIGATURE QAF WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 0642 062D;;;;N;;;;;
+FC34;ARABIC LIGATURE QAF WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0642 0645;;;;N;;;;;
+FC35;ARABIC LIGATURE QAF WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0642 0649;;;;N;;;;;
+FC36;ARABIC LIGATURE QAF WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0642 064A;;;;N;;;;;
+FC37;ARABIC LIGATURE KAF WITH ALEF ISOLATED FORM;Lo;0;AL;<isolated> 0643 0627;;;;N;;;;;
+FC38;ARABIC LIGATURE KAF WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 0643 062C;;;;N;;;;;
+FC39;ARABIC LIGATURE KAF WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 0643 062D;;;;N;;;;;
+FC3A;ARABIC LIGATURE KAF WITH KHAH ISOLATED FORM;Lo;0;AL;<isolated> 0643 062E;;;;N;;;;;
+FC3B;ARABIC LIGATURE KAF WITH LAM ISOLATED FORM;Lo;0;AL;<isolated> 0643 0644;;;;N;;;;;
+FC3C;ARABIC LIGATURE KAF WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0643 0645;;;;N;;;;;
+FC3D;ARABIC LIGATURE KAF WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0643 0649;;;;N;;;;;
+FC3E;ARABIC LIGATURE KAF WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0643 064A;;;;N;;;;;
+FC3F;ARABIC LIGATURE LAM WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 0644 062C;;;;N;;;;;
+FC40;ARABIC LIGATURE LAM WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 0644 062D;;;;N;;;;;
+FC41;ARABIC LIGATURE LAM WITH KHAH ISOLATED FORM;Lo;0;AL;<isolated> 0644 062E;;;;N;;;;;
+FC42;ARABIC LIGATURE LAM WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0644 0645;;;;N;;;;;
+FC43;ARABIC LIGATURE LAM WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0644 0649;;;;N;;;;;
+FC44;ARABIC LIGATURE LAM WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0644 064A;;;;N;;;;;
+FC45;ARABIC LIGATURE MEEM WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 0645 062C;;;;N;;;;;
+FC46;ARABIC LIGATURE MEEM WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 0645 062D;;;;N;;;;;
+FC47;ARABIC LIGATURE MEEM WITH KHAH ISOLATED FORM;Lo;0;AL;<isolated> 0645 062E;;;;N;;;;;
+FC48;ARABIC LIGATURE MEEM WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0645 0645;;;;N;;;;;
+FC49;ARABIC LIGATURE MEEM WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0645 0649;;;;N;;;;;
+FC4A;ARABIC LIGATURE MEEM WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0645 064A;;;;N;;;;;
+FC4B;ARABIC LIGATURE NOON WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 0646 062C;;;;N;;;;;
+FC4C;ARABIC LIGATURE NOON WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 0646 062D;;;;N;;;;;
+FC4D;ARABIC LIGATURE NOON WITH KHAH ISOLATED FORM;Lo;0;AL;<isolated> 0646 062E;;;;N;;;;;
+FC4E;ARABIC LIGATURE NOON WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0646 0645;;;;N;;;;;
+FC4F;ARABIC LIGATURE NOON WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0646 0649;;;;N;;;;;
+FC50;ARABIC LIGATURE NOON WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0646 064A;;;;N;;;;;
+FC51;ARABIC LIGATURE HEH WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 0647 062C;;;;N;;;;;
+FC52;ARABIC LIGATURE HEH WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0647 0645;;;;N;;;;;
+FC53;ARABIC LIGATURE HEH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0647 0649;;;;N;;;;;
+FC54;ARABIC LIGATURE HEH WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0647 064A;;;;N;;;;;
+FC55;ARABIC LIGATURE YEH WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 064A 062C;;;;N;;;;;
+FC56;ARABIC LIGATURE YEH WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 064A 062D;;;;N;;;;;
+FC57;ARABIC LIGATURE YEH WITH KHAH ISOLATED FORM;Lo;0;AL;<isolated> 064A 062E;;;;N;;;;;
+FC58;ARABIC LIGATURE YEH WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 064A 0645;;;;N;;;;;
+FC59;ARABIC LIGATURE YEH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 064A 0649;;;;N;;;;;
+FC5A;ARABIC LIGATURE YEH WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 064A 064A;;;;N;;;;;
+FC5B;ARABIC LIGATURE THAL WITH SUPERSCRIPT ALEF ISOLATED FORM;Lo;0;AL;<isolated> 0630 0670;;;;N;;;;;
+FC5C;ARABIC LIGATURE REH WITH SUPERSCRIPT ALEF ISOLATED FORM;Lo;0;AL;<isolated> 0631 0670;;;;N;;;;;
+FC5D;ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF ISOLATED FORM;Lo;0;AL;<isolated> 0649 0670;;;;N;;;;;
+FC5E;ARABIC LIGATURE SHADDA WITH DAMMATAN ISOLATED FORM;Lo;0;AL;<isolated> 0020 064C 0651;;;;N;;;;;
+FC5F;ARABIC LIGATURE SHADDA WITH KASRATAN ISOLATED FORM;Lo;0;AL;<isolated> 0020 064D 0651;;;;N;;;;;
+FC60;ARABIC LIGATURE SHADDA WITH FATHA ISOLATED FORM;Lo;0;AL;<isolated> 0020 064E 0651;;;;N;;;;;
+FC61;ARABIC LIGATURE SHADDA WITH DAMMA ISOLATED FORM;Lo;0;AL;<isolated> 0020 064F 0651;;;;N;;;;;
+FC62;ARABIC LIGATURE SHADDA WITH KASRA ISOLATED FORM;Lo;0;AL;<isolated> 0020 0650 0651;;;;N;;;;;
+FC63;ARABIC LIGATURE SHADDA WITH SUPERSCRIPT ALEF ISOLATED FORM;Lo;0;AL;<isolated> 0020 0651 0670;;;;N;;;;;
+FC64;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH REH FINAL FORM;Lo;0;AL;<final> 0626 0631;;;;N;;;;;
+FC65;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ZAIN FINAL FORM;Lo;0;AL;<final> 0626 0632;;;;N;;;;;
+FC66;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM FINAL FORM;Lo;0;AL;<final> 0626 0645;;;;N;;;;;
+FC67;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH NOON FINAL FORM;Lo;0;AL;<final> 0626 0646;;;;N;;;;;
+FC68;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0626 0649;;;;N;;;;;
+FC69;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH FINAL FORM;Lo;0;AL;<final> 0626 064A;;;;N;;;;;
+FC6A;ARABIC LIGATURE BEH WITH REH FINAL FORM;Lo;0;AL;<final> 0628 0631;;;;N;;;;;
+FC6B;ARABIC LIGATURE BEH WITH ZAIN FINAL FORM;Lo;0;AL;<final> 0628 0632;;;;N;;;;;
+FC6C;ARABIC LIGATURE BEH WITH MEEM FINAL FORM;Lo;0;AL;<final> 0628 0645;;;;N;;;;;
+FC6D;ARABIC LIGATURE BEH WITH NOON FINAL FORM;Lo;0;AL;<final> 0628 0646;;;;N;;;;;
+FC6E;ARABIC LIGATURE BEH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0628 0649;;;;N;;;;;
+FC6F;ARABIC LIGATURE BEH WITH YEH FINAL FORM;Lo;0;AL;<final> 0628 064A;;;;N;;;;;
+FC70;ARABIC LIGATURE TEH WITH REH FINAL FORM;Lo;0;AL;<final> 062A 0631;;;;N;;;;;
+FC71;ARABIC LIGATURE TEH WITH ZAIN FINAL FORM;Lo;0;AL;<final> 062A 0632;;;;N;;;;;
+FC72;ARABIC LIGATURE TEH WITH MEEM FINAL FORM;Lo;0;AL;<final> 062A 0645;;;;N;;;;;
+FC73;ARABIC LIGATURE TEH WITH NOON FINAL FORM;Lo;0;AL;<final> 062A 0646;;;;N;;;;;
+FC74;ARABIC LIGATURE TEH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 062A 0649;;;;N;;;;;
+FC75;ARABIC LIGATURE TEH WITH YEH FINAL FORM;Lo;0;AL;<final> 062A 064A;;;;N;;;;;
+FC76;ARABIC LIGATURE THEH WITH REH FINAL FORM;Lo;0;AL;<final> 062B 0631;;;;N;;;;;
+FC77;ARABIC LIGATURE THEH WITH ZAIN FINAL FORM;Lo;0;AL;<final> 062B 0632;;;;N;;;;;
+FC78;ARABIC LIGATURE THEH WITH MEEM FINAL FORM;Lo;0;AL;<final> 062B 0645;;;;N;;;;;
+FC79;ARABIC LIGATURE THEH WITH NOON FINAL FORM;Lo;0;AL;<final> 062B 0646;;;;N;;;;;
+FC7A;ARABIC LIGATURE THEH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 062B 0649;;;;N;;;;;
+FC7B;ARABIC LIGATURE THEH WITH YEH FINAL FORM;Lo;0;AL;<final> 062B 064A;;;;N;;;;;
+FC7C;ARABIC LIGATURE FEH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0641 0649;;;;N;;;;;
+FC7D;ARABIC LIGATURE FEH WITH YEH FINAL FORM;Lo;0;AL;<final> 0641 064A;;;;N;;;;;
+FC7E;ARABIC LIGATURE QAF WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0642 0649;;;;N;;;;;
+FC7F;ARABIC LIGATURE QAF WITH YEH FINAL FORM;Lo;0;AL;<final> 0642 064A;;;;N;;;;;
+FC80;ARABIC LIGATURE KAF WITH ALEF FINAL FORM;Lo;0;AL;<final> 0643 0627;;;;N;;;;;
+FC81;ARABIC LIGATURE KAF WITH LAM FINAL FORM;Lo;0;AL;<final> 0643 0644;;;;N;;;;;
+FC82;ARABIC LIGATURE KAF WITH MEEM FINAL FORM;Lo;0;AL;<final> 0643 0645;;;;N;;;;;
+FC83;ARABIC LIGATURE KAF WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0643 0649;;;;N;;;;;
+FC84;ARABIC LIGATURE KAF WITH YEH FINAL FORM;Lo;0;AL;<final> 0643 064A;;;;N;;;;;
+FC85;ARABIC LIGATURE LAM WITH MEEM FINAL FORM;Lo;0;AL;<final> 0644 0645;;;;N;;;;;
+FC86;ARABIC LIGATURE LAM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0644 0649;;;;N;;;;;
+FC87;ARABIC LIGATURE LAM WITH YEH FINAL FORM;Lo;0;AL;<final> 0644 064A;;;;N;;;;;
+FC88;ARABIC LIGATURE MEEM WITH ALEF FINAL FORM;Lo;0;AL;<final> 0645 0627;;;;N;;;;;
+FC89;ARABIC LIGATURE MEEM WITH MEEM FINAL FORM;Lo;0;AL;<final> 0645 0645;;;;N;;;;;
+FC8A;ARABIC LIGATURE NOON WITH REH FINAL FORM;Lo;0;AL;<final> 0646 0631;;;;N;;;;;
+FC8B;ARABIC LIGATURE NOON WITH ZAIN FINAL FORM;Lo;0;AL;<final> 0646 0632;;;;N;;;;;
+FC8C;ARABIC LIGATURE NOON WITH MEEM FINAL FORM;Lo;0;AL;<final> 0646 0645;;;;N;;;;;
+FC8D;ARABIC LIGATURE NOON WITH NOON FINAL FORM;Lo;0;AL;<final> 0646 0646;;;;N;;;;;
+FC8E;ARABIC LIGATURE NOON WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0646 0649;;;;N;;;;;
+FC8F;ARABIC LIGATURE NOON WITH YEH FINAL FORM;Lo;0;AL;<final> 0646 064A;;;;N;;;;;
+FC90;ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF FINAL FORM;Lo;0;AL;<final> 0649 0670;;;;N;;;;;
+FC91;ARABIC LIGATURE YEH WITH REH FINAL FORM;Lo;0;AL;<final> 064A 0631;;;;N;;;;;
+FC92;ARABIC LIGATURE YEH WITH ZAIN FINAL FORM;Lo;0;AL;<final> 064A 0632;;;;N;;;;;
+FC93;ARABIC LIGATURE YEH WITH MEEM FINAL FORM;Lo;0;AL;<final> 064A 0645;;;;N;;;;;
+FC94;ARABIC LIGATURE YEH WITH NOON FINAL FORM;Lo;0;AL;<final> 064A 0646;;;;N;;;;;
+FC95;ARABIC LIGATURE YEH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 064A 0649;;;;N;;;;;
+FC96;ARABIC LIGATURE YEH WITH YEH FINAL FORM;Lo;0;AL;<final> 064A 064A;;;;N;;;;;
+FC97;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0626 062C;;;;N;;;;;
+FC98;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0626 062D;;;;N;;;;;
+FC99;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 0626 062E;;;;N;;;;;
+FC9A;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0626 0645;;;;N;;;;;
+FC9B;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH INITIAL FORM;Lo;0;AL;<initial> 0626 0647;;;;N;;;;;
+FC9C;ARABIC LIGATURE BEH WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0628 062C;;;;N;;;;;
+FC9D;ARABIC LIGATURE BEH WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0628 062D;;;;N;;;;;
+FC9E;ARABIC LIGATURE BEH WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 0628 062E;;;;N;;;;;
+FC9F;ARABIC LIGATURE BEH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0628 0645;;;;N;;;;;
+FCA0;ARABIC LIGATURE BEH WITH HEH INITIAL FORM;Lo;0;AL;<initial> 0628 0647;;;;N;;;;;
+FCA1;ARABIC LIGATURE TEH WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 062A 062C;;;;N;;;;;
+FCA2;ARABIC LIGATURE TEH WITH HAH INITIAL FORM;Lo;0;AL;<initial> 062A 062D;;;;N;;;;;
+FCA3;ARABIC LIGATURE TEH WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 062A 062E;;;;N;;;;;
+FCA4;ARABIC LIGATURE TEH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 062A 0645;;;;N;;;;;
+FCA5;ARABIC LIGATURE TEH WITH HEH INITIAL FORM;Lo;0;AL;<initial> 062A 0647;;;;N;;;;;
+FCA6;ARABIC LIGATURE THEH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 062B 0645;;;;N;;;;;
+FCA7;ARABIC LIGATURE JEEM WITH HAH INITIAL FORM;Lo;0;AL;<initial> 062C 062D;;;;N;;;;;
+FCA8;ARABIC LIGATURE JEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 062C 0645;;;;N;;;;;
+FCA9;ARABIC LIGATURE HAH WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 062D 062C;;;;N;;;;;
+FCAA;ARABIC LIGATURE HAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 062D 0645;;;;N;;;;;
+FCAB;ARABIC LIGATURE KHAH WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 062E 062C;;;;N;;;;;
+FCAC;ARABIC LIGATURE KHAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 062E 0645;;;;N;;;;;
+FCAD;ARABIC LIGATURE SEEN WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0633 062C;;;;N;;;;;
+FCAE;ARABIC LIGATURE SEEN WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0633 062D;;;;N;;;;;
+FCAF;ARABIC LIGATURE SEEN WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 0633 062E;;;;N;;;;;
+FCB0;ARABIC LIGATURE SEEN WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0633 0645;;;;N;;;;;
+FCB1;ARABIC LIGATURE SAD WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0635 062D;;;;N;;;;;
+FCB2;ARABIC LIGATURE SAD WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 0635 062E;;;;N;;;;;
+FCB3;ARABIC LIGATURE SAD WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0635 0645;;;;N;;;;;
+FCB4;ARABIC LIGATURE DAD WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0636 062C;;;;N;;;;;
+FCB5;ARABIC LIGATURE DAD WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0636 062D;;;;N;;;;;
+FCB6;ARABIC LIGATURE DAD WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 0636 062E;;;;N;;;;;
+FCB7;ARABIC LIGATURE DAD WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0636 0645;;;;N;;;;;
+FCB8;ARABIC LIGATURE TAH WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0637 062D;;;;N;;;;;
+FCB9;ARABIC LIGATURE ZAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0638 0645;;;;N;;;;;
+FCBA;ARABIC LIGATURE AIN WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0639 062C;;;;N;;;;;
+FCBB;ARABIC LIGATURE AIN WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0639 0645;;;;N;;;;;
+FCBC;ARABIC LIGATURE GHAIN WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 063A 062C;;;;N;;;;;
+FCBD;ARABIC LIGATURE GHAIN WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 063A 0645;;;;N;;;;;
+FCBE;ARABIC LIGATURE FEH WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0641 062C;;;;N;;;;;
+FCBF;ARABIC LIGATURE FEH WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0641 062D;;;;N;;;;;
+FCC0;ARABIC LIGATURE FEH WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 0641 062E;;;;N;;;;;
+FCC1;ARABIC LIGATURE FEH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0641 0645;;;;N;;;;;
+FCC2;ARABIC LIGATURE QAF WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0642 062D;;;;N;;;;;
+FCC3;ARABIC LIGATURE QAF WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0642 0645;;;;N;;;;;
+FCC4;ARABIC LIGATURE KAF WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0643 062C;;;;N;;;;;
+FCC5;ARABIC LIGATURE KAF WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0643 062D;;;;N;;;;;
+FCC6;ARABIC LIGATURE KAF WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 0643 062E;;;;N;;;;;
+FCC7;ARABIC LIGATURE KAF WITH LAM INITIAL FORM;Lo;0;AL;<initial> 0643 0644;;;;N;;;;;
+FCC8;ARABIC LIGATURE KAF WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0643 0645;;;;N;;;;;
+FCC9;ARABIC LIGATURE LAM WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0644 062C;;;;N;;;;;
+FCCA;ARABIC LIGATURE LAM WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0644 062D;;;;N;;;;;
+FCCB;ARABIC LIGATURE LAM WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 0644 062E;;;;N;;;;;
+FCCC;ARABIC LIGATURE LAM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0644 0645;;;;N;;;;;
+FCCD;ARABIC LIGATURE LAM WITH HEH INITIAL FORM;Lo;0;AL;<initial> 0644 0647;;;;N;;;;;
+FCCE;ARABIC LIGATURE MEEM WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0645 062C;;;;N;;;;;
+FCCF;ARABIC LIGATURE MEEM WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0645 062D;;;;N;;;;;
+FCD0;ARABIC LIGATURE MEEM WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 0645 062E;;;;N;;;;;
+FCD1;ARABIC LIGATURE MEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0645 0645;;;;N;;;;;
+FCD2;ARABIC LIGATURE NOON WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0646 062C;;;;N;;;;;
+FCD3;ARABIC LIGATURE NOON WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0646 062D;;;;N;;;;;
+FCD4;ARABIC LIGATURE NOON WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 0646 062E;;;;N;;;;;
+FCD5;ARABIC LIGATURE NOON WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0646 0645;;;;N;;;;;
+FCD6;ARABIC LIGATURE NOON WITH HEH INITIAL FORM;Lo;0;AL;<initial> 0646 0647;;;;N;;;;;
+FCD7;ARABIC LIGATURE HEH WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0647 062C;;;;N;;;;;
+FCD8;ARABIC LIGATURE HEH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0647 0645;;;;N;;;;;
+FCD9;ARABIC LIGATURE HEH WITH SUPERSCRIPT ALEF INITIAL FORM;Lo;0;AL;<initial> 0647 0670;;;;N;;;;;
+FCDA;ARABIC LIGATURE YEH WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 064A 062C;;;;N;;;;;
+FCDB;ARABIC LIGATURE YEH WITH HAH INITIAL FORM;Lo;0;AL;<initial> 064A 062D;;;;N;;;;;
+FCDC;ARABIC LIGATURE YEH WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 064A 062E;;;;N;;;;;
+FCDD;ARABIC LIGATURE YEH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 064A 0645;;;;N;;;;;
+FCDE;ARABIC LIGATURE YEH WITH HEH INITIAL FORM;Lo;0;AL;<initial> 064A 0647;;;;N;;;;;
+FCDF;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM MEDIAL FORM;Lo;0;AL;<medial> 0626 0645;;;;N;;;;;
+FCE0;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH MEDIAL FORM;Lo;0;AL;<medial> 0626 0647;;;;N;;;;;
+FCE1;ARABIC LIGATURE BEH WITH MEEM MEDIAL FORM;Lo;0;AL;<medial> 0628 0645;;;;N;;;;;
+FCE2;ARABIC LIGATURE BEH WITH HEH MEDIAL FORM;Lo;0;AL;<medial> 0628 0647;;;;N;;;;;
+FCE3;ARABIC LIGATURE TEH WITH MEEM MEDIAL FORM;Lo;0;AL;<medial> 062A 0645;;;;N;;;;;
+FCE4;ARABIC LIGATURE TEH WITH HEH MEDIAL FORM;Lo;0;AL;<medial> 062A 0647;;;;N;;;;;
+FCE5;ARABIC LIGATURE THEH WITH MEEM MEDIAL FORM;Lo;0;AL;<medial> 062B 0645;;;;N;;;;;
+FCE6;ARABIC LIGATURE THEH WITH HEH MEDIAL FORM;Lo;0;AL;<medial> 062B 0647;;;;N;;;;;
+FCE7;ARABIC LIGATURE SEEN WITH MEEM MEDIAL FORM;Lo;0;AL;<medial> 0633 0645;;;;N;;;;;
+FCE8;ARABIC LIGATURE SEEN WITH HEH MEDIAL FORM;Lo;0;AL;<medial> 0633 0647;;;;N;;;;;
+FCE9;ARABIC LIGATURE SHEEN WITH MEEM MEDIAL FORM;Lo;0;AL;<medial> 0634 0645;;;;N;;;;;
+FCEA;ARABIC LIGATURE SHEEN WITH HEH MEDIAL FORM;Lo;0;AL;<medial> 0634 0647;;;;N;;;;;
+FCEB;ARABIC LIGATURE KAF WITH LAM MEDIAL FORM;Lo;0;AL;<medial> 0643 0644;;;;N;;;;;
+FCEC;ARABIC LIGATURE KAF WITH MEEM MEDIAL FORM;Lo;0;AL;<medial> 0643 0645;;;;N;;;;;
+FCED;ARABIC LIGATURE LAM WITH MEEM MEDIAL FORM;Lo;0;AL;<medial> 0644 0645;;;;N;;;;;
+FCEE;ARABIC LIGATURE NOON WITH MEEM MEDIAL FORM;Lo;0;AL;<medial> 0646 0645;;;;N;;;;;
+FCEF;ARABIC LIGATURE NOON WITH HEH MEDIAL FORM;Lo;0;AL;<medial> 0646 0647;;;;N;;;;;
+FCF0;ARABIC LIGATURE YEH WITH MEEM MEDIAL FORM;Lo;0;AL;<medial> 064A 0645;;;;N;;;;;
+FCF1;ARABIC LIGATURE YEH WITH HEH MEDIAL FORM;Lo;0;AL;<medial> 064A 0647;;;;N;;;;;
+FCF2;ARABIC LIGATURE SHADDA WITH FATHA MEDIAL FORM;Lo;0;AL;<medial> 0640 064E 0651;;;;N;;;;;
+FCF3;ARABIC LIGATURE SHADDA WITH DAMMA MEDIAL FORM;Lo;0;AL;<medial> 0640 064F 0651;;;;N;;;;;
+FCF4;ARABIC LIGATURE SHADDA WITH KASRA MEDIAL FORM;Lo;0;AL;<medial> 0640 0650 0651;;;;N;;;;;
+FCF5;ARABIC LIGATURE TAH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0637 0649;;;;N;;;;;
+FCF6;ARABIC LIGATURE TAH WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0637 064A;;;;N;;;;;
+FCF7;ARABIC LIGATURE AIN WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0639 0649;;;;N;;;;;
+FCF8;ARABIC LIGATURE AIN WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0639 064A;;;;N;;;;;
+FCF9;ARABIC LIGATURE GHAIN WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 063A 0649;;;;N;;;;;
+FCFA;ARABIC LIGATURE GHAIN WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 063A 064A;;;;N;;;;;
+FCFB;ARABIC LIGATURE SEEN WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0633 0649;;;;N;;;;;
+FCFC;ARABIC LIGATURE SEEN WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0633 064A;;;;N;;;;;
+FCFD;ARABIC LIGATURE SHEEN WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0634 0649;;;;N;;;;;
+FCFE;ARABIC LIGATURE SHEEN WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0634 064A;;;;N;;;;;
+FCFF;ARABIC LIGATURE HAH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 062D 0649;;;;N;;;;;
+FD00;ARABIC LIGATURE HAH WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 062D 064A;;;;N;;;;;
+FD01;ARABIC LIGATURE JEEM WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 062C 0649;;;;N;;;;;
+FD02;ARABIC LIGATURE JEEM WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 062C 064A;;;;N;;;;;
+FD03;ARABIC LIGATURE KHAH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 062E 0649;;;;N;;;;;
+FD04;ARABIC LIGATURE KHAH WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 062E 064A;;;;N;;;;;
+FD05;ARABIC LIGATURE SAD WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0635 0649;;;;N;;;;;
+FD06;ARABIC LIGATURE SAD WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0635 064A;;;;N;;;;;
+FD07;ARABIC LIGATURE DAD WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0636 0649;;;;N;;;;;
+FD08;ARABIC LIGATURE DAD WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0636 064A;;;;N;;;;;
+FD09;ARABIC LIGATURE SHEEN WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 0634 062C;;;;N;;;;;
+FD0A;ARABIC LIGATURE SHEEN WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 0634 062D;;;;N;;;;;
+FD0B;ARABIC LIGATURE SHEEN WITH KHAH ISOLATED FORM;Lo;0;AL;<isolated> 0634 062E;;;;N;;;;;
+FD0C;ARABIC LIGATURE SHEEN WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0634 0645;;;;N;;;;;
+FD0D;ARABIC LIGATURE SHEEN WITH REH ISOLATED FORM;Lo;0;AL;<isolated> 0634 0631;;;;N;;;;;
+FD0E;ARABIC LIGATURE SEEN WITH REH ISOLATED FORM;Lo;0;AL;<isolated> 0633 0631;;;;N;;;;;
+FD0F;ARABIC LIGATURE SAD WITH REH ISOLATED FORM;Lo;0;AL;<isolated> 0635 0631;;;;N;;;;;
+FD10;ARABIC LIGATURE DAD WITH REH ISOLATED FORM;Lo;0;AL;<isolated> 0636 0631;;;;N;;;;;
+FD11;ARABIC LIGATURE TAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0637 0649;;;;N;;;;;
+FD12;ARABIC LIGATURE TAH WITH YEH FINAL FORM;Lo;0;AL;<final> 0637 064A;;;;N;;;;;
+FD13;ARABIC LIGATURE AIN WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0639 0649;;;;N;;;;;
+FD14;ARABIC LIGATURE AIN WITH YEH FINAL FORM;Lo;0;AL;<final> 0639 064A;;;;N;;;;;
+FD15;ARABIC LIGATURE GHAIN WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 063A 0649;;;;N;;;;;
+FD16;ARABIC LIGATURE GHAIN WITH YEH FINAL FORM;Lo;0;AL;<final> 063A 064A;;;;N;;;;;
+FD17;ARABIC LIGATURE SEEN WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0633 0649;;;;N;;;;;
+FD18;ARABIC LIGATURE SEEN WITH YEH FINAL FORM;Lo;0;AL;<final> 0633 064A;;;;N;;;;;
+FD19;ARABIC LIGATURE SHEEN WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0634 0649;;;;N;;;;;
+FD1A;ARABIC LIGATURE SHEEN WITH YEH FINAL FORM;Lo;0;AL;<final> 0634 064A;;;;N;;;;;
+FD1B;ARABIC LIGATURE HAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 062D 0649;;;;N;;;;;
+FD1C;ARABIC LIGATURE HAH WITH YEH FINAL FORM;Lo;0;AL;<final> 062D 064A;;;;N;;;;;
+FD1D;ARABIC LIGATURE JEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 062C 0649;;;;N;;;;;
+FD1E;ARABIC LIGATURE JEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 062C 064A;;;;N;;;;;
+FD1F;ARABIC LIGATURE KHAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 062E 0649;;;;N;;;;;
+FD20;ARABIC LIGATURE KHAH WITH YEH FINAL FORM;Lo;0;AL;<final> 062E 064A;;;;N;;;;;
+FD21;ARABIC LIGATURE SAD WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0635 0649;;;;N;;;;;
+FD22;ARABIC LIGATURE SAD WITH YEH FINAL FORM;Lo;0;AL;<final> 0635 064A;;;;N;;;;;
+FD23;ARABIC LIGATURE DAD WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0636 0649;;;;N;;;;;
+FD24;ARABIC LIGATURE DAD WITH YEH FINAL FORM;Lo;0;AL;<final> 0636 064A;;;;N;;;;;
+FD25;ARABIC LIGATURE SHEEN WITH JEEM FINAL FORM;Lo;0;AL;<final> 0634 062C;;;;N;;;;;
+FD26;ARABIC LIGATURE SHEEN WITH HAH FINAL FORM;Lo;0;AL;<final> 0634 062D;;;;N;;;;;
+FD27;ARABIC LIGATURE SHEEN WITH KHAH FINAL FORM;Lo;0;AL;<final> 0634 062E;;;;N;;;;;
+FD28;ARABIC LIGATURE SHEEN WITH MEEM FINAL FORM;Lo;0;AL;<final> 0634 0645;;;;N;;;;;
+FD29;ARABIC LIGATURE SHEEN WITH REH FINAL FORM;Lo;0;AL;<final> 0634 0631;;;;N;;;;;
+FD2A;ARABIC LIGATURE SEEN WITH REH FINAL FORM;Lo;0;AL;<final> 0633 0631;;;;N;;;;;
+FD2B;ARABIC LIGATURE SAD WITH REH FINAL FORM;Lo;0;AL;<final> 0635 0631;;;;N;;;;;
+FD2C;ARABIC LIGATURE DAD WITH REH FINAL FORM;Lo;0;AL;<final> 0636 0631;;;;N;;;;;
+FD2D;ARABIC LIGATURE SHEEN WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0634 062C;;;;N;;;;;
+FD2E;ARABIC LIGATURE SHEEN WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0634 062D;;;;N;;;;;
+FD2F;ARABIC LIGATURE SHEEN WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 0634 062E;;;;N;;;;;
+FD30;ARABIC LIGATURE SHEEN WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0634 0645;;;;N;;;;;
+FD31;ARABIC LIGATURE SEEN WITH HEH INITIAL FORM;Lo;0;AL;<initial> 0633 0647;;;;N;;;;;
+FD32;ARABIC LIGATURE SHEEN WITH HEH INITIAL FORM;Lo;0;AL;<initial> 0634 0647;;;;N;;;;;
+FD33;ARABIC LIGATURE TAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0637 0645;;;;N;;;;;
+FD34;ARABIC LIGATURE SEEN WITH JEEM MEDIAL FORM;Lo;0;AL;<medial> 0633 062C;;;;N;;;;;
+FD35;ARABIC LIGATURE SEEN WITH HAH MEDIAL FORM;Lo;0;AL;<medial> 0633 062D;;;;N;;;;;
+FD36;ARABIC LIGATURE SEEN WITH KHAH MEDIAL FORM;Lo;0;AL;<medial> 0633 062E;;;;N;;;;;
+FD37;ARABIC LIGATURE SHEEN WITH JEEM MEDIAL FORM;Lo;0;AL;<medial> 0634 062C;;;;N;;;;;
+FD38;ARABIC LIGATURE SHEEN WITH HAH MEDIAL FORM;Lo;0;AL;<medial> 0634 062D;;;;N;;;;;
+FD39;ARABIC LIGATURE SHEEN WITH KHAH MEDIAL FORM;Lo;0;AL;<medial> 0634 062E;;;;N;;;;;
+FD3A;ARABIC LIGATURE TAH WITH MEEM MEDIAL FORM;Lo;0;AL;<medial> 0637 0645;;;;N;;;;;
+FD3B;ARABIC LIGATURE ZAH WITH MEEM MEDIAL FORM;Lo;0;AL;<medial> 0638 0645;;;;N;;;;;
+FD3C;ARABIC LIGATURE ALEF WITH FATHATAN FINAL FORM;Lo;0;AL;<final> 0627 064B;;;;N;;;;;
+FD3D;ARABIC LIGATURE ALEF WITH FATHATAN ISOLATED FORM;Lo;0;AL;<isolated> 0627 064B;;;;N;;;;;
+FD3E;ORNATE LEFT PARENTHESIS;Ps;0;ON;;;;;N;;;;;
+FD3F;ORNATE RIGHT PARENTHESIS;Pe;0;ON;;;;;N;;;;;
+FD50;ARABIC LIGATURE TEH WITH JEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 062A 062C 0645;;;;N;;;;;
+FD51;ARABIC LIGATURE TEH WITH HAH WITH JEEM FINAL FORM;Lo;0;AL;<final> 062A 062D 062C;;;;N;;;;;
+FD52;ARABIC LIGATURE TEH WITH HAH WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 062A 062D 062C;;;;N;;;;;
+FD53;ARABIC LIGATURE TEH WITH HAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 062A 062D 0645;;;;N;;;;;
+FD54;ARABIC LIGATURE TEH WITH KHAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 062A 062E 0645;;;;N;;;;;
+FD55;ARABIC LIGATURE TEH WITH MEEM WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 062A 0645 062C;;;;N;;;;;
+FD56;ARABIC LIGATURE TEH WITH MEEM WITH HAH INITIAL FORM;Lo;0;AL;<initial> 062A 0645 062D;;;;N;;;;;
+FD57;ARABIC LIGATURE TEH WITH MEEM WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 062A 0645 062E;;;;N;;;;;
+FD58;ARABIC LIGATURE JEEM WITH MEEM WITH HAH FINAL FORM;Lo;0;AL;<final> 062C 0645 062D;;;;N;;;;;
+FD59;ARABIC LIGATURE JEEM WITH MEEM WITH HAH INITIAL FORM;Lo;0;AL;<initial> 062C 0645 062D;;;;N;;;;;
+FD5A;ARABIC LIGATURE HAH WITH MEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 062D 0645 064A;;;;N;;;;;
+FD5B;ARABIC LIGATURE HAH WITH MEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 062D 0645 0649;;;;N;;;;;
+FD5C;ARABIC LIGATURE SEEN WITH HAH WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0633 062D 062C;;;;N;;;;;
+FD5D;ARABIC LIGATURE SEEN WITH JEEM WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0633 062C 062D;;;;N;;;;;
+FD5E;ARABIC LIGATURE SEEN WITH JEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0633 062C 0649;;;;N;;;;;
+FD5F;ARABIC LIGATURE SEEN WITH MEEM WITH HAH FINAL FORM;Lo;0;AL;<final> 0633 0645 062D;;;;N;;;;;
+FD60;ARABIC LIGATURE SEEN WITH MEEM WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0633 0645 062D;;;;N;;;;;
+FD61;ARABIC LIGATURE SEEN WITH MEEM WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0633 0645 062C;;;;N;;;;;
+FD62;ARABIC LIGATURE SEEN WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL;<final> 0633 0645 0645;;;;N;;;;;
+FD63;ARABIC LIGATURE SEEN WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0633 0645 0645;;;;N;;;;;
+FD64;ARABIC LIGATURE SAD WITH HAH WITH HAH FINAL FORM;Lo;0;AL;<final> 0635 062D 062D;;;;N;;;;;
+FD65;ARABIC LIGATURE SAD WITH HAH WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0635 062D 062D;;;;N;;;;;
+FD66;ARABIC LIGATURE SAD WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL;<final> 0635 0645 0645;;;;N;;;;;
+FD67;ARABIC LIGATURE SHEEN WITH HAH WITH MEEM FINAL FORM;Lo;0;AL;<final> 0634 062D 0645;;;;N;;;;;
+FD68;ARABIC LIGATURE SHEEN WITH HAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0634 062D 0645;;;;N;;;;;
+FD69;ARABIC LIGATURE SHEEN WITH JEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 0634 062C 064A;;;;N;;;;;
+FD6A;ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH FINAL FORM;Lo;0;AL;<final> 0634 0645 062E;;;;N;;;;;
+FD6B;ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 0634 0645 062E;;;;N;;;;;
+FD6C;ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL;<final> 0634 0645 0645;;;;N;;;;;
+FD6D;ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0634 0645 0645;;;;N;;;;;
+FD6E;ARABIC LIGATURE DAD WITH HAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0636 062D 0649;;;;N;;;;;
+FD6F;ARABIC LIGATURE DAD WITH KHAH WITH MEEM FINAL FORM;Lo;0;AL;<final> 0636 062E 0645;;;;N;;;;;
+FD70;ARABIC LIGATURE DAD WITH KHAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0636 062E 0645;;;;N;;;;;
+FD71;ARABIC LIGATURE TAH WITH MEEM WITH HAH FINAL FORM;Lo;0;AL;<final> 0637 0645 062D;;;;N;;;;;
+FD72;ARABIC LIGATURE TAH WITH MEEM WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0637 0645 062D;;;;N;;;;;
+FD73;ARABIC LIGATURE TAH WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0637 0645 0645;;;;N;;;;;
+FD74;ARABIC LIGATURE TAH WITH MEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 0637 0645 064A;;;;N;;;;;
+FD75;ARABIC LIGATURE AIN WITH JEEM WITH MEEM FINAL FORM;Lo;0;AL;<final> 0639 062C 0645;;;;N;;;;;
+FD76;ARABIC LIGATURE AIN WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL;<final> 0639 0645 0645;;;;N;;;;;
+FD77;ARABIC LIGATURE AIN WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0639 0645 0645;;;;N;;;;;
+FD78;ARABIC LIGATURE AIN WITH MEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0639 0645 0649;;;;N;;;;;
+FD79;ARABIC LIGATURE GHAIN WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL;<final> 063A 0645 0645;;;;N;;;;;
+FD7A;ARABIC LIGATURE GHAIN WITH MEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 063A 0645 064A;;;;N;;;;;
+FD7B;ARABIC LIGATURE GHAIN WITH MEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 063A 0645 0649;;;;N;;;;;
+FD7C;ARABIC LIGATURE FEH WITH KHAH WITH MEEM FINAL FORM;Lo;0;AL;<final> 0641 062E 0645;;;;N;;;;;
+FD7D;ARABIC LIGATURE FEH WITH KHAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0641 062E 0645;;;;N;;;;;
+FD7E;ARABIC LIGATURE QAF WITH MEEM WITH HAH FINAL FORM;Lo;0;AL;<final> 0642 0645 062D;;;;N;;;;;
+FD7F;ARABIC LIGATURE QAF WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL;<final> 0642 0645 0645;;;;N;;;;;
+FD80;ARABIC LIGATURE LAM WITH HAH WITH MEEM FINAL FORM;Lo;0;AL;<final> 0644 062D 0645;;;;N;;;;;
+FD81;ARABIC LIGATURE LAM WITH HAH WITH YEH FINAL FORM;Lo;0;AL;<final> 0644 062D 064A;;;;N;;;;;
+FD82;ARABIC LIGATURE LAM WITH HAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0644 062D 0649;;;;N;;;;;
+FD83;ARABIC LIGATURE LAM WITH JEEM WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0644 062C 062C;;;;N;;;;;
+FD84;ARABIC LIGATURE LAM WITH JEEM WITH JEEM FINAL FORM;Lo;0;AL;<final> 0644 062C 062C;;;;N;;;;;
+FD85;ARABIC LIGATURE LAM WITH KHAH WITH MEEM FINAL FORM;Lo;0;AL;<final> 0644 062E 0645;;;;N;;;;;
+FD86;ARABIC LIGATURE LAM WITH KHAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0644 062E 0645;;;;N;;;;;
+FD87;ARABIC LIGATURE LAM WITH MEEM WITH HAH FINAL FORM;Lo;0;AL;<final> 0644 0645 062D;;;;N;;;;;
+FD88;ARABIC LIGATURE LAM WITH MEEM WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0644 0645 062D;;;;N;;;;;
+FD89;ARABIC LIGATURE MEEM WITH HAH WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0645 062D 062C;;;;N;;;;;
+FD8A;ARABIC LIGATURE MEEM WITH HAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0645 062D 0645;;;;N;;;;;
+FD8B;ARABIC LIGATURE MEEM WITH HAH WITH YEH FINAL FORM;Lo;0;AL;<final> 0645 062D 064A;;;;N;;;;;
+FD8C;ARABIC LIGATURE MEEM WITH JEEM WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0645 062C 062D;;;;N;;;;;
+FD8D;ARABIC LIGATURE MEEM WITH JEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0645 062C 0645;;;;N;;;;;
+FD8E;ARABIC LIGATURE MEEM WITH KHAH WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0645 062E 062C;;;;N;;;;;
+FD8F;ARABIC LIGATURE MEEM WITH KHAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0645 062E 0645;;;;N;;;;;
+FD92;ARABIC LIGATURE MEEM WITH JEEM WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 0645 062C 062E;;;;N;;;;;
+FD93;ARABIC LIGATURE HEH WITH MEEM WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0647 0645 062C;;;;N;;;;;
+FD94;ARABIC LIGATURE HEH WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0647 0645 0645;;;;N;;;;;
+FD95;ARABIC LIGATURE NOON WITH HAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0646 062D 0645;;;;N;;;;;
+FD96;ARABIC LIGATURE NOON WITH HAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0646 062D 0649;;;;N;;;;;
+FD97;ARABIC LIGATURE NOON WITH JEEM WITH MEEM FINAL FORM;Lo;0;AL;<final> 0646 062C 0645;;;;N;;;;;
+FD98;ARABIC LIGATURE NOON WITH JEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0646 062C 0645;;;;N;;;;;
+FD99;ARABIC LIGATURE NOON WITH JEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0646 062C 0649;;;;N;;;;;
+FD9A;ARABIC LIGATURE NOON WITH MEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 0646 0645 064A;;;;N;;;;;
+FD9B;ARABIC LIGATURE NOON WITH MEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0646 0645 0649;;;;N;;;;;
+FD9C;ARABIC LIGATURE YEH WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL;<final> 064A 0645 0645;;;;N;;;;;
+FD9D;ARABIC LIGATURE YEH WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 064A 0645 0645;;;;N;;;;;
+FD9E;ARABIC LIGATURE BEH WITH KHAH WITH YEH FINAL FORM;Lo;0;AL;<final> 0628 062E 064A;;;;N;;;;;
+FD9F;ARABIC LIGATURE TEH WITH JEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 062A 062C 064A;;;;N;;;;;
+FDA0;ARABIC LIGATURE TEH WITH JEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 062A 062C 0649;;;;N;;;;;
+FDA1;ARABIC LIGATURE TEH WITH KHAH WITH YEH FINAL FORM;Lo;0;AL;<final> 062A 062E 064A;;;;N;;;;;
+FDA2;ARABIC LIGATURE TEH WITH KHAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 062A 062E 0649;;;;N;;;;;
+FDA3;ARABIC LIGATURE TEH WITH MEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 062A 0645 064A;;;;N;;;;;
+FDA4;ARABIC LIGATURE TEH WITH MEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 062A 0645 0649;;;;N;;;;;
+FDA5;ARABIC LIGATURE JEEM WITH MEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 062C 0645 064A;;;;N;;;;;
+FDA6;ARABIC LIGATURE JEEM WITH HAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 062C 062D 0649;;;;N;;;;;
+FDA7;ARABIC LIGATURE JEEM WITH MEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 062C 0645 0649;;;;N;;;;;
+FDA8;ARABIC LIGATURE SEEN WITH KHAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0633 062E 0649;;;;N;;;;;
+FDA9;ARABIC LIGATURE SAD WITH HAH WITH YEH FINAL FORM;Lo;0;AL;<final> 0635 062D 064A;;;;N;;;;;
+FDAA;ARABIC LIGATURE SHEEN WITH HAH WITH YEH FINAL FORM;Lo;0;AL;<final> 0634 062D 064A;;;;N;;;;;
+FDAB;ARABIC LIGATURE DAD WITH HAH WITH YEH FINAL FORM;Lo;0;AL;<final> 0636 062D 064A;;;;N;;;;;
+FDAC;ARABIC LIGATURE LAM WITH JEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 0644 062C 064A;;;;N;;;;;
+FDAD;ARABIC LIGATURE LAM WITH MEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 0644 0645 064A;;;;N;;;;;
+FDAE;ARABIC LIGATURE YEH WITH HAH WITH YEH FINAL FORM;Lo;0;AL;<final> 064A 062D 064A;;;;N;;;;;
+FDAF;ARABIC LIGATURE YEH WITH JEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 064A 062C 064A;;;;N;;;;;
+FDB0;ARABIC LIGATURE YEH WITH MEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 064A 0645 064A;;;;N;;;;;
+FDB1;ARABIC LIGATURE MEEM WITH MEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 0645 0645 064A;;;;N;;;;;
+FDB2;ARABIC LIGATURE QAF WITH MEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 0642 0645 064A;;;;N;;;;;
+FDB3;ARABIC LIGATURE NOON WITH HAH WITH YEH FINAL FORM;Lo;0;AL;<final> 0646 062D 064A;;;;N;;;;;
+FDB4;ARABIC LIGATURE QAF WITH MEEM WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0642 0645 062D;;;;N;;;;;
+FDB5;ARABIC LIGATURE LAM WITH HAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0644 062D 0645;;;;N;;;;;
+FDB6;ARABIC LIGATURE AIN WITH MEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 0639 0645 064A;;;;N;;;;;
+FDB7;ARABIC LIGATURE KAF WITH MEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 0643 0645 064A;;;;N;;;;;
+FDB8;ARABIC LIGATURE NOON WITH JEEM WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0646 062C 062D;;;;N;;;;;
+FDB9;ARABIC LIGATURE MEEM WITH KHAH WITH YEH FINAL FORM;Lo;0;AL;<final> 0645 062E 064A;;;;N;;;;;
+FDBA;ARABIC LIGATURE LAM WITH JEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0644 062C 0645;;;;N;;;;;
+FDBB;ARABIC LIGATURE KAF WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL;<final> 0643 0645 0645;;;;N;;;;;
+FDBC;ARABIC LIGATURE LAM WITH JEEM WITH MEEM FINAL FORM;Lo;0;AL;<final> 0644 062C 0645;;;;N;;;;;
+FDBD;ARABIC LIGATURE NOON WITH JEEM WITH HAH FINAL FORM;Lo;0;AL;<final> 0646 062C 062D;;;;N;;;;;
+FDBE;ARABIC LIGATURE JEEM WITH HAH WITH YEH FINAL FORM;Lo;0;AL;<final> 062C 062D 064A;;;;N;;;;;
+FDBF;ARABIC LIGATURE HAH WITH JEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 062D 062C 064A;;;;N;;;;;
+FDC0;ARABIC LIGATURE MEEM WITH JEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 0645 062C 064A;;;;N;;;;;
+FDC1;ARABIC LIGATURE FEH WITH MEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 0641 0645 064A;;;;N;;;;;
+FDC2;ARABIC LIGATURE BEH WITH HAH WITH YEH FINAL FORM;Lo;0;AL;<final> 0628 062D 064A;;;;N;;;;;
+FDC3;ARABIC LIGATURE KAF WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0643 0645 0645;;;;N;;;;;
+FDC4;ARABIC LIGATURE AIN WITH JEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0639 062C 0645;;;;N;;;;;
+FDC5;ARABIC LIGATURE SAD WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0635 0645 0645;;;;N;;;;;
+FDC6;ARABIC LIGATURE SEEN WITH KHAH WITH YEH FINAL FORM;Lo;0;AL;<final> 0633 062E 064A;;;;N;;;;;
+FDC7;ARABIC LIGATURE NOON WITH JEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 0646 062C 064A;;;;N;;;;;
+FDF0;ARABIC LIGATURE SALLA USED AS KORANIC STOP SIGN ISOLATED FORM;Lo;0;AL;<isolated> 0635 0644 06D2;;;;N;;;;;
+FDF1;ARABIC LIGATURE QALA USED AS KORANIC STOP SIGN ISOLATED FORM;Lo;0;AL;<isolated> 0642 0644 06D2;;;;N;;;;;
+FDF2;ARABIC LIGATURE ALLAH ISOLATED FORM;Lo;0;AL;<isolated> 0627 0644 0644 0647;;;;N;;;;;
+FDF3;ARABIC LIGATURE AKBAR ISOLATED FORM;Lo;0;AL;<isolated> 0627 0643 0628 0631;;;;N;;;;;
+FDF4;ARABIC LIGATURE MOHAMMAD ISOLATED FORM;Lo;0;AL;<isolated> 0645 062D 0645 062F;;;;N;;;;;
+FDF5;ARABIC LIGATURE SALAM ISOLATED FORM;Lo;0;AL;<isolated> 0635 0644 0639 0645;;;;N;;;;;
+FDF6;ARABIC LIGATURE RASOUL ISOLATED FORM;Lo;0;AL;<isolated> 0631 0633 0648 0644;;;;N;;;;;
+FDF7;ARABIC LIGATURE ALAYHE ISOLATED FORM;Lo;0;AL;<isolated> 0639 0644 064A 0647;;;;N;;;;;
+FDF8;ARABIC LIGATURE WASALLAM ISOLATED FORM;Lo;0;AL;<isolated> 0648 0633 0644 0645;;;;N;;;;;
+FDF9;ARABIC LIGATURE SALLA ISOLATED FORM;Lo;0;AL;<isolated> 0635 0644 0649;;;;N;;;;;
+FDFA;ARABIC LIGATURE SALLALLAHOU ALAYHE WASALLAM;Lo;0;AL;<isolated> 0635 0644 0649 0020 0627 0644 0644 0647 0020 0639 0644 064A 0647 0020 0648 0633 0644 0645;;;;N;ARABIC LETTER SALLALLAHOU ALAYHE WASALLAM;;;;
+FDFB;ARABIC LIGATURE JALLAJALALOUHOU;Lo;0;AL;<isolated> 062C 0644 0020 062C 0644 0627 0644 0647;;;;N;ARABIC LETTER JALLAJALALOUHOU;;;;
+FE20;COMBINING LIGATURE LEFT HALF;Mn;230;NSM;;;;;N;;;;;
+FE21;COMBINING LIGATURE RIGHT HALF;Mn;230;NSM;;;;;N;;;;;
+FE22;COMBINING DOUBLE TILDE LEFT HALF;Mn;230;NSM;;;;;N;;;;;
+FE23;COMBINING DOUBLE TILDE RIGHT HALF;Mn;230;NSM;;;;;N;;;;;
+FE30;PRESENTATION FORM FOR VERTICAL TWO DOT LEADER;Po;0;ON;<vertical> 2025;;;;N;GLYPH FOR VERTICAL TWO DOT LEADER;;;;
+FE31;PRESENTATION FORM FOR VERTICAL EM DASH;Pd;0;ON;<vertical> 2014;;;;N;GLYPH FOR VERTICAL EM DASH;;;;
+FE32;PRESENTATION FORM FOR VERTICAL EN DASH;Pd;0;ON;<vertical> 2013;;;;N;GLYPH FOR VERTICAL EN DASH;;;;
+FE33;PRESENTATION FORM FOR VERTICAL LOW LINE;Pc;0;ON;<vertical> 005F;;;;N;GLYPH FOR VERTICAL SPACING UNDERSCORE;;;;
+FE34;PRESENTATION FORM FOR VERTICAL WAVY LOW LINE;Pc;0;ON;<vertical> 005F;;;;N;GLYPH FOR VERTICAL SPACING WAVY UNDERSCORE;;;;
+FE35;PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS;Ps;0;ON;<vertical> 0028;;;;N;GLYPH FOR VERTICAL OPENING PARENTHESIS;;;;
+FE36;PRESENTATION FORM FOR VERTICAL RIGHT PARENTHESIS;Pe;0;ON;<vertical> 0029;;;;N;GLYPH FOR VERTICAL CLOSING PARENTHESIS;;;;
+FE37;PRESENTATION FORM FOR VERTICAL LEFT CURLY BRACKET;Ps;0;ON;<vertical> 007B;;;;N;GLYPH FOR VERTICAL OPENING CURLY BRACKET;;;;
+FE38;PRESENTATION FORM FOR VERTICAL RIGHT CURLY BRACKET;Pe;0;ON;<vertical> 007D;;;;N;GLYPH FOR VERTICAL CLOSING CURLY BRACKET;;;;
+FE39;PRESENTATION FORM FOR VERTICAL LEFT TORTOISE SHELL BRACKET;Ps;0;ON;<vertical> 3014;;;;N;GLYPH FOR VERTICAL OPENING TORTOISE SHELL BRACKET;;;;
+FE3A;PRESENTATION FORM FOR VERTICAL RIGHT TORTOISE SHELL BRACKET;Pe;0;ON;<vertical> 3015;;;;N;GLYPH FOR VERTICAL CLOSING TORTOISE SHELL BRACKET;;;;
+FE3B;PRESENTATION FORM FOR VERTICAL LEFT BLACK LENTICULAR BRACKET;Ps;0;ON;<vertical> 3010;;;;N;GLYPH FOR VERTICAL OPENING BLACK LENTICULAR BRACKET;;;;
+FE3C;PRESENTATION FORM FOR VERTICAL RIGHT BLACK LENTICULAR BRACKET;Pe;0;ON;<vertical> 3011;;;;N;GLYPH FOR VERTICAL CLOSING BLACK LENTICULAR BRACKET;;;;
+FE3D;PRESENTATION FORM FOR VERTICAL LEFT DOUBLE ANGLE BRACKET;Ps;0;ON;<vertical> 300A;;;;N;GLYPH FOR VERTICAL OPENING DOUBLE ANGLE BRACKET;;;;
+FE3E;PRESENTATION FORM FOR VERTICAL RIGHT DOUBLE ANGLE BRACKET;Pe;0;ON;<vertical> 300B;;;;N;GLYPH FOR VERTICAL CLOSING DOUBLE ANGLE BRACKET;;;;
+FE3F;PRESENTATION FORM FOR VERTICAL LEFT ANGLE BRACKET;Ps;0;ON;<vertical> 3008;;;;N;GLYPH FOR VERTICAL OPENING ANGLE BRACKET;;;;
+FE40;PRESENTATION FORM FOR VERTICAL RIGHT ANGLE BRACKET;Pe;0;ON;<vertical> 3009;;;;N;GLYPH FOR VERTICAL CLOSING ANGLE BRACKET;;;;
+FE41;PRESENTATION FORM FOR VERTICAL LEFT CORNER BRACKET;Ps;0;ON;<vertical> 300C;;;;N;GLYPH FOR VERTICAL OPENING CORNER BRACKET;;;;
+FE42;PRESENTATION FORM FOR VERTICAL RIGHT CORNER BRACKET;Pe;0;ON;<vertical> 300D;;;;N;GLYPH FOR VERTICAL CLOSING CORNER BRACKET;;;;
+FE43;PRESENTATION FORM FOR VERTICAL LEFT WHITE CORNER BRACKET;Ps;0;ON;<vertical> 300E;;;;N;GLYPH FOR VERTICAL OPENING WHITE CORNER BRACKET;;;;
+FE44;PRESENTATION FORM FOR VERTICAL RIGHT WHITE CORNER BRACKET;Pe;0;ON;<vertical> 300F;;;;N;GLYPH FOR VERTICAL CLOSING WHITE CORNER BRACKET;;;;
+FE49;DASHED OVERLINE;Po;0;ON;<compat> 203E;;;;N;SPACING DASHED OVERSCORE;;;;
+FE4A;CENTRELINE OVERLINE;Po;0;ON;<compat> 203E;;;;N;SPACING CENTERLINE OVERSCORE;;;;
+FE4B;WAVY OVERLINE;Po;0;ON;<compat> 203E;;;;N;SPACING WAVY OVERSCORE;;;;
+FE4C;DOUBLE WAVY OVERLINE;Po;0;ON;<compat> 203E;;;;N;SPACING DOUBLE WAVY OVERSCORE;;;;
+FE4D;DASHED LOW LINE;Pc;0;ON;<compat> 005F;;;;N;SPACING DASHED UNDERSCORE;;;;
+FE4E;CENTRELINE LOW LINE;Pc;0;ON;<compat> 005F;;;;N;SPACING CENTERLINE UNDERSCORE;;;;
+FE4F;WAVY LOW LINE;Pc;0;ON;<compat> 005F;;;;N;SPACING WAVY UNDERSCORE;;;;
+FE50;SMALL COMMA;Po;0;CS;<small> 002C;;;;N;;;;;
+FE51;SMALL IDEOGRAPHIC COMMA;Po;0;ON;<small> 3001;;;;N;;;;;
+FE52;SMALL FULL STOP;Po;0;CS;<small> 002E;;;;N;SMALL PERIOD;;;;
+FE54;SMALL SEMICOLON;Po;0;ON;<small> 003B;;;;N;;;;;
+FE55;SMALL COLON;Po;0;CS;<small> 003A;;;;N;;;;;
+FE56;SMALL QUESTION MARK;Po;0;ON;<small> 003F;;;;N;;;;;
+FE57;SMALL EXCLAMATION MARK;Po;0;ON;<small> 0021;;;;N;;;;;
+FE58;SMALL EM DASH;Pd;0;ON;<small> 2014;;;;N;;;;;
+FE59;SMALL LEFT PARENTHESIS;Ps;0;ON;<small> 0028;;;;N;SMALL OPENING PARENTHESIS;;;;
+FE5A;SMALL RIGHT PARENTHESIS;Pe;0;ON;<small> 0029;;;;N;SMALL CLOSING PARENTHESIS;;;;
+FE5B;SMALL LEFT CURLY BRACKET;Ps;0;ON;<small> 007B;;;;N;SMALL OPENING CURLY BRACKET;;;;
+FE5C;SMALL RIGHT CURLY BRACKET;Pe;0;ON;<small> 007D;;;;N;SMALL CLOSING CURLY BRACKET;;;;
+FE5D;SMALL LEFT TORTOISE SHELL BRACKET;Ps;0;ON;<small> 3014;;;;N;SMALL OPENING TORTOISE SHELL BRACKET;;;;
+FE5E;SMALL RIGHT TORTOISE SHELL BRACKET;Pe;0;ON;<small> 3015;;;;N;SMALL CLOSING TORTOISE SHELL BRACKET;;;;
+FE5F;SMALL NUMBER SIGN;Po;0;ET;<small> 0023;;;;N;;;;;
+FE60;SMALL AMPERSAND;Po;0;ON;<small> 0026;;;;N;;;;;
+FE61;SMALL ASTERISK;Po;0;ON;<small> 002A;;;;N;;;;;
+FE62;SMALL PLUS SIGN;Sm;0;ET;<small> 002B;;;;N;;;;;
+FE63;SMALL HYPHEN-MINUS;Pd;0;ET;<small> 002D;;;;N;;;;;
+FE64;SMALL LESS-THAN SIGN;Sm;0;ON;<small> 003C;;;;N;;;;;
+FE65;SMALL GREATER-THAN SIGN;Sm;0;ON;<small> 003E;;;;N;;;;;
+FE66;SMALL EQUALS SIGN;Sm;0;ON;<small> 003D;;;;N;;;;;
+FE68;SMALL REVERSE SOLIDUS;Po;0;ON;<small> 005C;;;;N;SMALL BACKSLASH;;;;
+FE69;SMALL DOLLAR SIGN;Sc;0;ET;<small> 0024;;;;N;;;;;
+FE6A;SMALL PERCENT SIGN;Po;0;ET;<small> 0025;;;;N;;;;;
+FE6B;SMALL COMMERCIAL AT;Po;0;ON;<small> 0040;;;;N;;;;;
+FE70;ARABIC FATHATAN ISOLATED FORM;Lo;0;AL;<isolated> 0020 064B;;;;N;ARABIC SPACING FATHATAN;;;;
+FE71;ARABIC TATWEEL WITH FATHATAN ABOVE;Lo;0;AL;<medial> 0640 064B;;;;N;ARABIC FATHATAN ON TATWEEL;;;;
+FE72;ARABIC DAMMATAN ISOLATED FORM;Lo;0;AL;<isolated> 0020 064C;;;;N;ARABIC SPACING DAMMATAN;;;;
+FE74;ARABIC KASRATAN ISOLATED FORM;Lo;0;AL;<isolated> 0020 064D;;;;N;ARABIC SPACING KASRATAN;;;;
+FE76;ARABIC FATHA ISOLATED FORM;Lo;0;AL;<isolated> 0020 064E;;;;N;ARABIC SPACING FATHAH;;;;
+FE77;ARABIC FATHA MEDIAL FORM;Lo;0;AL;<medial> 0640 064E;;;;N;ARABIC FATHAH ON TATWEEL;;;;
+FE78;ARABIC DAMMA ISOLATED FORM;Lo;0;AL;<isolated> 0020 064F;;;;N;ARABIC SPACING DAMMAH;;;;
+FE79;ARABIC DAMMA MEDIAL FORM;Lo;0;AL;<medial> 0640 064F;;;;N;ARABIC DAMMAH ON TATWEEL;;;;
+FE7A;ARABIC KASRA ISOLATED FORM;Lo;0;AL;<isolated> 0020 0650;;;;N;ARABIC SPACING KASRAH;;;;
+FE7B;ARABIC KASRA MEDIAL FORM;Lo;0;AL;<medial> 0640 0650;;;;N;ARABIC KASRAH ON TATWEEL;;;;
+FE7C;ARABIC SHADDA ISOLATED FORM;Lo;0;AL;<isolated> 0020 0651;;;;N;ARABIC SPACING SHADDAH;;;;
+FE7D;ARABIC SHADDA MEDIAL FORM;Lo;0;AL;<medial> 0640 0651;;;;N;ARABIC SHADDAH ON TATWEEL;;;;
+FE7E;ARABIC SUKUN ISOLATED FORM;Lo;0;AL;<isolated> 0020 0652;;;;N;ARABIC SPACING SUKUN;;;;
+FE7F;ARABIC SUKUN MEDIAL FORM;Lo;0;AL;<medial> 0640 0652;;;;N;ARABIC SUKUN ON TATWEEL;;;;
+FE80;ARABIC LETTER HAMZA ISOLATED FORM;Lo;0;AL;<isolated> 0621;;;;N;GLYPH FOR ISOLATE ARABIC HAMZAH;;;;
+FE81;ARABIC LETTER ALEF WITH MADDA ABOVE ISOLATED FORM;Lo;0;AL;<isolated> 0622;;;;N;GLYPH FOR ISOLATE ARABIC MADDAH ON ALEF;;;;
+FE82;ARABIC LETTER ALEF WITH MADDA ABOVE FINAL FORM;Lo;0;AL;<final> 0622;;;;N;GLYPH FOR FINAL ARABIC MADDAH ON ALEF;;;;
+FE83;ARABIC LETTER ALEF WITH HAMZA ABOVE ISOLATED FORM;Lo;0;AL;<isolated> 0623;;;;N;GLYPH FOR ISOLATE ARABIC HAMZAH ON ALEF;;;;
+FE84;ARABIC LETTER ALEF WITH HAMZA ABOVE FINAL FORM;Lo;0;AL;<final> 0623;;;;N;GLYPH FOR FINAL ARABIC HAMZAH ON ALEF;;;;
+FE85;ARABIC LETTER WAW WITH HAMZA ABOVE ISOLATED FORM;Lo;0;AL;<isolated> 0624;;;;N;GLYPH FOR ISOLATE ARABIC HAMZAH ON WAW;;;;
+FE86;ARABIC LETTER WAW WITH HAMZA ABOVE FINAL FORM;Lo;0;AL;<final> 0624;;;;N;GLYPH FOR FINAL ARABIC HAMZAH ON WAW;;;;
+FE87;ARABIC LETTER ALEF WITH HAMZA BELOW ISOLATED FORM;Lo;0;AL;<isolated> 0625;;;;N;GLYPH FOR ISOLATE ARABIC HAMZAH UNDER ALEF;;;;
+FE88;ARABIC LETTER ALEF WITH HAMZA BELOW FINAL FORM;Lo;0;AL;<final> 0625;;;;N;GLYPH FOR FINAL ARABIC HAMZAH UNDER ALEF;;;;
+FE89;ARABIC LETTER YEH WITH HAMZA ABOVE ISOLATED FORM;Lo;0;AL;<isolated> 0626;;;;N;GLYPH FOR ISOLATE ARABIC HAMZAH ON YA;;;;
+FE8A;ARABIC LETTER YEH WITH HAMZA ABOVE FINAL FORM;Lo;0;AL;<final> 0626;;;;N;GLYPH FOR FINAL ARABIC HAMZAH ON YA;;;;
+FE8B;ARABIC LETTER YEH WITH HAMZA ABOVE INITIAL FORM;Lo;0;AL;<initial> 0626;;;;N;GLYPH FOR INITIAL ARABIC HAMZAH ON YA;;;;
+FE8C;ARABIC LETTER YEH WITH HAMZA ABOVE MEDIAL FORM;Lo;0;AL;<medial> 0626;;;;N;GLYPH FOR MEDIAL ARABIC HAMZAH ON YA;;;;
+FE8D;ARABIC LETTER ALEF ISOLATED FORM;Lo;0;AL;<isolated> 0627;;;;N;GLYPH FOR ISOLATE ARABIC ALEF;;;;
+FE8E;ARABIC LETTER ALEF FINAL FORM;Lo;0;AL;<final> 0627;;;;N;GLYPH FOR FINAL ARABIC ALEF;;;;
+FE8F;ARABIC LETTER BEH ISOLATED FORM;Lo;0;AL;<isolated> 0628;;;;N;GLYPH FOR ISOLATE ARABIC BAA;;;;
+FE90;ARABIC LETTER BEH FINAL FORM;Lo;0;AL;<final> 0628;;;;N;GLYPH FOR FINAL ARABIC BAA;;;;
+FE91;ARABIC LETTER BEH INITIAL FORM;Lo;0;AL;<initial> 0628;;;;N;GLYPH FOR INITIAL ARABIC BAA;;;;
+FE92;ARABIC LETTER BEH MEDIAL FORM;Lo;0;AL;<medial> 0628;;;;N;GLYPH FOR MEDIAL ARABIC BAA;;;;
+FE93;ARABIC LETTER TEH MARBUTA ISOLATED FORM;Lo;0;AL;<isolated> 0629;;;;N;GLYPH FOR ISOLATE ARABIC TAA MARBUTAH;;;;
+FE94;ARABIC LETTER TEH MARBUTA FINAL FORM;Lo;0;AL;<final> 0629;;;;N;GLYPH FOR FINAL ARABIC TAA MARBUTAH;;;;
+FE95;ARABIC LETTER TEH ISOLATED FORM;Lo;0;AL;<isolated> 062A;;;;N;GLYPH FOR ISOLATE ARABIC TAA;;;;
+FE96;ARABIC LETTER TEH FINAL FORM;Lo;0;AL;<final> 062A;;;;N;GLYPH FOR FINAL ARABIC TAA;;;;
+FE97;ARABIC LETTER TEH INITIAL FORM;Lo;0;AL;<initial> 062A;;;;N;GLYPH FOR INITIAL ARABIC TAA;;;;
+FE98;ARABIC LETTER TEH MEDIAL FORM;Lo;0;AL;<medial> 062A;;;;N;GLYPH FOR MEDIAL ARABIC TAA;;;;
+FE99;ARABIC LETTER THEH ISOLATED FORM;Lo;0;AL;<isolated> 062B;;;;N;GLYPH FOR ISOLATE ARABIC THAA;;;;
+FE9A;ARABIC LETTER THEH FINAL FORM;Lo;0;AL;<final> 062B;;;;N;GLYPH FOR FINAL ARABIC THAA;;;;
+FE9B;ARABIC LETTER THEH INITIAL FORM;Lo;0;AL;<initial> 062B;;;;N;GLYPH FOR INITIAL ARABIC THAA;;;;
+FE9C;ARABIC LETTER THEH MEDIAL FORM;Lo;0;AL;<medial> 062B;;;;N;GLYPH FOR MEDIAL ARABIC THAA;;;;
+FE9D;ARABIC LETTER JEEM ISOLATED FORM;Lo;0;AL;<isolated> 062C;;;;N;GLYPH FOR ISOLATE ARABIC JEEM;;;;
+FE9E;ARABIC LETTER JEEM FINAL FORM;Lo;0;AL;<final> 062C;;;;N;GLYPH FOR FINAL ARABIC JEEM;;;;
+FE9F;ARABIC LETTER JEEM INITIAL FORM;Lo;0;AL;<initial> 062C;;;;N;GLYPH FOR INITIAL ARABIC JEEM;;;;
+FEA0;ARABIC LETTER JEEM MEDIAL FORM;Lo;0;AL;<medial> 062C;;;;N;GLYPH FOR MEDIAL ARABIC JEEM;;;;
+FEA1;ARABIC LETTER HAH ISOLATED FORM;Lo;0;AL;<isolated> 062D;;;;N;GLYPH FOR ISOLATE ARABIC HAA;;;;
+FEA2;ARABIC LETTER HAH FINAL FORM;Lo;0;AL;<final> 062D;;;;N;GLYPH FOR FINAL ARABIC HAA;;;;
+FEA3;ARABIC LETTER HAH INITIAL FORM;Lo;0;AL;<initial> 062D;;;;N;GLYPH FOR INITIAL ARABIC HAA;;;;
+FEA4;ARABIC LETTER HAH MEDIAL FORM;Lo;0;AL;<medial> 062D;;;;N;GLYPH FOR MEDIAL ARABIC HAA;;;;
+FEA5;ARABIC LETTER KHAH ISOLATED FORM;Lo;0;AL;<isolated> 062E;;;;N;GLYPH FOR ISOLATE ARABIC KHAA;;;;
+FEA6;ARABIC LETTER KHAH FINAL FORM;Lo;0;AL;<final> 062E;;;;N;GLYPH FOR FINAL ARABIC KHAA;;;;
+FEA7;ARABIC LETTER KHAH INITIAL FORM;Lo;0;AL;<initial> 062E;;;;N;GLYPH FOR INITIAL ARABIC KHAA;;;;
+FEA8;ARABIC LETTER KHAH MEDIAL FORM;Lo;0;AL;<medial> 062E;;;;N;GLYPH FOR MEDIAL ARABIC KHAA;;;;
+FEA9;ARABIC LETTER DAL ISOLATED FORM;Lo;0;AL;<isolated> 062F;;;;N;GLYPH FOR ISOLATE ARABIC DAL;;;;
+FEAA;ARABIC LETTER DAL FINAL FORM;Lo;0;AL;<final> 062F;;;;N;GLYPH FOR FINAL ARABIC DAL;;;;
+FEAB;ARABIC LETTER THAL ISOLATED FORM;Lo;0;AL;<isolated> 0630;;;;N;GLYPH FOR ISOLATE ARABIC THAL;;;;
+FEAC;ARABIC LETTER THAL FINAL FORM;Lo;0;AL;<final> 0630;;;;N;GLYPH FOR FINAL ARABIC THAL;;;;
+FEAD;ARABIC LETTER REH ISOLATED FORM;Lo;0;AL;<isolated> 0631;;;;N;GLYPH FOR ISOLATE ARABIC RA;;;;
+FEAE;ARABIC LETTER REH FINAL FORM;Lo;0;AL;<final> 0631;;;;N;GLYPH FOR FINAL ARABIC RA;;;;
+FEAF;ARABIC LETTER ZAIN ISOLATED FORM;Lo;0;AL;<isolated> 0632;;;;N;GLYPH FOR ISOLATE ARABIC ZAIN;;;;
+FEB0;ARABIC LETTER ZAIN FINAL FORM;Lo;0;AL;<final> 0632;;;;N;GLYPH FOR FINAL ARABIC ZAIN;;;;
+FEB1;ARABIC LETTER SEEN ISOLATED FORM;Lo;0;AL;<isolated> 0633;;;;N;GLYPH FOR ISOLATE ARABIC SEEN;;;;
+FEB2;ARABIC LETTER SEEN FINAL FORM;Lo;0;AL;<final> 0633;;;;N;GLYPH FOR FINAL ARABIC SEEN;;;;
+FEB3;ARABIC LETTER SEEN INITIAL FORM;Lo;0;AL;<initial> 0633;;;;N;GLYPH FOR INITIAL ARABIC SEEN;;;;
+FEB4;ARABIC LETTER SEEN MEDIAL FORM;Lo;0;AL;<medial> 0633;;;;N;GLYPH FOR MEDIAL ARABIC SEEN;;;;
+FEB5;ARABIC LETTER SHEEN ISOLATED FORM;Lo;0;AL;<isolated> 0634;;;;N;GLYPH FOR ISOLATE ARABIC SHEEN;;;;
+FEB6;ARABIC LETTER SHEEN FINAL FORM;Lo;0;AL;<final> 0634;;;;N;GLYPH FOR FINAL ARABIC SHEEN;;;;
+FEB7;ARABIC LETTER SHEEN INITIAL FORM;Lo;0;AL;<initial> 0634;;;;N;GLYPH FOR INITIAL ARABIC SHEEN;;;;
+FEB8;ARABIC LETTER SHEEN MEDIAL FORM;Lo;0;AL;<medial> 0634;;;;N;GLYPH FOR MEDIAL ARABIC SHEEN;;;;
+FEB9;ARABIC LETTER SAD ISOLATED FORM;Lo;0;AL;<isolated> 0635;;;;N;GLYPH FOR ISOLATE ARABIC SAD;;;;
+FEBA;ARABIC LETTER SAD FINAL FORM;Lo;0;AL;<final> 0635;;;;N;GLYPH FOR FINAL ARABIC SAD;;;;
+FEBB;ARABIC LETTER SAD INITIAL FORM;Lo;0;AL;<initial> 0635;;;;N;GLYPH FOR INITIAL ARABIC SAD;;;;
+FEBC;ARABIC LETTER SAD MEDIAL FORM;Lo;0;AL;<medial> 0635;;;;N;GLYPH FOR MEDIAL ARABIC SAD;;;;
+FEBD;ARABIC LETTER DAD ISOLATED FORM;Lo;0;AL;<isolated> 0636;;;;N;GLYPH FOR ISOLATE ARABIC DAD;;;;
+FEBE;ARABIC LETTER DAD FINAL FORM;Lo;0;AL;<final> 0636;;;;N;GLYPH FOR FINAL ARABIC DAD;;;;
+FEBF;ARABIC LETTER DAD INITIAL FORM;Lo;0;AL;<initial> 0636;;;;N;GLYPH FOR INITIAL ARABIC DAD;;;;
+FEC0;ARABIC LETTER DAD MEDIAL FORM;Lo;0;AL;<medial> 0636;;;;N;GLYPH FOR MEDIAL ARABIC DAD;;;;
+FEC1;ARABIC LETTER TAH ISOLATED FORM;Lo;0;AL;<isolated> 0637;;;;N;GLYPH FOR ISOLATE ARABIC TAH;;;;
+FEC2;ARABIC LETTER TAH FINAL FORM;Lo;0;AL;<final> 0637;;;;N;GLYPH FOR FINAL ARABIC TAH;;;;
+FEC3;ARABIC LETTER TAH INITIAL FORM;Lo;0;AL;<initial> 0637;;;;N;GLYPH FOR INITIAL ARABIC TAH;;;;
+FEC4;ARABIC LETTER TAH MEDIAL FORM;Lo;0;AL;<medial> 0637;;;;N;GLYPH FOR MEDIAL ARABIC TAH;;;;
+FEC5;ARABIC LETTER ZAH ISOLATED FORM;Lo;0;AL;<isolated> 0638;;;;N;GLYPH FOR ISOLATE ARABIC DHAH;;;;
+FEC6;ARABIC LETTER ZAH FINAL FORM;Lo;0;AL;<final> 0638;;;;N;GLYPH FOR FINAL ARABIC DHAH;;;;
+FEC7;ARABIC LETTER ZAH INITIAL FORM;Lo;0;AL;<initial> 0638;;;;N;GLYPH FOR INITIAL ARABIC DHAH;;;;
+FEC8;ARABIC LETTER ZAH MEDIAL FORM;Lo;0;AL;<medial> 0638;;;;N;GLYPH FOR MEDIAL ARABIC DHAH;;;;
+FEC9;ARABIC LETTER AIN ISOLATED FORM;Lo;0;AL;<isolated> 0639;;;;N;GLYPH FOR ISOLATE ARABIC AIN;;;;
+FECA;ARABIC LETTER AIN FINAL FORM;Lo;0;AL;<final> 0639;;;;N;GLYPH FOR FINAL ARABIC AIN;;;;
+FECB;ARABIC LETTER AIN INITIAL FORM;Lo;0;AL;<initial> 0639;;;;N;GLYPH FOR INITIAL ARABIC AIN;;;;
+FECC;ARABIC LETTER AIN MEDIAL FORM;Lo;0;AL;<medial> 0639;;;;N;GLYPH FOR MEDIAL ARABIC AIN;;;;
+FECD;ARABIC LETTER GHAIN ISOLATED FORM;Lo;0;AL;<isolated> 063A;;;;N;GLYPH FOR ISOLATE ARABIC GHAIN;;;;
+FECE;ARABIC LETTER GHAIN FINAL FORM;Lo;0;AL;<final> 063A;;;;N;GLYPH FOR FINAL ARABIC GHAIN;;;;
+FECF;ARABIC LETTER GHAIN INITIAL FORM;Lo;0;AL;<initial> 063A;;;;N;GLYPH FOR INITIAL ARABIC GHAIN;;;;
+FED0;ARABIC LETTER GHAIN MEDIAL FORM;Lo;0;AL;<medial> 063A;;;;N;GLYPH FOR MEDIAL ARABIC GHAIN;;;;
+FED1;ARABIC LETTER FEH ISOLATED FORM;Lo;0;AL;<isolated> 0641;;;;N;GLYPH FOR ISOLATE ARABIC FA;;;;
+FED2;ARABIC LETTER FEH FINAL FORM;Lo;0;AL;<final> 0641;;;;N;GLYPH FOR FINAL ARABIC FA;;;;
+FED3;ARABIC LETTER FEH INITIAL FORM;Lo;0;AL;<initial> 0641;;;;N;GLYPH FOR INITIAL ARABIC FA;;;;
+FED4;ARABIC LETTER FEH MEDIAL FORM;Lo;0;AL;<medial> 0641;;;;N;GLYPH FOR MEDIAL ARABIC FA;;;;
+FED5;ARABIC LETTER QAF ISOLATED FORM;Lo;0;AL;<isolated> 0642;;;;N;GLYPH FOR ISOLATE ARABIC QAF;;;;
+FED6;ARABIC LETTER QAF FINAL FORM;Lo;0;AL;<final> 0642;;;;N;GLYPH FOR FINAL ARABIC QAF;;;;
+FED7;ARABIC LETTER QAF INITIAL FORM;Lo;0;AL;<initial> 0642;;;;N;GLYPH FOR INITIAL ARABIC QAF;;;;
+FED8;ARABIC LETTER QAF MEDIAL FORM;Lo;0;AL;<medial> 0642;;;;N;GLYPH FOR MEDIAL ARABIC QAF;;;;
+FED9;ARABIC LETTER KAF ISOLATED FORM;Lo;0;AL;<isolated> 0643;;;;N;GLYPH FOR ISOLATE ARABIC CAF;;;;
+FEDA;ARABIC LETTER KAF FINAL FORM;Lo;0;AL;<final> 0643;;;;N;GLYPH FOR FINAL ARABIC CAF;;;;
+FEDB;ARABIC LETTER KAF INITIAL FORM;Lo;0;AL;<initial> 0643;;;;N;GLYPH FOR INITIAL ARABIC CAF;;;;
+FEDC;ARABIC LETTER KAF MEDIAL FORM;Lo;0;AL;<medial> 0643;;;;N;GLYPH FOR MEDIAL ARABIC CAF;;;;
+FEDD;ARABIC LETTER LAM ISOLATED FORM;Lo;0;AL;<isolated> 0644;;;;N;GLYPH FOR ISOLATE ARABIC LAM;;;;
+FEDE;ARABIC LETTER LAM FINAL FORM;Lo;0;AL;<final> 0644;;;;N;GLYPH FOR FINAL ARABIC LAM;;;;
+FEDF;ARABIC LETTER LAM INITIAL FORM;Lo;0;AL;<initial> 0644;;;;N;GLYPH FOR INITIAL ARABIC LAM;;;;
+FEE0;ARABIC LETTER LAM MEDIAL FORM;Lo;0;AL;<medial> 0644;;;;N;GLYPH FOR MEDIAL ARABIC LAM;;;;
+FEE1;ARABIC LETTER MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0645;;;;N;GLYPH FOR ISOLATE ARABIC MEEM;;;;
+FEE2;ARABIC LETTER MEEM FINAL FORM;Lo;0;AL;<final> 0645;;;;N;GLYPH FOR FINAL ARABIC MEEM;;;;
+FEE3;ARABIC LETTER MEEM INITIAL FORM;Lo;0;AL;<initial> 0645;;;;N;GLYPH FOR INITIAL ARABIC MEEM;;;;
+FEE4;ARABIC LETTER MEEM MEDIAL FORM;Lo;0;AL;<medial> 0645;;;;N;GLYPH FOR MEDIAL ARABIC MEEM;;;;
+FEE5;ARABIC LETTER NOON ISOLATED FORM;Lo;0;AL;<isolated> 0646;;;;N;GLYPH FOR ISOLATE ARABIC NOON;;;;
+FEE6;ARABIC LETTER NOON FINAL FORM;Lo;0;AL;<final> 0646;;;;N;GLYPH FOR FINAL ARABIC NOON;;;;
+FEE7;ARABIC LETTER NOON INITIAL FORM;Lo;0;AL;<initial> 0646;;;;N;GLYPH FOR INITIAL ARABIC NOON;;;;
+FEE8;ARABIC LETTER NOON MEDIAL FORM;Lo;0;AL;<medial> 0646;;;;N;GLYPH FOR MEDIAL ARABIC NOON;;;;
+FEE9;ARABIC LETTER HEH ISOLATED FORM;Lo;0;AL;<isolated> 0647;;;;N;GLYPH FOR ISOLATE ARABIC HA;;;;
+FEEA;ARABIC LETTER HEH FINAL FORM;Lo;0;AL;<final> 0647;;;;N;GLYPH FOR FINAL ARABIC HA;;;;
+FEEB;ARABIC LETTER HEH INITIAL FORM;Lo;0;AL;<initial> 0647;;;;N;GLYPH FOR INITIAL ARABIC HA;;;;
+FEEC;ARABIC LETTER HEH MEDIAL FORM;Lo;0;AL;<medial> 0647;;;;N;GLYPH FOR MEDIAL ARABIC HA;;;;
+FEED;ARABIC LETTER WAW ISOLATED FORM;Lo;0;AL;<isolated> 0648;;;;N;GLYPH FOR ISOLATE ARABIC WAW;;;;
+FEEE;ARABIC LETTER WAW FINAL FORM;Lo;0;AL;<final> 0648;;;;N;GLYPH FOR FINAL ARABIC WAW;;;;
+FEEF;ARABIC LETTER ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0649;;;;N;GLYPH FOR ISOLATE ARABIC ALEF MAQSURAH;;;;
+FEF0;ARABIC LETTER ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0649;;;;N;GLYPH FOR FINAL ARABIC ALEF MAQSURAH;;;;
+FEF1;ARABIC LETTER YEH ISOLATED FORM;Lo;0;AL;<isolated> 064A;;;;N;GLYPH FOR ISOLATE ARABIC YA;;;;
+FEF2;ARABIC LETTER YEH FINAL FORM;Lo;0;AL;<final> 064A;;;;N;GLYPH FOR FINAL ARABIC YA;;;;
+FEF3;ARABIC LETTER YEH INITIAL FORM;Lo;0;AL;<initial> 064A;;;;N;GLYPH FOR INITIAL ARABIC YA;;;;
+FEF4;ARABIC LETTER YEH MEDIAL FORM;Lo;0;AL;<medial> 064A;;;;N;GLYPH FOR MEDIAL ARABIC YA;;;;
+FEF5;ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE ISOLATED FORM;Lo;0;AL;<isolated> 0644 0622;;;;N;GLYPH FOR ISOLATE ARABIC MADDAH ON LIGATURE LAM ALEF;;;;
+FEF6;ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE FINAL FORM;Lo;0;AL;<final> 0644 0622;;;;N;GLYPH FOR FINAL ARABIC MADDAH ON LIGATURE LAM ALEF;;;;
+FEF7;ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE ISOLATED FORM;Lo;0;AL;<isolated> 0644 0623;;;;N;GLYPH FOR ISOLATE ARABIC HAMZAH ON LIGATURE LAM ALEF;;;;
+FEF8;ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE FINAL FORM;Lo;0;AL;<final> 0644 0623;;;;N;GLYPH FOR FINAL ARABIC HAMZAH ON LIGATURE LAM ALEF;;;;
+FEF9;ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW ISOLATED FORM;Lo;0;AL;<isolated> 0644 0625;;;;N;GLYPH FOR ISOLATE ARABIC HAMZAH UNDER LIGATURE LAM ALEF;;;;
+FEFA;ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW FINAL FORM;Lo;0;AL;<final> 0644 0625;;;;N;GLYPH FOR FINAL ARABIC HAMZAH UNDER LIGATURE LAM ALEF;;;;
+FEFB;ARABIC LIGATURE LAM WITH ALEF ISOLATED FORM;Lo;0;AL;<isolated> 0644 0627;;;;N;GLYPH FOR ISOLATE ARABIC LIGATURE LAM ALEF;;;;
+FEFC;ARABIC LIGATURE LAM WITH ALEF FINAL FORM;Lo;0;AL;<final> 0644 0627;;;;N;GLYPH FOR FINAL ARABIC LIGATURE LAM ALEF;;;;
+FEFF;ZERO WIDTH NO-BREAK SPACE;Cf;0;BN;;;;;N;BYTE ORDER MARK;;;;
+FF01;FULLWIDTH EXCLAMATION MARK;Po;0;ON;<wide> 0021;;;;N;;;;;
+FF02;FULLWIDTH QUOTATION MARK;Po;0;ON;<wide> 0022;;;;N;;;;;
+FF03;FULLWIDTH NUMBER SIGN;Po;0;ET;<wide> 0023;;;;N;;;;;
+FF04;FULLWIDTH DOLLAR SIGN;Sc;0;ET;<wide> 0024;;;;N;;;;;
+FF05;FULLWIDTH PERCENT SIGN;Po;0;ET;<wide> 0025;;;;N;;;;;
+FF06;FULLWIDTH AMPERSAND;Po;0;ON;<wide> 0026;;;;N;;;;;
+FF07;FULLWIDTH APOSTROPHE;Po;0;ON;<wide> 0027;;;;N;;;;;
+FF08;FULLWIDTH LEFT PARENTHESIS;Ps;0;ON;<wide> 0028;;;;N;FULLWIDTH OPENING PARENTHESIS;;;;
+FF09;FULLWIDTH RIGHT PARENTHESIS;Pe;0;ON;<wide> 0029;;;;N;FULLWIDTH CLOSING PARENTHESIS;;;;
+FF0A;FULLWIDTH ASTERISK;Po;0;ON;<wide> 002A;;;;N;;;;;
+FF0B;FULLWIDTH PLUS SIGN;Sm;0;ET;<wide> 002B;;;;N;;;;;
+FF0C;FULLWIDTH COMMA;Po;0;CS;<wide> 002C;;;;N;;;;;
+FF0D;FULLWIDTH HYPHEN-MINUS;Pd;0;ET;<wide> 002D;;;;N;;;;;
+FF0E;FULLWIDTH FULL STOP;Po;0;CS;<wide> 002E;;;;N;FULLWIDTH PERIOD;;;;
+FF0F;FULLWIDTH SOLIDUS;Po;0;ES;<wide> 002F;;;;N;FULLWIDTH SLASH;;;;
+FF10;FULLWIDTH DIGIT ZERO;Nd;0;EN;<wide> 0030;0;0;0;N;;;;;
+FF11;FULLWIDTH DIGIT ONE;Nd;0;EN;<wide> 0031;1;1;1;N;;;;;
+FF12;FULLWIDTH DIGIT TWO;Nd;0;EN;<wide> 0032;2;2;2;N;;;;;
+FF13;FULLWIDTH DIGIT THREE;Nd;0;EN;<wide> 0033;3;3;3;N;;;;;
+FF14;FULLWIDTH DIGIT FOUR;Nd;0;EN;<wide> 0034;4;4;4;N;;;;;
+FF15;FULLWIDTH DIGIT FIVE;Nd;0;EN;<wide> 0035;5;5;5;N;;;;;
+FF16;FULLWIDTH DIGIT SIX;Nd;0;EN;<wide> 0036;6;6;6;N;;;;;
+FF17;FULLWIDTH DIGIT SEVEN;Nd;0;EN;<wide> 0037;7;7;7;N;;;;;
+FF18;FULLWIDTH DIGIT EIGHT;Nd;0;EN;<wide> 0038;8;8;8;N;;;;;
+FF19;FULLWIDTH DIGIT NINE;Nd;0;EN;<wide> 0039;9;9;9;N;;;;;
+FF1A;FULLWIDTH COLON;Po;0;CS;<wide> 003A;;;;N;;;;;
+FF1B;FULLWIDTH SEMICOLON;Po;0;ON;<wide> 003B;;;;N;;;;;
+FF1C;FULLWIDTH LESS-THAN SIGN;Sm;0;ON;<wide> 003C;;;;N;;;;;
+FF1D;FULLWIDTH EQUALS SIGN;Sm;0;ON;<wide> 003D;;;;N;;;;;
+FF1E;FULLWIDTH GREATER-THAN SIGN;Sm;0;ON;<wide> 003E;;;;N;;;;;
+FF1F;FULLWIDTH QUESTION MARK;Po;0;ON;<wide> 003F;;;;N;;;;;
+FF20;FULLWIDTH COMMERCIAL AT;Po;0;ON;<wide> 0040;;;;N;;;;;
+FF21;FULLWIDTH LATIN CAPITAL LETTER A;Lu;0;L;<wide> 0041;;;;N;;;;FF41;
+FF22;FULLWIDTH LATIN CAPITAL LETTER B;Lu;0;L;<wide> 0042;;;;N;;;;FF42;
+FF23;FULLWIDTH LATIN CAPITAL LETTER C;Lu;0;L;<wide> 0043;;;;N;;;;FF43;
+FF24;FULLWIDTH LATIN CAPITAL LETTER D;Lu;0;L;<wide> 0044;;;;N;;;;FF44;
+FF25;FULLWIDTH LATIN CAPITAL LETTER E;Lu;0;L;<wide> 0045;;;;N;;;;FF45;
+FF26;FULLWIDTH LATIN CAPITAL LETTER F;Lu;0;L;<wide> 0046;;;;N;;;;FF46;
+FF27;FULLWIDTH LATIN CAPITAL LETTER G;Lu;0;L;<wide> 0047;;;;N;;;;FF47;
+FF28;FULLWIDTH LATIN CAPITAL LETTER H;Lu;0;L;<wide> 0048;;;;N;;;;FF48;
+FF29;FULLWIDTH LATIN CAPITAL LETTER I;Lu;0;L;<wide> 0049;;;;N;;;;FF49;
+FF2A;FULLWIDTH LATIN CAPITAL LETTER J;Lu;0;L;<wide> 004A;;;;N;;;;FF4A;
+FF2B;FULLWIDTH LATIN CAPITAL LETTER K;Lu;0;L;<wide> 004B;;;;N;;;;FF4B;
+FF2C;FULLWIDTH LATIN CAPITAL LETTER L;Lu;0;L;<wide> 004C;;;;N;;;;FF4C;
+FF2D;FULLWIDTH LATIN CAPITAL LETTER M;Lu;0;L;<wide> 004D;;;;N;;;;FF4D;
+FF2E;FULLWIDTH LATIN CAPITAL LETTER N;Lu;0;L;<wide> 004E;;;;N;;;;FF4E;
+FF2F;FULLWIDTH LATIN CAPITAL LETTER O;Lu;0;L;<wide> 004F;;;;N;;;;FF4F;
+FF30;FULLWIDTH LATIN CAPITAL LETTER P;Lu;0;L;<wide> 0050;;;;N;;;;FF50;
+FF31;FULLWIDTH LATIN CAPITAL LETTER Q;Lu;0;L;<wide> 0051;;;;N;;;;FF51;
+FF32;FULLWIDTH LATIN CAPITAL LETTER R;Lu;0;L;<wide> 0052;;;;N;;;;FF52;
+FF33;FULLWIDTH LATIN CAPITAL LETTER S;Lu;0;L;<wide> 0053;;;;N;;;;FF53;
+FF34;FULLWIDTH LATIN CAPITAL LETTER T;Lu;0;L;<wide> 0054;;;;N;;;;FF54;
+FF35;FULLWIDTH LATIN CAPITAL LETTER U;Lu;0;L;<wide> 0055;;;;N;;;;FF55;
+FF36;FULLWIDTH LATIN CAPITAL LETTER V;Lu;0;L;<wide> 0056;;;;N;;;;FF56;
+FF37;FULLWIDTH LATIN CAPITAL LETTER W;Lu;0;L;<wide> 0057;;;;N;;;;FF57;
+FF38;FULLWIDTH LATIN CAPITAL LETTER X;Lu;0;L;<wide> 0058;;;;N;;;;FF58;
+FF39;FULLWIDTH LATIN CAPITAL LETTER Y;Lu;0;L;<wide> 0059;;;;N;;;;FF59;
+FF3A;FULLWIDTH LATIN CAPITAL LETTER Z;Lu;0;L;<wide> 005A;;;;N;;;;FF5A;
+FF3B;FULLWIDTH LEFT SQUARE BRACKET;Ps;0;ON;<wide> 005B;;;;N;FULLWIDTH OPENING SQUARE BRACKET;;;;
+FF3C;FULLWIDTH REVERSE SOLIDUS;Po;0;ON;<wide> 005C;;;;N;FULLWIDTH BACKSLASH;;;;
+FF3D;FULLWIDTH RIGHT SQUARE BRACKET;Pe;0;ON;<wide> 005D;;;;N;FULLWIDTH CLOSING SQUARE BRACKET;;;;
+FF3E;FULLWIDTH CIRCUMFLEX ACCENT;Sk;0;ON;<wide> 005E;;;;N;FULLWIDTH SPACING CIRCUMFLEX;;;;
+FF3F;FULLWIDTH LOW LINE;Pc;0;ON;<wide> 005F;;;;N;FULLWIDTH SPACING UNDERSCORE;;;;
+FF40;FULLWIDTH GRAVE ACCENT;Sk;0;ON;<wide> 0060;;;;N;FULLWIDTH SPACING GRAVE;;;;
+FF41;FULLWIDTH LATIN SMALL LETTER A;Ll;0;L;<wide> 0061;;;;N;;;FF21;;FF21
+FF42;FULLWIDTH LATIN SMALL LETTER B;Ll;0;L;<wide> 0062;;;;N;;;FF22;;FF22
+FF43;FULLWIDTH LATIN SMALL LETTER C;Ll;0;L;<wide> 0063;;;;N;;;FF23;;FF23
+FF44;FULLWIDTH LATIN SMALL LETTER D;Ll;0;L;<wide> 0064;;;;N;;;FF24;;FF24
+FF45;FULLWIDTH LATIN SMALL LETTER E;Ll;0;L;<wide> 0065;;;;N;;;FF25;;FF25
+FF46;FULLWIDTH LATIN SMALL LETTER F;Ll;0;L;<wide> 0066;;;;N;;;FF26;;FF26
+FF47;FULLWIDTH LATIN SMALL LETTER G;Ll;0;L;<wide> 0067;;;;N;;;FF27;;FF27
+FF48;FULLWIDTH LATIN SMALL LETTER H;Ll;0;L;<wide> 0068;;;;N;;;FF28;;FF28
+FF49;FULLWIDTH LATIN SMALL LETTER I;Ll;0;L;<wide> 0069;;;;N;;;FF29;;FF29
+FF4A;FULLWIDTH LATIN SMALL LETTER J;Ll;0;L;<wide> 006A;;;;N;;;FF2A;;FF2A
+FF4B;FULLWIDTH LATIN SMALL LETTER K;Ll;0;L;<wide> 006B;;;;N;;;FF2B;;FF2B
+FF4C;FULLWIDTH LATIN SMALL LETTER L;Ll;0;L;<wide> 006C;;;;N;;;FF2C;;FF2C
+FF4D;FULLWIDTH LATIN SMALL LETTER M;Ll;0;L;<wide> 006D;;;;N;;;FF2D;;FF2D
+FF4E;FULLWIDTH LATIN SMALL LETTER N;Ll;0;L;<wide> 006E;;;;N;;;FF2E;;FF2E
+FF4F;FULLWIDTH LATIN SMALL LETTER O;Ll;0;L;<wide> 006F;;;;N;;;FF2F;;FF2F
+FF50;FULLWIDTH LATIN SMALL LETTER P;Ll;0;L;<wide> 0070;;;;N;;;FF30;;FF30
+FF51;FULLWIDTH LATIN SMALL LETTER Q;Ll;0;L;<wide> 0071;;;;N;;;FF31;;FF31
+FF52;FULLWIDTH LATIN SMALL LETTER R;Ll;0;L;<wide> 0072;;;;N;;;FF32;;FF32
+FF53;FULLWIDTH LATIN SMALL LETTER S;Ll;0;L;<wide> 0073;;;;N;;;FF33;;FF33
+FF54;FULLWIDTH LATIN SMALL LETTER T;Ll;0;L;<wide> 0074;;;;N;;;FF34;;FF34
+FF55;FULLWIDTH LATIN SMALL LETTER U;Ll;0;L;<wide> 0075;;;;N;;;FF35;;FF35
+FF56;FULLWIDTH LATIN SMALL LETTER V;Ll;0;L;<wide> 0076;;;;N;;;FF36;;FF36
+FF57;FULLWIDTH LATIN SMALL LETTER W;Ll;0;L;<wide> 0077;;;;N;;;FF37;;FF37
+FF58;FULLWIDTH LATIN SMALL LETTER X;Ll;0;L;<wide> 0078;;;;N;;;FF38;;FF38
+FF59;FULLWIDTH LATIN SMALL LETTER Y;Ll;0;L;<wide> 0079;;;;N;;;FF39;;FF39
+FF5A;FULLWIDTH LATIN SMALL LETTER Z;Ll;0;L;<wide> 007A;;;;N;;;FF3A;;FF3A
+FF5B;FULLWIDTH LEFT CURLY BRACKET;Ps;0;ON;<wide> 007B;;;;N;FULLWIDTH OPENING CURLY BRACKET;;;;
+FF5C;FULLWIDTH VERTICAL LINE;Sm;0;ON;<wide> 007C;;;;N;FULLWIDTH VERTICAL BAR;;;;
+FF5D;FULLWIDTH RIGHT CURLY BRACKET;Pe;0;ON;<wide> 007D;;;;N;FULLWIDTH CLOSING CURLY BRACKET;;;;
+FF5E;FULLWIDTH TILDE;Sm;0;ON;<wide> 007E;;;;N;FULLWIDTH SPACING TILDE;;;;
+FF61;HALFWIDTH IDEOGRAPHIC FULL STOP;Po;0;ON;<narrow> 3002;;;;N;HALFWIDTH IDEOGRAPHIC PERIOD;;;;
+FF62;HALFWIDTH LEFT CORNER BRACKET;Ps;0;ON;<narrow> 300C;;;;N;HALFWIDTH OPENING CORNER BRACKET;;;;
+FF63;HALFWIDTH RIGHT CORNER BRACKET;Pe;0;ON;<narrow> 300D;;;;N;HALFWIDTH CLOSING CORNER BRACKET;;;;
+FF64;HALFWIDTH IDEOGRAPHIC COMMA;Po;0;ON;<narrow> 3001;;;;N;;;;;
+FF65;HALFWIDTH KATAKANA MIDDLE DOT;Pc;0;ON;<narrow> 30FB;;;;N;;;;;
+FF66;HALFWIDTH KATAKANA LETTER WO;Lo;0;L;<narrow> 30F2;;;;N;;;;;
+FF67;HALFWIDTH KATAKANA LETTER SMALL A;Lo;0;L;<narrow> 30A1;;;;N;;;;;
+FF68;HALFWIDTH KATAKANA LETTER SMALL I;Lo;0;L;<narrow> 30A3;;;;N;;;;;
+FF69;HALFWIDTH KATAKANA LETTER SMALL U;Lo;0;L;<narrow> 30A5;;;;N;;;;;
+FF6A;HALFWIDTH KATAKANA LETTER SMALL E;Lo;0;L;<narrow> 30A7;;;;N;;;;;
+FF6B;HALFWIDTH KATAKANA LETTER SMALL O;Lo;0;L;<narrow> 30A9;;;;N;;;;;
+FF6C;HALFWIDTH KATAKANA LETTER SMALL YA;Lo;0;L;<narrow> 30E3;;;;N;;;;;
+FF6D;HALFWIDTH KATAKANA LETTER SMALL YU;Lo;0;L;<narrow> 30E5;;;;N;;;;;
+FF6E;HALFWIDTH KATAKANA LETTER SMALL YO;Lo;0;L;<narrow> 30E7;;;;N;;;;;
+FF6F;HALFWIDTH KATAKANA LETTER SMALL TU;Lo;0;L;<narrow> 30C3;;;;N;;;;;
+FF70;HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK;Lm;0;L;<narrow> 30FC;;;;N;;;;;
+FF71;HALFWIDTH KATAKANA LETTER A;Lo;0;L;<narrow> 30A2;;;;N;;;;;
+FF72;HALFWIDTH KATAKANA LETTER I;Lo;0;L;<narrow> 30A4;;;;N;;;;;
+FF73;HALFWIDTH KATAKANA LETTER U;Lo;0;L;<narrow> 30A6;;;;N;;;;;
+FF74;HALFWIDTH KATAKANA LETTER E;Lo;0;L;<narrow> 30A8;;;;N;;;;;
+FF75;HALFWIDTH KATAKANA LETTER O;Lo;0;L;<narrow> 30AA;;;;N;;;;;
+FF76;HALFWIDTH KATAKANA LETTER KA;Lo;0;L;<narrow> 30AB;;;;N;;;;;
+FF77;HALFWIDTH KATAKANA LETTER KI;Lo;0;L;<narrow> 30AD;;;;N;;;;;
+FF78;HALFWIDTH KATAKANA LETTER KU;Lo;0;L;<narrow> 30AF;;;;N;;;;;
+FF79;HALFWIDTH KATAKANA LETTER KE;Lo;0;L;<narrow> 30B1;;;;N;;;;;
+FF7A;HALFWIDTH KATAKANA LETTER KO;Lo;0;L;<narrow> 30B3;;;;N;;;;;
+FF7B;HALFWIDTH KATAKANA LETTER SA;Lo;0;L;<narrow> 30B5;;;;N;;;;;
+FF7C;HALFWIDTH KATAKANA LETTER SI;Lo;0;L;<narrow> 30B7;;;;N;;;;;
+FF7D;HALFWIDTH KATAKANA LETTER SU;Lo;0;L;<narrow> 30B9;;;;N;;;;;
+FF7E;HALFWIDTH KATAKANA LETTER SE;Lo;0;L;<narrow> 30BB;;;;N;;;;;
+FF7F;HALFWIDTH KATAKANA LETTER SO;Lo;0;L;<narrow> 30BD;;;;N;;;;;
+FF80;HALFWIDTH KATAKANA LETTER TA;Lo;0;L;<narrow> 30BF;;;;N;;;;;
+FF81;HALFWIDTH KATAKANA LETTER TI;Lo;0;L;<narrow> 30C1;;;;N;;;;;
+FF82;HALFWIDTH KATAKANA LETTER TU;Lo;0;L;<narrow> 30C4;;;;N;;;;;
+FF83;HALFWIDTH KATAKANA LETTER TE;Lo;0;L;<narrow> 30C6;;;;N;;;;;
+FF84;HALFWIDTH KATAKANA LETTER TO;Lo;0;L;<narrow> 30C8;;;;N;;;;;
+FF85;HALFWIDTH KATAKANA LETTER NA;Lo;0;L;<narrow> 30CA;;;;N;;;;;
+FF86;HALFWIDTH KATAKANA LETTER NI;Lo;0;L;<narrow> 30CB;;;;N;;;;;
+FF87;HALFWIDTH KATAKANA LETTER NU;Lo;0;L;<narrow> 30CC;;;;N;;;;;
+FF88;HALFWIDTH KATAKANA LETTER NE;Lo;0;L;<narrow> 30CD;;;;N;;;;;
+FF89;HALFWIDTH KATAKANA LETTER NO;Lo;0;L;<narrow> 30CE;;;;N;;;;;
+FF8A;HALFWIDTH KATAKANA LETTER HA;Lo;0;L;<narrow> 30CF;;;;N;;;;;
+FF8B;HALFWIDTH KATAKANA LETTER HI;Lo;0;L;<narrow> 30D2;;;;N;;;;;
+FF8C;HALFWIDTH KATAKANA LETTER HU;Lo;0;L;<narrow> 30D5;;;;N;;;;;
+FF8D;HALFWIDTH KATAKANA LETTER HE;Lo;0;L;<narrow> 30D8;;;;N;;;;;
+FF8E;HALFWIDTH KATAKANA LETTER HO;Lo;0;L;<narrow> 30DB;;;;N;;;;;
+FF8F;HALFWIDTH KATAKANA LETTER MA;Lo;0;L;<narrow> 30DE;;;;N;;;;;
+FF90;HALFWIDTH KATAKANA LETTER MI;Lo;0;L;<narrow> 30DF;;;;N;;;;;
+FF91;HALFWIDTH KATAKANA LETTER MU;Lo;0;L;<narrow> 30E0;;;;N;;;;;
+FF92;HALFWIDTH KATAKANA LETTER ME;Lo;0;L;<narrow> 30E1;;;;N;;;;;
+FF93;HALFWIDTH KATAKANA LETTER MO;Lo;0;L;<narrow> 30E2;;;;N;;;;;
+FF94;HALFWIDTH KATAKANA LETTER YA;Lo;0;L;<narrow> 30E4;;;;N;;;;;
+FF95;HALFWIDTH KATAKANA LETTER YU;Lo;0;L;<narrow> 30E6;;;;N;;;;;
+FF96;HALFWIDTH KATAKANA LETTER YO;Lo;0;L;<narrow> 30E8;;;;N;;;;;
+FF97;HALFWIDTH KATAKANA LETTER RA;Lo;0;L;<narrow> 30E9;;;;N;;;;;
+FF98;HALFWIDTH KATAKANA LETTER RI;Lo;0;L;<narrow> 30EA;;;;N;;;;;
+FF99;HALFWIDTH KATAKANA LETTER RU;Lo;0;L;<narrow> 30EB;;;;N;;;;;
+FF9A;HALFWIDTH KATAKANA LETTER RE;Lo;0;L;<narrow> 30EC;;;;N;;;;;
+FF9B;HALFWIDTH KATAKANA LETTER RO;Lo;0;L;<narrow> 30ED;;;;N;;;;;
+FF9C;HALFWIDTH KATAKANA LETTER WA;Lo;0;L;<narrow> 30EF;;;;N;;;;;
+FF9D;HALFWIDTH KATAKANA LETTER N;Lo;0;L;<narrow> 30F3;;;;N;;;;;
+FF9E;HALFWIDTH KATAKANA VOICED SOUND MARK;Lm;0;L;<narrow> 3099;;;;N;;halfwidth katakana-hiragana voiced sound mark;;;
+FF9F;HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK;Lm;0;L;<narrow> 309A;;;;N;;halfwidth katakana-hiragana semi-voiced sound mark;;;
+FFA0;HALFWIDTH HANGUL FILLER;Lo;0;L;<narrow> 3164;;;;N;HALFWIDTH HANGUL CAE OM;;;;
+FFA1;HALFWIDTH HANGUL LETTER KIYEOK;Lo;0;L;<narrow> 3131;;;;N;HALFWIDTH HANGUL LETTER GIYEOG;;;;
+FFA2;HALFWIDTH HANGUL LETTER SSANGKIYEOK;Lo;0;L;<narrow> 3132;;;;N;HALFWIDTH HANGUL LETTER SSANG GIYEOG;;;;
+FFA3;HALFWIDTH HANGUL LETTER KIYEOK-SIOS;Lo;0;L;<narrow> 3133;;;;N;HALFWIDTH HANGUL LETTER GIYEOG SIOS;;;;
+FFA4;HALFWIDTH HANGUL LETTER NIEUN;Lo;0;L;<narrow> 3134;;;;N;;;;;
+FFA5;HALFWIDTH HANGUL LETTER NIEUN-CIEUC;Lo;0;L;<narrow> 3135;;;;N;HALFWIDTH HANGUL LETTER NIEUN JIEUJ;;;;
+FFA6;HALFWIDTH HANGUL LETTER NIEUN-HIEUH;Lo;0;L;<narrow> 3136;;;;N;HALFWIDTH HANGUL LETTER NIEUN HIEUH;;;;
+FFA7;HALFWIDTH HANGUL LETTER TIKEUT;Lo;0;L;<narrow> 3137;;;;N;HALFWIDTH HANGUL LETTER DIGEUD;;;;
+FFA8;HALFWIDTH HANGUL LETTER SSANGTIKEUT;Lo;0;L;<narrow> 3138;;;;N;HALFWIDTH HANGUL LETTER SSANG DIGEUD;;;;
+FFA9;HALFWIDTH HANGUL LETTER RIEUL;Lo;0;L;<narrow> 3139;;;;N;HALFWIDTH HANGUL LETTER LIEUL;;;;
+FFAA;HALFWIDTH HANGUL LETTER RIEUL-KIYEOK;Lo;0;L;<narrow> 313A;;;;N;HALFWIDTH HANGUL LETTER LIEUL GIYEOG;;;;
+FFAB;HALFWIDTH HANGUL LETTER RIEUL-MIEUM;Lo;0;L;<narrow> 313B;;;;N;HALFWIDTH HANGUL LETTER LIEUL MIEUM;;;;
+FFAC;HALFWIDTH HANGUL LETTER RIEUL-PIEUP;Lo;0;L;<narrow> 313C;;;;N;HALFWIDTH HANGUL LETTER LIEUL BIEUB;;;;
+FFAD;HALFWIDTH HANGUL LETTER RIEUL-SIOS;Lo;0;L;<narrow> 313D;;;;N;HALFWIDTH HANGUL LETTER LIEUL SIOS;;;;
+FFAE;HALFWIDTH HANGUL LETTER RIEUL-THIEUTH;Lo;0;L;<narrow> 313E;;;;N;HALFWIDTH HANGUL LETTER LIEUL TIEUT;;;;
+FFAF;HALFWIDTH HANGUL LETTER RIEUL-PHIEUPH;Lo;0;L;<narrow> 313F;;;;N;HALFWIDTH HANGUL LETTER LIEUL PIEUP;;;;
+FFB0;HALFWIDTH HANGUL LETTER RIEUL-HIEUH;Lo;0;L;<narrow> 3140;;;;N;HALFWIDTH HANGUL LETTER LIEUL HIEUH;;;;
+FFB1;HALFWIDTH HANGUL LETTER MIEUM;Lo;0;L;<narrow> 3141;;;;N;;;;;
+FFB2;HALFWIDTH HANGUL LETTER PIEUP;Lo;0;L;<narrow> 3142;;;;N;HALFWIDTH HANGUL LETTER BIEUB;;;;
+FFB3;HALFWIDTH HANGUL LETTER SSANGPIEUP;Lo;0;L;<narrow> 3143;;;;N;HALFWIDTH HANGUL LETTER SSANG BIEUB;;;;
+FFB4;HALFWIDTH HANGUL LETTER PIEUP-SIOS;Lo;0;L;<narrow> 3144;;;;N;HALFWIDTH HANGUL LETTER BIEUB SIOS;;;;
+FFB5;HALFWIDTH HANGUL LETTER SIOS;Lo;0;L;<narrow> 3145;;;;N;;;;;
+FFB6;HALFWIDTH HANGUL LETTER SSANGSIOS;Lo;0;L;<narrow> 3146;;;;N;HALFWIDTH HANGUL LETTER SSANG SIOS;;;;
+FFB7;HALFWIDTH HANGUL LETTER IEUNG;Lo;0;L;<narrow> 3147;;;;N;;;;;
+FFB8;HALFWIDTH HANGUL LETTER CIEUC;Lo;0;L;<narrow> 3148;;;;N;HALFWIDTH HANGUL LETTER JIEUJ;;;;
+FFB9;HALFWIDTH HANGUL LETTER SSANGCIEUC;Lo;0;L;<narrow> 3149;;;;N;HALFWIDTH HANGUL LETTER SSANG JIEUJ;;;;
+FFBA;HALFWIDTH HANGUL LETTER CHIEUCH;Lo;0;L;<narrow> 314A;;;;N;HALFWIDTH HANGUL LETTER CIEUC;;;;
+FFBB;HALFWIDTH HANGUL LETTER KHIEUKH;Lo;0;L;<narrow> 314B;;;;N;HALFWIDTH HANGUL LETTER KIYEOK;;;;
+FFBC;HALFWIDTH HANGUL LETTER THIEUTH;Lo;0;L;<narrow> 314C;;;;N;HALFWIDTH HANGUL LETTER TIEUT;;;;
+FFBD;HALFWIDTH HANGUL LETTER PHIEUPH;Lo;0;L;<narrow> 314D;;;;N;HALFWIDTH HANGUL LETTER PIEUP;;;;
+FFBE;HALFWIDTH HANGUL LETTER HIEUH;Lo;0;L;<narrow> 314E;;;;N;;;;;
+FFC2;HALFWIDTH HANGUL LETTER A;Lo;0;L;<narrow> 314F;;;;N;;;;;
+FFC3;HALFWIDTH HANGUL LETTER AE;Lo;0;L;<narrow> 3150;;;;N;;;;;
+FFC4;HALFWIDTH HANGUL LETTER YA;Lo;0;L;<narrow> 3151;;;;N;;;;;
+FFC5;HALFWIDTH HANGUL LETTER YAE;Lo;0;L;<narrow> 3152;;;;N;;;;;
+FFC6;HALFWIDTH HANGUL LETTER EO;Lo;0;L;<narrow> 3153;;;;N;;;;;
+FFC7;HALFWIDTH HANGUL LETTER E;Lo;0;L;<narrow> 3154;;;;N;;;;;
+FFCA;HALFWIDTH HANGUL LETTER YEO;Lo;0;L;<narrow> 3155;;;;N;;;;;
+FFCB;HALFWIDTH HANGUL LETTER YE;Lo;0;L;<narrow> 3156;;;;N;;;;;
+FFCC;HALFWIDTH HANGUL LETTER O;Lo;0;L;<narrow> 3157;;;;N;;;;;
+FFCD;HALFWIDTH HANGUL LETTER WA;Lo;0;L;<narrow> 3158;;;;N;;;;;
+FFCE;HALFWIDTH HANGUL LETTER WAE;Lo;0;L;<narrow> 3159;;;;N;;;;;
+FFCF;HALFWIDTH HANGUL LETTER OE;Lo;0;L;<narrow> 315A;;;;N;;;;;
+FFD2;HALFWIDTH HANGUL LETTER YO;Lo;0;L;<narrow> 315B;;;;N;;;;;
+FFD3;HALFWIDTH HANGUL LETTER U;Lo;0;L;<narrow> 315C;;;;N;;;;;
+FFD4;HALFWIDTH HANGUL LETTER WEO;Lo;0;L;<narrow> 315D;;;;N;;;;;
+FFD5;HALFWIDTH HANGUL LETTER WE;Lo;0;L;<narrow> 315E;;;;N;;;;;
+FFD6;HALFWIDTH HANGUL LETTER WI;Lo;0;L;<narrow> 315F;;;;N;;;;;
+FFD7;HALFWIDTH HANGUL LETTER YU;Lo;0;L;<narrow> 3160;;;;N;;;;;
+FFDA;HALFWIDTH HANGUL LETTER EU;Lo;0;L;<narrow> 3161;;;;N;;;;;
+FFDB;HALFWIDTH HANGUL LETTER YI;Lo;0;L;<narrow> 3162;;;;N;;;;;
+FFDC;HALFWIDTH HANGUL LETTER I;Lo;0;L;<narrow> 3163;;;;N;;;;;
+FFE0;FULLWIDTH CENT SIGN;Sc;0;ET;<wide> 00A2;;;;N;;;;;
+FFE1;FULLWIDTH POUND SIGN;Sc;0;ET;<wide> 00A3;;;;N;;;;;
+FFE2;FULLWIDTH NOT SIGN;Sm;0;ON;<wide> 00AC;;;;N;;;;;
+FFE3;FULLWIDTH MACRON;Sk;0;ON;<wide> 00AF;;;;N;FULLWIDTH SPACING MACRON;*;;;
+FFE4;FULLWIDTH BROKEN BAR;So;0;ON;<wide> 00A6;;;;N;FULLWIDTH BROKEN VERTICAL BAR;;;;
+FFE5;FULLWIDTH YEN SIGN;Sc;0;ET;<wide> 00A5;;;;N;;;;;
+FFE6;FULLWIDTH WON SIGN;Sc;0;ET;<wide> 20A9;;;;N;;;;;
+FFE8;HALFWIDTH FORMS LIGHT VERTICAL;So;0;ON;<narrow> 2502;;;;N;;;;;
+FFE9;HALFWIDTH LEFTWARDS ARROW;Sm;0;ON;<narrow> 2190;;;;N;;;;;
+FFEA;HALFWIDTH UPWARDS ARROW;Sm;0;ON;<narrow> 2191;;;;N;;;;;
+FFEB;HALFWIDTH RIGHTWARDS ARROW;Sm;0;ON;<narrow> 2192;;;;N;;;;;
+FFEC;HALFWIDTH DOWNWARDS ARROW;Sm;0;ON;<narrow> 2193;;;;N;;;;;
+FFED;HALFWIDTH BLACK SQUARE;So;0;ON;<narrow> 25A0;;;;N;;;;;
+FFEE;HALFWIDTH WHITE CIRCLE;So;0;ON;<narrow> 25CB;;;;N;;;;;
+FFF9;INTERLINEAR ANNOTATION ANCHOR;Cf;0;BN;;;;;N;;;;;
+FFFA;INTERLINEAR ANNOTATION SEPARATOR;Cf;0;BN;;;;;N;;;;;
+FFFB;INTERLINEAR ANNOTATION TERMINATOR;Cf;0;BN;;;;;N;;;;;
+FFFC;OBJECT REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
+FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
+F0000;<Plane 15 Private Use, First>;Co;0;L;;;;;N;;;;;
+FFFFD;<Plane 15 Private Use, Last>;Co;0;L;;;;;N;;;;;
+100000;<Plane 16 Private Use, First>;Co;0;L;;;;;N;;;;;
+10FFFD;<Plane 16 Private Use, Last>;Co;0;L;;;;;N;;;;;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32test/buffer/t_bflat.cpp	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,173 @@
+// Copyright (c) 1994-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32test\buffer\t_bflat.cpp
+// Overview:
+// Test all aspects of the CBufFlat class.
+// API Information:
+// CBufFlat.
+// Details:
+// - Test all the operations of the class and see if methods are implemented -- 
+// including NewL, Reset, Size, Set Reserve, InsertL, Delete, Ptr, Read, Write and Compress.
+// - Test CBufFlat constructor is as expected.
+// - Insert data into the flat storage dynamic buffer and verify that InsertL method
+// is as expected.
+// - Delete all data in buffer using Reset() method  and check size is zero.
+// - Test Ptr, Free, Size, Backptr and SetReserveL methods work as expected.
+// - Insert data into the buffer, delete some data from the beginning, middle, end and
+// check for data is as expected. 
+// - Verify the data in the buffer before and after Compress and Read methods is as expected.
+// Platforms/Drives/Compatibility:
+// All 
+// Assumptions/Requirement/Pre-requisites:
+// Failures and causes:
+// Base Port information:
+// 
+//
+
+#include <e32test.h>
+
+LOCAL_D RTest test(_L("T_BFLAT"));
+
+class TestCBufFlat
+	{
+public:
+	void Test1();  // Tests all operations of the class.
+	void Test2();	// Test public methods of class.
+	};
+
+class TestCBufSeg
+	{
+public:
+	void Test1(); 	// Test all operations of the class.
+	};
+
+GLDEF_C void TestCBufFlat::Test1()
+//
+// Tests all operations of the class.
+//
+	{
+	TText* tp;
+	test.Start(_L("Test all operations of CBufFlat"));
+	CBufFlat* bf=(CBufFlat*)CBufFlat::NewL(100);
+	bf->Reset();
+	bf->Size();
+	bf->SetReserveL(50); // Panics if 50 < iSize
+	bf->InsertL(0,TPtrC8((TText8*)"Hello World"));
+	bf->Delete(0,5);
+	tp=(TText*)bf->Ptr(3).Ptr();
+	tp=(TText*)bf->BackPtr(3).Ptr();
+	bf->Read(2,tp,2);
+	bf->Write(2,tp,2);
+	bf->Compress();
+	test.End();
+	}
+
+GLDEF_C void TestCBufFlat::Test2()
+//
+// Test all the methods of the class
+//
+	{
+
+	test.Start(_L("Test constructor of CBufFlat"));
+	CBufFlat* bf1=(CBufFlat*)CBufFlat::NewL(20);
+	test(bf1->Size()==0);
+	test(bf1->Ptr(0).Length()==0);
+
+	test.Next(_L("Insert, Reset, Ptr, Free, Size"));
+	TBuf8<0x40> tb1=(TText8*)"Hello World";
+	TBuf8<0x40> tb2=(TText8*)"This string is greater than twenty characters long";
+	TBuf8<0x40> tb3;
+	bf1->InsertL(0,tb1); // Insert - no expand
+	test(bf1->Ptr(0)==tb1);
+	test(bf1->Size()==tb1.Size());
+	test(bf1->Ptr(0).Length()==tb1.Size());
+	bf1->InsertL(bf1->Size(),tb2); // Insert and expand
+	test(bf1->Size()==(tb1.Size()+tb2.Size()));
+	test(bf1->Ptr(0).Left(tb1.Length())==tb1);
+	test(bf1->Ptr(tb1.Length())==tb2);
+	bf1->InsertL(bf1->Size(),tb3);	// Insert a null string
+	test(bf1->Size()==(tb1.Size()+tb2.Size()));
+	test(bf1->Ptr(0).Left(tb1.Length())==tb1);
+	test(bf1->Ptr(tb1.Length())==tb2);
+	bf1->Reset(); // Reset
+	test(bf1->Size()==0);
+	bf1->InsertL(0,tb1); // Insert into a string
+	bf1->InsertL(5,tb1);
+	bf1->Delete(16,bf1->Size()-16);
+	test(bf1->Ptr(0)==TPtrC8((TText8*)"HelloHello World"));
+//
+	test.Next(_L("SetReserve"));
+	bf1->SetReserveL(50); // SetReserve > 0
+	test(bf1->Size()==16);
+	test(bf1->Ptr(0).Length()==16);
+	bf1->Reset();
+	bf1->SetReserveL(0); // SetReserve = 0
+	test(bf1->Size()==0);
+	test(bf1->Ptr(0).Length()==0);
+//
+	test.Next(_L("Delete, BackPtr"));
+	bf1->InsertL(0,tb1);
+	bf1->Delete(6,1); // Delete Middle
+	test(bf1->Ptr(0)==TPtrC8((TText8*)"Hello orld"));
+	test(bf1->Size()==10);
+	bf1->Delete(9,1); // Delete End
+	test(bf1->Ptr(bf1->Size()).Length()==0);
+	bf1->InsertL(bf1->Size(),tb3);
+	test(bf1->Ptr(0)==TPtrC8((TText8*)"Hello orl"));
+	bf1->Delete(0,2); // Delete Start / BackPtr
+	test(bf1->BackPtr(5)==TPtrC8((TText8*)"llo o"));
+	test(bf1->Size()==7);
+//
+	test.Next(_L("Write, Compress"));
+	bf1->Write(1,tb1,5);
+	test(bf1->Ptr(0)==TPtrC8((TText8*)"lHellol"));
+	test(bf1->Size()==7);
+	bf1->Compress(); // Compress
+	test(bf1->Size()==7);
+
+	test.Next(_L("Read"));
+	bf1->Read(4,tb1,bf1->Size()-4);
+	test(tb1.Size()==3);
+	test(tb1==TPtrC8((TText8*)"lol"));
+//
+	test.End();
+	}
+
+LOCAL_C void test_CBufFlat()
+//
+// Test the BufFlat class.
+//
+	{
+	TestCBufFlat b;
+
+	test.Start(_L("All operations"));
+	b.Test1();
+	test.Next(_L("All methods"));
+	b.Test2();
+//
+	test.End();
+	}
+
+GLDEF_C TInt E32Main()
+//
+// Test the ADT Varray types.
+//
+	{
+	test.Title();
+	test.Start(_L("class CBufFlat"));
+	test_CBufFlat();
+	test.End();
+	return(0);
+	}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32test/buffer/t_bseg.cpp	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,468 @@
+// Copyright (c) 1994-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32test\buffer\t_bseg.cpp
+// Overview:
+// Test all aspects of the CBufSeg class.
+// API Information:
+// CBufSeg.
+// Details:
+// - Create a segmented dynamic buffer of specified size.
+// - Test all operations of CBufSeg class and see if methods are implemented -- 
+// including NewL, Reset, Size, InsertL, Delete, Ptr, BackPtr, Read, Write and Compress.
+// - Test CBufSeg constructor is as expected.
+// - Insert data into the segmented dynamic buffer and verify that InsertL method
+// is as expected using the Read and Write methods.
+// - Delete all data using Reset method and check size is zero.
+// - Test InsertL, Read, Write and Length methods.
+// - Test Ptr, Free, Size, Backptr and SetReserveL methods are as expected.
+// - Check self consistancy of segment lengths, and check contents of segmented 
+// buffer using Ptr() and BackPtr().
+// - Verify the size of the of the test buffers are correct.
+// - Insert data into the buffer, delete some data from the beginning, middle and end
+// then check for results as expected. 
+// - Verify the data in the buffer before and after Compress method is as expected.
+// Platforms/Drives/Compatibility:
+// All 
+// Assumptions/Requirement/Pre-requisites:
+// Failures and causes:
+// Base Port information:
+// 
+//
+
+#include <e32test.h>
+
+class TBufSegLink : public TDblQueLink
+	{
+public:
+	inline TBufSegLink() : iLen(0) {}
+	inline TBufSegLink* Next() const {return((TBufSegLink*)iNext);}
+	inline TBufSegLink* Prev() const {return((TBufSegLink*)iPrev);}
+public:
+	TInt iLen;
+	};
+
+class TestCBufSeg
+	{
+public:
+	TestCBufSeg() : iDummy(0) {};
+	void Test1(); 	// Test all operations of the class.
+	void Test2();	// Inherited Methods
+	void Test3();	// Insert	
+	void Test4();	// Delete
+	void Test5();	// Compress
+	void Test6L();	// borderlines
+protected:
+	TInt iDummy;
+	static const TInt SegLen;
+	void CheckSeg(const CBufSeg*);
+	void CheckContents1(CBufSeg* const);
+	void CheckContents2(CBufSeg* const);
+	};
+
+const TInt TestCBufSeg::SegLen=64;
+
+LOCAL_D RTest test(_L("T_BSEG"));
+
+class CSpy : public CBufBase
+	{
+public:
+	~CSpy();
+protected:
+	CSpy(TInt anExpandSize);
+public:
+    TDblQue<TBufSegLink> iQue;
+	TBufSegLink* iSeg;
+	TInt iBase;
+	TInt iOffset;
+	};
+
+GLDEF_C void TestCBufSeg::CheckSeg(const CBufSeg* bf)
+//
+// Check Self consistancy of segment lengths
+//
+	{
+
+	if (bf->Size()==0)
+		return;
+	TInt sum=0;
+	TBufSegLink* p1=((CSpy*)bf)->iQue.First();
+	while (!((CSpy*)bf)->iQue.IsHead(p1))
+		{
+		test(p1->iLen<=bf->Size());
+		sum+=p1->iLen;
+		p1=p1->Next();
+		} 
+	test(sum==bf->Size());
+	sum=0;
+	p1=((CSpy*)bf)->iQue.Last();
+	while (!((CSpy*)bf)->iQue.IsHead(p1))
+		{
+		test(p1->iLen<=bf->Size());
+		sum+=p1->iLen;
+		p1=p1->Prev();
+		}
+	test(sum==bf->Size());
+	}
+
+GLDEF_C void TestCBufSeg::CheckContents1(CBufSeg* const bf)
+//
+// Check contents of segmented buffer using Ptr()
+//
+	{
+
+	TInt sum=0;
+	TInt nbytes=bf->Size();
+	for (TInt pos=0;pos<nbytes;)
+		{
+		TPtr8 p=bf->Ptr(pos);
+		TInt len=p.Length();
+		TInt8* pT=(TInt8*)p.Ptr();
+		for (TInt i=0;i<len;i++)
+			sum+=*pT++;
+		test(sum==0);
+		pos+=len;
+		}
+	}
+
+GLDEF_C void TestCBufSeg::CheckContents2(CBufSeg* const bf)
+//
+// Check contents of segmented buffer using BackPtr()
+//
+	{
+
+	TInt sum=0;
+	TInt nbytes=bf->Size();
+	for(TInt pos=nbytes;pos>0;)
+		{
+		TPtr8 p=bf->BackPtr(pos);
+		TInt len=p.Length();
+		TInt8* pT=(TInt8*)p.Ptr();
+		for (TInt i=0;i<len;i++)
+			sum+=*pT++;
+		pos-=len;
+		}
+	test(sum==0);
+	}
+
+GLDEF_C void TestCBufSeg::Test1()
+//
+// Test all operations of BufSeg class
+//
+	{
+
+	test.Start(_L("Test all operations of CBufSeg"));
+	CBufSeg* bf=(CBufSeg*)CBufSeg::NewL(100);
+	bf->Reset();
+	bf->Size();
+	bf->InsertL(0,TPtrC8((TText8*)"Hello World"));
+	bf->Delete(0,5);
+	TText8* tp=(TText8*)bf->Ptr(3).Ptr();
+	tp=(TText8*)bf->BackPtr(3).Ptr();
+	TBuf8<0x20> txt;
+	bf->Read(2,txt,2);
+	bf->Write(2,txt,2);
+	bf->Compress();
+	delete bf;
+	test.End();
+	}
+			
+GLDEF_C void TestCBufSeg::Test2()
+//
+// Test all inherited methods
+//
+	{
+
+	TBuf8<0x40> tb1=(TText8*)"Hello World";
+	TBuf8<0x40> tb2=(TText8*)"String number two";
+	TBuf8<0x40> tb3;
+	test.Start(_L("Free,Size,Read,Write,Reset"));
+	CBufSeg* bf=(CBufSeg*)CBufSeg::NewL(SegLen);
+	test(bf->Size()==0);
+	bf->InsertL(0,tb1);
+	test(bf->Size()==tb1.Length());
+	bf->Read(6,tb3,5);
+	test(tb3==tb1.Right(5));
+	bf->Write(1,tb2,6);
+	bf->Read(0,tb3,bf->Size());
+	test(tb3==TPtrC8((TText8*)"HStringorld"));
+	bf->Reset();
+	test(bf->Size()==0);
+	while (bf->Size()<400)
+		{
+		bf->InsertL(bf->Size(),tb1);
+		bf->InsertL(bf->Size(),tb2);
+		}
+	TInt i=0;
+	while (i<400)
+		{
+		bf->Read(i,tb3,tb1.Size());
+		test(tb3==tb1);
+		i+=tb1.Length();
+		bf->Read(i,tb3,tb2.Size());
+		test(tb3==tb2);
+		i+=tb2.Length();
+		}
+	i=0;
+	while (i<400)
+		{
+		bf->Write(i,tb2);
+		i+=tb2.Length();
+		bf->Write(i,tb1);
+		i+=tb1.Length();
+		}
+	i=0;
+	while (i<400)
+		{
+		bf->Read(i,tb3,tb2.Size());
+		test(tb3==tb2);
+		i+=tb2.Length();
+		bf->Read(i,tb3,tb1.Size());
+		test(tb3==tb1);
+		i+=tb1.Length();
+		}
+	delete bf;
+	test.End();
+	}
+
+GLDEF_C void TestCBufSeg::Test3()
+//
+//	Test input methods
+//
+	{
+
+	TInt8 bb[1000];
+	TInt nbytes;
+	test.Start(_L("InsertL"));
+	CBufSeg* bf1=(CBufSeg*)CBufSeg::NewL(SegLen);
+	CBufSeg* bf2=(CBufSeg*)CBufSeg::NewL(SegLen);
+	CBufSeg* bf3=(CBufSeg*)CBufSeg::NewL(SegLen);
+	nbytes=0;
+	TInt k;
+	for(TInt j=0;j<20;j++)
+		{
+		for(TInt i=0;i<10*j;i+=2)
+			{
+			k=i%128;
+			bb[i]=(TInt8)k;
+			bb[i+1]=(TInt8)-k;
+			}
+		bf1->InsertL(bf1->Size()/3*2,&bb[0],10*j);
+		CheckSeg(bf1);
+		CheckContents1(bf1);
+		CheckContents2(bf1);
+		bf2->InsertL(bf2->Size(),&bb[0],10*j);
+		CheckSeg(bf2);
+		CheckContents1(bf2);
+		CheckContents2(bf2);
+		bf3->InsertL(0,&bb[0],10*j);
+		CheckSeg(bf3);
+		CheckContents1(bf3);
+		CheckContents2(bf3);
+		nbytes+=10*j;
+		}
+	test(nbytes==bf1->Size());
+	test(nbytes==bf2->Size());
+	test(nbytes==bf3->Size());
+	delete bf1;
+	delete bf2;
+	delete bf3;
+	test.End();
+	}
+
+GLDEF_C void TestCBufSeg::Test4()
+//
+// Delete
+// 
+	{
+	TInt8 bb[1000];
+
+	test.Start(_L("Delete"));
+	CBufSeg* bf1=(CBufSeg*)CBufSeg::NewL(SegLen);
+	CBufSeg* bf2=(CBufSeg*)CBufSeg::NewL(SegLen);
+	CBufSeg* bf3=(CBufSeg*)CBufSeg::NewL(SegLen);
+	TInt nbytes=0;
+	TInt k;
+	for(TInt j=0;j<20;j++)
+		{
+		for(TInt i=0;i<10*j;i+=2)
+			{
+			k=i%128;
+			bb[i]=(TInt8)k;
+			bb[i+1]=(TInt8)-k;
+			}
+		bf1->InsertL(bf1->Size()/3*2,&bb[0],10*j);
+		bf2->InsertL(bf2->Size(),&bb[0],10*j);
+		bf3->InsertL(0,&bb[0],10*j);
+		nbytes+=10*j;
+		}
+	TInt len=34;
+	TInt aLength;
+	while (nbytes>len)
+		{
+		for (TInt pos=0;pos<nbytes;pos+=44)
+		{
+			len=((len+17)%23)*2;
+			if (len>nbytes-pos)
+				len=nbytes-pos;
+			bf1->Delete(pos,len);
+			CheckSeg(bf1);
+			CheckContents1(bf1);
+			CheckContents2(bf1);
+			aLength=bf2->Ptr(0).Length();
+			aLength=((aLength>len) ? aLength : len);
+			bf2->Delete(aLength-len,len);
+			CheckSeg(bf2);
+			CheckContents1(bf2);
+			CheckContents2(bf2);
+			bf3->Delete(0,len);
+			CheckSeg(bf3);
+			CheckContents1(bf3);
+			CheckContents2(bf3);
+			nbytes-=len;
+			test(nbytes==bf1->Size());
+			test(nbytes==bf2->Size());
+			test(nbytes==bf3->Size());
+			}
+		}
+	delete bf1;
+	delete bf2;
+	delete bf3;
+	test.End();
+	}
+
+GLDEF_C void TestCBufSeg::Test5()
+//
+// Compress
+// 
+	{
+	TInt8 bb[1000];
+
+	test.Start(_L("Compress"));
+	CBufSeg* bf1=(CBufSeg*)CBufSeg::NewL(SegLen);
+	CBufSeg* bf2=(CBufSeg*)CBufSeg::NewL(SegLen);
+	CBufSeg* bf3=(CBufSeg*)CBufSeg::NewL(SegLen);
+	TInt nbytes=0;
+	TInt k;
+	for(TInt j=0;j<20;j++)
+		{
+		for(TInt i=0;i<10*j;i+=2)
+			{
+			k=i%128;
+			bb[i]=(TInt8)k;
+			bb[i+1]=(TInt8)-k;
+			}
+		bf1->InsertL(bf1->Size()/3*2,&bb[0],10*j);
+		bf2->InsertL(bf2->Size(),&bb[0],10*j);
+		bf3->InsertL(0,&bb[0],10*j);
+		nbytes+=10*j;
+		}
+	TInt len=34;
+	TInt aLength;
+	while (nbytes>len)
+		{
+		for (TInt pos=0;pos<nbytes;pos+=44)
+		{
+			if (len>nbytes-pos)
+				len=nbytes-pos;
+			bf1->Delete(pos,len);
+			bf1->Compress();
+			CheckSeg(bf1);
+			CheckContents1(bf1);
+			CheckContents2(bf1);
+			aLength=bf2->Ptr(0).Length();
+			aLength=((aLength>len)? aLength : len);
+			bf2->Delete(aLength-len,len);
+			bf2->Compress();
+			CheckSeg(bf2);
+			CheckContents1(bf2);
+			CheckContents2(bf2);
+			bf3->Delete(0,len);
+			bf3->Compress();
+			CheckSeg(bf3);
+			CheckContents1(bf3);
+			CheckContents2(bf3);
+			nbytes-=len;
+			test(nbytes==bf1->Size());
+			test(nbytes==bf2->Size());
+			test(nbytes==bf3->Size());
+			}
+		}
+	delete bf1;
+	delete bf2;
+	delete bf3;
+	test.End();
+	}
+
+void TestCBufSeg::Test6L()
+	{
+	test.Start(_L("Test compress frees empty cells"));
+	__UHEAP_MARK;
+	TUint8 alphabet[27] = "abcdefghijklmnopqrstuvwxyz";
+	CBufSeg* buf = CBufSeg::NewL(10);
+	CleanupStack::PushL(buf);
+	buf->InsertL(0, alphabet, 16);	// "abcdefghij" ++ "klmnop"
+	buf->Delete(5, 5);			// "abcde" ++ "klmnop"
+	buf->Delete(10, 1);			// "abcde" ++ "klmno"
+	buf->Compress();				// "abcdefklmno". i.e. empty cell should be freed.
+	CleanupStack::PopAndDestroy(buf);
+	__UHEAP_MARKEND;
+	test.End();
+	}
+
+LOCAL_C void test_CBufSeg()
+//
+// Test the BufSeg class
+//
+	{
+
+	TestCBufSeg b;
+	test.Start(_L("All operations"));
+	b.Test1();
+	test.Next(_L("Inherited Methods"));
+	b.Test2();
+	test.Next(_L("Insert"));
+	b.Test3();
+	test.Next(_L("Delete"));
+	b.Test4();
+	test.Next(_L("Compress"));
+	b.Test5();
+	test.Next(_L("Bordeline cases"));
+	TRAPD(r,b.Test6L());
+	test(r==KErrNone);
+	//
+	test.End();
+	}
+
+GLDEF_C TInt E32Main()
+//
+// Test the ADT segmented varray.
+//
+	{
+	
+	test.Title();
+	__UHEAP_MARK;
+//
+// Install a trap handler
+//
+	CTrapCleanup* trapHandler=CTrapCleanup::New();
+	test(trapHandler!=NULL);
+//	CleanupStack::NextLevel();
+	test.Start(_L("class CBufSeg"));
+	test_CBufSeg();
+	delete trapHandler;
+	__UHEAP_MARKEND;
+	test.End();
+	return(0);
+	}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32test/buffer/t_buf.cpp	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,1942 @@
+// Copyright (c) 1994-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32test\buffer\t_buf.cpp
+// Overview:
+// Test methods of the TBuf16, TBuf8, TBuf template class.
+// API Information:
+// TBuf16, TBuf8, TBuf.
+// Details :
+// - Create some 16 bit modifiable descriptors, 8 bit modifiable descriptors
+// of fixed length, Build-independent modifiable descriptors, initialize 
+// with different strings and check for
+// - Comparison operators,
+// - Property access methods,
+// - Fill & swap methods,
+// - Conversion methods,
+// - Comparison methods,
+// - Pattern Matching methods,
+// - Pattern Locating methods,
+// - Copying methods, 
+// - Find, FindC, FindF methods,
+// - Repeat, Trim, TrimLeft, TrimRight, Insert, Delete, Left,
+// Right, Mid methods,
+// - Formatting methods,
+// - Replace methods are as expected.
+// - Construct some descriptors with buffer length, string and buffer reference and
+// verify that they are created successfully.
+// - Test assignment operators and comparison operators for different descriptors.
+// - Initialize some descriptors and check descriptors' maximum length, length and 
+// size are as expected. 
+// - Check Fill and Swap methods are as expected.
+// - Test Fold, Collate, LowerCase, UpperCase methods are as expected.
+// - Test Comparison methods are as expected.
+// - Test pattern matching for simple string, wild cards with collated comparison. Verify that the 
+// return value is KErrNotFound when pattern doesn't match.
+// - Check Locating methods by searching character in forward and backward direction and 
+// verify the return value is KErrNotFound when unavailable character is searched.
+// - Check copying strings and converting those into lower and upper case strings are
+// as expected.
+// - Check Find methods by searching string and verify the return value is KErrNotFound when 
+// unavailable string is searched.
+// - Check Repeat, Trim, Insert and Delete methods are as expected.
+// - Check the formatting operations are as expected.
+// - Check integer to decimal character representation is as expected.
+// - Check integer to character representation with different number system is as expected.
+// - Check string formatting with variable parameter list is as expected
+// - Check Replace method by replacing string at different places in a string is as expected.
+// - Check the conversion of real numbers, extended precision real numbers into string
+// format is as expected.
+// - Check Format and FormatList methods are as expected.
+// - Check Format of TReal is as expected.
+// - Check the non-leaving and leaving descriptors overflow handlers are as expected. 
+// Platforms/Drives/Compatibility:
+// All 
+// Assumptions/Requirement/Pre-requisites:
+// Failures and causes:
+// Base Port information:
+// 
+//
+
+#include <e32test.h>
+#include <e32math.h>
+#include <hal.h>
+#include <hal_data.h>
+#include <hal_data.h>
+#include <e32svr.h>
+
+#ifdef __TOOLS2__
+EXPORT_C TInt HAL::Set(HAL::TAttribute aAttribute, TInt aValue)
+	{
+	return KErrNone;
+	}
+
+EXPORT_C TInt UserSvr::ChangeLocale(const TDesC& aLocaleDllName)
+	{
+	if (aLocaleDllName.Length() == 0)
+		return KErrNone;
+	return KErrNotFound;
+	}
+#endif
+
+#ifdef __VC32__
+    // Solve compilation problem caused by non-English locale
+    #pragma setlocale("english")
+#endif
+
+LOCAL_D RTest test(_L("T_BUF"));
+
+#pragma warning(disable: 4127) // disabling warning "conditional expression is constant"
+#pragma warning(disable: 4310) // disabling warning "cast truncates constant value"
+
+#undef _TL
+#define _TL(a) DESTEMPLATE((S*)RTest::String(sizeof(S),(TText8*)a,(TText16*)L ## a)) 
+#undef _TS
+#define _TS(a) ((const S*)RTest::String(sizeof(S),(TText8*)a,(TText16*)L ## a)) 
+
+template<class T,class S,class DESTEMPLATE>	
+class TestTBuf
+	{
+public:
+	TestTBuf(TInt aLength); // Test class constructor.
+	void Test1();   // Tests all functions of the class.
+	void Test2();   // Tests all constructors.
+	void Test3();	// Tests all assignment operators
+	void Test4();	// Tests all comparison operators
+	void Test5();	// Tests all property access
+	void Test6();	// Tests all fill and swap
+	void Test7();	// Tests all conversion 
+	void Test8();	// Tests all comparison
+	void Test9();	// Tests all matching
+	void Test10();	// Tests all locating
+	void Test11();	// Tests all Copying
+	void Test12();	// Tests all finding
+	void Test13();	// Tests all basic like ops
+	void Test14();  // Tests all formating
+	void Test15();  // Tests all replacing
+	void test_TBuf(); // Test all classes
+protected:
+	void Test1List(T* a,T* b,...);
+	void Test14_ReorderedParameterFormatting(TInt aDummyParameter, ...);
+private:
+	TInt iMaxBufLength;
+	};
+
+void TestEq(const TDesC8& a, const TDesC8& b, TInt aLine)
+	{
+	if (a!=b)
+		{
+		TBuf<256> buf;
+		test.Printf(_L("LINE %d:\n"),aLine);
+		buf.Copy(a);
+		test.Printf(_L("a=%S\n"),&buf);
+		buf.Copy(b);
+		test.Printf(_L("b=%S\n"),&buf);
+		test(0);
+		}
+	}
+
+void TestEq(const TDesC16& a, const TDesC16& b, TInt aLine)
+	{
+	if (a!=b)
+		{
+		test.Printf(_L("LINE %d:\n"),aLine);
+		test.Printf(_L("a=%S\n"),&a);
+		test.Printf(_L("b=%S\n"),&b);
+		test(0);
+		}
+	}
+
+#define TESTEQ(a,b)	TestEq((a),(b),__LINE__)
+
+template <class T,class S,class DESTEMPLATE>
+GLDEF_C TestTBuf<T,S,DESTEMPLATE>::TestTBuf(TInt aLength)
+// Constructor.
+	: iMaxBufLength(aLength)
+	{}
+
+template <class T,class S,class DESTEMPLATE>
+GLDEF_C void TestTBuf<T,S,DESTEMPLATE>::Test1List(T* a,T* b,...)
+// Test the format with list functions.
+	{
+	VA_LIST list;
+	VA_START(list,b);
+	a->Format(*b,list);
+	VA_START(list,b);
+	a->AppendFormat(*b,list);
+	VA_START(list,b);
+	a->Format(_TL("%d"),list);
+	VA_START(list,b);
+	a->AppendFormat(_TL("%d"),list);
+	}
+
+template <class T,class S,class DESTEMPLATE>
+GLDEF_C void TestTBuf<T,S,DESTEMPLATE>::Test1()
+// Tests all functions of the class.
+	{
+	test.Start(_L("Constructors"));
+	T a;
+	T b;
+	T c(_TL("AB"));
+	T d(c);
+
+// To avoid unused warning
+    a.Length();
+    b.Length();
+    c.Length();
+    d.Length();
+
+	test.Next(_L("Copy operators"));
+	a=_TL("DE");
+	b=c;
+	a+=_TL("DE");
+	b+=c;
+
+	test.Next(_L("Comparison operators"));
+	TInt t=(a<b);
+	t=(a<_TL("AB"));
+	t=(_TL("AB")<a);
+	t=(a<=b);
+	t=(a<=_TL("AB"));
+	t=(_TL("AB")<=a);
+	t=(a>b);
+	t=(a>_TL("AB"));
+	t=(_TL("AB")>a);
+	t=(a>=b);
+	t=(a>=_TL("AB"));
+	t=(_TL("AB")>=a);
+	t=(a==b);
+	t=(a==_TL("AB"));
+	t=(_TL("AB")==a);
+	t=(a!=_TL("AB"));
+	t=(_TL("AB")!=a);
+
+	test.Next(_L("Property access"));
+	a[0]='A';
+	a.Ptr();
+	TInt i=a.MaxLength()-a.Length();
+	i=a.Size();
+	a.Zero();
+	a.SetLength(2); 
+
+	test.Next(_L("Fill & swap"));
+	a.Fill(' ');
+	a.Fill(' ',iMaxBufLength);
+	a.FillZ();
+	a.FillZ(iMaxBufLength);
+	a.Swap(b);
+
+	test.Next(_L("Conversion"));
+	a.Fold();
+	a.Collate();
+	a.LowerCase();
+	a.UpperCase();
+	a.Capitalize();
+
+	test.Next(_L("Comparison"));
+	a.Compare(b);
+	a.Compare(_TL("AB"));
+	a.CompareF(b);
+	a.CompareF(_TL("AB"));
+	a.CompareC(b);
+	a.CompareC(_TL("AB"));
+
+	test.Next(_L("Matching"));
+	a.Match(b);
+	a.Match(_TL("AB"));
+	a.MatchF(b);
+	a.MatchF(_TL("AB"));
+
+	T buf(_TL("abcdef"));
+	TInt res = buf.MatchF(_TL("abc*def"));
+	test(res == 0);
+
+	a.MatchC(b);
+	a.MatchC(_TL("AB"));
+
+	test.Next(_L("Locating"));
+	a.Locate('A');
+	a.LocateF('A');
+	a.LocateReverse('A');
+	a.LocateReverseF('A');
+
+	test.Next(_L("Copying"));
+	a.Copy(b);
+	a.Copy(_TL("AB"));
+//	a.Copy(_TL("AB"),1);
+	a.CopyF(b);
+	a.CopyF(_TL("AB"));
+	a.CopyC(b);
+	a.CopyC(_TL("AB"));
+	a.CopyLC(b);
+	a.CopyLC(_TL("AB"));
+	a.CopyUC(b);
+	a.CopyUC(_TL("AB"));
+	a.CopyCP(b);
+	a.CopyCP(_TL("AB"));
+
+	test.Next(_L("Finding"));
+	a.Find(b);
+	a.Find(_TL("AB"));
+	a.FindF(b);
+	a.FindF(_TL("AB"));
+	a.FindC(b);
+	a.FindC(_TL("AB"));
+
+	test.Next(_L("Basic like ops"));
+	a.Repeat(b);
+	a.Repeat(_TL("AB"));
+	a.TrimLeft();
+	a.TrimRight();
+	a.Trim();
+	b=_TL("AA");
+	a.Insert(0,b);
+	a.Delete(0,2);
+	b = a.Left(1);
+	b = a.Right(1);
+	b = a.Mid(0,1);
+
+	test.Next(_L("Formating"));
+	a.Justify(_TL("AB"),10,ELeft,' ');
+	a.Justify(b,10,ELeft,' ');
+	b.Fill('A',2);
+	a.Zero();
+	a.AppendJustify(_TL("AB"),10,ELeft,' ');
+	a.AppendJustify(b,10,ELeft,' ');
+	TInt v1=10;
+	a.Num(v1);
+	a.AppendNum(v1);
+	TInt v2=10;
+	a.Num((TUint)v2,EHex);
+	a.AppendNum((TUint)v2,EHex);
+	a.NumUC((TUint)v2,EHex);
+	a.AppendNumUC((TUint)v2,EHex);
+	TReal v3=10.0;
+	TRealFormat ff;
+	ff.iType=KRealFormatFixed;
+	ff.iWidth=10;
+	ff.iPlaces=2;
+	ff.iPoint='.';
+	ff.iTriad=',';
+	ff.iTriLen=3;
+	a.Num(v3,ff);
+	a.AppendNum(v3,ff);
+	a.Format(_TL("%d"),12);
+	a.AppendFormat(_TL("%d"),12);
+	b=_TL("%d");
+	a.Format(b,12);
+	a.AppendFormat(b,12);
+	Test1List(&a,&b,12);
+
+	test.Next(_L("Replacing"));
+	a=_TL("AAC");
+	b=_TL("B");
+	a.Replace(1,1,b);
+	test.End();
+	}
+
+template <class T,class S,class DESTEMPLATE>
+GLDEF_C void TestTBuf<T,S,DESTEMPLATE>::Test2()
+// Tests all constructors.
+	{
+	test.Start(_L("Default"));
+	T a;
+	test(a.MaxLength()==iMaxBufLength);
+	test(a.Length()==0);
+
+	test.Next(_L("By length"));
+	T b(iMaxBufLength>>1);
+	test(b.MaxLength()==iMaxBufLength);
+	test(b.Length()==(iMaxBufLength>>1));
+
+	test.Next(_L("By string"));
+	T c(_TL("AB"));
+	test(c.MaxLength()==iMaxBufLength);
+	test(c.Length()==2);
+	test(c[0]=='A');
+	test(c[1]=='B');
+
+	test.Next(_L("By buffer reference"));
+	T d(c);
+	test(d.MaxLength()==iMaxBufLength);
+	test(d.Length()==2);
+	test(d[0]=='A');
+	test(d[1]=='B');
+	test.End();
+	}
+
+template <class T,class S,class DESTEMPLATE>
+GLDEF_C void TestTBuf<T,S,DESTEMPLATE>::Test3()
+// Tests all assignment operators
+	{
+	test.Start(_L("By String"));
+	T a;
+	a=_TL("AB");
+	a+=_TL("CD");
+	test(a.Length()==4);
+	test(a==_TL("ABCD"));
+
+	test.Next(_L("By buffer"));
+	T b;
+	b=a;
+	b+=a;
+	test(b.Length()==8);
+	test(b==_TL("ABCDABCD"));
+//	
+	test.End();
+	}
+
+template <class T,class S,class DESTEMPLATE>
+GLDEF_C void TestTBuf<T,S,DESTEMPLATE>::Test4()
+// Test all comparison operators
+	{
+	test.Start(_L("By NULL string"));
+	T a;
+	test(a==_TL(""));		// NULL strings
+	test(!(a!=_TL("")));
+	test(a<=_TL(""));
+	test(a>=_TL(""));
+	test(!(a<_TL("")));
+	test(!(a>_TL("")));
+	test(_TL("")==a);
+	test(!(_TL("")!=a));
+	test(_TL("")<=a);
+	test(_TL("")>=a);
+	test(!(_TL("")<a));
+	test(!(_TL("")>a));
+
+	test.Next(_L("By string or buffer"));
+	a=_TL("abc");
+	test(a==_TL("abc"));		// ==
+	test(!(a==_TL("xyz")));
+	test(!(a==_TL("aa")));
+	test(_TL("abc")==a);
+	test(!(_TL("xyz")==a));
+	test(!(_TL("aa")==a));
+	test(a!=_TL("xyz"));		// !=
+	test(!(a!=_TL("abc")));
+	test(a!=_TL("aa"));
+	test(_TL("xyz")!=a);
+	test(!(_TL("abc")!=a));
+	test(_TL("aa")!=a);
+	test(a<_TL("x"));			// <
+	test(!(a<_TL("abc")));
+	test(!(a<_TL("aa")));
+	test(_TL("aa")<a);
+	test(!(_TL("abc")<a));
+	test(!(_TL("xyz")<a));
+	test(a>_TL("aa"));			// >
+	test(!(a>_TL("abc")));
+	test(!(a>_TL("xyz")));
+	test(_TL("xyz")>a);
+	test(!(_TL("abc")>a));
+	test(!(_TL("aa")>a));
+	test(a>=_TL("abc"));		// >=
+	test(!(a>=_TL("xyz")));
+	test(a>=_TL("aa"));
+	test(_TL("abc")>=a);
+	test(!(_TL("aaa")>=a));
+	test(_TL("xyz")>=a);
+	test(a<=_TL("abc"));		// <=
+	test(!(a<=_TL("aa")));
+	test(a<=_TL("xyz"));
+	test(_TL("abc")<=a);
+	test(!(_TL("xyz")<=a));
+	test(_TL("aa")<=a);
+
+	test.Next(_L("By special characters"));
+	a=_TL("!@#$%^&*()");
+	test(a==_TL("!@#$%^&*()"));
+	test.End();	
+	}
+
+template <class T,class S,class DESTEMPLATE>
+GLDEF_C void TestTBuf<T,S,DESTEMPLATE>::Test5()
+// Test all property access
+	{
+	test.Start(_L("Length and Size"));
+	T a;
+	TInt maxLength=a.MaxLength();
+    TInt i;
+	for (i=0;i<maxLength;i++)
+		{
+		test(a.Length()==i);	// Length
+		test(a.Size()==(TInt)(sizeof(S)*i)); // Size
+		a.AppendNum(i%10);
+		}
+	const T b=a;
+	for (i=0;i<maxLength;i++)
+		{
+		test(a[i]=='0'+(i%10));	// At
+		test(b[i]=='0'+(i%10));	// AtConst
+		}
+	test(a[0]==*a.Ptr());	//Ptr
+	a.SetLength(0);	// SetLength
+	test(a.Length()==0);
+	a.SetLength(maxLength-1);
+	test(a.Length()==maxLength-1);
+	a.Zero();	// Null
+	test(a.Length()==0);
+	test.End();
+	}
+
+template <class T,class S,class DESTEMPLATE>
+GLDEF_C void TestTBuf<T,S,DESTEMPLATE>::Test6()
+// Fill and Swap
+	{
+	test.Start(_L("Fill and Swap"));
+	T a,b;
+	TChar chr;
+	TInt j;
+	TInt maxLength=a.MaxLength();
+	for (TInt i=0;i<maxLength;i++)
+		{
+		chr=(i%10)+'0';
+		a.SetLength(i);
+		a.Fill(chr);	// Fill(TChar)
+		b.Swap(a);
+		test(b.Length()==i);	// Swap
+		j=0;
+		while (j<i)
+			test(b[j++]=='0'+(i%10));
+		b.FillZ();	// FillZ()
+		a.Swap(b);
+		j=0;
+		while (j<i)
+			test(a[j++]==0);
+		a.Fill(chr,i);	// Fill(TChar,TUint)
+		j=0;
+		while (j<i)
+			test(a[j++]=='0'+(i%10));
+		a.FillZ(i);	// FillZ(TUint)
+		j=0;
+		while (j<i)
+			test(a[j++]==0);
+		}
+	test.End();
+	}
+
+template <class T,class S,class DESTEMPLATE>
+GLDEF_C void TestTBuf<T,S,DESTEMPLATE>::Test7()
+// Conversion operators
+	{
+	test.Start(_L("Fold, collate ..."));
+	T a;
+	T b;
+	a=_TL("abc AbC");
+	b=_TL("ABC ABC");
+	a.Fold();
+	b.Fold();
+	test(a==b);
+	a=_TL("abc AbC");
+	b=_TL("ABC ABC");
+	a.Collate();
+	b.Collate();
+	test(a==b);
+	a.LowerCase();
+	test(a==_TL("abc abc"));
+	a.Capitalize();
+	test(a==_TL("Abc abc"));
+	a.UpperCase();
+	test(a==_TL("ABC ABC"));
+	test.End();
+	}
+
+template <class T,class S,class DESTEMPLATE>
+GLDEF_C void TestTBuf<T,S,DESTEMPLATE>::Test8()
+// Comparison
+	{
+	test.Start(_L("By string"));
+	T a;
+	a=_TL("abc AbC");
+	test(a.Compare(_TL("abc AbC"))==0);
+	test(a.CompareF(_TL("ABC aBc"))==0);
+	test(a.Compare(_TL("xyz"))!=0);
+	test(a.CompareC(_TL("xyz"))!=0);
+	test(a.CompareF(_TL("xyz"))!=0);
+
+	test.Next(_L("By buffer"));
+	T b;
+	T c;
+	a=_TL("abc AbC");
+	b=_TL("abc AbC");
+	c=_TL("xyz");
+	test(a.Compare(b)==0);
+	test(a.Compare(c)!=0);
+	b=_TL("ABC aBc");
+	test(a.CompareC(c)!=0);
+	test(a.CompareF(b)==0);
+	test(a.CompareF(c)!=0);
+
+	test.End();
+	}
+
+template <class T,class S,class DESTEMPLATE>
+GLDEF_C void TestTBuf<T,S,DESTEMPLATE>::Test9()
+// Matching (need to test explicit result as error KErrNotFound = KMaxTUint
+// 			 and so registers as TRUE. (test parameter is TUint) )
+	{
+	test.Start(_L("By string"));
+	T a;
+	a=_TL("abc AbC");
+	test(a.Match(_TL("abc AbC"))==0);
+	test(a.MatchC(_TL("ABC aBc"))==0);
+	test(a.MatchF(_TL("ABC aBc"))==0);
+	test(a.Match(_TL("xyz"))==KErrNotFound);
+	test(a.MatchC(_TL("xyz"))==KErrNotFound);
+	test(a.MatchF(_TL("xyz"))==KErrNotFound);
+
+	test.Next(_L("By buffer"));
+	T b;
+	T c;
+	a=_TL("abc AbC");
+	b=_TL("abc AbC");
+	c=_TL("xyz");
+	test(a.Match(b)==0);
+	test(a.Match(c)==KErrNotFound);
+	b=_TL("ABC aBc");
+	test(a.MatchC(b)==0);
+	test(a.MatchC(c)==KErrNotFound);
+	test(a.MatchF(b)==0);
+	test(a.MatchF(c)==KErrNotFound);
+
+	test.Next(_L("Wildcards"));
+	a=_TL("abcxyz");
+	test(a.Match(_TL("abc*"))==0);
+	test(a.Match(_TL("abw*"))==KErrNotFound);
+	a=_TL("abcdefg");
+	test(a.Match(_TL("a*fg"))==0);
+	test(a.Match(_TL("a*f"))==KErrNotFound);
+	test(a.Match(_TL("abc*fgh"))==KErrNotFound);
+	a=_TL("abcdef");
+	test(a.Match(_TL("abc?ef"))==0);
+	test(a.Match(_TL("abc?xf"))==KErrNotFound);
+
+	a=_TL("a(01)");
+	test(a.Match(_TL("*(01)"))==1);
+	test(a.Match(_TL("?(01)"))==0);
+	test(a.Match(_TL("?(*)"))==0);
+	test(a.Match(_TL("?(**)"))==0);
+
+	test(a.Match(_TL("?(\?\?)"))==0);
+	test(a.Match(_TL("*(*)"))>=0);
+	test(a.Match(_TL("*(0?)"))>=0);
+	test(a.Match(_TL("a(\?\?)"))==0);
+	test(a.Match(_TL("*(\?\?)"))>=0);
+
+	test.Next(_L("wild cards with collated comparison"));
+	a = _TL("abcdefghijkl");
+	test(a.MatchC(_TL("abc*")) == 0);
+	test(a.MatchC(_TL("abc")) == KErrNotFound);
+	test(a.MatchC(_TL("xyz")) == KErrNotFound);
+	test(a.MatchC(_TL("*def")) == KErrNotFound);
+	test(a.MatchC(_TL("*def*")) == 3);
+	test(a.MatchC(_TL("*d?f*")) == 3);
+	test(a.MatchC(_TL("a*kl")) == 0);
+	test(a.MatchC(_TL("*e*?l")) == 4);
+	test(a.MatchC(_TL("abc*dEf*")) == 0);
+	
+	
+	T candidate;
+	T search;
+	
+	candidate = _TL("");
+	search = _TL("**");
+	test(candidate.MatchC(search) == 0);
+	
+	candidate = _TL("");
+	search = _TL("*");
+	test(candidate.MatchC(search) == 0);
+	
+	candidate = _TL("abcd");
+	search = _TL("*abc*cd");
+	test(candidate.MatchC(search) == KErrNotFound);
+   	
+	if (sizeof(S) == 2)
+		{
+		test.Next(_L("Unicode MatchC and FindC treat base+accent as equal to composed character"));
+		TPtrC p = _L("te\x302te");
+		test(p.MatchC(_L("t\xeate")) == 0);
+		test(p.FindC(_L("t\xeate")) == 0);
+		}
+
+	test.End();
+	}
+
+template <class T,class S,class DESTEMPLATE>
+GLDEF_C void TestTBuf<T,S,DESTEMPLATE>::Test10()
+// Locating
+	{
+	T a;
+	TChar b;
+
+	test.Start(_L("First Char"));
+	b='a';
+	a=_TL("axaxa");
+	test(a.Locate(b)==0);
+	test(a.LocateF(b)==0);
+	test(a.LocateReverse(b)==4);
+	test(a.LocateReverseF(b)==4);
+
+	test.Next(_L("Middle Char"));
+	a=_TL("xaxa");
+	test(a.Locate(b)==1);
+	test(a.LocateF(b)==1);
+	a=_TL("axax");
+	test(a.LocateReverse(b)==2);
+	test(a.LocateReverseF(b)==2);
+
+	test.Next(_L("Last Char"));
+	a=_TL("xxa");
+	test(a.Locate(b)==2);
+	test(a.LocateF(b)==2);
+	a=_TL("axx");
+	test(a.LocateReverse(b)==0);
+	test(a.LocateReverseF(b)==0);
+
+	test.Next(_L("Test for failure of locate"));
+	a=_TL("xxx");
+	test(a.Locate(b)==KErrNotFound);
+	test(a.LocateF(b)==KErrNotFound);
+	test(a.LocateReverse(b)==KErrNotFound);
+	test(a.LocateReverseF(b)==KErrNotFound);
+
+	test.End();
+	}
+
+template <class T,class S,class DESTEMPLATE>
+GLDEF_C void TestTBuf<T,S,DESTEMPLATE>::Test11()
+// Copying
+	{
+	T a, b;
+		
+	test.Start(_L("By String"));
+	a.Copy(_TL("abc"));
+	test(a.Length()==3);
+	test(a==_TL("abc"));
+	a.CopyF(_TL("abc"));
+	test(a.Length()==3);
+	b.CopyF(_TL("ABC"));
+	test(a==b);
+	a.CopyLC(_TL("AbC"));
+	test(a==_TL("abc"));
+	test(a.Length()==3);
+	a.CopyC(_TL("abc"));
+	b.CopyC(_TL("ABC"));
+	test(a==b);
+	test(a.Length()==3);
+	a.CopyCP(_TL("abc"));
+	test(a==_TL("Abc"));
+	test(a.Length()==3);
+	a.CopyUC(_TL("aBc"));
+	test(a==_TL("ABC"));
+	test(a.Length()==3);
+//	a.Copy(_TL("abc"),3);
+//	test(a==_TL("abc"));
+//	test(a.Length()==3);
+//	a.Copy(_TL("abcd"),3);
+//	test(a==_TL("abc"));
+//	test(a.Length()==3);
+
+	test.Next(_L("By buffer"));
+	b=_TL("abc");
+	a.Copy(b);
+	test(a==_TL("abc"));
+	test(a.Length()==3);
+	a=_TL("");
+	a.CopyF(b);
+	b.CopyF(_TL("ABC"));
+	test(a==b);
+	test(a.Length()==3);
+	a=_TL("");
+	b=_TL("AbC");
+	a.CopyLC(b);
+	test(a==_TL("abc"));
+	test(a.Length()==3);
+	a=_TL("");
+	b=_TL("abC");
+	a.CopyC(b);
+	b.CopyC(_TL("ABC"));
+	test(a==b);
+	test(a.Length()==3);
+	a=_TL("");
+	b=_TL("abC");
+	a.CopyCP(b);
+	test(a==_TL("Abc"));
+	test(a.Length()==3);
+	a=_TL("");
+	b=_TL("aBc");
+	a.CopyUC(b);
+	test(a.Length()==3);
+	test(a==_TL("ABC"));
+
+	test.End();
+	}
+
+
+template <class T,class S,class DESTEMPLATE>
+GLDEF_C void TestTBuf<T,S,DESTEMPLATE>::Test12()
+// Finding
+	{
+	test.Start(_L("By String"));
+	T a,b;
+	a=_TL("abccef");
+	test(a.Find(_TL(""))==0);
+	test(a.Find(_TL("abc"))==0);
+	test(a.Find(_TL("cce"))==2);
+	test(a.Find(_TL("cef"))==3);
+	test(a.Find(_TL("efg"))==KErrNotFound);
+	test(a.Find(_TL("xxx"))==KErrNotFound);
+	test(a.FindF(_TL(""))==0);
+	test(a.FindF(_TL("AbC"))==0);
+	test(a.FindF(_TL("CcE"))==2);
+	test(a.FindF(_TL("CeF"))==3);
+	test(a.FindF(_TL("efg"))==KErrNotFound);
+	test(a.FindF(_TL("xxx"))==KErrNotFound);
+	test(a.FindC(_TL(""))==0);
+	test(a.FindC(_TL("aBc"))==0);
+	test(a.FindC(_TL("cce"))==2);
+	test(a.FindC(_TL("cEf"))==3);
+	test(a.FindC(_TL("efg"))==KErrNotFound);
+	test(a.FindC(_TL("xxx"))==KErrNotFound);
+
+	test.Next(_L("By buffer"));
+	test(a.Find(b)==0);
+	test(a.FindF(b)==0);
+	test(a.FindC(b)==0);
+	b=_TL("xxx");
+	test(a.Find(b)==KErrNotFound);
+	test(a.FindF(b)==KErrNotFound);
+	test(a.FindC(b)==KErrNotFound);
+	b=_TL("efg");
+	test(a.Find(b)==KErrNotFound);
+	test(a.FindF(b)==KErrNotFound);
+	test(a.FindC(b)==KErrNotFound);
+	b=_TL("abc");
+	test(a.Find(b)==0);
+	b=_TL("cce");
+	test(a.Find(b)==2);
+	b=_TL("cef");
+	test(a.Find(b)==3);
+	b=_TL("AbC");
+	test(a.FindF(b)==0);
+	b=_TL("CcE");
+	test(a.FindF(b)==2);
+	b=_TL("CeF");
+	test(a.FindF(b)==3);
+	b=_TL("aBc");
+	test(a.FindC(b)==0);
+	b=_TL("cCe");
+	test(a.FindC(b)==2);
+	b=_TL("cEf");
+	test(a.FindC(b)==3);
+
+	test.End();
+	}
+
+template <class T,class S,class DESTEMPLATE>
+GLDEF_C void TestTBuf<T,S,DESTEMPLATE>::Test13()
+// Basic like ops
+	{
+	test.Start(_L("Repeat, trim, insert and delete"));
+	T a,b;
+	TInt max=a.MaxLength(); 
+	b=_TL("abc");
+	a.Repeat(_TL("abc"));
+	test(a==_TL(""));
+	a.Repeat(b);
+	test(a==_TL(""));
+	for (TInt j=1;j<max;j++) // ?? Cannot SetLength = MaxLength
+		{
+		a.SetLength(j);
+		a.Repeat(_TL("abc"));
+        TInt i;
+		for (i=0;i<j;i++)
+			test(a[i]==b[i%3]);
+		a=_TL("");
+		a.SetLength(j);
+		a.Repeat(b);
+		for (i=0;i<j;i++)
+			test(a[i]==b[i%3]);
+		a=_TL("");
+		}
+	a=_TL("\t\n  ab \t\n ");
+	a.TrimLeft();
+	test(a==_TL("ab \t\n "));
+	test(a.Length()==6);
+	a=_TL("\t\n  ab \t\n ");
+	a.TrimRight();
+	test(a==_TL("\t\n  ab"));
+	test(a.Length()==6);
+	a=_TL(" \t\n ab \t \n");
+	a.Trim();
+	test(a==_TL("ab"));
+	a.Trim();
+	test(a==_TL("ab"));
+	a=_TL("abc");
+	b=_TL("123");
+	a.Insert(1,b);
+	test(a==_TL("a123bc"));
+	test(a.Length()==6);
+	b=_TL("");
+	a.Insert(4,b);
+	test(a==_TL("a123bc"));
+	test(a.Length()==6);
+	a.Insert(0,b);
+	test(a==_TL("a123bc"));
+	test(a.Length()==6);
+	a.Delete(1,3);
+	test(a==_TL("abc"));
+	test(a.Length()==3);
+	a.Delete(0,3);
+	test(a==_TL(""));
+	test(a.Length()==0);
+
+	test.Next(_L("TrimAll"));
+	a=_TL("");
+	a.TrimAll();
+	test(a==_TL(""));
+	a=_TL(" ");
+	a.TrimAll();
+	test(a==_TL(""));
+	a=_TL("   ");
+	a.TrimAll();
+	test(a==_TL(""));
+	a=_TL("    ab cd  ef    g");
+	a.TrimAll();
+	test(a==_TL("ab cd ef g"));
+	a=_TL("abcdef");
+	a.TrimAll();
+	test(a==_TL("abcdef"));
+	a=_TL("a  b\t cd\t\tef");
+	a.TrimAll();
+	test(a==_TL("a b\tcd\tef"));
+	a=_TL("abcdef \t ghijk");
+	a.TrimAll();
+	test(a==_TL("abcdef ghijk"));
+	a=_TL("abcdef g");
+	a.TrimAll();
+	test(a==_TL("abcdef g"));
+	a=_TL("ab  cd  ef  gh  ij");
+	a.TrimAll();
+	test(a==_TL("ab cd ef gh ij"));
+	a=_TL("a        b          c     defg h     i  jk l     mno pqr stu  vw   xyz");
+	a.TrimAll();
+	test(a==_TL("a b c defg h i jk l mno pqr stu vw xyz"));
+
+	test.Next(_L("Right, Left and Mid"));
+	a=_TL("abcdef");
+	b = a.Left(3);
+	test(b==_TL("abc"));
+	test(b.Length()==3);
+	b = a.Right(3);
+	test(b==_TL("def"));
+	b = a.Mid(2);
+	test(b==_TL("cdef"));
+	test(b.Length()==4);
+	b = a.Left(2);
+	test(b==_TL("ab"));
+	test(b.Length()==2);
+	b = a.Right(2);
+	test(b==_TL("ef"));
+	b = a.Mid(2,1);
+	test(b==_TL("c"));
+	test(b.Length()==1);
+	b = a.Left(6);
+	test(b==_TL("abcdef"));
+	test(b.Length()==6);
+	b=_TL("");
+	b.SetLength(4);
+	b = a.Right(6);
+	test(b==_TL("abcdef"));
+	test(b.Length()==6);
+	a = a.Left(6);
+	test(a==_TL("abcdef"));
+	b=_TL("");
+	b = a.Mid(0,6);
+	test(b==_TL("abcdef")); 
+	test.End();
+	}
+
+template <class T,class S,class DESTEMPLATE>
+GLDEF_C void TestTBuf<T,S,DESTEMPLATE>::Test14()
+// Formating operations
+	{
+	test.Start(_L("Justify"));
+	T a,b,d;
+	TInt aWidth;
+	TChar c;
+	a=_TL("wxyz");
+	b=_TL("abc");
+	d=_TL("linearisation");
+	const S* pD=_TS("299792458");
+	c='x';
+	aWidth=KDefaultJustifyWidth; // Left justified, Default width
+	a.Justify(b,aWidth,ELeft,c);
+	test(a==b);
+	test(a.Length()==3);
+	a.AppendJustify(b,aWidth,ELeft,c);
+	test(a==_TL("abcabc"));
+	test(a.Length()==6);
+	aWidth=1;	// Width < String length
+	a.Justify(b,aWidth,ELeft,c);
+	test(a==_TL("a"));
+	test(a.Length()==1);
+	a.AppendJustify(b,aWidth,ELeft,c);
+	test(a==_TL("aa"));
+	test(a.Length()==2);
+	aWidth=5; // Width > String length
+	a.Justify(b,aWidth,ELeft,c);
+	test(a==_TL("abcxx"));
+	test(a.Length()==5);
+	a.AppendJustify(b,aWidth,ELeft,c);
+	test(a==_TL("abcxxabcxx"));
+	test(a.Length()==10);
+
+	aWidth=KDefaultJustifyWidth; // Right justified, Default width
+	a.Justify(b,aWidth,ERight,c);
+	test(a==b);
+	test(a.Length()==3);
+	a.AppendJustify(b,aWidth,ERight,c);
+	test(a==_TL("abcabc"));
+	test(a.Length()==6);
+	aWidth=1; // Right justified, Width < String length
+	a.Justify(b,aWidth,ERight,c);
+	test(a==_TL("a"));
+	test(a.Length()==1);
+	a.AppendJustify(b,aWidth,ERight,c);
+	test(a==_TL("aa"));
+	test(a.Length()==2);
+	aWidth=5; // Right justified, width > String length
+	a.Justify(b,aWidth,ERight,c);
+	test(a==_TL("xxabc"));
+	test(a.Length()==5);
+	a.AppendJustify(b,aWidth,ERight,c);
+	test(a==_TL("xxabcxxabc"));
+	test(a.Length()==10);
+
+	aWidth=KDefaultJustifyWidth; // Center justified, Default width
+	a.Justify(b,aWidth,ECenter,c);
+	test(a==b);
+	test(a.Length()==3);
+	a.AppendJustify(b,aWidth,ECenter,c);
+	test(a==_TL("abcabc"));
+	test(a.Length()==6);
+	aWidth=1; // Centre justified, width < String length
+	a.Justify(b,aWidth,ECenter,c);
+	test(a==_TL("a"));
+	test(a.Length()==1);
+	a.AppendJustify(b,aWidth,ECenter,c);
+	test(a==_TL("aa"));
+	test(a.Length()==2);
+	aWidth=5; // Centre justified, width > String length
+	a.Justify(b,aWidth,ECenter,c);
+	test(a==_TL("xabcx"));
+	test(a.Length()==5);
+	a.AppendJustify(b,aWidth,ECenter,c);
+	test(a==_TL("xabcxxabcx"));
+	test(a.Length()==10);
+
+	test.Next(_L("Num"));
+	TInt j=-2147483647-1; 
+	a.Num(j);
+	test(a==_TL("-2147483648"));
+	test(a.Length()==11);
+	TUint i=2147483648u;
+	a.Num(i);
+	test(a==_TL("2147483648"));
+	test(a.Length()==10);
+	if (a.MaxLength()>31)
+		{
+		a.Num(i,EBinary);
+		test(a==_TL("10000000000000000000000000000000"));
+		test(a.Length()==32);
+		a=_TL("");
+		a.NumUC(i,EBinary);
+		test(a==_TL("10000000000000000000000000000000"));
+		test(a.Length()==32);
+		}
+	i=31;
+	a.Num(i,EBinary);
+	test(a==_TL("11111"));
+	test(a.Length()==5);
+	a=_TL("");
+	a.NumUC(i,EBinary);
+	test(a==_TL("11111"));
+	test(a.Length()==5);
+	i=2147483648u;
+	a.Num(i,EOctal);
+	test(a==_TL("20000000000"));
+	test(a.Length()==11);
+	a=_TL("");
+	a.NumUC(i,EOctal);
+	test(a==_TL("20000000000"));
+	test(a.Length()==11);
+	a.Num(i,EDecimal);
+	test(a==_TL("2147483648"));
+	test(a.Length()==10);
+	a=_TL("");
+	a.NumUC(i,EDecimal);
+	test(a==_TL("2147483648"));
+	test(a.Length()==10);
+	a.Num(i,EHex);
+	test(a==_TL("80000000"));
+	test(a.Length()==8);
+	a=_TL("");
+	a.NumUC(i,EHex);
+	test(a==_TL("80000000"));
+	test(a.Length()==8);
+	i=0;
+	a.Num(i);
+	test(a==_TL("0"));
+	test(a.Length()==1);
+	a=_TL("abc");
+	a.Num(i,EBinary);
+	test(a==_TL("0"));
+	test(a.Length()==1);
+	a=_TL("abc");
+	a.NumUC(i,EBinary);
+	test(a==_TL("0"));
+	test(a.Length()==1);
+	a=_TL("abc");
+	a.Num(i,EOctal);
+	test(a==_TL("0"));
+	test(a.Length()==1);
+	a=_TL("");
+	a.NumUC(i,EOctal);
+	test(a==_TL("0"));
+	test(a.Length()==1);
+	a=_TL("abc");
+	a.Num(i,EDecimal);
+	test(a==_TL("0"));
+	test(a.Length()==1);
+	a=_TL("");
+	a.NumUC(i,EDecimal);
+	test(a==_TL("0"));
+	test(a.Length()==1);
+	a=_TL("abc");
+	a.Num(i,EHex);
+	test(a==_TL("0"));
+	test(a.Length()==1);
+	a=_TL("");
+	a.NumUC(i,EHex);
+	test(a==_TL("0"));
+	test(a.Length()==1);
+//	TInt i=a.Num(6.2,format); NOT IMPLEMENTED
+	a.AppendNum(j);
+	test(a==_TL("0-2147483648"));
+	test(a.Length()==12);
+	a=_TL("abc");
+	i=4294967295u;
+	a.AppendNum(i);
+	test(a==_TL("abc4294967295"));
+	test(a.Length()==13);
+	j=2147483647;
+	a=_TL("abc");
+	a.AppendNum(j);
+	test(a==_TL("abc2147483647"));
+	test(a.Length()==13);
+	a=_TL("a");
+	i=180150000;
+	if (a.MaxLength()>28)
+		{
+		a.AppendNum(i,EBinary);
+		test(a==_TL("a1010101111001101111011110000"));
+		test(a.Length()==29);
+		}
+	a=_TL("a");
+	a.AppendNum(15,EBinary);
+	test(a==_TL("a1111"));
+	test(a.Length()==5);
+	a=_TL("a");
+	a.AppendNum(i,EDecimal);
+	test(a==_TL("a180150000"));
+	test(a.Length()==10);
+	a=_TL("a");
+	a.AppendNum(i,EOctal);
+	test(a==_TL("a1257157360"));
+	test(a.Length()==11);
+	a=_TL("a");
+	a.AppendNumUC(i,EHex);
+	test(a==_TL("aABCDEF0"));
+	test(a.Length()==8);
+//	i=a.AppendNum(6.32, format); NOT IMPLEMENTED
+
+	test.Next(_L("Format"));
+	a=_TL("");
+	b=_TL("cde");
+	a.Format(_TL("%S"),&b);
+	test(a==b);
+	test(a.Length()==3);
+    DESTEMPLATE xyz=_TL("xyzwpq");
+	a.Format(_TL("%S"),&xyz);
+	test(a==_TL("xyzwpq"));
+	test(a.Length()==6);
+    DESTEMPLATE cde=_TL("cde");
+	a.Format(_TL("ab %-x5S"),&cde);
+	test(a==_TL("ab cdexx"));
+	test(a.Length()==8);
+	a.Format(_TL("ab %=x5S"),&cde);
+	test(a==_TL("ab xcdex"));
+	test(a.Length()==8);
+	a.Format(_TL("ab %+x5S"),&cde);
+	test(a==_TL("ab xxcde"));
+	test(a.Length()==8);
+	a.Format(_TL("ab %5S"),&cde);
+	test(a==_TL("ab   cde"));
+	test(a.Length()==8);
+	a.Format(_TL("ab %-**S"),'x',5,&cde);
+	test(a==_TL("ab cdexx"));
+	test(a.Length()==8);
+	a.Format(_TL("ab %*S"),5,&cde);
+	test(a==_TL("ab   cde"));
+	test(a.Length()==8);
+	a=_TL("xyz");
+	a.Format(_TL("ab %-x5S"),&b);
+	test(a==_TL("ab cdexx"));
+	test(a.Length()==8);
+	a=_TL("xyz");
+	a.Format(_TL("ab %-**S"),'x',5,&b);
+	test(a==_TL("ab cdexx"));
+	test(a.Length()==8);
+	a=_TL("xyz");
+	a.Format(_TL("ab %*S"),5,&b);
+	test(a==_TL("ab   cde"));
+	test(a.Length()==8);
+
+	DESTEMPLATE fred=_TL("fred");
+	a.Format(_TL("%+0*S"),10,&fred);
+	test(a==_TL("000000fred"));
+	test(a.Length()==10);
+	a.Format(_TL("%-0*S"),7,&fred);
+	test(a==_TL("fred000"));
+	test(a.Length()==7);
+	a.Format(_TL("%0*S"),11,&fred);
+	test(a==_TL("0000000fred"));
+	test(a.Length()==11);
+	a.Format(_TL("c=%s"),pD);
+	TESTEQ(a,_TL("c=299792458"));
+	a.Format(_TL("c=%10.6s"),pD);
+	test(a==_TL("c=    299792"));
+	a.Format(_TL("c=%*.*s"),5,4,pD);
+	test(a==_TL("c= 2997"));
+	a.Format(_TL("%S"),&d);
+	test(a==_TL("linearisation"));
+	a.Format(_TL("%10.6S"),&d);
+	test(a==_TL("    linear"));
+	a.Format(_TL("%*.*S"),5,4,&d);
+	test(a==_TL(" line"));
+	a.Format(_TL("%*.*Sed"),10,8,&d);
+	test(a==_TL("  linearised"));
+	a.Format(_TL("%*.*S"),14,20,&d);
+	test(a==_TL(" linearisation"));
+
+	a.Format(_TL("ab %-,5b"),7);
+	test(a==_TL("ab 111,,"));
+	test(a.Length()==8);
+	a.Format(_TL("ab %=,5O"),31);
+	test(a==_TL("ab ,37,,"));
+	test(a.Length()==8);
+	a.Format(_TL("ab %+xlx"),TInt64(171));
+	test(a==_TL("ab ab"));
+	test(a.Length()==5);
+	a.Format(_TL("ab %+xlX %+xlx"),TInt64(171),TInt64(171));
+	TESTEQ(a,_TL("ab AB ab"));
+	test(a.Length()==8);
+	a.Format(_TL("ab %lu"),MAKE_TINT64((TUint)(KMinTInt),0));
+	test(a==_TL("ab 9223372036854775808"));
+	test(a.Length()==22);
+	a.Format(_TL("ab %ld"),MAKE_TINT64((TUint)(KMinTInt),1));
+	test(a==_TL("ab -9223372036854775807"));
+	test(a.Length()==23);
+	a.Format(_TL("ab %ld"),MAKE_TINT64((TUint)(KMinTInt),0));
+	test(a==_TL("ab -9223372036854775808"));
+	test(a.Length()==23);
+	a.Format(_TL("ab %ld"),MAKE_TINT64((TUint)(KMaxTInt),KMaxTUint));
+	test(a==_TL("ab 9223372036854775807"));
+	test(a.Length()==22);
+	a.Format(_TL("ab %ld"),MAKE_TINT64(KMaxTUint,KMaxTUint));
+	test(a==_TL("ab -1"));
+	test(a.Length()==5);
+	a.Format(_TL("ab %lu"),MAKE_TINT64(KMaxTUint,KMaxTUint));
+	test(a==_TL("ab 18446744073709551615"));
+	test(a.Length()==23);
+	a.Format(_TL("ab %ld"),TInt64(0));
+	test(a==_TL("ab 0"));
+	test(a.Length()==4);
+	a.Format(_TL("ab %lb"),TInt64(0));
+	test(a==_TL("ab 0"));
+	test(a.Length()==4);
+	a.Format(_TL("ab %lx"),TInt64(0));
+	test(a==_TL("ab 0"));
+	test(a.Length()==4);
+	a.Format(_TL("ab %lo"),TInt64(0));
+	test(a==_TL("ab 0"));
+	test(a.Length()==4);
+	a.Format(_TL("ab %lu"),TInt64(0));
+	test(a==_TL("ab 0"));
+	test(a.Length()==4);
+	a.Format(_TL("ab %lb"),MAKE_TINT64((TUint)(KMaxTInt),KMaxTUint));
+	test(a==_TL("ab 111111111111111111111111111111111111111111111111111111111111111"));
+	test(a.Length()==66);
+	a.Format(_TL("ab %lb"),MAKE_TINT64(KMaxTUint,KMaxTUint));
+	test(a==_TL("ab 1111111111111111111111111111111111111111111111111111111111111111"));
+	test(a.Length()==67);
+	a.Format(_TL("ab %lx"),MAKE_TINT64((TUint)(KMaxTInt),KMaxTUint));
+	test(a==_TL("ab 7fffffffffffffff"));
+	test(a.Length()==19);
+	a.Format(_TL("ab %lx"),MAKE_TINT64(KMaxTUint,KMaxTUint));
+	test(a==_TL("ab ffffffffffffffff"));
+	test(a.Length()==19);
+	a.Format(_TL("ab %lo"),MAKE_TINT64((TUint)(KMaxTInt),KMaxTUint));
+	test(a==_TL("ab 777777777777777777777"));
+	test(a.Length()==24);
+	// tests which excercise any 8 byte alignment requirement on 64bit integers
+	a.Format(_TL("%li%S"),MAKE_TINT64(1,2),&fred);
+	test(a==_TL("4294967298fred"));
+	a.Format(_TL("%S%li%S"),&fred,MAKE_TINT64(1,2),&fred);
+	test(a==_TL("fred4294967298fred"));
+	a.Format(_TL("%lu%S"),MAKE_TINT64(1,2),&fred);
+	test(a==_TL("4294967298fred"));
+	a.Format(_TL("%S%lu%S"),&fred,MAKE_TINT64(1,2),&fred);
+	test(a==_TL("fred4294967298fred"));
+
+	a.Format(_TL("ab %U"),233);
+	test(a==_TL("ab 233"));
+	test(a.Length()==6);
+	a.Format(_TL("ab %*d"),5,-131);
+	test(a==_TL("ab  -131"));
+	test(a.Length()==8);
+	a.Format(_TL("ab%c"),'x');
+	test(a==_TL("abx"));
+	test(a.Length()==3);
+	a.Format(_TL("%W"),-131);
+	test(*(TInt32*)a.Ptr()==-131);
+	a.Format(_TL("%M"),-131);
+	test(*(TInt32*)a.Ptr()==2113929215);
+	a.Format(_TL("%w"),-131);
+	test(*(TInt16*)a.Ptr()==-131);
+	a.Format(_TL("%m"),-131);
+	test(*(TInt16*)a.Ptr()==32255);
+	a=_TL("xyz");
+	a.AppendFormat(_TL("ab %+xlx"),TInt64(171));
+	test(a==_TL("xyzab ab"));
+	test(a.Length()==8);
+	a=_TL("xyz");
+	a.AppendFormat(_TL("ab %5S"),&b);
+	test(a==_TL("xyzab   cde"));
+	test(a.Length()==11);
+	a=_TL("xyz");
+	a.AppendFormat(_TL("%W"),-131);
+//	test(*(TInt32*)(a.Ptr()+3)==-131); // Alignment-safe version:
+    TInt val;
+    Mem::Copy(&val,&a[3],4);
+	test(val==-131);
+	a=_TL("xyz");
+//	a.Append(_TL("abc"),3);
+//	test(a==_TL("xyzabc"));
+
+	a.Format(_TL(""));
+	test(a==_TL(""));
+	a.Format(_TL(""),9,5);
+	test(a==_TL(""));
+	a.Format(_TL("qwerty"));
+	test(a==_TL("qwerty"));
+	a.Format(_TL("qwerty"),9,5);
+	test(a==_TL("qwerty"));
+	a.Format(_TL("%$1$d%$2$d"),9,5);
+	test(a==_TL("95"));
+	test(a.Length()==2);
+	a.Format(_TL("%$2$d%$1$d"),9,5);
+	test(a==_TL("59"));
+	test(a.Length()==2);
+	b=_TL("eb");
+	a.Format(_TL("%$1$S%$2$d"),&b,205);
+	test(a==_TL("eb205"));
+	test(a.Length()==5);
+	a.Format(_TL("%$2$d%$1$S"),&b,205);
+	test(a==_TL("205eb"));
+	test(a.Length()==5);
+	b=_TL("ebdb");
+
+// Cannot do this on GCC (X86) because of "Cannot pass objects of non-POD type through '...'. Call will abort at runtime".
+#if !(defined(__GCC32__) && defined(__X86__))
+	const TAny* const zeroTerminatedString=(sizeof(S)==2)? (const TAny*)_S16(":-)E"): (const TAny*)_S8(":-)E");
+	const TInt dummyParameter=0;
+	Test14_ReorderedParameterFormatting(dummyParameter, 0x20ac, 11, 3, 13.89543, zeroTerminatedString, '!', TInt64(199), 2, &b, 6, 30005, TRealX(0.125), 0x8bdd);
+#endif
+
+	test.Next(_L("Print some numbers"));
+	TInt64 TI64 = MAKE_TINT64(0x101010u,0x10101010u);
+	test.Printf(_L("    %%ld: %ld\n"),TI64);
+	test.Printf(_L("    %%lu: %lu\n"),TI64);
+	test.Printf(_L("    %%lx: %lx\n"),TI64);
+	test.Printf(_L("    %%lb: %lb\n"),TI64);
+	test.Printf(_L("    %%lo: %lo\n\n"),TI64);
+	TI64 = UI64LIT(0xabcdef12345678);
+	test.Printf(_L("    %%ld: %ld\n"),TI64);
+	test.Printf(_L("    %%lu: %lu\n"),TI64);
+	test.Printf(_L("    %%lx: %lx\n"),TI64);
+	test.Printf(_L("    %%lb: %lb\n"),TI64);
+	test.Printf(_L("    %%lo: %lo\n\n"),TI64);
+	TI64 = UI64LIT(0x7fffffffffffffff);
+	test.Printf(_L("    %%ld: %ld\n"),TI64);
+	test.Printf(_L("    %%lu: %lu\n"),TI64);
+	test.Printf(_L("    %%lx: %lx\n"),TI64);
+	test.Printf(_L("    %%lb: %lb\n"),TI64);
+	test.Printf(_L("    %%lo: %lo\n\n"),TI64);
+	TI64 = UI64LIT(0x8000000000000000);
+	test.Printf(_L("    %%ld: %ld\n"),TI64);
+	test.Printf(_L("    %%lu: %lu\n"),TI64);
+	test.Printf(_L("    %%lx: %lx\n"),TI64);
+	test.Printf(_L("    %%lb: %lb\n"),TI64);
+	test.Printf(_L("    %%lo: %lo\n\n"),TI64);
+	TI64 = UI64LIT(0xffffffffffffffff);
+	test.Printf(_L("    %%ld: %ld\n"),TI64);
+	test.Printf(_L("    %%lu: %lu\n"),TI64);
+	test.Printf(_L("    %%lx: %lx\n"),TI64);
+	test.Printf(_L("    %%lb: %lb\n"),TI64);
+	test.Printf(_L("    %%lo: %lo\n\n"),TI64);
+
+	test.Next(_L("Regression tests"));
+	a.Format(_TL("[%-A4p]"));
+	test(a==_TL("[AAAA]"));
+
+	test.End();
+	}
+
+template <class T,class S,class DESTEMPLATE>
+GLDEF_C void TestTBuf<T,S,DESTEMPLATE>::Test14_ReorderedParameterFormatting(TInt aDummyParameter, ...)
+	{
+	VA_LIST parameterList;
+	T generated;
+	T expected;
+
+	VA_START(parameterList, aDummyParameter);
+	generated.FormatList(_TL("\t%-**.*fqq%.3swww%+*5Ldeeee%.*Srrrrr%0*xtttttt%.3Fyyyyyyy%c"), parameterList);
+	test(generated.Length()==61);
+	expected.Format(_TL("\t13.895%c%c%c%c%cqq:-)www!!199eeeeebrrrrr007535tttttt0.125yyyyyyy"), (S)0x20ac, (S)0x20ac, (S)0x20ac, (S)0x20ac, (S)0x20ac);
+	test(generated.Left(generated.Length()-1)==expected);
+	test(generated[generated.Length()-1]==(S)0x8bdd);
+
+	VA_START(parameterList, aDummyParameter);
+	generated.FormatList(_TL("\t%$1$-**.*fqq%.3swww%+*5Ldeeee%.*Srrrrr%0*xtttttt%$6$.3Fyyyyyyy%c"), parameterList);
+	test(generated.Length()==61);
+	expected.Format(_TL("\t13.895%c%c%c%c%cqq:-)www!!199eeeeebrrrrr007535tttttt0.125yyyyyyy"), (S)0x20ac, (S)0x20ac, (S)0x20ac, (S)0x20ac, (S)0x20ac);
+	test(generated.Left(generated.Length()-1)==expected);
+	test(generated[generated.Length()-1]==(S)0x8bdd);
+
+	VA_START(parameterList, aDummyParameter);
+	generated.FormatList(_TL("\t%$6$.3Fqq%.3swww%+*5Ldeeee%.*Srrrrr%0*xtttttt%$1$-**.*fyyyyyyy%c"), parameterList);
+	test(generated.Length()==61);
+	expected.Format(_TL("\t0.125qq:-)www!!199eeeeebrrrrr007535tttttt13.895%c%c%c%c%cyyyyyyy"), (S)0x20ac, (S)0x20ac, (S)0x20ac, (S)0x20ac, (S)0x20ac);
+	test(generated.Left(generated.Length()-1)==expected);
+	test(generated[generated.Length()-1]==(S)0x8bdd);
+
+	VA_START(parameterList, aDummyParameter);
+	generated.FormatList(_TL("\t%-**.*fqq%.3swww%$5$0*xeeee%.*Srrrrr%$3$+*5Ldtttttt%.3Fyyyyyyy%c"), parameterList);
+	test(generated.Length()==61);
+	expected.Format(_TL("\t13.895%c%c%c%c%cqq:-)www007535eeeeebrrrrr!!199tttttt0.125yyyyyyy"), (S)0x20ac, (S)0x20ac, (S)0x20ac, (S)0x20ac, (S)0x20ac);
+	test(generated.Left(generated.Length()-1)==expected);
+	test(generated[generated.Length()-1]==(S)0x8bdd);
+
+	VA_START(parameterList, aDummyParameter);
+	generated.FormatList(_TL("\t%-**.*fqq%$4$.*Swww%+*5Ldeeee%$2$.3srrrrr%0*xtttttt%.3Fyyyyyyy%c"), parameterList);
+	test(generated.Length()==61);
+	expected.Format(_TL("\t13.895%c%c%c%c%cqqebwww!!199eeee:-)rrrrr007535tttttt0.125yyyyyyy"), (S)0x20ac, (S)0x20ac, (S)0x20ac, (S)0x20ac, (S)0x20ac);
+	test(generated.Left(generated.Length()-1)==expected);
+	test(generated[generated.Length()-1]==(S)0x8bdd);
+
+	VA_START(parameterList, aDummyParameter);
+	generated.FormatList(_TL("\t%-**.*fqq%.3swww%+*5Ldeeee%$7$crrrrr%0*xtttttt%.3Fyyyyyyy%$4$.*S"), parameterList);
+	test(generated.Length()==61);
+	expected.Format(_TL("\t13.895%c%c%c%c%cqq:-)www!!199eeee"), (S)0x20ac, (S)0x20ac, (S)0x20ac, (S)0x20ac, (S)0x20ac);
+	test(generated.Left(29)==expected);
+	test(generated[29]==(S)0x8bdd);
+	test(generated.Mid(29+1)==_TL("rrrrr007535tttttt0.125yyyyyyyeb"));
+
+	VA_START(parameterList, aDummyParameter);
+	generated.FormatList(_TL("\t%$4$.*Sqq%.3swww%+*5Ldeeee%$6$.3Frrrrr%0*xtttttt%$1$-**.*fyyyyyyy%c"), parameterList);
+	test(generated.Length()==61);
+	expected.Format(_TL("\tebqq:-)www!!199eeee0.125rrrrr007535tttttt13.895%c%c%c%c%cyyyyyyy"), (S)0x20ac, (S)0x20ac, (S)0x20ac, (S)0x20ac, (S)0x20ac);
+	test(generated.Left(generated.Length()-1)==expected);
+	test(generated[generated.Length()-1]==(S)0x8bdd);
+
+	VA_START(parameterList, aDummyParameter);
+	generated.FormatList(_TL("\t%$7$cqq%$6$.3Fwww%$5$0*xeeee%.*Srrrrr%$3$+*5Ldtttttt%$2$.3syyyyyyy%$1$-**.*f"), parameterList);
+	test(generated.Length()==61);
+	test(generated.Left(1)==_TL("\t"));
+	test(generated[1]==(S)0x8bdd);
+	expected.Format(_TL("qq0.125www007535eeeeebrrrrr!!199tttttt:-)yyyyyyy13.895%c%c%c%c%c"), (S)0x20ac, (S)0x20ac, (S)0x20ac, (S)0x20ac, (S)0x20ac);
+	test(generated.Mid(2)==expected);
+
+	VA_START(parameterList, aDummyParameter);
+	generated.FormatList(_TL("\t%$7$cqq%$6$.3Fwww%$5$0*xeeee%$4$.*Srrrrr%$3$+*5Ldtttttt%$2$.3syyyyyyy%$1$-**.*f"), parameterList);
+	test(generated.Length()==61);
+	test(generated.Left(1)==_TL("\t"));
+	test(generated[1]==(S)0x8bdd);
+	expected.Format(_TL("qq0.125www007535eeeeebrrrrr!!199tttttt:-)yyyyyyy13.895%c%c%c%c%c"), (S)0x20ac, (S)0x20ac, (S)0x20ac, (S)0x20ac, (S)0x20ac);
+	test(generated.Mid(2)==expected);
+	}
+
+template <class T,class S,class DESTEMPLATE>
+GLDEF_C void TestTBuf<T,S,DESTEMPLATE>::Test15()
+// Replacing
+	{
+	test.Start(_L("Replace"));
+	T a,b;
+	test(a.MaxLength()>=9);
+	a=_TL("abccccc");
+	b=_TL("def");
+	a.Replace(3,4,b); // Replace with smaller in middle (insert and delete)
+	test(a==_TL("abcdef"));
+	a.Replace(1,1,b); // Replace with larger in middle (insert and delete)
+	test(a==_TL("adefcdef"));
+	a.Replace(0,8,_TL("")); // Replace complete string (delete)
+	test(a==_TL(""));
+	a.Replace(0,0,b); // Replace at beginning (insert)
+	test(a==b);
+	a.Replace(3,0,_TL("xyz")); // Replace at end (append)
+	test(a==_TL("defxyz"));
+	a.Replace(0,0,_TL("")); // Replace nothing at beginning (do nothing)
+	test(a==_TL("defxyz"));
+	a.Replace(6,0,_TL("")); // Replace nothing at end (do nothing)
+	test(a==_TL("defxyz"));
+	//a.Replace(6,1,_TL("")); // this will panic - no char after end to replace
+	//a.Replace(0,7,_TL("")); // this will panic - aint 7 chars to replace
+	test.End();
+	}
+
+template<class T,class S,class DESTEMPLATE>
+GLDEF_C void TestTBuf<T,S,DESTEMPLATE>::test_TBuf()
+// Test the TBuf class.
+	{
+	test.Start(_L("All operations"));
+	Test1();
+	test.Next(_L("Constructors"));
+	Test2();
+	test.Next(_L("Additional tests"));
+	Test3();
+	test.Next(_L("Comparison operators"));
+	Test4();
+	test.Next(_L("Property access"));
+	Test5();
+	test.Next(_L("Fill and swap"));
+	Test6();
+	test.Next(_L("Conversion operators"));
+	Test7();
+	test.Next(_L("Comparison"));
+	Test8();
+	test.Next(_L("Matching"));
+	Test9();
+	test.Next(_L("Locating"));
+	Test10();
+	test.Next(_L("Copying"));
+	Test11();
+	test.Next(_L("Finding"));
+	Test12();
+	test.Next(_L("Basic like ops"));
+	Test13();
+	test.Next(_L("Formating"));
+	Test14();
+	test.Next(_L("Replacing"));
+	Test15();
+	test.End();
+	}
+
+LOCAL_C void testFormat()
+	{
+	TBuf<0x100> aa;
+	aa.Format(_L("x%- 5fx"), 6.2345678);
+	test(aa==_L("x6.234568x"));
+	aa.Format(_L("x%+ 5fx"), 6.2345678);
+	test(aa==_L("x6.234568x"));
+	aa.Format(_L("x% 5fx"), 6.2345678);
+	test(aa==_L("x6.234568x"));
+	aa.Format(_L("x%= 5fx"), 6.2345678);
+	test(aa==_L("x6.234568x"));
+	aa.Format(_L("x%- 10fx"), 6.2345);
+	test(aa==_L("x6.234500  x"));
+	aa.Format(_L("x%+ 10fx"), 6.2345);
+	test(aa==_L("x  6.234500x"));
+	aa.Format(_L("x% 10fx"), 6.2345);
+	test(aa==_L("x  6.234500x"));
+	aa.Format(_L("x%= 10fx"), 6.2345);
+	test(aa==_L("x 6.234500 x"));
+	aa.Format(_L("x%10fx"), 12345352342.545);
+	test(aa==_L("x12,345,352,342.545000x"));
+	aa.Format(_L("x%20.9fx"), 1.0123456789);
+	test(aa==_L("x         1.012345679x"));
+	aa.Format(_L("x%5.1fx"), 1.99);
+	test(aa==_L("x  2.0x"));
+
+// Cannot do these on GCC (X86) because of "Cannot pass objects of non-POD type through '...'. Call will abort at runtime".
+#if !(defined(__GCC32__) && defined(__X86__))
+	aa.Format(_L("x%- 5Fx"), TRealX(6.2345678));
+	test(aa==_L("x6.234568x"));
+	aa.Format(_L("x%+ 5Fx"), TRealX(6.2345678));
+	test(aa==_L("x6.234568x"));
+	aa.Format(_L("x% 5Fx"), TRealX(6.2345678));
+	test(aa==_L("x6.234568x"));
+	aa.Format(_L("x%= 5Fx"), TRealX(6.2345678));
+	test(aa==_L("x6.234568x"));
+	aa.Format(_L("x%- 10Fx"), TRealX(6.2345));
+	test(aa==_L("x6.234500  x"));
+	aa.Format(_L("x%+ 10Fx"), TRealX(6.2345));
+	test(aa==_L("x  6.234500x"));
+	aa.Format(_L("x% 10Fx"), TRealX(6.2345));
+	test(aa==_L("x  6.234500x"));
+	aa.Format(_L("x%+010Fx"), TRealX(6.2345));
+	test(aa==_L("x006.234500x"));
+	aa.Format(_L("x%+10Fx"), TRealX(6.2345));
+	test(aa==_L("x  6.234500x"));
+	aa.Format(_L("x%10Fx"), TRealX(6.2345));
+	test(aa==_L("x  6.234500x"));
+	aa.Format(_L("x%010Fx"), TRealX(6.2345));
+	test(aa==_L("x006.234500x"));
+	aa.Format(_L("x%= 10Fx"), TRealX(6.2345));
+	test(aa==_L("x 6.234500 x"));
+	aa.Format(_L("x%10Fx"), TRealX(12345352342.545));
+	test(aa==_L("x12,345,352,342.545000x"));
+	aa.Format(_L("x%20.9Fx"), TRealX(1.0123456789));
+	test(aa==_L("x         1.012345679x"));
+	aa.Format(_L("x%5.1Fx"), TRealX(1.99));
+	test(aa==_L("x  2.0x"));
+#endif
+
+	aa.Format(_L("x%- 5ex"), 6.2345678);
+	test(aa==_L("x6.234568E+00x"));
+	aa.Format(_L("x%+ 5ex"), 6.2345678);
+	test(aa==_L("x6.234568E+00x"));
+	aa.Format(_L("x% 5ex"), 6.2345678);
+	test(aa==_L("x6.234568E+00x"));
+	aa.Format(_L("x%= 5ex"), 6.2345678);
+	test(aa==_L("x6.234568E+00x"));
+	aa.Format(_L("x%- 14ex"), 6.2345);
+	test(aa==_L("x6.234500E+00  x"));
+	aa.Format(_L("x%+ 14ex"), 6.2345);
+	test(aa==_L("x  6.234500E+00x"));
+	aa.Format(_L("x% 14ex"), 6.2345);
+	test(aa==_L("x  6.234500E+00x"));
+	aa.Format(_L("x%= 14ex"), 6.2345);
+	test(aa==_L("x 6.234500E+00 x"));
+	aa.Format(_L("x%10ex"), 12345352342.545);
+	test(aa==_L("x1.234535E+10x"));
+	aa.Format(_L("x%20.9ex"), 1.0123456789);
+	test(aa==_L("x     1.012345679E+00x"));
+	aa.Format(_L("x%5.1ex"), 1.99);
+	test(aa==_L("x2.0E+00x"));
+	}
+
+
+class TO8 : public TDes8Overflow
+	{
+public:
+	virtual void Overflow(TDes8 &aDes);
+	};
+
+void TO8::Overflow(TDes8 &aDes)
+	{
+	aDes=_L8("OVERFLOW");
+	}
+
+class TO8L : public TDes8Overflow
+	{
+public:
+	virtual void Overflow(TDes8 &aDes);
+	};
+
+void TO8L::Overflow(TDes8 &/*aDes*/)
+	{
+	User::Leave(KErrOverflow);
+	}
+
+class TO16 : public TDes16Overflow
+	{
+public:
+	virtual void Overflow(TDes16 &aDes);
+	};
+
+void TO16::Overflow(TDes16 &aDes)
+	{
+	aDes=_L16("OVERFLOW");
+	}
+
+class TO16L : public TDes16Overflow
+	{
+public:
+	virtual void Overflow(TDes16 &aDes);
+	};
+
+void TO16L::Overflow(TDes16 &/*aDes*/)
+	{
+	User::Leave(KErrOverflow);
+	}
+
+void append8(TDes8 &aBuf, TDes8Overflow *aHandler, TRefByValue<const TDesC8> aFmt, ...)
+	{
+	VA_LIST list;
+	VA_START(list, aFmt);
+	aBuf.AppendFormatList(aFmt, list, aHandler);
+	}
+
+void append16(TDes16 &aBuf, TDes16Overflow *aHandler, TRefByValue<const TDesC16> aFmt, ...)
+	{
+	VA_LIST list;
+	VA_START(list, aFmt);
+	aBuf.AppendFormatList(aFmt, list, aHandler);
+	}
+
+void testOverflow()
+	{
+	test.Start(_L("Test no overflow"));
+	TBuf8<16> buf=_L8("A ");
+	append8(buf, NULL, _L8("Descriptor"));
+	test(buf==_L8("A Descriptor"));
+
+	test.Printf(_L("Use a non-leaving overflow handler\n"));
+	test.Next(_L("Force overflow with no conversions"));
+    TO8 overflow;
+	append8(buf, &overflow, _L8("12345678901234567"));
+	test(buf==_L8("OVERFLOW"));
+
+	test.Next(_L("Force overflow with decimal conversion"));
+	buf=_L8("A Descriptor");
+	append8(buf, &overflow,  _L8("%d"), 12345678);
+	test(buf==_L8("OVERFLOW"));
+
+	test.Printf(_L("Use a leaving overflow handler\n"));
+	test.Next(_L("AppendFormatList with no overflow"));
+	buf=_L8("A Descriptor");
+    TO8L overflowLeave;
+	TRAPD(r, append8(buf, &overflowLeave, _L8("ONE")));
+	test(r==KErrNone);
+	test(buf==_L8("A DescriptorONE"));
+	test.Next(_L("Force overflow with hexadecimal conversion"));
+	buf=_L8("A Descriptor");
+	TRAP(r, append8(buf, &overflowLeave, _L8("%08x"), 0));
+	test(r==KErrOverflow);
+		{
+		test.Printf(_L("Repeat tests with TBuf16\n"));
+		test.Next(_L("Test no overflow"));
+		TBuf16<16> buf=_L16("A ");
+		append16(buf, NULL, _L16("Descriptor"));
+		test(buf==_L16("A Descriptor"));
+
+		test.Printf(_L("Use a non-leaving overflow handler\n"));
+		test.Next(_L("Force overflow with no conversions"));
+		TO16 overflow;
+		append16(buf, &overflow, _L16("12345678901234567"));
+		test(buf==_L16("OVERFLOW"));
+
+		test.Next(_L("Force overflow with decimal conversion"));
+		buf=_L16("A Descriptor");
+		append16(buf, &overflow,  _L16("%d"), 12345678);
+		test(buf==_L16("OVERFLOW"));
+
+		test.Printf(_L("Use a leaving overflow handler\n"));
+		test.Next(_L("AppendFormatList with no overflow"));
+		buf=_L16("A Descriptor");
+		TO16L overflowLeave;
+		TRAPD(r, append16(buf, &overflowLeave, _L16("ONE")));
+		test(r==KErrNone);
+		test(buf==_L16("A DescriptorONE"));
+		test.Next(_L("Force overflow with hexadecimal conversion"));
+		buf=_L16("A Descriptor");
+		TRAP(r, append16(buf, &overflowLeave, _L16("%08x"), 0));
+		test(r==KErrOverflow);
+		}
+	test.End();
+	}
+
+void testIgnoreOverflow()
+	{
+	test.Start(_L("Test no overflow"));
+	TBuf8<16> buf=_L8("A ");
+	append8(buf, NULL, _L8("Descriptor"));
+	test(buf==_L8("A Descriptor"));
+
+	test.Printf(_L("Use a non-leaving overflow handler\n"));
+	test.Next(_L("Force overflow with no conversions"));
+    TDes8IgnoreOverflow overflow;
+	append8(buf, &overflow, _L8("12345678901234567"));
+	test(buf==_L8("A Descriptor1234"));
+
+	test.Next(_L("Force overflow with decimal conversion"));
+	buf=_L8("A Descriptor");
+	append8(buf, &overflow,  _L8("%d"), 123456789);
+	test(buf==_L8("A Descriptor"));
+
+	//test.Printf(_L("Repeat tests with TBuf16\n"));
+	test.Next(_L("Test no overflow"));
+	TBuf16<17> buf2=_L16("A ");
+	append16(buf2, NULL, _L16("Descriptor"));
+	test(buf2==_L16("A Descriptor"));
+
+	test.Printf(_L("Use a non-leaving overflow handler\n"));
+	test.Next(_L("Force overflow with no conversions"));
+	TDes16IgnoreOverflow overflow2;
+	append16(buf2, &overflow2, _L16("12345678901234567"));
+	test(buf2==_L16("A Descriptor12345"));
+
+	test.Next(_L("Force overflow with decimal conversion"));
+	buf2=_L16("A Descriptor");
+	append16(buf2, &overflow2,  _L16("%d"), 123456789);
+	test(buf2==_L16("A Descriptor"));
+
+	test.End();
+	}
+
+void testAppendFormatIgnoreOverflow()
+	{
+	test.Start(_L("Test no overflow"));
+	TBuf8<16> buf;
+	buf.AppendFormat(_L8("A Descriptor"));	
+	test(buf==_L8("A Descriptor"));
+	
+	test.Next(_L("Force overflow with no conversions"));
+    TDes8IgnoreOverflow overflow;
+	buf.AppendFormat(_L8("123456789012345679"),&overflow);
+	test(buf==_L8("A Descriptor1234"));
+	
+	test.Next(_L("Force overflow with decimal conversion"));
+	buf = _L8("Symbian OS");
+	buf.AppendFormat(_L8("%d"), &overflow, 1234567);
+	test(buf==_L8("Symbian OS"));
+	
+	test.Next(_L("Test no overflow"));
+	TBuf16<16> buf2;
+	buf2.AppendFormat(_L16("A Descriptor"));	
+	test(buf2==_L16("A Descriptor"));
+	
+	test.Next(_L("Force overflow with no conversions"));
+    TDes16IgnoreOverflow overflow2;
+	buf2.AppendFormat(_L16("123456789012345679"),&overflow2);
+	test(buf2==_L16("A Descriptor1234"));
+	
+	test.Next(_L("Force overflow with decimal conversion"));
+	buf2 = _L16("Symbian OS");
+	buf2.AppendFormat(_L16("%d"), &overflow2, 1234567);
+	test(buf2==_L16("Symbian OS"));
+
+	test.End();
+
+
+	}
+
+// INC061330  AV28Crit: NTT - TInt TDesC16.FindC -method is giving strange output values 
+// This test should pass with "ELangPrcChinese" locale.
+void INC061330()
+	{
+	TLanguage defaultLang = User::Language();
+
+	TInt err = HAL::Set(HAL::ELanguageIndex, ELangPrcChinese);
+	test(err == KErrNone);	
+
+	TBuf<50> libraryName;
+
+	libraryName.Format(_L("ELOCL.%02d"), ELangPrcChinese);
+
+	//Reset the locale
+	err=UserSvr::ChangeLocale(KNullDesC);
+	test(err==KErrNone);
+
+	//Now change to chinese locale
+	err = UserSvr::ChangeLocale(libraryName);
+	if(err==KErrNotFound)
+		{
+		test.Printf(_L("TEST CASE NOT RUN BECAUSE ELangPrcChinese LOCALE NOT FOUND!\n"));
+		HAL::Set(HAL::ELanguageIndex, defaultLang);
+		return;
+		}
+	test(err == KErrNone);
+	
+	TLanguage lang = User::Language();
+	test(lang == ELangPrcChinese);
+
+	TInt pos;
+	_LIT(KBuf, "hello");
+
+	pos = KBuf().FindC(_L("a"));
+	test(pos == KErrNotFound);
+
+	pos = KBuf().FindC(_L("zzz"));
+	test(pos == KErrNotFound);
+
+	pos = KBuf().FindC(_L("."));
+	test(pos == KErrNotFound);
+
+	pos = KBuf().FindC(_L(":"));
+	test(pos == KErrNotFound);
+
+	pos = KBuf().FindC(_L("hela"));
+	test(pos == KErrNotFound);
+
+	//Reset the locale
+	err=UserSvr::ChangeLocale(KNullDesC);
+	test(err==KErrNone);
+	
+	//Now revert to the original default english locale
+	libraryName.Format(_L("ELOCL.%02d"), defaultLang);
+	test(err == KErrNone);
+	err = UserSvr::ChangeLocale(libraryName);
+	test(err == KErrNone);
+	
+	lang = User::Language();
+	test(lang == defaultLang);
+	}
+#ifndef _DEBUG
+#pragma warning( disable : 4702) //Unreachable code
+#pragma warning( disable : 4710) //Function not expanded
+#endif
+GLDEF_C TInt E32Main()
+// Test the TBuf type.
+    {
+	test.Title();
+
+	test.Start(_L("class TBuf16<0x50>"));
+	TestTBuf<TBuf16<0x50>,TText16,TPtrC16> c(0x50);
+	c.test_TBuf();
+	
+	test.Next(_L("class TBuf8<0x50>"));
+	TestTBuf<TBuf8<0x50>,TText8,TPtrC8> b(0x50);
+	b.test_TBuf();
+	
+	test.Next(_L("class TBuf<0x50>"));
+	TestTBuf<TBuf<0x50>,TText,TPtrC> a(0x50);
+	a.test_TBuf();
+
+	test.Next(_L("TReal formating"));
+	testFormat();
+
+	test.Next(_L("Test overflow handler"));
+	testOverflow();
+
+	test.Next(_L("Test ignore overflow handler"));
+	testIgnoreOverflow();
+
+	test.Next(_L("Test Format ignore overflow handler"));
+	testAppendFormatIgnoreOverflow();
+
+	test.Next(_L("INC061330"));
+	INC061330();
+
+	test.End();
+
+	return(KErrNone);
+    }
+
+//#pragma warning( default : 4702)
+//#pragma warning( default : 4710)
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32test/buffer/t_char.cpp	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,1537 @@
+// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32test\buffer\t_char.cpp
+// Overview:
+// Test TChar, TCharF, TChaLC and TCharUC character classes.
+// API Information:
+// TChar, TCharF, TChaLC, TCharUC.
+// Details:
+// - For different characters 
+// - Verify character's standard category information
+// - CR1080 verification of standard category information for additional Indic characters
+// - Verify character's bi-directional Unicode character category.
+// - Check if character is printable.
+// - Check if character is a graphical character.
+// - Verify for Chinese, Japanese, Korean (CJK) notional width.
+// - Verify that it is upper case, lower case form.
+// - Verify character's title case.
+// - Verify mirrored property of character.
+// - Verify integer numeric property of character.
+// - Verify character can be decomposed.
+// - For different unicode strings, verify unicode collation
+// - Compare data of two descriptors using the different collation methods and 
+// check results are as expected.
+// - Call the methods in the TChar, TCharF, TCharUC and TCharUC
+// - For TChar, TCharF, TChaLC, TCharUC
+// - Check the constructor and operators are as expected.
+// - Check folded character is same when it is converted to folded uppercase.
+// - Check folded and uppercase character is same when it is converted to 
+// uppercase letter stripped of accents.
+// - Convert lowercase, uppercase characters to it's lowercase form, check the conversion 
+// is as expected, and lowercase characters are unchanged.
+// - Convert lowercase, uppercase characters to it's uppercase form, check the conversion 
+// is as expected, and uppercase characters are unchanged.
+// Platforms/Drives/Compatibility:
+// All 
+// Assumptions/Requirement/Pre-requisites:
+// Failures and causes:
+// Base Port information:
+// 
+//
+
+#include <e32test.h>
+#include <collate.h>	  
+
+#ifdef __VC32__
+    // Solve compilation problem caused by non-English locale
+    #pragma setlocale("english")
+#endif
+
+LOCAL_D RTest test(_L("T_CHAR"));
+
+enum
+	{
+	Ydieresis=0x178,
+	nobreakspace=160,
+	exclamdown,
+	cent,
+	sterling,
+	currency,
+	yen,
+	brokenbar,
+	section,
+	dieresis,
+	copyright,
+	ordfeminine,
+	leftdoubleanglequote,
+	logicalnot,
+	softhyphen,
+	registered,
+	macron,
+	degree,
+	plusminus,
+	twosuperior,
+	threesuperior,
+	acute,
+	micro,
+	pilcrow,
+	dotaccent,
+	cedilla,
+	onesuperior,
+	ordmasculine,
+	rightdoubleanglequote,
+	onequarter,
+	onehalf,
+	threequarters,
+	questiondown,
+	Agrave,
+	Aacute,
+	Acircumflex,
+	Atilde,
+	Adieresis,
+	Aring,
+	AE,
+	Ccedilla,
+	Egrave,
+	Eacute,
+	Ecircumflex,
+	Edieresis,
+	Igrave,
+	Iacute,
+	Icircumflex,
+	Idieresis,
+	Eth,
+	Ntilde,
+	Ograve,
+	Oacute,
+	Ocircumflex,
+	Otilde,
+	Odieresis,
+	multiplication,
+	Oslash,
+	Ugrave,
+	Uacute,
+	Ucircumflex,
+	Udieresis,
+	Yacute,
+	Thorn,
+	germanbls,
+	agrave,
+	aacute,
+	acircumflex,
+	atilde,
+	adieresis,
+	aring,
+	ae,
+	ccedilla,
+	egrave,
+	eacute,
+	ecircumflex,
+	edieresis,
+	igrave,
+	iacute,
+	icircumflex,
+	idieresis,
+	eth,
+	ntilde,
+	ograve,
+	oacute,
+	ocircumflex,
+	otilde,
+	odieresis,
+	division,
+	oslash,
+	ugrave,
+	uacute,
+	ucircumflex,
+	udieresis,
+	yacute,
+	thorn,
+	ydieresis,
+	Dzcaron = 0x01C5, 
+	Lj = 0x01C8, 
+	Udearesismacron = 0x01D5,
+	Adotabove = 0x01E0,
+	AEmacron = 0x01E2,
+	aringacute = 0x01FB,
+	scommabelow = 0x0219, 
+	Otildemacron = 0x022C,
+	Cstroke = 0x023B,
+	doubleprime = 0x02BA, 
+	lowleftarrow = 0x02FF,
+	candrabindu = 0x0310, 
+	doublerightwardsarrowbelow = 0x0362,
+	latinsmalla = 0x0363	
+	};
+
+struct TCharDump
+	{
+	TUint iChar;
+	};
+
+/*EXPORT_C*/ void TChar::__DbgTest(void* pTCharDump) const
+	{
+	((TCharDump*)pTCharDump)->iChar=iChar;
+	}
+
+typedef enum {eTChar, eTCharF, eTCharC, eTCharLC, eTCharUC} TCharTypes;
+
+template<class TCharType>	
+class TestTChar
+	{
+public:
+	void Test1();
+	void Test2(TCharTypes);
+	void Test3(TCharTypes);
+	void Test4(TCharTypes);
+	};
+
+template<class TCharType>
+GLDEF_C void TestTChar<TCharType>::Test1()
+// Test that the methods are in the DLL
+	{
+	test.Start(_L("Test methods are in DLL - TChar"));
+	TChar a('X');
+	TUint TU=0;
+	TChar b(TU);
+	TChar c(b);
+
+	c=TU;
+	c=a;
+	c-=TU;
+	c+=TU;
+	c-TU;
+	c+TU;
+	c=(TUint)(a);
+
+	a.Fold();
+	a.LowerCase();
+	a.UpperCase();
+	a.Eos();
+	a.IsLower();
+	a.IsUpper();
+	a.IsAlpha();
+	a.IsDigit();
+	a.IsAlphaDigit();
+	a.IsHexDigit();
+	a.IsSpace();
+	a.IsPunctuation();
+	a.IsGraph();
+	a.IsPrint();
+//	a.SetChar(TU); protected
+
+	test.Next(_L("Test methods are in DLL - TCharF"));	
+	TCharF d(TU);
+	TCharF e(a);
+    e=d;
+	e=TU;
+	e=a;
+
+	test.Next(_L("Test methods are in DLL - TCharLC"));	
+	TCharLC h(TU);
+	TCharLC i(a);
+    h=i;
+	h=TU;
+	h=a;
+
+	test.Next(_L("Test methods are in DLL - TCharUC"));	
+	TCharUC j(TU);
+	TCharUC k(a);
+    k=j;
+	k=TU;
+	k=a;
+	test.End();
+	}
+			
+
+//*********************************
+// Test the constructors
+//*********************************
+template<class TCharType>
+GLDEF_C void TestTChar<TCharType>::Test2(TCharTypes CharType)
+	{
+	test.Start(_L("Test constructors"));
+	TCharDump dump;
+	TCharType b('x');
+	b.__DbgTest(&dump);
+	switch(CharType)
+		{
+		case eTChar:	
+		case eTCharLC:
+			test(dump.iChar=='x');
+			break;
+		case eTCharUC:
+			test(dump.iChar=='X');
+			break;
+		case eTCharF:
+		case eTCharC:
+			test(dump.iChar == 'x');
+		}
+	test.End();
+	}
+
+
+//*********************************
+// Test the operators
+//*********************************
+template<class TCharType>
+GLDEF_C void TestTChar<TCharType>::Test3(TCharTypes CharType)
+	{
+	test.Start(_L("Test the operators")); 
+	test.Next(_L("="));
+	TCharDump dump;
+	TUint TUx='x', TUX='X';
+	TChar TCy='y', TCY='Y';
+	TCharType aChar('m');
+
+	aChar=TUx;
+	aChar.__DbgTest(&dump);
+	switch(CharType)
+		{
+		case eTChar:	
+		case eTCharLC:	test(dump.iChar=='x'); break;
+		case eTCharUC:	test(dump.iChar=='X'); break;
+		case eTCharF:
+		case eTCharC:	
+			test(dump.iChar == 'x');
+		}
+
+	aChar=TUX; 
+	aChar.__DbgTest(&dump);
+	switch(CharType)
+		{	
+		case eTCharLC:	test(dump.iChar=='x'); break;
+		case eTChar:
+		case eTCharUC:	test(dump.iChar=='X'); break;
+		case eTCharF:
+		case eTCharC:	
+			test(dump.iChar == 'x');
+		}
+
+	aChar=TCy;
+	aChar.__DbgTest(&dump);
+	switch(CharType)
+		{
+		case eTChar:	
+		case eTCharLC:	test(dump.iChar=='y'); break;
+		case eTCharUC:	test(dump.iChar=='Y'); break;
+		case eTCharF:
+		case eTCharC:	
+			test(dump.iChar == 'y');
+		}
+
+	aChar=TCY;
+	aChar.__DbgTest(&dump);
+	switch(CharType)
+		{	
+		case eTCharLC:	test(dump.iChar=='y'); break;
+		case eTChar:
+		case eTCharUC:	test(dump.iChar=='Y'); break;
+		case eTCharF:
+		case eTCharC:	
+			test(dump.iChar == 'y');
+		}
+
+
+	test.Next(_L("-=, +=, -, + and cast"));
+	TCharType x(10);
+	x-=5;
+	x.__DbgTest(&dump);
+	test(dump.iChar==5);
+
+	x+=5;
+	x.__DbgTest(&dump);
+	test(dump.iChar==10);
+
+	test((x-(TUint)5)==5);
+	x.__DbgTest(&dump);
+	test(dump.iChar==10);
+
+	test((x+(TUint)5)==15);
+	x.__DbgTest(&dump);
+	test(dump.iChar==10);
+
+	TChar z('a');
+	TUint w=z;
+	test(w==97);
+
+	test.End();
+	}
+
+
+//////////////////////////////////////////////
+// Test Fold, Fold(TChar::EFoldAccents), Collate, LowerCase, UpperCase
+////////////////////////////////////////////
+template<class TCharType>
+GLDEF_C void TestTChar<TCharType>::Test4(TCharTypes CharType)
+	{
+	test.Start(_L("Fold(), Fold(TChar::EFoldAccents), Collate(), LowerCase() UpperCase() & Eos()"));
+	TCharDump dump1, dump2;
+	TCharType c(0);
+
+	// Is the folded version the same as the folded uppercase version?
+	test.Next(_L("Fold() 0-127"));
+    TUint i;
+	for(i=0; i<=127; i++)
+		{
+		c = i;
+		c.Fold();
+		c.__DbgTest(&dump1);
+		c.UpperCase();
+		c.Fold();
+		c.__DbgTest(&dump2);
+		test(dump1.iChar == dump2.iChar);
+		}
+
+	// Is the folded and uppercased version the same as an uppercase letter stripped of accents?
+	test.Next(_L("Fold() >127"));
+	for(i=128; i<=255; i++)
+		{
+		c=i;
+		c.Fold();
+		c.UpperCase();
+		c.__DbgTest(&dump1);
+		if(CharType==eTChar)
+			{
+			switch(i)
+				{
+			case ccedilla:	
+			case Ccedilla:
+                test(dump1.iChar=='C');
+                break;
+
+			case udieresis:	
+			case ucircumflex:
+			case ugrave:
+			case uacute:		
+			case Udieresis:
+			case Ucircumflex:
+			case Ugrave:
+			case Uacute:
+                test(dump1.iChar=='U');
+                break;
+
+			case ydieresis:
+			case yacute:
+			case Yacute:
+                test(dump1.iChar=='Y');
+                break;
+
+			case ecircumflex:
+			case edieresis:
+			case egrave:
+			case eacute:		
+			case Ecircumflex:
+			case Edieresis:
+			case Egrave:
+			case Eacute:
+                test(dump1.iChar=='E');
+                break;
+
+			case acircumflex:
+			case adieresis:
+			case agrave:		
+			case aacute:
+			case Acircumflex: 
+			case Adieresis:	
+			case Agrave:			
+			case Aacute:
+			case atilde:
+			case Atilde:
+			case aring:		
+			case Aring:
+                test(dump1.iChar=='A');
+                break;
+
+			case idieresis:
+			case icircumflex:
+			case iacute:
+			case igrave:			
+			case Idieresis:
+			case Icircumflex:
+			case Iacute:
+			case Igrave:
+                test(dump1.iChar=='I');
+                break;
+
+			case ocircumflex:
+			case odieresis:
+			case ograve:
+			case oacute:		
+			case otilde:
+			case Ocircumflex:
+			case Odieresis:
+			case Ograve:
+			case Oacute:
+			case Otilde:
+                test(dump1.iChar=='O');
+                break;
+
+			case ntilde:
+			case Ntilde:
+                test(dump1.iChar=='N'); break;
+
+			case oslash:
+			case Oslash:
+
+				test(dump1.iChar==Oslash); break;
+
+			case ae:
+			case AE:
+				test(dump1.iChar==AE); break;
+
+			case eth:
+			case Eth:
+                test(dump1.iChar==Eth); break;
+
+			case thorn:
+			case Thorn:
+                test(dump1.iChar==Thorn);
+                break;
+
+			case nobreakspace:
+				test(dump1.iChar == ' ');
+				break;
+
+			case micro:
+				test(dump1.iChar == 0x039C);
+				break;
+
+			default:
+                test(dump1.iChar==i); 
+				}
+			}
+		}
+	
+	// In the following test section We test Fold(TChar::EFoldAccents) - This code tests this function for all the
+	// set of unicode characters located between 0x0080 and 0x00FF which are already tested for Fold(). 
+	// I added to this test 13 unicode character located between 0x01C5 and 0x0363.
+	
+	test.Next(_L("Fold(TChar::EFoldAccents) >127"));
+	for(i=128; i<=255; i++)
+		{
+		c=i;
+		c.Fold(TChar::EFoldAccents);
+		c.__DbgTest(&dump1);
+		if(CharType==eTChar)
+			{
+			switch(i)
+				{
+			case ccedilla:
+				test(dump1.iChar=='c');
+				break;
+				
+			case Ccedilla:
+				test(dump1.iChar=='C');
+				break;
+				
+			case acircumflex:
+			case adieresis:
+			case agrave:		
+			case aacute:
+			case atilde:
+			case aring:
+			case aringacute:			
+            	test(dump1.iChar=='a');
+            	break;
+            	
+			case Acircumflex: 
+			case Adieresis:	
+			case Agrave:			
+			case Aacute:
+			case Atilde:		
+			case Aring:		
+                test(dump1.iChar=='A');
+                break;
+
+			case udieresis:	
+			case ucircumflex:
+			case ugrave:
+			case uacute:
+				test(dump1.iChar=='u');
+				break;
+				
+			case Udieresis:
+			case Ucircumflex:
+			case Ugrave:
+			case Uacute:
+                test(dump1.iChar=='U');
+                break;
+
+			case ydieresis:
+			case yacute:
+				test(dump1.iChar=='y');
+				break;
+            
+			case Yacute:
+                test(dump1.iChar=='Y');
+                break;
+
+			case ecircumflex:
+			case edieresis:
+			case egrave:
+			case eacute:		
+            	test(dump1.iChar=='e');
+            	break;
+            	
+			case Ecircumflex:
+			case Edieresis:
+			case Egrave:
+			case Eacute:
+                test(dump1.iChar=='E');
+                break;			
+				
+			case idieresis:
+			case icircumflex:
+			case iacute:
+			case igrave:
+				test(dump1.iChar=='i');
+				break;
+				
+			case Idieresis:
+			case Icircumflex:
+			case Iacute:
+			case Igrave:
+                test(dump1.iChar=='I');
+                break;
+
+			case ocircumflex:
+			case odieresis:
+			case ograve:
+			case oacute:		
+			case otilde:
+				test(dump1.iChar=='o');
+				break;
+			
+			case Ocircumflex:
+			case Odieresis:
+			case Ograve:
+			case Oacute:
+			case Otilde:
+                test(dump1.iChar=='O');
+                break;
+
+			case ntilde: test(dump1.iChar=='n'); break;
+				
+			case Ntilde: test(dump1.iChar=='N'); break;
+
+			case oslash: test(dump1.iChar==oslash); break;
+			case Oslash: test(dump1.iChar==Oslash); break;
+
+			case ae: 	test(dump1.iChar==ae); break;
+			case AE: 	test(dump1.iChar==AE); break;
+
+			case eth:   test(dump1.iChar==eth); break;
+			case Eth:   test(dump1.iChar==Eth); break;
+
+			case thorn: test(dump1.iChar==thorn);break;
+			case Thorn: test(dump1.iChar==Thorn);break;
+
+			case micro:
+				test(dump1.iChar == 0x00B5);
+				break;
+							
+			default:
+                test(dump1.iChar==i); 
+				}
+			}
+		}
+	
+	TUint specialCasesTable [] = 
+		{
+		0x01C5, // Dzcaron
+		0x01C8, // Lj
+		0x01D5,//  Udearesismacron
+		0x01E0,//  Adotabove
+		0x01E2,//  AEmacron
+		0x0219, // scommabelow
+		0x022C,//  Otildemacron
+		0x023B,//  Cstroke
+		0x02BA, // doubleprime
+		0x02FF,//  lowleftarrow
+		0x0310, // candrabindu
+		0x0362, // doublerightwardsarrowbelow
+		0x0363 //  latinsmalla
+		};
+	    
+	for (i=0;i<=12; i++)
+		{
+		c=specialCasesTable[i];
+		c.Fold(TChar::EFoldAccents);
+		c.__DbgTest(&dump1);
+		if(CharType==eTChar)
+			{
+			switch(specialCasesTable[i])
+				{
+			case Dzcaron					:	test(dump1.iChar==Dzcaron);	break; 
+			case Lj							:	test(dump1.iChar==Lj);		break; 
+			case Udearesismacron			:	test(dump1.iChar=='U');		break; 
+			case Adotabove					:	test(dump1.iChar=='A');		break;
+			case AEmacron					:	test(dump1.iChar==AE);		break; 
+			case scommabelow				:	test(dump1.iChar=='s');		break;
+			case Otildemacron				:	test(dump1.iChar=='O');		break; 
+			case Cstroke					:	test(dump1.iChar==Cstroke);			break; 
+			case doubleprime				:	test(dump1.iChar==doubleprime);		break; 
+			case lowleftarrow				:	test(dump1.iChar==lowleftarrow);	break; 
+			case candrabindu				:	test(dump1.iChar==candrabindu);		break; 
+			case doublerightwardsarrowbelow	:	test(dump1.iChar==doublerightwardsarrowbelow);	break; 
+			case latinsmalla 				:	test(dump1.iChar==latinsmalla);		break; 
+			default							:	test(dump1.iChar==specialCasesTable[i]); 
+				}
+			}
+		}
+
+	test.Next(_L("LowerCase() 0-127"));
+	for(i=0;i<=127; i++)
+		{ 
+		c=i;
+		if(c.IsUpper())
+			{
+			c.__DbgTest(&dump1);
+			c.LowerCase();
+			c.__DbgTest(&dump2);
+			test(dump1.iChar==dump2.iChar-32);
+			}
+		else
+			{
+			c.__DbgTest(&dump1);
+			c.LowerCase();
+			c.__DbgTest(&dump2);
+			test(dump1.iChar==dump2.iChar);
+			}
+		}
+
+
+	test.Next(_L("LowerCase() >127"));
+	for(i=128; i<=255; i++)
+		{
+		c=i;
+		c.LowerCase();
+		c.__DbgTest(&dump1);
+		if(CharType==eTChar)
+			{
+			switch(i)
+				{
+			case Acircumflex:	test(dump1.iChar==acircumflex);	break;
+			case Adieresis:		test(dump1.iChar==adieresis);	break;
+			case Agrave:		test(dump1.iChar==agrave);		break;
+			case Aacute:		test(dump1.iChar==aacute);		break;
+			case Atilde:		test(dump1.iChar==atilde);		break;
+			case Aring:			test(dump1.iChar==aring);		break;
+			case AE:			test(dump1.iChar==ae);			break;
+			case Ccedilla:		test(dump1.iChar==ccedilla); 	break;
+			case Ecircumflex:	test(dump1.iChar==ecircumflex);	break;
+			case Edieresis:		test(dump1.iChar==edieresis);	break;
+			case Egrave:		test(dump1.iChar==egrave);		break;
+			case Eacute:		test(dump1.iChar==eacute);		break;
+			case Eth:			test(dump1.iChar==eth);			break;
+			case Icircumflex:	test(dump1.iChar==icircumflex);	break;
+			case Idieresis:		test(dump1.iChar==idieresis);	break;
+			case Igrave:		test(dump1.iChar==igrave);		break;
+			case Iacute:		test(dump1.iChar==iacute);		break;
+			case Ntilde:		test(dump1.iChar==ntilde);		break;
+			case Oslash:		test(dump1.iChar==oslash);		break;
+			case Ocircumflex:	test(dump1.iChar==ocircumflex);	break;
+			case Odieresis:		test(dump1.iChar==odieresis);	break;
+			case Ograve:		test(dump1.iChar==ograve);		break;
+			case Oacute:		test(dump1.iChar==oacute);		break;
+			case Otilde:		test(dump1.iChar==otilde);		break;
+			case Thorn:			test(dump1.iChar==thorn);		break;
+			case Ucircumflex:	test(dump1.iChar==ucircumflex);	break;
+			case Udieresis:		test(dump1.iChar==udieresis);	break;
+			case Ugrave:		test(dump1.iChar==ugrave);		break;
+			case Uacute:		test(dump1.iChar==uacute);		break;
+			case Yacute:		test(dump1.iChar==yacute);		break;
+			default: 			test(dump1.iChar==i); 		
+				}
+			}
+		}
+
+
+	test.Next(_L("UpperCase() 0-127"));
+	for(i=0;i<=127; i++)
+		{ 
+		c=i;
+		if(c.IsLower())
+			{
+			c.__DbgTest(&dump1);
+			c.UpperCase();
+			c.__DbgTest(&dump2);
+			test(dump1.iChar==dump2.iChar+32);
+			}
+		else
+			{
+			c.__DbgTest(&dump1);
+			c.UpperCase();
+			c.__DbgTest(&dump2);
+			test(dump1.iChar==dump2.iChar);
+			}
+		}
+
+
+	test.Next(_L("UpperCase() >127"));
+	for(i=128; i<=255; i++)
+		{
+		c=i;
+		c.UpperCase();
+		c.__DbgTest(&dump1);
+		if(CharType==eTChar)
+			{
+			switch(i)	
+				{
+			case acircumflex:	test(dump1.iChar==Acircumflex);	break;
+			case adieresis:		test(dump1.iChar==Adieresis);	break;
+			case agrave:		test(dump1.iChar==Agrave);		break;
+			case aacute:		test(dump1.iChar==Aacute);		break;
+			case atilde:		test(dump1.iChar==Atilde);		break;
+			case aring:			test(dump1.iChar==Aring);		break;
+			case ae:			test(dump1.iChar==AE);			break;
+			case ccedilla:		test(dump1.iChar==Ccedilla); 	break;
+			case ecircumflex:	test(dump1.iChar==Ecircumflex);	break;
+			case edieresis:		test(dump1.iChar==Edieresis);	break;
+			case egrave:		test(dump1.iChar==Egrave);		break;
+			case eacute:		test(dump1.iChar==Eacute);		break;
+			case eth:			test(dump1.iChar==Eth);			break;
+			case icircumflex:	test(dump1.iChar==Icircumflex);	break;
+			case idieresis:		test(dump1.iChar==Idieresis);	break;
+			case igrave:		test(dump1.iChar==Igrave);		break;
+			case iacute:		test(dump1.iChar==Iacute);		break;
+			case ntilde:		test(dump1.iChar==Ntilde);		break;
+			case oslash:		test(dump1.iChar==Oslash);		break;
+			case ocircumflex:	test(dump1.iChar==Ocircumflex);	break;
+			case odieresis:		test(dump1.iChar==Odieresis);	break;
+			case ograve:		test(dump1.iChar==Ograve);		break;
+			case oacute:		test(dump1.iChar==Oacute);		break;
+			case otilde:		test(dump1.iChar==Otilde);		break;
+			case thorn:			test(dump1.iChar==Thorn);		break;
+			case ucircumflex:	test(dump1.iChar==Ucircumflex);	break;
+			case udieresis:		test(dump1.iChar==Udieresis);	break;
+			case ugrave:		test(dump1.iChar==Ugrave);		break;
+			case uacute:		test(dump1.iChar==Uacute);		break;
+			case yacute:		test(dump1.iChar==Yacute);		break;
+			case ydieresis:		test(dump1.iChar==Ydieresis);	break;
+			case micro:			test(dump1.iChar==0x039C);		break;
+			default: 			test(dump1.iChar==i); 		
+				}
+			}
+		}
+		   
+	test.Next(_L("Eos()"));
+	c=0;
+	test(c.Eos()==TRUE);
+	for(i=1;i<=255;i++)
+		{
+		c=i;
+		test(c.Eos()==FALSE);
+		}
+	test.End();	
+	}
+
+
+//*********************************
+// Test the Isxxx functions
+//*********************************
+//
+// Deleted as it can no longer use the C library
+//
+/*
+template<class TCharType>
+GLDEF_C void TestTChar<TCharType>::Test5(TCharTypes CharType)
+	{
+	test.Start(_L("Isxxxxx()"));
+	test.End();
+	}
+*/
+
+#ifndef _DEBUG
+#pragma warning (disable :4710) //Function not expanded 
+#pragma warning (disable :4700) //Local variable used without being initialized
+#endif
+
+/*
+Put all the information about a character into a string. This can then be compared with
+a previously verified string to test the character classification functions.
+
+To keep the string short, only non-default information is appended, except for the first
+attribute, the category.
+
+The format is:
+
+1. The two-letter Unicode category code: e.g., Lu for an uppercase letter, Nd for a digit, etc.
+2. If the bidirectional category is not TChar::ELeftToRight, ' b=' then the one or two-letter code.
+3. If the combining class is not 0, ' c=' then the combining class number in decimal.
+4. If the uppercase form is different from the character code, ' u=' then the uppercase form in hex.
+5. If the titlecase form is different from the character code, ' t=' then the titlecase form in hex.
+6. If the lowercase form is different from the character code, ' l=' then the lowercase form in hex.
+** REMOVED ** 7. If the folded form is different from the character code, ' f=' then the folded form in hex.
+8. If the character has the mirrored property, ' m'.
+9. If the character has a numeric value, ' n=' then the numeric value in decimal, or -2 for fractions.
+10. If the CJK width is not neutral, ' w=' then 1 for halfwidth, 2 for fullwidth, 3 for narrow, 4 for wide
+11. If there is a canonical decomposition, ' d=' then the characters of the decomposition in hex, comma-separated.
+*/
+void char_info_to_string(TDes16& info,TUint16 x)
+	{
+	TChar c(x);
+
+	TChar::TCharInfo ci;
+	c.GetInfo(ci);
+
+	TBuf<16> cat;
+	switch (ci.iCategory)
+		{
+		case TChar::ELuCategory: cat = _L("Lu"); break;
+		case TChar::ELlCategory: cat = _L("Ll"); break;
+		case TChar::ELtCategory: cat = _L("Lt"); break; 
+		case TChar::ELoCategory: cat = _L("Lo"); break; 
+		case TChar::ELmCategory: cat = _L("Lm"); break; 
+		case TChar::EMnCategory: cat = _L("Mn"); break; 
+		case TChar::EMcCategory: cat = _L("Mc"); break; 
+		case TChar::ENdCategory: cat = _L("Nd"); break; 
+		case TChar::ENlCategory: cat = _L("Nl"); break;
+		case TChar::ENoCategory: cat = _L("No"); break; 
+		case TChar::EPdCategory: cat = _L("Pd"); break; 
+		case TChar::EPsCategory: cat = _L("Ps"); break; 
+		case TChar::EPeCategory: cat = _L("Pe"); break; 
+		case TChar::EPoCategory: cat = _L("Po"); break; 
+		case TChar::EPiCategory: cat = _L("Pi"); break; 
+		case TChar::EPfCategory: cat = _L("Pf"); break; 
+		case TChar::ESmCategory: cat = _L("Sm"); break; 
+		case TChar::EScCategory: cat = _L("Sc"); break; 
+		case TChar::ESoCategory: cat = _L("So"); break; 
+		case TChar::EZsCategory: cat = _L("Zs"); break; 
+		case TChar::EZlCategory: cat = _L("Zl"); break; 
+		case TChar::EZpCategory: cat = _L("Zp"); break; 
+		case TChar::ECcCategory: cat = _L("Cc"); break; 
+		case TChar::ECoCategory: cat = _L("Co"); break; 
+		case TChar::ECnCategory: cat = _L("Cn"); break;
+		default: User::Panic(_L("bad char category"),0); break; 
+		}
+	info.Append(cat);
+
+	TBuf<16> bdcat;
+	switch (ci.iBdCategory)
+		{
+		case TChar::ELeftToRight: bdcat=_L("L"); break;
+		case TChar::ELeftToRightEmbedding: bdcat=_L("LRE"); break;
+		case TChar::ELeftToRightOverride: bdcat=_L("LRO"); break;
+		case TChar::ERightToLeft: bdcat=_L("R"); break;
+		case TChar::ERightToLeftArabic: bdcat=_L("AL"); break; 
+		case TChar::ERightToLeftEmbedding: bdcat=_L("RLE"); break;
+		case TChar::ERightToLeftOverride: bdcat=_L("RLO"); break;
+		case TChar::EPopDirectionalFormat: bdcat=_L("PDF"); break;
+		case TChar::EEuropeanNumber: bdcat=_L("EN"); break; 
+		case TChar::EEuropeanNumberSeparator: bdcat=_L("ES"); break;  
+		case TChar::EEuropeanNumberTerminator: bdcat=_L("ET"); break;
+		case TChar::EArabicNumber: bdcat=_L("AN"); break; 
+		case TChar::ECommonNumberSeparator: bdcat=_L("CS"); break; 
+		case TChar::ENonSpacingMark: bdcat=_L("NSM"); break;
+		case TChar::EBoundaryNeutral: bdcat=_L("BN"); break; 
+		case TChar::EParagraphSeparator: bdcat=_L("B"); break;
+		case TChar::ESegmentSeparator: bdcat=_L("S"); break;
+		case TChar::EWhitespace: bdcat=_L("WS"); break; 
+		case TChar::EOtherNeutral: bdcat=_L("ON"); break; 
+		default: User::Panic(_L("bad bd category"),0); break; 
+		}
+	if (ci.iBdCategory != TChar::ELeftToRight)
+		{
+		info.Append(_L(" b="));
+		info.Append(bdcat);
+		}
+
+	if (ci.iCombiningClass != 0)
+		{
+		info.Append(_L(" c="));
+		info.AppendNum(ci.iCombiningClass);
+		}
+
+	if (ci.iUpperCase != x)
+		{
+		info.Append(_L(" u="));
+		info.AppendNum(ci.iUpperCase,EHex);
+		}
+		
+	if (ci.iTitleCase != x)
+		{
+		info.Append(_L(" t="));
+		info.AppendNum(ci.iTitleCase,EHex);
+		}
+
+	if (ci.iLowerCase != x)
+		{
+		info.Append(_L(" l="));
+		info.AppendNum(ci.iLowerCase,EHex);
+		}
+
+	if (ci.iMirrored)
+		info.Append(_L(" m"));
+
+	if (ci.iNumericValue != -1)
+		{
+		info.Append(_L(" n="));
+		info.AppendNum(ci.iNumericValue);
+		}
+
+	switch (c.GetCjkWidth())
+		{
+		case TChar::EHalfWidth: info.Append(_L(" w=1")); break;
+		case TChar::EFullWidth: info.Append(_L(" w=2")); break;
+		case TChar::ENarrow: info.Append(_L(" w=3")); break;
+		case TChar::EWide: info.Append(_L(" w=4")); break;
+		default: break;
+		}
+
+	TPtrC16 d;
+	if (c.Decompose(d))
+		{
+		info.Append(_L(" d="));
+		for (int i = 0; i < d.Length(); i++)
+			{
+			info.AppendNum((TUint)d[i],EHex);
+			if (i < d.Length() - 1)
+				info.Append(',');
+			}
+		}
+
+	if (!c.IsPrint())
+		info.Append(_L(" np"));
+	if (!c.IsGraph())
+		info.Append(_L(" ng"));
+	}
+
+void test_unicode_char(TUint16 c,const TDesC& desired_info,const TDesC& name)
+	{
+	test.Next(name);
+	TBuf<128> info;
+	char_info_to_string(info,c);
+//	test.Printf(_L("code=0x%x desired='%S' actual='%S'\n"),c,&desired_info,&info);
+//	if (info != desired_info)
+//		test.Printf(_L(" (mismatch!)\n"));
+	test(info == desired_info);
+	}
+
+void test_unicode_chars()
+	{
+	test_unicode_char(0x0000,_L("Cc b=BN np ng"),_L("NULL"));
+	test_unicode_char(0x000A,_L("Cc b=B np ng"),_L("linefeed"));
+	test_unicode_char(0x0020,_L("Zs b=WS w=3 ng"),_L("space"));
+	test_unicode_char(0x0028,_L("Ps b=ON m w=3"),_L("("));
+	test_unicode_char(0x0038,_L("Nd b=EN n=8 w=3"),_L("8"));
+	test_unicode_char(0x0040,_L("Po b=ON w=3"),_L("@"));
+	test_unicode_char(0x0062,_L("Ll u=42 w=3"),_L("b"));
+	test_unicode_char(0x0042,_L("Lu l=62 w=3"),_L("B"));
+	test_unicode_char(0x0067,_L("Ll u=47 w=3"),_L("g"));
+	test_unicode_char(0x0047,_L("Lu l=67 w=3"),_L("G"));
+	test_unicode_char(0x0077,_L("Ll u=57 w=3"),_L("w"));
+	test_unicode_char(0x0057,_L("Lu l=77 w=3"),_L("W"));
+	test_unicode_char(0x00A0,_L("Zs b=CS ng"),_L("non-break space"));
+	test_unicode_char(0x00BC,_L("No b=ON n=-2"),_L("1/4"));
+	test_unicode_char(0x00DD,_L("Lu l=fd d=59,301"),_L("Y acute"));
+	test_unicode_char(0x00FF,_L("Ll u=178 d=79,308"),_L("y umlaut"));
+	test_unicode_char(0x0178,_L("Lu l=ff d=59,308"),_L("Y umlaut"));
+	test_unicode_char(0x01C4,_L("Lu t=1c5 l=1c6"),_L("DZ caron"));
+	test_unicode_char(0x01C5,_L("Lt u=1c4 l=1c6"),_L("Dz caron"));
+	test_unicode_char(0x01C6,_L("Ll u=1c4 t=1c5"),_L("dz caron"));
+	test_unicode_char(0x022A,_L("Lu l=22b d=4f,308,304"),_L("O with diaeresis and macron"));
+	test_unicode_char(0x0267,_L("Ll"),_L("latin small letter heng with hook"));
+	test_unicode_char(0x02b0,_L("Lm"),_L("modifier letter small h"));
+	test_unicode_char(0x030a,_L("Mn b=NSM c=230"),_L("combining ring above"));
+	test_unicode_char(0x03a8,_L("Lu l=3c8"),_L("Greek Psi"));
+	test_unicode_char(0x03c8,_L("Ll u=3a8"),_L("Greek psi"));
+	test_unicode_char(0x0401,_L("Lu l=451 d=415,308"),_L("Cyrillic IO"));
+	test_unicode_char(0x0451,_L("Ll u=401 d=435,308"),_L("Cyrillic io"));
+	test_unicode_char(0x04e0,_L("Lu l=4e1"),_L("Cyrillic Abkhasian Dze"));
+	test_unicode_char(0x04e1,_L("Ll u=4e0"),_L("Cyrillic Abkhasian dze"));
+	test_unicode_char(0x05A8,_L("Mn b=NSM c=230"),_L("Hebrew accent qadma"));
+	test_unicode_char(0x05D2,_L("Lo b=R"),_L("Hebrew letter gimel"));
+	test_unicode_char(0x05F0,_L("Lo b=R"),_L("Hebrew ligature Yiddish double vav"));
+	test_unicode_char(0x0627,_L("Lo b=AL"),_L("Arabic letter alef"));
+	test_unicode_char(0x0660,_L("Nd b=AN n=0"),_L("Arabic-Indic digit 0"));
+	test_unicode_char(0x0669,_L("Nd b=AN n=9"),_L("Arabic-Indic digit 9"));
+	test_unicode_char(0x06F4,_L("Nd b=EN n=4"),_L("Extended Arabic-Indic digit 4"));
+	test_unicode_char(0x0B9C,_L("Lo"),_L("Tamil letter ja"));
+	test_unicode_char(0x0BCD,_L("Mn b=NSM c=9"),_L("Tamil sign virama"));
+	test_unicode_char(0x0BF0,_L("No n=10"),_L("Tamil number 10"));
+	test_unicode_char(0x0BF1,_L("No n=100"),_L("Tamil number 100"));
+	test_unicode_char(0x0BF2,_L("No n=1000"),_L("Tamil number 1000"));
+	test_unicode_char(0x0E3F,_L("Sc b=ET"),_L("Thai currency symbol baht"));
+	test_unicode_char(0x0ED5,_L("Nd n=5"),_L("Lao digit 5"));
+	test_unicode_char(0x104E,_L("Po"),_L("Myanmar symbol aforementioned"));
+	test_unicode_char(0x124B,_L("Lo"),_L("Ethiopic syllable QWAA"));
+	test_unicode_char(0x137C,_L("No n=10000"),_L("Ethiopic number 10000"));
+	test_unicode_char(0x217F,_L("Nl u=216f n=1000"),_L("small Roman numeral 1000"));
+	test_unicode_char(0x2180,_L("Nl n=1000"),_L("Roman numeral 1000 CD"));
+	test_unicode_char(0x2181,_L("Nl n=5000"),_L("Roman numeral 5000"));
+	test_unicode_char(0x2182,_L("Nl n=10000"),_L("Roman numeral 10000"));
+	test_unicode_char(0x2208,_L("Sm b=ON m"),_L("element of"));
+	test_unicode_char(0x2248,_L("Sm b=ON m"),_L("almost equal to"));
+	test_unicode_char(0x3000,_L("Zs b=WS w=4 ng"),_L("ideographic space"));
+	test_unicode_char(0x3030,_L("Pd b=ON w=4"),_L("wavy dash"));
+	test_unicode_char(0x305F,_L("Lo w=4"),_L("Hiragana ta"));
+	test_unicode_char(0x3060,_L("Lo w=4 d=305f,3099"),_L("Hiragana da"));
+	test_unicode_char(0x3099,_L("Mn b=NSM c=8 w=4"),_L("combining Katakana-Hiragana voiced sound mark"));
+	test_unicode_char(0x30B3,_L("Lo w=4"),_L("Katakana ko"));
+	test_unicode_char(0x30B4,_L("Lo w=4 d=30b3,3099"),_L("Katakana go"));
+	test_unicode_char(0x51FF,_L("Lo w=4"),_L("CJK ideograph 51FF"));
+	test_unicode_char(0x52FF,_L("Lo w=4"),_L("CJK ideograph 52FF"));
+	test_unicode_char(0xCEFF,_L("Lo w=4"),_L("Hangul syllable CEFF"));
+	test_unicode_char(0xFF17,_L("Nd b=EN n=7 w=2"),_L("fullwidth digit 7"));
+	test_unicode_char(0xFF33,_L("Lu l=ff53 w=2"),_L("fullwidth S"));
+	test_unicode_char(0xFF53,_L("Ll u=ff33 w=2"),_L("fullwidth s"));
+	test_unicode_char(0xFF85,_L("Lo w=1"),_L("halfwidth Katakana na"));
+	test_unicode_char(0xFFE1,_L("Sc b=ET w=2"),_L("fullwidth pound sign"));
+	test_unicode_char(0xE000, _L("Co"), _L("End user private use character"));
+	test_unicode_char(0xE3FF, _L("Co"), _L("End user private use character"));
+	test_unicode_char(0xE400, _L("Co"), _L("Corporate private use character"));
+	test_unicode_char(0xF6DA, _L("Co np ng"), _L("Corporate private use character - Java string marker"));
+	test_unicode_char(0xF6DB, _L("Co"), _L("Corporate private use character - Replacement character"));
+	test_unicode_char(0xF6DC, _L("Co np ng"), _L("Corporate private use character - switch to next"));
+	test_unicode_char(0xF6DD, _L("Co np ng"), _L("Corporate private use character - switch to previous"));
+	test_unicode_char(0xF6DB, _L("Co"), _L("Corporate private use character - Latin superscript y"));
+	test_unicode_char(0xF6FF, _L("Co"), _L("Corporate private use character - Alarm bell"));
+	test_unicode_char(0xF700, _L("Co np ng"), _L("Corporate private use character - Key code"));
+	test_unicode_char(0xF8FF, _L("Co np ng"), _L("Corporate private use character - Key code"));
+	
+	// CR1080 - Testing additional Indic Chars
+	// Test properties of new Indic characters added in CR1080, and also the properties of
+	// existing characters immediately preceding and proceding the new characters, to test
+	// for any regression.
+	test_unicode_char(0x0903, _L("Mc"), _L("DEVANAGARI SIGN VISARGA"));  		// Existing
+	test_unicode_char(0x0904, _L("Lo"), _L("DEVANAGARI LETTER SHORT A"));		// New
+	test_unicode_char(0x0905, _L("Lo"), _L("DEVANAGARI LETTER A"));				// Existing
+	
+	test_unicode_char(0x0970, _L("Po"), _L("DEVANAGARI ABBREVIATION SIGN"));	// Existing
+	test_unicode_char(0x097B, _L("Lo"), _L("DEVANAGARI LETTER GGA"));			// New
+	test_unicode_char(0x097C, _L("Lo"), _L("DEVANAGARI LETTER JJA"));			// New
+	test_unicode_char(0x097D, _L("Lo"), _L("DEVANAGARI LETTER GLOTTAL STOP"));	// New
+	test_unicode_char(0x097E, _L("Lo"), _L("DEVANAGARI LETTER DDDA"));			// New
+	test_unicode_char(0x097F, _L("Lo"), _L("DEVANAGARI LETTER BBA"));			// New
+	test_unicode_char(0x0981, _L("Mn b=NSM"), _L("BENGALI SIGN CANDRABINDU"));	// Existing
+	
+	test_unicode_char(0x09BC, _L("Mn b=NSM c=7"), _L("BENGALI SIGN NUKTA"));	// Existing
+	test_unicode_char(0x09BD, _L("Lo"), _L("BENGALI SIGN AVAGRAHA"));			// New
+	test_unicode_char(0x09BE, _L("Mc"), _L("BENGALI VOWEL SIGN AA"));			// Existing
+	
+	test_unicode_char(0x09CD, _L("Mn b=NSM c=9"), _L("BENGALI SIGN VIRAMA"));	// Existing
+	test_unicode_char(0x09CE, _L("Lo"), _L("BENGALI LETTER KHANDA TA"));		// New
+	test_unicode_char(0x09D7, _L("Mc"), _L("BENGALI AU LENGTH MARK"));			// Existing
+
+	test_unicode_char(0x09FA, _L("So"), _L("BENGALI ISSHAR"));					// Existing
+	test_unicode_char(0x0A01, _L("Mn b=NSM"), _L("GURMUKHI SIGN ADAK BINDI"));	// New
+	test_unicode_char(0x0A02, _L("Mn b=NSM"), _L("GURMUKHI SIGN BINDI"));		// Existing
+	test_unicode_char(0x0A03, _L("Mc"), _L("GURMUKHI SIGN VISARGA"));			// New
+	test_unicode_char(0x0A05, _L("Lo"), _L("GURMUKHI LETTER A"));				// Existing
+	
+	test_unicode_char(0x0A8B, _L("Lo"), _L("GUJARATI LETTER VOCALIC R"));		// Existing
+	test_unicode_char(0x0A8C, _L("Lo"), _L("GUJARATI LETTER VOCALIC L"));		// New
+	test_unicode_char(0x0A8D, _L("Lo"), _L("GUJARATI VOWEL CANDRA E"));			// Existing
+	
+	test_unicode_char(0x0AE0, _L("Lo"), _L("GUJARATI LETTER VOCALIC RR"));				// Existing
+	test_unicode_char(0x0AE1, _L("Lo"), _L("GUJARATI LETTER VOCALIC LL"));				// New
+	test_unicode_char(0x0AE2, _L("Mn b=NSM"), _L("GUJARATI VOWEL SIGN VOCALIC L"));		// New
+	test_unicode_char(0x0AE3, _L("Mn b=NSM"), _L("GUJARATI VOWEL SIGN VOCALIC LL"));	// New
+	test_unicode_char(0x0AE6, _L("Nd n=0"), _L("GUJARATI DIGIT ZERO")); 				// Existing
+	
+	test_unicode_char(0x0AEF, _L("Nd n=9"), _L("GUJARATI DIGIT NINE"));			// Existing
+	test_unicode_char(0x0AF1, _L("Sc b=ET"), _L("GUJARATI RUPEE SIGN"));		// New
+	test_unicode_char(0x0B01, _L("Mn b=NSM"), _L("ORIYA SIGN CANDRABINDU")); 	// Existing
+
+	test_unicode_char(0x0B33, _L("Lo"), _L("ORIYA LETTER LLA"));				// Existing
+	test_unicode_char(0x0B35, _L("Lo"), _L("ORIYA LETTER VA"));					// New
+	test_unicode_char(0x0B36, _L("Lo"), _L("ORIYA LETTER SHA"));				// Existing
+
+	test_unicode_char(0x0B70, _L("So"), _L("ORIYA ISSHAR"));					// Existing
+	test_unicode_char(0x0B71, _L("Lo"), _L("ORIYA LETTER WA"));					// New
+	test_unicode_char(0x0B82, _L("Mn b=NSM"), _L("TAMIL SIGN ANUSVARA")); 		// Existing
+
+	test_unicode_char(0x0BB5, _L("Lo"), _L("TAMIL LETTER VA"));					// Existing
+	test_unicode_char(0x0BB6, _L("Lo"), _L("TAMIL LETTER SHA"));				// New
+	test_unicode_char(0x0BB7, _L("Lo"), _L("TAMIL LETTER SSA"));				// Existing
+
+	test_unicode_char(0x0BD7, _L("Mc"), _L("TAMIL AU LENGTH MARK"));			// Existing
+	test_unicode_char(0x0BE6, _L("Nd n=0"), _L("TAMIL DIGIT ZERO"));			// New
+	test_unicode_char(0x0BE7, _L("Nd n=1"), _L("TAMIL DIGIT ZERO"));			// Existing
+
+	test_unicode_char(0x0BF2, _L("No n=1000"), _L("TAMIL NUMBER ONE THOUSAND"));// Existing
+	test_unicode_char(0x0BF3, _L("So b=ON"), _L("TAMIL DAY SIGN"));				// New
+	test_unicode_char(0x0BF4, _L("So b=ON"), _L("TAMIL MONTH SIGN"));			// New
+	test_unicode_char(0x0BF5, _L("So b=ON"), _L("TAMIL YEAR SIGN"));			// New
+	test_unicode_char(0x0BF6, _L("So b=ON"), _L("TAMIL DEBIT SIGN"));			// New
+	test_unicode_char(0x0BF7, _L("So b=ON"), _L("TAMIL CREDIT SIGN"));			// New
+	test_unicode_char(0x0BF8, _L("So b=ON"), _L("TAMIL AS ABOVE SIGN"));		// New
+	test_unicode_char(0x0BF9, _L("Sc b=ET"), _L("TAMIL RUPEE SIGN"));			// New
+	test_unicode_char(0x0BFA, _L("So b=ON"), _L("TAMIL NUMBER SIGN"));			// New
+	test_unicode_char(0x0C01, _L("Mc"), _L("TELUGU SIGN CANDRABINDU"));			// Existing
+	
+	test_unicode_char(0x0CB9, _L("Lo"), _L("KANNADA LETTER HA"));				// Existing
+	test_unicode_char(0x0CBC, _L("Mn b=NSM c=7"), _L("KANNADA SIGN NUKTA"));	// New
+	test_unicode_char(0x0CBD, _L("Lo"), _L("KANNADA SIGN AVAGRAHA"));			// New
+	test_unicode_char(0x0CBE, _L("Mc"), _L("KANNADA VOWEL SIGN AA"));			// Existing
+
+	test_unicode_char(0x0CE1, _L("Lo"), _L("KANNADA LETTER VOCALIC LL"));			// Existing
+	test_unicode_char(0x0CE2, _L("Mn b=NSM"), _L("KANNADA VOWEL SIGN VOCALIC L"));	// New
+	test_unicode_char(0x0CE3, _L("Mn b=NSM"), _L("KANNADA VOWEL SIGN VOCALIC LL"));	// New
+	test_unicode_char(0x0CE6, _L("Nd n=0"), _L("KANNADA DIGIT ZERO"));				// Existing
+
+	test_unicode_char(0x0CEF, _L("Nd n=9"), _L("KANNADA DIGIT NINE"));				// Existing
+	test_unicode_char(0x0CF1, _L("So b=ON"), _L("KANNADA SIGN JIHVAMULIYA"));		// New
+	test_unicode_char(0x0CF2, _L("So b=ON"), _L("KANNADA SIGN UPADHMANIYA"));		// New
+	test_unicode_char(0x0D02, _L("Mc"), _L("MALAYALAM SIGN ANUSVARA"));				// Existing
+	
+	test_unicode_char(0x0B83, _L("Lo"), _L("TAMIL SIGN VISARGA"));					// Modified	
+	test_unicode_char(0x0CBF, _L("Mn"), _L("KANNADA VOWEL SIGN I"));				// Modified
+	test_unicode_char(0x0CC6, _L("Mn"), _L("KANNADA VOWEL SIGN E"));				// Modified
+	}
+
+void test_unicode_collation(const TDesC& x,const TDesC& y,TInt desired_order,
+							TInt level = 3,const TCollationMethod* method = NULL)
+	{
+	TInt order = x.CompareC(y,level,method);
+
+	// Normalise order to -1, 0 or 1.
+	if (order < 0)
+		order = -1;
+	else if (order > 0)
+		order = 1;
+
+	test(order == desired_order);
+	}
+
+static const TUint32 TheSwedishKey[] = 
+	{
+	0x8f60109,0x8f70109,0x8f80109,0x8f60121,0x8f70121,0x8f80121,0x8dd0109,0x8dd0121,
+	0x8c50121,0x8c50109,
+	};
+
+static const TUint32 TheSwedishIndex[] = 
+	{
+	0x570008,0x770009,
+	};
+
+static const TUint16 TheSwedishStringElement[] = 
+	{
+	0x2,0x61,0x30a,0x2,0x61,0x308,0x2,0x6f,
+	0x308,0x2,0x41,0x30a,0x2,0x41,0x308,0x2,
+	0x4f,0x308,0x2,0x75,0x308,0x2,0x55,0x308,
+	};
+
+static const TUint32 TheSwedishStringIndex[] = 
+	{
+	0xc0004,0x90003,0xf0005,0x150007,0x30001,0x0,0x60002,0x120006,
+	};
+
+static const TCollationKeyTable TheSwedishTable = 
+	{ TheSwedishKey, TheSwedishIndex, 2, TheSwedishStringElement, TheSwedishStringIndex, 8 };
+
+static const TCollationMethod TheSwedishMethod =
+	{ 0, NULL, &TheSwedishTable, 0 };
+
+static const TCollationMethod TheSwapCaseMethod =
+	{ 0, NULL, NULL, TCollationMethod::ESwapCase };
+
+static const TCollationMethod TheFoldCaseMethod =
+	{ 0, NULL, NULL, TCollationMethod::EFoldCase };
+
+static const TUint32 TheKanaKey[] = 
+	{
+	0xc949,0xca09,0x2010f,0x20113,0x4010b,0x4010f,0x5010b,0x5010f,
+	0x8010b,0x8010f,0xa010f,0xa014b,0xc010b,0xc010f,0xe010b,0xe010f,
+	0xe013f,0x10010b,0x10010f,0x12010b,0x12010f,0x14c90b,0x14c90f,0x16ca0b,
+	0x16ca0f,0x17010b,0x18030f,0x1a060b,0x1a060f,0x1c160f,0x1e0d0b,0x1e0d0f,
+	0x20290f,0x22020b,0x22020f,0x24010d,0x28010d,0x2c010d,0x2e010d,0x30010d,
+	0x32010d,0x34010d,0x36010b,0x36010f,0x38010f,0x3a010f,0x3c0109,0x3c010d,
+	0x3e0109,0x3e010d,0x40010d,0x400109,0x42010d,0x440109,0x44010d,0x46010d,
+	0x48010d,0x4a010f,0x4c010f,0x4e010b,0x4f010b,0x50010b,0x50010f,0x52010b,
+	0x52010f,0x54010b,0x56010b,0x58010b,0x58010f,0x5a010b,0x5a010f,0x5c010b,
+	0x5c010f,0x5e010b,0x5e010f,0x60010b,0x62010b,0x64010b,0x66010b,0x68010f,
+	0x68010b,0x6a010f,0x6a010b,0x6c010b,0x6e010b,0x6f010b,0x70010b,0x72010b,
+	0x72010f,0x74010b,0x74010f,0x76010f,0x78010f,0x7a010f,0x7c010b,0x7c010f,
+	0x80010b,0x80010f,0x82010b,0x82010f,0x84010f,0x86010f,0x88010f,0x8a010f,
+	0x8c010b,0x8e010f,0x90010f,0x92010f,0x94010d,0x960109,0x96010d,0x980109,
+	0x98010d,0x9a010d,0x9c0109,0x9c010d,0x9e010b,0x9e010f,0x100010b,0x100010f,
+	0x102010b,0x102010f,0x104010b,0x104010f,0x106010b,0x106010f,0x107010f,0x108010f,
+	0x109010f,0x10a010f,0x10b010f,0x10c010f,0x10d010f,0x10e010f,0x10f010f,0x110010f,
+	0x111010f,0x112010f,0x113010f,0x114010f,0x115010f,0x116010f,0x117010f,0x118010f,
+	0x119010f,0x11a010f,0x11b010f,0x11c010f,0x11d010f,0x11e010f,0x11f010f,0x120010f,
+	0x121010f,0x122010f,0x123010f,0x124010f,0x125010f,0x126010f,0x127010f,0x128010f,
+	0x129010f,0x12a010f,0x12b010f,0x12c010f,0x12d010f,0x12e010f,0x12f010f,0x130010f,
+	0x131010f,0x132010f,0x133010f,0x134010f,0x135010f,0x136010f,0x137010f,0x138010f,
+	0x139010f,0x13b010f,0x13c010d,0x13d010d,0x13e010f,0x13f010f,0x140010f,0x141010f,
+	0x142010f,0x143010d,0x144010d,0x145010d,0x146010d,0x147010d,0x148010d,0x149010d,
+	0x14a010d,0x14b010d,0x14c010d,0x14d010d,0x14e010d,0x14f010d,0x150010d,0x151010d,
+	0x152010d,0x153010d,0x154010d,0x155010d,0x156010d,0x157010d,0x158010d,0x159010d,
+	0x15a010d,0x15b010d,0x15c010d,0x15d010d,0x15e010d,0x15f010d,0x160010f,0x161010f,
+	0x162010f,0x163010f,0x164010f,0x165010f,0x166010f,0x167010f,0x168010f,0x169010f,
+	0x16a010f,0x16b010f,0x16c010f,0x16d010f,0x16e010f,0x16f010f,0x170010f,0x171010f,
+	0x172010f,0x174010f,0x175010f,0x176010f,0x177010f,0x178010f,0x179010f,0x17a010d,
+	0x17b010d,0x17c010d,0x17d0119,0x17e0119,0x17f0119,0x1800119,0x1810119,0x182010d,
+	0x183010d,0x184010d,0x185010d,0x186010d,0x187010d,0x189010f,0x18a010f,0x18b010f,
+	0x18c010f,0x18d0111,0x18e0111,0x18f0111,0x1900111,0x1910111,0x1920111,0x1930111,
+	0x1940111,0x1950111,0x1960111,0x197010f,0x198010f,0x199010b,0x199010f,0x6c50109,
+	0x6c60109,0x6c70109,0x6c80109,0x6c90109,0x6ca0109,0x6cb0109,0x6cc0109,0x6cd0109,
+	0x6ce0109,0x6cf0109,0x6cf010d,0x6cf0121,0x6cf0125,0x6e30109,0x6e3010d,0x6e30121,
+	0x6e30125,0x6fb0109,0x6fb010d,0x6fb0121,0x6fb0125,0x7070109,0x707010d,0x7070121,
+	0x7070125,0x72f0109,0x72f010d,0x72f0121,0x72f0125,0x75b0109,0x75b010d,0x75b0121,
+	0x75b0125,0x7630109,0x763010d,0x7630121,0x7630125,0x7830109,0x783010d,0x7830121,
+	0x7830125,0x79d0109,0x79d010d,0x79d0121,0x79d0125,0x7b10109,0x7b1010d,0x7b10121,
+	0x7b10125,0x7c10109,0x7c1010d,0x7c10121,0x7c10125,0x7cd0109,0x7cd010d,0x7cd0121,
+	0x7cd0125,0x7f50109,0x7f5010d,0x7f50121,0x7f50125,0x7fd0109,0x7fd010d,0x7fd0121,
+	0x7fd0125,0x8150109,0x815010d,0x8150121,0x8150125,0x82d0109,0x82d010d,0x82d0121,
+	0x82d0125,0x8390109,0x839010d,0x8390121,0x8390125,0x8450109,0x845010d,0x8450121,
+	0x8450125,0x86d0109,0x86d010d,0x86d0121,0x86d0125,0x8890109,0x889010d,0x8890121,
+	0x8890125,0x8ad0109,0x8ad010d,0x8ad0121,0x8ad0125,0x8c50109,0x8c5010d,0x8c50121,
+	0x8c50125,0x8d10109,0x8d1010d,0x8d10121,0x8d10125,0x8d90109,0x8d9010d,0x8d90121,
+	0x8d90125,0x8dd0109,0x8dd010d,0x8dd0121,0x8dd0125,0x8e90109,0x8e9010d,0x8e90121,
+	0x8e90125,0x10200139,0x10200135,0x10200149,0x10200141,0x10200145,0x1020013d,0x10260139,
+	0x10260135,0x10260149,0x10260141,0x10260145,0x1026013d,0x102c0139,0x102c0135,0x102c0149,
+	0x102c0141,0x102c0145,0x102c013d,0x10330139,0x10330135,0x10330149,0x10330141,0x10330145,
+	0x1033013d,0x10390139,0x10390135,0x10390149,0x10390141,0x10390145,0x1039013d,0x103f0135,
+	0x103f0145,0x103f013d,0x10440135,0x10440145,0x1044013d,0x10490135,0x10490145,0x1049013d,
+	0x104e0135,0x104e0145,0x104e013d,0x10530135,0x10530145,0x1053013d,0x10580135,0x10580145,
+	0x1058013d,0x105d0135,0x105d0145,0x105d013d,0x10620135,0x10620145,0x1062013d,0x10670135,
+	0x10670145,0x1067013d,0x106c0135,0x106c0145,0x106c013d,0x10710135,0x10710145,0x1071013d,
+	0x10760135,0x10760145,0x1076013d,0x107b0139,0x107b0135,0x107b0149,0x107b0141,0x107b0145,
+	0x107b013d,0x10830135,0x10830145,0x1083013d,0x10880135,0x10880145,0x1088013d,0x108d0135,
+	0x108d0145,0x108d013d,0x10900135,0x10900145,0x1090013d,0x10930135,0x10930145,0x1093013d,
+	0x10960135,0x10960145,0x1096013d,0x10990135,0x10990145,0x1099013d,0x109c0135,0x109c0145,
+	0x109c013d,0x10a30135,0x10a30145,0x10a3013d,0x10aa0135,0x10aa0145,0x10aa013d,0x10b10135,
+	0x10b10145,0x10b1013d,0x10b80135,0x10b80145,0x10b8013d,0x10bf0135,0x10bf0145,0x10bf013d,
+	0x10c20135,0x10c20145,0x10c2013d,0x10c50135,0x10c50145,0x10c5013d,0x10c80135,0x10c80145,
+	0x10c8013d,0x10cb0135,0x10cb0145,0x10cb013d,0x10ce0139,0x10ce0135,0x10ce0149,0x10ce0141,
+	0x10ce0145,0x10ce013d,0x10d40139,0x10d40135,0x10d40149,0x10d40141,0x10d40145,0x10d4013d,
+	0x10da0139,0x10da0135,0x10da0149,0x10da0141,0x10da0145,0x10da013d,0x10e00135,0x10e00145,
+	0x10e0013d,0x10e30135,0x10e30145,0x10e3013d,0x10e60135,0x10e60145,0x10e6013d,0x10e90135,
+	0x10e90145,0x10e9013d,0x10ec0135,0x10ec0145,0x10ec013d,0x10ef0139,0x10ef0135,0x10ef0149,
+	0x10ef0145,0x10ef013d,0x10f40135,0x10f40145,0x10f60135,0x10f60145,0x10f80135,0x10f80145,
+	0x10f8013d,0x10fb0135,0x10fb0145,0x10fb013d,
+	};
+
+static const TUint32 TheKanaIndex[] = 
+	{
+	0x210013,0x22010d,0x230076,0x24006f,0x250074,0x260078,0x270019,0x28003d,
+	0x29003f,0x2a007a,0x2b0057,0x2c0006,0x2d0059,0x2e0008,0x2f002e,0x30010f,
+	0x310110,0x320111,0x330112,0x340113,0x350114,0x360115,0x370116,0x380117,
+	0x390118,0x3a000c,0x3b000e,0x3c0060,0x3d005e,0x3e0062,0x3f0011,0x40007c,
+	0x41011b,0x42011f,0x430123,0x440127,0x45012b,0x46012f,0x470133,0x480137,
+	0x49013b,0x4a013f,0x4b0143,0x4c0147,0x4d014b,0x4e014f,0x4f0153,0x500157,
+	0x51015b,0x52015f,0x530163,0x540167,0x55016b,0x56016f,0x570173,0x580177,
+	0x59017b,0x5a017f,0x5b0043,0x5c0030,0x5d0045,0x5e001e,0x5f0021,0x60001b,
+	0x610119,0x62011d,0x630121,0x640125,0x650129,0x66012d,0x670131,0x680135,
+	0x690139,0x6a013d,0x6b0141,0x6c0145,0x6d0149,0x6e014d,0x6f0151,0x700155,
+	0x710159,0x72015d,0x730161,0x740165,0x750169,0x76016d,0x770171,0x780175,
+	0x790179,0x7a017d,0x7b0047,0x7c0035,0x7d0049,0x7e0033,0xa20071,0xa30072,
+	0xa5006d,0xa7007e,0xa8001d,0xb00069,0xb1005b,0xb4001a,0xb600b7,0xd7005c,
+	0xf7005d,0x2010002d,0x2015002c,0x20180039,0x2019003a,0x201c003b,0x201d003c,0x202000b5,
+	0x202100b6,0x20250038,0x20260037,0x203000b1,0x2032006a,0x2033006b,0x203b008c,0x2103006c,
+	0x211600ef,0x212100f1,0x216000cc,0x216100cd,0x216200ce,0x216300cf,0x216400d0,0x216500d1,
+	0x216600d2,0x216700d3,0x216800d4,0x216900d5,0x21700101,0x21710102,0x21720103,0x21730104,
+	0x21740105,0x21750106,0x21760107,0x21770108,0x21780109,0x2179010a,0x2190008f,0x21910090,
+	0x2192008e,0x21930091,0x21d2009e,0x21d4009f,0x220000a0,0x220200a5,0x220300a1,0x220700a6,
+	0x22080093,0x220b0094,0x221100fe,0x2212005a,0x221a00ab,0x221d00ad,0x221e0066,0x221f00ff,
+	0x222000a2,0x22250034,0x2227009b,0x2228009c,0x2229009a,0x222a0099,0x222b00af,0x222c00b0,
+	0x222e00fd,0x22340066,0x223500ae,0x223d00ac,0x225200a8,0x226100a7,0x22660064,0x22670065,
+	0x226a00a9,0x226b00aa,0x22820097,0x22830098,0x22860095,0x22870096,0x22a500a3,0x22bf0100,
+	0x231200a4,0x246000b9,0x246100ba,0x246200bb,0x246300bc,0x246400bd,0x246500be,0x246600bf,
+	0x246700c0,0x246800c1,0x246900c2,0x246a00c3,0x246b00c3,0x246c00c4,0x246d00c5,0x246e00c6,
+	0x246f00c7,0x247000c8,0x247100c9,0x247200ca,0x247300cb,0x25a00087,0x25a10086,0x25b20089,
+	0x25b30088,0x25bc008b,0x25bd008a,0x25c60085,0x25c70084,0x25cb0081,0x25ce0083,0x25cf0082,
+	0x25ef00b8,0x26050080,0x2606007f,0x26400068,0x26420067,0x266a00b4,0x266d00b3,0x266f00b2,
+	0x30010003,0x30020005,0x30030025,0x30050027,0x30060028,0x30070029,0x3008004b,0x3009004c,
+	0x300a004d,0x300b004e,0x300c004f,0x300d0051,0x300e0053,0x300f0054,0x30100055,0x30110056,
+	0x3012008d,0x30130092,0x30140041,0x30150042,0x301c0032,0x301d00ed,0x301f00ee,0x30410181,
+	0x30420182,0x30430187,0x30440188,0x3045018d,0x3046018e,0x30470193,0x30480194,0x30490199,
+	0x304a019a,0x304b019f,0x304d01a2,0x304f01a5,0x305101a8,0x305301ab,0x305501ae,0x305701b1,
+	0x305901b4,0x305b01b7,0x305d01ba,0x305f01bd,0x306101c0,0x306301c3,0x306401c4,0x306601c9,
+	0x306801cc,0x306a01cf,0x306b01d2,0x306c01d5,0x306d01d8,0x306e01db,0x306f01de,0x307201e1,
+	0x307501e4,0x307801e7,0x307b01ea,0x307e01ed,0x307f01f0,0x308001f3,0x308101f6,0x308201f9,
+	0x308301fc,0x308401fd,0x30850202,0x30860203,0x30870208,0x30880209,0x3089020e,0x308a0211,
+	0x308b0214,0x308c0217,0x308d021a,0x308e021d,0x308f021e,0x30900222,0x30910224,0x30920226,
+	0x30930229,0x30990000,0x309a0001,0x309b0016,0x309c0018,0x309d0024,0x30a10183,0x30a20185,
+	0x30a30189,0x30a4018b,0x30a5018f,0x30a60191,0x30a70195,0x30a80197,0x30a9019b,0x30aa019d,
+	0x30ab01a0,0x30ad01a3,0x30af01a6,0x30b101a9,0x30b301ac,0x30b501af,0x30b701b2,0x30b901b5,
+	0x30bb01b8,0x30bd01bb,0x30bf01be,0x30c101c1,0x30c301c5,0x30c401c7,0x30c601ca,0x30c801cd,
+	0x30ca01d0,0x30cb01d3,0x30cc01d6,0x30cd01d9,0x30ce01dc,0x30cf01df,0x30d201e2,0x30d501e5,
+	0x30d801e8,0x30db01eb,0x30de01ee,0x30df01f1,0x30e001f4,0x30e101f7,0x30e201fa,0x30e301fe,
+	0x30e40200,0x30e50204,0x30e60206,0x30e7020a,0x30e8020c,0x30e9020f,0x30ea0212,0x30eb0215,
+	0x30ec0218,0x30ed021b,0x30ee021f,0x30ef0220,0x30f00223,0x30f10225,0x30f20227,0x30f3022a,
+	0x30fb000a,0x30fc002b,0x30fd0023,0x323100f7,0x323200f8,0x323900f9,0x32a400f2,0x32a500f3,
+	0x32a600f4,0x32a700f5,0x32a800f6,0x330300dc,0x330d00e0,0x331400d7,0x331800da,0x332200d8,
+	0x332300e2,0x332600e1,0x332700db,0x332b00e3,0x333600dd,0x333b00e5,0x334900d6,0x334a00e4,
+	0x334d00d9,0x335100de,0x335700df,0x337b00ec,0x337c00fc,0x337d00fb,0x337e00fa,0x338f00e9,
+	0x339c00e6,0x339d00e7,0x339e00e8,0x33a100eb,0x33c400ea,0x33cd00f0,0x4edd0026,0xfe540010,
+	0xff010014,0xff02010e,0xff030077,0xff040070,0xff050075,0xff060079,0xff07010c,0xff08003e,
+	0xff090040,0xff0a007b,0xff0b0058,0xff0c0007,0xff0d005a,0xff0e0009,0xff0f002f,0xff1a000d,
+	0xff1b000f,0xff1c0061,0xff1d005f,0xff1e0063,0xff1f0012,0xff20007d,0xff21011c,0xff220120,
+	0xff230124,0xff240128,0xff25012c,0xff260130,0xff270134,0xff280138,0xff29013c,0xff2a0140,
+	0xff2b0144,0xff2c0148,0xff2d014c,0xff2e0150,0xff2f0154,0xff300158,0xff31015c,0xff320160,
+	0xff330164,0xff340168,0xff35016c,0xff360170,0xff370174,0xff380178,0xff39017c,0xff3a0180,
+	0xff3b0044,0xff3c0031,0xff3d0046,0xff3e001f,0xff3f0022,0xff40001c,0xff41011a,0xff42011e,
+	0xff430122,0xff440126,0xff45012a,0xff46012e,0xff470132,0xff480136,0xff49013a,0xff4a013e,
+	0xff4b0142,0xff4c0146,0xff4d014a,0xff4e014e,0xff4f0152,0xff500156,0xff51015a,0xff52015e,
+	0xff530162,0xff540166,0xff55016a,0xff56016e,0xff570172,0xff580176,0xff59017a,0xff5a017e,
+	0xff5b0048,0xff5c0036,0xff5d004a,0xff5e0032,0xff610004,0xff620050,0xff630052,0xff640002,
+	0xff65000b,0xff660228,0xff670184,0xff68018a,0xff690190,0xff6a0196,0xff6b019c,0xff6c01ff,
+	0xff6d0205,0xff6e020b,0xff6f01c6,0xff70002a,0xff710186,0xff72018c,0xff730192,0xff740198,
+	0xff75019e,0xff7601a1,0xff7701a4,0xff7801a7,0xff7901aa,0xff7a01ad,0xff7b01b0,0xff7c01b3,
+	0xff7d01b6,0xff7e01b9,0xff7f01bc,0xff8001bf,0xff8101c2,0xff8201c8,0xff8301cb,0xff8401ce,
+	0xff8501d1,0xff8601d4,0xff8701d7,0xff8801da,0xff8901dd,0xff8a01e0,0xff8b01e3,0xff8c01e6,
+	0xff8d01e9,0xff8e01ec,0xff8f01ef,0xff9001f2,0xff9101f5,0xff9201f8,0xff9301fb,0xff940201,
+	0xff950207,0xff96020d,0xff970210,0xff980213,0xff990216,0xff9a0219,0xff9b021c,0xff9c0221,
+	0xff9d022b,0xff9e0015,0xff9f0017,0xffe00071,0xffe10073,0xffe2009d,0xffe30020,0xffe4010b,
+	0xffe5006e,
+	};
+
+/*
+Collation keys for the Hiragana and Katakana syllabaries, built by
+running coltab on \loce32\japanese\source\japanese_basekeys.txt after deleting all CJK characters.
+*/
+static const TCollationKeyTable TheKanaTable = 
+	{ TheKanaKey, TheKanaIndex, 561, NULL, NULL, 0 };
+
+static const TCollationMethod TheKanaMethod =
+	{ 0, NULL, &TheKanaTable, 0 };
+
+static const TCollationMethod TheSwapKanaMethod =
+	{ 0, NULL, &TheKanaTable, TCollationMethod::ESwapKana };
+
+static const TUint32 TheQazKey[] = 
+	{
+	0x6d00121,0x6e40121,
+	};
+
+static const TUint32 TheQazIndex[] = 
+	{
+	0
+	};
+
+static const TUint16 TheQazStringElement[] = 
+	{
+	0x2,0x53,0x45,0x3,0x53,0x45,0x58,
+	};
+
+static const TUint32 TheQazStringIndex[] = 
+	{
+	0x0,0x30001,
+	};
+
+static const TCollationKeyTable TheQazTable = 
+	{ TheQazKey, TheQazIndex, 0, TheQazStringElement, TheQazStringIndex, 2 };
+
+// A bizarre collation method that sorts 'SE' between A and B and 'SEX' between B and C
+static const TCollationMethod TheQazMethod = 
+	{ 0, NULL, &TheQazTable, 0 };
+
+// A collation method to sort accents starting at the end of the string, as in France
+static const TCollationMethod TheAccentsBackwardsMethod = 
+	{ 0, NULL, NULL, TCollationMethod::EAccentsBackwards };
+
+void test_unicode_collations()
+	{
+	/*
+	Note: the curious method of getting values greater than 255 into the strings is needed
+	because GCC doesn't handle the \x notation properly: it zeroes the high byte, so
+	L"\x2011" puts the value 0x0011, not 0x2011, into the string.
+	*/
+	TBuf<32> x, y;
+
+	test.Next(_L("collation"));
+	test_unicode_collation(_L("SEZ"),_L("BZ"),-1,3,&TheQazMethod); // test 2-character combination 'SE'
+	test_unicode_collation(_L("SEXY"),_L("CY"),-1,3,&TheQazMethod); // test 3-character combination 'SEX'
+	test_unicode_collation(_L("Graham"),_L("Graham"),0);		// equality
+	test_unicode_collation(_L("something"),_L(""),1);			// something after nothing
+	test_unicode_collation(_L("inform"),_L("information"),-1);	// prefixes come first
+	test_unicode_collation(_L("unicode"),_L("consortium"),1);	// standard alphabetic ordering: lowercase
+	test_unicode_collation(_L("AARON"),_L("AARDVARK"),1);		// standard alphabetic ordering: uppercase
+	test_unicode_collation(_L("AARON"),_L("AARDVARK"),1,0);		// alphabetic ordering is significant at level 0
+	test_unicode_collation(_L("hello"),_L("Hello"),-1,3);		// lowercase before uppercase
+	test_unicode_collation(_L("hello"),_L("Hello"),-1,3,&TheSwapKanaMethod);// swapping kana ordering doesn't affect case
+	test_unicode_collation(_L("hello"),_L("Hello"),1,3,&TheSwapCaseMethod); // uppercase before lowercase if ESwapCase used
+	test_unicode_collation(_L("hello"),_L("Hello"),0,2,&TheFoldCaseMethod); // uppercase = lowercase if EFoldCase used at level 2
+	test_unicode_collation(_L("hello"),_L("Hello"),-1,2);		// case is significant at level 2
+	test_unicode_collation(_L("hello"),_L("Hello"),0,1);		// ignore case at level 1
+	test_unicode_collation(_L("hello"),_L("[H E L L O !]"),0,1);// ignore punctuation and case at level 1
+	test_unicode_collation(_L("1234"),_L("abc"),-1);			// digits before letters
+	x = _L("week day"); x[4] = 0x2011;							// (week-day with non-breaking hyphen)
+	test_unicode_collation(x,_L("weekend"),-1);					// ignore punctuation if letters differ; d < e
+	test_unicode_collation(x,_L("week-day"),1);					// compare punctuation if otherwise equal
+	test_unicode_collation(x,_L("week-day"),0,2);				// ignore difference between hyphens at level 2
+	test_unicode_collation(x,_L("Week-day"),-1);				// case difference outweighs punctuation ordering
+	y = _L("a ngstro m"); y[1] = 0x30a; y[8] = 0x308;			// (a<ring>ngstro<umlaut>m with piece accents)
+	test_unicode_collation(_L("\xe5ngstr\xf6m"),y,0);			// base+accent = precomposed (a<ring>ngstro<umlaut>m)
+	test_unicode_collation(_L("Liege"),_L("Li\xe8ge"),-1);		// unaccented before accented...
+	test_unicode_collation(_L("Liege"),_L("Li\xe8ge"),-1,1);	// accents are significant at level 1
+	test_unicode_collation(_L("Liege"),_L("li\xe8ge"),-1);		// accentuation outweighs case
+	test_unicode_collation(_L("Liege"),_L("li\xe8ge"),0,0);		// ignore accents and case at level 0
+	test_unicode_collation(_L("\xe5ngstr\xf6m"),_L("zoo"),-1);	// a-ring before z by default
+	test_unicode_collation(_L("\xe5ngstr\xf6m"),_L("zoo"),1,3,&TheSwedishMethod);	// a-ring after z in Sweden
+	test_unicode_collation(_L("Antidisestablishmentarian"),_L("antidisestablishmentariac"),1);
+																// long strings that don't have identical prefixes
+	x = _L("\x304b\x306a"); y = _L("\x30ab\x30ca");				// 'kana' in Hiragana and Katakana
+	test_unicode_collation(x,y,-1,3,&TheKanaMethod);			// Hiragana before Katakana 
+	test_unicode_collation(x,y,1,3,&TheSwapKanaMethod);			// Katakana before Hiragana if ESwapKana used
+	x = _L("p\xe9"L"ch\xe9"); y = _L("p\xea"L"che");			// x = pe<acute>che<acute>, y = pe<circumflex>che
+	test_unicode_collation(x,y,-1,3);							// normal order; accents compared from start
+	test_unicode_collation(x,y,1,3,&TheAccentsBackwardsMethod);	// reverse order; accents compared from end
+	test_unicode_collation(_L("aaAA"),_L("aAaA"),0,3,&TheFoldCaseMethod); // case folding should work even at level 3
+	test_unicode_collation(_L("\x2113"),_L("L"),1,3,&TheFoldCaseMethod); // script l and L should not be equal;
+																// script l before L because L folds to lower case,
+																// which sorts after secondary key type for script l
+	test_unicode_collation(_L("\x3c2"),_L("\x3c3"),-1,3); // Greek final and non-final sigma
+	test_unicode_collation(_L("\x3c2"),_L("\x3c3"),0,3,&TheFoldCaseMethod); // Greek final and non-final sigma
+	test_unicode_collation(_L("\xee0"),_L("\x4e00"),1,3);		// undefined character after CJK character not in table
+	test_unicode_collation(_L("\xee0"),_L("\xef0"),-1,3);		// undefined characters must differ
+	test_unicode_collation(_L("\xee0\xee1"),_L("\xef0"),-1,3);	// undefined characters in Unicode order, not string length
+	test_unicode_collation(_L("\xd800\xdc00"),_L("\xceff"),1,3);	// character U+10000 (using surrogates) 
+																// after Hangul character not in table
+	}
+
+GLDEF_C TInt E32Main(void)
+    {
+
+	test.Title();
+	test.Start(_L("TCHAR TESTING"));
+
+	test_unicode_chars();
+	test_unicode_collations();
+
+	test.Next(_L("TChar"));
+	TestTChar<TChar> t;
+	t.Test1();
+	t.Test2(eTChar);
+	t.Test3(eTChar);
+	t.Test4(eTChar);
+
+	test.Next(_L("TCharF"));
+	TestTChar<TCharF> f;
+	f.Test2(eTCharF);
+	f.Test3(eTCharF);
+	f.Test4(eTCharF);
+
+	test.Next(_L("TCharLC"));
+	TestTChar<TCharLC> lc;
+	lc.Test2(eTCharLC);
+	lc.Test3(eTCharLC);
+	lc.Test4(eTCharLC);
+
+	test.Next(_L("TCharUC"));
+  	TestTChar<TCharUC> uc;
+	uc.Test2(eTCharUC);
+	uc.Test3(eTCharUC);
+	uc.Test4(eTCharUC);
+
+	test.End();
+	return(KErrNone);
+    }
+
+#pragma warning ( default :4700)
+#pragma warning ( default :4710) 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32test/buffer/t_circ.cpp	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,292 @@
+// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32test\buffer\t_circ.cpp
+// Overview:
+// Test methods of CCirBuffer and CCirBuf template class.
+// API Information:
+// CCirBuffer, CCirBuf.
+// Details:
+// - Create a circular buffer, add integers to the circular buffer and check that 
+// they are added as specified.
+// - Verify Remove and Add work as expected.
+// - Check that all the added objects are removed.
+// - Create a circular buffer, add concrete data type object one, many at a time to the 
+// circular buffer and check that they are added as specified.
+// - Remove the concrete data type object one, many at a time from the circular buffer
+// and check that they are removed as expected.
+// - Check that all the added objects are removed.
+// - Create a circular buffer, add 8-bit unsigned character object one, many at a time
+// to the circular buffer and check that they are added as specified.
+// - Remove multiple 8-bit unsigned character objects from the circular buffer and 
+// check the added and removed objects are same.
+// - Create a circular buffer of unsigned integers, add single, multiple objects to the 
+// buffer and check that they are added as specified.
+// - Remove multiple objects from the circular buffer and check the added and removed 
+// objects are same.
+// - Create a circular buffer, add multiple signed integer objects to it, remove 
+// the objects and verify that the added objects are removed.
+// - Create a circular buffer, add integers to the circular buffer and check that 
+// they are added as specified.
+// - Verify Remove works as expected.
+// - Test whether the heap has been corrupted by all the tests.
+// Platforms/Drives/Compatibility:
+// All 
+// Assumptions/Requirement/Pre-requisites:
+// Failures and causes:
+// Base Port information:
+// 
+//
+
+#include <e32test.h>
+
+class VTester
+	{
+public:
+	VTester(){a=b=c=d=0;}
+	VTester(TInt anInt){a=b=c=d=anInt;}
+	VTester& operator=(TInt anInt){a=b=c=d=anInt;return *this;}
+	TBool operator==(const VTester& aVal) const{if (a==aVal.a && b==aVal.b && c==aVal.c && d==aVal.d) return 1; else return 0;}
+	TBool operator==(const TInt& aVal) const{if (a==aVal && b==aVal && c==aVal && d==aVal) return 1; else return 0;}
+public:
+	TInt a;
+	TInt b;
+	TInt c;
+	TInt d;
+	};
+
+LOCAL_D RTest test(_L("T_CIRC"));
+LOCAL_D TText8* theCharArray=(TText8*)"abcdefghijklmnopqrstuvwxyz1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ!\xA3$%^&*()\0";
+
+LOCAL_C void TestInt()
+//
+// Test with unsigned integers
+//
+	{
+	
+	CCirBuf<TInt>* cbInt=new CCirBuf<TInt>;
+	TRAPD(ret,cbInt->SetLengthL(5));
+	test(ret==KErrNone);
+	TInt one(1);
+	TInt two(2);
+	TInt three(3);
+	TInt four(4);
+	TInt five(5);
+	TInt six(6);
+	TInt dummy;
+	TInt numbers[]={7,8,9,10,11,12,13,14,15};
+	TInt* numBuf=new TInt[10];
+	test(numBuf!=NULL);
+	test(cbInt->Add(&one)==1);
+	test(cbInt->Add(&two)==1);
+	test(cbInt->Add(&three)==1);
+	test(cbInt->Add(&four)==1);
+	test(cbInt->Add(&five)==1);
+	one=two=three=four=0;
+	test(cbInt->Add(&six)==0);
+	test(cbInt->Remove(&one)==1);
+	test(cbInt->Add(&six)==1);
+	test(cbInt->Add(&dummy)==0);
+	test(cbInt->Remove(&two)==1);
+	test(cbInt->Remove(&three)==1);
+	test(cbInt->Remove(&four)==1);
+	test(one==1);
+	test(two==2);
+	test(three==3);
+	test(four==4);
+	test(cbInt->Add(numbers,6)==3);
+	test(cbInt->Add(numbers,3)==0);
+	test(cbInt->Remove(numBuf,7)==5);
+	test(cbInt->Remove(numBuf,5)==0);
+	for(TInt j(0);j<5;j++)
+		test(numBuf[j]==j+5);
+	delete [] numBuf;
+	delete cbInt;
+	}
+
+LOCAL_C void TestClass()
+//
+// Test with objects
+//
+	{
+
+	CCirBuf<VTester>* cbInt=new CCirBuf<VTester>;
+	TRAPD(ret,cbInt->SetLengthL(5));
+	test(ret==KErrNone);
+	VTester one(1);
+	VTester two(2);
+	VTester three(3);
+	VTester four(4);
+	VTester five(5);
+	VTester six(6);
+	VTester dummy(0xffff);
+	VTester numbers[]={7,8,9,10,11,12,13,14,15};
+	VTester* numBuf=new VTester[10];
+	test(numBuf!=NULL);
+	test(cbInt->Add(&one)==1);
+	test(cbInt->Add(&two)==1);
+	test(cbInt->Add(&three)==1);
+	test(cbInt->Add(&four)==1);
+	test(cbInt->Add(&five)==1);
+	one=two=three=four=0;
+	test(cbInt->Add(&six)==0);
+	test(cbInt->Remove(&one)==1);
+	test(cbInt->Add(&six)==1);
+	test(cbInt->Add(&dummy)==0);
+	test(cbInt->Remove(&two)==1);
+	test(cbInt->Remove(&three)==1);
+	test(cbInt->Remove(&four)==1);
+	test(one==1);
+	test(two==2);
+	test(three==3);
+	test(four==4);
+	test(cbInt->Add(numbers,6)==3);
+	test(cbInt->Add(numbers,3)==0);
+	test(cbInt->Remove(numBuf,7)==5);
+	test(cbInt->Remove(numBuf,5)==0);
+	for(TInt j(0);j<5;j++)
+		test(numBuf[j]==j+5);
+	delete [] numBuf;
+	delete cbInt;
+	}
+
+LOCAL_C void TestText()
+//
+// Test with text
+//
+	{
+
+	TInt i,j;
+	TInt arraySize=User::StringLength(theCharArray);
+	TText8* buf=new TText8[arraySize+1];
+	Mem::FillZ(buf,arraySize);
+	CCirBuf<TText8>* cbInt=new CCirBuf<TText8>;
+	TRAPD(ret,cbInt->SetLengthL(arraySize+11));
+	test(ret==KErrNone);
+	for (i=0;i<10;i++)
+		{
+		test(cbInt->Add(theCharArray,arraySize)==arraySize);
+		test(cbInt->Add(theCharArray+i)==1);
+		test(cbInt->Remove(buf,arraySize)==arraySize);
+		}
+	TRAP(ret,cbInt->SetLengthL(arraySize*60));
+	test(ret==KErrNone);
+	for (j=0;j<10;j++)
+		{
+		for (i=0;i<9;i++)
+			test(cbInt->Add(theCharArray,arraySize)==arraySize);
+		for (i=0;i<arraySize;i++)
+			test(cbInt->Add(theCharArray+i)==1);
+		for (i=0;i<5;i++)
+			{
+			Mem::FillZ(buf,arraySize);
+			test(cbInt->Remove(buf,arraySize)==arraySize);
+			test(Mem::Compare(buf,arraySize,theCharArray,arraySize)==KErrNone);
+			}
+		}
+	delete [] buf;
+	delete cbInt;
+	}
+
+void TestBuf()
+//
+// Test with buffers
+//
+	{
+
+	TInt i,j;
+	TInt arraySize=User::StringLength(theCharArray);
+	TText8* buf=new TText8[arraySize+1];
+	Mem::FillZ(buf,arraySize);
+	CCirBuffer* cbInt=new CCirBuffer;
+	TRAPD(ret,cbInt->SetLengthL(arraySize+11));
+	test(ret==KErrNone);
+	for (i=0;i<10;i++)
+		{
+		test(cbInt->Add(theCharArray,arraySize)==arraySize);
+		test(cbInt->Add(theCharArray+i)==1);
+		test(cbInt->Remove(buf,arraySize)==arraySize);
+		}
+	TRAP(ret,cbInt->SetLengthL(arraySize*60));
+	test(ret==KErrNone);
+	for (j=0;j<10;j++)
+		{
+		for (i=0;i<9;i++)
+			test(cbInt->Add(theCharArray,arraySize)==arraySize);
+		for (i=0;i<arraySize;i++)
+			test(cbInt->Add(theCharArray+i)==1);
+		for (i=0;i<5;i++)
+			{
+			Mem::FillZ(buf,arraySize);
+			test(cbInt->Remove(buf,arraySize)==arraySize);
+			test(Mem::Compare(buf,arraySize,theCharArray,arraySize)==KErrNone);
+			}
+		}
+	delete [] buf;
+	delete cbInt;
+	}
+
+LOCAL_C void TestRemove()
+//
+// Show remove bug (fixed in rel 050)
+//
+{
+
+	CCirBuf<TInt>* cbInt=new CCirBuf<TInt>; TRAPD(ret,cbInt->SetLengthL(5));
+	test(ret==KErrNone);
+	TInt numbers[]={1,2,3,4,5};
+	TInt* result=new TInt[5];
+
+	test(cbInt->Add(numbers,5)==5);
+	test(cbInt->Remove(result,2)==2);
+	test(result[0]==1);
+	test(result[1]==2);
+	test(cbInt->Remove(result,3)==3);
+	test(result[0]==3);
+	test(result[1]==4);
+	test(result[2]==5);
+
+	delete [] result;
+	delete cbInt;
+	}
+
+
+TInt E32Main()
+//
+// Test CCirBuf<T>
+//
+    {
+
+	test.Title();
+	__UHEAP_MARK;
+//
+	test.Start(_L("Testing with built in Type"));
+	TestInt();
+//
+	test.Next(_L("Testing with concrete data type"));
+	TestClass();
+//	
+	test.Next(_L("Testing with text"));
+	TestText();
+//
+	test.Next(_L("Testing character buffer"));
+	TestBuf();
+//
+	test.Next(_L("Testing Remove"));
+	TestRemove();
+
+	__UHEAP_MARKEND;
+	test.End();
+	return(KErrNone);
+	}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32test/buffer/t_collate.cpp	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,2446 @@
+// Copyright (c) 1994-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32test\buffer\t_collate.cpp
+// Overview:
+// Test Unicode collations.
+// API Information:
+// CompareC, TCollationMethod, TCollationKeyTable.
+// Details:
+// - Check the collation for characters, accents, different cases and standard 
+// alphabetical ordering is as expected.
+// - Check collation using standard collation method, overriding the collation tables, 
+// collation keys is as expected.
+// - Check collation for simplified Chinese characters is as expected.
+// - Check collation and compare the Chinese ideological characters to other 
+// characters which are not included in the Chinese collation table are as expected.
+// - Check collation and compare Chinese to English alphabets.
+// - Check collation and compare Chinese to Hiragana characters.
+// - Check collation and compare Chinese to Katakana characters.
+// - Check collation and compare Hiragana to a Katakana characters.
+// - Check collation and compare full width and half width digits and letters.
+// - Set the current collation key table to standard table, collation keys to default keys,
+// constants to specified values, compare data and check it is as expected.
+// Platforms/Drives/Compatibility:
+// All 
+// Assumptions/Requirement/Pre-requisites:
+// Failures and causes:
+// Base Port information:
+// 
+//
+
+#include <e32test.h>
+#include <collate.h>	  
+#include "../../e32/euser/unicode/collateimp.h"
+#include <u32std.h>
+
+#ifdef __VC32__
+    // Solve compilation problem caused by non-English locale
+    #pragma setlocale("english")
+#endif
+
+LOCAL_D RTest test(_L("T_COLLATE"));
+
+
+#ifndef _DEBUG
+#pragma warning (disable :4710) //Function not expanded 
+#pragma warning (disable :4700) //Local variable used without being initialized
+#endif
+
+///***************** copied from locale euser source code ***********************
+#ifndef __TOOLS2__
+static const TCollationMethod TheCollationMethod[] =
+	{
+		{
+		KUidBasicCollationMethod,				// this is the standard unlocalised method
+		NULL,									// null means use the standard table
+		NULL,									// there's no override table
+		0										// the flags are standard
+		}
+	};
+static const TCollationDataSet TheCollationDataSet =
+	{
+	TheCollationMethod,
+	1
+	};
+const LCharSet TheCharSet =
+	{
+	NULL,
+	&TheCollationDataSet
+	};
+const LCharSet* GetLocaleCharSet()
+	{
+	return &TheCharSet;
+	}
+#endif
+///*******************************************************************************
+
+
+
+
+void test_unicode_collation(const TDesC& x,const TDesC& y,TInt desired_order,
+							TInt level = 3,const TCollationMethod* method = NULL)
+	{
+	TInt order = x.CompareC(y,level,method);
+
+	// Normalise order to -1, 0 or 1.
+	if (order < 0)
+		order = -1;
+	else if (order > 0)
+		order = 1;
+
+	test(order == desired_order);
+	}
+
+static const TUint32 TheSwedishKey[] = 
+	{
+	0x8f60109,0x8f70109,0x8f80109,0x8f60121,0x8f70121,0x8f80121,0x8dd0109,0x8dd0121,
+	0x8c50121,0x8c50109,
+	};
+
+static const TUint32 TheSwedishIndex[] = 
+	{
+	0x570008,0x770009,
+	};
+
+static const TUint16 TheSwedishStringElement[] = 
+	{
+	0x2,0x61,0x30a,0x2,0x61,0x308,0x2,0x6f,
+	0x308,0x2,0x41,0x30a,0x2,0x41,0x308,0x2,
+	0x4f,0x308,0x2,0x75,0x308,0x2,0x55,0x308,
+	};
+
+static const TUint32 TheSwedishStringIndex[] = 
+	{
+	0xc0004,0x90003,0xf0005,0x150007,0x30001,0x0,0x60002,0x120006,
+	};
+
+static const TCollationKeyTable TheSwedishTable = 
+	{ TheSwedishKey, TheSwedishIndex, 2, TheSwedishStringElement, TheSwedishStringIndex, 8 };
+
+static const TCollationMethod TheSwedishMethod =
+	{ 0, NULL, &TheSwedishTable, 0 };
+
+static const TCollationMethod TheSwapCaseMethod =
+	{ 0, NULL, NULL, TCollationMethod::ESwapCase };
+
+static const TUint32 TheKanaKey[] = 
+	{
+	0x102c013c,0xc949,0x103f013c,0xc949,0x1044013c,0xc949,0x1049013c,0xc949,
+	0x104e013c,0xc949,0x1053013c,0xc949,0x1058013c,0xc949,0x105d013c,0xc949,
+	0x1062013c,0xc949,0x1067013c,0xc949,0x106c013c,0xc949,0x1071013c,0xc949,
+	0x1076013c,0xc949,0x107b013c,0xc949,0x1083013c,0xc949,0x1088013c,0xc949,
+	0x109c013c,0xc949,0x10a3013c,0xc949,0x10aa013c,0xc949,0x10b1013c,0xc949,
+	0x10b8013c,0xc949,0x109c013c,0xca49,0x10a3013c,0xca49,0x10aa013c,0xca49,
+	0x10b1013c,0xca49,0x10b8013c,0xca49,0x10200134,0x10200135,0x10260134,0x10260135,
+	0x102c0134,0x102c0135,0x10330134,0x10330135,0x10390134,0x10390135,0x103f0134,0x10200135,
+	0x10440134,0x10260135,0x10490134,0x102c0135,0x104e0134,0x10330135,0x10530134,0x10390135,
+	0x103f0134,0xc948,0x10200135,0x10440134,0xc948,0x10260135,0x10490134,0xc948,
+	0x102c0135,0x104e0134,0xc948,0x10330135,0x10530134,0xc948,0x10390135,0x10580134,
+	0x10200135,0x105d0134,0x10260135,0x10620134,0x102c0135,0x10670134,0x10330135,0x106c0134,
+	0x10390135,0x10580134,0xc948,0x10200135,0x105d0134,0xc948,0x10260135,0x10620134,
+	0xc948,0x102c0135,0x10670134,0xc948,0x10330135,0x106c0134,0xc948,0x10390135,
+	0x10710134,0x10200135,0x10760134,0x10260135,0x107b0134,0x102c0135,0x10830134,0x10330135,
+	0x10880134,0x10390135,0x10710134,0xc948,0x10200135,0x10760134,0xc948,0x10260135,
+	0x107b0134,0xc948,0x102c0135,0x10830134,0xc948,0x10330135,0x10880134,0xc948,
+	0x10390135,0x108d0134,0x10200135,0x10900134,0x10260135,0x10930134,0x102c0135,0x10960134,
+	0x10330135,0x10990134,0x10390135,0x109c0134,0x10200135,0x10a30134,0x10260135,0x10aa0134,
+	0x102c0135,0x10b10134,0x10330135,0x10b80134,0x10390135,0x109c0134,0xc948,0x10200135,
+	0x10a30134,0xc948,0x10260135,0x10aa0134,0xc948,0x102c0135,0x10b10134,0xc948,
+	0x10330135,0x10b80134,0xc948,0x10390135,0x109c0134,0xca08,0x10200135,0x10a30134,
+	0xca08,0x10260135,0x10aa0134,0xca08,0x102c0135,0x10b10134,0xca08,0x10330135,
+	0x10b80134,0xca08,0x10390135,0x10bf0134,0x10200135,0x10c20134,0x10260135,0x10c50134,
+	0x102c0135,0x10c80134,0x10330135,0x10cb0134,0x10390135,0x10ce0134,0x10200135,0x10d40134,
+	0x102c0135,0x10da0134,0x10390135,0x10e00134,0x10200135,0x10e30134,0x10260135,0x10e60134,
+	0x102c0135,0x10e90134,0x10330135,0x10ec0134,0x10390135,0x10ef0134,0x10200135,0x103f0144,
+	0x10200145,0x10440144,0x10260145,0x10490144,0x102c0145,0x104e0144,0x10330145,0x10530144,
+	0x10390145,0x103f0144,0xc948,0x10200145,0x10440144,0xc948,0x10260145,0x10490144,
+	0xc948,0x102c0145,0x104e0144,0xc948,0x10330145,0x10530144,0xc948,0x10390145,
+	0x10580144,0x10200145,0x105d0144,0x10260145,0x10620144,0x102c0145,0x10670144,0x10330145,
+	0x106c0144,0x10390145,0x10580144,0xc948,0x10200145,0x105d0144,0xc948,0x10260145,
+	0x10620144,0xc948,0x102c0145,0x10670144,0xc948,0x10330145,0x106c0144,0xc948,
+	0x10390145,0x10710144,0x10200145,0x10760144,0x10260145,0x107b0144,0x102c0145,0x10830144,
+	0x10330145,0x10880144,0x10390145,0x10710144,0xc948,0x10200145,0x10760144,0xc948,
+	0x10260145,0x107b0144,0xc948,0x102c0145,0x10830144,0xc948,0x10330145,0x10880144,
+	0xc948,0x10390145,0x108d0144,0x10200145,0x10900144,0x10260145,0x10930144,0x102c0145,
+	0x10960144,0x10330145,0x10990144,0x10390145,0x109c0144,0x10200145,0x10a30144,0x10260145,
+	0x10aa0144,0x102c0145,0x10b10144,0x10330145,0x10b80144,0x10390145,0x109c0144,0xc948,
+	0x10200145,0x10a30144,0xc948,0x10260145,0x10aa0144,0xc948,0x102c0145,0x10b10144,
+	0xc948,0x10330145,0x10b80144,0xc948,0x10390145,0x109c0144,0xca08,0x10200145,
+	0x10a30144,0xca08,0x10260145,0x10aa0144,0xca08,0x102c0145,0x10b10144,0xca08,
+	0x10330145,0x10b80144,0xca08,0x10390145,0x10bf0144,0x10200145,0x10c20144,0x10260145,
+	0x10c50144,0x102c0145,0x10c80144,0x10330145,0x10cb0144,0x10390145,0x10ce0144,0x10200145,
+	0x10d40144,0x102c0145,0x10da0144,0x10390145,0x10e00144,0x10200145,0x10e30144,0x10260145,
+	0x10e60144,0x102c0145,0x10e90144,0x10330145,0x10ec0144,0x10390145,0x10ef0144,0x10200145,
+	0x10f40144,0x10260145,0x10f60144,0x10330145,0x10f80144,0x10390145,0x10ef0144,0xc948,
+	0x10200145,0x10f40144,0xc948,0x10260145,0x102c0144,0xc948,0x102c0145,0x10f60144,
+	0xc948,0x10330145,0x10f80144,0xc948,0x10390145,0x103f013c,0x1020013d,0x1044013c,
+	0x1026013d,0x1049013c,0x102c013d,0x104e013c,0x1033013d,0x1053013c,0x1039013d,0x103f013c,
+	0xc948,0x1020013d,0x1044013c,0xc948,0x1026013d,0x1049013c,0xc948,0x102c013d,
+	0x104e013c,0xc948,0x1033013d,0x1053013c,0xc948,0x1039013d,0x1058013c,0x1020013d,
+	0x105d013c,0x1026013d,0x1062013c,0x102c013d,0x1067013c,0x1033013d,0x106c013c,0x1039013d,
+	0x1058013c,0xc948,0x1020013d,0x105d013c,0xc948,0x1026013d,0x1062013c,0xc948,
+	0x102c013d,0x1067013c,0xc948,0x1033013d,0x106c013c,0xc948,0x1039013d,0x1071013c,
+	0x1020013d,0x1076013c,0x1026013d,0x107b013c,0x102c013d,0x1083013c,0x1033013d,0x1088013c,
+	0x1039013d,0x1071013c,0xc948,0x1020013d,0x1076013c,0xc948,0x1026013d,0x107b013c,
+	0xc948,0x102c013d,0x1083013c,0xc948,0x1033013d,0x1088013c,0xc948,0x1039013d,
+	0x108d013c,0x1020013d,0x1090013c,0x1026013d,0x1093013c,0x102c013d,0x1096013c,0x1033013d,
+	0x1099013c,0x1039013d,0x109c013c,0x1020013d,0x10a3013c,0x1026013d,0x10aa013c,0x102c013d,
+	0x10b1013c,0x1033013d,0x10b8013c,0x1039013d,0x109c013c,0xc948,0x1020013d,0x10a3013c,
+	0xc948,0x1026013d,0x10aa013c,0xc948,0x102c013d,0x10b1013c,0xc948,0x1033013d,
+	0x10b8013c,0xc948,0x1039013d,0x109c013c,0xca48,0x1020013d,0x10a3013c,0xca48,
+	0x1026013d,0x10aa013c,0xca48,0x102c013d,0x10b1013c,0xca48,0x1033013d,0x10b8013c,
+	0xca48,0x1039013d,0x10bf013c,0x1020013d,0x10c2013c,0x1026013d,0x10c5013c,0x102c013d,
+	0x10c8013c,0x1033013d,0x10cb013c,0x1039013d,0x10ce013c,0x1020013d,0x10d4013c,0x102c013d,
+	0x10da013c,0x1039013d,0x10e0013c,0x1020013d,0x10e3013c,0x1026013d,0x10e6013c,0x102c013d,
+	0x10e9013c,0x1033013d,0x10ec013c,0x1039013d,0x10ef013c,0x1020013d,0x10ef013c,0xc948,
+	0x1020013d,0xca09,0x2010f,0x20113,0x4010b,0x4010f,0x5010b,0x5010f,
+	0x8010b,0x8010f,0xa010f,0xa014b,0xc010b,0xc010f,0xe010b,0xe010f,
+	0xe013f,0x10010b,0x10010f,0x12010b,0x12010f,0x14c90b,0x14c90f,0x16ca0b,
+	0x16ca0f,0x17010b,0x18030f,0x1a060b,0x1a060f,0x1c160f,0x1e0d0b,0x1e0d0f,
+	0x20290f,0x22020b,0x22020f,0x24010d,0x28010d,0x2c010d,0x2e010d,0x30010d,
+	0x32010d,0x34010d,0x36010b,0x36010f,0x38010f,0x3a010f,0x3c0109,0x3c010d,
+	0x3e0109,0x3e010d,0x40010d,0x400109,0x42010d,0x440109,0x44010d,0x46010d,
+	0x48010d,0x4a010f,0x4c010f,0x4e010b,0x4f010b,0x50010b,0x50010f,0x52010b,
+	0x52010f,0x54010b,0x56010b,0x58010b,0x58010f,0x5a010b,0x5a010f,0x5c010b,
+	0x5c010f,0x5e010b,0x5e010f,0x60010b,0x62010b,0x64010b,0x66010b,0x68010f,
+	0x68010b,0x6a010f,0x6a010b,0x6c010b,0x6e010b,0x6f010b,0x70010b,0x72010b,
+	0x72010f,0x74010b,0x74010f,0x76010f,0x78010f,0x7a010f,0x7c010b,0x7c010f,
+	0x80010b,0x80010f,0x82010b,0x82010f,0x84010f,0x86010f,0x88010f,0x8a010f,
+	0x8c010b,0x8e010f,0x90010f,0x92010f,0x94010d,0x960109,0x96010d,0x980109,
+	0x98010d,0x9a010d,0x9c0109,0x9c010d,0x9e010b,0x9e010f,0x100010b,0x100010f,
+	0x102010b,0x102010f,0x104010b,0x104010f,0x106010b,0x106010f,0x107010f,0x108010f,
+	0x109010f,0x10a010f,0x10b010f,0x10c010f,0x10d010f,0x10e010f,0x10f010f,0x110010f,
+	0x111010f,0x112010f,0x113010f,0x114010f,0x115010f,0x116010f,0x117010f,0x118010f,
+	0x119010f,0x11a010f,0x11b010f,0x11c010f,0x11d010f,0x11e010f,0x11f010f,0x120010f,
+	0x121010f,0x122010f,0x123010f,0x124010f,0x125010f,0x126010f,0x127010f,0x128010f,
+	0x129010f,0x12a010f,0x12b010f,0x12c010f,0x12d010f,0x12e010f,0x12f010f,0x130010f,
+	0x131010f,0x132010f,0x133010f,0x134010f,0x135010f,0x136010f,0x137010f,0x138010f,
+	0x139010f,0x13b010f,0x13c010d,0x13d010d,0x13e010f,0x13f010f,0x140010f,0x141010f,
+	0x142010f,0x143010d,0x144010d,0x145010d,0x146010d,0x147010d,0x148010d,0x149010d,
+	0x14a010d,0x14b010d,0x14c010d,0x14d010d,0x14e010d,0x14f010d,0x150010d,0x151010d,
+	0x152010d,0x153010d,0x154010d,0x155010d,0x156010d,0x157010d,0x158010d,0x159010d,
+	0x15a010d,0x15b010d,0x15c010d,0x15d010d,0x15e010d,0x15f010d,0x160010f,0x161010f,
+	0x162010f,0x163010f,0x164010f,0x165010f,0x166010f,0x167010f,0x168010f,0x169010f,
+	0x16a010f,0x16b010f,0x16c010f,0x16d010f,0x16e010f,0x16f010f,0x170010f,0x171010f,
+	0x172010f,0x174010f,0x175010f,0x176010f,0x177010f,0x178010f,0x179010f,0x17a010d,
+	0x17b010d,0x17c010d,0x17d0119,0x17e0119,0x17f0119,0x1800119,0x1810119,0x182010d,
+	0x183010d,0x184010d,0x185010d,0x186010d,0x187010d,0x189010f,0x18a010f,0x18b010f,
+	0x18c010f,0x18d0111,0x18e0111,0x18f0111,0x1900111,0x1910111,0x1920111,0x1930111,
+	0x1940111,0x1950111,0x1960111,0x197010f,0x198010f,0x199010b,0x199010f,0x6c50109,
+	0x6c60109,0x6c70109,0x6c80109,0x6c90109,0x6ca0109,0x6cb0109,0x6cc0109,0x6cd0109,
+	0x6ce0109,0x6cf0109,0x6cf010d,0x6cf0121,0x6cf0125,0x6e30109,0x6e3010d,0x6e30121,
+	0x6e30125,0x6fb0109,0x6fb010d,0x6fb0121,0x6fb0125,0x7070109,0x707010d,0x7070121,
+	0x7070125,0x72f0109,0x72f010d,0x72f0121,0x72f0125,0x75b0109,0x75b010d,0x75b0121,
+	0x75b0125,0x7630109,0x763010d,0x7630121,0x7630125,0x7830109,0x783010d,0x7830121,
+	0x7830125,0x79d0109,0x79d010d,0x79d0121,0x79d0125,0x7b10109,0x7b1010d,0x7b10121,
+	0x7b10125,0x7c10109,0x7c1010d,0x7c10121,0x7c10125,0x7cd0109,0x7cd010d,0x7cd0121,
+	0x7cd0125,0x7f50109,0x7f5010d,0x7f50121,0x7f50125,0x7fd0109,0x7fd010d,0x7fd0121,
+	0x7fd0125,0x8150109,0x815010d,0x8150121,0x8150125,0x82d0109,0x82d010d,0x82d0121,
+	0x82d0125,0x8390109,0x839010d,0x8390121,0x8390125,0x8450109,0x845010d,0x8450121,
+	0x8450125,0x86d0109,0x86d010d,0x86d0121,0x86d0125,0x8890109,0x889010d,0x8890121,
+	0x8890125,0x8ad0109,0x8ad010d,0x8ad0121,0x8ad0125,0x8c50109,0x8c5010d,0x8c50121,
+	0x8c50125,0x8d10109,0x8d1010d,0x8d10121,0x8d10125,0x8d90109,0x8d9010d,0x8d90121,
+	0x8d90125,0x8dd0109,0x8dd010d,0x8dd0121,0x8dd0125,0x8e90109,0x8e9010d,0x8e90121,
+	0x8e90125,0x10200139,0x10200149,0x10200141,0x10260139,0x10260149,0x10260141,0x102c0139,
+	0x102c0149,0x102c0141,0x10330139,0x10330149,0x10330141,0x10390139,0x10390149,0x10390141,
+	0x103f0135,0x103f0145,0x103f013d,0x10440135,0x10440145,0x1044013d,0x10490135,0x10490145,
+	0x1049013d,0x104e0135,0x104e0145,0x104e013d,0x10530135,0x10530145,0x1053013d,0x10580135,
+	0x10580145,0x1058013d,0x105d0135,0x105d0145,0x105d013d,0x10620135,0x10620145,0x1062013d,
+	0x10670135,0x10670145,0x1067013d,0x106c0135,0x106c0145,0x106c013d,0x10710135,0x10710145,
+	0x1071013d,0x10760135,0x10760145,0x1076013d,0x107b0139,0x107b0135,0x107b0149,0x107b0141,
+	0x107b0145,0x107b013d,0x10830135,0x10830145,0x1083013d,0x10880135,0x10880145,0x1088013d,
+	0x108d0135,0x108d0145,0x108d013d,0x10900135,0x10900145,0x1090013d,0x10930135,0x10930145,
+	0x1093013d,0x10960135,0x10960145,0x1096013d,0x10990135,0x10990145,0x1099013d,0x109c0135,
+	0x109c0145,0x109c013d,0x10a30135,0x10a30145,0x10a3013d,0x10aa0135,0x10aa0145,0x10aa013d,
+	0x10b10135,0x10b10145,0x10b1013d,0x10b80135,0x10b80145,0x10b8013d,0x10bf0135,0x10bf0145,
+	0x10bf013d,0x10c20135,0x10c20145,0x10c2013d,0x10c50135,0x10c50145,0x10c5013d,0x10c80135,
+	0x10c80145,0x10c8013d,0x10cb0135,0x10cb0145,0x10cb013d,0x10ce0139,0x10ce0135,0x10ce0149,
+	0x10ce0141,0x10ce0145,0x10ce013d,0x10d40139,0x10d40135,0x10d40149,0x10d40141,0x10d40145,
+	0x10d4013d,0x10da0139,0x10da0135,0x10da0149,0x10da0141,0x10da0145,0x10da013d,0x10e00135,
+	0x10e00145,0x10e0013d,0x10e30135,0x10e30145,0x10e3013d,0x10e60135,0x10e60145,0x10e6013d,
+	0x10e90135,0x10e90145,0x10e9013d,0x10ec0135,0x10ec0145,0x10ec013d,0x10ef0139,0x10ef0135,
+	0x10ef0149,0x10ef0145,0x10ef013d,0x10f40135,0x10f40145,0x10f60135,0x10f60145,0x10f80135,
+	0x10f80145,0x10f8013d,0x10fb0135,0x10fb0145,
+	};
+
+static const TUint32 TheKanaIndex[] = 
+	{
+	0x210233,0x22032d,0x230296,0x24028f,0x250294,0x260298,0x270239,0x28025d,
+	0x29025f,0x2a029a,0x2b0277,0x2c0226,0x2d0279,0x2e0228,0x2f024e,0x30032f,
+	0x310330,0x320331,0x330332,0x340333,0x350334,0x360335,0x370336,0x380337,
+	0x390338,0x3a022c,0x3b022e,0x3c0280,0x3d027e,0x3e0282,0x3f0231,0x40029c,
+	0x41033b,0x42033f,0x430343,0x440347,0x45034b,0x46034f,0x470353,0x480357,
+	0x49035b,0x4a035f,0x4b0363,0x4c0367,0x4d036b,0x4e036f,0x4f0373,0x500377,
+	0x51037b,0x52037f,0x530383,0x540387,0x55038b,0x56038f,0x570393,0x580397,
+	0x59039b,0x5a039f,0x5b0263,0x5c0250,0x5d0265,0x5e023e,0x5f0241,0x60023b,
+	0x610339,0x62033d,0x630341,0x640345,0x650349,0x66034d,0x670351,0x680355,
+	0x690359,0x6a035d,0x6b0361,0x6c0365,0x6d0369,0x6e036d,0x6f0371,0x700375,
+	0x710379,0x72037d,0x730381,0x740385,0x750389,0x76038d,0x770391,0x780395,
+	0x790399,0x7a039d,0x7b0267,0x7c0255,0x7d0269,0x7e0253,0xa20291,0xa30292,
+	0xa5028d,0xa7029e,0xa8023d,0xb00289,0xb1027b,0xb4023a,0xb602d7,0xd7027c,
+	0xf7027d,0x2010024d,0x2015024c,0x20180259,0x2019025a,0x201c025b,0x201d025c,0x202002d5,
+	0x202102d6,0x20250258,0x20260257,0x203002d1,0x2032028a,0x2033028b,0x203b02ac,0x2103028c,
+	0x2116030f,0x21210311,0x216002ec,0x216102ed,0x216202ee,0x216302ef,0x216402f0,0x216502f1,
+	0x216602f2,0x216702f3,0x216802f4,0x216902f5,0x21700321,0x21710322,0x21720323,0x21730324,
+	0x21740325,0x21750326,0x21760327,0x21770328,0x21780329,0x2179032a,0x219002af,0x219102b0,
+	0x219202ae,0x219302b1,0x21d202be,0x21d402bf,0x220002c0,0x220202c5,0x220302c1,0x220702c6,
+	0x220802b3,0x220b02b4,0x2211031e,0x2212027a,0x221a02cb,0x221d02cd,0x221e0286,0x221f031f,
+	0x222002c2,0x22250254,0x222702bb,0x222802bc,0x222902ba,0x222a02b9,0x222b02cf,0x222c02d0,
+	0x222e031d,0x22340286,0x223502ce,0x223d02cc,0x225202c8,0x226102c7,0x22660284,0x22670285,
+	0x226a02c9,0x226b02ca,0x228202b7,0x228302b8,0x228602b5,0x228702b6,0x22a502c3,0x22bf0320,
+	0x231202c4,0x246002d9,0x246102da,0x246202db,0x246302dc,0x246402dd,0x246502de,0x246602df,
+	0x246702e0,0x246802e1,0x246902e2,0x246a02e3,0x246b02e3,0x246c02e4,0x246d02e5,0x246e02e6,
+	0x246f02e7,0x247002e8,0x247102e9,0x247202ea,0x247302eb,0x25a002a7,0x25a102a6,0x25b202a9,
+	0x25b302a8,0x25bc02ab,0x25bd02aa,0x25c602a5,0x25c702a4,0x25cb02a1,0x25ce02a3,0x25cf02a2,
+	0x25ef02d8,0x260502a0,0x2606029f,0x26400288,0x26420287,0x266a02d4,0x266d02d3,0x266f02d2,
+	0x30010223,0x30020225,0x30030245,0x30050247,0x30060248,0x30070249,0x3008026b,0x3009026c,
+	0x300a026d,0x300b026e,0x300c026f,0x300d0271,0x300e0273,0x300f0274,0x30100275,0x30110276,
+	0x301202ad,0x301302b2,0x30140261,0x30150262,0x301c0252,0x301d030d,0x301f030e,0x304103a1,
+	0x304200d6,0x304303a4,0x304400ce,0x304503a7,0x304600d0,0x304703aa,0x304800d2,0x304903ad,
+	0x304a00d4,0x304b03b0,0x304d03b3,0x304f03b6,0x305103b9,0x305303bc,0x305503bf,0x305703c2,
+	0x305903c5,0x305b03c8,0x305d03cb,0x305f03ce,0x306103d1,0x306303d4,0x306403d5,0x306603da,
+	0x306803dd,0x306a03e0,0x306b03e3,0x306c03e6,0x306d03e9,0x306e03ec,0x306f03ef,0x307203f2,
+	0x307503f5,0x307803f8,0x307b03fb,0x307e03fe,0x307f0401,0x30800404,0x30810407,0x3082040a,
+	0x3083040d,0x3084040e,0x30850413,0x30860414,0x30870419,0x3088041a,0x3089041f,0x308a0422,
+	0x308b0425,0x308c0428,0x308d042b,0x308e042e,0x308f042f,0x30900433,0x30910435,0x30920437,
+	0x3093043a,0x30990029,0x309a0221,0x309b0236,0x309c0238,0x309d0244,0x30a103a2,0x30a20178,
+	0x30a303a5,0x30a4017b,0x30a503a8,0x30a6017e,0x30a703ab,0x30a80181,0x30a903ae,0x30aa0184,
+	0x30ab03b1,0x30ad03b4,0x30af03b7,0x30b103ba,0x30b303bd,0x30b503c0,0x30b703c3,0x30b903c6,
+	0x30bb03c9,0x30bd03cc,0x30bf03cf,0x30c103d2,0x30c303d6,0x30c403d8,0x30c603db,0x30c803de,
+	0x30ca03e1,0x30cb03e4,0x30cc03e7,0x30cd03ea,0x30ce03ed,0x30cf03f0,0x30d203f3,0x30d503f6,
+	0x30d803f9,0x30db03fc,0x30de03ff,0x30df0402,0x30e00405,0x30e10408,0x30e2040b,0x30e3040f,
+	0x30e40411,0x30e50415,0x30e60417,0x30e7041b,0x30e8041d,0x30e90420,0x30ea0423,0x30eb0426,
+	0x30ec0429,0x30ed042c,0x30ee0430,0x30ef0431,0x30f00434,0x30f10436,0x30f20438,0x30f3043b,
+	0x30fb022a,0x30fc024b,0x30fd0243,0x32310317,0x32320318,0x32390319,0x32a40312,0x32a50313,
+	0x32a60314,0x32a70315,0x32a80316,0x330302fc,0x330d0300,0x331402f7,0x331802fa,0x332202f8,
+	0x33230302,0x33260301,0x332702fb,0x332b0303,0x333602fd,0x333b0305,0x334902f6,0x334a0304,
+	0x334d02f9,0x335102fe,0x335702ff,0x337b030c,0x337c031c,0x337d031b,0x337e031a,0x338f0309,
+	0x339c0306,0x339d0307,0x339e0308,0x33a1030b,0x33c4030a,0x33cd0310,0x4edd0246,0xfe540230,
+	0xff010234,0xff02032e,0xff030297,0xff040290,0xff050295,0xff060299,0xff07032c,0xff08025e,
+	0xff090260,0xff0a029b,0xff0b0278,0xff0c0227,0xff0d027a,0xff0e0229,0xff0f024f,0xff1a022d,
+	0xff1b022f,0xff1c0281,0xff1d027f,0xff1e0283,0xff1f0232,0xff20029d,0xff21033c,0xff220340,
+	0xff230344,0xff240348,0xff25034c,0xff260350,0xff270354,0xff280358,0xff29035c,0xff2a0360,
+	0xff2b0364,0xff2c0368,0xff2d036c,0xff2e0370,0xff2f0374,0xff300378,0xff31037c,0xff320380,
+	0xff330384,0xff340388,0xff35038c,0xff360390,0xff370394,0xff380398,0xff39039c,0xff3a03a0,
+	0xff3b0264,0xff3c0251,0xff3d0266,0xff3e023f,0xff3f0242,0xff40023c,0xff41033a,0xff42033e,
+	0xff430342,0xff440346,0xff45034a,0xff46034e,0xff470352,0xff480356,0xff49035a,0xff4a035e,
+	0xff4b0362,0xff4c0366,0xff4d036a,0xff4e036e,0xff4f0372,0xff500376,0xff51037a,0xff52037e,
+	0xff530382,0xff540386,0xff55038a,0xff56038e,0xff570392,0xff580396,0xff59039a,0xff5a039e,
+	0xff5b0268,0xff5c0256,0xff5d026a,0xff5e0252,0xff610224,0xff620270,0xff630272,0xff640222,
+	0xff65022b,0xff660439,0xff6703a3,0xff6803a6,0xff6903a9,0xff6a03ac,0xff6b03af,0xff6c0410,
+	0xff6d0416,0xff6e041c,0xff6f03d7,0xff70024a,0xff710220,0xff720215,0xff730217,0xff740219,
+	0xff75021b,0xff7603b2,0xff7703b5,0xff7803b8,0xff7903bb,0xff7a03be,0xff7b03c1,0xff7c03c4,
+	0xff7d03c7,0xff7e03ca,0xff7f03cd,0xff8003d0,0xff8103d3,0xff8203d9,0xff8303dc,0xff8403df,
+	0xff8503e2,0xff8603e5,0xff8703e8,0xff8803eb,0xff8903ee,0xff8a03f1,0xff8b03f4,0xff8c03f7,
+	0xff8d03fa,0xff8e03fd,0xff8f0400,0xff900403,0xff910406,0xff920409,0xff93040c,0xff940412,
+	0xff950418,0xff96041e,0xff970421,0xff980424,0xff990427,0xff9a042a,0xff9b042d,0xff9c0432,
+	0xff9e0235,0xff9f0237,0xffe00291,0xffe10293,0xffe202bd,0xffe30240,0xffe4032b,0xffe5028e,
+	};
+
+static const TUint16 TheKanaStringElement[] = 
+	{
+	0x2,0xff73,0xff9e,0x2,0xff76,0xff9e,0x2,0xff77,
+	0xff9e,0x2,0xff78,0xff9e,0x2,0xff79,0xff9e,0x2,
+	0xff7a,0xff9e,0x2,0xff7b,0xff9e,0x2,0xff7c,0xff9e,
+	0x2,0xff7d,0xff9e,0x2,0xff7e,0xff9e,0x2,0xff7f,
+	0xff9e,0x2,0xff80,0xff9e,0x2,0xff81,0xff9e,0x2,
+	0xff82,0xff9e,0x2,0xff83,0xff9e,0x2,0xff84,0xff9e,
+	0x2,0xff8a,0xff9e,0x2,0xff8b,0xff9e,0x2,0xff8c,
+	0xff9e,0x2,0xff8d,0xff9e,0x2,0xff8e,0xff9e,0x2,
+	0xff8a,0xff9f,0x2,0xff8b,0xff9f,0x2,0xff8c,0xff9f,
+	0x2,0xff8d,0xff9f,0x2,0xff8e,0xff9f,0x2,0x3042,
+	0x30fc,0x2,0x3044,0x30fc,0x2,0x3046,0x30fc,0x2,
+	0x3048,0x30fc,0x2,0x304a,0x30fc,0x2,0x304b,0x30fc,
+	0x2,0x304d,0x30fc,0x2,0x304f,0x30fc,0x2,0x3051,
+	0x30fc,0x2,0x3053,0x30fc,0x3,0x304b,0x3099,0x30fc,
+	0x3,0x304d,0x3099,0x30fc,0x3,0x304f,0x3099,0x30fc,
+	0x3,0x3051,0x3099,0x30fc,0x3,0x3053,0x3099,0x30fc,
+	0x2,0x3055,0x30fc,0x2,0x3057,0x30fc,0x2,0x3059,
+	0x30fc,0x2,0x305b,0x30fc,0x2,0x305d,0x30fc,0x3,
+	0x3055,0x3099,0x30fc,0x3,0x3057,0x3099,0x30fc,0x3,
+	0x3059,0x3099,0x30fc,0x3,0x305b,0x3099,0x30fc,0x3,
+	0x305d,0x3099,0x30fc,0x2,0x305f,0x30fc,0x2,0x3061,
+	0x30fc,0x2,0x3064,0x30fc,0x2,0x3066,0x30fc,0x2,
+	0x3068,0x30fc,0x3,0x305f,0x3099,0x30fc,0x3,0x3061,
+	0x3099,0x30fc,0x3,0x3064,0x3099,0x30fc,0x3,0x3066,
+	0x3099,0x30fc,0x3,0x3068,0x3099,0x30fc,0x2,0x306a,
+	0x30fc,0x2,0x306b,0x30fc,0x2,0x306c,0x30fc,0x2,
+	0x306d,0x30fc,0x2,0x306e,0x30fc,0x2,0x306f,0x30fc,
+	0x2,0x3072,0x30fc,0x2,0x3075,0x30fc,0x2,0x3078,
+	0x30fc,0x2,0x307b,0x30fc,0x3,0x306f,0x3099,0x30fc,
+	0x3,0x3072,0x3099,0x30fc,0x3,0x3075,0x3099,0x30fc,
+	0x3,0x3078,0x3099,0x30fc,0x3,0x307b,0x3099,0x30fc,
+	0x3,0x306f,0x309a,0x30fc,0x3,0x3072,0x309a,0x30fc,
+	0x3,0x3075,0x309a,0x30fc,0x3,0x3078,0x309a,0x30fc,
+	0x3,0x307b,0x309a,0x30fc,0x2,0x307e,0x30fc,0x2,
+	0x307f,0x30fc,0x2,0x3080,0x30fc,0x2,0x3081,0x30fc,
+	0x2,0x3082,0x30fc,0x2,0x3084,0x30fc,0x2,0x3086,
+	0x30fc,0x2,0x3088,0x30fc,0x2,0x3089,0x30fc,0x2,
+	0x308a,0x30fc,0x2,0x308b,0x30fc,0x2,0x308c,0x30fc,
+	0x2,0x308d,0x30fc,0x2,0x308f,0x30fc,0x2,0x30ab,
+	0x30fc,0x2,0x30ad,0x30fc,0x2,0x30af,0x30fc,0x2,
+	0x30b1,0x30fc,0x2,0x30b3,0x30fc,0x3,0x30ab,0x3099,
+	0x30fc,0x3,0x30ad,0x3099,0x30fc,0x3,0x30af,0x3099,
+	0x30fc,0x3,0x30b1,0x3099,0x30fc,0x3,0x30b3,0x3099,
+	0x30fc,0x2,0x30b5,0x30fc,0x2,0x30b7,0x30fc,0x2,
+	0x30b9,0x30fc,0x2,0x30bb,0x30fc,0x2,0x30bd,0x30fc,
+	0x3,0x30b5,0x3099,0x30fc,0x3,0x30b7,0x3099,0x30fc,
+	0x3,0x30b9,0x3099,0x30fc,0x3,0x30bb,0x3099,0x30fc,
+	0x3,0x30bd,0x3099,0x30fc,0x2,0x30bf,0x30fc,0x2,
+	0x30c1,0x30fc,0x2,0x30c4,0x30fc,0x2,0x30c6,0x30fc,
+	0x2,0x30c8,0x30fc,0x3,0x30bf,0x3099,0x30fc,0x3,
+	0x30c1,0x3099,0x30fc,0x3,0x30c4,0x3099,0x30fc,0x3,
+	0x30c6,0x3099,0x30fc,0x3,0x30c8,0x3099,0x30fc,0x2,
+	0x30ca,0x30fc,0x2,0x30cb,0x30fc,0x2,0x30cc,0x30fc,
+	0x2,0x30cd,0x30fc,0x2,0x30ce,0x30fc,0x2,0x30cf,
+	0x30fc,0x2,0x30d2,0x30fc,0x2,0x30d5,0x30fc,0x2,
+	0x30d8,0x30fc,0x2,0x30db,0x30fc,0x3,0x30cf,0x3099,
+	0x30fc,0x3,0x30d2,0x3099,0x30fc,0x3,0x30d5,0x3099,
+	0x30fc,0x3,0x30d8,0x3099,0x30fc,0x3,0x30db,0x3099,
+	0x30fc,0x3,0x30cf,0x309a,0x30fc,0x3,0x30d2,0x309a,
+	0x30fc,0x3,0x30d5,0x309a,0x30fc,0x3,0x30d8,0x309a,
+	0x30fc,0x3,0x30db,0x309a,0x30fc,0x2,0x30de,0x30fc,
+	0x2,0x30df,0x30fc,0x2,0x30e0,0x30fc,0x2,0x30e1,
+	0x30fc,0x2,0x30e2,0x30fc,0x2,0x30e4,0x30fc,0x2,
+	0x30e6,0x30fc,0x2,0x30e8,0x30fc,0x2,0x30e9,0x30fc,
+	0x2,0x30ea,0x30fc,0x2,0x30eb,0x30fc,0x2,0x30ec,
+	0x30fc,0x2,0x30ed,0x30fc,0x2,0x30ef,0x30fc,0x2,
+	0x30f0,0x30fc,0x2,0x30f1,0x30fc,0x2,0x30f2,0x30fc,
+	0x3,0x30ef,0x3099,0x30fc,0x3,0x30f0,0x3099,0x30fc,
+	0x3,0x30ef,0x3099,0x30fc,0x3,0x30f1,0x3099,0x30fc,
+	0x3,0x30f2,0x3099,0x30fc,0x2,0xff76,0xff70,0x2,
+	0xff77,0xff70,0x2,0xff78,0xff70,0x2,0xff79,0xff70,
+	0x2,0xff7a,0xff70,0x3,0xff76,0xff9e,0xff70,0x3,
+	0xff77,0xff9e,0xff70,0x3,0xff78,0xff9e,0xff70,0x3,
+	0xff79,0xff9e,0xff70,0x3,0xff7a,0xff9e,0xff70,0x2,
+	0xff7b,0xff70,0x2,0xff7c,0xff70,0x2,0xff7d,0xff70,
+	0x2,0xff7e,0xff70,0x2,0xff7f,0xff70,0x3,0xff7b,
+	0xff9e,0xff70,0x3,0xff7c,0xff9e,0xff70,0x3,0xff7d,
+	0xff9e,0xff70,0x3,0xff7e,0xff9e,0xff70,0x3,0xff7f,
+	0xff9e,0xff70,0x2,0xff80,0xff70,0x2,0xff81,0xff70,
+	0x2,0xff82,0xff70,0x2,0xff83,0xff70,0x2,0xff84,
+	0xff70,0x3,0xff80,0xff9e,0xff70,0x3,0xff81,0xff9e,
+	0xff70,0x3,0xff82,0xff9e,0xff70,0x3,0xff83,0xff9e,
+	0xff70,0x3,0xff84,0xff9e,0xff70,0x2,0xff85,0xff70,
+	0x2,0xff86,0xff70,0x2,0xff87,0xff70,0x2,0xff88,
+	0xff70,0x2,0xff89,0xff70,0x2,0xff8a,0xff70,0x2,
+	0xff8b,0xff70,0x2,0xff8c,0xff70,0x2,0xff8d,0xff70,
+	0x2,0xff8e,0xff70,0x3,0xff8a,0xff9e,0xff70,0x3,
+	0xff8b,0xff9e,0xff70,0x3,0xff8c,0xff9e,0xff70,0x3,
+	0xff8d,0xff9e,0xff70,0x3,0xff8e,0xff9e,0xff70,0x3,
+	0xff8a,0xff9f,0xff70,0x3,0xff8b,0xff9f,0xff70,0x3,
+	0xff8c,0xff9f,0xff70,0x3,0xff8d,0xff9f,0xff70,0x3,
+	0xff8e,0xff9f,0xff70,0x2,0xff8f,0xff70,0x2,0xff90,
+	0xff70,0x2,0xff91,0xff70,0x2,0xff92,0xff70,0x2,
+	0xff93,0xff70,0x2,0xff94,0xff70,0x2,0xff95,0xff70,
+	0x2,0xff96,0xff70,0x2,0xff97,0xff70,0x2,0xff98,
+	0xff70,0x2,0xff99,0xff70,0x2,0xff9a,0xff70,0x2,
+	0xff9b,0xff70,0x2,0xff9c,0xff70,0x3,0xff9c,0xff9e,
+	0xff70,
+	};
+
+static const TUint32 TheKanaStringIndex[] = 
+	{
+	0x4e0034,0x510036,0x540038,0x57003a,0x5a003c,0x6c0048,0x5d003e,0x70004b,
+	0x600040,0x74004e,0x630042,0x780051,0x660044,0x7c0054,0x690046,0x8f0061,
+	0x800057,0x930064,0x830059,0x970067,0x86005b,0x9b006a,0x89005d,0x9f006d,
+	0x8c005f,0xb2007a,0xa30070,0xb6007d,0xa60072,0xba0080,0xa90074,0xbe0083,
+	0xac0076,0xc20086,0xaf0078,0xc60089,0xc9008b,0xcc008d,0xcf008f,0xd20091,
+	0xe4009d,0xf800ac,0xd50093,0xe800a0,0xfc00af,0xd80095,0xec00a3,0x10000b2,
+	0xdb0097,0xf000a6,0x10400b5,0xde0099,0xf400a9,0x10800b8,0xe1009b,0x10c00bb,
+	0x10f00bd,0x11200bf,0x11500c1,0x11800c3,0x11b00c5,0x11e00c7,0x12100c9,0x12400cb,
+	0x12700cd,0x12a00cf,0x12d00d1,0x13000d3,0x13300d5,0x14500e1,0x13600d7,0x14900e4,
+	0x13900d9,0x14d00e7,0x13c00db,0x15100ea,0x13f00dd,0x15500ed,0x14200df,0x16800fa,
+	0x15900f0,0x16c00fd,0x15c00f2,0x1700100,0x15f00f4,0x1740103,0x16200f6,0x1780106,
+	0x16500f8,0x18b0113,0x17c0109,0x18f0116,0x17f010b,0x1930119,0x182010d,0x197011c,
+	0x185010f,0x19b011f,0x1880111,0x19f0122,0x1a20124,0x1a50126,0x1a80128,0x1ab012a,
+	0x1bd0136,0x1d10145,0x1ae012c,0x1c10139,0x1d50148,0x1b1012e,0x1c5013c,0x1d9014b,
+	0x1b40130,0x1c9013f,0x1dd014e,0x1b70132,0x1cd0142,0x1e10151,0x1ba0134,0x1e50154,
+	0x1e80156,0x1eb0158,0x1ee015a,0x1f1015c,0x1f4015e,0x1f70160,0x1fa0162,0x1fd0164,
+	0x2000166,0x2030168,0x206016a,0x209016c,0x2180176,0x220017c,0x20c016e,0x21c0179,
+	0x20f0170,0x224017f,0x2120172,0x2280182,0x2150174,0x0,0x22c0185,0x30002,
+	0x23b018f,0x22f0187,0x60004,0x23f0192,0x2320189,0x90006,0x2430195,0x235018b,
+	0xc0008,0x2470198,0x238018d,0xf000a,0x24b019b,0x24f019e,0x12000c,0x25e01a8,
+	0x25201a0,0x15000e,0x26201ab,0x25501a2,0x180010,0x26601ae,0x25801a4,0x1b0012,
+	0x26a01b1,0x25b01a6,0x1e0014,0x26e01b4,0x27201b7,0x210016,0x28101c1,0x27501b9,
+	0x240018,0x28501c4,0x27801bb,0x27001a,0x28901c7,0x27b01bd,0x2a001c,0x28d01ca,
+	0x27e01bf,0x2d001e,0x29101cd,0x29501d0,0x29801d2,0x29b01d4,0x29e01d6,0x2a101d8,
+	0x2a401da,0x300020,0x2b301e4,0x3f002a,0x2c701f3,0x2a701dc,0x330022,0x2b701e7,
+	0x42002c,0x2cb01f6,0x2aa01de,0x360024,0x2bb01ea,0x45002e,0x2cf01f9,0x2ad01e0,
+	0x390026,0x2bf01ed,0x480030,0x2d301fc,0x2b001e2,0x3c0028,0x2c301f0,0x4b0032,
+	0x2d701ff,0x2db0202,0x2de0204,0x2e10206,0x2e40208,0x2e7020a,0x2ea020c,0x2ed020e,
+	0x2f00210,0x2f30212,0x2f60214,0x2f90216,0x2fc0218,0x2ff021a,0x302021c,0x305021e,
+	};
+
+static const TCollationKeyTable TheKanaTable = 
+	{ TheKanaKey, TheKanaIndex, 560, TheKanaStringElement, TheKanaStringIndex, 232 };
+
+
+static const TCollationMethod TheKanaMethod =
+	{ 0, NULL, &TheKanaTable, 0 };
+
+static const TCollationMethod TheSwapKanaMethod =
+	{ 0, NULL, &TheKanaTable, TCollationMethod::ESwapKana };
+
+// Simplified Chinese. The data is extracted from loce32\Is_unic_template_chinese_simplified.cpp
+static const TUint32 TheChineseKey[] = 
+	{
+	0x4e01001d,0x4e02001d,0x4e03001d,0x4e04001d,0x4e05001d,0x4e06001d,0x4e07001d,0x4e08001d,
+	0x4e09001d,0x4e0a001d,0x4e0b001d,0x4e0c001d,0x4e0d001d,0x4e0e001d,0x4e0f001d,0x4e10001d,
+	0x4e11001d,0x4e12001d,0x4e13001d,0x4e14001d,0x4e15001d,0x4e16001d,0x4e17001d,0x4e18001d,
+	0x4e19001d,0x4e1a001d,0x4e1b001d,0x4e1c001d,0x4e1d001d,0x4e1e001d,0x4e1f001d,0x4e20001d,
+	0x4e21001d,0x4e22001d,0x4e23001d,0x4e24001d,0x4e25001d,0x4e26001d,0x4e27001d,0x4e28001d,
+	0x4e29001d,0x4e2a001d,0x4e2b001d,0x4e2c001d,0x4e2d001d,0x4e2e001d,0x4e2f001d,0x4e30001d,
+	0x4e31001d,0x4e32001d,0x4e33001d,0x4e34001d,0x4e35001d,0x4e36001d,0x4e37001d,0x4e38001d,
+	0x4e39001d,0x4e3a001d,0x4e3b001d,0x4e3c001d,0x4e3d001d,0x4e3e001d,0x4e3f001d,0x4e40001d,
+	0x4e41001d,0x4e42001d,0x4e43001d,0x4e44001d,0x4e45001d,0x4e46001d,0x4e47001d,0x4e48001d,
+	0x4e49001d,0x4e4a001d,0x4e4b001d,0x4e4c001d,0x4e4d001d,0x4e4e001d,0x4e4f001d,0x4e50001d,
+	0x4e51001d,0x4e52001d,0x4e53001d,0x4e54001d,0x4e55001d,0x4e56001d,0x4e57001d,0x4e58001d,
+	0x4e59001d,0x4e5a001d,0x4e5b001d,0x4e5c001d,0x4e5d001d,0x4e5e001d,0x4e5f001d,0x4e60001d,
+	0x4e61001d,0x4e62001d,0x4e63001d,0x4e64001d,0x4e65001d,0x4e66001d,0x4e67001d,0x4e68001d,
+	0x4e69001d,0x4e6a001d,0x4e6b001d,0x4e6c001d,0x4e6d001d,0x4e6e001d,0x4e6f001d,0x4e70001d,
+	0x4e71001d,0x4e72001d,0x4e73001d,0x4e74001d,0x4e75001d,0x4e76001d,0x4e77001d,0x4e78001d,
+	0x4e79001d,0x4e7a001d,0x4e7b001d,0x4e7c001d,0x4e7d001d,0x4e7e001d,0x4e7f001d,0x4e80001d,
+	0x4e81001d,0x4e82001d,0x4e83001d,0x4e84001d,0x4e85001d,0x4e86001d,0x4e87001d,0x4e88001d,
+	0x4e89001d,0x4e8a001d,0x4e8b001d,0x4e8c001d,0x4e8d001d,0x4e8e001d,0x4e8f001d,0x4e90001d,
+	0x4e91001d,0x4e92001d,0x4e93001d,0x4e94001d,0x4e95001d,0x4e96001d,0x4e97001d,0x4e98001d,
+	0x4e99001d,0x4e9a001d,0x4e9b001d,0x4e9c001d,0x4e9d001d,0x4e9e001d,0x4e9f001d,0x4ea0001d,
+	0x4ea1001d,0x4ea2001d,0x4ea3001d,0x4ea4001d,0x4ea5001d,0x4ea6001d,0x4ea7001d,0x4ea8001d,
+	0x4ea9001d,0x4eaa001d,0x4eab001d,0x4eac001d,0x4ead001d,0x4eae001d,0x4eaf001d,0x4eb0001d,
+	0x4eb1001d,0x4eb2001d,0x4eb3001d,0x4eb4001d,0x4eb5001d,0x4eb6001d,0x4eb7001d,0x4eb8001d,
+	0x4eb9001d,0x4eba001d,0x4ebb001d,0x4ebc001d,0x4ebd001d,0x4ebe001d,0x4ebf001d,0x4ec0001d,
+	0x4ec1001d,0x4ec2001d,0x4ec3001d,0x4ec4001d,0x4ec5001d,0x4ec6001d,0x4ec7001d,0x4ec8001d,
+	0x4ec9001d,0x4eca001d,0x4ecb001d,0x4ecc001d,0x4ecd001d,0x4ece001d,0x4ecf001d,0x4ed0001d,
+	0x4ed1001d,0x4ed2001d,0x4ed3001d,0x4ed4001d,0x4ed5001d,0x4ed6001d,0x4ed7001d,0x4ed8001d,
+	0x4ed9001d,0x4eda001d,0x4edb001d,0x4edc001d,0x4edd001d,0x4ede001d,0x4edf001d,0x4ee0001d,
+	0x4ee1001d,0x4ee2001d,0x4ee3001d,0x4ee4001d,0x4ee5001d,0x4ee6001d,0x4ee7001d,0x4ee8001d,
+	0x4ee9001d,0x4eea001d,0x4eeb001d,0x4eec001d,0x4eed001d,0x4eee001d,0x4eef001d,0x4ef0001d,
+	0x4ef1001d,0x4ef2001d,0x4ef3001d,0x4ef4001d,0x4ef5001d,0x4ef6001d,0x4ef7001d,0x4ef8001d,
+	0x4ef9001d,0x4efa001d,0x4efb001d,0x4efc001d,0x4efd001d,0x4efe001d,0x4eff001d,0x4f00001d,
+	0x4f01001d,0x4f02001d,0x4f03001d,0x4f04001d,0x4f05001d,0x4f06001d,0x4f07001d,0x4f08001d,
+	0x4f09001d,0x4f0a001d,0x4f0b001d,0x4f0c001d,0x4f0d001d,0x4f0e001d,0x4f0f001d,0x4f10001d,
+	0x4f11001d,0x4f12001d,0x4f13001d,0x4f14001d,0x4f15001d,0x4f16001d,0x4f17001d,0x4f18001d,
+	0x4f19001d,0x4f1a001d,0x4f1b001d,0x4f1c001d,0x4f1d001d,0x4f1e001d,0x4f1f001d,0x4f20001d,
+	0x4f21001d,0x4f22001d,0x4f23001d,0x4f24001d,0x4f25001d,0x4f26001d,0x4f27001d,0x4f28001d,
+	0x4f29001d,0x4f2a001d,0x4f2b001d,0x4f2c001d,0x4f2d001d,0x4f2e001d,0x4f2f001d,0x4f30001d,
+	0x4f31001d,0x4f32001d,0x4f33001d,0x4f34001d,0x4f35001d,0x4f36001d,0x4f37001d,0x4f38001d,
+	0x4f39001d,0x4f3a001d,0x4f3b001d,0x4f3c001d,0x4f3d001d,0x4f3e001d,0x4f3f001d,0x4f40001d,
+	0x4f41001d,0x4f42001d,0x4f43001d,0x4f44001d,0x4f45001d,0x4f46001d,0x4f47001d,0x4f48001d,
+	0x4f49001d,0x4f4a001d,0x4f4b001d,0x4f4c001d,0x4f4d001d,0x4f4e001d,0x4f4f001d,0x4f50001d,
+	0x4f51001d,0x4f52001d,0x4f53001d,0x4f54001d,0x4f55001d,0x4f56001d,0x4f57001d,0x4f58001d,
+	0x4f59001d,0x4f5a001d,0x4f5b001d,0x4f5c001d,0x4f5d001d,0x4f5e001d,0x4f5f001d,0x4f60001d,
+	0x4f61001d,0x4f62001d,0x4f63001d,0x4f64001d,0x4f65001d,0x4f66001d,0x4f67001d,0x4f68001d,
+	0x4f69001d,0x4f6a001d,0x4f6b001d,0x4f6c001d,0x4f6d001d,0x4f6e001d,0x4f6f001d,0x4f70001d,
+	0x4f71001d,0x4f72001d,0x4f73001d,0x4f74001d,0x4f75001d,0x4f76001d,0x4f77001d,0x4f78001d,
+	0x4f79001d,0x4f7a001d,0x4f7b001d,0x4f7c001d,0x4f7d001d,0x4f7e001d,0x4f7f001d,0x4f80001d,
+	0x4f81001d,0x4f82001d,0x4f83001d,0x4f84001d,0x4f85001d,0x4f86001d,0x4f87001d,0x4f88001d,
+	0x4f89001d,0x4f8a001d,0x4f8b001d,0x4f8c001d,0x4f8d001d,0x4f8e001d,0x4f8f001d,0x4f90001d,
+	0x4f91001d,0x4f92001d,0x4f93001d,0x4f94001d,0x4f95001d,0x4f96001d,0x4f97001d,0x4f98001d,
+	0x4f99001d,0x4f9a001d,0x4f9b001d,0x4f9c001d,0x4f9d001d,0x4f9e001d,0x4f9f001d,0x4fa0001d,
+	0x4fa1001d,0x4fa2001d,0x4fa3001d,0x4fa4001d,0x4fa5001d,0x4fa6001d,0x4fa7001d,0x4fa8001d,
+	0x4fa9001d,0x4faa001d,0x4fab001d,0x4fac001d,0x4fad001d,0x4fae001d,0x4faf001d,0x4fb0001d,
+	0x4fb1001d,0x4fb2001d,0x4fb3001d,0x4fb4001d,0x4fb5001d,0x4fb6001d,0x4fb7001d,0x4fb8001d,
+	0x4fb9001d,0x4fba001d,0x4fbb001d,0x4fbc001d,0x4fbd001d,0x4fbe001d,0x4fbf001d,0x4fc0001d,
+	0x4fc1001d,0x4fc2001d,0x4fc3001d,0x4fc4001d,0x4fc5001d,0x4fc6001d,0x4fc7001d,0x4fc8001d,
+	0x4fc9001d,0x4fca001d,0x4fcb001d,0x4fcc001d,0x4fcd001d,0x4fce001d,0x4fcf001d,0x4fd0001d,
+	0x4fd1001d,0x4fd2001d,0x4fd3001d,0x4fd4001d,0x4fd5001d,0x4fd6001d,0x4fd7001d,0x4fd8001d,
+	0x4fd9001d,0x4fda001d,0x4fdb001d,0x4fdc001d,0x4fdd001d,0x4fde001d,0x4fdf001d,0x4fe0001d,
+	0x4fe1001d,0x4fe2001d,0x4fe3001d,0x4fe4001d,0x4fe5001d,0x4fe6001d,0x4fe7001d,0x4fe8001d,
+	0x4fe9001d,0x4fea001d,0x4feb001d,0x4fec001d,0x4fed001d,0x4fee001d,0x4fef001d,0x4ff0001d,
+	0x4ff1001d,0x4ff2001d,0x4ff3001d,0x4ff4001d,0x4ff5001d,0x4ff6001d,0x4ff7001d,0x4ff8001d,
+	0x4ff9001d,0x4ffa001d,0x4ffb001d,0x4ffc001d,0x4ffd001d,0x4ffe001d,0x4fff001d,0x5000001d,
+	0x5001001d,0x5002001d,0x5003001d,0x5004001d,0x5005001d,0x5006001d,0x5007001d,0x5008001d,
+	0x5009001d,0x500a001d,0x500b001d,0x500c001d,0x500d001d,0x500e001d,0x500f001d,0x5010001d,
+	0x5011001d,0x5012001d,0x5013001d,0x5014001d,0x5015001d,0x5016001d,0x5017001d,0x5018001d,
+	0x5019001d,0x501a001d,0x501b001d,0x501c001d,0x501d001d,0x501e001d,0x501f001d,0x5020001d,
+	0x5021001d,0x5022001d,0x5023001d,0x5024001d,0x5025001d,0x5026001d,0x5027001d,0x5028001d,
+	0x5029001d,0x502a001d,0x502b001d,0x502c001d,0x502d001d,0x502e001d,0x502f001d,0x5030001d,
+	0x5031001d,0x5032001d,0x5033001d,0x5034001d,0x5035001d,0x5036001d,0x5037001d,0x5038001d,
+	0x5039001d,0x503a001d,0x503b001d,0x503c001d,0x503d001d,0x503e001d,0x503f001d,0x5040001d,
+	0x5041001d,0x5042001d,0x5043001d,0x5044001d,0x5045001d,0x5046001d,0x5047001d,0x5048001d,
+	0x5049001d,0x504a001d,0x504b001d,0x504c001d,0x504d001d,0x504e001d,0x504f001d,0x5050001d,
+	0x5051001d,0x5052001d,0x5053001d,0x5054001d,0x5055001d,0x5056001d,0x5057001d,0x5058001d,
+	0x5059001d,0x505a001d,0x505b001d,0x505c001d,0x505d001d,0x505e001d,0x505f001d,0x5060001d,
+	0x5061001d,0x5062001d,0x5063001d,0x5064001d,0x5065001d,0x5066001d,0x5067001d,0x5068001d,
+	0x5069001d,0x506a001d,0x506b001d,0x506c001d,0x506d001d,0x506e001d,0x506f001d,0x5070001d,
+	0x5071001d,0x5072001d,0x5073001d,0x5074001d,0x5075001d,0x5076001d,0x5077001d,0x5078001d,
+	0x5079001d,0x507a001d,0x507b001d,0x507c001d,0x507d001d,0x507e001d,0x507f001d,0x5080001d,
+	0x5081001d,0x5082001d,0x5083001d,0x5084001d,0x5085001d,0x5086001d,0x5087001d,0x5088001d,
+	0x5089001d,0x508a001d,0x508b001d,0x508c001d,0x508d001d,0x508e001d,0x508f001d,0x5090001d,
+	0x5091001d,0x5092001d,0x5093001d,0x5094001d,0x5095001d,0x5096001d,0x5097001d,0x5098001d,
+	0x5099001d,0x509a001d,0x509b001d,0x509c001d,0x509d001d,0x509e001d,0x509f001d,0x50a0001d,
+	0x50a1001d,0x50a2001d,0x50a3001d,0x50a4001d,0x50a5001d,0x50a6001d,0x50a7001d,0x50a8001d,
+	0x50a9001d,0x50aa001d,0x50ab001d,0x50ac001d,0x50ad001d,0x50ae001d,0x50af001d,0x50b0001d,
+	0x50b1001d,0x50b2001d,0x50b3001d,0x50b4001d,0x50b5001d,0x50b6001d,0x50b7001d,0x50b8001d,
+	0x50b9001d,0x50ba001d,0x50bb001d,0x50bc001d,0x50bd001d,0x50be001d,0x50bf001d,0x50c0001d,
+	0x50c1001d,0x50c2001d,0x50c3001d,0x50c4001d,0x50c5001d,0x50c6001d,0x50c7001d,0x50c8001d,
+	0x50c9001d,0x50ca001d,0x50cb001d,0x50cc001d,0x50cd001d,0x50ce001d,0x50cf001d,0x50d0001d,
+	0x50d1001d,0x50d2001d,0x50d3001d,0x50d4001d,0x50d5001d,0x50d6001d,0x50d7001d,0x50d8001d,
+	0x50d9001d,0x50da001d,0x50db001d,0x50dc001d,0x50dd001d,0x50de001d,0x50df001d,0x50e0001d,
+	0x50e1001d,0x50e2001d,0x50e3001d,0x50e4001d,0x50e5001d,0x50e6001d,0x50e7001d,0x50e8001d,
+	0x50e9001d,0x50ea001d,0x50eb001d,0x50ec001d,0x50ed001d,0x50ee001d,0x50ef001d,0x50f0001d,
+	0x50f1001d,0x50f2001d,0x50f3001d,0x50f4001d,0x50f5001d,0x50f6001d,0x50f7001d,0x50f8001d,
+	0x50f9001d,0x50fa001d,0x50fb001d,0x50fc001d,0x50fd001d,0x50fe001d,0x50ff001d,0x5100001d,
+	0x5101001d,0x5102001d,0x5103001d,0x5104001d,0x5105001d,0x5106001d,0x5107001d,0x5108001d,
+	0x5109001d,0x510a001d,0x510b001d,0x510c001d,0x510d001d,0x510e001d,0x510f001d,0x5110001d,
+	0x5111001d,0x5112001d,0x5113001d,0x5114001d,0x5115001d,0x5116001d,0x5117001d,0x5118001d,
+	0x5119001d,0x511a001d,0x511b001d,0x511c001d,0x511d001d,0x511e001d,0x511f001d,0x5120001d,
+	0x5121001d,0x5122001d,0x5123001d,0x5124001d,0x5125001d,0x5126001d,0x5127001d,0x5128001d,
+	0x5129001d,0x512a001d,0x512b001d,0x512c001d,0x512d001d,0x512e001d,0x512f001d,0x5130001d,
+	0x5131001d,0x5132001d,0x5133001d,0x5134001d,0x5135001d,0x5136001d,0x5137001d,0x5138001d,
+	0x5139001d,0x513a001d,0x513b001d,0x513c001d,0x513d001d,0x513e001d,0x513f001d,0x5140001d,
+	0x5141001d,0x5142001d,0x5143001d,0x5144001d,0x5145001d,0x5146001d,0x5147001d,0x5148001d,
+	0x5149001d,0x514a001d,0x514b001d,0x514c001d,0x514d001d,0x514e001d,0x514f001d,0x5150001d,
+	0x5151001d,0x5152001d,0x5153001d,0x5154001d,0x5155001d,0x5156001d,0x5157001d,0x5158001d,
+	0x5159001d,0x515a001d,0x515b001d,0x515c001d,0x515d001d,0x515e001d,0x515f001d,0x5160001d,
+	0x5161001d,0x5162001d,0x5163001d,0x5164001d,0x5165001d,0x5166001d,0x5167001d,0x5168001d,
+	0x5169001d,0x516a001d,0x516b001d,0x516c001d,0x516d001d,0x516e001d,0x516f001d,0x5170001d,
+	0x5171001d,0x5172001d,0x5173001d,0x5174001d,0x5175001d,0x5176001d,0x5177001d,0x5178001d,
+	0x5179001d,0x517a001d,0x517b001d,0x517c001d,0x517d001d,0x517e001d,0x517f001d,0x5180001d,
+	0x5181001d,0x5182001d,0x5183001d,0x5184001d,0x5185001d,0x5186001d,0x5187001d,0x5188001d,
+	0x5189001d,0x518a001d,0x518b001d,0x518c001d,0x518d001d,0x518e001d,0x518f001d,0x5190001d,
+	0x5191001d,0x5192001d,0x5193001d,0x5194001d,0x5195001d,0x5196001d,0x5197001d,0x5198001d,
+	0x5199001d,0x519a001d,0x519b001d,0x519c001d,0x519d001d,0x519e001d,0x519f001d,0x51a0001d,
+	0x51a1001d,0x51a2001d,0x51a3001d,0x51a4001d,0x51a5001d,0x51a6001d,0x51a7001d,0x51a8001d,
+	0x51a9001d,0x51aa001d,0x51ab001d,0x51ac001d,0x51ad001d,0x51ae001d,0x51af001d,0x51b0001d,
+	0x51b1001d,0x51b2001d,0x51b3001d,0x51b4001d,0x51b5001d,0x51b6001d,0x51b7001d,0x51b8001d,
+	0x51b9001d,0x51ba001d,0x51bb001d,0x51bc001d,0x51bd001d,0x51be001d,0x51bf001d,0x51c0001d,
+	0x51c1001d,0x51c2001d,0x51c3001d,0x51c4001d,0x51c5001d,0x51c6001d,0x51c7001d,0x51c8001d,
+	0x51c9001d,0x51ca001d,0x51cb001d,0x51cc001d,0x51cd001d,0x51ce001d,0x51cf001d,0x51d0001d,
+	0x51d1001d,0x51d2001d,0x51d3001d,0x51d4001d,0x51d5001d,0x51d6001d,0x51d7001d,0x51d8001d,
+	0x51d9001d,0x51da001d,0x51db001d,0x51dc001d,0x51dd001d,0x51de001d,0x51df001d,0x51e0001d,
+	0x51e1001d,0x51e2001d,0x51e3001d,0x51e4001d,0x51e5001d,0x51e6001d,0x51e7001d,0x51e8001d,
+	0x51e9001d,0x51ea001d,0x51eb001d,0x51ec001d,0x51ed001d,0x51ee001d,0x51ef001d,0x51f0001d,
+	0x51f1001d,0x51f2001d,0x51f3001d,0x51f4001d,0x51f5001d,0x51f6001d,0x51f7001d,0x51f8001d,
+	0x51f9001d,0x51fa001d,0x51fb001d,0x51fc001d,0x51fd001d,0x51fe001d,0x51ff001d,0x5200001d,
+	0x5201001d,0x5202001d,0x5203001d,0x5204001d,0x5205001d,0x5206001d,0x5207001d,0x5208001d,
+	0x5209001d,0x520a001d,0x520b001d,0x520c001d,0x520d001d,0x520e001d,0x520f001d,0x5210001d,
+	0x5211001d,0x5212001d,0x5213001d,0x5214001d,0x5215001d,0x5216001d,0x5217001d,0x5218001d,
+	0x5219001d,0x521a001d,0x521b001d,0x521c001d,0x521d001d,0x521e001d,0x521f001d,0x5220001d,
+	0x5221001d,0x5222001d,0x5223001d,0x5224001d,0x5225001d,0x5226001d,0x5227001d,0x5228001d,
+	0x5229001d,0x522a001d,0x522b001d,0x522c001d,0x522d001d,0x522e001d,0x522f001d,0x5230001d,
+	0x5231001d,0x5232001d,0x5233001d,0x5234001d,0x5235001d,0x5236001d,0x5237001d,0x5238001d,
+	0x5239001d,0x523a001d,0x523b001d,0x523c001d,0x523d001d,0x523e001d,0x523f001d,0x5240001d,
+	0x5241001d,0x5242001d,0x5243001d,0x5244001d,0x5245001d,0x5246001d,0x5247001d,0x5248001d,
+	0x5249001d,0x524a001d,0x524b001d,0x524c001d,0x524d001d,0x524e001d,0x524f001d,0x5250001d,
+	0x5251001d,0x5252001d,0x5253001d,0x5254001d,0x5255001d,0x5256001d,0x5257001d,0x5258001d,
+	0x5259001d,0x525a001d,0x525b001d,0x525c001d,0x525d001d,0x525e001d,0x525f001d,0x5260001d,
+	0x5261001d,0x5262001d,0x5263001d,0x5264001d,0x5265001d,0x5266001d,0x5267001d,0x5268001d,
+	0x5269001d,0x526a001d,0x526b001d,0x526c001d,0x526d001d,0x526e001d,0x526f001d,0x5270001d,
+	0x5271001d,0x5272001d,0x5273001d,0x5274001d,0x5275001d,0x5276001d,0x5277001d,0x5278001d,
+	0x5279001d,0x527a001d,0x527b001d,0x527c001d,0x527d001d,0x527e001d,0x527f001d,0x5280001d,
+	0x5281001d,0x5282001d,0x5283001d,0x5284001d,0x5285001d,0x5286001d,0x5287001d,0x5288001d,
+	0x5289001d,0x528a001d,0x528b001d,0x528c001d,0x528d001d,0x528e001d,0x528f001d,0x5290001d,
+	0x5291001d,0x5292001d,0x5293001d,0x5294001d,0x5295001d,0x5296001d,0x5297001d,0x5298001d,
+	0x5299001d,0x529a001d,0x529b001d,0x529c001d,0x529d001d,0x529e001d,0x529f001d,0x52a0001d,
+	0x52a1001d,0x52a2001d,0x52a3001d,0x52a4001d,0x52a5001d,0x52a6001d,0x52a7001d,0x52a8001d,
+	0x52a9001d,0x52aa001d,0x52ab001d,0x52ac001d,0x52ad001d,0x52ae001d,0x52af001d,0x52b0001d,
+	0x52b1001d,0x52b2001d,0x52b3001d,0x52b4001d,0x52b5001d,0x52b6001d,0x52b7001d,0x52b8001d,
+	0x52b9001d,0x52ba001d,0x52bb001d,0x52bc001d,0x52bd001d,0x52be001d,0x52bf001d,0x52c0001d,
+	0x52c1001d,0x52c2001d,0x52c3001d,0x52c4001d,0x52c5001d,0x52c6001d,0x52c7001d,0x52c8001d,
+	0x52c9001d,0x52ca001d,0x52cb001d,0x52cc001d,0x52cd001d,0x52ce001d,0x52cf001d,0x52d0001d,
+	0x52d1001d,0x52d2001d,0x52d3001d,0x52d4001d,0x52d5001d,0x52d6001d,0x52d7001d,0x52d8001d,
+	0x52d9001d,0x52da001d,0x52db001d,0x52dc001d,0x52dd001d,0x52de001d,0x52df001d,0x52e0001d,
+	0x52e1001d,0x52e2001d,0x52e3001d,0x52e4001d,0x52e5001d,0x52e6001d,0x52e7001d,0x52e8001d,
+	0x52e9001d,0x52ea001d,0x52eb001d,0x52ec001d,0x52ed001d,0x52ee001d,0x52ef001d,0x52f0001d,
+	0x52f1001d,0x52f2001d,0x52f3001d,0x52f4001d,0x52f5001d,0x52f6001d,0x52f7001d,0x52f8001d,
+	0x52f9001d,0x52fa001d,0x52fb001d,0x52fc001d,0x52fd001d,0x52fe001d,0x52ff001d,0x5300001d,
+	0x5301001d,0x5302001d,0x5303001d,0x5304001d,0x5305001d,0x5306001d,0x5307001d,0x5308001d,
+	0x5309001d,0x530a001d,0x530b001d,0x530c001d,0x530d001d,0x530e001d,0x530f001d,0x5310001d,
+	0x5311001d,0x5312001d,0x5313001d,0x5314001d,0x5315001d,0x5316001d,0x5317001d,0x5318001d,
+	0x5319001d,0x531a001d,0x531b001d,0x531c001d,0x531d001d,0x531e001d,0x531f001d,0x5320001d,
+	0x5321001d,0x5322001d,0x5323001d,0x5324001d,0x5325001d,0x5326001d,0x5327001d,0x5328001d,
+	0x5329001d,0x532a001d,0x532b001d,0x532c001d,0x532d001d,0x532e001d,0x532f001d,0x5330001d,
+	0x5331001d,0x5332001d,0x5333001d,0x5334001d,0x5335001d,0x5336001d,0x5337001d,0x5338001d,
+	0x5339001d,0x533a001d,0x533b001d,0x533c001d,0x533d001d,0x533e001d,0x533f001d,0x5340001d,
+	0x5341001d,0x5342001d,0x5343001d,0x5344001d,0x5345001d,0x5346001d,0x5347001d,0x5348001d,
+	0x5349001d,0x534a001d,0x534b001d,0x534c001d,0x534d001d,0x534e001d,0x534f001d,0x5350001d,
+	0x5351001d,0x5352001d,0x5353001d,0x5354001d,0x5355001d,0x5356001d,0x5357001d,0x5358001d,
+	0x5359001d,0x535a001d,0x535b001d,0x535c001d,0x535d001d,0x535e001d,0x535f001d,0x5360001d,
+	0x5361001d,0x5362001d,0x5363001d,0x5364001d,0x5365001d,0x5366001d,0x5367001d,0x5368001d,
+	0x5369001d,0x536a001d,0x536b001d,0x536c001d,0x536d001d,0x536e001d,0x536f001d,0x5370001d,
+	0x5371001d,0x5372001d,0x5373001d,0x5374001d,0x5375001d,0x5376001d,0x5377001d,0x5378001d,
+	0x5379001d,0x537a001d,0x537b001d,0x537c001d,0x537d001d,0x537e001d,0x537f001d,0x5380001d,
+	0x5381001d,0x5382001d,0x5383001d,0x5384001d,0x5385001d,0x5386001d,0x5387001d,0x5388001d,
+	0x5389001d,0x538a001d,0x538b001d,0x538c001d,0x538d001d,0x538e001d,0x538f001d,0x5390001d,
+	0x5391001d,0x5392001d,0x5393001d,0x5394001d,0x5395001d,0x5396001d,0x5397001d,0x5398001d,
+	0x5399001d,0x539a001d,0x539b001d,0x539c001d,0x539d001d,0x539e001d,0x539f001d,0x53a0001d,
+	0x53a1001d,0x53a2001d,0x53a3001d,0x53a4001d,0x53a5001d,0x53a6001d,0x53a7001d,0x53a8001d,
+	0x53a9001d,0x53aa001d,0x53ab001d,0x53ac001d,0x53ad001d,0x53ae001d,0x53af001d,0x53b0001d,
+	0x53b1001d,0x53b2001d,0x53b3001d,0x53b4001d,0x53b5001d,0x53b6001d,0x53b7001d,0x53b8001d,
+	0x53b9001d,0x53ba001d,0x53bb001d,0x53bc001d,0x53bd001d,0x53be001d,0x53bf001d,0x53c0001d,
+	0x53c1001d,0x53c2001d,0x53c3001d,0x53c4001d,0x53c5001d,0x53c6001d,0x53c7001d,0x53c8001d,
+	0x53c9001d,0x53ca001d,0x53cb001d,0x53cc001d,0x53cd001d,0x53ce001d,0x53cf001d,0x53d0001d,
+	0x53d1001d,0x53d2001d,0x53d3001d,0x53d4001d,0x53d5001d,0x53d6001d,0x53d7001d,0x53d8001d,
+	0x53d9001d,0x53da001d,0x53db001d,0x53dc001d,0x53dd001d,0x53de001d,0x53df001d,0x53e0001d,
+	0x53e1001d,0x53e2001d,0x53e3001d,0x53e4001d,0x53e5001d,0x53e6001d,0x53e7001d,0x53e8001d,
+	0x53e9001d,0x53ea001d,0x53eb001d,0x53ec001d,0x53ed001d,0x53ee001d,0x53ef001d,0x53f0001d,
+	0x53f1001d,0x53f2001d,0x53f3001d,0x53f4001d,0x53f5001d,0x53f6001d,0x53f7001d,0x53f8001d,
+	0x53f9001d,0x53fa001d,0x53fb001d,0x53fc001d,0x53fd001d,0x53fe001d,0x53ff001d,0x5400001d,
+	0x5401001d,0x5402001d,0x5403001d,0x5404001d,0x5405001d,0x5406001d,0x5407001d,0x5408001d,
+	0x5409001d,0x540a001d,0x540b001d,0x540c001d,0x540d001d,0x540e001d,0x540f001d,0x5410001d,
+	0x5411001d,0x5412001d,0x5413001d,0x5414001d,0x5415001d,0x5416001d,0x5417001d,0x5418001d,
+	0x5419001d,0x541a001d,0x541b001d,0x541c001d,0x541d001d,0x541e001d,0x541f001d,0x5420001d,
+	0x5421001d,0x5422001d,0x5423001d,0x5424001d,0x5425001d,0x5426001d,0x5427001d,0x5428001d,
+	0x5429001d,0x542a001d,0x542b001d,0x542c001d,0x542d001d,0x542e001d,0x542f001d,0x5430001d,
+	0x5431001d,0x5432001d,0x5433001d,0x5434001d,0x5435001d,0x5436001d,0x5437001d,0x5438001d,
+	0x5439001d,0x543a001d,0x543b001d,0x543c001d,0x543d001d,0x543e001d,0x543f001d,0x5440001d,
+	0x5441001d,0x5442001d,0x5443001d,0x5444001d,0x5445001d,0x5446001d,0x5447001d,0x5448001d,
+	0x5449001d,0x544a001d,0x544b001d,0x544c001d,0x544d001d,0x544e001d,0x544f001d,0x5450001d,
+	0x5451001d,0x5452001d,0x5453001d,0x5454001d,0x5455001d,0x5456001d,0x5457001d,0x5458001d,
+	0x5459001d,0x545a001d,0x545b001d,0x545c001d,0x545d001d,0x545e001d,0x545f001d,0x5460001d,
+	0x5461001d,0x5462001d,0x5463001d,0x5464001d,0x5465001d,0x5466001d,0x5467001d,0x5468001d,
+	0x5469001d,0x546a001d,0x546b001d,0x546c001d,0x546d001d,0x546e001d,0x546f001d,0x5470001d,
+	0x5471001d,0x5472001d,0x5473001d,0x5474001d,0x5475001d,0x5476001d,0x5477001d,0x5478001d,
+	0x5479001d,0x547a001d,0x547b001d,0x547c001d,0x547d001d,0x547e001d,0x547f001d,0x5480001d,
+	0x5481001d,0x5482001d,0x5483001d,0x5484001d,0x5485001d,0x5486001d,0x5487001d,0x5488001d,
+	0x5489001d,0x548a001d,0x548b001d,0x548c001d,0x548d001d,0x548e001d,0x548f001d,0x5490001d,
+	0x5491001d,0x5492001d,0x5493001d,0x5494001d,0x5495001d,0x5496001d,0x5497001d,0x5498001d,
+	0x5499001d,0x549a001d,0x549b001d,0x549c001d,0x549d001d,0x549e001d,0x549f001d,0x54a0001d,
+	0x54a1001d,0x54a2001d,0x54a3001d,0x54a4001d,0x54a5001d,0x54a6001d,0x54a7001d,0x54a8001d,
+	0x54a9001d,0x54aa001d,0x54ab001d,0x54ac001d,0x54ad001d,0x54ae001d,0x54af001d,0x54b0001d,
+	0x54b1001d,0x54b2001d,0x54b3001d,0x54b4001d,0x54b5001d,0x54b6001d,0x54b7001d,0x54b8001d,
+	0x54b9001d,0x54ba001d,0x54bb001d,0x54bc001d,0x54bd001d,0x54be001d,0x54bf001d,0x54c0001d,
+	0x54c1001d,0x54c2001d,0x54c3001d,0x54c4001d,0x54c5001d,0x54c6001d,0x54c7001d,0x54c8001d,
+	0x54c9001d,0x54ca001d,0x54cb001d,0x54cc001d,0x54cd001d,0x54ce001d,0x54cf001d,0x54d0001d,
+	0x54d1001d,0x54d2001d,0x54d3001d,0x54d4001d,0x54d5001d,0x54d6001d,0x54d7001d,0x54d8001d,
+	0x54d9001d,0x54da001d,0x54db001d,0x54dc001d,0x54dd001d,0x54de001d,0x54df001d,0x54e0001d,
+	0x54e1001d,0x54e2001d,0x54e3001d,0x54e4001d,0x54e5001d,0x54e6001d,0x54e7001d,0x54e8001d,
+	0x54e9001d,0x54ea001d,0x54eb001d,0x54ec001d,0x54ed001d,0x54ee001d,0x54ef001d,0x54f0001d,
+	0x54f1001d,0x54f2001d,0x54f3001d,0x54f4001d,0x54f5001d,0x54f6001d,0x54f7001d,0x54f8001d,
+	0x54f9001d,0x54fa001d,0x54fb001d,0x54fc001d,0x54fd001d,0x54fe001d,0x54ff001d,0x5500001d,
+	0x5501001d,0x5502001d,0x5503001d,0x5504001d,0x5505001d,0x5506001d,0x5507001d,0x5508001d,
+	0x5509001d,0x550a001d,0x550b001d,0x550c001d,0x550d001d,0x550e001d,0x550f001d,0x5510001d,
+	0x5511001d,0x5512001d,0x5513001d,0x5514001d,0x5515001d,0x5516001d,0x5517001d,0x5518001d,
+	0x5519001d,0x551a001d,0x551b001d,0x551c001d,0x551d001d,0x551e001d,0x551f001d,0x5520001d,
+	0x5521001d,0x5522001d,0x5523001d,0x5524001d,0x5525001d,0x5526001d,0x5527001d,0x5528001d,
+	0x5529001d,0x552a001d,0x552b001d,0x552c001d,0x552d001d,0x552e001d,0x552f001d,0x5530001d,
+	0x5531001d,0x5532001d,0x5533001d,0x5534001d,0x5535001d,0x5536001d,0x5537001d,0x5538001d,
+	0x5539001d,0x553a001d,0x553b001d,0x553c001d,0x553d001d,0x553e001d,0x553f001d,0x5540001d,
+	0x5541001d,0x5542001d,0x5543001d,0x5544001d,0x5545001d,0x5546001d,0x5547001d,0x5548001d,
+	0x5549001d,0x554a001d,0x554b001d,0x554c001d,0x554d001d,0x554e001d,0x554f001d,0x5550001d,
+	0x5551001d,0x5552001d,0x5553001d,0x5554001d,0x5555001d,0x5556001d,0x5557001d,0x5558001d,
+	0x5559001d,0x555a001d,0x555b001d,0x555c001d,0x555d001d,0x555e001d,0x555f001d,0x5560001d,
+	0x5561001d,0x5562001d,0x5563001d,0x5564001d,0x5565001d,0x5566001d,0x5567001d,0x5568001d,
+	0x5569001d,0x556a001d,0x556b001d,0x556c001d,0x556d001d,0x556e001d,0x556f001d,0x5570001d,
+	0x5571001d,0x5572001d,0x5573001d,0x5574001d,0x5575001d,0x5576001d,0x5577001d,0x5578001d,
+	0x5579001d,0x557a001d,0x557b001d,0x557c001d,0x557d001d,0x557e001d,0x557f001d,0x5580001d,
+	0x5581001d,0x5582001d,0x5583001d,0x5584001d,0x5585001d,0x5586001d,0x5587001d,0x5588001d,
+	0x5589001d,0x558a001d,0x558b001d,0x558c001d,0x558d001d,0x558e001d,0x558f001d,0x5590001d,
+	0x5591001d,0x5592001d,0x5593001d,0x5594001d,0x5595001d,0x5596001d,0x5597001d,0x5598001d,
+	0x5599001d,0x559a001d,0x559b001d,0x559c001d,0x559d001d,0x559e001d,0x559f001d,0x55a0001d,
+	0x55a1001d,0x55a2001d,0x55a3001d,0x55a4001d,0x55a5001d,0x55a6001d,0x55a7001d,0x55a8001d,
+	0x55a9001d,0x55aa001d,0x55ab001d,0x55ac001d,0x55ad001d,0x55ae001d,0x55af001d,0x55b0001d,
+	0x55b1001d,0x55b2001d,0x55b3001d,0x55b4001d,0x55b5001d,0x55b6001d,0x55b7001d,0x55b8001d,
+	0x55b9001d,0x55ba001d,0x55bb001d,0x55bc001d,0x55bd001d,0x55be001d,0x55bf001d,0x55c0001d,
+	0x55c1001d,0x55c2001d,0x55c3001d,0x55c4001d,0x55c5001d,0x55c6001d,0x55c7001d,0x55c8001d,
+	0x55c9001d,0x55ca001d,0x55cb001d,0x55cc001d,0x55cd001d,0x55ce001d,0x55cf001d,0x55d0001d,
+	0x55d1001d,0x55d2001d,0x55d3001d,0x55d4001d,0x55d5001d,0x55d6001d,0x55d7001d,0x55d8001d,
+	0x55d9001d,0x55da001d,0x55db001d,0x55dc001d,0x55dd001d,0x55de001d,0x55df001d,0x55e0001d,
+	0x55e1001d,0x55e2001d,0x55e3001d,0x55e4001d,0x55e5001d,0x55e6001d,0x55e7001d,0x55e8001d,
+	0x55e9001d,0x55ea001d,0x55eb001d,0x55ec001d,0x55ed001d,0x55ee001d,0x55ef001d,0x55f0001d,
+	0x55f1001d,0x55f2001d,0x55f3001d,0x55f4001d,0x55f5001d,0x55f6001d,0x55f7001d,0x55f8001d,
+	0x55f9001d,0x55fa001d,0x55fb001d,0x55fc001d,0x55fd001d,0x55fe001d,0x55ff001d,0x5600001d,
+	0x5601001d,0x5602001d,0x5603001d,0x5604001d,0x5605001d,0x5606001d,0x5607001d,0x5608001d,
+	0x5609001d,0x560a001d,0x560b001d,0x560c001d,0x560d001d,0x560e001d,0x560f001d,0x5610001d,
+	0x5611001d,0x5612001d,0x5613001d,0x5614001d,0x5615001d,0x5616001d,0x5617001d,0x5618001d,
+	0x5619001d,0x561a001d,0x561b001d,0x561c001d,0x561d001d,0x561e001d,0x561f001d,0x5620001d,
+	0x5621001d,0x5622001d,0x5623001d,0x5624001d,0x5625001d,0x5626001d,0x5627001d,0x5628001d,
+	0x5629001d,0x562a001d,0x562b001d,0x562c001d,0x562d001d,0x562e001d,0x562f001d,0x5630001d,
+	0x5631001d,0x5632001d,0x5633001d,0x5634001d,0x5635001d,0x5636001d,0x5637001d,0x5638001d,
+	0x5639001d,0x563a001d,0x563b001d,0x563c001d,0x563d001d,0x563e001d,0x563f001d,0x5640001d,
+	0x5641001d,0x5642001d,0x5643001d,0x5644001d,0x5645001d,0x5646001d,0x5647001d,0x5648001d,
+	0x5649001d,0x564a001d,0x564b001d,0x564c001d,0x564d001d,0x564e001d,0x564f001d,0x5650001d,
+	0x5651001d,0x5652001d,0x5653001d,0x5654001d,0x5655001d,0x5656001d,0x5657001d,0x5658001d,
+	0x5659001d,0x565a001d,0x565b001d,0x565c001d,0x565d001d,0x565e001d,0x565f001d,0x5660001d,
+	0x5661001d,0x5662001d,0x5663001d,0x5664001d,0x5665001d,0x5666001d,0x5667001d,0x5668001d,
+	0x5669001d,0x566a001d,0x566b001d,0x566c001d,0x566d001d,0x566e001d,0x566f001d,0x5670001d,
+	0x5671001d,0x5672001d,0x5673001d,0x5674001d,0x5675001d,0x5676001d,0x5677001d,0x5678001d,
+	0x5679001d,0x567a001d,0x567b001d,0x567c001d,0x567d001d,0x567e001d,0x567f001d,0x5680001d,
+	0x5681001d,0x5682001d,0x5683001d,0x5684001d,0x5685001d,0x5686001d,0x5687001d,0x5688001d,
+	0x5689001d,0x568a001d,0x568b001d,0x568c001d,0x568d001d,0x568e001d,0x568f001d,0x5690001d,
+	0x5691001d,0x5692001d,0x5693001d,0x5694001d,0x5695001d,0x5696001d,0x5697001d,0x5698001d,
+	0x5699001d,0x569a001d,0x569b001d,0x569c001d,0x569d001d,0x569e001d,0x569f001d,0x56a0001d,
+	0x56a1001d,0x56a2001d,0x56a3001d,0x56a4001d,0x56a5001d,0x56a6001d,0x56a7001d,0x56a8001d,
+	0x56a9001d,0x56aa001d,0x56ab001d,0x56ac001d,0x56ad001d,0x56ae001d,0x56af001d,0x56b0001d,
+	0x56b1001d,0x56b2001d,0x56b3001d,0x56b4001d,0x56b5001d,0x56b6001d,0x56b7001d,0x56b8001d,
+	0x56b9001d,0x56ba001d,0x56bb001d,0x56bc001d,0x56bd001d,0x56be001d,0x56bf001d,0x56c0001d,
+	0x56c1001d,0x56c2001d,0x56c3001d,0x56c4001d,0x56c5001d,0x56c6001d,0x56c7001d,0x56c8001d,
+	0x56c9001d,0x56ca001d,0x56cb001d,0x56cc001d,0x56cd001d,0x56ce001d,0x56cf001d,0x56d0001d,
+	0x56d1001d,0x56d2001d,0x56d3001d,0x56d4001d,0x56d5001d,0x56d6001d,0x56d7001d,0x56d8001d,
+	0x56d9001d,0x56da001d,0x56db001d,0x56dc001d,0x56dd001d,0x56de001d,0x56df001d,0x56e0001d,
+	0x56e1001d,0x56e2001d,0x56e3001d,0x56e4001d,0x56e5001d,0x56e6001d,0x56e7001d,0x56e8001d,
+	0x56e9001d,0x56ea001d,0x56eb001d,0x56ec001d,0x56ed001d,0x56ee001d,0x56ef001d,0x56f0001d,
+	0x56f1001d,0x56f2001d,0x56f3001d,0x56f4001d,0x56f5001d,0x56f6001d,0x56f7001d,0x56f8001d,
+	0x56f9001d,0x56fa001d,0x56fb001d,0x56fc001d,0x56fd001d,0x56fe001d,0x56ff001d,0x5700001d,
+	0x5701001d,0x5702001d,0x5703001d,0x5704001d,0x5705001d,0x5706001d,0x5707001d,0x5708001d,
+	0x5709001d,0x570a001d,0x570b001d,0x570c001d,0x570d001d,0x570e001d,0x570f001d,0x5710001d,
+	0x5711001d,0x5712001d,0x5713001d,0x5714001d,0x5715001d,0x5716001d,0x5717001d,0x5718001d,
+	0x5719001d,0x571a001d,0x571b001d,0x571c001d,0x571d001d,0x571e001d,0x571f001d,0x5720001d,
+	0x5721001d,0x5722001d,0x5723001d,0x5724001d,0x5725001d,0x5726001d,0x5727001d,0x5728001d,
+	0x5729001d,0x572a001d,0x572b001d,0x572c001d,0x572d001d,0x572e001d,0x572f001d,0x5730001d,
+	0x5731001d,0x5732001d,0x5733001d,0x5734001d,0x5735001d,0x5736001d,0x5737001d,0x5738001d,
+	0x5739001d,0x573a001d,0x573b001d,0x573c001d,0x573d001d,0x573e001d,0x573f001d,0x5740001d,
+	0x5741001d,0x5742001d,0x5743001d,0x5744001d,0x5745001d,0x5746001d,0x5747001d,0x5748001d,
+	0x5749001d,0x574a001d,0x574b001d,0x574c001d,0x574d001d,0x574e001d,0x574f001d,0x5750001d,
+	0x5751001d,0x5752001d,0x5753001d,0x5754001d,0x5755001d,0x5756001d,0x5757001d,0x5758001d,
+	0x5759001d,0x575a001d,0x575b001d,0x575c001d,0x575d001d,0x575e001d,0x575f001d,0x5760001d,
+	0x5761001d,0x5762001d,0x5763001d,0x5764001d,0x5765001d,0x5766001d,0x5767001d,0x5768001d,
+	0x5769001d,0x576a001d,0x576b001d,0x576c001d,0x576d001d,0x576e001d,0x576f001d,0x5770001d,
+	0x5771001d,0x5772001d,0x5773001d,0x5774001d,0x5775001d,0x5776001d,0x5777001d,0x5778001d,
+	0x5779001d,0x577a001d,0x577b001d,0x577c001d,0x577d001d,0x577e001d,0x577f001d,0x5780001d,
+	0x5781001d,0x5782001d,0x5783001d,0x5784001d,0x5785001d,0x5786001d,0x5787001d,0x5788001d,
+	0x5789001d,0x578a001d,0x578b001d,0x578c001d,0x578d001d,0x578e001d,0x578f001d,0x5790001d,
+	0x5791001d,0x5792001d,0x5793001d,0x5794001d,0x5795001d,0x5796001d,0x5797001d,0x5798001d,
+	0x5799001d,0x579a001d,0x579b001d,0x579c001d,0x579d001d,0x579e001d,0x579f001d,0x57a0001d,
+	0x57a1001d,0x57a2001d,0x57a3001d,0x57a4001d,0x57a5001d,0x57a6001d,0x57a7001d,0x57a8001d,
+	0x57a9001d,0x57aa001d,0x57ab001d,0x57ac001d,0x57ad001d,0x57ae001d,0x57af001d,0x57b0001d,
+	0x57b1001d,0x57b2001d,0x57b3001d,0x57b4001d,0x57b5001d,0x57b6001d,0x57b7001d,0x57b8001d,
+	0x57b9001d,0x57ba001d,0x57bb001d,0x57bc001d,0x57bd001d,0x57be001d,0x57bf001d,0x57c0001d,
+	0x57c1001d,0x57c2001d,0x57c3001d,0x57c4001d,0x57c5001d,0x57c6001d,0x57c7001d,0x57c8001d,
+	0x57c9001d,0x57ca001d,0x57cb001d,0x57cc001d,0x57cd001d,0x57ce001d,0x57cf001d,0x57d0001d,
+	0x57d1001d,0x57d2001d,0x57d3001d,0x57d4001d,0x57d5001d,0x57d6001d,0x57d7001d,0x57d8001d,
+	0x57d9001d,0x57da001d,0x57db001d,0x57dc001d,0x57dd001d,0x57de001d,0x57df001d,0x57e0001d,
+	0x57e1001d,0x57e2001d,0x57e3001d,0x57e4001d,0x57e5001d,0x57e6001d,0x57e7001d,0x57e8001d,
+	0x57e9001d,0x57ea001d,0x57eb001d,0x57ec001d,0x57ed001d,0x57ee001d,0x57ef001d,0x57f0001d,
+	0x57f1001d,0x57f2001d,0x57f3001d,0x57f4001d,0x57f5001d,0x57f6001d,0x57f7001d,0x57f8001d,
+	0x57f9001d,0x57fa001d,0x57fb001d,0x57fc001d,0x57fd001d,0x57fe001d,0x57ff001d,0x5800001d,
+	0x5801001d,0x5802001d,0x5803001d,0x5804001d,0x5805001d,0x5806001d,0x5807001d,0x5808001d,
+	0x5809001d,0x580a001d,0x580b001d,0x580c001d,0x580d001d,0x580e001d,0x580f001d,0x5810001d,
+	0x5811001d,0x5812001d,0x5813001d,0x5814001d,0x5815001d,0x5816001d,0x5817001d,0x5818001d,
+	0x5819001d,0x581a001d,0x581b001d,0x581c001d,0x581d001d,0x581e001d,0x581f001d,0x5820001d,
+	0x5821001d,0x5822001d,0x5823001d,0x5824001d,0x5825001d,0x5826001d,0x5827001d,0x5828001d,
+	0x5829001d,0x582a001d,0x582b001d,0x582c001d,0x582d001d,0x582e001d,0x582f001d,0x5830001d,
+	0x5831001d,0x5832001d,0x5833001d,0x5834001d,0x5835001d,0x5836001d,0x5837001d,0x5838001d,
+	0x5839001d,0x583a001d,0x583b001d,0x583c001d,0x583d001d,0x583e001d,0x583f001d,0x5840001d,
+	0x5841001d,0x5842001d,0x5843001d,0x5844001d,0x5845001d,0x5846001d,0x5847001d,0x5848001d,
+	0x5849001d,0x584a001d,0x584b001d,0x584c001d,0x584d001d,0x584e001d,0x584f001d,0x5850001d,
+	0x5851001d,0x5852001d,0x5853001d,0x5854001d,0x5855001d,0x5856001d,0x5857001d,0x5858001d,
+	0x5859001d,0x585a001d,0x585b001d,0x585c001d,0x585d001d,0x585e001d,0x585f001d,0x5860001d,
+	0x5861001d,0x5862001d,0x5863001d,0x5864001d,0x5865001d,0x5866001d,0x5867001d,0x5868001d,
+	0x5869001d,0x586a001d,0x586b001d,0x586c001d,0x586d001d,0x586e001d,0x586f001d,0x5870001d,
+	0x5871001d,0x5872001d,0x5873001d,0x5874001d,0x5875001d,0x5876001d,0x5877001d,0x5878001d,
+	0x5879001d,0x587a001d,0x587b001d,0x587c001d,0x587d001d,0x587e001d,0x587f001d,0x5880001d,
+	0x5881001d,0x5882001d,0x5883001d,0x5884001d,0x5885001d,0x5886001d,0x5887001d,0x5888001d,
+	0x5889001d,0x588a001d,0x588b001d,0x588c001d,0x588d001d,0x588e001d,0x588f001d,0x5890001d,
+	0x5891001d,0x5892001d,0x5893001d,0x5894001d,0x5895001d,0x5896001d,0x5897001d,0x5898001d,
+	0x5899001d,0x589a001d,0x589b001d,0x589c001d,0x589d001d,0x589e001d,0x589f001d,0x58a0001d,
+	0x58a1001d,0x58a2001d,0x58a3001d,0x58a4001d,0x58a5001d,0x58a6001d,0x58a7001d,0x58a8001d,
+	0x58a9001d,0x58aa001d,0x58ab001d,0x58ac001d,0x58ad001d,0x58ae001d,0x58af001d,0x58b0001d,
+	0x58b1001d,0x58b2001d,0x58b3001d,0x58b4001d,0x58b5001d,0x58b6001d,0x58b7001d,0x58b8001d,
+	0x58b9001d,0x58ba001d,0x58bb001d,0x58bc001d,0x58bd001d,0x58be001d,0x58bf001d,0x58c0001d,
+	0x58c1001d,0x58c2001d,0x58c3001d,0x58c4001d,0x58c5001d,0x58c6001d,0x58c7001d,0x58c8001d,
+	0x58c9001d,0x58ca001d,0x58cb001d,0x58cc001d,0x58cd001d,0x58ce001d,0x58cf001d,0x58d0001d,
+	0x58d1001d,0x58d2001d,0x58d3001d,0x58d4001d,0x58d5001d,0x58d6001d,0x58d7001d,0x58d8001d,
+	0x58d9001d,0x58da001d,0x58db001d,0x58dc001d,0x58dd001d,0x58de001d,0x58df001d,0x58e0001d,
+	0x58e1001d,0x58e2001d,0x58e3001d,0x58e4001d,0x58e5001d,0x58e6001d,0x58e7001d,0x58e8001d,
+	0x58e9001d,0x58ea001d,0x58eb001d,0x58ec001d,0x58ed001d,0x58ee001d,0x58ef001d,0x58f0001d,
+	0x58f1001d,0x58f2001d,0x58f3001d,0x58f4001d,0x58f5001d,0x58f6001d,0x58f7001d,0x58f8001d,
+	0x58f9001d,0x58fa001d,0x58fb001d,0x58fc001d,0x58fd001d,0x58fe001d,0x58ff001d,0x5900001d,
+	0x5901001d,0x5902001d,0x5903001d,0x5904001d,0x5905001d,0x5906001d,0x5907001d,0x5908001d,
+	0x5909001d,0x590a001d,0x590b001d,0x590c001d,0x590d001d,0x590e001d,0x590f001d,0x5910001d,
+	0x5911001d,0x5912001d,0x5913001d,0x5914001d,0x5915001d,0x5916001d,0x5917001d,0x5918001d,
+	0x5919001d,0x591a001d,0x591b001d,0x591c001d,0x591d001d,0x591e001d,0x591f001d,0x5920001d,
+	0x5921001d,0x5922001d,0x5923001d,0x5924001d,0x5925001d,0x5926001d,0x5927001d,0x5928001d,
+	0x5929001d,0x592a001d,0x592b001d,0x592c001d,0x592d001d,0x592e001d,0x592f001d,0x5930001d,
+	0x5931001d,0x5932001d,0x5933001d,0x5934001d,0x5935001d,0x5936001d,0x5937001d,0x5938001d,
+	0x5939001d,0x593a001d,0x593b001d,0x593c001d,0x593d001d,0x593e001d,0x593f001d,0x5940001d,
+	0x5941001d,0x5942001d,0x5943001d,0x5944001d,0x5945001d,0x5946001d,0x5947001d,0x5948001d,
+	0x5949001d,0x594a001d,0x594b001d,0x594c001d,0x594d001d,0x594e001d,0x594f001d,0x5950001d,
+	0x5951001d,0x5952001d,0x5953001d,0x5954001d,0x5955001d,0x5956001d,0x5957001d,0x5958001d,
+	0x5959001d,0x595a001d,0x595b001d,0x595c001d,0x595d001d,0x595e001d,0x595f001d,0x5960001d,
+	0x5961001d,0x5962001d,0x5963001d,0x5964001d,0x5965001d,0x5966001d,0x5967001d,0x5968001d,
+	0x5969001d,0x596a001d,0x596b001d,0x596c001d,0x596d001d,0x596e001d,0x596f001d,0x5970001d,
+	0x5971001d,0x5972001d,0x5973001d,0x5974001d,0x5975001d,0x5976001d,0x5977001d,0x5978001d,
+	0x5979001d,0x597a001d,0x597b001d,0x597c001d,0x597d001d,0x597e001d,0x597f001d,0x5980001d,
+	0x5981001d,0x5982001d,0x5983001d,0x5984001d,0x5985001d,0x5986001d,0x5987001d,0x5988001d,
+	0x5989001d,0x598a001d,0x598b001d,0x598c001d,0x598d001d,0x598e001d,0x598f001d,0x5990001d,
+	0x5991001d,0x5992001d,0x5993001d,0x5994001d,0x5995001d,0x5996001d,0x5997001d,0x5998001d,
+	0x5999001d,0x599a001d,0x599b001d,0x599c001d,0x599d001d,0x599e001d,0x599f001d,0x59a0001d,
+	0x59a1001d,0x59a2001d,0x59a3001d,0x59a4001d,0x59a5001d,0x59a6001d,0x59a7001d,0x59a8001d,
+	0x59a9001d,0x59aa001d,0x59ab001d,0x59ac001d,0x59ad001d,0x59ae001d,0x59af001d,0x59b0001d,
+	0x59b1001d,0x59b2001d,0x59b3001d,0x59b4001d,0x59b5001d,0x59b6001d,0x59b7001d,0x59b8001d,
+	0x59b9001d,0x59ba001d,0x59bb001d,0x59bc001d,0x59bd001d,0x59be001d,0x59bf001d,0x59c0001d,
+	0x59c1001d,0x59c2001d,0x59c3001d,0x59c4001d,0x59c5001d,0x59c6001d,0x59c7001d,0x59c8001d,
+	0x59c9001d,0x59ca001d,0x59cb001d,0x59cc001d,0x59cd001d,0x59ce001d,0x59cf001d,0x59d0001d,
+	0x59d1001d,0x59d2001d,0x59d3001d,0x59d4001d,0x59d5001d,0x59d6001d,0x59d7001d,0x59d8001d,
+	0x59d9001d,0x59da001d,0x59db001d,0x59dc001d,0x59dd001d,0x59de001d,0x59df001d,0x59e0001d,
+	0x59e1001d,0x59e2001d,0x59e3001d,0x59e4001d,0x59e5001d,0x59e6001d,0x59e7001d,0x59e8001d,
+	0x59e9001d,0x59ea001d,0x59eb001d,0x59ec001d,0x59ed001d,0x59ee001d,0x59ef001d,0x59f0001d,
+	0x59f1001d,0x59f2001d,0x59f3001d,0x59f4001d,0x59f5001d,0x59f6001d,0x59f7001d,0x59f8001d,
+	0x59f9001d,0x59fa001d,0x59fb001d,0x59fc001d,0x59fd001d,0x59fe001d,0x59ff001d,0x5a00001d,
+	0x5a01001d,0x5a02001d,0x5a03001d,0x5a04001d,0x5a05001d,0x5a06001d,0x5a07001d,0x5a08001d,
+	0x5a09001d,0x5a0a001d,0x5a0b001d,0x5a0c001d,0x5a0d001d,0x5a0e001d,0x5a0f001d,0x5a10001d,
+	0x5a11001d,0x5a12001d,0x5a13001d,0x5a14001d,0x5a15001d,0x5a16001d,0x5a17001d,0x5a18001d,
+	0x5a19001d,0x5a1a001d,0x5a1b001d,0x5a1c001d,0x5a1d001d,0x5a1e001d,0x5a1f001d,0x5a20001d,
+	0x5a21001d,0x5a22001d,0x5a23001d,0x5a24001d,0x5a25001d,0x5a26001d,0x5a27001d,0x5a28001d,
+	0x5a29001d,0x5a2a001d,0x5a2b001d,0x5a2c001d,0x5a2d001d,0x5a2e001d,0x5a2f001d,0x5a30001d,
+	0x5a31001d,0x5a32001d,0x5a33001d,0x5a34001d,0x5a35001d,0x5a36001d,0x5a37001d,0x5a38001d,
+	0x5a39001d,0x5a3a001d,0x5a3b001d,0x5a3c001d,0x5a3d001d,0x5a3e001d,0x5a3f001d,0x5a40001d,
+	0x5a41001d,0x5a42001d,0x5a43001d,0x5a44001d,0x5a45001d,0x5a46001d,0x5a47001d,0x5a48001d,
+	0x5a49001d,0x5a4a001d,0x5a4b001d,0x5a4c001d,0x5a4d001d,0x5a4e001d,0x5a4f001d,0x5a50001d,
+	0x5a51001d,0x5a52001d,0x5a53001d,0x5a54001d,0x5a55001d,0x5a56001d,0x5a57001d,0x5a58001d,
+	0x5a59001d,0x5a5a001d,0x5a5b001d,0x5a5c001d,0x5a5d001d,0x5a5e001d,0x5a5f001d,0x5a60001d,
+	0x5a61001d,0x5a62001d,0x5a63001d,0x5a64001d,0x5a65001d,0x5a66001d,0x5a67001d,0x5a68001d,
+	0x5a69001d,0x5a6a001d,0x5a6b001d,0x5a6c001d,0x5a6d001d,0x5a6e001d,0x5a6f001d,0x5a70001d,
+	0x5a71001d,0x5a72001d,0x5a73001d,0x5a74001d,0x5a75001d,0x5a76001d,0x5a77001d,0x5a78001d,
+	0x5a79001d,0x5a7a001d,0x5a7b001d,0x5a7c001d,0x5a7d001d,0x5a7e001d,0x5a7f001d,0x5a80001d,
+	0x5a81001d,0x5a82001d,0x5a83001d,0x5a84001d,0x5a85001d,0x5a86001d,0x5a87001d,0x5a88001d,
+	0x5a89001d,0x5a8a001d,0x5a8b001d,0x5a8c001d,0x5a8d001d,0x5a8e001d,0x5a8f001d,0x5a90001d,
+	0x5a91001d,0x5a92001d,0x5a93001d,0x5a94001d,0x5a95001d,0x5a96001d,0x5a97001d,0x5a98001d,
+	0x5a99001d,0x5a9a001d,0x5a9b001d,0x5a9c001d,0x5a9d001d,0x5a9e001d,0x5a9f001d,0x5aa0001d,
+	0x5aa1001d,0x5aa2001d,0x5aa3001d,0x5aa4001d,0x5aa5001d,0x5aa6001d,0x5aa7001d,0x5aa8001d,
+	0x5aa9001d,0x5aaa001d,0x5aab001d,0x5aac001d,0x5aad001d,0x5aae001d,0x5aaf001d,0x5ab0001d,
+	0x5ab1001d,0x5ab2001d,0x5ab3001d,0x5ab4001d,0x5ab5001d,0x5ab6001d,0x5ab7001d,0x5ab8001d,
+	0x5ab9001d,0x5aba001d,0x5abb001d,0x5abc001d,0x5abd001d,0x5abe001d,0x5abf001d,0x5ac0001d,
+	0x5ac1001d,0x5ac2001d,0x5ac3001d,0x5ac4001d,0x5ac5001d,0x5ac6001d,0x5ac7001d,0x5ac8001d,
+	0x5ac9001d,0x5aca001d,0x5acb001d,0x5acc001d,0x5acd001d,0x5ace001d,0x5acf001d,0x5ad0001d,
+	0x5ad1001d,0x5ad2001d,0x5ad3001d,0x5ad4001d,0x5ad5001d,0x5ad6001d,0x5ad7001d,0x5ad8001d,
+	0x5ad9001d,0x5ada001d,0x5adb001d,0x5adc001d,0x5add001d,0x5ade001d,0x5adf001d,0x5ae0001d,
+	0x5ae1001d,0x5ae2001d,0x5ae3001d,0x5ae4001d,0x5ae5001d,0x5ae6001d,0x5ae7001d,0x5ae8001d,
+	0x5ae9001d,0x5aea001d,0x5aeb001d,0x5aec001d,0x5aed001d,0x5aee001d,0x5aef001d,0x5af0001d,
+	0x5af1001d,0x5af2001d,0x5af3001d,0x5af4001d,0x5af5001d,0x5af6001d,0x5af7001d,0x5af8001d,
+	0x5af9001d,0x5afa001d,0x5afb001d,0x5afc001d,0x5afd001d,0x5afe001d,0x5aff001d,0x5b00001d,
+	0x5b01001d,0x5b02001d,0x5b03001d,0x5b04001d,0x5b05001d,0x5b06001d,0x5b07001d,0x5b08001d,
+	0x5b09001d,0x5b0a001d,0x5b0b001d,0x5b0c001d,0x5b0d001d,0x5b0e001d,0x5b0f001d,0x5b10001d,
+	0x5b11001d,0x5b12001d,0x5b13001d,0x5b14001d,0x5b15001d,0x5b16001d,0x5b17001d,0x5b18001d,
+	0x5b19001d,0x5b1a001d,0x5b1b001d,0x5b1c001d,0x5b1d001d,0x5b1e001d,0x5b1f001d,0x5b20001d,
+	0x5b21001d,0x5b22001d,0x5b23001d,0x5b24001d,0x5b25001d,0x5b26001d,0x5b27001d,0x5b28001d,
+	0x5b29001d,0x5b2a001d,0x5b2b001d,0x5b2c001d,0x5b2d001d,0x5b2e001d,0x5b2f001d,0x5b30001d,
+	0x5b31001d,0x5b32001d,0x5b33001d,0x5b34001d,0x5b35001d,0x5b36001d,0x5b37001d,0x5b38001d,
+	0x5b39001d,0x5b3a001d,0x5b3b001d,0x5b3c001d,0x5b3d001d,0x5b3e001d,0x5b3f001d,0x5b40001d,
+	0x5b41001d,0x5b42001d,0x5b43001d,0x5b44001d,0x5b45001d,0x5b46001d,0x5b47001d,0x5b48001d,
+	0x5b49001d,0x5b4a001d,0x5b4b001d,0x5b4c001d,0x5b4d001d,0x5b4e001d,0x5b4f001d,0x5b50001d,
+	0x5b51001d,0x5b52001d,0x5b53001d,0x5b54001d,0x5b55001d,0x5b56001d,0x5b57001d,0x5b58001d,
+	0x5b59001d,0x5b5a001d,0x5b5b001d,0x5b5c001d,0x5b5d001d,0x5b5e001d,0x5b5f001d,0x5b60001d,
+	0x5b61001d,0x5b62001d,0x5b63001d,0x5b64001d,0x5b65001d,0x5b66001d,0x5b67001d,0x5b68001d,
+	0x5b69001d,0x5b6a001d,0x5b6b001d,0x5b6c001d,0x5b6d001d,0x5b6e001d,0x5b6f001d,0x5b70001d,
+	0x5b71001d,0x5b72001d,0x5b73001d,0x5b74001d,0x5b75001d,0x5b76001d,0x5b77001d,0x5b78001d,
+	0x5b79001d,0x5b7a001d,0x5b7b001d,0x5b7c001d,0x5b7d001d,0x5b7e001d,0x5b7f001d,0x5b80001d,
+	0x5b81001d,0x5b82001d,0x5b83001d,0x5b84001d,0x5b85001d,0x5b86001d,0x5b87001d,0x5b88001d,
+	0x5b89001d,0x5b8a001d,0x5b8b001d,0x5b8c001d,0x5b8d001d,0x5b8e001d,0x5b8f001d,0x5b90001d,
+	0x5b91001d,0x5b92001d,0x5b93001d,0x5b94001d,0x5b95001d,0x5b96001d,0x5b97001d,0x5b98001d,
+	0x5b99001d,0x5b9a001d,0x5b9b001d,0x5b9c001d,0x5b9d001d,0x5b9e001d,0x5b9f001d,0x5ba0001d,
+	0x5ba1001d,0x5ba2001d,0x5ba3001d,0x5ba4001d,0x5ba5001d,0x5ba6001d,0x5ba7001d,0x5ba8001d,
+	0x5ba9001d,0x5baa001d,0x5bab001d,0x5bac001d,0x5bad001d,0x5bae001d,0x5baf001d,0x5bb0001d,
+	0x5bb1001d,0x5bb2001d,0x5bb3001d,0x5bb4001d,0x5bb5001d,0x5bb6001d,0x5bb7001d,0x5bb8001d,
+	0x5bb9001d,0x5bba001d,0x5bbb001d,0x5bbc001d,0x5bbd001d,0x5bbe001d,0x5bbf001d,0x5bc0001d,
+	0x5bc1001d,0x5bc2001d,0x5bc3001d,0x5bc4001d,0x5bc5001d,0x5bc6001d,0x5bc7001d,0x5bc8001d,
+	0x5bc9001d,0x5bca001d,0x5bcb001d,0x5bcc001d,0x5bcd001d,0x5bce001d,0x5bcf001d,0x5bd0001d,
+	0x5bd1001d,0x5bd2001d,0x5bd3001d,0x5bd4001d,0x5bd5001d,0x5bd6001d,0x5bd7001d,0x5bd8001d,
+	0x5bd9001d,0x5bda001d,0x5bdb001d,0x5bdc001d,0x5bdd001d,0x5bde001d,0x5bdf001d,0x5be0001d,
+	0x5be1001d,0x5be2001d,0x5be3001d,0x5be4001d,0x5be5001d,0x5be6001d,0x5be7001d,0x5be8001d,
+	0x5be9001d,0x5bea001d,0x5beb001d,0x5bec001d,0x5bed001d,0x5bee001d,0x5bef001d,0x5bf0001d,
+	0x5bf1001d,0x5bf2001d,0x5bf3001d,0x5bf4001d,0x5bf5001d,0x5bf6001d,0x5bf7001d,0x5bf8001d,
+	0x5bf9001d,0x5bfa001d,0x5bfb001d,0x5bfc001d,0x5bfd001d,0x5bfe001d,0x5bff001d,0x5c00001d,
+	0x5c01001d,0x5c02001d,0x5c03001d,0x5c04001d,0x5c05001d,0x5c06001d,0x5c07001d,0x5c08001d,
+	0x5c09001d,0x5c0a001d,0x5c0b001d,0x5c0c001d,0x5c0d001d,0x5c0e001d,0x5c0f001d,0x5c10001d,
+	0x5c11001d,0x5c12001d,0x5c13001d,0x5c14001d,0x5c15001d,0x5c16001d,0x5c17001d,0x5c18001d,
+	0x5c19001d,0x5c1a001d,0x5c1b001d,0x5c1c001d,0x5c1d001d,0x5c1e001d,0x5c1f001d,0x5c20001d,
+	0x5c21001d,0x5c22001d,0x5c23001d,0x5c24001d,0x5c25001d,0x5c26001d,0x5c27001d,0x5c28001d,
+	0x5c29001d,0x5c2a001d,0x5c2b001d,0x5c2c001d,0x5c2d001d,0x5c2e001d,0x5c2f001d,0x5c30001d,
+	0x5c31001d,0x5c32001d,0x5c33001d,0x5c34001d,0x5c35001d,0x5c36001d,0x5c37001d,0x5c38001d,
+	0x5c39001d,0x5c3a001d,0x5c3b001d,0x5c3c001d,0x5c3d001d,0x5c3e001d,0x5c3f001d,0x5c40001d,
+	0x5c41001d,0x5c42001d,0x5c43001d,0x5c44001d,0x5c45001d,0x5c46001d,0x5c47001d,0x5c48001d,
+	0x5c49001d,0x5c4a001d,0x5c4b001d,0x5c4c001d,0x5c4d001d,0x5c4e001d,0x5c4f001d,0x5c50001d,
+	0x5c51001d,0x5c52001d,0x5c53001d,0x5c54001d,0x5c55001d,0x5c56001d,0x5c57001d,0x5c58001d,
+	0x5c59001d,0x5c5a001d,0x5c5b001d,0x5c5c001d,0x5c5d001d,0x5c5e001d,0x5c5f001d,0x5c60001d,
+	0x5c61001d,0x5c62001d,0x5c63001d,0x5c64001d,0x5c65001d,0x5c66001d,0x5c67001d,0x5c68001d,
+	0x5c69001d,0x5c6a001d,0x5c6b001d,0x5c6c001d,0x5c6d001d,0x5c6e001d,0x5c6f001d,0x5c70001d,
+	0x5c71001d,0x5c72001d,0x5c73001d,0x5c74001d,0x5c75001d,0x5c76001d,0x5c77001d,0x5c78001d,
+	0x5c79001d,0x5c7a001d,0x5c7b001d,0x5c7c001d,0x5c7d001d,0x5c7e001d,0x5c7f001d,0x5c80001d,
+	0x5c81001d,0x5c82001d,0x5c83001d,0x5c84001d,0x5c85001d,0x5c86001d,0x5c87001d,0x5c88001d,
+	0x5c89001d,0x5c8a001d,0x5c8b001d,0x5c8c001d,0x5c8d001d,0x5c8e001d,0x5c8f001d,0x5c90001d,
+	0x5c91001d,0x5c92001d,0x5c93001d,0x5c94001d,0x5c95001d,0x5c96001d,0x5c97001d,0x5c98001d,
+	0x5c99001d,0x5c9a001d,0x5c9b001d,0x5c9c001d,0x5c9d001d,0x5c9e001d,0x5c9f001d,0x5ca0001d,
+	0x5ca1001d,0x5ca2001d,0x5ca3001d,0x5ca4001d,0x5ca5001d,0x5ca6001d,0x5ca7001d,0x5ca8001d,
+	0x5ca9001d,0x5caa001d,0x5cab001d,0x5cac001d,0x5cad001d,0x5cae001d,0x5caf001d,0x5cb0001d,
+	0x5cb1001d,0x5cb2001d,0x5cb3001d,0x5cb4001d,0x5cb5001d,0x5cb6001d,0x5cb7001d,0x5cb8001d,
+	0x5cb9001d,0x5cba001d,0x5cbb001d,0x5cbc001d,0x5cbd001d,0x5cbe001d,0x5cbf001d,0x5cc0001d,
+	0x5cc1001d,0x5cc2001d,0x5cc3001d,0x5cc4001d,0x5cc5001d,0x5cc6001d,0x5cc7001d,0x5cc8001d,
+	0x5cc9001d,0x5cca001d,0x5ccb001d,0x5ccc001d,0x5ccd001d,0x5cce001d,0x5ccf001d,0x5cd0001d,
+	0x5cd1001d,0x5cd2001d,0x5cd3001d,0x5cd4001d,0x5cd5001d,0x5cd6001d,0x5cd7001d,0x5cd8001d,
+	0x5cd9001d,0x5cda001d,0x5cdb001d,0x5cdc001d,0x5cdd001d,0x5cde001d,0x5cdf001d,0x5ce0001d,
+	0x5ce1001d,0x5ce2001d,0x5ce3001d,0x5ce4001d,0x5ce5001d,0x5ce6001d,0x5ce7001d,0x5ce8001d,
+	0x5ce9001d,0x5cea001d,0x5ceb001d,0x5cec001d,0x5ced001d,0x5cee001d,0x5cef001d,0x5cf0001d,
+	0x5cf1001d,0x5cf2001d,0x5cf3001d,0x5cf4001d,0x5cf5001d,0x5cf6001d,0x5cf7001d,0x5cf8001d,
+	0x5cf9001d,0x5cfa001d,0x5cfb001d,0x5cfc001d,0x5cfd001d,0x5cfe001d,0x5cff001d,0x5d00001d,
+	0x5d01001d,0x5d02001d,0x5d03001d,0x5d04001d,0x5d05001d,0x5d06001d,0x5d07001d,0x5d08001d,
+	0x5d09001d,0x5d0a001d,0x5d0b001d,0x5d0c001d,0x5d0d001d,0x5d0e001d,0x5d0f001d,0x5d10001d,
+	0x5d11001d,0x5d12001d,0x5d13001d,0x5d14001d,0x5d15001d,0x5d16001d,0x5d17001d,0x5d18001d,
+	0x5d19001d,0x5d1a001d,0x5d1b001d,0x5d1c001d,0x5d1d001d,0x5d1e001d,0x5d1f001d,0x5d20001d,
+	0x5d21001d,0x5d22001d,0x5d23001d,0x5d24001d,0x5d25001d,0x5d26001d,0x5d27001d,0x5d28001d,
+	0x5d29001d,0x5d2a001d,0x5d2b001d,0x5d2c001d,0x5d2d001d,0x5d2e001d,0x5d2f001d,0x5d30001d,
+	0x5d31001d,0x5d32001d,0x5d33001d,0x5d34001d,0x5d35001d,0x5d36001d,0x5d37001d,0x5d38001d,
+	0x5d39001d,0x5d3a001d,0x5d3b001d,0x5d3c001d,0x5d3d001d,0x5d3e001d,0x5d3f001d,0x5d40001d,
+	0x5d41001d,0x5d42001d,0x5d43001d,0x5d44001d,0x5d45001d,0x5d46001d,0x5d47001d,0x5d48001d,
+	0x5d49001d,0x5d4a001d,0x5d4b001d,0x5d4c001d,0x5d4d001d,0x5d4e001d,0x5d4f001d,0x5d50001d,
+	0x5d51001d,0x5d52001d,0x5d53001d,0x5d54001d,0x5d55001d,0x5d56001d,0x5d57001d,0x5d58001d,
+	0x5d59001d,0x5d5a001d,0x5d5b001d,0x5d5c001d,0x5d5d001d,0x5d5e001d,0x5d5f001d,0x5d60001d,
+	0x5d61001d,0x5d62001d,0x5d63001d,0x5d64001d,0x5d65001d,0x5d66001d,0x5d67001d,0x5d68001d,
+	0x5d69001d,0x5d6a001d,0x5d6b001d,0x5d6c001d,0x5d6d001d,0x5d6e001d,0x5d6f001d,0x5d70001d,
+	0x5d71001d,0x5d72001d,0x5d73001d,0x5d74001d,0x5d75001d,0x5d76001d,0x5d77001d,0x5d78001d,
+	0x5d79001d,0x5d7a001d,0x5d7b001d,0x5d7c001d,0x5d7d001d,0x5d7e001d,0x5d7f001d,0x5d80001d,
+	0x5d81001d,0x5d82001d,0x5d83001d,0x5d84001d,0x5d85001d,0x5d86001d,0x5d87001d,0x5d88001d,
+	0x5d89001d,0x5d8a001d,0x5d8b001d,0x5d8c001d,0x5d8d001d,0x5d8e001d,0x5d8f001d,0x5d90001d,
+	0x5d91001d,0x5d92001d,0x5d93001d,0x5d94001d,0x5d95001d,0x5d96001d,0x5d97001d,0x5d98001d,
+	0x5d99001d,0x5d9a001d,0x5d9b001d,0x5d9c001d,0x5d9d001d,0x5d9e001d,0x5d9f001d,0x5da0001d,
+	0x5da1001d,0x5da2001d,0x5da3001d,0x5da4001d,0x5da5001d,0x5da6001d,0x5da7001d,0x5da8001d,
+	0x5da9001d,0x5daa001d,0x5dab001d,0x5dac001d,0x5dad001d,0x5dae001d,0x5daf001d,0x5db0001d,
+	0x5db1001d,0x5db2001d,0x5db3001d,0x5db4001d,0x5db5001d,0x5db6001d,0x5db7001d,0x5db8001d,
+	0x5db9001d,0x5dba001d,0x5dbb001d,0x5dbc001d,0x5dbd001d,0x5dbe001d,0x5dbf001d,0x5dc0001d,
+	0x5dc1001d,0x5dc2001d,0x5dc3001d,0x5dc4001d,0x5dc5001d,0x5dc6001d,0x5dc7001d,0x5dc8001d,
+	0x5dc9001d,0x5dca001d,0x5dcb001d,0x5dcc001d,0x5dcd001d,0x5dce001d,0x5dcf001d,0x5dd0001d,
+	0x5dd1001d,0x5dd2001d,0x5dd3001d,0x5dd4001d,0x5dd5001d,0x5dd6001d,0x5dd7001d,0x5dd8001d,
+	0x5dd9001d,0x5dda001d,0x5ddb001d,0x5ddc001d,0x5ddd001d,0x5dde001d,0x5ddf001d,0x5de0001d,
+	0x5de1001d,0x5de2001d,0x5de3001d,0x5de4001d,0x5de5001d,0x5de6001d,0x5de7001d,0x5de8001d,
+	0x5de9001d,0x5dea001d,0x5deb001d,0x5dec001d,0x5ded001d,0x5dee001d,0x5def001d,0x5df0001d,
+	0x5df1001d,0x5df2001d,0x5df3001d,0x5df4001d,0x5df5001d,0x5df6001d,0x5df7001d,0x5df8001d,
+	0x5df9001d,0x5dfa001d,0x5dfb001d,0x5dfc001d,0x5dfd001d,0x5dfe001d,0x5dff001d,0x5e00001d,
+	0x5e01001d,0x5e02001d,0x5e03001d,0x5e04001d,0x5e05001d,0x5e06001d,0x5e07001d,0x5e08001d,
+	0x5e09001d,0x5e0a001d,0x5e0b001d,0x5e0c001d,0x5e0d001d,0x5e0e001d,0x5e0f001d,0x5e10001d,
+	0x5e11001d,0x5e12001d,0x5e13001d,0x5e14001d,0x5e15001d,0x5e16001d,0x5e17001d,0x5e18001d,
+	0x5e19001d,0x5e1a001d,0x5e1b001d,0x5e1c001d,0x5e1d001d,0x5e1e001d,0x5e1f001d,0x5e20001d,
+	0x5e21001d,0x5e22001d,0x5e23001d,0x5e24001d,0x5e25001d,0x5e26001d,0x5e27001d,0x5e28001d,
+	0x5e29001d,0x5e2a001d,0x5e2b001d,0x5e2c001d,0x5e2d001d,0x5e2e001d,0x5e2f001d,0x5e30001d,
+	0x5e31001d,0x5e32001d,0x5e33001d,0x5e34001d,0x5e35001d,0x5e36001d,0x5e37001d,0x5e38001d,
+	0x5e39001d,0x5e3a001d,0x5e3b001d,0x5e3c001d,0x5e3d001d,0x5e3e001d,0x5e3f001d,0x5e40001d,
+	0x5e41001d,0x5e42001d,0x5e43001d,0x5e44001d,0x5e45001d,0x5e46001d,0x5e47001d,0x5e48001d,
+	0x5e49001d,0x5e4a001d,0x5e4b001d,0x5e4c001d,0x5e4d001d,0x5e4e001d,0x5e4f001d,0x5e50001d,
+	0x5e51001d,0x5e52001d,0x5e53001d,0x5e54001d,0x5e55001d,0x5e56001d,0x5e57001d,0x5e58001d,
+	0x5e59001d,0x5e5a001d,0x5e5b001d,0x5e5c001d,0x5e5d001d,0x5e5e001d,0x5e5f001d,0x5e60001d,
+	0x5e61001d,0x5e62001d,0x5e63001d,0x5e64001d,0x5e65001d,0x5e66001d,0x5e67001d,0x5e68001d,
+	0x5e69001d,0x5e6a001d,0x5e6b001d,0x5e6c001d,0x5e6d001d,0x5e6e001d,0x5e6f001d,0x5e70001d,
+	0x5e71001d,0x5e72001d,0x5e73001d,0x5e74001d,0x5e75001d,0x5e76001d,0x5e77001d,0x5e78001d,
+	0x5e79001d,0x5e7a001d,0x5e7b001d,0x5e7c001d,0x5e7d001d,0x5e7e001d,0x5e7f001d,0x5e80001d,
+	0x5e81001d,0x5e82001d,0x5e83001d,0x5e84001d,0x5e85001d,0x5e86001d,0x5e87001d,0x5e88001d,
+	0x5e89001d,0x5e8a001d,0x5e8b001d,0x5e8c001d,0x5e8d001d,0x5e8e001d,0x5e8f001d,0x5e90001d,
+	0x5e91001d,0x5e92001d,0x5e93001d,0x5e94001d,0x5e95001d,0x5e96001d,0x5e97001d,0x5e98001d,
+	0x5e99001d,0x5e9a001d,0x5e9b001d,0x5e9c001d,0x5e9d001d,0x5e9e001d,0x5e9f001d,0x5ea0001d,
+	0x5ea1001d,0x5ea2001d,0x5ea3001d,0x5ea4001d,0x5ea5001d,0x5ea6001d,0x5ea7001d,0x5ea8001d,
+	0x5ea9001d,0x5eaa001d,0x5eab001d,0x5eac001d,0x5ead001d,0x5eae001d,0x5eaf001d,0x5eb0001d,
+	0x5eb1001d,0x5eb2001d,0x5eb3001d,0x5eb4001d,0x5eb5001d,0x5eb6001d,0x5eb7001d,0x5eb8001d,
+	0x5eb9001d,0x5eba001d,0x5ebb001d,0x5ebc001d,0x5ebd001d,0x5ebe001d,0x5ebf001d,0x5ec0001d,
+	0x5ec1001d,0x5ec2001d,0x5ec3001d,0x5ec4001d,0x5ec5001d,0x5ec6001d,0x5ec7001d,0x5ec8001d,
+	0x5ec9001d,0x5eca001d,0x5ecb001d,0x5ecc001d,0x5ecd001d,0x5ece001d,0x5ecf001d,0x5ed0001d,
+	0x5ed1001d,0x5ed2001d,0x5ed3001d,0x5ed4001d,0x5ed5001d,0x5ed6001d,0x5ed7001d,0x5ed8001d,
+	0x5ed9001d,0x5eda001d,0x5edb001d,0x5edc001d,0x5edd001d,0x5ede001d,0x5edf001d,0x5ee0001d,
+	0x5ee1001d,0x5ee2001d,0x5ee3001d,0x5ee4001d,0x5ee5001d,0x5ee6001d,0x5ee7001d,0x5ee8001d,
+	0x5ee9001d,0x5eea001d,0x5eeb001d,0x5eec001d,0x5eed001d,0x5eee001d,0x5eef001d,0x5ef0001d,
+	0x5ef1001d,0x5ef2001d,0x5ef3001d,0x5ef4001d,0x5ef5001d,0x5ef6001d,0x5ef7001d,0x5ef8001d,
+	0x5ef9001d,0x5efa001d,0x5efb001d,0x5efc001d,0x5efd001d,0x5efe001d,0x5eff001d,0x5f00001d,
+	0x5f01001d,0x5f02001d,0x5f03001d,0x5f04001d,0x5f05001d,0x5f06001d,0x5f07001d,0x5f08001d,
+	0x5f09001d,0x5f0a001d,0x5f0b001d,0x5f0c001d,0x5f0d001d,0x5f0e001d,0x5f0f001d,0x5f10001d,
+	0x5f11001d,0x5f12001d,0x5f13001d,0x5f14001d,0x5f15001d,0x5f16001d,0x5f17001d,0x5f18001d,
+	0x5f19001d,0x5f1a001d,0x5f1b001d,0x5f1c001d,0x5f1d001d,0x5f1e001d,0x5f1f001d,0x5f20001d,
+	0x5f21001d,0x5f22001d,0x5f23001d,0x5f24001d,0x5f25001d,0x5f26001d,0x5f27001d,0x5f28001d,
+	0x5f29001d,0x5f2a001d,0x5f2b001d,0x5f2c001d,0x5f2d001d,0x5f2e001d,0x5f2f001d,0x5f30001d,
+	0x5f31001d,0x5f32001d,0x5f33001d,0x5f34001d,0x5f35001d,0x5f36001d,0x5f37001d,0x5f38001d,
+	0x5f39001d,0x5f3a001d,0x5f3b001d,0x5f3c001d,0x5f3d001d,0x5f3e001d,0x5f3f001d,0x5f40001d,
+	0x5f41001d,0x5f42001d,0x5f43001d,0x5f44001d,0x5f45001d,0x5f46001d,0x5f47001d,0x5f48001d,
+	0x5f49001d,0x5f4a001d,0x5f4b001d,0x5f4c001d,0x5f4d001d,0x5f4e001d,0x5f4f001d,0x5f50001d,
+	0x5f51001d,0x5f52001d,0x5f53001d,0x5f54001d,0x5f55001d,0x5f56001d,0x5f57001d,0x5f58001d,
+	0x5f59001d,0x5f5a001d,0x5f5b001d,0x5f5c001d,0x5f5d001d,0x5f5e001d,0x5f5f001d,0x5f60001d,
+	0x5f61001d,0x5f62001d,0x5f63001d,0x5f64001d,0x5f65001d,0x5f66001d,0x5f67001d,0x5f68001d,
+	0x5f69001d,0x5f6a001d,0x5f6b001d,0x5f6c001d,0x5f6d001d,0x5f6e001d,0x5f6f001d,0x5f70001d,
+	0x5f71001d,0x5f72001d,0x5f73001d,0x5f74001d,0x5f75001d,0x5f76001d,0x5f77001d,0x5f78001d,
+	0x5f79001d,0x5f7a001d,0x5f7b001d,0x5f7c001d,0x5f7d001d,0x5f7e001d,0x5f7f001d,0x5f80001d,
+	0x5f81001d,0x5f82001d,0x5f83001d,0x5f84001d,0x5f85001d,0x5f86001d,0x5f87001d,0x5f88001d,
+	0x5f89001d,0x5f8a001d,0x5f8b001d,0x5f8c001d,0x5f8d001d,0x5f8e001d,0x5f8f001d,0x5f90001d,
+	0x5f91001d,0x5f92001d,0x5f93001d,0x5f94001d,0x5f95001d,0x5f96001d,0x5f97001d,0x5f98001d,
+	0x5f99001d,0x5f9a001d,0x5f9b001d,0x5f9c001d,0x5f9d001d,0x5f9e001d,0x5f9f001d,0x5fa0001d,
+	0x5fa1001d,0x5fa2001d,0x5fa3001d,0x5fa4001d,0x5fa5001d,0x5fa6001d,0x5fa7001d,0x5fa8001d,
+	0x5fa9001d,0x5faa001d,0x5fab001d,0x5fac001d,0x5fad001d,0x5fae001d,0x5faf001d,0x5fb0001d,
+	0x5fb1001d,0x5fb2001d,0x5fb3001d,0x5fb4001d,0x5fb5001d,0x5fb6001d,0x5fb7001d,0x5fb8001d,
+	0x5fb9001d,0x5fba001d,0x5fbb001d,0x5fbc001d,0x5fbd001d,0x5fbe001d,0x5fbf001d,0x5fc0001d,
+	0x5fc1001d,0x5fc2001d,0x5fc3001d,0x5fc4001d,0x5fc5001d,0x5fc6001d,0x5fc7001d,0x5fc8001d,
+	0x5fc9001d,0x5fca001d,0x5fcb001d,0x5fcc001d,0x5fcd001d,0x5fce001d,0x5fcf001d,0x5fd0001d,
+	0x5fd1001d,0x5fd2001d,0x5fd3001d,0x5fd4001d,0x5fd5001d,0x5fd6001d,0x5fd7001d,0x5fd8001d,
+	0x5fd9001d,0x5fda001d,0x5fdb001d,0x5fdc001d,0x5fdd001d,0x5fde001d,0x5fdf001d,0x5fe0001d,
+	0x5fe1001d,0x5fe2001d,0x5fe3001d,0x5fe4001d,0x5fe5001d,0x5fe6001d,0x5fe7001d,0x5fe8001d,
+	0x5fe9001d,0x5fea001d,0x5feb001d,0x5fec001d,0x5fed001d,0x5fee001d,0x5fef001d,0x5ff0001d,
+	0x5ff1001d,0x5ff2001d,0x5ff3001d,0x5ff4001d,0x5ff5001d,0x5ff6001d,0x5ff7001d,0x5ff8001d,
+	0x5ff9001d,0x5ffa001d,0x5ffb001d,0x5ffc001d,0x5ffd001d,0x5ffe001d,0x5fff001d,0x6000001d,
+	0x6001001d,0x6002001d,0x6003001d,0x6004001d,0x6005001d,0x6006001d,0x6007001d,0x6008001d,
+	0x6009001d,0x600a001d,0x600b001d,0x600c001d,0x600d001d,0x600e001d,0x600f001d,0x6010001d,
+	0x6011001d,0x6012001d,0x6013001d,0x6014001d,0x6015001d,0x6016001d,0x6017001d,0x6018001d,
+	0x6019001d,0x601a001d,0x601b001d,0x601c001d,0x601d001d,0x601e001d,0x601f001d,0x6020001d,
+	0x6021001d,0x6022001d,0x6023001d,0x6024001d,0x6025001d,0x6026001d,0x6027001d,0x6028001d,
+	0x6029001d,0x602a001d,0x602b001d,0x602c001d,0x602d001d,0x602e001d,0x602f001d,0x6030001d,
+	0x6031001d,0x6032001d,0x6033001d,0x6034001d,0x6035001d,0x6036001d,0x6037001d,0x6038001d,
+	0x6039001d,0x603a001d,0x603b001d,0x603c001d,0x603d001d,0x603e001d,0x603f001d,0x6040001d,
+	0x6041001d,0x6042001d,0x6043001d,0x6044001d,0x6045001d,0x6046001d,0x6047001d,0x6048001d,
+	0x6049001d,0x604a001d,0x604b001d,0x604c001d,0x604d001d,0x604e001d,0x604f001d,0x6050001d,
+	0x6051001d,0x6052001d,0x6053001d,0x6054001d,0x6055001d,0x6056001d,0x6057001d,0x6058001d,
+	0x6059001d,0x605a001d,0x605b001d,0x605c001d,0x605d001d,0x605e001d,0x605f001d,0x6060001d,
+	0x6061001d,0x6062001d,0x6063001d,0x6064001d,0x6065001d,0x6066001d,0x6067001d,0x6068001d,
+	0x6069001d,0x606a001d,0x606b001d,0x606c001d,0x606d001d,0x606e001d,0x606f001d,0x6070001d,
+	0x6071001d,0x6072001d,0x6073001d,0x6074001d,0x6075001d,0x6076001d,0x6077001d,0x6078001d,
+	0x6079001d,0x607a001d,0x607b001d,0x607c001d,0x607d001d,0x607e001d,0x607f001d,0x6080001d,
+	0x6081001d,0x6082001d,0x6083001d,0x6084001d,0x6085001d,0x6086001d,0x6087001d,0x6088001d,
+	0x6089001d,0x608a001d,0x608b001d,0x608c001d,0x608d001d,0x608e001d,0x608f001d,0x6090001d,
+	0x6091001d,0x6092001d,0x6093001d,0x6094001d,0x6095001d,0x6096001d,0x6097001d,0x6098001d,
+	0x6099001d,0x609a001d,0x609b001d,0x609c001d,0x609d001d,0x609e001d,0x609f001d,0x60a0001d,
+	0x60a1001d,0x60a2001d,0x60a3001d,0x60a4001d,0x60a5001d,0x60a6001d,0x60a7001d,0x60a8001d,
+	0x60a9001d,0x60aa001d,0x60ab001d,0x60ac001d,0x60ad001d,0x60ae001d,0x60af001d,0x60b0001d,
+	0x60b1001d,0x60b2001d,0x60b3001d,0x60b4001d,0x60b5001d,0x60b6001d,0x60b7001d,0x60b8001d,
+	0x60b9001d,0x60ba001d,0x60bb001d,0x60bc001d,0x60bd001d,0x60be001d,0x60bf001d,0x60c0001d,
+	0x60c1001d,0x60c2001d,0x60c3001d,0x60c4001d,0x60c5001d,0x60c6001d,0x60c7001d,0x60c8001d,
+	0x60c9001d,0x60ca001d,0x60cb001d,0x60cc001d,0x60cd001d,0x60ce001d,0x60cf001d,0x60d0001d,
+	0x60d1001d,0x60d2001d,0x60d3001d,0x60d4001d,0x60d5001d,0x60d6001d,0x60d7001d,0x60d8001d,
+	0x60d9001d,0x60da001d,0x60db001d,0x60dc001d,0x60dd001d,0x60de001d,0x60df001d,0x60e0001d,
+	0x60e1001d,0x60e2001d,0x60e3001d,0x60e4001d,0x60e5001d,0x60e6001d,0x60e7001d,0x60e8001d,
+	0x60e9001d,0x60ea001d,0x60eb001d,0x60ec001d,0x60ed001d,0x60ee001d,0x60ef001d,0x60f0001d,
+	0x60f1001d,0x60f2001d,0x60f3001d,0x60f4001d,0x60f5001d,0x60f6001d,0x60f7001d,0x60f8001d,
+	0x60f9001d,0x60fa001d,0x60fb001d,0x60fc001d,0x60fd001d,0x60fe001d,0x60ff001d,0x6100001d,
+	0x6101001d,0x6102001d,0x6103001d,0x6104001d,0x6105001d,0x6106001d,0x6107001d,0x6108001d,
+	0x6109001d,0x610a001d,0x610b001d,0x610c001d,0x610d001d,0x610e001d,0x610f001d,0x6110001d,
+	0x6111001d,0x6112001d,0x6113001d,0x6114001d,0x6115001d,0x6116001d,0x6117001d,0x6118001d,
+	0x6119001d,0x611a001d,0x611b001d,0x611c001d,0x611d001d,0x611e001d,0x611f001d,0x6120001d,
+	0x6121001d,0x6122001d,0x6123001d,0x6124001d,0x6125001d,0x6126001d,0x6127001d,0x6128001d,
+	0x6129001d,0x612a001d,0x612b001d,0x612c001d,0x612d001d,0x612e001d,0x612f001d,0x6130001d,
+	0x6131001d,0x6132001d,0x6133001d,0x6134001d,0x6135001d,0x6136001d,0x6137001d,0x6138001d,
+	0x6139001d,0x613a001d,0x613b001d,0x613c001d,0x613d001d,0x613e001d,0x613f001d,0x6140001d,
+	0x6141001d,0x6142001d,0x6143001d,0x6144001d,0x6145001d,0x6146001d,0x6147001d,0x6148001d,
+	0x6149001d,0x614a001d,0x614b001d,0x614c001d,0x614d001d,0x614e001d,0x614f001d,0x6150001d,
+	0x6151001d,0x6152001d,0x6153001d,0x6154001d,0x6155001d,0x6156001d,0x6157001d,0x6158001d,
+	0x6159001d,0x615a001d,0x615b001d,0x615c001d,0x615d001d,0x615e001d,0x615f001d,0x6160001d,
+	0x6161001d,0x6162001d,0x6163001d,0x6164001d,0x6165001d,0x6166001d,0x6167001d,0x6168001d,
+	0x6169001d,0x616a001d,0x616b001d,0x616c001d,0x616d001d,0x616e001d,0x616f001d,0x6170001d,
+	0x6171001d,0x6172001d,0x6173001d,0x6174001d,0x6175001d,0x6176001d,0x6177001d,0x6178001d,
+	0x6179001d,0x617a001d,0x617b001d,0x617c001d,0x617d001d,0x617e001d,0x617f001d,0x6180001d,
+	0x6181001d,0x6182001d,0x6183001d,0x6184001d,0x6185001d,0x6186001d,0x6187001d,0x6188001d,
+	0x6189001d,0x618a001d,0x618b001d,0x618c001d,0x618d001d,0x618e001d,0x618f001d,0x6190001d,
+	0x6191001d,0x6192001d,0x6193001d,0x6194001d,0x6195001d,0x6196001d,0x6197001d,0x6198001d,
+	0x6199001d,0x619a001d,0x619b001d,0x619c001d,0x619d001d,0x619e001d,0x619f001d,0x61a0001d,
+	0x61a1001d,0x61a2001d,0x61a3001d,0x61a4001d,0x61a5001d,0x61a6001d,0x61a7001d,0x61a8001d,
+	0x61a9001d,0x61aa001d,0x61ab001d,0x61ac001d,0x61ad001d,0x61ae001d,0x61af001d,0x61b0001d,
+	0x61b1001d,0x61b2001d,0x61b3001d,0x61b4001d,0x61b5001d,0x61b6001d,0x61b7001d,0x61b8001d,
+	0x61b9001d,0x61ba001d,0x61bb001d,0x61bc001d,0x61bd001d,0x61be001d,0x61bf001d,0x61c0001d,
+	0x61c1001d,0x61c2001d,0x61c3001d,0x61c4001d,0x61c5001d,0x61c6001d,0x61c7001d,0x61c8001d,
+	0x61c9001d,0x61ca001d,0x61cb001d,0x61cc001d,0x61cd001d,0x61ce001d,0x61cf001d,0x61d0001d,
+	0x61d1001d,0x61d2001d,0x61d3001d,0x61d4001d,0x61d5001d,0x61d6001d,0x61d7001d,0x61d8001d,
+	0x61d9001d,0x61da001d,0x61db001d,0x61dc001d,0x61dd001d,0x61de001d,0x61df001d,0x61e0001d,
+	0x61e1001d,0x61e2001d,0x61e3001d,0x61e4001d,0x61e5001d,0x61e6001d,0x61e7001d,0x61e8001d,
+	0x61e9001d,0x61ea001d,0x61eb001d,0x61ec001d,0x61ed001d,0x61ee001d,0x61ef001d,0x61f0001d,
+	0x61f1001d,0x61f2001d,0x61f3001d,0x61f4001d,0x61f5001d,0x61f6001d,0x61f7001d,0x61f8001d,
+	0x61f9001d,0x61fa001d,0x61fb001d,0x61fc001d,0x61fd001d,0x61fe001d,0x61ff001d,0x6200001d,
+	0x6201001d,0x6202001d,0x6203001d,0x6204001d,0x6205001d,0x6206001d,0x6207001d,0x6208001d,
+	0x6209001d,0x620a001d,0x620b001d,0x620c001d,0x620d001d,0x620e001d,0x620f001d,0x6210001d,
+	0x6211001d,0x6212001d,0x6213001d,0x6214001d,0x6215001d,0x6216001d,0x6217001d,0x6218001d,
+	0x6219001d,0x621a001d,0x621b001d,0x621c001d,0x621d001d,0x621e001d,0x621f001d,0x6220001d,
+	0x6221001d,0x6222001d,0x6223001d,0x6224001d,0x6225001d,0x6226001d,0x6227001d,0x6228001d,
+	0x6229001d,0x622a001d,0x622b001d,0x622c001d,0x622d001d,0x622e001d,0x622f001d,0x6230001d,
+	0x6231001d,0x6232001d,0x6233001d,0x6234001d,0x6235001d,0x6236001d,0x6237001d,0x6238001d,
+	0x6239001d,0x623a001d,0x623b001d,0x623c001d,0x623d001d,0x623e001d,0x623f001d,0x6240001d,
+	0x6241001d,0x6242001d,0x6243001d,0x6244001d,0x6245001d,0x6246001d,0x6247001d,0x6248001d,
+	0x6249001d,0x624a001d,0x624b001d,0x624c001d,0x624d001d,0x624e001d,0x624f001d,0x6250001d,
+	0x6251001d,0x6252001d,0x6253001d,0x6254001d,0x6255001d,0x6256001d,0x6257001d,0x6258001d,
+	0x6259001d,0x625a001d,0x625b001d,0x625c001d,0x625d001d,0x625e001d,0x625f001d,0x6260001d,
+	0x6261001d,0x6262001d,0x6263001d,0x6264001d,0x6265001d,0x6266001d,0x6267001d,0x6268001d,
+	0x6269001d,0x626a001d,0x626b001d,0x626c001d,0x626d001d,0x626e001d,0x626f001d,0x6270001d,
+	0x6271001d,0x6272001d,0x6273001d,0x6274001d,0x6275001d,0x6276001d,0x6277001d,0x6278001d,
+	0x6279001d,0x627a001d,0x627b001d,0x627c001d,0x627d001d,0x627e001d,0x627f001d,0x6280001d,
+	0x6281001d,0x6282001d,0x6283001d,0x6284001d,0x6285001d,0x6286001d,0x6287001d,0x6288001d,
+	0x6289001d,0x628a001d,0x628b001d,0x628c001d,0x628d001d,0x628e001d,0x628f001d,0x6290001d,
+	0x6291001d,0x6292001d,0x6293001d,0x6294001d,0x6295001d,0x6296001d,0x6297001d,0x6298001d,
+	0x6299001d,0x629a001d,0x629b001d,0x629c001d,0x629d001d,0x629e001d,0x629f001d,0x62a0001d,
+	0x62a1001d,0x62a2001d,0x62a3001d,0x62a4001d,0x62a5001d,0x62a6001d,0x62a7001d,0x62a8001d,
+	0x62a9001d,0x62aa001d,0x62ab001d,0x62ac001d,0x62ad001d,0x62ae001d,0x62af001d,0x62b0001d,
+	0x62b1001d,0x62b2001d,0x62b3001d,0x62b4001d,0x62b5001d,0x62b6001d,0x62b7001d,0x62b8001d,
+	0x62b9001d,0x62ba001d,0x62bb001d,0x62bc001d,0x62bd001d,0x62be001d,0x62bf001d,0x62c0001d,
+	0x62c1001d,0x62c2001d,0x62c3001d,0x62c4001d,0x62c5001d,0x62c6001d,0x62c7001d,0x62c8001d,
+	0x62c9001d,0x62ca001d,0x62cb001d,0x62cc001d,0x62cd001d,0x62ce001d,0x62cf001d,0x62d0001d,
+	0x62d1001d,0x62d2001d,0x62d3001d,0x62d4001d,0x62d5001d,0x62d6001d,0x62d7001d,0x62d8001d,
+	0x62d9001d,0x62da001d,0x62db001d,0x62dc001d,0x62dd001d,0x62de001d,0x62df001d,0x62e0001d,
+	0x62e1001d,0x62e2001d,0x62e3001d,0x62e4001d,0x62e5001d,0x62e6001d,0x62e7001d,0x62e8001d,
+	0x62e9001d,0x62ea001d,0x62eb001d,0x62ec001d,0x62ed001d,0x62ee001d,0x62ef001d,0x62f0001d,
+	0x62f1001d,0x62f2001d,0x62f3001d,0x62f4001d,0x62f5001d,0x62f6001d,0x62f7001d,0x62f8001d,
+	0x62f9001d,0x62fa001d,0x62fb001d,0x62fc001d,0x62fd001d,0x62fe001d,0x62ff001d,0x6300001d,
+	0x6301001d,0x6302001d,0x6303001d,0x6304001d,0x6305001d,0x6306001d,0x6307001d,0x6308001d,
+	0x6309001d,0x630a001d,0x630b001d,0x630c001d,0x630d001d,0x630e001d,0x630f001d,0x6310001d,
+	0x6311001d,0x6312001d,0x6313001d,0x6314001d,0x6315001d,0x6316001d,0x6317001d,0x6318001d,
+	0x6319001d,0x631a001d,0x631b001d,0x631c001d,0x631d001d,0x631e001d,0x631f001d,0x6320001d,
+	0x6321001d,0x6322001d,0x6323001d,0x6324001d,0x6325001d,0x6326001d,0x6327001d,0x6328001d,
+	0x6329001d,0x632a001d,0x632b001d,0x632c001d,0x632d001d,0x632e001d,0x632f001d,0x6330001d,
+	0x6331001d,0x6332001d,0x6333001d,0x6334001d,0x6335001d,0x6336001d,0x6337001d,0x6338001d,
+	0x6339001d,0x633a001d,0x633b001d,0x633c001d,0x633d001d,0x633e001d,0x633f001d,0x6340001d,
+	0x6341001d,0x6342001d,0x6343001d,0x6344001d,0x6345001d,0x6346001d,0x6347001d,0x6348001d,
+	0x6349001d,0x634a001d,0x634b001d,0x634c001d,0x634d001d,0x634e001d,0x634f001d,0x6350001d,
+	0x6351001d,0x6352001d,0x6353001d,0x6354001d,0x6355001d,0x6356001d,0x6357001d,0x6358001d,
+	0x6359001d,0x635a001d,0x635b001d,0x635c001d,0x635d001d,0x635e001d,0x635f001d,0x6360001d,
+	0x6361001d,0x6362001d,0x6363001d,0x6364001d,0x6365001d,0x6366001d,0x6367001d,0x6368001d,
+	0x6369001d,0x636a001d,0x636b001d,0x636c001d,0x636d001d,0x636e001d,0x636f001d,0x6370001d,
+	0x6371001d,0x6372001d,0x6373001d,0x6374001d,0x6375001d,0x6376001d,0x6377001d,0x6378001d,
+	0x6379001d,0x637a001d,0x637b001d,0x637c001d,0x637d001d,0x637e001d,0x637f001d,0x6380001d,
+	0x6381001d,0x6382001d,0x6383001d,0x6384001d,0x6385001d,0x6386001d,0x6387001d,0x6388001d,
+	0x6389001d,0x638a001d,0x638b001d,0x638c001d,0x638d001d,0x638e001d,0x638f001d,0x6390001d,
+	0x6391001d,0x6392001d,0x6393001d,0x6394001d,0x6395001d,0x6396001d,0x6397001d,0x6398001d,
+	0x6399001d,0x639a001d,0x639b001d,0x639c001d,0x639d001d,0x639e001d,0x639f001d,0x63a0001d,
+	0x63a1001d,0x63a2001d,0x63a3001d,0x63a4001d,0x63a5001d,0x63a6001d,0x63a7001d,0x63a8001d,
+	0x63a9001d,0x63aa001d,0x63ab001d,0x63ac001d,0x63ad001d,0x63ae001d,0x63af001d,0x63b0001d,
+	0x63b1001d,0x63b2001d,0x63b3001d,0x63b4001d,0x63b5001d,0x63b6001d,0x63b7001d,0x63b8001d,
+	0x63b9001d,0x63ba001d,0x63bb001d,0x63bc001d,0x63bd001d,0x63be001d,0x63bf001d,0x63c0001d,
+	0x63c1001d,0x63c2001d,0x63c3001d,0x63c4001d,0x63c5001d,0x63c6001d,0x63c7001d,0x63c8001d,
+	0x63c9001d,0x63ca001d,0x63cb001d,0x63cc001d,0x63cd001d,0x63ce001d,0x63cf001d,0x63d0001d,
+	0x63d1001d,0x63d2001d,0x63d3001d,0x63d4001d,0x63d5001d,0x63d6001d,0x63d7001d,0x63d8001d,
+	0x63d9001d,0x63da001d,0x63db001d,0x63dc001d,0x63dd001d,0x63de001d,0x63df001d,0x63e0001d,
+	0x63e1001d,0x63e2001d,0x63e3001d,0x63e4001d,0x63e5001d,0x63e6001d,0x63e7001d,0x63e8001d,
+	0x63e9001d,0x63ea001d,0x63eb001d,0x63ec001d,0x63ed001d,0x63ee001d,0x63ef001d,0x63f0001d,
+	0x63f1001d,0x63f2001d,0x63f3001d,0x63f4001d,0x63f5001d,0x63f6001d,0x63f7001d,0x63f8001d,
+	0x63f9001d,0x63fa001d,0x63fb001d,0x63fc001d,0x63fd001d,0x63fe001d,0x63ff001d,0x6400001d,
+	0x6401001d,0x6402001d,0x6403001d,0x6404001d,0x6405001d,0x6406001d,0x6407001d,0x6408001d,
+	0x6409001d,0x640a001d,0x640b001d,0x640c001d,0x640d001d,0x640e001d,0x640f001d,0x6410001d,
+	0x6411001d,0x6412001d,0x6413001d,0x6414001d,0x6415001d,0x6416001d,0x6417001d,0x6418001d,
+	0x6419001d,0x641a001d,0x641b001d,0x641c001d,0x641d001d,0x641e001d,0x641f001d,0x6420001d,
+	0x6421001d,0x6422001d,0x6423001d,0x6424001d,0x6425001d,0x6426001d,0x6427001d,0x6428001d,
+	0x6429001d,0x642a001d,0x642b001d,0x642c001d,0x642d001d,0x642e001d,0x642f001d,0x6430001d,
+	0x6431001d,0x6432001d,0x6433001d,0x6434001d,0x6435001d,0x6436001d,0x6437001d,0x6438001d,
+	0x6439001d,0x643a001d,0x643b001d,0x643c001d,0x643d001d,0x643e001d,0x643f001d,0x6440001d,
+	0x6441001d,0x6442001d,0x6443001d,0x6444001d,0x6445001d,0x6446001d,0x6447001d,0x6448001d,
+	0x6449001d,0x644a001d,0x644b001d,0x644c001d,0x644d001d,0x644e001d,0x644f001d,0x6450001d,
+	0x6451001d,0x6452001d,0x6453001d,0x6454001d,0x6455001d,0x6456001d,0x6457001d,0x6458001d,
+	0x6459001d,0x645a001d,0x645b001d,0x645c001d,0x645d001d,0x645e001d,0x645f001d,0x6460001d,
+	0x6461001d,0x6462001d,0x6463001d,0x6464001d,0x6465001d,0x6466001d,0x6467001d,0x6468001d,
+	0x6469001d,0x646a001d,0x646b001d,0x646c001d,0x646d001d,0x646e001d,0x646f001d,0x6470001d,
+	0x6471001d,0x6472001d,0x6473001d,0x6474001d,0x6475001d,0x6476001d,0x6477001d,0x6478001d,
+	0x6479001d,0x647a001d,0x647b001d,0x647c001d,0x647d001d,0x647e001d,0x647f001d,0x6480001d,
+	0x6481001d,0x6482001d,0x6483001d,0x6484001d,0x6485001d,0x6486001d,0x6487001d,0x6488001d,
+	0x6489001d,0x648a001d,0x648b001d,0x648c001d,0x648d001d,0x648e001d,0x648f001d,0x6490001d,
+	0x6491001d,0x6492001d,0x6493001d,0x6494001d,0x6495001d,0x6496001d,0x6497001d,0x6498001d,
+	0x6499001d,0x649a001d,0x649b001d,0x649c001d,0x649d001d,0x649e001d,0x649f001d,0x64a0001d,
+	0x64a1001d,0x64a2001d,0x64a3001d,0x64a4001d,0x64a5001d,0x64a6001d,0x64a7001d,0x64a8001d,
+	0x64a9001d,0x64aa001d,0x64ab001d,0x64ac001d,0x64ad001d,0x64ae001d,0x64af001d,0x64b0001d,
+	0x64b1001d,0x64b2001d,0x64b3001d,0x64b4001d,0x64b5001d,0x64b6001d,0x64b7001d,0x64b8001d,
+	0x64b9001d,0x64ba001d,0x64bb001d,0x64bc001d,0x64bd001d,0x64be001d,0x64bf001d,0x64c0001d,
+	0x64c1001d,0x64c2001d,0x64c3001d,0x64c4001d,0x64c5001d,0x64c6001d,0x64c7001d,0x64c8001d,
+	0x64c9001d,0x64ca001d,0x64cb001d,0x64cc001d,0x64cd001d,0x64ce001d,0x64cf001d,0x64d0001d,
+	0x64d1001d,0x64d2001d,0x64d3001d,0x64d4001d,0x64d5001d,0x64d6001d,0x64d7001d,0x64d8001d,
+	0x64d9001d,0x64da001d,0x64db001d,0x64dc001d,0x64dd001d,0x64de001d,0x64df001d,0x64e0001d,
+	0x64e1001d,0x64e2001d,0x64e3001d,0x64e4001d,0x64e5001d,0x64e6001d,0x64e7001d,0x64e8001d,
+	0x64e9001d,0x64ea001d,0x64eb001d,0x64ec001d,0x64ed001d,0x64ee001d,0x64ef001d,0x64f0001d,
+	0x64f1001d,0x64f2001d,0x64f3001d,0x64f4001d,0x64f5001d,0x64f6001d,0x64f7001d,0x64f8001d,
+	0x64f9001d,0x64fa001d,0x64fb001d,0x64fc001d,0x64fd001d,0x64fe001d,0x64ff001d,0x6500001d,
+	0x6501001d,0x6502001d,0x6503001d,0x6504001d,0x6505001d,0x6506001d,0x6507001d,0x6508001d,
+	0x6509001d,0x650a001d,0x650b001d,0x650c001d,0x650d001d,0x650e001d,0x650f001d,0x6510001d,
+	0x6511001d,0x6512001d,0x6513001d,0x6514001d,0x6515001d,0x6516001d,0x6517001d,0x6518001d,
+	0x6519001d,0x651a001d,0x651b001d,0x651c001d,0x651d001d,0x651e001d,0x651f001d,0x6520001d,
+	0x6521001d,0x6522001d,0x6523001d,0x6524001d,0x6525001d,0x6526001d,0x6527001d,0x6528001d,
+	0x6529001d,0x652a001d,0x652b001d,0x652c001d,0x652d001d,0x652e001d,0x652f001d,0x6530001d,
+	0x6531001d,0x6532001d,0x6533001d,0x6534001d,0x6535001d,0x6536001d,0x6537001d,0x6538001d,
+	0x6539001d,0x653a001d,0x653b001d,0x653c001d,0x653d001d,0x653e001d,0x653f001d,0x6540001d,
+	0x6541001d,0x6542001d,0x6543001d,0x6544001d,0x6545001d,0x6546001d,0x6547001d,0x6548001d,
+	0x6549001d,0x654a001d,0x654b001d,0x654c001d,0x654d001d,0x654e001d,0x654f001d,0x6550001d,
+	0x6551001d,0x6552001d,0x6553001d,0x6554001d,0x6555001d,0x6556001d,0x6557001d,0x6558001d,
+	0x6559001d,0x655a001d,0x655b001d,0x655c001d,0x655d001d,0x655e001d,0x655f001d,0x6560001d,
+	0x6561001d,0x6562001d,0x6563001d,0x6564001d,0x6565001d,0x6566001d,0x6567001d,0x6568001d,
+	0x6569001d,0x656a001d,0x656b001d,0x656c001d,0x656d001d,0x656e001d,0x656f001d,0x6570001d,
+	0x6571001d,0x6572001d,0x6573001d,0x6574001d,0x6575001d,0x6576001d,0x6577001d,0x6578001d,
+	0x6579001d,0x657a001d,0x657b001d,0x657c001d,0x657d001d,0x657e001d,0x657f001d,0x6580001d,
+	0x6581001d,0x6582001d,0x6583001d,0x6584001d,0x6585001d,0x6586001d,0x6587001d,0x6588001d,
+	0x6589001d,0x658a001d,0x658b001d,0x658c001d,0x658d001d,0x658e001d,0x658f001d,0x6590001d,
+	0x6591001d,0x6592001d,0x6593001d,0x6594001d,0x6595001d,0x6596001d,0x6597001d,0x6598001d,
+	0x6599001d,0x659a001d,0x659b001d,0x659c001d,0x659d001d,0x659e001d,0x659f001d,0x65a0001d,
+	0x65a1001d,0x65a2001d,0x65a3001d,0x65a4001d,0x65a5001d,0x65a6001d,0x65a7001d,0x65a8001d,
+	0x65a9001d,0x65aa001d,0x65ab001d,0x65ac001d,0x65ad001d,0x65ae001d,0x65af001d,0x65b0001d,
+	0x65b1001d,0x65b2001d,0x65b3001d,0x65b4001d,0x65b5001d,0x65b6001d,0x65b7001d,0x65b8001d,
+	0x65b9001d,0x65ba001d,0x65bb001d,0x65bc001d,0x65bd001d,0x65be001d,0x65bf001d,0x65c0001d,
+	0x65c1001d,0x65c2001d,0x65c3001d,0x65c4001d,0x65c5001d,0x65c6001d,0x65c7001d,0x65c8001d,
+	0x65c9001d,0x65ca001d,0x65cb001d,0x65cc001d,0x65cd001d,0x65ce001d,0x65cf001d,0x65d0001d,
+	0x65d1001d,0x65d2001d,0x65d3001d,0x65d4001d,0x65d5001d,0x65d6001d,0x65d7001d,0x65d8001d,
+	0x65d9001d,0x65da001d,0x65db001d,0x65dc001d,0x65dd001d,0x65de001d,0x65df001d,0x65e0001d,
+	0x65e1001d,0x65e2001d,0x65e3001d,0x65e4001d,0x65e5001d,0x65e6001d,0x65e7001d,0x65e8001d,
+	0x65e9001d,0x65ea001d,0x65eb001d,0x65ec001d,0x65ed001d,0x65ee001d,0x65ef001d,0x65f0001d,
+	0x65f1001d,0x65f2001d,0x65f3001d,0x65f4001d,0x65f5001d,0x65f6001d,0x65f7001d,0x65f8001d,
+	0x65f9001d,0x65fa001d,0x65fb001d,0x65fc001d,0x65fd001d,0x65fe001d,0x65ff001d,0x6600001d,
+	0x6601001d,0x6602001d,0x6603001d,0x6604001d,0x6605001d,0x6606001d,0x6607001d,0x6608001d,
+	0x6609001d,0x660a001d,0x660b001d,0x660c001d,0x660d001d,0x660e001d,0x660f001d,0x6610001d,
+	0x6611001d,0x6612001d,0x6613001d,0x6614001d,0x6615001d,0x6616001d,0x6617001d,0x6618001d,
+	0x6619001d,0x661a001d,0x661b001d,0x661c001d,0x661d001d,0x661e001d,0x661f001d,0x6620001d,
+	0x6621001d,0x6622001d,0x6623001d,0x6624001d,0x6625001d,0x6626001d,0x6627001d,0x6628001d,
+	0x6629001d,0x662a001d,0x662b001d,0x662c001d,0x662d001d,0x662e001d,0x662f001d,0x6630001d,
+	0x6631001d,0x6632001d,0x6633001d,0x6634001d,0x6635001d,0x6636001d,0x6637001d,0x6638001d,
+	0x6639001d,0x663a001d,0x663b001d,0x663c001d,0x663d001d,0x663e001d,0x663f001d,0x6640001d,
+	0x6641001d,0x6642001d,0x6643001d,0x6644001d,0x6645001d,0x6646001d,0x6647001d,0x6648001d,
+	0x6649001d,0x664a001d,0x664b001d,0x664c001d,0x664d001d,0x664e001d,0x664f001d,0x6650001d,
+	0x6651001d,0x6652001d,0x6653001d,0x6654001d,0x6655001d,0x6656001d,0x6657001d,0x6658001d,
+	0x6659001d,0x665a001d,0x665b001d,0x665c001d,0x665d001d,0x665e001d,0x665f001d,0x6660001d,
+	0x6661001d,0x6662001d,0x6663001d,0x6664001d,0x6665001d,0x6666001d,0x6667001d,0x6668001d,
+	0x6669001d,0x666a001d,0x666b001d,0x666c001d,0x666d001d,0x666e001d,0x666f001d,0x6670001d,
+	0x6671001d,0x6672001d,0x6673001d,0x6674001d,0x6675001d,0x6676001d,0x6677001d,0x6678001d,
+	0x6679001d,0x667a001d,0x667b001d,0x667c001d,0x667d001d,0x667e001d,0x667f001d,0x6680001d,
+	0x6681001d,0x6682001d,0x6683001d,0x6684001d,0x6685001d,0x6686001d,0x6687001d,0x6688001d,
+	0x6689001d,0x668a001d,0x668b001d,0x668c001d,0x668d001d,0x668e001d,0x668f001d,0x6690001d,
+	0x6691001d,0x6692001d,0x6693001d,0x6694001d,0x6695001d,0x6696001d,0x6697001d,0x6698001d,
+	0x6699001d,0x669a001d,0x669b001d,0x669c001d,0x669d001d,0x669e001d,0x669f001d,0x66a0001d,
+	0x66a1001d,0x66a2001d,0x66a3001d,0x66a4001d,0x66a5001d,0x66a6001d,0x66a7001d,0x66a8001d,
+	0x66a9001d,0x66aa001d,0x66ab001d,0x66ac001d,0x66ad001d,0x66ae001d,0x66af001d,0x66b0001d,
+	0x66b1001d,0x66b2001d,0x66b3001d,0x66b4001d,0x66b5001d,0x66b6001d,0x66b7001d,0x66b8001d,
+	0x66b9001d,0x66ba001d,0x66bb001d,0x66bc001d,0x66bd001d,0x66be001d,0x66bf001d,0x66c0001d,
+	0x66c1001d,0x66c2001d,0x66c3001d,0x66c4001d,0x66c5001d,0x66c6001d,0x66c7001d,0x66c8001d,
+	0x66c9001d,0x66ca001d,0x66cb001d,0x66cc001d,0x66cd001d,0x66ce001d,0x66cf001d,0x66d0001d,
+	0x66d1001d,0x66d2001d,0x66d3001d,0x66d4001d,0x66d5001d,0x66d6001d,0x66d7001d,0x66d8001d,
+	0x66d9001d,0x66da001d,0x66db001d,0x66dc001d,0x66dd001d,0x66de001d,0x66df001d,0x66e0001d,
+	0x66e1001d,0x66e2001d,0x66e3001d,0x66e4001d,0x66e5001d,0x66e6001d,0x66e7001d,0x66e8001d,
+	0x66e9001d,0x66ea001d,0x66eb001d,0x66ec001d,0x66ed001d,0x66ee001d,0x66ef001d,0x66f0001d,
+	0x66f1001d,0x66f2001d,0x66f3001d,0x66f4001d,0x66f5001d,0x66f6001d,0x66f7001d,0x66f8001d,
+	0x66f9001d,0x66fa001d,0x66fb001d,0x66fc001d,0x66fd001d,0x66fe001d,0x66ff001d,0x6700001d,
+	0x6701001d,0x6702001d,0x6703001d,0x6704001d,0x6705001d,0x6706001d,0x6707001d,0x6708001d,
+	0x6709001d,0x670a001d,0x670b001d,0x670c001d,0x670d001d,0x670e001d,0x670f001d,0x6710001d,
+	0x6711001d,0x6712001d,0x6713001d,0x6714001d,0x6715001d,0x6716001d,0x6717001d,0x6718001d,
+	0x6719001d,0x671a001d,0x671b001d,0x671c001d,0x671d001d,0x671e001d,0x671f001d,0x6720001d,
+	0x6721001d,0x6722001d,0x6723001d,0x6724001d,0x6725001d,0x6726001d,0x6727001d,0x6728001d,
+	0x6729001d,0x672a001d,0x672b001d,0x672c001d,0x672d001d,0x672e001d,0x672f001d,0x6730001d,
+	0x6731001d,0x6732001d,0x6733001d,0x6734001d,0x6735001d,0x6736001d,0x6737001d,0x6738001d,
+	0x6739001d,0x673a001d,0x673b001d,0x673c001d,0x673d001d,0x673e001d,0x673f001d,0x6740001d,
+	0x6741001d,0x6742001d,0x6743001d,0x6744001d,0x6745001d,0x6746001d,0x6747001d,0x6748001d,
+	0x6749001d,0x674a001d,0x674b001d,0x674c001d,0x674d001d,0x674e001d,0x674f001d,0x6750001d,
+	0x6751001d,0x6752001d,0x6753001d,0x6754001d,0x6755001d,0x6756001d,0x6757001d,0x6758001d,
+	0x6759001d,0x675a001d,0x675b001d,0x675c001d,0x675d001d,0x675e001d,0x675f001d,0x6760001d,
+	0x6761001d,0x6762001d,0x6763001d,0x6764001d,0x6765001d,0x6766001d,0x6767001d,0x6768001d,
+	0x6769001d,0x676a001d,0x676b001d,0x676c001d,0x676d001d,0x676e001d,0x676f001d,0x6770001d,
+	0x6771001d,0x6772001d,0x6773001d,0x6774001d,0x6775001d,0x6776001d,0x6777001d,0x6778001d,
+	0x6779001d,0x677a001d,0x677b001d,0x677c001d,0x677d001d,0x677e001d,0x677f001d,0x6780001d,
+	0x6781001d,0x6782001d,0x6783001d,0x6784001d,0x6785001d,0x6786001d,0x6787001d,0x6788001d,
+	0x6789001d,0x678a001d,0x678b001d,0x678c001d,0x678d001d,0x678e001d,0x678f001d,0x6790001d,
+	0x6791001d,0x6792001d,0x6793001d,0x6794001d,0x6795001d,0x6796001d,0x6797001d,0x6798001d,
+	0x6799001d,0x679a001d,0x679b001d,0x679c001d,0x679d001d,0x679e001d,0x679f001d,0x67a0001d,
+	0x67a1001d,0x67a2001d,0x67a3001d,0x67a4001d,0x67a5001d,0x67a6001d,0x67a7001d,0x67a8001d,
+	0x67a9001d,0x67aa001d,0x67ab001d,0x67ac001d,0x67ad001d,0x67ae001d,0x67af001d,0x67b0001d,
+	0x67b1001d,0x67b2001d,0x67b3001d,0x67b4001d,0x67b5001d,0x67b6001d,0x67b7001d,0x67b8001d,
+	0x67b9001d,0x67ba001d,0x67bb001d,0x67bc001d,0x67bd001d,0x67be001d,0x67bf001d,0x67c0001d,
+	0x67c1001d,0x67c2001d,0x67c3001d,0x67c4001d,0x67c5001d,0x67c6001d,0x67c7001d,0x67c8001d,
+	0x67c9001d,0x67ca001d,0x67cb001d,0x67cc001d,0x67cd001d,0x67ce001d,0x67cf001d,0x67d0001d,
+	0x67d1001d,0x67d2001d,0x67d3001d,0x67d4001d,0x67d5001d,0x67d6001d,0x67d7001d,0x67d8001d,
+	0x67d9001d,0x67da001d,0x67db001d,0x67dc001d,0x67dd001d,0x67de001d,0x67df001d,0x67e0001d,
+	0x67e1001d,0x67e2001d,0x67e3001d,0x67e4001d,0x67e5001d,0x67e6001d,0x67e7001d,0x67e8001d,
+	0x67e9001d,0x67ea001d,0x67eb001d,0x67ec001d,0x67ed001d,0x67ee001d,0x67ef001d,0x67f0001d,
+	0x67f1001d,0x67f2001d,0x67f3001d,0x67f4001d,0x67f5001d,0x67f6001d,0x67f7001d,0x67f8001d,
+	0x67f9001d,0x67fa001d,0x67fb001d,0x67fc001d,0x67fd001d,0x67fe001d,0x67ff001d,0x6800001d,
+	0x6801001d,0x6802001d,0x6803001d,0x6804001d,0x6805001d,0x6806001d,0x6807001d,0x6808001d,
+	0x6809001d,0x680a001d,0x680b001d,0x680c001d,0x680d001d,0x680e001d,0x680f001d,0x6810001d,
+	0x6811001d,0x6812001d,0x6813001d,0x6814001d,0x6815001d,0x6816001d,0x6817001d,0x6818001d,
+	0x6819001d,0x681a001d,0x681b001d,0x681c001d,0x681d001d,0x681e001d,0x681f001d,0x6820001d,
+	0x6821001d,0x6822001d,0x6823001d,0x6824001d,0x6825001d,0x6826001d,0x6827001d,0x6828001d,
+	0x6829001d,0x682a001d,0x682b001d,0x682c001d,0x682d001d,0x682e001d,0x682f001d,0x6830001d,
+	0x6831001d,0x6832001d,0x6833001d,0x6834001d,0x6835001d,0x6836001d,0x6837001d,0x6838001d,
+	0x6839001d,0x683a001d,0x683b001d,0x683c001d,0x683d001d,0x683e001d,0x683f001d,0x6840001d,
+	0x6841001d,0x6842001d,0x6843001d,0x6844001d,0x6845001d,0x6846001d,0x6847001d,0x6848001d,
+	0x6849001d,0x684a001d,0x684b001d,0x684c001d,0x684d001d,0x684e001d,0x684f001d,0x6850001d,
+	0x6851001d,0x6852001d,0x6853001d,0x6854001d,0x6855001d,0x6856001d,0x6857001d,0x6858001d,
+	0x6859001d,0x685a001d,0x685b001d,0x685c001d,0x685d001d,0x685e001d,0x685f001d,0x6860001d,
+	0x6861001d,0x6862001d,0x6863001d,0x6864001d,0x6865001d,0x6866001d,0x6867001d,0x6868001d,
+	0x6869001d,0x686a001d,0x686b001d,0x21e010f,0x234010f,0x269010f,0x2c4010d,0x26a010f,
+	0x268010f,0x22d010f,0x23e010f,0x23f010f,0x263010f,0x369010f,0x214010f,0x20c010f,
+	0x226010f,0x265010f,0x6c5010d,0x6c6010d,0x6c7010d,0x6c8010d,0x6c9010d,0x6ca010d,
+	0x6cb010d,0x6cc010d,0x6cd010d,0x6ce010d,0x21c010f,0x21a010f,0x36d010f,0x36e010f,
+	0x36f010f,0x221010f,0x262010f,0x6cf0125,0x6e30125,0x6f70125,0x7030125,0x71f0125,
+	0x74b0125,0x7530125,0x7730125,0x78d0125,0x7a10125,0x7b10125,0x7bd0125,0x7e50125,
+	0x7ed0125,0x8050125,0x81d0125,0x8290125,0x8350125,0x85d0125,0x8750125,0x88d0125,
+	0x8a50125,0x8b10125,0x8b90125,0x8bd0125,0x8c90125,0x240010f,0x241010f,0x2091d0f,
+	0x209020f,0x209160f,0x6cf010d,0x6e3010d,0x6f7010d,0x703010d,0x71f010d,0x74b010d,
+	0x753010d,0x773010d,0x78d010d,0x7a1010d,0x7b1010d,0x7bd010d,0x7e5010d,0x7ed010d,
+	0x805010d,0x81d010d,0x829010d,0x835010d,0x85d010d,0x875010d,0x88d010d,0x8a5010d,
+	0x8b1010d,0x8b9010d,0x8bd010d,0x8c9010d,0x242010f,0x371010f,0x243010f,0x374010f,
+	0x228010b,0x219010b,0x22e010b,0x22f010b,0x235010b,
+	};
+
+static const TUint32 TheChineseIndex[] = 
+	{
+	0x20181aca,0x20191acb,0x201c1acc,0x30011ac9,0x30021ac8,0x4e0016ba,0x4e0103eb,0x4e030f2d,
+	0x4e0713de,0x4e0818d0,0x4e0910e0,0x4e0a113a,0x4e0b14db,0x4e0c0f3c,0x4e0d0176,0x4e0e17d4,
+	0x4e100575,0x4e110284,0x4e1319d8,0x4e140fd3,0x4e150ea7,0x4e1611b0,0x4e181014,0x4e190143,
+	0x4e1a16ad,0x4e1b02ea,0x4e1c03ff,0x4e1d122e,0x4e1e0232,0x4e2203fd,0x4e240b87,0x4e25163c,
+	0x4e2710e8,0x4e28067b,0x4e2a05cd,0x4e2b160f,0x4e2c0e65,0x4e2d197e,0x4e3004fe,0x4e3202af,
+	0x4e340bb1,0x4e3619bb,0x4e3813c9,0x4e390348,0x4e3a13fb,0x4e3b19bc,0x4e3d0b3f,0x4e3e098c,
+	0x4e3f0ee9,0x4e430dab,0x4e450968,0x4e47139f,0x4e480ccf,0x4e4916ea,0x4e4b1930,0x4e4c144e,
+	0x4e4d189f,0x4e4e071f,0x4e4f049b,0x4e500af8,0x4e520ef6,0x4e530e6e,0x4e540fbe,0x4e560642,
+	0x4e580239,0x4e5916df,0x4e5c0d41,0x4e5d0967,0x4e5e0f5b,0x4e5f16aa,0x4e6014b3,0x4e61150d,
+	0x4e6611dd,0x4e6907db,0x4e700c92,0x4e710c49,0x4e7310bb,0x4e7e0f8f,0x4e860afd,0x4e8817b4,
+	0x4e89191c,0x4e8b11b5,0x4e8c0498,0x4e8d029b,0x4e8e17b3,0x4e8f0a7e,0x4e911836,0x4e92073d,
+	0x4e930f3d,0x4e941460,0x4e950941,0x4e9805d6,0x4e9a1623,0x4e9b1547,0x4e9f0801,0x4ea01377,
+	0x4ea113e1,0x4ea20a08,0x4ea408ba,0x4ea5069c,0x4ea616f1,0x4ea701e1,0x4ea806f7,0x4ea90d8c,
+	0x4eab151d,0x4eac0932,0x4ead1355,0x4eae0b89,0x4eb20fdd,0x4eb3015b,0x4eb5155e,0x4eba1086,
+	0x4ebb1087,0x4ebf16eb,0x4ec0116f,0x4ec11088,0x4ec20af7,0x4ec303ec,0x4ec41883,0x4ec5091b,
+	0x4ec60f14,0x4ec70278,0x4ec918cd,0x4eca0910,0x4ecb0904,0x4ecd1098,0x4ece02e9,0x4ed10c4e,
+	0x4ed30198,0x4ed41a0c,0x4ed511b1,0x4ed612ae,0x4ed718d1,0x4ed80554,0x4ed914df,0x4edd1363,
+	0x4ede108f,0x4edf0f78,0x4ee105bd,0x4ee30337,0x4ee40bdc,0x4ee516e1,0x4ee810d4,0x4eea16c7,
+	0x4eeb0d91,0x4eec0cee,0x4ef0167d,0x4ef2198b,0x4ef30ec3,0x4ef51462,0x4ef6088e,0x4ef7085b,
+	0x4efb1090,0x4efd04f6,0x4eff04c8,0x4f010f5c,0x4f090a09,0x4f0a16bc,0x4f0d1463,0x4f0e081d,
+	0x4f0f0520,0x4f10049c,0x4f11159b,0x4f17198c,0x4f181784,0x4f1907c9,0x4f1a07a6,0x4f1b17d5,
+	0x4f1e10e3,0x4f1f140b,0x4f2002a8,0x4f221617,0x4f241131,0x4f2501eb,0x4f260c4f,0x4f270199,
+	0x4f2a140c,0x4f2b19c3,0x4f2f0156,0x4f30060d,0x4f320de1,0x4f340078,0x4f360bc6,0x4f381164,
+	0x4f3a1241,0x4f3c1242,0x4f3d083c,0x4f4303c0,0x4f460358,0x4f4d141d,0x4f4e0390,0x4f4f19c4,
+	0x4f501a60,0x4f5117a5,0x4f531325,0x4f5506dc,0x4f5713a5,0x4f581155,0x4f5917b5,0x4f5a16f4,
+	0x4f5b0513,0x4f5c1a61,0x4f5d05f9,0x4f5e0e16,0x4f5f1365,0x4f600de2,0x4f63176b,0x4f6413be,
+	0x4f650f7d,0x4f6709e6,0x4f690e8c,0x4f6c0aee,0x4f6f1677,0x4f700062,0x4f73083f,0x4f740497,
+	0x4f760802,0x4f7b133d,0x4f7c08cd,0x4f7e16fa,0x4f7f11a8,0x4f8309fd,0x4f841942,0x4f88025b,
+	0x4f890a5e,0x4f8b0b46,0x4f8d11b6,0x4f8f19a6,0x4f9117a6,0x4f940d85,0x4f970409,0x4f9b05e9,
+	0x4f9d16bf,0x4fa014cf,0x4fa30c72,0x4fa508ce,0x4fa618fe,0x4fa701a8,0x4fa80fbf,0x4fa90a65,
+	0x4faa01ca,0x4fac0e21,0x4fae1469,0x4faf0710,0x4fb50fde,0x4fbf0115,0x4fc302f4,0x4fc4046c,
+	0x4fc51020,0x4fca09db,0x4fce1a4c,0x4fcf0fcb,0x4fd00b4b,0x4fd1177d,0x4fd7126e,0x4fd8052b,
+	0x4fda0b2f,0x4fdc0ef7,0x4fdd0096,0x4fde17bb,0x4fdf0f5a,0x4fe1157b,0x4fe317da,0x4fe60279,
+	0x4fe8164d,0x4fe90b63,0x4fea0b4c,0x4fed0879,0x4fee159c,0x4fef0549,0x4ff1099b,0x4ff30e56,
+	0x4ff80512,0x4ffa0020,0x4ffe00d7,0x500c0649,0x500d00b1,0x500f11e4,0x50120374,0x501409c2,
+	0x501812f7,0x5019071c,0x501a16e7,0x501c1328,0x501f090b,0x50210202,0x50250a41,0x502609b2,
+	0x5028099c,0x50290f9d,0x502a0ddc,0x502c19f9,0x502d143f,0x502e0c60,0x503a18ab,0x503c1944,
+	0x503e0ff6,0x5043164f,0x5047085a,0x5048082c,0x504c10d1,0x504e13f1,0x504f0ed1,0x5055154f,
+	0x505a1a6a,0x505c1358,0x50650895,0x506c1a37,0x50760e46,0x50771376,0x507b0c08,0x507e04f9,
+	0x507f01f6,0x50800a8f,0x5085055e,0x50880b5c,0x508d0085,0x50a30336,0x50a512f9,0x50a70132,
+	0x50a80296,0x50a90e32,0x50ac0304,0x50b20040,0x50ba0269,0x50bb110a,0x50cf1527,0x50d614a4,
+	0x50da0b92,0x50e60977,0x50e710fd,0x50ec08c6,0x50ed08a1,0x50ee136d,0x50f3127c,0x50f508aa,
+	0x50fb0ece,0x51060947,0x510715d3,0x510b0351,0x511210b2,0x51210b0b,0x513f048c,0x51401470,
+	0x5141183d,0x5143180b,0x51441594,0x5145026b,0x514618e0,0x514814e0,0x51490657,0x514b0a2e,
+	0x514d0d26,0x51510442,0x51541389,0x51551243,0x5156164b,0x515a0365,0x515c0413,0x5162093e,
+	0x516510bd,0x5168104e,0x516b0045,0x516c05e6,0x516d0bf4,0x516e1485,0x51700ac1,0x517105f6,
+	0x51730646,0x5174157d,0x51750142,0x51760f43,0x51770998,0x517803bb,0x51791a0e,0x517b167e,
+	0x517c0868,0x517d11d8,0x51800838,0x518101e6,0x5182095a,0x51850dd3,0x51880593,0x51891074,
+	0x518c01a7,0x518d1858,0x51920cc6,0x51950d2a,0x51960d16,0x519710a8,0x51991557,0x519b09d3,
+	0x519c0e20,0x51a00648,0x51a21989,0x51a41807,0x51a50d5b,0x51ab0140,0x51ac0400,0x51af050b,
+	0x51b00141,0x51b1073f,0x51b2026c,0x51b309bc,0x51b50a78,0x51b616ab,0x51b70b14,0x51bb0408,
+	0x51bc14f7,0x51bd0ba4,0x51c0094a,0x51c40f31,0x51c619f6,0x51c7124f,0x51c90b7f,0x51cb03d1,
+	0x51cc0bce,0x51cf087e,0x51d102ed,0x51db0bbd,0x51dd0e14,0x51e007f8,0x51e104a9,0x51e40510,
+	0x51eb0521,0x51ed0efa,0x51ef09ec,0x51f0077e,0x51f3038b,0x51f50a00,0x51f61593,0x51f8137c,
+	0x51f9002e,0x51fa0287,0x51fb07d8,0x51fc0367,0x51fd06a8,0x51ff186b,0x5200036d,0x520103cf,
+	0x5202036e,0x5203108d,0x520604ea,0x52070fd1,0x520816ed,0x520a09f6,0x520d028a,0x520e1432,
+	0x52111583,0x5212074b,0x5216182a,0x52170ba2,0x52180be3,0x52191878,0x521a0594,0x521b02b6,
+	0x521d0288,0x52201114,0x52240e67,0x52280e79,0x52290b40,0x522b012e,0x522d0943,0x522e0638,
+	0x52300378,0x52330a50,0x5236195e,0x5237120a,0x52381061,0x52391101,0x523a02df,0x523b0a2f,
+	0x523d0671,0x523f0672,0x524009ed,0x52410463,0x52420824,0x52431327,0x524a15e5,0x524c0aaf,
+	0x524d0f89,0x5250063c,0x52510891,0x52541319,0x52560f11,0x525c13c5,0x525e07e4,0x5261164a,
+	0x52650150,0x5267099d,0x5269118c,0x526a087f,0x526f055d,0x527205ba,0x527d0edb,0x527f08d9,
+	0x52810fb8,0x528209c8,0x52880eae,0x529007c3,0x52931718,0x529b0b2a,0x529d1060,0x529e0076,
+	0x529f05e7,0x52a0083d,0x52a11472,0x52a20c94,0x52a30ba3,0x52a80407,0x52a919c5,0x52aa0e2a,
+	0x52ab08f2,0x52ac1039,0x52ad114a,0x52b10b41,0x52b20925,0x52b30ae7,0x52be06dd,0x52bf11b7,
+	0x52c3015a,0x52c7177e,0x52c90d28,0x52cb15f2,0x52d00cfc,0x52d20afb,0x52d615c1,0x52d809f7,
+	0x52df0d98,0x52e40fe6,0x52f01553,0x52f9008b,0x52fa1145,0x52fe05f8,0x52ff1471,0x53001837,
+	0x5305008c,0x530602e2,0x53081595,0x530d0f1a,0x530f0e7f,0x53100535,0x531500d1,0x53160753,
+	0x531700aa,0x531911ce,0x531a04bc,0x531d184c,0x532008b3,0x53210a6e,0x532314ce,0x5326066b,
+	0x532a04db,0x532e0a91,0x53390ec1,0x533a102b,0x533b16be,0x533e010d,0x533f0de7,0x53411199,
+	0x53430f77,0x534510d7,0x5347117e,0x53481461,0x534907a4,0x534a0077,0x534e074d,0x534f154b,
+	0x535100a4,0x53521a46,0x535319fd,0x53550349,0x53560c97,0x53570db6,0x535a015f,0x535c0171,
+	0x535e0110,0x535f0172,0x536018b6,0x536109e5,0x53620c18,0x5363179b,0x53640c24,0x5366063e,
+	0x53671447,0x536908ee,0x536b141b,0x536e1932,0x536f0cc0,0x53701740,0x537113ef,0x537307ff,
+	0x53741065,0x53750c48,0x537709b1,0x5378155b,0x537a091c,0x537f0ff7,0x538201fb,0x53840475,
+	0x53851350,0x53860b3b,0x53890b3c,0x538b1610,0x538c1659,0x538d1158,0x539501a9,0x53980b17,
+	0x539a0719,0x539d031f,0x539f1811,0x53a21511,0x53a31650,0x53a509c7,0x53a6110f,0x53a8028c,
+	0x53a90973,0x53ae1237,0x53b6122c,0x53bb1048,0x53bf1500,0x53c110e1,0x53c2018d,0x53c817a2,
+	0x53c901b2,0x53ca07fa,0x53cb1799,0x53cc1216,0x53cd04b3,0x53d1049a,0x53d411e1,0x53d61044,
+	0x53d711d6,0x53d80116,0x53d915be,0x53db0e69,0x53df1265,0x53e003e5,0x53e30a4a,0x53e4061e,
+	0x53e50993,0x53e60be0,0x53e8036f,0x53e90a4b,0x53ea193f,0x53eb08dd,0x53ec18df,0x53ed0047,
+	0x53ee03ed,0x53ef0a2b,0x53f012bf,0x53f10261,0x53f211a5,0x53f317a3,0x53f50f09,0x53f616ae,
+	0x53f706cf,0x53f8122f,0x53f912e2,0x53fb0af9,0x53fc03d0,0x53fd07d9,0x540115b4,0x54030246,
+	0x540405ce,0x54061687,0x540806db,0x540907fb,0x540a03d6,0x540c1364,0x540d0d57,0x540e0718,
+	0x540f0b3e,0x54101387,0x54111523,0x5412189d,0x541314dc,0x54150c71,0x5416160e,0x54170c85,
+	0x541b09d4,0x541d0bc1,0x541e1398,0x541f172d,0x542004e1,0x542100d3,0x54230ff0,0x54260515,
+	0x54270049,0x54280447,0x542904eb,0x542b06a6,0x542c1352,0x542d0a3d,0x542e121f,0x542f0f60,
+	0x54311935,0x5432173a,0x54341459,0x5435020e,0x54381488,0x543902b8,0x543b1433,0x543c0717,
+	0x543e145a,0x54401611,0x54430476,0x54460333,0x54480234,0x544a05ae,0x544b0517,0x54500daa,
+	0x54520543,0x545316f5,0x54540334,0x54550e45,0x54560b42,0x545700bd,0x5458180c,0x545913c1,
+	0x545b0fa2,0x545c1452,0x54620dd1,0x54640bdd,0x54661787,0x54681992,0x5471061b,0x54721a0b,
+	0x5473141e,0x547506d7,0x54760dc3,0x547714cb,0x54780e83,0x547b1166,0x547c0721,0x547d0d62,
+	0x5480098a,0x5482184d,0x54840457,0x54860e7a,0x548b189e,0x548c06de,0x548e096f,0x548f177b,
+	0x54900558,0x5492199a,0x549409e4,0x5495060e,0x549609e2,0x54990bf7,0x549a0401,0x549b0e0f,
+	0x549d1231,0x54a30658,0x54a418a1,0x54a616cf,0x54a70ba1,0x54a81a0f,0x54a90d42,0x54aa0d05,
+	0x54ab1954,0x54ac169a,0x54ad07e3,0x54af09e8,0x54b1185c,0x54b30a2a,0x54b40793,0x54b814ef,
+	0x54bb159d,0x54bd162b,0x54bf16c0,0x54c00004,0x54c10ef1,0x54c2116c,0x54c40700,0x54c60458,
+	0x54c713b7,0x54c80694,0x54c91853,0x54cc0e5a,0x54cd151e,0x54ce0003,0x54cf05d5,0x54d00a70,
+	0x54d11620,0x54d20324,0x54d3152c,0x54d400e1,0x54d51828,0x54d7074e,0x54d90a67,0x54da045f,
+	0x54dc0826,0x54dd0e22,0x54de0d82,0x54df1769,0x54e505b6,0x54e60e3f,0x54e70247,0x54e8114d,
+	0x54e90b62,0x54ea0da2,0x54ed0a52,0x54ee1542,0x54f218eb,0x54f31890,0x54fa0174,0x54fc06f8,
+	0x54fd05de,0x54ff05cb,0x5501165c,0x5506129e,0x550702c4,0x55090005,0x550f148f,0x551012e9,
+	0x55111a68,0x55140c82,0x551b0c8d,0x55200af2,0x552212a8,0x55231873,0x5524076d,0x552707e5,
+	0x552a050f,0x552c073b,0x552e11d9,0x552f1405,0x5530120b,0x55310204,0x55330b57,0x5537176a,
+	0x553c110c,0x553e13b5,0x553f0725,0x5541198e,0x55430a3b,0x55441a05,0x55461133,0x55490ace,
+	0x554a0001,0x55500309,0x55551309,0x5556035a,0x555c02cc,0x556104d0,0x55640eba,0x55651109,
+	0x55660ab4,0x5567187d,0x556a0e4c,0x556c10f8,0x556d19dc,0x556e0e05,0x5575016c,0x557603f9,
+	0x55770ad8,0x55781546,0x557b0268,0x557c131e,0x557e0964,0x558009e3,0x55811778,0x55821424,
+	0x55830db8,0x55841127,0x55870aae,0x558808ea,0x55890711,0x558a06af,0x558b03e2,0x558f0e34,
+	0x5591172b,0x55940e3e,0x559802ae,0x559907b2,0x559c14be,0x559d06d8,0x559f0a92,0x55a715ce,
+	0x55b10b1d,0x55b31891,0x55b50d30,0x55b70e92,0x55b90a86,0x55bb17f6,0x55bd0c09,0x55be0a59,
+	0x55c4110b,0x55c515ab,0x55c91278,0x55cc0014,0x55cd129d,0x55d10a28,0x55d20327,0x55d310e9,
+	0x55d4021d,0x55d6125d,0x55dc11c9,0x55dd05c5,0x55df08eb,0x55e1143a,0x55e3124b,0x55e4024c,
+	0x55e506c8,0x55e612ac,0x55e80695,0x55ea0fe7,0x55eb0e06,0x55ec06d9,0x55ef0d9f,0x55f203b5,
+	0x55f3000c,0x55f51362,0x55f70031,0x55fd1269,0x55fe1266,0x56000395,0x56010f38,0x560801a1,
+	0x5609084a,0x560c0edf,0x560e056a,0x560f062a,0x561815b1,0x561b0c8f,0x561e0b10,0x561f041f,
+	0x562300c8,0x56241747,0x56270d20,0x562c1a5d,0x562d0e99,0x563119c0,0x5632020c,0x56341a53,
+	0x56361239,0x56390b94,0x563b14a8,0x563f06f2,0x564c01af,0x564d08e3,0x564e16a5,0x56540385,
+	0x56570f19,0x565809b9,0x56590fe9,0x565c0c16,0x56620e3d,0x56640931,0x56680f70,0x56690486,
+	0x566a1875,0x566b16c5,0x566c11cc,0x567115e8,0x5676056d,0x567b10dd,0x567c0eaf,0x568510b3,
+	0x568606c4,0x568e06ca,0x568f132f,0x5693017f,0x56a3153a,0x56af07d4,0x56b7107a,0x56bc08cb,
+	0x56ca0dbe,0x56d40dbd,0x56d713fa,0x56da101b,0x56db123e,0x56dd0876,0x56de079c,0x56df157a,
+	0x56e01721,0x56e10db4,0x56e2138d,0x56e4044e,0x56eb0729,0x56ed180d,0x56f00aa4,0x56f102e1,
+	0x56f413fe,0x56f50c50,0x56f90bc8,0x56fa062d,0x56fd068a,0x56fe137f,0x56ff17a7,0x57030f23,
+	0x570417dd,0x57061812,0x5708104d,0x570917de,0x570a0ff8,0x571c0768,0x571f1386,0x57231189,
+	0x57281859,0x572913fd,0x572a05b3,0x572c144f,0x572d065f,0x572e0ec4,0x572f16c8,0x573003a9,
+	0x57331914,0x57390a76,0x573a01fa,0x573b0f40,0x573e07dc,0x57401950,0x57420071,0x574709d5,
+	0x574a04bf,0x574c00c4,0x574d12ce,0x574e09fc,0x574f075c,0x57501a62,0x57510a3e,0x57570a63,
+	0x575a0863,0x575b12d4,0x575c0b43,0x575d0058,0x575e146e,0x575f04f0,0x576019ee,0x57610f03,
+	0x57640a9a,0x576612de,0x576813a7,0x5769057f,0x576a0efb,0x576b03c3,0x576d0dd9,0x576f0eab,
+	0x5773003e,0x57760d94,0x57770a17,0x577b03a3,0x577c0216,0x578202ba,0x57830aaa,0x57840c04,
+	0x57850c05,0x57860c1b,0x578b1588,0x578c040a,0x57920b08,0x57930572,0x579b0460,0x57a0172e,
+	0x57a1049d,0x57a20607,0x57a3180f,0x57a403df,0x57a60a39,0x57a71137,0x57a9047a,0x57ab03c5,
+	0x57ad1626,0x57ae0a5d,0x57b209ee,0x57b40dc9,0x57b81821,0x57c205df,0x57c30006,0x57cb0c90,
+	0x57ce0238,0x57cf1638,0x57d20ba6,0x57d40f24,0x57d5023a,0x57d811a3,0x57d915f3,0x57da0683,
+	0x57dd0df7,0x57df17f2,0x57e0017c,0x57e40ebb,0x57ed0342,0x57ef0021,0x57f41945,0x57f8170a,
+	0x57f90e87,0x57fa07ea,0x57fd10f4,0x58000a53,0x580212ea,0x5806043f,0x58070919,0x580b0e9b,
+	0x580d138a,0x58110f9e,0x58150464,0x5819172c,0x581e03e3,0x5820071d,0x58210098,0x58240392,
+	0x582a09f9,0x58301662,0x5835042b,0x58440b11,0x584c12b2,0x584d023e,0x58511279,0x585412b4,
+	0x585812ec,0x585e10db,0x586505c6,0x586b1336,0x586c1817,0x587e11f2,0x58800257,0x58810ca3,
+	0x58830956,0x58851207,0x58891771,0x58921135,0x58930d99,0x58990fad,0x589a0b84,0x589e1889,
+	0x589f15b3,0x58a80d7c,0x58a90449,0x58bc07f4,0x58c100f7,0x58c51773,0x58d106f0,0x58d506cb,
+	0x58e4107b,0x58eb11ad,0x58ec1089,0x58ee19e6,0x58f01180,0x58f30a29,0x58f6072d,0x58f916c2,
+	0x5902194d,0x5904029a,0x590700ae,0x590d055b,0x590f14dd,0x59140a8d,0x59151484,0x591613c3,
+	0x5919126f,0x591a0456,0x591c16b2,0x591f0608,0x59241734,0x592507cb,0x59270332,0x59291330,
+	0x592a12c7,0x592b0516,0x592d1686,0x592e166c,0x592f06bd,0x5931118f,0x59341378,0x593716c9,
+	0x59380a5c,0x5939083e,0x593a045b,0x593c0a74,0x59410b64,0x5942076b,0x5944164c,0x59470f44,
+	0x59480daf,0x59490511,0x594b04f7,0x594e0a83,0x594f1a41,0x59510f6c,0x595400be,0x59551701,
+	0x595608af,0x5957130e,0x595819e5,0x595a1490,0x596003ca,0x5962114f,0x59650041,0x59730e39,
+	0x59740e27,0x59760dac,0x59780861,0x597912ad,0x597d06cd,0x59811224,0x598210af,0x598304ce,
+	0x598413ea,0x598619e1,0x59870555,0x59880c83,0x598a1092,0x598d163d,0x5992042f,0x5993081f,
+	0x59961688,0x59970926,0x59990d3d,0x599e0e18,0x59a300d4,0x59a417b6,0x59a513b0,0x59a804c4,
+	0x59a91464,0x59aa17e8,0x59ab0660,0x59ae0dd7,0x59af1995,0x59b2032a,0x59b90ce5,0x59bb0f2f,
+	0x59be0fd5,0x59c60d8e,0x59ca1a25,0x59cb11a9,0x59d00902,0x59d1060f,0x59d21244,0x59d3158e,
+	0x59d4140f,0x59d71117,0x59d80eeb,0x59da168e,0x59dc08a5,0x59dd11e3,0x59e308bc,0x59e50aef,
+	0x59e816d0,0x59ec07e6,0x59f901c5,0x59fb1723,0x59ff1a10,0x5a0113f0,0x5a0313bc,0x5a040c07,
+	0x5a051627,0x5a061081,0x5a0708bd,0x5a080c3f,0x5a090ef5,0x5a0c0b30,0x5a11129f,0x5a131413,
+	0x5a180df8,0x5a1c0da6,0x5a1f09aa,0x5a201169,0x5a2303ac,0x5a25046d,0x5a290d29,0x5a3117bf,
+	0x5a3213ba,0x5a3414f1,0x5a361045,0x5a3c01ed,0x5a40046a,0x5a460f06,0x5a4913d4,0x5a4a0128,
+	0x5a5508f8,0x5a5a07ba,0x5a6200e8,0x5a670951,0x5a6a0ac5,0x5a741745,0x5a7501d5,0x5a761174,
+	0x5a771359,0x5a7a147c,0x5a7f15c5,0x5a920cd7,0x5a9a0ce8,0x5a9b1822,0x5aaa003c,0x5ab20ecd,
+	0x5ab314b7,0x5ab51768,0x5ab8024d,0x5abe0609,0x5ac1085e,0x5ac210f3,0x5ac907f7,0x5acc14f6,
+	0x5ad20015,0x5ad40eee,0x5ad60ee1,0x5ad80aff,0x5adc18c6,0x5ae00b22,0x5ae1039f,0x5ae31637,
+	0x5ae601f9,0x5ae90dd4,0x5aeb0d67,0x5af10fae,0x5b0914a9,0x5b1600f8,0x5b17112b,0x5b320dfd,
+	0x5b34175d,0x5b370d65,0x5b401218,0x5b501a24,0x5b5108ef,0x5b5309bb,0x5b540a44,0x5b551841,
+	0x5b571a2c,0x5b580313,0x5b591295,0x5b5a0522,0x5b5b00bc,0x5b5c1a0d,0x5b5d1541,0x5b5f0d03,
+	0x5b62008d,0x5b630825,0x5b640610,0x5b650e28,0x5b6615ea,0x5b690696,0x5b6a0c40,0x5b6c0dc2,
+	0x5b7011f0,0x5b7101d7,0x5b731a16,0x5b75051d,0x5b7a10b4,0x5b7d0e0b,0x5b800d22,0x5b810e0e,
+	0x5b8312af,0x5b840668,0x5b8518a9,0x5b8717d6,0x5b8811d2,0x5b890019,0x5b8b1259,0x5b8c13cc,
+	0x5b8f0706,0x5b930d19,0x5b950368,0x5b971a30,0x5b980656,0x5b99199b,0x5b9a03f8,0x5b9b13d0,
+	0x5b9c16cc,0x5b9d0094,0x5b9e119e,0x5ba00274,0x5ba11171,0x5ba20a30,0x5ba315cc,0x5ba411bb,
+	0x5ba517a8,0x5ba6076c,0x5baa1506,0x5bab05eb,0x5bb01855,0x5bb3069e,0x5bb4165d,0x5bb5152f,
+	0x5bb60844,0x5bb80224,0x5bb910a0,0x5bbd0a6b,0x5bbe0130,0x5bbf1275,0x5bc2082d,0x5bc4082e,
+	0x5bc51730,0x5bc60d1d,0x5bc70a4d,0x5bcc055f,0x5bd00ce9,0x5bd206ac,0x5bd317f7,0x5bdd0fef,
+	0x5bde0d78,0x5bdf01bd,0x5be1063d,0x5be41480,0x5be50b93,0x5be818ad,0x5bee0b95,0x5bf00765,
+	0x5bf80315,0x5bf90441,0x5bfa123f,0x5bfb15f9,0x5bfc0372,0x5bff11d5,0x5c010502,0x5c04115b,
+	0x5c0608a6,0x5c091422,0x5c0a1a58,0x5c0f153e,0x5c111149,0x5c140490,0x5c15056e,0x5c160862,
+	0x5c18021e,0x5c1a113b,0x5c1c056c,0x5c1d01f5,0x5c22178a,0x5c24178b,0x5c250b9e,0x5c27168c,
+	0x5c2c056f,0x5c310975,0x5c340586,0x5c38118e,0x5c391738,0x5c3a025a,0x5c3b0a0e,0x5c3c0dd8,
+	0x5c3d0924,0x5c3e13f9,0x5c3f0dfe,0x5c400987,0x5c410ecb,0x5c4201b0,0x5c450979,0x5c481030,
+	0x5c491326,0x5c4a0907,0x5c4b1454,0x5c4e11ab,0x5c4f0efd,0x5c5007e7,0x5c51155c,0x5c5518b8,
+	0x5c590469,0x5c5e11fb,0x5c601384,0x5c610c76,0x5c6314c0,0x5c650c7a,0x5c6609a6,0x5c6e0214,
+	0x5c6f139a,0x5c711112,0x5c7916f2,0x5c7a0f5d,0x5c7f17d7,0x5c81128c,0x5c820f5e,0x5c881618,
+	0x5c8c07fc,0x5c8d0f7e,0x5c900f41,0x5c9101ad,0x5c9401c3,0x5c96102d,0x5c97059a,0x5c981501,
+	0x5c99003f,0x5c9a0ac2,0x5c9b0373,0x5c9c004a,0x5ca20a2c,0x5ca305ff,0x5ca91640,0x5cab15a6,
+	0x5cac0854,0x5cad0bde,0x5cb10338,0x5cb3182b,0x5cb50742,0x5cb70d48,0x5cb80025,0x5cbd0402,
+	0x5cbf0a7f,0x5cc10cc1,0x5cc416fb,0x5ccb15fd,0x5cd2040b,0x5cd91965,0x5ce114d1,0x5ce40fbd,
+	0x5ce5191f,0x5ce60c41,0x5ce8046e,0x5cea17ee,0x5ced0fcd,0x5cf00505,0x5cfb09dd,0x5d020ae9,
+	0x5d030ab6,0x5d060a42,0x5d070273,0x5d0e0f4a,0x5d140303,0x5d16161c,0x5d1b09c3,0x5d1e0685,
+	0x5d24153c,0x5d26162f,0x5d271250,0x5d2900c6,0x5d2d18ba,0x5d2e0630,0x5d3413ee,0x5d3d1856,
+	0x5d3e169d,0x5d4707f9,0x5d4a118d,0x5d4b0cd8,0x5d4c0f9f,0x5d5810a1,0x5d5b17c7,0x5d5d0c0f,
+	0x5d691253,0x5d6b1a17,0x5d6c1409,0x5d6f031a,0x5d740817,0x5d8218d7,0x5d990bb5,0x5d9d038c,
+	0x5db716da,0x5dc503b9,0x5dcd13f8,0x5ddb02a4,0x5ddd02a5,0x5dde198f,0x5de115fa,0x5de2020a,
+	0x5de505e4,0x5de61a5f,0x5de70fc9,0x5de80994,0x5de905f2,0x5deb1453,0x5dee01c6,0x5def1025,
+	0x5df10811,0x5df216e0,0x5df3123d,0x5df40046,0x5df71524,0x5dfd160c,0x5dfe090f,0x5e0100db,
+	0x5e0211b2,0x5e030177,0x5e051210,0x5e0604a4,0x5e081190,0x5e0c1489,0x5e0f13ff,0x5e1018d2,
+	0x5e1112f6,0x5e140e8d,0x5e150e53,0x5e16134e,0x5e180b66,0x5e19195f,0x5e1a1998,0x5e1b0158,
+	0x5e1c1960,0x5e1d03ab,0x5e26033c,0x5e27190c,0x5e2d14b4,0x5e2e007e,0x5e31027a,0x5e371406,
+	0x5e3801f7,0x5e3b187e,0x5e3c068b,0x5e3d0cca,0x5e420d1e,0x5e441448,0x5e45053c,0x5e4c0791,
+	0x5e540ca4,0x5e550d9a,0x5e5b18d8,0x5e5e0540,0x5e6104a6,0x5e6202b4,0x5e72057b,0x5e730ef8,
+	0x5e740ded,0x5e76014a,0x5e78158f,0x5e7a1685,0x5e7b076a,0x5e7c17a4,0x5e7d1788,0x5e7f065b,
+	0x5e800ec2,0x5e8419e2,0x5e861007,0x5e8700df,0x5e8a02b3,0x5e8b066a,0x5e8f15bd,0x5e900c19,
+	0x5e911465,0x5e930a57,0x5e941743,0x5e9503a4,0x5e960e7b,0x5e9703c4,0x5e990d3e,0x5e9a05da,
+	0x5e9c0546,0x5e9e0e71,0x5e9f04e2,0x5ea0151a,0x5ea5159e,0x5ea60432,0x5ea71a69,0x5ead1356,
+	0x5eb300a9,0x5eb5001c,0x5eb61204,0x5eb70a04,0x5eb8176f,0x5eb913b1,0x5ebe17df,0x5ec90b6c,
+	0x5eca0adb,0x5ed10920,0x5ed20032,0x5ed30aa9,0x5ed60b9c,0x5edb01dc,0x5ee81563,0x5eea0bbe,
+	0x5ef41737,0x5ef6163a,0x5ef71354,0x5efa088f,0x5efe05f1,0x5eff0df5,0x5f0009e9,0x5f010111,
+	0x5f0216f3,0x5f030f69,0x5f040e25,0x5f081702,0x5f0a00f3,0x5f0b16ec,0x5f0f11b4,0x5f1111c6,
+	0x5f1305e5,0x5f151739,0x5f17051f,0x5f180704,0x5f1b0251,0x5f1f03aa,0x5f2018c3,0x5f250d07,
+	0x5f2614ed,0x5f27072a,0x5f290e2b,0x5f2a094b,0x5f2d0d13,0x5f2f13c4,0x5f3110d2,0x5f39035b,
+	0x5f3a0fac,0x5f3c00eb,0x5f40060a,0x5f5015ed,0x5f52065e,0x5f530362,0x5f550c2d,0x5f561390,
+	0x5f5707af,0x5f581972,0x5f5d16db,0x5f611113,0x5f621586,0x5f641366,0x5f66165a,0x5f690188,
+	0x5f6a011c,0x5f6c0131,0x5f6d0e9c,0x5f7018c7,0x5f711764,0x5f730260,0x5f770e70,0x5f7916f6,
+	0x5f7b0215,0x5f7c00d5,0x5f8013e4,0x5f81191d,0x5f8202f2,0x5f84094c,0x5f85033d,0x5f871609,
+	0x5f8806f4,0x5f891679,0x5f8a0758,0x5f8b0c7d,0x5f8c071a,0x5f9015b5,0x5f921380,0x5f950aba,
+	0x5f97037f,0x5f980e57,0x5f9914bc,0x5f9c01f8,0x5fa117f8,0x5fa80781,0x5faa1602,0x5fad1693,
+	0x5fae13f5,0x5fb51926,0x5fb70381,0x5fbc08db,0x5fbd079a,0x5fc3156d,0x5fc4156c,0x5fc500dc,
+	0x5fc616ee,0x5fc90370,0x5fcc0820,0x5fcd108a,0x5fcf01e8,0x5fd012dd,0x5fd1130f,0x5fd21310,
+	0x5fd60314,0x5fd7195b,0x5fd813eb,0x5fd90cac,0x5fdd1338,0x5fe0197f,0x5fe1026d,0x5fe41466,
+	0x5fe71785,0x5fea124d,0x5feb0a64,0x5fed0112,0x5fee195c,0x5ff10220,0x5ff50df6,0x5ff80e1a,
+	0x5ffb156e,0x5ffd0722,0x5ffe09f5,0x5fff04f8,0x60000757,0x600112c9,0x60021254,0x60031467,
+	0x60040e49,0x60050200,0x600602b7,0x600a0206,0x600d1a64,0x600e1886,0x600f1681,0x60120e2d,
+	0x6014191e,0x60150e54,0x60160179,0x60190743,0x601b032b,0x601c0b67,0x601d1232,0x6020033e,
+	0x602116cd,0x60250803,0x60260e95,0x60271590,0x6028181f,0x60290dda,0x602a0645,0x602b0525,
+	0x602f0fd6,0x6035029c,0x603b1a36,0x603c0443,0x603f16fc,0x60410dd5,0x604215fe,0x604311bc,
+	0x604b0b79,0x604d078e,0x60500a45,0x605206f9,0x60551203,0x60591682,0x605a07ac,0x605d084f,
+	0x60620794,0x60631a22,0x606415bf,0x60670e3b,0x606806f6,0x60690489,0x606a0a31,0x606b040c,
+	0x606c1333,0x606d05ec,0x606f1491,0x60700f74,0x60730a3a,0x6076047b,0x60781374,0x6079162c,
+	0x607a09ef,0x607b01aa,0x607c0dca,0x607d1844,0x607f1780,0x60830aa1,0x60840fc8,0x60891494,
+	0x608c1329,0x608d06b3,0x60921706,0x609407a1,0x609600b2,0x609a1255,0x609b104c,0x609d0a80,
+	0x609f1479,0x60a01789,0x60a30771,0x60a6182c,0x60a80e0d,0x60ab1066,0x60ac15d6,0x60ad0f81,
+	0x60af0d53,0x60b104dd,0x60b200a6,0x60b4030a,0x60b8082f,0x60bb1592,0x60bc0379,0x60c50ffc,
+	0x60c6027b,0x60ca0937,0x60cb13d5,0x60d107d1,0x60d5132c,0x60d813e7,0x60da0726,0x60dc1495,
+	0x60dd01fd,0x60df1407,0x60e007b3,0x60e603c8,0x60e7099e,0x60e80193,0x60e90242,0x60eb00b4,
+	0x60ec0fd9,0x60ed0192,0x60ee035c,0x60ef0650,0x60f00466,0x60f31521,0x60f419f0,0x60f60782,
+	0x60f91084,0x60fa157f,0x61000fca,0x6101027e,0x61060f84,0x610817fc,0x610917c8,0x610d0d55,
+	0x610e00ec,0x610f170e,0x61150480,0x611a17cc,0x611f058b,0x61201847,0x61230b15,0x612404fa,
+	0x61260a93,0x61270a94,0x612b127a,0x613f1825,0x614802d7,0x614a0f99,0x614c077b,0x614e117b,
+	0x6151115e,0x61550d9c,0x615d1313,0x61620ca5,0x616707b5,0x616809f1,0x61701428,0x61751772,
+	0x61770a05,0x618b012b,0x618e188a,0x61940fc3,0x619d0445,0x61a70270,0x61a806a3,0x61a90f71,
+	0x61ac0948,0x61b702a0,0x61be06b9,0x61c20406,0x61c81564,0x61ca0043,0x61cb0cce,0x61d10cf1,
+	0x61d20ad5,0x61d40bbf,0x61e60e37,0x61f50d01,0x61ff1720,0x6206059e,0x620805b2,0x620a1473,
+	0x620b0860,0x620c15ac,0x620d11fd,0x620e109a,0x620f14c3,0x62100233,0x62111444,0x62120905,
+	0x62150fa4,0x621607cd,0x62170fa5,0x621818bd,0x621a0f34,0x621b0850,0x621f0816,0x622109fa,
+	0x62220806,0x62240579,0x62250389,0x622a08fc,0x622c0888,0x622e0c37,0x623302cb,0x62340345,
+	0x6237073e,0x623d0744,0x623e0b47,0x623f04c5,0x624012a7,0x6241010b,0x6243095b,0x62471126,
+	0x62480747,0x624904d3,0x624b11d0,0x624c11d1,0x624d0183,0x624e1896,0x62510f17,0x62520048,
+	0x62530330,0x62541097,0x625813a0,0x625b0a07,0x62630a4c,0x62660f7a,0x62671941,0x62690aa5,
+	0x626a0cec,0x626b10f2,0x626c1672,0x626d0e1b,0x626e0079,0x626f0213,0x62701082,0x62730068,
+	0x62760523,0x62790ea8,0x627c0477,0x627e18dd,0x627f0235,0x62800821,0x62840205,0x628909be,
+	0x628a0055,0x629116f7,0x629211df,0x629319d5,0x62951379,0x62960417,0x62970a0a,0x629818e9,
+	0x629a0544,0x629b0e77,0x629f138e,0x62a00a47,0x62a10c4d,0x62a20fb2,0x62a40740,0x62a5009b,
+	0x62a80e96,0x62ab0eac,0x62ac12c1,0x62b1009c,0x62b503a5,0x62b90d70,0x62bb021a,0x62bc1612,
+	0x62bd0276,0x62bf0d50,0x62c20526,0x62c419bd,0x62c5034a,0x62c601c7,0x62c70d8f,0x62c80deb,
+	0x62c90aab,0x62ca0547,0x62cc007a,0x62cd0e55,0x62ce0bae,0x62d00644,0x62d20996,0x62d313b3,
+	0x62d40050,0x62d613a1,0x62d70e1f,0x62d8097a,0x62d919f8,0x62da0e66,0x62db18db,0x62dc005f,
+	0x62df0de3,0x62e20c06,0x62e30877,0x62e5176c,0x62e60ac3,0x62e70e10,0x62e8014d,0x62e91879,
+	0x62ec0aa6,0x62ed11bd,0x62ee08f4,0x62ef1927,0x62f105f4,0x62f31053,0x62f41213,0x62f6184e,
+	0x62f70a10,0x62fc0eec,0x62fd19d7,0x62fe119f,0x62ff0da0,0x63010256,0x63020640,0x63071955,
+	0x63080fd8,0x63090026,0x630e0a5f,0x6311133e,0x631613b8,0x631a1968,0x631b0c42,0x631d143e,
+	0x631e12b8,0x631f154e,0x63200dc4,0x63210364,0x632208cf,0x63231929,0x63240813,0x63250795,
+	0x63280007,0x632a0e31,0x632b0320,0x632f1917,0x633212a0,0x63391707,0x633a135d,0x633d13d1,
+	0x6342146a,0x634309de,0x63451371,0x63460aa2,0x634919fa,0x634b0c7b,0x634c004d,0x634d06b4,
+	0x634e113e,0x634f0e00,0x635009ab,0x63550175,0x635e0ae6,0x635f1299,0x6361087c,0x6362076e,
+	0x63630375,0x63670ea5,0x63690ba8,0x636d0064,0x636e099f,0x63710009,0x637602bc,0x637708f9,
+	0x637a0da9,0x637b0df1,0x638014e6,0x638203b6,0x6387045a,0x638811da,0x638903d9,0x638a0f13,
+	0x638c18cf,0x638e0815,0x638f1301,0x63900f72,0x63920e58,0x639616b5,0x639809c4,0x63a00c4a,
+	0x63a212e4,0x63a30217,0x63a508e8,0x63a70a46,0x63a81391,0x63a91651,0x63aa0321,0x63ac097f,
+	0x63ad133c,0x63ae0f90,0x63b0005e,0x63b30c26,0x63b40643,0x63b7196e,0x63b80354,0x63ba01d3,
+	0x63bc0651,0x63be1823,0x63c417c9,0x63c60a87,0x63c910aa,0x63cd1a42,0x63ce15cf,0x63cf0d32,
+	0x63d0131f,0x63d201b4,0x63d616c3,0x63de0023,0x63e0162a,0x63e11449,0x63e301cd,0x63e909ea,
+	0x63ea0965,0x63ed08ec,0x63f21153,0x63f41814,0x63f616a8,0x63f81892,0x63fd0ad0,0x63ff0ff2,
+	0x640001d4,0x640105bb,0x64020c10,0x640508d7,0x640b01c9,0x640c18bb,0x640f0162,0x6410029e,
+	0x64130316,0x641410ed,0x641b086f,0x641c125e,0x641e05a8,0x64201229,0x642110ea,0x64260e35,
+	0x642a12ed,0x642c006d,0x642d0326,0x64340f87,0x643a1552,0x643d01ba,0x643f05c7,0x6441048b,
+	0x6444115f,0x644511eb,0x64460065,0x64471694,0x6448013b,0x644a12d0,0x6452014c,0x6454120e,
+	0x645818a8,0x645e0c6b,0x64670305,0x64690d6c,0x646d194b,0x64780d64,0x64790d69,0x647a18ef,
+	0x64820ba0,0x64841748,0x648509ba,0x64870ee7,0x64910230,0x649210d5,0x6495123a,0x649606b8,
+	0x64991a5c,0x649e19e8,0x64a40218,0x64a90b8d,0x64ac0fcf,0x64ad0154,0x64ae0318,0x64b019de,
+	0x64b50df3,0x64b71554,0x64b80c17,0x64ba02fd,0x64bc06ba,0x64c0058e,0x64c20b05,0x64c5112c,
+	0x64cd019e,0x64ce0fff,0x64d00778,0x64d20fea,0x64d70ec6,0x64d8016a,0x64de126a,0x64e21a08,
+	0x64e4158c,0x64e60180,0x65000e5f,0x650907c5,0x6512185e,0x6518107c,0x65251a52,0x652b09d2,
+	0x652e0dc1,0x652f1931,0x65340f15,0x65350f16,0x653611cf,0x65381786,0x65390574,0x653b05e8,
+	0x653e04cc,0x653f192e,0x6545062e,0x65481543,0x65490d14,0x654c039a,0x654f0d54,0x65510974,
+	0x65550267,0x65560030,0x655908e0,0x655b0b72,0x655d00e9,0x655e01fe,0x6562058a,0x656310e6,
+	0x65660448,0x656b08da,0x656c0953,0x65701205,0x65720fb9,0x65741928,0x6577051e,0x6587142c,
+	0x658b18a7,0x658c0133,0x659004d7,0x6591006c,0x65930acb,0x65970416,0x65990b9f,0x659b072e,
+	0x659c1550,0x659f1905,0x65a1144c,0x65a40911,0x65a50262,0x65a70548,0x65a918b7,0x65ab1a00,
+	0x65ad0439,0x65af1234,0x65b01574,0x65b904bd,0x65bc17b1,0x65bd1193,0x65c10e73,0x65c318b1,
+	0x65c40cba,0x65c50c73,0x65c60e8e,0x65cb15d7,0x65cc0938,0x65ce0de4,0x65cf1a47,0x65d20be9,
+	0x65d616e9,0x65d70f54,0x65e01457,0x65e20827,0x65e51099,0x65e60357,0x65e7096d,0x65e8194f,
+	0x65e9186c,0x65ec15fb,0x65ed15bc,0x65ee0569,0x65ef0aad,0x65f0058f,0x65f106b2,0x65f6119c,
+	0x65f70a79,0x65fa13ec,0x6600183a,0x6602002c,0x66031884,0x66060a9b,0x660a06d0,0x660c01ec,
+	0x660e0d58,0x660f07b8,0x661316fd,0x6614148a,0x66151571,0x661912d5,0x661d185d,0x661f157e,
+	0x66201766,0x662502c0,0x66270ce6,0x66281a5e,0x662d18dc,0x662f11be,0x663117ec,0x66340cc3,
+	0x66350de5,0x663601fc,0x663c199d,0x663e14f8,0x66410209,0x6643078f,0x664b092a,0x664c1138,
+	0x664f165e,0x66521111,0x6653153f,0x665416b3,0x66551845,0x66560796,0x665706a9,0x665a13d2,
+	0x665f118a,0x6661016f,0x6664147a,0x666607b0,0x66680225,0x666e0f26,0x666f0946,0x6670149b,
+	0x66740ffd,0x6676093a,0x6677066f,0x667a1973,0x667e0b8c,0x66821860,0x668415d1,0x668714d6,
+	0x668c0a89,0x669111f4,0x66960e2e,0x66970029,0x669d0d5e,0x66a70017,0x66a80832,0x66ae0d9d,
+	0x66b400a0,0x66b914eb,0x66be1399,0x66d911fa,0x66db15f7,0x66dc16a1,0x66dd00a2,0x66e614b1,
+	0x66e90dc0,0x66f01826,0x66f2102c,0x66f316af,0x66f405d9,0x66f706e0,0x66f901a0,0x66fc0ca2,
+	0x66fe1888,0x66ff132d,0x67001a54,0x67081829,0x6709179a,0x670a10c4,0x670b0e9a,0x670d0527,
+	0x6710103a,0x67141226,0x67151918,0x67170ae1,0x671b13ed,0x671d020b,0x671f0f36,0x67260cf8,
+	0x67280d90,0x672a141c,0x672b0d71,0x672c00c1,0x672d1897,0x672f11fc,0x673119a5,0x67340f22,
+	0x6735045e,0x673a07dd,0x673d15a4,0x674010fe,0x6742184f,0x6743104f,0x6746057d,0x674801b3,
+	0x67491115,0x674c1475,0x674e0b2d,0x674f158d,0x67500184,0x67510311,0x67531144,0x675618d3,
+	0x675c0430,0x675e0f61,0x675f11fe,0x6760059c,0x67611340,0x67650ab5,0x67681675,0x67690c8b,
+	0x676a0d35,0x676d06be,0x676f00a5,0x677008f3,0x677205a7,0x67731699,0x67750294,0x67770e4e,
+	0x677c19c7,0x677e124e,0x677f0072,0x67810800,0x67840604,0x67870eb5,0x678913e5,0x678b04c1,
+	0x6790148b,0x6795190e,0x67970bb0,0x679810c9,0x679a0cd2,0x679c068e,0x679d1936,0x679e02e4,
+	0x67a211e2,0x67a3186d,0x67a50b48,0x67a70878,0x67a80236,0x67aa0fa6,0x67ab0501,0x67ad152b,
+	0x67af0a51,0x67b00efe,0x67b31940,0x67b5152d,0x67b6085d,0x67b70841,0x67b80602,0x67c10468,
+	0x67c30bcb,0x67c40146,0x67cf0063,0x67d00d89,0x67d10582,0x67d20f30,0x67d31076,0x67d410a9,
+	0x67d818f7,0x67d914d2,0x67da17a1,0x67dc0673,0x67dd13b4,0x67de1a65,0x67e00e12,0x67e203a6,
+	0x67e501b7,0x67e90971,0x67ec087a,0x67ef0a19,0x67f00db0,0x67f119cb,0x67f30bef,0x67f401cb,
+	0x67fd022e,0x67ff11bf,0x6800193a,0x680518a2,0x6807011d,0x680818be,0x68091966,0x680a0bfa,
+	0x680b040d,0x680c0c1e,0x680e0b4d,0x680f0ac4,0x68111201,0x68131214,0x68160f32,0x68170b52,
+	0x681d063b,0x68211544,0x682915b8,0x682a19ab,0x68320a11,0x68330af0,0x68371683,0x683806e2,
+	0x683905d3,0x683c05c0,0x683d1854,0x683e0c43,0x684008f7,0x684106fa,0x68420676,0x68431307,
+	0x68440659,0x68451403,0x68460a7c,0x68480027,0x6849001a,0x684a09b3,0x684c19fb,0x684e1969,
+	0x68501368,0x685110e7,0x68530762,0x68540901,0x68550972,0x68601614,0x68611080,0x68621901,
+	0x6863036b,0x68640f33,0x68650fc1,0x68660756,0x68670679,0x686808b0,0x686919e3,0x686b12a1,
+	0x68740536,0x68761372,0x687709c5,0x68810b80,0x6883135e,0x68850cd6,0x6886007f,0x688f0631,
+	0x68931a29,0x689705e2,0x68a2113f,0x68a60d04,0x68a7145c,0x68a80b18,0x68ad12a2,0x68af131a,
+	0x68b0155d,0x68b311e6,0x68b504bb,0x68c00880,0x68c20bd1,0x68c90d25,0x68cb0f4f,0x68cd0682,
+	0x68d20086,0x68d51a32,0x68d80807,0x68da0e9d,0x68e012eb,0x68e303b0,0x68ee10fc,0x68f002bd,
+	0x68f10b12,0x68f50a1f,0x68f918e4,0x68fa064a,0x68fc04f2,0x6901068f,0x690516e8,0x690b0b81,
+	0x690d1947,0x690e19ec,0x69100980,0x691208c2,0x691f0425,0x69200fa0,0x69240c5a,0x692d13b2,
+	0x693016a4,0x6934043b,0x6939117c,0x693d02ac,0x693f02c1,0x69421894,0x69541548,0x6957089a,
+	0x695a0298,0x695d0b7c,0x695e0b13,0x69600db9,0x69630cdb,0x696615e2,0x696b080a,0x696e0297,
+	0x697102ee,0x697709f3,0x69781018,0x69791758,0x697c0c0b,0x69800ef2,0x6982057a,0x69840ad2,
+	0x698617cd,0x6987022b,0x69880c70,0x6989098f,0x698d1561,0x69940add,0x699510a4,0x69980990,
+	0x699b1908,0x699c0083,0x69a704de,0x69a818a6,0x69ab129c,0x69ad1562,0x69b10306,0x69b40beb,
+	0x69b7106c,0x69bb12bb,0x69c105aa,0x69ca122b,0x69cc02be,0x69ce01bc,0x69d0075a,0x69d405a2,
+	0x69db09fb,0x69df0136,0x69e019b1,0x69ed0f64,0x69f20735,0x69fd01a3,0x69ff0922,0x6a0a04ad,
+	0x6a170289,0x6a1812f0,0x6a1f18ca,0x6a210d6a,0x6a2814ab,0x6a2a06fc,0x6a2f0fb0,0x6a31174b,
+	0x6a350fc5,0x6a3d1a5a,0x6a3e1832,0x6a44058d,0x6a470fbb,0x6a5013ae,0x6a580989,0x6a590241,
+	0x6a5b09cc,0x6a611528,0x6a6519b3,0x6a710291,0x6a790c28,0x6a7c181b,0x6a8012dc,0x6a8414b9,
+	0x6a8e0feb,0x6a901649,0x6a910b01,0x6a97016b,0x6aa01000,0x6aa90bc0,0x6aab01bf,0x6aac0cf9,
+	0x6b200f9a,0x6b2102de,0x6b22075d,0x6b231572,0x6b2417b7,0x6b270e41,0x6b3217f3,0x6b371496,
+	0x6b390f3b,0x6b3a0f37,0x6b3e0a6d,0x6b43110d,0x6b461575,0x6b471549,0x6b490fa1,0x6b4c05bc,
+	0x6b591162,0x6b62194e,0x6b63192a,0x6b6402dd,0x6b650178,0x6b661468,0x6b670f45,0x6b6a13c2,
+	0x6b790335,0x6b7b123c,0x6b7c0864,0x6b810d72,0x6b8202f3,0x6b83166e,0x6b841339,0x6b86033f,
+	0x6b871132,0x6b89160b,0x6b8a11e5,0x6b8b0190,0x6b8d0ee3,0x6b921840,0x6b930b7a,0x6b961948,
+	0x6b9a034f,0x6b9b0808,0x6ba1013c,0x6baa1719,0x6bb311de,0x6bb40e42,0x6bb50438,0x6bb71728,
+	0x6bbf03cb,0x6bc107a2,0x6bc2061c,0x6bc51715,0x6bcb1458,0x6bcd0d8b,0x6bcf0ce1,0x6bd20422,
+	0x6bd31800,0x6bd400d2,0x6bd500dd,0x6bd600e2,0x6bd70eb6,0x6bd900e5,0x6bdb0cb6,0x6be118b0,
+	0x6bea0d8a,0x6beb06c7,0x6bef12e1,0x6bf3030d,0x6bf510e2,0x6bf911ec,0x6bfd089b,0x6c0501ff,
+	0x6c060f29,0x6c070c2a,0x6c0d1041,0x6c0f11ae,0x6c100394,0x6c110d47,0x6c130cb1,0x6c140f65,
+	0x6c150ee6,0x6c160dae,0x6c180371,0x6c1914e2,0x6c1a02a6,0x6c1b04ee,0x6c1f052c,0x6c210403,
+	0x6c220ff4,0x6c241729,0x6c26069f,0x6c27167f,0x6c28001b,0x6c291629,0x6c2a0a33,0x6c2e0360,
+	0x6c2f0c81,0x6c300ffe,0x6c321835,0x6c34121c,0x6c35121b,0x6c381779,0x6c3d139e,0x6c401351,
+	0x6c411933,0x6c42101d,0x6c4602fc,0x6c4707a5,0x6c4906b0,0x6c4a01c2,0x6c501486,0x6c540f67,
+	0x6c551124,0x6c5706b1,0x6c5b1607,0x6c5c1240,0x6c5d10ba,0x6c5e05f3,0x6c5f08a4,0x6c600252,
+	0x6c611450,0x6c6412e6,0x6c680d18,0x6c69061f,0x6c6a13e0,0x6c7012c8,0x6c7207fd,0x6c740113,
+	0x6c761437,0x6c791597,0x6c7d0f6a,0x6c7e04f1,0x6c810ff1,0x6c8216ca,0x6c831445,0x6c85180e,
+	0x6c8606c2,0x6c881170,0x6c890221,0x6c8c044f,0x6c8f0f2e,0x6c900d93,0x6c9312b7,0x6c940d27,
+	0x6c9910ff,0x6c9b0e8b,0x6c9f05fa,0x6ca10cd1,0x6ca30500,0x6ca40e4a,0x6ca50b44,0x6ca60c51,
+	0x6ca7019a,0x6ca91400,0x6caa0741,0x6cab0d73,0x6cad11ff,0x6cae098b,0x6cb113a8,0x6cb213a3,
+	0x6cb306df,0x6cb804e3,0x6cb9178f,0x6cbb1961,0x6cbc18de,0x6cbd0611,0x6cbe18af,0x6cbf1641,
+	0x6cc41558,0x6cc5101f,0x6cc91051,0x6cca0159,0x6ccc0d1a,0x6cd00afa,0x6cd30708,0x6cd40580,
+	0x6cd504a1,0x6cd60cc2,0x6cd71246,0x6cdb04b6,0x6cde0e17,0x6ce00bc9,0x6ce10e81,0x6ce2014e,
+	0x6ce30f6b,0x6ce50ddb,0x6ce819c8,0x6cea0b0d,0x6ceb15dc,0x6cee0e68,0x6cef0d51,0x6cf012cc,
+	0x6cf1166d,0x6cf3177c,0x6cf500ca,0x6cf615eb,0x6cf70bf8,0x6cf80c1c,0x6cfa0c64,0x6cfb1559,
+	0x6cfc0f04,0x6cfd187a,0x6cfe0933,0x6d0108f5,0x6d04079d,0x6d071724,0x6d0b167a,0x6d0c0ba5,
+	0x6d0e0828,0x6d1210d6,0x6d1714ba,0x6d1919a9,0x6d1a08b5,0x6d1b0c65,0x6d1e040e,0x6d250914,
+	0x6d271412,0x6d2a0709,0x6d2b15c0,0x6d2e1305,0x6d310493,0x6d321993,0x6d3310be,0x6d3515ff,
+	0x6d390761,0x6d3b07c6,0x6d3c13b9,0x6d3d0f75,0x6d3e0e5b,0x6d410be5,0x6d430842,0x6d450f94,
+	0x6d4608a8,0x6d4708be,0x6d4818ff,0x6d4a1a01,0x6d4b01ab,0x6d4d07a8,0x6d4e0829,0x6d4f0be4,
+	0x6d5107bc,0x6d52073a,0x6d530e23,0x6d541600,0x6d5918f8,0x6d5a09df,0x6d5c0080,0x6d5e1a02,
+	0x6d601492,0x6d63076f,0x6d660f25,0x6d6906d1,0x6d6a0ae4,0x6d6e0531,0x6d6f145d,0x6d7417ef,
+	0x6d770699,0x6d78092b,0x6d7c0ce3,0x6d821381,0x6d850e02,0x6d881530,0x6d89115c,0x6d8c177f,
+	0x6d8e14f0,0x6d911272,0x6d9309ac,0x6d9401ae,0x6d95132a,0x6d9b12ff,0x6d9d0af3,0x6d9e0ab7,
+	0x6d9f0b68,0x6da01404,0x6da11440,0x6da30770,0x6da4039b,0x6da610cf,0x6da70896,0x6da818ce,
+	0x6da910f7,0x6daa0537,0x6dab064c,0x6dae1215,0x6daf161d,0x6db216b6,0x6db506aa,0x6db806e5,
+	0x6dbf19fc,0x6dc003c9,0x6dc41a13,0x6dc51497,0x6dc6153d,0x6dc70f4b,0x6dcb0bb2,0x6dcc12f8,
+	0x6dd111e7,0x6dd60dce,0x6dd8130a,0x6dd902eb,0x6ddd04d9,0x6dde1251,0x6de00ecc,0x6de1035d,
+	0x6de417af,0x6de60591,0x6deb1731,0x6dec030b,0x6dee0759,0x6df1116b,0x6df302c6,0x6df707c0,
+	0x6df91630,0x6dfb1331,0x6dfc0d38,0x6e050ff9,0x6e0a180a,0x6e0c0c30,0x6e0d1a2e,0x6e0e0424,
+	0x6e100898,0x6e111184,0x6e1417c3,0x6e161175,0x6e17117a,0x6e1a19be,0x6e1d17b2,0x6e20103c,
+	0x6e210433,0x6e231893,0x6e240160,0x6e25144a,0x6e29142a,0x6e2b155f,0x6e2d1425,0x6e2f059b,
+	0x6e3215e1,0x6e340a2d,0x6e381795,0x6e3a0d39,0x6e430e5c,0x6e440cd9,0x6e4d138c,0x6e4e0d2b,
+	0x6e530e94,0x6e54086c,0x6e56072f,0x6e581512,0x6e5b18c1,0x6e5f0783,0x6e6b08d8,0x6e6e1634,
+	0x6e7e13c6,0x6e7f1195,0x6e830a95,0x6e85089c,0x6e8615c6,0x6e890578,0x6e8f12ee,0x6e901818,
+	0x6e980a36,0x6e9c0be1,0x6e9f0d5d,0x6ea2170f,0x6ea50f27,0x6ea70b16,0x6eaa14a1,0x6eaf127b,
+	0x6eb10fe8,0x6eb2125f,0x6eb415aa,0x6eb610a2,0x6eb707c1,0x6eba0de8,0x6ebb12b3,0x6ebd10bf,
+	0x6ec1028d,0x6ec20e6f,0x6ec703b7,0x6ecb1a18,0x6ecf054e,0x6ed10751,0x6ed31a2b,0x6ed41302,
+	0x6ed51317,0x6ed700ee,0x6eda067f,0x6ede1974,0x6edf1666,0x6ee01160,0x6ee10ca0,0x6ee21759,
+	0x6ee40c7c,0x6ee50ad7,0x6ee60c46,0x6ee80134,0x6ee912d1,0x6ef40393,0x6ef90727,0x6f020edc,
+	0x6f060f39,0x6f090c36,0x6f0f0c13,0x6f130b1f,0x6f141656,0x6f1501a2,0x6f200d79,0x6f240ad3,
+	0x6f2915d8,0x6f2a16c4,0x6f2b0ca6,0x6f2d0cb3,0x6f2f0c6c,0x6f311208,0x6f3318c8,0x6f360776,
+	0x6f3e1684,0x6f46175b,0x6f471536,0x6f4b0b7d,0x6f4d140a,0x6f580e5e,0x6f5c0f92,0x6f5e0c39,
+	0x6f620786,0x6f660b8e,0x6f6d12db,0x6f6e020d,0x6f72114e,0x6f7419b2,0x6f78111e,0x6f7a01dd,
+	0x6f7c136e,0x6f840240,0x6f880219,0x6f89058c,0x6f8c123b,0x6f8d1209,0x6f8e0ea1,0x6f9c0ac9,
+	0x6fa1186f,0x6fa70b35,0x6fb30042,0x6fb601e0,0x6fb912d3,0x6fc007f5,0x6fc20b6e,0x6fc91287,
+	0x6fd10abe,0x6fd20138,0x6fde00fc,0x6fe006cc,0x6fe110b5,0x6fee0f20,0x6fef1a09,0x70110f2c,
+	0x701a06bc,0x701b175f,0x70231569,0x703504fd,0x70391834,0x704c0653,0x704f06d5,0x705e005d,
+	0x706b07c8,0x706c07c7,0x706d0d43,0x706f0383,0x70700792,0x70750bc7,0x70761871,0x70780969,
+	0x707c19fe,0x707e1851,0x707f0195,0x70801676,0x70850674,0x70890c1d,0x708a02b9,0x708e1642,
+	0x7092020f,0x70941062,0x70950a0c,0x70960450,0x70991962,0x709c1410,0x709d0fb5,0x70ab15dd,
+	0x70ac0999,0x70ad12e3,0x70ae0e7d,0x70af095d,0x70b112c3,0x70b30147,0x70b719cc,0x70b818a3,
+	0x70b903bc,0x70bb11a0,0x70bc0b78,0x70bd0265,0x70c00723,0x70c11225,0x70c20ad6,0x70c31353,
+	0x70c80ba7,0x70ca167b,0x70d80702,0x70d90af4,0x70db19b6,0x70df162d,0x70e40a12,0x70e604ac,
+	0x70e71140,0x70e816b4,0x70e907ad,0x70eb12fd,0x70ec092c,0x70ed1085,0x70ef1498,0x70f713cf,
+	0x70f90e98,0x70fd0506,0x71091631,0x710a06b5,0x7110147b,0x711306ab,0x71150772,0x71160cf0,
+	0x7118037a,0x711900b5,0x711a04f3,0x712608c3,0x712f19f7,0x71301663,0x71311664,0x71361071,
+	0x7145043c,0x714a15d2,0x714c0785,0x714e0870,0x715c17fd,0x715e1108,0x71640cdc,0x716615c8,
+	0x716718e5,0x716813f6,0x716e19bf,0x71720090,0x71730732,0x71780106,0x717a1395,0x717d111d,
+	0x718414a5,0x718a159a,0x718f15f4,0x719410a5,0x71980be2,0x719914a6,0x719f11f3,0x71a01716,
+	0x71a8184a,0x71ac002f,0x71b30ca9,0x71b51136,0x71b914ac,0x71c31073,0x71ce0b98,0x71d404af,
+	0x71d5166a,0x71e01803,0x71e51876,0x71e71292,0x71ee1568,0x71f914ff,0x720600a1,0x721d09d1,
+	0x72280302,0x722a19d6,0x722c0e4f,0x72301810,0x72310011,0x723509cd,0x72360552,0x723716a6,
+	0x72380059,0x723903dc,0x723b168b,0x723d1219,0x723f0e60,0x72470ed9,0x72480073,0x724c0e59,
+	0x724d0426,0x725203e6,0x7256179f,0x72591616,0x725b0e19,0x725d0ef3,0x725f0d84,0x72610d8d,
+	0x72620ae8,0x72660cb8,0x72670d95,0x72691477,0x726e0892,0x726f0623,0x72721181,0x72750f80,
+	0x72791311,0x727a1493,0x727e146b,0x727f0632,0x7280149c,0x72810b1c,0x728407eb,0x728a0427,
+	0x728b09a1,0x728d086d,0x728f0ed2,0x72920a14,0x729f08b8,0x72ac105d,0x72ad105c,0x72af04b5,
+	0x72b0101c,0x72b40024,0x72b619e7,0x72b7065c,0x72b80c87,0x72b9178d,0x72c1183e,0x72c20a72,
+	0x72c30e1c,0x72c40397,0x72c800ac,0x72cd0e7c,0x72ce14d0,0x72d0072b,0x72d204e4,0x72d70600,
+	0x72d9097b,0x72de0e11,0x72e006f5,0x72e108d0,0x72e8109c,0x72e911d7,0x72ec0429,0x72ed14d3,
+	0x72ee1194,0x72ef0a68,0x72f01920,0x72f117ed,0x72f21296,0x72f317c0,0x72f400e6,0x72f709b4,
+	0x72f80b19,0x72fa172f,0x72fb1280,0x72fc0ada,0x73010b53,0x730314fa,0x730a0dde,0x730e0ba9,
+	0x73130689,0x73150d0a,0x731601ee,0x731716dc,0x731b0cfd,0x731c0182,0x731d02f5,0x731e1150,
+	0x73210c56,0x73220730,0x73251416,0x73291580,0x732a19ae,0x732b0cb5,0x732c1426,0x732e150a,
+	0x73310dc7,0x73340712,0x73371797,0x73380cda,0x733901bb,0x733e0752,0x733f1819,0x734d0957,
+	0x735018c9,0x73520033,0x735709ca,0x73600b96,0x736c1565,0x736d12b5,0x736f15f5,0x737e075e,
+	0x738415d4,0x73870c7f,0x738917e4,0x738b13e2,0x738e03ee,0x739107de,0x7396096a,0x739b0c88,
+	0x739f0d49,0x73a2013a,0x73a913cd,0x73ab0cd3,0x73ae1411,0x73af075f,0x73b01503,0x73b20bcc,
+	0x73b30340,0x73b703c6,0x73ba14bb,0x73bb014f,0x73c00f0d,0x73c20a1a,0x73c80843,0x73c90d4b,
+	0x73ca111a,0x73cd1900,0x73cf09bf,0x73d004a3,0x73d10bfb,0x73d905f5,0x73de0c69,0x73e019ac,
+	0x73e50495,0x73e71690,0x73e906fb,0x73ed0069,0x73f20797,0x74031023,0x74050adc,0x74060b32,
+	0x74090be7,0x740a161a,0x740f0b73,0x741012aa,0x741a0981,0x741b021c,0x74221a06,0x7425073c,
+	0x74260f50,0x74280a9c,0x742a0f51,0x742c13d9,0x742e02ec,0x74301654,0x74330bb3,0x74340fe4,
+	0x74350ebc,0x74360e51,0x743c1012,0x74410ccb,0x745514d7,0x74571824,0x74590dcc,0x745a0733,
+	0x745b1746,0x745c17ce,0x745e10cc,0x745f10fa,0x746d12ef,0x74700666,0x74761696,0x74770018,
+	0x747e0923,0x74800307,0x748102e7,0x74830b23,0x748715d9,0x748b18cb,0x748e174c,0x74900c3a,
+	0x749c0787,0x749e0f1f,0x74a700ff,0x74a80197,0x74a9103f,0x74ba1438,0x74d21863,0x74dc0637,
+	0x74de03e0,0x74e00748,0x74e20ee0,0x74e3007c,0x74e41078,0x74e613bd,0x74ee143c,0x74ef0e43,
+	0x74f40bcd,0x74f60eff,0x74f702d6,0x74ff017d,0x75041906,0x750d0cf6,0x750f00cc,0x7511188e,
+	0x75130ecf,0x7518057c,0x75190339,0x751a1178,0x751c1335,0x751f117f,0x75251183,0x75281783,
+	0x7529120f,0x752b0545,0x752c177a,0x752d00c9,0x752f0e15,0x75301332,0x7531178c,0x75320855,
+	0x75331163,0x753503bf,0x75370db5,0x753803c1,0x753a03f4,0x753b0754,0x753e1852,0x754000e0,
+	0x75450201,0x754804ba,0x754b1334,0x754c0908,0x754e105e,0x754f141f,0x75540e6b,0x75590be6,
+	0x755a00c3,0x755b1910,0x755c02a3,0x75650c4b,0x75660f4c,0x756a04a5,0x75721152,0x7574027d,
+	0x757807ee,0x757913db,0x757f07f1,0x7583138f,0x758608ad,0x758b0ec8,0x758f11e9,0x759116d9,
+	0x75920dcf,0x759403ef,0x759608e6,0x75970b90,0x759905b5,0x759a0970,0x759d1125,0x759f0e2f,
+	0x75a00b49,0x75a11678,0x75a31790,0x75a4004c,0x75a50909,0x75ab1703,0x75ac0b4e,0x75ae02b1,
+	0x75af0503,0x75b019ce,0x75b10e82,0x75b20eb7,0x75b30584,0x75b40a1d,0x75b502d1,0x75b80353,
+	0x75b91911,0x75bc1314,0x75bd097e,0x75be0805,0x75c20845,0x75c315d5,0x75c418a4,0x75c5014b,
+	0x75c7192f,0x75c8176d,0x75c9094f,0x75ca1055,0x75cd16d5,0x75d21680,0x75d4196f,0x75d506f3,
+	0x75d61621,0x75d8041d,0x75db1375,0x75de0ec5,0x75e20b5d,0x75e31975,0x75e4031b,0x75e6147d,
+	0x75e71105,0x75e80aea,0x75ea0774,0x75eb14f4,0x75f012d8,0x75f104e7,0x75f4024e,0x75f900ef,
+	0x75fc0634,0x75ff1417,0x760017b0,0x7601030e,0x760319b9,0x76050356,0x760a0713,0x760c0ab1,
+	0x761017e0,0x76150859,0x76171713,0x76180c14,0x761910f5,0x761b026a,0x761f142b,0x7620080d,
+	0x7622006e,0x76240bec,0x762501cf,0x762611dc,0x7629032d,0x762a012d,0x762b12d2,0x762d0122,
+	0x76300c62,0x76330277,0x763418d9,0x763518ae,0x76381064,0x763c0d7d,0x763e173e,0x763f1765,
+	0x7640078a,0x76430c01,0x764c000b,0x764d006f,0x7654171e,0x76560ec7,0x765c03cd,0x765e0abf,
+	0x766315db,0x766b03ba,0x766f1042,0x7678066d,0x767b0384,0x767d0060,0x767e0061,0x76821872,
+	0x76840382,0x768608e7,0x7687077d,0x76880663,0x768b059f,0x768e08d3,0x7691000a,0x769306d3,
+	0x769613da,0x769914a2,0x76a40f08,0x76ae0eb3,0x76b119a0,0x76b209d7,0x76b40312,0x76bf0d4e,
+	0x76c217b8,0x76c51981,0x76c60e93,0x76c81752,0x76ca1708,0x76cd06e3,0x76ce002d,0x76cf18b9,
+	0x76d01644,0x76d10869,0x76d206e6,0x76d40a81,0x76d60577,0x76d7037b,0x76d80e61,0x76db118b,
+	0x76df0cf5,0x76e50652,0x76ee0d92,0x76ef03f0,0x76f115ad,0x76f20cae,0x76f41943,0x76f8150f,
+	0x76f9044c,0x76fc0e6a,0x76fe0451,0x77011186,0x77040d2e,0x77070d36,0x7708034b,0x77090cd4,
+	0x770b0a01,0x770d0a49,0x771916d3,0x771a1187,0x771f1902,0x77200d23,0x77221808,0x77261a2f,
+	0x7728189b,0x772915df,0x772d067a,0x772f0d06,0x7735024a,0x77360a7d,0x773709b7,0x77380d86,
+	0x773a1348,0x773c1652,0x774018fb,0x77411922,0x774312a3,0x774703b1,0x77500abc,0x77510882,
+	0x775a161e,0x775b093c,0x7761121e,0x77621286,0x77630420,0x77650101,0x77660d9b,0x77680de9,
+	0x776b08fb,0x776c0189,0x7779042d,0x777d0a8b,0x777e05a3,0x777f10cd,0x77800ccc,0x77840d33,
+	0x77850285,0x778c0a24,0x778d1267,0x778e14cd,0x77910d5f,0x77920c9c,0x779f0ee4,0x77a00231,
+	0x77a20cf7,0x77a50ee8,0x77a70fc6,0x77a919c2,0x77aa038d,0x77ac1222,0x77b00a03,0x77b3136f,
+	0x77b50bb9,0x77bb18b5,0x77bd062c,0x77bf1038,0x77cd09d0,0x77d702a2,0x77db0cb7,0x77dc0915,
+	0x77e211a6,0x77e316e3,0x77e51937,0x77e71172,0x77e9098d,0x77eb08d4,0x77ec031c,0x77ed0437,
+	0x77ee000d,0x77f3119b,0x77f607e1,0x77f80587,0x77fd148c,0x77fe04aa,0x77ff0a7a,0x78000369,
+	0x78010c89,0x78021102,0x7809074c,0x780c0f6d,0x780d09fe,0x78111628,0x78120ead,0x78141643,
+	0x781619d9,0x78170212,0x78180452,0x781a165b,0x781c0504,0x781d04a2,0x781f189c,0x782313aa,
+	0x782503a7,0x782618ac,0x78271903,0x78290532,0x782c0b38,0x782d0103,0x78300e97,0x78340f0e,
+	0x7837116a,0x78381850,0x78390012,0x783a0b54,0x783b0bfd,0x783c1369,0x783e0b55,0x78400295,
+	0x78450665,0x78470dc5,0x784c05d0,0x784e1589,0x78500411,0x78521499,0x78551228,0x785614d4,
+	0x78570fb6,0x785d1534,0x786a144b,0x786b0be8,0x786c1767,0x786d0cb0,0x786e1068,0x78770883,
+	0x787c0e9e,0x788703fb,0x788903d3,0x788c0c34,0x788d0016,0x788e1290,0x789100a7,0x78930444,
+	0x789713dc,0x789803bd,0x789a00b7,0x789b0f6f,0x789c0227,0x789f03e7,0x78a119a4,0x78a308fd,
+	0x78a5010e,0x78a700f4,0x78b00ea6,0x78b10889,0x78b203b4,0x78b312e5,0x78b401be,0x78b915e3,
+	0x78be0df4,0x78c102d9,0x78c50089,0x78c910eb,0x78ca0b09,0x78cb0317,0x78d00e62,0x78d418f0,
+	0x78d50a25,0x78d90680,0x78e80d6d,0x78ec1009,0x78f2103e,0x78f4038e,0x78f70bba,0x78fa078b,
+	0x790108c9,0x7905044a,0x791308ac,0x791e0cfa,0x79240181,0x79340167,0x793a11b3,0x793b11af,
+	0x793c0b2c,0x793e115a,0x79401245,0x79410f3e,0x794614e3,0x79480f46,0x79491953,0x7953052d,
+	0x79561a4d,0x7957193b,0x795a1a66,0x795b1031,0x795c0745,0x795d19cd,0x795e116e,0x795f128d,
+	0x796002d3,0x79620d08,0x7965151b,0x7967133f,0x79680ee5,0x796d0830,0x796f1904,0x79770376,
+	0x797807d0,0x797a0f52,0x79800149,0x7981091a,0x79840c33,0x798501d8,0x798a14ca,0x798f053d,
+	0x799a1a07,0x79a714c2,0x79b31077,0x79b917db,0x79ba17bc,0x79bb0b1a,0x79bd0fe5,0x79be06da,
+	0x79c015a5,0x79c11230,0x79c3137d,0x79c60588,0x79c90145,0x79cb1016,0x79cd1988,0x79d10a1b,
+	0x79d20d37,0x79d500d6,0x79d80d1c,0x79df1a43,0x79e30d76,0x79e40245,0x79e60fe3,0x79e7166f,
+	0x79e9196a,0x79eb11ef,0x79ed1a26,0x79ef07e8,0x79f0022d,0x79f808e9,0x79fb16d6,0x79fd07b1,
+	0x7a00149d,0x7a020ade,0x7a03051b,0x7a060c74,0x7a0b023c,0x7a0d1141,0x7a0e121d,0x7a14108c,
+	0x7a170067,0x7a1a1978,0x7a1e0a21,0x7a20027f,0x7a23126d,0x7a331435,0x7a370836,0x7a391913,
+	0x7a3b037d,0x7a3c085f,0x7a3d07f2,0x7a3f05ab,0x7a460d9e,0x7a5110fb,0x7a571293,0x7a701079,
+	0x7a7415e9,0x7a760960,0x7a77100e,0x7a78148d,0x7a79100f,0x7a7a0a40,0x7a7f02a7,0x7a8019f4,
+	0x7a81137e,0x7a830fd7,0x7a8418aa,0x7a86010c,0x7a88169b,0x7a8d0fce,0x7a911691,0x7a921970,
+	0x7a951347,0x7a9608e1,0x7a9702b2,0x7a98095e,0x7a9c0300,0x7a9d1442,0x7a9f0a54,0x7aa00a22,
+	0x7aa50a82,0x7aa6041e,0x7aa8173f,0x7aac17d1,0x7aad09a4,0x7ab317e1,0x7abf0c02,0x7acb0b3d,
+	0x7ad61202,0x7ad918bf,0x7ade0950,0x7adf0952,0x7ae018c4,0x7ae309e1,0x7ae5136b,0x7ae61257,
+	0x7aed08fe,0x7aef0436,0x7af919b4,0x7afa19b5,0x7afd17bd,0x7aff0583,0x7b03042a,0x7b0407e9,
+	0x7b06004e,0x7b080804,0x7b0a18e3,0x7b0b129a,0x7b0f0746,0x7b111545,0x7b1400d8,0x7b15087d,
+	0x7b191182,0x7b1b039d,0x7b1e024b,0x7b200b58,0x7b241342,0x7b251249,0x7b260538,0x7b2800c5,
+	0x7b2a0331,0x7b2b1a28,0x7b2c03ae,0x7b2e187f,0x7b310603,0x7b330846,0x7b380f0b,0x7b3a086a,
+	0x7b3c0bfe,0x7b3e0104,0x7b4514fc,0x7b471011,0x7b490388,0x7b4b0917,0x7b4c1057,0x7b4f04a0,
+	0x7b500a71,0x7b5119d1,0x7b521373,0x7b54032c,0x7b5601ac,0x7b580a4e,0x7b5a00ed,0x7b5b1110,
+	0x7b5d1924,0x7b6009d9,0x7b620e52,0x7b6e11ca,0x7b711540,0x7b721142,0x7b751646,0x7b770a6a,
+	0x7b790280,0x7b7b059d,0x7b7e0f85,0x7b800886,0x7b8500f5,0x7b8d061a,0x7b901008,0x7b940163,
+	0x7b9507f0,0x7b971283,0x7b9c0a43,0x7b9d0f91,0x7ba1064e,0x7ba213dd,0x7ba61881,0x7ba70fda,
+	0x7ba813b6,0x7ba90c5c,0x7baa0350,0x7bab1537,0x7bac10d3,0x7bad08a2,0x7bb11515,0x7bb41909,
+	0x7bb819d3,0x7bc10788,0x7bc619df,0x7bc70ed3,0x7bcc0714,0x7bd10a98,0x7bd30c11,0x7bd905a5,
+	0x7bda04e0,0x7bdd05fd,0x7be10301,0x7be50b61,0x7be600f9,0x7bea0259,0x7bee0acc,0x7bf10b26,
+	0x7bf70ea2,0x7bfc0415,0x7bfe0d45,0x7c0702f9,0x7c0b0670,0x7c0c127f,0x7c0f0c3b,0x7c16043e,
+	0x7c1f03ce,0x7c260386,0x7c27078c,0x7c2a185b,0x7c380169,0x7c3f017e,0x7c4019a3,0x7c410ac0,
+	0x7c4d080f,0x7c730d12,0x7c740398,0x7c7b0b0e,0x7c7c14e4,0x7c7d1a23,0x7c8904f5,0x7c91004f,
+	0x7c920b59,0x7c950f0f,0x7c9702f1,0x7c9818b2,0x7c9c1349,0x7c9d0b5a,0x7c9e149e,0x7c9f1276,
+	0x7ca21a19,0x7ca41830,0x7ca51994,0x7caa04fb,0x7cae0b82,0x7cb10b83,0x7cb20196,0x7cb3093d,
+	0x7cb9030f,0x7cbc0bb4,0x7cbd1a39,0x7cbe093f,0x7cc110e4,0x7cc510ab,0x7cc70715,0x7cc815b9,
+	0x7cca0728,0x7ccc185a,0x7ccd02dc,0x7cd505a6,0x7cd612f2,0x7cd7102a,0x7cd9019f,0x7cdc0d0d,
+	0x7cdf186a,0x7ce00a06,0x7ce808b9,0x7cef0e38,0x7cf80d17,0x7cfb14c4,0x7d0a1434,0x7d201273,
+	0x7d2212a9,0x7d27091d,0x7d2b1a2a,0x7d2f0b04,0x7d6e15c7,0x7d771949,0x7da60f55,0x7dae1006,
+	0x7e3b0d0e,0x7e4104b0,0x7e471697,0x7e821a51,0x7e9b037e,0x7e9f122d,0x7ea0095f,0x7ea117ad,
+	0x7ea20705,0x7ea31999,0x7ea414e1,0x7ea505b4,0x7ea61827,0x7ea707fe,0x7ea813ca,0x7ea90a77,
+	0x7eaa081e,0x7eab1091,0x7eac140d,0x7ead1838,0x7eaf02c3,0x7eb00ea9,0x7eb11100,0x7eb20595,
+	0x7eb30da4,0x7eb51a38,0x7eb60c52,0x7eb704ec,0x7eb81951,0x7eb9142d,0x7eba04ca,0x7ebd0e1d,
+	0x7ebe11e0,0x7ebf1504,0x7ec00590,0x7ec1155a,0x7ec20528,0x7ec30b77,0x7ec41a4b,0x7ec51167,
+	0x7ec614c6,0x7ec71938,0x7ec81980,0x7ec9199c,0x7eca007b,0x7ecb0529,0x7ecc029d,0x7ecd114c,
+	0x7ece16fe,0x7ecf0934,0x7ed0033a,0x7ed10082,0x7ed2109d,0x7ed308f6,0x7ed40a58,0x7ed51083,
+	0x7ed706bf,0x7ed807a9,0x7ed905d2,0x7eda15de,0x7edb08b6,0x7edc0c66,0x7edd09c0,0x7ede08d1,
+	0x7edf1370,0x7ee005e0,0x7ee11531,0x7ee209b5,0x7ee315a7,0x7ee51288,0x7ee61300,0x7ee7082a,
+	0x7ee8131d,0x7ee9081a,0x7eea15c2,0x7eeb0bd2,0x7eed15c3,0x7eee0f63,0x7eef04d1,0x7ef002ce,
+	0x7ef1113c,0x7ef2067d,0x7ef31185,0x7ef41408,0x7ef50d24,0x7ef611db,0x7ef700c7,0x7ef8027c,
+	0x7efa0bf0,0x7efb105f,0x7efc1a31,0x7efd18c0,0x7efe13d6,0x7eff0c80,0x7f0019ef,0x7f011a14,
+	0x7f020a35,0x7f031513,0x7f04086e,0x7f050d2c,0x7f060ad1,0x7f071320,0x7f080d3a,0x7f0907ec,
+	0x7f0b07b4,0x7f0c1235,0x7f0d0461,0x7f0e043a,0x7f0f0117,0x7f1105fc,0x7f1219f1,0x7f130769,
+	0x7f1403b2,0x7f150c77,0x7f160105,0x7f170d4c,0x7f181815,0x7f19092e,0x7f1a0561,0x7f1b10c0,
+	0x7f1c1912,0x7f1d050d,0x7f1f05a9,0x7f2001da,0x7f210b20,0x7f221710,0x7f230871,0x7f240135,
+	0x7f250ee2,0x7f260ca7,0x7f270b00,0x7f281749,0x7f2912a6,0x7f2a0d3f,0x7f2b10ef,0x7f2c1555,
+	0x7f2d0b97,0x7f2e112a,0x7f2f188b,0x7f3008ab,0x7f310f98,0x7f320fbc,0x7f330766,0x7f3408dc,
+	0x7f351a50,0x7f360514,0x7f380597,0x7f3a1063,0x7f42174a,0x7f44100a,0x7f4514de,0x7f500655,
+	0x7f5113e3,0x7f5413e6,0x7f5506ae,0x7f570c55,0x7f58052e,0x7f5a049e,0x7f5f0625,0x7f610599,
+	0x7f62005a,0x7f681655,0x7f6918e6,0x7f6a1a55,0x7f6e1979,0x7f710ad4,0x7f7211f6,0x7f740ebe,
+	0x7f790b27,0x7f7e188c,0x7f8107f6,0x7f8a1673,0x7f8c0fa3,0x7f8e0ce2,0x7f9405a0,0x7f9a0bd3,
+	0x7f9d0391,0x7f9e159f,0x7f9f0fb3,0x7fa11509,0x7fa4106f,0x7fa712a4,0x7faf0900,0x7fb012e7,
+	0x7fb214ad,0x7fb80b03,0x7fb905dd,0x7fbc01ea,0x7fbd17d8,0x7fbf1704,0x7fc11439,0x7fc50266,
+	0x7fca170b,0x7fcc170c,0x7fce0bd4,0x7fd4151c,0x7fd5149f,0x7fd80fc7,0x7fdf03a0,0x7fe00310,
+	0x7fe104df,0x7fe519d4,0x7fe6088a,0x7fe90ed4,0x7fee06eb,0x7ff006bb,0x7ff10035,0x7ff3171b,
+	0x7ffb04a7,0x7ffc171c,0x800016a2,0x80010aed,0x80030a0f,0x80040cc8,0x800518f2,0x80060f47,
+	0x800b03e4,0x800c048d,0x800d120c,0x80100db1,0x80120b06,0x80141a27,0x801505db,0x80160210,
+	0x801706d2,0x8018183c,0x80190e50,0x801c124a,0x802007c2,0x80220af5,0x802512fa,0x80260e47,
+	0x80270c0c,0x80280e26,0x802908b2,0x802a0e75,0x80310d81,0x80330491,0x803503f2,0x803616a7,
+	0x80370325,0x80381256,0x803b025d,0x803d034c,0x803f05e1,0x80420e03,0x8043034e,0x80460bd5,
+	0x804a0b91,0x804b0bff,0x804c1946,0x804d0e13,0x80520686,0x80540b6a,0x80580ef4,0x805a09a5,
+	0x80690a99,0x806a02e8,0x80710036,0x807f17e6,0x808017e3,0x80831271,0x80841711,0x8086124c,
+	0x808718e7,0x808910ae,0x808b0b0c,0x808c07df,0x80930779,0x8096153b,0x80981997,0x809a0431,
+	0x809b0596,0x809c109b,0x809d057e,0x809f1446,0x80a001f3,0x80a10622,0x80a21939,0x80a40518,
+	0x80a504d8,0x80a90866,0x80aa04c6,0x80ab19f3,0x80ad0da5,0x80ae002b,0x80af0a38,0x80b105ea,
+	0x80b217ea,0x80b4168d,0x80b70f95,0x80ba04e5,0x80bc0944,0x80bd12ca,0x80be1177,0x80bf1987,
+	0x80c018d4,0x80c1154d,0x80c21179,0x80c31420,0x80c4199e,0x80c60352,0x80cc00af,0x80cd0639,
+	0x80ce12be,0x80d60e76,0x80d7190b,0x80d91a67,0x80da0e84,0x80db0856,0x80dc1188,0x80dd193c,
+	0x80de008f,0x80e1072c,0x80e41742,0x80e515ae,0x80e70bfc,0x80e8040f,0x80e909e7,0x80ea0c1f,
+	0x80eb094e,0x80ec0e2c,0x80ed162e,0x80ef0a60,0x80f016d4,0x80f1065a,0x80f2069a,0x80f305b7,
+	0x80f40410,0x80f608c1,0x80f81598,0x80fa0028,0x80fc0ed6,0x80fd0dd6,0x8102193d,0x81060308,
+	0x81090c98,0x810a0814,0x810d0a69,0x810e10d9,0x810f1867,0x81100f48,0x81110dcb,0x81120d15,
+	0x81130e24,0x81140c45,0x81160155,0x811813d7,0x811a08d5,0x811e031e,0x812c0e78,0x812f054b,
+	0x813113a2,0x81320dff,0x81360c57,0x81380b74,0x813e0ebd,0x8146133a,0x8148093b,0x814a0ab0,
+	0x814b16b8,0x814c1635,0x8150054f,0x8151054d,0x815304da,0x81540fa8,0x815513df,0x81591a33,
+	0x815a03fa,0x816002ef,0x81651581,0x81671206,0x81690dbb,0x816d0483,0x816e10dc,0x81701689,
+	0x8171089d,0x817417ca,0x81790562,0x817a150b,0x817b0dea,0x817c0d2d,0x817d13c0,0x817e1315,
+	0x817f1393,0x81800084,0x81820c78,0x818805c8,0x818a0164,0x818f05a4,0x8191013d,0x81980121,
+	0x819b12f1,0x819c0d6b,0x819d14aa,0x81a3197b,0x81a60bc4,0x81a80ea3,0x81aa01d1,0x81b3112d,
+	0x81ba174e,0x81bb111f,0x81c0139d,0x81c10b6f,0x81c200fd,0x81c31775,0x81c6171d,0x81ca10f0,
+	0x81cc062b,0x81e3021f,0x81e71865,0x81ea1a2d,0x81ec0e04,0x81ed0286,0x81f3195a,0x81f4196b,
+	0x81fb190a,0x81fc096e,0x81fe17b9,0x8200169c,0x820117be,0x8202026f,0x820414c8,0x82050976,
+	0x820617d2,0x820c1154,0x820d1157,0x821011c2,0x821211ea,0x8214133b,0x821b02ad,0x821c1221,
+	0x821e146d,0x821f1990,0x822102a9,0x8222111b,0x822316e5,0x82280075,0x822a06c0,0x822b04cb,
+	0x822c006a,0x822d00d9,0x822f1983,0x82300897,0x8231019c,0x823319b8,0x82341880,0x82350465,
+	0x8236015e,0x823714f2,0x823805cc,0x823902aa,0x823b0c21,0x823e14a0,0x82441143,0x82471360,
+	0x82491418,0x824b0cff,0x824f11d4,0x82581263,0x825a01a4,0x825f0271,0x82680cfb,0x826e05d7,
+	0x826f0b7e,0x82700867,0x827210f6,0x8273165f,0x82740539,0x8279003d,0x827a16ef,0x827d101a,
+	0x827e0010,0x827f0dad,0x828208f0,0x828413cb,0x82880d40,0x828a0f7b,0x828b17e7,0x828d1146,
+	0x828e1596,0x828f042e,0x82910f5f,0x82920cad,0x8297150e,0x82980eb4,0x82990524,0x829c145b,
+	0x829d1934,0x829f1116,0x82a10f9b,0x82a40a48,0x82a50906,0x82a60c1a,0x82a807e0,0x82a90fe1,
+	0x82aa0f42,0x82ab163e,0x82ac04ed,0x82ad004b,0x82ae10c8,0x82af156f,0x82b00822,0x82b1074a,
+	0x82b304c0,0x82b41476,0x82b71952,0x82b81839,0x82b90fe2,0x82bd1619,0x82be04e9,0x82c102e3,
+	0x82c40114,0x82c7140e,0x82c80b45,0x82ca0478,0x82cb1502,0x82cc01f4,0x82cd019b,0x82ce19c6,
+	0x82cf126b,0x82d1181e,0x82d21075,0x82d30bca,0x82d412c2,0x82d51147,0x82d70d31,0x82d81002,
+	0x82db0a18,0x82dc0d96,0x82de008e,0x82df0601,0x82e00d4a,0x82e116e4,0x82e30997,0x82e40eea,
+	0x82e510d0,0x82e60a56,0x82eb1120,0x82ef00c2,0x82f11760,0x82f4097c,0x82f70581,0x82f90efc,
+	0x82fb052a,0x830119ff,0x83020cc5,0x830304b8,0x83040fd2,0x83050cb9,0x83060cbf,0x83070051,
+	0x830802d4,0x83090d74,0x830c0255,0x830e0935,0x830f0bf9,0x83110dfb,0x83141751,0x83151010,
+	0x83170d5a,0x831a1741,0x831b05d8,0x831c0f9c,0x8327087b,0x832802d5,0x832b0caf,0x832c01b8,
+	0x832d08bf,0x832f052f,0x833119aa,0x833308a7,0x8334079e,0x83351725,0x833601b9,0x8338109e,
+	0x833910b0,0x833a026e,0x833c1367,0x83401601,0x83431052,0x83460936,0x83471591,0x834901a6,
+	0x834f108b,0x83500893,0x835116d1,0x8352077a,0x83540b4f,0x835a084e,0x835b107e,0x835c00e3,
+	0x835e0fc0,0x835f07aa,0x8360083b,0x8361036a,0x8363109f,0x836407b9,0x8365158a,0x83660c67,
+	0x83671753,0x83680f8a,0x83690929,0x836a1297,0x836b1726,0x836c0c93,0x836d070a,0x836e199f,
+	0x836f169e,0x837706e4,0x837800cf,0x837b039c,0x837c1382,0x837d1285,0x83850b56,0x83860f1b,
+	0x83890b39,0x838e1103,0x8392098e,0x83930cd5,0x8398116d,0x839b1357,0x839c1791,0x839e13d3,
+	0x83a0179d,0x83a80ae2,0x83a90533,0x83aa046f,0x83ab0d77,0x83b009ff,0x83b10ab8,0x83b20b69,
+	0x83b311ac,0x83b41441,0x83b614e5,0x83b707cf,0x83b81792,0x83b91754,0x83ba1744,0x83bc02c5,
+	0x83bd0cb2,0x83c013d8,0x83c10939,0x83c5086b,0x83c70614,0x83ca0988,0x83cc09d8,0x83cf06e7,
+	0x83d4053a,0x83d601ef,0x83d81252,0x83dc018b,0x83dd0052,0x83df138b,0x83e00153,0x83e106b6,
+	0x83e5149a,0x83e90f1c,0x83ea036c,0x83f00615,0x83f10bd6,0x83f204d2,0x83f81632,0x83f91a44,
+	0x83fd11e8,0x84010f4d,0x8403030c,0x8404130b,0x840600ea,0x840b0f35,0x840c0cf4,0x840d0f00,
+	0x840e1415,0x840f035e,0x84110763,0x84180db2,0x841c134c,0x841d0c58,0x84241755,0x84251756,
+	0x84261757,0x84271533,0x842810da,0x843115d0,0x843817c4,0x843c0481,0x843d0c6a,0x84460099,
+	0x84510507,0x845719cf,0x84591514,0x845a1176,0x845b05c2,0x845c0f73,0x84610f1d,0x84630405,
+	0x84690e4d,0x846b0731,0x846c1868,0x846d0848,0x847102e5,0x847313f4,0x84750a88,0x8476135a,
+	0x847814bf,0x847a0f6e,0x848203b3,0x848701e5,0x848809f2,0x84890a96,0x848b08b1,0x848c0c0a,
+	0x848e0e5d,0x84970ae5,0x84990cf2,0x849c1282,0x84a10088,0x84af0a62,0x84b20f1e,0x84b4122a,
+	0x84b81925,0x84b90872,0x84ba080b,0x84bd048a,0x84bf06c3,0x84c11907,0x84c415c9,0x84c910a3,
+	0x84ca143b,0x84cd1196,0x84d010c1,0x84d112a5,0x84d300b8,0x84d600f0,0x84dd0ac7,0x84df0831,
+	0x84e00b21,0x84e317fe,0x84e5175a,0x84e60d7a,0x84ec0e9f,0x84f014c1,0x84fc0b9b,0x84ff15ca,
+	0x850c127d,0x85110d44,0x85130ca8,0x851718f9,0x851a1427,0x851f02f7,0x8521018c,0x852b0dec,
+	0x852c11ee,0x85370faf,0x85380414,0x85390b76,0x853a0bc3,0x853b0a4f,0x853c000e,0x853d00f6,
+	0x854304ae,0x8548160d,0x854908c8,0x854a10c7,0x8556103d,0x855907b6,0x855e1a56,0x856410c6,
+	0x856809cb,0x85720f57,0x8574184b,0x8579143d,0x857a080e,0x857b070e,0x857e0b0a,0x85840166,
+	0x858506c5,0x858713f7,0x858f171a,0x859b15e7,0x859c00fa,0x85a41566,0x85a80703,0x85aa1576,
+	0x85ae1268,0x85af11f9,0x85b015f6,0x85b710b6,0x85b912c6,0x85c105ad,0x85c9090e,0x85cf019d,
+	0x85d00d3b,0x85d314fe,0x85d50e48,0x85dc0b28,0x85e41318,0x85e904a8,0x85fb1870,0x85ff07d5,
+	0x860506fe,0x86110d6e,0x86160e0c,0x86271040,0x862904b2,0x863818c2,0x863c0d11,0x864d0720,
+	0x864e0739,0x864f0c25,0x86500e30,0x86510c7e,0x86540f8c,0x865a15b0,0x865e17cf,0x8662068c,
+	0x866b0272,0x866c101e,0x866e0812,0x86711191,0x8679070b,0x867a07a0,0x867b0cf3,0x867c05cf,
+	0x867d1284,0x867e14cc,0x867f01ce,0x868011a1,0x868116e6,0x86820c8a,0x868a142f,0x868b10ca,
+	0x868c0081,0x868d0eb8,0x8693173c,0x86950191,0x869c161b,0x869d06c6,0x86a305ed,0x86a4186e,
+	0x86a7090c,0x86a80534,0x86a90248,0x86aa041a,0x86ac14fb,0x86af1017,0x86b01794,0x86b118a5,
+	0x86b417aa,0x86b50a16,0x86b606a1,0x86ba1070,0x86c019d0,0x86c40616,0x86c61032,0x86c71156,
+	0x86c90bd7,0x86ca0627,0x86cb035f,0x86ce0b5b,0x86cf022f,0x86d01034,0x86d10d83,0x86d4079f,
+	0x86d8167c,0x86d913bb,0x86db19b0,0x86de0aa7,0x86df08c4,0x86e405c3,0x86e91013,0x86ed1976,
+	0x86ee0c9a,0x86f018ed,0x86f10852,0x86f20dc8,0x86f31236,0x86f40f53,0x86f8152a,0x86f91781,
+	0x86fe0472,0x870011f8,0x87020509,0x8703117d,0x870718ea,0x8708145e,0x8709053e,0x870a0b3a,
+	0x870d028f,0x87121647,0x8713135b,0x87151396,0x87171443,0x8718193e,0x871a04d4,0x871c0d21,
+	0x871e0f56,0x87210ab2,0x87220d00,0x87230fa9,0x872514a7,0x87291344,0x872e1801,0x87310ebf,
+	0x87341714,0x87371058,0x873b0ffa,0x873e0690,0x873f13c7,0x8747175c,0x87480688,0x874901db,
+	0x874c0a26,0x874e154a,0x875317d3,0x87570789,0x87590107,0x87600541,0x87631798,0x87641028,
+	0x87650cbd,0x876e0565,0x87700a8c,0x87740736,0x877603e8,0x877b0dbc,0x877c0c0d,0x877d02c2,
+	0x877e10a6,0x87820ae0,0x87830e74,0x878514ae,0x8788181c,0x878b1264,0x878d10a7,0x87930fec,
+	0x879712f3,0x879f0d60,0x87a80ca1,0x87ab11cd,0x87ac01a5,0x87ad024f,0x87af0037,0x87b312f4,
+	0x87b50ede,0x87ba0c5f,0x87bd1986,0x87c01211,0x87c60c8e,0x87ca0cbe,0x87cb14af,0x87d118cc,
+	0x87d20cb4,0x87d31529,0x87db0ea4,0x87e00e64,0x87e5077c,0x87ea07b7,0x87ee112f,0x87f9156a,
+	0x87fe01de,0x88030c63,0x880a0b71,0x88130d02,0x881510b8,0x881607d6,0x881b0d46,0x88210b2b,
+	0x882202c9,0x883209af,0x88390435,0x883c1043,0x884015f0,0x88440e3c,0x8845157c,0x884c1584,
+	0x884d164e,0x885414f3,0x885708ed,0x8859161f,0x886106fd,0x88621047,0x886316bd,0x886416bb,
+	0x88650173,0x88680127,0x886901c1,0x886b1118,0x886c0228,0x886e067c,0x8870120d,0x88720da7,
+	0x88771984,0x887d1096,0x887e0fe0,0x887f0916,0x88811813,0x88820ce7,0x8884003b,0x88850dfc,
+	0x88880847,0x888b0343,0x888d0e7e,0x889212df,0x889615a8,0x889c13bf,0x88a20e6c,0x88a40cc9,
+	0x88ab00b3,0x88ad14b5,0x88b1053b,0x88b7084c,0x88bc05b8,0x88c10186,0x88c20baa,0x88c519e4,
+	0x88c60363,0x88c90a3c,0x88ce023d,0x88d20f12,0x88d41712,0x88d517f9,0x88d81027,0x88d9106e,
+	0x88df1106,0x88e20b6b,0x88e30b75,0x88e40a5a,0x88e50884,0x88e800f1,0x88f00459,0x88f10129,
+	0x88f3113d,0x88f40e8a,0x88f80c61,0x88f90691,0x88fc132e,0x88fe0983,0x89020641,0x890a010f,
+	0x891006ed,0x89120093,0x8913009a,0x891900b9,0x891a0299,0x891b0c79,0x89210328,0x892510c2,
+	0x892a1397,0x892b025f,0x89300f88,0x89340aca,0x893618f5,0x89410fb4,0x89441516,0x895e0100,
+	0x895f0918,0x896610b7,0x897b0e6d,0x897f1487,0x8981169f,0x89830fed,0x89860567,0x89c1088d,
+	0x89c20647,0x89c40662,0x89c50d1b,0x89c611b8,0x89c701d2,0x89c80acf,0x89c909c1,0x89ca082b,
+	0x89cb14b6,0x89cc039e,0x89ce17d0,0x89cf060c,0x89d00930,0x89d1104a,0x89d208cc,0x89d609c6,
+	0x89da0617,0x89dc1a1b,0x89de1134,0x89e30903,0x89e505f0,0x89e6029f,0x89eb127e,0x89ef197c,
+	0x89f30738,0x8a00163f,0x8a070701,0x8a3e1a21,0x8a480b5e,0x8a7918b3,0x8a8917ff,0x8a8a1316,
+	0x8a9311cb,0x8b07088b,0x8b261005,0x8b660949,0x8b6c0ed0,0x8ba01639,0x8ba1081b,0x8ba203f7,
+	0x8ba30553,0x8ba4108e,0x8ba507d7,0x8ba608f1,0x8ba7070f,0x8ba8130d,0x8ba9107d,0x8baa1123,
+	0x8bab0f66,0x8bad1605,0x8bae16f0,0x8baf1606,0x8bb0081c,0x8bb208ae,0x8bb307a7,0x8bb40e40,
+	0x8bb50995,0x8bb61624,0x8bb70dd0,0x8bb815b6,0x8bb9046b,0x8bba0c54,0x8bbc1258,0x8bbd050e,
+	0x8bbe1159,0x8bbf04c9,0x8bc009bd,0x8bc1192b,0x8bc20620,0x8bc306d6,0x8bc40ef9,0x8bc51a49,
+	0x8bc6119d,0x8bc818a0,0x8bc91270,0x8bca190d,0x8bcb03a1,0x8bcc1991,0x8bcd02d2,0x8bce102e,
+	0x8bcf18e1,0x8bd116f8,0x8bd216cb,0x8bd30a6f,0x8bd40b07,0x8bd511b9,0x8bd6063f,0x8bd71192,
+	0x8bd80810,0x8bd907a3,0x8bda0237,0x8bdb19a7,0x8bdc1168,0x8bdd0755,0x8bde0359,0x8bdf0605,
+	0x8be01050,0x8be1066c,0x8be215fc,0x8be316ff,0x8be4192c,0x8be50570,0x8be61519,0x8be701c4,
+	0x8be807bf,0x8be915b7,0x8beb090a,0x8bec1455,0x8bed17dc,0x8bee0fcc,0x8bef1478,0x8bf005af,
+	0x8bf117a9,0x8bf207ab,0x8bf30a73,0x8bf41223,0x8bf5125a,0x8bf60488,0x8bf71004,0x8bf819ad,
+	0x8bf91a3c,0x8bfa0e33,0x8bfb0423,0x8bfc1a03,0x8bfd04dc,0x8bfe0a32,0x8bff1414,0x8c0017c1,
+	0x8c01121a,0x8c021173,0x8c0303d8,0x8c0401e2,0x8c050b8a,0x8c0619f5,0x8c07128e,0x8c0812d6,
+	0x8c0a1709,0x8c0b0d87,0x8c0c0226,0x8c0d03e1,0x8c0e0790,0x8c0f0899,0x8c101551,0x8c1115f1,
+	0x8c1216b7,0x8c131423,0x8c14047d,0x8c1517f4,0x8c1615cd,0x8c1701d6,0x8c181a15,0x8c19001d,
+	0x8c1a1661,0x8c1b03af,0x8c1c0d0b,0x8c1d0ed8,0x8c1f0d66,0x8c200366,0x8c211277,0x8c221560,
+	0x8c231692,0x8c240087,0x8c2511c7,0x8c260f83,0x8c270d1f,0x8c28091e,0x8c290c9f,0x8c2a18ee,
+	0x8c2b0887,0x8c2c0d63,0x8c2d12da,0x8c2e1887,0x8c2f0fc2,0x8c300ac8,0x8c310f28,0x8c3209c9,
+	0x8c331668,0x8c340f97,0x8c3518b4,0x8c36022c,0x8c370621,0x8c4107c4,0x8c46041b,0x8c4708a9,
+	0x8c49025e,0x8c4c13c8,0x8c5511a7,0x8c5a139c,0x8c611526,0x8c620775,0x8c6a06c9,0x8c6b1802,
+	0x8c730139,0x8c78195d,0x8c79009d,0x8c7a01cc,0x8c8203d2,0x8c8515a1,0x8c8906e9,0x8c8a0d7b,
+	0x8c8c0ccd,0x8c940eca,0x8c980d80,0x8d1d00ab,0x8d1e18fc,0x8d1f0556,0x8d2105f7,0x8d220185,
+	0x8d23187b,0x8d2414ee,0x8d250066,0x8d2618d5,0x8d2707ce,0x8d281963,0x8d2904b9,0x8d2a12cf,
+	0x8d2b0eed,0x8d2c010a,0x8d2d0606,0x8d2e19c9,0x8d2f064f,0x8d300499,0x8d310894,0x8d3200bf,
+	0x8d3311c0,0x8d34134b,0x8d350675,0x8d360a7b,0x8d370341,0x8d380cc7,0x8d3904e6,0x8d3a06ec,
+	0x8d3b16d2,0x8d3c1885,0x8d3d196c,0x8d3e0857,0x8d3f07ae,0x8d401a11,0x8d410bc2,0x8d420c2e,
+	0x8d431864,0x8d441a12,0x8d450573,0x8d46092d,0x8d471024,0x8d481919,0x8d490abb,0x8d4a1151,
+	0x8d4b0560,0x8d4c042c,0x8d4d07ed,0x8d4e11f1,0x8d4f1139,0x8d5002e0,0x8d5305dc,0x8d540e88,
+	0x8d550355,0x8d560abd,0x8d5819f2,0x8d590564,0x8d5a19dd,0x8d5b10df,0x8d5c1882,0x8d5d166b,
+	0x8d5e1861,0x8d60188f,0x8d61112e,0x8d62175e,0x8d630592,0x8d640263,0x8d66115d,0x8d670dba,
+	0x8d6b06ee,0x8d6d18f4,0x8d701a40,0x8d730962,0x8d74055c,0x8d7518e2,0x8d760589,0x8d770f62,
+	0x8d81022a,0x8d840fd4,0x8d850208,0x8d8a1831,0x8d8b1035,0x8d911a1c,0x8d940bab,0x8d9f12fe,
+	0x8da3104b,0x8db1185f,0x8db31a45,0x8db40e4b,0x8db5009e,0x8db8044d,0x8dba0519,0x8dbc0881,
+	0x8dbe1957,0x8dbf12b0,0x8dc3182f,0x8dc40fa7,0x8dc612c4,0x8dcb0053,0x8dcc03dd,0x8dce13ac,
+	0x8dcf0849,0x8dd10e80,0x8dd6194a,0x8dd7051c,0x8dda111c,0x8ddb0168,0x8ddd09a0,0x8dde0b5f,
+	0x8ddf05d4,0x8de314fd,0x8de408c5,0x8de80a61,0x8dea0677,0x8deb100b,0x8dec0a90,0x8def0c35,
+	0x8df3134a,0x8df5089e,0x8df70fb7,0x8df800f2,0x8df914e7,0x8dfa0467,0x8dfb07ef,0x8dfd0833,
+	0x8e0515ec,0x8e090b85,0x8e0a1782,0x8e0c0282,0x8e0f12bc,0x8e1402ca,0x8e1d075b,0x8e1e09a7,
+	0x8e1f0258,0x8e22131c,0x8e230165,0x8e29018a,0x8e2a1a34,0x8e2c197d,0x8e2e03be,0x8e2f194c,
+	0x8e31045d,0x8e35198a,0x8e3901d0,0x8e3a08a3,0x8e3d0992,0x8e4003e9,0x8e410ed7,0x8e4210ac,
+	0x8e441323,0x8e47088c,0x8e480377,0x8e490319,0x8e4a1483,0x8e4b12bd,0x8e510e0a,0x8e520e63,
+	0x8e5902fa,0x8e6600cd,0x8e69012f,0x8e6c0387,0x8e6d01b1,0x8e6f04b1,0x8e700293,0x8e72044b,
+	0x8e7402fb,0x8e7609cf,0x8e7c0f2b,0x8e7f02ff,0x8e811877,0x8e8519ba,0x8e870292,0x8e8f0bc5,
+	0x8e900bac,0x8e9401df,0x8e9c1a4e,0x8e9e156b,0x8eab1165,0x8eac05ee,0x8eaf1033,0x8eb20462,
+	0x8eba12fb,0x8ece1421,0x8f660211,0x8f671898,0x8f680669,0x8f6915cb,0x8f6b1093,0x8f6c19db,
+	0x8f6d0479,0x8f6e0c53,0x8f6f10c5,0x8f7006ff,0x8f710612,0x8f720a1c,0x8f730c3e,0x8f741996,
+	0x8f751956,0x8f761705,0x8f770724,0x8f78190f,0x8f790b50,0x8f7a168f,0x8f7b0ff5,0x8f7c11c3,
+	0x8f7d1857,0x8f7e196d,0x8f7f08de,0x8f811054,0x8f820c2f,0x8f8308df,0x8f8418ec,0x8f85054c,
+	0x8f860b8b,0x8f870df2,0x8f8800b6,0x8f890798,0x8f8a067e,0x8f8b13e8,0x8f8d02cf,0x8f8e1a1a,
+	0x8f8f02f0,0x8f90053f,0x8f91080c,0x8f9311ed,0x8f940e90,0x8f95181a,0x8f9614d8,0x8f9718bc,
+	0x8f980c38,0x8f9918f1,0x8f9a0bb7,0x8f9b1570,0x8f9c0618,0x8f9e02d8,0x8f9f0ec9,0x8fa30ab3,
+	0x8fa80119,0x8fa9011a,0x8fab011b,0x8fb00222,0x8fb110bc,0x8fb602cd,0x8fb90102,0x8fbd0b8f,
+	0x8fbe0329,0x8fc10f7c,0x8fc217ae,0x8fc40f68,0x8fc51608,0x8fc70692,0x8fc80c95,0x8fce1750,
+	0x8fd01842,0x8fd10927,0x8fd31625,0x8fd404b4,0x8fd5146f,0x8fd80698,0x8fd918f6,0x8fdb0928,
+	0x8fdc181d,0x8fdd1401,0x8fde0b65,0x8fdf0254,0x8fe21341,0x8fe416dd,0x8fe5095c,0x8fe60840,
+	0x8fe8033b,0x8fe90492,0x8fea0399,0x8feb0f0c,0x8fed03de,0x8fee187c,0x8ff01200,0x8ff3094d,
+	0x8ff70d09,0x8ff800cb,0x8ff90819,0x8ffd19ea,0x90001394,0x9001125b,0x900211c1,0x90031306,
+	0x90040e72,0x9005071b,0x90060de6,0x900915da,0x900a160a,0x900b016d,0x900d1532,0x900f137b,
+	0x901019b7,0x90111022,0x901203ad,0x90141383,0x9016132b,0x9017041c,0x901a1361,0x901b065d,
+	0x901d11c4,0x901e0243,0x901f1274,0x90201874,0x9021106d,0x9022050c,0x90260b31,0x902d0773,
+	0x902e0344,0x902f0c31,0x90350a84,0x903613f2,0x9038170d,0x903b0c59,0x903c00ce,0x903e17cb,
+	0x90410455,0x9042128f,0x904402ab,0x904717fa,0x904d0118,0x904f0482,0x905014d5,0x90510784,
+	0x90521026,0x9053037c,0x905716d7,0x9058060b,0x905b0bf2,0x906212ba,0x90630f96,0x90651695,
+	0x90680034,0x906d1869,0x906e18e8,0x90740bb6,0x90751a59,0x907d09a8,0x907f00fb,0x9080168a,
+	0x90821567,0x90831294,0x90880d3c,0x908b0aac,0x909116f9,0x9093038a,0x9095176e,0x909706a5,
+	0x90990cab,0x909b100d,0x909d0a75,0x90a104be,0x90a21585,0x90a30da3,0x90a6007d,0x90aa154c,
+	0x90ac1451,0x90ae178e,0x90af06a7,0x90b012c0,0x90b11015,0x90b30eaa,0x90b40144,0x90b5114b,
+	0x90b600ad,0x90b803a2,0x90b91a3a,0x90ba16b1,0x90bb0baf,0x90be19a8,0x90c117eb,0x90c40fdc,
+	0x90c51964,0x90c70760,0x90ca08bb,0x90ce0ad9,0x90cf084d,0x90d00a66,0x90d1192d,0x90d31843,
+	0x90d7148e,0x90db0530,0x90dc05b0,0x90dd06ce,0x90e109dc,0x90e21761,0x90e60b51,0x90e7183b,
+	0x90e8017b,0x90eb0eb9,0x90ed0684,0x90ef12d7,0x90f4021b,0x90f8034d,0x90fd0412,0x90fe1653,
+	0x9102047e,0x910409b8,0x911900da,0x911e1733,0x91221636,0x912318c5,0x912f1129,0x91310f07,
+	0x91391a3e,0x91430bdb,0x9146050a,0x9149179c,0x914a03f3,0x914b1021,0x914c1a04,0x914d0e8f,
+	0x914e19a1,0x914f16de,0x91500585,0x9152096c,0x915715c4,0x915a04ef,0x915d1846,0x915e12cd,
+	0x916113ad,0x916202f6,0x916306a2,0x91640619,0x9165126c,0x91690d61,0x916a0af6,0x916c0281,
+	0x916e136c,0x916f1959,0x917014e8,0x917108b7,0x9172023f,0x91741385,0x917508e2,0x91760cdd,
+	0x91770a5b,0x91781281,0x91790b0f,0x917d1667,0x917e1197,0x917f0df9,0x91850e85,0x918702c8,
+	0x91891a57,0x918b02f8,0x918c0a9f,0x918d1324,0x91900737,0x919115ba,0x9192158b,0x919a0d0c,
+	0x919b1059,0x91a2069b,0x91a312f5,0x91aa0aec,0x91ad0170,0x91ae08e4,0x91af14b0,0x91b40b36,
+	0x91b509a9,0x91ba15f8,0x91c70187,0x91c917ab,0x91ca11c8,0x91cc0b2e,0x91cd198d,0x91ce16ac,
+	0x91cf0b86,0x91d10913,0x91dc054a,0x9274089f,0x928e100c,0x92ae0c47,0x92c81482,0x933e1862,
+	0x936a0d88,0x938f0bee,0x93ca0044,0x93d60039,0x943e00bb,0x946b1578,0x94850912,0x9486056b,
+	0x948716e2,0x948818fd,0x948903f1,0x948a18da,0x948b0f02,0x948c0b9a,0x948d1388,0x948e0f7f,
+	0x948f02b0,0x94901119,0x949204ab,0x949303d7,0x94940ced,0x94950e3a,0x949701c8,0x94990576,
+	0x949a017a,0x949b12cb,0x949c099a,0x949d0453,0x949e0207,0x949f1982,0x94a00da8,0x94a100b0,
+	0x94a20598,0x94a30074,0x94a40f8b,0x94a516a3,0x94a60fdf,0x94a709d6,0x94a81456,0x94a905fb,
+	0x94aa0a0d,0x94ab04c2,0x94ac07ca,0x94ad0418,0x94ae0e1e,0x94af0056,0x94b017f0,0x94b10f8d,
+	0x94b21921,0x94b30f8e,0x94b40626,0x94b50151,0x94b60a1e,0x94b70f0a,0x94b8016e,0x94b9015c,
+	0x94ba182d,0x94bb1a4f,0x94bc0d97,0x94bd12e0,0x94be0858,0x94bf03c7,0x94c01793,0x94c1134d,
+	0x94c2015d,0x94c30bcf,0x94c41227,0x94c50f82,0x94c60cc4,0x94c811c5,0x94c915e0,0x94ca12b1,
+	0x94cb00e7,0x94cc0ddd,0x94cd0eb2,0x94ce045c,0x94d00a13,0x94d10af1,0x94d20496,0x94d5179e,
+	0x94d6023b,0x94d70851,0x94d816a9,0x94d90dc6,0x94db0361,0x94dc136a,0x94dd0c75,0x94de03da,
+	0x94df172a,0x94e009f0,0x94e1189a,0x94e219af,0x94e314bd,0x94e4135f,0x94e503fe,0x94e70750,
+	0x94e81056,0x94e91104,0x94ea0693,0x94eb03db,0x94ec05d1,0x94ed0d5c,0x94ee1923,0x94ef10f9,
+	0x94f008d6,0x94f116c1,0x94f201e3,0x94f30275,0x94f412fc,0x94f50022,0x94f61732,0x94f710b1,
+	0x94f819d2,0x94f90aeb,0x94fa0f18,0x94fc0ab9,0x94fd1312,0x94fe0b7b,0x94ff0a3f,0x95001535,
+	0x950112ab,0x95020b33,0x9503188d,0x9504028e,0x95050687,0x950605b1,0x95070470,0x950815a9,
+	0x95090322,0x950a0c4c,0x950b0508,0x950c1573,0x950d0bf1,0x950e09eb,0x950f0885,0x951010cb,
+	0x9511131b,0x95120adf,0x95130fee,0x95140982,0x95150002,0x95160faa,0x951718f3,0x95180e36,
+	0x95190323,0x951a0cbb,0x951b00c0,0x951d0380,0x951e0a37,0x951f0a9d,0x952114a3,0x95220635,
+	0x95230c5b,0x952402bf,0x952519ed,0x9526091f,0x952814e9,0x952909b0,0x952a07cc,0x952b0e89,
+	0x952c12d9,0x952d03fc,0x952e08a0,0x952f09a3,0x95300cfe,0x95311a1d,0x95320fdb,0x953409f4,
+	0x95350fab,0x95361238,0x95370484,0x953801b6,0x95390fba,0x953a1985,0x953b043d,0x953c1262,
+	0x953e0764,0x953f0008,0x95400434,0x95410ce4,0x95420c15,0x954404e8,0x95450cde,0x95460d7e,
+	0x9547191a,0x954905c9,0x954a0e07,0x954c09ae,0x954d0e08,0x954e0da1,0x954f0bed,0x955005ac,
+	0x9551008a,0x95521717,0x9553084b,0x95540137,0x95560123,0x955712e8,0x95580caa,0x95590c5e,
+	0x955b1774,0x955c0959,0x955d0396,0x955e1a48,0x955f15e4,0x95611579,0x956209ce,0x95630b9d,
+	0x95640f21,0x95650c29,0x95660446,0x95670acd,0x95680f2a,0x956902fe,0x956a0fb1,0x956b038f,
+	0x956c07d3,0x956d0b02,0x956f1a0a,0x95700b70,0x9571171f,0x957201c0,0x95730126,0x95761518,
+	0x957f01f2,0x95e80ceb,0x95e91212,0x95ea1121,0x95eb163b,0x95ed00de,0x95ee1436,0x95ef02b5,
+	0x95f010ce,0x95f11402,0x95f214ec,0x95f30707,0x95f40865,0x95f50d4f,0x95f60a0b,0x95f70cef,
+	0x95f81899,0x95f90dcd,0x95fa0664,0x95fb142e,0x95fc12b9,0x95fd0d52,0x95fe0c6f,0x9600049f,
+	0x960105be,0x960206e1,0x96030aa3,0x96040963,0x9605182e,0x96060ae3,0x960817f5,0x96091633,
+	0x960a01f0,0x960b14c7,0x960c1430,0x960d07bb,0x960e1645,0x960f047f,0x961001e4,0x96110ac6,
+	0x96121049,0x96140aa8,0x96151069,0x961606ea,0x96171337,0x9619106a,0x961a0a02,0x961c0559,
+	0x961d0551,0x961f0440,0x96210f79,0x96221474,0x962a0070,0x962e10c3,0x96310942,0x963204c3,
+	0x96331674,0x96341722,0x96351915,0x963608e5,0x963b1a4a,0x963c1a63,0x963d03c2,0x963f0000,
+	0x964013a6,0x964200a3,0x96440557,0x96450823,0x96460c2c,0x96470c03,0x96480223,0x96491587,
+	0x964b0c12,0x964c0d75,0x964d08b4,0x96501505,0x96540571,0x96551122,0x965b00e4,0x965f1967,
+	0x96610419,0x96621820,0x9664028b,0x96670e01,0x9668183f,0x966914f9,0x966a0e86,0x966c1a3d,
+	0x967202bb,0x96740eb1,0x96750bd0,0x96761308,0x96771507,0x968517c5,0x96860c00,0x968813f3,
+	0x968b1289,0x968d077f,0x968f128a,0x9690173d,0x969405c4,0x96970a8e,0x96980013,0x969914c9,
+	0x969c18d6,0x96a71291,0x96b014b8,0x96b3079b,0x96b60b4a,0x96b919e9,0x96bc129b,0x96bd09b6,
+	0x96be0db7,0x96c01067,0x96c11665,0x96c41599,0x96c51622,0x96c60809,0x96c70633,0x96c9197a,
+	0x96cc02da,0x96cd1770,0x96ce0984,0x96cf0290,0x96d20c6d,0x96d503d4,0x96e00283,0x96e817d9,
+	0x96e917c6,0x96ea15ee,0x96ef1431,0x96f30b60,0x96f60bd8,0x96f70afe,0x96f90092,0x96fe147f,
+	0x970015b2,0x97010834,0x97041538,0x9706135c,0x9707191b,0x97080e91,0x97090ce0,0x970d07d2,
+	0x970e110e,0x970f04d5,0x97130ddf,0x97160bb8,0x971c1217,0x971e14d9,0x972a1736,0x972d000f,
+	0x9730150c,0x97320c2b,0x9738005c,0x97390eb0,0x973e0c91,0x97520ff3,0x97530954,0x97560955,
+	0x97590958,0x975b03cc,0x975e04cf,0x97600a15,0x97610d10,0x97620d2f,0x976516b9,0x976905bf,
+	0x9773092f,0x977415e6,0x97760057,0x977c032e,0x97851671,0x978b1556,0x978d001f,0x9791032f,
+	0x97920fc4,0x97940c9d,0x97980fd0,0x97a00985,0x97a310ad,0x97ab0986,0x97ad0109,0x97af0875,
+	0x97b205fe,0x97b400ba,0x97e613fc,0x97e71094,0x97e906ad,0x97ea1419,0x97eb1848,0x97ec1303,
+	0x97ed096b,0x97f31727,0x97f51849,0x97f61148,0x987516b0,0x987603f5,0x98771003,0x987806a0,
+	0x98791525,0x987a1220,0x987b15af,0x987c15bb,0x987d13ce,0x987e062f,0x987f0454,0x98800f49,
+	0x9881006b,0x9882125c,0x988306c1,0x988417f1,0x98850c22,0x98860bdf,0x98870f05,0x98880945,
+	0x988908fa,0x988a0853,0x988c06e8,0x988d1762,0x988f0a20,0x989016d8,0x98910eef,0x98931392,
+	0x989406b7,0x98961763,0x98970a23,0x98981322,0x989a0474,0x989b19da,0x989c1648,0x989d0473,
+	0x989e0e09,0x989f0c99,0x98a003b8,0x98a110ec,0x98a206d4,0x98a401e9,0x98a510b9,0x98a60ef0,
+	0x98a7105b,0x98ce04ff,0x98d1011e,0x98d210d8,0x98d309a2,0x98d51261,0x98d80edd,0x98d90124,
+	0x98da0125,0x98de04cd,0x98df11a2,0x98e71298,0x98e81520,0x990d1669,0x9910018f,0x992e134f,
+	0x99541777,0x99551304,0x9963119a,0x996507da,0x99671582,0x9968139b,0x996914c5,0x996a1095,
+	0x996b17e9,0x996c0264,0x996d04b7,0x996e173b,0x996f0890,0x997011ba,0x99710095,0x99721247,
+	0x997416ce,0x99750494,0x9976107f,0x9977151f,0x997a08d2,0x997c0148,0x997d0152,0x997f047c,
+	0x998017c2,0x99810dd2,0x998407bd,0x99851508,0x9986064d,0x998701b5,0x99880a97,0x998a1260,
+	0x998b01d9,0x998d0d68,0x998f0bf3,0x999015a2,0x99910921,0x99920c9b,0x999310e5,0x999419e0,
+	0x99950dbf,0x999611d3,0x99970a85,0x9998068d,0x99991510,0x99a50568,0x99a81577,0x9a6c0c86,
+	0x9a6d17e5,0x9a6e13a4,0x9a6f1604,0x9a700253,0x9a71102f,0x9a730157,0x9a740c6e,0x9a751866,
+	0x9a7611aa,0x9a771248,0x9a78055a,0x9a79097d,0x9a7a1a3b,0x9a7b19ca,0x9a7c13a9,0x9a7d0e29,
+	0x9a7e085c,0x9a7f1700,0x9a800347,0x9a81152e,0x9a820c8c,0x9a8408c0,0x9a85074f,0x9a860c68,
+	0x9a87069d,0x9a880ed5,0x9a8a0b1b,0x9a8b0244,0x9a8c1660,0x9a8f09e0,0x9a900f4e,0x9a910f3a,
+	0x9a920a34,0x9a9319eb,0x9a96018e,0x9a970eda,0x9a981977,0x9a9a10ee,0x9a9b147e,0x9a9c003a,
+	0x9a9d0bea,0x9a9e0f86,0x9a9f1128,0x9aa00120,0x9aa10c5d,0x9aa202e6,0x9aa301e7,0x9aa419a2,
+	0x9aa5083a,0x9aa71517,0x9aa80624,0x9ab0137a,0x9ab1090d,0x9ab603a8,0x9ab70a55,0x9ab80697,
+	0x9aba0716,0x9abc05ca,0x9ac000fe,0x9ac10a27,0x9ac20f76,0x9ac50c0e,0x9acb0a6c,0x9acc013e,
+	0x9ad10421,0x9ad3128b,0x9ad805a1,0x9adf011f,0x9ae10a9e,0x9ae60cbc,0x9aeb1345,0x9aed1a1f,
+	0x9aef1072,0x9af915a3,0x9afb0839,0x9b031a35,0x9b08105a,0x9b0f0966,0x9b13013f,0x9b1f0767,
+	0x9b230bad,0x9b2f0203,0x9b3205c1,0x9b3b1805,0x9b3c066e,0x9b410a8a,0x9b4207be,0x9b430054,
+	0x9b440f10,0x9b450cea,0x9b471657,0x9b481539,0x9b490b88,0x9b4d13e9,0x9b4f1429,0x9b510250,
+	0x9b540d6f,0x9c7c17ba,0x9c7f1796,0x9c810c27,0x9c8204c7,0x9c85005b,0x9c860f01,0x9c870dee,
+	0x9c880c23,0x9c8b0563,0x9c8d009f,0x9c8e071e,0x9c9012c5,0x9c910667,0x9c9208ff,0x9c94141a,
+	0x9c95048f,0x9c9a0835,0x9c9b08c7,0x9c9c14ea,0x9c9e1522,0x9c9f1603,0x9ca005e3,0x9ca10b24,
+	0x9ca20b6d,0x9ca30873,0x9ca40b34,0x9ca511a4,0x9ca61346,0x9ca70681,0x9ca81107,0x9ca90777,
+	0x9cab0837,0x9cad0ffb,0x9cae0bda,0x9cb01a3f,0x9cb104d6,0x9cb20aa0,0x9cb301f1,0x9cb40636,
+	0x9cb50de0,0x9cb60def,0x9cb703d5,0x9cb80940,0x9cba1198,0x9cbb1a20,0x9cbc04fc,0x9cbd03ea,
+	0x9cc310de,0x9cc40487,0x9cc51019,0x9cc60566,0x9cc7078d,0x9cca0108,0x9ccb10f1,0x9ccc0038,
+	0x9ccd0f58,0x9cce12b6,0x9ccf064b,0x9cd01698,0x9cd30afc,0x9cd4012a,0x9cd515ef,0x9cd6012c,
+	0x9cd70c9e,0x9cd80d56,0x9cd91776,0x9cdc0678,0x9cdd1130,0x9cde0bbb,0x9cdf1a5b,0x9ce20b37,
+	0x9e1f0dfa,0x9e200961,0x9e2107e2,0x9e221806,0x9e230d59,0x9e250e44,0x9e261613,0x9e280097,
+	0x9e291916,0x9e2a0613,0x9e2b0404,0x9e2c0c20,0x9e2d1615,0x9e2f1670,0x9e310249,0x9e32103b,
+	0x9e331809,0x9e3513ab,0x9e361233,0x9e371971,0x9e38048e,0x9e39063a,0x9e3a15a0,0x9e3d05b9,
+	0x9e3e0c44,0x9e3f070c,0x9e410161,0x9e420b1e,0x9e4309ad,0x9e440628,0x9e450471,0x9e4617fb,
+	0x9e4714f5,0x9e481321,0x9e49146c,0x9e4a106b,0x9e4b0d34,0x9e4c001e,0x9e4e00a8,0x9e4f0ea0,
+	0x9e5102c7,0x9e550734,0x9e570485,0x9e58061d,0x9e5a02db,0x9e5b0cdf,0x9e5c1481,0x9e5e16a0,
+	0x9e630874,0x9e6406ef,0x9e66174d,0x9e6718fa,0x9e680bf5,0x9e690b99,0x9e6a08ca,0x9e6b0978,
+	0x9e6c1804,0x9e6d0c3c,0x9e70174f,0x9e710749,0x9e730654,0x9e7e031d,0x9e7f0c32,0x9e820818,
+	0x9e8709da,0x9e8819c1,0x9e8b0d0f,0x9e920f59,0x9e930c3d,0x9e9d1161,0x9e9f0bbc,0x9ea60c96,
+	0x9eb41036,0x9eb8051a,0x9ebb0c84,0x9ebd0cd0,0x9ebe0799,0x9ec40780,0x9ec9070d,0x9ecd11f5,
+	0x9ece0b25,0x9ecf0df0,0x9ed106f1,0x9ed40f93,0x9ed80d7f,0x9edb0346,0x9edc02a1,0x9edd17a0,
+	0x9edf16c6,0x9ee014da,0x9ee21037,0x9ee51001,0x9ee70b29,0x9ee90428,0x9eea0194,0x9eef002a,
+	0x9ef91958,0x9efb0542,0x9efc0550,0x9efe0d4d,0x9f0b1816,0x9f0d13af,0x9f0e03f6,0x9f100db3,
+	0x9f130629,0x9f17130c,0x9f190ec0,0x9f2011f7,0x9f2204f4,0x9f2c17ac,0x9f2f145f,0x9f3714b2,
+	0x9f391658,0x9f3b00d0,0x9f3d1029,0x9f3e06a4,0x9f441895,0x9f500f3f,0x9f5107f3,0x9f7f025c,
+	0x9f800229,0x9f830991,0x9f840bd9,0x9f850091,0x9f861343,0x9f871a1e,0x9f881735,0x9f8917e2,
+	0x9f8a02d0,0x9f8b1046,0x9f8c144d,0x9f990bf6,0x9f9a05ef,0x9f9b09f8,0x9f9f0661,0x9fa01833,
+	0xff011a6b,0xff021a6c,0xff031a6d,0xff041a6e,0xff051a6f,0xff061a70,0xff071a71,0xff081a72,
+	0xff091a73,0xff0a1a74,0xff0b1a75,0xff0c1a76,0xff0d1a77,0xff0e1a78,0xff0f1a79,0xff101a7a,
+	0xff111a7b,0xff121a7c,0xff131a7d,0xff141a7e,0xff151a7f,0xff161a80,0xff171a81,0xff181a82,
+	0xff191a83,0xff1a1a84,0xff1b1a85,0xff1c1a86,0xff1d1a87,0xff1e1a88,0xff1f1a89,0xff201a8a,
+	0xff211a8b,0xff221a8c,0xff231a8d,0xff241a8e,0xff251a8f,0xff261a90,0xff271a91,0xff281a92,
+	0xff291a93,0xff2a1a94,0xff2b1a95,0xff2c1a96,0xff2d1a97,0xff2e1a98,0xff2f1a99,0xff301a9a,
+	0xff311a9b,0xff321a9c,0xff331a9d,0xff341a9e,0xff351a9f,0xff361aa0,0xff371aa1,0xff381aa2,
+	0xff391aa3,0xff3a1aa4,0xff3b1aa5,0xff3d1aa6,0xff3e1aa7,0xff3f1aa8,0xff401aa9,0xff411aaa,
+	0xff421aab,0xff431aac,0xff441aad,0xff451aae,0xff461aaf,0xff471ab0,0xff481ab1,0xff491ab2,
+	0xff4a1ab3,0xff4b1ab4,0xff4c1ab5,0xff4d1ab6,0xff4e1ab7,0xff4f1ab8,0xff501ab9,0xff511aba,
+	0xff521abb,0xff531abc,0xff541abd,0xff551abe,0xff561abf,0xff571ac0,0xff581ac1,0xff591ac2,
+	0xff5a1ac3,0xff5b1ac4,0xff5c1ac5,0xff5d1ac6,0xff5e1ac7,
+	};
+
+static const TCollationKeyTable TheChineseTable = 
+	{ TheChineseKey, TheChineseIndex, 6861, NULL, NULL, 0 };
+
+static const TCollationMethod TheChineseMethod =
+	{ 0, NULL, &TheChineseTable, 0 };
+
+void test_unicode_collations()
+	{
+	/*
+	Note: the curious method of getting values greater than 255 into the strings is needed
+	because GCC doesn't handle the \x notation properly: it zeroes the high byte, so
+	L"\x2011" puts the value 0x0011, not 0x2011, into the string.
+	*/
+	TBuf<32> x, y;
+
+	test.Next(_L("collation"));
+	test_unicode_collation(_L("Graham"),_L("Graham"),0);		// equality
+	test_unicode_collation(_L("something"),_L(""),1);			// something after nothing
+	test_unicode_collation(_L("inform"),_L("information"),-1);	// prefixes come first
+ 	test_unicode_collation(_L("\x30CB\x30e5\x30fc"),_L("\x30CB\x30e5\x30fc\x30e0"),-1); // Katakana 
+	test_unicode_collation(_L("\x3042\x308a"),_L("\x3042\x308a\x304c\x3068"),-1); // Hiragana
+	test_unicode_collation(_L("unicode"),_L("consortium"),1);	// standard alphabetic ordering: lowercase
+	test_unicode_collation(_L("AARON"),_L("AARDVARK"),1);		// standard alphabetic ordering: uppercase
+	test_unicode_collation(_L("AARON"),_L("AARDVARK"),1,0);		// alphabetic ordering is significant at level 0
+	test_unicode_collation(_L("hello"),_L("Hello"),1,3,&TheSwapCaseMethod);			// lowercase before uppercase
+	test_unicode_collation(_L("hello"),_L("Hello"),-1,2);		// case is significant at level 2
+	//test_unicode_collation(_L("hello"),_L("Hello"),0,1);		// ignore case at level 1
+	test_unicode_collation(_L("hello"),_L("Hello"),0,1);
+	test_unicode_collation(_L("hello"),_L("[H E L L O !]"),0,1);// ignore punctuation and case at level 1
+	test_unicode_collation(_L("1234"),_L("abc"),-1);			// digits before letters
+	x = _L("week day"); x[4] = 0x2011;							// (week-day with non-breaking hyphen)
+	test_unicode_collation(x,_L("weekend"),-1);					// ignore punctuation if letters differ; d < e
+	test_unicode_collation(x,_L("week-day"),1);					// compare punctuation if otherwise equal
+	test_unicode_collation(x,_L("week-day"),0,2);				// ignore difference between hyphens at level 2
+	test_unicode_collation(x,_L("Week-day"),-1);				// case difference outweighs punctuation ordering
+	y = _L("a ngstro m"); y[1] = 0x30a; y[8] = 0x308;			// (a<ring>ngstro<umlaut>m with piece accents)
+	test_unicode_collation(_L("\xe5ngstr\xf6m"),y,0);			// base+accent = precomposed (a<ring>ngstro<umlaut>m)
+	test_unicode_collation(_L("Liege"),_L("Li\xe8ge"),-1);		// unaccented before accented...
+	test_unicode_collation(_L("Liege"),_L("Li\xe8ge"),-1,1);	// accents are significant at level 1
+	test_unicode_collation(_L("Liege"),_L("li\xe8ge"),-1);		// accentuation outweighs case
+	test_unicode_collation(_L("Liege"),_L("li\xe8ge"),0,0);		// ignore accents and case at level 0
+	test_unicode_collation(_L("\xe5ngstr\xf6m"),_L("zoo"),-1);	// a-ring before z by default
+	// test_unicode_collation(_L("\xe5ngstr\xf6m"),_L("zoo"),1,3,&TheSwedishMethod);	// a-ring after z in Sweden
+	test_unicode_collation(_L("Antidisestablishmentarian"),_L("antidisestablishmentariac"),1); 	// long strings that don't have identical prefixes
+	
+	test_unicode_collation(_L("\xFF86"),_L(""),1);
+	test_unicode_collation(_L("\x30B9"),_L(""),1);
+	// Equality 
+	test_unicode_collation(_L("\xFF71"),_L("\xFF71"),0,3,&TheKanaMethod);  // Same Halfwidth Katakana characters
+	test_unicode_collation(_L("\x30A2"),_L("\x30A2"),0,3,&TheKanaMethod);  // Same Katakana characters
+	test_unicode_collation(_L("\xFF71\xFF67"),_L("\xFF71\xFF67"),0,3,&TheKanaMethod); // Same katakana Characters with small letter
+	test_unicode_collation(_L("\x30b9\x30af\x30ea\x30fc\x30e0"),_L("\x30b9\x30af\x30ea\x30fc\x30e0"),0,3,&TheKanaMethod); // Scream in Katakana
+	test_unicode_collation(_L("\x3042"),_L("\x3042"),0,3,&TheKanaMethod);  // same Hiragana characters
+	test_unicode_collation(_L("\x3042\x308A"),_L("\x3042\x308A"),0,3,&TheKanaMethod); 
+	test_unicode_collation(_L("\x304C"),_L("\x304B\x3099"),0,3,&TheKanaMethod);
+	test_unicode_collation(_L("\x3072\x3063\x304f"),_L("\x3072\x3063\x304f"),0,3,&TheKanaMethod); // Hiragana word Hyaku
+	// 1/2 width Katakana is sorted before Katakana 
+	test_unicode_collation(_L("\xFF71"),_L("\x30A2"),-1,3,&TheKanaMethod);
+	test_unicode_collation(_L("\x30A2"),_L("\xFF71"), 1,3,&TheKanaMethod);
+	test_unicode_collation(_L("\xFF86\xFF6D\xFF70\xFF7D"),_L("\x30CB\x30E5\x30FC\x30B9"),-1,3,&TheKanaMethod); // News Katakan 1/2 width & full width..this shoule be -1
+	// 1/2 width katakana sorted before half width with small character;
+	test_unicode_collation(_L("\xFF71"),_L("\xFF71\xFF67"),-1,3,&TheKanaMethod);  // same katakana characcter, one with a small character
+	test_unicode_collation(_L("\xFF77"),_L("\xFF71\xFF6C"),1,3,&TheKanaMethod); // different Katakana character, one with small character 
+	// Hiragana before Katakana & 1/2 width Katakana
+	test_unicode_collation(_L("\x3042"),_L("\x30a2"),-1,3,&TheKanaMethod);
+	test_unicode_collation(_L("\x3042"),_L("\x30a2"),1,3,&TheSwapKanaMethod);
+	test_unicode_collation(_L("\x3042"),_L("\x30cb"),-1,3,&TheKanaMethod);
+	test_unicode_collation(_L("\x308a"),_L("\x30a2\x30ea\x30e0"),1,3,&TheKanaMethod);
+	test_unicode_collation(_L("\x3042\x308a"),_L("\x30a2\x30ea"),-1,3,&TheKanaMethod);
+	test_unicode_collation(_L("\x3042\x308a\x304c\x3068"),_L("\xFF71\xFF86\xFF6D\xFF70\xff7D"),1,3,&TheKanaMethod);
+	test_unicode_collation(_L("\x3042"),_L("\xFF71"),-1,3,&TheKanaMethod);
+	test_unicode_collation(_L("\x3042\x308a"),_L("\x30a2\x30ea\x30e0\x30b9"),-1,3,&TheKanaMethod);
+
+	// Test Katakana Nigori and Maru Sort sequence
+	test_unicode_collation(_L("\xff8a"),_L("\xff8A\xff9e"),-1,3,&TheKanaMethod);
+	test_unicode_collation(_L("\xff8a"),_L("\xff8a\xff9f"),-1,3,&TheKanaMethod);
+	test_unicode_collation(_L("\xff8a\xff9e"),_L("\xff8a\xff9f"),-1,3,&TheKanaMethod);
+	test_unicode_collation(_L("\x30cf"),_L("\x30d0"),-1,3,&TheKanaMethod);
+	test_unicode_collation(_L("\x30cf"),_L("\x30d1"),-1,3,&TheKanaMethod); 
+	test_unicode_collation(_L("\x30d1"),_L("\x30d0"),1,3,&TheKanaMethod); 
+	test_unicode_collation(_L("\x306f"),_L("\x3070"),-1,3,&TheKanaMethod);
+	test_unicode_collation(_L("\x306f"),_L("\x3071"),-1,3,&TheKanaMethod);
+	test_unicode_collation(_L("\x3070"),_L("\x3071"),-1,3,&TheKanaMethod);
+	test_unicode_collation(_L("\xff8a"),_L("\x30cf"),-1,3,&TheKanaMethod);
+	test_unicode_collation(_L("\x3071"),_L("\x3068"),1,3,&TheKanaMethod);
+	test_unicode_collation(_L("\x306f"),_L("\x30d1"),-1,3,&TheKanaMethod);
+	test_unicode_collation(_L("\x306f"),_L("\xff8a"),-1,3,&TheKanaMethod);
+	test_unicode_collation(_L("\x3070"),_L("\xff8a\xff9e"),-1,3,&TheKanaMethod);
+	test_unicode_collation(_L("\x3071"),_L("\xff8a\xff9f"),-1,3,&TheKanaMethod);
+	test_unicode_collation(_L("\x3042\x304e\x3089"),_L("\x3044"),-1,3,&TheKanaMethod);
+	test_unicode_collation(_L("\x3070"),_L("\x30cf"),1,3,&TheKanaMethod);
+	test_unicode_collation(_L("\x30cf"),_L("\x3070"),-1,3,&TheKanaMethod);
+	test_unicode_collation(_L("\x3070"),_L("\xff8a"),1,3,&TheKanaMethod);
+	test_unicode_collation(_L("\x3071"),_L("\xff8a"),1,3,&TheKanaMethod);
+	test_unicode_collation(_L("\x30d1"),_L("\x3071"),1,3,&TheKanaMethod);
+	
+	test_unicode_collation(_L("\x30ac"),_L("\x30ab"),1,3,&TheKanaMethod);
+	test_unicode_collation(_L("\x30a2\x30ac"),_L("\x30a2\x30ab"),1,3,&TheKanaMethod); // ka comes before Ga
+	test_unicode_collation(_L("\x306b\x3058\x3085"),_L("\x306b\x3057\x308c"),-1,3,&TheKanaMethod);
+	
+	// Triplet support test 
+	test_unicode_collation(_L("\x30ac\x30fc"),_L("\x30ae\x30fc"),-1,3,&TheKanaMethod);
+	test_unicode_collation(_L("\x30ab\x30fc"),_L("\x30ab\x30fc"),0,3,&TheKanaMethod);
+	test_unicode_collation(_L("\x30ab\x30a4"),_L("\x30ab\x30fc"),1,3,&TheKanaMethod);  
+	test_unicode_collation(_L("\x30ab\x30a4"),_L("\x30ac"),1,3,&TheKanaMethod);
+	
+	//Simplified Chinese test starts. Note that the Chinese collation table only includes the ideological characters. 
+	//The characters which are in the base table should come to the front while the characters which are not either 
+	//in base table or client table should come after
+	test.Next(_L("Simplified Chinese test starts"));
+	test_unicode_collation(_L("\x554a"),_L("\x4f4f"),-1,3,&TheChineseMethod);//different sound
+	test_unicode_collation(_L("\x54ed"),_L("\x5757"),-1,3,&TheChineseMethod);//different sound
+	test_unicode_collation(_L("\x8d30"),_L("\x82ac"),-1,3,&TheChineseMethod);//different sound
+	test_unicode_collation(_L("\x62bd"),_L("\x6577"),-1,3,&TheChineseMethod);//different sound
+	test_unicode_collation(_L("\x75c5"),_L("\x7e94"),-1,3,&TheChineseMethod);//different sound
+//same sound
+	test_unicode_collation(_L("\x78e8"),_L("\x672b"),-1,3,&TheChineseMethod);//different tones
+	test_unicode_collation(_L("\x5e9c"),_L("\x7236"),-1,3,&TheChineseMethod);//different tones
+	test_unicode_collation(_L("\x7840"),_L("\x5904"),-1,3,&TheChineseMethod);//different tones
+	test_unicode_collation(_L("\x5976"),_L("\x8010"),-1,3,&TheChineseMethod);//different tones
+	test_unicode_collation(_L("\x7720"),_L("\x9762"),-1,3,&TheChineseMethod);//different tones
+//same sound and stroke count
+	test_unicode_collation(_L("\x5757"),_L("\x5feb"),-1,3,&TheChineseMethod);//different first stroke
+	test_unicode_collation(_L("\x51b3"),_L("\x8bc0"),-1,3,&TheChineseMethod);//different first stroke
+	test_unicode_collation(_L("\x5316"),_L("\x4ee4"),-1,3,&TheChineseMethod);//different first stroke
+	test_unicode_collation(_L("\x62df"),_L("\x4f60"),1,3,&TheChineseMethod);//different radical
+	test_unicode_collation(_L("\x6d1b"),_L("\x9a86"),-1,3,&TheChineseMethod);//different first stroke
+//smae sound and same tones
+	test_unicode_collation(_L("\x5757"),_L("\x4fa9"),-1,3,&TheChineseMethod);//different stroke count
+	test_unicode_collation(_L("\x51e1"),_L("\x7e41"),-1,3,&TheChineseMethod);//different stroke count
+	test_unicode_collation(_L("\x98ce"),_L("\x950b"),-1,3,&TheChineseMethod);//different stroke count
+	test_unicode_collation(_L("\x5e01"),_L("\x5e87"),-1,3,&TheChineseMethod);//different stroke count
+	test_unicode_collation(_L("\x529e"),_L("\x534a"),-1,3,&TheChineseMethod);//different stroke count
+//compare the Chinese ideological characters to other characters which are not included in the Chinese collation table
+	test_unicode_collation(_L("abc"),_L("\x4f4f"),-1,3,&TheChineseMethod);//compare alphabets to Chinese character
+	test_unicode_collation(_L("zxc"),_L("\x4f4f"),-1,3,&TheChineseMethod);//compare alphabets to Chinese character
+	test_unicode_collation(_L("\x3041"),_L("\x4f4f"),1,3,&TheChineseMethod);//compare a Hiragana to Chinese characters
+	test_unicode_collation(_L("\x30f6"),_L("\x4f4f"),1,3,&TheChineseMethod);//compare a Katakana to Chinese characters
+	test_unicode_collation(_L("\x3041"),_L("\x30f6"),-1,3,&TheChineseMethod);//compare a Hiragana to a Katakana
+//compare two group of chinese characters
+	test_unicode_collation(_L("\x8584\x554a"),_L("\x8584\x4f4f"),-1,3,&TheChineseMethod);//the first chinese character is the same
+	test_unicode_collation(_L("\x5b89\x95ed"),_L("\x5b89\x6b65"),-1,3,&TheChineseMethod);//the first chinese character is the same
+	test_unicode_collation(_L("\x60b2\x7c3f"),_L("\x60b2\x5e9c"),-1,3,&TheChineseMethod);//the first chinese character is the same
+	test_unicode_collation(_L("\x8336\x5e01"),_L("\x8336\x5e87"),-1,3,&TheChineseMethod);//the first chinese character is the same
+	test_unicode_collation(_L("\x4ea7\x529e"),_L("\x4ea7\x534a"),-1,3,&TheChineseMethod);//the first chinese character is the same
+
+	test_unicode_collation(_L("\x3041\x554a"),_L("\x3041\x4f4f"),-1,3,&TheChineseMethod);//the first Hiragana is the same
+	test_unicode_collation(_L("\x3063\x6bd4"),_L("\x3063\x660c"),-1,3,&TheChineseMethod);//the first Hiragana is the same
+	test_unicode_collation(_L("\x30b7\x5999"),_L("\x30b7\x6728"),-1,3,&TheChineseMethod);//the first Katakana is the same
+	test_unicode_collation(_L("\x3041\x534a"),_L("\x3041\x907e"),-1,3,&TheChineseMethod);//the first Katakana is the same
+
+	test_unicode_collation(_L("\x3041\x554a"),_L("\x30f6\x4f4f"),-1,3,&TheChineseMethod);//the first symbole is different
+	test_unicode_collation(_L("\x3041\x4fbc"),_L("\x3063\x5068"),-1,3,&TheChineseMethod);//the first symbole is different
+	test_unicode_collation(_L("\x30b7\x6478"),_L("\x30c2\x51dd"),-1,3,&TheChineseMethod);//the first symbole is different
+	test_unicode_collation(_L("\x3046\x5ff5"),_L("\x30ea\x5b81"),-1,3,&TheChineseMethod);//the first symbole is different
+	test_unicode_collation(_L("\x3072\x7aed"),_L("\x254b\x670d"),1,3,&TheChineseMethod);//the first symbole is different
+//compare full width and half width digits and letters
+	test_unicode_collation(_L("\xff11"),_L("\x0031"),1,3,&TheChineseMethod);//full width "1" comes after half width "1"
+	test_unicode_collation(_L("\x0032"),_L("\xff11"),1,3,&TheChineseMethod);//half width "2" comes after full width "1"
+	test_unicode_collation(_L("\xff21"),_L("\x0061"),1,3,&TheChineseMethod);//full width "a" comes after half width "a"
+	test_unicode_collation(_L("\x0062"),_L("\xff21"),1,3,&TheChineseMethod);//half width "b" comes after full width "a"
+	}
+
+_LIT(KFoo1, "foo");
+_LIT(KFoo2, "FOO");
+_LIT(KFoo3, "Foo");
+_LIT(KNotFoo1, "fo\x300o");
+_LIT(KNotFoo2, "foo ");
+_LIT(KNotFoo3, "foo\x300");
+_LIT(KNotFoo4, "fo,o");
+_LIT(KSigma1, "\x3C3");
+_LIT(KSigma2, "\x3C2");
+_LIT(KSigma3, "\x3A3");
+_LIT(KPeach, "pe\x302\x63he");
+_LIT(KFish, "pe\x301\x63he\x301");
+
+TInt CompareIWrapper(const TDesC& a, const TDesC& b)
+	{
+#if 0
+	return a.CompareIdentifiers(b);
+#else
+	TCollationMethod method;
+	method.iMainTable = 0;
+	method.iOverrideTable = 0;
+	method.iFlags = TCollationMethod::EIgnoreNone | TCollationMethod::EFoldCase;
+	return a.CompareC(b, 2, &method);
+#endif
+	}
+
+void test_identifiers()
+	{
+	// test that comparison is as expected
+	test(0 == CompareIWrapper(KFoo1, KFoo1));
+	test(0 == CompareIWrapper(KFoo1, KFoo3));
+	test(0 == CompareIWrapper(KFoo2, KFoo3));
+	test(0 == CompareIWrapper(KFoo2, KFoo1));
+	test(0 == CompareIWrapper(KFoo3, KFoo1));
+	test(0 == CompareIWrapper(KFoo3, KFoo2));
+	test(0 != CompareIWrapper(KFoo1, KNotFoo1));
+	test(0 != CompareIWrapper(KNotFoo2, KFoo1));
+	test(0 != CompareIWrapper(KFoo1, KNotFoo3));
+	test(0 != CompareIWrapper(KNotFoo4, KFoo1));
+	test(0 == CompareIWrapper(KSigma1, KSigma2));
+	test(0 == CompareIWrapper(KSigma1, KSigma3));
+	test(0 != CompareIWrapper(KPeach, KFish));
+	}
+
+// This whole test should first use the japanese collation lookup table and if not found what it was 
+// looking for then it will search the basic standard table ... 
+
+
+GLDEF_C TInt E32Main(void)
+    {
+
+	test.Title();
+	test.Start(_L("TCollate Testing"));
+
+	test_unicode_collations();
+	test_identifiers();
+
+	test.End();
+	return(KErrNone);
+    }
+
+#pragma warning ( default :4700)
+#pragma warning ( default :4710) 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32test/buffer/t_des.cpp	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,1505 @@
+// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32test\buffer\t_des.cpp
+// Overview:
+// Test methods of the TDes template class.
+// API Information:
+// TDes
+// Details:
+// - Test assigning TPtrs in various ways and confirm results are as expected.
+// - Test locating in reverse on an empty TPtr, verify it returns KErrNoFound.
+// - For TBuf, TBuf8 and TBuf16 objects: 
+// - Construct a default TBuf object and verify Length and MaxLength values are
+// as expected.
+// - Construct a TBuf object with length and verify Length and MaxLength values 
+// are as expected.
+// - Construct a TBuf object over a string, verify Length and MaxLength values 
+// are as expected. Verify the string data is correct.
+// - Construct a TBuf object over a descriptor, verify Length and MaxLength values 
+// are as expected. Verify the data is correct.
+// - Construct a TBuf object over a buffer, verify Length and MaxLength values 
+// are as expected. Verify the data is correct.
+// - Construct a TBuf object and assign a string to it, verify Length and MaxLength 
+// values are as expected. Verify the data is correct.
+// - Construct a TBuf object and assign a descriptor to it, verify Length and MaxLength 
+// values are as expected. Verify the data is correct.
+// - Construct a TBuf object and assign a buffer to it, verify Length and MaxLength 
+// values are as expected. Verify the data is correct.
+// - Check the available user heap space and check for memory leaks by comparing it to 
+// the initial value.
+// - For TPtrC, TPtrC8 and TPtrC16 objects: 
+// - Verify the invariant for a null pointer descriptor
+// - Construct a TPtrC object over a constant string, verify Length and string data 
+// are correct.
+// - Construct a TPtrC object over a constant descriptor, verify Length and data are 
+// correct.
+// - Construct a TPtrC object over a constant buffer with length, verify Length and 
+// data are correct.
+// - Check the available user heap space and check for memory leaks by comparing it to 
+// the initial value.
+// - For TPtr, TPtr8 and TPtr16 objects: 
+// - Verify the invariant for a null pointer descriptor
+// - Construct a TPtr object over a buffer with length and maxlength, verify Length,
+// MaxLength and data are correct.
+// - Construct a TPtr object over a buffer with maxlength, verify Length, MaxLength 
+// and Ptr are correct.
+// - Construct a TPtr object and assign a string to it. Verify Length, MaxLength and
+// the string data are correct.
+// - Construct a TPtr object and assign a buffer to it. Verify Length, MaxLength and
+// the data are correct.
+// - Construct a TPtr object and assign a descriptor to it. Verify Length, MaxLength
+// and the data are correct.
+// - Check the available user heap space and check for memory leaks by comparing it to 
+// the initial value.
+// - Verify the TPtr copy constructor by setting and checking a text string.
+// - For TBufC, TBufC8 and TBufC16 objects: 
+// - Construct a default TBufC object. Verify default Length is as expected.
+// - Construct a TBufC object over a string, verify Length and data are correct.
+// - Construct a TBufC object over a TBufC, verify Length and data are correct.
+// - Construct a TBufC object and assign a string to it, verify Length and data 
+// are correct.
+// - Construct a TBufC object and assign a descriptor to it, verify Length and data 
+// are correct.
+// - Construct a TBufC object and assign a TBufC to it, verify Length and data 
+// are correct.
+// - Check the available user heap space and check for memory leaks by comparing it to 
+// the initial value.
+// - For HBufC, HBufC8 and HBufC16 objects: 
+// - Create a new descriptor using the New() method, verify non-NULL return value.
+// - Construct a HBufC object and assign a string to it, verify Length and data 
+// are correct.
+// - Construct a HBufC object and assign a descriptor to it, verify Length and data 
+// are correct.
+// - Construct a HBufC object and assign a HBufC to it, verify Length and data 
+// are correct.
+// - Construct a HBufC object and call ReAlloc method, verify Length and data are 
+// correct.
+// - Check the available user heap space and check for memory leaks by comparing it to 
+// the initial value.
+// - Test ASCII destination with Unicode source. Verify string results are as expected.
+// - For TLitC, TLitC8 and TLitC16 objects: 
+// - Verify member operators.
+// - Assign and validate literal values
+// - For TBuf, TBuf8 and TBuf16 objects, test TDes derived objects that return TPtrs.
+// - Extract and verify the left portion of the descriptor (LeftTPtr).
+// - Extract and verify the right portion of the descriptor (RightTPtr).
+// - Extract and verify the middle portion of the descriptor (MidTPtr).
+// - For TPtr, TPtr8 and TPtr16 objects, test TDes derived objects that return TPtrs.
+// - Extract and verify the left portion of the descriptor (LeftTPtr).
+// - Extract and verify the right portion of the descriptor (RightTPtr).
+// - Extract and verify the middle portion of the descriptor (MidTPtr).
+// Platforms/Drives/Compatibility:
+// All 
+// Assumptions/Requirement/Pre-requisites:
+// Failures and causes:
+// Base Port information:
+// 
+//
+
+#include <e32test.h>
+
+LOCAL_D RTest test(_L("T_DES"));
+
+template<class T,class S, class L, class R>	
+class TestTDes
+	{
+public:
+	TestTDes(); 		// Test class constructor.
+	void Test1();
+	void Test2();
+	void Test3();
+	void Test4();
+	void Test5();
+	void Test6();
+	void Test7();
+	void Test8();
+	void Test9();
+	void Test10();
+	void Test11();
+	void Test12();
+	void Test13();
+	void Test14();
+	void Test15();
+	void Test16();
+	void Test17();
+	void Test18();
+	void TestA();
+	void TestB();
+	void TestC();
+	void TestD();
+	void TestE();
+	void TestF();
+	void TestG();
+	void TestH();
+	void TestI();
+	void TestJ();
+	void TestK();
+	void TestL();
+	void TestM();
+	void TestN();
+	void TestO();
+	void TestP();
+	void test_TPtrC(); 	// Test TPtrC classes
+	void test_TPtr();	// Test TPtr classes
+	void test_TBuf();	// Test TBuf classes
+	void test_TBufC();	// Test TBufC classes
+	void test_HBufC();	// Test HBufC classes
+	void test_TBufReturningModifiable();
+	void test_TPtrReturningModifiable();
+	void test_TDesReturningModifiable(const T& a, R& b);
+	void testHeapSpace(TInt);
+	};
+
+template <class T, class S, class L, class R>
+GLDEF_C TestTDes<T,S,L,R>::TestTDes()
+//
+//	Constructor
+//
+	{}
+
+template <class T,class S,class L,class R>
+GLDEF_C void TestTDes<T,S,L,R>::testHeapSpace(TInt startAvail)
+//
+//	Test no memory leakage has occured
+//
+	{
+
+	test.Next(_L("Testing for memory leaks"));
+	TInt endAvail,temp;
+	endAvail=User::Available(temp);
+	test(endAvail==startAvail);
+	}
+
+template <class T, class S, class L, class R>
+GLDEF_C void TestTDes<T,S,L,R>::Test1()
+//
+//	Constructs a view over a constant string
+//
+	{
+
+	T a(_TL("ABc"));
+	a.__DbgTestInvariant();
+	test(a.Length()==3);
+	test(*a.Ptr()=='A');
+	test(*(a.Ptr()+1)=='B');
+	test(*(a.Ptr()+2)=='c');
+	}
+
+template<class T, class S, class L, class R>
+GLDEF_C void TestTDes<T,S,L,R>::Test2()
+//
+//	Constructs a view over a descriptor
+//
+	{
+
+	T aDes(_TL("ABc"));
+	aDes.__DbgTestInvariant();
+	T b(aDes);
+	b.__DbgTestInvariant();
+	test(b.Length()==aDes.Length());
+	test(*b.Ptr()==*aDes.Ptr());
+	test(*(b.Ptr()+1)==*(aDes.Ptr()+1));
+	test(*(b.Ptr()+2)==*(aDes.Ptr()+2));
+	}
+
+template<class T, class S, class L, class R>
+GLDEF_C void TestTDes<T,S,L,R>::Test3()
+//
+//	Constructs a view over a length specified buffer
+//
+	{
+
+	S* aBuf = _TL("ABCDEF");
+	T aDes(aBuf,6);
+	aDes.__DbgTestInvariant();
+	test(aDes.Length()==6);
+	for(S count=0; count<aDes.Length(); count++)
+		test(*(aDes.Ptr()+count)==('A' + count));
+	test(aDes.Ptr()==aBuf);
+	}
+
+template<class T, class S, class L, class R>
+GLDEF_C void TestTDes<T,S,L,R>::Test4()
+//
+//	Constructs a r/w view over a buffer with length & maxlength
+//
+	{
+
+	S* aBuf;
+	aBuf=_TL("LMNOPQ");
+	T aDesW(aBuf,6,0x0A);
+	aDesW.__DbgTestInvariant();
+	test(aDesW.Length()==6);
+	for(S count=0; count<aDesW.Length(); count++)
+		test(*(aDesW.Ptr()+count)==('L' + count));
+	test(aDesW.Ptr()==aBuf);
+	test(aDesW.MaxLength()==0x0A);
+	}
+
+template<class T, class S, class L, class R>
+GLDEF_C void TestTDes<T,S,L,R>::Test5()
+//
+//	Constructs a r/w view over a buffer with maxlength
+//
+	{
+
+	S* aBuf;
+	aBuf=_TL("ZYXWVU");
+	T aDesW(aBuf,0x06);
+	aDesW.__DbgTestInvariant();
+	test(aDesW.Length()==0);
+	test(aDesW.MaxLength()==0x06);
+	test(aDesW.Ptr()==aBuf);
+	}
+
+template<class T, class S, class L, class R>
+GLDEF_C void TestTDes<T,S,L,R>::Test6()
+//
+//	Constructs a r/w view over a LcbBase with maxlength
+//
+	{
+	// Cant use yet, see calling function
+	}
+
+template<class T, class S, class L, class R>
+GLDEF_C void TestTDes<T,S,L,R>::Test7()
+//
+//	Constructs a default TBuf view 
+//
+	{
+
+	T aBuf;
+	aBuf.__DbgTestInvariant();
+	test(aBuf.Length()==0);
+	test(aBuf.MaxLength()==0x40);
+	}
+
+template<class T, class S, class L, class R>
+GLDEF_C void TestTDes<T,S,L,R>::Test8()
+//
+//	Constructs a TBuf view with length
+//
+	{
+
+	T aBuf(10);
+	aBuf.__DbgTestInvariant();
+	test(aBuf.Length()==10);
+	test(aBuf.MaxLength()==0x40);
+	}
+
+template<class T, class S, class L, class R>
+GLDEF_C void TestTDes<T,S,L,R>::Test9()
+//
+//	Constructs a TBuf view over a string
+//
+	{
+
+	T aBuf(_TL("ABCDEF"));
+	aBuf.__DbgTestInvariant();
+	test(aBuf.Length()==6);
+	test(aBuf.MaxLength()==0x40);
+	for(S count=0;count<aBuf.Length();count++)
+		test(*(aBuf.Ptr()+count)==('A' + count));
+	}
+
+template<class T, class S, class L, class R>
+GLDEF_C void TestTDes<T,S,L,R>::Test10()
+//
+//	Constructs a TBuf view over a descriptor
+//
+	{
+
+	R aDesR(_TL("ABCDEF"));
+	aDesR.__DbgTestInvariant();
+	T aBuf(aDesR);
+	aBuf.__DbgTestInvariant();
+	test(aBuf.MaxLength()==0x40);
+	test(aBuf.Length()==aDesR.Length());
+	test(aBuf.Length()==6);
+	for(S count=0;count<aBuf.Length();count++)
+		{
+		test(*(aBuf.Ptr()+count)==('A' + count));
+		test(*(aBuf.Ptr()+count)==*(aDesR.Ptr()+count));
+		}
+	}
+
+template<class T, class S, class L, class R>
+GLDEF_C void TestTDes<T,S,L,R>::Test11()
+//
+//	Constructs a TBuf view over a buffer
+//
+	{
+
+	T aBuf(_TL("ABCDEF"));
+	aBuf.__DbgTestInvariant();
+	T bBuf(aBuf);
+	bBuf.__DbgTestInvariant();
+	test(bBuf.MaxLength()==aBuf.MaxLength());
+	test(bBuf.MaxLength()==0x40);
+	test(bBuf.Length()==aBuf.Length());
+	test(bBuf.Length()==6);
+	for(S count=0;count<bBuf.Length();count++)
+		{
+		test(*(bBuf.Ptr()+count)==('A' + count));
+		test(*(bBuf.Ptr()+count)==*(aBuf.Ptr()+count));
+		}
+	}
+
+template<class T,class S,class L,class R>
+GLDEF_C void TestTDes<T,S,L,R>::Test12()
+//
+//	Exercise the default TBufC constructor
+//
+	{
+
+	T buf;
+	buf.__DbgTestInvariant();
+	test(buf.Length()==0);
+	}
+
+template<class T,class S,class L,class R>
+GLDEF_C void TestTDes<T,S,L,R>::Test13()
+//
+//	Constructor over a string
+//
+	{
+
+	S* pString=(_TL("12"));
+	T buf(pString);
+	buf.__DbgTestInvariant();
+	test(buf.Length()==2);
+	test(*(buf.Ptr())=='1');
+	test(*(buf.Ptr()+1)=='2');
+	}
+
+template<class T,class S,class L,class R>
+GLDEF_C void TestTDes<T,S,L,R>::Test14()
+//
+//	Constructor over a TDesC (TPtrC)
+//
+	{
+
+	R des(_TL("Test 14"));
+	des.__DbgTestInvariant();
+	T buf(des);
+	buf.__DbgTestInvariant();
+	test(buf.Length()==7);
+	test(buf.Length()==des.Length());
+	test(*(buf.Ptr())=='T');
+	test(*(buf.Ptr()+1)=='e');
+	test(*(buf.Ptr()+2)=='s');
+	test(*(buf.Ptr()+3)=='t');
+	test(*(buf.Ptr()+4)==' ');
+	test(*(buf.Ptr()+5)=='1');
+	test(*(buf.Ptr()+6)=='4');
+	}
+
+
+template<class T,class S,class L,class R>
+GLDEF_C void TestTDes<T,S,L,R>::Test15()
+//
+//	Constructor over a TBufC
+//
+	{
+
+	T oldBuf(_TL("Test  15"));
+	oldBuf.__DbgTestInvariant();
+	T newBuf(oldBuf);
+	newBuf.__DbgTestInvariant();
+	test(newBuf.Length()==8);
+	test(newBuf.Length()==oldBuf.Length());
+	test(*(newBuf.Ptr())=='T');
+	test(*(newBuf.Ptr()+1)=='e');
+	test(*(newBuf.Ptr()+2)=='s');
+	test(*(newBuf.Ptr()+3)=='t');
+	test(*(newBuf.Ptr()+4)==' ');
+	test(*(newBuf.Ptr()+5)==' ');
+	test(*(newBuf.Ptr()+6)=='1');
+	test(*(newBuf.Ptr()+7)=='5');
+	}
+
+template<class T,class S,class L,class R>
+GLDEF_C void TestTDes<T,S,L,R>::Test16()
+//
+//	New operator - without leave
+//
+	{
+
+	T* pBuf=T::New(0x40);
+	test(pBuf!=NULL);
+	pBuf->__DbgTestInvariant();
+	User::Free(pBuf);
+	}
+
+template<class T,class S,class L,class R>
+GLDEF_C void TestTDes<T,S,L,R>::Test17()
+//
+//	NewL operator - forcing a leave
+//
+	{
+
+/*
+
+    Reinstate if some method is found of forcing alloc fail
+    This test no longer works due to heap growing functionality of E32 057
+
+	T* pBuf;
+	TInt temp;
+	TInt available=User::Available(temp);
+	TAny* pDummy=User::Alloc(available);
+	TRAPD(ret,pBuf=T::NewL(0x40))
+	test(ret==KErrNoMemory);
+	User::Free(pDummy);
+*/
+	}
+
+template<class T,class S,class L,class R>
+GLDEF_C void TestTDes<T,S,L,R>::Test18()
+//
+//	NewL operator - forcing success
+//
+	{
+
+	T* pBuf=NULL;
+	TRAPD(ret,pBuf=T::NewL(0x40))
+	test(ret==0);
+	test(pBuf!=NULL);
+	pBuf->__DbgTestInvariant();
+	User::Free(pBuf);
+	}
+
+template<class T, class S, class L, class R>
+GLDEF_C void TestTDes<T,S,L,R>::TestA()
+//
+//	String Assignment
+//
+	{
+
+    S myBuf[7];
+    Mem::Copy(myBuf,_TL("ABCDEF"),7*sizeof(S));
+	T aDes(myBuf,0x06,0x06);
+	aDes=_TL("ZYXWVU");
+	aDes.__DbgTestInvariant();
+	test(aDes.Length()==6);
+	test(aDes.MaxLength()==0x06);
+	S count=0;
+	for(;count<aDes.Length(); count++)
+		{
+		test(*(aDes.Ptr()+count)==('Z'-count));
+		}	
+	aDes=_TL("123");
+	aDes.__DbgTestInvariant();
+	test(aDes.Length()==3);
+	test(aDes.MaxLength()==0x06);
+	for(count=0; count<aDes.Length(); count++)
+		{
+		test(*(aDes.Ptr()+count)==('1'+count));
+		}	
+	}
+
+
+template<class T, class S, class L, class R>
+GLDEF_C void TestTDes<T,S,L,R>::TestB()
+//	DesW Assignment
+	{
+	S aBuf[11];
+	S bBuf[11];
+	
+    Mem::Copy(aBuf,_TL("ZYXWVUTSRQ"),11*sizeof(S));
+    Mem::Copy(bBuf,_TL("ABCDEFGHIJ"),11*sizeof(S));
+	T aDes(aBuf,0x0A,0x0A);	
+	T bDes(bBuf,0x0A);
+	bDes=aDes;
+	aDes.__DbgTestInvariant();
+ 	bDes.__DbgTestInvariant();
+	test(aDes.Length()==bDes.Length());
+	test(aDes.MaxLength()==0x0A);
+	test(bDes.MaxLength()==0x0A);		
+	for(S count=0; count<bDes.Length(); count++)
+		{
+		test(*(aDes.Ptr()+count)==*(bDes.Ptr()+count));
+		}
+	}
+
+
+
+template<class T, class S, class L, class R>
+GLDEF_C void TestTDes<T,S,L,R>::TestC()
+//	DesC Assignment
+	{
+	S aBuf[11];
+	R aDesR(_TL("1234567890"));	
+    Mem::Copy(aBuf,_TL("ABCDEFGHIJ"),11*sizeof(S));
+	T aDes(aBuf,0x0A,0x0A);
+	aDes=aDesR;
+	aDes.__DbgTestInvariant();
+	test(aDes.Length()==aDesR.Length());
+	test(aDes.MaxLength()==0x0A);
+	for(S count=0; count<aDes.Length(); count++)
+		{
+		test(*(aDes.Ptr()+count)==*(aDesR.Ptr()+count));
+		}
+	}
+
+
+template<class T, class S, class L, class R>
+GLDEF_C void TestTDes<T,S,L,R>::TestD()
+//	TBuf string Assignment
+	{
+	T aBuf;
+	aBuf=(_TL("ABCDEF"));
+	aBuf.__DbgTestInvariant();
+	test(aBuf.Length()==6);
+	test(aBuf.MaxLength()==0x40);
+	for(S count=0; count<aBuf.Length(); count++)
+		{
+		test(*(aBuf.Ptr()+count)==('A'+count));
+		}
+	}
+
+
+template<class T, class S, class L, class R>
+GLDEF_C void TestTDes<T,S,L,R>::TestE()
+//	TBuf descriptor Assignment
+	{
+	R aDesR(_TL("ABCDEF"));
+	T aBuf;
+	aBuf=aDesR;
+	aBuf.__DbgTestInvariant();
+	test(aBuf.MaxLength()==0x40);
+	test(aBuf.Length()==aDesR.Length());
+	test(aBuf.Length()==6);
+	for(S count=0;count<aBuf.Length();count++)
+		{
+		test(*(aBuf.Ptr()+count)==('A' + count));
+		test(*(aBuf.Ptr()+count)==*(aDesR.Ptr()+count));
+		}
+	}
+
+
+template<class T, class S, class L, class R>
+GLDEF_C void TestTDes<T,S,L,R>::TestF()
+//	TBuf buffer Assignment
+	{
+	T aBuf(_TL("ABCDEF"));
+	T bBuf;
+	bBuf=aBuf;
+	bBuf.__DbgTestInvariant();
+	test(bBuf.MaxLength()==aBuf.MaxLength());
+	test(bBuf.MaxLength()==0x40);
+	test(bBuf.Length()==aBuf.Length());
+	test(bBuf.Length()==6);
+	for(S count=0;count<bBuf.Length();count++)
+		{
+		test(*(bBuf.Ptr()+count)==('A' + count));
+		test(*(bBuf.Ptr()+count)==*(aBuf.Ptr()+count));
+		}
+ 	}
+	 
+
+template<class T, class S, class L, class R>
+GLDEF_C void TestTDes<T,S,L,R>::TestG()
+//	TBufC string assignment test
+	{
+	S* pString=_TL("TestG");
+	T buf;
+
+	test(buf.Length()==0);
+	buf=pString;
+	buf.__DbgTestInvariant();
+	test(buf.Length()==5);
+	test(*(buf.Ptr())=='T');
+	test(*(buf.Ptr()+1)=='e');
+	test(*(buf.Ptr()+2)=='s');
+	test(*(buf.Ptr()+3)=='t');
+	test(*(buf.Ptr()+4)=='G');
+	}
+
+
+template<class T, class S, class L, class R>
+GLDEF_C void TestTDes<T,S,L,R>::TestH()
+//	TBufC descriptor assignment
+	{
+	R des(_TL("TestH"));
+	T buf;
+
+	test(buf.Length()==0);
+	buf=des;
+	buf.__DbgTestInvariant();
+	test(buf.Length()==5);
+	test(buf.Length()==des.Length());
+	test(*(buf.Ptr())=='T');
+	test(*(buf.Ptr()+1)=='e');
+	test(*(buf.Ptr()+2)=='s');
+	test(*(buf.Ptr()+3)=='t');
+	test(*(buf.Ptr()+4)=='H');
+	}
+
+template<class T, class S, class L, class R>
+GLDEF_C void TestTDes<T,S,L,R>::TestI()
+//	TBufC TBufC assignment
+	{
+	T oldBuf(_TL("TEsti"));
+	T newBuf;
+
+	test(newBuf.Length()==0);
+	newBuf=oldBuf;
+	newBuf.__DbgTestInvariant();
+	test(newBuf.Length()==5);
+	test(newBuf.Length()==oldBuf.Length());
+	test(*(newBuf.Ptr())=='T');
+	test(*(newBuf.Ptr()+1)=='E');
+	test(*(newBuf.Ptr()+2)=='s');
+	test(*(newBuf.Ptr()+3)=='t');
+	test(*(newBuf.Ptr()+4)=='i');
+	}
+
+template<class T,class S,class L,class R>
+GLDEF_C void TestTDes<T,S,L,R>::TestJ()
+//
+//	HBufC string assignment
+//
+	{
+
+	S* pString=_TL("tEStJ");
+	T* pBuf=NULL;
+	TRAPD(ret,pBuf=T::NewL(0x40))
+	test(ret==0);
+	test(pBuf!=NULL);
+	*pBuf=pString;
+	pBuf->__DbgTestInvariant();
+	test(pBuf->Length()==5);
+	test(*(pBuf->Ptr())=='t');
+	test(*(pBuf->Ptr()+1)=='E');	
+	test(*(pBuf->Ptr()+2)=='S');	
+	test(*(pBuf->Ptr()+3)=='t');	
+	test(*(pBuf->Ptr()+4)=='J');	
+	User::Free(pBuf);
+	}
+
+template<class T,class S,class L,class R>
+GLDEF_C void TestTDes<T,S,L,R>::TestK()
+//
+//	HBufC descriptor assignment
+//
+	{
+
+	R des(_TL("TestK"));
+	T* pBuf=NULL;
+	TRAPD(ret,pBuf=T::NewL(0x40))
+	test(ret==0);
+	test(pBuf!=NULL);
+	*pBuf=des;
+	pBuf->__DbgTestInvariant();
+	test(pBuf->Length()==5);
+	test(pBuf->Length()==des.Length());
+	test(*(pBuf->Ptr())=='T');
+	test(*(pBuf->Ptr()+1)=='e');	
+	test(*(pBuf->Ptr()+2)=='s');	
+	test(*(pBuf->Ptr()+3)=='t');	
+	test(*(pBuf->Ptr()+4)=='K');	
+	User::Free(pBuf);
+	}
+
+template<class T,class S,class L,class R>
+GLDEF_C void TestTDes<T,S,L,R>::TestL()
+//
+//	HBufC HBufC assignment
+//
+	{
+
+	S* pString=_TL("testl");
+	T* pOldBuf=NULL;
+	T* pNewBuf=NULL;
+	TRAPD(ret,pOldBuf=T::NewL(0x40))
+	test(ret==0);
+	TRAP(ret,pNewBuf=T::NewL(0x40))
+	test(ret==0);
+	test(pNewBuf!=NULL);
+	test(pOldBuf!=NULL);
+	*pOldBuf=pString;
+	*pNewBuf=*pOldBuf;
+	pOldBuf->__DbgTestInvariant();
+	pNewBuf->__DbgTestInvariant();
+	test(pNewBuf->Length()==5);
+	test(pOldBuf->Length()==pNewBuf->Length());
+	test(*(pNewBuf->Ptr())=='t');
+	test(*(pNewBuf->Ptr()+1)=='e');	
+	test(*(pNewBuf->Ptr()+2)=='s');	
+	test(*(pNewBuf->Ptr()+3)=='t');	
+	test(*(pNewBuf->Ptr()+4)=='l');	
+	User::Free(pOldBuf);
+	User::Free(pNewBuf);
+//
+	TRAP(ret,pOldBuf=T::NewMaxL(0x40))
+	test(ret==0);
+	TRAP(ret,pNewBuf=T::NewMaxL(0x40))
+	test(ret==0);
+	test(pNewBuf!=NULL);
+	test(pOldBuf!=NULL);
+	pOldBuf->__DbgTestInvariant();
+	pNewBuf->__DbgTestInvariant();
+	test(pNewBuf->Length()==0x40);
+	test(pOldBuf->Length()==0x40);
+	pNewBuf->Des().Zero();
+	pOldBuf->Des().Zero();
+	pOldBuf->__DbgTestInvariant();
+	pNewBuf->__DbgTestInvariant();
+	test(pNewBuf->Length()==0);
+	test(pOldBuf->Length()==0);
+	*pOldBuf=pString;
+	*pNewBuf=*pOldBuf;
+	pOldBuf->__DbgTestInvariant();
+	pNewBuf->__DbgTestInvariant();
+	test(pNewBuf->Length()==5);
+	test(pOldBuf->Length()==pNewBuf->Length());
+	test(*(pNewBuf->Ptr())=='t');
+	test(*(pNewBuf->Ptr()+1)=='e');	
+	test(*(pNewBuf->Ptr()+2)=='s');	
+	test(*(pNewBuf->Ptr()+3)=='t');	
+	test(*(pNewBuf->Ptr()+4)=='l');	
+	User::Free(pOldBuf);
+	User::Free(pNewBuf);
+	}
+
+template<class T,class S,class L,class R>
+GLDEF_C void TestTDes<T,S,L,R>::TestM()
+//
+//	HBufC ReAlloc
+//
+	{
+
+	S* pString=_TL("TESTM");
+	T* pBuf;
+	pBuf=T::NewL(0x40);
+	*pBuf=pString;
+	pBuf->ReAlloc(0x40);
+	test(pBuf!=NULL);
+	pBuf->__DbgTestInvariant();
+	test(pBuf->Length()==5);
+	test(*(pBuf->Ptr())=='T');
+	test(*(pBuf->Ptr()+1)=='E');	
+	test(*(pBuf->Ptr()+2)=='S');	
+	test(*(pBuf->Ptr()+3)=='T');	
+	test(*(pBuf->Ptr()+4)=='M');	
+	User::Free(pBuf);
+	}
+
+template<class T,class S,class L,class R>
+GLDEF_C void TestTDes<T,S,L,R>::TestN()
+//
+//	HBufC ReAllocL - forcing a leave
+//
+	{
+
+/*
+
+    Reinstate if some method is found of forcing alloc fail
+    This test no longer works due to heap growing functionality of E32 057
+
+	S* pString=_TL("tEStJ");
+	T* pBuf;
+	TInt available, temp;
+	TAny* pDummy;
+	pBuf=T::NewL(0x40);
+	test(pBuf!=NULL);
+	*pBuf=pString;
+	available=User::Available(temp);
+	pDummy=User::Alloc(available);
+	TRAPD(ret,pBuf->ReAllocL(0x50))
+	test(ret==KErrNoMemory);
+	User::Free(pDummy);
+	User::Free(pBuf);
+*/
+	}
+
+template<class T,class S,class L,class R>
+GLDEF_C void TestTDes<T,S,L,R>::TestO()
+//	HBufC ReAllocL - forcing success
+	{
+
+	S* pString=_TL("tEStJ");
+	T* pBuf;
+	pBuf=T::NewL(0x40);
+	test(pBuf!=0);
+	*pBuf=pString;
+	TRAPD(ret,pBuf->ReAllocL(0x40))
+	test(ret==0);
+	test(pBuf!=NULL);
+	pBuf->__DbgTestInvariant();
+	test(pBuf->Length()==5);
+	test(*(pBuf->Ptr())=='t');
+	test(*(pBuf->Ptr()+1)=='E');	
+	test(*(pBuf->Ptr()+2)=='S');	
+	test(*(pBuf->Ptr()+3)=='t');	
+	test(*(pBuf->Ptr()+4)=='J');	
+	User::Free(pBuf);
+	}
+
+template<class T,class S,class L,class R>
+GLDEF_C void TestTDes<T,S,L,R>::TestP()
+//	Invariant for null pointer descriptor
+//	Added to reproduce DEF023302
+	{
+	T p(NULL, 0);
+	p.__DbgTestInvariant();
+	}
+
+GLDEF_C void TestCopy16()
+//	Test TPtr16 copy constructor
+	{
+    TBuf16<0x20> buf(_S16("Paddington Station"));
+	TPtr16 ptr1((TText16*)buf.Ptr(),buf.Length(),buf.MaxLength());
+	ptr1.__DbgTestInvariant();
+	TPtr16 ptr2(ptr1);
+	ptr2.__DbgTestInvariant();
+	ptr2[11]='B';
+	ptr2[12]='e';
+	ptr2[13]='a';
+	ptr2[14]='r';
+	ptr2[15]=' ';
+	ptr1.SetLength(15);
+	ptr2.Append(_L16(" acid"));
+	test(ptr1==_L16("Paddington Bear"));
+	test(ptr2==_L16("Paddington Bear on acid"));
+	}
+
+GLDEF_C void Test16To8()
+//	Test ASCII dest with Unicode source
+	{
+    TBuf8<0x20> buf(_S8("Paddington Station"));
+	TPtr8 ptr1((TText8*)buf.Ptr(),buf.Length(),buf.MaxLength());
+	ptr1.__DbgTestInvariant();
+	TPtr8 ptr2(ptr1);
+	ptr2.__DbgTestInvariant();
+	ptr2[11]='B';
+	ptr2[12]='e';
+	ptr2[13]='a';
+	ptr2[14]='r';
+	ptr2[15]=' ';
+	ptr1.SetLength(15);
+	ptr1.__DbgTestInvariant();
+	ptr2.Append(_L16(" acid"));
+	ptr2.__DbgTestInvariant();
+	test(ptr1==_L8("Paddington Bear"));
+	test(ptr2==_L8("Paddington Bear on acid"));
+	}
+
+
+GLDEF_C void TestCopy8()
+//	Test TPtr8 copy constructor
+	{
+    TBuf8<0x20> buf(_S8("Paddington Station"));
+	TPtr8 ptr1((TText8*)buf.Ptr(),buf.Length(),buf.MaxLength());
+	TPtr8 ptr2(ptr1);
+	ptr2[11]='B';
+	ptr2[12]='e';
+	ptr2[13]='a';
+	ptr2[14]='r';
+	ptr2[15]=' ';
+	ptr1.SetLength(15);
+	ptr2.Append(_L8(" acid"));
+	ptr1.__DbgTestInvariant();
+	ptr2.__DbgTestInvariant();
+	test(ptr1==_L8("Paddington Bear"));
+	test(ptr2==_L8("Paddington Bear on acid"));
+	}
+
+GLDEF_C void TestCopy()
+//	Test TPtr copy constructor
+	{
+    TBuf<0x20> buf(_S("Paddington Station"));
+	TPtr ptr1((TText*)buf.Ptr(),buf.Length(),buf.MaxLength());
+	TPtr ptr2(ptr1);
+	ptr2[11]='B';
+	ptr2[12]='e';
+	ptr2[13]='a';
+	ptr2[14]='r';
+	ptr2[15]=' ';
+	ptr1.SetLength(15);
+	ptr2.Append(_L(" acid"));
+	ptr1.__DbgTestInvariant();
+	ptr2.__DbgTestInvariant();
+	test(ptr1==_L("Paddington Bear"));
+	test(ptr2==_L("Paddington Bear on acid"));
+	}
+
+template<class T, class S, class L, class R>
+GLDEF_C void TestTDes<T,S,L,R>::test_TPtrC()
+//
+// Test the TDesC class special member functions
+//
+	{
+
+ 	test.Start(_L("Invariant for null pointer descriptor"));
+ 	TestP();
+	test.Next(_L("R/O view over constant string"));
+	Test1();
+	test.Next(_L("R/O view over constant descriptor"));
+	Test2();
+	test.Next(_L("R/O view over constant buffer with length"));
+	Test3();
+	}
+
+template<class T, class S, class L, class R>
+GLDEF_C void TestTDes<T,S,L,R>::test_TPtr()
+//
+//	Test the TPtr class special member functions
+//
+	{
+
+ 	test.Start(_L("Invariant for null pointer descriptor"));
+ 	TestP();
+	test.Next(_L("R/W view over buffer with length & maxlength"));
+	Test4();
+	test.Next(_L("R/W view over buffer with maxlength"));
+	Test5();
+//	Skipped the following test because Colly hasn't
+//	written the templates yet for the TBufC8 & 16 classes
+//	test.Next(_L("R/W view over LcbBase with maxlength"));
+//	Test6();
+	test.Next(_L("String assignment"));
+	TestA();
+	test.Next(_L("DesW assignment"));
+	TestB();
+	test.Next(_L("DesC assignment"));
+	TestC();
+	}
+
+template<class T, class S, class L, class R>
+GLDEF_C void TestTDes<T,S,L,R>::test_TBuf()
+//
+// Test the TBuf class special member functions
+//
+	{
+
+	test.Start(_L("TBuf default view, no params"));
+	Test7();
+	test.Next(_L("TBuf view with a length"));
+	Test8();
+	test.Next(_L("TBuf view over a string"));
+	Test9();
+	test.Next(_L("TBuf view over a descriptor"));
+	Test10();
+	test.Next(_L("TBuf view over a buffer"));
+	Test11();
+	test.Next(_L("String assignment"));
+	TestD();
+	test.Next(_L("Descriptor assignment"));
+	TestE();
+	test.Next(_L("Buffer assignment"));
+	TestF();
+	}
+
+template<class T,class S,class L,class R>
+GLDEF_C void TestTDes<T,S,L,R>::test_TBufC()
+//
+// Test the TBufC class methods
+//
+	{
+
+	test.Start(_L("Default constructor"));
+	Test12();
+	test.Next(_L("With a string"));
+	Test13();
+	test.Next(_L("With a Descriptor (TPtrC)"));
+	Test14();
+	test.Next(_L("With a TBufC"));
+	Test15();
+	test.Next(_L("String assignment"));
+	TestG();
+	test.Next(_L("Descriptor assignment (TPtrC)"));
+	TestH();
+	test.Next(_L("TBufC assignment"));
+	TestI();
+	}
+
+template<class T,class S,class L,class R>
+GLDEF_C void TestTDes<T,S,L,R>::test_HBufC()
+//
+//	Test the HBufC class methods.
+//
+	{
+
+	test.Start(_L("New"));
+	Test16();
+	test.Next(_L("NewL - forcing a leave"));
+	Test17();
+	test.Next(_L("NewL - showing success"));
+	Test18();
+	test.Next(_L("String assignment"));
+	TestJ();
+	test.Next(_L("Descriptor assignment"));
+	TestK();
+	test.Next(_L("HBufC assignment"));
+	TestL();
+	test.Next(_L("ReAlloc"));
+	TestM();
+	test.Next(_L("ReAllocL - forcing a leave"));
+	TestN();
+	test.Next(_L("ReAllocL - showing success"));
+	TestO();
+	}
+
+template<class T,class S,class L,class R>
+GLDEF_C void TestTDes<T,S,L,R>::test_TBufReturningModifiable()
+	{
+	T a;
+	R b(0,0);
+	a.Copy(_TL("abcdefg"));
+	test_TDesReturningModifiable(a,b);
+	}
+
+template<class T,class S,class L,class R>
+GLDEF_C void TestTDes<T,S,L,R>::test_TPtrReturningModifiable()
+	{
+	S* aBuf;
+	aBuf=_TL("abcdefg");
+	T a(aBuf,7,7);
+	R b(0,0);
+	test_TDesReturningModifiable(a,b);
+	}
+
+template<class T,class S,class L,class R>
+GLDEF_C void TestTDes<T,S,L,R>::test_TDesReturningModifiable(const T& a, R& b)
+	{
+	test.Start(_L("Test TDes derived objects that return TPtrs"));
+
+	test.Next(_L("LeftTPtr"));
+	b.Set(a.LeftTPtr(3));
+	b.__DbgTestInvariant();
+	test(b == a.Left(3));
+
+	b.Set(a.LeftTPtr(0));
+	b.__DbgTestInvariant();
+	test(b == a.Left(0));
+
+	b.Set(a.LeftTPtr(7));
+	b.__DbgTestInvariant();
+	test(b == a.Left(7));
+
+	b = a.LeftTPtr(42);
+	b.__DbgTestInvariant();
+	test(b == a.Left(7));
+
+	test.Next(_L("RightTPtr"));
+	b.Set(a.RightTPtr(5));
+	b.__DbgTestInvariant();
+	test(b == a.Right(5));
+
+	b.Set(a.RightTPtr(7));
+	b.__DbgTestInvariant();
+	test(b == a.Right(7));
+
+	b.Set(a.RightTPtr(0));
+	b.__DbgTestInvariant();
+	test(b == a.Right(0));
+
+	b.Set(a.RightTPtr(42));
+	b.__DbgTestInvariant();
+	test(b == a.Right(42));
+
+	test.Next(_L("MidTPtr"));
+	b.Set(a.MidTPtr(5));
+	b.__DbgTestInvariant();
+	test(b == a.Mid(5));
+
+	b.Set(a.MidTPtr(7));
+	b.__DbgTestInvariant();
+	test(b == a.Mid(7));
+
+	b.Set(a.MidTPtr(0));
+	b.__DbgTestInvariant();
+	test(b == a.Mid(0));
+
+	test.Next(_L("MidTPtr (2 parms)"));
+	b.Set(a.MidTPtr(4,3));
+	b.__DbgTestInvariant();
+	test(b == a.Mid(4,3));
+	test(b == a.Mid(4));
+
+	b.Set(a.MidTPtr(0,0));
+	b.__DbgTestInvariant();
+	test(b == a.Mid(0,0));
+
+	b.Set(a.MidTPtr(3,2));
+	b.__DbgTestInvariant();
+	test(b == a.Mid(3,2));
+
+	b.Set(a.MidTPtr(7,0));
+	b.__DbgTestInvariant();
+	test(b == a.Mid(7,0));
+	}
+
+LOCAL_C void testAssignTPtr()
+//
+// Test assigning TPtr's.
+//
+	{
+
+	TBufC<0x20> x(_S("Hello"));
+	TPtr p=x.Des();
+	p+=_L(" World");
+	test(p==_L("Hello World"));
+	test(x==_L("Hello World"));
+	p.SetLength(5);
+	test(p==_L("Hello"));
+	test(x==_L("Hello"));
+	TBufC<0x20> y(_S("ByeBye"));
+	TPtr q=y.Des();
+	q.Set(p);
+	test(q==p);
+	q+=_L(" World");
+	test(q==_L("Hello World"));
+	test(x==_L("Hello World"));
+	test(y==_L("ByeBye"));
+	q.Set((TText*)x.Ptr(),x.Length(),x.Des().MaxLength());
+	test(q==_L("Hello World"));
+	test(q.MaxLength()==0x20);
+	q.SetLength(1);
+	test(q==_L("H"));
+	test(x==_L("Hello World"));
+	}
+
+LOCAL_C void testTPtrLocateReverse()
+//
+// Test locating in reverse on an empty TPtr
+//
+	{
+
+	TPtrC a;
+	test(a.LocateReverse('0')==KErrNotFound);
+	test(a.LocateReverseF('0')==KErrNotFound);
+	}
+
+_LIT8(KLitTest1_8,"1");
+_LIT8(KLitTest12_8,"12");
+_LIT8(KLitTest123_8,"123");
+_LIT8(KLitTest1234_8,"1234");
+_LIT8(KLitTestalpha_8,"abcdefghijklmnopqrstuvwxyz");
+
+LOCAL_C const TDesC8& testByRef8(TRefByValue<const TDesC8> aRef)
+	{
+	return aRef;
+	}
+
+LOCAL_C void testTLitC8()
+	{
+	test.Start(_L("All members"));
+	test (_L8("")==KNullDesC8);			// operator const TDesC8&
+	test (KNullDesC8()==TPtrC8());		// operator()
+	const TDesC8* pNull=&KNullDesC8;	// operator&
+	test (pNull->Compare(_L8(""))==0);
+	test (&testByRef8(KNullDesC8)==&KNullDesC8);	// operator const TRefByValue<const TDesC8>
+//
+	test.Next(_L("Literal values"));
+	const TDesC8& t1=KLitTest1_8;
+	test (t1.Length()==1);
+	test (t1[0]=='1');
+	test (t1==_L8("1"));
+	const TDesC8& t12=KLitTest12_8;
+	test (t12.Length()==2);
+	test (t12[0]=='1');
+	test (t12==_L8("12"));
+	const TDesC8& t123=KLitTest123_8;
+	test (t123.Length()==3);
+	test (t123[0]=='1');
+	test (t123==_L8("123"));
+	const TDesC8& t1234=KLitTest1234_8;
+	test (t1234.Length()==4);
+	test (t1234[0]=='1');
+	test (t1234==_L8("1234"));
+	const TDesC8& talpha=KLitTestalpha_8;
+	test (talpha.Length()==26);
+	test (talpha[0]=='a');
+	test (talpha==_L8("abcdefghijklmnopqrstuvwxyz"));
+//
+	test.End();
+	}
+
+_LIT16(KLitTest1_16,"1");
+_LIT16(KLitTest12_16,"12");
+_LIT16(KLitTest123_16,"123");
+_LIT16(KLitTest1234_16,"1234");
+_LIT16(KLitTestalpha_16,"abcdefghijklmnopqrstuvwxyz");
+
+LOCAL_C const TDesC16& testByRef16(TRefByValue<const TDesC16> aRef)
+	{
+	return aRef;
+	}
+
+LOCAL_C void testTLitC16()
+	{
+	test.Start(_L("All members"));
+	test (_L16("")==KNullDesC16);			// operator const TDesC16&
+	test (KNullDesC16()==TPtrC16());		// operator()
+	const TDesC16* pNull=&KNullDesC16;	// operator&
+	test (pNull->Compare(_L16(""))==0);
+	test (&testByRef16(KNullDesC16)==&KNullDesC16);	// operator const TRefByValue<const TDesC16>
+//
+	test.Next(_L("Literal values"));
+	const TDesC16& t1=KLitTest1_16;
+	test (t1.Length()==1);
+	test (t1[0]=='1');
+	test (t1==_L16("1"));
+	const TDesC16& t12=KLitTest12_16;
+	test (t12.Length()==2);
+	test (t12[0]=='1');
+	test (t12==_L16("12"));
+	const TDesC16& t123=KLitTest123_16;
+	test (t123.Length()==3);
+	test (t123[0]=='1');
+	test (t123==_L16("123"));
+	const TDesC16& t1234=KLitTest1234_16;
+	test (t1234.Length()==4);
+	test (t1234[0]=='1');
+	test (t1234==_L16("1234"));
+	const TDesC16& talpha=KLitTestalpha_16;
+	test (talpha.Length()==26);
+	test (talpha[0]=='a');
+	test (talpha==_L16("abcdefghijklmnopqrstuvwxyz"));
+//
+	test.End();
+	}
+
+_LIT(KLitTest1,"1");
+_LIT(KLitTest12,"12");
+_LIT(KLitTest123,"123");
+_LIT(KLitTest1234,"1234");
+_LIT(KLitTestalpha,"abcdefghijklmnopqrstuvwxyz");
+
+LOCAL_C const TDesC& testByRef(TRefByValue<const TDesC> aRef)
+	{
+	return aRef;
+	}
+
+LOCAL_C void testTLitC()
+	{
+	test.Start(_L("All members"));
+	test (_L("")==KNullDesC);			// operator const TDesC&
+	test (KNullDesC()==TPtrC());		// operator()
+	const TDesC* pNull=&KNullDesC;	// operator&
+	test (pNull->Compare(_L(""))==0);
+	test (&testByRef(KNullDesC)==&KNullDesC);	// operator const TRefByValue<const TDesC>
+#if defined(_UNICODE)
+	test (_L16("")==KNullDesC);			// operator const TDesC&
+	test (KNullDesC()==TPtrC16());		// operator()
+	const TDesC16* pNull16=&KNullDesC;	// operator&
+	test (pNull16->Compare(_L16(""))==0);
+	test (&testByRef16(KNullDesC)==&KNullDesC);	// operator const TRefByValue<const TDesC>
+#else
+	test (_L8("")==KNullDesC);			// operator const TDesC&
+	test (KNullDesC()==TPtrC8());		// operator()
+	const TDesC8* pNull8=&KNullDesC;	// operator&
+	test (pNull8->Compare(_L8(""))==0);
+	test (&testByRef8(KNullDesC)==&KNullDesC);	// operator const TRefByValue<const TDesC>
+#endif
+//
+	test.Next(_L("Literal values"));
+	const TDesC& t1=KLitTest1;
+	test (t1.Length()==1);
+	test (t1[0]=='1');
+	test (t1==_L("1"));
+	const TDesC& t12=KLitTest12;
+	test (t12.Length()==2);
+	test (t12[0]=='1');
+	test (t12==_L("12"));
+	const TDesC& t123=KLitTest123;
+	test (t123.Length()==3);
+	test (t123[0]=='1');
+	test (t123==_L("123"));
+	const TDesC& t1234=KLitTest1234;
+	test (t1234.Length()==4);
+	test (t1234[0]=='1');
+	test (t1234==_L("1234"));
+	const TDesC& talpha=KLitTestalpha;
+	test (talpha.Length()==26);
+	test (talpha[0]=='a');
+	test (talpha==_L("abcdefghijklmnopqrstuvwxyz"));
+//
+	test.End();
+	}
+
+LOCAL_C void testLiteral()
+	{
+	test.Next(_L("class TLitC8"));
+	testTLitC8();
+	test.Next(_L("class TLitC16"));
+	testTLitC16();
+	test.Next(_L("class TLitC"));
+	testTLitC();
+	}
+
+#ifndef _DEBUG
+#pragma warning (disable: 4702)// Unreachable code
+#pragma warning (disable: 4701)// Local variable used without being initialized
+#pragma warning (disable: 4710)// Function not expanded
+#endif
+
+GLDEF_C TInt E32Main()
+//
+// Test the TDes type.
+//
+    {
+	test.Title();
+//
+	TInt startAvail,temp;
+	startAvail=User::Available(temp);
+//
+	test.Start(_L("Assigning TPtr's"));
+	testAssignTPtr();
+//
+	test.Next(_L("Locate reverse on empty TPtr"));
+	testTPtrLocateReverse();
+//
+	test.Next(_L("class TBuf<0x40>"));
+	TestTDes<TBuf<0x40>,TText,TUint, TPtrC> jj;
+	jj.test_TBuf();
+	jj.testHeapSpace(startAvail);
+	test.End();
+//
+	test.Next(_L("class TBuf8<0x40>"));
+	TestTDes<TBuf8<0x40>,TUint8,TUint8, TPtrC8> ii;
+	ii.test_TBuf();
+	ii.testHeapSpace(startAvail);
+	test.End();
+//
+	test.Next(_L("class TBuf16<0x40>"));
+	TestTDes<TBuf16<0x40>,TUint16,TUint16, TPtrC16> hh;
+	hh.test_TBuf();
+	hh.testHeapSpace(startAvail);
+	test.End();	
+//
+	test.Next(_L("class TPtrC"));
+	TestTDes<TPtrC,TText,TUint, TPtrC> dd;
+	dd.test_TPtrC();
+	dd.testHeapSpace(startAvail);
+	test.End();
+//
+	test.Next(_L("class TPtrC8"));
+	TestTDes<TPtrC8,TUint8,TUint8, TPtrC8> cc;
+	cc.test_TPtrC();
+	cc.testHeapSpace(startAvail);
+	test.End();
+//
+	test.Next(_L("class TPtrC16"));
+	TestTDes<TPtrC16,TUint16,TUint16, TPtrC16> bb;
+	bb.test_TPtrC();
+	bb.testHeapSpace(startAvail);
+	test.End();
+//
+	test.Next(_L("class TPtr"));
+	TestTDes<TPtr,TText,TUint, TPtrC> gg;
+	gg.test_TPtr();
+	gg.testHeapSpace(startAvail);
+	test.Next(_L("Copy constructor"));
+	TestCopy();
+	test.End();	
+//
+	test.Next(_L("class TPtr8"));
+	TestTDes<TPtr8,TUint8,TUint8, TPtrC8> ff;
+	ff.test_TPtr();
+	ff.testHeapSpace(startAvail);
+	test.Next(_L("Copy constructor"));
+	TestCopy8();
+	test.End();	
+//
+	test.Next(_L("class TPtr16"));
+	TestTDes<TPtr16,TUint16,TUint16, TPtrC16> ee;
+	ee.test_TPtr();
+	ee.testHeapSpace(startAvail);
+	test.Next(_L("Copy constructor"));
+	TestCopy16();
+	test.End();	
+//
+	test.Next(_L("class TBufC"));
+	TestTDes<TBufC<0x40>, TText, TUint16, TPtrC> kk;
+	kk.test_TBufC();
+	kk.testHeapSpace(startAvail);
+	test.End();
+//
+	test.Next(_L("class TBufC8"));
+	TestTDes<TBufC8<0x40>, TUint8, TUint8, TPtrC8> ll;
+	ll.test_TBufC();
+	ll.testHeapSpace(startAvail);
+	test.End();
+//
+	test.Next(_L("class TBufC16"));
+	TestTDes<TBufC16<0x40>, TUint16, TUint16, TPtrC16> mm;
+	mm.test_TBufC();
+	mm.testHeapSpace(startAvail);
+	test.End();
+//
+	test.Next(_L("class HBufC"));
+	TestTDes<HBufC, TText, TUint, TPtrC>  nn;
+	nn.test_HBufC();
+	nn.testHeapSpace(startAvail);
+	test.End();
+//
+	test.Next(_L("class HBufC8"));
+	TestTDes<HBufC8, TUint8, TUint8, TPtrC8>  oo;
+	oo.test_HBufC();
+	oo.testHeapSpace(startAvail);
+	test.End();
+
+	test.Next(_L("Test Unicode to Ascii stuff"));
+	Test16To8();
+//
+	test.Next(_L("class HBufC16"));
+	TestTDes<HBufC16, TUint16, TUint16, TPtrC16>  pp;
+	pp.test_HBufC();
+	pp.testHeapSpace(startAvail);
+	test.End();
+//
+	testLiteral();
+//
+	test.Next(_L("class TBuf returning TPtr"));
+	TestTDes<TBuf<0x40>, TText, TUint, TPtr> qq;
+	qq.test_TBufReturningModifiable();
+	test.End();
+
+	test.Next(_L("class TBuf8 returning TPtr8"));
+	TestTDes<TBuf8<0x40>, TText8, TUint8, TPtr8> rr;
+	rr.test_TBufReturningModifiable();
+	test.End();
+
+	test.Next(_L("class TBuf16 returning TPtr16"));
+	TestTDes<TBuf16<0x40>, TText16, TUint16, TPtr16> ss;
+	ss.test_TBufReturningModifiable();
+	test.End();
+
+	test.Next(_L("class TPtr returning TPtr"));
+	TestTDes<TPtr, TText, TUint, TPtr> tt;
+	tt.test_TPtrReturningModifiable();
+	test.End();
+
+	test.Next(_L("class TPtr8 returning TPtr8"));
+	TestTDes<TPtr8, TText8, TUint8, TPtr8> uu;
+	uu.test_TPtrReturningModifiable();
+	test.End();
+
+	test.Next(_L("class TPtr16 returning TPtr16"));
+	TestTDes<TPtr16, TText16, TUint16, TPtr16> vv;
+	vv.test_TPtrReturningModifiable();
+	test.End();
+
+	test.End();
+
+	return(KErrNone);
+    }
+#pragma warning (default: 4702)// Unreachable code
+#pragma warning (default: 4701)// Local variable used without being initialized
+#pragma warning (default: 4710)// Function not expanded
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32test/buffer/t_farray.cpp	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,388 @@
+// Copyright (c) 1994-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32test\buffer\t_farray.cpp
+// Overview:
+// Test the functionality of CArrayFixFlat,  CArrayPtrFlat,  CArrayFixSeg classes.
+// API Information:
+// CArrayFixFlat, CArrayPtrFlat, CArrayFixSeg.
+// Details:
+// - Create an array of fixed length buffer descriptor objects contained within a flat
+// dynamic and segmented buffer and verify that
+// - number of elements held in the array is 0.
+// - length of an element is as specified.
+// - array is compressed and reset as expected.
+// - the elements of the array are sorted as expected.
+// - insertion of a text into the array at specified position and filling a blank space
+// at the beginning is as expected.
+// - return value is 0 when available element is searched within the array.
+// - removal of first element from the array is successful.
+// - number of elements held in the array is 1 after appending a single element onto 
+// the end of the array.
+// - the position of specified element is found successfully
+// - resetting the array is as expected
+// - End and Back methods are as expected.
+// - Create an array of fixed length text character objects contained within a flat dynamic 
+// and segmented buffer.
+// - append a text onto the end of the array, check the contents and number of elements 
+// held in the array are as expected.
+// - insert a text and verify that the change in the content of array and number of 
+// elements held in the array are as expected.
+// - remove a single character and multiple characters from the array and verify that
+// the Delete method is as expected. Compress the array.
+// - Create an array of fixed length text character objects contained within a flat dynamic
+// and segmented buffer.
+// - append strings of specified length onto the end of the array and verify that the 
+// number of elements held in the array is as expected.
+// - insert strings at specified location and check that the contents are as expected.
+// - reset the array, append a string, compress the array and verify that content is as 
+// expected.
+// - sort the array and verify that content is as expected.
+// - verify the correct position of the element and return value is zero when an element
+// is found using binary and sequential search technique and nonzero if not present in 
+// the array.
+// - Create an array of fixed length text character objects contained within a flat dynamic 
+// and segmented buffer.
+// - Insert some elements into the array at specified positions determined by key of 
+// type TInt and verify that KErrAlreadyExists is returned if an element with the 
+// same key already exists within the array.
+// - Create an array of pointers to objects implemented using a flat dynamic buffer, insert one 
+// element into the array at the specified position and destroy the object whose pointer form 
+// the element of the array, before resetting the array.
+// - Create and delete an array of CBase objects contained within a flat dynamic buffer.
+// - Test whether the heap has been corrupted by all the tests.
+// Platforms/Drives/Compatibility:
+// All 
+// Assumptions/Requirement/Pre-requisites:
+// Failures and causes:
+// Base Port information:
+// 
+//
+
+#include <e32test.h>
+
+class MyCBase : public CBase
+	{
+	};
+
+const TInt KTestGranularity=0x02;
+
+LOCAL_D RTest test(_L("T_FARRAY"));
+
+template <class T,TInt S>
+class TArr
+	{
+public:
+	TArr() {}
+	TInt Count() const {return S;}
+	T& operator[](TInt anIndex) {return iArr[anIndex];}
+	const T& operator[](TInt anIndex) const {return iArr[anIndex];}
+private:
+	T iArr[S];
+	};
+
+LOCAL_C void testFix(CArrayFix<TBuf<0x10> >& aFix)
+//
+// Test all methods
+//
+	{
+	test.Next(_L("Test all methods"));
+	test(aFix.Count()==0);
+	test(aFix.Length()==sizeof(TBuf<0x10>));
+	aFix.Compress();
+	test(TRUE);
+	aFix.Reset();
+	test(TRUE);
+	TKeyArrayFix kk(0,ECmpNormal,0x10);
+	test(TRUE);
+	aFix.Sort(kk);
+	test(TRUE);
+	TBuf<0x10> aa(_L("aaaaa"));
+	aFix.InsertL(0,aa);
+	test(TRUE);
+	aFix[0].Fill(' ');
+	test(TRUE);
+	TBuf<0x10> z(aFix[0]);
+    z.Length();
+	test(TRUE);
+	aFix[0].Fill('a');
+	test(TRUE);
+	TInt pp;
+	test(aFix.Find(aa,kk,pp)==0);
+	test(pp==0);
+	aFix.Delete(0);
+	TBuf<0x10> bb(_L("bbbbb"));
+	aFix.AppendL(bb);
+	test(aFix.Count()==1);
+	test(aFix.InsertIsqAllowDuplicatesL(aa,kk)==0);
+	test(aFix.InsertIsqAllowDuplicatesL(bb,kk)==2);
+	test(aFix.FindIsq(aa,kk,pp)==0);
+	test(pp==0);
+	aFix.Reset();
+	for(TInt index=0;index<KTestGranularity*7/2;index++)
+		aFix.AppendL(aa);
+	const TBuf<0x10> *end=NULL;
+	const TBuf<0x10> *ptr=NULL;
+	for(TInt index2=0;index2<KTestGranularity*7/2;index2++)
+		{
+		if (end==ptr)
+			{
+			end=aFix.End(index2);
+			ptr=&aFix[index2];
+			TInt seglen=end-ptr;
+			test(seglen==KTestGranularity || seglen==(aFix.Count()-index2));
+			}
+		test(&aFix[index2]==ptr++);
+		}
+	const TBuf<0x10> *bak=NULL;
+	ptr=NULL;
+	for(TInt index3=KTestGranularity*7/2;index3>0;index3--)
+		{
+		if (bak==ptr)
+			{
+			bak=aFix.Back(index3);
+			ptr=&aFix[index3-1]+1;
+			TInt seglen=ptr-bak;
+			test(seglen==KTestGranularity || seglen==index3 || seglen==index3%KTestGranularity);
+			}
+		test(&aFix[index3-1]==--ptr);
+		}
+	}
+
+LOCAL_C void test1(CArrayFix<TText>& aFix)
+//
+	{
+	test.Next(_L("AppendL and InsertL single chars"));
+	aFix.AppendL(_S("abcd"),4);
+	test(aFix[0]=='a');
+	test(aFix[1]=='b');
+	test(aFix[3]=='d');
+	test(aFix.Count()==4);
+	aFix.InsertL(2,_S("ef"),2);
+	test(aFix[1]=='b');
+	test(aFix[2]=='e');
+	test(aFix[4]=='c');
+	test(aFix.Count()==6);	
+	aFix.AppendL(TText('z'));
+	test(aFix[6]=='z');
+	aFix.InsertL(0,TText('y'));
+	test(aFix[0]=='y');
+	test(aFix[1]=='a');
+	test(aFix.Count()==8);
+	test.Next(_L("Delete single chars"));
+	aFix.Delete(3);
+	test(aFix[2]=='b');
+	test(aFix[3]=='f');
+	test(aFix[4]=='c');
+	aFix.Delete(1,2);
+	test(aFix[0]=='y');
+	test(aFix[1]=='f');
+	test(aFix[2]=='c');
+	test(aFix.Count()==5);
+	aFix.Compress();
+	}
+
+LOCAL_C void test2(CArrayFix<TArr<TText,4> >& aFix)
+//
+	{
+	test(aFix.Length()==sizeof(TArr<TText,4>));
+	test.Next(_L("AppendL and insert strings of length 4"));
+	TPtrC des1=_L("abcd");
+	TPtrC des2=_L("efgh");
+	aFix.AppendL(*(const TArr<TText,4>*)des1.Ptr());
+	aFix.AppendL(*(const TArr<TText,4>*)des2.Ptr());
+	test(aFix.Count()==2);
+	TPtrC des3(&aFix[0][0],4);
+	TPtrC des4(&aFix[1][0],4);
+	test(des3==_L("abcd"));
+	test(des4==_L("efgh"));
+	aFix.InsertL(1,*(const TArr<TText,4>*)_S("ijkl"));
+	test(aFix.Count()==3);	
+	TPtrC des5(&aFix[2][0],4);
+	test(des3==_L("abcd"));
+	test(des4==_L("ijkl"));
+	test(des5==_L("efgh"));
+
+	test.Next(_L("Reset and Compress"));
+	aFix.Reset();
+	TBuf<0x10> buf1=_L("abcdefgh");
+	aFix.AppendL((const TArr<TText,4>*)buf1.Ptr(),2);
+	aFix.Compress();
+	TPtrC des6(&aFix[0][0],4);
+	test(des6==_L("abcd"));
+	TPtrC des7(&aFix[1][0],4);
+	test(des7==_L("efgh"));
+	buf1=_L("ghighhxy");
+	aFix.InsertL(1,(const TArr<TText,4>*)buf1.Ptr(),2);
+	aFix.Compress();
+	TPtrC des8(&aFix[0][0],4);
+	test(des8==_L("abcd"));
+	TPtrC des9(&aFix[1][0],4);
+	test(des9==_L("ghig"));
+	TPtrC des10(&aFix[2][0],4);
+	test(des10==_L("hhxy"));
+	TPtrC des11(&aFix[3][0],4);
+	test(des11==_L("efgh"));
+
+	test.Next(_L("Sort strings"));
+	TKeyArrayFix kk(0,ECmpNormal,0x04);
+	aFix.Sort(kk);
+	TPtrC des12(&aFix[0][0],4);
+	test(des12==_L("abcd"));
+	TPtrC des13(&aFix[1][0],4);
+	test(des13==_L("efgh"));
+	TPtrC des14(&aFix[2][0],4);
+	test(des14==_L("ghig"));
+	TPtrC des15(&aFix[3][0],4);
+	test(des15==_L("hhxy"));
+	
+	test.Next(_L("Find and FindIsq"));
+	aFix.Compress();
+	test(aFix.InsertIsqL(*(const TArr<TText,4>*)_S("ffff"),kk)==2);
+	aFix.Compress();
+	test(aFix.InsertIsqAllowDuplicatesL(*(const TArr<TText,4>*)_S("ffff"),kk)==3);
+	aFix.Compress();
+	TRAPD(r,aFix.InsertIsqL(*(const TArr<TText,4>*)_S("ffff"),kk))
+	test(r==KErrAlreadyExists);
+	TInt aPos=0;
+	test(aFix.Find(*(const TArr<TText,4>*)_S("xxxx"),kk,aPos)==1);
+	test(aPos==6);
+	test(aFix.Find(*(const TArr<TText,4>*)_S("abcd"),kk,aPos)==0);
+	test(aPos==0);
+	test(aFix.Find(*(const TArr<TText,4>*)_S("ghig"),kk,aPos)==0);
+	test(aPos==4);
+	test(aFix.Find(*(const TArr<TText,4>*)_S("ffff"),kk,aPos)==0);
+	test(aPos==2);
+	test(aFix.Find(*(const TArr<TText,4>*)_S("hhxy"),kk,aPos)==0);
+	test(aPos==5);
+	test(aFix.FindIsq(*(const TArr<TText,4>*)_S("bbbb"),kk,aPos)!=0);
+	test(aPos==1);
+	test(aFix.FindIsq(*(const TArr<TText,4>*)_S("abcd"),kk,aPos)==0);
+	test(aPos==0);
+	test(aFix.FindIsq(*(const TArr<TText,4>*)_S("ghig"),kk,aPos)==0);
+	test(aPos==4);
+	test(aFix.FindIsq(*(const TArr<TText,4>*)_S("ffff"),kk,aPos)==0);
+	test(aPos==2);
+	test(aFix.InsertIsqL(*(const TArr<TText,4>*)_S("fghz"),kk)==4);
+	test(aFix.FindIsq(*(const TArr<TText,4>*)_S("fghz"),kk,aPos)==0);
+	test(aPos==4);
+	test(aFix.FindIsq(*(const TArr<TText,4>*)_S("hhxy"),kk,aPos)==0);
+	test(aPos==6);
+	}
+
+LOCAL_C void test3(CArrayFix<TInt>& aFix)
+	{
+
+	test.Next(_L("InsertIsqL"));
+	TKeyArrayFix kk(0,ECmpTInt);
+
+	TInt pos=0;
+	TInt mod=47;
+	TInt inc=23;
+	TInt i=0;
+
+	FOREVER
+		{
+		TInt ret;
+		if (i&1)
+			TRAP(ret,aFix.InsertIsqL(i,kk))
+		else
+			{
+			TRAP(ret,pos=aFix.InsertIsqL(i,kk))
+			if (ret==KErrNone)
+				test(aFix[pos]==i);
+			}
+		if (ret==KErrAlreadyExists)
+			break;
+		i=(i+inc)%mod;
+		}
+
+	for(i=0;i<mod;i++)
+		{
+		test(aFix.FindIsq(i,kk,pos)==0);
+		test(pos==i);
+		TRAPD(r,aFix.InsertIsqL(i,kk))
+		test(r==KErrAlreadyExists);
+		}
+	}
+	
+GLDEF_C TInt E32Main()
+//
+// Test the Array classes.
+//
+    {
+
+	test.Title();
+	__UHEAP_MARK;
+	test.Start(_L("class CArrayFixFlat"));
+	CArrayFixFlat<TBuf<0x10> >* pFixFlat=new CArrayFixFlat<TBuf<0x10> >(KTestGranularity);
+	if (pFixFlat==NULL)
+		test.Panic(_L("Allocating array"));
+	testFix(*pFixFlat);
+	delete pFixFlat;
+
+	CArrayFixFlat<TText>* pFixFlatChar=new CArrayFixFlat<TText>(KTestGranularity);
+	test1(*pFixFlatChar);
+	delete pFixFlatChar; 
+		
+	CArrayFixFlat<TArr<TText,4> >* pFixFlatArr=new CArrayFixFlat<TArr<TText,4> >(KTestGranularity);
+	test2(*pFixFlatArr);
+	delete pFixFlatArr;
+
+	CArrayFixFlat<TInt>* pFixFlatInt=new CArrayFixFlat<TInt>(KTestGranularity);
+	test3(*pFixFlatInt);
+	delete pFixFlatInt;
+
+	test.Next(_L("class CArrayPtrFlat of CBase"));
+	
+	CArrayPtrFlat<MyCBase>* pPtrFlatCBase=new CArrayPtrFlat<MyCBase>(KTestGranularity); 
+	if (pPtrFlatCBase==NULL)
+		test.Panic(_L("Allocating array of CBase*"));
+	MyCBase* c1 = new MyCBase();
+	pPtrFlatCBase->InsertL(0,&c1,1);
+	pPtrFlatCBase->ResetAndDestroy();
+//	test(pFixFlatCBase->iBase==0);
+	pPtrFlatCBase->ResetAndDestroy();
+	delete pPtrFlatCBase;
+
+	test.Next(_L("class CArrayFixFlat of CBase"));
+	
+	CArrayFixFlat<MyCBase>* pFixFlatCBase=new CArrayFixFlat<MyCBase>(KTestGranularity); 
+	if (pFixFlatCBase==NULL)
+		test.Panic(_L("Allocating array of CBase"));
+	delete pFixFlatCBase;
+
+	test.Next(_L("class CArrayFixSeg"));
+	CArrayFixSeg<TBuf<0x10> >* pFixSeg=new CArrayFixSeg<TBuf<0x10> >(KTestGranularity);
+	if (pFixSeg==NULL)
+		test.Panic(_L("Allocating array"));
+	testFix(*pFixSeg);
+	delete pFixSeg;
+
+	CArrayFixSeg<TText>* pFixSegChar=new CArrayFixSeg<TText>(KTestGranularity);
+	test1(*pFixSegChar);
+	delete pFixSegChar; 
+		
+	CArrayFixSeg<TArr<TText,4> >* pFixSegArr=new CArrayFixSeg<TArr<TText,4> >(KTestGranularity);
+	test2(*pFixSegArr);
+	delete pFixSegArr;
+
+	CArrayFixSeg<TInt>* pFixSegInt=new CArrayFixSeg<TInt>(KTestGranularity);
+	test3(*pFixSegInt);
+	delete pFixSegInt;
+
+	test.End();
+	__UHEAP_MARKEND;
+	return(0);
+    }
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32test/buffer/t_func.cpp	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,939 @@
+// Copyright (c) 1996-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32test\buffer\t_func.cpp
+// Overview:
+// Comprehensive test for the ARM coded Mem, Des and integer divide routines. 
+// Check memory for a large variation of buffer sizes and alignments, 
+// check all the optimizations made in the copying/filling code.
+// API Information:
+// Mem::Fill, Mem::Copy, Mem::Move, Mem::Swap, Mem::Compare
+// Details:
+// - Create blocks, fill some data into one block, copy data across block of varying 
+// lengths, alignments and check the copy is as expected.
+// - Create blocks, fill some data into the block, move data from one block to other 
+// block and check it is as expected.
+// - Create blocks, fill some data and check the data is filled as expected.
+// - Create blocks, fill some data in two blocks, swap the blocks check the data
+// is swapped as expected.
+// - Create blocks, fill some data into the blocks, compare the data at different specified
+// offsets, compare the return value, check it is as expected.
+// - Check the conversion from specified integer numbers in different number systems to 
+// character representation is as expected. Check for both upper and lower case results.
+// - Initialize variables with signed, unsigned, positive, negative integer values, check the 
+// integer division routines	are as expected.  
+// - Check the integer modulo operation results are as expected.
+// Platforms/Drives/Compatibility:
+// All 
+// Assumptions/Requirement/Pre-requisites:
+// Failures and causes:
+// Base Port information:
+// 
+//
+
+#include <e32std.h>
+#include <e32base.h>
+#include <e32test.h>
+#include <e32svr.h>
+#include <e32panic.h>
+
+RTest test(_L("T_FUNC"));
+
+TInt failed;
+
+void PrintInfo(TText8* aBuf1,TText8* aBuf2)
+    {
+    if(aBuf1<aBuf2)
+        test.Printf(_L("source before target\n"));
+    else if(aBuf1==aBuf2)
+        test.Printf(_L("source and target identical\n"));
+    else
+        test.Printf(_L("target before source\n"));      
+    }
+
+void testFailed(const TDesC& anError)
+    {
+    test.Printf(_L("Test %S failed\n"),&anError);
+    //test.Getch();
+    failed=KErrGeneral;
+    }
+
+void testMemCopy()
+    {
+
+    TText8 bufa[0x200];
+    TText8 bufb[0x200];
+
+    TInt ii,jj,kk;
+
+    test.Next(_L("Mem::Copy"));
+//
+// Test various copying lengths and alignments and src before/after trg
+//
+    TInt length;
+    TChar a55(0x55);
+    TChar aAA(0xaa);
+
+    TUint8* addr;
+
+    for(ii=24;ii<496;ii+=19)
+        {
+        for(jj=24;jj<496;jj+=18)
+            {
+            length=Min(496-jj,496-ii);
+
+            Mem::Fill(&bufa[0],512,a55);
+            Mem::Fill(&bufb[0],512,aAA);
+
+            addr=Mem::Copy(&bufa[ii],&bufb[jj],length);
+
+            if(addr!=(&bufa[ii]+length))
+                {
+                PrintInfo(bufb,bufa);
+                test.Printf(_L("Mem::Copy returned incorrect address for %d bytes\n"),length);
+                failed=KErrGeneral;
+                //test.Getch();
+                return;
+                }
+
+            for(kk=0;kk<512;kk++)
+                {
+                if(kk<ii && bufa[kk]!=0x55)
+                    {
+                    PrintInfo(bufb,bufa);
+                    test.Printf(_L("Mem::Copy failed copying %d bytes from bufb[%d] to bufa[%d] at byte %d\n"),length,jj,ii,kk);
+                    failed=KErrGeneral;
+                    //test.Getch();
+                    return;
+                    }
+                if(kk>=ii && kk<(ii+length) && bufa[kk]!=0xaa)
+                    {
+                    PrintInfo(bufb,bufa);
+                    test.Printf(_L("Mem::Copy failed copying %d bytes from bufb[%d] to bufa[%d] at byte %d\n"),length,jj,ii,kk);
+                    failed=KErrGeneral;
+                    //test.Getch();
+                    return;
+                    }
+                if(kk>=(ii+length) && bufa[kk]!=0x55)
+                    {
+                    PrintInfo(bufb,bufa);
+                    test.Printf(_L("Mem::Copy failed copying %d bytes from bufb[%d] to bufa[%d] at byte %d\n"),length,jj,ii,kk);
+                    failed=KErrGeneral;
+                    //test.Getch();
+                    return;
+                    }
+                }
+
+            Mem::Fill(&bufa[0],512,a55);
+            Mem::Fill(&bufb[0],512,aAA);
+
+            length=Min(496-jj,496-ii);
+          
+            addr=Mem::Copy(&bufb[ii],&bufa[jj],length);
+
+            if(addr!=(&bufb[ii]+length))
+                {
+                PrintInfo(bufa,bufb);
+                test.Printf(_L("Mem::Copy returned incorrect address for %d bytes\n"),length);
+                failed=KErrGeneral;
+                //test.Getch();
+                return;
+                }
+
+            for(kk=0;kk<512;kk++)
+                {
+                if(kk<ii && bufb[kk]!=0xaa)
+                    {
+                    PrintInfo(bufa,bufb);
+                    test.Printf(_L("Mem::Copy failed copying %d bytes from bufa[%d] to bufb[%d] at byte %d\n"),length,jj,ii,kk);
+                    failed=KErrGeneral;
+                    //test.Getch();
+                    return;
+                    }
+                if(kk>=ii && kk<(ii+length) && bufb[kk]!=0x55)
+                    {
+                    PrintInfo(bufa,bufb);
+                    test.Printf(_L("Mem::Copy failed copying %d bytes from bufa[%d] to bufb[%d] at byte %d\n"),length,jj,ii,kk);
+                    failed=KErrGeneral;
+                    //test.Getch();
+                    return;
+                    }
+                if(kk>=(ii+length) && bufb[kk]!=0xaa)
+                    {
+                    PrintInfo(bufa,bufb);
+                    test.Printf(_L("Mem::Copy failed copying %d bytes from bufa[%d] to bufb[%d] at byte %d\n"),length,jj,ii,kk);
+                    failed=KErrGeneral;
+                    //test.Getch();
+                    return;
+                    }
+                }
+            };
+        }
+    }
+
+//
+// Assert panic test, debug ARM build only.   See DEF118984.
+//
+#if defined(_DEBUG) && defined(__CPU_ARM)
+const TInt KMemMoveBufferSize=0x20;
+const TInt KMemMoveBadLength=3;
+
+enum TMemMoveTest
+	{
+	EMemMoveValid=0,
+	EMemMoveSourceNotAligned=1,
+	EMemMoveTargetNotAligned=2,
+	EMemMoveLengthNotMultipleOf4=3,
+	};
+
+LOCAL_C TInt MemMoveClient(TAny* aPtr)
+	{
+	TMemMoveTest aMode = *(TMemMoveTest *)&aPtr;
+	TText8 srcbuf[KMemMoveBufferSize];
+	TText8 trgbuf[KMemMoveBufferSize];
+	TText8 *src=srcbuf, *trg=trgbuf;
+	TInt length=KMemMoveBufferSize;
+
+	switch (aMode)
+		{
+	case EMemMoveValid:
+		break;
+	case EMemMoveSourceNotAligned:
+		src=&srcbuf[1];
+		break;
+	case EMemMoveTargetNotAligned:
+		trg=&trgbuf[1];
+		break;
+	case EMemMoveLengthNotMultipleOf4:
+		length=KMemMoveBadLength;
+		break;
+		}
+	Mem::Move(trg,src,length);
+	return KErrNone;
+	}
+#endif //_DEBUG
+
+void testMemMove()
+    {
+    TText8 bufa[0x200];
+    TText8 bufb[0x200];
+
+    TInt ii,jj,kk;
+
+    test.Next(_L("Mem::Move()"));
+//
+// Test various copying lengths and alignments and src before/after trg
+//
+    TInt length;
+    TChar a55(0x55);
+    TChar aAA(0xaa);
+
+    TUint8* addr;
+
+    for(ii=0;ii<512;ii+=24)
+        {
+        for(jj=0;jj<512;jj+=24)
+            {
+            length=Min(512-jj,512-ii);
+
+            Mem::Fill(&bufa[0],512,a55);
+            Mem::Fill(&bufb[0],512,aAA);
+
+            addr=Mem::Move(&bufa[ii],&bufb[jj],length);
+
+            if(addr!=(&bufa[ii]+length))
+                {
+                PrintInfo(bufb,bufa);
+                test.Printf(_L("Mem::Copy returned incorrect address for %d bytes\n"),length);
+                failed=KErrGeneral;
+                //test.Getch();
+                return;
+                }
+
+            for(kk=0;kk<512;kk++)
+                {
+                if(kk<ii && bufa[kk]!=0x55)
+                    {
+                    PrintInfo(bufb,bufa);
+                    test.Printf(_L("Mem::Move failed copying %d bytes from bufb[%d] to bufa[%d] at byte %d\n"),length,jj,ii,kk);
+                    failed=KErrGeneral;
+                    //test.Getch();
+                    return;
+                    }
+                if(kk>=ii && kk<(ii+length) && bufa[kk]!=0xaa)
+                    {
+                    PrintInfo(bufb,bufa);
+                    test.Printf(_L("Mem::Move failed copying %d bytes from bufb[%d] to bufa[%d] at byte %d\n"),length,jj,ii,kk);
+                    failed=KErrGeneral;
+                    //test.Getch();
+                    return;
+                    }
+                if(kk>=(ii+length) && bufa[kk]!=0x55)
+                    {
+                    PrintInfo(bufb,bufa);
+                    test.Printf(_L("Mem::Move failed copying %d bytes from bufb[%d] to bufa[%d] at byte %d\n"),length,jj,ii,kk);
+                    failed=KErrGeneral;
+                    //test.Getch();
+                    return;
+                    }
+                }
+
+            Mem::Fill(&bufa[0],512,a55);
+            Mem::Fill(&bufb[0],512,aAA);
+
+            length=Min(512-jj,512-ii);
+          
+            addr=Mem::Move(&bufb[ii],&bufa[jj],length);
+
+            if(addr!=(&bufb[ii]+length))
+                {
+                PrintInfo(bufa,bufb);
+                test.Printf(_L("Mem::Copy returned incorrect address for %d bytes\n"),length);
+                failed=KErrGeneral;
+                //test.Getch();
+                return;
+                }
+
+            for(kk=0;kk<512;kk++)
+                {
+                if(kk<ii && bufb[kk]!=0xaa)
+                    {
+                    PrintInfo(bufa,bufb);
+                    test.Printf(_L("Mem::Move failed copying %d bytes from bufa[%d] to bufb[%d] at byte %d\n"),length,jj,ii,kk);
+                    failed=KErrGeneral;
+                    //test.Getch();
+                    return;
+                    }
+                if(kk>=ii && kk<(ii+length) && bufb[kk]!=0x55)
+                    {
+                    PrintInfo(bufa,bufb);
+                    test.Printf(_L("Mem::Move failed copying %d bytes from bufa[%d] to bufb[%d] at byte %d\n"),length,jj,ii,kk);
+                    failed=KErrGeneral;
+                    //test.Getch();
+                    return;
+                    }
+                if(kk>=(ii+length) && bufb[kk]!=0xaa)
+                    {
+                    PrintInfo(bufa,bufb);
+                    test.Printf(_L("Mem::Move failed copying %d bytes from bufa[%d] to bufb[%d] at byte %d\n"),length,jj,ii,kk);
+                    failed=KErrGeneral;
+                    //test.Getch();
+                    return;
+                    }
+                }
+            };
+        }
+#if defined(_DEBUG) && defined(__CPU_ARM)
+    //
+    // Test wordmove asserts. Source and target addresses are word aligned,
+    // and length is a multiple of the word size.
+    // Test asserts (debug build only)
+    //
+    RThread clientThread;
+    TRequestStatus status(KRequestPending);
+
+    User::SetJustInTime(EFalse);
+    test.Next(_L("Mem::Move() - wordmove() valid call"));
+    test(clientThread.Create(_L("MemMovePanic - Valid"),MemMoveClient,KDefaultStackSize,0x2000,0x2000,(TAny*)EMemMoveValid)==KErrNone);
+    clientThread.Logon(status);
+    clientThread.Resume();
+    User::WaitForRequest(status);
+    test(clientThread.ExitType()==EExitKill);
+    test(clientThread.ExitReason()==KErrNone);
+    clientThread.Close();
+    status=KRequestPending;
+    test.Next(_L("Mem::Move() - wordmove() source alignment"));
+    test(clientThread.Create(_L("MemMovePanic - SrcAlign"),MemMoveClient,KDefaultStackSize,0x2000,0x2000,(TAny*)EMemMoveSourceNotAligned)==KErrNone);
+    clientThread.Logon(status);
+    clientThread.Resume();
+    User::WaitForRequest(status);
+    test(clientThread.ExitType()==EExitPanic);
+    test(clientThread.ExitReason()==EWordMoveSourceNotAligned);
+    clientThread.Close();
+    status=KRequestPending;
+    test.Next(_L("Mem::Move() - wordmove() target alignment"));
+    test(clientThread.Create(_L("MemMovePanic - TrgAlign"),MemMoveClient,KDefaultStackSize,0x2000,0x2000,(TAny*)EMemMoveTargetNotAligned)==KErrNone);
+    clientThread.Logon(status);
+    clientThread.Resume();
+    User::WaitForRequest(status);
+    test(clientThread.ExitType()==EExitPanic);
+    test(clientThread.ExitReason()==EWordMoveTargetNotAligned);
+    clientThread.Close();
+    status=KRequestPending;
+    test.Next(_L("Mem::Move() - wordmove() length word multiple"));
+    test(clientThread.Create(_L("MemMovePanic - LengthMultiple"),MemMoveClient,KDefaultStackSize,0x2000,0x2000,(TAny*)EMemMoveLengthNotMultipleOf4)==KErrNone);
+    clientThread.Logon(status);
+    clientThread.Resume();
+    User::WaitForRequest(status);
+    test(clientThread.ExitType()==EExitPanic);
+    test(clientThread.ExitReason()==EWordMoveLengthNotMultipleOf4);
+    clientThread.Close();
+    User::SetJustInTime(ETrue);
+#endif //_DEBUG
+    }
+
+void testMemFill()
+    {
+
+    TText8 bufa[0x200];
+
+    TInt ii,jj,kk,pos,length;
+
+    test.Next(_L("Mem::Fill()"));
+
+    TChar a55(0x55);
+    TChar aAA(0xaa);
+
+    for(ii=0;ii<512-32;ii++)
+        {
+		for(jj=0;jj<32;jj++)
+			{
+			Mem::Fill(&bufa[0],512,aAA);
+
+			pos=ii+jj;
+			length=512-32-ii;
+
+			Mem::Fill(&bufa[pos],length,a55);
+
+			for(kk=0;kk<512;kk++)
+				{
+				if(kk<(pos) && bufa[kk]!=0xaa)
+					{
+					test.Printf(_L("Mem::Fill failed filling %d bytes to bufa[%d] at byte %d (1)\n"),length,pos,kk);
+					failed=KErrGeneral;
+					//test.Getch();
+					return;
+					}
+				if(kk>=(pos) && kk<(pos+length) && bufa[kk]!=0x55)
+					{
+					test.Printf(_L("Mem::Fill failed filling %d bytes to bufa[%d] at byte %d (2)\n"),length,pos,kk);
+					failed=KErrGeneral;
+					//test.Getch();
+					return;
+					}
+				if(kk>=(pos+length) && bufa[kk]!=0xaa)
+					{
+					test.Printf(_L("Mem::Fill failed filling %d bytes to bufa[%d] at byte %d (3)\n"),length,pos,kk);
+					failed=KErrGeneral;
+					//test.Getch();
+					return;
+					}
+				}
+			}
+		}
+	}
+
+void testMemSwap()
+    {
+
+    test.Next(_L("Mem::Swap()"));
+
+    TText8 bufa[0x200];
+    TText8 bufb[0x200];
+
+    TInt ii,jj,kk;
+
+    TInt length;
+    TChar a55(0x55);
+    TChar aAA(0xaa);
+
+    for(ii=24;ii<496;ii+=5)
+        {
+        for(jj=24;jj<496;jj+=3)
+            {
+            length=Min(496-jj,496-ii);
+
+            Mem::Fill(&bufa[0],512,a55);
+            Mem::Fill(&bufb[0],512,aAA);
+
+            Mem::Swap(&bufa[ii],&bufb[jj],length);
+
+            for(kk=0;kk<512;kk++)
+                {
+                if(kk<ii && bufa[kk]!=0x55)
+                    {
+                    test.Printf(_L("Mem::Swap failed. bufa[%d] contains wrong byte. Swap length=%d, ii=%d, jj=%d\n"),kk,length,ii,jj);
+                    failed=KErrGeneral;
+                    //test.Getch();
+                    }
+                if(kk>=ii && kk<(ii+length) && bufa[kk]!=0xaa)
+                    {
+                    test.Printf(_L("Mem::Swap failed. bufa[%d] contains wrong byte. Swap length=%d, ii=%d, jj=%d\n"),kk,length,ii,jj);
+                    failed=KErrGeneral;
+                    //test.Getch();
+                    }
+                if(kk>=(ii+length) && bufa[kk]!=0x55)
+                    {
+                    test.Printf(_L("Mem::Swap failed. bufa[%d] contains wrong byte. Swap length=%d, ii=%d, jj=%d\n"),kk,length,ii,jj);
+                    failed=KErrGeneral;
+                    //test.Getch();
+                    }
+                if(kk<jj && bufb[kk]!=0xaa)
+                    {
+                    test.Printf(_L("Mem::Swap failed. bufb[%d] contains wrong byte. Swap length=%d, ii=%d, jj=%d\n"),kk,length,ii,jj);
+                    failed=KErrGeneral;
+                    //test.Getch();
+                    }
+                if(kk>=jj && kk<(jj+length) && bufb[kk]!=0x55)
+                    {
+                    test.Printf(_L("Mem::Swap failed. bufb[%d] contains wrong byte. Swap length=%d, ii=%d, jj=%d\n"),kk,length,ii,jj);
+                    failed=KErrGeneral;
+                    //test.Getch();
+                    }
+                if(kk>=(jj+length) && bufb[kk]!=0xaa)
+                    {
+                    test.Printf(_L("Mem::Swap failed. bufb[%d] contains wrong byte. Swap length=%d, ii=%d, jj=%d\n"),kk,length,ii,jj);
+                    failed=KErrGeneral;
+                    //test.Getch();
+                    }
+                }
+            }
+        }
+    }
+
+void testMemCompare()
+    {
+
+    TText8 bufa[516];
+    TText8 bufb[516];
+
+    test.Next(_L("Mem::Compare()"));
+
+    TInt ii,jj,kk;
+
+    TChar a55(0x55);
+    TChar a11(0x11);
+    TChar a99(0x99);
+
+    TInt posi,posj,offi,offj,leni,lenj;
+
+    for(ii=0;ii<512;ii+=2)
+        {
+        for(jj=0;jj<512;jj+=3)
+            {
+            Mem::Fill(&bufa[0],512,a55);
+            Mem::Fill(&bufb[0],512,a55);
+
+            posi=(511+ii)/2; // get a position somewhere in the middle
+            posj=(511+jj)/2;
+
+            bufa[posi]=0x12;
+            bufb[posj]=0x12;
+
+            offi=posi-ii;
+            offj=posj-jj;
+
+            leni=511-ii;
+            lenj=511-jj;
+//
+// Make sure that outside the compare range is different
+//
+            Mem::Fill(&bufa[ii+leni],4,a11);
+            Mem::Fill(&bufb[jj+lenj],4,a99);
+
+            kk=Mem::Compare(&bufa[ii],leni,&bufb[jj],lenj);
+
+            if(offi==offj) // Wrong byte is at same offset
+                {
+                if(ii==jj) // Same lengths being compared, so should compare ok
+                    {
+                    if(kk!=0)
+                        {
+                        test.Printf(_L("%d returned when offi=%d, offj=%d, ii=%d, jj=%d\n"),kk,offi,offj,ii,jj);
+                        test.Printf(_L("Should return zero\n"));
+                        test.Printf(_L("bufa=%d,bufb=%d, leftl=%d, rightl=%d\n"),&bufa[ii],&bufb[jj],leni,lenj);
+                        //test.Getch();
+                        failed=KErrGeneral;
+                        }
+                    }
+                else // Different lengths, so should return difference of lengths
+                    {
+                    if(kk!=leni-lenj)
+                        {
+                        test.Printf(_L("%d returned when offi=%d, offj=%d, ii=%d, jj=%d\n"),kk,offi,offj,ii,jj);
+                        test.Printf(_L("Should return difference of the lengths\n"));
+                        test.Printf(_L("bufa=%d,bufb=%d, leftl=%d, rightl=%d\n"),&bufa[ii],&bufb[jj],leni,lenj);
+                        //test.Getch();
+                        failed=KErrGeneral;
+                        }
+                    }
+                }
+            if(offi!=offj) // Wrong byte at different offset
+                {
+                if(offi<offj && kk!=0x12-0x55)
+                    {
+                    test.Printf(_L("%d returned when offi=%d, offj=%d, ii=%d, jj=%d\n"),kk,offi,offj,ii,jj);
+                    test.Printf(_L("Should return difference of the bytes\n"));
+                    test.Printf(_L("bufa=%d,bufb=%d, leftl=%d, rightl=%d\n"),&bufa[ii],&bufb[jj],leni,lenj);
+                    //test.Getch();
+                    failed=KErrGeneral;
+                    }
+                if(offj<offi && kk!=0x55-0x12)
+                    {
+                    test.Printf(_L("%d returned when offi=%d, offj=%d, ii=%d, jj=%d\n"),kk,offi,offj,ii,jj);
+                    test.Printf(_L("Should return difference of the bytes\n"));
+                    test.Printf(_L("bufa=%d,bufb=%d, leftl=%d, rightl=%d\n"),&bufa[ii],&bufb[jj],leni,lenj);
+                    //test.Getch();
+                    failed=KErrGeneral;
+                    }
+                }
+            }
+        }
+    }
+
+void testDesNum()
+    {
+
+    TBuf<36> aBuf;
+
+    test.Next(_L("Des::Num(EHex)"));
+    aBuf.Num(0x1b34a678,EHex);
+    if(aBuf!=_L("1b34a678"))
+        testFailed(_L("Des::Num(0x1b34a678,EHex)"));
+    else
+        {
+        aBuf.Num(0x1234,EHex);
+        if(aBuf!=_L("1234"))
+            testFailed(_L("Des::Num(0x1234,EHex)"));
+        }
+
+    test.Next(_L("Des::Num(EDecimal)"));
+    aBuf.Num(7462521,EDecimal);
+    if(aBuf!=_L("7462521"))
+        testFailed(_L("Des::Num(7462521,EDecimal)"));
+    else
+        {
+        aBuf.Num(1234,EDecimal);
+        if(aBuf!=_L("1234"))
+            testFailed(_L("Des::Num(1234,EDecimal)"));
+        }
+
+    test.Next(_L("Des::Num(EOctal)"));
+
+    aBuf.Num(03521,EOctal);
+    if(aBuf!=_L("3521"))
+        testFailed(_L("Des::Num(03521,EOctal)"));
+    else
+        {
+        aBuf.Num(0706321,EOctal);
+        if(aBuf!=_L("706321"))
+            testFailed(_L("Des::Num(0706321,EOctal)"));
+        }
+
+    test.Next(_L("Des::Num(EBinary)"));
+    aBuf.Num(0x92074625,EBinary);
+    if(aBuf!=_L("10010010000001110100011000100101"))
+        {
+        testFailed(_L("Des::Num(0x92074625,EBinary)"));
+        }
+    else
+        {
+        aBuf.Num(0x4625,EBinary);
+        if(aBuf!=_L("100011000100101"))
+            testFailed(_L("Des::Num(0x4625,EBinary)"));
+        }
+    }
+
+void testDesNumUC()
+    {
+
+    TBuf<36> aBuf;
+
+    test.Next(_L("Des::NumUC(EHex)"));
+    aBuf.NumUC(0x1b3ca678,EHex);
+    if(aBuf!=_L("1B3CA678"))
+        testFailed(_L("Des::NumUC(0x1b3ca678,EHex)"));
+    else
+        {
+        aBuf.NumUC(0x89abcdef,EHex);
+        if(aBuf!=_L("89ABCDEF"))
+            testFailed(_L("Des::NumUC(0x89abcdef,EHex)"));
+        }
+
+    test.Next(_L("Des::NumUC(EDecimal)"));
+    aBuf.NumUC(7462521,EDecimal);
+    if(aBuf!=_L("7462521"))
+        testFailed(_L("Des::NumUC(7462521,EDecimal)"));
+    else
+        {
+        aBuf.NumUC(1234,EDecimal);
+        if(aBuf!=_L("1234"))
+            testFailed(_L("Des::NumUC(1234,EDecimal)"));
+        }
+
+    test.Next(_L("Des::NumUC(EOctal)"));
+
+    aBuf.NumUC(03521,EOctal);
+    if(aBuf!=_L("3521"))
+        testFailed(_L("Des::NumUC(03521,EOctal)"));
+    else
+        {
+        aBuf.NumUC(0706321,EOctal);
+        if(aBuf!=_L("706321"))
+            testFailed(_L("Des::NumUC(0706321,EOctal)"));
+        }
+
+    test.Next(_L("Des::NumUC(EBinary)"));
+    aBuf.NumUC(0x92074625,EBinary);
+    if(aBuf!=_L("10010010000001110100011000100101"))
+        {
+        testFailed(_L("Des::NumUC(0x92074625,EBinary)"));
+        }
+    else
+        {
+        aBuf.NumUC(0x4625,EBinary);
+        if(aBuf!=_L("100011000100101"))
+            testFailed(_L("Des::NumUC(0x4625,EBinary)"));
+        }
+    }
+
+void testDivTen(TInt aInc)
+//
+// Always pass aInc as zero. It's just there to stop the compiler
+// optimising the a=a/10 statements out for you. They must be
+// worked out by the operating system at runtime.
+//
+    {
+
+    TUint a=68417814+aInc; // some random unsigned number
+    TInt b=-48910759+aInc; // some random signed negative number
+    TInt c=2147483647+aInc; // maximum positive number
+    TUint d=3147484647u+aInc; // high positive unsigned number
+
+    TUint ar=68417814/10;
+    TInt br=-48910759/10;
+    TInt cr=2147483647/10;
+    TUint dr=3147484647u/10;
+
+    a=a/10;
+    b=b/10;
+    c=c/10;
+    d=d/10;
+
+    test.Next(_L("Integer divide by 10"));
+
+    if(a!=ar)
+        {
+        test.Printf(_L("68417814/10 gives %u\n"),a);
+        failed=KErrGeneral;
+        }
+    if(b!=br)
+        {
+        test.Printf(_L("-48910759/10 gives %d\n"),b);
+        failed=KErrGeneral;
+        }
+    if(c!=cr)
+        {
+        test.Printf(_L("2147483647/10 gives %d\n"),c);
+        failed=KErrGeneral;
+        }
+    if(d!=dr)
+        {
+        test.Printf(_L("3147484647/10 gives %u\n"),d);
+        failed=KErrGeneral;
+        }
+    }
+
+void testDivSeven(TInt aInc)
+//
+// Always pass aInc as zero. It's just there to stop the compiler
+// optimising the a=a/7 statements out for you. They must be
+// worked out by the operating system at runtime.
+//
+    {
+
+    TUint a=68417814+aInc; // some random unsigned number
+    TInt b=-48910759+aInc; // some random signed negative number
+    TInt c=2147483647+aInc; // maximum positive number
+    TUint d=3147484647u+aInc; // high positive unsigned number
+
+    TUint ar=68417814/7;
+    TInt br=-48910759/7;
+    TInt cr=2147483647/7;
+    TUint dr=3147484647u/7;
+
+    a=a/7;
+    b=b/7;
+    c=c/7;
+    d=d/7;
+
+    test.Next(_L("Integer divide by 7"));
+
+    if(a!=ar)
+        {
+        test.Printf(_L("68417814/7 gives %u\n"),a);
+        failed=KErrGeneral;
+        }
+    if(b!=br)
+        {
+        test.Printf(_L("-48910759/7 gives %d\n"),b);
+        failed=KErrGeneral;
+        }
+    if(c!=cr)
+        {
+        test.Printf(_L("2147483647/7 gives %d\n"),c);
+        failed=KErrGeneral;
+        }
+    if(d!=dr)
+        {
+        test.Printf(_L("3147484647/7 gives %u\n"),d);
+        failed=KErrGeneral;
+        }
+    }
+
+void testDivFive(TInt aInc)
+//
+// Always pass aInc as zero. It's just there to stop the compiler
+// optimising the a=a/5 statements out for you. They must be
+// worked out by the operating system at runtime.
+//
+    {
+
+    TUint a=68417814+aInc; // some random unsigned number
+    TInt b=-48910759+aInc; // some random signed negative number
+    TInt c=2147483647+aInc; // maximum positive number
+    TUint d=3147484647u+aInc; // high positive unsigned number
+
+    TUint ar=68417814/5;
+    TInt br=-48910759/5;
+    TInt cr=2147483647/5;
+    TUint dr=3147484647u/5;
+
+    a=a/5;
+    b=b/5;
+    c=c/5;
+    d=d/5;
+
+    test.Next(_L("Integer divide by 5"));
+
+    if(a!=ar)
+        {
+        test.Printf(_L("68417814/5 gives %u\n"),a);
+        failed=KErrGeneral;
+        }
+    if(b!=br)
+        {
+        test.Printf(_L("-48910759/5 gives %d\n"),b);
+        failed=KErrGeneral;
+        }
+    if(c!=cr)
+        {
+        test.Printf(_L("2147483647/5 gives %d\n"),c);
+        failed=KErrGeneral;
+        }
+    if(d!=dr)
+        {
+        test.Printf(_L("3147484647/5 gives %u\n"),d);
+        failed=KErrGeneral;
+        }
+    }
+
+void testDivSixteen(TInt aInc)
+//
+// Always pass aInc as zero. It's just there to stop the compiler
+// optimising the a=a/16 statements out for you. They must be
+// worked out by the operating system at runtime.
+//
+    {
+
+    TUint a=68417814+aInc; // some random unsigned number
+    TInt b=-48910759+aInc; // some random signed negative number
+    TInt c=2147483647+aInc; // maximum positive number
+    TUint d=3147484647u+aInc; // high positive unsigned number
+
+    TUint ar=68417814/16;
+    TInt br=-48910759/16;
+    TInt cr=2147483647/16;
+    TUint dr=3147484647u/16;
+
+    a=a/16;
+    b=b/16;
+    c=c/16;
+    d=d/16;
+
+    test.Next(_L("Integer divide by 16"));
+
+    if(a!=ar)
+        {
+        test.Printf(_L("68417814/16 gives %u\n"),a);
+        failed=KErrGeneral;
+        }
+    if(b!=br)
+        {
+        test.Printf(_L("-48910759/16 gives %d\n"),b);
+        failed=KErrGeneral;
+        }
+    if(c!=cr)
+        {
+        test.Printf(_L("2147483647/16 gives %d\n"),c);
+        failed=KErrGeneral;
+        }
+    if(d!=dr)
+        {
+        test.Printf(_L("3147484647/16 gives %u\n"),d);
+        failed=KErrGeneral;
+        }
+    }
+
+void testModulo(TInt aInc)
+    {
+
+    test.Next(_L("Integer modulo"));
+
+    TInt ii,kk;
+
+    for(kk=1;kk<32;kk++)
+        {
+        for(ii=0;ii<kk;ii++)
+            {
+            TInt jj=(kk*73)+aInc+ii;
+
+            if((jj%kk)!=ii)
+                {
+                test.Printf(_L("%d mod %d gives %d\n"),jj,kk,jj%kk);
+                failed=KErrGeneral;
+                }
+            }
+        }
+    }
+
+TInt E32Main()
+//
+// Benchmark for Mem functions
+//
+    {
+
+    failed=KErrNone;
+
+    test.Title();
+    test.Start(_L("T_FUNC"));
+
+    testMemCopy();
+    testMemMove();
+    testMemFill();
+    testMemSwap();
+    testMemCompare();
+    testDesNum();
+    testDesNumUC();
+    testDivTen(0);
+    testDivSixteen(0);
+    testDivFive(0);
+    testDivSeven(0);
+    testModulo(0);
+
+	test(failed==KErrNone);
+
+    test.End();
+	return(KErrNone);
+    }
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32test/buffer/t_graph.cpp	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,1019 @@
+// Copyright (c) 1994-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32test\buffer\t_graph.cpp
+// Overview:
+// Test the TPoint, TSize, TRect class.
+// API Information:
+// TPoint, TSize, TRect.
+// Details:
+// - Initialize some two-dimensional points in Cartesian co-ordinates with various 
+// positive, negative values. Add and subtract different initialized points and 
+// check that results are as expected.
+// - Create some two-dimensional sizes, set with various positive, negative values. 
+// Add and subtract different initialized sizes and check that results are as expected.
+// - Initialize some rectangles in different positions, set various widths, heights and 
+// sizes and verify that values are assigned as specified. 
+// - Move the rectangle by adding two-dimensional point offset, some x, y offset and check 
+// that it is as expected.
+// - Resize, shrink, grow, rectangles by adding, subtracting some horizontal, vertical 
+// offset and verify that it is as expected.
+// - Get the minimal rectangles which bounds one rectangle and the specified rectangles, 
+// assign it to the rectangles and check that it is as expected.
+// - Assign some rectangles with different positions and test whether the rectangle is 
+// empty, overlaps as expected.
+// - Get the area of intersection between one rectangle and the specified rectangle, 
+// assign it to the rectangle and verify that the assigned rectangle is not empty.
+// - Create some rectangles, check that the rectangle's width and height have positive
+// values, the rectangle is normalized, whether a point is located within the rectangle 
+// and is empty.
+// - Create some rectangles, get the points at the centre of the rectangles and check that 
+// it is as expected.
+// - Create  some three-dimensional points in Cartesian co-ordinates with various 
+// positive, negative values. Add and subtract different initialized points and 
+// check that results are as expected.
+// Platforms/Drives/Compatibility:
+// All 
+// Assumptions/Requirement/Pre-requisites:
+// Failures and causes:
+// Base Port information:
+// 
+//
+
+#include <e32test.h>
+
+LOCAL_D RTest test(_L("T_GRAPH"));
+
+class TestTPoint
+	{
+public:
+	TestTPoint(TInt x1,TInt y1,TInt x2,TInt y2,TInt x3,TInt y3,TInt x4,TInt y4);
+	void TestSet();
+	void TestAdd();
+	void TestSub();
+	void TestUnaryMinus();
+private:
+	TInt iX1;
+	TInt iY1;
+	TInt iX2;
+	TInt iY2;
+	TInt iX3;
+	TInt iY3;
+	TInt iX4;
+	TInt iY4;
+	};
+
+class TestTSize
+	{
+public:
+	TestTSize(TInt wid1,TInt hgt1,TInt wid2,TInt hgt2,TInt wid3,TInt hgt3,TInt wid4,TInt hgt4);
+	void TestSet();
+	void TestAdd();
+	void TestSub();
+	void TestUnaryMinus();
+private:
+	TInt iWidth1;
+	TInt iHeight1;
+	TInt iWidth2;
+	TInt iHeight2;
+	TInt iWidth3;
+	TInt iHeight3;
+	TInt iWidth4;
+	TInt iHeight4;
+	};
+
+class TestTRect
+	{
+public:
+	TestTRect(TInt tlx1,TInt tly1,TInt brx1,TInt bry1,
+			  TInt tlx2,TInt tly2,TInt brx2,TInt bry2,
+			  TInt tlx3,TInt tly3,TInt brx3,TInt bry3);
+	void TestSet();
+	void TestMove();
+	void TestResize();
+	void TestShrink();
+	void TestGrow();
+	void TestBoundingRect();
+	void TestIsEmpty();
+	void TestIntersects();
+	void TestIntersection();
+	void TestNormalize();
+	void TestContains();
+	void TestCenter();
+private:
+	TInt iTlx1;
+	TInt iTly1;
+	TInt iBrx1;
+	TInt iBry1;
+	TInt iTlx2;
+	TInt iTly2;
+	TInt iBrx2;
+	TInt iBry2;
+	TInt iTlx3;
+	TInt iTly3;
+	TInt iBrx3;
+	TInt iBry3;
+	};
+
+class TestTPoint3D
+	{
+public:
+	TestTPoint3D(TInt x1,TInt y1,TInt z1,TInt x2,TInt y2,TInt z2,TInt x3,TInt y3,TInt z3,TInt x4,TInt y4,TInt z4);
+	void TestSet();
+	void TestAdd();
+	void TestSub();
+	void TestUnaryMinus();
+private:
+	TInt iX1;
+	TInt iY1;
+	TInt iZ1;
+	TInt iX2;
+	TInt iY2;
+	TInt iZ2;
+	TInt iX3;
+	TInt iY3;
+	TInt iZ3;
+	TInt iX4;
+	TInt iY4;
+	TInt iZ4;
+
+	};
+
+//////////////////////////////////////////////////////////////////////////////
+// Point test code															//
+//////////////////////////////////////////////////////////////////////////////
+
+TestTPoint::TestTPoint(TInt x1,TInt y1,TInt x2,TInt y2,TInt x3,TInt y3,TInt x4,TInt y4)
+	{
+	iX1=x1;
+	iY1=y1;
+	iX2=x2;
+	iY2=y2;
+	iX3=x3;
+	iY3=y3;
+	iX4=x4;
+	iY4=y4;
+	}
+
+void TestTPoint::TestSet()
+	{
+	TSize s1(iX3,iY3);
+	TPoint p1(iX1,iY1);
+	TPoint p2(iX2,iY2);
+	TPoint p3;
+	TPoint p4;
+
+	test(p1.iX==iX1 && p1.iY==iY1);
+	test(p2.iX==iX2 && p2.iY==iY2);
+	test(p4.iX==0 && p4.iY==0);
+
+	p3.iX=iX3;
+	p3.iY=iY3;
+	test(p3.iX==iX3 && p3.iY==iY3);
+	test(p3.AsSize()==s1);
+
+	p4.SetXY(iX4,iY4);
+	test(p4.iX==iX4 && p4.iY==iY4);
+
+	p1=p4;
+	test(p1==p4);
+	test(p1.iX==p4.iX && p1.iY==p4.iY);
+
+	p3=p2;
+	test(p3==p2);
+	test(p3.iX==p2.iX && p3.iY==p2.iY);
+
+	p1=p4;
+	p1.iX++;
+	test(p1!=p4);
+	p1=p4;
+	p1.iY++;
+	test(p1!=p4);
+	}
+
+void TestTPoint::TestAdd()
+	{
+	TSize s1(iX3,iY3);
+	TPoint p1(iX1,iY1);
+	TPoint p2(iX2,iY2);
+	TPoint p3(iX3,iY3);
+	TPoint p4(iX4,iY4);
+	TPoint px;
+
+	p1+=p2;
+	test(p1.iX==(p2.iX+iX1) && p1.iY==(p2.iY+iY1));
+	px=p3=p1+p2;
+	test(p3.iX==(p1.iX+p2.iX) && p3.iY==(p1.iY+p2.iY));
+	test(p3==(p1+p2));
+	test(px==p3);
+	px=p4+=p1;
+	test(p4.iX==(p1.iX+iX4) && p4.iY==(p1.iY+iY4));
+	test(px==p4);
+
+	px=p1;
+	p1+=s1;
+	test(p1.iX==(px.iX+s1.iWidth) && p1.iY==(px.iY+s1.iHeight));
+	p2=px+s1;
+	test(p2==p1);
+	}
+
+void TestTPoint::TestSub()
+	{
+	TSize s1(iX3,iY3);
+	TPoint p1(iX1,iY1);
+	TPoint p2(iX2,iY2);
+	TPoint p3(iX3,iY3);
+	TPoint p4(iX4,iY4);
+	TPoint px;
+
+	p1-=p2;
+	test(p1.iX==(iX1-p2.iX) && p1.iY==(iY1-p2.iY));
+	px=p3=p1-p2;
+	test(p3.iX==(p1.iX-p2.iX) && p3.iY==(p1.iY-p2.iY));
+	test(p3==(p1-p2));
+	test(px==p3);
+	px=p4-=p1;
+	test(p4.iX==(iX4-p1.iX) && p4.iY==(iY4-p1.iY));
+	test(px==p4);
+
+	px=p1;
+	p1-=s1;
+	test(p1.iX==(px.iX-s1.iWidth) && p1.iY==(px.iY-s1.iHeight));
+	p2=px-s1;
+	test(p2==p1);
+	}
+
+void TestTPoint::TestUnaryMinus()
+	{
+	TPoint p1(iX1,iY1);
+	TPoint p2(iX2,iY2);
+	TPoint p3(iX3,iY3);
+	TPoint p4(iX4,iY4);
+
+	TPoint p=-p1;
+	test (p==TPoint(-iX1,-iY1));
+	p=-p2;
+	test (p==TPoint(-iX2,-iY2));
+	p=-p3;
+	test (p==TPoint(-iX3,-iY3));
+	p=-p4;
+	test (p==TPoint(-iX4,-iY4));
+	}
+
+//////////////////////////////////////////////////////////////////////////////
+// Size test code															//
+//////////////////////////////////////////////////////////////////////////////
+
+TestTSize::TestTSize(TInt x1,TInt y1,TInt x2,TInt y2,TInt x3,TInt y3,TInt x4,TInt y4)
+	{
+	iWidth1=x1;
+	iHeight1=y1;
+	iWidth2=x2;
+	iHeight2=y2;
+	iWidth3=x3;
+	iHeight3=y3;
+	iWidth4=x4;
+	iHeight4=y4;
+	}
+
+void TestTSize::TestSet()
+	{
+	TPoint p1(iWidth3,iHeight3);
+	TSize s1(iWidth1,iHeight1);
+	TSize s2(iWidth2,iHeight2);
+	TSize s3;
+	TSize s4;
+
+	test(s1.iWidth==iWidth1 && s1.iHeight==iHeight1);
+	test(s2.iWidth==iWidth2 && s2.iHeight==iHeight2);
+	test(s4.iWidth==0 && s4.iHeight==0);
+
+	s3.iWidth=iWidth3;
+	s3.iHeight=iHeight3;
+	test(s3.iWidth==iWidth3 && s3.iHeight==iHeight3);
+	test(s3.AsPoint()==p1);
+
+	s4.SetSize(iWidth4,iHeight4);
+	test(s4.iWidth==iWidth4 && s4.iHeight==iHeight4);
+
+	s1=s4;
+	test(s1==s4);
+	test(s1.iWidth==s4.iWidth && s1.iHeight==s4.iHeight);
+	s3=s2;
+	test(s3==s2);
+	test(s3.iWidth==s2.iWidth && s3.iHeight==s2.iHeight);
+
+	s1=s4;
+	s1.iWidth++;
+	test(s1!=s4);
+	s1=s4;
+	s1.iHeight++;
+	test(s1!=s4);
+	}
+
+void TestTSize::TestAdd()
+	{
+	TPoint p1(iWidth3,iHeight3);
+	TSize s1(iWidth1,iHeight1);
+	TSize s2(iWidth2,iHeight2);
+	TSize s3(iWidth3,iHeight3);
+	TSize s4(iWidth4,iHeight4);
+	TSize sx;
+
+	s1+=s2;
+	test(s1.iWidth==(s2.iWidth+iWidth1) && s1.iHeight==(s2.iHeight+iHeight1));
+	sx=s3=s1+s2;
+	test(s3.iWidth==(s1.iWidth+s2.iWidth) && s3.iHeight==(s1.iHeight+s2.iHeight));
+	test(s3==(s1+s2));
+	test(sx==s3);
+	sx=s4+=s1;
+	test(s4.iWidth==(s1.iWidth+iWidth4) && s4.iHeight==(s1.iHeight+iHeight4));
+	test(sx==s4);
+
+	sx=s1;
+	s1+=p1;
+	test(s1.iWidth==(sx.iWidth+p1.iX) && s1.iHeight==(sx.iHeight+p1.iY));
+	s2=sx+p1;
+	test(s1==s2);
+	}
+
+void TestTSize::TestSub()
+	{
+	TPoint p1(iWidth3,iHeight3);
+	TSize s1(iWidth1,iHeight1);
+	TSize s2(iWidth2,iHeight2);
+	TSize s3(iWidth3,iHeight3);
+	TSize s4(iWidth4,iHeight4);
+	TSize sx;
+
+	s1-=s2;
+	test(s1.iWidth==(iWidth1-s2.iWidth) && s1.iHeight==(iHeight1-s2.iHeight));
+	sx=s3=s1-s2;
+	test(s3.iWidth==(s1.iWidth-s2.iWidth) && s3.iHeight==(s1.iHeight-s2.iHeight));
+	test(s3==(s1-s2));
+	test(sx==s3);
+	sx=s4-=s1;
+	test(s4.iWidth==(iWidth4-s1.iWidth) && s4.iHeight==(iHeight4-s1.iHeight));
+	test(sx==s4);
+
+	sx=s1;
+	s1-=p1;
+	test(s1.iWidth==(sx.iWidth-p1.iX) && s1.iHeight==(sx.iHeight-p1.iY));
+	s2=sx-p1;
+	test(s1==s2);
+	}
+
+void TestTSize::TestUnaryMinus()
+	{
+	TSize s1(iWidth1,iHeight1);
+	TSize s2(iWidth2,iHeight2);
+	TSize s3(iWidth3,iHeight3);
+	TSize s4(iWidth4,iHeight4);
+
+	TSize s=-s1;
+	test (s==TSize(-iWidth1,-iHeight1));
+	s=-s2;
+	test (s==TSize(-iWidth2,-iHeight2));
+	s=-s3;
+	test (s==TSize(-iWidth3,-iHeight3));
+	s=-s4;
+	test (s==TSize(-iWidth4,-iHeight4));
+	}
+
+//////////////////////////////////////////////////////////////////////////////
+// Rectangle test code														//
+//////////////////////////////////////////////////////////////////////////////
+
+TestTRect::TestTRect(TInt tlx1,TInt tly1,TInt brx1,TInt bry1,
+			  				 TInt tlx2,TInt tly2,TInt brx2,TInt bry2,
+			  				 TInt tlx3,TInt tly3,TInt brx3,TInt bry3)
+	{
+	iTlx1=tlx1;
+	iTly1=tly1;
+	iBrx1=brx1;
+	iBry1=bry1;
+	iTlx2=tlx2;
+	iTly2=tly2;
+	iBrx2=brx2;
+	iBry2=bry2;
+	iTlx3=tlx3;
+	iTly3=tly3;
+	iBrx3=brx3;
+	iBry3=bry3;
+	}
+
+void TestTRect::TestSet()
+	{
+	TSize s1(iTlx3,iTly3);
+	TPoint pTl(iTlx2,iTly2);
+	TPoint pBr(iBrx2,iBry2);
+	TRect r1(iTlx1,iTly1,iBrx1,iBry1);
+	TRect r2(pTl,pBr);
+	TRect r3;
+	TRect r4(pTl,s1);
+
+	test(r1.iTl.iX==iTlx1 && r1.iTl.iY==iTly1 && r1.iBr.iX==iBrx1 && r1.iBr.iY==iBry1);
+	test(r2.iTl.iX==iTlx2 && r2.iTl.iY==iTly2 && r2.iBr.iX==iBrx2 && r2.iBr.iY==iBry2);
+	test(r2.iTl==pTl && r2.iBr==pBr);
+	test(r3.iTl.iX==0 && r3.iTl.iY==0 && r3.iBr.iX==0 && r3.iBr.iY==0);
+	test(r4.iTl==pTl && r4.iBr.iX==(pTl.iX+s1.iWidth) && r4.iBr.iY==(pTl.iY+s1.iHeight));
+
+	r3.iTl.iX=iTlx3;
+	r3.iTl.iY=iTly3;
+	r3.iBr.iX=iBrx3;
+	r3.iBr.iY=iBry3;
+	test(r3.iTl.iX==iTlx3 && r3.iTl.iY==iTly3 && r3.iBr.iX==iBrx3 && r3.iBr.iY==iBry3);
+
+	r1.SetRect(iTlx2,iTly2,iBrx2,iBry2);
+	test(r1==r2);
+
+	r2=r3;
+	test(r2==r3);
+
+	pTl.SetXY(iTlx3,iTly3);
+	pBr.SetXY(iBrx3,iBry3);
+	r1.SetRect(pTl,pBr);
+	test(r1.iTl.iX==iTlx3 && r1.iTl.iY==iTly3 && r1.iBr.iX==iBrx3 && r1.iBr.iY==iBry3);
+	pTl.SetXY(iTlx2,iTly2);
+	r1.SetRect(pTl,s1);
+	test(r1==r4);
+	r4.iTl.iX++;
+	test(r1!=r4);
+	r4.iTl.iX--;
+	test(r1==r4);
+	r4.iTl.iY++;
+	test(r1!=r4);
+	r4.iTl.iY--;
+	test(r1==r4);
+	r4.iBr.iX++;
+	test(r1!=r4);
+	r4.iBr.iX--;
+	test(r1==r4);
+	r4.iBr.iY++;
+	test(r1!=r4);
+
+	r4=TRect(0,0,0,0);
+	r4.SetWidth(r1.Size().iWidth);
+	test(r1.Size().iWidth==r4.Size().iWidth);
+	test(r4.Size().iHeight==0);
+
+	r4.SetHeight(r1.Size().iHeight);
+	test(r1.Size().iHeight==r4.Size().iHeight);
+	test(r1.Size().iWidth==r4.Size().iWidth);
+
+	r4=TRect(0,0,0,0);
+	r4.SetSize(r1.Size());
+	test(r1.Size()==r4.Size());
+	}
+
+void TestTRect::TestMove()
+	{
+	TPoint offs(iTlx2,iTly2);
+	TRect r1(iTlx1,iTly1,iBrx1,iBry1);
+	TRect rCheck,rTest;
+
+	rCheck=r1;
+	rCheck.iTl+=offs;
+	rCheck.iBr+=offs;
+
+	rTest=r1;
+	rTest.Move(offs);
+	test(rTest==rCheck);
+
+	rTest=r1;
+	rTest.Move(offs.iX,offs.iY);
+	test(rTest==rCheck);
+	}
+
+void TestTRect::TestResize()
+	{
+	TSize resize(iTlx1,iTly1);
+	TRect rTest(iTlx2,iTly2,iBrx2,iBry2);
+	TRect rCheck;
+
+	rCheck=rTest;
+	rTest.Resize(resize);
+	rCheck.iBr+=resize;
+	test(rTest==rCheck);
+	}
+
+void TestTRect::TestShrink()
+	{
+	TSize shrink(iTlx3,iTly3);
+	TRect r2(iTlx2,iTly2,iBrx2,iBry2);
+	TRect rCheck,rTest;
+
+	rCheck=r2;
+	rCheck.iTl+=shrink;
+	rCheck.iBr-=shrink;
+
+	rTest=r2;
+	rTest.Shrink(shrink);
+	test(rTest==rCheck);
+
+	rTest=r2;
+	rTest.Shrink(shrink.iWidth,shrink.iHeight);
+	test(rTest==rCheck);
+	}
+
+void TestTRect::TestGrow()
+	{
+	TSize grow(iTlx3,iTly3);
+	TRect r2(iTlx2,iTly2,iBrx2,iBry2);
+	TRect rCheck,rTest;
+
+	rCheck=r2;
+	rCheck.iTl-=grow;
+	rCheck.iBr+=grow;
+
+	rTest=r2;
+	rTest.Grow(grow.iWidth,grow.iHeight);
+	test(rTest==rCheck);
+
+	rTest=r2;
+	rTest.Grow(grow);
+	test(rTest==rCheck);
+	}
+
+void TestTRect::TestBoundingRect()
+	{
+	TRect r1(iTlx1,iTly1,iBrx1,iBry1);
+	TRect r2(iTlx2,iTly2,iBrx2,iBry2);
+	TRect r3(iTlx3,iTly3,iBrx3,iBry3);
+	TRect rCheck,rTest;
+
+	rCheck=r1;
+	rCheck.iTl.iX=Min(r1.iTl.iX,r2.iTl.iX);
+	rCheck.iTl.iY=Min(r1.iTl.iY,r2.iTl.iY);
+	rCheck.iBr.iX=Max(r1.iBr.iX,r2.iBr.iX);
+	rCheck.iBr.iY=Max(r1.iBr.iY,r2.iBr.iY);
+	rTest=r1;
+	rTest.BoundingRect(r2);
+	test(rTest==rCheck);
+
+	rCheck=r1;
+	rCheck.iTl.iX=Min(r1.iTl.iX,r3.iTl.iX);
+	rCheck.iTl.iY=Min(r1.iTl.iY,r3.iTl.iY);
+	rCheck.iBr.iX=Max(r1.iBr.iX,r3.iBr.iX);
+	rCheck.iBr.iY=Max(r1.iBr.iY,r3.iBr.iY);
+	rTest=r1;
+	rTest.BoundingRect(r3);
+	test(rTest==rCheck);
+	}
+
+void TestTRect::TestIsEmpty()
+	{
+	TRect f1(0,0,1,1);			// f? should return false
+	TRect f2(-1,-1,0,0);
+	TRect f3(-2,-2,-1,-1);
+	TRect t1(0,0,1,0);			// t? should return true
+	TRect t2(0,0,0,1);
+	TRect t3(0,0,-1,1);
+	TRect t4(0,0,1,-1);
+	TRect t5(-2,-2,-1,-3);
+	TRect t6(-2,-2,-3,-1);
+
+	test(f1.IsEmpty()==FALSE);
+	test(f2.IsEmpty()==FALSE);
+	test(f3.IsEmpty()==FALSE);
+	test(t1.IsEmpty()==TRUE);
+	test(t2.IsEmpty()==TRUE);
+	test(t3.IsEmpty()==TRUE);
+	test(t4.IsEmpty()==TRUE);
+	test(t5.IsEmpty()==TRUE);
+	test(t6.IsEmpty()==TRUE);
+	}
+
+void TestTRect::TestIntersects()
+	{
+	test(TRect(-5,-10,5,10).Intersects(TRect(4,-10,10,10))==TRUE);
+	test(TRect(-5,-10,5,10).Intersects(TRect(5,-10,10,10))==FALSE);
+	test(TRect(-5,-10,5,10).Intersects(TRect(6,-10,10,10))==FALSE);
+	test(TRect(-5,-10,5,10).Intersects(TRect(-5, 9, 5,20))==TRUE);
+	test(TRect(-5,-10,5,10).Intersects(TRect(-5,10, 5,20))==FALSE);
+	test(TRect(-5,-10,5,10).Intersects(TRect(-5,11, 5,20))==FALSE);
+//
+	test(TRect(4,-10,10,10).Intersects(TRect(-5,-10,5,10))==TRUE);
+	test(TRect(5,-10,10,10).Intersects(TRect(-5,-10,5,10))==FALSE);
+	test(TRect(6,-10,10,10).Intersects(TRect(-5,-10,5,10))==FALSE);
+	test(TRect(-5, 9, 5,20).Intersects(TRect(-5,-10,5,10))==TRUE);
+	test(TRect(-5,10, 5,20).Intersects(TRect(-5,-10,5,10))==FALSE);
+	test(TRect(-5,11, 5,20).Intersects(TRect(-5,-10,5,10))==FALSE);
+// Empty rects, should all return FALSE
+	test(TRect(0,11, 5,11).Intersects(TRect(0,0,5,20))==FALSE);
+	test(TRect(1,10, 1,11).Intersects(TRect(0,0,5,20))==FALSE);
+	test(TRect(5,11, 5,11).Intersects(TRect(0,0,5,20))==FALSE);
+	}
+
+void TestTRect::TestIntersection()
+	{
+	TRect r1(iTlx1,iTly1,iBrx1,iBry1);
+	TRect r2(iTlx2,iTly2,iBrx2,iBry2);
+	TRect r3(iTlx3,iTly3,iBrx3,iBry3);
+	TRect rCheck,rTest;
+
+	rCheck=r1;
+	rCheck.iTl.iX=Max(r1.iTl.iX,r2.iTl.iX);
+	rCheck.iTl.iY=Max(r1.iTl.iY,r2.iTl.iY);
+	rCheck.iBr.iX=Min(r1.iBr.iX,r2.iBr.iX);
+	rCheck.iBr.iY=Min(r1.iBr.iY,r2.iBr.iY);
+	rTest=r1;
+	rTest.Intersection(r2);
+	if (!rCheck.IsEmpty())
+		test(rTest==rCheck);
+
+	rCheck=r1;
+	rCheck.iTl.iX=Max(r1.iTl.iX,r3.iTl.iX);
+	rCheck.iTl.iY=Max(r1.iTl.iY,r3.iTl.iY);
+	rCheck.iBr.iX=Min(r1.iBr.iX,r3.iBr.iX);
+	rCheck.iBr.iY=Min(r1.iBr.iY,r3.iBr.iY);
+	rTest=r1;
+	rTest.Intersection(r3);
+	if (!rCheck.IsEmpty())
+		test(rTest==rCheck);
+
+	rCheck=r3;
+	rCheck.iTl.iX=Max(r3.iTl.iX,r2.iTl.iX);
+	rCheck.iTl.iY=Max(r3.iTl.iY,r2.iTl.iY);
+	rCheck.iBr.iX=Min(r3.iBr.iX,r2.iBr.iX);
+	rCheck.iBr.iY=Min(r3.iBr.iY,r2.iBr.iY);
+	rTest=r3;
+	rTest.Intersection(r2);
+	if (!rCheck.IsEmpty())
+		test(rTest==rCheck);
+	}
+
+void TestTRect::TestNormalize()
+	{
+	TUint i;
+    TInt tmp;
+	TRect a[]={TRect(0,0,1,1),TRect(-1,0,0,-1),TRect(-2,2,-1,1),TRect(10,2,1,0),
+			   TRect(-10,-20,-2,-1),TRect(0,0,10,0),TRect(20,1,20,2),TRect(10,10,10,10)};
+	TBool aIsNormalized[]={TRUE,FALSE,FALSE,FALSE,TRUE,TRUE,TRUE,TRUE};
+	TRect tst,check;
+
+	for(i=0;i<(sizeof(a)/sizeof(a[0]));i++)
+		{
+		check=tst=a[i];
+		if (check.iTl.iX>check.iBr.iX)
+			{
+			tmp=check.iBr.iX;
+			check.iBr.iX=check.iTl.iX;
+			check.iTl.iX=tmp;
+			}
+		if (check.iTl.iY>check.iBr.iY)
+			{
+			tmp=check.iBr.iY;
+			check.iBr.iY=check.iTl.iY;
+			check.iTl.iY=tmp;
+			}
+		test(tst.IsNormalized()==aIsNormalized[i]);
+		tst.Normalize();
+		test(tst.IsNormalized()==TRUE);
+		test(tst==check);
+		}
+	}
+
+void TestTRect::TestContains()
+	{
+	TPoint tl1(iTlx1,iTly1);
+	TPoint br1(iBrx1,iBry1);
+	TPoint tl2(iTlx2,iTly2);
+	TPoint br2(iBrx2,iBry2);
+	TPoint tl3(iTlx3,iTly3);
+	TPoint br3(iBrx3,iBry3);
+	TRect rect1(tl1,br1);
+	TRect rect2(tl2,br2);
+	TRect rect3(tl3,br3);
+
+	rect1.Normalize();
+	rect2.Normalize();
+	rect3.Normalize();
+	test(rect1.IsEmpty() || rect1.Contains(rect1.iTl));
+	test(rect2.IsEmpty() || rect2.Contains(rect2.iTl));
+	test(rect3.IsEmpty() || rect3.Contains(rect3.iTl));
+	test(!rect1.Contains(rect1.iBr));
+	test(!rect2.Contains(rect2.iBr));
+	test(!rect3.Contains(rect3.iBr));
+	TPoint pnt;
+	pnt.SetXY(rect1.iTl.iX,rect1.iBr.iY);
+	test(!rect1.Contains(pnt));
+	pnt.SetXY(rect1.iBr.iX,rect1.iTl.iY);
+	test(!rect1.Contains(pnt));
+	pnt=rect2.iTl;
+	if (rect2.iBr.iX>(rect2.iTl.iX+1) && rect2.iBr.iY>(rect2.iTl.iY+1))
+		pnt+=TPoint(1,1);
+	test(rect2.Contains(pnt));
+	}
+
+void TestTRect::TestCenter()
+	{
+	TRect rect[]={TRect(iTlx1,iTly1,iBrx1,iBry1),TRect(iTlx2,iTly2,iBrx2,iBry2),TRect(iTlx3,iTly3,iBrx3,iBry3)};
+
+	for(TUint i=0;i<(sizeof(rect)/sizeof(rect[0]));i++)
+		{
+		TRect& r=rect[i];
+		TPoint center((r.iBr.iX+r.iTl.iX)/2,(r.iBr.iY+r.iTl.iY)/2);
+		test(center==r.Center());
+		}
+	}
+
+//////////////////////////////////////////////////////////////////////////////
+// 3DPoint test code														//
+//////////////////////////////////////////////////////////////////////////////
+TestTPoint3D::TestTPoint3D(TInt x1,TInt y1,TInt z1,TInt x2,TInt y2,TInt z2,TInt x3,TInt y3,TInt z3,TInt x4,TInt y4,TInt z4)
+	{
+	iX1=x1;
+	iY1=y1;
+	iZ1=z1;
+	iX2=x2;
+	iY2=y2;
+	iZ2=z2;
+	iX3=x3;
+	iY3=y3;
+	iZ3=z3;
+	iX4=x4;
+	iY4=y4;
+	iZ4=z4;
+	}
+
+
+void TestTPoint3D::TestSet()
+	{
+
+	TPoint   aPoint(iX3,iY3);
+	TPoint3D p3D1(iX1,iY1,iZ1);
+	TPoint3D p3D2(iX2,iY2,iZ2);
+	TPoint3D p3D3;
+	TPoint3D p3D4;
+	TPoint3D p3D5(aPoint);
+
+	test(p3D1.iX==iX1 && p3D1.iY==iY1 && p3D1.iZ==iZ1);
+	test(p3D2.iX==iX2 && p3D2.iY==iY2 && p3D2.iZ==iZ2);
+	test(p3D4.iX==0 && p3D4.iY==0 && p3D4.iZ==0);
+
+	p3D3.iX=iX3;
+	p3D3.iY=iY3;
+	p3D3.iZ=iZ3;
+	test(p3D3.iX==iX3 && p3D3.iY==iY3&& p3D3.iZ==iZ3);
+	test(p3D3.AsPoint()==aPoint);
+	test(p3D5.AsPoint()==p3D3.AsPoint());
+	
+
+	p3D4.SetXYZ(iX4,iY4,iZ4);
+	test(p3D4.iX==iX4 && p3D4.iY==iY4);
+
+	p3D1=p3D4;
+	test(p3D1==p3D4);
+	test(p3D1.iX==p3D4.iX && p3D1.iY==p3D4.iY && p3D1.iZ==p3D4.iZ);
+
+	p3D3=p3D2;
+	test(p3D3==p3D2);
+	test(p3D3.iX==p3D2.iX && p3D3.iY==p3D2.iY && p3D3.iZ==p3D2.iZ);
+
+	p3D1=p3D4;
+	p3D1.iX++;
+	test(p3D1!=p3D4);
+	p3D1=p3D4;
+	p3D1.iY++;
+	test(p3D1!=p3D4);
+	}
+
+
+void TestTPoint3D::TestAdd()
+	{
+	TPoint apoint(iX3,iY3);
+	TPoint3D p1(iX1,iY1,iZ1);
+	TPoint3D p2(iX2,iY2,iZ2);
+	TPoint3D p3(iX3,iY3,iZ3);
+	TPoint3D p4(iX4,iY4,iZ4);
+	TPoint3D px;
+
+	p1+=p2;
+	test(p1.iX==(p2.iX+iX1) && p1.iY==(p2.iY+iY1)&& p1.iZ==(p2.iZ+iZ1));
+	px=p3=p1+p2;
+	test(p3.iX==(p1.iX+p2.iX) && p3.iY==(p1.iY+p2.iY)&& p3.iZ==(p1.iZ+p2.iZ));
+	test(p3==(p1+p2));
+	test(px==p3);
+	px=p4+=p1;
+	test(p4.iX==(p1.iX+iX4) && p4.iY==(p1.iY+iY4)&& p4.iZ==(p1.iZ+iZ4));
+	test(px==p4);
+	px=p1;
+	p1+=apoint;
+	//TPoint has no Z co-ordinate
+	test(p1.iX==(px.iX+apoint.iX) && p1.iY==(px.iY+apoint.iY) &&p1.iZ==px.iZ);
+	p2=px+apoint;
+	test(p2==p1);
+	}
+
+void TestTPoint3D::TestSub()
+	{
+	TPoint apoint(iX3,iY3);
+	TPoint3D p1(iX1,iY1,iZ1);
+	TPoint3D p2(iX2,iY2,iZ2);
+	TPoint3D p3(iX3,iY3,iZ3);
+	TPoint3D p4(iX4,iY4,iZ4);
+	TPoint3D px;
+
+	p1-=p2;
+	test(p1.iX==(iX1-p2.iX) && p1.iY==(iY1-p2.iY)&& p1.iZ==(iZ1-p2.iZ));
+	px=p3=p1-p2;
+	test(p3.iX==(p1.iX-p2.iX) && p3.iY==(p1.iY-p2.iY)&& p3.iZ==(p1.iZ-p2.iZ));
+	test(p3==(p1-p2));
+	test(px==p3);
+	px=p4-=p1;
+	test(p4.iX==(iX4-p1.iX) && p4.iY==(iY4-p1.iY)&& p4.iZ==(iZ4-p1.iZ));
+	test(px==p4);
+
+	px=p1;
+	p1-=apoint;
+	//TPoint has no Z co-ordinate
+	test(p1.iX==(px.iX-apoint.iX) && p1.iY==(px.iY-apoint.iY)&&p1.iZ==px.iZ);
+	p2=px-apoint;
+	test(p2==p1);
+	}
+
+void TestTPoint3D::TestUnaryMinus()
+	{
+	TPoint3D p1(iX1,iY1,iZ1);
+	TPoint3D p2(iX2,iY2,iZ2);
+	TPoint3D p3(iX3,iY3,iZ3);
+	TPoint3D p4(iX4,iY4,iZ4);
+	TPoint3D p=-p1;
+	test (p==TPoint3D(-iX1,-iY1,-iZ1));
+	p=-p2;
+	test (p==TPoint3D(-iX2,-iY2,-iZ2));
+	p=-p3;
+	test (p==TPoint3D(-iX3,-iY3,-iZ3));
+	p=-p4;
+	test (p==TPoint3D(-iX4,-iY4,-iZ4));
+	}
+
+//////////////////////////////////////////////////////////////////////////////
+// Top level test code														//
+//////////////////////////////////////////////////////////////////////////////
+
+LOCAL_C void test_point(TestTPoint t)
+	{
+	test.Start(_L("Setting values"));
+	t.TestSet();
+	test.Next(_L("Addition"));
+	t.TestAdd();
+	test.Next(_L("Subtraction"));
+	t.TestSub();
+	test.Next(_L("Unary minus"));
+	t.TestUnaryMinus();
+	test.End();
+	}
+
+LOCAL_C void test_size(TestTSize t)
+	{
+	test.Start(_L("Setting values"));
+	t.TestSet();
+	test.Next(_L("Addition"));
+	t.TestAdd();
+	test.Next(_L("Subtraction"));
+	t.TestSub();
+	test.Next(_L("Unary minus"));
+	t.TestUnaryMinus();
+	test.End();
+	}
+
+LOCAL_C void test_rect(TestTRect t)
+	{
+	test.Start(_L("Setting values"));
+	t.TestSet();
+	test.Next(_L("Offset"));
+	t.TestMove();
+	test.Next(_L("Resize"));
+	t.TestResize();
+	test.Next(_L("Grow"));
+	t.TestGrow();
+	test.Next(_L("Shrink"));
+	t.TestShrink();
+	test.Next(_L("BoundingRect"));
+	t.TestBoundingRect();
+	test.Next(_L("IsEmpty"));
+	t.TestIsEmpty();
+	test.Next(_L("Intersects"));
+	t.TestIntersects();
+	test.Next(_L("Intersection"));
+	t.TestIntersection();
+	test.Next(_L("Normalize"));
+	t.TestNormalize();
+	test.Next(_L("Contains"));
+	t.TestContains();
+	test.Next(_L("Center"));
+	t.TestCenter();
+	test.End();
+	}
+
+
+LOCAL_C void test_3Dpoint(TestTPoint3D t)
+	{
+	test.Start(_L("Setting values"));
+	t.TestSet();
+	test.Next(_L("Addition"));
+	t.TestAdd();
+	test.Next(_L("Subtraction"));
+	t.TestSub();
+	test.Next(_L("Unary minus"));
+	t.TestUnaryMinus();
+	test.End();
+	}
+
+GLDEF_C TInt E32Main()
+    {
+//
+
+
+	test.Title();
+//
+// Test the TPoint type.
+//
+	TestTPoint	tp1(1,2, 3,5, 8,13, 20,33);
+	TestTPoint	tp2(10,-12, -55,29, -222,-666, 0,0);
+	TestTPoint	tp3(345678,10, -9,987654, -1234567,-9876543, 222222,33333);
+	TestTPoint	tp4(-1,-2,-3,-4,-5,-6,-7,-8);
+	TestTPoint	tp5(0,0, 1000000,0, 0,2000000, 3000000,4000000);
+//
+	test.Start(_L("class TPoint 1"));
+	test_point(tp1);
+	test.Next(_L("class TPoint 2"));
+	test_point(tp2);
+	test.Next(_L("class TPoint 3"));
+	test_point(tp3);
+	test.Next(_L("class TPoint 4"));
+	test_point(tp4);
+	test.Next(_L("class TPoint 5"));
+	test_point(tp5);
+//
+// Test the TSize type.
+//
+	TestTSize	sp1(5,4, 9,5, 17,33, 44,75);
+	TestTSize	sp2(12,-10, -29,55, -666,-222, 0,0);
+	TestTSize	sp3(456789,20, -3,876543, -2345678,-8765432, 33333,11111);
+	TestTSize	sp4(-1,-2,-3,-4,-5,-6,-7,-8);
+	TestTSize	sp5(0,0, 2000000,0, 0,3000000, 1000000,6000000);
+//
+	test.Next(_L("class TSize 1"));
+	test_size(sp1);
+	test.Next(_L("class TSize 2"));
+	test_size(sp2);
+	test.Next(_L("class TSize 3"));
+	test_size(sp3);
+	test.Next(_L("class TSize 4"));
+	test_size(sp4);
+	test.Next(_L("class TSize 5"));
+	test_size(sp5);
+//
+// TRect tests
+//
+	TestTRect	tr1(0,0,1,2, 10,20,14,19, 33,11,44,55);
+	TestTRect	tr2(-10,-20,11,22, -100,-200,-90,-199, 3000,1100,-4400,-5500);
+	TestTRect	tr3(0,0,0,0, 1,1,2,2, -1,-1,0,0);
+//
+	test.Next(_L("class TRect 1"));
+	test_rect(tr1);
+	test.Next(_L("class TRect 2"));
+	test_rect(tr2);
+	test.Next(_L("class TRect 3"));
+	test_rect(tr3);
+//
+//
+// Test the TPoint3D type.
+//
+	TestTPoint3D	t3dp1(1,2,3, 4,5,6, 7 ,8,9, 10,11,12);
+	TestTPoint3D	t3dp2(28,-12,75, -55,-98, -222, -788,-666,-155, 0,0,0);
+	TestTPoint3D	t3dp3(89823,-45,12121,-78454,345678,10, -9,987654, -1234567,-9876543, 222222,33333);
+	TestTPoint3D	t3dp4(-12,-32,-53,-84,-95,-456,-467,-4658,-45,-908,-65,-908);
+	TestTPoint3D	t3dp5(0,0,0, 23,1000000,0,10677,-3,2000000, 3000000,4000000,501);
+
+	//
+	test.Start(_L("class TPoint3D 1"));
+	test_3Dpoint(t3dp1);
+	test.Next(_L("class TPoint3D 2"));
+	test_3Dpoint(t3dp2);
+	test.Next(_L("class TPoint3D 3"));
+	test_3Dpoint(t3dp3);
+	test.Next(_L("class TPoint3D 4"));
+	test_3Dpoint(t3dp4);
+	test.Next(_L("class TPoint3D 5"));
+	test_3Dpoint(t3dp5);
+    //
+	test.Printf(_L("T_GRAPH: TEST Successfully Completed \n"));
+	test.End();
+	test.Close();
+	return(0);
+    }
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32test/buffer/t_hashtab.cpp	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,2439 @@
+// Copyright (c) 2005-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32test/buffer/t_hashtab.cpp
+// 
+//
+
+#include <e32test.h>
+#include <e32hashtab.h>
+#include <hal.h>
+
+#if defined(__VC32__) || defined(__CW32__)
+typedef unsigned short wch;
+#else
+typedef wchar_t wch;
+#endif
+
+
+RTest test(_L("T_HASHTAB"));
+TInt NanoTickPeriod;
+
+typedef TBuf8<80> TTestName;
+typedef RHashSet<TInt> TIntSet;
+typedef RHashSet<TTestName> TNameSet;
+typedef RPtrHashSet<TDesC8> TStringSet8;
+typedef RPtrHashSet<TDesC16> TStringSet16;
+typedef RPtrHashMap<TDesC8,TDesC8> TStringMap8;
+typedef RPtrHashMap<TDesC16,TDesC16> TStringMap16;
+
+#define INTSET(x)	TIntSet x
+#define NAMESET(x)	TNameSet x(&HashTestName, &TestNameIdentity)
+#define STRSET8(x)	TStringSet8 x
+#define STRSET16(x)	TStringSet16 x
+#define STRMAP8(x)	TStringMap8 x
+#define STRMAP16(x)	TStringMap16 x
+
+RPointerArray<TDesC8> DesC8Array;
+RPointerArray<TDesC16> DesC16Array;
+
+class HashTest : public RHashTableBase
+	{
+public:
+	HashTest() : RHashTableBase(0,0,0,0) {}
+	using RHashTableBase::ConsistencyCheck;
+	using RHashTableBase::Count;
+	};
+
+void CCheck(RHashTableBase& aHT)
+	{
+	TUint32 ci[1024];
+	TUint32 dc;
+	TUint32 cmp;
+	HashTest* h = (HashTest*)&aHT;
+	h->ConsistencyCheck(&dc, &cmp, 1024, ci);
+	test.Printf(_L("Count = %d, Deleted = %d, Cmp = %d\n"), h->Count(), dc, cmp);
+	TInt i;
+	for (i=0; i<1024; ++i)
+		{
+		if (ci[i])
+			test.Printf(_L("%d chains of length %d\n"), ci[i], i);
+		}
+	}
+
+const char* Numbers[] =
+	{
+	"zero",
+	"one",
+	"two",
+	"three",
+	"four",
+	"five",
+	"six",
+	"seven",
+	"eight",
+	"nine",
+	"ten",
+	"eleven",
+	"twelve",
+	"thirteen",
+	"fourteen",
+	"fifteen",
+	"sixteen",
+	"seventeen",
+	"eighteen",
+	"nineteen",
+	"twenty",
+	"thirty",
+	"forty",
+	"fifty",
+	"sixty",
+	"seventy",
+	"eighty",
+	"ninety",
+	"hundred",
+	"thousand"
+	};
+
+TTestName NumberInWords(const TInt& aNum)
+	{
+	TInt a = aNum;
+	TTestName n;
+	if (a<20)
+		{
+		n.Copy((const TUint8*)Numbers[a]);
+		return n;
+		}
+	if (a<100)
+		{
+		TInt tens = a/10;
+		TInt units = a%10;
+		n.Copy((const TUint8*)Numbers[tens-2+20]);
+		if (units)
+			{
+			n.Append(' ');
+			n.Append(TPtrC8((const TUint8*)Numbers[units]));
+			}
+		return n;
+		}
+	if (a<1000)
+		{
+		TInt h = a/100;
+		n.Copy((const TUint8*)Numbers[h]);
+		n.Append(' ');
+		n.Append(TPtrC8((const TUint8*)Numbers[28]));
+		a%=100;
+		if (a)
+			{
+			TTestName n2(NumberInWords(a));
+			n.Append(_L8(" and "));
+			n+=n2;
+			}
+		return n;
+		}
+	TInt t = a/1000;
+	n = NumberInWords(t);
+	n.Append(' ');
+	n.Append(TPtrC8((const TUint8*)Numbers[29]));
+	a%=1000;
+	if (a)
+		{
+		TTestName n2(NumberInWords(a));
+		if (a<100)
+			n.Append(_L8(" and "));
+		else
+			n.Append(' ');
+		n+=n2;
+		}
+	return n;
+	}
+
+void PrintNumberInWords(TInt a)
+	{
+	TBuf<256> buf;
+	TTestName n(NumberInWords(a));
+	buf.Copy(n);
+	test.Printf(_L("%d: %S\n"), a, &buf);
+	}
+
+TUint32 HashTestName(const TTestName& aN)
+	{
+	return DefaultHash::Des8(aN);
+	}
+
+TBool TestNameIdentity(const TTestName& aA, const TTestName& aB)
+	{
+	return aA == aB;
+	}
+
+/******************************************************************************
+ * Utility functions for RHashSet<T>
+ ******************************************************************************/
+template <class T>
+void Union(RHashSet<T>& aD, const RHashSet<T>& aS)
+	{
+	TInt c = aS.Count();
+	TInt c2 = c;
+	TInt d0 = aD.Count();
+	TInt d1 = d0;
+	typename RHashSet<T>::TIter iS(aS);
+	FOREVER
+		{
+		const T* p = iS.Next();
+		if (!p)
+			break;
+		--c2;
+		TInt r = aD.Insert(*p);
+		test(r==KErrNone);
+		++d1;
+		}
+	test(d1 == aD.Count());
+	test(c2 == 0);
+	}
+
+template <class T>
+void Subtract(RHashSet<T>& aD, const RHashSet<T>& aS)
+	{
+	TInt c = aS.Count();
+	TInt c2 = c;
+	TInt d0 = aD.Count();
+	TInt d1 = d0;
+	TInt nfd = 0;
+	typename RHashSet<T>::TIter iS(aS);
+	FOREVER
+		{
+		const T* p = iS.Next();
+		if (!p)
+			break;
+		--c2;
+		TInt r = aD.Remove(*p);
+		test(r==KErrNone || r==KErrNotFound);
+		if (r==KErrNotFound)
+			++nfd;
+		else
+			--d1;
+		}
+	test(d1 == aD.Count());
+	test(c2 == 0);
+	test( (d0-d1) + nfd == c);
+	}
+
+template <class T>
+void Intersect(RHashSet<T>& aD, const RHashSet<T>& aS)
+	{
+	typename RHashSet<T>::TIter iD(aD);
+	FOREVER
+		{
+		const T* p = iD.Next();
+		if (!p)
+			break;
+		if (!aS.Find(*p))
+			iD.RemoveCurrent();
+		}
+	}
+
+template <class T>
+void CheckIdentical(const RHashSet<T>& aA, const RHashSet<T>& aB)
+	{
+	test(aA.Count()==aB.Count());
+	TInt c = aA.Count();
+	typename RHashSet<T>::TIter iA(aA);
+	FOREVER
+		{
+		const T* p = iA.Next();
+		if (!p)
+			break;
+		--c;
+		test(aB.Find(*p)!=0);
+		}
+	test(c==0);
+	c = aA.Count();
+	typename RHashSet<T>::TIter iB(aB);
+	FOREVER
+		{
+		const T* p = iB.Next();
+		if (!p)
+			break;
+		--c;
+		test(aA.Find(*p)!=0);
+		}
+	test(c==0);
+	}
+
+
+/******************************************************************************
+ * Utility functions for RPtrHashSet<T>
+ ******************************************************************************/
+template <class T>
+void Union(RPtrHashSet<T>& aD, const RPtrHashSet<T>& aS)
+	{
+	TInt c = aS.Count();
+	TInt c2 = c;
+	TInt d0 = aD.Count();
+	TInt d1 = d0;
+	typename RPtrHashSet<T>::TIter iS(aS);
+	FOREVER
+		{
+		const T* p = iS.Next();
+		if (!p)
+			break;
+		--c2;
+		TInt r = aD.Insert(p);
+		test(r==KErrNone);
+		++d1;
+		}
+	test(d1 == aD.Count());
+	test(c2 == 0);
+	}
+
+template <class T>
+void Subtract(RPtrHashSet<T>& aD, const RPtrHashSet<T>& aS)
+	{
+	TInt c = aS.Count();
+	TInt c2 = c;
+	TInt d0 = aD.Count();
+	TInt d1 = d0;
+	TInt nfd = 0;
+	typename RPtrHashSet<T>::TIter iS(aS);
+	FOREVER
+		{
+		const T* p = iS.Next();
+		if (!p)
+			break;
+		--c2;
+		TInt r = aD.Remove(p);
+		test(r==KErrNone || r==KErrNotFound);
+		if (r==KErrNotFound)
+			++nfd;
+		else
+			--d1;
+		}
+	test(d1 == aD.Count());
+	test(c2 == 0);
+	test( (d0-d1) + nfd == c);
+	}
+
+template <class T>
+void Intersect(RPtrHashSet<T>& aD, const RPtrHashSet<T>& aS)
+	{
+	typename RPtrHashSet<T>::TIter iD(aD);
+	FOREVER
+		{
+		const T* p = iD.Next();
+		if (!p)
+			break;
+		if (!aS.Find(*p))
+			iD.RemoveCurrent();
+		}
+	}
+
+template <class T>
+void CheckIdentical(const RPtrHashSet<T>& aA, const RPtrHashSet<T>& aB)
+	{
+	test(aA.Count()==aB.Count());
+	TInt c = aA.Count();
+	typename RPtrHashSet<T>::TIter iA(aA);
+	FOREVER
+		{
+		const T* p = iA.Next();
+		if (!p)
+			break;
+		--c;
+		test(aB.Find(*p)!=0);
+		}
+	test(c==0);
+	c = aA.Count();
+	typename RPtrHashSet<T>::TIter iB(aB);
+	FOREVER
+		{
+		const T* p = iB.Next();
+		if (!p)
+			break;
+		--c;
+		test(aA.Find(*p)!=0);
+		}
+	test(c==0);
+	}
+
+
+/******************************************************************************
+ * Utility functions for RHashMap<K,V>
+ ******************************************************************************/
+template <class K, class V>
+void UnionTransform(RHashMap<K,V>& aD, const RHashSet<K>& aS, V (*aTransform)(const K&) )
+	{
+	TInt c = aS.Count();
+	TInt c2 = c;
+	TInt d0 = aD.Count();
+	TInt d1 = d0;
+	typename RHashSet<K>::TIter iS(aS);
+	FOREVER
+		{
+		const K* p = iS.Next();
+		if (!p)
+			break;
+		--c2;
+		TInt r = aD.Insert(*p, (*aTransform)(*p) );
+		test(r==KErrNone);
+		++d1;
+		}
+	test(d1 == aD.Count());
+	test(c2 == 0);
+	}
+
+
+template <class K, class V>
+void UnionMap(RHashSet<V>& aD, const RHashSet<K>& aS, const RHashMap<K,V>& aM)
+	{
+	TInt c = aS.Count();
+	TInt c2 = c;
+	TInt d0 = aD.Count();
+	TInt d1 = d0;
+	typename RHashSet<K>::TIter iS(aS);
+	FOREVER
+		{
+		const K* p = iS.Next();
+		if (!p)
+			break;
+		--c2;
+		const V* q = aM.Find(*p);
+		if (!q)
+			continue;
+		TInt r = aD.Insert(*q);
+		test(r==KErrNone);
+		++d1;
+		}
+	test(d1 == aD.Count());
+	test(c2 == 0);
+	}
+
+
+template <class K, class V>
+void UnionKeys(RHashSet<K>& aD, const RHashMap<K,V>& aM)
+	{
+	typename RHashMap<K,V>::TIter iM(aM);
+	FOREVER
+		{
+		const K* p = iM.NextKey();
+		if (!p)
+			break;
+		aD.Insert(*p);
+		}
+	}
+
+
+template <class K, class V>
+void UnionValues(RHashSet<V>& aD, const RHashMap<K,V>& aM)
+	{
+	typename RHashMap<K,V>::TIter iM(aM);
+	FOREVER
+		{
+		const K* p = iM.NextKey();
+		if (!p)
+			break;
+		const V* q = iM.CurrentValue();
+		aD.Insert(*q);
+		}
+	}
+
+
+template <class K, class V>
+void UnionTransform(RHashMap<K,V>& aD, const RHashMap<K,V>& aS, V (*aTransform)(const V&) )
+	{
+	TInt c = aS.Count();
+	TInt c2 = c;
+	TInt d0 = aD.Count();
+	TInt d1 = d0;
+	typename RHashMap<K,V>::TIter iS(aS);
+	FOREVER
+		{
+		const K* p = iS.NextKey();
+		if (!p)
+			break;
+		--c2;
+		TInt r = aD.Insert(*p, (*aTransform)(*iS.CurrentValue()) );
+		test(r==KErrNone);
+		++d1;
+		}
+	test(d1 == aD.Count());
+	test(c2 == 0);
+	}
+
+
+template <class K, class V>
+void UnionInverse(RHashMap<V,K>& aD, const RHashMap<K,V>& aS)
+	{
+	TInt c = aS.Count();
+	TInt c2 = c;
+	TInt d0 = aD.Count();
+	TInt d1 = d0;
+	typename RHashMap<K,V>::TIter iS(aS);
+	FOREVER
+		{
+		const K* p = iS.NextKey();
+		if (!p)
+			break;
+		--c2;
+		const V* q = iS.CurrentValue();
+		TInt r = aD.Insert(*q, *p);
+		test(r==KErrNone);
+		++d1;
+		}
+	test(d1 == aD.Count());
+	test(c2 == 0);
+	}
+
+template <class K, class V>
+void SetMap(RHashMap<V,K>& aM, const V& aV)
+	{
+	typename RHashMap<K,V>::TIter iM(aM);
+	FOREVER
+		{
+		const K* p = iM.NextKey();
+		if (!p)
+			break;
+		V* q = iM.CurrentValue();
+		*q = aV;
+		test(*q == aV);
+		}
+	}
+
+
+/******************************************************************************
+ * Utility functions for RPtrHashMap<K,V>
+ ******************************************************************************/
+template <class K, class V>
+void UnionTransform(RPtrHashMap<K,V>& aD, const RPtrHashMap<K,V>& aS, V* (*aTransform)(const V*) )
+	{
+	TInt c = aS.Count();
+	TInt c2 = c;
+	TInt d0 = aD.Count();
+	TInt d1 = d0;
+	typename RPtrHashMap<K,V>::TIter iS(aS);
+	FOREVER
+		{
+		const K* p = iS.NextKey();
+		if (!p)
+			break;
+		--c2;
+		TInt r = aD.Insert(p, (*aTransform)(iS.CurrentValue()) );
+		test(r==KErrNone);
+		++d1;
+		}
+	test(d1 == aD.Count());
+	test(c2 == 0);
+	}
+
+
+template <class A, class B>
+void UnionInverse(RPtrHashMap<B,A>& aD, const RPtrHashMap<A,B>& a1)
+	{
+	typename RPtrHashMap<A,B>::TIter iter(a1);
+	const A* pA;
+	while ( (pA=iter.NextKey()) != 0 )
+		{
+		const B* pB = iter.CurrentValue();
+		TInt r = aD.Insert(pB, pA);
+		test(r==KErrNone);
+		}
+	}
+
+
+template <class A, class B, class C>
+void UnionCompose(RPtrHashMap<A,C>& aD, const RPtrHashMap<A,B>& a1, const RPtrHashMap<B,C>& a2)
+	{
+	typename RPtrHashMap<A,B>::TIter iter(a1);
+	const A* pA;
+	while ( (pA=iter.NextKey()) != 0 )
+		{
+		const B* pB = iter.CurrentValue();
+		const C* pC = a2.Find(*pB);
+		if (pC)
+			{
+			TInt r = aD.Insert(pA, pC);
+			test(r==KErrNone);
+			}
+		}
+	}
+
+
+template <class K, class V>
+void CheckIdenticalMaps(const RPtrHashMap<K,V>& aA, const RPtrHashMap<K,V>& aB)
+	{
+	test(aA.Count()==aB.Count());
+	TInt c = aA.Count();
+	const K* p;
+	const V* q;
+	typename RPtrHashMap<K,V>::TIter iA(aA);
+	while( (p=iA.NextKey()) != 0)
+		{
+		--c;
+		q = aB.Find(*p);
+		test(q && q==iA.CurrentValue());
+		}
+	test(c==0);
+	c = aB.Count();
+	typename RPtrHashMap<K,V>::TIter iB(aB);
+	while( (p=iB.NextKey()) != 0)
+		{
+		--c;
+		q = aA.Find(*p);
+		test(q && q==iB.CurrentValue());
+		}
+	test(c==0);
+	}
+
+
+
+
+
+/******************************************************************************
+ * Tests of TIntSet
+ ******************************************************************************/
+void Populate(TIntSet& aH, TInt aS, TInt aE, TInt aM)
+	{
+	TInt x = aS;
+	for (; x<=aE; x+=aM)
+		aH.Insert(x);
+	}
+
+void PrimeSieve(TIntSet& aH, TInt aStart, TInt aEnd)
+	{
+	TInt x;
+	TInt e = (aEnd&1) ? aEnd : aEnd-1;
+	TInt s = (aStart<2) ? 2 : aStart|1;
+	for (x=s; x<=e; ++x)
+		{
+//		test.Printf(_L("add %d\n"),x);
+		aH.Insert(x);
+		}
+	TInt m=2;
+	FOREVER
+		{
+		for (; m*m<=e && !aH.Find(m); ++m)
+			{}
+		if (m*m > e)
+			break;
+		for (x=m*2; x<=e; x+=m)
+			{
+//			test.Printf(_L("remove %d\n"),x);
+			aH.Remove(x);
+			}
+		++m;
+		}
+	}
+
+TBool IsPrime(TInt x)
+	{
+	if (x==2)
+		return ETrue;
+	if (!(x&1))
+		return EFalse;
+	TInt d;
+	for (d=3; d*d<=x; d+=2)
+		{
+		if (x%d==0)
+			return EFalse;
+		}
+	return ETrue;
+	}
+
+void CheckSieveOutput(TIntSet& aH)
+	{
+	RHashSet<TInt>::TIter iter(aH);
+	TInt min = KMaxTInt;
+	TInt max = KMinTInt;
+	TInt c = 0;
+	test.Printf(_L("%d elements:\n"),aH.Count());
+	FOREVER
+		{
+		const TInt* p = iter.Next();
+		if (!p)
+			break;
+		++c;
+		if (*p>max) max=*p;
+		if (*p<min) min=*p;
+//		test.Printf(_L("%d\n"),*p);
+		test(IsPrime(*p));
+		}
+	test(c==aH.Count());
+	TInt x;
+	if (min==2)
+		{
+		test(aH.Find(2)!=0);
+		min++;
+		}
+	for (x=min; x<=max; x+=2)
+		{
+		if (IsPrime(x))
+			test(aH.Find(x)!=0);
+		}
+	for (x=min; x<=max; x+=2)
+		{
+		if (IsPrime(x))
+			test(aH.Find(x)==&aH.FindL(x));
+		else
+			{
+			TRAPD(rr,aH.FindL(x));
+			test(rr==KErrNotFound);
+			}
+		}
+	}
+
+TUint32 CheckSmallHashSet(const TIntSet& aA)
+	{
+	TUint32 m = 0;
+	RHashSet<TInt>::TIter iter(aA);
+	FOREVER
+		{
+		const TInt* p = iter.Next();
+		if (!p)
+			break;
+		m |= (1<<*p);
+		}
+	return m;
+	}
+
+void AddToSmallHashSet(TIntSet& aA, TUint32 aMask)
+	{
+	CheckSmallHashSet(aA);
+	TInt i;
+	TInt r;
+	for (i=0; i<32; ++i)
+		{
+		if (aMask & (1<<i))
+			{
+			r = aA.Insert(i);
+			test(r==KErrNone);
+			}
+		}
+	}
+
+void RemoveFromSmallHashSet(TIntSet& aA, TUint32 aMask)
+	{
+	TUint32 m = CheckSmallHashSet(aA);
+	TInt i;
+	TInt r;
+	for (i=0; i<32; ++i)
+		{
+		if (aMask & (1<<i))
+			{
+			r = aA.Remove(i);
+			if (m & (1<<i))
+				test(r==KErrNone);
+			else
+				test(r==KErrNotFound);
+			}
+		}
+	}
+
+void TestHashSet()
+	{
+	test.Next(_L("Test RHashSet"));
+
+	INTSET(hs);
+	CCheck(hs);		// check consistency for empty table
+	INTSET(hs2);
+	INTSET(hs3);
+	PrimeSieve(hs, 1, 100);
+	CheckSieveOutput(hs);
+	test(hs.Reserve(1000)==KErrNone);
+	CCheck(hs);
+	CheckSieveOutput(hs);	// check that Reserve() preserves existing entries
+
+	INTSET(m1);
+	INTSET(m2);
+	INTSET(m3);
+	INTSET(m5);
+	INTSET(m7);
+	Populate(m1,2,100,1);
+	Populate(m2,4,100,2);
+	Populate(m3,6,100,3);
+	Populate(m5,10,100,5);
+	Populate(m7,14,100,7);
+	Union(hs3, m1);
+	Subtract(hs3, m2);
+	Subtract(hs3, m3);
+	Subtract(hs3, m5);
+	Subtract(hs3, m7);
+	CheckSieveOutput(hs3);
+	CheckIdentical(hs,hs3);
+	hs3.Close();
+	INTSET(cm2);
+	INTSET(cm3);
+	INTSET(cm5);
+	INTSET(cm7);
+	Union(cm2, m1);
+	Subtract(cm2, m2);
+	Union(cm3, m1);
+	Subtract(cm3, m3);
+	Union(cm5, m1);
+	Subtract(cm5, m5);
+	Union(cm7, m1);
+	Subtract(cm7, m7);
+	Union(hs3, m1);
+	Intersect(hs3, cm7);
+	Intersect(hs3, cm3);
+	Intersect(hs3, cm5);
+	Intersect(hs3, cm2);
+	CheckSieveOutput(hs3);
+	CheckIdentical(hs,hs3);
+	hs3.Close();
+
+
+	cm2.Close();
+	cm3.Close();
+	cm5.Close();
+	cm7.Close();
+	m1.Close();
+	m2.Close();
+	m3.Close();
+	m5.Close();
+	m7.Close();
+
+	PrimeSieve(hs2, 1, 1000);
+	CheckSieveOutput(hs2);
+	test(hs2.Reserve(1000)==KErrNone);
+	CCheck(hs2);
+	CheckSieveOutput(hs2);	// check that Reserve() preserves existing entries
+
+	PrimeSieve(hs, 100, 997);
+	CheckSieveOutput(hs);
+	CCheck(hs);
+	CheckIdentical(hs,hs2);
+
+	hs2.Close();
+	Union(hs2, hs);
+	CheckIdentical(hs,hs2);
+	CheckSieveOutput(hs2);
+
+	hs2.Close();
+	hs.Close();
+
+	test(CheckSmallHashSet(hs)==0);
+	AddToSmallHashSet(hs, 1);
+	test(CheckSmallHashSet(hs)==1);
+	AddToSmallHashSet(hs, 4);
+	test(CheckSmallHashSet(hs)==5);
+	AddToSmallHashSet(hs, 0x80000001);
+	test(CheckSmallHashSet(hs)==0x80000005);
+	AddToSmallHashSet(hs, 0x317217f8);
+	test(CheckSmallHashSet(hs)==0xb17217fd);
+	RemoveFromSmallHashSet(hs, 0x00000007);
+	test(CheckSmallHashSet(hs)==0xb17217f8);
+	RemoveFromSmallHashSet(hs, 0xffffffff);
+	test(CheckSmallHashSet(hs)==0);
+	hs.Close();
+	}
+
+void TestHashIter()
+	{
+	test.Next(_L("Test iterators"));
+
+	RHashSet<TInt> hs;		// empty
+	RHashSet<TInt>::TIter iter(hs);
+	test(iter.Next() == 0);
+	test(iter.Current() == 0);
+	iter.RemoveCurrent();
+	test(iter.Next() == 0);
+	test(iter.Current() == 0);
+
+	test(hs.Insert(1) == KErrNone);
+	test(hs.Insert(2) == KErrNone);
+	test(hs.Insert(3) == KErrNone);
+	iter.Reset();
+	TUint mask = 14;
+	TInt i;
+	for (i=0; i<3; ++i)
+		{
+		const TInt* p = iter.Next();
+		test(p!=0);
+		TInt x = *p;
+		test (x>=1 && x<=3 && (mask&(1<<x))!=0);
+		mask &= ~(1<<x);
+		}
+	test(iter.Next() == 0);
+	test(mask==0);
+	test(CheckSmallHashSet(hs)==0x0e);
+	test(hs.Insert(4) == KErrNone);
+	test(hs.Insert(5) == KErrNone);
+	test(hs.Insert(6) == KErrNone);
+	test(hs.Insert(7) == KErrNone);
+	test(CheckSmallHashSet(hs)==0xfe);
+	iter.Reset();
+	while(iter.Next())
+		{
+		if ((*iter.Current() & 1) == 0)
+			iter.RemoveCurrent();
+		}
+	test(CheckSmallHashSet(hs)==0xaa);
+	iter.Reset();
+	while(iter.Next())
+		{
+		iter.RemoveCurrent();
+		}
+	test(CheckSmallHashSet(hs)==0);
+	iter.Reset();
+	test(iter.Next() == 0);
+	test(iter.Current() == 0);
+	RHashSet<TInt> empty;
+	CheckIdentical(hs, empty);
+#ifdef _DEBUG
+	__UHEAP_FAILNEXT(1);
+	test(empty.Insert(1)==KErrNoMemory);
+	test(empty.Insert(1)==KErrNone);
+	empty.Close();
+	__UHEAP_FAILNEXT(1);
+	test(hs.Insert(1)==KErrNone);
+	hs.Close();
+	__UHEAP_FAILNEXT(1);
+	test(hs.Insert(1)==KErrNoMemory);
+#endif
+	hs.Close();
+	}
+
+void Print(const char* aTitle, const RHashMap<TInt,TTestName>& aM)
+	{
+	TBuf<256> buf;
+	buf.Copy(TPtrC8((const TUint8*)aTitle));
+	test.Printf(_L("%S\n"), &buf);
+	RHashMap<TInt,TTestName>::TIter iter(aM);
+	FOREVER
+		{
+		const TInt* p = iter.NextKey();
+		if (!p) break;
+		buf.Copy(*iter.CurrentValue());
+		test.Printf(_L("%d: %S\n"), *p, &buf);
+		}
+	}
+
+void Print(const char* aTitle, const RHashSet<TTestName>& aS)
+	{
+	TBuf<256> buf;
+	buf.Copy(TPtrC8((const TUint8*)aTitle));
+	test.Printf(_L("%S\n"), &buf);
+	RHashSet<TTestName>::TIter iter(aS);
+	FOREVER
+		{
+		if (!iter.Next())
+			break;
+		buf.Copy(*iter.Current());
+		test.Printf(_L("%S\n"), &buf);
+		}
+	}
+
+void TestHashMap()
+	{
+	test.Next(_L("Test RHashMap"));
+
+	RHashMap<TInt,TInt> ht;
+	CCheck(ht);		// check consistency for empty table
+	TInt x;
+	for (x=0; x<200; x++)
+		{
+		TInt r = ht.Insert(x*x, x);
+		test(r==KErrNone);
+		}
+	test(ht.Count()==200);
+
+	TInt z = 0;
+	TInt y;
+	for (x=0; x<40000; x++)
+		{
+		const TInt* e = ht.Find(x);
+		if (e)
+			{
+			const TInt& ee = ht.FindL(x);
+			test(&ee==e);
+			y = *e;
+//			test.Printf(_L("Find(%d) -> %d\n"), x, y);
+			test(x == z*z);
+			test(y == z);
+			++z;
+			}
+		else
+			{
+			TRAPD(rr, ht.FindL(x));
+			test(rr==KErrNotFound);
+			}
+		}
+	CCheck(ht);
+
+	for (x=0; x<200; x++)
+		{
+		TInt r = ht.Insert(x*x*x, x);
+		test(r==KErrNone);
+		}
+	test(ht.Count()==200*2-6);
+	CCheck(ht);
+
+	TInt sq = 0;
+	TInt cb = 0;
+	for (x=0; x<8000000; x++)
+		{
+		const TInt* e = ht.Find(x);
+		if (e)
+			{
+			const TInt& ee = ht.FindL(x);
+			test(&ee==e);
+			y = *e;
+//			test.Printf(_L("Find(%d) -> %d\n"), x, y);
+			if (x == cb*cb*cb)
+				{
+				test(y==cb);
+				++cb;
+				if (x == sq*sq)
+					++sq;
+				}
+			else if (x == sq*sq)
+				{
+				test(y==sq);
+				++sq;
+				}
+			}
+		}
+
+	for (x=0; x<200; x++)
+		{
+		TInt r = ht.Remove(x*x);
+		test(r==KErrNone);
+		}
+	test(ht.Count()==200-6);
+	CCheck(ht);
+
+	cb = 2;
+	for (x=2; x<8000000; x++)
+		{
+		const TInt* e = ht.Find(x);
+		if (e)
+			{
+			const TInt& ee = ht.FindL(x);
+			test(&ee==e);
+			y = *e;
+//			test.Printf(_L("Find(%d) -> %d\n"), x, y);
+			if (cb == 4 || cb == 9 || cb == 16 || cb == 25) ++cb;
+			test(x == cb*cb*cb);
+			test(y == cb);
+			++cb;
+			}
+		}
+
+	SetMap<TInt,TInt>(ht, 17);
+
+	ht.Close();
+
+	PrintNumberInWords(2000);
+	PrintNumberInWords(2001);
+	PrintNumberInWords(131072);
+	PrintNumberInWords(111111);
+	PrintNumberInWords(524288);
+
+	INTSET(all);
+	Populate(all,0,1000,1);
+	RHashMap<TInt,TTestName> to_words(&DefaultHash::Integer, &DefaultIdentity::Integer);
+	UnionTransform<TInt,TTestName>(to_words, all, &NumberInWords);
+	RHashMap<TTestName,TInt> from_words(&HashTestName, &TestNameIdentity);
+	UnionInverse<TInt,TTestName>(from_words, to_words);
+//	Print("TO WORDS:", to_words);
+	INTSET(primes);
+	PrimeSieve(primes, 1, 100);
+//	Print("Primes 1-100", primes);
+	RHashMap<TInt,TTestName> prime_map(&DefaultHash::Integer, &DefaultIdentity::Integer);
+	UnionTransform<TInt,TTestName>(prime_map, primes, &NumberInWords);
+//	Print("Prime map 1-100", prime_map);
+	INTSET(pmkeys);
+	UnionKeys<TInt,TTestName>(pmkeys, prime_map);
+	NAMESET(pmval);
+	NAMESET(pmval2);
+	UnionValues<TInt,TTestName>(pmval, prime_map);
+	CheckIdentical(pmkeys, primes);
+	INTSET(pr2);
+	UnionMap<TTestName,TInt>(pr2, pmval, from_words);
+	CheckIdentical(pr2, primes);
+	pr2.Close();
+	Union(pmval2, pmval);
+//	Print("pmval",pmval);
+//	Print("pmval2",pmval2);
+	CheckIdentical(pmval2, pmval);
+	UnionMap<TTestName,TInt>(pr2, pmval2, from_words);
+	CheckIdentical(pr2, primes);
+
+	pr2.Close();
+	pmval.Close();
+	pmval2.Close();
+	pmkeys.Close();
+	prime_map.Close();
+	primes.Close();
+	all.Close();
+
+	INTSET(m);
+	Populate(all,2,1000,1);
+
+	NAMESET(pr3);
+	NAMESET(nm);
+	UnionMap<TInt,TTestName>(pr3, all, to_words);
+	all.Close();
+	CCheck(pr3);
+
+	Populate(m,4,1000,2);
+	UnionMap<TInt,TTestName>(nm, m, to_words);
+	m.Close();
+	Subtract(pr3, nm);
+	nm.Close();
+
+	Populate(m,6,1000,3);
+	UnionMap<TInt,TTestName>(nm, m, to_words);
+	m.Close();
+	Subtract(pr3, nm);
+	nm.Close();
+
+	Populate(m,10,1000,5);
+	UnionMap<TInt,TTestName>(nm, m, to_words);
+	m.Close();
+	Subtract(pr3, nm);
+	nm.Close();
+
+	Populate(m,14,1000,7);
+	UnionMap<TInt,TTestName>(nm, m, to_words);
+	m.Close();
+	Subtract(pr3, nm);
+	nm.Close();
+
+	Populate(m,22,1000,11);
+	UnionMap<TInt,TTestName>(nm, m, to_words);
+	m.Close();
+	Subtract(pr3, nm);
+	nm.Close();
+
+	Populate(m,26,1000,13);
+	UnionMap<TInt,TTestName>(nm, m, to_words);
+	m.Close();
+	Subtract(pr3, nm);
+	nm.Close();
+
+	Populate(m,34,1000,17);
+	UnionMap<TInt,TTestName>(nm, m, to_words);
+	m.Close();
+	Subtract(pr3, nm);
+	nm.Close();
+
+	Populate(m,38,1000,19);
+	UnionMap<TInt,TTestName>(nm, m, to_words);
+	m.Close();
+	Subtract(pr3, nm);
+	nm.Close();
+
+	Populate(m,46,1000,23);
+	UnionMap<TInt,TTestName>(nm, m, to_words);
+	m.Close();
+	Subtract(pr3, nm);
+	nm.Close();
+
+	Populate(m,58,1000,29);
+	UnionMap<TInt,TTestName>(nm, m, to_words);
+	m.Close();
+	Subtract(pr3, nm);
+	nm.Close();
+
+	Populate(m,62,1000,31);
+	UnionMap<TInt,TTestName>(nm, m, to_words);
+	m.Close();
+	Subtract(pr3, nm);
+	nm.Close();
+
+//	Print("pr3",pr3);
+	PrimeSieve(primes, 1, 1000);
+	UnionMap<TInt,TTestName>(nm, primes, to_words);
+	CheckIdentical(nm, pr3);
+	CCheck(pr3);
+	UnionMap<TTestName,TInt>(m, pr3, from_words);
+	CheckIdentical(m, primes);
+
+	m.Close();
+	nm.Close();
+	primes.Close();
+	pr3.Close();
+	from_words.Close();
+	to_words.Close();
+	}
+
+void PopulateArray8(TInt aMax)
+	{
+	TInt i;
+	for (i=0; i<aMax; ++i)
+		{
+		TTestName n(NumberInWords(i));
+		HBufC8* p = n.Alloc();
+		test(p!=0);
+		TInt r = DesC8Array.Append(p);
+		test(r==KErrNone);
+		}
+	}
+
+void PopulateArray16(TInt aMax)
+	{
+	TInt i;
+	for (i=0; i<aMax; ++i)
+		{
+		TTestName n(NumberInWords(i));
+		TBuf<128> n16;
+		n16.Copy(n);
+		HBufC16* p = n16.Alloc();
+		test(p!=0);
+		TInt r = DesC16Array.Append(p);
+		test(r==KErrNone);
+		}
+	}
+
+TUint32 istrh8(const TDesC8* const & a)
+	{
+	return DefaultHash::Des8(*a);
+	}
+
+TBool istrid8(const TDesC8* const & aA, const TDesC8* const & aB)
+	{
+	return *aA == *aB;
+	}
+
+TUint32 istrh16(const TDesC16* const & a)
+	{
+	return DefaultHash::Des16(*a);
+	}
+
+TBool istrid16(const TDesC16* const & aA, const TDesC16* const & aB)
+	{
+	return *aA == *aB;
+	}
+
+void TestPtrHashSet()
+	{
+	test.Next(_L("Test RPtrHashSet"));
+
+	STRSET8(s);
+	CCheck(s);		// check consistency for empty table
+	RHashMap<const TDesC8*, TInt> hm(&istrh8, &istrid8);
+	RPtrHashSet<TDesC8>::TIter iter(s);
+	const TDesC8* q;
+	TInt i;
+	for (i=0; i<4096; ++i)
+		{
+		TInt r = s.Insert(DesC8Array[i]);
+		test(r==KErrNone);
+		r = hm.Insert(DesC8Array[i], i);
+		test(r==KErrNone);
+		}
+	CCheck(s);
+	for (i=0; i<4100; ++i)
+		{
+		TTestName n(NumberInWords(i));
+		const TDesC8* p = s.Find(n);
+		if (i<4096)
+			{
+			const TDesC8& pp = s.FindL(n);
+			test(p && *p==n && p==DesC8Array[i]);
+			test(&pp == p);
+			}
+		else
+			{
+			test(!p);
+			TRAPD(rr,s.FindL(n));
+			test(rr==KErrNotFound);
+			}
+		}
+	while((q=iter.Next())!=0)
+		{
+		const TInt* qi = hm.Find(q);
+		test(qi!=0 && *qi>=0 && *qi<4096);
+		test(DesC8Array[*qi]==q);
+		}
+	for (i=0; i<4100; i+=2)
+		{
+		TTestName n(NumberInWords(i));
+		TInt r = s.Remove(&n);
+		if (i<4096)
+			test(r==KErrNone);
+		else
+			test(r==KErrNotFound);
+		}
+	test(s.Count()==2048);
+	CCheck(s);
+	for (i=0; i<4100; ++i)
+		{
+		TTestName n(NumberInWords(i));
+		const TDesC8* p = s.Find(n);
+		if (i<4096 && (i&1))
+			test(p && *p==n && p==DesC8Array[i]);
+		else
+			test(!p);
+		}
+	iter.Reset();
+	while((q=iter.Next())!=0)
+		{
+		const TInt* qi = hm.Find(q);
+		test(qi!=0 && *qi>=0 && *qi<4096 && (*qi&1));
+		test(DesC8Array[*qi]==q);
+		}
+	for (i=2; i<4096; i+=4)
+		{
+		TInt r = s.Insert(DesC8Array[i]);
+		test(r==KErrNone);
+		}
+	test(s.Count()==3072);
+	CCheck(s);
+	for (i=0; i<4100; ++i)
+		{
+		TTestName n(NumberInWords(i));
+		const TDesC8* p = s.Find(n);
+		if (i<4096 && (i&3))
+			test(p && *p==n && p==DesC8Array[i]);
+		else
+			test(!p);
+		}
+	iter.Reset();
+	while((q=iter.Next())!=0)
+		{
+		const TInt* qi = hm.Find(q);
+		test(qi!=0 && *qi>=0 && *qi<4096 && (*qi&3));
+		test(DesC8Array[*qi]==q);
+		}
+	s.Close();
+
+	// test ResetAndDestroy
+	for (i=0; i<16; ++i)
+		{
+		TInt r = s.Insert(DesC8Array[i]->Alloc());
+		test(r==KErrNone);
+		}
+	iter.Reset();
+	while((q=iter.Next())!=0)
+		{
+		const TInt* qi = hm.Find(q);
+		test(qi!=0 && *qi>=0 && *qi<16);
+		test(*DesC8Array[*qi]==*q);
+		test(DesC8Array[*qi]!=q);
+		}
+	s.ResetAndDestroy();
+	hm.Close();
+
+
+	STRSET16(S);
+	RHashMap<const TDesC16*, TInt> HM(&istrh16, &istrid16);
+	RPtrHashSet<TDesC16>::TIter ITER(S);
+	const TDesC16* Q;
+	for (i=0; i<4096; ++i)
+		{
+		TInt r = S.Insert(DesC16Array[i]);
+		test(r==KErrNone);
+		r = HM.Insert(DesC16Array[i], i);
+		test(r==KErrNone);
+		}
+	CCheck(S);
+	for (i=0; i<4100; ++i)
+		{
+		TTestName n(NumberInWords(i));
+		TBuf<80> buf;
+		buf.Copy(n);
+		const TDesC16* p = S.Find(buf);
+		if (i<4096)
+			test(p && *p==buf && p==DesC16Array[i]);
+		else
+			test(!p);
+		}
+	while((Q=ITER.Next())!=0)
+		{
+		const TInt* qi = HM.Find(Q);
+		test(qi!=0 && *qi>=0 && *qi<4096);
+		test(DesC16Array[*qi]==Q);
+		}
+	for (i=0; i<4100; i+=2)
+		{
+		TTestName n(NumberInWords(i));
+		TBuf<80> buf;
+		buf.Copy(n);
+		TInt r = S.Remove(&buf);
+		if (i<4096)
+			test(r==KErrNone);
+		else
+			test(r==KErrNotFound);
+		}
+	test(S.Count()==2048);
+	CCheck(S);
+	for (i=0; i<4100; ++i)
+		{
+		TTestName n(NumberInWords(i));
+		TBuf<80> buf;
+		buf.Copy(n);
+		const TDesC16* p = S.Find(buf);
+		if (i<4096 && (i&1))
+			test(p && *p==buf && p==DesC16Array[i]);
+		else
+			test(!p);
+		}
+	ITER.Reset();
+	while((Q=ITER.Next())!=0)
+		{
+		const TInt* qi = HM.Find(Q);
+		test(qi!=0 && *qi>=0 && *qi<4096 && (*qi&1));
+		test(DesC16Array[*qi]==Q);
+		}
+	for (i=2; i<4096; i+=4)
+		{
+		TInt r = S.Insert(DesC16Array[i]);
+		test(r==KErrNone);
+		}
+	test(S.Count()==3072);
+	CCheck(S);
+	for (i=0; i<4100; ++i)
+		{
+		TTestName n(NumberInWords(i));
+		TBuf<80> buf;
+		buf.Copy(n);
+		const TDesC16* p = S.Find(buf);
+		if (i<4096 && (i&3))
+			test(p && *p==buf && p==DesC16Array[i]);
+		else
+			test(!p);
+		}
+	ITER.Reset();
+	while((Q=ITER.Next())!=0)
+		{
+		const TInt* qi = HM.Find(Q);
+		test(qi!=0 && *qi>=0 && *qi<4096 && (*qi&3));
+		test(DesC16Array[*qi]==Q);
+		}
+	S.Close();
+
+	// test ResetAndDestroy
+	for (i=0; i<16; ++i)
+		{
+		TInt r = S.Insert(DesC16Array[i]->Alloc());
+		test(r==KErrNone);
+		}
+	ITER.Reset();
+	while((Q=ITER.Next())!=0)
+		{
+		const TInt* qi = HM.Find(Q);
+		test(qi!=0 && *qi>=0 && *qi<16);
+		test(*DesC16Array[*qi]==*Q);
+		test(DesC16Array[*qi]!=Q);
+		}
+	S.ResetAndDestroy();
+	HM.Close();
+	}
+
+void TestPtrHashMap()
+	{
+	test.Next(_L("Test RPtrHashMap"));
+
+	STRMAP8(map);
+	CCheck(map);		// check consistency for empty table
+	STRMAP8(id);
+	TInt i;
+	for (i=0; i<4096; ++i)
+		{
+		TInt r = map.Insert(DesC8Array[i], DesC8Array[(i+1)&0xfff]);
+		test(r==KErrNone);
+		r = id.Insert(DesC8Array[i], DesC8Array[i]);
+		test(r==KErrNone);
+		}
+	for (i=0; i<4096; ++i)
+		{
+		const TDesC8* p = map.Find(*DesC8Array[i]);
+		test(p == DesC8Array[(i+1)&0xfff]);
+		const TDesC8& pp = map.FindL(*DesC8Array[i]);
+		test(&pp == p);
+		}
+	TRAPD(rr,map.FindL(_L8("two")));
+	test(rr==KErrNone);
+	TRAP(rr,map.FindL(_L8("twx")));
+	test(rr==KErrNotFound);
+	CCheck(map);
+	STRMAP8(map2);
+	STRMAP8(mapi);
+	STRMAP8(map3);
+	UnionInverse<TDesC8,TDesC8>(mapi, map);
+	UnionCompose<TDesC8,TDesC8,TDesC8>(map2, map, map);
+	UnionCompose<TDesC8,TDesC8,TDesC8>(map3, map, mapi);
+	CheckIdenticalMaps<TDesC8,TDesC8>(map3, id);
+	map3.Close();
+	UnionCompose<TDesC8,TDesC8,TDesC8>(map3, map2, mapi);
+	CheckIdenticalMaps<TDesC8,TDesC8>(map3, map);
+	map3.Close();
+	for (i=0; i<4096; ++i)
+		{
+		TInt r = map3.Insert(DesC8Array[i], DesC8Array[(i+2)&0xfff]);
+		test(r==KErrNone);
+		}
+	CheckIdenticalMaps<TDesC8,TDesC8>(map3, map2);
+	map3.Close();
+
+	mapi.Close();
+	map2.Close();
+	id.Close();
+	map.Close();
+
+	// test ResetAndDestroy()
+	for(i=0; i<16; ++i)
+		{
+		TInt r = map.Insert(DesC8Array[i]->Alloc(), DesC8Array[i*i]->Alloc());
+		test(r==KErrNone);
+		}
+	map.ResetAndDestroy();
+	}
+
+void TestOOM()
+	{
+	// Max out memory and check it still works
+	test.Next(_L("Test OOM"));
+
+	TInt x = 0;
+	TInt n = 0;
+	TInt r;
+	INTSET(set);
+	FOREVER
+		{
+		x += 0x58b90bfb;
+		r = set.Insert(x);
+		if (r != KErrNone)
+			break;
+		++n;
+		}
+	test(r==KErrNoMemory);
+	TRAPD(rr,set.InsertL(x));
+	test(rr==KErrNoMemory);
+	test.Printf(_L("%d integers stored\n"), n);
+	test(set.Count()==n);
+	TRAP(rr,set.InsertL(0x58b90bfb));	// already there
+	test(rr==KErrNone);	// should succeed
+
+	// final count should be a power of 2 minus 1
+	test( (n&(n+1)) == 0 );
+
+	x = 0;
+	TInt i;
+	for (i=0; i<=n; ++i)		// check everything has been stored correctly
+		{
+		x += 0x58b90bfb;
+		const TInt* p = set.Find(x);
+		if (i < n)
+			test(p && *p == x);
+		else
+			test(!p);
+		}
+	set.Close();
+	TInt nn;
+	for (nn=256; nn<=n+256; nn+=256)
+		{
+		r = set.Reserve(nn);
+		set.Close();
+		if (r!=KErrNone)
+			break;
+		}
+	test.Printf(_L("Max reserve %d\n"),nn);
+	TInt thresh = 3*((n+1)>>2);
+	test(nn == thresh + 256);
+	}
+
+#ifndef __TOOLS2__
+class RDummyAllocator : public RAllocator
+	{
+public:
+	virtual TAny* Alloc(TInt) {test(0); return 0;}
+	virtual void Free(TAny*) {test(0);}
+	virtual TAny* ReAlloc(TAny*, TInt, TInt) {test(0); return 0;}
+	virtual TInt AllocLen(const TAny*) const  {test(0); return 0;}
+	virtual TInt Compress() {test(0); return 0;}
+	virtual void Reset() {test(0);}
+	virtual TInt AllocSize(TInt&) const  {test(0); return 0;}
+	virtual TInt Available(TInt&) const  {test(0); return 0;}
+	virtual TInt DebugFunction(TInt, TAny*, TAny*) {test(0); return 0;}
+	virtual TInt Extension_(TUint, TAny*&, TAny*) {test(0); return 0;}
+	};
+
+void IntegerBenchmark(TInt aCount, TBool aReserve)
+	{
+	RArray<TInt> array;
+	TUint32 before, after, diff;
+	TInt x=0;
+	TInt i;
+	double avg;
+
+	test.Printf(_L("**** INTEGER BENCHMARKS ***\n"));
+
+	if (!aReserve)
+		{
+		before = User::NTickCount();
+		for (i=0; i<aCount; ++i)
+			{
+			x += 0x58b90bfb;
+			TInt r = array.InsertInOrder(x);
+			test(r==KErrNone);
+			}
+		after = User::NTickCount();
+		diff = after - before;
+		diff *= NanoTickPeriod;
+		avg = (double)diff / (double)aCount;
+		test.Printf(_L("ARRAY:      %d insertions take %dus (%.2gus each)\n"), aCount, diff, avg);
+
+		x=0;
+		before = User::NTickCount();
+		for (i=0; i<aCount; ++i)
+			{
+			x += 0x58b90bfb;
+			TInt r = array.FindInOrder(x);
+			test(r>=0);
+			}
+		after = User::NTickCount();
+		diff = after - before;
+		diff *= NanoTickPeriod;
+		avg = (double)diff / (double)aCount;
+		test.Printf(_L("ARRAY:      %d successful finds take %dus (%.2gus each)\n"), aCount, diff, avg);
+
+		before = User::NTickCount();
+		for (i=0; i<aCount; ++i)
+			{
+			x += 0x58b90bfb;
+			TInt r = array.FindInOrder(x);
+			test(r==KErrNotFound);
+			}
+		after = User::NTickCount();
+		diff = after - before;
+		diff *= NanoTickPeriod;
+		avg = (double)diff / (double)aCount;
+		test.Printf(_L("ARRAY:      %d unsuccessful finds take %dus (%.2gus each)\n"), aCount, diff, avg);
+
+		x=0;
+		before = User::NTickCount();
+		for (i=0; i<aCount; ++i)
+			{
+			x += 0x58b90bfb;
+			TInt r = array.FindInOrder(x);
+			test(r>=0);
+			array.Remove(r);
+			}
+		after = User::NTickCount();
+		diff = after - before;
+		diff *= NanoTickPeriod;
+		avg = (double)diff / (double)aCount;
+		test.Printf(_L("ARRAY:      %d deletions take %dus (%.2gus each)\n"), aCount, diff, avg);
+		array.Close();
+		}
+
+	INTSET(set);
+	x=0;
+	RAllocator* pA = 0;
+	RDummyAllocator da;
+	if (aReserve)
+		{
+		test(set.Reserve(aCount)==KErrNone);
+		pA = User::SwitchAllocator(&da);			// check that no memory accesses occur
+		test(set.Reserve(10)==KErrNone);			// shouldn't need to do anything
+		test(set.Reserve(aCount/2)==KErrNone);		// shouldn't need to do anything
+		test(set.Reserve(aCount)==KErrNone);		// shouldn't need to do anything
+		}
+	before = User::NTickCount();
+	for (i=0; i<aCount; ++i)
+		{
+		x += 0x58b90bfb;
+		TInt r = set.Insert(x);	// we have no heap here so this tests that Reserve() has preallocated sufficient memory
+		test(r==KErrNone);
+		}
+	after = User::NTickCount();
+	diff = after - before;
+	diff *= NanoTickPeriod;
+	avg = (double)diff / (double)aCount;
+	if (aReserve)
+		User::SwitchAllocator(pA);
+	test.Printf(_L("HASH TABLE: %d insertions take %dus (%.2gus each)\n"), aCount, diff, avg);
+
+	x=0;
+	before = User::NTickCount();
+	for (i=0; i<aCount; ++i)
+		{
+		x += 0x58b90bfb;
+		const TInt* p = set.Find(x);
+		test(p!=0);
+		}
+	after = User::NTickCount();
+	diff = after - before;
+	diff *= NanoTickPeriod;
+	avg = (double)diff / (double)aCount;
+	test.Printf(_L("HASH TABLE: %d successful finds take %dus (%.2gus each)\n"), aCount, diff, avg);
+
+	before = User::NTickCount();
+	for (i=0; i<aCount; ++i)
+		{
+		x += 0x58b90bfb;
+		const TInt* p = set.Find(x);
+		test(!p);
+		}
+	after = User::NTickCount();
+	diff = after - before;
+	diff *= NanoTickPeriod;
+	avg = (double)diff / (double)aCount;
+	test.Printf(_L("HASH TABLE: %d unsuccessful finds take %dus (%.2gus each)\n"), aCount, diff, avg);
+
+	x=0;
+	before = User::NTickCount();
+	for (i=0; i<aCount; ++i)
+		{
+		x += 0x58b90bfb;
+		TInt r = set.Remove(x);
+		test(r==KErrNone);
+		}
+	after = User::NTickCount();
+	diff = after - before;
+	diff *= NanoTickPeriod;
+	avg = (double)diff / (double)aCount;
+	test.Printf(_L("HASH TABLE: %d deletions take %dus (%.2gus each)\n"), aCount, diff, avg);
+	set.Close();
+	}
+
+TInt des8order(const TDesC8& aA, const TDesC8& aB)
+	{
+	return aA.Compare(aB);
+	}
+
+void StringBenchmark8(TInt aCount, TBool aReserve)
+	{
+	RPointerArray<TDesC8> array;
+	TUint32 before, after, diff;
+	TInt x=0;
+	TInt i;
+	double avg;
+	const TDesC8** base = (const TDesC8**)&DesC8Array[0];
+	test(base[1331] == DesC8Array[1331]);
+
+	test.Printf(_L("**** 8 BIT STRING BENCHMARKS ***\n"));
+
+	if (!aReserve)
+		{
+		before = User::NTickCount();
+		for (i=0; i<aCount; ++i)
+			{
+			x = (x+4339)&0x3fff;
+			TInt r = array.InsertInOrder(base[x], &des8order);
+			test(r==KErrNone);
+			}
+		after = User::NTickCount();
+		diff = after - before;
+		diff *= NanoTickPeriod;
+		avg = (double)diff / (double)aCount;
+		test.Printf(_L("ARRAY:      %d insertions take %dus (%.2gus each)\n"), aCount, diff, avg);
+
+		x=0;
+		before = User::NTickCount();
+		for (i=0; i<aCount; ++i)
+			{
+			x = (x+4339)&0x3fff;
+			TInt r = array.FindInOrder(base[x], &des8order);
+			test(r>=0);
+			}
+		after = User::NTickCount();
+		diff = after - before;
+		diff *= NanoTickPeriod;
+		avg = (double)diff / (double)aCount;
+		test.Printf(_L("ARRAY:      %d successful finds take %dus (%.2gus each)\n"), aCount, diff, avg);
+
+		before = User::NTickCount();
+		for (i=0; i<aCount; ++i)
+			{
+			x = (x+4339)&0x3fff;
+			TInt r = array.FindInOrder(base[x], &des8order);
+			test(r==KErrNotFound);
+			}
+		after = User::NTickCount();
+		diff = after - before;
+		diff *= NanoTickPeriod;
+		avg = (double)diff / (double)aCount;
+		test.Printf(_L("ARRAY:      %d unsuccessful finds take %dus (%.2gus each)\n"), aCount, diff, avg);
+
+		x=0;
+		before = User::NTickCount();
+		for (i=0; i<aCount; ++i)
+			{
+			x = (x+4339)&0x3fff;
+			TInt r = array.FindInOrder(base[x], &des8order);
+			test(r>=0);
+			array.Remove(r);
+			}
+		after = User::NTickCount();
+		diff = after - before;
+		diff *= NanoTickPeriod;
+		avg = (double)diff / (double)aCount;
+		test.Printf(_L("ARRAY:      %d deletions take %dus (%.2gus each)\n"), aCount, diff, avg);
+		array.Close();
+		}
+
+	STRSET8(set);
+	x=0;
+	if (aReserve)
+		test(set.Reserve(aCount)==KErrNone);
+	before = User::NTickCount();
+	for (i=0; i<aCount; ++i)
+		{
+		x = (x+4339)&0x3fff;
+		TInt r = set.Insert(base[x]);
+		test(r==KErrNone);
+		}
+	after = User::NTickCount();
+	diff = after - before;
+	diff *= NanoTickPeriod;
+	avg = (double)diff / (double)aCount;
+	test.Printf(_L("HASH TABLE: %d insertions take %dus (%.2gus each)\n"), aCount, diff, avg);
+
+	x=0;
+	before = User::NTickCount();
+	for (i=0; i<aCount; ++i)
+		{
+		x = (x+4339)&0x3fff;
+		const TDesC8* p = set.Find(*base[x]);
+		test(p!=0);
+		}
+	after = User::NTickCount();
+	diff = after - before;
+	diff *= NanoTickPeriod;
+	avg = (double)diff / (double)aCount;
+	test.Printf(_L("HASH TABLE: %d successful finds take %dus (%.2gus each)\n"), aCount, diff, avg);
+
+	before = User::NTickCount();
+	for (i=0; i<aCount; ++i)
+		{
+		x = (x+4339)&0x3fff;
+		const TDesC8* p = set.Find(*base[x]);
+		test(!p);
+		}
+	after = User::NTickCount();
+	diff = after - before;
+	diff *= NanoTickPeriod;
+	avg = (double)diff / (double)aCount;
+	test.Printf(_L("HASH TABLE: %d unsuccessful finds take %dus (%.2gus each)\n"), aCount, diff, avg);
+
+	x=0;
+	before = User::NTickCount();
+	for (i=0; i<aCount; ++i)
+		{
+		x = (x+4339)&0x3fff;
+		TInt r = set.Remove(base[x]);
+		test(r==KErrNone);
+		}
+	after = User::NTickCount();
+	diff = after - before;
+	diff *= NanoTickPeriod;
+	avg = (double)diff / (double)aCount;
+	test.Printf(_L("HASH TABLE: %d deletions take %dus (%.2gus each)\n"), aCount, diff, avg);
+	set.Close();
+	}
+
+TInt des16order(const TDesC16& aA, const TDesC16& aB)
+	{
+	return aA.Compare(aB);
+	}
+
+void StringBenchmark16(TInt aCount, TBool aReserve)
+	{
+	RPointerArray<TDesC16> array;
+	TUint32 before, after, diff;
+	TInt x=0;
+	TInt i;
+	double avg;
+	const TDesC16** base = (const TDesC16**)&DesC16Array[0];
+	test(base[1331] == DesC16Array[1331]);
+
+	test.Printf(_L("**** 16 BIT STRING BENCHMARKS ***\n"));
+
+	if (!aReserve)
+		{
+		before = User::NTickCount();
+		for (i=0; i<aCount; ++i)
+			{
+			x = (x+4339)&0x3fff;
+			TInt r = array.InsertInOrder(base[x], &des16order);
+			test(r==KErrNone);
+			}
+		after = User::NTickCount();
+		diff = after - before;
+		diff *= NanoTickPeriod;
+		avg = (double)diff / (double)aCount;
+		test.Printf(_L("ARRAY:      %d insertions take %dus (%.2gus each)\n"), aCount, diff, avg);
+
+		x=0;
+		before = User::NTickCount();
+		for (i=0; i<aCount; ++i)
+			{
+			x = (x+4339)&0x3fff;
+			TInt r = array.FindInOrder(base[x], &des16order);
+			test(r>=0);
+			}
+		after = User::NTickCount();
+		diff = after - before;
+		diff *= NanoTickPeriod;
+		avg = (double)diff / (double)aCount;
+		test.Printf(_L("ARRAY:      %d successful finds take %dus (%.2gus each)\n"), aCount, diff, avg);
+
+		before = User::NTickCount();
+		for (i=0; i<aCount; ++i)
+			{
+			x = (x+4339)&0x3fff;
+			TInt r = array.FindInOrder(base[x], &des16order);
+			test(r==KErrNotFound);
+			}
+		after = User::NTickCount();
+		diff = after - before;
+		diff *= NanoTickPeriod;
+		avg = (double)diff / (double)aCount;
+		test.Printf(_L("ARRAY:      %d unsuccessful finds take %dus (%.2gus each)\n"), aCount, diff, avg);
+
+		x=0;
+		before = User::NTickCount();
+		for (i=0; i<aCount; ++i)
+			{
+			x = (x+4339)&0x3fff;
+			TInt r = array.FindInOrder(base[x], &des16order);
+			test(r>=0);
+			array.Remove(r);
+			}
+		after = User::NTickCount();
+		diff = after - before;
+		diff *= NanoTickPeriod;
+		avg = (double)diff / (double)aCount;
+		test.Printf(_L("ARRAY:      %d deletions take %dus (%.2gus each)\n"), aCount, diff, avg);
+		array.Close();
+		}
+
+	STRSET16(set);
+	x=0;
+	if (aReserve)
+		test(set.Reserve(aCount)==KErrNone);
+	before = User::NTickCount();
+	for (i=0; i<aCount; ++i)
+		{
+		x = (x+4339)&0x3fff;
+		TInt r = set.Insert(base[x]);
+		test(r==KErrNone);
+		}
+	after = User::NTickCount();
+	diff = after - before;
+	diff *= NanoTickPeriod;
+	avg = (double)diff / (double)aCount;
+	test.Printf(_L("HASH TABLE: %d insertions take %dus (%.2gus each)\n"), aCount, diff, avg);
+
+	x=0;
+	before = User::NTickCount();
+	for (i=0; i<aCount; ++i)
+		{
+		x = (x+4339)&0x3fff;
+		const TDesC16* p = set.Find(*base[x]);
+		test(p!=0);
+		}
+	after = User::NTickCount();
+	diff = after - before;
+	diff *= NanoTickPeriod;
+	avg = (double)diff / (double)aCount;
+	test.Printf(_L("HASH TABLE: %d successful finds take %dus (%.2gus each)\n"), aCount, diff, avg);
+
+	before = User::NTickCount();
+	for (i=0; i<aCount; ++i)
+		{
+		x = (x+4339)&0x3fff;
+		const TDesC16* p = set.Find(*base[x]);
+		test(!p);
+		}
+	after = User::NTickCount();
+	diff = after - before;
+	diff *= NanoTickPeriod;
+	avg = (double)diff / (double)aCount;
+	test.Printf(_L("HASH TABLE: %d unsuccessful finds take %dus (%.2gus each)\n"), aCount, diff, avg);
+
+	x=0;
+	before = User::NTickCount();
+	for (i=0; i<aCount; ++i)
+		{
+		x = (x+4339)&0x3fff;
+		TInt r = set.Remove(base[x]);
+		test(r==KErrNone);
+		}
+	after = User::NTickCount();
+	diff = after - before;
+	diff *= NanoTickPeriod;
+	avg = (double)diff / (double)aCount;
+	test.Printf(_L("HASH TABLE: %d deletions take %dus (%.2gus each)\n"), aCount, diff, avg);
+	set.Close();
+	}
+
+void Benchmark()
+	{
+	test.Next(_L("Benchmarks ..."));
+
+	IntegerBenchmark(1000, EFalse);
+	IntegerBenchmark(1000, ETrue);
+	IntegerBenchmark(2000, EFalse);
+	IntegerBenchmark(2000, ETrue);
+	IntegerBenchmark(4000, EFalse);
+	IntegerBenchmark(4000, ETrue);
+	IntegerBenchmark(8000, EFalse);
+	IntegerBenchmark(8000, ETrue);
+	IntegerBenchmark(16000, EFalse);
+	IntegerBenchmark(16000, ETrue);
+	IntegerBenchmark(32000, EFalse);
+	IntegerBenchmark(32000, ETrue);
+
+	PopulateArray8(16384);
+	StringBenchmark8(1000, EFalse);
+	StringBenchmark8(2000, EFalse);
+	StringBenchmark8(4000, EFalse);
+	StringBenchmark8(8000, EFalse);
+	DesC8Array.ResetAndDestroy();
+
+	PopulateArray16(16384);
+	StringBenchmark16(1000, EFalse);
+	StringBenchmark16(2000, EFalse);
+	StringBenchmark16(4000, EFalse);
+	StringBenchmark16(8000, EFalse);
+	DesC16Array.ResetAndDestroy();
+	}
+#endif
+
+TUint32 mp(TUint32 x)
+	{
+	TUint32 x3 = x+(x<<1);
+	TUint32 x7 = x+(x3<<1);
+	TUint32 x15 = x+(x7<<1);
+	TUint32 y = x + (x7<<3) + (x3<<7) + (x15<<11) + (x7<<16) + (x3<<20) + (x15<<25) + (x<<31);
+	return y;
+	}
+
+TUint32 strh(const char* aIn)
+	{
+	TUint32 h = 0;
+	TInt i = 0;
+	while (*aIn)
+		{
+		if (i==0)
+			h = mp(h);
+		TUint32 c = *aIn++;
+		c <<= (8*i);
+		h ^= c;
+		i = (i+1)&3;
+		}
+	return mp(h);
+	}
+
+TUint32 strh(const wch* aIn)
+	{
+	TUint32 h = 0;
+	TInt i = 0;
+	while (*aIn)
+		{
+		if (i==0)
+			h = mp(h);
+		TUint32 c = *aIn++;
+		switch (i)
+			{
+			case 0:		break;
+			case 1:		c<<=16; break;
+			case 2:		c<<=8; break;
+			default:	c=(c<<24)|(c>>8); break;
+			};
+		h ^= c;
+		i = (i+1)&3;
+		}
+	return mp(h);
+	}
+
+void TestHash(TInt* aIn, TUint32 aExpected)
+	{
+	THashFunction32<TInt*> hf(&DefaultHash::IntegerPtr);
+	TUint32 out = hf.Hash(aIn);
+	test(aExpected == mp((TUint32)aIn));
+	if (out != aExpected)
+		{
+		test.Printf(_L("Hashing %08x Expected %08x Got %08x\n"), aIn, aExpected, out);
+		test(0);
+		}
+	}
+
+void TestHash(TDesC8* aIn, TUint32 aExpected)
+	{
+	THashFunction32<TDesC8*> hf(&DefaultHash::Des8Ptr);
+	TUint32 out = hf.Hash(aIn);
+	test(aExpected == mp((TUint32)aIn));
+	if (out != aExpected)
+		{
+		test.Printf(_L("Hashing %08x Expected %08x Got %08x\n"), aIn, aExpected, out);
+		test(0);
+		}
+	}
+
+void TestHash(TDesC16* aIn, TUint32 aExpected)
+	{
+	THashFunction32<TDesC16*> hf(&DefaultHash::Des16Ptr);
+	TUint32 out = hf.Hash(aIn);
+	test(aExpected == mp((TUint32)aIn));
+	if (out != aExpected)
+		{
+		test.Printf(_L("Hashing %08x Expected %08x Got %08x\n"), aIn, aExpected, out);
+		test(0);
+		}
+	}
+
+
+void TestHash(TInt aIn, TUint32 aExpected)
+	{
+	THashFunction32<TInt> hf(&DefaultHash::Integer);
+	TUint32 out = hf.Hash(aIn);
+	test(aExpected == mp((TUint32)aIn));
+	if (out != aExpected)
+		{
+		test.Printf(_L("Hashing %08x Expected %08x Got %08x\n"), aIn, aExpected, out);
+		test(0);
+		}
+	}
+
+void TestHash(const char* aIn, TUint32 aExpected)
+	{
+	THashFunction32<TDesC8> hf(&DefaultHash::Des8);
+	TPtrC8 p((const TUint8*)aIn);
+	TUint32 out = hf.Hash(p);
+	test(aExpected == strh(aIn));
+	if (out != aExpected)
+		{
+		TBuf<256> buf;
+		buf.Copy(p);
+		test.Printf(_L("Hashing %S (len %d) Expected %08x Got %08x\n"), &buf, p.Length(), aExpected, out);
+		test(0);
+		}
+	}
+
+void TestHash(const wch* aIn)
+	{
+	THashFunction32<TDesC16> hf(&DefaultHash::Des16);
+	TPtrC16 p((const TUint16*)aIn);
+	TUint32 out = hf.Hash(p);
+	TUint32 exp = strh(aIn);
+	if (out != exp)
+		{
+		test.Printf(_L("Hashing %S (len %d) Expected %08x Got %08x\n"), &p, p.Size(), exp, out);
+		test(0);
+		}
+	}
+
+void TestHash()
+	{
+	test.Next(_L("Test integer hash"));
+	TestHash(1,0x9e3779b9);
+	TestHash(2,0x3c6ef372);
+	TestHash(4,0x78dde6e4);
+	TestHash(8,0xf1bbcdc8);
+	TestHash(16,0xe3779b90);
+	TestHash(0xc90fdaa2,0xbf999112);
+	TestHash(0xb504f334,0x7fb35494);
+	TestHash(0xddb3d743,0xd11a3a6b);
+	TestHash(0xadf85458,0x873a8b98);
+	TestHash(0x11730859,0xb4321951);
+	TestHash(0x64636261,0x8628f119);
+	}
+
+void TestIntegerPtrHash()
+	{
+	TInt i[5];
+	TInt* ptr;
+	test.Next(_L("Test Integer pointer hash"));
+	for (ptr=i; ptr<i+5; ptr++)
+		{
+		TestHash(ptr, DefaultHash::IntegerPtr(ptr));
+		}
+	}
+
+void TestDes8PtrHash()
+	{
+	TBuf8<8> i[5];
+	TDesC8* ptr;
+	test.Next(_L("Test Des8 pointer hash"));
+	for (ptr=i; ptr<i+5; ptr++)
+		{
+		TestHash(ptr, DefaultHash::Des8Ptr(ptr));
+		}
+	}
+
+void TestDes16PtrHash()
+	{
+	TBuf16<8> i[5];
+	TDesC16* ptr;
+	test.Next(_L("Test Des16 pointer hash"));
+	for (ptr=i; ptr<i+5; ptr++)
+		{
+		TestHash(ptr, DefaultHash::Des16Ptr(ptr));
+		}
+	}
+
+const char teststr[] = "zyxwvutsrq";
+void TestStringHash()
+	{
+	test.Next(_L("Test 8 bit string hash"));
+	TestHash("",0x0);
+	TestHash("a",0xf3051f19);
+	TestHash("b",0x913c98d2);
+	TestHash("ab",0x2f9df119);
+	TestHash("ba",0x965bb1d2);
+	TestHash("abc",0x4228f119);
+	TestHash("abcd",0x8628f119);
+	TestHash("abcde",0xb75e1e9c);
+	TestHash("abcdef",0x3693149c);
+	TestHash("abcdefg",0xc1c2149c);
+	TestHash("abcdefgh",0xe9c2149c);
+	TestHash("abcdefghi",0x5fcbf20d);
+	TestHash("abcdefghj",0xfe036bc6);
+
+	TestHash(teststr, 0x108ca51e);
+	TestHash(teststr+1, 0x551002ad);
+	TestHash(teststr+2, 0x37dc0d6c);
+	TestHash(teststr+3, 0x2937f92c);
+	TestHash(teststr+4, 0xf0818a94);
+	TestHash(teststr+5, 0xb1b25f1c);
+	TestHash(teststr+6, 0x7a3342d4);
+	TestHash(teststr+7, 0x81c9101b);
+	TestHash(teststr+8, 0xf16edd62);
+	TestHash(teststr+9, 0xd67cbaa9);
+	TestHash(teststr+10, 0);
+
+	char t[16];
+	int i,j;
+	for (i=0; i<=4; ++i)
+		{
+		for (j=0; j<=10; ++j)
+			{
+			const char* s = teststr + j;
+			int l = User::StringLength((const TUint8*)s);
+			memset(t, 0xbb, 16);
+			memcpy(t+i, s, l+1);
+			TUint32 h;
+			switch (j)
+				{
+				case 0: h = 0x108ca51e; break;
+				case 1: h = 0x551002ad; break;
+				case 2: h = 0x37dc0d6c; break;
+				case 3: h = 0x2937f92c; break;
+				case 4: h = 0xf0818a94; break;
+				case 5: h = 0xb1b25f1c; break;
+				case 6: h = 0x7a3342d4; break;
+				case 7: h = 0x81c9101b; break;
+				case 8: h = 0xf16edd62; break;
+				case 9: h = 0xd67cbaa9; break;
+				default: h = 0; break;
+				};
+			TestHash(t+i, h);
+			}
+		}
+	}
+
+const wch wteststr[] = L"zyxwvutsrq";
+void TestWStringHash()
+	{
+	test.Next(_L("Test 16 bit string hash"));
+	TestHash(L"");
+	TestHash(L"a");
+	TestHash(L"b");
+	TestHash(L"ab");
+	TestHash(L"ba");
+	TestHash(L"abc");
+	TestHash(L"abcd");
+	TestHash(L"abcde");
+	TestHash(L"abcdef");
+	TestHash(L"abcdefg");
+	TestHash(L"abcdefgh");
+	TestHash(L"abcdefghi");
+	TestHash(L"abcdefghj");
+
+	TestHash(wteststr);
+	TestHash(wteststr+1);
+	TestHash(wteststr+2);
+	TestHash(wteststr+3);
+	TestHash(wteststr+4);
+	TestHash(wteststr+5);
+	TestHash(wteststr+6);
+	TestHash(wteststr+7);
+	TestHash(wteststr+8);
+	TestHash(wteststr+9);
+	TestHash(wteststr+10);
+
+	wch t[16];
+	int i,j;
+	for (i=0; i<=4; ++i)
+		{
+		for (j=0; j<=10; ++j)
+			{
+			const wch* s = wteststr + j;
+			int l = User::StringLength((const TUint16*)s);
+			memset(t, 0xbb, 2*16);
+			memcpy(t+i, s, 2*(l+1));
+			TestHash(t+i);
+			}
+		}
+	}
+template <class K,class V> 
+void TestHashMapPtr(RHashMap<K,V> &map, K ptr, V* i)
+{
+	test(map.Reserve(5) == KErrNone);
+	for (ptr=i;ptr<i+5;ptr++)
+		{
+		test(map.Insert(ptr,*ptr) == KErrNone);
+		}
+	for (ptr=i+4;ptr>=i;ptr--)
+		{
+		test(*(map.Find(ptr)) == *ptr);
+		}
+	test(map.Count() == 5);
+	test(map.Remove(i) == KErrNone);
+	test(map.Count()==4);
+	test(map.Find(i)==NULL);
+	map.Close();
+}
+
+void TestPtrHashMaps()
+	{	
+
+	test.Next(_L("Test RHashMap of default pointer types"));
+	TInt i[5];
+	TInt *ptr=i;
+	RHashMap<TInt*,TInt> mp;
+	TestHashMapPtr(mp, ptr, i);
+
+	TInt32 i1[5];
+	TInt32 *ptr1=i1;
+	RHashMap<TInt32*,TInt32> mp1;
+	TestHashMapPtr(mp1,ptr1,i1);
+	
+	TUint i2[5];
+	TUint *ptr2=i2;
+	RHashMap<TUint*,TUint> mp2;
+	TestHashMapPtr(mp2,ptr2,i2);
+
+	TUint32 i3[5];
+	TUint32 *ptr3=i3;
+	RHashMap<TUint32*,TUint32> mp3;
+	TestHashMapPtr(mp3,ptr3,i3);
+
+	TBuf8<5> i4[5];
+	TBuf8<5> *ptr4=i4;
+	RHashMap<TDesC8*,TDesC8> mp4;
+	for (ptr4=i4; ptr4 < i4+5; ptr4++) 
+		{
+		test(mp4.Insert(ptr4,*ptr4) == KErrNone);
+		}
+	for (ptr4=i4+4; ptr4 >= i4; ptr4--) 
+		{
+		test(*(mp4.Find(ptr4)) == *ptr4);
+		}
+	test(mp4.Count()==5);
+	test(mp4.Remove(i4) == KErrNone);
+	test(mp4.Find(i4) == NULL);
+	test(mp4.Count()==4);
+	mp4.Close();
+
+
+	TBuf16<5> i5[5];
+	TBuf16<5> *ptr5=i5;
+	RHashMap<TDesC16*,TDesC16> mp5;
+	for (ptr5=i5; ptr5 < i5+5; ptr5++) 
+		{
+		test(mp5.Insert(ptr5,*ptr5) == KErrNone);
+		}
+	for (ptr5=i5+4; ptr5 >= i5; ptr5--) 
+		{
+		test(*(mp5.Find(ptr5)) == *ptr5);
+		}
+	test(mp5.Count()==5);
+	test(mp5.Remove(i5) == KErrNone);
+	test(mp5.Find(i5) == NULL);
+	test(mp5.Count()==4);
+	mp5.Close();
+	
+}
+
+/** Tests that Reserve() will always allocate memory for new tables 
+	even for small reserve sizes
+	See DEF087906.
+*/
+#ifndef __TOOLS2__
+void TestSmallReserve()
+	{
+	test.Next(_L("Test RHashTableBase::Reserve preallocates memory, even for small no of elements"));
+	RAllocator* pA = 0;
+	RDummyAllocator da;
+	
+	// Reserve should allocate the memory required for the table of 1 element
+	INTSET(set);
+	RHashMap<TInt,TInt> hashMap;
+	
+	test(set.Reserve(1) == KErrNone);
+	test(hashMap.Reserve(1) == KErrNone);
+	
+	pA = User::SwitchAllocator(&da);
+	
+	// No more memory should be allocated for the table as it should
+	// have been already allocated by Reserve()
+	test(set.Insert(123) == KErrNone);
+	test(hashMap.Insert(123,456) == KErrNone);
+	
+	// Switch back to allow set to be closed
+	User::SwitchAllocator(pA);
+	set.Close();
+	hashMap.Close();
+	}
+#endif	
+
+TInt E32Main()
+	{
+	test.Title();
+
+#ifndef __TOOLS2__
+	test(HAL::Get(HAL::ENanoTickPeriod, NanoTickPeriod)==KErrNone);
+	test.Printf(_L("NanoTickPeriod %dus\n"), NanoTickPeriod);
+#endif
+
+	__UHEAP_MARK;
+
+	test.Start(_L("Testing hash tables"));
+
+	TestHash();
+	TestStringHash();
+	TestWStringHash();
+	TestIntegerPtrHash();
+	TestDes8PtrHash();
+	TestDes16PtrHash();
+
+	TestHashSet();
+	TestHashIter();
+	TestHashMap();
+	TestPtrHashMaps();
+
+	PopulateArray8(4096);
+	PopulateArray16(4096);
+	TestPtrHashSet();
+	TestPtrHashMap();
+	DesC16Array.ResetAndDestroy();
+	DesC8Array.ResetAndDestroy();
+
+
+#ifndef __TOOLS2__
+	TestOOM();
+	Benchmark();
+	TestSmallReserve();
+#endif
+
+	test.End();
+
+	__UHEAP_MARKEND;
+	return 0;
+	}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32test/buffer/t_huff.cpp	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,995 @@
+// Copyright (c) 2004-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32test/buffer/t_huff.cpp
+// Overview:
+// Test methods of the Huffman, TBitInput and TBitOutput classes.
+// API Information:
+// Huffman, TBitInput, TBitOutput
+// Details:
+// - Test and verify the results of TBitInput bit reading:
+// - test and verify single bit reads, multiple bit reads and 32-bit reads
+// - test and verify single bit reads and multiple bit reads from a 
+// fractured input.
+// - test and verify overrun reads
+// - Test and verify the results of TBitOutput bit writing:
+// - test and verify bitstream padding
+// - test and verify single bit and multiple bit writes
+// - test and verify overflow writes
+// - Test and verify the results of a Huffman decoder using Huffman class 
+// static methods, TBitOutput and TBitInput objects.
+// - Test and verify the results of a Huffman generator for known distributions:
+// flat, power-of-2 and Fibonacci.
+// - Test and verify the results of a Huffman generator for random distributions:
+// - generate random frequency distributions and verify:
+// (a) the Huffman generator creates a mathematically 'optimal code'
+// (b) the canonical encoding is canonical
+// (c) the decoding tree correctly decodes each code
+// (d) the encoding can be correctly externalised and internalised
+// Platforms/Drives/Compatibility:
+// All 
+// Assumptions/Requirement/Pre-requisites:
+// Failures and causes:
+// Base Port information:
+// 
+//
+
+#include <e32test.h>
+#include <e32math.h>
+#include <e32huffman.h>
+
+RTest test(_L("T_HUFF"));
+
+const Uint64 KTestData=UI64LIT(0x6f1b09a7e8c523d4);
+const TUint8 KTestBuffer[] = {0x6f,0x1b,0x09,0xa7,0xe8,0xc5,0x23,0xd4};
+const TInt KTestBytes=sizeof(KTestBuffer);
+const TInt KTestBits=KTestBytes*8;
+
+// Input stream: bit and multi-bit read tests with exhsautive buffer reload testing
+
+typedef TBool (*TestFn)(TBitInput& aIn, Uint64 aBits, TInt aCount);
+
+class TAlignedBitInput : public TBitInput
+	{
+public:
+	TAlignedBitInput(const TUint8*,TInt,TInt);
+private:
+	void UnderflowL();
+private:
+	const TUint8* iRemainder;
+	TInt iCount;
+	};
+
+TAlignedBitInput::TAlignedBitInput(const TUint8* aPtr,TInt aCount,TInt aOffset)
+	:TBitInput(aPtr,32-aOffset,aOffset), iRemainder(aPtr+4), iCount(aOffset+aCount-32)
+	{}
+
+void TAlignedBitInput::UnderflowL()
+	{
+	if (!iRemainder)
+		User::Leave(KErrUnderflow);
+	else
+		{
+		Set(iRemainder,iCount);
+		iRemainder=0;
+		}
+	}
+
+class TSplitBitInput : public TBitInput
+	{
+public:
+	TSplitBitInput(const TUint8*,TInt,TInt,TInt);
+private:
+	void UnderflowL();
+private:
+	const TUint8* iBase;
+	TInt iBlockSize;
+	TInt iOffset;
+	TInt iAvail;
+	};
+
+TSplitBitInput::TSplitBitInput(const TUint8* aPtr,TInt aLength,TInt aOffset,TInt aSize)
+	:TBitInput(aPtr,aSize,aOffset), iBase(aPtr), iBlockSize(aSize), iOffset(aOffset+aSize), iAvail(aLength-aSize)
+	{}
+
+void TSplitBitInput::UnderflowL()
+	{
+	TInt len=Min(iBlockSize,iAvail);
+	if (len==0)
+		User::Leave(KErrUnderflow);
+	Set(iBase,len,iOffset);
+	iOffset+=len;
+	iAvail-=len;
+	}
+
+class TAlternateBitInput : public TBitInput
+	{
+public:
+	TAlternateBitInput(const TUint8*,TInt,TInt);
+private:
+	void UnderflowL();
+private:
+	const TUint8* iBase;
+	TInt iOffset;
+	TInt iAvail;
+	};
+
+TAlternateBitInput::TAlternateBitInput(const TUint8* aPtr,TInt aLength,TInt aOffset)
+	:TBitInput(aPtr,1,aOffset), iBase(aPtr), iOffset(aOffset+2), iAvail(aLength-2)
+	{}
+
+void TAlternateBitInput::UnderflowL()
+	{
+	if (iAvail<=0)
+		User::Leave(KErrUnderflow);
+	Set(iBase,1,iOffset);
+	iOffset+=2;
+	iAvail-=2;
+	}
+
+void TestReader(TBitInput& aIn, TestFn aFunc, Uint64 aBits, TInt aCount)
+	{
+	TBool eof=EFalse;
+	TRAPD(r,eof=aFunc(aIn,aBits,aCount));
+	test (r==KErrNone);
+	if (eof)
+		{
+		TRAP(r,aIn.ReadL());
+		test (r==KErrUnderflow);
+		}
+	}
+
+void TestBits(TInt aOffset, TInt aCount, TestFn aFunc)
+	{
+	Uint64 bits=KTestData;
+	if (aOffset)
+		bits<<=aOffset;
+	if (aCount<64)
+		bits&=~((Uint64(1)<<(64-aCount))-1);
+	// test with direct input
+	TBitInput in1(KTestBuffer,aCount,aOffset);
+	TestReader(in1,aFunc,bits,aCount);
+	// test with aligned input
+	if (aOffset<32 && aOffset+aCount>32)
+		{
+		TAlignedBitInput in2(KTestBuffer,aCount,aOffset);
+		TestReader(in2,aFunc,bits,aCount);
+		}
+	// test with blocked input
+	for (TInt block=aCount;--block>0;)
+		{
+		TSplitBitInput in3(KTestBuffer,aCount,aOffset,block);
+		TestReader(in3,aFunc,bits,aCount);
+		}
+	}
+
+void TestAlternateBits(TInt aOffset, TInt aCount, TestFn aFunc)
+	{
+	Uint64 bits=0;
+	TInt c=0;
+	for (TInt ix=aOffset;ix<aOffset+aCount;ix+=2)
+		{
+		if (KTestData<<ix>>63)
+			bits|=Uint64(1)<<(63-c);
+		++c;
+		}
+	// test with alternate input
+	TAlternateBitInput in1(KTestBuffer,aCount,aOffset);
+	TestReader(in1,aFunc,bits,c);
+	}
+
+void PermBits(TestFn aFunc, TInt aMinCount=1, TInt aMaxCount=64)
+	{
+	for (TInt offset=0;offset<KTestBits;++offset)
+		for (TInt count=Min(KTestBits-offset,aMaxCount);count>=aMinCount;--count)
+			TestBits(offset,count,aFunc);
+	}
+
+void AlternateBits(TestFn aFunc, TInt aMinCount=1)
+	{
+	for (TInt offset=0;offset<KTestBits;++offset)
+		for (TInt count=KTestBits-offset;count>=aMinCount;--count)
+			TestAlternateBits(offset,count,aFunc);
+	}
+
+TBool SingleBitRead(TBitInput& aIn, Uint64 aBits, TInt aCount)
+	{
+	while (--aCount>=0)
+		{
+		test (aIn.ReadL() == (aBits>>63));
+		aBits<<=1;
+		}
+	return ETrue;
+	}
+
+TBool MultiBitRead(TBitInput& aIn, Uint64 aBits, TInt aCount)
+	{
+	TInt c=aCount/2;
+	TUint v=aIn.ReadL(c);
+	if (c==0)
+		test (v==0);
+	else
+		{
+		test (v==TUint(aBits>>(64-c)));
+		aBits<<=c;
+		}
+	c=aCount-c;
+	v=aIn.ReadL(c);
+	if (c==0)
+		test (v==0);
+	else
+		test (v==TUint(aBits>>(64-c)));
+	return ETrue;
+	}
+
+TBool LongShortRead(TBitInput& aIn, Uint64 aBits, TInt aCount)
+	{
+	TUint v=aIn.ReadL(32);
+	test (v==TUint(aBits>>32));
+	aBits<<=32;
+	TInt c=aCount-32;
+	v=aIn.ReadL(c);
+	if (c==0)
+		test (v==0);
+	else
+		test (v==TUint(aBits>>(64-c)));
+	return ETrue;
+	}
+
+TBool ShortLongRead(TBitInput& aIn, Uint64 aBits, TInt aCount)
+	{
+	TInt c=aCount-32;
+	TUint v=aIn.ReadL(c);
+	if (c==0)
+		test (v==0);
+	else
+		{
+		test (v==TUint(aBits>>(64-c)));
+		aBits<<=c;
+		}
+	v=aIn.ReadL(32);
+	test (v==TUint(aBits>>32));
+	return ETrue;
+	}
+
+TBool EofRead(TBitInput& aIn, Uint64, TInt aCount)
+	{
+	TRAPD(r,aIn.ReadL(aCount+1));
+	test(r==KErrUnderflow);
+	return EFalse;
+	}
+
+void TestBitReading()
+	{
+	test.Start(_L("Test single bit reads"));
+	PermBits(&SingleBitRead);
+	test.Next(_L("Test multi bit reads"));
+	PermBits(&MultiBitRead);
+	test.Next(_L("Test 32-bit reads"));
+	PermBits(&LongShortRead,32);
+	PermBits(&ShortLongRead,32);
+	test.Next(_L("Test single bit reads (fractured input)"));
+	AlternateBits(&SingleBitRead);
+	test.Next(_L("Test multi bit reads (fractured input)"));
+	AlternateBits(&MultiBitRead);
+	test.Next(_L("Test overrun reads"));
+	PermBits(&EofRead,1,31);
+	test.End();
+	}
+
+// Bit output testing (assumes bit input is correct)
+
+void TestPadding()
+	{
+	TUint8 buffer[4];
+	TBitOutput out(buffer,4);
+	test(out.Ptr()==buffer);
+	test(out.BufferedBits()==0);
+	out.PadL(0);
+	test(out.Ptr()==buffer);
+	test(out.BufferedBits()==0);
+	out.WriteL(0,0);
+	out.PadL(0);
+	test(out.Ptr()==buffer);
+	test(out.BufferedBits()==0);
+
+	TInt i;
+	for (i=1;i<=8;++i)
+		{
+		out.Set(buffer,4);
+		out.WriteL(0,i);
+		test(out.BufferedBits()==(i%8));
+		out.PadL(1);
+		test(out.BufferedBits()==0);
+		out.WriteL(0,i);
+		test(out.BufferedBits()==(i%8));
+		out.PadL(1);
+		test(out.BufferedBits()==0);
+		test (out.Ptr()==buffer+2);
+		test (buffer[0]==(0xff>>i));
+		test (buffer[1]==(0xff>>i));
+		}
+
+	for (i=1;i<=8;++i)
+		{
+		out.Set(buffer,4);
+		out.WriteL(0xff,i);
+		out.PadL(0);
+		test (out.Ptr()==buffer+1);
+		test (buffer[0]==(0xff^(0xff>>i)));
+		}
+	}
+
+void TestBitWrites()
+	{
+	TUint8 buffer[KTestBytes];
+	TBitOutput out(buffer,KTestBytes);
+	TBitInput in(KTestBuffer,KTestBits);
+	TInt i;
+	for (i=KTestBits;--i>=0;)
+		out.WriteL(in.ReadL(),1);
+	test (Mem::Compare(buffer,KTestBytes,KTestBuffer,KTestBytes)==0);	
+
+	Mem::FillZ(buffer,KTestBytes);
+	out.Set(buffer,KTestBytes);
+	Uint64 bits=KTestData;
+	for (i=KTestBits;--i>=0;)
+		out.WriteL(TUint(bits>>i),1);
+	test (Mem::Compare(buffer,KTestBytes,KTestBuffer,KTestBytes)==0);
+	}
+
+void TestMultiBitWrites()
+	{
+	TInt i=0;
+	for (TInt j=0;j<32;++j)
+		for (TInt k=0;k<32;++k)
+			{
+			++i;
+			if (i+j+k>KTestBits)
+				i=0;
+			TUint8 buffer[KTestBytes];
+			TBitInput in(KTestBuffer,KTestBits);
+			TBitOutput out(buffer,KTestBytes);
+			in.ReadL(i);
+			out.WriteL(in.ReadL(j),j);
+			out.WriteL(in.ReadL(k),k);
+			out.PadL(0);
+			const TUint8* p=out.Ptr();
+			test (p-buffer == (j+k+7)/8);
+			Uint64 v=0;
+			while (p>buffer)
+				v=(v>>8) | Uint64(*--p)<<56;
+			Uint64 res=KTestData;
+			if (i+j+k<KTestBits)
+				res>>=KTestBits-i-j-k;
+			if (j+k<KTestBits)
+				res<<=KTestBits-j-k;
+			test (v==res);
+			}
+	}
+
+void TestAlternatingWrites()
+	{
+	const TInt KBufferSize=(1+32)*32;
+	TUint8 buffer[(7+KBufferSize)/8];
+	TBitOutput out(buffer,sizeof(buffer));
+	TInt i;
+	for (i=0;i<=32;++i)
+		out.WriteL(i&1?0xffffffff:0,i);
+	while (--i>=0)
+		out.WriteL(i&1?0:0xffffffff,i);
+	out.PadL(0);
+	TBitInput in(buffer,KBufferSize);
+	for (i=0;i<=32;++i)
+		{
+		TUint v=in.ReadL(i);
+		if (i&1)
+			test (v == (1u<<i)-1u);
+		else
+			test (v == 0);
+		}
+	while (--i>=0)
+		{
+		TUint v=in.ReadL(i);
+		if (i&1)
+			test (v == 0);
+		else if (i==32)
+			test (v == 0xffffffffu);
+		else
+			test (v == (1u<<i)-1u);
+		}
+	}
+
+class TOverflowOutput : public TBitOutput
+	{
+public:
+	TOverflowOutput();
+private:
+	void OverflowL();
+private:
+	TUint8 iBuf[1];
+	TInt iIx;
+	};
+
+TOverflowOutput::TOverflowOutput()
+	:iIx(0)
+	{}
+
+void TOverflowOutput::OverflowL()
+	{
+	if (Ptr()!=0)
+		{
+		test (Ptr()-iBuf == 1);
+		test (iBuf[0] == KTestBuffer[iIx]);
+		if (++iIx==KTestBytes)
+			User::Leave(KErrOverflow);
+		}
+	Set(iBuf,1);
+	}
+
+void OverflowTestL(TBitOutput& out, TInt j)
+	{
+	for (;;) out.WriteL(0xffffffffu,j);
+	}
+
+void TestOverflow()
+	{
+	test.Start(_L("Test default constructed output"));
+	TBitOutput out;
+	TInt i;
+	for (i=1;i<=8;++i)
+		{
+		TRAPD(r,out.WriteL(1,1));
+		if (i<8)
+			{
+			test (out.BufferedBits() == i);
+			test (r == KErrNone);
+			}
+		else
+			test (r == KErrOverflow);
+		}
+
+	test.Next(_L("Test overflow does not overrun the buffer"));
+	i=0;
+	for (TInt j=1;j<=32;++j)
+		{
+		if (++i>KTestBytes)
+			i=1;
+		TUint8 buffer[KTestBytes+1];
+		Mem::FillZ(buffer,sizeof(buffer));
+		out.Set(buffer,i);
+		TRAPD(r,OverflowTestL(out,j));
+		test (r == KErrOverflow);
+		TInt k=0;
+		while (buffer[k]==0xff)
+			{
+			++k;
+			test (k<TInt(sizeof(buffer)));
+			}
+		test (k <= i);
+		test ((i-k)*8 < j);
+		while (k<TInt(sizeof(buffer)))
+			{
+			test (buffer[k]==0);
+			++k;
+			}
+		}
+
+	test.Next(_L("Test overflow handler"));
+	TOverflowOutput vout;
+	TBitInput in(KTestBuffer,KTestBits);
+	for (i=KTestBits;--i>=0;)
+		vout.WriteL(in.ReadL(),1);
+	test(vout.BufferedBits() == 0);
+	TRAPD(r,vout.WriteL(0,1));
+	test (r == KErrNone);
+	TRAP(r,vout.PadL(0));
+	test (r == KErrOverflow);
+	test.End();
+	}
+
+void TestBitWriting()
+	{
+	test.Start(_L("Test padding"));
+	TestPadding();
+	test.Next(_L("Test bit writes"));
+	TestBitWrites();
+	test.Next(_L("Test multi-bit writes"));
+	TestMultiBitWrites();
+	TestAlternatingWrites();
+	test.Next(_L("Test overflow writes"));
+	TestOverflow();
+	test.End();
+	}
+
+// Huffman decode testing
+#ifdef __ARMCC__
+#pragma Onoinline
+#endif
+void Dummy(volatile TInt & /*x*/)
+        {
+	}
+
+void TestHuffmanL()
+	{
+	const TInt KTestBits=32*32;
+
+	// build the huffman decoding tree for
+	// 0: '0'
+	// 1: '10'
+	// 2: '110' etc
+	TUint32 huffman[Huffman::KMaxCodeLength+1];
+	TInt i;
+	for (i=0;i<Huffman::KMaxCodeLength;++i)
+		huffman[i]=i+1;
+	huffman[Huffman::KMaxCodeLength]=Huffman::KMaxCodeLength;
+	Huffman::Decoding(huffman,Huffman::KMaxCodeLength+1,huffman);
+
+	TUint8 buffer[KTestBits/8];
+	for (TInt sz=0;sz<Huffman::KMaxCodeLength;++sz)
+		{
+		const TInt rep=KTestBits/(sz+1);
+		TBitOutput out(buffer,sizeof(buffer));
+		for (i=0;i<rep;++i)
+			{
+			out.WriteL(0xffffffff,sz);
+			out.WriteL(0,1);
+			}
+		out.PadL(1);
+		for (TInt blk=1;blk<=64;++blk)
+			{
+			TSplitBitInput in(buffer,rep*(sz+1)-1,0,blk);
+			for (i=0;i<rep-1;++i)
+				{
+				TInt v=-1;
+				TRAPD(r,v=in.HuffmanL(huffman));
+				test (r==KErrNone);
+				test (sz==v);
+				}
+			volatile TInt v=-1;
+		        Dummy(v);
+			TRAPD(r, v=in.HuffmanL(huffman));
+			test (v==-1);
+			test (r==KErrUnderflow);
+			}
+		}
+	}
+
+// Huffman generator testing with known but atypical distributions
+
+void FlatHuffman(TInt aMaxCount)
+	{
+	TUint32* tab=new TUint32[aMaxCount];
+	test (tab!=NULL);
+
+	// test empty distribution
+	Mem::FillZ(tab,sizeof(TUint32)*aMaxCount);
+	TRAPD(r, Huffman::HuffmanL(tab,aMaxCount,tab));
+	test (r==KErrNone);
+	TInt i;
+	for (i=0;i<aMaxCount;++i)
+		test (tab[i]==0);
+	Huffman::Decoding(tab,aMaxCount,tab);
+
+	// test single-symbol distribution
+	Mem::FillZ(tab,sizeof(TUint32)*aMaxCount);
+	tab[0]=100;
+	TRAP(r, Huffman::HuffmanL(tab,aMaxCount,tab));
+	test (r==KErrNone);
+	test (tab[0]==1);
+	for (i=1;i<aMaxCount;++i)
+		test (tab[i]==0);
+	Huffman::Decoding(tab,aMaxCount,tab,200);
+	TUint8 bits=0;
+	TBitInput in(&bits,1);
+	test (in.HuffmanL(tab)==200);
+
+	// test flat distributions with 2..aMaxCount symbols
+	TInt len=0;
+	for (TInt c=2;c<aMaxCount;++c)
+		{
+		if ((2<<len)==c)
+			++len;
+		Mem::FillZ(tab,sizeof(TUint32)*aMaxCount);
+		for (i=0;i<c;++i)
+			tab[i]=100;
+		TRAP(r, Huffman::HuffmanL(tab,aMaxCount,tab));
+		test (r==KErrNone);
+		TInt small=0;
+		for (i=0;i<c;++i)
+			{
+			if (TInt(tab[i])==len)
+				++small;
+			else
+				test (TInt(tab[i])==len+1);
+			}
+		for (;i<aMaxCount;++i)
+			test (tab[i]==0);
+		test (small == (2<<len)-c);
+		}
+
+	delete [] tab;
+	}
+
+void Power2Huffman()
+//
+// Test Huffman generator for the distribution 2^0,2^0,2^1,2^2,2^3,...
+//
+	{
+	TUint32 tab[Huffman::KMaxCodeLength+2];
+
+	for (TInt c=1;c<=Huffman::KMaxCodeLength+1;c++)
+		{
+		tab[c]=tab[c-1]=1;
+		TInt i;
+		for (i=c-1;--i>=0;)
+			tab[i]=2*tab[i+1];
+
+		TRAPD(r,Huffman::HuffmanL(tab,c+1,tab));
+		if (c>Huffman::KMaxCodeLength)
+			{
+			test (r==KErrOverflow);
+			continue;
+			}
+
+		test (TInt(tab[c]) == c);
+		for (i=0;i<c;++i)
+			test (TInt(tab[i]) == i+1);
+
+		Huffman::Decoding(tab,c+1,tab);
+		for (i=0;i<=c;++i)
+			{
+			TUint8 buf[4];
+			TBitOutput out(buf,4);
+			out.WriteL(0xffffffff,i);
+			out.WriteL(0,1);
+			out.PadL(1);
+			TBitInput in(buf,Min(i+1,c));
+			TInt ix=-1;
+			TRAP(r, ix=in.HuffmanL(tab));
+			test (r==KErrNone);
+			test (ix==i);
+			TRAP(r, in.HuffmanL(tab));
+			test (r==KErrUnderflow);
+			}
+		}
+	}
+
+void FibonacciHuffman()
+//
+// Test Huffman generator for the distribution 1,1,2,3,5,8,13,21,...
+//
+	{
+	TUint32 tab[Huffman::KMaxCodeLength+2];
+
+	for (TInt c=1;c<=Huffman::KMaxCodeLength+1;c++)
+		{
+		tab[c]=tab[c-1]=1;
+		TInt i;
+		for (i=c-1;--i>=0;)
+			tab[i]=tab[i+1]+tab[i+2];
+
+		TRAPD(r,Huffman::HuffmanL(tab,c+1,tab));
+		if (c>Huffman::KMaxCodeLength)
+			{
+			test (r==KErrOverflow);
+			continue;
+			}
+
+		test (TInt(tab[c]) == c);
+		for (i=0;i<c;++i)
+			test (TInt(tab[i]) == i+1);
+
+		Huffman::Decoding(tab,c+1,tab);
+		for (i=0;i<=c;++i)
+			{
+			TUint8 buf[4];
+			TBitOutput out(buf,4);
+			out.WriteL(0xffffffff,i);
+			out.WriteL(0,1);
+			out.PadL(1);
+			TBitInput in(buf,Min(i+1,c));
+			TInt ix=-1;
+			TRAP(r, ix=in.HuffmanL(tab));
+			test (r==KErrNone);
+			test (ix==i);
+			TRAP(r, in.HuffmanL(tab));
+			test (r==KErrUnderflow);
+			}
+		}
+	}
+
+void SpecificHuffman(TInt aMaxCount)
+	{
+	test.Start(_L("Flat distributions"));
+	FlatHuffman(aMaxCount);
+	test.Next(_L("Power-of-2 distributions"));
+	Power2Huffman();
+	test.Next(_L("Fibonacci distributions"));
+	FibonacciHuffman();
+	test.End();
+	}
+
+// Huffman generator validity testing. Checking code properties for a sequence of random
+// frequency distributions.
+
+TInt64 RSeed(KTestData);
+
+inline TInt Random(TInt aLimit)
+	{return aLimit>0 ? (Math::Rand(RSeed)%aLimit) : 0;}
+
+void GenerateFreq(TUint32* aTable, TInt aCount, TInt aTotalFreq, TInt aVariance, TInt aZeros)
+//
+// Generate a random frequency table
+//
+	{
+	for (TInt i=0;i<aCount;++i)
+		{
+		if (aZeros && Random(aCount-i)<aZeros)
+			{
+			aTable[i]=0;
+			--aZeros;
+			}
+		else if (aCount-aZeros-i == 1)
+			{
+			aTable[i]=aTotalFreq;
+			aTotalFreq=0;
+			}
+		else
+			{
+			TInt ave=aTotalFreq/(aCount-aZeros-i);
+			if (aVariance==0)
+				{
+				aTable[i]=ave;
+				aTotalFreq-=ave;
+				}
+			else
+				{
+				TInt var=I64INT(TInt64(ave)<<aVariance>>8);
+				TInt min=Max(1,ave-var);
+				TInt max=Min(1+aTotalFreq-(aCount-aZeros-i),ave+var);
+				TInt f = max<=min ? ave : min+Random(max-min);
+				aTable[i] = f;
+				aTotalFreq-=f;
+				}
+			}
+		}
+	}
+
+TInt NumericalSort(const TUint32& aLeft, const TUint32& aRight)
+	{
+	return aLeft-aRight;
+	}
+
+TInt64 VerifyOptimalCode(const TUint32* aFreq, const TUint32* aCode, TInt aCount, TInt aTotalFreqLog2)
+//
+// We can show tht the expected code length is at least as short as a Shannon-Fano encoding
+//
+	{
+	TInt64 totalHuff=0;
+	TInt64 totalSF=0;
+	TInt i;
+	for (i=0;i<aCount;++i)
+		{
+		TInt f=aFreq[i];
+		TInt l=aCode[i];
+		if (f == 0)
+			{
+			test (l == 0);
+			continue;
+			}
+		totalHuff+=f*l;
+		TInt s=1;
+		while ((f<<s>>aTotalFreqLog2)!=1)
+			++s;
+		totalSF+=f*s;
+		}
+	test (totalHuff<=totalSF);
+
+	RPointerArray<TUint32> index(aCount);
+	CleanupClosePushL(index);
+	for (i=0;i<aCount;++i)
+		{
+		if (aFreq[i] != 0)
+			User::LeaveIfError(index.InsertInOrderAllowRepeats(aFreq+i,&NumericalSort));
+		}
+
+	TInt smin,smax;
+	smin=smax=aCode[index[0]-aFreq];
+	for (i=1;i<index.Count();++i)
+		{
+		TInt pix=index[i-1]-aFreq;
+		TInt nix=index[i]-aFreq;
+		TInt pf=aFreq[pix];
+		TInt nf=aFreq[nix];
+		TInt ps=aCode[pix];
+		TInt ns=aCode[nix];
+
+		if (nf==pf)
+			{
+			smin=Min(smin,ns);
+			smax=Max(smax,ns);
+			test (smin==smax || smin+1==smax);
+			}
+		else
+			{
+			test (nf>pf);
+			test (ns<=ps);
+			smin=smax=ns;
+			}
+		}
+	CleanupStack::PopAndDestroy();
+
+	return totalHuff;
+	}
+
+TInt LexicalSort(const TUint32& aLeft, const TUint32& aRight)
+	{
+	const TUint32 KCodeMask=(1<<Huffman::KMaxCodeLength)-1;
+	return (aLeft&KCodeMask)-(aRight&KCodeMask);
+	}
+
+void VerifyCanonicalEncodingL(const TUint32* aCode, const TUint32* aEncode, TInt aCount)
+//
+// A canonical encoding assigns codes from '0' in increasing code length order, and
+// in increasing index in the table for equal code length.
+//
+// Huffman is also a 'prefix-free' code, so we check this property of the encoding
+//
+	{
+	TInt i;
+	for (i=0;i<aCount;++i)
+		test (aCode[i] == aEncode[i]>>Huffman::KMaxCodeLength);
+
+	RPointerArray<TUint32> index(aCount);
+	CleanupClosePushL(index);
+	for (i=0;i<aCount;++i)
+		{
+		if (aCode[i] != 0)
+			User::LeaveIfError(index.InsertInOrder(aEncode+i,&LexicalSort));
+		}
+
+	for (i=1;i<index.Count();++i)
+		{
+		TInt pix=index[i-1]-aEncode;
+		TInt nix=index[i]-aEncode;
+		test (aCode[pix]<=aCode[nix]);				// code lengths are always increasing
+		test (aCode[pix]<aCode[nix] || pix<nix);	// same code length => index order preserved
+
+		// check that a code is not a prefix of the next one. This is sufficent for checking the
+		// prefix condition as we have already sorted the codes in lexicographical order
+		TUint32 pc=aEncode[pix]<<(32-Huffman::KMaxCodeLength);
+		TUint32 nc=aEncode[nix]<<(32-Huffman::KMaxCodeLength);
+		TInt plen=aCode[pix];
+		test ((pc>>(32-plen)) != (nc>>(32-plen)));	// pc is not a prefix for nc
+		}
+	CleanupStack::PopAndDestroy(&index);
+	}
+
+void VerifyCanonicalDecoding(const TUint32* aEncode, const TUint32* aDecode, TInt aCount, TInt aBase)
+//
+// We've checked the encoding is valid, so now we check that the decoding can correctly
+// decode every code
+//
+	{
+	TUint8 buffer[(Huffman::KMaxCodeLength+7)/8];
+	TBitInput in;
+	TBitOutput out;
+
+	while (--aCount>=0)
+		{
+		if (aEncode[aCount])
+			{
+			out.Set(buffer,sizeof(buffer));
+			out.HuffmanL(aEncode[aCount]);
+			out.PadL(0);
+			in.Set(buffer,aEncode[aCount]>>Huffman::KMaxCodeLength);
+			TInt v=-1;
+			TRAPD(r,v=in.HuffmanL(aDecode));
+			test (r==KErrNone);
+			test (v==aCount+aBase);
+			TRAP(r,in.ReadL());
+			test (r==KErrUnderflow);
+			}
+		}
+	}
+
+TInt TestExternalizeL(const TUint32* aCode, TUint8* aExtern, TUint32* aIntern, TInt aCount)
+	{
+	TBitOutput out(aExtern,aCount*4);
+	Huffman::ExternalizeL(out,aCode,aCount);
+	TInt bits=out.BufferedBits()+8*(out.Ptr()-aExtern);
+	out.PadL(0);
+	TBitInput in(aExtern,bits);
+	TRAPD(r,Huffman::InternalizeL(in,aIntern,aCount));
+	test (r == KErrNone);
+	test (Mem::Compare((TUint8*)aCode,aCount*sizeof(TUint32),(TUint8*)aIntern,aCount*sizeof(TUint32)) == 0);
+	TRAP(r,in.ReadL());
+	test (r == KErrUnderflow);
+	return bits;
+	}
+
+void RandomHuffmanL(TInt aIter, TInt aMaxSymbols)
+//
+// generate random frequency distributions and verify
+// (a) the Huffman generator creates a mathematically 'optimal code'
+// (b) the canonical encoding is the canonical encoding
+// (c) the decoding tree correctly decodes each code.
+// (d) the encoding can be correctly externalised and internalised
+//
+	{
+	TReal KLog2;
+	Math::Ln(KLog2,2);
+	const TInt KTotalFreqLog2=24;
+	const TInt KTotalFreq=1<<KTotalFreqLog2;
+
+	while (--aIter >= 0)
+		{
+		TInt num=2+Random(aMaxSymbols-1);
+
+		TUint32* const freq = new(ELeave) TUint32[num*3];
+		CleanupArrayDeletePushL(freq);
+		TUint32* const code = freq+num;
+		TUint32* const encoding = code+num;
+		TUint32* const decoding = freq;
+		TUint8* const exter = (TUint8*)encoding;
+		TUint32* const intern = freq;
+
+		TInt var=Random(24);
+		TInt zero=Random(num-2);
+		GenerateFreq(freq,num,KTotalFreq,var,zero);
+
+		Huffman::HuffmanL(freq,num,code);
+		VerifyOptimalCode(freq,code,num,KTotalFreqLog2);
+
+		Huffman::Encoding(code,num,encoding);
+		VerifyCanonicalEncodingL(code,encoding,num);
+
+		TInt base=Random(Huffman::KMaxCodes-num);
+		Huffman::Decoding(code,num,decoding,base);
+		VerifyCanonicalDecoding(encoding,decoding,num,base);
+
+		TestExternalizeL(code,exter,intern,num);
+		CleanupStack::PopAndDestroy();
+		}
+	}
+
+///
+
+void MainL()
+	{
+	test.Start(_L("Test Bit reader"));
+	TestBitReading();
+	test.Next(_L("Test Bit writer"));
+	TestBitWriting();
+	test.Next(_L("Test Huffman decoder"));
+	TestHuffmanL();
+	test.Next(_L("Test Huffman generator for known distributions"));
+	SpecificHuffman(800);
+	test.Next(_L("Test Huffman generator for random distributions"));
+	TRAPD(r,RandomHuffmanL(1000,800));
+	test (r==KErrNone);
+	test.End();
+	}
+
+TInt E32Main()
+	{
+	test.Title();
+	CTrapCleanup* c=CTrapCleanup::New();
+	test (c!=0);
+	TRAPD(r,MainL());
+	test (r==KErrNone);
+	delete c;
+	test.Close();
+	return r;
+	}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32test/buffer/t_key.cpp	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,742 @@
+// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32test\buffer\t_key.cpp
+// Overview:
+// Test arrays keys against flat and segmented arrays of characters (8 and 16 bit) and records.
+// API Information:
+// TKeyArrayFix, TKeyArrayVar.
+// Details:
+// - Create flat and segmented array of TText8, TText16, TText. Append some text to the 
+// arrays and test the functions of the TKeyArrayFix class using the Find method which 
+// calls SetPtr, Set, Compare methods with ECmpNormal8, ECmpFolded8, ECmpCollated8, 
+// ECmpNormal16, ECmpFolded16, ECmpCollated16, ECmpNormal, ECmpFolded, ECmpCollated key types.
+// - Test the functions of the TKeyArrayVar class using the Find method which calls SetPtr, Set, 
+// Compare methods with ECmpNormal8, ECmpFolded8, ECmpCollated8, ECmpNormal16, ECmpFolded16, 
+// ECmpCollated16, ECmpNormal, ECmpFolded, ECmpCollated key types.
+// - Create flat and segmented array of TText, append some structures with different values.
+// - Test the functions of the TKeyArrayFix, TKeyArrayVar classes by searching the values using 
+// sequential search technique with ECmpNormal, ECmpTInt32 key type and verifying that it is 
+// found at correct position.
+// - For TKeyArrayFix and TKeyArrayVar class, create a flat array of TText, append some structures 
+// with different numeric values, sort the array, search the values using ECmpTInt, ECmpTUint, 
+// ECmpTint8, ECmpTUint8, ECmpTint16, ECmpTUint16, ECmpTint32, ECmpTUint32 key types and verify 
+// that values are found in order as expected.
+// Platforms/Drives/Compatibility:
+// All 
+// Assumptions/Requirement/Pre-requisites:
+// Failures and causes:
+// Base Port information:
+// 
+//
+
+#include <e32std.h>
+#include <e32base.h>
+#include <e32test.h>
+#include <e32svr.h>
+#include <e32ver.h>
+
+#ifdef __VC32__
+#pragma warning (disable:4710)	// Function not expanded
+#pragma warning (disable:4702)	// Unreachable code
+#endif
+
+const TInt KTestGranularity=0x02;
+
+LOCAL_D RTest test(_L("T_KEY"));
+
+template <class T,TInt S>
+class TArr
+	{
+public:
+	TArr() {}
+	TInt Count() const {return S;}
+	T& operator[](TInt anIndex) {return iArr[anIndex];}
+	const T& operator[](TInt anIndex) const {return iArr[anIndex];}
+private:
+	T iArr[S];
+	};
+
+//#if defined(_DEBUG)
+struct Record
+	{
+	TBuf<0x10> name;  
+	TInt32	age;
+	TText8	code;
+	};
+
+struct Record2
+	{
+	TInt	tint;
+	TUint	tuint;
+	TInt8	tint8;
+	TUint8	tuint8;
+	TInt16  tint16;
+	TUint16 tuint16;
+	TInt32  tint32;
+	TUint32 tuint32;
+	}Rec1, Rec2, Rec3, Rec4;		
+		
+LOCAL_C void SetRecordData(void)
+	{
+	Rec1.tint=KMaxTInt;
+	Rec2.tint=0;
+	Rec3.tint=-KMaxTInt;
+	Rec4.tint=KMinTInt;
+	Rec1.tint8=KMaxTInt8;
+	Rec2.tint8=0;
+	Rec3.tint8=-KMaxTInt8;
+	Rec4.tint8=(TInt8)KMinTInt8;
+	Rec1.tint16=KMaxTInt16;
+	Rec2.tint16=0;
+	Rec3.tint16=-KMaxTInt16;
+	Rec4.tint16=(TInt16)KMinTInt16;
+	Rec1.tint32=KMaxTInt32;
+	Rec2.tint32=0;
+	Rec3.tint32=-KMaxTInt32;
+	Rec4.tint32=(TInt32)KMinTInt32;
+	Rec1.tuint=0;
+	Rec2.tuint=1;
+	Rec3.tuint=KMaxTUint-1;
+	Rec4.tuint=KMaxTUint;
+	Rec1.tuint8=0;
+	Rec2.tuint8=1;
+	Rec3.tuint8=(TUint8)(KMaxTUint8-1);
+	Rec4.tuint8=(TUint8)KMaxTUint8;
+	Rec1.tuint16=0;
+	Rec2.tuint16=1;
+	Rec3.tuint16=(TUint16)(KMaxTUint16-1);
+	Rec4.tuint16=(TUint16)KMaxTUint16;
+	Rec1.tuint32=0;
+	Rec2.tuint32=1;
+	Rec3.tuint32=(TUint32)(KMaxTUint32-1);
+	Rec4.tuint32=KMaxTUint32;
+	}
+
+typedef enum {eEight, eSixteen} TMode;
+			
+template<class KeyType, class ArrayType, class S> // S is TText8, TTExt etc. called S as _TL requires S in e32test.h
+class TestTKey
+	{
+public:
+	void Test1(TKeyCmpText, TKeyCmpText, TKeyCmpText);
+	void Test2(TKeyCmpText, TKeyCmpText, TKeyCmpText);
+	void Test3(void);
+	void Test4(void);
+	void Test5(void);
+	void Test6(void);
+	};
+
+template<class KeyType, class ArrayType, class S>
+GLDEF_C void TestTKey<KeyType, ArrayType, S>::Test1(TKeyCmpText N, TKeyCmpText F, TKeyCmpText C)
+	{
+	// This tests the functions of the TKey classes indirectly - mostly using the Find method
+	// which calls SetPtr(), Set() (both trivial) and more importantly Compare(), 
+
+	ArrayType* pArray=new ArrayType(KTestGranularity);
+	pArray->AppendL(*(const TArr<S,5>*)_TL("aa cc"));
+	pArray->AppendL(*(const TArr<S,5>*)_TL("bb bb"));
+	pArray->AppendL(*(const TArr<S,5>*)_TL("cc aa"));
+
+	KeyType NormalKey(0,N,5);	
+	KeyType NormalKeyOffset(sizeof(S)*3,N,2) ;
+	KeyType FoldedKey(0,F,5);
+	KeyType FoldedKeyOffset(sizeof(S)*3,F,2);	
+	KeyType CollatedKey(0,C,5);
+	KeyType CollatedKeyOffset(sizeof(S)*3,C,2);
+
+	TInt pos;
+	test(pArray->Find(*(const TArr<S,5>*)_TL("aa cc"), NormalKey, pos)==0);
+	test(pos==0);
+	test(pArray->Find(*(const TArr<S,5>*)_TL("bb bb"), NormalKey, pos)==0);
+	test(pos==1);
+	test(pArray->Find(*(const TArr<S,5>*)_TL("cc aa"), NormalKey, pos)==0);
+	test(pos==2);	
+	test(pArray->Find(*(const TArr<S,5>*)_TL("BB BB"), NormalKey, pos)!=0);
+
+
+	test(pArray->Find(*(const TArr<S,5>*)_TL("___cc"), NormalKeyOffset, pos)==0);
+	test(pos==0);
+	test(pArray->Find(*(const TArr<S,5>*)_TL("___bb"), NormalKeyOffset, pos)==0);
+	test(pos==1);
+	test(pArray->Find(*(const TArr<S,5>*)_TL("___aa"), NormalKeyOffset, pos)==0);
+	test(pos==2);
+	test(pArray->Find(*(const TArr<S,5>*)_TL("___ax"), NormalKeyOffset, pos)!=0);
+
+
+	test(pArray->Find(*(const TArr<S,5>*)_TL("aa cc"), FoldedKey, pos)==0);
+	test(pos==0);
+	test(pArray->Find(*(const TArr<S,5>*)_TL("bb bb"), FoldedKey, pos)==0);
+	test(pos==1);
+	test(pArray->Find(*(const TArr<S,5>*)_TL("cc aa"), FoldedKey, pos)==0);
+	test(pos==2);
+
+
+	test(pArray->Find(*(const TArr<S,5>*)_TL("___CC"), FoldedKeyOffset, pos)==0);
+	test(pos==0);
+	test(pArray->Find(*(const TArr<S,5>*)_TL("___bB"), FoldedKeyOffset, pos)==0);
+	test(pos==1);
+	test(pArray->Find(*(const TArr<S,5>*)_TL("___Aa"), FoldedKeyOffset, pos)==0);
+	test(pos==2);
+	test(pArray->Find(*(const TArr<S,5>*)_TL("___ax"), FoldedKeyOffset, pos)!=0);
+
+
+	test(pArray->Find(*(const TArr<S,5>*)_TL("aa cc"), CollatedKey, pos)==0);
+	test(pos==0);
+	test(pArray->Find(*(const TArr<S,5>*)_TL("bb bb"), CollatedKey, pos)==0);
+	test(pos==1);
+	test(pArray->Find(*(const TArr<S,5>*)_TL("cc aa"), CollatedKey, pos)==0);
+	test(pos==2);
+
+
+	test(pArray->Find(*(const TArr<S,5>*)_TL("___cc"), CollatedKeyOffset, pos)==0);
+	test(pos==0);
+	test(pArray->Find(*(const TArr<S,5>*)_TL("___bb"), CollatedKeyOffset, pos)==0);
+	test(pos==1);
+	test(pArray->Find(*(const TArr<S,5>*)_TL("___aa"), CollatedKeyOffset, pos)==0);
+	test(pos==2);
+	test(pArray->Find(*(const TArr<S,5>*)_TL("___ax"), CollatedKeyOffset, pos)!=0);
+
+	delete pArray;
+	}
+
+
+template<class KeyType, class ArrayType, class S>
+GLDEF_C void TestTKey<KeyType, ArrayType, S>::Test2(TKeyCmpText N, TKeyCmpText F, TKeyCmpText C)
+	{
+	// This tests the functions of the TKey classes indirectly - mostly using the Find method
+	// which calls SetPtr(), Set() (both trivial) and more importantly Compare(), 
+
+	ArrayType* pArray=new ArrayType(KTestGranularity);
+	pArray->AppendL(*(S(*))_TL("aa cc"), 5*sizeof(S));
+	pArray->AppendL(*(S(*))_TL("bb bbb"), 6*sizeof(S));
+	pArray->AppendL(*(S(*))_TL("cc aaaa"), 7*sizeof(S));
+
+	KeyType NormalKey5(0,N,5);		 
+	KeyType NormalKey6(0,N,6);		
+	KeyType NormalKey7(0,N,7);
+	KeyType NormalKeyOffset(sizeof(S)*3,N,2); 
+
+	KeyType FoldedKey5(0,F,5);
+	KeyType FoldedKey6(0,F,6);
+	KeyType FoldedKey7(0,F,7);
+	KeyType FoldedKeyOffset(sizeof(S)*3,F,2);	
+
+	KeyType CollatedKey5(0,C,5);
+	KeyType CollatedKey6(0,C,6);
+	KeyType CollatedKey7(0,C,7);
+	KeyType CollatedKeyOffset(sizeof(S)*3,C,2);
+
+	TInt pos;
+	test(pArray->Find(*(S(*))_TL("aa cc"), NormalKey5, pos)==0);
+	test(pos==0);
+	test(pArray->Find(*(S(*))_TL("bb bbb"), NormalKey6, pos)==0);
+	test(pos==1);
+	test(pArray->Find(*(S(*))_TL("cc aaaa"), NormalKey7, pos)==0);
+	test(pos==2);	
+	test(pArray->Find(*(S(*))_TL("BB BB"), NormalKey5, pos)!=0);
+
+
+	test(pArray->Find(*(S(*))_TL("___cc"), NormalKeyOffset, pos)==0);
+	test(pos==0);
+	test(pArray->Find(*(S(*))_TL("___bb"), NormalKeyOffset, pos)==0);
+	test(pos==1);
+	test(pArray->Find(*(S(*))_TL("___aa"), NormalKeyOffset, pos)==0);
+	test(pos==2);  
+	test(pArray->Find(*(S(*))_TL("___ax"), NormalKeyOffset, pos)!=0);
+
+
+	test(pArray->Find(*(S(*))_TL("aa cc"), FoldedKey5, pos)==0);
+	test(pos==0);
+	test(pArray->Find(*(S(*))_TL("bb bbb"), FoldedKey6, pos)==0);
+	test(pos==1);
+	test(pArray->Find(*(S(*))_TL("cc aaaa"), FoldedKey7, pos)==0);
+	test(pos==2);
+
+
+	test(pArray->Find(*(S(*))_TL("___CC"), FoldedKeyOffset, pos)==0);
+	test(pos==0);
+	test(pArray->Find(*(S(*))_TL("___bB"), FoldedKeyOffset, pos)==0);
+	test(pos==1);
+	test(pArray->Find(*(S(*))_TL("___Aa"), FoldedKeyOffset, pos)==0);
+	test(pos==2);
+	test(pArray->Find(*(S(*))_TL("___ax"), FoldedKeyOffset, pos)!=0);
+
+
+	test(pArray->Find(*(S(*))_TL("aa cc"), CollatedKey5, pos)==0);
+	test(pos==0);
+	test(pArray->Find(*(S(*))_TL("bb bbb"), CollatedKey6, pos)==0);
+	test(pos==1);
+	test(pArray->Find(*(S(*))_TL("cc aaaa"), CollatedKey7, pos)==0);
+	test(pos==2);
+
+
+	test(pArray->Find(*(S(*))_TL("___cc"), CollatedKeyOffset, pos)==0);
+	test(pos==0);
+	test(pArray->Find(*(S(*))_TL("___bb"), CollatedKeyOffset, pos)==0);
+	test(pos==1);
+	test(pArray->Find(*(S(*))_TL("___aa"), CollatedKeyOffset, pos)==0);
+	test(pos==2);
+	test(pArray->Find(*(S(*))_TL("___ax"), CollatedKeyOffset, pos)!=0);
+
+	delete pArray;
+	}
+
+
+template<class KeyType, class ArrayType, class S>
+GLDEF_C void TestTKey<KeyType, ArrayType, S>::Test3(void)
+	{
+	ArrayType* pArray=new ArrayType(KTestGranularity);
+	Record rec1, rec2, rec3;
+
+	rec1.name=(_TL("fred"));
+	rec1.age=5;
+	rec1.code='A';
+
+	rec2.name=(_TL("bill"));
+	rec2.age=0x7fffffff;
+	rec2.code='Z';
+
+	rec3.name=(_TL("bert"));
+	rec3.age=-5;
+	rec3.code='X';
+
+	pArray->AppendL(rec1);
+	pArray->AppendL(rec2);
+	pArray->AppendL(rec3);
+	
+	TInt pos;	 
+
+	KeyType codekey(_FOFF(Record, code),ECmpNormal,1);
+	test(pArray->Find(rec1, codekey, pos)==0);
+	test(pos==0);
+	test(pArray->Find(rec2, codekey, pos)==0);
+	test(pos==1);
+	test(pArray->Find(rec3, codekey, pos)==0);
+	test(pos==2);
+
+	KeyType agekey(_FOFF(Record, age), ECmpTInt32);
+	test(pArray->Find(rec1, agekey, pos)==0);
+	test(pos==0);
+	test(pArray->Find(rec2, agekey, pos)==0);
+	test(pos==1);
+	test(pArray->Find(rec3, agekey, pos)==0);
+	test(pos==2);
+
+	rec1.age=-50; // march 95 - this isn't allowed , lucky that it works
+	test(pArray->Find(rec1, agekey, pos)!=0);
+	rec1.age=5;
+
+	pArray->Sort(agekey);
+	test(pArray->Find(rec1, agekey, pos)==0);
+	test(pos==1);
+	test(pArray->Find(rec2, agekey, pos)==0);
+	test(pos==2);
+	test(pArray->Find(rec3, agekey, pos)==0);
+	test(pos==0);
+
+	delete pArray;
+	}
+
+template<class KeyType, class ArrayType, class S>
+GLDEF_C void TestTKey<KeyType, ArrayType, S>::Test4(void)
+	{
+	ArrayType* pArray=new ArrayType(KTestGranularity);
+	Record rec1, rec2, rec3;
+	
+	rec1.name=(_TL("fred"));
+	rec1.age=5;
+	rec1.code='A';
+	rec2.name=(_TL("bill"));
+	rec2.age=0x7fffffff;
+	rec2.code='Z';
+	rec3.name=(_TL("bert"));
+	rec3.age=-5;
+	rec3.code='X';
+
+	pArray->AppendL(rec1, sizeof(Record));
+	pArray->AppendL(rec2, sizeof(Record));
+	pArray->AppendL(rec3, sizeof(Record));
+
+	TInt pos;
+	KeyType codekey(_FOFF(Record, code),ECmpNormal,1);
+	test(pArray->Find(rec1, codekey, pos)==0);
+	test(pos==0);
+	test(pArray->Find(rec2, codekey, pos)==0);
+	test(pos==1);
+	test(pArray->Find(rec3, codekey, pos)==0);
+	test(pos==2);
+
+	KeyType agekey(_FOFF(Record, age), ECmpTInt32);
+	test(pArray->Find(rec1, agekey, pos)==0);
+	test(pos==0);
+	test(pArray->Find(rec2, agekey, pos)==0);
+	test(pos==1);
+	test(pArray->Find(rec3, agekey, pos)==0);
+	test(pos==2);
+	rec1.age=-50;					// march 95 - this isn't allowed - lucky to get away with it
+	test(pArray->Find(rec1, agekey, pos)!=0);
+	rec1.age=5;
+
+	pArray->Sort(agekey);
+	test(pArray->Find(rec1, agekey, pos)==0);
+	test(pos==1);
+	test(pArray->Find(rec2, agekey, pos)==0);
+	test(pos==2);
+	test(pArray->Find(rec3, agekey, pos)==0);
+	test(pos==0);
+
+	delete pArray;
+	}
+
+template<class KeyType, class ArrayType, class S>
+GLDEF_C void TestTKey<KeyType, ArrayType, S>::Test5(void)
+	{
+	// test the numeric enumeration types
+	ArrayType* pArray=new ArrayType(KTestGranularity);
+	TInt pos;
+	
+	KeyType TIntKey(_FOFF(Record2, tint), ECmpTInt);
+	KeyType TUintKey(_FOFF(Record2, tuint), ECmpTUint);
+	KeyType TInt8Key(_FOFF(Record2, tint8), ECmpTInt8);
+	KeyType TUint8Key(_FOFF(Record2, tuint8), ECmpTUint8);
+	KeyType TInt16Key(_FOFF(Record2, tint16), ECmpTInt16);
+	KeyType TUint16Key(_FOFF(Record2, tuint16), ECmpTUint16);
+	KeyType TInt32Key(_FOFF(Record2, tint32), ECmpTInt32);
+	KeyType TUint32Key(_FOFF(Record2, tuint32), ECmpTUint32);
+
+	SetRecordData();
+
+	pArray->AppendL(Rec1);
+	pArray->AppendL(Rec2);
+	pArray->AppendL(Rec3);
+	pArray->AppendL(Rec4);
+
+	pArray->Sort(TIntKey);
+	// order should be 4,3,2,1
+	test(pArray->Find(Rec4, TIntKey, pos)==0);
+	test(pos==0);
+	test(pArray->Find(Rec3, TIntKey, pos)==0);
+	test(pos==1);
+	test(pArray->Find(Rec2, TIntKey, pos)==0);
+	test(pos==2);
+	test(pArray->Find(Rec1, TIntKey, pos)==0);
+	test(pos==3);
+
+	pArray->Sort(TUintKey);
+	// order should be 1,2,3,4
+	test(pArray->Find(Rec1, TUintKey, pos)==0);
+	test(pos==0);
+	test(pArray->Find(Rec2, TUintKey, pos)==0);
+	test(pos==1);
+	test(pArray->Find(Rec3, TUintKey, pos)==0);
+	test(pos==2);
+	test(pArray->Find(Rec4, TUintKey, pos)==0);
+	test(pos==3);
+
+	pArray->Sort(TInt8Key);
+	// order should be 4,3,2,1
+	test(pArray->Find(Rec4, TInt8Key, pos)==0);
+	test(pos==0);
+	test(pArray->Find(Rec3, TInt8Key, pos)==0);
+	test(pos==1);
+	test(pArray->Find(Rec2, TInt8Key, pos)==0);
+	test(pos==2);
+	test(pArray->Find(Rec1, TInt8Key, pos)==0);
+	test(pos==3);
+
+	pArray->Sort(TUint8Key);
+	// order should be 1,2,3,4
+	test(pArray->Find(Rec1, TUint8Key, pos)==0);
+	test(pos==0);
+	test(pArray->Find(Rec2, TUint8Key, pos)==0);
+	test(pos==1);
+	test(pArray->Find(Rec3, TUint8Key, pos)==0);
+	test(pos==2);
+	test(pArray->Find(Rec4, TUint8Key, pos)==0);
+	test(pos==3);
+
+	pArray->Sort(TInt16Key);
+	// order should be 4,3,2,1
+	test(pArray->Find(Rec4, TInt16Key, pos)==0);
+	test(pos==0);
+	test(pArray->Find(Rec3, TInt16Key, pos)==0);
+	test(pos==1);
+	test(pArray->Find(Rec2, TInt16Key, pos)==0);
+	test(pos==2);
+	test(pArray->Find(Rec1, TInt16Key, pos)==0);
+	test(pos==3);
+
+	pArray->Sort(TUintKey);
+	// order should be 1,2,3,4
+	test(pArray->Find(Rec1, TUint16Key, pos)==0);
+	test(pos==0);
+	test(pArray->Find(Rec2, TUint16Key, pos)==0);
+	test(pos==1);
+	test(pArray->Find(Rec3, TUint16Key, pos)==0);
+	test(pos==2);
+	test(pArray->Find(Rec4, TUint16Key, pos)==0);
+	test(pos==3);
+
+	pArray->Sort(TInt32Key);
+	// order should be 4,3,2,1
+	test(pArray->Find(Rec4, TInt32Key, pos)==0);
+	test(pos==0);
+	test(pArray->Find(Rec3, TInt32Key, pos)==0);
+	test(pos==1);
+	test(pArray->Find(Rec2, TInt32Key, pos)==0);
+	test(pos==2);
+	test(pArray->Find(Rec1, TInt32Key, pos)==0);
+	test(pos==3);
+
+	pArray->Sort(TUint32Key);
+	// order should be 1,2,3,4
+	test(pArray->Find(Rec1, TUint32Key, pos)==0);
+	test(pos==0);
+	test(pArray->Find(Rec2, TUint32Key, pos)==0);
+	test(pos==1);
+	test(pArray->Find(Rec3, TUint32Key, pos)==0);
+	test(pos==2);
+	test(pArray->Find(Rec4, TUint32Key, pos)==0);
+	test(pos==3);
+
+	delete pArray;
+	}
+
+template<class KeyType, class ArrayType, class S>
+GLDEF_C void TestTKey<KeyType, ArrayType, S>::Test6(void)
+	{
+	// test the numeric enumeration types
+	ArrayType* pArray=new ArrayType(KTestGranularity);
+	TInt pos;
+	
+	KeyType TIntKey(_FOFF(Record2, tint), ECmpTInt);
+	KeyType TUintKey(_FOFF(Record2, tuint), ECmpTUint);
+	KeyType TInt8Key(_FOFF(Record2, tint8), ECmpTInt8);
+	KeyType TUint8Key(_FOFF(Record2, tuint8), ECmpTUint8);
+	KeyType TInt16Key(_FOFF(Record2, tint16), ECmpTInt16);
+	KeyType TUint16Key(_FOFF(Record2, tuint16), ECmpTUint16);
+	KeyType TInt32Key(_FOFF(Record2, tint32), ECmpTInt32);
+	KeyType TUint32Key(_FOFF(Record2, tuint32), ECmpTUint32);
+
+	SetRecordData();
+
+	pArray->AppendL(Rec1, sizeof(Record2));
+	pArray->AppendL(Rec2, sizeof(Record2));
+	pArray->AppendL(Rec3, sizeof(Record2));
+	pArray->AppendL(Rec4, sizeof(Record2));
+
+	pArray->Sort(TIntKey);
+	// order should be 4,3,2,1
+	test(pArray->Find(Rec4, TIntKey, pos)==0);
+	test(pos==0);
+	test(pArray->Find(Rec3, TIntKey, pos)==0);
+	test(pos==1);
+	test(pArray->Find(Rec2, TIntKey, pos)==0);
+	test(pos==2);
+	test(pArray->Find(Rec1, TIntKey, pos)==0);
+	test(pos==3);
+
+	pArray->Sort(TUintKey);
+	// order should be 1,2,3,4
+	test(pArray->Find(Rec1, TUintKey, pos)==0);
+	test(pos==0);
+	test(pArray->Find(Rec2, TUintKey, pos)==0);
+	test(pos==1);
+	test(pArray->Find(Rec3, TUintKey, pos)==0);
+	test(pos==2);
+	test(pArray->Find(Rec4, TUintKey, pos)==0);
+	test(pos==3);
+
+	pArray->Sort(TInt8Key);
+	// order should be 4,3,2,1
+	test(pArray->Find(Rec4, TInt8Key, pos)==0);
+	test(pos==0);
+	test(pArray->Find(Rec3, TInt8Key, pos)==0);
+	test(pos==1);
+	test(pArray->Find(Rec2, TInt8Key, pos)==0);
+	test(pos==2);
+	test(pArray->Find(Rec1, TInt8Key, pos)==0);
+	test(pos==3);
+
+	pArray->Sort(TUint8Key);
+	// order should be 1,2,3,4
+	test(pArray->Find(Rec1, TUint8Key, pos)==0);
+	test(pos==0);
+	test(pArray->Find(Rec2, TUint8Key, pos)==0);
+	test(pos==1);
+	test(pArray->Find(Rec3, TUint8Key, pos)==0);
+	test(pos==2);
+	test(pArray->Find(Rec4, TUint8Key, pos)==0);
+	test(pos==3);
+
+	pArray->Sort(TInt16Key);
+	// order should be 4,3,2,1
+	test(pArray->Find(Rec4, TInt16Key, pos)==0);
+	test(pos==0);
+	test(pArray->Find(Rec3, TInt16Key, pos)==0);
+	test(pos==1);
+	test(pArray->Find(Rec2, TInt16Key, pos)==0);
+	test(pos==2);
+	test(pArray->Find(Rec1, TInt16Key, pos)==0);
+	test(pos==3);
+
+	pArray->Sort(TUintKey);
+	// order should be 1,2,3,4
+	test(pArray->Find(Rec1, TUint16Key, pos)==0);
+	test(pos==0);
+	test(pArray->Find(Rec2, TUint16Key, pos)==0);
+	test(pos==1);
+	test(pArray->Find(Rec3, TUint16Key, pos)==0);
+	test(pos==2);
+	test(pArray->Find(Rec4, TUint16Key, pos)==0);
+	test(pos==3);
+
+	pArray->Sort(TInt32Key);
+	// order should be 4,3,2,1
+	test(pArray->Find(Rec4, TInt32Key, pos)==0);
+	test(pos==0);
+	test(pArray->Find(Rec3, TInt32Key, pos)==0);
+	test(pos==1);
+	test(pArray->Find(Rec2, TInt32Key, pos)==0);
+	test(pos==2);
+	test(pArray->Find(Rec1, TInt32Key, pos)==0);
+	test(pos==3);
+
+	pArray->Sort(TUint32Key);
+	// order should be 1,2,3,4
+	test(pArray->Find(Rec1, TUint32Key, pos)==0);
+	test(pos==0);
+	test(pArray->Find(Rec2, TUint32Key, pos)==0);
+	test(pos==1);
+	test(pArray->Find(Rec3, TUint32Key, pos)==0);
+	test(pos==2);
+	test(pArray->Find(Rec4, TUint32Key, pos)==0);
+	test(pos==3);
+
+	delete pArray;
+	}
+
+GLDEF_C TInt E32Main()
+    {
+
+	test.Title();	
+	test.Start(_L("Fixed key class with a flat array of TText8"));
+	typedef CArrayFixFlat<TArr<TText8,5> >  aFixedFlatArrayOfTText8;		
+	TestTKey<TKeyArrayFix, aFixedFlatArrayOfTText8, TText8> T1;
+	T1.Test1(ECmpNormal8, ECmpFolded8, ECmpCollated8);
+  
+	test.Next(_L("Fixed key class with a flat array of TText16"));
+	typedef CArrayFixFlat<TArr<TText16,5> >  aFixedFlatArrayOfTText16;		
+	TestTKey<TKeyArrayFix, aFixedFlatArrayOfTText16, TText16> T2;
+	T2.Test1(ECmpNormal16, ECmpFolded16, ECmpCollated16);
+
+	test.Next(_L("Fixed key class with a flat array of TText"));
+	typedef CArrayFixFlat<TArr<TText,5> >  aFixedFlatArrayOfTText;		
+	TestTKey<TKeyArrayFix, aFixedFlatArrayOfTText, TText> T3;
+	T3.Test1(ECmpNormal, ECmpFolded, ECmpCollated);
+
+	test.Next(_L("Fixed key class with a segmented array of TText8"));
+	typedef CArrayFixSeg<TArr<TText8,5> >  aFixedSegmentedArrayOfTText8;		
+	TestTKey<TKeyArrayFix, aFixedSegmentedArrayOfTText8, TText8> T4;
+	T4.Test1(ECmpNormal8, ECmpFolded8, ECmpCollated8);
+						   
+	test.Next(_L("Fixed key class with a segmented array of TText16"));
+	typedef CArrayFixSeg<TArr<TText16,5> >  aFixedSegmentedArrayOfTText16;		
+	TestTKey<TKeyArrayFix, aFixedSegmentedArrayOfTText16, TText16> T5;
+	T5.Test1(ECmpNormal16, ECmpFolded16, ECmpCollated16);
+
+	test.Next(_L("Fixed key class with a segmented array of TText"));
+	typedef CArrayFixSeg<TArr<TText,5> >  aFixedSegmentedArrayOfTText;		
+	TestTKey<TKeyArrayFix, aFixedSegmentedArrayOfTText, TText> T6;
+	T6.Test1(ECmpNormal, ECmpFolded, ECmpCollated);
+
+	test.Next(_L("Var key with a flat array of TText8"));
+	typedef CArrayVarFlat<TText8> aVarFlatArrayOfTText8;
+	TestTKey<TKeyArrayVar, aVarFlatArrayOfTText8, TText8> T7;
+	T7.Test2(ECmpNormal8, ECmpFolded8, ECmpCollated8);
+
+	test.Next(_L("Var key with a flat array of TText16"));
+	typedef CArrayVarFlat<TText16> aVarFlatArrayOfTText16;
+	TestTKey<TKeyArrayVar, aVarFlatArrayOfTText16, TText16> T8;
+	T8.Test2(ECmpNormal16, ECmpFolded16, ECmpCollated16);
+
+	test.Next(_L("Var key with a flat array of TText"));
+	typedef CArrayVarFlat<TText> aVarFlatArrayOfTText;
+	TestTKey<TKeyArrayVar, aVarFlatArrayOfTText, TText> T9;
+	T9.Test2(ECmpNormal, ECmpFolded, ECmpCollated);
+
+	test.Next(_L("Var key with a segmented array of TText8"));
+	typedef CArrayVarSeg<TText8> aVarSegmentedArrayOfTText8;
+	TestTKey<TKeyArrayVar, aVarSegmentedArrayOfTText8, TText8> T10;
+	T10.Test2(ECmpNormal8, ECmpFolded8, ECmpCollated8);	
+
+	test.Next(_L("Var key with a segmented array of TText16"));
+	typedef CArrayVarSeg<TText16> aVarSegmentedArrayOfTText16;
+	TestTKey<TKeyArrayVar, aVarSegmentedArrayOfTText16, TText16> T11;
+	T11.Test2(ECmpNormal16, ECmpFolded16, ECmpCollated16);
+
+	test.Next(_L("Var key with a segmented array of TText"));
+	typedef CArrayVarSeg<TText> aVarSegmentedArrayOfTText;
+	TestTKey<TKeyArrayVar, aVarSegmentedArrayOfTText, TText> T12;
+	T12.Test2(ECmpNormal, ECmpFolded, ECmpCollated);
+
+	test.Next(_L("Fixed key with a flat array of structs"));
+	typedef CArrayFixFlat<Record> aFixedFlatArrayOfRecord;
+	TestTKey<TKeyArrayFix, aFixedFlatArrayOfRecord, TText> T13;
+	T13.Test3();
+
+	test.Next(_L("Fixed key with a segmented array of structs"));
+	typedef CArrayFixSeg<Record> aFixedSegmentedArrayOfRecord;
+	TestTKey<TKeyArrayFix, aFixedSegmentedArrayOfRecord, TText> T14;
+	T14.Test3();
+  
+	test.Next(_L("Var key with a flat array of structs"));
+	typedef CArrayVarFlat<Record> aVarFlatArrayOfRecord;
+	TestTKey<TKeyArrayVar, aVarFlatArrayOfRecord, TText> T15;
+	T15.Test4();
+
+	test.Next(_L("Var key with a segmented array of structs"));
+	typedef CArrayVarSeg<Record> aVarSegmentedArrayOfRecord;
+	TestTKey<TKeyArrayVar, aVarSegmentedArrayOfRecord, TText> T16;
+	T16.Test4();
+
+	test.Next(_L("Fixed key with a flat array of structs testing numeric types"));
+	typedef CArrayFixFlat<Record2> aFixedFlatArrayOfRecord2;
+	TestTKey<TKeyArrayFix, aFixedFlatArrayOfRecord2, TText> T17;
+	T17.Test5();   
+
+	test.Next(_L("Var key with a flat array of structs testing numeric types"));
+	typedef CArrayVarFlat<Record2> aVarFlatArrayOfRecord2;
+	TestTKey<TKeyArrayVar, aVarFlatArrayOfRecord2, TText> T18;
+	T18.Test6();
+	test.End();
+	return(KErrNone);
+    }
+
+/*#else
+GLDEF_C TInt E32Main()
+//
+// Test unavailable in release build.
+//
+    {
+
+	test.Title();	
+	test.Start(_L("No tests for release builds"));
+	test.End();
+	return(0);
+    }
+#endif
+
+*/
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32test/buffer/t_lex.cpp	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,1550 @@
+// Copyright (c) 1994-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32test\buffer\t_lex.cpp
+// Overview:
+// Test TLex and TLexMark classes.
+// API Information:
+// TLex, TLexMark.
+// Details:
+// - For Unicode, non Unicode and build independent variant of TLex class
+// - Test that string-parsing methods are present.
+// - Test the constructors with no parameter, by a string, with an empty TLex class, 
+// non-empty TLex class is as expected.
+// - Test assignment operator of TLex, by initializing with TLex reference, string, 
+// TBuf reference and check it is as expected.
+// - Check that Eos, Inc, Mark, Get, Peek, UnGet, SkipSpace, SkipSpaceAndMark, 
+// SkipCharacters, TokenLength, MarkedToken methods are as expected.
+// - Initialize Lex string, assign different values, Parse to extract signed, 
+// unsigned integer of different lengths, using specified radix and verify 
+// that the return value is KErrNone when a valid string is parsed, KErrGeneral 
+// when invalid string is parsed, KErrOverflow when converted value is greater 
+// than the limit. 
+// - Refresh the contents with the system's locale settings, separate whole number from 
+// it's fractional part, change locale settings then parse a 64-bit floating point 
+// number and check that results are as expected.
+// Platforms/Drives/Compatibility:
+// All 
+// Assumptions/Requirement/Pre-requisites:
+// Failures and causes:
+// Base Port information:
+// 
+//
+
+#include <e32test.h>
+
+LOCAL_D RTest test(_L("T_LEX")); 
+
+struct TLexMark8Dump
+	{
+	const TUint8* iPtr;
+	};
+
+struct TLexMark16Dump
+	{
+	const TUint16* iPtr;
+	};
+
+void TLexMark8::__DbgTest(void *pTLexMark8Dump) const 
+	{
+	((TLexMark8Dump*)pTLexMark8Dump)->iPtr=iPtr;
+	}
+
+void TLexMark16::__DbgTest(void *pTLexMark16Dump) const 
+	{
+	((TLexMark16Dump*)pTLexMark16Dump)->iPtr=iPtr;
+	}
+
+struct TLex8Dump
+	{
+	const TUint8* iNext;
+	const TUint8* iBuf;
+	const TUint8* iEnd;
+	TLexMark8Dump iMark;
+	};
+
+struct TLex16Dump
+	{
+	const TUint16* iNext;
+	const TUint16* iBuf;
+	const TUint16* iEnd;
+	TLexMark16Dump iMark;
+	};
+
+
+void TLex8::__DbgTest(void* pTLex8Dump) const
+	{
+	((TLex8Dump*)pTLex8Dump)->iNext=iNext;
+	((TLex8Dump*)pTLex8Dump)->iBuf=iBuf;
+	((TLex8Dump*)pTLex8Dump)->iEnd=iEnd;
+	iMark.__DbgTest(&((TLex8Dump*)pTLex8Dump)->iMark);
+	}
+
+void TLex16::__DbgTest(void* pTLex16Dump) const
+	{
+	((TLex16Dump*)pTLex16Dump)->iNext=iNext;
+	((TLex16Dump*)pTLex16Dump)->iBuf=iBuf;
+	((TLex16Dump*)pTLex16Dump)->iEnd=iEnd;
+	iMark.__DbgTest(&((TLex16Dump*)pTLex16Dump)->iMark);
+	}
+
+
+LOCAL_C	void TestDes(const TUint16* start1, const TUint16* start2, const TUint16* end1, const TUint16* end2)
+	{
+	TPtrC16 des1(start1, end1-start1);
+	TPtrC16 des2(start2, end2-start2);
+	test(des1==des2);
+	}
+LOCAL_C	void TestDes(const TUint8* start1, const TUint8* start2, const TUint8* end1, const TUint8* end2)
+	{
+	TPtrC8 des1(start1, end1-start1);
+	TPtrC8 des2(start2, end2-start2);
+	test(des1==des2);
+	}
+LOCAL_C void TestDes(const TUint16* start, const TUint16* end, const TUint16* string)
+	{
+	TPtrC16 des1(start, end-start);
+	TPtrC16 des2(string);
+	test(des1==des2);
+	}
+LOCAL_C void TestDes(const TUint8* start, const TUint8* end, const TUint8* string)
+	{
+	TPtrC8 des1(start, end-start);
+	TPtrC8 des2(string);
+	test(des1==des2);
+	}
+
+
+void _LL(TText8 array[], TText8 string[])
+	{
+
+	TInt index=0;
+	for(;string[index]; index++)
+		array[index]=string[index];
+	array[index]='\0';
+	}		
+
+void _LL(TText16 array[], TText8 string[])
+	{
+
+	TInt index=0;
+	for(;string[index]; index++)
+		array[index]=string[index];
+	array[index]='\0';
+	}
+  
+template<class TDesType, class TLexType, class TLexMarkType, class TBufType, class DumpType, class MarkDumpType, class S>
+class TestTLex
+	{
+public:
+	void Test1();
+	void Test2();
+	void Test3();
+	void Test4();
+	void Test5();
+protected:
+	void TestList(TLexType* object, TUint param, ...);
+	};
+
+
+//*********************************
+// Test that methods are in the DLL
+//*********************************
+template<class TDesType, class TLexType, class TLexMarkType, class TBufType, class DumpType, class MarkDumpType, class S>
+GLDEF_C void TestTLex<TDesType, TLexType, TLexMarkType, TBufType, DumpType, MarkDumpType, S>::Test1()
+	{
+	test.Start(_L("Constructors"));
+	S String[100];
+	_LL(&String[0], (TText8*)"hello");
+	TBufType aTBufObject;
+	TLexType a;								
+	TLexType b(a);						   
+	TLexType c(&String[0]);					
+	TLexType d(aTBufObject);
+    d.Offset(); // Avoids 'unused' warning
+	TLexMarkType mark;
+
+	test.Next(_L("Assignment operations"));
+	a=b;							
+	a=&String[0];					
+	a=aTBufObject;					
+
+	test.Next(_L("Assorted"));
+	c.Eos();
+	c.Mark(mark);
+	c.Mark();
+	c.Inc();
+	c.Get();
+	(S)c.Peek();
+	c.UnGet();
+	c.UnGetToMark(mark);
+	c.UnGetToMark();
+	c.SkipSpace();
+	c.SkipSpaceAndMark(mark);
+	c.SkipSpaceAndMark();
+	c.SkipCharacters();
+	c.TokenLength(mark);
+	c.TokenLength();
+	aTBufObject=c.MarkedToken(mark);
+	aTBufObject=c.MarkedToken();
+	aTBufObject=c.NextToken();
+	aTBufObject=c.Remainder();
+	aTBufObject=c.RemainderFromMark(mark);
+	aTBufObject=c.RemainderFromMark();
+	c.Offset();
+	c.MarkedOffset(mark);
+	c.MarkedOffset();
+
+	test.Next(_L("Val"));  
+	TInt TI=1;
+	c.Val(TI);
+	TInt8 TI8='a';
+	c.Val(TI8);
+	TInt16 TI16=1;
+	c.Val(TI16);
+	TInt32 TI32=1;
+	c.Val(TI32);
+	TInt64 TI64=1;
+	c.Val(TI64);
+	TUint TU=1;
+	c.Val(TU);
+	TReal32 TR32=1.0F;
+	c.Val(TR32);
+	TReal64 TR64=1.0;
+	c.Val(TR64);
+	TUint8 TU8='a';
+	TUint32 TU32=1;
+	TRadix TR=(TRadix)EDecimal;
+	TUint16 TU16=1;
+
+	c.Val(TU8, TR);
+	c.Val(TU16, TR);  	
+	c.BoundedVal(TI32, TU);
+	c.BoundedVal(TU32, TR, TU);
+	c.BoundedVal(TI64, TR, TU);
+
+	test.Next(_L("Assign"));
+	c.Assign(b);
+	c.Assign(&String[0]);
+	c.Assign(aTBufObject);	
+
+	test.Next(_L("Test Dumps"));
+	MarkDumpType mDump;
+	mark.__DbgTest(&mDump);
+
+	DumpType dump;
+	c.__DbgTest(&dump);
+	test.End();
+	} 
+		
+
+///////////////////////////////////////
+// Test calling Convert() with  a list
+///////////////////////////////////////
+template<class TDesType, class TLexType, class TLexMarkType, class TBufType, class DumpType, class MarkDumpType, class S>
+GLDEF_C void TestTLex<TDesType, TLexType, TLexMarkType, TBufType, DumpType, MarkDumpType, S>::TestList(TLexType *object, TUint param, ...)
+	{
+	VA_LIST l;
+	TBufType b;
+
+	VA_START(l, param);
+	object->Convert(b, l);
+	}
+
+
+/////////////////////////
+// Test the constructors
+////////////////////////
+template<class TDesType, class TLexType, class TLexMarkType, class TBufType, class DumpType, class MarkDumpType, class S>
+GLDEF_C void TestTLex<TDesType, TLexType, TLexMarkType, TBufType, DumpType, MarkDumpType, S>::Test2()
+	{
+	// Test constructors  NOTE: there's no getters for iMark or iBuf
+	DumpType dump, dump2;
+	S String[40];
+
+	test.Start(_L("Constructors:"));	// TLexx::TLexx()
+	test.Next(_L("By default"));
+	TLexType a; 
+	a.__DbgTest(&dump);
+	test(dump.iBuf==NULL);
+ 	
+	test.Next(_L("By string"));		 	// TLexx::TLexx(const TUintx*)
+	_LL(&String[0], (TText8*)"AB");
+	TLexType b(&String[0]);
+	b.__DbgTest(&dump);
+	TestDes(dump.iNext, dump.iEnd, &String[0]);
+	TestDes(dump.iBuf, dump.iEnd, &String[0]);
+	TestDes(dump.iMark.iPtr, dump.iEnd, &String[0]);
+
+	test.Next(_L("By TLex reference"));	// TLexx::TLexx(const TLexx&)
+	// Test with an empty class
+	TLexType c, d(c);
+	c.__DbgTest(&dump);
+	d.__DbgTest(&dump2);
+	TestDes(dump.iNext, dump2.iNext, dump.iEnd, dump2.iEnd);
+	test(dump.iBuf==NULL);
+	test(dump.iBuf==dump2.iBuf); 
+	TestDes(dump.iMark.iPtr, dump2.iMark.iPtr, dump.iEnd, dump2.iEnd);
+
+	//Test with a non empty class
+	_LL(&String[0], (TText8*)"XYZ");
+	TLexType e(&String[0]), f(e);
+	e.__DbgTest(&dump);
+	f.__DbgTest(&dump2);
+	TestDes(dump.iNext, dump.iEnd, &String[0]);
+	TestDes(dump.iNext, dump2.iNext, dump.iEnd, dump2.iEnd);
+	TestDes(dump.iBuf, dump2.iBuf, dump.iEnd, dump2.iEnd);
+	TestDes(dump.iMark.iPtr, dump2.iMark.iPtr, dump.iEnd, dump2.iEnd);
+	
+	test.Next(_L("By TBuf reference"));	//TLexx::TLexx(const TBufBasex&)
+	_LL(&String[0], (TText8*)"Hello");
+	TBufType aBuf(&String[0]);
+	TLexType g(aBuf);
+	g.__DbgTest(&dump);
+	TestDes(dump.iNext, dump.iEnd, &String[0]);
+	TestDes(dump.iBuf, dump.iEnd, &String[0]);
+	TestDes(dump.iMark.iPtr, dump.iEnd, &String[0]);
+
+	test.End();
+	}
+
+
+//*********************************
+// Test the = methods
+//*********************************
+template<class TDesType, class TLexType, class TLexMarkType, class TBufType, class DumpType, class MarkDumpType, class S>
+GLDEF_C void TestTLex<TDesType, TLexType, TLexMarkType, TBufType, DumpType, MarkDumpType, S>::Test3()
+	{
+	DumpType dump, dump2;
+	S String[40];
+
+	test.Start(_L("= operators"));
+	test.Next(_L("by TLex reference"));	//TLexx::operator=(const TLexx&)
+	_LL(&String[0], (TText8*)"MNO");
+	TLexType a(&String[0]), b;
+	b=a;	
+	a.__DbgTest(&dump);
+	b.__DbgTest(&dump2);  
+	TestDes(dump.iNext, dump2.iNext, dump.iEnd, dump2.iEnd); 
+	TestDes(dump.iMark.iPtr, dump2.iMark.iPtr, dump.iEnd, dump2.iEnd);
+	TestDes(dump.iBuf, dump2.iBuf, dump.iEnd, dump2.iEnd);
+
+	test.Next(_L("by string"));			//TLexx::operator=(const TUintx*)
+	TLexType c;
+	_LL(&String[0], (TText8*)" abc");
+	c=&String[0];
+	c.__DbgTest(&dump);
+	TestDes(dump.iNext, dump.iEnd, &String[0]);	
+	TestDes(dump.iBuf, dump.iEnd, &String[0]);
+	TestDes(dump.iMark.iPtr, dump.iEnd, &String[0]);
+
+	test.Next(_L("by TBuf reference"));	//TLexx::operator=(const TBufx&);
+	_LL(&String[0], (TText8*)"PQ R ");
+	TLexType d;
+	TBufType e(&String[0]);
+	d=e;
+	d.__DbgTest(&dump);
+	TestDes(dump.iNext, dump.iEnd, &String[0]);	
+	TestDes(dump.iBuf, dump.iEnd, &String[0]);
+	TestDes(dump.iMark.iPtr, dump.iEnd, &String[0]);	
+	test.End();	 		 
+	}
+
+
+//*********************************
+// Test supporting methods
+//*********************************
+template<class TDesType, class TLexType, class TLexMarkType, class TBufType, class DumpType, class MarkDumpType, class S>
+GLDEF_C void TestTLex<TDesType, TLexType, TLexMarkType, TBufType, DumpType, MarkDumpType, S>::Test4()
+	{
+	S String[40];
+	DumpType dump1,dump2;
+	MarkDumpType mDump;
+
+	test.Start(_L("Supporting methods"));
+	test.Next(_L("Eos()"));
+	_LL(&String[0], (TText8*)"GGG");
+	TLexType a, b(&String[0]);
+	test(a.Eos()==TRUE);
+	test(b.Eos()==FALSE);
+
+	test.Next(_L("Inc()"));	   // Inc() increments iNext
+	_LL(&String[0], (TText8*)"mno");
+	TLexType c(&String[0]);
+	c.__DbgTest(&dump1);
+
+	TestDes(dump1.iNext, dump1.iEnd, &String[0]);
+	c.Inc();
+	test((S)c.Peek()==String[1]);
+	c.Inc();
+	test((S)c.Peek()==String[2]);
+
+	test.Next(_L("Mark()"));		//	Mark() sets iMark=iNext
+	_LL(&String[0], (TText8*)"pqr");
+	TLexType d(&String[0]);
+	d.Inc();
+	d.__DbgTest(&dump1);
+	d.Mark();
+	d.__DbgTest(&dump2);
+	TestDes(dump2.iMark.iPtr, dump1.iNext, dump2.iEnd, dump1.iEnd);
+
+	test.Next(_L("Mark(mark)")); //	Mark(aMark) sets aMark=iNext
+	_LL(&String[0], (TText8*)"pqr");
+	TLexType d1(&String[0]);
+	TLexMarkType dm;
+	d1.Inc();
+	d1.__DbgTest(&dump1);
+	d1.Mark(dm);
+	dm.__DbgTest(&mDump);
+	TestDes(mDump.iPtr, dump1.iNext, dump1.iEnd, dump1.iEnd);
+
+
+	test.Next(_L("Get()")); 	// Get() is {TChar c(*iNext);Inc(); return(c);}
+	_LL(&String[0], (TText8*)"s");
+	TLexType e(&String[0]);
+	TChar temp=e.Get();
+	test(temp=='s');
+	e.Inc();
+	temp=e.Get();
+	test(temp==0);
+
+
+	test.Next(_L("Peek()"));	// Peek() returns *iNext
+	TLexType f;
+	test(f.Peek()==0);
+	_LL(&String[0], (TText8*)"ab");
+	TLexType g(&String[0]);
+	test((S)g.Peek()==String[0]);
+
+	test.Next(_L("UnGet()"));	//  UnGet() is effectively if(iNext!=iBuf) iNext--;
+	_LL(&String[0], (TText8*)"abc");
+	TLexType h(&String[0]);
+	h.Inc();
+	test((S)h.Peek()==String[1]);
+	h.UnGet();
+	test((S)h.Peek()==String[0]);
+
+	test.Next(_L("SkipSpace()"));	// SkipSpace() 	is while(Peek.IsSpace()) iNext++;
+	_LL(&String[0], (TText8*)"  j  kl");
+	TLexType i(&String[0]);
+	i.SkipSpace();
+	test((S)i.Peek()==String[2]);
+	i.Inc();
+	i.SkipSpace();
+	test((S)i.Peek()==String[5]);
+
+	test.Next(_L("SkipSpaceAndMark()"));	// while(Peek.IsSpace()) iNext++;	iMark=iNext;
+	_LL(&String[0], (TText8*)"    aaa");
+	TLexType j(&String[0]);
+	j.SkipSpaceAndMark();
+	j.__DbgTest(&dump1);
+	_LL(&String[0], (TText8*)"aaa");
+	TestDes(dump1.iNext, dump1.iEnd, &String[0]);
+	TestDes(dump1.iMark.iPtr, dump1.iEnd, &String[0]);
+
+	test.Next(_L("SkipSpaceAndMark(aMark)"));	// while(Peek.IsSpace()) iNext++;	iMark=iNext;
+	_LL(&String[0], (TText8*)"    aaa");
+	TLexType j1(&String[0]);
+	TLexMarkType jm;
+	j1.SkipSpaceAndMark(jm);
+	j1.__DbgTest(&dump1);
+	jm.__DbgTest(&mDump);
+	_LL(&String[0], (TText8*)"aaa");
+	TestDes(dump1.iNext, dump1.iEnd, &String[0]);
+	TestDes(mDump.iPtr, dump1.iEnd, &String[0]);
+
+	test.Next(_L("SkipCharacters()"));	// Skips non whitespace characters
+	_LL(&String[0], (TText8*)"abc   ");
+	TLexType k(&String[0]);
+	k.SkipCharacters();
+	test((S)k.Peek()==String[3]);
+
+	test.Next(_L("TokenLength()"));		// returns iNext-iMark
+	_LL(&String[0], (TText8*)"GGG");
+	TLexType l(&String[0]);
+	test(l.TokenLength()==0);
+	l.Inc();
+	test(l.TokenLength()==1); 
+
+	test.Next(_L("MarkedToken()"));		// Extract a marked token
+	_LL(&String[0], (TText8*)"ABCD");
+	TLexType m(&String[0]);
+	TBufType Buf;
+	TLexMarkType mm;
+	m.Inc();
+	m.Mark();
+	m.Inc();
+	m.Mark(mm);
+	m.Inc();
+	Buf=m.MarkedToken();
+	S String2[4];
+	_LL(&String2[0], (TText8*)"BC");
+	test(TDesType(&String2[0])==Buf); 
+	_LL(&String2[0], (TText8*)"C");
+	Buf=m.MarkedToken(mm);
+	test(TDesType(&String2[0])==Buf); 
+
+	test.End();
+	}
+
+
+//*********************************
+// Test Val()
+//*********************************
+template<class TDesType, class TLexType, class TLexMarkType, class TBufType, class DumpType, class MarkDumpType, class S>
+GLDEF_C void TestTLex<TDesType, TLexType, TLexMarkType, TBufType, DumpType, MarkDumpType, S>::Test5()
+	{
+	S String[66];
+	TInt ret; 
+	TLexType Lex;
+	test.Start(_L("Val()"));
+
+	//////////////////
+	// Test Val(TInt8)
+	/////////////////
+	test.Next(_L("Val(TInt8)"));
+	TInt8 T8;
+	_LL(&String[0], (TText8*)"");
+	Lex=&String[0];
+	test((ret=Lex.Val(T8))==KErrGeneral);
+
+	_LL(&String[0], (TText8*)"abc");
+	Lex=&String[0];
+	test((ret=Lex.Val(T8))==KErrGeneral);
+
+	_LL(&String[0], (TText8*)"-abc-");
+	Lex=&String[0];
+	test((ret=Lex.Val(T8))==KErrGeneral);
+	
+	_LL(&String[0], (TText8*)"+abc+");
+	Lex=&String[0];
+	test((ret=Lex.Val(T8))==KErrGeneral);
+
+	_LL(&String[0], (TText8*)"0000000123abc");
+	Lex=&String[0];
+	test((ret=Lex.Val(T8))==KErrNone);
+	test(T8==123);
+
+	_LL(&String[0], (TText8*)"000");
+	Lex=&String[0];
+	test((ret=Lex.Val(T8))==KErrNone);
+	test(T8==0);
+
+	_LL(&String[0], (TText8*)"+0");
+	Lex=&String[0];
+	test((ret=Lex.Val(T8))==KErrNone);
+	test(T8==0);
+
+	_LL(&String[0], (TText8*)"-0");
+	Lex=&String[0];
+	test((ret=Lex.Val(T8))==KErrNone);
+	test(T8==0);
+
+	_LL(&String[0], (TText8*)"+1 ");
+	Lex=&String[0];
+	test((ret=Lex.Val(T8))==KErrNone);
+	test(T8==1);
+
+	_LL(&String[0], (TText8*)"-1 ");
+	Lex=&String[0];
+	test((ret=Lex.Val(T8))==KErrNone);
+	test(T8==-1);
+
+	_LL(&String[0], (TText8*)"127");
+	Lex=&String[0];
+	test((ret=Lex.Val(T8))==KErrNone);
+	test(T8==127);
+
+	_LL(&String[0], (TText8*)"128");
+	Lex=&String[0];
+	test((ret=Lex.Val(T8))==KErrOverflow);
+
+	_LL(&String[0], (TText8*)"-128");
+	Lex=&String[0];
+	test((ret=Lex.Val(T8))==KErrNone);
+	test(T8==-128);
+
+	_LL(&String[0], (TText8*)"-129");
+	Lex=&String[0];
+	test((ret=Lex.Val(T8))==KErrOverflow);
+
+
+	///////////////////
+	// Test Val(TInt16)
+	///////////////////
+	test.Next(_L("Val(TInt16)"));
+	TInt16 T16;
+	_LL(&String[0], (TText8*)"");
+	Lex=&String[0];
+	test((ret=Lex.Val(T16))==KErrGeneral);
+
+	_LL(&String[0], (TText8*)"32767");
+	Lex=&String[0];
+	test((ret=Lex.Val(T16))==KErrNone);
+	test(T16==32767);
+
+	_LL(&String[0], (TText8*)"32768");
+	Lex=&String[0];
+	test((ret=Lex.Val(T16))==KErrOverflow);
+
+	_LL(&String[0], (TText8*)"-32768");
+	Lex=&String[0];
+	test((ret=Lex.Val(T16))==KErrNone);
+	test(T16==-32768);
+
+	_LL(&String[0], (TText8*)"-32769");
+	Lex=&String[0];
+	test((ret=Lex.Val(T16))==KErrOverflow);
+
+
+	///////////////////
+	// Test Val(TInt32)
+	///////////////////
+	test.Next(_L("Val(TInt32)"));
+	TInt32 T32;
+	_LL(&String[0], (TText8*)"");
+	Lex=&String[0];
+	test((ret=Lex.Val(T32))==KErrGeneral);
+
+	_LL(&String[0], (TText8*)"2147483647");
+	Lex=&String[0];
+	test((ret=Lex.Val(T32))==KErrNone);
+	test(T32==2147483647L);
+
+	_LL(&String[0], (TText8*)"2147483648");
+	Lex=&String[0];
+	test((ret=Lex.Val(T32))==KErrOverflow);
+
+	_LL(&String[0], (TText8*)"-2147483648");
+	Lex=&String[0];
+	test((ret=Lex.Val(T32))==KErrNone);
+	test(T32==-2147483647-1);  // the -1 prevents a (bug?) warning
+
+	_LL(&String[0], (TText8*)"-2147483649");
+	Lex=&String[0];
+	test((ret=Lex.Val(T32))==KErrOverflow);
+
+
+	/////////////////
+	// Test Val(TInt)
+	/////////////////
+	test.Next(_L("Val(TInt)"));
+	TInt T;
+	_LL(&String[0], (TText8*)"");
+	Lex=&String[0];
+	test((ret=Lex.Val(T))==KErrGeneral);
+
+	_LL(&String[0], (TText8*)"2147483647");
+	Lex=&String[0];
+	test((ret=Lex.Val(T))==KErrNone);
+	test(T==2147483647L);
+
+	_LL(&String[0], (TText8*)"2147483648");
+	Lex=&String[0];
+	test((ret=Lex.Val(T))==KErrOverflow);
+
+	_LL(&String[0], (TText8*)"-2147483648");
+	Lex=&String[0];
+	test((ret=Lex.Val(T))==KErrNone);
+	test(T==-2147483647-1);  // the -1 prevents a (bug?) warning
+
+	_LL(&String[0], (TText8*)"-2147483649");
+	Lex=&String[0];
+	test((ret=Lex.Val(T))==KErrOverflow);
+
+	/////////////////
+	// Test Val(TInt64)
+	/////////////////
+	test.Next(_L("Val(TInt64)"));
+	TInt64 T64;
+	_LL(&String[0], (TText8*)"");
+	Lex=&String[0];
+	test((ret=Lex.Val(T64))==KErrGeneral);
+
+	_LL(&String[0], (TText8*)"2147483647");
+	Lex=&String[0];
+	test((ret=Lex.Val(T64))==KErrNone);
+	test(T64==TInt(2147483647L));
+
+	_LL(&String[0], (TText8*)"2147483648");
+	Lex=&String[0];
+	test((ret=Lex.Val(T64))==KErrNone);
+	test(T64==MAKE_TINT64(0,0x80000000u));
+
+	_LL(&String[0], (TText8*)"-2147483648");
+	Lex=&String[0];
+	test((ret=Lex.Val(T64))==KErrNone);
+	test(T64==-2147483647-1);  // the -1 prevents a (bug?) warning
+
+	_LL(&String[0], (TText8*)"-2147483649");
+	Lex=&String[0];
+	test((ret=Lex.Val(T64))==KErrNone);
+	test(T64==MAKE_TINT64(0xffffffffu,0x7fffffffu));
+
+	_LL(&String[0], (TText8*)"9223372036854775807");
+	Lex=&String[0];
+	ret=Lex.Val(T64);
+	test.Printf(_L("ret=%d\n"),ret);
+	test(ret==KErrNone);
+	test.Printf(_L("%lx\n"),T64);
+	test(T64==MAKE_TINT64(0x7fffffffu,0xffffffffu));
+
+	_LL(&String[0], (TText8*)"9223372036854775808");
+	Lex=&String[0];
+	test((ret=Lex.Val(T64))==KErrOverflow);
+
+	_LL(&String[0], (TText8*)"-9223372036854775808");
+	Lex=&String[0];
+	test((ret=Lex.Val(T64))==KErrNone);
+	test(T64==MAKE_TINT64(0x80000000u,0x0));
+
+	_LL(&String[0], (TText8*)"-9223372036854775809");
+	Lex=&String[0];
+	test((ret=Lex.Val(T64))==KErrOverflow);
+
+	////////////////////					
+	// Test Val(TReal32)
+	/////////////////////
+//	test.Next(_L("Val(TReal32)"));
+//	TReal32 TR32;
+//	test((ret=Lex.Val(TR32))==KErrNotSupported);
+
+
+	////////////////////
+	// Test Val(TReal64)
+	///////////////////
+//	test.Next(_L("Val(TReal64)"));
+//	TReal64 TR64;
+//	test((ret=Lex.Val(TR64))==KErrNotSupported);
+
+
+	///////////////////////////
+	// Test Val(TUint8, TRadix)
+	///////////////////////////
+	test.Next(_L("Val(TUint8, TRadix)"));
+	TUint8 TU8;
+
+	_LL(&String[0], (TText8*)"00");
+	Lex=&String[0];
+	test((ret=Lex.Val(TU8, (TRadix)EBinary))==KErrNone);
+	test(TU8==0);
+
+	_LL(&String[0], (TText8*)"01");
+	Lex=&String[0];
+	test((ret=Lex.Val(TU8, (TRadix)EBinary))==KErrNone);
+	test(TU8==1);
+
+	_LL(&String[0], (TText8*)"11111111");
+	Lex=&String[0];
+	test((ret=Lex.Val(TU8, (TRadix)EBinary))==KErrNone);
+	test(TU8==255);
+
+	_LL(&String[0], (TText8*)"100000000");
+	Lex=&String[0];
+	test((ret=Lex.Val(TU8, (TRadix)EBinary))==KErrOverflow);
+
+	_LL(&String[0], (TText8*)"00");
+	Lex=&String[0];
+	test((ret=Lex.Val(TU8, (TRadix)EOctal))==KErrNone);
+	test(TU8==0);
+
+	_LL(&String[0], (TText8*)"01");
+	Lex=&String[0];
+	test((ret=Lex.Val(TU8, (TRadix)EOctal))==KErrNone);
+	test(TU8==1);
+
+	_LL(&String[0], (TText8*)"377");
+	Lex=&String[0];
+	test((ret=Lex.Val(TU8, (TRadix)EOctal))==KErrNone);
+	test(TU8==255);
+
+	_LL(&String[0], (TText8*)"400");
+	Lex=&String[0];			
+	test((ret=Lex.Val(TU8, (TRadix)EOctal))==KErrOverflow);
+
+	_LL(&String[0], (TText8*)"00");
+	Lex=&String[0];
+	test((ret=Lex.Val(TU8, (TRadix)EDecimal))==KErrNone);
+	test(TU8==0);
+
+	_LL(&String[0], (TText8*)"01");
+	Lex=&String[0];
+	test((ret=Lex.Val(TU8, (TRadix)EDecimal))==KErrNone);
+	test(TU8==1);
+
+	_LL(&String[0], (TText8*)"255");
+	Lex=&String[0];
+	test((ret=Lex.Val(TU8, (TRadix)EDecimal))==KErrNone);
+	test(TU8==255);
+
+	_LL(&String[0], (TText8*)"256");
+	Lex=&String[0];			
+	test((ret=Lex.Val(TU8, (TRadix)EDecimal))==KErrOverflow);
+
+	_LL(&String[0], (TText8*)"00");
+	Lex=&String[0];
+	test((ret=Lex.Val(TU8, (TRadix)EHex))==KErrNone);
+	test(TU8==0);
+
+	_LL(&String[0], (TText8*)"01");
+	Lex=&String[0];
+	test((ret=Lex.Val(TU8, (TRadix)EHex))==KErrNone);
+	test(TU8==1);
+
+	_LL(&String[0], (TText8*)"Ff");
+	Lex=&String[0];
+	test((ret=Lex.Val(TU8, (TRadix)EHex))==KErrNone);
+	test(TU8==255);
+
+	_LL(&String[0], (TText8*)"100");
+	Lex=&String[0];			
+	test((ret=Lex.Val(TU8, (TRadix)EHex))==KErrOverflow);
+
+
+
+	////////////////////////////
+	// Test Val(TUint16, TRadix)
+	////////////////////////////
+	test.Next(_L("Val(TUint16, TRadix)"));
+	TUint16 TU16;
+
+	_LL(&String[0], (TText8*)"00");
+	Lex=&String[0];
+	test((ret=Lex.Val(TU16, (TRadix)EBinary))==KErrNone);
+	test(TU16==0);
+
+	_LL(&String[0], (TText8*)"01");
+	Lex=&String[0];
+	test((ret=Lex.Val(TU16, (TRadix)EBinary))==KErrNone);
+	test(TU16==1);
+
+	_LL(&String[0], (TText8*)"1111111111111111");
+	Lex=&String[0];
+	test((ret=Lex.Val(TU16, (TRadix)EBinary))==KErrNone);
+	test(TU16==65535);
+
+	_LL(&String[0], (TText8*)"10000000000000000");
+	Lex=&String[0];
+	test((ret=Lex.Val(TU16, (TRadix)EBinary))==KErrOverflow);
+
+	_LL(&String[0], (TText8*)"00");
+	Lex=&String[0];
+	test((ret=Lex.Val(TU16, (TRadix)EOctal))==KErrNone);
+	test(TU16==0);
+
+	_LL(&String[0], (TText8*)"01");
+	Lex=&String[0];
+	test((ret=Lex.Val(TU16, (TRadix)EOctal))==KErrNone);
+	test(TU16==1);
+
+	_LL(&String[0], (TText8*)"177777");
+	Lex=&String[0];
+	test((ret=Lex.Val(TU16, (TRadix)EOctal))==KErrNone);
+	test(TU16==65535);
+
+	_LL(&String[0], (TText8*)"200000");
+	Lex=&String[0];
+	test((ret=Lex.Val(TU16, (TRadix)EOctal))==KErrOverflow);
+
+	_LL(&String[0], (TText8*)"00");
+	Lex=&String[0];
+	test((ret=Lex.Val(TU16, (TRadix)EDecimal))==KErrNone);
+	test(TU16==0);
+
+	_LL(&String[0], (TText8*)"01");
+	Lex=&String[0];
+	test((ret=Lex.Val(TU16, (TRadix)EDecimal))==KErrNone);
+	test(TU16==1);
+
+	_LL(&String[0], (TText8*)"65535");
+	Lex=&String[0];
+	test((ret=Lex.Val(TU16, (TRadix)EDecimal))==KErrNone);
+	test(TU16==65535);
+
+	_LL(&String[0], (TText8*)"65536");
+	Lex=&String[0];			
+	test((ret=Lex.Val(TU16, (TRadix)EDecimal))==KErrOverflow);
+
+	_LL(&String[0], (TText8*)"00");
+	Lex=&String[0];
+	test((ret=Lex.Val(TU16, (TRadix)EHex))==KErrNone);
+	test(TU16==0);
+
+	_LL(&String[0], (TText8*)"01");
+	Lex=&String[0];
+	test((ret=Lex.Val(TU16, (TRadix)EHex))==KErrNone);
+	test(TU16==1);
+
+	_LL(&String[0], (TText8*)"ffFf");
+	Lex=&String[0];
+	test((ret=Lex.Val(TU16, (TRadix)EHex))==KErrNone);
+	test(TU16==65535);
+
+	_LL(&String[0], (TText8*)"10000");
+	Lex=&String[0];			
+	test((ret=Lex.Val(TU16, (TRadix)EHex))==KErrOverflow);
+
+
+
+	////////////////////////////
+	// Test Val(TUint32, TRadix)
+	////////////////////////////
+	test.Next(_L("Val(TUint32, TRadix)"));
+	TUint32 TU32;
+
+	_LL(&String[0], (TText8*)"00");
+	Lex=&String[0];
+	test((ret=Lex.Val(TU32, (TRadix)EBinary))==KErrNone);
+	test(TU32==0);
+
+	_LL(&String[0], (TText8*)"01");
+	Lex=&String[0];
+	test((ret=Lex.Val(TU32, (TRadix)EBinary))==KErrNone);
+	test(TU32==1);
+
+	_LL(&String[0], (TText8*)"11111111111111111111111111111111");
+	Lex=&String[0];
+	test((ret=Lex.Val(TU32, (TRadix)EBinary))==KErrNone);
+	test(TU32==4294967295u);
+
+	_LL(&String[0], (TText8*)"100000000000000000000000000000000");
+	Lex=&String[0];
+	test((ret=Lex.Val(TU32, (TRadix)EBinary))==KErrOverflow);
+
+	_LL(&String[0], (TText8*)"00");
+	Lex=&String[0];
+	test((ret=Lex.Val(TU32, (TRadix)EOctal))==KErrNone);
+	test(TU32==0);
+
+	_LL(&String[0], (TText8*)"01");
+	Lex=&String[0];
+	test((ret=Lex.Val(TU32, (TRadix)EOctal))==KErrNone);
+	test(TU32==1);
+
+	_LL(&String[0], (TText8*)"37777777777");
+	Lex=&String[0];
+	test((ret=Lex.Val(TU32, (TRadix)EOctal))==KErrNone);
+	test(TU32==4294967295u);
+
+	_LL(&String[0], (TText8*)"40000000000");
+	Lex=&String[0];			
+	test((ret=Lex.Val(TU32, (TRadix)EOctal))==KErrOverflow);
+
+	_LL(&String[0], (TText8*)"00");
+	Lex=&String[0];
+	test((ret=Lex.Val(TU32, (TRadix)EDecimal))==KErrNone);
+	test(TU32==0);
+
+	_LL(&String[0], (TText8*)"01");
+	Lex=&String[0];
+	test((ret=Lex.Val(TU32, (TRadix)EDecimal))==KErrNone);
+	test(TU32==1);
+
+	_LL(&String[0], (TText8*)"4294967295");
+	Lex=&String[0];
+	test((ret=Lex.Val(TU32, (TRadix)EDecimal))==KErrNone);
+	test(TU32==4294967295u);
+
+	_LL(&String[0], (TText8*)"4294967296");
+	Lex=&String[0];			
+	test((ret=Lex.Val(TU32, (TRadix)EDecimal))==KErrOverflow);
+
+	_LL(&String[0], (TText8*)"00");
+	Lex=&String[0];
+	test((ret=Lex.Val(TU32, (TRadix)EHex))==KErrNone);
+	test(TU32==0);
+
+	_LL(&String[0], (TText8*)"01");
+	Lex=&String[0];
+	test((ret=Lex.Val(TU32, (TRadix)EHex))==KErrNone);
+	test(TU32==1);
+
+	_LL(&String[0], (TText8*)"FFFFFFFF");
+	Lex=&String[0];
+	test((ret=Lex.Val(TU32, (TRadix)EHex))==KErrNone);
+	test(TU32==4294967295u);
+
+	_LL(&String[0], (TText8*)"100000000");
+	Lex=&String[0];			
+	test((ret=Lex.Val(TU32, (TRadix)EHex))==KErrOverflow);
+
+ 	///////////////////////////////////
+	// Test Val(TInt64, TRadix)
+	///////////////////////////////////
+	test.Next(_L("Val(TInt64,TRadix)"));
+	TInt64 TI64;
+
+	_LL(&String[0], (TText8*)"00");
+	Lex=&String[0];
+	test((ret=Lex.Val(TI64, (TRadix)EBinary))==KErrNone);
+	test(TI64==0);
+
+	_LL(&String[0], (TText8*)"01");
+	Lex=&String[0];
+	test((ret=Lex.Val(TI64, (TRadix)EBinary))==KErrNone);
+	test(TI64==1);
+
+	_LL(&String[0], (TText8*)"11111111111111111111111111111111");
+	Lex=&String[0];
+	test((ret=Lex.Val(TI64, (TRadix)EBinary))==KErrNone);
+	test(TI64==TInt64(0xffffffffu));
+
+	_LL(&String[0], (TText8*)"100000000000000000000000000000000");
+	Lex=&String[0];
+	test((ret=Lex.Val(TI64, (TRadix)EBinary))==KErrNone);
+	test(TI64==MAKE_TINT64(0x1,0x0));
+
+ 	_LL(&String[0], (TText8*)"1111111111111111111111111111111111111111111111111111111111111111");
+	Lex=&String[0];
+	test((ret=Lex.Val(TI64, (TRadix)EBinary))==KErrNone);
+	test(TI64==MAKE_TINT64(0xffffffffu,0xffffffffu));
+
+	_LL(&String[0], (TText8*)"10000000000000000000000000000000000000000000000000000000000000000");
+	Lex=&String[0];
+	test((ret=Lex.Val(TI64, (TRadix)EBinary))==KErrOverflow);
+
+	_LL(&String[0], (TText8*)"00");
+	Lex=&String[0];
+	test((ret=Lex.Val(TI64, (TRadix)EOctal))==KErrNone);
+	test(TI64==0);
+
+	_LL(&String[0], (TText8*)"01");
+	Lex=&String[0];
+	test((ret=Lex.Val(TI64, (TRadix)EOctal))==KErrNone);
+	test(TI64==1);
+
+	_LL(&String[0], (TText8*)"37777777777");
+	Lex=&String[0];
+	test((ret=Lex.Val(TI64, (TRadix)EOctal))==KErrNone);
+	test(TI64==TInt64(0xffffffffu));
+
+	_LL(&String[0], (TText8*)"40000000000");
+	Lex=&String[0];			
+	test((ret=Lex.Val(TI64, (TRadix)EOctal))==KErrNone);
+	test(TI64==MAKE_TINT64(0x1,0x0));
+
+	_LL(&String[0], (TText8*)"1777777777777777777777");
+	Lex=&String[0];
+	test((ret=Lex.Val(TI64, (TRadix)EOctal))==KErrNone);
+	test(TI64==MAKE_TINT64(0xffffffffu,0xffffffffu));
+
+	_LL(&String[0], (TText8*)"2000000000000000000000");
+	Lex=&String[0];			
+	test((ret=Lex.Val(TI64, (TRadix)EOctal))==KErrOverflow);
+
+	_LL(&String[0], (TText8*)"00");
+	Lex=&String[0];				
+	test((ret=Lex.Val(TI64, (TRadix)EDecimal))==KErrNone);
+	test(TI64==0);
+
+	_LL(&String[0], (TText8*)"00");
+	Lex=&String[0]; //************** iNext is set to "" by Val
+	test((ret=Lex.Val(TI64))==KErrNone);	
+	test(TI64==0);
+
+	_LL(&String[0], (TText8*)"01");
+	Lex=&String[0];
+	test((ret=Lex.Val(TI64, (TRadix)EDecimal))==KErrNone);
+	test(TI64==1);
+	_LL(&String[0], (TText8*)"01");
+	Lex=&String[0];
+	test((ret=Lex.Val(TI64))==KErrNone);
+	test(TI64==1);
+
+	_LL(&String[0], (TText8*)"4294967295");
+	Lex=&String[0];
+	test((ret=Lex.Val(TI64, (TRadix)EDecimal))==KErrNone);
+	test(TI64==TInt64(0xffffffffu));
+	_LL(&String[0], (TText8*)"4294967295");
+	Lex=&String[0];
+	test((ret=Lex.Val(TI64))==KErrNone);
+	test(TI64==TInt64(0xffffffffu));
+
+	_LL(&String[0], (TText8*)"4294967296");
+	Lex=&String[0];			
+	test((ret=Lex.Val(TI64, (TRadix)EDecimal))==KErrNone);
+	test(TI64==MAKE_TINT64(1,0)); 
+	_LL(&String[0], (TText8*)"4294967296");
+	Lex=&String[0];
+	test((ret=Lex.Val(TI64))==KErrNone);   
+	test(TI64==MAKE_TINT64(1,0)); 
+
+	_LL(&String[0], (TText8*)"18446744073709551615");
+	Lex=&String[0];
+	test((ret=Lex.Val(TI64, (TRadix)EDecimal))==KErrNone);
+	test(TI64==MAKE_TINT64(0xffffffffu,0xffffffffu));
+	_LL(&String[0], (TText8*)"18446744073709551616");
+	Lex=&String[0];
+	test((ret=Lex.Val(TI64))==KErrOverflow);
+
+	_LL(&String[0], (TText8*)"-1");
+	Lex=&String[0];			
+	test((ret=Lex.Val(TI64, (TRadix)EDecimal))==KErrGeneral);
+
+	_LL(&String[0], (TText8*)"00");
+	Lex=&String[0];
+	test((ret=Lex.Val(TI64, (TRadix)EHex))==KErrNone);
+	test(TI64==0);
+
+	_LL(&String[0], (TText8*)"01");
+	Lex=&String[0];
+	test((ret=Lex.Val(TI64, (TRadix)EHex))==KErrNone);
+	test(TI64==1);
+
+	_LL(&String[0], (TText8*)"FFFFFFFF");
+	Lex=&String[0];
+	test((ret=Lex.Val(TI64, (TRadix)EHex))==KErrNone);
+	test(TI64==TInt64(0xffffffffu));
+
+	_LL(&String[0], (TText8*)"100000000");
+	Lex=&String[0];			
+	test((ret=Lex.Val(TI64, (TRadix)EHex))==KErrNone);
+	test(TI64==MAKE_TINT64(1,0)); 
+
+	_LL(&String[0], (TText8*)"FFFFFFFFffffffff");
+	Lex=&String[0];
+	test((ret=Lex.Val(TI64, (TRadix)EHex))==KErrNone);
+	test(TI64==MAKE_TINT64(0xffffffffu,0xffffffffu));
+
+	_LL(&String[0], (TText8*)"10000000000000000");
+	Lex=&String[0];			
+	test((ret=Lex.Val(TI64, (TRadix)EHex))==KErrOverflow);
+
+
+	///////////////////////////////////
+	// Test Val(TUint, TRadix=(TRadix)EDecimal)
+	///////////////////////////////////
+	test.Next(_L("Val(TUint, TRadix=(TRadix)EDecimal)"));
+	TUint TU;
+
+	_LL(&String[0], (TText8*)"00");
+	Lex=&String[0];
+	test((ret=Lex.Val(TU, (TRadix)EBinary))==KErrNone);
+	test(TU==0);
+
+	_LL(&String[0], (TText8*)"01");
+	Lex=&String[0];
+	test((ret=Lex.Val(TU, (TRadix)EBinary))==KErrNone);
+	test(TU==1);
+
+	_LL(&String[0], (TText8*)"11111111111111111111111111111111");
+	Lex=&String[0];
+	test((ret=Lex.Val(TU, (TRadix)EBinary))==KErrNone);
+	test(TU==4294967295u);
+
+	_LL(&String[0], (TText8*)"100000000000000000000000000000000");
+	Lex=&String[0];
+	test((ret=Lex.Val(TU, (TRadix)EBinary))==KErrOverflow);
+
+	_LL(&String[0], (TText8*)"00");
+	Lex=&String[0];
+	test((ret=Lex.Val(TU, (TRadix)EOctal))==KErrNone);
+	test(TU==0);
+
+	_LL(&String[0], (TText8*)"01");
+	Lex=&String[0];
+	test((ret=Lex.Val(TU, (TRadix)EOctal))==KErrNone);
+	test(TU==1);
+
+	_LL(&String[0], (TText8*)"37777777777");
+	Lex=&String[0];
+	test((ret=Lex.Val(TU, (TRadix)EOctal))==KErrNone);
+	test(TU==4294967295u);
+
+	_LL(&String[0], (TText8*)"40000000000");
+	Lex=&String[0];			
+	test((ret=Lex.Val(TU, (TRadix)EOctal))==KErrOverflow);
+
+	_LL(&String[0], (TText8*)"00");
+	Lex=&String[0];				
+	test((ret=Lex.Val(TU, (TRadix)EDecimal))==KErrNone);
+	test(TU==0);
+
+	_LL(&String[0], (TText8*)"00");
+	Lex=&String[0]; //************** iNext is set to "" by Val
+	test((ret=Lex.Val(TU))==KErrNone);	
+	test(TU==0);
+
+	_LL(&String[0], (TText8*)"01");
+	Lex=&String[0];
+	test((ret=Lex.Val(TU, (TRadix)EDecimal))==KErrNone);
+	test(TU==1);
+	_LL(&String[0], (TText8*)"01");
+	Lex=&String[0];
+	test((ret=Lex.Val(TU))==KErrNone);
+	test(TU==1);
+
+	_LL(&String[0], (TText8*)"4294967295");
+	Lex=&String[0];
+	test((ret=Lex.Val(TU, (TRadix)EDecimal))==KErrNone);
+	test(TU==4294967295u);
+	_LL(&String[0], (TText8*)"4294967295");
+	Lex=&String[0];
+	test((ret=Lex.Val(TU))==KErrNone);
+	test(TU==4294967295u);
+
+	_LL(&String[0], (TText8*)"4294967296");
+	Lex=&String[0];			
+	test((ret=Lex.Val(TU, (TRadix)EDecimal))==KErrOverflow); 
+	_LL(&String[0], (TText8*)"4294967296");
+	Lex=&String[0];
+	test((ret=Lex.Val(TU))==KErrOverflow);   
+
+	_LL(&String[0], (TText8*)"00");
+	Lex=&String[0];
+	test((ret=Lex.Val(TU, (TRadix)EHex))==KErrNone);
+	test(TU==0);
+
+	_LL(&String[0], (TText8*)"01");
+	Lex=&String[0];
+	test((ret=Lex.Val(TU, (TRadix)EHex))==KErrNone);
+	test(TU==1);
+
+	_LL(&String[0], (TText8*)"FFFFFFFF");
+	Lex=&String[0];
+	test((ret=Lex.Val(TU, (TRadix)EHex))==KErrNone);
+	test(TU==4294967295u);
+
+	_LL(&String[0], (TText8*)"100000000");
+	Lex=&String[0];			
+	test((ret=Lex.Val(TU, (TRadix)EHex))==KErrOverflow);
+
+
+	/////////////////////////////////
+	// Test Val(TInt32, TUint aLimit)
+	/////////////////////////////////		  
+	// This is called by several of the other Val methods and so has been indirectly tested already
+	test.Next(_L("Val(TInt32, TUint aLimit"));
+
+	_LL(&String[0], (TText8*)"1000");
+	Lex=&String[0];
+	test((ret=Lex.BoundedVal(T32,1000))==KErrNone);
+	test(T32==1000);
+
+	_LL(&String[0], (TText8*)"1001");
+	Lex=&String[0];
+	test((ret=Lex.BoundedVal(T32, 1000))==KErrOverflow);
+
+	_LL(&String[0], (TText8*)"-1000");
+	Lex=&String[0];
+	test((ret=Lex.BoundedVal(T32, 1000))==KErrNone);
+	test(T32==-1000);
+
+	_LL(&String[0], (TText8*)"-1001");
+	Lex=&String[0];
+	test((ret=Lex.BoundedVal(T32, 1000))==KErrNone);
+	test(T32==-1001);
+
+	_LL(&String[0], (TText8*)"-1002");
+	Lex=&String[0];
+	test((ret=Lex.BoundedVal(T32, 1000))==KErrOverflow);
+
+	_LL(&String[0], (TText8*)"0");
+	Lex=&String[0];
+	test((ret=Lex.BoundedVal(T32, 0))==KErrNone);
+	test(T32==0);
+	
+	_LL(&String[0], (TText8*)"1");
+	Lex=&String[0];
+	test((ret=Lex.BoundedVal(T32, 0))==KErrOverflow);	   
+
+
+	/////////////////////////////////////////////////
+	// Test Val(TUInt32, TRadix aRadix, TUint aLimit)
+	////////////////////////////////////////////////
+	// This is called by several of the other Val methods and so has been indirectly tested already
+	test.Next(_L("Val(TUInt32, TRadix, TUint)"));
+
+	// Test bug found during previous testing 
+	_LL(&String[0], (TText8*)"10");
+	Lex=&String[0];
+	test((ret=Lex.BoundedVal(TU32, (TRadix)EDecimal, 10))==KErrNone);
+	test(TU32==10);
+
+	_LL(&String[0], (TText8*)"11");
+	Lex=&String[0];
+	test((ret=Lex.BoundedVal(TU32, (TRadix)EDecimal, 10))==KErrOverflow);
+
+	_LL(&String[0], (TText8*)"19");
+	Lex=&String[0];
+	test((ret=Lex.BoundedVal(TU32, (TRadix)EDecimal, 10))==KErrOverflow);
+
+	_LL(&String[0], (TText8*)"20");
+	Lex=&String[0];
+	test((ret=Lex.BoundedVal(TU32, (TRadix)EDecimal, 10))==KErrOverflow);
+
+	/////////////////////////////////////////////////
+	// Test Val(TInt64, TRadix aRadix, TInt64 aLimit)
+	////////////////////////////////////////////////
+	test.Next(_L("Val(TInt64, TRadix, TInt64)"));
+
+	_LL(&String[0], (TText8*)"10");
+	Lex=&String[0];
+	test((ret=Lex.BoundedVal(TI64, (TRadix)EDecimal, 10))==KErrNone);
+	test(TI64==TInt64(10));
+
+	_LL(&String[0], (TText8*)"11");
+	Lex=&String[0];
+	test((ret=Lex.BoundedVal(TI64, (TRadix)EDecimal, 10))==KErrOverflow);
+
+	_LL(&String[0], (TText8*)"19");
+	Lex=&String[0];
+	test((ret=Lex.BoundedVal(TI64, (TRadix)EDecimal, 10))==KErrOverflow);
+
+	_LL(&String[0], (TText8*)"20");
+	Lex=&String[0];
+	test((ret=Lex.BoundedVal(TI64, (TRadix)EDecimal, 10))==KErrOverflow);
+
+	_LL(&String[0], (TText8*)"34532739886900");
+	Lex=&String[0];
+	test((ret=Lex.BoundedVal(TI64, (TRadix)EDecimal, MAKE_TINT64(0x1f68u,0x47b1af34u)))==KErrNone);
+	test(TI64==MAKE_TINT64(0x1f68u,0x47b1af34u));
+
+	_LL(&String[0], (TText8*)"34532739886901");
+	Lex=&String[0];
+	test((ret=Lex.BoundedVal(TI64, (TRadix)EDecimal, MAKE_TINT64(0x1f68u,0x47b1af34u)))==KErrOverflow);
+
+	_LL(&String[0], (TText8*)"74532739886901");
+	Lex=&String[0];
+	test((ret=Lex.BoundedVal(TI64, (TRadix)EDecimal, MAKE_TINT64(0x1f68u,0x47b1af34u)))==KErrOverflow);
+
+	_LL(&String[0], (TText8*)"6901");
+	Lex=&String[0];
+	test((ret=Lex.BoundedVal(TI64, (TRadix)EDecimal, MAKE_TINT64(0x1f68u,0x47b1af34u)))==KErrNone);
+	test(TI64==TInt64(6901));
+
+	_LL(&String[0], (TText8*)"1f6847b1af34");
+	Lex=&String[0];
+	test((ret=Lex.BoundedVal(TI64, (TRadix)EHex, MAKE_TINT64(0x1f68u,0x47b1af34u)))==KErrNone);
+	test(TI64==MAKE_TINT64(0x1f68u,0x47b1af34u));
+
+	_LL(&String[0], (TText8*)"1f6847b1af35");
+	Lex=&String[0];
+	test((ret=Lex.BoundedVal(TI64, (TRadix)EHex, MAKE_TINT64(0x1f68u,0x47b1af34u)))==KErrOverflow);
+
+	_LL(&String[0], (TText8*)"1f6847b1af340");
+	Lex=&String[0];
+	test((ret=Lex.BoundedVal(TI64, (TRadix)EHex, MAKE_TINT64(0x1f68u,0x47b1af34u)))==KErrOverflow);
+
+	_LL(&String[0], (TText8*)"1e82791aed35");
+	Lex=&String[0];
+	test((ret=Lex.BoundedVal(TI64, (TRadix)EHex, TInt64(0x56fba45u)))==KErrOverflow);
+
+	/////////////////////////////////////////////////
+	// Test Val(TInt64, TInt64 aLimit)
+	////////////////////////////////////////////////
+	test.Next(_L("Val(TInt64, TInt64)"));
+
+	_LL(&String[0], (TText8*)"10");
+	Lex=&String[0];
+	test((ret=Lex.BoundedVal(TI64, 10))==KErrNone);
+	test(TI64==TInt64(10));
+
+	_LL(&String[0], (TText8*)"11");
+	Lex=&String[0];
+	test((ret=Lex.BoundedVal(TI64, 10))==KErrOverflow);
+
+	_LL(&String[0], (TText8*)"19");
+	Lex=&String[0];
+	test((ret=Lex.BoundedVal(TI64, 10))==KErrOverflow);
+
+	_LL(&String[0], (TText8*)"20");
+	Lex=&String[0];
+	test((ret=Lex.BoundedVal(TI64, 10))==KErrOverflow);
+
+	_LL(&String[0], (TText8*)"34532739886900");
+	Lex=&String[0];
+	test((ret=Lex.BoundedVal(TI64, MAKE_TINT64(0x1f68u,0x47b1af34u)))==KErrNone);
+	test(TI64==MAKE_TINT64(0x1f68u,0x47b1af34u));
+
+	_LL(&String[0], (TText8*)"34532739886901");
+	Lex=&String[0];
+	test((ret=Lex.BoundedVal(TI64, MAKE_TINT64(0x1f68u,0x47b1af34u)))==KErrOverflow);
+
+	_LL(&String[0], (TText8*)"74532739886901");
+	Lex=&String[0];
+	test((ret=Lex.BoundedVal(TI64, MAKE_TINT64(0x1f68u,0x47b1af34u)))==KErrOverflow);
+
+	_LL(&String[0], (TText8*)"6901");
+	Lex=&String[0];
+	test((ret=Lex.BoundedVal(TI64, MAKE_TINT64(0x1f68u,0x47b1af34u)))==KErrNone);
+	test(TI64==TInt64(6901));
+
+	test.End();
+	}
+
+void testLocale()
+	{
+
+	TLocale current;
+	current.Refresh();
+	TLocale loc;
+	loc.Refresh();
+
+	TReal64 v,v8;
+	TLex l;
+	TLex8 l8;
+	TInt r;
+
+	loc.SetDecimalSeparator('.');
+	loc.Set();
+	l=_L("-12.34");
+	l8=_L8("-12.34");
+	r=l.Val(v);
+	r=l8.Val(v8);
+	test(r==KErrNone);
+	test(v==-12.34);
+	test(v==v8);
+
+	l=_L("-12.34");
+	l8=_L8("-12.34");
+	r=l.Val(v,'.');
+	r=l8.Val(v8,'.');
+	test(r==KErrNone);
+	test(v==-12.34);
+	test(v==v8);
+	l=_L("-12.34");
+	l8=_L8("-12.34");
+	r=l.Val(v,',');
+	r=l8.Val(v8,',');
+	test(r==KErrNone);
+	test(v==-12);
+	test(v==v8);
+
+	l=_L("-12,34");
+	l8=_L8("-12,34");
+	r=l.Val(v);
+	r=l8.Val(v8);
+	test(r==KErrNone);
+	test(v==-12);
+	test(v==v8);
+	l=_L("-12,34");
+	l8=_L8("-12,34");
+	r=l.Val(v,'.');
+	r=l8.Val(v8,'.');
+	test(r==KErrNone);
+	test(v==-12);
+	test(v==v8);
+	l=_L("-12,34");
+	l8=_L8("-12,34");
+	r=l.Val(v,',');
+	r=l8.Val(v8,',');
+	test(r==KErrNone);
+	test(v==-12.34);
+	test(v==v8);
+
+	loc.SetDecimalSeparator(',');
+	loc.Set();
+	l=_L("-12.34");
+	l8=_L8("-12.34");
+	r=l.Val(v);
+	r=l8.Val(v8);
+	test(r==KErrNone);
+	test(v==-12);
+	test(v==v8);
+
+	l=_L("-12.34");
+	l8=_L8("-12.34");
+	r=l.Val(v,'.');
+	r=l8.Val(v8,'.');
+	test(r==KErrNone);
+	test(v==-12.34);
+	test(v==v8);
+	l=_L("-12.34");
+	l8=_L8("-12.34");
+	r=l.Val(v,',');
+	r=l8.Val(v8,',');
+	test(r==KErrNone);
+	test(v==-12);
+	test(v==v8);
+
+	l=_L("-12,34");
+	l8=_L8("-12,34");
+	r=l.Val(v);
+	r=l8.Val(v8);
+	test(r==KErrNone);
+	test(v==-12.34);
+	l=_L("-12,34");
+	l8=_L8("-12,34");
+	r=l.Val(v,'.');
+	r=l8.Val(v8,'.');
+	test(r==KErrNone);
+	test(v==-12);
+	test(v==v8);
+	l=_L("-12,34");
+	l8=_L8("-12,34");
+	r=l.Val(v,',');
+	r=l8.Val(v8,',');
+	test(r==KErrNone);
+	test(v==-12.34);
+	test(v==v8);
+
+	loc.Set();
+	current.Set();
+	}
+
+#pragma warning( disable : 4705 )	// statement has no effect
+GLDEF_C TInt E32Main()
+    {
+
+	test.Title(); 
+
+	test.Start(_L("********* TLEX **********"));
+#if defined(_UNICODE)
+	TestTLex<TPtrC, TLex, TLexMark, TBuf<0x40>, TLex16Dump, TLexMark16Dump, TText> T;
+#else
+	TestTLex<TPtrC, TLex, TLexMark, TBuf<0x40>, TLex8Dump, TLexMark8Dump, TText> T;
+#endif
+	test.Next(_L("TText 1"));
+	T.Test1();
+	test.Next(_L("TText 2"));
+	T.Test2();
+	test.Next(_L("TText 3"));
+	T.Test3();
+	test.Next(_L("TText 4"));
+	T.Test4();
+	test.Next(_L("TText 5"));
+	T.Test5();
+
+	TestTLex<TPtrC8, TLex8, TLexMark8, TBuf8<0x40>, TLex8Dump, TLexMark8Dump, TText8> T8;
+	test.Next(_L("TText8 1"));
+	T8.Test1();
+	test.Next(_L("TText8 2"));
+	T8.Test2();
+	test.Next(_L("TText8 3"));
+	T8.Test3();
+	test.Next(_L("TText8 4"));
+	T8.Test4();
+	test.Next(_L("TText8 5"));
+	T8.Test5();
+  
+	TestTLex<TPtrC16, TLex16, TLexMark16, TBuf16<0x40>, TLex16Dump, TLexMark16Dump, TText16> T16;
+	test.Next(_L("TText16 1"));
+	T16.Test1();
+	test.Next(_L("TText16 2"));
+	T16.Test2();
+	test.Next(_L("TText16 3"));
+	T16.Test3();
+	test.Next(_L("TText16 4"));
+	T16.Test4();
+	test.Next(_L("TText16 5"));
+	T16.Test5();
+
+	test.Next(_L("Test TLex in different locales"));
+	testLocale();
+
+	test.End();
+	return(KErrNone);
+    }
+#pragma warning( default : 4705 )
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32test/buffer/t_match.cpp	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,2274 @@
+// Copyright (c) 1996-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32test\buffer\t_match.cpp
+// Overview:
+// Test the match methods of TPtrC8 and TPtrC16 objects and the 
+// TCharIterator TCombiningCharIterator, TCollationValueIterator
+// and TCollationRawValueIterator classes.
+// API Information:
+// TPtrC8, TPtrC16, TCharIterator, TCombiningCharIterator,
+// TCollationValueIterator, TCollationRawValueIterator
+// Details:
+// - Test and verify the results of TPtrC8 Match and MatchF methods
+// on a variety of constant strings. Verify both match and mismatch
+// conditions.
+// - Test and verify the results of TPtrC16 Match and MatchF methods
+// on a variety of constant strings. Verify both match and mismatch
+// conditions.
+// - For a TCharIterator object, test and verify:
+// - basic character handling
+// - ability to reset the iterator correctly
+// - combining characters works as expected
+// - ability to jump into the middle of combined characters
+// - full-width variants are not modified
+// - narrow strings work as expected
+// - surrogate pairs work as expected
+// - Using a TCombiningCharIterator object with a variety of character 
+// strings as input, verify that the output is as expected.
+// - Using TCollationValueIterator and TCollationRawValueIterator objects:
+// - test the raw iterator 
+// - test starting at different points in the iteration and verify capitals 
+// are ignored at level 0
+// - verify capitals are ignored at level 1
+// - verify capitals do not match at level 2
+// - check the TCollationValueIterator Restart method
+// - test collation keys, when they success and when they fail halfway
+// - exhaust the internal cache, verify object still works
+// - test different decompositions at level 3
+// - verify results are as expected
+// - Test and verify the results of the TUnicodeFold::FindWildcardMatchFolded()
+// method on a variety of constant strings: find a string within another 
+// string, verify the offset into the candidate string if it is present, or 
+// KErrNotFound if it is not.
+// - Test and verify the results of the TUnicodeFold::FindFolded() method on 
+// a variety of constant strings: compare two strings, verify return value.
+// - Test and verify results of UnicodeFoldCase() on a variety of characters.
+// - Test and verify results of MatchLeadingWildcards() on a variety of strings.
+// - Test and verify results of MatchesHereFoldedWithPrefixTest() on a variety 
+// of strings.
+// - Test and verify results of LocateFolded() on a variety of strings.
+// - Test and verify results of FindFoldedWithWildcard() and FindMatchFolded()
+// on a variety of strings.
+// - Test and verify results of TDesc.CompareF() on a variety of strings.
+// Platforms/Drives/Compatibility:
+// All 
+// Assumptions/Requirement/Pre-requisites:
+// Failures and causes:
+// Base Port information:
+// 
+//
+
+#include <e32test.h>
+#include <f32file.h>
+#include <collate.h>
+#include "collateimp.h"
+#include "compareimp.h"
+#include "u32std.h"
+
+#ifndef __TOOLS2__
+///***************** copied from locale euser source code ***********************
+static const TCollationMethod TheCollationMethod[] =
+	{
+		{
+		KUidBasicCollationMethod,				// this is the standard unlocalised method
+		NULL,									// null means use the standard table
+		NULL,									// there's no override table
+		0										// the flags are standard
+		}
+	};
+static const TCollationDataSet TheCollationDataSet =
+	{
+	TheCollationMethod,
+	1
+	};
+const LCharSet TheCharSet =
+	{
+	NULL,
+	&TheCollationDataSet
+	};
+const LCharSet* GetLocaleCharSet()
+	{
+	return &TheCharSet;
+	}
+#endif
+///*******************************************************************************
+
+
+#ifdef __VC32__
+    // Solve compilation problem caused by non-English locale
+    #pragma setlocale("english")
+#endif
+
+#define ARRAY_SIZE(ar) (sizeof(ar) / (sizeof(ar[0])))
+
+LOCAL_D RTest test(_L("T_MATCH"));
+
+#ifndef __TOOLS2__
+_LIT(KUnicodeTestDataFile, "z:\\Test\\UnicodeData.txt");
+#else
+_LIT(KUnicodeTestDataFile, "UnicodeData.txt");
+#endif
+
+static const TUint32 TheDevanagariKey[] = 
+	{
+	0x22a010b,0x22b010b,0x285010b,0xb109,0xb209,0xb309,0xb409,0xb509,
+	0x6c5e609,0x6c6e609,0x6c7e609,0x6c8e609,0x6c9e609,0x6cae609,0x6cbe609,0x6cce609,
+	0x6cde609,0x6cee609,0xba40109,0xba50109,0xba60109,0xba70109,0xba80109,0xba90109,
+	0xbaa0109,0xbab0109,0xbac0109,0xbad0109,0xbae0109,0xbaf0109,0xbb00109,0xbb10109,
+	0xbb20109,0xbb30109,0xbb40109,0xbb50109,0xbb60109,0xbb70109,0xbb80109,0xbb90109,
+	0xbb9b109,0xbba0109,0xbbab109,0xbbb0109,0xbbbb109,0xbbc0109,0xbbd0109,0xbbe0109,
+	0xbbf0109,0xbc00109,0xbc0b109,0xbc10109,0xbc20109,0xbc30109,0xbc40109,0xbc50109,
+	0xbc5b109,0xbc60109,0xbc6b109,0xbc70109,0xbc80109,0xbc90109,0xbca0109,0xbcb0109,
+	0xbcc0109,0xbccb109,0xbcd0109,0xbce0109,0xbceb109,0xbcf0109,0xbd00109,0xbd10109,
+	0xbd20109,0xbd2b109,0xbd30109,0xbd3b109,0xbd40109,0xbd50109,0xbd5b109,0xbd60109,
+	0xbd70109,0xbd80109,0xbd90109,0xbda0109,0xbdb0109,0xbdc0109,0xbdd0109,0xbde0109,
+	0xbdf0109,0xbe00109,0xbe10109,0xbe20109,0xbe30109,0xbe40109,0xbe50109,0xbe60109,
+	0xbe70109,0xbe80109,0xbe90109,0xbea0109,0xbeb0109,0xbec0109,0xbed0109,
+	};
+
+static const TUint32 TheDevanagariIndex[] = 
+	{
+	0x9010012,0x9020013,0x9030014,0x9050015,0x9060016,0x9070017,0x9080018,0x9090019,
+	0x90a001a,0x90b001b,0x90c001d,0x90d001f,0x90e0020,0x90f0021,0x9100022,0x9110023,
+	0x9120024,0x9130025,0x9140026,0x9150027,0x9160029,0x917002b,0x918002d,0x919002e,
+	0x91a002f,0x91b0030,0x91c0031,0x91d0033,0x91e0034,0x91f0035,0x9200036,0x9210037,
+	0x9220039,0x923003b,0x924003c,0x925003d,0x926003e,0x927003f,0x9280040,0x9290041,
+	0x92a0042,0x92b0043,0x92c0045,0x92d0046,0x92e0047,0x92f0048,0x930004a,0x931004b,
+	0x932004c,0x933004d,0x934004e,0x935004f,0x9360050,0x9370051,0x9380052,0x9390053,
+	0x93c0003,0x93d0054,0x93e0055,0x93f0056,0x9400057,0x9410058,0x9420059,0x943005a,
+	0x944005b,0x945005e,0x946005f,0x9470060,0x9480061,0x9490062,0x94a0063,0x94b0064,
+	0x94c0065,0x94d0066,0x9510004,0x9520005,0x9530006,0x9540007,0x9580028,0x959002a,
+	0x95a002c,0x95b0032,0x95c0038,0x95d003a,0x95e0044,0x95f0049,0x960001c,0x961001e,
+	0x962005c,0x963005d,0x9640000,0x9650001,0x9660008,0x9670009,0x968000a,0x969000b,
+	0x96a000c,0x96b000d,0x96c000e,0x96d000f,0x96e0010,0x96f0011,0x9700002,
+	};
+
+static const TCollationKeyTable TheDevanagariTable = 
+	{ TheDevanagariKey, TheDevanagariIndex, 103, 0, 0, 0 };
+
+static const TCollationMethod TheDevanagariMethod =
+	{ 0, 0, &TheDevanagariTable, 0 };
+
+static const TCollationMethod TheDevanagariIgnoreCombiningMethod =
+	{ 0, 0, &TheDevanagariTable, TCollationMethod::EIgnoreCombining };
+
+static const TUint32 TheSwedishKey[] = 
+	{
+	0x8f60109,0x8f70109,0x8f80109,0x8f60121,0x8f70121,0x8f80121,0x8dd0109,0x8dd0121,
+	0x8c50121,0x8c50109,
+	};
+
+static const TUint32 TheSwedishIndex[] = 
+	{
+	0x570008,0x770009,
+	};
+
+static const TUint16 TheSwedishStringElement[] = 
+	{
+	0x2,0x61,0x30a,0x2,0x61,0x308,0x2,0x6f,
+	0x308,0x2,0x41,0x30a,0x2,0x41,0x308,0x2,
+	0x4f,0x308,0x2,0x75,0x308,0x2,0x55,0x308,
+	};
+
+static const TUint32 TheSwedishStringIndex[] = 
+	{
+	0xc0004,0x90003,0xf0005,0x150007,0x30001,0x0,0x60002,0x120006,
+	};
+
+static const TCollationKeyTable TheSwedishTable = 
+	{ TheSwedishKey, TheSwedishIndex, 2, TheSwedishStringElement, TheSwedishStringIndex, 8 };
+
+static const TCollationMethod TheSwedishMethod =
+	{ 0, 0, &TheSwedishTable, TCollationMethod::EIgnoreNone };
+
+static const TCollationMethod TheIgnoreNoneMethod =
+	{ 0, 0, 0, TCollationMethod::EIgnoreNone };
+
+void TestPrintCaption(const TDesC& aTestName, const TText16 aStr[], TInt aLen)
+	{
+	test.Next(aTestName);
+	RDebug::Print(_L("Char seq: "));
+	for(TInt i=0;i<aLen;++i)
+		{
+		RDebug::Print(_L("%04X "), aStr[i]);
+		}
+	RDebug::Print(_L("\nOutput: "));
+	}
+
+TInt MatchC(const TDesC16& aCandidate, const TDesC16& aSearchTerm,
+	const TCollationMethod* aMethod, TInt aLevel)
+	{
+	TCollate method(0);
+	if (aMethod)
+		{
+		TCollate m(*aMethod);
+		method = m;
+		}
+	return method.Match(aCandidate.Ptr(), aCandidate.Length(),
+		aSearchTerm.Ptr(), aSearchTerm.Length(), aLevel);
+	}
+
+_LIT(KCand1, "baot");
+_LIT(KCand2, "ba\x308o\x308t");
+_LIT(KCand3, "b\xe4\xf6t");
+_LIT(KSearch1, "BAOT");
+_LIT(KSearch2, "?AO?");
+_LIT(KSearch3, "?\xe4o?");
+_LIT(KSearch4, "*o*");
+_LIT(KSearch5, "*ao*");
+_LIT(KSearch6, "*b\x308*");
+_LIT(KSearch7, "ba\x308*");
+_LIT(KSearch8, "ba*");
+
+void TestMatchC()
+	{
+	// MatchC should be working at level 0, let us test that this is so.
+	test(0 == KCand1().MatchC(KSearch1));
+	test(0 == KCand1().MatchC(KCand2));
+	test(1 == KCand1().MatchC(KSearch5));
+	test(1 == KCand2().MatchC(KSearch5));
+	test(0 <= KCand1().MatchC(KSearch2));
+	// Test the internals at level 0: It must fail to match Swedish accents
+	// with the Swedish collation algorithm.
+	test(0 == MatchC(KCand1, KSearch1, &TheIgnoreNoneMethod, 0));
+	test(0 == MatchC(KCand1, KSearch1, &TheSwedishMethod, 0));
+	test(0 == MatchC(KCand2, KSearch1, &TheIgnoreNoneMethod, 0));
+	test(KErrNotFound == MatchC(KCand2, KSearch1, &TheSwedishMethod, 0));
+	test(0 == MatchC(KCand3, KSearch1, &TheIgnoreNoneMethod, 0));
+	test(KErrNotFound == MatchC(KCand3, KSearch1, &TheSwedishMethod, 0));
+	test(0 <= MatchC(KCand1, KSearch2, &TheIgnoreNoneMethod, 0));
+	test(0 <= MatchC(KCand1, KSearch2, &TheSwedishMethod, 0));
+	test(0 <= MatchC(KCand2, KSearch2, &TheIgnoreNoneMethod, 0));
+	test(KErrNotFound == MatchC(KCand2, KSearch2, &TheSwedishMethod, 0));
+	test(0 <= MatchC(KCand3, KSearch2, &TheIgnoreNoneMethod, 0));
+	test(KErrNotFound == MatchC(KCand3, KSearch2, &TheSwedishMethod, 0));
+	test(0 <= MatchC(KCand2, KSearch3, &TheIgnoreNoneMethod, 0));
+	test(KErrNotFound == MatchC(KCand3, KSearch2, &TheSwedishMethod, 0));
+	test(3 == MatchC(KCand2, KSearch4, &TheIgnoreNoneMethod, 0));
+	test(KErrNotFound == MatchC(KCand2, KSearch4, &TheSwedishMethod, 0));
+	test(1 == MatchC(KCand2, KSearch5, &TheIgnoreNoneMethod, 0));
+	test(KErrNotFound == MatchC(KCand2, KSearch5, &TheSwedishMethod, 0));
+	test(0 == MatchC(KCand2, KSearch6, &TheIgnoreNoneMethod, 0));
+	test(0 == MatchC(KCand2, KSearch6, &TheSwedishMethod, 0));
+	test(0 == MatchC(KCand1, KSearch7, &TheIgnoreNoneMethod, 0));
+	test(KErrNotFound == MatchC(KCand1, KSearch7, &TheSwedishMethod, 0));
+	test(0 == MatchC(KCand1, KSearch8, &TheIgnoreNoneMethod, 0));
+	test(0 == MatchC(KCand1, KSearch8, &TheSwedishMethod, 0));
+	test(0 == MatchC(KCand2, KSearch7, &TheIgnoreNoneMethod, 0));
+	test(0 == MatchC(KCand2, KSearch7, &TheSwedishMethod, 0));
+	test(0 == MatchC(KCand2, KSearch8, &TheIgnoreNoneMethod, 0));
+	test(KErrNotFound == MatchC(KCand2, KSearch8, &TheSwedishMethod, 0));
+	test(0 == MatchC(KCand3, KSearch7, &TheIgnoreNoneMethod, 0));
+	test(0 == MatchC(KCand3, KSearch7, &TheSwedishMethod, 0));
+	test(0 == MatchC(KCand3, KSearch8, &TheIgnoreNoneMethod, 0));
+	test(KErrNotFound == MatchC(KCand3, KSearch8, &TheSwedishMethod, 0));
+	_LIT(KCandidate1, "axyz");
+	_LIT(KSearchStr1, "a*z");
+	test(0 == KCandidate1().MatchC(KSearchStr1()));
+	_LIT(KCandidate2, "azzz");
+	_LIT(KSearchStr2, "a*z");
+	test(0 == KCandidate2().MatchC(KSearchStr2()));
+	
+	// Added tests for INC105311...
+	_LIT(KCandJpg1, "jpg_jjg.jpg");
+	_LIT(KCandJpg2, "jpgAjjg.jpg");
+	_LIT(KCandJpg3, "jpg@jjg.jpg");
+	_LIT(KCandJpg4, "hpg&jjg.jpg");
+	_LIT(KCandJpg5, "hpg&jpg.jpg");
+	_LIT(KSearchJpg1, "*jp?");
+	_LIT(KSearchJpg2, "*jpg");
+	_LIT(KSearchJpg3, "*jpg*");
+	_LIT(KSearchJpg4, "*jpg*jpg");
+	test(8 == KCandJpg1().MatchC(KSearchJpg1));
+	test(8 == KCandJpg2().MatchC(KSearchJpg1));
+	test(8 == KCandJpg3().MatchC(KSearchJpg1));
+	test(8 == KCandJpg4().MatchC(KSearchJpg1));
+	test(8 == KCandJpg5().MatchC(KSearchJpg1));
+	test(8 == KCandJpg1().MatchC(KSearchJpg2));
+	test(8 == KCandJpg2().MatchC(KSearchJpg2));
+	test(8 == KCandJpg3().MatchC(KSearchJpg2));
+	test(8 == KCandJpg4().MatchC(KSearchJpg2));
+	test(8 == KCandJpg5().MatchC(KSearchJpg2));
+	test(0 == KCandJpg1().MatchC(KSearchJpg3));
+	test(0 == KCandJpg2().MatchC(KSearchJpg3));
+	test(0 == KCandJpg3().MatchC(KSearchJpg3));
+	test(8 == KCandJpg4().MatchC(KSearchJpg3));
+	test(4 == KCandJpg5().MatchC(KSearchJpg3));
+	test(0 == KCandJpg1().MatchC(KSearchJpg4));
+	test(0 == KCandJpg2().MatchC(KSearchJpg4));
+	test(0 == KCandJpg3().MatchC(KSearchJpg4));
+	test(KErrNotFound == KCandJpg4().MatchC(KSearchJpg4)); 
+	test(4 == KCandJpg5().MatchC(KSearchJpg4));
+	_LIT(KCand4, "abcxaxaxa");
+	_LIT(KSearch9, "*xaxa");
+	test(5 == KCand4().MatchC(KSearch9));
+	_LIT(KCand6, "abxa");
+	_LIT(KSearch10, "*x?");
+	test(2 == KCand6().MatchC(KSearch10));
+	_LIT(KCand7, "xab"); 
+	_LIT(KSearch11, "x?");
+	test(KErrNotFound == KCand7().MatchC(KSearch11));
+	_LIT(KCand8, "xa"); 
+	_LIT(KSearch12, "x?");
+	test(0 == KCand8().MatchC(KSearch12));
+	_LIT(KCand9, "xaxa"); 
+	_LIT(KSearch13, "*x?");
+	test(2 == KCand9().MatchC(KSearch13));
+	_LIT(KCand10, "abjpgcjig.jpg"); 
+	_LIT(KSearch14, "*jp?");
+	test(10 == KCand10().MatchC(KSearch14));
+	_LIT(KCand11, "abjpg_jig.jpg"); 
+	_LIT(KSearch15, "*jp?");
+	test(10 == KCand11().MatchC(KSearch15));
+	_LIT(KCand12, "jpg"); 
+	_LIT(KSearch16, "*jp?");
+	test(0 == KCand12().MatchC(KSearch16));
+	_LIT(KCand13, "abjpgig.jpg"); 
+	_LIT(KSearch17, "*jp?");
+	test(8 == KCand13().MatchC(KSearch17));
+	_LIT(KCand14, "abjcgig.jpg"); 
+	_LIT(KSearch18, "jp?");
+	test(KErrNotFound == KCand14().MatchC(KSearch18));
+	_LIT(KCand15, "xax\xE2"); 
+	_LIT(KSearch19, "*xa\x302");
+	test(2 == KCand15().MatchC(KSearch19));
+	_LIT(KCand5, "blahblahblah\xE2");
+	_LIT(KSearch20, "*a\x302");
+	test(12 == KCand5().MatchC(KSearch20));
+	_LIT(KCand16, "bl\xE2hblahblaha\x302");
+	_LIT(KSearch21, "*a\x302*\xE2");
+	test(2 == KCand16().MatchC(KSearch21));
+	_LIT(KCand17, "abcxaxaxa");
+	_LIT(KSearch22, "*x?x?");
+	test(5 == KCand17().MatchC(KSearch22));
+	}
+
+/**
+@SYMTestCaseID SYSLIB-EUSER-CT-1759
+@SYMTestCaseDesc Various tests for the new TDesC16::MatchC() method. Testing that the new method works with
+				 different wild card characters and different escape characters.
+@SYMTestPriority High
+@SYMTestActions  Test for TDesC16::MatchC(const TDesC16 &aPattern, TInt aMaxLevel, TInt aWildChar, TInt aWildSequenceChar, TInt aEscapeChar, const TCollationMethod* aCollationMethod = NULL).
+@SYMTestExpectedResults The test must not fail.
+@SYMREQ REQ5907
+*/
+void TestMatchC2()
+	{
+	_LIT(KCandidate1, "ab/cRRRdef__grt");
+	_LIT(KSearchStr1, "ab//c%def/_/_grt");
+	TInt rc = KCandidate1().MatchC(KSearchStr1(), '_', '%', '/', 0);
+	test(rc == 0);
+	_LIT(KCandidate2, "_*");
+	_LIT(KSearchStr2, "/_/*");
+	rc = KCandidate2().MatchC(KSearchStr2(), '_', '*', '/', 0);
+	test(rc == 0);
+	_LIT(KCandidate3, "aa");
+	_LIT(KSearchStr3, "aaaa");
+	rc = KCandidate3().MatchC(KSearchStr3(), '_', '%', 'a', 0);
+	test(rc == 0);
+	_LIT(KCandidate4, "\\4%3=1");
+	_LIT(KSearchStr4, "\\\\4_3%");
+	rc = KCandidate4().MatchC(KSearchStr4(), '_', '%', '\\', 0);
+	test(rc == 0);
+	_LIT(KCandidate5, "abcd&efgh");
+	_LIT(KSearchStr5, "----!&efgh");
+	rc = KCandidate5().MatchC(KSearchStr5(), '-', '&', '!', 0);
+	test(rc == 0);
+	_LIT(KCandidate6, "abc#1234:5678#xyz");
+	_LIT(KSearchStr6, "#!#1234!:56::!##z");
+	rc = KCandidate6().MatchC(KSearchStr6(), ':', '#', '!', 0);
+	test(rc == 3);
+	_LIT(KCandidate7, "abc#1234:5678#zzz");
+	_LIT(KSearchStr7, "#!#1234!:56::!##z");
+	rc = KCandidate7().MatchC(KSearchStr7(), ':', '#', '!', 0);
+	test(rc == 3);
+	_LIT(KCandidate8, "abc");
+	_LIT(KSearchStr8, "a_c");
+	rc = KCandidate8().MatchC(KSearchStr8(), '_', '%', '7', 0);
+	test(rc == 0);
+	_LIT(KCandidate9, "abc");
+	_LIT(KSearchStr9, "A_C");
+	rc = KCandidate9().MatchC(KSearchStr9(), '_', '%', '7', 0);
+	test(rc == 0);
+	_LIT(KCandidate10, "a_c");
+	_LIT(KSearchStr10, "a7_c");
+	rc = KCandidate10().MatchC(KSearchStr10(), '_', '%', '7', 0);
+	test(rc == 0);
+	_LIT(KCandidate11, "a_c");
+	_LIT(KSearchStr11, "A7_C");
+	rc = KCandidate11().MatchC(KSearchStr11(), '_', '%', '7', 0);
+	test(rc == 0);
+	_LIT(KCandidate12, "abc");
+	_LIT(KSearchStr12, "a7_c");
+	rc = KCandidate12().MatchC(KSearchStr12(), '_', '%', '7', 0);
+	test(rc == KErrNotFound);
+	_LIT(KCandidate13, "abc");
+	_LIT(KSearchStr13, "A7_C");
+	rc = KCandidate13().MatchC(KSearchStr13(), '_', '%', '7', 0);
+	test(rc == KErrNotFound);
+	_LIT(KCandidate14, "a7Xc");
+	_LIT(KSearchStr14, "a7_c");
+	rc = KCandidate14().MatchC(KSearchStr14(), '_', '%', '7', 0);
+	test(rc == KErrNotFound);
+	_LIT(KCandidate15, "a7Xc");
+	_LIT(KSearchStr15, "A7_C");
+	rc = KCandidate15().MatchC(KSearchStr15(), '_', '%', '7', 0);
+	test(rc == KErrNotFound);
+	_LIT(KCandidate16, "abcde");
+	_LIT(KSearchStr16, "a%e");
+	rc = KCandidate16().MatchC(KSearchStr16(), '_', '%', '7', 0);
+	test(rc == 0);
+	_LIT(KCandidate17, "abcde");
+	_LIT(KSearchStr17, "A%E");
+	rc = KCandidate17().MatchC(KSearchStr17(), '_', '%', '7', 0);
+	test(rc == 0);
+	_LIT(KCandidate18, "abcde");
+	_LIT(KSearchStr18, "a7%e");
+	rc = KCandidate18().MatchC(KSearchStr18(), '_', '%', '7', 0);
+	test(rc == KErrNotFound);
+	_LIT(KCandidate19, "abcde");
+	_LIT(KSearchStr19, "A7%E");
+	rc = KCandidate19().MatchC(KSearchStr19(), '_', '%', '7', 0);
+	test(rc == KErrNotFound);
+	_LIT(KCandidate20, "a7cde");
+	_LIT(KSearchStr20, "a7%e");
+	rc = KCandidate20().MatchC(KSearchStr20(), '_', '%', '7', 0);
+	test(rc == KErrNotFound);
+	_LIT(KCandidate21, "a7cde");
+	_LIT(KSearchStr21, "A7%E");
+	rc = KCandidate21().MatchC(KSearchStr21(), '_', '%', '7', 0);
+	test(rc == KErrNotFound);
+	_LIT(KCandidate22, "a7cde");
+	_LIT(KSearchStr22, "a77%e");
+	rc = KCandidate22().MatchC(KSearchStr22(), '_', '%', '7', 0);
+	test(rc == 0);
+	_LIT(KCandidate23, "a7cde");
+	_LIT(KSearchStr23, "A77%E");
+	rc = KCandidate23().MatchC(KSearchStr23(), '_', '%', '7', 0);
+	test(rc == 0);
+	_LIT(KCandidate24, "abc7");
+	_LIT(KSearchStr24, "a%77");
+	rc = KCandidate24().MatchC(KSearchStr24(), '_', '%', '7', 0);
+	test(rc == 0);
+	_LIT(KCandidate25, "abc7");
+	_LIT(KSearchStr25, "A%77");
+	rc = KCandidate25().MatchC(KSearchStr25(), '_', '%', '7', 0);
+	test(rc == 0);
+	_LIT(KCandidate26, "abc_");
+	_LIT(KSearchStr26, "a%7_");
+	rc = KCandidate26().MatchC(KSearchStr26(), '_', '%', '7', 0);
+	test(rc == 0);
+	_LIT(KCandidate27, "abc_");
+	_LIT(KSearchStr27, "A%7_");
+	rc = KCandidate27().MatchC(KSearchStr27(), '_', '%', '7', 0);
+	test(rc == 0);
+	_LIT(KCandidate28, "abc7");
+	_LIT(KSearchStr28, "a%7_");
+	rc = KCandidate28().MatchC(KSearchStr28(), '_', '%', '7', 0);
+	test(rc == KErrNotFound);
+	_LIT(KCandidate29, "abc7");
+	_LIT(KSearchStr29, "A%7_");
+	rc = KCandidate29().MatchC(KSearchStr29(), '_', '%', '7', 0);
+	test(rc == KErrNotFound);
+	_LIT(KCandidate30, "ba\x308o\x308t");
+	_LIT(KSearchStr30, "-b\x308-");
+	rc = KCandidate30().MatchC(KSearchStr30(), '%', '-', 0, 0);
+	test(rc == 0);
+	rc = KCandidate30().MatchC(KSearchStr30(), '%', '-', 0, 0, &TheSwedishMethod);
+	test(rc == 0);
+	_LIT(KSearchStr31, "ba\x308*");
+	rc = KCandidate30().MatchC(KSearchStr31(), '%', '*', 0, 0, &TheSwedishMethod);
+	test(rc == 0);
+	}
+
+void DoTestCanonicalDecompositionIterator(const TDesC& aTest, const TDesC& aCanonical)
+	{
+	TUTF32Iterator i(aTest.Ptr(), aTest.Ptr() + aTest.Length());
+	TCanonicalDecompositionIterator cci;
+	cci.Set(i);
+	TInt index = 0;
+	while (!cci.AtEnd())
+		{
+		test(index != aCanonical.Length());
+		TChar ch1 = aCanonical[index];
+		TChar ch2 = cci.Current();
+		test(ch1 == ch2);
+		++index;
+		cci.Next();
+		}
+	test(index == aCanonical.Length());
+	}
+
+// exciting combining characters include:
+// U+0327 cedilla, class = 202
+// U+031B horn, class = 216
+// U+0316 grave below, class = 220
+// U+0300 grave above, class = 230
+// U+031A left angle above, class = 232
+// U+0360 double tilde, class = 234
+// U+0345 ypogegrameni, class = 240
+
+_LIT(KAllOnce, "\x327\x31b\x316\x300\x31a\x360\x345xyz");
+_LIT(KBackwards, "\x345\x360\x31a\x300\x316\x31b\x327xyz");
+_LIT(KRandom, "\x300\x316\x31b\x327\x31a\x345\x360xyz");
+_LIT(KAllOnceThenAcute, "\x327\x31b\x316\x300\x301\x31a\x360\x345");
+_LIT(KBackwardsThenAcute, "\x345\x360\x31a\x300\x301\x316\x31b\x327");
+_LIT(KRandomThenAcute, "\x300\x316\x31b\x327\x31a\x301\x345\x360");
+_LIT(KAllSame, "\x300\x301\x302\x303\x304\x306\x307\x308\x30b\x30c\x30f");
+_LIT(KLotsSameCanonical, "\x327\x31b\x316\x300\x301\x302\x303\x304\x306\x307\x308\x30b\x30c\x30f\x31a\x360\x345xyz");
+_LIT(KLotsSameNotCanonical, "\x31b\x300\x345\x301\x302\x316\x303\x304\x31a\x306\x307\x327\x308\x30b\x30c\x30f\x360xyz");
+
+/**
+@SYMTestCaseID SYSLIB-UNICODE-CT-0106
+@SYMTestCaseDesc TCanonicalDecompositionIterator test 
+@SYMTestPriority High
+@SYMTestActions  TCanonicalDecompositionIterator test
+@SYMTestExpectedResults The test must not fail.
+@SYMPREQ814 Optimise folded string comparisons.
+*/
+void TestCanonicalDecompositionIterator()
+	{
+	DoTestCanonicalDecompositionIterator(KAllOnce, KAllOnce);
+	DoTestCanonicalDecompositionIterator(KBackwards, KAllOnce);
+	DoTestCanonicalDecompositionIterator(KRandom, KAllOnce);
+	DoTestCanonicalDecompositionIterator(KBackwardsThenAcute, KAllOnceThenAcute);
+	DoTestCanonicalDecompositionIterator(KRandomThenAcute, KAllOnceThenAcute);
+	DoTestCanonicalDecompositionIterator(KAllSame, KAllSame);
+	DoTestCanonicalDecompositionIterator(KLotsSameCanonical, KLotsSameCanonical);
+	DoTestCanonicalDecompositionIterator(KLotsSameNotCanonical, KLotsSameCanonical);
+	}
+
+/**
+@SYMTestCaseID SYSLIB-UNICODE-CT-3337
+@SYMTestCaseDesc Test latest MatchC override that has the advanced TCollationMethod flag input 
+@SYMTestPriority High
+@SYMTestActions Test matching of combined characters with simple character.
+Note- this action only applies to certain classes of combining characters
+@SYMTestExpectedResults Old MatchC character against character + combining character
+will not match but new MatchC with same characters and flag set will match.
+@SYMINC092513: RR S60: Variant testing: Searching does not work properly in contacts
+*/
+void TestDisableCombiningCharacterCheckFlag(const TDesC16 &aLeft, const TDesC16 &aRight)
+	{
+	//Without flag, characters combine to make new character not matched by search
+	test(KErrNotFound ==aLeft.MatchC(aRight,&TheDevanagariMethod));
+	//With flag, combining character check is disabled so that search is matched
+	test(KErrNone     ==aLeft.MatchC(aRight,&TheDevanagariIgnoreCombiningMethod));
+	}
+void TestDisableCombiningCharacterCheck()
+	{
+	test.Next(_L("INC092513"));
+	TBuf<2> search, target;
+	//All Devanagari dependant vowels are in the following range
+	for(TInt dependantVowel=0x93e; dependantVowel<=0x94c; dependantVowel++)
+		{
+		//Most of the Devanagari consonants are in the following range
+		for(TInt consonant=0x915; consonant<=0x939; consonant++)
+			{
+			target.Format(_L("%c%c"),consonant,dependantVowel);
+			search.Format(_L("%c*"),consonant);
+			TestDisableCombiningCharacterCheckFlag(target, search);
+			}
+		}
+	//Test same situation but where consonants decompose to consonant + dependant vowel
+	TestDisableCombiningCharacterCheckFlag(_L("\x929"), _L("\x928*"));
+	TestDisableCombiningCharacterCheckFlag(_L("\x931"), _L("\x930*"));
+	TestDisableCombiningCharacterCheckFlag(_L("\x934"), _L("\x933*"));
+	TestDisableCombiningCharacterCheckFlag(_L("\x958"), _L("\x915*"));
+	TestDisableCombiningCharacterCheckFlag(_L("\x959"), _L("\x916*"));
+	TestDisableCombiningCharacterCheckFlag(_L("\x95a"), _L("\x917*"));
+	TestDisableCombiningCharacterCheckFlag(_L("\x95b"), _L("\x91c*"));
+	TestDisableCombiningCharacterCheckFlag(_L("\x95c"), _L("\x921*"));
+	TestDisableCombiningCharacterCheckFlag(_L("\x95d"), _L("\x922*"));
+	TestDisableCombiningCharacterCheckFlag(_L("\x95e"), _L("\x92b*"));
+	TestDisableCombiningCharacterCheckFlag(_L("\x95f"), _L("\x92f*"));
+	}
+
+_LIT(KHelloT, "Hello");
+_LIT(KLatin1AccentsC, "\xE0\xD2p\xE2\xEB\xED\xF1\xC7");
+_LIT(KLatin1AccentsD, "a\x300O\x300pa\x302\x65\x308i\x301n\x303\x43\x327");
+// four alpha + psili + varia + ypogegrameni
+_LIT(KGreekAccentsC, "\x1f82\x1f82\x1f82\x1f82");
+// decomposed in four different ways
+_LIT(KGreekAccentsS, "\x1f82\x1f02\x345\x1f00\x300\x345\x3b1\x313\x300\x345");
+// completely decomposed
+_LIT(KGreekAccentsD, "\x3b1\x313\x300\x345\x3b1\x313\x300\x345\x3b1\x313\x300\x345\x3b1\x313\x300\x345");
+// full-width variants
+_LIT(KFullWidth, "\xFF21\xFF42\xFF43");
+// surrogate pair, unpaired low surrogate, unpaired high surrogate, unpaired
+// high surrogate at end of string
+_LIT(KSurrogates, "\xD965\xDEF0\xDF12\xDB10\xDA4E");
+_LIT(KSurrogatesTest, "\xD965\xDEF0");
+
+void TestIteratorOutput(TDecompositionIterator& aIt, const TDesC& aCheck)
+	{
+	TBool unpairedHighSurrogate = EFalse;
+	for(TInt i = 0; i != aCheck.Length(); aIt.Next())
+		{
+		if (aIt.AtEnd())
+			{
+			test(0);
+			return;
+			}
+		TInt c = aIt.Current();
+		// test that we are not looking at an unpaired low surrogate that
+		// follows an unpaired high surrogate: this is not possible.
+		test((c & 0xFC00) != 0xDC00 || !unpairedHighSurrogate);
+		unpairedHighSurrogate = (c & 0xFC00) == 0xD800? (TBool)ETrue : (TBool)EFalse;
+		if (c < 0x10000)
+			{
+			test(c == aCheck[i]);
+			++i;
+			}
+		else
+			{
+			TInt sp = ((aCheck[i] - 0xD7F7) << 10) + aCheck[i + 1];
+			test(c == sp);
+			i += 2;
+			}
+		}
+	test(aIt.AtEnd());
+	}
+
+/**
+@SYMTestCaseID SYSLIB-UNICODE-CT-0097
+@SYMTestCaseDesc TUTF32Iterator functionality tested on 2 character sequences: 
+	(1) single character 
+	(2) surrogate pair
+@SYMTestPriority High
+@SYMTestActions  TUTF32Iterator test.
+@SYMTestExpectedResults The test must not fail.
+@SYMPREQ814 Optimise folded string comparisons.
+*/
+void TestUTF32Iterator()
+	{
+	//Single character
+	const TText16 KStr[] = {0x01D5};
+	::TestPrintCaption(_L("TUTF32Iterator"), KStr, ARRAY_SIZE(KStr));
+	TUTF32Iterator it(KStr, KStr + ARRAY_SIZE(KStr));
+	TInt itCount = 0;
+	for(;!it.AtEnd();++itCount, it.Next())
+		{
+		TChar ch = it.Current();
+		test(ch == static_cast <TUint> (KStr[0]));
+		RDebug::Print(_L("%04X "), (TUint)ch);
+		}
+	test(itCount == 1);
+	RDebug::Print(_L("\n"));
+	//Surrogate pair
+	::TestPrintCaption(_L("TUTF32Iterator-surrogates"), KSurrogatesTest().Ptr(), KSurrogatesTest().Length());
+	it = TUTF32Iterator(KSurrogatesTest().Ptr(), KSurrogatesTest().Ptr() + KSurrogatesTest().Length());
+	for(itCount=0;!it.AtEnd();++itCount, it.Next())
+		{
+		TChar ch = it.Current();
+		test(ch == 0x696F0);
+		RDebug::Print(_L("%06X "), (TUint)ch);
+		}
+	test(itCount == 1);
+	RDebug::Print(_L("\n"));
+	}
+
+/**
+@SYMTestCaseID SYSLIB-UNICODE-CT-0098
+@SYMTestCaseDesc TFoldedDecompIterator functionality tested on 2 character sequences.
+@SYMTestPriority High
+@SYMTestActions  TFoldedDecompIterator test.
+@SYMTestExpectedResults The test must not fail.
+@SYMPREQ814 Optimise folded string comparisons.
+*/
+void TestFoldedDecompIterator()
+    {
+    //Character sequence 1:
+    //(1) DEVANAGARI LETTER FA - 0x095E, (2) LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON - 0x01D5
+    //Decompositions:
+    //(1) 0x095E decomposed to: 0x092B 0x093C
+    //(2) 0x01D5 decomposed to: 0x00DC 0x0304
+    //    0x00DC decomposed to: 0x0055 0x0308
+    //    0x0055 decomposed to: 0x0075
+    const TText16 KStr[] = {0x095E, 0x01D5};
+    const TText16 KStrOut[] = {0x092B, 0x093C, 0x0075, 0x0308, 0x0304};
+    ::TestPrintCaption(_L("TFoldedDecompIterator-1"), KStr, ARRAY_SIZE(KStr));
+    TUTF32Iterator itSrc(KStr, KStr + ARRAY_SIZE(KStr));
+    TFoldedDecompIterator it(itSrc);
+    TInt itCount = 0;
+    for(;!it.AtEnd();++itCount, it.Next())
+        {
+        if(!it.IsInFoldedSequence())
+            {
+            it.EnterFoldedSequence();
+            }
+        TChar ch = it.Current();
+        test(ch == static_cast <TUint> (KStrOut[itCount]));
+        RDebug::Print(_L("%04X "), (TUint)ch);
+        }
+    test(itCount == ARRAY_SIZE(KStrOut));
+    RDebug::Print(_L("\n"));
+    //Character sequence 2:
+    //(1) GREEK CAPITAL LETTER BETA - 0x0392
+    //(2) COMBINING GRAVE ACCENT - 0x0300
+    //(3) COMBINING GRAVE ACCENT BELOW - 0x0316
+    //(4) GREEK CAPITAL LETTER GAMMA - 0x0393
+    //(5) HEBREW POINT TSERE - 0x05B5
+    //(6) TIBETAN MARK HALANTA - 0x0F84
+    //Decompositions:
+    //(1) 0x0392 decomposed to: 0x03B2
+    //(2) 0x0300 decomposed to: 0x0300
+    //(3) 0x0316 decomposed to: 0x0316
+    //(4) 0x0393 decomposed to: 0x03B3
+    //(5) 0x05B5 decomposed to: 0x05B5
+    //(6) 0x0F84 decomposed to: 0x0F84
+    const TText16 KStr2[] = {0x0392, 0x0300, 0x0316, 0x0393, 0x05B5, 0x0F84};
+    const TText16 KStrOut2[] = {0x03B2, 0x0300, 0x0316, 0x03B3, 0x05B5, 0x0F84};
+    ::TestPrintCaption(_L("TFoldedDecompIterator-2"), KStr2, ARRAY_SIZE(KStr2));
+    itSrc = TUTF32Iterator(KStr2, KStr2 + ARRAY_SIZE(KStr2));
+    it = TFoldedDecompIterator(itSrc);
+    for(itCount=0;!it.AtEnd();++itCount, it.Next())
+        {
+        if(!it.IsInFoldedSequence())
+            {
+            it.EnterFoldedSequence();
+            }
+        TChar ch = it.Current();
+        test(ch == static_cast <TUint> (KStrOut2[itCount]));
+        RDebug::Print(_L("%04X "), (TUint)ch);
+        }
+    test(itCount == ARRAY_SIZE(KStrOut2));
+    RDebug::Print(_L("\n"));
+    }
+
+/**
+@SYMTestCaseID SYSLIB-UNICODE-CT-0099
+@SYMTestCaseDesc TFoldedSortedDecompIterator functionality tested on 1 character sequence.
+@SYMTestPriority High
+@SYMTestActions  TFoldedSortedDecompIterator test.
+@SYMTestExpectedResults The test must not fail.
+@SYMPREQ814 Optimise folded string comparisons.
+*/
+void TestFoldedSortedDecompIterator()
+    {
+    //Character sequence 1:
+    //(1) GREEK CAPITAL LETTER BETA - 0x0392
+    //(2) COMBINING GRAVE ACCENT - 0x0300
+    //(3) COMBINING GRAVE ACCENT BELOW - 0x0316
+    //(4) GREEK CAPITAL LETTER GAMMA - 0x0393
+    //(5) HEBREW POINT TSERE - 0x05B5
+    //(6) TIBETAN MARK HALANTA - 0x0F84
+    //Decompositions:
+    //0x03B2 Class 0
+    //0x0316 Class 220
+    //0x0300 Class 230
+    //0x03B3 Class 0
+    //0x0F84 Class 9
+    //0x05B5 Class 15
+    const TText16 KStr[] = {0x0392, 0x0300, 0x0316, 0x0393, 0x05B5, 0x0F84};
+    const TText16 KStrOut[] = {0x03B2, 0x0316, 0x0300, 0x03B3, 0x0F84, 0x05B5};
+    const TInt KClass[] = {0, 220, 230, 0, 9, 15};
+    ::TestPrintCaption(_L("TFoldedSortedDecompIterator"), KStr, ARRAY_SIZE(KStr));
+    RDebug::Print(_L("\n"));
+    TUTF32Iterator itSrc(KStr, KStr + ARRAY_SIZE(KStr));
+    TFoldedDecompIterator itDecomp(itSrc);
+    TInt itCount = 0;
+    while(!itDecomp.AtEnd())
+        {
+        if(!itDecomp.IsInFoldedSequence())
+            {
+            itDecomp.EnterFoldedSequence();
+            }
+        if(itDecomp.Current().GetCombiningClass() == 0)
+            {
+            TChar ch = itDecomp.Current();
+            TInt clss = itDecomp.Current().GetCombiningClass();
+            test(ch == static_cast <TUint> (KStrOut[itCount]));
+            test(clss == KClass[itCount]);
+            RDebug::Print(_L("BaseCh %04X Class %d\n"), (TUint)ch, clss);
+            itDecomp.Next();
+            ++itCount;
+            }
+        else
+            {
+            TFoldedSortedDecompIterator it;
+            it.Set(itDecomp);
+            while(!it.AtEnd())
+                {
+                TChar ch = it.Current();
+                TInt clss = it.Current().GetCombiningClass();
+                test(ch == static_cast <TUint> (KStrOut[itCount]));
+                test(clss == KClass[itCount]);
+                RDebug::Print(_L("CombCh %04X Class %d\n"), (TUint)ch, clss);
+                it.Next();
+                ++itCount;
+                }
+            }
+        }
+    test(itCount == ARRAY_SIZE(KStrOut));
+    }
+
+/**
+@SYMTestCaseID SYSLIB-UNICODE-CT-0100
+@SYMTestCaseDesc TFoldedCanonicalIterator functionality tested on 1 character sequence.
+@SYMTestPriority High
+@SYMTestActions  TFoldedCanonicalIterator test.
+@SYMTestExpectedResults The test must not fail.
+@SYMPREQ814 Optimise folded string comparisons.
+*/
+void TestFoldedCanonicalIterator()
+    {
+    //Character sequence 1:
+    //(1) GREEK CAPITAL LETTER BETA - 0x0392
+    //(2) COMBINING GRAVE ACCENT - 0x0300
+    //(3) COMBINING GRAVE ACCENT BELOW - 0x0316
+    //(4) GREEK CAPITAL LETTER GAMMA - 0x0393
+    //(5) HEBREW POINT TSERE - 0x05B5
+    //(6) TIBETAN MARK HALANTA - 0x0F84
+    //(7) LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON - 0x01D5
+    //Decompositions:
+    //0x0392 to 0x03B2 
+    //0x0316 to 0x0316 
+    //0x0300 to 0x0300
+    //0x0393 to 0x03B3
+    //0x0F84 to 0x0F84
+    //0x05B5 to 0x05B5
+    //0x01D5 to 0x0075 0x0308 0x0304
+    const TText16 KStr[] = {0x0392, 0x0300, 0x0316, 0x0393, 0x05B5, 0x0F84, 0x01D5};
+    const TText16 KStrOut[] = {0x03B2, 0x0316, 0x0300, 0x03B3, 0x0F84, 0x05B5, 0x0075, 0x0308, 0x0304};
+    TestPrintCaption(_L("TFoldedCanonicalIterator"), KStr, ARRAY_SIZE(KStr));
+    TUTF32Iterator itSrc(KStr, KStr + ARRAY_SIZE(KStr));
+	TFoldedCanonicalIterator it(itSrc);
+    TInt itCount = 0;
+
+	const TUnicodeDataSet* charDataSet = GetLocaleCharSet()->iCharDataSet;
+
+    for(;!it.AtEnd();++itCount, it.Next(charDataSet))
+        {
+        TChar ch = it.Current();
+        test(ch == static_cast <TUint> (KStrOut[itCount]));
+        RDebug::Print(_L("%04X "), (TUint)ch);
+        }
+    test(itCount == ARRAY_SIZE(KStrOut));
+    RDebug::Print(_L("\n"));
+    }
+
+/**
+@SYMTestCaseID SYSLIB-UNICODE-CT-0101
+@SYMTestCaseDesc TDecompositionIterator functionality tested on 1 character sequence
+@SYMTestPriority High
+@SYMTestActions  TDecompositionIterator test.
+@SYMTestExpectedResults The test must not fail.
+@SYMPREQ814 Optimise folded string comparisons.
+*/
+void TestDecompositionIterator2()
+    {
+    //Character sequence 1
+    //LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON - 0x01D5
+    //Decomposition:
+    //0x01D5 to: 0x0055 0x0308 0x0304 
+    const TText16 KStr[] = {0x01D5};
+    const TText16 KStrOut[] = {0x0055, 0x0308, 0x0304};
+    TestPrintCaption(_L("TDecompositionIterator"), KStr, ARRAY_SIZE(KStr));
+    TUTF32Iterator itSrc(KStr, KStr + ARRAY_SIZE(KStr));
+    TDecompositionIterator it;
+    it.Set(itSrc);
+    TInt itCount = 0;
+    for(;!it.AtEnd(); ++itCount, it.Next())
+        {
+        TChar ch = it.Current();
+        test(ch == static_cast <TUint> (KStrOut[itCount]));
+        RDebug::Print(_L("%04X "), (TUint)ch);
+        }
+    test(itCount == ARRAY_SIZE(KStrOut));
+    RDebug::Print(_L("\n"));
+    }
+
+/**
+@SYMTestCaseID SYSLIB-UNICODE-CT-0102
+@SYMTestCaseDesc TCanonicalDecompositionIterator functionality tested on 1 character sequence
+@SYMTestPriority High
+@SYMTestActions  TCanonicalDecompositionIterator test.
+@SYMTestExpectedResults The test must not fail.
+@SYMPREQ814 Optimise folded string comparisons.
+*/
+void TestCanonicalDecompositionIterator2()
+    {
+    //Character sequence 1
+    //LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON - 0x01D5
+    //Decomposition:
+    //0x01D5 to: 0x0055 0x0308 0x0304 
+    const TText16 KStr[] = {0x01D5};
+    const TText16 KStrOut[] = {0x0055, 0x0308, 0x0304};
+    TestPrintCaption(_L("TCanonicalDecompositionIterator"), KStr, ARRAY_SIZE(KStr));
+    TUTF32Iterator itSrc(KStr, KStr + ARRAY_SIZE(KStr));
+    TCanonicalDecompositionIterator it;
+    it.Set(itSrc);
+    TInt itCount = 0;
+    for(;!it.AtEnd();++itCount, it.Next())
+        {
+        TChar ch = it.Current();
+        test(ch == static_cast <TUint> (KStrOut[itCount]));
+        RDebug::Print(_L("%04X "), (TUint)ch);
+        }
+    test(itCount == ARRAY_SIZE(KStrOut));
+    RDebug::Print(_L("\n"));
+    }
+
+/**
+@SYMTestCaseID SYSLIB-UNICODE-CT-0103
+@SYMTestCaseDesc TCanonicalDecompositionIteratorCached functionality tested on 1 character sequence
+@SYMTestPriority High
+@SYMTestActions  TCanonicalDecompositionIteratorCached test.
+@SYMTestExpectedResults The test must not fail.
+@SYMPREQ814 Optimise folded string comparisons.
+*/
+void TestCanonicalDecompositionIteratorCached()
+    {
+    //Character sequence 1
+    //LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON - 0x01D5
+    //Decomposition:
+    //0x01D5 to: 0x0055 0x0308 0x0304 
+    const TText16 KStr[] = {0x01D5};
+    const TText16 KStrOut[] = {0x0055, 0x0308, 0x0304};
+    TestPrintCaption(_L("TCanonicalDecompositionIteratorCached"), KStr, ARRAY_SIZE(KStr));
+    TUTF32Iterator itSrc(KStr, KStr + ARRAY_SIZE(KStr));
+    TCanonicalDecompositionIteratorCached it;
+    it.Set(itSrc);
+    TInt itCount = 0;
+    for(;!it.AtEnd();++itCount, it.Next(1))
+        {
+        TChar ch = it.Get(0);
+        test(ch == static_cast <TUint> (KStrOut[itCount]));
+        RDebug::Print(_L("%04X "), (TUint)ch);
+        }
+    test(itCount == ARRAY_SIZE(KStrOut));
+    RDebug::Print(_L("\n"));
+    }
+
+/**
+@SYMTestCaseID SYSLIB-UNICODE-CT-0104
+@SYMTestCaseDesc TDecompositionIterator test
+@SYMTestPriority High
+@SYMTestActions  TDecompositionIterator test.
+@SYMTestExpectedResults The test must not fail.
+@SYMPREQ814 Optimise folded string comparisons.
+*/
+void TestDecompositionIterator()
+	{
+    TDecompositionIterator i;
+
+	// test basic character handling
+	TUTF32Iterator i1(KHelloT().Ptr(), KHelloT().Ptr() + KHelloT().Length());
+    i.Set(i1);
+	TestIteratorOutput(i, KHelloT);
+
+	TUTF32Iterator i2(KHelloT().Ptr() + 3, KHelloT().Ptr() + KHelloT().Length());
+    i.Set(i2);
+	TestIteratorOutput(i, KHelloT().Mid(3));
+
+	// test combining characters
+	TUTF32Iterator i3(KLatin1AccentsC().Ptr(), KLatin1AccentsC().Ptr() + KLatin1AccentsC().Length());
+    i.Set(i3);
+	TestIteratorOutput(i, KLatin1AccentsD);
+
+	TUTF32Iterator i4(KGreekAccentsC().Ptr(), KGreekAccentsC().Ptr() + KGreekAccentsC().Length());
+    i.Set(i4);
+	TestIteratorOutput(i, KGreekAccentsD);
+
+	TUTF32Iterator i5(KGreekAccentsS().Ptr(), KGreekAccentsS().Ptr() + KGreekAccentsS().Length());
+    i.Set(i5);
+	TestIteratorOutput(i, KGreekAccentsD);
+
+	// test that full-width variants are not fiddled with
+	TUTF32Iterator i6(KFullWidth().Ptr(), KFullWidth().Ptr() + KFullWidth().Length());
+    i.Set(i6);
+	TestIteratorOutput(i, KFullWidth);
+
+	TUTF32Iterator i7(KSurrogates().Ptr(), KSurrogates().Ptr() + KSurrogates().Length());
+    i.Set(i7);
+	TestIteratorOutput(i, KSurrogatesTest);
+	}
+
+//The function collects collation keys at the specified level aLevel from aIt iterator 
+//and stores them in aBuf output parameter.
+//aExpectedNumKeys value specifies the count of expected collation keys.
+void GetKeys(TCollationValueIterator& aIt, TUint32* aBuf, TInt aLevel, TInt aExpectedNumKeys)
+	{
+	//Zero the output parameter
+	Mem::FillZ(aBuf, sizeof(TUint32) * aExpectedNumKeys);
+	//Get the keys
+	TInt i = 0;
+	for(;i!=aExpectedNumKeys;++i)
+		{
+		for (;;)
+			{
+			(void)aIt.GetCurrentKey(aLevel, aBuf[i]);
+			test(aIt.Increment());
+			if(aBuf[i] != 0)
+				{
+				break;
+				}
+			}
+		}
+	//The rest of the keys at that level should have 0 value.
+	for(;aIt.Increment();)
+		{
+		TUint32 key = 0;
+		(void)aIt.GetCurrentKey(aLevel, key);
+		test(key == 0);
+		}
+	}
+
+//The function collects the raw keys from aIt iterator and stores them in aBuf output parameter.
+//aExpectedNumKeys value specifies the count of expected raw collation keys.
+void GetRawKeys(TCollationValueIterator& aIt, TCollationKey* aBuf, TInt aExpectedNumKeys)
+	{
+	//Zero the output parameter
+	Mem::FillZ(aBuf, sizeof(TCollationKey) * aExpectedNumKeys);
+	//Get the keys
+	for(TInt i=0;i!=aExpectedNumKeys;++i)
+		{
+		test(aIt.GetCurrentKey(aBuf[i]));
+		aIt.Increment();
+		}
+	//One additional GetCurrentKey() call. Because there shouldn't be more raw keys than  
+	//aExpectedNumKeys, the call should fail returning EFalse.
+	TCollationKey dummy;
+	test(!aIt.GetCurrentKey(dummy));
+	}
+
+//The function gets a sequence of raw collation keys in aBuf parameter and a character number
+//aCharNo in the original string.
+//It returns the position in aBuf where raw collation key sequence for aCharNo starts.
+TInt CharNo2CollKeyPos(const TCollationKey* aBuf, TInt aBufLen, TInt aCharNo)
+    {
+    TInt starterCnt = 0;
+    TInt pos = 0;
+    do
+        {
+        if(aBuf[pos].IsStarter())
+            {
+            ++starterCnt;
+            }
+        } while(starterCnt!=(aCharNo+1) && ++pos!=aBufLen);
+    test(pos != aBufLen);
+    return pos;
+    }
+
+//The function compares aBuf1 and aBuf2 and returns how many elements in aBuf1 differ
+//from the elements in aBuf2 at the same position.
+TInt CountDiscrepancies(TUint32* aBuf1, TUint32* aBuf2, TInt aCount)
+	{
+	TInt discrepancies = 0;
+	for (; aCount; --aCount)
+		{
+		if (*aBuf1++ != *aBuf2++)
+			++discrepancies;
+		}
+	return discrepancies;
+	}
+
+TInt CountDiscrepancies(TCollationKey* aBuf1, TCollationKey* aBuf2, TInt aCount)
+	{
+	TInt discrepancies = 0;
+	for (; aCount; --aCount)
+		{
+		if (aBuf1->iHigh != aBuf2->iHigh || aBuf1->iLow != aBuf2->iLow)
+			++discrepancies;
+		++aBuf1;
+		++aBuf2;
+		}
+	return discrepancies;
+	}
+
+_LIT(KAYZAccentsAbove, "\xE0\x301y\x302z\x303\x304");
+_LIT(KCapitalAYZAccentsAbove, "A\x300\x301Y\x302Z\x303\x304");
+_LIT(KCapitalYAYZAccentsAbove, "a\x300\x301Y\x302z\x303\x304");
+_LIT(KABCRuleTest, "abcwabkakb");
+_LIT(KABCRuleExpected, "eeabkakb");
+//_LIT(KExhaustCaches, "0123456789ABCDEFexhausted");
+_LIT(KGreekOPVY1, "\x1f82");
+_LIT(KGreekOPVY2, "\x1f02\x345");
+_LIT(KGreekOPVY3, "\x1f00\x300\x345");
+_LIT(KGreekOPVY4, "\x3b1\x313\x300\x345");
+_LIT(KGreekOPVY5, "\x3b1\x313\x345\x300");
+_LIT(KGreekOPVY6, "\x3b1\x345\x313\x300");
+
+/**
+@SYMTestCaseID SYSLIB-UNICODE-CT-0105
+@SYMTestCaseDesc TCollationValueIterator test
+@SYMTestPriority High
+@SYMTestActions  TCollationValueIterator tests
+@SYMTestExpectedResults The test must not fail.
+@SYMPREQ814 Optimise folded string comparisons.
+*/
+void TestCollationValueIterator()
+	{
+   	// a funny pair of extra collation rules: w and abc both collate as e.
+   	TUint32 abcWTLKey[] = {0/* key for 'e' will go here */,
+   		0x8ff00101, 0x8ff10101, 0x8ff20101, 0x8ff30101,
+   		0x8ff40101, 0x8ff50101, 0x8ff60101};
+   	const TUint32 overrideIndex[] = {0x00770000, 0x0E010001, 0x0E400002, 0x0E440003,
+   		0x0E810004, 0x0EC10005, 0x0EC20006, 0xEC30007};
+   	const TUint16 abcString[4] = {0x0003, 0x0061, 0x0062, 0x0063};
+   	const TUint32 abcStringIndex = 0;
+   	TCollationMethod method;
+   	method.iId = 0;
+   	method.iMainTable = StandardCollationMethod();
+   	method.iFlags = TCollationMethod::EIgnoreNone;
+   	TInt charindex;
+   	for (charindex = 0; method.iMainTable->iIndex[charindex] >> 16 != 'e'; ++charindex)
+		{
+		}
+	abcWTLKey[0] = method.iMainTable->iKey[method.iMainTable->iIndex[charindex] & 0xFFFF];
+	TCollationKeyTable overrideTable = {abcWTLKey, overrideIndex, sizeof(abcWTLKey)/4, abcString, &abcStringIndex, 1};
+	method.iOverrideTable = &overrideTable;
+	
+   	TCollationValueIterator v(method);
+	TCollationValueIterator rv(method);
+
+   	TUint32 buf1[32];
+   	TUint32 buf2[32];
+
+   	TCollationKey raw1[32];
+   	TCollationKey raw2[32];
+	const TInt KRawKeyCnt = 8;//Raw collation key count produced from KAYZAccentsAbove string.
+	
+	//Get the raw key sequence for the whole KAYZAccentsAbove string.
+	TUTF32Iterator it(KAYZAccentsAbove().Ptr(), KAYZAccentsAbove().Ptr() + KAYZAccentsAbove().Length());
+	rv.SetSourceIt(it);
+	::GetRawKeys(rv, raw1, KRawKeyCnt);
+	
+	//KAYZAccentsAbove related constants
+	const TInt KBaseCharCnt = 3;//The number of base characters (A, y, z) in KAYZAccentsAbove string.
+	const TInt KOrgPosA = 0;//A position in KAYZAccentsAbove
+	const TInt KOrgPosY = 2;//y position in KAYZAccentsAbove
+	const TInt KOrgPosZ = 4;//z position in KAYZAccentsAbove
+	//Find where the collation key sequences start for A, y, z characters in KAYZAccentsAbove string.
+	const TInt KCollKeyPosA = ::CharNo2CollKeyPos(raw1, KRawKeyCnt, 0);
+	const TInt KCollKeyPosY = ::CharNo2CollKeyPos(raw1, KRawKeyCnt, 1);
+	const TInt KCollKeyPosZ = ::CharNo2CollKeyPos(raw1, KRawKeyCnt, 2);
+   
+	//Get the raw key sequence for character A in KAYZAccentsAbove string.
+	it = TUTF32Iterator(KAYZAccentsAbove().Ptr() + KOrgPosA, KAYZAccentsAbove().Ptr() + KAYZAccentsAbove().Length());
+	rv.SetSourceIt(it);
+	::GetRawKeys(rv, raw2 + KCollKeyPosA, KRawKeyCnt - KCollKeyPosA);
+	//
+	test(0 == ::CountDiscrepancies(raw1, raw2, KRawKeyCnt));
+	
+	//Get the raw key sequence for character Y in KAYZAccentsAbove string.
+	it = TUTF32Iterator(KAYZAccentsAbove().Ptr() + KOrgPosY, KAYZAccentsAbove().Ptr() + KAYZAccentsAbove().Length());
+	rv.SetSourceIt(it);
+	::GetRawKeys(rv, raw2 + KCollKeyPosY, KRawKeyCnt - KCollKeyPosY);
+	//
+	test(0 == ::CountDiscrepancies(raw1, raw2, KRawKeyCnt));
+   
+	//Get the raw key sequence for character Z in KAYZAccentsAbove string.
+	it = TUTF32Iterator(KAYZAccentsAbove().Ptr() + KOrgPosZ, KAYZAccentsAbove().Ptr() + KAYZAccentsAbove().Length());
+	rv.SetSourceIt(it);
+	::GetRawKeys(rv, raw2 + KCollKeyPosZ, KRawKeyCnt - KCollKeyPosZ);
+	//
+	test(0 == ::CountDiscrepancies(raw1, raw2, KRawKeyCnt));
+   
+	//Test starting at different points in the iteration
+	
+	//Level 0
+	//The whole string
+	it = TUTF32Iterator(KAYZAccentsAbove().Ptr(), KAYZAccentsAbove().Ptr() + KAYZAccentsAbove().Length());
+	v.SetSourceIt(it);
+	::GetKeys(v, buf1, 0, KBaseCharCnt);
+	//String from Y pos.
+	it = TUTF32Iterator(KAYZAccentsAbove().Ptr() + KOrgPosY, KAYZAccentsAbove().Ptr() + KAYZAccentsAbove().Length());
+	v.SetSourceIt(it);
+	::GetKeys(v, buf2, 0, KBaseCharCnt - 1);
+	//
+	test(0 == ::CountDiscrepancies(buf1 + 1, buf2, KBaseCharCnt - 1));
+	//String from Z pos.
+	it = TUTF32Iterator(KAYZAccentsAbove().Ptr() + KOrgPosZ, KAYZAccentsAbove().Ptr() + KAYZAccentsAbove().Length());
+	v.SetSourceIt(it);
+	::GetKeys(v, buf2, 0, KBaseCharCnt - 2);
+	//
+	test(0 == ::CountDiscrepancies(buf1 + 2, buf2, KBaseCharCnt - 2));
+   
+	//Level 1
+	//KCapitalAYZAccentsAbove is used in this test.
+	it = TUTF32Iterator(KCapitalAYZAccentsAbove().Ptr(), KCapitalAYZAccentsAbove().Ptr() + KCapitalAYZAccentsAbove().Length());
+	v.SetSourceIt(it);
+	::GetRawKeys(v, raw1, 8);
+	const TInt KOrgPosY2 = 3;//Y position in KCapitalAYZAccentsAbove
+	const TInt KCollKeyPosY2 = ::CharNo2CollKeyPos(raw1, KRawKeyCnt, 1);
+	//The whole string
+	it = TUTF32Iterator(KCapitalAYZAccentsAbove().Ptr(), KCapitalAYZAccentsAbove().Ptr() + KCapitalAYZAccentsAbove().Length());
+	v.SetSourceIt(it);
+	::GetKeys(v, buf1, 1, 8);
+	//String from Y pos.
+	it = TUTF32Iterator(KCapitalAYZAccentsAbove().Ptr() + KOrgPosY2, KCapitalAYZAccentsAbove().Ptr() + KCapitalAYZAccentsAbove().Length());
+	v.SetSourceIt(it);
+	::GetKeys(v, buf2, 1, 8 - KCollKeyPosY2);
+	//
+	test(0 == ::CountDiscrepancies(buf1 + KCollKeyPosY2, buf2, 8 - KCollKeyPosY2));
+   
+	//Level 2
+	//Capitals do not match at level 2
+	it = TUTF32Iterator(KAYZAccentsAbove().Ptr(), KAYZAccentsAbove().Ptr() + KAYZAccentsAbove().Length());
+	v.SetSourceIt(it);
+	::GetKeys(v, buf1, 2, 8);
+	it = TUTF32Iterator(KCapitalYAYZAccentsAbove().Ptr(), KCapitalYAYZAccentsAbove().Ptr() + KCapitalYAYZAccentsAbove().Length());
+	v.SetSourceIt(it);
+	::GetKeys(v, buf2, 2, 8);
+	//
+   	test(1 == CountDiscrepancies(buf1, buf2, 8));
+   	test(buf1[3] != buf2[3]);
+   
+	//Test funny collation keys, when they succeed and when they fail half way.
+	it = TUTF32Iterator(KABCRuleTest().Ptr(), KABCRuleTest().Ptr() + KABCRuleTest().Length());
+	v.SetSourceIt(it);
+	::GetKeys(v, buf1, 0, 8);
+	it = TUTF32Iterator(KABCRuleExpected().Ptr(), KABCRuleExpected().Ptr() + KABCRuleExpected().Length());
+	v.SetSourceIt(it);
+	::GetKeys(v, buf2, 0, 8);
+	//
+	test(0 == ::CountDiscrepancies(buf1, buf2, 8));
+   
+	//Test different decompositions at level 3
+	it = TUTF32Iterator(KGreekOPVY1().Ptr(), KGreekOPVY1().Ptr() + KGreekOPVY1().Length());
+	v.SetSourceIt(it);
+	::GetKeys(v, buf1, 3, 4);
+	//
+	it = TUTF32Iterator(KGreekOPVY2().Ptr(), KGreekOPVY2().Ptr() + KGreekOPVY2().Length());
+	v.SetSourceIt(it);
+	::GetKeys(v, buf2, 3, 4);
+	//
+	test(0 == ::CountDiscrepancies(buf1, buf2, 4));
+	//
+	it = TUTF32Iterator(KGreekOPVY3().Ptr(), KGreekOPVY3().Ptr() + KGreekOPVY3().Length());
+	v.SetSourceIt(it);
+	::GetKeys(v, buf2, 3, 4);
+	//
+	test(0 == ::CountDiscrepancies(buf1, buf2, 4));
+	//
+	it = TUTF32Iterator(KGreekOPVY4().Ptr(), KGreekOPVY4().Ptr() + KGreekOPVY4().Length());
+	v.SetSourceIt(it);
+	::GetKeys(v, buf2, 3, 4);
+	//
+	test(0 == ::CountDiscrepancies(buf1, buf2, 4));
+	//
+	it = TUTF32Iterator(KGreekOPVY5().Ptr(), KGreekOPVY5().Ptr() + KGreekOPVY5().Length());
+	v.SetSourceIt(it);
+	::GetKeys(v, buf2, 3, 4);
+	//
+	test(0 == ::CountDiscrepancies(buf1, buf2, 4));
+	//
+	it = TUTF32Iterator(KGreekOPVY6().Ptr(), KGreekOPVY6().Ptr() + KGreekOPVY6().Length());
+	v.SetSourceIt(it);
+	::GetKeys(v, buf2, 3, 4);
+	//
+	test(0 == ::CountDiscrepancies(buf1, buf2, 4));
+	}
+
+// folding tests
+
+// equivalence classes: all codes that fold to the same letter (which must be present
+// in the list). The lists are separated by -1. The end is marked with two -1s.
+// Each list must be in increasing order.
+TInt FoldingEquivalenceClasses[] =
+	{
+	'A', 'a', -1, 'Z', 'z', -1, '@', -1, '[', -1, '{', -1, 127, -1, 'I', 'i', 0x131, -1, 0, -1,
+	' ', 0xA0, -1,
+	0x300, -1, 0x301, -1,
+	0x141, 0x142, -1,
+	0x1c4, 0x1c5, 0x1c6, -1, 0x1c7, 0x1c8, 0x1c9, -1, 0x1ca, 0x1cb, 0x1cc, -1,
+	0x1f1, 0x1f2, 0x1f3, -1, 0x3a3, 0x3c2, 0x3c3, 0x3f2, -1,
+	0x402, 0x452, -1, 0x40F, 0x45F, -1, 0x460, 0x461, -1, 0x480, 0x481, -1, 0x482, -1,
+	0x410, 0x430, -1, 0x42F, 0x44f, -1, 0x48C, 0x48D, -1, 0x4e8, 0x4e9, -1,
+	0x531, 0x561, -1, 0x556, 0x586, -1, 0x559, -1, 0x55f, -1, -1
+	};
+
+//_LIT(KMatchLeadingCandidate1, "\xE1\x65\x300\x301\x302\x303pqa\x301");
+//_LIT(KNoQMs, "a???");
+//_LIT(KOneQM, "?a");
+//_LIT(KTwoQMs, "??");
+//_LIT(KThreeQMs, "???*?");
+
+//Constructs TUTF32Iterator iterator from aStr
+TUTF32Iterator UTF32It(const TDesC16& aStr)
+    {
+    return TUTF32Iterator(aStr.Ptr(), aStr.Ptr() + aStr.Length());
+    }
+
+/**
+@SYMTestCaseID SYSLIB-UNICODE-CT-0107
+@SYMTestCaseDesc MatchSectionFolded test
+@SYMTestPriority High
+@SYMTestActions  MatchSectionFolded test
+@SYMTestExpectedResults The test must not fail.
+@SYMPREQ814 Optimise folded string comparisons.
+*/
+void MatchSectionFoldedTest()
+    {
+    TUTF32Iterator candidateIt, searchTermIt;
+
+    candidateIt = UTF32It(_L16("\xE1"));
+    searchTermIt = UTF32It(_L16("a"));
+    test(!MatchSectionFolded(candidateIt, searchTermIt));
+
+    candidateIt = UTF32It(_L16("a"));
+    searchTermIt = UTF32It(_L16("\xE1"));
+    test(!MatchSectionFolded(candidateIt, searchTermIt));
+
+    candidateIt = UTF32It(_L16("abca\xE1\x62\x62\x61\x61\x61\x62\x63\x62\x61"));
+    searchTermIt = UTF32It(_L16("aBc"));
+    test(MatchSectionFolded(candidateIt, searchTermIt));
+    test(searchTermIt.AtEnd());
+    TPtrC16 p1(_L16("a\xE1\x62\x62\x61\x61\x61\x62\x63\x62\x61"));
+    TPtrC16 p2(candidateIt.CurrentPosition(), 11);
+    test(p1 == p2);
+
+    candidateIt = UTF32It(_L16("aaaacdeiooo"));
+    searchTermIt = UTF32It(_L16("acde"));
+    test(!MatchSectionFolded(candidateIt, searchTermIt));
+    }
+
+//FindMatchSectionFolded test
+void DoFindMatchSectionFoldedTest(const TDesC16& aCandidate, const TDesC16& aSearchTerm, TInt aPos)
+    {
+    TUTF32Iterator candidateIt, searchTermIt;
+    candidateIt = UTF32It(aCandidate);
+    searchTermIt = UTF32It(aSearchTerm);
+    if(aPos >= 0)
+        {
+        test(FindMatchSectionFolded(candidateIt, searchTermIt));
+        test(searchTermIt.AtEnd());
+        }
+    else
+        {
+        test(!FindMatchSectionFolded(candidateIt, searchTermIt));
+        }
+    }
+
+//This class is used for reading lines from the unicode data file.
+class RUnicodeTestDataFile
+    {
+public:
+    RUnicodeTestDataFile();
+    void OpenLC();
+    void Close();
+    TBool NextStmt(TPtrC8& aStmt);
+private:
+    HBufC8* iFileData;
+    TInt iStartPos;
+    };
+
+RUnicodeTestDataFile::RUnicodeTestDataFile() :
+    iFileData(NULL),
+    iStartPos(0)
+    {
+    }
+
+void RUnicodeTestDataFile::OpenLC()
+    {
+    __ASSERT_ALWAYS(!iFileData && !iStartPos, User::Invariant());
+    iFileData = NULL;
+    iStartPos = 0;
+    CleanupClosePushL(*this);
+
+    RFs fileSess;
+    CleanupClosePushL(fileSess);
+    User::LeaveIfError(fileSess.Connect());
+
+    RFile file;
+    CleanupClosePushL(file);
+    User::LeaveIfError(file.Open(fileSess, KUnicodeTestDataFile, EFileRead));
+
+    TInt fileSize;
+    User::LeaveIfError(file.Size(fileSize));
+    __ASSERT_ALWAYS(fileSize > 0, User::Invariant());
+
+    iFileData = HBufC8::NewL(fileSize + 1);
+
+    TPtr8 p = iFileData->Des();
+	User::LeaveIfError(file.Read(p));
+
+    CleanupStack::PopAndDestroy(2, &fileSess);
+    }
+
+void RUnicodeTestDataFile::Close()
+    {
+    delete iFileData;
+    iFileData = NULL;
+    iStartPos = 0;
+    }
+
+TBool RUnicodeTestDataFile::NextStmt(TPtrC8& aStmt)
+    {
+    aStmt.Set(NULL, 0);
+    if(iStartPos < iFileData->Length())
+        {
+        const TUint8* pStart = iFileData->Des().Ptr() + iStartPos;
+        const TUint8* pEnd = pStart;
+        while(*pEnd++ != 0x0A)
+            {
+            }
+        iStartPos += pEnd - pStart;
+        aStmt.Set(pStart, pEnd - pStart - 1);
+        return ETrue;
+        }
+    return EFalse;
+    }
+
+//Get a field "aFieldNo" from "aStr" statement containing encoded unicode character data
+TPtrC8 GetUnicodeDataField(const TPtrC8& aStr, TInt aFieldNo)
+    {
+    const TUint8* pStart = aStr.Ptr();
+    //Find the beginning of the field
+    TInt count = 0;
+    while(count < aFieldNo)
+        {
+        if(*pStart++ == ';')
+            {
+            ++count;
+            }
+        }
+    //Find the end of the field
+    const TUint8* pEnd = pStart;
+    while(*pEnd++ != ';')
+        {
+        }
+    //Construct a string from the field data
+    TPtrC8 ptr(pStart, pEnd - pStart - 1);
+    return ptr;
+    }
+   
+//Construct a string "aStr" with the extracted hex codes from "aUnicodeData"
+//The extracted unicodes are placed not from position 0, because some of 
+//the decomposable unicode characters are combining characters. If "aStr" is a search
+//string, then the searching algorithm will not work.
+void FillStringL(TDes16& aStr, const TDesC8& aUnicodeData)
+    {
+    aStr.SetLength(aStr.MaxLength());
+    TLex8 lex(aUnicodeData);
+    TInt len = 0;
+    for(len=0;!lex.Eos();++len)
+        {
+        TUint32 code;
+        User::LeaveIfError(lex.Val(code, EHex));
+        lex.Assign(lex.NextToken());
+        aStr[1+len] = (TUint16)code;
+        }
+    __ASSERT_ALWAYS(len > 0, User::Invariant());
+    aStr.SetLength(1 + len);
+    }
+   
+//Get the character unicode, which is at position 0
+TUint32 GetChCodeL(const TDesC8& aStr)
+    {
+    TLex8 lex(aStr);
+    TUint32 chCode;
+    User::LeaveIfError(lex.Val(chCode, EHex));
+    return chCode;
+    }
+
+//Simple unicode folding tests
+void FindMatchSectionFoldedTestSimple()
+    {
+	_LIT16(KCandidate, "abca\xE1\x62\x62\x61\x61\x61\x62\x63\x62\x61");
+	DoFindMatchSectionFoldedTest(KCandidate, _L("abc"), 0);
+	DoFindMatchSectionFoldedTest(KCandidate, _L("abb"), -1);
+	DoFindMatchSectionFoldedTest(KCandidate, _L("caa"), -1);
+	DoFindMatchSectionFoldedTest(KCandidate, _L("abcb"), 9);
+	DoFindMatchSectionFoldedTest(KCandidate, _L("\xE1"), 4);
+	DoFindMatchSectionFoldedTest(KCandidate, _L("a\x301"), 4);
+	DoFindMatchSectionFoldedTest(KCandidate, _L("A\xC1\x42\x42"), 3);
+	DoFindMatchSectionFoldedTest(KCandidate, _L("a\x301\x42\x42"), 4);
+	DoFindMatchSectionFoldedTest(KCandidate, _L("a?BB"), 3);
+	DoFindMatchSectionFoldedTest(KCandidate, _L(""), 0);
+	DoFindMatchSectionFoldedTest(KCandidate, _L("?"), 0);
+	DoFindMatchSectionFoldedTest(KCandidate, _L("??????????????"), 0);
+	DoFindMatchSectionFoldedTest(KCandidate, _L("???????????????"), -1);
+	DoFindMatchSectionFoldedTest(KCandidate, _L("????a?????????"), -1);
+	DoFindMatchSectionFoldedTest(KCandidate, _L("???a??????????"), 0);
+	DoFindMatchSectionFoldedTest(KCandidate, _L("caa?"), -1);
+	DoFindMatchSectionFoldedTest(KCandidate, _L("abcb?"), 9);
+	DoFindMatchSectionFoldedTest(KCandidate, _L("abcb??"), -1);
+	DoFindMatchSectionFoldedTest(KCandidate, _L("b?aa"), 5);
+    }
+
+//Extended tests - all characters, having non-zero "character decomposition mapping" field
+//or non-zero "upper case mapping" field
+void FindMatchSectionFoldedTestComplexL()
+    {
+    TBuf16<10> candidate;
+    candidate.Copy(_L16("abcdefghij"));
+    TBuf16<10> searchTerm;
+    searchTerm.Copy(_L16("eeeeefghij"));
+    const TInt KChPos = 5;
+    //Read and parse each line from the unicode data file.
+    RUnicodeTestDataFile unicodeTestDataFile;
+    unicodeTestDataFile.OpenLC();
+    TPtrC8 stmt;
+    while(unicodeTestDataFile.NextStmt(stmt) && stmt.Length() > 0)
+        {
+        //Get the character code
+        TUint32 chCode = GetChCodeL(stmt);
+        //Do not test characters, which code is > 0xFFFF
+        if(chCode > (TUint32)0xFFFF)
+            {
+            continue;
+            }
+        //"LATIN CAPITAL LETTER I WITH DOT ABOVE" - the searching algorithm does not work with it.
+        if(chCode == (TUint32)0x0130)
+            {
+            continue;
+            }
+        candidate[KChPos] = (TUint16)chCode;
+        //"Character decomposition mapping" is the 5th field, starting from 0.
+        TPtrC8 decomp(GetUnicodeDataField(stmt, 5));
+        if(decomp.Length() > 1 && decomp[0] != '<')
+            {
+            //This character has valid decomposition mapping - test it.
+            //Construct the search string
+            FillStringL(searchTerm, decomp);
+            //Test
+            DoFindMatchSectionFoldedTest(candidate, searchTerm, KChPos);
+            }
+        //"Uppercase mapping" is the 12th field, starting from 0.
+        TPtrC8 upperc(GetUnicodeDataField(stmt, 12));
+        if(upperc.Length() > 1)
+            {
+            //This character has valid uppercase mapping - test it.
+            //Construct the search string
+            FillStringL(searchTerm, upperc);
+            //Test
+            DoFindMatchSectionFoldedTest(candidate, searchTerm, KChPos);
+            }
+        }//end of "while" - for each file statement
+    CleanupStack::PopAndDestroy(&unicodeTestDataFile);
+    }
+
+//MatchStringFolded test
+void MatchStringFoldedTestL()
+    {
+    TBuf16<2> candidate;
+    candidate.Copy(_L16("aa"));
+    TBuf16<10> searchTerm;
+    searchTerm.Copy(_L16("aaaaaaaaaa"));
+    const TInt KChPos = 1;
+    //Read and parse each line from the unicode data file.
+    RUnicodeTestDataFile unicodeTestDataFile;
+    unicodeTestDataFile.OpenLC();
+    TPtrC8 stmt;
+    while(unicodeTestDataFile.NextStmt(stmt) && stmt.Length() > 0)
+        {
+        //Get the character code
+        TUint32 chCode = GetChCodeL(stmt);
+        //Do not test characters, which code is > 0xFFFF
+        if(chCode > (TUint32)0xFFFF)
+            {
+            continue;
+            }
+        //"LATIN CAPITAL LETTER I WITH DOT ABOVE" - the searching algorithm does not work with it.
+        if(chCode == (TUint32)0x0130)
+            {
+            continue;
+            }
+        candidate[KChPos] = (TUint16)chCode;
+        //"Character decomposition mapping" is the 5th field, starting from 0.
+        TPtrC8 decomp(GetUnicodeDataField(stmt, 5));
+        if(decomp.Length() > 1 && decomp[0] != '<')
+            {
+            //This character has valid decomposition mapping - test it.
+            //Construct the search string
+            FillStringL(searchTerm, decomp);
+            //Test
+            test(MatchStringFolded(candidate.Ptr(), candidate.Ptr() + candidate.Length(),
+                                   searchTerm.Ptr(), searchTerm.Ptr() + searchTerm.Length()));
+            }
+        //"Uppercase mapping" is the 12th field, starting from 0.
+        TPtrC8 upperc(GetUnicodeDataField(stmt, 12));
+        if(upperc.Length() > 1)
+            {
+            //This character has valid uppercase mapping - test it.
+            //Construct the search string
+            FillStringL(searchTerm, upperc);
+            //Test
+            test(MatchStringFolded(candidate.Ptr(), candidate.Ptr() + candidate.Length(),
+                                   searchTerm.Ptr(), searchTerm.Ptr() + searchTerm.Length()));
+            }
+        }//end of "while" - for each file statement
+    CleanupStack::PopAndDestroy(&unicodeTestDataFile);
+    }
+
+void FindMatchSectionFoldedTestL()
+    {
+    FindMatchSectionFoldedTestSimple();
+    FindMatchSectionFoldedTestComplexL();
+    }
+
+void TestFindMatchFoldedL()
+	{
+	MatchSectionFoldedTest();
+	FindMatchSectionFoldedTestL();
+	MatchStringFoldedTestL();
+	}
+
+void TestCompareFoldedEqual(const TDesC& a, const TDesC& b)
+	{
+	test(a.CompareF(b) == 0);
+	test(b.CompareF(a) == 0);
+	}
+	
+void TestCompareFolded()
+	{
+	// Latin Extended A
+	TestCompareFoldedEqual(_L("\x100"), _L("\x101"));
+	TestCompareFoldedEqual(_L("\x100"), _L("A\x304"));
+	TestCompareFoldedEqual(_L("\x100"), _L("a\x304"));
+	TestCompareFoldedEqual(_L("\x104"), _L("\x105"));
+	TestCompareFoldedEqual(_L("\x104"), _L("a\x328"));
+	TestCompareFoldedEqual(_L("\x107"), _L("C\x301"));
+	TestCompareFoldedEqual(_L("\x10F"), _L("\x10E"));
+	TestCompareFoldedEqual(_L("\x10F"), _L("D\x30C"));
+	TestCompareFoldedEqual(_L("\x110"), _L("\x111"));
+	TestCompareFoldedEqual(_L("\x123"), _L("G\x327"));
+	TestCompareFoldedEqual(_L("\x132"), _L("\x133"));
+	TestCompareFoldedEqual(_L("\x131"), _L("i"));
+	TestCompareFoldedEqual(_L("\x131"), _L("I"));
+	TestCompareFoldedEqual(_L("i"), _L("I"));
+	TestCompareFoldedEqual(_L("\x13F"), _L("\x140"));
+	TestCompareFoldedEqual(_L("\x141"), _L("\x142"));
+	TestCompareFoldedEqual(_L("\x14A"), _L("\x14B"));
+	TestCompareFoldedEqual(_L("\x150"), _L("\x151"));
+	TestCompareFoldedEqual(_L("\x150"), _L("o\x30B"));
+	TestCompareFoldedEqual(_L("\x152"), _L("\x153"));
+	TestCompareFoldedEqual(_L("\x17D"), _L("\x17E"));
+	TestCompareFoldedEqual(_L("\x17D"), _L("z\x30C"));
+	// Latin Extended B
+	TestCompareFoldedEqual(_L("\x182"), _L("\x183"));
+	TestCompareFoldedEqual(_L("\x184"), _L("\x185"));
+	TestCompareFoldedEqual(_L("\x187"), _L("\x188"));
+	TestCompareFoldedEqual(_L("\x18A"), _L("\x257"));
+	TestCompareFoldedEqual(_L("\x194"), _L("\x263"));
+	TestCompareFoldedEqual(_L("\x195"), _L("\x1F6"));
+	TestCompareFoldedEqual(_L("\x196"), _L("\x269"));
+	TestCompareFoldedEqual(_L("\x1A2"), _L("\x1A3"));
+	TestCompareFoldedEqual(_L("\x1A6"), _L("\x280"));
+	TestCompareFoldedEqual(_L("\x1BF"), _L("\x1F7"));
+	TestCompareFoldedEqual(_L("\x1DC"), _L("\x1DB"));
+	TestCompareFoldedEqual(_L("\x1DC"), _L("u\x308\x300"));
+	TestCompareFoldedEqual(_L("\x1DD"), _L("\x18E"));
+	TestCompareFoldedEqual(_L("\x1EC"), _L("\x1ED"));
+	TestCompareFoldedEqual(_L("\x1FC"), _L("\x1FD"));
+	TestCompareFoldedEqual(_L("\x200"), _L("\x201"));
+	TestCompareFoldedEqual(_L("\x216"), _L("u\x311"));
+	TestCompareFoldedEqual(_L("\x21B"), _L("T\x326"));
+	TestCompareFoldedEqual(_L("\x21C"), _L("\x21D"));
+	TestCompareFoldedEqual(_L("\x229"), _L("E\x327"));
+	TestCompareFoldedEqual(_L("\x22A"), _L("\x22B"));
+	TestCompareFoldedEqual(_L("\x22A"), _L("O\x308\x304"));
+	TestCompareFoldedEqual(_L("\x22A"), _L("\xF6\x304"));
+	TestCompareFoldedEqual(_L("\x233"), _L("y\x304"));
+	TestCompareFoldedEqual(_L("\x233"), _L("\x232"));
+	}
+	
+void TestCompareFoldedNotEqual(TDesC& a, TDesC& b, TInt aValue)
+	{
+	test(a.CompareF(b) == aValue);
+	}
+	
+static void TestCompareFoldedAdditional()
+	{
+	const TText16 UnicodeTextOne16[] = {'a', 0};
+	const TText16 ErrUnicodeTextOne16[] = {'[', 0};
+	
+	const TText16 UnicodeTextTwo16[] = {0x00EA, 0x0323, 0};
+	const TText16 ErrUnicodeTextTwo16[] = {0x00EA, 't', 0};
+	
+	const TText16 UnicodeTextThree16[] = {0x00EA, 0x03B1, 0};
+	const TText16 ErrUnicodeTextThree16[] = {0x00EA, 0x0323, 0};
+	
+	TBufC16<ARRAY_SIZE(UnicodeTextOne16) - 1> oriUnicodeSmallTextOne(UnicodeTextOne16);
+	TBufC16<ARRAY_SIZE(ErrUnicodeTextOne16) - 1> nonMatchUnicodeSmallTextOne(ErrUnicodeTextOne16);
+	
+	TBufC16<ARRAY_SIZE(UnicodeTextTwo16) - 1> oriUnicodeSmallTextTwo(UnicodeTextTwo16);
+	TBufC16<ARRAY_SIZE(ErrUnicodeTextTwo16) - 1> nonMatchUnicodeSmallTextTwo(ErrUnicodeTextTwo16);
+	
+	TBufC16<ARRAY_SIZE(UnicodeTextThree16) - 1> oriUnicodeSmallTextThree(UnicodeTextThree16);
+	TBufC16<ARRAY_SIZE(ErrUnicodeTextThree16) - 1> nonMatchUnicodeSmallTextThree(ErrUnicodeTextThree16);
+	
+	const TText16 AsciiText16[] = {'A', 'B', 'C', 'D', 'E', 0};
+	
+    TBufC16<5> oriAsciiSmallText(_L("ABCDE"));
+    
+	// Check that characters are non matching with return value as stated
+	
+	TestCompareFoldedNotEqual(oriUnicodeSmallTextOne, nonMatchUnicodeSmallTextOne, 6);
+	TestCompareFoldedNotEqual(oriUnicodeSmallTextTwo, nonMatchUnicodeSmallTextTwo, 33);
+	TestCompareFoldedNotEqual(oriUnicodeSmallTextThree, nonMatchUnicodeSmallTextThree, -33);
+	
+	// Try other way around...
+	
+	TestCompareFoldedNotEqual(nonMatchUnicodeSmallTextOne, oriUnicodeSmallTextOne, -6);
+	TestCompareFoldedNotEqual(nonMatchUnicodeSmallTextTwo, oriUnicodeSmallTextTwo, -33);
+	TestCompareFoldedNotEqual(nonMatchUnicodeSmallTextThree, oriUnicodeSmallTextThree, 33);
+	
+	// Declare a TPtrC16 which is base from AsciiText16...
+
+	TPtrC16 AsciiSmallText;
+
+	AsciiSmallText.Set(AsciiText16, 4);
+
+	// Check the boundary case
+
+	TestCompareFoldedNotEqual(oriAsciiSmallText, AsciiSmallText, 1);
+
+	// Try other way around...
+
+	TestCompareFoldedNotEqual(AsciiSmallText, oriAsciiSmallText, -1);
+
+	}
+
+void TestFoldingL()
+	{
+	TestFindMatchFoldedL();
+	TestCompareFolded();
+	TestCompareFoldedAdditional();
+	}
+
+// collation tests
+_LIT(KCandidateString1, "abcdefg");
+_LIT(KCandidateString2, "\x1f82\x1f02\x345\x1f00\x300\x345\x3b1\x313\x300\x345");
+_LIT(KCandidateString3, "abcabcdababc");
+_LIT(KCandidateString4, "xyzxyxyzxyxyyxyzxyy");
+
+_LIT(KMatch1, "abc");
+_LIT(KMatch2, "abc*");
+_LIT(KMatch3, "*abc*");
+_LIT(KMatch4, "abc*def");
+_LIT(KMatch5, "abc*def*g*");
+_LIT(KMatch6, "*def");
+_LIT(KMatch7, "**d?f?");
+_LIT(KMatch8, "*d?f??");
+_LIT(KMatch9, "***d?f??*");
+_LIT(KMatch10, "a*c*g");
+_LIT(KMatch11, "*c*g");
+
+_LIT(KMatch12, "*\x1f82");
+_LIT(KMatch13, "*\x1f82*");
+//_LIT(KMatch14, "*\x3b1*");
+_LIT(KMatch15, "*\x313*");
+_LIT(KMatch16, "*\x300*");
+//_LIT(KMatch17, "*\x345*");
+//_LIT(KMatch18, "*\x3b1\x313*");
+//_LIT(KMatch19, "*\x3b1\x313\x300*");
+_LIT(KMatch20, "*\x1f82*\x1f82*\x1f82\x1f82");
+_LIT(KMatch21, "*\x1f82*\x1f82*\x1f82\x1f82*\x1f82*");
+
+_LIT(KMatch22, "*aba*");
+_LIT(KMatch23, "*abc");
+_LIT(KMatch24, "a*abc");
+_LIT(KMatch25, "a*ab");
+_LIT(KMatch26, "*ca*abc");
+_LIT(KMatch27, "*ca*??c");
+_LIT(KMatch28, "*??c");
+_LIT(KMatch29, "a*babc");
+_LIT(KMatch30, "*xyy");
+
+_LIT(KFoo1, "foo");
+_LIT(KPeach, "pe\x302\x63he");
+_LIT(KFooMatch1, "fo*");
+_LIT(KFooMatch2, "*Fo*");
+_LIT(KFooMatch3, "*f*O*o");
+_LIT(KFooMatch4, "*f*o*o*");
+_LIT(KFooMatch5, "*o");
+_LIT(KFooMatch6, "???");
+_LIT(KFooMatch7, "*?o?*");
+_LIT(KFooMatch8, "*?");
+_LIT(KFooNonMatch1, "oo*");
+_LIT(KFooNonMatch2, "??");
+_LIT(KFooNonMatch3, "????");
+_LIT(KFooNonMatch4, "*?f*");
+_LIT(KFooNonMatch5, "*f*f*");
+_LIT(KFooNonMatch6, "*?*f*");
+_LIT(KPeachMatch1, "p?che");
+_LIT(KPeachNonMatch1, "peche");
+_LIT(KPeachNonMatch2, "pe?che");
+_LIT(KPeachNonMatch3, "pe?he");
+_LIT(KPeachNonMatch4, "pe*");
+
+void TestMatchIdentifiersTDesC(const TDesC& aCandidate, const TDesC& aSearchTerm, TInt aExpectedResult)
+	{
+	const TText16* candidateStart = aCandidate.Ptr();
+	const TText16* candidateEnd = candidateStart + aCandidate.Length();
+	const TText16* searchTermStart = aSearchTerm.Ptr();
+	const TText16* searchTermEnd = searchTermStart + aSearchTerm.Length();
+	TInt pos = ::LocateMatchStringFolded(candidateStart, candidateEnd, searchTermStart, searchTermEnd);
+	test(aExpectedResult == pos);
+	}
+
+void TestMatchIdentifiers()
+	{
+	TestMatchIdentifiersTDesC(KCandidateString1, KMatch1, KErrNotFound);
+	TestMatchIdentifiersTDesC(KCandidateString1, KMatch2, 0);
+	TestMatchIdentifiersTDesC(KCandidateString1, KMatch3, 0);
+	TestMatchIdentifiersTDesC(KCandidateString1, KMatch4, KErrNotFound);
+	TestMatchIdentifiersTDesC(KCandidateString1, KMatch5, 0);
+	TestMatchIdentifiersTDesC(KCandidateString1, KMatch6, KErrNotFound);
+	TestMatchIdentifiersTDesC(KCandidateString1, KMatch7, 3);
+	TestMatchIdentifiersTDesC(KCandidateString1, KMatch8, KErrNotFound);
+	TestMatchIdentifiersTDesC(KCandidateString1, KMatch9, KErrNotFound);
+	TestMatchIdentifiersTDesC(KCandidateString1, KMatch10, 0);
+	TestMatchIdentifiersTDesC(KCandidateString1, KMatch11, 2);
+	TestMatchIdentifiersTDesC(KCandidateString2, KMatch12, 6);
+	TestMatchIdentifiersTDesC(KCandidateString2, KMatch13, 0);
+	//The next test does not pass with the new optimised methods
+	//TestMatchIdentifiersTDesC(KCandidateString2, KMatch14, KErrNotFound);
+	TestMatchIdentifiersTDesC(KCandidateString2, KMatch15, KErrNotFound);
+	TestMatchIdentifiersTDesC(KCandidateString2, KMatch16, KErrNotFound);
+	// I have taken this test out: it tests that combining ypogegrammeni is not
+	// found on its own: but with case folding it can become a non-combining
+	// character (iota), so this test is not relevant.
+	// TestMatchIdentifiersTDesC(KCandidateString2, KMatch17, KErrNotFound);
+	//The next tests do not pass with the new optimised methods
+	//TestMatchIdentifiersTDesC(KCandidateString2, KMatch18, KErrNotFound);
+	//TestMatchIdentifiersTDesC(KCandidateString2, KMatch19, KErrNotFound);
+	TestMatchIdentifiersTDesC(KCandidateString2, KMatch20, 0);
+	TestMatchIdentifiersTDesC(KCandidateString2, KMatch21, KErrNotFound);
+	TestMatchIdentifiersTDesC(KCandidateString3, KMatch22, 7);
+	TestMatchIdentifiersTDesC(KCandidateString3, KMatch23, 9);
+	TestMatchIdentifiersTDesC(KCandidateString3, KMatch24, 0);
+	TestMatchIdentifiersTDesC(KCandidateString3, KMatch25, KErrNotFound);
+	TestMatchIdentifiersTDesC(KCandidateString3, KMatch26, 2);
+	TestMatchIdentifiersTDesC(KCandidateString3, KMatch27, 2);
+	TestMatchIdentifiersTDesC(KCandidateString3, KMatch28, 9);
+	TestMatchIdentifiersTDesC(KCandidateString3, KMatch29, 0);
+	TestMatchIdentifiersTDesC(KCandidateString4, KMatch30, 16);
+
+	TestMatchIdentifiersTDesC(KFoo1, KFoo1, 0);
+	TestMatchIdentifiersTDesC(KFoo1, KFooMatch1, 0);
+	TestMatchIdentifiersTDesC(KFoo1, KFooMatch2, 0);
+	TestMatchIdentifiersTDesC(KFoo1, KFooMatch3, 0);
+	TestMatchIdentifiersTDesC(KFoo1, KFooMatch4, 0);
+	TestMatchIdentifiersTDesC(KFoo1, KFooMatch5, 2);
+	TestMatchIdentifiersTDesC(KFoo1, KFooMatch6, 0);
+	TestMatchIdentifiersTDesC(KFoo1, KFooMatch7, 0);
+	TestMatchIdentifiersTDesC(KFoo1, KFooMatch8, 2);
+	TestMatchIdentifiersTDesC(KFoo1, KFooNonMatch1, KErrNotFound);
+	TestMatchIdentifiersTDesC(KFoo1, KFooNonMatch2, KErrNotFound);
+	TestMatchIdentifiersTDesC(KFoo1, KFooNonMatch3, KErrNotFound);
+	TestMatchIdentifiersTDesC(KFoo1, KFooNonMatch4, KErrNotFound);
+	TestMatchIdentifiersTDesC(KFoo1, KFooNonMatch5, KErrNotFound);
+	TestMatchIdentifiersTDesC(KFoo1, KFooNonMatch6, KErrNotFound);
+	TestMatchIdentifiersTDesC(KPeach, KPeachMatch1, 0);
+	TestMatchIdentifiersTDesC(KPeach, KPeachNonMatch1, KErrNotFound);
+	TestMatchIdentifiersTDesC(KPeach, KPeachNonMatch2, KErrNotFound);
+	TestMatchIdentifiersTDesC(KPeach, KPeachNonMatch3, KErrNotFound);
+	TestMatchIdentifiersTDesC(KPeach, KPeachNonMatch4, KErrNotFound);
+
+	TestMatchIdentifiersTDesC(_L(""), _L(""), 0);
+	TestMatchIdentifiersTDesC(_L("a"), _L(""), KErrNotFound);
+	TestMatchIdentifiersTDesC(_L(""), _L("*"), 0);
+	}
+
+void TestFindIdentifierTDesC(const TDesC& aCandidateString, const TDesC& aSearchTerm, TInt /*aExpectedResult*/)
+	{
+	TUTF32Iterator candidateIt(aCandidateString.Ptr(), aCandidateString.Ptr() + aCandidateString.Length());
+	TUTF32Iterator searchIt(aSearchTerm.Ptr(), aSearchTerm.Ptr() + aSearchTerm.Length());
+	/*aExpectedResult = */::FindFolded(candidateIt, searchIt);
+	}
+
+//INC057641 - NTT Functional BC break in 8.1a: string comparison changed
+static void INC057641L()
+	{
+	_LIT16(KEmptyText, "");        
+	HBufC16* str = HBufC16::NewLC(4);
+	str->Des().Copy(_L("****"));
+	TInt res = str->CompareC(KEmptyText);
+	CleanupStack::PopAndDestroy(str);
+	test(res == 1);
+	}
+
+_LIT(KFind1, "abc");
+_LIT(KFind2, "def");
+_LIT(KFind3, "efg");
+_LIT(KFind4, "fga");
+_LIT(KFind5, "acd");
+_LIT(KFind6, "\x1f82");
+_LIT(KFind7, "\x3b1\x313\x300\x345");
+_LIT(KFind8, "\x3b1");
+_LIT(KFind9, "aba");
+_LIT(KFind10, "abc");
+
+void TestFindIdentifier()
+	{
+	TestFindIdentifierTDesC(KCandidateString1, TPtrC(), 0);
+	TestFindIdentifierTDesC(KCandidateString1, KFind1, 0);
+	TestFindIdentifierTDesC(KCandidateString1, KFind2, 3);
+	TestFindIdentifierTDesC(KCandidateString1, KFind3, 4);
+	TestFindIdentifierTDesC(KCandidateString1, KFind4, KErrNotFound);
+	TestFindIdentifierTDesC(KCandidateString1, KFind5, KErrNotFound);
+	TestFindIdentifierTDesC(KCandidateString2, KFind6, 0);
+	TestFindIdentifierTDesC(KCandidateString2, KFind7, 0);
+	TestFindIdentifierTDesC(KCandidateString2, KFind8, KErrNotFound);
+	TestFindIdentifierTDesC(KCandidateString3, KFind9, 7);
+	TestFindIdentifierTDesC(KCandidateString3, KFind10, 0);
+	}
+
+struct TestMatch8
+	{
+	TText8 const* iLeft;
+	TText8 const* iRight;
+	TInt iResult;
+	};
+
+TestMatch8 const Tests8[]=
+	{
+	{_S8(""),_S8(""),0},
+	{_S8(""),_S8("?"),KErrNotFound},
+	{_S8(""),_S8("*"),0},
+	{_S8(""),_S8("**"),0},
+	{_S8(""),_S8("*x*"),KErrNotFound},
+	{_S8("x"),_S8(""),KErrNotFound},
+	{_S8("x"),_S8("?"),0},
+	{_S8("x"),_S8("*"),0},
+	{_S8("x"),_S8("**"),0},
+	{_S8("x"),_S8("**?"),0},
+	{_S8("x"),_S8("?**"),0},
+	{_S8("x"),_S8("**?*"),0},
+	{_S8("x"),_S8("x"),0},
+	{_S8("x"),_S8("a"),KErrNotFound},
+	{_S8("x"),_S8("xx"),KErrNotFound},
+	{_S8("x"),_S8("?x"),KErrNotFound},
+	{_S8("x"),_S8("x*"),0},
+	{_S8("x"),_S8("*x"),0},
+	{_S8("x"),_S8("*x*"),0},
+	{_S8("x"),_S8("**x*"),0},
+	{_S8("abc"),_S8(""),KErrNotFound},
+	{_S8("abc"),_S8("?*"),0},
+	{_S8("abc"),_S8("*?"),2},
+	{_S8("abc"),_S8("*?*?"),0},
+	{_S8("abc"),_S8("*a*"),0},
+	{_S8("abc"),_S8("*b*"),1},
+	{_S8("abc"),_S8("*c*"),2},
+	{_S8("abc"),_S8("*a"),KErrNotFound},
+	{_S8("abc"),_S8("*c"),2},
+	{_S8("abc"),_S8("*?c"),1},
+	{_S8("abc"),_S8("??c"),0},
+	{_S8("abc"),_S8("*b?"),1},
+	};
+
+struct TestMatch16
+	{
+	TText16 const* iLeft;
+	TText16 const* iRight;
+	TInt iResult;
+	};
+
+TestMatch16 const Tests16[]=
+	{
+	{_S16(""),_S16(""),0},
+	{_S16(""),_S16("?"),KErrNotFound},
+	{_S16(""),_S16("*"),0},
+	{_S16(""),_S16("**"),0},
+	{_S16(""),_S16("*x*"),KErrNotFound},
+	{_S16("x"),_S16(""),KErrNotFound},
+	{_S16("x"),_S16("?"),0},
+	{_S16("x"),_S16("*"),0},
+	{_S16("x"),_S16("**"),0},
+	{_S16("x"),_S16("**?"),0},
+	{_S16("x"),_S16("?**"),0},
+	{_S16("x"),_S16("**?*"),0},
+	{_S16("x"),_S16("x"),0},
+	{_S16("x"),_S16("a"),KErrNotFound},
+	{_S16("x"),_S16("xx"),KErrNotFound},
+	{_S16("x"),_S16("?x"),KErrNotFound},
+	{_S16("x"),_S16("x*"),0},
+	{_S16("x"),_S16("*x"),0},
+	{_S16("x"),_S16("*x*"),0},
+	{_S16("x"),_S16("**x*"),0},
+	{_S16("abc"),_S16(""),KErrNotFound},
+	{_S16("abc"),_S16("?*"),0},
+	{_S16("abc"),_S16("*?"),2},
+	{_S16("abc"),_S16("*?*?"),0},
+	{_S16("abc"),_S16("*a*"),0},
+	{_S16("abc"),_S16("*b*"),1},
+	{_S16("abc"),_S16("*c*"),2},
+	{_S16("abc"),_S16("*a"),KErrNotFound},
+	{_S16("abc"),_S16("*c"),2},
+	{_S16("abc"),_S16("*?c"),1},
+	{_S16("abc"),_S16("??c"),0},
+	{_S16("abc"),_S16("*b?"),1},
+	};
+
+TInt KTests=sizeof(Tests8)/sizeof(Tests8[0]);
+
+/**
+@SYMTestCaseID SYSLIB-UNICODE-CT-1770
+@SYMTestCaseDesc TDes16 Collation conversion function test
+@SYMTestPriority High
+@SYMTestActions  Testing the three collation conversion function
+                 in TDesC16::GetNormalizedDecomposedFormL,
+                    TDesC16::GetFoldedDecomposedFormL,
+                    TDesC16::GetCollationKeysL  
+@SYMTestExpectedResults The test must not fail.
+@SYMREQ 6178 Add several new Unicode utility functions
+*/
+static void TestDes16CollationFunctionL()
+	{
+	/**----------------Test TDesC16::GetNormalizedDecomposedFormL------------------*/
+	
+	HBufC16* outputBuffer=NULL;
+	_LIT16(KTestString1,"abc")	;
+	//LATIN CAPITAL LETTER W WITH DIAERESIS(\x0057\x0308)
+	//LATIN SMALL LETTER A(\x0061)
+	//LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE(\x006F\x0302\x0303)
+	//GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI(\x03B1\x0313\x0342\x0345)
+	_LIT16(KTestString2,"\x1E84\x0061\x1ED7\x1F86");
+	_LIT16(KTestStringNDF2,"\x0057\x0308\x0061\x006F\x0302\x0303\x03B1\x0313\x0342\x0345");
+
+	outputBuffer=KTestString1().GetNormalizedDecomposedFormL();
+	test(outputBuffer->Compare(KTestString1())==0);
+	delete outputBuffer;
+	
+	outputBuffer=KTestString2().GetNormalizedDecomposedFormL();
+	test(outputBuffer->Compare(KTestStringNDF2())==0);
+	delete outputBuffer;
+
+	/**----------------Test TDesC16::GetFoldedDecomposedFormL------------------*/
+	_LIT16(KTestString6,"AbC");
+	_LIT16(KTestStringFolded6,"abc");
+	//GREEK CAPITAL LETTER OMICRON WITH PSILI =>\x03BF\x0313
+	//LATIN SMALL LETTER M WITH ACUTE =>\x006D\x0301
+	//LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE => \x006F\x0302\x0309
+	_LIT16(KTestString7,"\x1F48\x1E3F\x1ED4");
+	_LIT16(KTestStringFolded7,"\x03BF\x0313\x006D\x0301\x006F\x0302\x0309");
+	
+	outputBuffer=KTestString6().GetFoldedDecomposedFormL();
+	test(outputBuffer->Compare(KTestStringFolded6())==0);
+	delete outputBuffer;
+	
+	outputBuffer=KTestString7().GetFoldedDecomposedFormL();
+	test(outputBuffer->Compare(KTestStringFolded7())==0);
+	delete outputBuffer;
+	
+	/**----------------Test TDesC16::GetCollationKeysL------------------*/
+	TCollationMethod method;
+   	method.iId = 0;
+   	//purposely set the maintable to NULL, this will result in the DefaultTable being used
+   	method.iMainTable = 0;
+   	method.iOverrideTable = 0;
+   	method.iFlags = TCollationMethod::EIgnoreNone;
+	
+	//---------------Test key generation functionality----------------
+	/** 
+	Collation keys for
+	x=08b90108-00000078
+    y=08bd0108-00000079
+    z=08c90108-0000007a
+    */
+	_LIT(KInputString1,"xyz");
+	HBufC8* outbuf=NULL;	
+	//Max Level 0 keys
+	_LIT8(KMaxLevel0Key,"\x08\xb9\x08\xbd\x08\xc9");
+	outbuf=KInputString1().GetCollationKeysL(0,&method);
+	test(outbuf->Compare(KMaxLevel0Key())==0);
+	delete outbuf;	
+	//Max Level 1 keys
+	_LIT8(KMaxLevel1Key,"\x08\xb9\x08\xbd\x08\xc9\x00\x00\x01\x01\x01");	
+	outbuf=KInputString1().GetCollationKeysL(1,&method);
+	test(outbuf->Compare(KMaxLevel1Key())==0);
+	delete outbuf;	
+	//Max Level 2 keys
+	_LIT8(KMaxLevel2Key,"\x08\xb9\x08\xbd\x08\xc9\x00\x00\x01\x01\x01\x00\x08\x08\x08");	
+	outbuf=KInputString1().GetCollationKeysL(2,&method);
+	test(outbuf->Compare(KMaxLevel2Key())==0);
+	delete outbuf;
+	//Max Level 3 keys
+	_LIT8(KMaxLevel3Key,"\x08\xb9\x08\xbd\x08\xc9\x00\x00\x01\x01\x01\x00\x08\x08\x08\x00\x00\x00\x78\x00\x00\x79\x00\x00\x7A");	
+	outbuf=KInputString1().GetCollationKeysL(3,&method);
+	test(outbuf->Compare(KMaxLevel3Key())==0);
+	delete outbuf;	
+	
+	/**
+	Decomposition for 1F70
+	1F70=03B1 0300
+	Collation keys for
+	\x03B1	=09360108-000003B1	
+	\x0300	=00001609-00000300
+	y		=08bd0108-00000079
+	*/
+	_LIT(KInputString2,"\x1F70y");
+	//Max Level 2 keys
+	_LIT8(KCollationString22,"\x09\x36\x08\xBD\x00\x00\x01\x16\x01\x00\x08\x08\x08");
+	outbuf=KInputString2().GetCollationKeysL(2,&method);
+	test(outbuf->Compare(KCollationString22())==0);
+	delete outbuf;
+		
+	//Max Level 3 keys
+	_LIT8(KCollationString23,"\x09\x36\x08\xBD\x00\x00\x01\x16\x01\x00\x08\x08\x08\x00\x00\x03\xB1\x00\x03\x00\x00\x00\x79");
+	outbuf=KInputString2().GetCollationKeysL(3,&method);
+	test(outbuf->Compare(KCollationString23())==0);
+	delete outbuf;
+
+	/**
+	Decomposition for 1EAC
+	1EAC= 1EA0 0302 = 0041 0323 0302
+	Collation keys for
+	\x0041	=06CF0121-00000041		
+	\x0323	=FF800104-00000001,83230105-00000000(2 keys for one character)
+	\x0302	=00001D09-00000302
+	*/
+	_LIT(KInputString3,"\x1EAC");
+	//Max Level 0 keys
+	_LIT8(KCollationString30,"\x06\xCF\xFF\x80\x83\x23");
+	//Max Level 1 keys
+	_LIT8(KCollationString31,"\x06\xCF\xFF\x80\x83\x23\x00\x00\x01\x01\x01\x1d");	
+	outbuf=KInputString3().GetCollationKeysL(1,&method);
+	test(outbuf->Compare(KCollationString31())==0);
+	delete outbuf;
+	
+	//Max Level 3 keys
+	_LIT8(KCollationString33,"\x06\xCF\xFF\x80\x83\x23\x00\x00\x01\x01\x01\x1d\x00\x20\x04\x04\x08\x00\x00\x00\x41\x00\x00\x01\x00\x03\x02");
+	outbuf=KInputString3().GetCollationKeysL(3,&method);
+	test(outbuf->Compare(KCollationString33())==0);
+	delete outbuf;
+	
+	//--------------Test using NULL collationMethod-----------------------
+	outbuf=KInputString3().GetCollationKeysL(3,NULL);
+	test(outbuf->Compare(KCollationString33())==0);
+	delete outbuf;
+	
+	//--------------Test using out of limit level-------------------------
+	outbuf=KInputString3().GetCollationKeysL(6,NULL);
+	test(outbuf->Compare(KCollationString33())==0);
+	delete outbuf;
+
+	outbuf=KInputString3().GetCollationKeysL(-1,NULL);
+	test(outbuf->Compare(KCollationString30())==0);
+	delete outbuf;	
+				
+	}
+
+/**
+@SYMTestCaseID SYSLIB-UNICODE-CT-1771
+@SYMTestCaseDesc TDes16 Collation conversion function OOM test
+@SYMTestPriority High
+@SYMTestActions  OOM Testing the three collation conversion function
+                 in TDesC16::GetNormalizedDecomposedFormL,
+                    TDesC16::GetFoldedDecomposedFormL,
+                    TDesC16::GetCollationKeysL  
+@SYMTestExpectedResults The test must not fail.
+@SYMREQ 6178 Add several new Unicode utility functions
+*/	
+static void TestDes16CollationFunctionOOM()
+	{
+	test.Next(_L("TestDes16CollationFunctionOOM"));
+
+	TInt err, tryCount = 0;
+	do
+		{
+		__UHEAP_MARK;
+  		// find out the number of open handles
+		TInt startProcessHandleCount;
+		TInt startThreadHandleCount;
+		RThread().HandleCount(startProcessHandleCount, startThreadHandleCount);
+
+		// Setting Heap failure for OOM test
+		__UHEAP_SETFAIL(RHeap::EDeterministic, ++tryCount);
+		TRAP(err,TestDes16CollationFunctionL() );
+		__UHEAP_SETFAIL(RHeap::ENone, 0);
+
+		// check that no handles have leaked
+		TInt endProcessHandleCount;
+		TInt endThreadHandleCount;
+		RThread().HandleCount(endProcessHandleCount, endThreadHandleCount);
+
+		test(startProcessHandleCount == endProcessHandleCount);
+		test(startThreadHandleCount  == endThreadHandleCount);
+
+		__UHEAP_MARKEND;
+		} while(err == KErrNoMemory);
+
+	test(err == KErrNone);
+	test.Printf(_L("- TestDes16CollationFunctionOOM succeeded at heap failure rate of %i\n"), tryCount);	
+	}
+
+GLDEF_C TInt E32Main()
+//
+// entry point
+//
+    {
+	CTrapCleanup* trapCleanup = CTrapCleanup::New();
+	test(trapCleanup != NULL);
+
+	test.Title();
+//
+
+	test.Start(_L("Match8"));
+	TInt ii;
+	for (ii=0;ii<KTests;++ii)
+		{
+		TInt r=TPtrC8(Tests8[ii].iLeft).Match(TPtrC8(Tests8[ii].iRight));
+		test (r==Tests8[ii].iResult);
+		r=TPtrC8(Tests8[ii].iLeft).MatchF(TPtrC8(Tests8[ii].iRight));
+		test (r==Tests8[ii].iResult);
+		}
+	test.Next(_L("Match16"));
+	for (ii=0;ii<KTests;++ii)
+		{
+		TInt r=TPtrC16(Tests16[ii].iLeft).Match(TPtrC16(Tests16[ii].iRight));
+		test (r==Tests16[ii].iResult);
+		r=TPtrC16(Tests16[ii].iLeft).MatchF(TPtrC16(Tests16[ii].iRight));
+		test (r==Tests16[ii].iResult);
+		}
+
+	test.Next(_L("Iterator tests"));
+	
+	::TestUTF32Iterator();
+	::TestFoldedDecompIterator();
+	::TestFoldedSortedDecompIterator();
+	::TestFoldedCanonicalIterator();
+	::TestDecompositionIterator2();
+	::TestCanonicalDecompositionIterator2();
+	::TestCanonicalDecompositionIteratorCached();
+	
+	test.Next(_L("Unit tests"));
+	
+	TestDecompositionIterator();
+	TestCanonicalDecompositionIterator();
+	TestCollationValueIterator();
+	TestMatchIdentifiers();
+	TestFindIdentifier();
+	
+	TRAPD(err, TestFoldingL());
+	test(err == KErrNone);
+	
+	test.Next(_L("INC057641"));
+	TRAP(err, INC057641L());
+	test(err == KErrNone);
+
+	TestMatchC();
+	TestMatchC2();
+
+	test.Next(_L("TestDes16CollationFunctionL"));
+	TRAP(err,TestDes16CollationFunctionL());
+	test(err==KErrNone);
+#ifndef __TOOLS2__
+	::TestDes16CollationFunctionOOM();
+#endif
+
+	TestDisableCombiningCharacterCheck();
+
+	test.End();
+	test.Close();
+	
+	delete trapCleanup;
+	
+	return 0;
+    }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32test/buffer/t_parray.cpp	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,320 @@
+// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32test\buffer\t_parray.cpp
+// Overview:
+// Test the variable record length array classes.
+// Test only covers the Flat type implementation.
+// API Information:
+// CArrayPakFlat.
+// Details:
+// - Create an array of variable length text character objects packed into a flat buffer.
+// - check the number of elements held in the array is 0.
+// - test that Compress and Reset methods are as expected.
+// - sort the array and check that no error is returned.
+// - insert an element and check the length is as expected.
+// - search for the inserted element and check it is found successfully.
+// - remove all the elements, append an element and verify that number of elements
+// held in the array is 1.
+// - insert an element into the array, search for that element using sequential,
+// binary search technique and verify that it is found at the expected position.
+// - insert another element with the same key and check that KErrAlreadyExists is 
+// returned.
+// - Create an array of variable length text character objects packed into a flat buffer.
+// - append some strings at the end, insert some strings at the specified location and
+// verify that the length of each string and number of strings held in the array are 
+// as expected.
+// - delete some strings and check the remaining strings in the array are as expected.
+// - Create an array of variable length text character objects packed into a flat buffer.
+// - append some strings at the end and insert some stings at specified location.
+// - compress the array and verify strings and the number of strings held in the 
+// array are as expected.
+// - reset the array and verify the number of elements held in the array is 0.
+// - sort the array and check that array is sorted as expected.
+// - test that KErrAlreadyExists is returned if another element with the same key 
+// type is inserted.
+// - search for strings using sequential, binary search and verify that 0 is returned 
+// if found else nonzero.
+// - delete some text from the array and check the results are as expected.
+// - Create an array of variable length integer objects packed into a flat buffer.
+// - Insert some elements with same key which already exists within the array and 
+// check that KErrAlreadyExists is returned.
+// - Test whether the heap has been corrupted by all the tests.
+// Platforms/Drives/Compatibility:
+// All 
+// Assumptions/Requirement/Pre-requisites:
+// Failures and causes:
+// Base Port information:
+// 
+//
+
+#include <e32std.h>
+#include <e32base.h>
+#include <e32test.h>
+#include <e32svr.h>
+#include <e32ver.h>
+
+const TInt KTestGranularity=0x10;
+
+LOCAL_D RTest test(_L("T_PARRAY"));
+
+LOCAL_C void testAllMethods(CArrayPak<TText>& aPakVar)
+    {
+	test.Next(_L("Test all methods"));
+	test(aPakVar.Count()==0);
+	aPakVar.Compress();
+	test(TRUE);
+	aPakVar.Reset();
+	test(TRUE);
+	TKeyArrayPak kk(sizeof(TText),ECmpNormal,0);
+	TKeyArrayVar vv(sizeof(TText),ECmpNormal,0);
+	test(TRUE);
+	TRAPD(res,aPakVar.SortL(vv));
+	test(res==KErrNone);
+	const TText* aa=_S("a");
+	aPakVar.InsertL(0,*aa,sizeof(TText));
+	TBuf<0x10> des1(1);
+	des1[0]=aPakVar[0];
+	test(des1==_L("a"));
+	test(aPakVar.Length(0)==sizeof(TText));
+	test(TRUE);
+	TInt pp;
+	test(aPakVar.Find(*aa,kk,pp)==0);
+	test(pp==0);
+	aPakVar.Delete(0);
+	aPakVar.AppendL(*aa,1);
+	test(aPakVar.Count()==1);
+	aPakVar.InsertIsqAllowDuplicatesL(*aa,0,kk);
+	test(TRUE);
+	test(aPakVar.FindIsq(*aa,kk,pp)==0);
+	test(pp==0);
+	TRAPD(r,aPakVar.InsertIsqL(*aa,0,kk));
+	test(r==KErrAlreadyExists);
+	}
+
+LOCAL_C void test1(CArrayPak<TText>& aPakVar)
+//
+	{
+	test.Next(_L("AppendL and InsertL chars"));
+	aPakVar.AppendL(*_S("abcd"),5*sizeof(TText)); // abcd
+	TBuf<0x10> des1(&aPakVar[0]);
+	test(des1==_L("abcd"));
+	test(aPakVar.Count()==1);
+	aPakVar.AppendL(*_S("wxyz"),5*sizeof(TText)); // abcd wxyz
+	des1=&aPakVar[1];
+	test(des1==_L("wxyz"));
+	test(aPakVar.Count()==2);
+	aPakVar.InsertL(1,*_S("ef"),3*sizeof(TText)); // abcd ef wxyz
+	des1=&aPakVar[1];
+	test(des1==_L("ef"));
+	test(aPakVar.Count()==3);	
+	aPakVar.AppendL(*_S("z"),2*sizeof(TText)); // abcd ef wxyz z
+	des1=&aPakVar[3];
+	test(des1==_L("z"));
+	aPakVar.InsertL(0,*_S("y"),2*sizeof(TText)); // y abcd ef wxyz z
+	des1=&aPakVar[0];
+	test(des1==_L("y"));
+	test(aPakVar.Length(0)==2*sizeof(TText));
+	test(aPakVar.Length(1)==5*sizeof(TText));
+	test(aPakVar.Length(2)==3*sizeof(TText));
+	test(aPakVar.Length(3)==5*sizeof(TText));
+	test(aPakVar.Length(4)==2*sizeof(TText));
+	des1=&aPakVar[1];
+	test(des1==_L("abcd"));
+	test(aPakVar.Count()==5);
+//
+	test.Next(_L("Delete chars"));
+	aPakVar.Delete(3,1); // y abcd ef z
+	des1=&aPakVar[2];
+	test(des1==_L("ef"));
+	des1=&aPakVar[1];
+	test(des1==_L("abcd"));
+	des1=&aPakVar[3];
+	test(des1==_L("z"));
+	aPakVar.Delete(1,2); // y z
+	des1=&aPakVar[0];
+	test(des1==_L("y"));
+	des1=&aPakVar[1];
+	test(des1==_L("z"));
+	test(aPakVar.Count()==2);
+	}
+
+LOCAL_C void test2(CArrayPak<TText>& aPakVar)
+//
+	{
+	test.Next(_L("Reset and Compress"));
+	TBuf<0x10> des1(_L("abcde"));
+	TBuf<0x10> des2(_L("fgh"));
+	TBuf<0x10> des3(_L("wxyz"));
+	aPakVar.AppendL(*(TText*)des1.Ptr(),des1.Size());
+	aPakVar.AppendL(*(TText*)des2.Ptr(),des2.Size());
+	aPakVar.Compress();
+	test(aPakVar.Count()==2);
+	TPtrC des4((TText*)&aPakVar[0],des1.Length());
+	test(des1==des4);
+	TPtrC des5((TText*)&aPakVar[1],des2.Length());
+	test(des2==des5);
+	aPakVar.InsertL(1,*(TText*)des3.Ptr(),des3.Size());
+	test(aPakVar.Count()==3);	
+	TPtrC des6((TText*)&aPakVar[0],des1.Length());
+	test(des1==des6);
+	TPtrC des7((TText*)&aPakVar[2],des2.Length());
+	test(des2==des7);
+	TPtrC des8((TText*)&aPakVar[1],des3.Length());
+	test(des3==des8);
+	aPakVar.Reset();
+	// So nothing in this array
+	test(aPakVar.Count()==0);
+	TKeyArrayPak kk(0,ECmpNormal,3);		// Compare 3 characters
+	TKeyArrayPak kk1(0,ECmpNormal,2);	// Compare 2 characters
+	TKeyArrayVar vv(0,ECmpNormal,3);		// Compare 3 characters
+	TBuf<0x10> buf1=_L("abcdef");
+	TBuf<0x10> buf2=_L("wxyz");
+	TBuf<0x10> buf3=_L("lmnop");
+	TBuf<0x10> buf4=_L("aa");
+	aPakVar.AppendL(*buf1.Ptr(),buf1.Size());
+	aPakVar.InsertL(0,*buf2.Ptr(),buf2.Size());
+	aPakVar.AppendL(*buf3.Ptr(),buf3.Size());
+	aPakVar.InsertL(1,*buf4.Ptr(),buf4.Size());
+	aPakVar.Compress();
+	TPtrC rd1((TText*)&aPakVar[2],buf1.Length());
+	test(buf1==rd1);
+	TPtrC rd2((TText*)&aPakVar[0],buf2.Length());
+	test(buf2==rd2);
+	TPtrC rd3((TText*)&aPakVar[3],buf3.Length());
+	test(buf3==rd3);
+	TPtrC rd4((TText*)&aPakVar[1],buf4.Length());
+	test(buf4==rd4);
+	test(aPakVar.Count()==4);
+
+	test.Next(_L("Sort"));
+	TRAPD(res,aPakVar.SortL(vv));
+	test(res==KErrNone);
+	/**/
+	TPtrC rd5((TText*)&aPakVar[1],buf1.Length());
+	test(buf1==rd5);
+	TPtrC rd6((TText*)&aPakVar[3],buf2.Length());
+	test(buf2==rd6);
+	TPtrC rd7((TText*)&aPakVar[2],buf3.Length());
+	test(buf3==rd7);
+	TPtrC rd8((TText*)&aPakVar[0],buf4.Length());
+	test(buf4==rd8);
+	test(aPakVar.Count()==4);	
+	/**/
+	test.Next(_L("Find and FindIsq"));
+	TBuf<0x10> buf5=_L("ffff");
+	test(aPakVar.InsertIsqL(*(TText*)buf5.Ptr(),buf5.Size(),kk)==2);
+	TRAPD(r,aPakVar.InsertIsqL(*(TText*)buf5.Ptr(),buf5.Size(),kk))
+	test(r==KErrAlreadyExists);
+	test(aPakVar.InsertIsqAllowDuplicatesL(*(TText*)buf5.Ptr(),buf5.Size(),kk)==3);
+	TInt aPos;
+	test(aPakVar.Find(*_S("abc"),kk,aPos)==0);	// Second parameter 'aLength' is unused. 
+	test(aPos==1);
+	test(aPakVar.Find(*_S("aa"),kk1,aPos)==0);
+	test(aPos==0);
+	test(aPakVar.Find(*_S("wxyz"),kk,aPos)==0);
+	test(aPos==5);
+	test(aPakVar.Find(*_S("fgh"),kk,aPos)!=0);		// Returns non zero if string not found.
+	test(aPos==6);								// Not present in list, aPos set to last position
+	test(aPakVar.Find(*_S("ffff"),kk,aPos)==0);	
+	test(aPos==2);
+	test(aPakVar.Find(*_S("lmn"),kk,aPos)==0);
+	test(aPos==4);			  //15
+	test(aPakVar.FindIsq(*_S("abc"),kk,aPos)==0);
+	test(aPos==1);
+	test(aPakVar.FindIsq(*_S("aa"),kk1,aPos)==0);
+	test(aPos==0);
+	test(aPakVar.FindIsq(*_S("wxyz"),kk,aPos)==0);
+	test(aPakVar.FindIsq(*_S("fgh"),kk,aPos)!=0);	// 22 Returns result of last test
+	test(aPos==4);		// Not present in list, aPos set to last position tested
+	//This test shows problem with BinarySearch
+	TBuf<0x10> buf7=_L("fghij");
+	test(aPakVar.InsertIsqL(*(TText*)buf7.Ptr(),buf7.Size(),kk)==4);
+	test(aPakVar.FindIsq(*_S("fgh"),kk,aPos)==0);	// Returns result of last test
+	test(aPos==4);
+	test(aPakVar.FindIsq(*_S("ffff"),kk,aPos)==0);
+	test(aPos==3);
+	test(aPakVar.FindIsq(*_S("lmn"),kk,aPos)==0);
+	test(aPos==5); 
+	aPakVar.Delete(4,1);
+	test(aPakVar.Find(*_S("wxyz"),kk,aPos)==0);
+	test(aPos==5);
+	}
+
+LOCAL_C void test3(CArrayPak<TInt>& aPak)
+
+	{
+	test.Next(_L("InsertIsqL"));
+	TKeyArrayPak kk(0,ECmpTInt);
+
+	TInt pos=0;
+	TInt mod=47;
+	TInt inc=23;
+
+	TInt i=0;	
+	FOREVER
+		{
+		TInt ret;
+		if (i&1)
+			TRAP(ret,aPak.InsertIsqL(i,sizeof(TInt),kk))
+		else
+			{
+			TRAP(ret,pos=aPak.InsertIsqL(i,sizeof(TInt),kk))
+			if (ret==KErrNone)
+				test(aPak[pos]==i);
+			}
+		if (ret==KErrAlreadyExists)
+			break;
+		i=(i+inc)%mod;
+		}
+	for(i=0;i<mod;i++)
+		{
+		pos=(-1);
+		test(aPak.FindIsq(i,kk,pos)==0);
+		test(pos==i);
+		TRAPD(r,aPak.InsertIsqL(i,sizeof(TInt),kk))
+		test(r==KErrAlreadyExists);
+		}
+	}
+
+GLDEF_C TInt E32Main()
+//
+// Test the variable record length array classes.
+// Initially test only covers the Flat type implementation.
+//
+    {
+	test.Title();
+	__UHEAP_MARK;
+	test.Start(_L("class CArrayPakFlat"));
+//
+    CArrayPakFlat<TText>* pPakFlat=new CArrayPakFlat<TText>(KTestGranularity);
+	testAllMethods(*pPakFlat);
+    delete pPakFlat;
+//
+	CArrayPakFlat<TText>* pPakFlatChar=new CArrayPakFlat<TText>(KTestGranularity);
+	test1(*pPakFlatChar);
+	delete pPakFlatChar; 
+//
+ 	CArrayPakFlat<TText>* pPakFlatArr=new CArrayPakFlat<TText>(KTestGranularity);
+	test2(*pPakFlatArr);
+	delete pPakFlatArr;
+//
+	CArrayPakFlat<TInt>* pPakFlatInt=new CArrayPakFlat<TInt>(KTestGranularity);
+	test3(*pPakFlatInt);
+	delete pPakFlatInt;
+//
+	test.End();
+	__UHEAP_MARKEND;
+	return(0);
+    }
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32test/buffer/t_que.cpp	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,1985 @@
+// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32test\buffer\t_que.cpp
+// Overview:
+// Test double linked list functionality.
+// API Information:
+// TDblQueLinkBase, TDeltaQueLink, TDblQueLink, TPriQueLink,
+// TDblQueIterBase, TDblQueIter
+// Details:
+// - Create many TDblQueLinkBase links, insert links at specified locations
+// and check previous and next links are as expected.
+// - Create many TDeltaQueLink links, insert these links at specified locations
+// and check previous and next links are as expected.
+// - Create many TDblQueLink links, insert, remove these links at specified
+// locations and check previous and next links are as expected.
+// - Create many TPriQueLink links, insert, remove these links at specified
+// locations and check previous and next links are as expected.
+// - Create TDblQueBase based object without offset, with specified offset 
+// and check it is constructed as expected.
+// - Create TDblQueBase based object, insert and remove TPriQueLink list 
+// element, set priorities of TPriQueLink list elements, call IsEmpty 
+// and Reset methods.
+// - Create TDblQueBase based object without, with offset and check 
+// it is constructed as expected
+// - Create TDblQueBase based object, insert TDblQueLink links at 
+// specified locations and check that they are added as expected.
+// - Initialise TPriQueLink link with different priorities, insert 
+// the elements in priority order and check that they are added 
+// as expected.
+// - Create TDblQueBase based object, check the double linked list for empty
+// before inserting, after inserting, before/after Deque, before/after Enque,
+// after Reset. Verify that results are as expected.
+// - Create TDeltaQueBase object without offset, with specified offset
+// and check it is constructed as expected. Insert TDeltaQueLink list 
+// elements at specified distance from the zero point, remove the elements 
+// at specified distance, decrement the delta value.
+// - Create TDeltaQueBase based object, insert TDblQueLink link at specified 
+// locations and check the previous, next link are as expected.
+// - Check the linked list for empty before inserting, after inserting, 
+// before/after Deque, before/after Enque, after Reset. Verify that results 
+// are as expected.
+// - Create TDeltaQueBase based object, insert links using DoAddDelta method,
+// check that links are as expected. Delete links using DoRemove and 
+// DoRemoveFirst methods and check that links are as expected.
+// - Create TDeltaQueBase based object, insert links using DoAddDelta method,
+// check the return value of CountDown is as expected. Delete links using 
+// DoRemoveFirst method and check the return value of CountDown is as expected.
+// - Create TDblQue based object, insert links at front and last, call IsHead, 
+// IsFirst, IsLast, First and Last methods.
+// - Create TDblQue object, check list for empty before inserting, after 
+// inserting, before/after Deque, before/after Enque, after Reset. 
+// Verify that results are as expected.
+// - Create TDblQue based object with offset constructor, insert links at
+// specified locations and check it is added as specified.
+// - Create TDblQue based object, insert links using AddFirst and AddLast and
+// check the links are as expected.
+// - Create TDblQue based object, insert links using AddFirst and AddLast and
+// check the result of the IsHead, IsFirst and IsLast methods are as expected.
+// - Create TDblQue based object, insert links using AddFirst and AddLast, check 
+// the results are as expected.
+// - Create TPriQueLink list without offset, with different offset, check the 
+// construction is as expected.
+// - Create TPriQueLink list and insert many links at different specified location
+// and check it is added as specified.
+// - Create TPriQueLink link with different priorities, insert the elements in 
+// priority order and check that they are added as expected.
+// - Create TPriQueLink list, check the double linked list for empty before 
+// inserting, after inserting, before/after Deque, before/after Enque, after Reset. 
+// Verify that results are as expected.
+// - Create TPriQueLink list with different offset, get the list offset and check it
+// is as expected.
+// - Create TPriQueLink list, insert many links with different priorities check it is 
+// as expected.
+// - Create TDeltaQueLink list, add ,remove links and check the links and check 
+// it is as expected.
+// - Create TDeltaQueLink list and insert many links at different specified location
+// and check it is added as specified.
+// - Create TDeltaQueLink list, check the double linked list for empty before, after 
+// inserting, before Deque, after Enque, Reset method call is as expected.
+// - Create TDeltaQueLink list, insert links using DoAddDelta method,check that 
+// links are as expected. Delete links using DoRemove and DoRemoveFirst methods
+// and check that links are as expected.
+// - Create TDeltaQueLink based object, insert links using DoAddDelta method,
+// check the return value of CountDown is as expected. Delete links using 
+// DoRemoveFirst method and check the return value of CountDown is as expected.
+// - Create TDeltaQueLink list with different offset, get and check the offset is 
+// as expected.
+// - Create TDeltaQueLink list, add, remove links at different specified location 
+// and check it is added and removed successfully.
+// - Initialaize TDblQueIterBase based iterator, get the current item in the queue, 
+// move the current position forward, backward, set the iterator to point to the 
+// first element, last item and check it is as expected.
+// - Create TDblQueIterBase object with offset constructor, insert links at
+// specified locations and check it is added as specified.
+// - Create TDblQueIterBase object, iterate the list using operators, DoPostInc, 
+// DoPostDec, DoCurrent and check it is as expected.
+// - Create TDblQue based link with specified offset, initialize TDblQueIter 
+// based iterator, iterate the link and check the offset is as expected.
+// - Create TDblQueIter object with offset constructor, insert links at
+// specified locations and check it is added as specified.
+// - Create TDblQueIter object, iterate the list using operators, DoPostInc, 
+// DoPostDec, DoCurrent and check it is as expected.
+// - Create TDblQueIter based object, insert links using AddFirst and SetToLast,
+// using IsHead, check the results are as expected.
+// Platforms/Drives/Compatibility:
+// All 
+// Assumptions/Requirement/Pre-requisites:
+// Failures and causes:
+// Base Port information:
+// 
+//
+
+#include <e32test.h>
+
+LOCAL_D RTest test(_L("T_QUE"));
+
+#ifndef _DEBUG
+#pragma warning(disable : 4710) //fuction not expanded
+#endif
+
+#define SIZE 10
+#define MAX_OFFSET 10
+
+struct Item
+	{
+	TDblQueLink iLink;
+	TInt iSpace[MAX_OFFSET]; // Reserve some space
+	};
+
+class CItem : public CBase
+	{
+public:
+	TDblQueLink iLink;
+	//int iSpac[MAX_OFFSET]; // Reserve some space
+	};
+
+template<class T>
+class TestTQueLink
+	{
+public:
+	void TestQueLinkBase();	// Calls Test: 1.
+	void TestQueLink();	// Calls Test: 1,2.
+	void Test1();	// Test Enque
+	void Test2();	// Test Deque
+protected:
+	void CreateObjects(TInt aBaseLink);
+	void DestroyObjects();
+private:
+	void CallTest1();
+	T* iLink[SIZE];
+	};
+
+template<class T>
+void TestTQueLink<T>::CallTest1()
+	{
+	test.Start(_L("Test Enque"));
+	Test1();
+	}
+
+template<class T>
+void TestTQueLink<T>::CreateObjects(TInt aBaseLink)
+	{
+	TInt i;
+
+	for (i=0;i<SIZE;i++)
+		iLink[i]=new T;
+	if (aBaseLink>=0&&aBaseLink<SIZE)
+		(iLink[aBaseLink])->iNext=(iLink[aBaseLink])->iPrev=iLink[aBaseLink];
+	}
+
+template<class T>
+void TestTQueLink<T>::DestroyObjects()
+	{
+	TInt i;
+
+	for (i=0;i<SIZE;i++)
+		delete iLink[i];
+	}
+
+template<class T>
+void TestTQueLink<T>::TestQueLinkBase()
+	{
+	CallTest1();
+	test.Next(_L("Finished"));
+	test.End();
+	}
+
+template <class T>
+void TestTQueLink<T>::TestQueLink()
+	{
+	CallTest1();
+	test.Next(_L("Text Deque"));
+	Test2();
+	test.Next(_L("Finished"));
+	test.End();
+	}
+
+template<class T>
+void TestTQueLink<T>::Test1()
+	{
+	CreateObjects(1);
+	test.Start(_L("Check Next and Prev pointers set corectly."));
+	iLink[2]->Enque(iLink[1]);
+	test(iLink[1]->iPrev==iLink[2]);
+	test(iLink[1]->iNext==iLink[2]);
+	test(iLink[2]->iPrev==iLink[1]);
+	test(iLink[2]->iNext==iLink[1]);
+	iLink[3]->Enque(iLink[2]);
+	test(iLink[1]->iPrev==iLink[3]);
+	test(iLink[1]->iNext==iLink[2]);
+	test(iLink[2]->iPrev==iLink[1]);
+	test(iLink[2]->iNext==iLink[3]);
+	test(iLink[3]->iPrev==iLink[2]);
+	test(iLink[3]->iNext==iLink[1]);
+	iLink[4]->Enque(iLink[3]);
+	test(iLink[1]->iPrev==iLink[4]);
+	test(iLink[1]->iNext==iLink[2]);
+	test(iLink[2]->iPrev==iLink[1]);
+	test(iLink[2]->iNext==iLink[3]);
+	test(iLink[3]->iPrev==iLink[2]);
+	test(iLink[3]->iNext==iLink[4]);
+	test(iLink[4]->iPrev==iLink[3]);
+	test(iLink[4]->iNext==iLink[1]);
+	iLink[5]->Enque(iLink[2]);
+	test(iLink[1]->iPrev==iLink[4]);
+	test(iLink[1]->iNext==iLink[2]);
+	test(iLink[2]->iPrev==iLink[1]);
+	test(iLink[2]->iNext==iLink[5]);
+	test(iLink[5]->iPrev==iLink[2]);
+	test(iLink[5]->iNext==iLink[3]);
+	test(iLink[3]->iPrev==iLink[5]);
+	test(iLink[3]->iNext==iLink[4]);
+	test(iLink[4]->iPrev==iLink[3]);
+	test(iLink[4]->iNext==iLink[1]);
+	test.Next(_L("Finished"));
+	DestroyObjects();
+	test.End();
+	}
+
+template<class T>
+void TestTQueLink<T>::Test2()
+	{
+	CreateObjects(1);
+	test.Start(_L("Check Next and Prev pointers set corectly"));
+	iLink[2]->Enque(iLink[1]);
+	iLink[3]->Enque(iLink[2]);
+	iLink[4]->Enque(iLink[3]);
+	iLink[5]->Enque(iLink[4]);
+	iLink[5]->Deque();
+	iLink[5]->Enque(iLink[2]);
+	test(iLink[1]->iPrev==iLink[4]);
+	test(iLink[1]->iNext==iLink[2]);
+	test(iLink[2]->iPrev==iLink[1]);
+	test(iLink[2]->iNext==iLink[5]);
+	test(iLink[5]->iPrev==iLink[2]);
+	test(iLink[5]->iNext==iLink[3]);
+	test(iLink[3]->iPrev==iLink[5]);
+	test(iLink[3]->iNext==iLink[4]);
+	test(iLink[4]->iPrev==iLink[3]);
+	test(iLink[4]->iNext==iLink[1]);
+	iLink[3]->Deque();
+	test(iLink[1]->iPrev==iLink[4]);
+	test(iLink[1]->iNext==iLink[2]);
+	test(iLink[2]->iPrev==iLink[1]);
+	test(iLink[2]->iNext==iLink[5]);
+	test(iLink[5]->iPrev==iLink[2]);
+	test(iLink[5]->iNext==iLink[4]);
+	test(iLink[4]->iPrev==iLink[5]);
+	test(iLink[4]->iNext==iLink[1]);
+	iLink[1]->Deque();
+	test(iLink[2]->iPrev==iLink[4]);
+	test(iLink[2]->iNext==iLink[5]);
+	test(iLink[5]->iPrev==iLink[2]);
+	test(iLink[5]->iNext==iLink[4]);
+	test(iLink[4]->iPrev==iLink[5]);
+	test(iLink[4]->iNext==iLink[2]);
+	iLink[4]->Deque();
+	test(iLink[2]->iPrev==iLink[5]);
+	test(iLink[2]->iNext==iLink[5]);
+	test(iLink[5]->iPrev==iLink[2]);
+	test(iLink[5]->iNext==iLink[2]);
+	test.Next(_L("Finished"));
+	DestroyObjects();
+	test.End();
+	}
+
+class VDblQueBase : public TDblQueBase
+	{
+public:
+	VDblQueBase();
+	VDblQueBase(TInt anOffset);
+	inline void sDoAddFirst(TAny* aPtr) {DoAddFirst(aPtr);}
+	inline void sDoAddLast(TAny* aPtr) {DoAddLast(aPtr);}
+	inline void sDoAddPriority(TAny* aPtr) {DoAddPriority(aPtr);}
+	inline void sTestEmpty() const {__DbgTestEmpty();}
+	TDblQueLink* sHead;
+	TInt* sOffset;
+private:
+	void SetMembers();
+	};
+
+class VDeltaQueBase : public TDeltaQueBase
+	{
+public:
+	VDeltaQueBase();
+	VDeltaQueBase(TInt anOffset);
+	inline void sDoAddDelta(TAny* aPtr,TInt aDelta) {DoAddDelta(aPtr,aDelta);}		//From TDeltaQueBase
+	inline void sDoRemove(TAny* aPtr) {this->DoRemove(aPtr);}
+	inline TAny* sDoRemoveFirst() {return this->DoRemoveFirst();}
+	TInt** sFirstDelta;
+	inline void sDoAddFirst(TAny* aPtr) {DoAddFirst(aPtr);}		//From TDblQueBase
+	inline void sDoAddLast(TAny* aPtr) {DoAddLast(aPtr);}
+	inline void sDoAddPriority(TAny* aPtr) {DoAddPriority(aPtr);}
+	TDblQueLink* sHead;
+	TInt* sOffset;
+private:
+	void SetMembers();
+	};
+
+template <class T>
+class VDblQue : public TDblQue<T>
+	{
+public:
+	VDblQue();
+	VDblQue(TInt anOffset);
+	/*inline void sDoAddDelta(TAny* aPtr,TInt aDelta) {DoAddDelta(aPtr,aDelta);}		//From TDeltaQueBase
+	inline void sDoRemove(TAny* aPtr) {this->DoRemove(aPtr);}
+	inline TAny* sDoRemoveFirst() {return this->DoRemoveFirst();}
+	TInt** sFirstDelta;*/
+	inline void sDoAddFirst(TAny* aPtr) {this->DoAddFirst(aPtr);}		//From TDblQueBase
+	inline void sDoAddLast(TAny* aPtr) {this->DoAddLast(aPtr);}
+	inline void sDoAddPriority(TAny* aPtr) {this->DoAddPriority(aPtr);}
+	TDblQueLink* sHead;
+	TInt* sOffset;
+private:
+	void SetMembers();
+	};
+
+template <class T>
+class VPriQue : public TPriQue<T>
+	{
+public:
+	VPriQue();
+	VPriQue(TInt anOffset);
+	/*inline void sDoAddDelta(TAny* aPtr,TInt aDelta) {DoAddDelta(aPtr,aDelta);}		//From TDeltaQueBase
+	inline void sDoRemove(TAny* aPtr) {this->DoRemove(aPtr);}
+	inline TAny* sDoRemoveFirst() {return this->DoRemoveFirst();}
+	TInt** sFirstDelta;*/
+	inline void sDoAddFirst(TAny* aPtr) {this->DoAddFirst(aPtr);}		//From TDblQueBase
+	inline void sDoAddLast(TAny* aPtr) {this->DoAddLast(aPtr);}
+	inline void sDoAddPriority(TAny* aPtr) {this->DoAddPriority(aPtr);}
+	TDblQueLink* sHead;
+	TInt* sOffset;
+private:
+	void SetMembers();
+	};
+
+template <class T>
+class VDeltaQue : public TDeltaQue<T>
+	{
+public:
+	VDeltaQue();
+	VDeltaQue(TInt anOffset);
+	inline void sDoAddDelta(TAny* aPtr,TInt aDelta) {this->DoAddDelta(aPtr,aDelta);}		//From TDeltaQueBase
+	inline void sDoRemove(TAny* aPtr) {this->DoRemove(aPtr);}
+	inline TAny* sDoRemoveFirst() {return this->DoRemoveFirst();}
+	TInt** sFirstDelta;
+	inline void sDoAddFirst(TAny* aPtr) {this->DoAddFirst(aPtr);}		//From TDblQueBase
+	inline void sDoAddLast(TAny* aPtr) {this->DoAddLast(aPtr);}
+	inline void sDoAddPriority(TAny* aPtr) {this->DoAddPriority(aPtr);}
+	TDblQueLink* sHead;
+	TInt* sOffset;
+private:
+	void SetMembers();
+	};
+
+VDblQueBase::VDblQueBase()
+	{
+	SetMembers();
+	}
+
+VDblQueBase::VDblQueBase(TInt anOffset)
+	:TDblQueBase(anOffset)
+	{
+	SetMembers();
+	}
+
+void VDblQueBase::SetMembers()
+	{
+	sHead=&iHead;
+	sOffset=&iOffset;
+	}
+
+VDeltaQueBase::VDeltaQueBase()
+	{
+	SetMembers();
+	}
+
+VDeltaQueBase::VDeltaQueBase(TInt anOffset)
+	:TDeltaQueBase(anOffset)
+	{
+	SetMembers();
+	}
+
+void VDeltaQueBase::SetMembers()
+	{
+	sFirstDelta=&iFirstDelta;
+	sHead=&iHead;
+	sOffset=&iOffset;
+	}
+
+template <class T>
+VDblQue<T>::VDblQue()
+	{
+	SetMembers();
+	}
+
+template <class T>
+VDblQue<T>::VDblQue(TInt anOffset)
+	:TDblQue<T>(anOffset)
+	{
+	SetMembers();
+	}
+
+template <class T>
+void VDblQue<T>::SetMembers()
+	{
+	//sFirstDelta=&iFirstDelta;
+	sHead=&this->iHead;
+	sOffset=&this->iOffset;
+	}
+
+template <class T>
+VPriQue<T>::VPriQue()
+	{
+	SetMembers();
+	}
+
+template <class T>
+VPriQue<T>::VPriQue(TInt anOffset)
+	:TPriQue<T>(anOffset)
+	{
+	SetMembers();
+	}
+
+template <class T>
+void VPriQue<T>::SetMembers()
+	{
+	//sFirstDelta=&iFirstDelta;
+	sHead=&this->iHead;
+	sOffset=&this->iOffset;
+	}
+
+template <class T>
+VDeltaQue<T>::VDeltaQue()
+	{
+	SetMembers();
+	}
+
+template <class T>
+VDeltaQue<T>::VDeltaQue(TInt anOffset)
+	:TDeltaQue<T>(anOffset)
+	{
+	SetMembers();
+	}
+
+template <class T>
+void VDeltaQue<T>::SetMembers()
+	{
+	sFirstDelta=&this->iFirstDelta;
+	sHead=&this->iHead;
+	sOffset=&this->iOffset;
+	}
+
+template<class T>
+class TestTQue
+	{
+friend class TestTQueLink<TDblQueLinkBase>;
+public:
+	void TestQueBase();
+	void TestDeltaBase();
+	void TestDblQue();
+	void TestPriQue();
+	void TestDeltaQue();
+	void Test1();	// All functions		//TDblQueBase functions
+	void Test2();	// Constructors
+	void Test3(TBool aTestPri);	// DoAdd's
+	void Test4();	// Public functions
+	void Test5();	// All functions		//TDblDeltaQueBase
+	void Test6();	// Constructors
+	void Test7();	// Do's
+	void Test8();	// CountDown
+	void Test9();	// All functions		//TDblQueBase
+	void Test10();	// Constructors
+	void Test11();	// Add's
+	void Test12();	// Is's
+	void Test13();	// Get's
+	void Test14();	// All functions		//TPriQue
+	void Test15();	// Constructors
+	void Test16();	// Add
+	void Test17();	// All functions		//TDeltaQue
+	void Test18();	// Constructors
+	void Test19();	// Add/Remove
+private:
+	void CallTest3_4(TBool aTestPri);	
+	void CallTest7_8();	
+	};
+
+template<class T>
+void TestTQue<T>::CallTest3_4(TBool aTestPri)
+	{
+	test.Next(_L("Test DoAdd's"));
+	Test3(aTestPri);
+	test.Next(_L("Test public functions"));
+	Test4();
+	}
+
+template<class T>
+void TestTQue<T>::CallTest7_8()
+	{
+	test.Next(_L("Test Do's"));
+	Test7();
+	test.Next(_L("CountDown"));
+	Test8();
+	}
+
+template<class T>
+void TestTQue<T>::TestQueBase()
+	{
+	test.Start(_L("Test all member functions (simply)"));
+	Test1();
+	test.Next(_L("Test Constructors"));
+	Test2();
+	CallTest3_4(ETrue);
+	test.Next(_L("Finished"));
+	test.End();
+	}
+
+template<class T>
+void TestTQue<T>::TestDeltaBase()
+	{
+	test.Start(_L("Test all member functions (simply)"));
+	Test5();
+	CallTest3_4(EFalse);
+	test.Next(_L("Test Constructors"));
+	Test6();
+	CallTest7_8();
+	test.Next(_L("Finished"));
+	test.End();
+	}
+
+template<class T>
+void TestTQue<T>::TestDblQue()
+	{
+	test.Start(_L("Test all member functions (simply)"));
+	Test9();
+	CallTest3_4(EFalse);
+	test.Next(_L("Test Constructor"));
+	Test10();
+	test.Next(_L("Test Add's"));
+	Test11();
+	test.Next(_L("Test Is's"));
+	Test12();
+	test.Next(_L("Get's"));
+	Test13();
+	test.Next(_L("Finished"));
+	test.End();
+	}
+
+template<class T>
+void TestTQue<T>::TestPriQue()
+	{
+	test.Start(_L("Test all member functions (simply)"));
+	Test14();
+	CallTest3_4(ETrue);
+	test.Next(_L("Test Constructor"));
+	Test15();
+	test.Next(_L("Test Add"));
+	Test16();
+	test.Next(_L("Finished"));
+	test.End();
+	}
+
+template<class T>
+void TestTQue<T>::TestDeltaQue()
+	{
+	test.Start(_L("Test all member functions (simply)"));
+	Test17();
+	CallTest3_4(EFalse);
+	CallTest7_8();
+	test.Next(_L("Test Constructor"));
+	Test18();
+	test.Next(_L("Test Add/Removes"));
+	Test19();
+	test.Next(_L("Finished"));
+	test.End();
+	}
+
+template<class T>
+void TestTQue<T>::Test1()
+	{
+	T* que;
+	TPriQueLink link1,link2;
+	TInt offset=4;
+
+	test.Start(_L("Constructors"));
+	que=new VDblQueBase(offset);
+	delete que;
+	que=new VDblQueBase;
+	//delete que;
+	test.Next(_L("DoAdd's"));
+	que->sDoAddFirst(&link1);
+	link1.Deque();
+	que->sDoAddLast(&link1);
+	link1.iPriority=1;
+	link2.iPriority=2;
+	que->sDoAddPriority(&link2);
+	test.Next(_L("Public"));
+	que->IsEmpty();
+	que->SetOffset(offset);
+	que->Reset();
+	test.Next(_L("Finished"));
+	delete que;
+	test.End();
+	}
+
+template<class T>
+void TestTQue<T>::Test2()
+	{
+	T* que;
+	TInt offset;
+
+	test.Start(_L("Default constructor"));
+	que=new VDblQueBase();
+	test(*(que->sOffset)==0);
+	test(que->sHead->iNext==que->sHead);
+	test(que->sHead->iPrev==que->sHead);
+	delete que;
+	test.Next(_L("Offset constructor"));
+	for (offset=0;offset<40;offset+=4)
+		{
+		que=new VDblQueBase(offset);
+		test(*(que->sOffset)==offset);
+		test(que->sHead->iNext==que->sHead);
+		test(que->sHead->iPrev==que->sHead);
+		delete que;
+		}
+	test.Next(_L("Finished"));
+	test.End();
+	}
+
+template<class T>
+void TestTQue<T>::Test3(TBool aTestPri)
+	{
+	T* que;
+	TDblQueLink link1,link2,link3,link4;
+
+	test.Start(_L("AddFirst"));
+	que=new T();
+	que->sDoAddFirst(&link1);
+	test(que->sHead->iNext==&link1);
+	test(que->sHead->iPrev==&link1);
+	test(link1.iNext==que->sHead);
+	test(link1.iPrev==que->sHead);
+ 	que->sDoAddFirst(&link2);
+	test(que->sHead->iNext==&link2);
+	test(que->sHead->iPrev==&link1);
+	test(link1.iNext==que->sHead);
+	test(link1.iPrev==&link2);
+	test(link2.iNext==&link1);
+	test(link2.iPrev==que->sHead);
+  	que->sDoAddFirst(&link3);
+	test(que->sHead->iNext==&link3);
+	test(que->sHead->iPrev==&link1);
+	test(link1.iNext==que->sHead);
+	test(link1.iPrev==&link2);
+	test(link2.iNext==&link1);
+	test(link2.iPrev==&link3);
+	test(link3.iNext==&link2);
+	test(link3.iPrev==que->sHead);
+  	que->sDoAddFirst(&link4);
+	test(que->sHead->iNext==&link4);
+	test(que->sHead->iPrev==&link1);
+	test(link1.iNext==que->sHead);
+	test(link1.iPrev==&link2);
+	test(link2.iNext==&link1);
+	test(link2.iPrev==&link3);
+	test(link3.iNext==&link2);
+	test(link3.iPrev==&link4);
+	test(link4.iNext==&link3);
+	test(link4.iPrev==que->sHead);
+	link1.Deque();
+	link2.Deque();
+	link3.Deque();
+	link4.Deque();
+	delete que;
+	test.Next(_L("AddLast"));
+	que=new T();
+	que->sDoAddLast(&link1);
+	test(que->sHead->iNext==&link1);
+	test(que->sHead->iPrev==&link1);
+	test(link1.iNext==que->sHead);
+	test(link1.iPrev==que->sHead);
+	que->sDoAddLast(&link2);
+	test(que->sHead->iNext==&link1);
+	test(que->sHead->iPrev==&link2);
+	test(link1.iNext==&link2);
+	test(link1.iPrev==que->sHead);
+	test(link2.iNext==que->sHead);
+	test(link2.iPrev==&link1);
+	que->sDoAddLast(&link3);
+	test(que->sHead->iNext==&link1);
+	test(que->sHead->iPrev==&link3);
+	test(link1.iNext==&link2);
+	test(link1.iPrev==que->sHead);
+	test(link2.iNext==&link3);
+	test(link2.iPrev==&link1);
+	test(link3.iNext==que->sHead);
+	test(link3.iPrev==&link2);
+	que->sDoAddLast(&link4);
+	test(que->sHead->iNext==&link1);
+	test(que->sHead->iPrev==&link4);
+	test(link1.iNext==&link2);
+	test(link1.iPrev==que->sHead);
+	test(link2.iNext==&link3);
+	test(link2.iPrev==&link1);
+	test(link3.iNext==&link4);
+	test(link3.iPrev==&link2);
+	test(link4.iNext==que->sHead);
+	test(link4.iPrev==&link3);
+	link1.Deque();
+	link2.Deque();
+	link3.Deque();
+	link4.Deque();
+ 	delete que;
+	test.Next(_L("Combined AddFirst and AddLast"));
+ 	que=new T();
+	que->sDoAddFirst(&link1);
+	que->sDoAddLast(&link2);
+ 	test(que->sHead->iNext==&link1);
+	test(que->sHead->iPrev==&link2);
+	test(link1.iNext==&link2);
+	test(link1.iPrev==que->sHead);
+	test(link2.iNext==que->sHead);
+	test(link2.iPrev==&link1);
+	que->sDoAddFirst(&link3);
+ 	test(que->sHead->iNext==&link3);
+	test(que->sHead->iPrev==&link2);
+	test(link1.iNext==&link2);
+	test(link1.iPrev==&link3);
+	test(link2.iNext==que->sHead);
+	test(link2.iPrev==&link1);
+	test(link3.iNext==&link1);
+	test(link3.iPrev==que->sHead);
+	que->sDoAddLast(&link4);
+  	test(que->sHead->iNext==&link3);
+	test(que->sHead->iPrev==&link4);
+	test(link1.iNext==&link2);
+	test(link1.iPrev==&link3);
+	test(link2.iNext==&link4);
+	test(link2.iPrev==&link1);
+	test(link3.iNext==&link1);
+	test(link3.iPrev==que->sHead);
+	test(link4.iNext==que->sHead);
+	test(link4.iPrev==&link2);
+	link1.Deque();
+	link2.Deque();
+	link3.Deque();
+	link4.Deque();
+ 	delete que;
+	if (aTestPri)
+	{
+		TPriQueLink link5,link6,link7,link8,link9,link10;
+
+		test.Next(_L("AddPriority"));
+	 	que=new T();
+		link5.iPriority=4;
+		link6.iPriority=6;
+		link7.iPriority=8;
+		que->sDoAddPriority(&link5);
+		que->sDoAddPriority(&link6);
+		que->sDoAddPriority(&link7);
+  		test(que->sHead->iNext==&link7);
+		test(que->sHead->iPrev==&link5);
+		test(link5.iNext==que->sHead);
+		test(link5.iPrev==&link6);
+		test(link6.iNext==&link5);
+		test(link6.iPrev==&link7);
+		test(link7.iNext==&link6);
+		test(link7.iPrev==que->sHead);
+		link8.iPriority=7;
+		que->sDoAddPriority(&link8);
+  		test(que->sHead->iNext==&link7);
+		test(que->sHead->iPrev==&link5);
+		test(link5.iNext==que->sHead);
+		test(link5.iPrev==&link6);
+		test(link6.iNext==&link5);
+		test(link6.iPrev==&link8);
+		test(link7.iNext==&link8);
+		test(link7.iPrev==que->sHead);
+		test(link8.iPrev==&link7);
+		test(link8.iNext==&link6);
+		link9.iPriority=5;
+		que->sDoAddPriority(&link9);
+  		test(que->sHead->iNext==&link7);
+		test(que->sHead->iPrev==&link5);
+		test(link5.iNext==que->sHead);
+		test(link5.iPrev==&link9);
+		test(link6.iNext==&link9);
+		test(link6.iPrev==&link8);
+		test(link7.iNext==&link8);
+		test(link7.iPrev==que->sHead);
+		test(link8.iPrev==&link7);
+		test(link8.iNext==&link6);
+		test(link9.iPrev==&link6);
+		test(link9.iNext==&link5);
+		link10.iPriority=3;
+		que->sDoAddPriority(&link10);
+  		test(que->sHead->iNext==&link7);
+		test(que->sHead->iPrev==&link10);
+		test(link5.iNext==&link10);
+		test(link5.iPrev==&link9);
+		test(link6.iNext==&link9);
+		test(link6.iPrev==&link8);
+		test(link7.iNext==&link8);
+		test(link7.iPrev==que->sHead);
+		test(link8.iPrev==&link7);
+		test(link8.iNext==&link6);
+		test(link9.iPrev==&link6);
+		test(link9.iNext==&link5);
+ 		test(link10.iNext==que->sHead);
+		test(link10.iPrev==&link5);
+		link5.Deque();
+		link6.Deque();
+		link7.Deque();
+		link8.Deque();
+	 	delete que;
+		}
+	test.Next(_L("Finished"));
+	test.End();
+	}
+
+template<class T>
+void TestTQue<T>::Test4()
+	{
+	T* que;
+	TInt offset;
+
+	test.Start(_L("IsEmpty"));
+	que=new T();
+	test(que->IsEmpty()==TRUE);
+	TDblQueLink link1,link2;
+	que->sDoAddFirst(&link1);
+	test(que->IsEmpty()==FALSE);
+	link1.Deque();
+	test(que->IsEmpty()==TRUE);
+	que->sDoAddLast(&link2);
+	test(que->IsEmpty()==FALSE);
+	link1.Enque(&link2);
+	test(que->IsEmpty()==FALSE);
+	link2.Deque();
+	test(que->IsEmpty()==FALSE);
+ 	link1.Deque();
+	test(que->IsEmpty()==TRUE);
+	test.Next(_L("Reset"));
+	que->sDoAddFirst(&link1);
+	test(que->IsEmpty()==FALSE);
+	que->Reset();
+	test(que->IsEmpty()==TRUE);
+	test.Next(_L("SetOffset"));
+	for (offset=0;offset<40;offset+=4)
+		{
+		que->SetOffset(offset);
+		test(*(que->sOffset)==offset);
+		}
+	test.Next(_L("Finished"));
+ 	delete que;
+	test.End();
+	}
+
+template<class T>
+void TestTQue<T>::Test5()
+	{
+	T* que;
+	TDeltaQueLink link1,link2,link3;
+	TInt offset=4;
+
+	test.Start(_L("Constructors"));
+	que=new VDeltaQueBase(offset);
+	delete que;
+	que=new VDeltaQueBase;
+	test.Next(_L("Do's"));
+	que->sDoAddDelta(&link1,3);
+	que->sDoAddDelta(&link2,2);
+	que->sDoAddDelta(&link3,0);
+	que->sDoRemoveFirst();
+	que->sDoRemove(&link2);
+	test.Next(_L("CountDown"));
+	que->CountDown();
+	test.Next(_L("Finished"));
+	delete que;
+	test.End();
+	}
+
+template<class T>
+void TestTQue<T>::Test6()
+	{
+	T* que;
+	TInt offset;
+
+	test.Start(_L("Default constructor"));
+	que=new VDeltaQueBase();
+	test(*(que->sFirstDelta)==NULL);
+	delete que;
+	test.Next(_L("Offset constructor"));
+	for (offset=0;offset<40;offset+=4)
+		{
+		que=new VDeltaQueBase(offset);
+		test(*(que->sOffset)==offset);
+		test(*(que->sFirstDelta)==NULL);
+		delete que;
+		}
+	test.Next(_L("Finished"));
+	test.End();
+	}
+
+template<class T>
+void TestTQue<T>::Test7()
+	{
+	T* que;
+	TDeltaQueLink link1,link2,link3,link4,link5,link6;
+
+	test.Start(_L("DoAddDelta"));
+	que=new T();
+	que->sDoAddDelta(&link2,3);
+	test(*(que->sFirstDelta)==&link2.iDelta);
+	test(link2.iDelta==3);
+	que->sDoAddDelta(&link5,15);
+	test(*(que->sFirstDelta)==&link2.iDelta);
+	test(link2.iDelta==3);
+	test(link5.iDelta==12);
+	que->sDoAddDelta(&link3,6);
+	test(*(que->sFirstDelta)==&link2.iDelta);
+	test(link2.iDelta==3);
+	test(link3.iDelta==3);
+	test(link5.iDelta==9);
+	que->sDoAddDelta(&link4,10);
+	test(*(que->sFirstDelta)==&link2.iDelta);
+	test(link2.iDelta==3);
+	test(link3.iDelta==3);
+	test(link4.iDelta==4);
+	test(link5.iDelta==5);
+	que->sDoAddDelta(&link1,1);
+	test(*(que->sFirstDelta)==&link1.iDelta);
+	test(link1.iDelta==1);
+	test(link2.iDelta==2);
+	test(link3.iDelta==3);
+	test(link4.iDelta==4);
+	test(link5.iDelta==5);
+	que->sDoAddDelta(&link6,21);
+	test(*(que->sFirstDelta)==&link1.iDelta);
+	test(link1.iDelta==1);
+	test(link2.iDelta==2);
+	test(link3.iDelta==3);
+	test(link4.iDelta==4);
+	test(link5.iDelta==5);
+	test(link6.iDelta==6);
+	test.Next(_L("DoRemove"));
+	que->sDoRemove(&link6);
+	test(*(que->sFirstDelta)==&link1.iDelta);
+	test(link1.iDelta==1);
+	test(link2.iDelta==2);
+	test(link3.iDelta==3);
+	test(link4.iDelta==4);
+	test(link5.iDelta==5);
+ 	que->sDoRemove(&link1);
+	test(*(que->sFirstDelta)==&link2.iDelta);
+	test(link2.iDelta==3);
+	test(link3.iDelta==3);
+	test(link4.iDelta==4);
+	test(link5.iDelta==5);
+	que->sDoRemove(&link4);
+	test(*(que->sFirstDelta)==&link2.iDelta);
+	test(link2.iDelta==3);
+	test(link3.iDelta==3);
+	test(link5.iDelta==9);
+	que->sDoRemove(&link3);
+	test(*(que->sFirstDelta)==&link2.iDelta);
+	test(link2.iDelta==3);
+	test(link5.iDelta==12);
+	que->sDoRemove(&link5);
+	test(*(que->sFirstDelta)==&link2.iDelta);
+	test(link2.iDelta==3);
+	test.Next(_L("DoRemoveFirst"));
+	test(NULL==que->sDoRemoveFirst());
+	test(*(que->sFirstDelta)==&link2.iDelta);
+	test(link2.iDelta==3);
+	link2.iDelta=1;
+	test(NULL==que->sDoRemoveFirst());
+	test(*(que->sFirstDelta)==&link2.iDelta);
+	test(link2.iDelta==1);
+	link2.iDelta=0;
+	test(&link2==que->sDoRemoveFirst());
+	delete que;
+	test.Next(_L("Finished"));
+	test.End();
+	}
+
+template<class T>
+void TestTQue<T>::Test8()
+	{
+	T* que;
+	TDeltaQueLink link1,link2,link3;
+
+	que=new T();
+	que->sDoAddDelta(&link1,1);
+	que->sDoAddDelta(&link2,3);
+	que->sDoAddDelta(&link3,6);
+	test(que->CountDown()==TRUE);
+	que->sDoRemoveFirst();
+	test(que->CountDown()==FALSE);
+	test(que->CountDown()==TRUE);
+	que->sDoRemoveFirst();
+	test(que->CountDown()==FALSE);
+	test(que->CountDown()==FALSE);
+	test(que->CountDown()==TRUE);
+	que->sDoRemoveFirst();
+	delete que;
+	}
+
+template<class T>
+void TestTQue<T>::Test9()
+	{
+	T* que;
+	TDblQueLink link1,link2;
+	TInt offset=4;
+
+	test.Start(_L("Constructors"));
+	que=new VDblQue<TDblQueLink>(offset);
+	delete que;
+	que=new VDblQue<TDblQueLink>;
+	test.Next(_L("Add's"));
+	que->AddFirst(link1);
+	que->AddLast(link2);
+	test.Next(_L("Is's"));
+	que->IsHead(que->sHead);
+	que->IsFirst(&link1);
+	que->IsLast(&link2);
+	test.Next(_L("Get's"));
+	que->First();
+	que->Last();
+	test.Next(_L("Finished"));
+	delete que;
+	test.End();
+	}
+
+template<class T>
+void TestTQue<T>::Test10()
+	{
+	T* que;
+	TInt offset;
+
+	test.Start(_L("Offset constructor"));
+	for (offset=0;offset<40;offset+=4)
+		{
+		que=new VDblQue<TDblQueLink>(offset);
+		test(*(que->sOffset)==offset);
+		delete que;
+		}
+	test.Next(_L("Finished"));
+	test.End();
+	}
+
+template<class T>
+void TestTQue<T>::Test11()
+	{
+	T* que;
+	TDblQueLink link1,link2,link3,link4;
+
+	test.Start(_L("AddFirst"));
+	que=new T();
+	que->AddFirst(link1);
+	test(que->sHead->iNext==&link1);
+	test(que->sHead->iPrev==&link1);
+	test(link1.iNext==que->sHead);
+	test(link1.iPrev==que->sHead);
+ 	que->AddFirst(link2);
+	test(que->sHead->iNext==&link2);
+	test(que->sHead->iPrev==&link1);
+	test(link1.iNext==que->sHead);
+	test(link1.iPrev==&link2);
+	test(link2.iNext==&link1);
+	test(link2.iPrev==que->sHead);
+  	que->AddFirst(link3);
+	test(que->sHead->iNext==&link3);
+	test(que->sHead->iPrev==&link1);
+	test(link1.iNext==que->sHead);
+	test(link1.iPrev==&link2);
+	test(link2.iNext==&link1);
+	test(link2.iPrev==&link3);
+	test(link3.iNext==&link2);
+	test(link3.iPrev==que->sHead);
+  	que->AddFirst(link4);
+	test(que->sHead->iNext==&link4);
+	test(que->sHead->iPrev==&link1);
+	test(link1.iNext==que->sHead);
+	test(link1.iPrev==&link2);
+	test(link2.iNext==&link1);
+	test(link2.iPrev==&link3);
+	test(link3.iNext==&link2);
+	test(link3.iPrev==&link4);
+	test(link4.iNext==&link3);
+	test(link4.iPrev==que->sHead);
+	link1.Deque();
+	link2.Deque();
+	link3.Deque();
+	link4.Deque();
+	delete que;
+	test.Next(_L("AddLast"));
+	que=new T();
+	que->AddLast(link1);
+	test(que->sHead->iNext==&link1);
+	test(que->sHead->iPrev==&link1);
+	test(link1.iNext==que->sHead);
+	test(link1.iPrev==que->sHead);
+	que->AddLast(link2);
+	test(que->sHead->iNext==&link1);
+	test(que->sHead->iPrev==&link2);
+	test(link1.iNext==&link2);
+	test(link1.iPrev==que->sHead);
+	test(link2.iNext==que->sHead);
+	test(link2.iPrev==&link1);
+	que->AddLast(link3);
+	test(que->sHead->iNext==&link1);
+	test(que->sHead->iPrev==&link3);
+	test(link1.iNext==&link2);
+	test(link1.iPrev==que->sHead);
+	test(link2.iNext==&link3);
+	test(link2.iPrev==&link1);
+	test(link3.iNext==que->sHead);
+	test(link3.iPrev==&link2);
+	que->AddLast(link4);
+	test(que->sHead->iNext==&link1);
+	test(que->sHead->iPrev==&link4);
+	test(link1.iNext==&link2);
+	test(link1.iPrev==que->sHead);
+	test(link2.iNext==&link3);
+	test(link2.iPrev==&link1);
+	test(link3.iNext==&link4);
+	test(link3.iPrev==&link2);
+	test(link4.iNext==que->sHead);
+	test(link4.iPrev==&link3);
+	link1.Deque();
+	link2.Deque();
+	link3.Deque();
+	link4.Deque();
+ 	delete que;
+	test.Next(_L("Combined AddFirst and AddLast"));
+ 	que=new T();
+	que->AddFirst(link1);
+	que->AddLast(link2);
+ 	test(que->sHead->iNext==&link1);
+	test(que->sHead->iPrev==&link2);
+	test(link1.iNext==&link2);
+	test(link1.iPrev==que->sHead);
+	test(link2.iNext==que->sHead);
+	test(link2.iPrev==&link1);
+	que->AddFirst(link3);
+ 	test(que->sHead->iNext==&link3);
+	test(que->sHead->iPrev==&link2);
+	test(link1.iNext==&link2);
+	test(link1.iPrev==&link3);
+	test(link2.iNext==que->sHead);
+	test(link2.iPrev==&link1);
+	test(link3.iNext==&link1);
+	test(link3.iPrev==que->sHead);
+	que->AddLast(link4);
+  	test(que->sHead->iNext==&link3);
+	test(que->sHead->iPrev==&link4);
+	test(link1.iNext==&link2);
+	test(link1.iPrev==&link3);
+	test(link2.iNext==&link4);
+	test(link2.iPrev==&link1);
+	test(link3.iNext==&link1);
+	test(link3.iPrev==que->sHead);
+	test(link4.iNext==que->sHead);
+	test(link4.iPrev==&link2);
+	link1.Deque();
+	link2.Deque();
+	link3.Deque();
+	link4.Deque();
+ 	delete que;
+	test.Next(_L("Finished"));
+	test.End();
+	}
+
+template<class T>
+void TestTQue<T>::Test12()
+	{
+	T* que;
+	TDblQueLink link1,link2,link3,link4,*head;
+
+	que=new T();
+	que->AddFirst(link1);
+ 	que->AddLast(link2);
+ 	que->AddLast(link3);
+  	que->AddLast(link4);
+	head=que->sHead;
+	test.Start(_L("IsHead"));
+	test(que->IsHead(head)==TRUE);
+	test(que->IsHead(&link1)==FALSE);
+	test(que->IsHead(&link2)==FALSE);
+	test(que->IsHead(&link3)==FALSE);
+	test(que->IsHead(&link4)==FALSE);
+	test.Next(_L("IsFirst"));
+	test(que->IsFirst(head)==FALSE);
+	test(que->IsFirst(&link1)==TRUE);
+	test(que->IsFirst(&link2)==FALSE);
+	test(que->IsFirst(&link3)==FALSE);
+	test(que->IsFirst(&link4)==FALSE);
+	test.Next(_L("IsLast"));
+	test(que->IsLast(head)==FALSE);
+	test(que->IsLast(&link1)==FALSE);
+	test(que->IsLast(&link2)==FALSE);
+	test(que->IsLast(&link3)==FALSE);
+	test(que->IsLast(&link4)==TRUE);
+ 	delete que;
+	test.Next(_L("Finished"));
+	test.End();
+	}
+
+template<class T>
+void TestTQue<T>::Test13()
+	{
+	T* que;
+	TDblQueLink link1,link2,link3,link4;
+
+	test.Start(_L("First"));
+	que=new T();
+	que->AddFirst(link1);
+	test(que->First()==&link1);
+ 	que->AddFirst(link2);
+	test(que->First()==&link2);
+ 	que->AddFirst(link3);
+	test(que->First()==&link3);
+  	que->AddFirst(link4);
+	test(que->First()==&link4);
+	link1.Deque();
+	link2.Deque();
+	link3.Deque();
+	link4.Deque();
+ 	delete que;
+	test.Next(_L("Last"));
+	que=new T();
+	que->AddLast(link1);
+	test(que->Last()==&link1);
+ 	que->AddLast(link2);
+	test(que->Last()==&link2);
+ 	que->AddLast(link3);
+	test(que->Last()==&link3);
+  	que->AddLast(link4);
+	test(que->Last()==&link4);
+	link1.Deque();
+	link2.Deque();
+	link3.Deque();
+	link4.Deque();
+ 	delete que;
+	test.Next(_L("Finished"));
+	test.End();
+	}
+
+template<class T>
+void TestTQue<T>::Test14()
+	{
+	T* que;
+	TPriQueLink link;
+	TInt offset=4;
+
+	test.Start(_L("Constructors"));
+	que=new VPriQue<TPriQueLink>(offset);
+	delete que;
+	que=new VPriQue<TPriQueLink>;
+	test.Next(_L("Add"));
+	que->Add(link);
+	test.Next(_L("Finished"));
+	delete que;
+	test.End();
+	}
+
+template<class T>
+void TestTQue<T>::Test15()
+	{
+	T* que;
+	TInt offset;
+
+	test.Start(_L("Offset constructor"));
+	for (offset=0;offset<40;offset+=4)
+		{
+		que=new VPriQue<TPriQueLink>(offset);
+		test(*(que->sOffset)==offset);
+		delete que;
+		}
+	test.Next(_L("Finished"));
+	test.End();
+	}
+
+template<class T>
+void TestTQue<T>::Test16()
+	{
+	T* que;
+	TPriQueLink link1,link2,link3,link4,link5,link6;
+
+	que=new T();
+	link1.iPriority=4;
+	link2.iPriority=6;
+	link3.iPriority=2;
+	que->sDoAddPriority(&link1);
+	que->sDoAddPriority(&link2);
+	que->sDoAddPriority(&link3);
+  	test(que->sHead->iNext==&link2);
+	test(que->sHead->iPrev==&link3);
+	test(link1.iNext==&link3);
+	test(link1.iPrev==&link2);
+	test(link2.iNext==&link1);
+	test(link2.iPrev==que->sHead);
+	test(link3.iNext==que->sHead);
+	test(link3.iPrev==&link1);
+	link4.iPriority=3;
+	que->sDoAddPriority(&link4);
+  	test(que->sHead->iNext==&link2);
+	test(que->sHead->iPrev==&link3);
+	test(link1.iNext==&link4);
+	test(link1.iPrev==&link2);
+	test(link2.iNext==&link1);
+	test(link2.iPrev==que->sHead);
+	test(link3.iNext==que->sHead);
+	test(link3.iPrev==&link4);
+	test(link4.iNext==&link3);
+	test(link4.iPrev==&link1);
+	link5.iPriority=5;
+	que->sDoAddPriority(&link5);
+  	test(que->sHead->iNext==&link2);
+	test(que->sHead->iPrev==&link3);
+	test(link1.iNext==&link4);
+	test(link1.iPrev==&link5);
+	test(link2.iNext==&link5);
+	test(link2.iPrev==que->sHead);
+	test(link3.iNext==que->sHead);
+	test(link3.iPrev==&link4);
+	test(link4.iNext==&link3);
+	test(link4.iPrev==&link1);
+	test(link5.iNext==&link1);
+	test(link5.iPrev==&link2);
+	link6.iPriority=1;
+	que->sDoAddPriority(&link6);
+  	test(que->sHead->iNext==&link2);
+	test(que->sHead->iPrev==&link6);
+	test(link1.iNext==&link4);
+	test(link1.iPrev==&link5);
+	test(link2.iNext==&link5);
+	test(link2.iPrev==que->sHead);
+	test(link3.iNext==&link6);
+	test(link3.iPrev==&link4);
+	test(link4.iNext==&link3);
+	test(link4.iPrev==&link1);
+	test(link5.iNext==&link1);
+	test(link5.iPrev==&link2);
+	test(link6.iNext==que->sHead);
+	test(link6.iPrev==&link3);
+	delete que;
+	}
+
+template<class T>
+void TestTQue<T>::Test17()
+	{
+	T* que;
+	TDeltaQueLink link1,link2;
+	TInt offset=4;
+
+	test.Start(_L("Constructors"));
+	que=new VDeltaQue<TDeltaQueLink>(offset);
+	delete que;
+	que=new VDeltaQue<TDeltaQueLink>;
+	test.Next(_L("Add/Remove"));
+	que->Add(link1,0);
+	que->Add(link2,2);
+	que->Remove(link2);
+	que->RemoveFirst();
+	test.Next(_L("Finished"));
+	test.End();
+	}
+
+template<class T>
+void TestTQue<T>::Test18()
+	{
+	T* que;
+	TInt offset;
+
+	test.Start(_L("Offset constructor"));
+	for (offset=0;offset<40;offset+=4)
+		{
+		que=new VDeltaQue<TDeltaQueLink>(offset);
+		test(*(que->sOffset)==offset);
+		delete que;
+		}
+	test.Next(_L("Finished"));
+	test.End();
+	}
+
+template<class T>
+void TestTQue<T>::Test19()
+	{
+  	T* que;
+	TDeltaQueLink link1,link2,link3,link4,link5,link6;
+
+	test.Start(_L("Add"));
+	que=new T();
+	que->Add(link2,3);
+	test(*(que->sFirstDelta)==&link2.iDelta);
+	test(link2.iDelta==3);
+	que->Add(link5,15);
+	test(*(que->sFirstDelta)==&link2.iDelta);
+	test(link2.iDelta==3);
+	test(link5.iDelta==12);
+	que->Add(link3,6);
+	test(*(que->sFirstDelta)==&link2.iDelta);
+	test(link2.iDelta==3);
+	test(link3.iDelta==3);
+	test(link5.iDelta==9);
+	que->Add(link4,10);
+	test(*(que->sFirstDelta)==&link2.iDelta);
+	test(link2.iDelta==3);
+	test(link3.iDelta==3);
+	test(link4.iDelta==4);
+	test(link5.iDelta==5);
+	que->Add(link1,1);
+	test(*(que->sFirstDelta)==&link1.iDelta);
+	test(link1.iDelta==1);
+	test(link2.iDelta==2);
+	test(link3.iDelta==3);
+	test(link4.iDelta==4);
+	test(link5.iDelta==5);
+	que->Add(link6,21);
+	test(*(que->sFirstDelta)==&link1.iDelta);
+	test(link1.iDelta==1);
+	test(link2.iDelta==2);
+	test(link3.iDelta==3);
+	test(link4.iDelta==4);
+	test(link5.iDelta==5);
+	test(link6.iDelta==6);
+	test.Next(_L("Remove"));
+	que->Remove(link6);
+	test(*(que->sFirstDelta)==&link1.iDelta);
+	test(link1.iDelta==1);
+	test(link2.iDelta==2);
+	test(link3.iDelta==3);
+	test(link4.iDelta==4);
+	test(link5.iDelta==5);
+ 	que->Remove(link1);
+	test(*(que->sFirstDelta)==&link2.iDelta);
+	test(link2.iDelta==3);
+	test(link3.iDelta==3);
+	test(link4.iDelta==4);
+	test(link5.iDelta==5);
+	que->Remove(link4);
+	test(*(que->sFirstDelta)==&link2.iDelta);
+	test(link2.iDelta==3);
+	test(link3.iDelta==3);
+	test(link5.iDelta==9);
+	que->Remove(link3);
+	test(*(que->sFirstDelta)==&link2.iDelta);
+	test(link2.iDelta==3);
+	test(link5.iDelta==12);
+	que->Remove(link5);
+	test(*(que->sFirstDelta)==&link2.iDelta);
+	test(link2.iDelta==3);
+	test.Next(_L("RemoveFirst"));
+	test(NULL==que->RemoveFirst());
+	test(*(que->sFirstDelta)==&link2.iDelta);
+	test(link2.iDelta==3);
+	link2.iDelta=1;
+	test(NULL==que->RemoveFirst());
+	test(*(que->sFirstDelta)==&link2.iDelta);
+	test(link2.iDelta==1);
+	link2.iDelta=0;
+	test(&link2==que->RemoveFirst());
+	test.Next(_L("Finished"));
+	delete que;
+	test.End();
+	}
+
+class VDblQueIterBase : public TDblQueIterBase
+	{
+public:
+	VDblQueIterBase(TDblQueBase& aQue);
+	inline TAny* sDoPostInc() {return DoPostInc();}
+	inline TAny* sDoPostDec() {return DoPostDec();}
+	inline TAny* sDoCurrent() {return DoCurrent();}
+	TInt* sOffset;
+	TDblQueLinkBase** sHead;
+	TDblQueLinkBase** sNext;
+private:
+	void SetMember();
+	};
+
+template <class T>
+class VDblQueIter : public TDblQueIter<T>
+	{
+public:
+	VDblQueIter(TDblQueBase& aQue);
+	inline TAny* sDoPostInc() {return this->DoPostInc();}
+	inline TAny* sDoPostDec() {return this->DoPostDec();}
+	inline TAny* sDoCurrent() {return this->DoCurrent();}
+	TInt* sOffset;
+	TDblQueLinkBase** sHead;
+	TDblQueLinkBase** sNext;
+private:
+	void SetMember();
+	};
+
+VDblQueIterBase::VDblQueIterBase(TDblQueBase& aQue)
+	:TDblQueIterBase(aQue)
+	{
+	SetMember();
+	}
+
+void VDblQueIterBase::SetMember()
+	{
+	sOffset=&iOffset;
+	sHead=&iHead;
+	sNext=&iNext;
+	}
+
+template <class T>
+VDblQueIter<T>::VDblQueIter(TDblQueBase& aQue)
+	:TDblQueIter<T>(aQue)
+	{
+	SetMember();
+	}
+
+template <class T>
+void VDblQueIter<T>::SetMember()
+	{
+	sOffset=&this->iOffset;
+	sHead=&this->iHead;
+	sNext=&this->iNext;
+	}
+	
+template<class T>
+class TestTQueIter
+	{
+public:
+	void TestIterBase();
+	void TestQueIter();
+	void Test1();	//All functions			//TDblQueIterBase
+	void Test2();	//Constructors
+	void Test3();	//Do's
+	void Test4();	//Set
+	void Test5();	//All functions			//TDblQueIter
+	void Test1Item();
+	//void Test6();	//Constructors										//Redundant
+	void Test7();	//Iterators
+private:
+	void CallTest2_4();
+	};
+
+template<class T>
+void TestTQueIter<T>::CallTest2_4()
+	{
+	test.Next(_L("Constructors"));
+	Test2();
+	test.Next(_L("Do's"));
+	Test3();
+	test.Next(_L("Sets"));
+	Test4();
+	}
+
+template<class T>
+void TestTQueIter<T>::TestIterBase()
+	{
+	test.Start(_L("All Methods"));
+	Test1();
+	CallTest2_4();
+	test.Next(_L("Finished"));
+	test.End();
+	}
+
+template<class T>
+void TestTQueIter<T>::TestQueIter()
+	{
+	test.Start(_L("All Methods"));
+	Test5();
+	CallTest2_4();
+	test.Next(_L("One item in queue"));
+	Test1Item();
+	test.Next(_L("Iterators"));
+	Test7();
+	test.Next(_L("Finished"));
+	test.End();
+	}
+
+template<class T>
+void TestTQueIter<T>::Test1()
+	{
+	Item item1,item2;
+	TDblQue<Item> que;
+	T* iter;
+
+	que.AddFirst(item2);
+	que.AddFirst(item1);
+	test.Start(_L("Constructor"));
+	iter=new VDblQueIterBase(que);
+	test.Next(_L("Do's"));
+	iter->sDoCurrent();
+	iter->sDoPostInc();
+	iter->sDoPostDec();
+	test.Next(_L("Sets"));
+	iter->SetToFirst();
+	iter->SetToLast();
+	delete iter;
+	test.Next(_L("Finished"));
+	test.End();
+	}
+
+template<class T>
+void TestTQueIter<T>::Test2()
+	{
+	Item item;
+	TDblQue<Item>* que;
+	TInt offset;
+ 	T* iter;
+
+	for(offset=0;offset<40;offset+=4)
+		{
+		que=new TDblQue<Item>(offset);
+		new(PtrAdd(&item.iLink,offset)) TDblQueLink();	// create the link at this offset
+		iter=new T(*que);
+		test(que->IsHead((Item*) PtrSub(*(iter->sHead),offset)));		//Need to pass a pointer to a item
+		test(que->IsHead((Item*) PtrSub(*(iter->sNext),offset)));
+		test(*(iter->sOffset)==offset);
+		delete iter;
+		delete que;
+		que=new TDblQue<Item>(offset);
+		new(PtrAdd(&item.iLink,offset)) TDblQueLink();	// create the link at this offset
+		que->AddFirst(item);
+		iter=new T(*que);
+		test(que->IsHead((Item*) PtrSub(*(iter->sHead),offset)));
+		test(*(iter->sNext)==PtrAdd(&item.iLink,offset));						//Need a pointer to a link
+		test(*(iter->sOffset)==offset);
+		PtrAdd(&item.iLink,offset)->Deque();
+		delete iter;
+		delete que;
+		}
+	}
+
+template<class T>
+void TestTQueIter<T>::Test3()
+	{
+	Item item1,item2,item3,item4;
+	TDblQue<Item> que;
+ 	T* iter;
+				  
+	que.AddFirst(item4);
+	que.AddFirst(item3);
+	que.AddFirst(item2);
+	que.AddFirst(item1);
+	test.Start(_L("DoPostInc"));
+	iter=new T(que);
+	test(&item1==iter->sDoPostInc());
+	test(&item2.iLink==*(iter->sNext));
+	test(&item2==iter->sDoPostInc());
+	test(&item3.iLink==*(iter->sNext));
+	test(&item3==iter->sDoPostInc());
+	test(&item4.iLink==*(iter->sNext));
+	test(&item4==iter->sDoPostInc());
+	test(que.IsHead((Item*) *(iter->sNext)));
+	test(iter->sDoPostInc()==NULL);
+	delete iter;
+	test.Next(_L("DoPostDec"));
+	iter=new T(que);
+	iter->sDoPostInc();
+	iter->sDoPostInc();
+	iter->sDoPostInc();
+	test(&item4.iLink==*(iter->sNext));
+	test(&item4==iter->sDoPostDec());
+	test(&item3.iLink==*(iter->sNext));
+	test(&item3==iter->sDoPostDec());
+	test(&item2.iLink==*(iter->sNext));
+	test(&item2==iter->sDoPostDec());
+	test(&item1.iLink==*(iter->sNext));
+	test(&item1==iter->sDoPostDec());
+	test(que.IsHead((Item*) *(iter->sNext)));
+	test(iter->sDoPostDec()==NULL);
+	delete iter;
+	test.Next(_L("DoCurrent"));
+	iter=new T(que);
+	test(&item1==iter->sDoCurrent());
+	iter->sDoPostInc();
+	test(&item2==iter->sDoCurrent());
+	iter->sDoPostInc();
+	test(&item3==iter->sDoCurrent());
+	iter->sDoPostInc();
+	test(&item4==iter->sDoCurrent());
+	iter->sDoPostInc();
+	test(iter->sDoCurrent()==NULL);
+	delete iter;
+	test.Next(_L("Finished"));
+	test.End();
+	}
+
+template<class T>
+void TestTQueIter<T>::Test4()
+	{
+	Item item1,item2,item3,item4;
+	TDblQue<Item> que;
+ 	T* iter;
+	TInt i,j;
+
+	que.AddFirst(item4);
+	que.AddFirst(item3);
+	que.AddFirst(item2);
+	que.AddFirst(item1);
+	test.Start(_L("SetToFirst"));
+	iter=new T(que);
+	for(i=0;i<5;i++)
+		{
+		for(j=0;j<i;j++)
+			iter->sDoPostInc();
+		iter->SetToFirst();
+		test(*(iter->sNext)==&item1.iLink);
+		}
+	delete iter;
+	test.Next(_L("SetToLast"));
+	iter=new T(que);
+	for(i=0;i<5;i++)
+		{
+		iter->SetToFirst();
+		for(j=0;j<i;j++)
+			iter->sDoPostInc();
+		iter->SetToLast();
+		test(*(iter->sNext)==&item4.iLink);
+		}
+	delete iter;
+	test.Next(_L("Finished"));
+	test.End();
+	}
+
+template<class T>
+void TestTQueIter<T>::Test5()
+	{
+	Item item1,item2;
+	TDblQue<Item> que;
+	T* iter;
+	Item* a;
+
+	que.AddFirst(item2);
+	que.AddFirst(item1);
+	test.Start(_L("Constructor"));
+	iter=new T(que);
+	test.Next(_L("Iterators"));
+	a=*iter;
+	test(((*iter)++)==&item1);
+	test(((*iter)--)==&item2);
+	test(((*iter)++)==&item1);
+	test(((*iter)++)==&item2);
+	test(((*iter)++)==NULL);
+	test(((*iter)++)==NULL);
+	test(((*iter)--)==NULL);
+	test(((*iter)--)==NULL);
+	iter->Set(item2);
+	test(((*iter)--)==&item2);
+	test(((*iter)++)==&item1);
+	test(((*iter)--)==&item2);
+	test(((*iter)--)==&item1);
+	test(((*iter)++)==NULL);
+	test(((*iter)++)==NULL);
+	test(((*iter)--)==NULL);
+	test(((*iter)--)==NULL);
+	delete iter;
+	test.Next(_L("Finished"));
+	test.End();
+	}
+
+template<class T>
+void TestTQueIter<T>::Test1Item()
+	{
+	Item item;
+	TDblQue<Item> que;
+	T* iter;
+
+	test.Start(_L("Constructor"));
+	iter=new T(que);
+	que.AddFirst(item);
+	iter->Set(item);	
+	test.Next(_L("Iterators"));
+	test(((*iter)++)==&item);
+	test(((*iter)++)==NULL);
+	test(((*iter)++)==NULL);
+	test(((*iter)++)==NULL);
+	test(((*iter)--)==NULL);
+	test(((*iter)--)==NULL);
+	iter->Set(item);	
+	test(((*iter)--)==&item);
+	test(((*iter)++)==NULL);
+	test(((*iter)--)==NULL);
+	test(((*iter)--)==NULL);
+	test(((*iter)--)==NULL);
+	test(((*iter)++)==NULL);
+	test(((*iter)++)==NULL);
+	delete iter;
+	test.Next(_L("Finished"));
+	test.End();
+	}
+
+/*template<class T>					//Redundant
+void TestTQueIter<T>::Test6()
+	{
+	Item item;
+	TDblQue<Item>* que;
+	TInt offset;
+ 	T* iter;
+
+	for(offset=0;offset<40;offset+=4)
+		{
+		que=new TDblQue<Item>(offset);
+		iter=new T(*que);
+		test(que->IsHead((Item*) *(iter->sHead)));
+		test(que->IsHead((Item*) *(iter->sNext)));
+		test(*(iter->sOffset)==offset);
+		delete iter;
+		delete que;
+		que=new TDblQue<Item>(offset);
+		que->AddFirst(item);
+		iter=new T(*que);
+		test(que->IsHead((Item*) *(iter->sHead)));
+		test(*(iter->sNext)==&item.iLink);
+		test(*(iter->sOffset)==offset);
+		delete iter;
+		delete que;
+		}
+	}*/
+
+template<class T>
+void TestTQueIter<T>::Test7()
+	{
+	Item item1,item2,item3,item4;
+	TDblQue<Item> que;
+ 	T* iter;
+				  
+	que.AddFirst(item4);
+	que.AddFirst(item3);
+	que.AddFirst(item2);
+	que.AddFirst(item1);
+	test.Start(_L("PostFix ++"));
+	iter=new T(que);
+	test(&item1==(*iter)++);
+	test(&item2.iLink==*(iter->sNext));
+	test(&item2==(*iter)++);
+	test(&item3.iLink==*(iter->sNext));
+	test(&item3==(*iter)++);
+	test(&item4.iLink==*(iter->sNext));
+	test(&item4==(*iter)++);
+	test(que.IsHead((Item*) *(iter->sNext)));
+	test((*iter)++==NULL);
+	delete iter;
+	test.Next(_L("PostFix --"));
+	iter=new T(que);
+	iter->SetToLast();
+	test(&item4.iLink==*(iter->sNext));
+	test(&item4==(*iter)--);
+	test(&item3.iLink==*(iter->sNext));
+	test(&item3==(*iter)--);
+	test(&item2.iLink==*(iter->sNext));
+	test(&item2==(*iter)--);
+	test(&item1.iLink==*(iter->sNext));
+	test(&item1==(*iter)--);
+	test(que.IsHead((Item*) *(iter->sNext)));
+	test((*iter)--==NULL);
+	delete iter;
+	test.Next(_L("Conversion Operator"));
+	iter=new T(que);
+	test(&item1==*iter);
+	(*iter)++;
+	test(&item2==*iter);
+	(*iter)++;
+	test(&item3==*iter);
+	(*iter)++;
+	test(&item4==*iter);
+	(*iter)++;
+	test(*iter==NULL);
+	delete iter;
+	test.Next(_L("Finished"));
+	test.End();
+	}
+	
+GLDEF_C TInt E32Main()
+    {
+
+	TestTQueLink<TDblQueLinkBase>* testDblQueLinkBase;
+	TestTQueLink<TDeltaQueLink>* testDeltaQueLink;
+	TestTQueLink<TDblQueLink>* testDblQueLink;
+	TestTQueLink<TPriQueLink>* testPriQueLink;
+	TestTQue<VDblQueBase>* testDblQueBase;
+	TestTQue<VDeltaQueBase>* testDeltaQueBase;
+	TestTQue<VDblQue<TDblQueLink> >* testDblQue;
+	TestTQue<VPriQue<TPriQueLink> >* testPriQue;
+ 	TestTQue<VDeltaQue<TDeltaQueLink> >* testDeltaQue;
+	TestTQueIter<VDblQueIterBase>* testDblQueIterBase;
+	TestTQueIter<VDblQueIter<Item> >* testDblQueIter;
+ 
+// Test the queue classes.
+	test.Title();
+	test.Start(_L("class TDblQueLinkBase"));
+	testDblQueLinkBase=new TestTQueLink<TDblQueLinkBase>;
+	testDblQueLinkBase->TestQueLinkBase();
+	delete testDblQueLinkBase;
+
+	test.Next(_L("class TDeltaQueLink"));
+	testDeltaQueLink=new TestTQueLink<TDeltaQueLink>;
+	testDeltaQueLink->TestQueLinkBase();
+	delete testDeltaQueLink;
+
+  	test.Next(_L("class TDblQueLink"));
+	testDblQueLink=new TestTQueLink<TDblQueLink>;
+	testDblQueLink->TestQueLink();
+	delete testDblQueLink;
+
+  	test.Next(_L("class TPriQueLink"));
+	testPriQueLink=new TestTQueLink<TPriQueLink>;
+	testPriQueLink->TestQueLink();
+ 	delete testPriQueLink;
+
+	test.Next(_L("class TDblQueBase"));
+	testDblQueBase=new TestTQue<VDblQueBase>;
+	testDblQueBase->TestQueBase();
+ 	delete testDblQueBase;
+
+	test.Next(_L("class TDeltaQueBase"));
+	testDeltaQueBase=new TestTQue<VDeltaQueBase>;
+	testDeltaQueBase->TestDeltaBase();
+ 	delete testDeltaQueBase;
+
+	test.Next(_L("class TDlbQue"));
+	testDblQue=new TestTQue<VDblQue<TDblQueLink> >;
+	testDblQue->TestDblQue();
+ 	delete testDblQue;
+
+	test.Next(_L("class TPriQue"));
+	testPriQue=new TestTQue<VPriQue<TPriQueLink> >;
+	testPriQue->TestPriQue();
+ 	delete testPriQue;
+ 
+	test.Next(_L("class TDeltaQue"));
+	testDeltaQue=new TestTQue<VDeltaQue<TDeltaQueLink> >;
+	testDeltaQue->TestDeltaQue();
+ 	delete testDeltaQue;
+
+	test.Next(_L("class TDblQueIterBase"));
+	testDblQueIterBase=new TestTQueIter<VDblQueIterBase>;
+	testDblQueIterBase->TestIterBase();
+ 	delete testDblQueIterBase;
+
+	test.Next(_L("class TDblQueIter"));
+	testDblQueIter=new TestTQueIter<VDblQueIter<Item> >;
+	testDblQueIter->TestQueIter();
+ 	delete testDblQueIter;
+
+	test.Next(_L("Finished"));
+	test.End();
+	return(0);
+    }
+
+#pragma warning(default : 4710) //fuction not expanded
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32test/buffer/t_rbuf.cpp	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,567 @@
+// Copyright (c) 2004-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32test\buffer\t_rbuf.cpp
+// Overview:
+// Test methods of the RBuf16, RBuf8, RBuf template class.
+// API Information:
+// RBuf16, RBuf8, RBuf.
+// Details:
+// For RBuf8, RBuf16 and RBuf objects:
+// - Test the Create and CreateMax methods by verifying the return value of
+// KErrNone, the initial length and max length. Perform basic write and read
+// operations and verify the results.
+// - Test the CreateL and CreateMaxL methods by verifying the return value of 
+// KErrNone. Also force a heap error and verify return value of KErrNoMemory.
+// - Test the Create(const TDesC_& aDesc) and Create(const TDesCX_ aDesc, 
+// TInt aMaxLength) methods by verifying the return value of KErrNone. Verify
+// initial length, max length and initialisation.
+// - Test the CreateL(const TDesC_& aDesc) and CreateMaxL(const TDesCX_ aDesc, 
+// TInt aMaxLength) methods by verifying the return value of KErrNone. Also 
+// force a heap error and verify return value of KErrNoMemory.
+// - Test the Swap method by creating two initialised objects, calling Swap 
+// and confirming the results as expected.
+// - Test the Assign method by performing an assign from a variety of sources
+// and verifying the results are as expected.
+// - Test the ReAlloc method in a variety of scenarios that decrease memory, 
+// increase memory and zero-length memory. Verify that the results are as
+// expected.
+// - Test the ReAllocL by verifying the return value of KErrNone. Also force 
+// a heap error and verify return value of KErrNoMemory. Verify that the
+// object is the same as before the failed ReAllocL call.
+// - Test the CleanupClosePushL method via CleanupStack::PopAndDestroy().
+// - Force the CleanupClosePushL to leave to check cleanup of RBuf.
+// Platforms/Drives/Compatibility:
+// All 
+// Assumptions/Requirement/Pre-requisites:
+// Failures and causes:
+// Base Port information:
+// 
+//
+
+#include <e32test.h>
+#include <e32math.h>
+#include <u32std.h>
+
+LOCAL_D RTest test(_L("T_RBUF"));
+
+#undef _TS
+#define _TS(a) ((const TTEXT*)RTest::String(sizeof(TTEXT),(TText8*)a,(TText16*)L ## a)) 
+
+/**
+Tests the following methods. 
+ - TInt Create(TInt aMaxLength);
+ - TInt CreateMax(TInt aMaxLength);
+*/
+template<class RBUF>	
+LOCAL_C void TestCreate(RBUF*)
+{
+	RBUF rBuf;
+	
+	test.Next(_L("Create(TInt aMaxLength) method"));
+
+	test(rBuf.Create(19)==KErrNone);	//Create RBuf as EPtr type
+	test(rBuf.Length()==0);
+	test(rBuf.MaxLength()==19);
+	rBuf.SetLength(2);
+	rBuf[1] = 1;						//Try basic write & ...
+	test(rBuf[1] == 1);					//... read 
+	rBuf.Close();
+
+	test(rBuf.Create(0)==KErrNone);		//Create zero length RBuf as EPtr type
+	test(rBuf.Length()==0);
+	test(rBuf.MaxLength()==0);
+	rBuf.Close();
+	
+	test.Next(_L("CreateMax(TInt aMaxLength) method"));
+	
+	test(rBuf.CreateMax(20)==KErrNone);	//Create RBuf as EPtr type
+	test(rBuf.Length()==20);
+	test(rBuf.MaxLength()==20);
+	rBuf[1] = 1;
+	test(rBuf[1] == 1);
+	rBuf.Close();
+}
+
+/**
+Tests the following methods. 
+ - void CreateL(TInt aMaxLength);
+ - void CreateMaxL(TInt aMaxLength);
+*/
+template<class RBUF>
+LOCAL_C void TestCreateLeaving(RBUF*)
+{
+	RBUF rBuf;
+
+	test.Next(_L("CreateL(TInt aMaxLength) method"));
+
+	TRAPD(ret, rBuf.CreateL(20));	//Create RBuf as EPtr type
+	test(KErrNone == ret);
+	rBuf.Close();
+
+#if defined(_DEBUG)
+	__UHEAP_FAILNEXT(1);			//Set the next alloc to fail
+	TRAP(ret, rBuf.CreateL(10));	
+	test(KErrNoMemory == ret);		// It fails due to __UHEAP_FAILNEXT(1);
+#endif //_DEBUG
+
+	test.Next(_L("CreateMaxL(TInt aMaxLength) method"));
+
+	TRAP(ret, rBuf.CreateMaxL(20));	//Create RBuf as EPtr type
+	test(KErrNone == ret);
+	rBuf.Close();
+
+#if defined(_DEBUG)
+	__UHEAP_FAILNEXT(1);			//Set the next alloc to fail
+	TRAP(ret, rBuf.CreateMaxL(10));	
+	test(KErrNoMemory == ret);		// It fails due to __UHEAP_FAILNEXT(1);
+#endif //_DEBUG
+}
+
+/**
+Tests the following methods. 
+ - TInt Create(const TDesC_& aDesc);
+ - TInt Create(const TDesC_& aDesc, TInt aMaxLength));
+*/
+template<class RBUF, class TBUF, class TTEXT>	
+LOCAL_C void TestCreateFromDes(RBUF*)
+{
+	RBUF rBuf;
+	TBUF des (_TS("012345"));
+
+	test.Next(_L("Create(const TDesC_& aDesc) method"));
+
+	test(rBuf.Create(des)==KErrNone);					//Create RBuf as EPtr type
+	test(rBuf == des);
+	rBuf.Close();
+
+	test.Next(_L("Create(const TDesCX_ aDesc, TInt aMaxLength) method"));
+
+	test(rBuf.Create(des, des.Length())==KErrNone);		//Create RBuf as EPtr type
+	test(rBuf==des);
+	rBuf.Close();
+
+	test(rBuf.Create(des, des.Length()-2)==KErrNone);	//Create RBuf as EPtr type
+	test(rBuf.Length()==4);
+	test(rBuf.MaxLength()==4);
+	test(rBuf[0] == (TTEXT)('0'));
+	test(rBuf[3] == (TTEXT)('3'));
+	test(rBuf<des);
+	rBuf.Close();
+
+	test(rBuf.Create(des, des.Length()+2)==KErrNone);	//Create RBuf as EPtr type
+	test(rBuf.Length()==6);
+	test(rBuf.MaxLength()==8);
+	test(rBuf==des);
+	rBuf.Close();
+}
+
+/**
+Tests the following methods. 
+ - void CreateL(const TDesC_& aDesc);
+ - void CreateMaxL(const TDesC_& aDesc, TInt aMaxLength);
+*/
+template<class RBUF, class TBUF, class TTEXT>
+LOCAL_C void TestCreateFromDesLeaving(RBUF*)
+{
+	RBUF rBuf;
+	TBUF des (_TS("123456"));
+
+	test.Next(_L("CreateL(const TDesC_& aDesc) method"));
+
+	TRAPD(ret, rBuf.CreateL(des));				//Create RBuf as EPtr type
+	test(KErrNone == ret);
+	rBuf.Close();
+
+#if defined(_DEBUG)
+	__UHEAP_FAILNEXT(1);						//Set the next alloc to fail
+	TRAP(ret, rBuf.CreateL(des));	
+	test(KErrNoMemory == ret);					// This will fail due to __UHEAP_FAILNEXT(1);
+#endif //(_DEBUG)
+
+	test.Next(_L("CreateL(const TDesC_& aDesc, TInt aMaxLength) method"));
+
+	TRAP(ret, rBuf.CreateL(des, des.Length()));	//Create RBuf as EPtr type
+	test(KErrNone == ret);
+	rBuf.Close();
+
+#if defined(_DEBUG)
+	__UHEAP_FAILNEXT(1);						//Set the next alloc to fail
+	TRAP(ret, rBuf.CreateL(des, des.Length()));	
+	test(KErrNoMemory == ret);					// It fails due to __UHEAP_FAILNEXT(1);
+#endif //(_DEBUG)
+}
+
+/**
+Tests the following methods:
+ - TInt Assign(const RBuf_& rBuf);
+ - TInt Assign(TUint* aHeapCell, TInt aMaxLength);
+ - TInt Assign(TUint* aHeapCell, TInt aLength, TInt aMaxLength);
+ - TInt Assign(HBufC& aHBuf);
+ - RBuf(HBufC_&) constructor.
+*/
+template<class RBUF, class TBUF, class TTEXT, class HBUF>	
+LOCAL_C void TestAssign(RBUF*)
+{
+	RBUF rBuf;
+	TBUF des (_TS("123456"));
+	RBUF rBuf2;
+
+	test.Next(_L("Assign(const RBuf_& aRBuf) method"));
+
+	rBuf2.Create(des);
+	rBuf.Assign(rBuf2);
+	test(rBuf==rBuf2);
+	rBuf.Close();
+	
+	test.Next(_L("Assign(TUint* aHeapCell, TInt aLength, TInt aMaxLength ) method"));
+
+	TTEXT* heap = (TTEXT*)User::Alloc(24*(TInt)sizeof(TTEXT)); //Allocate 48 bytes for 24 long RBuf16
+	rBuf.Assign(heap, 12,24);
+	test(rBuf.Length() == 12);		
+	test(rBuf.MaxLength() == 24);		
+	rBuf.Close();
+
+	heap = NULL;
+	rBuf.Assign(heap, 0,0);
+	test(rBuf.Length() == 0);		
+	test(rBuf.MaxLength() == 0);		
+	rBuf.Close();
+	
+	test.Next(_L("Assign(TUint* aHeapCell, TInt aMaxLength ) method"));
+	
+	heap = (TTEXT*)User::Alloc(24*(TInt)sizeof(TTEXT)); //Allocate 48 bytes for 24 long RBuf16
+	rBuf.Assign(heap, 24);
+	test(rBuf.Length() == 0);		
+	test(rBuf.MaxLength() == 24);		
+	rBuf.Close();
+
+	test.Next(_L("Assign(HBufC_* aHBuf) method"));
+
+	HBUF* hBuf = HBUF::NewMax(11);
+	rBuf.Assign(hBuf);			//Create RBuf as EBufCPtr type
+	test(rBuf.Length() == 11);
+	test(rBuf.MaxLength() >= 11); //There could me more allocated memory - see HBufC8::Des()
+	rBuf.Close();
+
+	test.Next(_L("RBuf_(HBufC_* aHBuf) constructor"));
+
+	hBuf = HBUF::NewMax(12);	//Create RBuf as EBufCPtr
+	RBUF rBuf3(hBuf);
+	test(rBuf3.Length() == 12);
+	test(rBuf3.MaxLength() >= 12);
+	rBuf3.Close();
+
+	hBuf = HBUF::NewMax(0);
+	RBUF rBuf4(hBuf);			//The length of aHBuf is zero
+	test(rBuf4.Length() == 0);
+	rBuf4.Close();
+
+	hBuf = NULL;				//aHBuf is NULL
+	RBUF rBuf5(hBuf);
+	test(rBuf5.Length() == 0);
+	test(rBuf5.MaxLength() == 0);
+	rBuf5.Close();
+}
+
+/**
+Tests the following methods. 
+ - TInt ReAlloc(TInt aMaxLength);
+*/
+template<class RBUF, class TBUF, class TTEXT, class HBUF>	
+LOCAL_C void TestReAlloc(RBUF*)
+{
+	RBUF rBuf;
+
+	TBUF des (_TS("0123456"));
+
+
+	test.Next(_L("ReAlloc(TInt aMaxLength) method"));
+
+	//reallocate EPtr type - decrease memory
+	test(rBuf.Create(des)==KErrNone);					//Create as EPtr
+	rBuf.SetLength(3);
+	test(rBuf.ReAlloc(3)==KErrNone);					//ReAlloc to EPtr
+	test(rBuf.MaxLength()>=3);
+	test(rBuf.Length()==3);
+	test(rBuf[0] == (TTEXT)('0'));
+	test(rBuf[2] == (TTEXT)('2'));
+	rBuf.Close();
+
+	//reallocate EPtr type - increase memory
+	test(rBuf.Create(des,des.MaxLength())==KErrNone);	//Create as EPtr
+	test(rBuf.ReAlloc(15)==KErrNone);					//ReAlloc to EPtr
+	test(rBuf.MaxLength()==15);
+	test(rBuf.Length()==7);
+	test(rBuf[0] == (TTEXT)('0'));
+	test(rBuf[6] == (TTEXT)('6'));
+	rBuf.Close();
+
+
+	//reallocate EBufCPtr type - decrease memory
+	HBUF* hBuf = HBUF::NewMax(9);
+	*hBuf = _TS("012345678");
+	rBuf.Assign(hBuf);						//Create as EBufCPtr
+	rBuf.SetLength(5);
+	test(rBuf.ReAlloc(5)==KErrNone);		//ReAlloc to EBufCPtr
+	test(rBuf.MaxLength()>=5);//There could be more allocated memory - see HBufC8::Des()
+	test(rBuf.Length()==5);
+	test(rBuf[0] == (TTEXT)('0'));
+	test(rBuf[4] == (TTEXT)('4'));
+	rBuf.Close();
+
+	//reallocate EBufCPtr type - increase memory
+	hBuf = HBUF::NewMax(9);
+	*hBuf = _TS("012345678");
+	rBuf.Assign(hBuf);						//Create as EBufCPtr
+	test(rBuf.ReAlloc(15)==KErrNone);		//ReAlloc to EBufCPtr
+	test(rBuf.MaxLength()>=15);//There could be more allocated memory - see HBufC8::Des()
+	test(rBuf.Length()==9);
+	test(rBuf[0] == (TTEXT)('0'));
+	test(rBuf[8] == (TTEXT)('8'));
+	rBuf.Close();
+
+	//reallocate EPtr type - to zero-length
+	test(rBuf.Create(des)==KErrNone);		//Create as EPtr
+	rBuf.SetLength(0);
+	test(rBuf.ReAlloc(0)==KErrNone);		//ReAlloc to EPtr
+	test(rBuf.MaxLength()==0);
+	test(rBuf.Length()==0);
+	rBuf.Close();
+
+	//reallocate EBufCPtr type to zero-length
+	hBuf = HBUF::NewMax(9);
+	*hBuf = _TS("012345678");
+	rBuf.Assign(hBuf);						//Create as EBufCPtr
+	rBuf.SetLength(0);
+	test(rBuf.ReAlloc(0)==KErrNone);		//ReAlloc to EPtr
+	test(rBuf.MaxLength()==0);
+	test(rBuf.Length()==0);
+	rBuf.Close();
+
+	//reallocate from zero-length
+	rBuf.Create(0);							//Create as EPtr
+	test(rBuf.ReAlloc(9)==KErrNone);		//ReAlloc to EPtr
+	test(rBuf.MaxLength()==9);
+	test(rBuf.Length()==0);
+	rBuf.Close();
+
+	//reallocate from zero-length EBufCPtr to EPtr
+	struct dummy // make it look like RBuf16
+		{
+		TInt iLength;
+		TInt iMaxLength;
+		HBUF* iEBufCPtrType;	//Pointer to buffer data
+		};
+
+	// reference rBuf as our dummy.. 
+	dummy &drBuf = (dummy&) rBuf;
+	rBuf.Assign(HBUF::NewL(0)); 			//Create as EBufCPtr
+	test(EBufCPtr == (drBuf.iLength>>KShiftDesType));
+	rBuf.Close(); 	// the actual behavior causes memory leaks, so we should close it first.
+	test(rBuf.ReAlloc(13)==KErrNone);	// ReAlloc changes it from EBufCPtr to EPtr
+	test(EPtr == (drBuf.iLength>>KShiftDesType));
+	test(rBuf.MaxLength() == 13);		
+	test(rBuf.Length() == 0);		
+	rBuf.Close();
+
+	//reallocate from zero-length to zero-length
+	rBuf.Create(0);							//Create as EPtr
+	test(rBuf.ReAlloc(0)==KErrNone);		//ReAlloc to EPtr
+	test(rBuf.Length() == 0);		
+	test(rBuf.MaxLength() == 0);		
+	rBuf.Close();
+
+}
+
+/**
+Tests the following methods. 
+ - TInt ReAllocL(TInt aMaxLength);
+*/
+template<class RBUF, class TBUF, class TTEXT>	
+LOCAL_C void TestReAllocLeaving(RBUF*)
+{
+	RBUF rBuf;
+
+	TBUF des(_TS("01"));
+
+	test.Next(_L("ReAllocL(TInt aMaxLength) method"));
+
+	test(rBuf.Create(des) ==KErrNone);
+	TRAPD(ret, rBuf.ReAllocL(6));	//ReAlloc buffer
+	test(KErrNone == ret);
+
+#if defined(_DEBUG)
+	__UHEAP_FAILNEXT(1);
+	TRAP(ret, rBuf.ReAllocL(100));	//Realloc buffer. This should fail.
+	test(KErrNoMemory == ret);
+#endif //(_DEBUG)
+
+	test(rBuf.MaxLength()==6);		//Check RBuf is the same as before ... 
+	test(rBuf.Length()==2);			//... ReAlloc that failed.
+	test(rBuf[0] == (TTEXT)('0'));
+	test(rBuf[1] == (TTEXT)('1'));
+	rBuf.Close();
+}
+
+/**
+Tests the following methods. 
+ - void Swap(RBuf_& aBuf);
+*/
+template<class RBUF, class TBUF, class TTEXT>
+LOCAL_C void TestSwap(RBUF*)
+{
+	RBUF rBuf1, rBuf2;
+	TBUF des1(_TS("12"));
+	TBUF des2 (_TS("345678"));
+
+	test.Next(_L("Swap(RBuf_& aRBuf) method"));
+
+	test(rBuf1.Create(des1) ==KErrNone);
+	test(rBuf2.Create(des2) ==KErrNone);
+
+	rBuf1.Swap(rBuf2);
+
+	test(rBuf1==des2);
+	test(rBuf2==des1);
+
+	rBuf1.Close();
+	rBuf2.Close();
+}
+
+/**
+Test assignemnt operator.
+*/
+template<class RBUF, class TBUF, class TBUFC, class TTEXT>
+LOCAL_C void TestAssignmentOperator()
+{
+	test.Next(_L("Assignment operator"));
+
+	TBUF tdes(_TS("Modifiable descriptor"));
+	TBUFC tdesc(_TS("Non-modifiable descriptor"));
+
+	RBUF rbuf, rbuf2;
+	rbuf.Create(32);
+	rbuf2.Create(32);
+	rbuf2.Copy(_TS("Buffer descriptor"), 17);
+
+	rbuf = tdesc;	test(rbuf == tdesc);
+	rbuf = tdes;		test(rbuf == tdes);
+	rbuf = rbuf2;	test(rbuf == rbuf2);
+
+	rbuf2.Close();
+	rbuf.Close();
+}
+
+/**
+Tests the following methods. 
+ - void CleanupClosePushL();
+*/
+template<class RBUF> LOCAL_C void TestCleanupClosePushL(RBUF*)
+{
+	RBUF rBuf;
+	
+	test.Next(_L("CleanupClosePushL() method"));
+	test(KErrNone == rBuf.Create(10));
+	rBuf.CleanupClosePushL();
+	CleanupStack::PopAndDestroy();
+}
+
+/**
+This function will intentionally leave to check cleanup of RBuf.
+To be called in debug build only. Otherwise will panic.
+*/
+template<class RBUF> LOCAL_C void TestRBufCleanupL(RBUF*)
+{
+	RBUF rBuf;
+
+	test.Next(_L("Test cleanup of RBuf"));
+	test(KErrNone == rBuf.Create(10));
+	rBuf.CleanupClosePushL();
+
+	__UHEAP_FAILNEXT(1);
+	TInt* ptr = (TInt*)User::AllocL(20); //This should leave
+	*ptr = 0; //Avoid compiler warning
+	User::Panic(_L("Should not reach this line"),0);
+}
+
+GLDEF_C TInt E32Main()
+    {
+	RBuf8* r8=0;
+	RBuf16* r16=0;
+	RBuf* r=0;
+
+	CTrapCleanup* trapHandler=CTrapCleanup::New();
+	test(trapHandler!=NULL);
+
+	test.Title();
+	test.Start(_L("Testing RBuf8, RBuf16 & RBuf classes"));
+
+	__UHEAP_MARK;
+
+	test.Start(_L("Testing class RBuf8 ..."));
+	TestCreate<RBuf8>(r8);
+	TestCreateLeaving<RBuf8>(r8);
+	TestCreateFromDes<RBuf8,TBuf8<11>,TText8>(r8);
+	TestCreateFromDesLeaving<RBuf8,TBuf8<11>,TText8>(r8);
+	TestSwap<RBuf8,TBuf8<11>,TText8>(r8);
+	TestAssign<RBuf8,TBuf8<11>,TText8,HBufC8>(r8);
+	TestReAlloc<RBuf8,TBuf8<11>,TText8,HBufC8>(r8);
+	TestReAllocLeaving<RBuf8,TBuf8<11>,TText8>(r8);
+	TestAssignmentOperator<RBuf8,TBuf8<32>,TBufC8<32>,TText8>();
+	TRAPD(ret,TestCleanupClosePushL<RBuf8>(r8)); test(ret==KErrNone);
+#if defined(_DEBUG)
+	TRAP(ret, TestRBufCleanupL<RBuf8>(r8)); test(KErrNoMemory == ret);
+#endif //(_DEBUG)
+	test.End();
+
+	test.Start(_L("Testing class RBuf16 ..."));
+	TestCreate<RBuf16>(r16);
+	TestCreateLeaving<RBuf16>(r16);
+	TestCreateFromDes<RBuf16,TBuf16<11>,TText16>(r16);
+	TestCreateFromDesLeaving<RBuf16,TBuf16<11>,TText16>(r16);
+	TestSwap<RBuf16,TBuf16<11>,TText16>(r16);
+	TestAssign<RBuf16,TBuf16<11>,TText16,HBufC16>(r16);
+	TestReAlloc<RBuf16,TBuf16<11>,TText16,HBufC16>(r16);
+	TestReAllocLeaving<RBuf16,TBuf16<11>,TText16>(r16);
+	TestAssignmentOperator<RBuf16,TBuf16<32>,TBufC16<32>,TText16>();
+	TRAP(ret,TestCleanupClosePushL<RBuf16>(r16)); test(ret==KErrNone);
+#if defined(_DEBUG)
+	TRAP(ret, TestRBufCleanupL<RBuf16>(r16)); test(KErrNoMemory == ret);
+#endif //(_DEBUG)
+	test.End();
+
+	test.Start(_L("Testing class RBuf ..."));
+	TestCreate<RBuf>(r);
+	TestCreateLeaving<RBuf>(r);
+	TestCreateFromDes<RBuf,TBuf<11>,TText>(r);
+	TestCreateFromDesLeaving<RBuf,TBuf<11>,TText>(r);
+	TestSwap<RBuf,TBuf<11>,TText>(r);
+	TestAssign<RBuf,TBuf<11>,TText,HBufC>(r);
+	TestReAlloc<RBuf,TBuf<11>,TText,HBufC>(r);
+	TestReAllocLeaving<RBuf,TBuf<11>,TText>(r);
+	TestAssignmentOperator<RBuf,TBuf<32>,TBufC<32>,TText>();
+	TRAP(ret,TestCleanupClosePushL<RBuf>(r)); test(ret==KErrNone);
+#if defined(_DEBUG)
+	TRAP(ret, TestRBufCleanupL<RBuf>(r)); test(KErrNoMemory == ret);
+#endif //(_DEBUG)
+	test.End();
+
+	__UHEAP_MARKEND;
+
+	test.End();
+
+	delete trapHandler;
+	return(KErrNone);
+    }
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32test/buffer/t_readar.cpp	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,181 @@
+// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32test\buffer\t_readar.cpp
+// Overview:
+// Test the CArrayFixFlat, CArrayPakFlat, CArrayVarFlat classes.
+// API Information:
+// CArrayFixFlat, CArrayPakFlat, CArrayVarFlat.
+// Details:
+// - Create an array of fixed length objects contained within a flat 
+// dynamic buffer, append some elements onto the end of the array, 
+// sort the array into key sequence, check the number of elements 
+// in the array is as expected and read all of elements. Check 
+// whether the heap has been corrupted.
+// - Create an array of variable length objects implemented using a 
+// flat dynamic buffer, append some elements onto the end of the 
+// array, sort the array into key sequence, check the number of elements 
+// in the array is as expected and read all of elements. Check whether 
+// the heap has been corrupted.
+// - Create an array of variable length objects packed into a flat buffer, 
+// append some elements onto the end of the array, sort the array into 
+// key sequence and check the number of elements held in the array is 
+// as expected. Read all array elements. Check whether the heap has been 
+// corrupted.
+// - Check whether the heap has been corrupted by any of the tests.
+// Platforms/Drives/Compatibility:
+// All 
+// Assumptions/Requirement/Pre-requisites:
+// Failures and causes:
+// Base Port information:
+// 
+//
+
+#include <e32test.h>
+
+const TInt KMaxStrings=3;
+
+LOCAL_D RTest test(_L("T_READAR"));
+LOCAL_D const TPtrC s1(_L("ZZZZ"));
+LOCAL_D const TPtrC s2(_L("AAAA"));
+LOCAL_D const TPtrC s3(_L("MMMM"));
+LOCAL_D const TPtrC* str[KMaxStrings] = {&s1,&s2,&s3};
+LOCAL_D const TPtrC* strSorted[KMaxStrings] = {&s2,&s3,&s1};
+
+LOCAL_C void testReadAny(const TArray<TBufC<0x20> > anArray)
+//
+// Test with fixed length arrays.
+//
+	{
+
+	test(anArray.Count()==KMaxStrings);
+	for (TInt i=0;i<KMaxStrings;i++)
+		test(anArray[i]==(*strSorted[i]));
+	}
+
+LOCAL_C void testFixL()
+//
+// Test with fixed length arrays.
+//
+	{
+
+	__UHEAP_MARK;
+//
+	test.Start(_L("Creating Fix array"));
+	CArrayFixFlat<TBufC<0x20> >* pFix=new(ELeave) CArrayFixFlat<TBufC<0x20> >(1);
+	for (TInt i=0;i<KMaxStrings;i++)
+		{
+		TBufC<0x20> b=(*str[i]);
+		pFix->AppendL(b);
+		}
+//
+	test.Next(_L("Sorting Fix array"));
+    TKeyArrayFix array(0,ECmpNormal);
+	pFix->Sort(array);
+//
+	test.Next(_L("Reading Fix array"));
+	testReadAny(pFix->Array());
+//
+	test.Next(_L("Destroying Fix array"));
+	delete pFix;
+	__UHEAP_MARKEND;
+//
+	test.End();
+	}
+
+LOCAL_C void testVarL()
+//
+// Test with variable length arrays.
+//
+	{
+
+	__UHEAP_MARK;
+//
+	test.Start(_L("Creating Var array"));
+	CArrayVarFlat<TBufC<0x20> >* pVar=new(ELeave) CArrayVarFlat<TBufC<0x20> >(1);
+	for (TInt i=0;i<KMaxStrings;i++)
+		{
+		TBufC<0x20> b=(*str[i]);
+		pVar->AppendL(b,b.Size()+sizeof(TUint));
+		}
+//
+	test.Next(_L("Sorting Var array"));
+    TKeyArrayVar array(0,ECmpNormal);
+	pVar->Sort(array);
+//
+	test.Next(_L("Reading Var array"));
+	testReadAny(pVar->Array());
+//
+	test.Next(_L("Destroying Var array"));
+	delete pVar;
+	__UHEAP_MARKEND;
+//
+	test.End();
+	}
+
+LOCAL_C void testPakL()
+//
+// Test with variable length packed arrays.
+//
+	{
+
+	__UHEAP_MARK;
+//
+	test.Start(_L("Creating Pak array"));
+	CArrayPakFlat<TBufC<0x20> >* pPak=new(ELeave) CArrayPakFlat<TBufC<0x20> >(1);
+	for (TInt i=0;i<KMaxStrings;i++)
+		{
+		TBufC<0x20> b=(*str[i]);
+		pPak->AppendL(b,b.Size()+sizeof(TUint));
+		}
+//
+	test.Next(_L("Sorting Pak array"));
+    TKeyArrayVar array(0,ECmpNormal);
+	pPak->SortL(array);
+//
+	test.Next(_L("Reading Pak array"));
+	testReadAny(pPak->Array());
+//
+	test.Next(_L("Destroying Pak array"));
+	delete pPak;
+	__UHEAP_MARKEND;
+//
+	test.End();
+	}
+
+GLDEF_C TInt E32Main()
+//
+// Test the Array classes.
+//
+    {
+
+	test.Title();
+	__UHEAP_MARK;
+//
+	test.Start(_L("Testing Fix arrays"));
+	TRAPD(r,testFixL());
+	test(r==KErrNone);
+//
+	test.Next(_L("Testing Var arrays"));
+	TRAP(r,testVarL());
+	test(r==KErrNone);
+//
+	test.Next(_L("Testing Pak arrays"));
+	TRAP(r,testPakL());
+	test(r==KErrNone);
+//
+	__UHEAP_MARKEND;
+	test.End();
+	return(0);
+    }
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32test/buffer/t_regn.cpp	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,820 @@
+// Copyright (c) 1994-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32test\buffer\t_regn.cpp
+// Overview:
+// Test fixed and variable clipping regions.
+// API Information:
+// TRegionFix, RRegion .
+// Details:
+// - Construct some expandable clipping regions, add some rectangles, check the region 
+// matches the rectangles, clear the region, add some rectangles to the region and 
+// check the region matches the rectangles.
+// - Copy one region to another, using the Copy method and the copy constructor,
+// and check the region matches the rectangles.
+// - Create a some fixed clipping regions, add some rectangles, check the region
+// matches the rectangles, clear the region, add some rectangles, and check the
+// region matches the rectangles.
+// - Copy one fixed region to another, using the Copy method and the copy constructor,
+// and check the region matches the rectangles.
+// - Test TRegionFix creation and error handling using Clear, Count, AddRect, CheckError
+// and Tidy methods
+// - Test adding rectangles, via AddRect, to an RRegion object. Verify the results 
+// via the Count, BoundingRect and IsEmpty methods.
+// - Test subtracting rectangles, via SubRect, from an RRegion object. Verify the 
+// results via the Count, BoundingRect and SubRegion methods.
+// - Test subtracting regions, via AddRect and SubRegion, from an RRegion object. 
+// Verify the results via the Count, BoundingRect, Clear, Copy, and SubRect methods.
+// - Test the RRegion Tidy method. Verify the results via the Count, AddRect, 
+// BoundingRect and Clear methods.
+// - Test the RRegion CheckSpare method. Verify the results via the AddRect, Tidy,
+// Clear and SubRect methods.
+// - Test the RRegion Offset method. Verify the results via the AddRect, Move,
+// Clear, IsEmpty and RectangleList methods.
+// - Test the RRegion Intersection and Intersect methods. Verify the results via 
+// the AddRect, Count, IsEmpty and RectangleList methods.
+// - Test the RRegion Union method. Verify the results via the AddRect, Count,
+// Copy, Offset and BoundingRect methods.
+// - Test the RRegion ClipRect method. Verify the results via the AddRect, Count,
+// and BoundingRect methods.
+// - Test the RRegion and TRgionFix Contains methods. Verify the results via the 
+// AddRect method.
+// - Test the RRegion ForceError and CheckError methods. Verify the results via the 
+// AddRect, Copy, Count, SubRect, Clear and BoundingRect methods.
+// - Test the RRegion  and RRegionBuf sort method.
+// - Construct some regions with pre-allocated buffer (RRegionBuf), add some rectangles, 
+// get a pointer to the array of rectangles defining this region and check the 
+// rectangles are as expected.
+// Platforms/Drives/Compatibility:
+// All 
+// Assumptions/Requirement/Pre-requisites:
+// Failures and causes:
+// Base Port information:
+// 
+//
+
+#include <e32test.h>
+
+LOCAL_D RTest test(_L("T_REGN"));
+
+class TestRRegion
+	{
+public:
+	TestRRegion(TInt tlx, TInt tly, TInt brx, TInt bry);
+	void TestSet();
+	void TestRegionFix();
+	void TestAddRect();
+	void TestSubRect();
+	void TestSubRegion();
+	void TestTidy();
+	void TestSpare();
+	void TestOffset();
+	void TestIntersection();
+	void TestUnion();
+	void TestClipRect();
+	void TestContains();
+	void TestIntersects();
+	void TestErrors();
+	void doTestSort(RRegion &aRegion);
+	void TestSort();
+	void doTestRegionBuf(RRegion &aRegion);
+	void TestRegionBuf();
+private:
+	void DoTestSet(TRegion** rgn,TInt rgnArraySize);
+	void CheckRectRegion(const TRegion& region,const TRect& rect);
+private:
+	TRect rect[4];
+	TRect bounds;
+	TRect xrect;
+	};
+
+// Region test code
+TestRRegion::TestRRegion(TInt tlx, TInt tly, TInt brx, TInt bry)
+	{
+	rect[0]=TRect( tlx, tly, brx, bry);
+	rect[1]=TRect(-brx,-bry,-tlx,-tly);
+	rect[2]=TRect( tlx,-bry, brx,-tly);
+	rect[3]=TRect(-brx, tly,-tlx, bry);
+	bounds=TRect(-brx,-bry,brx,bry);
+	xrect=TRect(-(tlx/2+brx/2),-(tly/2+bry/2),tlx/2+brx/2,tly/2+bry/2);
+	}
+
+void TestRRegion::CheckRectRegion(const TRegion& region,const TRect& rect)
+// Check the region matches the rectangle
+	{
+	const TRect* rlist;
+
+	if (rect.IsEmpty())
+		test(region.Count()==0);
+	else
+		{
+		test(region.Count()==1);
+		rlist=region.RectangleList();
+		test(rlist[0]==rect);
+		test(region[0]==rect);
+		}
+	}
+
+void TestRRegion::DoTestSet(TRegion** rgn,TInt rgnArraySize)
+	{
+	TInt index; 
+	for(index=0;index<rgnArraySize;index++)
+		rgn[index]->AddRect(rect[index]);
+	for(index=0;index<rgnArraySize;index++)
+		CheckRectRegion(*rgn[index],rect[index]);
+	for(index=0;index<rgnArraySize;index++)
+		{
+		rgn[index]->Clear();
+		rgn[index]->AddRect(rect[index]);
+		}
+	for(index=0;index<rgnArraySize;index++)
+		CheckRectRegion(*rgn[index],rect[index]);
+	}
+
+void TestRRegion::TestSet()
+	{
+	TUint index; 
+
+	RRegion xrgn(rect[0]);
+	CheckRectRegion(xrgn,rect[0]);
+	xrgn.Close();
+//
+	RRegion rgn[5];
+	TRegion* prgn[5]={&rgn[0],&rgn[1],&rgn[2],&rgn[3],&rgn[4]};
+	DoTestSet(&prgn[0],(sizeof(rgn)/sizeof(rgn[0])));
+	for(index=0;index<(sizeof(rgn)/sizeof(rgn[0]));index++)
+		{
+		RRegion rgn1;
+		rgn1.Copy(rgn[index]);
+		CheckRectRegion(rgn1,rect[index]);
+		RRegion rgn2(rgn[index]);
+		CheckRectRegion(rgn2,rect[index]);
+		rgn[index].Close();
+		rgn1.Close();
+		}
+//
+	TRegionFix<5> rgnf[5];
+	TRegion* prgnf[5]={&rgnf[0],&rgnf[1],&rgnf[2],&rgnf[3],&rgnf[4]};
+	DoTestSet(&prgnf[0],(sizeof(rgnf)/sizeof(rgnf[0])));
+	for(index=0;index<(sizeof(rgn)/sizeof(rgn[0]));index++)
+		{
+		TRegionFix<5> rgn1;
+		rgn1.Copy(rgnf[index]);
+		CheckRectRegion(rgn1,rect[index]);
+		TRegionFix<5> rgn2(rgnf[index]);
+		CheckRectRegion(rgn2,rect[index]);
+		}
+	}
+
+void TestRRegion::TestRegionFix()
+//
+// Test TRegionFix creation and error handling
+//
+	{
+	TRegionFix<1> rgnf(rect[0]);
+	CheckRectRegion(rgnf,rect[0]);
+	rgnf.Clear();
+	test(rgnf.Count()==0);
+	rgnf.AddRect(TRect(0,0,2,2));
+	test(rgnf.CheckError()==FALSE);
+	rgnf.AddRect(TRect(2,2,4,4));	// Should cause error, rgnf can only hold 1 rectangle
+	test(rgnf.CheckError()==TRUE && rgnf.Count()==0);
+	rgnf.Clear();
+	test(rgnf.CheckError()==FALSE && rgnf.Count()==0);
+//
+	TRegionFix<10> rgnf2;
+	TInt index;
+	for(index=0;index<10;index++)
+		{
+		rgnf2.AddRect(TRect(index*4,0,index*4+2,10));
+		test(rgnf2.Count()==(index+1));
+		TRegionFix<10> rgnf4(rgnf2);	// Test copy constructor
+		TRegionFix<10> rgnf5;
+		rgnf5=rgnf2;					// Test assignment
+		test(rgnf4.Count()==(index+1));
+		for(TInt index2=0;index2<=index;index2++)
+			test(rgnf2[index2]==rgnf4[index2] && rgnf2[index2]==rgnf5[index2]);
+		}
+	rgnf2.AddRect(TRect(-10,-10,0,0));	// Should push it over the edge
+	test(rgnf2.CheckError()==TRUE && rgnf2.Count()==0);
+//
+	TRegionFix<5> rgnf3;
+	for(index=0;index<4;index++)
+		{
+		rgnf3.AddRect(TRect(index*4,index*4,index*4+8,index*4+8));
+		if (index==3)
+			test(rgnf3.CheckError()==TRUE);
+		else
+			{			
+			rgnf3.Tidy();
+			if (index>0)
+				test(rgnf3.Count()==(index+2));
+			}
+		}
+	}
+
+void TestRRegion::TestAddRect()
+	{
+	RRegion rgn;
+	TInt index,i;
+
+	if (!rect[0].IsEmpty())
+		{
+		for(index=0;index<4;index++)
+			{
+			for(i=0;i<=index;i++)
+				rgn.AddRect(rect[index]);
+			test(rgn.Count()==(index+1));
+			}
+		test(rgn.BoundingRect()==bounds);
+		if (!xrect.IsEmpty())
+			{
+			rgn.AddRect(xrect);
+			test(rgn.Count()==7);
+			}
+		}
+	rgn.AddRect(bounds);
+	test(rgn.Count()==1);
+	rgn.Close();
+	}
+
+void TestRRegion::TestSubRect()
+	{
+	TRect rect1(-rect[0].iBr.iX,-rect[0].iBr.iY,rect[0].iBr.iX,rect[0].iBr.iY);
+	RRegion rgn;
+	RRegion subRgn;
+	RRegion rgn2;
+	TInt index;
+
+	if (!rect[0].IsEmpty())
+		{
+		rgn.AddRect(rect1);
+		for(index=0;index<4;index++)
+			rgn.SubRect(rect[index],&subRgn);
+		if (rect[0].iTl.iX==0)	// Special case region, all rects join in the middle
+			{
+			test(rgn.Count()==0);
+			test(subRgn.Count()==4);
+			}
+		else
+			{
+			test(rgn.Count()==3);
+			test(subRgn.Count()==4);
+			test(rgn.BoundingRect()==subRgn.BoundingRect());
+			rgn.SubRect(xrect);
+			test(rgn.Count()==4);
+			rgn2.Copy(rgn);
+			subRgn.Clear();
+			rgn.SubRect(rgn.BoundingRect(),&subRgn);
+			test(rgn.Count()==0);
+			rgn2.SubRegion(subRgn,&rgn);
+			test(rgn2.Count()==0);
+			subRgn.SubRegion(rgn);
+			test(subRgn.Count()==0);
+			}
+		}
+	rgn.Close();
+	rgn2.Close();
+	subRgn.Close();
+	}
+
+void TestRRegion::TestSubRegion()
+	{
+	TRect rect1(-rect[0].iBr.iX,-rect[0].iBr.iY,rect[0].iBr.iX,rect[0].iBr.iY);
+	RRegion rgn,subRgn;
+	RRegion rgn2;
+	TInt index;
+
+	if (!rect[0].IsEmpty())
+		{
+		rgn.AddRect(rect1);
+		for(index=0;index<4;index++)
+			rgn2.AddRect(rect[index]);
+		rgn.SubRegion(rgn2,&subRgn);
+		if (rect[0].iTl.iX==0)	// Special case region, all rects join in the middle
+			{
+			test(rgn.Count()==0);
+			test(subRgn.Count()==4);
+			}
+		else
+			{
+			test(rgn.Count()==3);
+			test(subRgn.Count()==4);
+			test(rgn.BoundingRect()==subRgn.BoundingRect());
+			rgn2.Clear();
+			rgn2.AddRect(xrect);
+			rgn.SubRegion(rgn2);
+			test(rgn.Count()==4);
+			rgn2.Copy(rgn);
+			subRgn.Clear();
+			rgn.SubRect(rgn.BoundingRect(),&subRgn);
+			test(rgn.Count()==0);
+			rgn2.SubRegion(subRgn,&rgn);
+			test(rgn2.Count()==0);
+			subRgn.SubRegion(rgn);
+			test(subRgn.Count()==0);
+			}
+		}
+	rgn.Close();
+	rgn2.Close();
+	subRgn.Close();
+	}
+
+void TestRRegion::TestTidy()
+	{
+	RRegion rgn;
+	TInt loop;
+	TRect const rlist[8]={	// 8 Rectangles that form a square with the centre rectangle missing
+		TRect(10,10,20,20),
+		TRect(20,10,30,20),
+		TRect(30,10,40,20),
+
+		TRect(10,20,20,30),
+		TRect(30,20,40,30),
+
+		TRect(10,30,20,40),
+		TRect(20,30,30,40),
+		TRect(30,30,40,40)};
+	TRect const rect1(rlist[0].iTl.iX,rlist[0].iTl.iY,rlist[2].iBr.iX,rlist[2].iBr.iY);
+	TRect const rect2(rlist[0].iTl.iX,rlist[0].iTl.iY,rlist[7].iBr.iX,rlist[7].iBr.iY);
+
+// Add 3 adjoining rectangles and tidy them
+	for(loop=0;loop<3;loop++)
+		rgn.AddRect(rlist[loop]);
+	test(rgn.Count()==3);
+	rgn.Tidy();
+	test(rgn.Count()==1);
+	test(rgn[0]==rect1);
+// Same again but add the adjoining rectangles in reverse order
+	rgn.Clear();
+	for(loop=2;loop>=0;loop--)
+		rgn.AddRect(rlist[loop]);
+	test(rgn.Count()==3);
+	rgn.Tidy();
+	test(rgn.Count()==1);
+	test(rgn[0]==rect1);
+// Now add 8 rectangles that should tidy down to 4
+	rgn.Clear();
+	for(loop=0;loop<8;loop++)
+		rgn.AddRect(rlist[loop]);
+	test(rgn.Count()==8);
+	rgn.Tidy();
+	test(rgn.Count()==4);
+	test(rgn.BoundingRect()==rect2);
+// ...and in reverse
+	rgn.Clear();
+	for(loop=7;loop>=0;loop--)
+		rgn.AddRect(rlist[loop]);
+	test(rgn.Count()==8);
+	rgn.Tidy();
+	test(rgn.Count()==4);
+	test(rgn.BoundingRect()==rect2);
+	rgn.Close();
+	}
+
+void TestRRegion::TestSpare()
+	{
+	TInt gran[5]={1,2,4,20,100};
+	RRegion rgn[5]={gran[0],gran[1],gran[2],gran[3],gran[4]};
+    TUint index;
+	TInt loop,spare;
+	TRect rect1(0,0,1,1);
+	TRect rect;
+
+	for(index=0;index<(sizeof(rgn)/sizeof(rgn[0]));index++)
+		{
+		test(rgn[index].CheckSpare()==0);
+		rgn[index].AddRect(rect1);
+		test(rgn[index].CheckSpare()==(gran[index]-1));
+		rgn[index].Tidy();
+		test(rgn[index].CheckSpare()==0);
+		rgn[index].Clear();
+		test(rgn[index].CheckSpare()==0);
+		}
+	for(index=0;index<(sizeof(rgn)/sizeof(rgn[0]));index++)
+		{
+		spare=0;
+		for(loop=0;loop<30;loop++)
+			{
+			rect.iTl.iX=rect.iTl.iY=loop;
+			rect.iBr.iX=rect.iBr.iY=loop+1;
+			rgn[index].AddRect(rect);
+			if (spare==0)
+				spare=gran[index];
+			spare--;
+			test(rgn[index].CheckSpare()==spare);
+			}
+		do
+			{
+			loop--;
+			rect.iTl.iX=rect.iTl.iY=loop;
+			rect.iBr.iX=rect.iBr.iY=loop+1;
+			rgn[index].SubRect(rect);
+			spare++;
+			test(rgn[index].CheckSpare()==spare);
+			} while(loop>0);
+		}
+	for(index=0;index<(sizeof(rgn)/sizeof(rgn[0]));index++)
+		rgn[index].Close();
+	}
+
+void TestRRegion::TestOffset()
+	{
+	RRegion rgn;
+	const TRect* rlist;
+	TRect r;
+	TUint index;
+
+	for(index=0;index<(sizeof(rect)/sizeof(rect[0]));index++)
+		{
+		rgn.Clear();
+		rgn.AddRect(rect[index]);
+		r=rect[index];
+		r.Move(1,1);
+		rgn.Offset(1,1);
+		if (rect[index].IsEmpty())
+			test(rgn.Count()==0);
+		else
+			{
+			test(rgn.Count()==1);
+			rlist=rgn.RectangleList();
+			test(rlist[0]==r);
+			}
+		}
+	rgn.Close();
+	}
+
+void TestRRegion::TestIntersection()
+	{
+	RRegion rgn1,rgn2,tmp_rgn;
+	const TRect* rlist;
+	TUint index;
+
+	rgn1.AddRect(xrect);
+	rgn2.Copy(rgn1);
+	if (!rgn1.IsEmpty())
+		{
+		for(index=0;index<(sizeof(rect)/sizeof(rect[0]));index++)
+			tmp_rgn.AddRect(rect[index]);
+		rgn2.Intersection(rgn1,tmp_rgn);
+		test(rgn2.Count()==4);
+		rlist=rgn2.RectangleList();
+		for(index=0;index<(TUint)rgn2.Count();index++)
+			{
+			test(rlist[index].iTl.iX==xrect.iTl.iX || rlist[index].iTl.iX==rect[0].iTl.iX);
+			test(rlist[index].iTl.iY==xrect.iTl.iY || rlist[index].iTl.iY==rect[0].iTl.iY);
+			test(rlist[index].iBr.iX==xrect.iBr.iX || rlist[index].iBr.iX==(-rect[0].iTl.iX));
+			test(rlist[index].iBr.iY==xrect.iBr.iY || rlist[index].iBr.iY==(-rect[0].iTl.iY));
+			}
+		rgn1.Intersect(tmp_rgn);
+		test(rgn1.Count()==4);
+		rlist=rgn1.RectangleList();
+		for(index=0;index<(TUint)rgn1.Count();index++)
+			{
+			test(rlist[index].iTl.iX==xrect.iTl.iX || rlist[index].iTl.iX==rect[0].iTl.iX);
+			test(rlist[index].iTl.iY==xrect.iTl.iY || rlist[index].iTl.iY==rect[0].iTl.iY);
+			test(rlist[index].iBr.iX==xrect.iBr.iX || rlist[index].iBr.iX==(-rect[0].iTl.iX));
+			test(rlist[index].iBr.iY==xrect.iBr.iY || rlist[index].iBr.iY==(-rect[0].iTl.iY));
+			}
+		}
+	rgn1.Close();
+	rgn2.Close();
+	tmp_rgn.Close();
+	}
+
+void TestRRegion::TestUnion()
+	{
+	RRegion rgn1,rgn2,tmp_rgn;
+	TRect bounds;
+	TUint index;
+
+	rgn1.AddRect(xrect);
+	if (!rgn1.IsEmpty())
+		{
+		for(index=0;index<(sizeof(rect)/sizeof(rect[0]));index++)
+			tmp_rgn.AddRect(rect[index]);
+		test(tmp_rgn.Count()==4);
+		rgn1.Union(tmp_rgn);
+		test(rgn1.Count()==7);
+		rgn2.Copy(rgn1);
+		rgn2.Offset(3,5);
+		bounds=rgn1.BoundingRect();
+		rgn1.Union(rgn2);
+		bounds.Resize(3,5);
+		test(rgn1.BoundingRect()==bounds);
+		}
+	rgn1.Close();
+	rgn2.Close();
+	tmp_rgn.Close();
+	}
+
+void TestRRegion::TestClipRect()
+	{
+	RRegion rgn1(xrect);
+	if (!rgn1.IsEmpty())
+		{
+		TUint index;
+		for(index=0;index<(sizeof(rect)/sizeof(rect[0]));index++)
+			rgn1.AddRect(rect[index]);
+		TRect clip=rgn1.BoundingRect();
+		rgn1.ClipRect(clip);
+		test(clip==rgn1.BoundingRect());
+		clip.iTl.iX>>=1;
+		clip.iTl.iY>>=1;
+		clip.iBr.iX>>=1;
+		clip.iBr.iY>>=1;
+		rgn1.ClipRect(clip);
+		test(clip==rgn1.BoundingRect());
+		clip.iTl.iX=clip.iBr.iX;
+		rgn1.ClipRect(clip);
+		test(rgn1.Count()==0);
+		}
+	rgn1.Close();
+	}
+
+void TestRRegion::TestContains()
+	{
+	RRegion rgn;
+	rgn.AddRect(TRect(10,10,20,20));
+	rgn.AddRect(TRect(10,20,50,30));
+	test(rgn.Contains(TPoint(10,10)));
+	test(rgn.Contains(TPoint(49,29)));
+	test(rgn.Contains(TPoint(15,15)));
+	test(rgn.Contains(TPoint(31,22)));
+	test(rgn.Contains(TPoint(50,30))==EFalse);
+	test(rgn.Contains(TPoint(-100,-30))==EFalse);
+	test(rgn.Contains(TPoint(200,20))==EFalse);
+	test(rgn.Contains(TPoint(15,30000))==EFalse);
+	rgn.Close();
+	TRegionFix<1> rgn2(TRect(20,20,25,25));
+	test(rgn2.Contains(TPoint(20,20)));
+	test(rgn2.Contains(TPoint(22,23)));
+ 	test(rgn2.Contains(TPoint(0,0))==EFalse);
+	test(rgn2.Contains(TPoint(25,25))==EFalse);
+	test(rgn2.Contains(TPoint(30,30))==EFalse);
+	}
+
+void TestRRegion::TestIntersects()
+	{
+	RRegion rgn;
+	rgn.AddRect(TRect(10,10,20,20));
+	rgn.AddRect(TRect(10,20,50,30));
+	test(rgn.Intersects(TRect(10,10,20,20)));
+	test(rgn.Intersects(TRect(5,5,15,15)));
+	test(rgn.Intersects(TRect(10,20,50,30)));
+	test(rgn.Intersects(TRect(10,10,20,20)));
+	test(rgn.Intersects(TRect(40,10,60,30)));
+	test(rgn.Intersects(TRect(0,0,10,10))==EFalse);
+	test(rgn.Intersects(TRect(30,10,40,20))==EFalse);
+	rgn.Close();
+	TRegionFix<1> rgn2(TRect(20,20,30,30));
+	test(rgn2.Intersects(TRect(20,20,30,30)));
+	test(rgn2.Intersects(TRect(15,25,25,35)));
+	test(rgn2.Intersects(TRect(25,15,35,25)));
+	test(rgn2.Intersects(TRect(15,15,25,25)));
+	test(rgn2.Intersects(TRect(25,25,35,35)));
+	test(rgn2.Intersects(TRect(10,20,20,30))==EFalse);
+	test(rgn2.Intersects(TRect(30,20,40,30))==EFalse);
+	test(rgn2.Intersects(TRect(20,10,30,20))==EFalse);
+	test(rgn2.Intersects(TRect(20,30,30,40))==EFalse);
+	// empty rectangles
+	test(rgn2.Intersects(TRect(30,30,20,20))==EFalse);
+	TRegionFix<1> rgn3(TRect(30,30,20,20));
+	test(rgn3.Intersects(TRect(30,30,20,20))==EFalse);
+	test(rgn3.Intersects(TRect(20,20,30,30))==EFalse);
+	}
+
+void TestRRegion::TestErrors()
+	{
+	RRegion rgnErr,rgnErr2;
+	RRegion rgn;
+	TRect rect(1,2,3,4),rect2;
+	const TRect* rList;
+	TPoint pnt;
+
+	rgnErr.ForceError();
+	rgn.AddRect(rect);
+	rgnErr.Copy(rgn);
+	test(rgnErr.CheckError()==EFalse);
+	test(rgnErr.Count()==1);
+
+	rgnErr.ForceError();
+	test(rgnErr.CheckError()==TRUE);
+	rgnErr.AddRect(rect);
+	rgnErr.AddRect(TRect(2,3,4,5));
+	test(rgnErr.CheckError()==TRUE);
+	rgnErr.SubRect(rect);
+	test(rgnErr.CheckError()==TRUE);
+	rgn.Copy(rgnErr);
+	test(rgn.CheckError()==TRUE);
+	rgnErr.Offset(1,2);
+	rgnErr.Offset(pnt);
+	test(rgnErr.CheckError()==TRUE);
+
+	rgn.Union(rgnErr);
+	test(rgn.CheckError()==TRUE);
+	rgnErr.AddRect(rect);
+	test(rgnErr.CheckError()==TRUE);
+	rgn.Clear();
+	rgn.AddRect(rect);
+	rgnErr.Union(rgn);
+	test(rgnErr.CheckError()==TRUE);
+	rgn.Clear();
+	test(rgn.CheckError()==FALSE);
+
+	rgnErr2.Clear();
+	rgnErr2.AddRect(rect);
+	rgn.Intersection(rgnErr,rgnErr2);
+	test(rgn.CheckError()==TRUE);
+	rgn.Clear();
+	rgn.Intersection(rgnErr2,rgnErr);
+	test(rgn.CheckError()==TRUE);
+	rgnErr2.ForceError();
+	rgn.Clear();
+	rgn.Intersection(rgnErr2,rgnErr);
+	test(rgn.CheckError()==TRUE);
+	rgn.Clear();
+	rgn.AddRect(rect);
+	rgn.Intersect(rgnErr);
+	test(rgn.CheckError()==TRUE);
+	rgn.Clear();
+	rgn.AddRect(rect);
+	rgnErr.Intersect(rgn);
+	test(rgnErr.CheckError()==TRUE);
+	test(rgn.CheckError()==FALSE);
+
+	test(rgnErr.IsEmpty()==FALSE);
+
+	rgn.Clear();
+	rgn.AddRect(rect);
+	rgn.SubRegion(rgnErr);
+	test(rgn.CheckError()==TRUE);
+	test(rgnErr.CheckError()==TRUE);
+
+	rgnErr.ClipRect(rect);
+	test(rgnErr.CheckError()==TRUE);
+	rgnErr.Tidy();
+	test(rgnErr.CheckError()==TRUE);
+	rect2=rgnErr.BoundingRect();
+	test(rect2.iTl.iX==0 && rect2.iBr.iY==0);
+
+	test(rgnErr.Count()==0);
+	rList=rgnErr.RectangleList();
+	rgn.Close();
+	rgnErr.Close();
+	rgnErr2.Close();
+	}
+
+void TestRRegion::doTestSort(RRegion &rgn)
+	{
+	TInt loop,loop2;
+	TRect const rlist[8]={	// 8 Rectangles that form a square with the centre rectangle missing
+		TRect(20,30,30,40),
+		TRect(20,10,30,20),
+		TRect(10,20,20,30),
+		TRect(30,20,40,30),
+		TRect(10,30,20,40),
+		TRect(30,30,40,40),
+		TRect(10,10,20,20),
+		TRect(30,10,40,20)};
+	TRect sorted[8];
+	TRect const* plist;
+	TRect tmp;
+
+// Work out wot the sorted list should be
+	for(loop=0;loop<8;loop++)
+		sorted[loop]=rlist[loop];
+	for(loop=0;loop<8;loop++)
+		{
+restart:
+		for(loop2=loop+1;loop2<8;loop2++)
+			{
+			if (sorted[loop2].iTl.iY>sorted[loop].iTl.iY)
+				continue;
+			if (sorted[loop2].iTl.iY==sorted[loop].iTl.iY && sorted[loop2].iTl.iX>sorted[loop].iTl.iX)
+				continue;
+			tmp=sorted[loop];
+			sorted[loop]=sorted[loop2];
+			sorted[loop2]=tmp;
+			goto restart;
+			}	
+		}
+	for(loop=0;loop<8;loop++)
+		rgn.AddRect(rlist[loop]);
+	rgn.Sort();
+	plist=rgn.RectangleList();
+	for(loop=0;loop<8;loop++)
+		test(plist[loop]==sorted[loop]);
+	rgn.Close();
+	}
+
+void TestRRegion::TestSort()
+	{
+	RRegion rgn;
+	doTestSort(rgn);
+	RRegionBuf<1> rgnBuf;
+	doTestSort(rgnBuf);
+	}
+
+void TestRRegion::doTestRegionBuf(RRegion &aRegion)
+	{
+	for(TInt index=0;index<8;index++)
+		{
+		aRegion.AddRect(TRect(index*2,index*2,index*2+2,index*2+2));
+		test(aRegion.Count()==(index+1));
+		const TRect *pr=aRegion.RectangleList();
+		for(TInt index2=0;index2<=index;index2++)
+			test(pr[index2]==TRect(index2*2,index2*2,index2*2+2,index2*2+2));
+		}
+	aRegion.Close();
+	}
+
+void TestRRegion::TestRegionBuf()
+	{
+	RRegionBuf<1> rgn(TRect(1,2,3,4));
+	test(rgn[0]==TRect(1,2,3,4));
+	RRegionBuf<1> rgn1;
+	doTestRegionBuf(rgn1);
+	RRegionBuf<2> rgn2;
+	doTestRegionBuf(rgn2);
+	RRegionBuf<5> rgn5;
+	doTestRegionBuf(rgn5);
+	RRegionBuf<10> rgn10;
+	doTestRegionBuf(rgn10);
+	}
+
+// Top level test code
+LOCAL_C void test_region(TestRRegion t)
+	{
+	test.Start(_L("Setting values"));
+	t.TestSet();
+	test.Next(_L("TRegionFix"));
+	t.TestRegionFix();
+	test.Next(_L("AddRect"));
+	t.TestAddRect();
+	test.Next(_L("SubRect"));
+	t.TestSubRect();
+	test.Next(_L("SubRegion"));
+	t.TestSubRegion();
+	test.Next(_L("Tidy"));
+	t.TestTidy();
+	test.Next(_L("Spare"));
+	t.TestSpare();
+	test.Next(_L("Offset"));
+	t.TestOffset();
+	test.Next(_L("Intersection"));
+	t.TestIntersection();
+	test.Next(_L("Union"));
+	t.TestUnion();
+	test.Next(_L("Clip rect"));
+	t.TestClipRect();
+	test.Next(_L("Contains"));
+	t.TestContains();
+	test.Next(_L("Intersects"));
+	t.TestIntersects();
+	test.Next(_L("Errors"));
+	t.TestErrors();
+	test.Next(_L("Sort"));
+	t.TestSort();
+	test.Next(_L("RegionBuf"));
+	t.TestRegionBuf();
+	test.End();
+	}
+
+GLDEF_C TInt E32Main()
+//
+// Main
+//
+    {
+
+	test.Title();
+	__UHEAP_MARK;
+	TestRRegion t1(10,20,30,40);
+	TestRRegion t2(0,0,1,1);
+	TestRRegion t3(1,1,1,1);
+	TestRRegion t4(1000000,2000000,3000000,4000000);
+
+	test.Start(_L("class RRegion 1"));
+	test_region(t1);
+	test.Next(_L("class RRegion 2"));
+	test_region(t2);
+	test.Next(_L("class RRegion 3"));
+	test_region(t3);
+	test.Next(_L("class RRegion 4"));
+	test_region(t4);
+	test.End();
+	__UHEAP_MARKEND;
+	return(0);
+    }
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32test/buffer/t_sque.cpp	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,1081 @@
+// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32test\buffer\t_sque.cpp
+// Overview:
+// Test single linked list functionality.
+// API Information:
+// TSglQueLink, TSglQueBase.
+// Details:
+// - Create specified number of TSglQueLink objects, then delete them. 
+// - Create TSglQueBase object with specified offset and without an offset,
+// add and remove links to the list, check that the list is empty.
+// - Create TSglQueBase object with and without an offset, verify offset, head 
+// and last member values are correct.
+// - Create TSglQueBase object, insert links using DoAddFirst and DoAddLast and
+// remove links using DoRemove, check the results are as expected.
+// - Create TSglQueBase object, insert links using DoAddFirst and DoAddLast and
+// verify IsEmpty return the correct value. Set and verify the offset.
+// - Create TSglQue object, insert TSglQueLink link at front and end of list, test 
+// whether the links are inserted at specified location, remove some links.
+// - Create TSglQue object, insert links using DoAddFirst and DoAddLast and
+// remove links using DoRemove, check the results are as expected.
+// - Create TSglQue object, insert links using DoAddFirst and DoAddLast and
+// verify IsEmpty return the correct value. Set and verify the offset.
+// - Create TSglQue object with and without an offset, verify offset, head 
+// and last member values are correct.
+// - Create TSglQue object, insert links using AddFirst and AddLast and
+// verify results are as expected.
+// - Create TSglQue object, insert links using AddFirst and AddLast and
+// verify results using IsFirst and IsLast are as expected.
+// - Create TSglQue object, insert links using AddFirst and AddLast and
+// verify results using First and Last are as expected.
+// - Create TSglQue object, insert links using AddLast and delete using Remove,
+// verify results are as expected.
+// - Create TSglQueIterBase object, with and without an offset, call the 
+// DoCurrent, DoPostInc and SetToFirst methods.
+// - Create TSglQueIterBase object, with and without an offset, and TSglQue 
+// with different offsets, verify results are as expected.
+// - Create TSglQueIterBase object, , with and without an offset, use the 
+// DoCurrent and DoPostInc methods and verify the results are as expected.
+// - Create TSglQueIterBase object, , with and without an offset, use the 
+// DoPostInc and SetToFirst methods and verify the results are as expected.
+// - Create TSglQueIter object, with and without an offset, iterate using 
+// the ++ operator and delete the object.
+// - Create TSglQueIter object, with and without an offset, and TSglQue 
+// object with different offsets, verify results are as expected.
+// - Create TSglQueIter object, with and without an offset, use the 
+// DoCurrent and DoPostInc methods and verify the results are as expected.
+// - Create TSglQueIter object, with and without an offset, use the 
+// DoPostInc and SetToFirst methods and verify the results are as expected.
+// - Create TSglQueIter object, with and without an offset, iterate using 
+// the ++ operator, use the conversion operator, verify the results are 
+// as expected.
+// Platforms/Drives/Compatibility:
+// All 
+// Assumptions/Requirement/Pre-requisites:
+// Failures and causes:
+// Base Port information:
+// 
+//
+
+#include <e32base.h>
+#include <e32test.h>
+
+LOCAL_D RTest test(_L("T_SQUE"));
+
+#define SIZE 10
+#define MAX_OFFSET 10
+
+struct Item
+	{
+	TSglQueLink iLink;
+	TInt iSpace[MAX_OFFSET]; // Reserve some space
+	};
+
+struct ItemWithOffset
+	{
+	TInt iSpace[MAX_OFFSET];
+	TSglQueLink iLink;
+	};
+
+template<class T>
+class TestTQueLink
+	{
+public:
+	void TestQueLink();	// Calls Test: 1
+	void Test1();
+protected:
+	void CreateObjects(TInt aBaseLink);
+	void DestroyObjects();
+private:
+	T* iLink[SIZE];
+	};
+
+template<class T>
+void TestTQueLink<T>::CreateObjects(TInt aBaseLink)
+	{
+	TInt i;
+
+	for (i=0;i<SIZE;i++)
+		iLink[i]=new T;
+	if (aBaseLink>=0&&aBaseLink<SIZE)
+		(iLink[aBaseLink])->iNext=iLink[aBaseLink];
+	}
+
+template<class T>
+void TestTQueLink<T>::DestroyObjects()
+	{
+	TInt i;
+
+	for (i=0;i<SIZE;i++)
+		delete iLink[i];
+	}
+
+template <class T>
+void TestTQueLink<T>::TestQueLink()
+	{
+	test.Start(_L("Test Enque"));
+	Test1();
+	test.Next(_L("Finished"));
+	test.End();
+	}
+
+template<class T>
+void TestTQueLink<T>::Test1()
+	{
+	test.Start(_L("Create objects"));
+	CreateObjects(1);
+	test.Next(_L("Destroy objects"));
+	DestroyObjects();
+	test.End();
+	}
+
+class VSglQueBase : public TSglQueBase
+	{
+public:
+	inline VSglQueBase();
+	inline VSglQueBase(TInt anOffset);
+	inline void sDoAddFirst(TAny* aPtr) {this->DoAddFirst(aPtr);}
+	inline void sDoAddLast(TAny* aPtr) {this->DoAddLast(aPtr);}
+	inline void sDoRemove(TAny* aPtr) {this->DoRemove(aPtr);}
+public:
+	TSglQueLink** sHead;
+	TSglQueLink** sLast;
+	TInt* sOffset;
+private:
+	void SetMembers();
+	};
+
+template <class T>
+class VSglQue : public TSglQue<T>
+	{
+public:
+	inline VSglQue();
+	inline VSglQue(TInt anOffset);
+	inline void sDoAddFirst(TAny* aPtr) {this->DoAddFirst(aPtr);}
+	inline void sDoAddLast(TAny* aPtr) {this->DoAddLast(aPtr);}
+	inline void sDoRemove(TAny* aPtr) {this->DoRemove(aPtr);}
+public:
+	TSglQueLink** sHead;
+	TSglQueLink** sLast;
+	TInt* sOffset;
+private:
+	void SetMembers();
+	};
+
+inline VSglQueBase::VSglQueBase()
+	{
+	SetMembers();
+	}
+
+inline VSglQueBase::VSglQueBase(TInt anOffset)
+	:TSglQueBase(anOffset)
+	{
+	SetMembers();
+	}
+
+void VSglQueBase::SetMembers()
+	{
+	sHead=&iHead;
+	sLast=&iLast;
+	sOffset=&iOffset;
+	}
+
+template <class T>
+VSglQue<T>::VSglQue()
+	{
+	SetMembers();
+	}
+
+template <class T>
+VSglQue<T>::VSglQue(TInt anOffset)
+	:TSglQue<T>(anOffset)
+	{
+	SetMembers();
+	}
+
+template <class T>
+void VSglQue<T>::SetMembers()
+	{
+	sHead=&this->iHead;
+	sLast=&this->iLast;
+	sOffset=&this->iOffset;
+	}
+
+template<class T>
+class TestTQue
+	{
+public:
+	void TestQueBase();
+	void TestSglQue();
+	void Test1();	// All functions		//TSglQueBase functions
+	void Test2();	// Constructors
+	void Test3();	// DoAdd's
+	void Test4();	// Public functions
+	void Test5();	// All functions		//TSglQue
+	//void Test6();	// Constructors
+	void Test7();	// Add's
+	void Test8();	// Is's
+	void Test9();	// Get's
+	void Test10();	// Add's
+private:
+	void CallTest3_4();	
+	};
+
+template<class T>
+void TestTQue<T>::CallTest3_4()
+	{
+	test.Next(_L("Test DoAdd's"));
+	Test3();
+	test.Next(_L("Test public functions"));
+	Test4();
+	}
+
+template<class T>
+void TestTQue<T>::TestQueBase()
+	{
+	test.Start(_L("Test all member functions (simply)"));
+	Test1();						 
+	test.Next(_L("Test Constructors"));
+	Test2();
+	CallTest3_4();
+	test.Next(_L("Finished"));
+	test.End();
+	}
+
+template<class T>
+void TestTQue<T>::TestSglQue()
+	{
+	test.Start(_L("Test all member functions (simply)"));
+	Test5();
+	test.Next(_L("Test Super Class functions"));
+	CallTest3_4();
+	test.Next(_L("Test Constructors"));
+	Test2();
+	test.Next(_L("Test Add's"));
+	Test7();
+	test.Next(_L("Test Is's"));
+	Test8();
+	test.Next(_L("Test Get's"));
+	Test9();
+	test.Next(_L("Test Remove"));
+	Test10();
+	test.Next(_L("Finished"));
+	test.End();
+	}
+
+template<class T>
+void TestTQue<T>::Test1()
+	{
+	T* que;
+	TSglQueLink link1,link2;
+	TInt offset=4;
+
+	test.Start(_L("Constructors"));
+	que=new VSglQueBase(offset);
+	delete que;
+	que=new VSglQueBase;
+	//delete que;
+	test.Next(_L("DoAdd's"));
+	que->sDoAddFirst(&link1);
+	que->sDoAddLast(&link2);
+	que->sDoRemove(&link1);
+	que->sDoRemove(&link2);
+	test.Next(_L("Public"));
+	que->IsEmpty();
+	que->SetOffset(offset);
+	test.Next(_L("Finished"));
+	delete que;
+	test.End();
+	}
+
+template<class T>
+void TestTQue<T>::Test2()
+	{
+	T* que;
+	TInt offset;
+
+	test.Start(_L("Default constructor"));
+	que=new T();
+	test(*(que->sOffset)==0);
+	test(*(que->sHead)==NULL);
+	test(*(que->sLast)==(TSglQueLink*) que->sHead);
+	delete que;
+	test.Next(_L("Offset constructor"));
+	for (offset=0;offset<40;offset+=4)
+		{
+		que=new T(offset);
+		test(*(que->sOffset)==offset);
+		test(*(que->sHead)==NULL);
+		test(*(que->sLast)==(TSglQueLink*) que->sHead);
+		delete que;
+		}
+	test.Next(_L("Finished"));
+	test.End();
+	}
+
+template<class T>
+void TestTQue<T>::Test3()
+	{
+	T* que;
+
+		{
+		TSglQueLink link1,link2,link3,link4;
+		test.Start(_L("AddFirst"));
+		que=new T();
+		test(*(que->sHead)==NULL);
+		test(*(que->sLast)==(TSglQueLink*) que->sHead);
+		que->sDoAddFirst(&link1);
+		test(*(que->sHead)==&link1);
+		test(*(que->sLast)==&link1);
+		test(link1.iNext==NULL);
+		que->sDoAddFirst(&link2);
+		test(*(que->sHead)==&link2);
+		test(*(que->sLast)==&link1);
+		test(link1.iNext==NULL);
+		test(link2.iNext==&link1);
+		que->sDoAddFirst(&link3);
+		test(*(que->sHead)==&link3);
+		test(*(que->sLast)==&link1);
+		test(link1.iNext==NULL);
+		test(link2.iNext==&link1);
+		test(link3.iNext==&link2);
+		que->sDoAddFirst(&link4);
+		test(*(que->sHead)==&link4);
+		test(*(que->sLast)==&link1);
+		test(link1.iNext==NULL);
+		test(link2.iNext==&link1);
+		test(link3.iNext==&link2);
+		test(link4.iNext==&link3);
+		delete que;
+		}
+	TSglQueLink link1,link2,link3,link4;
+	test.Next(_L("AddLast"));
+	que=new T();
+	test(*(que->sHead)==NULL);
+	test(*(que->sLast)==(TSglQueLink*) que->sHead);
+	que->sDoAddLast(&link1);
+	test(*(que->sHead)==&link1);
+	test(*(que->sLast)==&link1);
+	test(link1.iNext==NULL);
+	que->sDoAddLast(&link2);
+	test(*(que->sHead)==&link1);
+	test(*(que->sLast)==&link2);
+	test(link1.iNext==&link2);
+	test(link2.iNext==NULL);
+	que->sDoAddLast(&link3);
+	test(*(que->sHead)==&link1);
+	test(*(que->sLast)==&link3);
+	test(link1.iNext==&link2);
+	test(link2.iNext==&link3);
+	test(link3.iNext==NULL);
+	que->sDoAddLast(&link4);
+	test(*(que->sHead)==&link1);
+	test(*(que->sLast)==&link4);
+	test(link1.iNext==&link2);
+	test(link2.iNext==&link3);
+	test(link3.iNext==&link4);
+	test(link4.iNext==NULL);
+	test.Next(_L("Remove"));
+	que->sDoRemove(&link3);
+	test(*(que->sHead)==&link1);
+	test(*(que->sLast)==&link4);
+	test(link1.iNext==&link2);
+	test(link2.iNext==&link4);
+	test(link4.iNext==NULL);
+	que->sDoRemove(&link4);
+	test(*(que->sHead)==&link1);
+	test(*(que->sLast)==&link2);
+	test(link1.iNext==&link2);
+	test(link2.iNext==NULL);
+	que->sDoRemove(&link1);
+	test(*(que->sHead)==&link2);
+	test(*(que->sLast)==&link2);
+	test(link2.iNext==NULL);
+	que->sDoRemove(&link2);
+	test(*(que->sHead)==NULL);
+	test(*(que->sLast)==(TSglQueLink*) que->sHead);
+ 	delete que;
+	test.Next(_L("Finished"));
+	test.End();
+	}
+
+template<class T>
+void TestTQue<T>::Test4()
+	{
+	T* que;
+	TInt offset;
+
+	test.Start(_L("IsEmpty"));
+	que=new T();
+	test(que->IsEmpty()==TRUE);
+	TSglQueLink link1,link2;
+	que->sDoAddFirst(&link1);
+	test(que->IsEmpty()==FALSE);
+	que->sDoRemove(&link1);
+	test(que->IsEmpty()==TRUE);
+	que->sDoAddLast(&link2);
+	test(que->IsEmpty()==FALSE);
+	que->sDoAddFirst(&link1);
+	test(que->IsEmpty()==FALSE);
+	que->sDoRemove(&link2);
+	test(que->IsEmpty()==FALSE);
+	que->sDoRemove(&link1);
+	test(que->IsEmpty()==TRUE);
+	test.Next(_L("SetOffset"));
+	for (offset=0;offset<40;offset+=4)
+		{
+		que->SetOffset(offset);
+		test(*(que->sOffset)==offset);
+		}
+	test.Next(_L("Finished"));
+ 	delete que;
+	test.End();
+	}
+
+template<class T>
+void TestTQue<T>::Test5()
+	{
+	T* que;
+	TSglQueLink link1,link2;
+	TInt offset=4;
+
+	test.Start(_L("Constructors"));
+	que=new VSglQue<TSglQueLink>(offset);
+	delete que;
+	que=new VSglQue<TSglQueLink>;
+	test.Next(_L("Add's"));
+	que->AddFirst(link1);
+	que->AddLast(link2);
+	test.Next(_L("Is's"));
+	que->IsFirst(&link1);
+	que->IsLast(&link1);
+	test.Next(_L("Get's"));
+	que->First();
+	que->Last();
+	test.Next(_L("Remove"));
+	que->Remove(link1);
+	que->Remove(link2);
+	test.Next(_L("Finished"));
+	delete que;
+	test.End();
+	}
+
+/*template<class T>
+void TestTQue<T>::Test6()
+	{
+	T* que;
+	TInt offset;
+
+	test.Start(_L("Default constructor"));
+	que=new VSglQue<TSglQueBase>();
+	test(*(que->sFirstDelta)==NULL);
+	delete que;
+	test.Next(_L("Offset constructor"));
+	for (offset=0;offset<40;offset+=4)
+		{
+		que=new VDeltaQueBase(offset);
+		test(*(que->sOffset)==offset);
+		test(*(que->sFirstDelta)==NULL);
+		delete que;
+		}
+	test.Next(_L("Finished"));
+	test.End();
+	}*/
+
+template<class T>
+void TestTQue<T>::Test7()
+	{
+	T* que;
+
+		{
+		TSglQueLink link1,link2,link3,link4;
+		test.Start(_L("AddFirst"));
+		que=new T();
+		test(*(que->sHead)==NULL);
+		test(*(que->sLast)==(TSglQueLink*) que->sHead);
+		que->AddFirst(link1);
+		test(*(que->sHead)==&link1);
+		test(*(que->sLast)==&link1);
+		test(link1.iNext==NULL);
+		que->AddFirst(link2);
+		test(*(que->sHead)==&link2);
+		test(*(que->sLast)==&link1);
+		test(link1.iNext==NULL);
+		test(link2.iNext==&link1);
+		que->AddFirst(link3);
+		test(*(que->sHead)==&link3);
+		test(*(que->sLast)==&link1);
+		test(link1.iNext==NULL);
+		test(link2.iNext==&link1);
+		test(link3.iNext==&link2);
+		que->AddFirst(link4);
+		test(*(que->sHead)==&link4);
+		test(*(que->sLast)==&link1);
+		test(link1.iNext==NULL);
+		test(link2.iNext==&link1);
+		test(link3.iNext==&link2);
+		test(link4.iNext==&link3);
+		delete que;
+		}
+	TSglQueLink link1,link2,link3,link4;
+	test.Next(_L("AddLast"));
+	que=new T();
+	test.Next(_L("AddLast"));
+	que=new T();
+	test(*(que->sHead)==NULL);
+	test(*(que->sLast)==(TSglQueLink*) que->sHead);
+	que->AddLast(link1);
+	test(*(que->sHead)==&link1);
+	test(*(que->sLast)==&link1);
+	test(link1.iNext==NULL);
+	que->AddLast(link2);
+	test(*(que->sHead)==&link1);
+	test(*(que->sLast)==&link2);
+	test(link1.iNext==&link2);
+	test(link2.iNext==NULL);
+	que->AddLast(link3);
+	test(*(que->sHead)==&link1);
+	test(*(que->sLast)==&link3);
+	test(link1.iNext==&link2);
+	test(link2.iNext==&link3);
+	test(link3.iNext==NULL);
+	que->AddLast(link4);
+	test(*(que->sHead)==&link1);
+	test(*(que->sLast)==&link4);
+	test(link1.iNext==&link2);
+	test(link2.iNext==&link3);
+	test(link3.iNext==&link4);
+	test(link4.iNext==NULL);
+	delete que;
+	test.Next(_L("Finished"));
+	test.End();
+	}
+
+template<class T>
+void TestTQue<T>::Test8()
+	{
+	T* que;
+
+		{
+		TSglQueLink link1,link2,link3,link4;
+		test.Start(_L("IsFirst"));
+		que=new T();
+		test(que->IsFirst((TSglQueLink*) que->sHead)==FALSE);
+		test(que->IsFirst((TSglQueLink*) *(que->sHead))==TRUE);
+		test(que->IsFirst((TSglQueLink*) *(que->sLast))==FALSE);
+		que->AddFirst(link1);
+		test(que->IsFirst((TSglQueLink*) que->sHead)==FALSE);
+		test(que->IsFirst((TSglQueLink*) *(que->sHead))==TRUE);
+		test(que->IsFirst((TSglQueLink*) *(que->sLast))==TRUE);
+		test(que->IsFirst(&link1)==TRUE);
+		que->AddFirst(link2);
+		test(que->IsFirst((TSglQueLink*) que->sHead)==FALSE);
+		test(que->IsFirst((TSglQueLink*) *(que->sHead))==TRUE);
+		test(que->IsFirst((TSglQueLink*) *(que->sLast))==FALSE);
+		test(que->IsFirst(&link1)==FALSE);
+		test(que->IsFirst(&link2)==TRUE);
+		que->AddFirst(link3);
+		test(que->IsFirst((TSglQueLink*) que->sHead)==FALSE);
+		test(que->IsFirst((TSglQueLink*) *(que->sHead))==TRUE);
+		test(que->IsFirst((TSglQueLink*) *(que->sLast))==FALSE);
+		test(que->IsFirst(&link1)==FALSE);
+		test(que->IsFirst(&link2)==FALSE);
+		test(que->IsFirst(&link3)==TRUE);
+		que->AddFirst(link4);
+		test(que->IsFirst((TSglQueLink*) que->sHead)==FALSE);
+		test(que->IsFirst((TSglQueLink*) *(que->sHead))==TRUE);
+		test(que->IsFirst((TSglQueLink*) *(que->sLast))==FALSE);
+		test(que->IsFirst(&link1)==FALSE);
+		test(que->IsFirst(&link2)==FALSE);
+		test(que->IsFirst(&link3)==FALSE);
+		test(que->IsFirst(&link4)==TRUE);
+		delete que;
+		}
+	TSglQueLink link1,link2,link3,link4;
+	test.Next(_L("IsLast"));
+	que=new T();
+	test(que->IsLast((TSglQueLink*) que->sHead)==TRUE);
+	test(que->IsLast((TSglQueLink*) *(que->sHead))==FALSE);
+	test(que->IsLast((TSglQueLink*) *(que->sLast))==TRUE);
+	que->AddLast(link1);
+	test(que->IsLast((TSglQueLink*) que->sHead)==FALSE);
+	test(que->IsLast((TSglQueLink*) *(que->sHead))==TRUE);
+	test(que->IsLast((TSglQueLink*) *(que->sLast))==TRUE);
+	test(que->IsLast(&link1)==TRUE);
+	que->AddLast(link2);
+	test(que->IsLast((TSglQueLink*) que->sHead)==FALSE);
+	test(que->IsLast((TSglQueLink*) *(que->sHead))==FALSE);
+	test(que->IsLast((TSglQueLink*) *(que->sLast))==TRUE);
+	test(que->IsLast(&link1)==FALSE);
+	test(que->IsLast(&link2)==TRUE);
+	que->AddLast(link3);
+	test(que->IsLast((TSglQueLink*) que->sHead)==FALSE);
+	test(que->IsLast((TSglQueLink*) *(que->sHead))==FALSE);
+	test(que->IsLast((TSglQueLink*) *(que->sLast))==TRUE);
+	test(que->IsLast(&link1)==FALSE);
+	test(que->IsLast(&link2)==FALSE);
+	test(que->IsLast(&link3)==TRUE);
+	que->AddLast(link4);
+	test(que->IsLast((TSglQueLink*) que->sHead)==FALSE);
+	test(que->IsLast((TSglQueLink*) *(que->sHead))==FALSE);
+	test(que->IsLast((TSglQueLink*) *(que->sLast))==TRUE);
+	test(que->IsLast(&link1)==FALSE);
+	test(que->IsLast(&link2)==FALSE);
+	test(que->IsLast(&link3)==FALSE);
+	test(que->IsLast(&link4)==TRUE);
+	test.Next(_L("Finished"));
+	delete que;
+	test.End();
+	}
+
+template<class T>
+void TestTQue<T>::Test9()
+	{
+	T* que;
+
+		{
+		TSglQueLink link1,link2,link3,link4;
+		test.Start(_L("First"));
+		que=new T();
+		test(que->First()==NULL);
+		que->AddFirst(link1);
+		test(que->First()==&link1);
+	 	que->AddFirst(link2);
+		test(que->First()==&link2);
+	 	que->AddFirst(link3);
+		test(que->First()==&link3);
+	  	que->AddFirst(link4);
+		test(que->First()==&link4);
+	 	delete que;
+		}
+	TSglQueLink link1,link2,link3,link4;
+	test.Next(_L("Last"));
+	que=new T();
+	test(que->Last()==(TSglQueLink*) que->sHead);
+	que->AddLast(link1);
+	test(que->Last()==&link1);
+ 	que->AddLast(link2);
+	test(que->Last()==&link2);
+ 	que->AddLast(link3);
+	test(que->Last()==&link3);
+  	que->AddLast(link4);
+	test(que->Last()==&link4);
+	test.Next(_L("Finished"));
+ 	delete que;
+	test.End();
+	}
+
+template<class T>
+void TestTQue<T>::Test10()
+	{
+	T* que;
+	TSglQueLink link1,link2,link3,link4;
+
+	que=new T();
+	que->AddLast(link1);
+	que->AddLast(link2);
+	que->AddLast(link3);
+	que->AddLast(link4);
+	test(*(que->sHead)==&link1);
+	test(*(que->sLast)==&link4);
+	test(link1.iNext==&link2);
+	test(link2.iNext==&link3);
+	test(link3.iNext==&link4);
+	test(link4.iNext==NULL);
+	que->Remove(link3);
+	test(*(que->sHead)==&link1);
+	test(*(que->sLast)==&link4);
+	test(link1.iNext==&link2);
+	test(link2.iNext==&link4);
+	test(link4.iNext==NULL);
+	que->Remove(link4);
+	test(*(que->sHead)==&link1);
+	test(*(que->sLast)==&link2);
+	test(link1.iNext==&link2);
+	test(link2.iNext==NULL);
+	que->Remove(link1);
+	test(*(que->sHead)==&link2);
+	test(*(que->sLast)==&link2);
+	test(link2.iNext==NULL);
+	que->Remove(link2);
+	test(*(que->sHead)==NULL);
+	test(*(que->sLast)==(TSglQueLink*) que->sHead);
+ 	delete que;
+	}
+
+class VSglQueIterBase : public TSglQueIterBase
+	{
+public:
+	VSglQueIterBase(TSglQueBase& aQue);
+	inline TAny* sDoPostInc() {return DoPostInc();}
+	inline TAny* sDoCurrent() {return DoCurrent();}
+public:
+	TInt* sOffset;
+	TSglQueLink** sHead;
+	TSglQueLink** sNext;
+private:
+	void SetMember();
+	};
+
+template <class T>
+class VSglQueIter : public TSglQueIter<T>
+	{
+public:
+	VSglQueIter(TSglQue<T>& aQue);
+	inline TAny* sDoPostInc() {return this->DoPostInc();}
+	inline TAny* sDoCurrent() {return this->DoCurrent();}
+public:
+	TInt* sOffset;
+	TSglQueLink** sHead;
+	TSglQueLink** sNext;
+private:
+	void SetMember();
+	};
+
+VSglQueIterBase::VSglQueIterBase(TSglQueBase& aQue)
+	:TSglQueIterBase(aQue)
+	{
+	SetMember();
+	}
+
+void VSglQueIterBase::SetMember()
+	{
+	sOffset=&iOffset;
+	sHead=&iHead;
+	sNext=&iNext;
+	}
+
+template <class T>
+VSglQueIter<T>::VSglQueIter(TSglQue<T>& aQue)
+	:TSglQueIter<T>(aQue)
+	{
+	SetMember();
+	}
+
+template <class T>
+void VSglQueIter<T>::SetMember()
+	{
+	sOffset=&this->iOffset;
+	sHead=&this->iHead;
+	sNext=&this->iNext;
+	}
+	
+template<class T,class Iter>
+class TestTQueIter
+	{
+public:
+	void TestIterBase();
+	void TestQueIter();
+	void Test1();	//All functions			//TSglQueIterBase
+	void Test2();	//Constructor
+	void Test3();	//Do's
+	void Test4();	//Set
+	void Test5();	//All functions			//TDblQueIter
+	//void Test6();	//Constructors									//Redundant
+	void Test7();	//Iterators
+private:
+	void CallTest2_4();
+	};
+
+template<class T,class Iter>
+void TestTQueIter<T,Iter>::CallTest2_4()
+	{
+	test.Next(_L("Constructors"));
+	Test2();
+	test.Next(_L("Do's"));
+	Test3();
+	test.Next(_L("Sets"));
+	Test4();
+	}
+
+template<class T,class Iter>
+void TestTQueIter<T,Iter>::TestIterBase()
+	{
+	test.Start(_L("All Methods"));
+	Test1();
+	CallTest2_4();
+	test.Next(_L("Finished"));
+	test.End();
+	}
+
+template<class T,class Iter>
+void TestTQueIter<T,Iter>::TestQueIter()
+	{
+	test.Start(_L("All Methods"));
+	Test5();
+	CallTest2_4();
+	test.Next(_L("Iterators"));
+	Test7();
+	test.Next(_L("Finished"));
+	test.End();
+	}
+
+template<class T,class Iter>
+void TestTQueIter<T,Iter>::Test1()
+	{
+	T item1,item2;
+	TSglQue<T> que(_FOFF(T,iLink));
+	Iter* iter;
+
+	que.AddFirst(item2);
+	que.AddFirst(item1);
+	test.Start(_L("Constructor"));
+	iter=new Iter(que);
+	test.Next(_L("Do's"));
+	iter->sDoCurrent();
+	iter->sDoPostInc();
+	test.Next(_L("Sets"));
+	iter->SetToFirst();
+	delete iter;
+	test.Next(_L("Finished"));
+	test.End();
+	}
+
+template<class T,class Iter>
+void TestTQueIter<T,Iter>::Test2()
+	{
+	TSglQue<T>* que;
+	TInt offset;
+ 	Iter* iter;
+	TSglQueLink* head;
+
+	for (offset=0;offset<40;offset+=4)
+		{
+		que=new TSglQue<T>(offset);
+		iter=new Iter(*que);
+		test(*(iter->sHead)==PtrAdd((TSglQueLink*) que->Last(),offset));
+		head=*(iter->sHead);
+		test(que->IsFirst((T*) PtrSub(*(iter->sNext),offset)));		//Need to pass a pointer to a item
+		test(*(iter->sOffset)==offset);
+		delete iter;
+		T item;
+		que->AddFirst(item);
+		iter=new Iter(*que);
+		test(*(iter->sHead)==head);
+		test(que->IsFirst((T*) PtrSub(*(iter->sNext),offset)));
+		test(*(iter->sOffset)==offset);
+		delete iter;
+		delete que;
+		}
+	}
+
+template<class T,class Iter>
+void TestTQueIter<T,Iter>::Test3()
+	{
+	T item1,item2,item3,item4;
+	TSglQue<T> que(_FOFF(T,iLink));
+ 	Iter* iter;
+				  
+	que.AddFirst(item4);
+	que.AddFirst(item3);
+	que.AddFirst(item2);
+	que.AddFirst(item1);
+	test.Start(_L("DoPostInc"));
+	iter=new Iter(que);
+	test(&item1==iter->sDoPostInc());
+	test(&item2.iLink==*(iter->sNext));
+	test(&item2==iter->sDoPostInc());
+	test(&item3.iLink==*(iter->sNext));
+	test(&item3==iter->sDoPostInc());
+	test(&item4.iLink==*(iter->sNext));
+	test(&item4==iter->sDoPostInc());
+	test((Item*) *(iter->sNext)==NULL);
+	test(iter->sDoPostInc()==NULL);
+	delete iter;
+	test.Next(_L("DoCurrent"));
+	iter=new Iter(que);
+	test(&item1==iter->sDoCurrent());
+	iter->sDoPostInc();
+	test(&item2==iter->sDoCurrent());
+	iter->sDoPostInc();
+	test(&item3==iter->sDoCurrent());
+	iter->sDoPostInc();
+	test(&item4==iter->sDoCurrent());
+	iter->sDoPostInc();
+	test(iter->sDoCurrent()==NULL);
+	delete iter;
+	test.Next(_L("Finished"));
+	test.End();
+	}
+
+template<class T,class Iter>
+void TestTQueIter<T,Iter>::Test4()
+	{
+	T item1,item2,item3,item4;
+	TSglQue<T> que(_FOFF(T,iLink));
+ 	Iter* iter;
+	TInt i,j;
+
+	que.AddFirst(item4);
+	que.AddFirst(item3);
+	que.AddFirst(item2);
+	que.AddFirst(item1);
+	iter=new Iter(que);
+	for(i=0;i<5;i++)
+		{
+		for(j=0;j<i;j++)
+			iter->sDoPostInc();
+		iter->SetToFirst();
+		test(*(iter->sNext)==&item1.iLink);
+		}
+	delete iter;
+	}
+
+template<class T,class Iter>
+void TestTQueIter<T,Iter>::Test5()
+	{
+	T item1,item2;
+	TSglQue<T> que(_FOFF(T,iLink));
+	Iter* iter;
+	T* a;
+
+	que.AddFirst(item2);
+	que.AddFirst(item1);
+	test.Start(_L("Constructor"));
+	iter=new Iter(que);
+	test.Next(_L("Iterators"));
+	a=*iter;
+	(*iter)++;
+	delete iter;
+	test.Next(_L("Finished"));
+	test.End();
+	}
+
+/*template<class T>											//Redundant
+void TestTQueIter<T>::Test6()
+	{
+	Item item;
+	TDblQue<Item>* que;
+	TInt offset;
+ 	T* iter;
+
+	for (offset=0;offset<40;offset+=4)
+		{
+		que=new TDblQue<Item>(offset);
+		iter=new T(*que);
+		test(que->IsHead((Item*) *(iter->sHead)));
+		test(que->IsHead((Item*) *(iter->sNext)));
+		test(*(iter->sOffset)==offset);
+		delete iter;
+		delete que;
+		que=new TDblQue<Item>(offset);
+		que->AddFirst(item);
+		iter=new T(*que);
+		test(que->IsHead((Item*) *(iter->sHead)));
+		test(*(iter->sNext)==&item.iLink);
+		test(*(iter->sOffset)==offset);
+		delete iter;
+		delete que;
+		}
+	}*/
+
+template<class T,class Iter>
+void TestTQueIter<T,Iter>::Test7()
+	{
+	T item1,item2,item3,item4;
+	TSglQue<T> que(_FOFF(T,iLink));
+ 	Iter* iter;
+				  
+	que.AddFirst(item4);
+	que.AddFirst(item3);
+	que.AddFirst(item2);
+	que.AddFirst(item1);
+	test.Start(_L("PostFix ++"));
+	iter=new Iter(que);
+	test(&item1==(*iter)++);
+	test(&item2.iLink==*(iter->sNext));
+	test(&item2==(*iter)++);
+	test(&item3.iLink==*(iter->sNext));
+	test(&item3==(*iter)++);
+	test(&item4.iLink==*(iter->sNext));
+	test(&item4==(*iter)++);
+	test((Item*) *(iter->sNext)==NULL);
+	test((*iter)++==NULL);
+	delete iter;
+	test.Next(_L("Conversion Operator"));
+	iter=new Iter(que);
+	test(&item1==*iter);
+	(*iter)++;
+	test(&item2==*iter);
+	(*iter)++;
+	test(&item3==*iter);
+	(*iter)++;
+	test(&item4==*iter);
+	(*iter)++;
+	test(*iter==NULL);
+	delete iter;
+	test.Next(_L("Finished"));
+	test.End();
+	}
+	
+#ifndef _DEBUG
+#pragma warning (disable: 4710)
+#endif
+
+GLDEF_C TInt E32Main()
+    {
+
+	TestTQueLink<TSglQueLink>* testSglQueLink;
+	TestTQue<VSglQueBase>* testSglQueBase;
+	TestTQue<VSglQue<TSglQueLink> >* testSglQue;
+	TestTQueIter<Item,VSglQueIterBase>* testSglQueIterBase;
+	TestTQueIter<Item,VSglQueIter<Item> >* testSglQueIter;
+
+	TestTQueIter<ItemWithOffset,VSglQueIterBase>* testSglQueIterBaseOffset;
+	TestTQueIter<ItemWithOffset,VSglQueIter<ItemWithOffset> >* testSglQueIterOffset;
+ 
+	test.Title();
+	test.Start(_L("class TSglQueLink"));
+	testSglQueLink=new TestTQueLink<TSglQueLink>;
+	testSglQueLink->TestQueLink();
+	delete testSglQueLink;
+
+	test.Next(_L("class TSglQueBase"));
+	testSglQueBase=new TestTQue<VSglQueBase>;
+	testSglQueBase->TestQueBase();
+ 	delete testSglQueBase;
+
+	test.Next(_L("class TSlgQue"));
+	testSglQue=new TestTQue<VSglQue<TSglQueLink> >;
+	testSglQue->TestSglQue();
+ 	delete testSglQue;
+
+	test.Next(_L("class TSglQueIterBase"));
+	testSglQueIterBase=new TestTQueIter<Item,VSglQueIterBase>;
+	testSglQueIterBase->TestIterBase();
+ 	delete testSglQueIterBase;
+
+	test.Next(_L("class TSglQueIter"));
+	testSglQueIter=new TestTQueIter<Item,VSglQueIter<Item> >;
+	testSglQueIter->TestQueIter();
+ 	delete testSglQueIter;
+
+	test.Next(_L("class TSglQueIterBase with Offset"));
+	testSglQueIterBaseOffset=new TestTQueIter<ItemWithOffset,VSglQueIterBase>;
+	testSglQueIterBaseOffset->TestIterBase();
+ 	delete testSglQueIterBaseOffset;
+
+	test.Next(_L("class TSglQueIter with Offset"));
+	testSglQueIterOffset=new TestTQueIter<ItemWithOffset,VSglQueIter<ItemWithOffset> >;
+	testSglQueIterOffset->TestQueIter();
+ 	delete testSglQueIterOffset;
+
+	test.Next(_L("Finished"));
+	test.End();
+	return(KErrNone);
+    }
+#pragma warning (default: 4710)
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32test/buffer/t_varray.cpp	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,341 @@
+// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32test\buffer\t_varray.cpp
+// Overview:
+// Test variable record length array classes.
+// API Information:
+// CArrayVarFlat, CArrayVarSeg.
+// Details:
+// - Create an array of variable length text using a flat dynamic & segmented
+// buffer and verify that:
+// - number of elements held in the array is 0.
+// - array is compressed and reset as expected.
+// - the elements of the array are sorted as expected.
+// - insertion of a text character into the array at specified position 
+// and length of the array is as expected.
+// - return value is 0 when available element is searched using sequential 
+// search technique within the array.
+// - removal of first element from the array is successful.
+// - number of elements held in the array is 1 after appending a single 
+// element at the end of empty array.
+// - insertion of a single element with specified key is successful.
+// - the element is found when searched using binary search technique
+// - KErrAlreadyExists is returned if an element is inserted with the same 
+// key already exists within the array.
+// - Create an array of variable length text character implemented using a flat 
+// dynamic & segmented buffer.
+// - append some strings onto the end of the array, check the contents and 
+// number of elements held in the array are as expected.
+// - insert some strings and verify that the change in the content of array 
+// and number of elements held in the array are as expected.
+// - remove a single, multiple elements from the array and verify that the 
+// Delete method is as expected.
+// - Create an array of variable length text character contained within a flat 
+// dynamic & segmented buffer.
+// - append some strings of specified length onto the end of the array, compress 
+// the array and verify that the number of elements held in the array is as specified.
+// - insert a string at specified location, check the contents and reset the array.
+// - append some strings at the end, insert some strings at specified position, 
+// compress the array and verify that content, number of strings in the array 
+// are as expected.
+// - test that the number of elements and contents of the array are sorted as expected.
+// - verify the correct position of the element and return value is zero when 
+// an element is found using binary, sequential search technique and nonzero 
+// if not present in the array.
+// - insert some strings at the specified location and check that correct position
+// is returned when searched using binary search technique.
+// - Create an array of variable length integer contained within a flat dynamic &
+// segmented buffer.
+// - insert some elements with same key which is already present within the array 
+// and check that KErrAlreadyExists is returned. 
+// - Test whether the heap has been corrupted by all the tests.
+// Platforms/Drives/Compatibility:
+// All 
+// Assumptions/Requirement/Pre-requisites:
+// Failures and causes:
+// Base Port information:
+// 
+//
+
+#include <e32std.h>
+#include <e32base.h>
+#include <e32test.h>
+#include <e32svr.h>
+#include <e32ver.h>
+
+const TInt KTestGranularity=0x02;
+
+LOCAL_D RTest test(_L("T_VARRAY"));
+
+LOCAL_C void testAllMethods(CArrayVar<TText>& aVar)
+    {
+	test.Next(_L("Test all methods"));
+	test(aVar.Count()==0);
+	aVar.Compress();
+	test(TRUE);
+	aVar.Reset();
+	test(TRUE);
+	TKeyArrayVar kk(sizeof(TText),ECmpNormal,0);
+	test(TRUE);
+	aVar.Sort(kk);
+	test(TRUE);
+	const TText* aa=_S("a");
+	aVar.InsertL(0,*aa,sizeof(TText));
+	test(aVar.Length(0)==sizeof(TText));
+	test(TRUE);
+	TInt pp;
+	test(aVar.Find(*aa,kk,pp)==0);
+	test(pp==0);
+	aVar.Delete(0);
+	aVar.AppendL(*aa,1);
+	test(aVar.Count()==1);
+	aVar.InsertIsqAllowDuplicatesL(*aa,0,kk);
+	test(TRUE);
+	test(aVar.FindIsq(*aa,kk,pp)==0);
+	test(pp==0);
+	TRAPD(r,aVar.InsertIsqL(*aa,0,kk));
+	test(r==KErrAlreadyExists);
+    }
+
+LOCAL_C void test1(CArrayVar<TText>& aVar)
+//
+	{
+	test.Next(_L("AppendL and InsertL chars"));
+	aVar.AppendL(*_S("abcd"),5*sizeof(TText)); // abcd
+	TBuf<0x10> des1(&aVar[0]);
+	test(des1==_L("abcd"));
+	test(aVar.Count()==1);
+	aVar.AppendL(*_S("wxyz"),5*sizeof(TText)); // abcd wxyz
+	des1=&aVar[1];
+	test(des1==_L("wxyz"));
+	test(aVar.Count()==2);
+	aVar.InsertL(1,*_S("ef"),3*sizeof(TText)); // abcd ef wxyz
+	des1=&aVar[1];
+	test(des1==_L("ef"));
+	test(aVar.Count()==3);	
+	aVar.AppendL(*_S("z"),2*sizeof(TText)); // abcd ef wxyz z
+	des1=&aVar[3];
+	test(des1==_L("z"));
+	aVar.InsertL(0,*_S("y"),2*sizeof(TText)); // y abcd ef wxyz z
+	des1=&aVar[0];
+	test(des1==_L("y"));
+	test(aVar.Length(0)==2*sizeof(TText));
+	test(aVar.Length(1)==5*sizeof(TText));
+	test(aVar.Length(2)==3*sizeof(TText));
+	test(aVar.Length(3)==5*sizeof(TText));
+	test(aVar.Length(4)==2*sizeof(TText));
+	des1=&aVar[1];
+	test(des1==_L("abcd"));
+	test(aVar.Count()==5);
+//
+	test.Next(_L("Delete chars"));
+	aVar.Delete(3,1); // y abcd ef z
+	des1=&aVar[2];
+	test(des1==_L("ef"));
+	des1=&aVar[1];
+	test(des1==_L("abcd"));
+	des1=&aVar[3];
+	test(des1==_L("z"));
+	aVar.Delete(1,2); // y z
+	des1=&aVar[0];
+	test(des1==_L("y"));
+	des1=&aVar[1];
+	test(des1==_L("z"));
+	test(aVar.Count()==2);
+	}
+
+LOCAL_C void test2(CArrayVar<TText>& aVar)
+//
+	{
+	test.Next(_L("Reset and Compress"));
+	TBuf<0x10> des1(_L("abcde"));
+	TBuf<0x10> des2(_L("fgh"));
+	TBuf<0x10> des3(_L("wxyz"));
+	aVar.AppendL(*(TText*)des1.Ptr(),des1.Size());
+	aVar.AppendL(*(TText*)des2.Ptr(),des2.Size());
+	aVar.Compress();
+	test(aVar.Count()==2);
+	TPtrC des4((TText*)&aVar[0],des1.Length());
+	test(des1==des4);
+	TPtrC des5((TText*)&aVar[1],des2.Length());
+	test(des2==des5);
+	aVar.InsertL(1,*(TText*)des3.Ptr(),des3.Size());
+	test(aVar.Count()==3);	
+	TPtrC des6((TText*)&aVar[0],des1.Length());
+	test(des1==des6);
+	TPtrC des7((TText*)&aVar[2],des2.Length());
+	test(des2==des7);
+	TPtrC des8((TText*)&aVar[1],des3.Length());
+	test(des3==des8);
+	aVar.Reset();
+
+	TBuf<0x10> buf1=_L("abcdef");
+	TBuf<0x10> buf2=_L("wxyz");
+	TBuf<0x10> buf3=_L("lmnop");
+	TBuf<0x10> buf4=_L("aa");
+	aVar.AppendL(*buf1.Ptr(),buf1.Size());
+	aVar.InsertL(0,*buf2.Ptr(),buf2.Size());
+	aVar.AppendL(*buf3.Ptr(),buf3.Size());
+	aVar.InsertL(1,*buf4.Ptr(),buf4.Size());
+	aVar.Compress();
+	TPtrC rd1((TText*)&aVar[2],buf1.Length());
+	test(buf1==rd1);
+	TPtrC rd2((TText*)&aVar[0],buf2.Length());
+	test(buf2==rd2);
+	TPtrC rd3((TText*)&aVar[3],buf3.Length());
+	test(buf3==rd3);
+	TPtrC rd4((TText*)&aVar[1],buf4.Length());
+	test(buf4==rd4);
+	test(aVar.Count()==4);
+	
+	TKeyArrayVar kk(0,ECmpNormal,3);		// Compare 3 characters
+	TKeyArrayVar kk1(0,ECmpNormal,2);	// Compare 2 characters
+	test.Next(_L("Sort"));
+	aVar.Sort(kk);
+	TPtrC rd5((TText*)&aVar[1],buf1.Length());
+	test(buf1==rd5);
+	TPtrC rd6((TText*)&aVar[3],buf2.Length());
+	test(buf2==rd6);
+	TPtrC rd7((TText*)&aVar[2],buf3.Length());
+	test(buf3==rd7);
+	TPtrC rd8((TText*)&aVar[0],buf4.Length());
+	test(buf4==rd8);
+	test(aVar.Count()==4);	
+
+	test.Next(_L("Find and FindIsq"));
+	TBuf<0x10> buf5=_L("ffff");
+	test(aVar.InsertIsqL(*(TText*)buf5.Ptr(),buf5.Size(),kk)==2);
+	TRAPD(r,aVar.InsertIsqL(*(TText*)buf5.Ptr(),buf5.Size(),kk))
+	test(r==KErrAlreadyExists);
+	test(aVar.InsertIsqAllowDuplicatesL(*(TText*)buf5.Ptr(),buf5.Size(),kk)==3);
+	TInt aPos;
+	test(aVar.Find(*_S("abc"),kk,aPos)==0);	// Second parameter 'aLength' is unused. 
+	test(aPos==1);
+	test(aVar.Find(*_S("aa"),kk1,aPos)==0);
+	test(aPos==0);
+	test(aVar.Find(*_S("wxyz"),kk,aPos)==0);
+	test(aPos==5);
+	test(aVar.Find(*_S("fgh"),kk,aPos)!=0);		// Returns !=0 if string not found.
+	test(aPos==6);								// Not present in list, aPos set to last position
+	test(aVar.Find(*_S("ffff"),kk,aPos)==0);	
+	test(aPos==2);
+	test(aVar.Find(*_S("lmn"),kk,aPos)==0);
+	test(aPos==4);
+	test(aVar.FindIsq(*_S("abc"),kk,aPos)==0);
+	test(aPos==1);
+	test(aVar.FindIsq(*_S("aa"),kk1,aPos)==0);
+	test(aPos==0);
+	test(aVar.FindIsq(*_S("wxyz"),kk,aPos)==0);
+	test(aPos==5);
+	test(aVar.FindIsq(*_S("fgh"),kk,aPos)!=0);	// Returns result of last test
+	test(aPos==4);		  // Not present in list, aPos set to last position tested
+	TBuf<0x10> buf7=_L("fgh");
+	test(aVar.InsertIsqL(*(TText*)buf7.Ptr(),buf7.Size(),kk)==4);
+	test(aVar.FindIsq(*_S("fgh"),kk,aPos)==0);	// Returns result of last test
+	test(aPos==4);
+									
+	test(aVar.FindIsq(*_S("ffff"),kk,aPos)==0);
+	test(aPos==3);
+	test(aVar.FindIsq(*_S("lmn"),kk,aPos)==0);
+	test(aPos==5); 
+	}
+
+LOCAL_C void test3(CArrayVar<TInt>& aVar)
+	{
+
+	test.Next(_L("InsertIsqL"));
+	TKeyArrayVar kk(0,ECmpTInt);
+
+	TInt pos=0;
+	TInt mod=47;
+	TInt inc=23;
+
+	TInt i=0;	
+	FOREVER
+		{
+		TInt ret;
+		if (i&1)
+			TRAP(ret,aVar.InsertIsqL(i,sizeof(TInt),kk))
+		else
+			{
+			TRAP(ret,pos=aVar.InsertIsqL(i,sizeof(TInt),kk))
+			if (ret==KErrNone)
+				test(aVar[pos]==i);
+			}
+		if (ret==KErrAlreadyExists)
+			break;
+		i=(i+inc)%mod;
+		}
+	for(i=0;i<mod;i++)
+		{
+		pos=(-1);
+		test(aVar.FindIsq(i,kk,pos)==0);
+		test(pos==i);
+		TRAPD(r,aVar.InsertIsqL(i,sizeof(TInt),kk))
+		test(r==KErrAlreadyExists);
+		}
+	}
+
+GLDEF_C TInt E32Main()
+//
+// Test the variable record length array classes.
+//
+    {
+
+	test.Title();
+	__UHEAP_MARK;
+	test.Start(_L("class CArrayFixFlat"));
+//
+	CArrayVarFlat<TText>* pVarFlat=new CArrayVarFlat<TText>(KTestGranularity);
+	if (pVarFlat==NULL)
+		test.Panic(_L("Allocating array"));
+    testAllMethods(*pVarFlat);
+    delete pVarFlat;
+//
+	CArrayVarFlat<TText>* pVarFlatChar=new CArrayVarFlat<TText>(KTestGranularity);
+	test1(*pVarFlatChar);
+	delete pVarFlatChar; 
+//		
+	CArrayVarFlat<TText>* pVarFlatArr=new CArrayVarFlat<TText>(KTestGranularity);
+	test2(*pVarFlatArr);
+	delete pVarFlatArr;
+//
+	CArrayVarFlat<TInt>* pVarFlatInt=new CArrayVarFlat<TInt>(KTestGranularity);
+	test3(*pVarFlatInt);
+	delete pVarFlatInt;
+//	
+	test.Next(_L("class CArrayVarSeg"));
+	CArrayVarSeg<TText>* pVarSeg=new CArrayVarSeg<TText>(KTestGranularity);
+	if (pVarSeg==NULL)
+		test.Panic(_L("Allocating array"));
+	testAllMethods(*pVarSeg);
+	delete pVarSeg;
+//
+	CArrayVarSeg<TText>* pVarSegChar=new CArrayVarSeg<TText>(KTestGranularity);
+	test1(*pVarSegChar);
+	delete pVarSegChar;
+//		
+	CArrayVarSeg<TText>* pVarSegArr=new CArrayVarSeg<TText>(KTestGranularity);
+	test2(*pVarSegArr);
+	delete pVarSegArr;
+//
+	CArrayVarSeg<TInt>* pVarSegInt=new CArrayVarSeg<TInt>(KTestGranularity);
+	test3(*pVarSegInt);
+	delete pVarSegInt;
+//
+	test.End();
+	__UHEAP_MARKEND;
+	return(0);
+    }
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32test/buffer/t_versio.cpp	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,178 @@
+// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32test\buffer\t_versio.cpp
+// Overview:
+// Test the version information class.
+// API Information:
+// TVersion.
+// Details:
+// - Test the version name for different versions as expected.
+// - Compare the major, minor, build version number of current version and 
+// specified version and verify that error message is popped when version
+// is not supported.
+// Platforms/Drives/Compatibility:
+// All 
+// Assumptions/Requirement/Pre-requisites:
+// Failures and causes:
+// Base Port information:
+// 
+//
+
+#include <e32test.h>
+
+const TInt KNumTVersions=1+3*3*3;
+
+class RTvTest : public RTest
+    {
+public:
+    RTvTest();
+    void TestName();
+    void TestQVS();
+    void Start(const TDesC &aHeading) {Printf(aHeading);Push();}
+private:
+    TBool QVS(TInt i,TInt j);
+private:
+    TVersion* iTV[KNumTVersions];
+    TVersion iDefTV;     // tests default constructor
+    };
+
+LOCAL_D const TText* Names[]=
+    {
+    _S("0.00(0)"),
+    _S("0.00(0)"),
+    _S("0.00(1)"),
+    _S("0.00(999)"),
+    _S("0.01(0)"),
+    _S("0.01(1)"),
+    _S("0.01(999)"),
+    _S("0.99(0)"),
+    _S("0.99(1)"),
+    _S("0.99(999)"),
+    _S("1.00(0)"),
+    _S("1.00(1)"),
+    _S("1.00(999)"),
+    _S("1.01(0)"),
+    _S("1.01(1)"),
+    _S("1.01(999)"),
+    _S("1.99(0)"),
+    _S("1.99(1)"),
+    _S("1.99(999)"),
+    _S("99.00(0)"),
+    _S("99.00(1)"),
+    _S("99.00(999)"),
+    _S("99.01(0)"),
+    _S("99.01(1)"),
+    _S("99.01(999)"),
+    _S("99.99(0)"),
+    _S("99.99(1)"),
+    _S("99.99(999)")
+    };
+
+RTvTest::RTvTest()
+//
+// Constructor
+//
+    : RTest(_L("T_VERSIO"))
+    {
+
+    iTV[0]=&iDefTV;
+    TInt i=1;
+    TInt major=0;
+    FOREVER
+        {
+        TInt minor=0;
+        FOREVER
+            {
+            TInt build=0;
+            FOREVER
+                {
+                iTV[i++]=new TVersion(major,minor,build);
+                if (build==999)
+                    break;
+                build=(build==1? 999: 1);
+                }
+            if (minor==99)
+                break;
+            minor=(minor==1? 99: 1);
+            }
+        if (major==99)
+            break;
+        major=(major==1? 99: 1);
+        }
+    }
+
+void RTvTest::TestName()
+//
+// Test the version name
+//
+    {
+ 
+	Next(_L("Testing TVersion::Name()"));
+    for (TInt i=0; i<KNumTVersions; i++)
+        {
+        TPtrC Name=(TPtrC)Names[i];
+        if (iTV[i]->Name().Compare(Name))
+            Panic(Name);
+        }
+    }
+
+TBool RTvTest::QVS(TInt aCurrent,TInt aRequested)
+//
+// An independent calculation of what QueryVersionSupported should return
+//
+    {
+
+    if (aCurrent)
+        aCurrent--;
+    if (aRequested)
+        aRequested--;
+    aCurrent/=3;
+    aRequested/=3;
+    return(aCurrent>=aRequested);
+    }
+
+void RTvTest::TestQVS()
+//
+// Check QueryVersionSupported()
+//
+    {
+ 
+   Next(_L("Testing User::QueryVersionSupported()"));
+    for (TInt i=0; i<KNumTVersions; i++)
+        {
+        for (TInt j=0; j<KNumTVersions; j++)
+            {
+            if (User::QueryVersionSupported(*iTV[i],*iTV[j])!=QVS(i,j))
+                Panic(_L("Query version supported failed"));
+            }
+        }
+    }
+
+GLDEF_C TInt E32Main()
+//
+// Test TVersion class.
+//
+    {
+
+    RTvTest test;
+	test.Title();
+	test.Start(_L("Testing TVersion\n"));
+    test.TestName();
+    test.TestQVS();
+    test.Printf(_L("TVersion passed testing\n"));
+	test.End();
+	return(0);
+    }
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32test/math/largeint.cpp	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,285 @@
+// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32test\math\largeint.cpp
+// 
+//
+
+#include "largeint.h"
+
+TLargeIntBase::TLargeIntBase(TInt n)
+	: iC(n)
+	{
+	Mem::FillZ(iX,n*sizeof(TUint32));
+	}
+
+TLargeIntBase::TLargeIntBase(TInt n, TInt32 aSigned32)
+	: iC(n)
+	{
+	TUint f = (aSigned32<0) ? 0xff : 0;
+	Mem::Fill(iX,n*sizeof(TUint32),f);
+	iX[0]=aSigned32;
+	}
+
+TLargeIntBase::TLargeIntBase(TInt n, TUint32 aUnsigned32)
+	: iC(n)
+	{
+	Mem::FillZ(iX,n*sizeof(TUint32));
+	iX[0]=aUnsigned32;
+	}
+
+TLargeIntBase::TLargeIntBase(TInt n, const TLargeIntBase& aSrc, TMode aMode)
+	: iC(n)
+	{
+	__ASSERT(aMode==ETruncate||n>=aSrc.iC);	// if not truncating, dest can't be shorter than source
+	__ASSERT(aMode!=ETruncate||n<=aSrc.iC);	// if truncating, dest can't be longer than source
+	TInt min = Min(n,aSrc.iC);
+	TInt i;
+	for (i=0; i<min; ++i)
+		iX[i] = aSrc.iX[i];
+	if (aMode==ETruncate || n==aSrc.iC)
+		return;
+	TUint32 f = (aMode==ESignExtend && (iX[i-1] & 0x80000000u)) ? 0xffffffffu : 0;
+	for (; i<n; ++i)
+		iX[i] = f;
+	}
+
+TLargeIntBase::TLargeIntBase(TInt n, const TUint32* aPtr)
+	: iC(n)
+	{
+	Mem::Copy(iX, aPtr, n*sizeof(TUint32));
+	}
+
+TLargeIntBase::TLargeIntBase(TInt n, const Int64& aSigned64)
+	: iC(n)
+	{
+	__ASSERT(n>=2);
+	Mem::Copy(iX, &aSigned64, 8);
+	TUint f = (iX[1] & 0x80000000u) ? 0xff : 0;
+	Mem::Fill(iX+2,(n-2)*sizeof(TUint32),f);
+	}
+
+TLargeIntBase::TLargeIntBase(TInt n, const Uint64& aUnsigned64)
+	: iC(n)
+	{
+	__ASSERT(n>=2);
+	Mem::Copy(iX, &aUnsigned64, 8);
+	Mem::FillZ(iX+2,(n-2)*sizeof(TUint32));
+	}
+
+void TLargeIntBase::Not()
+	{
+	TInt i;
+	for (i=0; i<iC; ++i)
+		iX[i] = ~iX[i];
+	}
+
+void TLargeIntBase::Neg()
+	{
+	Not();
+	Inc();
+	}
+
+void TLargeIntBase::Abs()
+	{
+	if (iX[iC-1] & 0x80000000u)
+		Neg();
+	}
+
+void TLargeIntBase::Inc()
+	{
+	TInt i;
+	for (i=0; i<iC && ++iX[i]==0; ++i) {}
+	}
+
+void TLargeIntBase::Dec()
+	{
+	TInt i;
+	for (i=0; i<iC && --iX[i]==0xffffffffu; ++i) {}
+	}
+
+TUint32 TLargeIntBase::Lsl()
+	{
+	TInt i;
+	TUint32 c = 0;
+	for (i=0; i<iC; ++i)
+		{
+		TUint32 x = (iX[i]<<1) | (c>>31);
+		c = iX[i];
+		iX[i] = x;
+		}
+	return c>>31;
+	}
+
+TUint32 TLargeIntBase::Lsr()
+	{
+	TInt i;
+	TUint32 c = 0;
+	for (i=iC-1; i>=0; --i)
+		{
+		TUint32 x = (iX[i]>>1) | (c<<31);
+		c = iX[i];
+		iX[i] = x;
+		}
+	return c&1;
+	}
+
+TUint32 TLargeIntBase::Asr()
+	{
+	TInt i=iC-1;
+	TUint32 c = iX[i]>>31;
+	for (; i>=0; --i)
+		{
+		TUint32 x = (iX[i]>>1) | (c<<31);
+		c = iX[i];
+		iX[i] = x;
+		}
+	return c&1;
+	}
+
+void TLargeIntBase::Lsl(TInt aCount)
+	{
+	while(--aCount>=0)
+		Lsl();
+	}
+
+void TLargeIntBase::Lsr(TInt aCount)
+	{
+	while(--aCount>=0)
+		Lsr();
+	}
+
+void TLargeIntBase::Asr(TInt aCount)
+	{
+	while(--aCount>=0)
+		Asr();
+	}
+
+void TLargeIntBase::Add(const TLargeIntBase& a)
+	{
+	__ASSERT(a.iC==iC);
+	TInt i;
+	TUint32 c = 0;
+	for (i=0; i<iC; ++i)
+		{
+		TUint32 x = iX[i];
+		TUint32 y = a.iX[i];
+		TUint32 s = x + y;
+		iX[i] = (s + (c>>31));
+		TUint32 g = (x & y) | ((x | y) &~ s);
+		TUint32 p = ~s ? 0 : s;
+		c = g | (c & p);
+		}
+	}
+
+void TLargeIntBase::Sub(const TLargeIntBase& a)
+	{
+	__ASSERT(a.iC==iC);
+	TInt i;
+	TUint32 c = 0x80000000u;
+	for (i=0; i<iC; ++i)
+		{
+		TUint32 x = iX[i];
+		TUint32 y = ~a.iX[i];
+		TUint32 s = x + y;
+		iX[i] = (s + (c>>31));
+		TUint32 g = (x & y) | ((x | y) &~ s);
+		TUint32 p = ~s ? 0 : s;
+		c = g | (c & p);
+		}
+	}
+
+void TLargeIntBase::Mul(const TLargeIntBase& a)
+	{
+	__ASSERT(a.iC==iC);
+	TUint32 temp[64];	// HACK!!
+	Mem::Copy(temp, this, (iC+1)*sizeof(TUint32));
+	TLargeIntBase& b = *(TLargeIntBase*)temp;
+	new (this) TLargeIntBase(iC,TUint32(0u));
+	TInt i;
+	for (i=0; i<32*iC; ++i)
+		{
+		Lsl();
+		if (b.Lsl())
+			Add(a);
+		}
+	}
+
+void TLargeIntBase::DivU(const TLargeIntBase& aDivisor, TLargeIntBase& aRem)
+	{
+	__ASSERT(aDivisor.iC==iC);
+	__ASSERT(aRem.iC==iC);
+	new (&aRem) TLargeIntBase(iC,TUint32(0u));
+	TInt i;
+	for (i=0; i<iC*32; ++i)
+		{
+		aRem.Lsl();
+		if (Lsl())
+			aRem.Inc();
+		if (aRem.Hs(aDivisor))
+			aRem.Sub(aDivisor), Inc();
+		}
+	}
+
+void TLargeIntBase::DivS(const TLargeIntBase& aDivisor, TLargeIntBase& aRem)
+	{
+	__ASSERT(aDivisor.iC==iC);
+	__ASSERT(aRem.iC==iC);
+	TUint32 temp[64];	// HACK!!
+	Mem::Copy(temp, &aDivisor, (iC+1)*sizeof(TUint32));
+	TLargeIntBase& divisor = *(TLargeIntBase*)temp;
+	TUint32 rs = iX[iC-1];
+	TUint32 qs = divisor.iX[iC-1] ^ rs;
+	Abs();
+	divisor.Abs();
+	DivU(divisor, aRem);
+	if (rs & 0x80000000u)
+		aRem.Neg();
+	if (qs & 0x80000000u)
+		Neg();
+	}
+
+TInt TLargeIntBase::CompareU(const TLargeIntBase& a) const
+	{
+	__ASSERT(a.iC==iC);
+	TInt i;
+	for (i=iC-1; i>=0; --i)
+		{
+		TUint32 x = iX[i];
+		TUint32 y = a.iX[i];
+		if (x>y)
+			return 1;
+		if (x<y)
+			return -1;
+		}
+	return 0;
+	}
+
+TInt TLargeIntBase::CompareS(const TLargeIntBase& a) const
+	{
+	__ASSERT(a.iC==iC);
+	TInt i;
+	TUint32 m = 0x80000000u;
+	for (i=iC-1; i>=0; --i)
+		{
+		TUint32 x = iX[i] ^ m;
+		TUint32 y = a.iX[i] ^ m;
+		m = 0;
+		if (x>y)
+			return 1;
+		if (x<y)
+			return -1;
+		}
+	return 0;
+	}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32test/math/largeint.h	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,107 @@
+// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32test\math\largeint.h
+// 
+//
+
+#ifndef __LARGEINT_H__
+#define __LARGEINT_H__
+#include <e32std.h>
+
+#define __ASSERT(c)		__ASSERT_DEBUG(c,User::Invariant())
+
+class TLargeIntBase
+	{
+public:
+	enum TMode {EZeroExtend,ESignExtend,ETruncate};
+	TLargeIntBase(TInt n);
+	TLargeIntBase(TInt n, TInt32 aSigned32);
+	TLargeIntBase(TInt n, TUint32 aUnsigned32);
+	TLargeIntBase(TInt n, const TLargeIntBase&, TMode);
+	TLargeIntBase(TInt n, const TUint32* aPtr);
+	TLargeIntBase(TInt n, const Int64& aSigned64);
+	TLargeIntBase(TInt n, const Uint64& aUnsigned64);
+public:
+	void Not();
+	void Neg();
+	void Abs();
+	void Inc();
+	void Dec();
+	TUint32 Lsl();
+	TUint32 Lsr();
+	TUint32 Asr();
+	void Lsl(TInt aCount);
+	void Lsr(TInt aCount);
+	void Asr(TInt aCount);
+	void Add(const TLargeIntBase&);
+	void Sub(const TLargeIntBase&);
+	void Mul(const TLargeIntBase&);
+	void DivU(const TLargeIntBase& aDivisor, TLargeIntBase& aRem);
+	void DivS(const TLargeIntBase& aDivisor, TLargeIntBase& aRem);
+	TInt CompareU(const TLargeIntBase&) const;
+	TInt CompareS(const TLargeIntBase&) const;
+	inline TLargeIntBase& operator++() {Inc(); return *this;}
+	inline TLargeIntBase& operator--() {Dec(); return *this;}
+public:
+	inline TBool operator==(const TLargeIntBase& a) const
+		{return CompareU(a)==0;}
+	inline TBool operator!=(const TLargeIntBase& a) const
+		{return CompareU(a)!=0;}
+	inline TBool Hi(const TLargeIntBase& a) const
+		{return CompareU(a)>0;}
+	inline TBool Hs(const TLargeIntBase& a) const
+		{return CompareU(a)>=0;}
+	inline TBool Lo(const TLargeIntBase& a) const
+		{return CompareU(a)<0;}
+	inline TBool Ls(const TLargeIntBase& a) const
+		{return CompareU(a)<=0;}
+	inline TBool Gt(const TLargeIntBase& a) const
+		{return CompareS(a)>0;}
+	inline TBool Ge(const TLargeIntBase& a) const
+		{return CompareS(a)>=0;}
+	inline TBool Lt(const TLargeIntBase& a) const
+		{return CompareS(a)<0;}
+	inline TBool Le(const TLargeIntBase& a) const
+		{return CompareS(a)<=0;}
+	inline TUint32& operator[](TInt a)
+		{__ASSERT(TUint32(a)<TUint32(iC)); return iX[a];}
+	inline TUint32 operator[](TInt a) const
+		{__ASSERT(TUint32(a)<TUint32(iC)); return iX[a];}
+public:
+	TInt iC;
+	TUint32 iX[1];
+	};
+
+template <TInt n>
+class TLargeInt : public TLargeIntBase
+	{
+public:
+	inline TLargeInt() : TLargeIntBase(n) {}
+	inline TLargeInt(TInt32 aSigned32) : TLargeIntBase(n,aSigned32) {}
+	inline TLargeInt(TUint32 aUnsigned32) : TLargeIntBase(n,aUnsigned32) {}
+	inline TLargeInt(const TLargeIntBase& aSrc, TMode aMode) : TLargeIntBase(n,aSrc,aMode) {}
+	inline TLargeInt(const TUint32* aPtr) : TLargeIntBase(n, aPtr) {}
+	inline TLargeInt(const Int64& aSigned64) : TLargeIntBase(n, aSigned64) {}
+	inline TLargeInt(const Uint64& aUnsigned64) : TLargeIntBase(n, aUnsigned64) {}
+	inline TLargeInt<2*n> LongMultU(const TLargeInt<n>& a) const
+		{TLargeInt<2*n> x(*this,EZeroExtend); TLargeInt<2*n> y(a,EZeroExtend); x.Mul(y); return x;}
+	inline TLargeInt<2*n> LongMultS(const TLargeInt<n>& a) const
+		{TLargeInt<2*n> x(*this,ESignExtend); TLargeInt<2*n> y(a,ESignExtend); x.Mul(y); return x;}
+public:
+	TUint32 iExtra[n-1];
+	};
+
+#define CHECK(X)	void __compile_assert(int __check[(X)?1:-1])
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32test/math/t_float.cpp	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,370 @@
+// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32test\math\t_float.cpp
+// Data split into files: t_float1.cpp, t_float2.cpp and t_float3.cpp
+// Overview:
+// Test conversion of real to descriptors, descriptors to real and the 
+// Math::Round method.
+// API Information:
+// TDes8, TDes16, TLex8, TLex16, Math.  
+// Details:
+// - Test conversion of specified TReal32, TReal64 into TBuf8, TBuf16 
+// is as expected.
+// - Round some numbers to a specified number of decimal places and check it 
+// is as expected.
+// - Test conversion of specified TReal32, TReal64 into TBuf8, TBuf16 in
+// calculator mode is as expected.
+// - Check that errors returned during conversion from TReal32, TReal64 into 
+// TBuf8, TBuf16 are as expected.
+// - Verify the result when a string is parsed to extract a real number.
+// - Test string to real conversion in cases, which are not exact and check
+// that results are as expected.
+// - Test errors in string to real conversion are as expected.
+// - Test that the conversion from string to real and then real to string, verify
+// the results are as expected.
+// - For specified strings values check parsing of string to extract real value, 
+// absolute value, token length is as expected.
+// - Check the character representation of specified real numbers are as expected.
+// Platforms/Drives/Compatibility:
+// All 
+// Assumptions/Requirement/Pre-requisites:
+// Failures and causes:
+// Base Port information:
+// 
+//
+
+#include "t_math.h"
+#include "t_float.h"
+
+GLREF_D RtoB_TEST testd[];
+GLREF_D TUint size_testd;
+GLREF_D RtoB_TEST testcalc[];
+GLREF_D TUint size_testcalc;
+GLREF_D ERR_TEST testerr[];
+GLREF_D TUint size_testerr;
+GLREF_D DtoR_ERR_TEST testerr2[];
+GLREF_D TUint size_testerr2;
+GLREF_D DtoR_ERR_TEST testerr3[];
+GLREF_D TUint size_testerr3;
+GLREF_D CALC_TEST calctest[];
+GLREF_D TUint size_calctest;
+GLREF_D ROUND_TEST testround[];
+GLREF_D TUint size_testround;
+GLREF_D DtoR_TEST64 testd2[];
+GLREF_D TUint size_testd2;
+GLREF_D DtoR_TEST64 testApprox[];
+GLREF_D TUint size_testApprox;
+GLREF_D DtoR_TEST32 testd32[];
+GLREF_D TUint size_testd32;
+
+GLDEF_D RTest test(_L("T_FLOAT"));
+
+LOCAL_C TInt rtob(RtoB_TEST& tst)
+    {
+
+    TBuf<0x100> buf;
+
+ 	TInt ret=buf.Num(tst.num,tst.format);
+	if (ret!=KErrGeneral)
+		{
+		buf.ZeroTerminate();
+		TPtrC result(tst.res);
+//		test.Printf(_L("buf=%S\nres=%S\n"),&buf,&result);
+		test(buf.Compare(result)==0);
+		}
+    return(ret);
+    }
+
+LOCAL_C void test1()
+// 
+// Test RtoB using selected numbers
+//
+    {
+
+  	for (TInt jj=0;jj<TInt(size_testd/sizeof(RtoB_TEST));jj++)
+        test(rtob(testd[jj])>=0);
+	}
+
+LOCAL_C void test2()
+//
+// Test Math::Round(_,_,_) for specific numbers
+//
+    {
+
+    TReal res;
+    TRealFormat pf;
+	pf.iType=KRealFormatExponent;
+	pf.iWidth=22;
+	pf.iPlaces=15;
+	pf.iPoint='.';
+	pf.iTriad=',';
+	pf.iTriLen=1;
+					
+    for (TInt jj=0;jj<TInt(size_testround/sizeof(ROUND_TEST));jj++) 
+        {
+        test(Math::Round(res,testround[jj].num,testround[jj].plcs)==KErrNone);
+        TReal err=(res-testround[jj].res);
+        if (res)
+            err/=res;
+        test(Abs(err)<=1E-15);
+        }
+    }
+
+LOCAL_C void test3()
+// 
+// Test RtoB in calculator mode using selected numbers
+// Added by AnnW, November 1996
+//
+    {
+
+  	for (TInt jj=0;jj<TInt(size_testcalc/sizeof(RtoB_TEST));jj++)
+        test(rtob(testcalc[jj])>=0);
+    }
+
+LOCAL_C void test4()
+//
+// Tests errors
+//
+    {
+
+    for (TInt jj=0;jj<TInt(size_testerr/sizeof(ERR_TEST));jj++)
+        {
+        RtoB_TEST tst=testerr[jj].rtob;
+		TInt ret=rtob(tst);
+		test(testerr[jj].err==ret);
+        }
+    }
+
+// End of translated test code from plib.  Now some tests from string o real conversions:
+
+LOCAL_C void test5()
+//
+// Test string to real conversion with selected numbers
+// added by AnnW, December 1996
+//
+	{
+	
+	TLex l;
+	TReal64 r64;
+	TInt jj;
+	
+	for (jj=0; jj<TInt(size_testd2/sizeof(DtoR_TEST64)); jj++)
+		{
+		const DtoR_TEST64* tst64=&testd2[jj];
+		l=tst64->iLex;
+		test(l.Val(r64)==KErrNone);
+		test(tst64->iRes==r64);
+		}
+	
+	TReal32 r32;
+
+	for (jj=0; jj<TInt(size_testd32/sizeof(DtoR_TEST32)); jj++)
+		{
+		const DtoR_TEST32* tst32=&testd32[jj];
+		l=tst32->iLex;
+		test(l.Val(r32)==KErrNone);
+		test(tst32->iRes==r32);
+		}
+	}	
+
+LOCAL_C void test6()
+//
+// Test string to real conversion in cases which are not exact
+// Added by AnnW, December 1996
+//
+	{
+	
+	TReal r64;
+	
+	for (TInt jj=0; jj<TInt(size_testApprox/sizeof(DtoR_TEST64)); jj++)
+		{
+		const DtoR_TEST64* tst64=&testApprox[jj];
+		TLex l=tst64->iLex;
+		test(l.Val(r64)==KErrNone);
+		test(tst64->iRes==r64);
+		}
+	}
+
+LOCAL_C void test7()
+//
+// Test errors in string to real conversion
+// added by AnnW, December 1996
+//
+	{
+
+	TReal r64;
+	TInt jj;
+
+	for (jj=0; jj<TInt(size_testerr2/sizeof(DtoR_ERR_TEST)); jj++)
+		{
+		const DtoR_ERR_TEST* errtst64=&testerr2[jj];
+		TLex l=errtst64->iLex;
+		TInt err=errtst64->iErr;
+		test(l.Val(r64)==err);
+		}
+
+	TReal32 r32;
+
+	for (jj=0; jj<TInt(size_testerr3/sizeof(DtoR_ERR_TEST)); jj++)
+		{
+		const DtoR_ERR_TEST* errtst32=&testerr3[jj];
+		TLex l=errtst32->iLex;
+		TInt err=errtst32->iErr;
+		test(l.Val(r32)==err);
+		}
+	}
+
+LOCAL_C void test8()
+//
+// Some tests for calc to check that a number entered is printed to same significance when
+// returned
+// do dtor and rtod test
+//
+	{
+
+	TLex l;
+	TBuf<0x100> buf;
+	TInt ret;
+	TReal64 num;
+
+	for (TInt jj=0;jj<TInt(size_calctest/sizeof(CALC_TEST));jj++)
+		{
+		// string to real
+		const CALC_TEST tst=calctest[jj];
+		l=tst.iLex;
+		test(l.Val(num)==KErrNone);
+		
+		// real to string
+ 		ret=buf.Num(num,tst.iFormat);
+		if (ret!=KErrGeneral)
+			{
+			buf.ZeroTerminate();
+			test(buf.Compare(TPtrC(tst.iRes))==0);
+			}
+		test(ret>=0);    
+		}
+	}
+
+// Tag on a few extra tests relating to ascii and unicode
+
+template<class R,class S,class L,class B,class T> 		
+class AsciiUnicode
+	{
+public:
+	void Test1();
+	};
+
+template<class R, class S,class L,class B,class T>
+void AsciiUnicode<R,S,L,B,T>::Test1()
+// R == TReal32 or TReal64
+// S == TText, TText8 or TText16
+// L == TLex, TLex8 or TLex16
+// B == TBuf, TBuf8 or TBuf16
+// T == TPtr, TPtr8 or TPtr16
+	{
+
+	L lex1(_TL("123.456"));
+	R real; // TReal32 or TReal64 
+	test(lex1.Val(real)==KErrNone);							 
+	test(Abs(real-123.456)<1E-5);
+	test(lex1.TokenLength()==7);
+	test((lex1.Remainder()).Compare(T(_TL(""),0,0))==0);
+	test(lex1.Val(real)==KErrGeneral);
+
+	L lex2(_TL("123.456abc"));
+	test(lex2.Val(real)==KErrNone);
+	test(Abs(real-123.456)<1E-5);
+	test(lex2.TokenLength()==7);
+	test((lex2.Remainder()).Compare(T(_TL("abc"),3,3))==0);
+	test(lex2.Val(real)==KErrGeneral);
+
+	L lex3;
+	real=(R)0.5;
+	test(lex3.Val(real)==KErrGeneral);
+	test(real==((R)0.5));
+	test(lex3.TokenLength()==0);
+
+	L lex4(_TL("abc123.45"));
+	real=(R)0.5;
+	test(lex4.Val(real)==KErrGeneral);
+	test(real==((R)0.5));
+
+	L Lex5(_TL("1.2e37"));
+	real=(R)0.5;
+	test(Lex5.Val(real)==KErrNone);
+	
+	L Lex6(_TL("1.2e"));
+	real=(R)0.5;
+	test(Lex6.Val(real)==KErrNone);
+
+	TRealFormat format(20,3); // first param width, 2nd decimals
+	real=(R)12345.6789;
+	B buf1;
+	test(buf1.Num(real,format)==10);
+	test(buf1.Compare(T(_TL("12,345.679"),10,10))==0);
+
+	B buf2(_TL("abc"));
+	test(buf2.AppendNum(real,format)==13);
+	test(buf2.Compare(T(_TL("abc12,345.679"),13,13))==0); 
+
+	B buf3;
+	test(buf3.AppendNum(real,format)==10);
+	test(buf3.Compare(T(_TL("12,345.679"),10,10))==0);
+	}
+
+#ifndef _DEBUG
+#pragma warning (disable :4710) //Function not expanded
+#pragma warning (disable :4702) //Unreachable code
+#endif
+
+GLDEF_C TInt E32Main()
+    {
+
+	test.Start(_L("Test ftol"));
+    TReal f=34.567;
+    TInt i=TInt(f);
+    test(i==34);
+	test.Next(_L("Test TBuf8/16::Num() using selected numbers"));
+	test1();
+	test.Next(_L("Test specific numbers for Math::Round(_,_,_)"));
+	test2();
+	test.Next(_L("Test TBuf8/16::Num() using selected numbers in calculator mode"));
+	test3();
+	test.Next(_L("Test errors"));
+	test4();
+	test.Next(_L("Test TLex8/16::Val using selected values which give exact results"));
+	test5();
+	test.Next(_L("Test TLex8/16::Val using values which do NOT give exact results"));
+	test6();
+	test.Next(_L("Test errors"));
+	test7();
+	test.Next(_L("Test for CALC"));
+	test8();
+	//
+	test.Next(_L("Ascii/Unicode: TText"));
+	AsciiUnicode<TReal64,TText,TLex,TBuf<0x20>,TPtr> T1;
+	T1.Test1();
+	test.Next(_L("Ascii/Unicode: TText8"));
+	AsciiUnicode<TReal32,TText8,TLex8,TBuf8<0x20>,TPtr8> T2;
+	T2.Test1();
+	test.Next(_L("Ascii/Unicode: TText16"));
+	AsciiUnicode<TReal32,TText16,TLex16,TBuf16<0x20>,TPtr16> T3;
+	T3.Test1();											
+	//
+	test.End();
+	return(KErrNone);
+	}
+#pragma warning (default :4710)
+#pragma warning (default :4702)
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32test/math/t_float.h	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,115 @@
+// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32test\math\t_float.h
+// Header file for T_FLOAT.CPP
+// 
+//
+
+
+#if !defined(__T_FLTCL_H__)
+#define __T_FLTCL_H__
+
+#if !defined(__E32STD_H__)
+#include <e32std.h> 
+#endif
+
+#include "t_vals.h"
+
+//Added by AnnW
+const TInt fixedLimitAndTriads=KRealFormatFixed | KGeneralLimit;
+const TInt fixedNoTriads=KRealFormatFixed | KDoNotUseTriads;
+const TInt fixedLimit=fixedNoTriads | KGeneralLimit;
+const TInt fixedSpaceForSign=fixedNoTriads | KExtraSpaceForSign;
+const TInt fixedTriadsAndSign=KRealFormatFixed | KExtraSpaceForSign; 
+const TInt fixedLimitAndSpaceForSign=fixedLimit |KExtraSpaceForSign;
+const TInt exponentThreeDigitExp=KRealFormatExponent | KAllowThreeDigitExp;
+const TInt exponentLimit=KRealFormatExponent | KGeneralLimit;
+const TInt exponentLimitAndThreeDigExp=exponentLimit | KAllowThreeDigitExp;
+const TInt generalSpaceForSign=KRealFormatGeneral | KExtraSpaceForSign;
+const TInt generalThreeDigitExp=KRealFormatGeneral | KAllowThreeDigitExp;
+const TInt generalLimit=KRealFormatGeneral | KGeneralLimit;
+const TInt noExponentNoTriads=KRealFormatNoExponent | KDoNotUseTriads;
+const TInt noExponentLimit=noExponentNoTriads | KGeneralLimit;
+const TInt calculatorThreeDigitExp=KRealFormatCalculator | KAllowThreeDigitExp;
+const TInt calculatorLimit=KRealFormatCalculator | KGeneralLimit;
+const TInt calculatorLimitAndThreeDigExp=calculatorLimit | KAllowThreeDigitExp;
+const TInt noExponentCalc=noExponentNoTriads | KExtraSpaceForSign;
+//
+// new - 17/3/97
+const TInt exponentThreeDigitExpAndSigFigs=KRealFormatExponent | KAllowThreeDigitExp | KUseSigFigs;
+const TInt exponentSigFigs=KRealFormatExponent | KUseSigFigs;
+
+
+// classes used by T_FLOAT.CPP
+
+class ROUND_TEST
+	{
+public:
+    TReal num; // input number 
+    TInt plcs; // number of places to be rounded 
+    TReal res; // expected result 
+    };
+
+class RtoB_TEST
+    {
+public: 
+	RtoB_TEST();
+	RtoB_TEST(TReal aNum,TInt aType,TInt aWidth,TInt aDecimals,TChar aPoint,TChar aTriad,TInt aTrilen,const TText* aRes);
+    TReal num; // input number 
+    TRealFormat format; // format 
+    const TText* res; // expected result 
+    };
+
+class ERR_TEST
+	{
+public:
+	ERR_TEST(TReal aNum,TInt aType,TInt aWidth,TInt aDecimals,TChar aPoint,TChar aTriad, TInt aTrilen,const TText* aRes=_S(""),TInt aErr=KErrGeneral);
+	RtoB_TEST rtob;
+	TInt err;
+	};
+
+class DtoR_TEST64
+    {
+public:
+	DtoR_TEST64(const TDesC& aDes,const TReal aRes) : iLex(aDes),iRes(aRes) {}
+    TLex iLex ;	// input string
+    TReal iRes;	// expected result
+    };
+
+class DtoR_TEST32
+    {
+public:
+	DtoR_TEST32(const TDesC& aDes,const TReal32 aRes) : iLex(aDes),iRes(aRes) {}
+    TLex iLex ;	// input string
+    TReal32 iRes;	// expected result
+    };
+
+class DtoR_ERR_TEST
+	{
+public:
+	DtoR_ERR_TEST(const TDesC& aDes,const TInt aErr) : iLex(aDes),iErr(aErr) {}
+	TLex iLex;
+	TInt iErr;
+	};
+
+class CALC_TEST
+	{
+public:
+	CALC_TEST(const TDesC& aDes,TInt aType,TInt aWidth,TInt aDecimals,TChar aPoint,TChar aTriad,TInt aTrilen,const TText* aRes);
+	TLex iLex;
+	TRealFormat iFormat; 
+    const TText* iRes; 
+	};
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32test/math/t_float1.cpp	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,452 @@
+// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32test\math\t_float1.cpp
+// File for T_FLOAT.CPP containing data for test1
+// T_FLOAT.CPP split into header files because there seems to be too much static data for GCC
+// compiler
+// 
+//
+
+#include "t_float.h"
+
+GLDEF_D RtoB_TEST testd[]=
+    {
+	// GENERAL format limited to 12 significant digits 
+	// No triads, no three-digit exponents and no extra space for sign
+    RtoB_TEST(1.23456789012501,generalLimit,32,15,'.',',',3,_S("1.23456789013")),
+    RtoB_TEST(1.2345678901249,generalLimit,32,15,'.',',',3,_S("1.23456789012")),
+    RtoB_TEST(1.99999999996,generalLimit,32,15,'.',',',3,_S("1.99999999996")),
+    RtoB_TEST(1.999999999996,generalLimit,32,15,'.',',',3,_S("2")),
+    RtoB_TEST(1.9999999999996,generalLimit,32,15,'.',',',3,_S("2")),
+    RtoB_TEST(1.99999999999996,generalLimit,32,15,'.',',',3,_S("2")),
+    RtoB_TEST(1.99999999994,generalLimit,32,15,'.',',',3,_S("1.99999999994")),
+    RtoB_TEST(1.999999999994,generalLimit,32,15,'.',',',3,_S("1.99999999999")),
+    RtoB_TEST(1.9999999999994,generalLimit,32,15,'.',',',3,_S("2")),
+    RtoB_TEST(1.99999999999994,generalLimit,32,15,'.',',',3,_S("2")),
+    RtoB_TEST(1.99999999996E2,generalLimit,32,15,'.',',',3,_S("199.999999996")),
+    RtoB_TEST(1.999999999996E-2,generalLimit,32,15,'.',',',3,_S("0.02")),
+    RtoB_TEST(1.9999999999996E2,generalLimit,32,15,'.',',',3,_S("200")),
+    RtoB_TEST(1.99999999999996E-2,generalLimit,32,15,'.',',',3,_S("0.02")),
+    RtoB_TEST(1.99999999994E2,generalLimit,32,15,'.',',',3,_S("199.999999994")),
+    RtoB_TEST(1.999999999994E-2,generalLimit,32,15,'.',',',3,_S("0.0199999999999")),
+    RtoB_TEST(1.9999999999994E99,generalLimit,32,15,'.',',',3,_S("2E+99")),
+    RtoB_TEST(1.99999999999994E-99,generalLimit,32,15,'.',',',3,_S("2E-99")),
+    RtoB_TEST(0.0,generalLimit,32,15,'.',',',3,_S("0")),
+ 	//
+    RtoB_TEST(1.2E+99,generalLimit,8,15,'.','0',0,_S("1.2E+99")),
+    RtoB_TEST(1.2E-99,generalLimit,8,15,'.','0',0,_S("1.2E-99")),
+    RtoB_TEST(-1.2E+99,generalLimit,8,15,'.','0',0,_S("-1.2E+99")),
+    RtoB_TEST(-1.2E-99,generalLimit,8,15,'.','0',0,_S("-1.2E-99")),
+	//
+    RtoB_TEST(1.2E+99,generalLimit,6,15,'.','0',0,_S("1E+99")),
+    RtoB_TEST(1.2E-99,generalLimit,6,15,'.','0',0,_S("1E-99")),
+    RtoB_TEST(-1.2E+99,generalLimit,7,15,'.','0',0,_S("-1E+99")),
+    RtoB_TEST(-1.2E-99,generalLimit,7,15,'.','0',0,_S("-1E-99")),
+	//
+    RtoB_TEST(1.2E+99,generalLimit,5,15,'.','0',0,_S("1E+99")),
+    RtoB_TEST(1.2E-99,generalLimit,5,15,'.','0',0,_S("1E-99")),
+    RtoB_TEST(-1.2E+99,generalLimit,6,15,'.','0',0,_S("-1E+99")),
+    RtoB_TEST(-1.2E-99,generalLimit,6,15,'.','0',0,_S("-1E-99")),
+	//
+    RtoB_TEST(1E+99,generalLimit,8,15,'.','0',0,_S("1E+99")),
+    RtoB_TEST(1E-99,generalLimit,8,15,'.','0',0,_S("1E-99")),
+    RtoB_TEST(-1E+99,generalLimit,9,15,'.','0',0,_S("-1E+99")),
+    RtoB_TEST(-1E-99,generalLimit,9,15,'.','0',0,_S("-1E-99")),
+	//
+    RtoB_TEST(1E+99,generalLimit,7,15,'.','0',0,_S("1E+99")),
+    RtoB_TEST(1E-99,generalLimit,7,15,'.','0',0,_S("1E-99")),
+    RtoB_TEST(-1E+99,generalLimit,8,15,'.','0',0,_S("-1E+99")),
+    RtoB_TEST(-1E-99,generalLimit,8,15,'.','0',0,_S("-1E-99")),
+	//
+    RtoB_TEST(1E+99,generalLimit,6,15,'.','0',0,_S("1E+99")),
+    RtoB_TEST(1E-99,generalLimit,6,15,'.','0',0,_S("1E-99")),
+    RtoB_TEST(-1E+99,generalLimit,7,15,'.','0',0,_S("-1E+99")),
+    RtoB_TEST(-1E-99,generalLimit,7,15,'.','0',0,_S("-1E-99")),
+	//
+    RtoB_TEST(1E+99,generalLimit,5,15,'.','0',0,_S("1E+99")),
+    RtoB_TEST(1E-99,generalLimit,5,15,'.','0',0,_S("1E-99")),
+    RtoB_TEST(-1E+99,generalLimit,6,15,'.','0',0,_S("-1E+99")),
+    RtoB_TEST(-1E-99,generalLimit,6,15,'.','0',0,_S("-1E-99")),
+	//
+    RtoB_TEST(0,generalLimit,2,14,'.','0',0,_S("0")),
+    RtoB_TEST(1,generalLimit,2,14,'.','0',0,_S("1")),
+    RtoB_TEST(370,generalLimit,20,14,'.','0',0,_S("370")),
+    RtoB_TEST(-9E98,fixedLimitAndTriads,150,15,'.',',',3,_S("-900,000,000,000,000,000,000,\
+000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,\
+000,000,000,000,000,000,000.000000000000000")),
+    RtoB_TEST(9E98,fixedLimitAndTriads,150,15,'.',',',3,_S("900,000,000,000,000,000,000,\
+000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,\
+000,000,000,000,000,000,000.000000000000000")),
+    RtoB_TEST(90000000.0,generalLimit,20,3,'.','0',0,_S("90000000")),
+    RtoB_TEST(90000000.0,generalLimit,9,3,'.','0',0,_S("90000000")),
+    RtoB_TEST(90000000.0,generalLimit,7,3,'.','0',0,_S("9E+07")),
+    RtoB_TEST(90000000.0,generalLimit,6,3,'.','0',0,_S("9E+07")),
+    RtoB_TEST(-900,generalLimit,20,3,'.','0',0,_S("-900")),
+    RtoB_TEST(-90000000.0,generalLimit,20,3,'.','0',0,_S("-90000000")),
+    RtoB_TEST(-90000000.0,generalLimit,9,3,'.','0',0,_S("-90000000")),
+    RtoB_TEST(-90000000.0,generalLimit,8,3,'.','0',0,_S("-9E+07")),
+    RtoB_TEST(-90000000.0,generalLimit,6,3,'.','0',0,_S("-9E+07")),
+    RtoB_TEST(900,generalLimit,20,3,'.','0',0,_S("900")),
+    RtoB_TEST(-900,generalLimit,20,3,'.','0',0,_S("-900")),
+    RtoB_TEST(999,generalLimit,3,3,'.','0',0,_S("999")),
+    RtoB_TEST(999.1,generalLimit,3,3,'.','0',0,_S("999")),
+    RtoB_TEST(999.1,generalLimit,4,3,'.','0',0,_S("999")),
+    RtoB_TEST(-999.1,generalLimit,4,3,'.','0',0,_S("-999")),
+    RtoB_TEST(-300,generalLimit,10,3,'.','0',0,_S("-300")),
+    RtoB_TEST(-355555555.0,generalLimit,6,3,'.','0',0,_S("-4E+08")),
+    RtoB_TEST(355555555.0,generalLimit,7,3,'.','0',0,_S("3.6E+08")),
+    RtoB_TEST(355555555.0,generalLimit,6,3,'.','0',0,_S("4E+08")),
+    RtoB_TEST(123456.0,generalLimit,6,4,'.','0',0,_S("123456")),
+    RtoB_TEST(999999.0,generalLimit,6,4,'.','0',0,_S("999999")),
+    RtoB_TEST(12346.0,generalLimit,5,4,'.','0',0,_S("12346")),
+    RtoB_TEST(9999999.0,generalLimit,5,4,'.','0',0,_S("1E+07")),
+	//
+    RtoB_TEST(0.02,generalLimit,6,4,'.','0',0,_S("0.02")),
+    RtoB_TEST(0.04,generalLimit,9,0,'.','0',0,_S("0.04")),
+    RtoB_TEST(0.004,generalLimit,9,0,'.','0',0,_S("0.004")),
+    RtoB_TEST(0.0004,generalLimit,9,0,'.','0',0, _S("4E-04")),
+    RtoB_TEST(0.05,generalLimit,9,0,'.','0',0,_S("0.05")),
+    RtoB_TEST(9.999999999964E-2,generalLimit,9,0,'.','0',0,_S("0.1")),
+    RtoB_TEST(0.0000999,generalLimit,7,4,'.','0',0,_S("1E-04")),
+
+	// FIXED FORMAT 
+	// test -ve number < 1 with 0 dp
+	RtoB_TEST(-0.01,KRealFormatFixed,7,0,'.','0',0,_S("0")),
+	RtoB_TEST(-0.4999999999,KRealFormatFixed,7,0,'.','0',0,_S("0")),
+	RtoB_TEST(-0.9,KRealFormatFixed,7,0,'.','0',0,_S("-1")),
+	RtoB_TEST(-0.51,KRealFormatFixed,7,0,'.','0',0,_S("-1")),
+	// No Triad separators (because length zero), no space for sign 
+    RtoB_TEST(0.0,KRealFormatFixed,7,0,'.','0',0,_S("0")),
+	RtoB_TEST(KNegZeroTReal64,KRealFormatFixed,7,0,'.','0',0,_S("0")),
+	RtoB_TEST(0.0,KRealFormatFixed,7,0,'.','0',0,_S("0")),
+    RtoB_TEST(0.0,KRealFormatFixed,7,2,'.','0',0,_S("0.00")),			
+    RtoB_TEST(0.0,KRealFormatFixed,7,3,'.','0',0,_S("0.000")),		
+    RtoB_TEST(0.0,KRealFormatFixed,7,4,'.','0',0,_S("0.0000")),		
+    RtoB_TEST(3.0,KRealFormatFixed,7,3,'.','0',0,_S("3.000")),
+    RtoB_TEST(12.9999,KRealFormatFixed,6,3,'.','0',0,_S("13.000")),
+    RtoB_TEST(123456.789,KRealFormatFixed,9,2,'.','0',0,_S("123456.79")),
+    RtoB_TEST(123456.0,KRealFormatFixed,9,2,'.','0',0,_S("123456.00")),
+    RtoB_TEST(1234567890123.,KRealFormatFixed,18,1,'.',',',0,_S("1234567890123.0")),
+    RtoB_TEST(123456.789,KRealFormatFixed,9,2,'.',',',0,_S("123456.79")),
+    RtoB_TEST(123456.0,KRealFormatFixed,9,2,'.',',',0,_S("123456.00")),
+    RtoB_TEST(1234567890123.,KRealFormatFixed,18,1,'.','0',0,_S("1234567890123.0")),
+	RtoB_TEST(.0453,KRealFormatFixed,12,4,'.','0',0,_S("0.0453")),
+    RtoB_TEST(.0453,KRealFormatFixed,12,2,'.','0',0,_S("0.05")),
+    RtoB_TEST(.0453,KRealFormatFixed,12,5,'.','0',0,_S("0.04530")),
+    RtoB_TEST(.00000876,KRealFormatFixed,11,9,'.','0',0,_S("0.000008760")),
+    RtoB_TEST(.00000876,KRealFormatFixed,11,8,'.','0',0,_S("0.00000876")),
+    RtoB_TEST(.00000876,KRealFormatFixed,11,7,'.','0',0,_S("0.0000088")),
+    RtoB_TEST(.00000876,KRealFormatFixed,11,6,'.','0',0,_S("0.000009")),
+    RtoB_TEST(.00000876,KRealFormatFixed,11,5,'.','0',0,_S("0.00001")),
+    RtoB_TEST(.123,KRealFormatFixed,5,3,'.','0',0,_S("0.123")),
+    RtoB_TEST(.1235,KRealFormatFixed,5,3,'.','0',0,_S("0.124")),
+    RtoB_TEST(1.0E4,KRealFormatFixed,10,2,'.',',',0,_S("10000.00")),
+	RtoB_TEST(1.0E-4,KRealFormatFixed,10,2,'.',',',0,_S("0.00")),	
+	// No triad separators (because flag not set), no space for sign
+	RtoB_TEST(123456.789,fixedNoTriads,9,2,'.','0',3,_S("123456.79")),
+    RtoB_TEST(123456.0,fixedNoTriads,9,2,'.','0',3,_S("123456.00")),
+    RtoB_TEST(1234567890123.,fixedNoTriads,18,1,'.',',',3,_S("1234567890123.0")),
+    RtoB_TEST(123456.789,fixedNoTriads,9,2,'.',',',3,_S("123456.79")),
+    RtoB_TEST(123456.0,fixedNoTriads,9,2,'.',',',3,_S("123456.00")),
+    RtoB_TEST(1234567890123.,fixedNoTriads,18,1,'.','0',3,_S("1234567890123.0")),
+	RtoB_TEST(.00000876,fixedNoTriads,11,9,'.','0',3,_S("0.000008760")),
+    RtoB_TEST(.00000876,fixedNoTriads,11,8,'.','0',3,_S("0.00000876")),
+    RtoB_TEST(.00000876,fixedNoTriads,11,7,'.','0',3,_S("0.0000088")),
+    RtoB_TEST(.00000876,fixedNoTriads,11,6,'.','0',3,_S("0.000009")),
+    RtoB_TEST(.00000876,fixedNoTriads,11,5,'.','0',3,_S("0.00001")),
+    // UK Triad separators, no space for sign 
+    RtoB_TEST(0.0,KRealFormatFixed,9,2,'.',',',3,_S("0.00")),
+    RtoB_TEST(.00568,KRealFormatFixed,9,2,'.',',',3,_S("0.01")),
+    RtoB_TEST(12345.0,KRealFormatFixed,9,2,'.',',',3,_S("12,345.00")),
+    RtoB_TEST(12345.669,KRealFormatFixed,9,2,'.',',',3,_S("12,345.67")),
+    RtoB_TEST(100000.0,KRealFormatFixed,10,2,'.',',',3,_S("100,000.00")),
+    RtoB_TEST(99999.999,KRealFormatFixed,10,2,'.',',',3,_S("100,000.00")),
+    RtoB_TEST(1234567890.675,KRealFormatFixed,16,2,'.',',',3,_S("1,234,567,890.68")),
+    RtoB_TEST(1.0E3,KRealFormatFixed,10,2,'.',',',3,_S("1,000.00")),
+    // French Triad separators, no space for sign 
+    RtoB_TEST(0.0,KRealFormatFixed,10,2,',',' ',4,_S("0,00")),
+    RtoB_TEST(.00568,KRealFormatFixed,10,2,',',' ',4,_S("0,01")),
+    RtoB_TEST(1.0E3,KRealFormatFixed,10,2,',',' ',4,_S("1000,00")),
+    RtoB_TEST(1234.0,KRealFormatFixed,10,2,',',' ',4,_S("1234,00")),
+    RtoB_TEST(12345.0,KRealFormatFixed,9,2,',',' ',4,_S("12 345,00")),
+    RtoB_TEST(12345.669,KRealFormatFixed,9,2,',',' ',4,_S("12 345,67")),
+    RtoB_TEST(100000.0,KRealFormatFixed,10,2,',',' ',4,_S("100 000,00")),
+    RtoB_TEST(99999.999,KRealFormatFixed,10,2,',',' ',4,_S("100 000,00")),
+    RtoB_TEST(1234567890.675,KRealFormatFixed,16,2,',',' ',4,_S("1 234 567 890,68")),
+    // '.' as triad separator, and ',' as decimal point, no space for sign 
+    RtoB_TEST(1234.0,KRealFormatFixed,10,2,',','.',3,_S("1.234,00")),
+	RtoB_TEST(0.0,KRealFormatFixed,10,2,',','.',3,_S("0,00")),
+    RtoB_TEST(.00568,KRealFormatFixed,10,2,',','.',3,_S("0,01")),
+    RtoB_TEST(1.0E3,KRealFormatFixed,10,2,',','.',3,_S("1.000,00")),
+    RtoB_TEST(12345.669,KRealFormatFixed,9,2,',','.',3,_S("12.345,67")),
+    RtoB_TEST(12345.0,KRealFormatFixed,9,2,',','.',4,_S("12.345,00")),
+    RtoB_TEST(100000.0,KRealFormatFixed,10,2,',','.',3,_S("100.000,00")),
+    RtoB_TEST(99999.999,KRealFormatFixed,10,2,',','.',3,_S("100.000,00")),
+    RtoB_TEST(1234567890.675,KRealFormatFixed,16,2,',','.',3,_S("1.234.567.890,68")),
+	// Added by AnnW
+	// no triads, space for sign
+	RtoB_TEST(0.0,fixedSpaceForSign,2,0,'.','0',0,_S("0")),					
+    RtoB_TEST(3.0,fixedSpaceForSign,6,3,'.','0',0,_S("3.000")),
+	RtoB_TEST(-3.0,fixedSpaceForSign,6,3,'.','0',0,_S("-3.000")),			
+    RtoB_TEST(12.9999,fixedSpaceForSign,7,3,'.','0',0,_S("13.000")),
+	RtoB_TEST(-12.9999,fixedSpaceForSign,7,3,'.','0',0,_S("-13.000")),		
+    RtoB_TEST(123456.789,fixedSpaceForSign,10,2,'.','0',0,_S("123456.79")),
+	RtoB_TEST(-123456.789,fixedSpaceForSign,10,2,'.','0',0,_S("-123456.79")),
+    RtoB_TEST(1234567890123.,fixedSpaceForSign,16,1,'.','0',0,_S("1234567890123.0")),
+    RtoB_TEST(-1234567890123.,fixedSpaceForSign,16,1,'.','0',0,_S("-1234567890123.0")),
+	RtoB_TEST(.0453,fixedSpaceForSign,12,4,'.','0',0,_S("0.0453")),
+    RtoB_TEST(.0453,fixedSpaceForSign,12,2,'.','0',0,_S("0.05")),
+    RtoB_TEST(.0453,fixedSpaceForSign,12,5,'.','0',0,_S("0.04530")),
+    RtoB_TEST(.00000876,fixedSpaceForSign,11,8,'.','0',0,_S("0.00000876")),
+    RtoB_TEST(-.00000876,fixedSpaceForSign,11,8,'.','0',0,_S("-0.00000876")),
+    RtoB_TEST(.00000876,fixedSpaceForSign,9,6,'.','0',0,_S("0.000009")),
+	RtoB_TEST(-.00000876,fixedSpaceForSign,9,6,'.','0',0,_S("-0.000009")),
+    RtoB_TEST(.1235,fixedSpaceForSign,6,3,'.','0',0,_S("0.124")),
+	RtoB_TEST(-.1235,fixedSpaceForSign,6,3,'.','0',0,_S("-0.124")),
+	// UK triads and space for sign
+	RtoB_TEST(0.0,fixedTriadsAndSign,10,2,'.',',',3,_S("0.00")),
+    RtoB_TEST(.00568,fixedTriadsAndSign,10,2,'.',',',3,_S("0.01")),
+	RtoB_TEST(-.00568,fixedTriadsAndSign,10,2,'.',',',3,_S("-0.01")),
+    RtoB_TEST(12345.0,fixedTriadsAndSign,10,2,'.',',',3,_S("12,345.00")),
+    RtoB_TEST(-12345.0,fixedTriadsAndSign,10,2,'.',',',3,_S("-12,345.00")),
+    RtoB_TEST(100000.0,fixedTriadsAndSign,11,2,'.',',',3,_S("100,000.00")),
+    RtoB_TEST(99999.999,fixedTriadsAndSign,11,2,'.',',',3,_S("100,000.00")),
+	RtoB_TEST(-99999.999,fixedTriadsAndSign,11,2,'.',',',3,_S("-100,000.00")),
+    RtoB_TEST(1234567890.675,fixedTriadsAndSign,17,2,'.',',',3,_S("1,234,567,890.68")),
+    RtoB_TEST(-1234567890.675,fixedTriadsAndSign,17,2,'.',',',3,_S("-1,234,567,890.68")),
+	RtoB_TEST(1.0E3,fixedTriadsAndSign,9,2,'.',',',3,_S("1,000.00")),
+    RtoB_TEST(-1.0E3,fixedTriadsAndSign,9,2,'.',',',3,_S("-1,000.00")),
+	//
+	RtoB_TEST(1234.9876E-107,KRealFormatFixed,12,6,'.','0',0,_S("0.000000")),
+    RtoB_TEST(1234.9876E-109,KRealFormatFixed,12,6,'.','0',0,_S("0.000000")),
+    RtoB_TEST(1234.9876E-110,KRealFormatFixed,12,6,'.','0',0,_S("0.000000")),
+    RtoB_TEST(1234.9876E-200,KRealFormatFixed,12,6,'.','0',0,_S("0.000000")),
+    RtoB_TEST(1234.9876E-300,KRealFormatFixed,12,6,'.','0',0,_S("0.000000")),
+
+	// FIXED FORMAT
+	// Limited
+	RtoB_TEST(1.23456789012501,fixedLimit,32,15,'.',',',0,_S("1.234567890130000")),
+    RtoB_TEST(1.2345678901249,fixedLimit,32,15,'.',',',3,_S("1.234567890120000")),
+    RtoB_TEST(1.99999999996,fixedLimit,32,15,'.',',',0,_S("1.999999999960000")),
+    RtoB_TEST(1.999999999996,fixedLimit,32,15,'.',',',0,_S("2.000000000000000")),
+    RtoB_TEST(1.9999999999996,fixedLimit,32,15,'.',',',3,_S("2.000000000000000")),
+    RtoB_TEST(1.99999999999996,fixedLimit,32,15,'.',',',3,_S("2.000000000000000")),
+	//
+	RtoB_TEST(1.23456789012501E+6,fixedLimitAndTriads,32,9,'.',',',3,_S("1,234,567.890130000")),
+    RtoB_TEST(1.2345678901249E+8,fixedLimitAndTriads,32,7,'.',',',3,_S("123,456,789.0120000")),
+    RtoB_TEST(1.99999999996E+3,fixedLimitAndTriads,32,12,'.',',',3,_S("1,999.999999960000")),
+    RtoB_TEST(1.999999999996E+12,fixedLimitAndTriads,32,3,'.',',',3,_S("2,000,000,000,000.000")),
+    RtoB_TEST(1.9999999999996E+4,fixedLimitAndTriads,32,11,'.',',',3,_S("20,000.00000000000")),
+    RtoB_TEST(1.99999999999996E+13,fixedLimitAndTriads,32,2,'.',',',3,_S("20,000,000,000,000.00")),
+	//
+	RtoB_TEST(1.23456789012501,fixedLimitAndSpaceForSign,32,15,'.',',',0,_S("1.234567890130000")),
+    RtoB_TEST(1.2345678901249,fixedLimitAndSpaceForSign,32,15,'.',',',3,_S("1.234567890120000")),
+    RtoB_TEST(1.99999999996,fixedLimitAndSpaceForSign,32,15,'.',',',0,_S("1.999999999960000")),
+    RtoB_TEST(1.999999999996,fixedLimitAndSpaceForSign,32,15,'.',',',0,_S("2.000000000000000")),
+    RtoB_TEST(1.9999999999996,fixedLimitAndSpaceForSign,32,15,'.',',',3,_S("2.000000000000000")),
+    RtoB_TEST(1.99999999999996,fixedLimitAndSpaceForSign,32,15,'.',',',3,_S("2.000000000000000")),
+	// end of added
+
+	// EXPONENT FORMAT 
+    // Zero Exponents 
+    RtoB_TEST(0.0,KRealFormatExponent,8,0,'.','0',0,_S("0E+00")),
+    RtoB_TEST(0.0,KRealFormatExponent,8,2,'.','0',0,_S("0.00E+00")),
+    RtoB_TEST(9.0,KRealFormatExponent,8,2,'.','0',0,_S("9.00E+00")),
+    RtoB_TEST(9.9,KRealFormatExponent,8,2,'.','0',0,_S("9.90E+00")),
+    RtoB_TEST(1234.9876E-3,KRealFormatExponent,12,6,'.','0',0,_S("1.234988E+00")),
+    // Positive Exponents, not allowing three-digit exponents 
+    RtoB_TEST(123.098785,KRealFormatExponent,8,2,'.','0',0,_S("1.23E+02")),
+    RtoB_TEST(123.098785,KRealFormatExponent,12,3,'.','0',0,_S("1.231E+02")),
+    RtoB_TEST(123.098785,KRealFormatExponent,12,4,'.','0',0,_S("1.2310E+02")),
+    RtoB_TEST(123.098785,KRealFormatExponent,12,5,'.','0',0,_S("1.23099E+02")),
+    RtoB_TEST(123.098785,KRealFormatExponent,12,6,'.','0',0,_S("1.230988E+02")),
+    RtoB_TEST(98765.0,KRealFormatExponent,12,5,'.','0',0,_S("9.87650E+04")),
+    RtoB_TEST(10000000.0,KRealFormatExponent,8,2,'.','0',0,_S("1.00E+07")),
+    RtoB_TEST(100000000.0,KRealFormatExponent,12,6,'.','0',0,_S("1.000000E+08")),
+    RtoB_TEST(100000000.000087643,KRealFormatExponent,12,6,'.','0',0,_S("1.000000E+08")),
+    RtoB_TEST(999999999.999,KRealFormatExponent,8,2,'.','0',0,_S("1.00E+09")),
+    RtoB_TEST(1234567.8765E12,KRealFormatExponent,8,2,'.','0',0,_S("1.23E+18")),
+    RtoB_TEST(1234567.8765E12,KRealFormatExponent,12,6,'.','0',0,_S("1.234568E+18")),
+    RtoB_TEST(34574567645555555.0E35,KRealFormatExponent,12,6,'.','0',0,_S("3.457457E+51")),
+    RtoB_TEST(123.098785E56,KRealFormatExponent,12,6,'.','0',0,_S("1.230988E+58")),
+    RtoB_TEST(.99999999E99,KRealFormatExponent,12,6,'.','0',0,_S("1.000000E+99")),
+    RtoB_TEST(1.0E99,KRealFormatExponent,12,6,'.','0',0,_S("1.000000E+99")),
+    // Negative Exponents, not allowing three-digit exponents 
+    RtoB_TEST(1234.9876E-4,KRealFormatExponent,12,6,'.','0',0,_S("1.234988E-01")),
+    RtoB_TEST(.0000000001235,KRealFormatExponent,8,2,'.','0',0,_S("1.24E-10")),
+    RtoB_TEST(.0000000001235,KRealFormatExponent,8,1,'.','0',0,_S("1.2E-10")),
+    RtoB_TEST(.0000000001235,KRealFormatExponent,9,3,'.','0',0,_S("1.235E-10")),
+    RtoB_TEST(.00000000999,KRealFormatExponent,8,2,'.','0',0,_S("9.99E-09")),
+    RtoB_TEST(.0000000001,KRealFormatExponent,12,6,'.','0',0,_S("1.000000E-10")),
+    RtoB_TEST(.00000000010001,KRealFormatExponent,12,6,'.','0',0,_S("1.000100E-10")),
+    RtoB_TEST(123.098785E-32,KRealFormatExponent,12,6,'.','0',0,_S("1.230988E-30")),
+    RtoB_TEST(123.098785E-87,KRealFormatExponent,12,6,'.','0',0,_S("1.230988E-85")),
+    RtoB_TEST(1.0E-99,KRealFormatExponent,12,6,'.','0',0,_S("1.000000E-99")),
+	// Added by AnnW
+	// Positive Exponents, allowing three-digit exponents 
+    RtoB_TEST(123.098785,exponentThreeDigitExp,12,6,'.','0',0,_S("1.230988E+02")),
+    RtoB_TEST(999999999.999,exponentThreeDigitExp,8,2,'.','0',0,_S("1.00E+09")),
+    RtoB_TEST(34574567645555555.0E35,exponentThreeDigitExp,12,6,'.','0',0,_S("3.457457E+51")),
+    RtoB_TEST(.99999999E99,exponentThreeDigitExp,12,6,'.','0',0,_S("1.000000E+99")),
+    RtoB_TEST(1.0E99,exponentThreeDigitExp,12,6,'.','0',0,_S("1.000000E+99")),
+	RtoB_TEST(1234.9876E-103,exponentThreeDigitExp,14,7,'.','0',0,_S("1.2349876E-100")),
+    RtoB_TEST(1234.9876E-107,exponentThreeDigitExp,14,6,'.','0',0,_S("1.234988E-104")),
+    RtoB_TEST(1234.9876E-109,exponentThreeDigitExp,14,7,'.','0',0,_S("1.2349876E-106")),
+    RtoB_TEST(1234.9876E-110,exponentThreeDigitExp,14,7,'.','0',0,_S("1.2349876E-107")),
+    RtoB_TEST(1234.9876E-200,exponentThreeDigitExp,14,7,'.','0',0,_S("1.2349876E-197")),
+    RtoB_TEST(1234.9876E-300,exponentThreeDigitExp,14,7,'.','0',0,_S("1.2349876E-297")),
+    RtoB_TEST(1234.9876E97,exponentThreeDigitExp,14,7,'.','0',0,_S("1.2349876E+100")),
+    RtoB_TEST(1234.9876E100,exponentThreeDigitExp,14,7,'.','0',0,_S("1.2349876E+103")),
+    RtoB_TEST(1234.9876E103,exponentThreeDigitExp,14,5,'.','0',0,_S("1.23499E+106")),
+    RtoB_TEST(1234.9876E200,exponentThreeDigitExp,14,7,'.','0',0,_S("1.2349876E+203")),
+    RtoB_TEST(1234.9876E300,exponentThreeDigitExp,14,7,'.','0',0,_S("1.2349876E+303")),
+    // Negative Exponents, allowing three-digit exponents 
+    RtoB_TEST(1234.9876E-4,exponentThreeDigitExp,12,6,'.','0',0,_S("1.234988E-01")),
+    RtoB_TEST(.00000000999,exponentThreeDigitExp,8,2,'.','0',0,_S("9.99E-09")),
+    RtoB_TEST(123.098785E-32,exponentThreeDigitExp,12,6,'.','0',0,_S("1.230988E-30")),
+    RtoB_TEST(123.098785E-87,exponentThreeDigitExp,12,6,'.','0',0,_S("1.230988E-85")),
+    RtoB_TEST(1.0E-99,exponentThreeDigitExp,12,6,'.','0',0,_S("1.000000E-99")),
+	// Limited
+	RtoB_TEST(1.23456789012501E24,exponentLimit,32,15,'.',',',3,_S("1.234567890130000E+24")),
+    RtoB_TEST(1.2345678901249E+97,exponentLimit,32,15,'.',',',3,_S("1.234567890120000E+97")),
+    RtoB_TEST(1.99999999996E-19,exponentLimit,32,15,'.',',',3,_S("1.999999999960000E-19")),
+    RtoB_TEST(1.999999999996E-53,exponentLimit,32,15,'.',',',3,_S("2.000000000000000E-53")),
+    RtoB_TEST(1.9999999999996E+46,exponentLimit,32,15,'.',',',3,_S("2.000000000000000E+46")),
+    RtoB_TEST(1.99999999999996,exponentLimit,32,15,'.',',',3,_S("2.000000000000000E+00")),
+	//
+	RtoB_TEST(1.23456789012501E24,exponentLimitAndThreeDigExp,32,15,'.',',',3,_S("1.234567890130000E+24")),
+    RtoB_TEST(1.2345678901249E+169,exponentLimitAndThreeDigExp,32,15,'.',',',3,_S("1.234567890120000E+169")),
+    RtoB_TEST(1.99999999996E-19,exponentLimitAndThreeDigExp,32,15,'.',',',3,_S("1.999999999960000E-19")),
+    RtoB_TEST(1.999999999996E-253,exponentLimitAndThreeDigExp,32,15,'.',',',3,_S("2.000000000000000E-253")),
+    RtoB_TEST(1.9999999999996E+246,exponentLimitAndThreeDigExp,32,15,'.',',',3,_S("2.000000000000000E+246")),
+    RtoB_TEST(1.99999999999996E-302,exponentLimitAndThreeDigExp,32,15,'.',',',3,_S("2.000000000000000E-302")),
+	// end of added
+	
+	// GENERAL FORMAT 
+    // Fixed format, no space for sign 
+    RtoB_TEST(0.000,KRealFormatGeneral,7,4,'.','0',0,_S("0")),
+    RtoB_TEST(98.000,KRealFormatGeneral,7,4,'.','0',0,_S("98")),
+    RtoB_TEST(12345.6700009,KRealFormatGeneral,12,4,'.','0',3,_S("12345.670001")),
+    RtoB_TEST(1.E2,KRealFormatGeneral,3,4,'.','0',0,_S("100")),
+    RtoB_TEST(1234.0,KRealFormatGeneral,4,4,'.','0',3,_S("1234")),
+    RtoB_TEST(1.2345,KRealFormatGeneral,4,4,'.','0',0,_S("1.23")),
+    RtoB_TEST(1.235,KRealFormatGeneral,4,4,'.','0',0,_S("1.24")),
+    RtoB_TEST(98765.0,KRealFormatGeneral,13,6,'.','0',0,_S("98765")),
+    RtoB_TEST(100000000.0,KRealFormatGeneral,13,6,'.','0',0,_S("100000000")),
+    RtoB_TEST(123.098785E00,KRealFormatGeneral,10,6,'.','0',0,_S("123.098785")),
+	RtoB_TEST(-123.098785E00,KRealFormatGeneral,10,6,'.','0',0,_S("-123.09879")),
+    RtoB_TEST(0.001209,KRealFormatGeneral,6,4,'.','0',0,_S("0.0012")),
+    RtoB_TEST(0.00100987,KRealFormatGeneral,7,4,'.','0',0,_S("0.00101")),
+    RtoB_TEST(1234.9876E-4,KRealFormatGeneral,13,6,'.','0',0,_S("0.12349876")),
+    RtoB_TEST(1234.9876E-5,KRealFormatGeneral,13,6,'.','0',0,_S("0.012349876")),
+    // Fixed format, space for sign 
+    RtoB_TEST(0.000,generalSpaceForSign,7,4,'.','0',0,_S("0")),
+    RtoB_TEST(98.000,generalSpaceForSign,7,4,'.','0',0,_S("98")),
+    RtoB_TEST(12345.6700009,generalSpaceForSign,13,4,'.','0',3,_S("12345.670001")),
+	RtoB_TEST(-12345.6700009,generalSpaceForSign,13,4,'.','0',3,_S("-12345.670001")),
+    RtoB_TEST(1.E2,generalSpaceForSign,4,4,'.','0',0,_S("100")),
+    RtoB_TEST(1234.0,generalSpaceForSign,5,4,'.','0',3,_S("1234")),
+    RtoB_TEST(1.2345,generalSpaceForSign,5,4,'.','0',0,_S("1.23")),
+    RtoB_TEST(1.235,generalSpaceForSign,5,4,'.','0',0,_S("1.24")),
+    RtoB_TEST(-1.235,generalSpaceForSign,5,4,'.','0',0,_S("-1.24")),
+	RtoB_TEST(98765.0,generalSpaceForSign,13,6,'.','0',0,_S("98765")),
+    RtoB_TEST(100000000.0,generalSpaceForSign,13,6,'.','0',0,_S("100000000")),
+    RtoB_TEST(123.098785E00,generalSpaceForSign,11,6,'.','0',0,_S("123.098785")),
+	RtoB_TEST(-123.098785E00,generalSpaceForSign,11,6,'.','0',0,_S("-123.098785")),
+    RtoB_TEST(0.001209,generalSpaceForSign,7,4,'.','0',0,_S("0.0012")),
+    RtoB_TEST(0.00100987,generalSpaceForSign,8,4,'.','0',0,_S("0.00101")),
+    RtoB_TEST(1234.9876E-4,generalSpaceForSign,11,6,'.','0',0,_S("0.12349876")),
+	RtoB_TEST(-1234.9876E-4,generalSpaceForSign,11,6,'.','0',0,_S("-0.12349876")),
+    RtoB_TEST(1234.9876E-5,generalSpaceForSign,12,6,'.','0',0,_S("0.012349876")),
+	RtoB_TEST(-1234.9876E-5,generalSpaceForSign,12,6,'.','0',0,_S("-0.012349876")),
+	// Initially the format type is exponent, but after rounding
+    // it is changed to fixed
+	// no space for sign 
+    RtoB_TEST(0.00099,KRealFormatGeneral,5,5,'.','0',0,_S("0.001")),
+    RtoB_TEST(0.00099999109,KRealFormatGeneral,6,5,'.','0',0,_S("0.001")),
+    // space allowed for sign
+	RtoB_TEST(0.00099,generalSpaceForSign,6,5,'.','0',0,_S("0.001")),
+    RtoB_TEST(0.00099999109,generalSpaceForSign,7,5,'.','0',0,_S("0.001")),
+    // Exponent format, two digit exponent only 
+    RtoB_TEST(10000000.0,KRealFormatGeneral,7,4,'.','0',0,_S("1E+07")),
+    RtoB_TEST(9999999.0,KRealFormatGeneral,6,4,'.','0',0,_S("1E+07")),
+    RtoB_TEST(1234567890123.0,KRealFormatGeneral,12,4,'.','0',0,_S("1.234568E+12")),
+    RtoB_TEST(1234567.8765E12,KRealFormatGeneral,10,6,'.','0',0,_S("1.2346E+18")),
+    RtoB_TEST(123.098785E56,KRealFormatGeneral,12,6,'.','0',0,_S("1.230988E+58")),
+    RtoB_TEST(0.0000678,KRealFormatGeneral,12,4,'.','0',0,_S("6.78E-05")),
+    RtoB_TEST(0.0000001234,KRealFormatGeneral,12,4,'.','0',0,_S("1.234E-07")),
+    RtoB_TEST(.99999999E99,KRealFormatGeneral,12,6,'.','0',0,_S("1E+99")),
+    RtoB_TEST(1.0E99,KRealFormatGeneral,12,6,'.','0',0,_S("1E+99")),
+    RtoB_TEST(.0000000001,KRealFormatGeneral,12,6,'.','0',0,_S("1E-10")),
+    RtoB_TEST(5384795.26E-52,KRealFormatGeneral,12,6,'.','0',0,_S("5.384795E-46")),
+    RtoB_TEST(123.098785E-87,KRealFormatGeneral,12,6,'.','0',0,_S("1.230988E-85")),
+    RtoB_TEST(.99999999E-99,KRealFormatGeneral,12,6,'.','0',0,_S("1E-99")),
+    RtoB_TEST(1.0E-99,KRealFormatGeneral,12,6,'.','0',0,_S("1E-99")),
+	// Exponent format, three-digit exponents allowed
+    RtoB_TEST(9999999.0,generalThreeDigitExp,6,4,'.','0',0,_S("1E+07")),
+    RtoB_TEST(1234567890123.0,generalThreeDigitExp,13,4,'.','0',0,_S("1234567890123")),	// Leave room for three-digit exponent, so can have fixed numbers one digit longer 
+    RtoB_TEST(1234567.8765E12,generalThreeDigitExp,11,6,'.','0',0,_S("1.23457E+18")),
+    RtoB_TEST(123.098785E56,generalThreeDigitExp,12,6,'.','0',0,_S("1.230988E+58")),
+    RtoB_TEST(.99999999E99,generalThreeDigitExp,12,6,'.','0',0,_S("1E+99")),
+    RtoB_TEST(1.0E99,generalThreeDigitExp,12,6,'.','0',0,_S("1E+99")),
+    RtoB_TEST(.0000000001,generalThreeDigitExp,12,6,'.','0',0,_S("1E-10")),
+    RtoB_TEST(5384795.26E-52,generalThreeDigitExp,12,6,'.','0',0,_S("5.384795E-46")),
+    RtoB_TEST(.99999999E-99,generalThreeDigitExp,12,6,'.','0',0,_S("1E-99")),
+    RtoB_TEST(1.0E-99,generalThreeDigitExp,12,6,'.','0',0,_S("1E-99")),
+	RtoB_TEST(1234.9876E-103,generalThreeDigitExp,12,15,'.','0',0,_S("1.23499E-100")),
+    RtoB_TEST(1234.9876E-107,generalThreeDigitExp,22,7,'.','0',0,_S("1.2349876E-104")),
+    RtoB_TEST(1234.9876E-109,generalThreeDigitExp,22,15,'.','0',0,_S("1.2349876E-106")),
+    RtoB_TEST(1234.9876E-110,generalThreeDigitExp,22,15,'.','0',0,_S("1.2349876E-107")),
+    RtoB_TEST(1234.9876E-200,generalThreeDigitExp,22,15,'.','0',0,_S("1.2349876E-197")),
+    RtoB_TEST(1234.9876E-300,generalThreeDigitExp,22,15,'.','0',0,_S("1.2349876E-297")),
+    RtoB_TEST(1234.9876E97,generalThreeDigitExp,12,15,'.','0',0,_S("1.23499E+100")),
+    RtoB_TEST(1234.9876E100,generalThreeDigitExp,22,15,'.','0',0,_S("1.2349876E+103")),
+    RtoB_TEST(1234.9876E103,generalThreeDigitExp,22,15,'.','0',0,_S("1.2349876E+106")),
+    RtoB_TEST(1234.9876E200,generalThreeDigitExp,22,15,'.','0',0,_S("1.2349876E+203")),
+    RtoB_TEST(1234.9876E300,generalThreeDigitExp,22,15,'.','0',0,_S("1.2349876E+303")),
+	//
+	RtoB_TEST(1.2E+100,generalThreeDigitExp,6,15,'.','0',0,_S("1E+100")),
+    RtoB_TEST(1.2E-100,generalThreeDigitExp,6,15,'.','0',0,_S("1E-100")),
+    RtoB_TEST(-1.2E+100,generalThreeDigitExp,7,15,'.','0',0,_S("-1E+100")),
+    RtoB_TEST(-1.2E-100,generalThreeDigitExp,7,15,'.','0',0,_S("-1E-100")),
+    RtoB_TEST(1.2E+100,generalThreeDigitExp,8,15,'.','0',0,_S("1.2E+100")),
+    RtoB_TEST(1.2E-100,generalThreeDigitExp,8,15,'.','0',0,_S("1.2E-100")),
+    RtoB_TEST(-1.2E+100,generalThreeDigitExp,9,15,'.','0',0,_S("-1.2E+100")),
+    RtoB_TEST(-1.2E-100,generalThreeDigitExp,9,15,'.','0',0,_S("-1.2E-100")),
+    RtoB_TEST(1E+100,generalThreeDigitExp,6,15,'.','0',0,_S("1E+100")),
+    RtoB_TEST(1E-100,generalThreeDigitExp,6,15,'.','0',0,_S("1E-100")),
+    RtoB_TEST(-1E+100,generalThreeDigitExp,7,15,'.','0',0,_S("-1E+100")),
+    RtoB_TEST(-1E-100,generalThreeDigitExp,7,15,'.','0',0,_S("-1E-100")),
+    RtoB_TEST(1E+100,generalThreeDigitExp,7,15,'.','0',0,_S("1E+100")),
+    RtoB_TEST(1E-100,generalThreeDigitExp,7,15,'.','0',0,_S("1E-100")),
+    RtoB_TEST(-1E+100,generalThreeDigitExp,8,15,'.','0',0,_S("-1E+100")),
+    RtoB_TEST(-1E-100,generalThreeDigitExp,8,15,'.','0',0,_S("-1E-100")),
+	//
+	RtoB_TEST(1.4E+308,generalThreeDigitExp,6,15,'.','0',0,_S("1E+308")),
+    RtoB_TEST(2.3E-308,generalThreeDigitExp,6,15,'.','0',0,_S("2E-308")),
+    RtoB_TEST(-1.4E+308,generalThreeDigitExp,7,15,'.','0',0,_S("-1E+308")),
+    RtoB_TEST(-2.3E-308,generalThreeDigitExp,7,15,'.','0',0,_S("-2E-308")),
+    RtoB_TEST(1.7E+308,generalThreeDigitExp,8,15,'.','0',0,_S("1.7E+308")),
+    RtoB_TEST(2.3E-308,generalThreeDigitExp,8,15,'.','0',0,_S("2.3E-308")),
+    RtoB_TEST(-1.7E+308,generalThreeDigitExp,9,15,'.','0',0,_S("-1.7E+308")),
+    RtoB_TEST(-2.3E-308,generalThreeDigitExp,9,15,'.','0',0,_S("-2.3E-308")),
+    RtoB_TEST(1.797693E+308,generalThreeDigitExp,15,15,'.','0',0,_S("1.797693E+308")),
+    RtoB_TEST(2.225074E-308,generalThreeDigitExp,15,15,'.','0',0,_S("2.225074E-308")),
+    RtoB_TEST(-1.797693E+308,generalThreeDigitExp,16,15,'.','0',0,_S("-1.797693E+308")),
+    RtoB_TEST(-2.225074E-308,generalThreeDigitExp,16,15,'.','0',0,_S("-2.225074E-308"))
+	};
+
+GLDEF_D TUint size_testd=sizeof(testd);
+
+ 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32test/math/t_float2.cpp	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,557 @@
+// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32test\math\t_float2.cpp
+// File for T_FLOAT.CPP containing data for test2, test3 and test4
+// T_FLOAT.CPP split into header files because there seems to be too much static
+// data for GCC compiler
+// 
+//
+
+#include "t_float.h"
+
+GLDEF_D ROUND_TEST testround[]=
+{
+{30,0,30},
+{1.47934,2,1.48},
+{-72.86345,3,-72.863},
+{-734.9999,0,-735.0},
+{4855.9974,1,4856.0},
+{232478.35,-1,232480.0},
+{1.0,2,1.00},
+{.0006,3,0.001},
+{0.00000012,-1,0.0},
+{4923.45,-1,4920.0},
+{0,4,0},
+{0,0,0},
+{7493650136.435,-5,7493700000.0},
+{-34.566732,7,-34.566732},
+{-36842.6570524,-2,-36800.0},
+{9,2,9.0},
+{.0000003,7,.0000003,},
+{.0000003,6,0.0},
+{476253405.342,-12,0.0},
+{.00000000000657,-3,0.0},
+{0.1,0,0},
+{9.9,0,10.0},
+{.0000008,6,.000001},
+{18.0,0,18.0},  
+{9.1,0,9.0},
+{9.5,0,10.0},
+{9.9,0,10.0},
+{0.9,0,1.0},
+{0.9,1, 0.9},
+{0.99,1,1.0}
+};
+
+GLDEF_D TUint size_testround=sizeof(testround);
+
+//Added by AnnW
+GLDEF_D RtoB_TEST testcalc[]=
+	{
+	RtoB_TEST(-1.234E+19,KRealFormatCalculator,20,12,'.',',',0,_S("-1.234E+19")),
+	// NO EXPONENT FORMAT - no triads because triad length==0 
+    RtoB_TEST(0,KRealFormatNoExponent,7,5,'.','0',0,_S("0")),			
+    RtoB_TEST(0,KRealFormatNoExponent,1,1,'.','0',0,_S("0")),
+	RtoB_TEST(0.00,KRealFormatNoExponent,7,4,'.','0',0,_S("0")),					
+    RtoB_TEST(3.000,KRealFormatNoExponent,7,5,'.','0',0,_S("3")),
+    RtoB_TEST(12.9999,KRealFormatNoExponent,6,4,'.','0',0,_S("13")),
+    RtoB_TEST(12.9999,KRealFormatNoExponent,4,4,'.','0',0,_S("13")),
+    RtoB_TEST(123456.0,KRealFormatNoExponent,6,6,'.','0',0,_S("123456")),
+	RtoB_TEST(123456.0,KRealFormatNoExponent,9,6,'.','0',0,_S("123456")),
+    RtoB_TEST(123456.0,KRealFormatNoExponent,10,8,'.',',',0,_S("123456")),
+	RtoB_TEST(123456.0000,KRealFormatNoExponent,16,8,'.',',',0,_S("123456")),
+	RtoB_TEST(123456.789,KRealFormatNoExponent,10,8,'.','0',0,_S("123456.79")),
+	RtoB_TEST(123456.789,KRealFormatNoExponent,11,9,'.',',',0,_S("123456.789")),
+	RtoB_TEST(123456.78900,KRealFormatNoExponent,13,11,'.',',',0,_S("123456.789")),
+	RtoB_TEST(1234567890123.00,KRealFormatNoExponent,18,16,'.',',',0,_S("1234567890123")),
+	RtoB_TEST(1234567890123.00,KRealFormatNoExponent,13,13,'.',',',0,_S("1234567890123")),
+    RtoB_TEST(1234567890123.,KRealFormatNoExponent,20,16,'.','0',0,_S("1234567890123")),
+	RtoB_TEST(.0453,KRealFormatNoExponent,12,10,'.','0',0,_S("0.0453")),
+    RtoB_TEST(.0453,KRealFormatNoExponent,12,1,'.','0',0,_S("0.05")),
+    RtoB_TEST(.00000876,KRealFormatNoExponent,12,10,'.','0',0,_S("0.00000876")),
+    RtoB_TEST(.00000876,KRealFormatNoExponent,12,8,'.','0',0,_S("0.00000876")),
+    RtoB_TEST(.00000876,KRealFormatNoExponent,9,7,'.','0',0,_S("0.0000088")),
+    RtoB_TEST(.00000876,KRealFormatNoExponent,8,6,'.','0',0,_S("0.000009")),
+    RtoB_TEST(.123,KRealFormatNoExponent,7,5,'.','0',0,_S("0.123")),
+	RtoB_TEST(.1230000,KRealFormatNoExponent,7,5,'.','0',0,_S("0.123")),
+	RtoB_TEST(.1230,KRealFormatNoExponent,7,5,'.','0',0,_S("0.123")),
+	RtoB_TEST(.1230,KRealFormatNoExponent,5,4,'.','0',0,_S("0.123")),
+    RtoB_TEST(.1235,KRealFormatNoExponent,6,4,'.','0',0,_S("0.1235")),
+	RtoB_TEST(10000.00,KRealFormatNoExponent,10,7,'.',',',0,_S("10000")),
+    RtoB_TEST(1.0E4,KRealFormatNoExponent,10,7,'.',',',0,_S("10000")),
+	RtoB_TEST(1234.9876,KRealFormatNoExponent,8,8,'.',',',0,_S("1234.988")),
+	RtoB_TEST(-1234.9876,KRealFormatNoExponent,9,8,'.',',',0,_S("-1234.988")),
+	RtoB_TEST(1234.9876E-8,KRealFormatNoExponent,8,8,'.',',',0,_S("0.000012")),
+	RtoB_TEST(-1234.9876E-8,KRealFormatNoExponent,8,7,'.',',',0,_S("-0.00001")),    
+	//					  - no triads because flag set
+	RtoB_TEST(0,noExponentNoTriads,7,5,'.','0',3,_S("0")),								
+    RtoB_TEST(3.000,noExponentNoTriads,7,5,'.','0',3,_S("3")),
+	RtoB_TEST(3.000,noExponentNoTriads,1,1,'.','0',3,_S("3")),
+    RtoB_TEST(12.9999,noExponentNoTriads,6,4,'.','0',3,_S("13")),
+    RtoB_TEST(123456.0,noExponentNoTriads,9,6,'.','0',0,_S("123456")),  // flag set and length==0
+    RtoB_TEST(123456.0,noExponentNoTriads,10,8,'.',',',3,_S("123456")),
+	RtoB_TEST(123456.0000,noExponentNoTriads,16,8,'.',',',3,_S("123456")),
+	RtoB_TEST(123456.789,noExponentNoTriads,10,8,'.','0',0,_S("123456.79")),  // flag set and length==0
+	RtoB_TEST(123456.789,noExponentNoTriads,9,8,'.','0',0,_S("123456.79")),  // flag set and length==0
+	RtoB_TEST(123456.789,noExponentNoTriads,11,9,'.',',',3,_S("123456.789")),
+	RtoB_TEST(123456.78900,noExponentNoTriads,13,11,'.',',',0,_S("123456.789")),  // flag set and length==0
+	RtoB_TEST(1234567890123.00,noExponentNoTriads,18,16,'.',',',3,_S("1234567890123")),
+    RtoB_TEST(1234567890123.,noExponentNoTriads,20,16,'.','0',0,_S("1234567890123")),  // flag set and length==0
+	RtoB_TEST(.0453,noExponentNoTriads,12,10,'.','0',3,_S("0.0453")),
+    RtoB_TEST(.0453,noExponentNoTriads,6,5,'.','0',3,_S("0.0453")),
+	RtoB_TEST(.0453,noExponentNoTriads,5,3,'.','0',3,_S("0.045")),
+    RtoB_TEST(.00000876,noExponentNoTriads,12,10,'.','0',3,_S("0.00000876")),
+	// 					  - UK triad separators
+	RtoB_TEST(0.0,KRealFormatNoExponent,9,6,'.',',',3,_S("0")),
+    RtoB_TEST(.00568,KRealFormatNoExponent,9,3,'.',',',3,_S("0.00568")),
+    RtoB_TEST(12345.0,KRealFormatNoExponent,9,6,'.',',',3,_S("12,345")),
+    RtoB_TEST(12345.669,KRealFormatNoExponent,10,7,'.',',',3,_S("12,345.67")),
+    RtoB_TEST(100000.0,KRealFormatNoExponent,10,8,'.',',',3,_S("100,000")),
+    RtoB_TEST(99999.999,KRealFormatNoExponent,10,7,'.',',',3,_S("100,000")),
+    RtoB_TEST(1234567890.675,KRealFormatNoExponent,17,12,'.',',',3,_S("1,234,567,890.68")),
+    RtoB_TEST(1234567890.675,KRealFormatNoExponent,16,12,'.',',',3,_S("1,234,567,890.68")),
+	RtoB_TEST(1.0E3,KRealFormatNoExponent,10,7,'.',',',3,_S("1,000")),
+	RtoB_TEST(12345.669,KRealFormatNoExponent,8,7,'.',',',3,_S("12,345.7")),
+	// 					  - French Triad separators
+	RtoB_TEST(0.0,KRealFormatNoExponent,10,7,',',' ',4,_S("0")),
+    RtoB_TEST(.00568,KRealFormatNoExponent,10,3,',',' ',4,_S("0,00568")),
+    RtoB_TEST(1.0E3,KRealFormatNoExponent,10,7,',',' ',4,_S("1000")),
+    RtoB_TEST(1234.0,KRealFormatNoExponent,10,7,',',' ',4,_S("1234")),
+    RtoB_TEST(12345.0,KRealFormatNoExponent,9,6,',',' ',4,_S("12 345")),
+    RtoB_TEST(12345.669,KRealFormatNoExponent,9,7,',',' ',4,_S("12 345,67")),
+    RtoB_TEST(100000.0,KRealFormatNoExponent,10,8,',',' ',4,_S("100 000")),
+	RtoB_TEST(100000.0,KRealFormatNoExponent,7,6,',',' ',4,_S("100 000")),
+    RtoB_TEST(99999.999,KRealFormatNoExponent,10,7,',',' ',4,_S("100 000")),
+    RtoB_TEST(1234567890.675,KRealFormatNoExponent,16,12,',',' ',4,_S("1 234 567 890,68")),
+	// '.' as triad separator, and ',' as decimal point
+    RtoB_TEST(1234.0,KRealFormatNoExponent,10,8,',','.',3,_S("1.234")),
+	RtoB_TEST(0.0,KRealFormatNoExponent,10,8,',','.',3,_S("0")),
+    RtoB_TEST(.00568,KRealFormatNoExponent,10,3,',','.',3,_S("0,00568")),
+    RtoB_TEST(1.0E3,KRealFormatNoExponent,10,6,',','.',3,_S("1.000")),
+    RtoB_TEST(12345.669,KRealFormatNoExponent,10,7,',','.',3,_S("12.345,67")),
+	RtoB_TEST(12345.669,KRealFormatNoExponent,9,7,',','.',3,_S("12.345,67")),
+    RtoB_TEST(12345.67,KRealFormatNoExponent,9,7,',','.',4,_S("12.345,67")),
+    RtoB_TEST(1234567890.675,KRealFormatNoExponent,16,12,',','.',3,_S("1.234.567.890,68")),
+	// Limited
+	RtoB_TEST(1.23456789012501,noExponentLimit,32,15,'.',',',3,_S("1.23456789013")),
+    RtoB_TEST(1.2345678901249,noExponentLimit,32,15,'.',',',3,_S("1.23456789012")),
+    RtoB_TEST(1.99999999996,noExponentLimit,32,15,'.',',',3,_S("1.99999999996")),
+    RtoB_TEST(1.999999999996,noExponentLimit,32,15,'.',',',3,_S("2")),
+    RtoB_TEST(1.9999999999996,noExponentLimit,32,15,'.',',',3,_S("2")),
+    RtoB_TEST(1.99999999999996,noExponentLimit,32,15,'.',',',3,_S("2")),
+	// Calc setting - no triads and space for sign, width=14, dp=12
+	RtoB_TEST(1.234567890123,noExponentCalc,14,12,'.',',',3,_S("1.23456789012")),
+    RtoB_TEST(1.234567890129,noExponentCalc,14,12,'.',',',3,_S("1.23456789013")),
+	RtoB_TEST(-1.234567890123,noExponentCalc,14,12,'.',',',3,_S("-1.23456789012")),
+    RtoB_TEST(-1.234567890129,noExponentCalc,14,12,'.',',',3,_S("-1.23456789013")),
+	RtoB_TEST(123456789012.00,noExponentCalc,14,12,'.',',',0,_S("123456789012")),    
+	RtoB_TEST(999999999999.00,noExponentCalc,14,12,'.',',',0,_S("999999999999")),    
+	//
+	// CALCULATOR format
+	// No Exponent format 
+    RtoB_TEST(1.234E-8,KRealFormatCalculator,20,12,'.',',',0,_S("0.00000001234")),
+	RtoB_TEST(1.234E-7,KRealFormatCalculator,20,12,'.',',',0,_S("0.0000001234")),
+	RtoB_TEST(1.234E-6,KRealFormatCalculator,20,12,'.',',',0,_S("0.000001234")),
+	RtoB_TEST(1.234E-3,KRealFormatCalculator,20,12,'.',',',0,_S("0.001234")),
+	RtoB_TEST(1.234E-2,KRealFormatCalculator,20,12,'.',',',0,_S("0.01234")),
+	RtoB_TEST(1E-11,KRealFormatCalculator,20,12,'.',',',0,_S("0.00000000001")),
+	RtoB_TEST(1.2E-10,KRealFormatCalculator,20,12,'.',',',0,_S("0.00000000012")),
+	RtoB_TEST(1.23E-9,KRealFormatCalculator,20,12,'.',',',0,_S("0.00000000123")),
+	RtoB_TEST(1.234E-8,KRealFormatCalculator,20,12,'.',',',0,_S("0.00000001234")),
+	RtoB_TEST(1.2345E-7,KRealFormatCalculator,20,12,'.',',',0,_S("0.00000012345")),
+	RtoB_TEST(1.23456E-6,KRealFormatCalculator,20,12,'.',',',0,_S("0.00000123456")),
+	RtoB_TEST(1.234567E-5,KRealFormatCalculator,20,12,'.',',',0,_S("0.00001234567")),
+	RtoB_TEST(1.2345678E-4,KRealFormatCalculator,20,12,'.',',',0,_S("0.00012345678")),
+	RtoB_TEST(1.23456789E-3,KRealFormatCalculator,20,12,'.',',',0,_S("0.00123456789")),
+	RtoB_TEST(1.234567891E-2,KRealFormatCalculator,20,12,'.',',',0,_S("0.01234567891")),
+	RtoB_TEST(1.2345678912E-1,KRealFormatCalculator,20,12,'.',',',0,_S("0.12345678912")),
+	RtoB_TEST(1.23456789123E0,KRealFormatCalculator,20,12,'.',',',0,_S("1.23456789123")),
+	//
+	RtoB_TEST(0.000,KRealFormatCalculator,10,4,'.','0',0,_S("0")),
+    RtoB_TEST(98.000,KRealFormatCalculator,10,4,'.','0',0,_S("98")),
+    RtoB_TEST(12345.6700009,KRealFormatCalculator,17,11,'.','0',3,_S("12345.670001")),
+    RtoB_TEST(1.E2,KRealFormatCalculator,10,4,'.','0',0,_S("100")),
+    RtoB_TEST(1234.0,KRealFormatCalculator,10,4,'.','0',3,_S("1234")),
+    RtoB_TEST(1.2345,KRealFormatCalculator,10,3,'.','0',0,_S("1.23")),
+    RtoB_TEST(1.235,KRealFormatCalculator,9,3,'.','0',0,_S("1.24")),
+    RtoB_TEST(98765.0,KRealFormatCalculator,13,6,'.','0',0,_S("98765")),
+    RtoB_TEST(100000000.0,KRealFormatCalculator,15,9,'.','0',0,_S("100000000")),
+    RtoB_TEST(123.098785E00,KRealFormatCalculator,15,9,'.','0',0,_S("123.098785")),
+	RtoB_TEST(-123.098785E00,KRealFormatCalculator,15,8,'.','0',0,_S("-123.09879")),
+    RtoB_TEST(1234.9876E-4,KRealFormatCalculator,15,9,'.','0',0,_S("0.12349876")),
+    RtoB_TEST(1234.9876E-5,KRealFormatCalculator,16,10,'.','0',0,_S("0.012349876")),
+ 	RtoB_TEST(0.0099,KRealFormatCalculator,11,5,'.','0',0,_S("0.0099")),
+	RtoB_TEST(0.099,KRealFormatCalculator,10,4,'.','0',0,_S("0.099")),
+	RtoB_TEST(0.001209,KRealFormatCalculator,15,7,'.','0',0,_S("0.001209")),
+	RtoB_TEST(0.00100987,KRealFormatCalculator,15,9,'.','0',0,_S("0.00100987")),
+	RtoB_TEST(0.678,KRealFormatCalculator,10,4,'.','0',0,_S("0.678")),
+    RtoB_TEST(99999.0,KRealFormatCalculator,12,6,'.','0',0,_S("99999")),
+	RtoB_TEST(12345678901234567890.0,KRealFormatCalculator,20,12,'.','0',0,_S("1.23456789012E+19")),
+    RtoB_TEST(1234567890123.0,KRealFormatCalculator,13,7,'.','0',0,_S("1.234568E+12")),
+	// Initially the format type is exponent, but after rounding it is changed to fixed
+    RtoB_TEST(0.00099999,KRealFormatCalculator,10,4,'.','0',0,_S("0.001")),
+    // Exponent format, two digit exponent only 
+	RtoB_TEST(1.23412341234E-11,KRealFormatCalculator,20,12,'.',',',0,_S("1.23412341234E-11")),
+	RtoB_TEST(1.23412341234E-8,KRealFormatCalculator,20,12,'.',',',0,_S("1.23412341234E-08")),
+	RtoB_TEST(1.23412341234E-7,KRealFormatCalculator,20,12,'.',',',0,_S("1.23412341234E-07")),
+	RtoB_TEST(1.23412341234E-6,KRealFormatCalculator,20,12,'.',',',0,_S("1.23412341234E-06")),
+	RtoB_TEST(1.23412341234E-3,KRealFormatCalculator,20,12,'.',',',0,_S("1.23412341234E-03")),
+	RtoB_TEST(1.23412341234E-2,KRealFormatCalculator,20,12,'.',',',0,_S("1.23412341234E-02")),
+	RtoB_TEST(1.23412341234123E-7,KRealFormatCalculator,20,12,'.',',',0,_S("1.23412341234E-07")),
+	RtoB_TEST(1.234E-11,KRealFormatCalculator,20,12,'.',',',0,_S("1.234E-11")),
+	RtoB_TEST(1.234E-9,KRealFormatCalculator,20,12,'.',',',0,_S("1.234E-09")),
+	//
+	RtoB_TEST(10000000.0,KRealFormatCalculator,13,7,'.','0',0,_S("1E+07")),
+	RtoB_TEST(0.001209,KRealFormatCalculator,11,5,'.','0',0,_S("1.209E-03")),
+	RtoB_TEST(0.00100987,KRealFormatCalculator,12,6,'.','0',0,_S("1.00987E-03")),
+	RtoB_TEST(0.00099999109,KRealFormatCalculator,13,7,'.','0',0,_S("9.999911E-04")),
+	RtoB_TEST(0.0000678,KRealFormatCalculator,9,3,'.','0',0,_S("6.78E-05")),
+    RtoB_TEST(1234567.8765E12,KRealFormatCalculator,11,5,'.','0',0,_S("1.2346E+18")),
+    RtoB_TEST(123.098785E56,KRealFormatCalculator,13,7,'.','0',0,_S("1.230988E+58")),
+    RtoB_TEST(0.0000001234,KRealFormatCalculator,10,4,'.','0',0,_S("1.234E-07")),
+    RtoB_TEST(.99999999E99,KRealFormatCalculator,12,6,'.','0',0,_S("1E+99")),
+    RtoB_TEST(1.0E99,KRealFormatCalculator,12,6,'.','0',0,_S("1E+99")),
+    RtoB_TEST(.00000000001,KRealFormatCalculator,12,6,'.','0',0,_S("1E-11")),
+    RtoB_TEST(5384795.26E-52,KRealFormatCalculator,13,7,'.','0',0,_S("5.384795E-46")),
+    RtoB_TEST(123.098785E-87,KRealFormatCalculator,13,7,'.','0',0,_S("1.230988E-85")),
+    RtoB_TEST(.99999999E-99,KRealFormatCalculator,12,6,'.','0',0,_S("1E-99")),
+    RtoB_TEST(1.0E-99,KRealFormatCalculator,12,6,'.','0',0,_S("1E-99")),
+	//
+	RtoB_TEST(1E-12,KRealFormatCalculator,20,12,'.',',',0,_S("1E-12")),
+	RtoB_TEST(1.2E-11,KRealFormatCalculator,20,12,'.',',',0,_S("1.2E-11")),
+	RtoB_TEST(1.23E-10,KRealFormatCalculator,20,12,'.',',',0,_S("1.23E-10")),
+	RtoB_TEST(1.234E-9,KRealFormatCalculator,20,12,'.',',',0,_S("1.234E-09")),
+	RtoB_TEST(1.2345E-8,KRealFormatCalculator,20,12,'.',',',0,_S("1.2345E-08")),
+	RtoB_TEST(1.23456E-7,KRealFormatCalculator,20,12,'.',',',0,_S("1.23456E-07")),
+	RtoB_TEST(1.234567E-6,KRealFormatCalculator,20,12,'.',',',0,_S("1.234567E-06")),
+	RtoB_TEST(1.2345678E-5,KRealFormatCalculator,20,12,'.',',',0,_S("1.2345678E-05")),
+	RtoB_TEST(1.23456789E-4,KRealFormatCalculator,20,12,'.',',',0,_S("1.23456789E-04")),
+	RtoB_TEST(1.234567891E-3,KRealFormatCalculator,20,12,'.',',',0,_S("1.234567891E-03")),
+	RtoB_TEST(1.2345678912E-2,KRealFormatCalculator,20,12,'.',',',0,_S("1.2345678912E-02")),
+	RtoB_TEST(1.23456789123E-1,KRealFormatCalculator,20,12,'.',',',0,_S("1.23456789123E-01")),
+	RtoB_TEST(1.234567891234,KRealFormatCalculator,20,12,'.',',',0,_S("1.23456789123")),
+	// Exponent format, three-digit exponents allowed
+    RtoB_TEST(9999999.0,calculatorThreeDigitExp,11,4,'.','0',0,_S("1E+07")),
+    RtoB_TEST(1234567890123.0,calculatorThreeDigitExp,20,13,'.','0',0,_S("1234567890123")),	// Leave room for three-digit exponent, so can have fixed numbers one digit longer 
+    RtoB_TEST(1234567.8765E12,calculatorThreeDigitExp,13,6,'.','0',0,_S("1.23457E+18")),
+    RtoB_TEST(123.098785E56,calculatorThreeDigitExp,14,7,'.','0',0,_S("1.230988E+58")),
+    RtoB_TEST(.99999999E99,calculatorThreeDigitExp,13,6,'.','0',0,_S("1E+99")),
+    RtoB_TEST(1.0E99,calculatorThreeDigitExp,13,6,'.','0',0,_S("1E+99")),
+    RtoB_TEST(.000000000001,calculatorThreeDigitExp,13,6,'.','0',0,_S("1E-12")),
+    RtoB_TEST(5384795.26E-52,calculatorThreeDigitExp,14,7,'.','0',0,_S("5.384795E-46")),
+    RtoB_TEST(.99999999E-99,calculatorThreeDigitExp,13,6,'.','0',0,_S("1E-99")),
+    RtoB_TEST(1.0E-99,calculatorThreeDigitExp,13,6,'.','0',0,_S("1E-99")),
+	RtoB_TEST(1234.9876E-103,calculatorThreeDigitExp,13,6,'.','0',0,_S("1.23499E-100")),
+    RtoB_TEST(1234.9876E-107,calculatorThreeDigitExp,15,8,'.','0',0,_S("1.2349876E-104")),
+    RtoB_TEST(1234.9876E-109,calculatorThreeDigitExp,15,8,'.','0',0,_S("1.2349876E-106")),
+    RtoB_TEST(1234.9876E-110,calculatorThreeDigitExp,16,9,'.','0',0,_S("1.2349876E-107")),
+    RtoB_TEST(1234.9876E-200,calculatorThreeDigitExp,17,10,'.','0',0,_S("1.2349876E-197")),
+    RtoB_TEST(1234.9876E-300,calculatorThreeDigitExp,17,10,'.','0',0,_S("1.2349876E-297")),
+    RtoB_TEST(1234.9876E97,calculatorThreeDigitExp,13,6,'.','0',0,_S("1.23499E+100")),
+    RtoB_TEST(1234.9876E100,calculatorThreeDigitExp,15,8,'.','0',0,_S("1.2349876E+103")),
+    RtoB_TEST(1234.9876E103,calculatorThreeDigitExp,15,8,'.','0',0,_S("1.2349876E+106")),
+    RtoB_TEST(1234.9876E200,calculatorThreeDigitExp,16,9,'.','0',0,_S("1.2349876E+203")),
+    RtoB_TEST(1234.9876E300,calculatorThreeDigitExp,17,10,'.','0',0,_S("1.2349876E+303")),
+	//
+	RtoB_TEST(1.2E+100,calculatorThreeDigitExp,8,1,'.','0',0,_S("1E+100")),
+    RtoB_TEST(1.2E-100,calculatorThreeDigitExp,8,1,'.','0',0,_S("1E-100")),
+    RtoB_TEST(-1.2E+100,calculatorThreeDigitExp,8,1,'.','0',0,_S("-1E+100")),
+    RtoB_TEST(-1.2E-100,calculatorThreeDigitExp,8,1,'.','0',0,_S("-1E-100")),
+    RtoB_TEST(1.2E+100,calculatorThreeDigitExp,9,2,'.','0',0,_S("1.2E+100")),
+    RtoB_TEST(1.2E-100,calculatorThreeDigitExp,9,2,'.','0',0,_S("1.2E-100")),
+    RtoB_TEST(-1.2E+100,calculatorThreeDigitExp,9,2,'.','0',0,_S("-1.2E+100")),
+    RtoB_TEST(-1.2E-100,calculatorThreeDigitExp,9,2,'.','0',0,_S("-1.2E-100")),
+    RtoB_TEST(1E+100,calculatorThreeDigitExp,9,2,'.','0',0,_S("1E+100")),
+    RtoB_TEST(1E-100,calculatorThreeDigitExp,9,2,'.','0',0,_S("1E-100")),
+    RtoB_TEST(-1E+100,calculatorThreeDigitExp,9,2,'.','0',0,_S("-1E+100")),
+    RtoB_TEST(-1E-100,calculatorThreeDigitExp,9,2,'.','0',0,_S("-1E-100")),
+    RtoB_TEST(1E+100,calculatorThreeDigitExp,8,1,'.','0',0,_S("1E+100")),
+    RtoB_TEST(1E-100,calculatorThreeDigitExp,8,1,'.','0',0,_S("1E-100")),
+    RtoB_TEST(-1E+100,calculatorThreeDigitExp,8,1,'.','0',0,_S("-1E+100")),
+    RtoB_TEST(-1E-100,calculatorThreeDigitExp,8,1,'.','0',0,_S("-1E-100")),
+	//
+	RtoB_TEST(1.4E+308,calculatorThreeDigitExp,8,1,'.','0',0,_S("1E+308")),
+    RtoB_TEST(2.3E-308,calculatorThreeDigitExp,8,1,'.','0',0,_S("2E-308")),
+    RtoB_TEST(-1.4E+308,calculatorThreeDigitExp,8,1,'.','0',0,_S("-1E+308")),
+    RtoB_TEST(-2.3E-308,calculatorThreeDigitExp,8,1,'.','0',0,_S("-2E-308")),
+    RtoB_TEST(1.7E+308,calculatorThreeDigitExp,9,2,'.','0',0,_S("1.7E+308")),
+    RtoB_TEST(2.3E-308,calculatorThreeDigitExp,10,3,'.','0',0,_S("2.3E-308")),
+    RtoB_TEST(-1.7E+308,calculatorThreeDigitExp,10,3,'.','0',0,_S("-1.7E+308")),
+    RtoB_TEST(-2.3E-308,calculatorThreeDigitExp,9,2,'.','0',0,_S("-2.3E-308")),
+    RtoB_TEST(1.797693E+308,calculatorThreeDigitExp,15,7,'.','0',0,_S("1.797693E+308")),
+    RtoB_TEST(2.225074E-308,calculatorThreeDigitExp,16,8,'.','0',0,_S("2.225074E-308")),
+    RtoB_TEST(-1.797693E+308,calculatorThreeDigitExp,16,8,'.','0',0,_S("-1.797693E+308")),
+    RtoB_TEST(-2.225074E-308,calculatorThreeDigitExp,16,7,'.','0',0,_S("-2.225074E-308")),
+	// Limited
+	RtoB_TEST(1.23456789012501E24,calculatorLimit,21,15,'.',',',3,_S("1.23456789013E+24")),
+    RtoB_TEST(1.2345678901249E+97,calculatorLimit,32,15,'.',',',3,_S("1.23456789012E+97")),
+    RtoB_TEST(1.99999999996E-19,calculatorLimit,21,15,'.',',',3,_S("1.99999999996E-19")),
+    RtoB_TEST(1.999999999996E-53,calculatorLimit,32,15,'.',',',3,_S("2E-53")),
+    RtoB_TEST(1.9999999999996E+46,calculatorLimit,32,15,'.',',',3,_S("2E+46")),
+	//
+	RtoB_TEST(1.23456789012501,calculatorLimit,32,15,'.',',',3,_S("1.23456789013")),
+    RtoB_TEST(1.2345678901249,calculatorLimit,32,15,'.',',',3,_S("1.23456789012")),
+    RtoB_TEST(1.99999999996,calculatorLimit,32,15,'.',',',3,_S("1.99999999996")),
+    RtoB_TEST(1.999999999996,calculatorLimit,32,15,'.',',',3,_S("2")),
+    RtoB_TEST(1.9999999999996,calculatorLimit,32,15,'.',',',3,_S("2")),
+    RtoB_TEST(1.99999999999996,calculatorLimit,32,15,'.',',',3,_S("2")),
+	//
+	RtoB_TEST(1.23456789012501E24,calculatorLimitAndThreeDigExp,22,15,'.',',',3,_S("1.23456789013E+24")),
+    RtoB_TEST(1.2345678901249E+197,calculatorLimitAndThreeDigExp,32,15,'.',',',3,_S("1.23456789012E+197")),
+    RtoB_TEST(1.99999999996E-19,calculatorLimitAndThreeDigExp,22,15,'.',',',3,_S("1.99999999996E-19")),
+    RtoB_TEST(1.999999999996E-153,calculatorLimitAndThreeDigExp,32,15,'.',',',3,_S("2E-153")),
+    RtoB_TEST(1.9999999999996E+246,calculatorLimitAndThreeDigExp,32,15,'.',',',3,_S("2E+246")),
+	RtoB_TEST(1.99999999999996E-302,calculatorLimitAndThreeDigExp,32,15,'.',',',3,_S("2E-302")),
+
+	// new - exponent with significant figures
+	RtoB_TEST(10000000.0,exponentSigFigs,13,7,'.','0',0,_S("1E+07")),
+    RtoB_TEST(9999999.0,exponentSigFigs,12,6,'.','0',0,_S("1E+07")),
+    RtoB_TEST(1234567890123.0,exponentSigFigs,13,7,'.','0',0,_S("1.234568E+12")),
+    RtoB_TEST(1234567.8765E12,exponentSigFigs,11,5,'.','0',0,_S("1.2346E+18")),
+    RtoB_TEST(123.098785E56,exponentSigFigs,13,7,'.','0',0,_S("1.230988E+58")),
+    RtoB_TEST(0.0000678,exponentSigFigs,9,3,'.','0',0,_S("6.78E-05")),
+    RtoB_TEST(0.0000001234,exponentSigFigs,10,4,'.','0',0,_S("1.234E-07")),
+    RtoB_TEST(.99999999E99,exponentSigFigs,12,6,'.','0',0,_S("1E+99")),
+    RtoB_TEST(1.0E99,exponentSigFigs,12,6,'.','0',0,_S("1E+99")),
+    RtoB_TEST(.0000000001,exponentSigFigs,12,6,'.','0',0,_S("1E-10")),
+    RtoB_TEST(5384795.26E-52,exponentSigFigs,13,7,'.','0',0,_S("5.384795E-46")),
+    RtoB_TEST(123.098785E-87,exponentSigFigs,13,7,'.','0',0,_S("1.230988E-85")),
+    RtoB_TEST(.99999999E-99,exponentSigFigs,12,6,'.','0',0,_S("1E-99")),
+    RtoB_TEST(1.0E-99,exponentSigFigs,12,6,'.','0',0,_S("1E-99")),
+	// three-digit exponents allowed
+    RtoB_TEST(9999999.0,exponentThreeDigitExpAndSigFigs,11,4,'.','0',0,_S("1E+07")),
+    RtoB_TEST(1234567.8765E12,exponentThreeDigitExpAndSigFigs,13,6,'.','0',0,_S("1.23457E+18")),
+    RtoB_TEST(123.098785E56,exponentThreeDigitExpAndSigFigs,14,7,'.','0',0,_S("1.230988E+58")),
+    RtoB_TEST(.99999999E99,exponentThreeDigitExpAndSigFigs,13,6,'.','0',0,_S("1E+99")),
+    RtoB_TEST(1.0E99,exponentThreeDigitExpAndSigFigs,13,6,'.','0',0,_S("1E+99")),
+    RtoB_TEST(.0000000001,exponentThreeDigitExpAndSigFigs,13,6,'.','0',0,_S("1E-10")),
+    RtoB_TEST(5384795.26E-52,exponentThreeDigitExpAndSigFigs,14,7,'.','0',0,_S("5.384795E-46")),
+    RtoB_TEST(.99999999E-99,exponentThreeDigitExpAndSigFigs,13,6,'.','0',0,_S("1E-99")),
+    RtoB_TEST(1.0E-99,exponentThreeDigitExpAndSigFigs,13,6,'.','0',0,_S("1E-99")),
+	RtoB_TEST(1234.9876E-103,exponentThreeDigitExpAndSigFigs,13,6,'.','0',0,_S("1.23499E-100")),
+    RtoB_TEST(1234.9876E-107,exponentThreeDigitExpAndSigFigs,15,8,'.','0',0,_S("1.2349876E-104")),
+    RtoB_TEST(1234.9876E-109,exponentThreeDigitExpAndSigFigs,15,8,'.','0',0,_S("1.2349876E-106")),
+    RtoB_TEST(1234.9876E-110,exponentThreeDigitExpAndSigFigs,16,9,'.','0',0,_S("1.2349876E-107")),
+    RtoB_TEST(1234.9876E-200,exponentThreeDigitExpAndSigFigs,17,10,'.','0',0,_S("1.2349876E-197")),
+    RtoB_TEST(1234.9876E-300,exponentThreeDigitExpAndSigFigs,17,10,'.','0',0,_S("1.2349876E-297")),
+    RtoB_TEST(1234.9876E97,exponentThreeDigitExpAndSigFigs,13,6,'.','0',0,_S("1.23499E+100")),
+    RtoB_TEST(1234.9876E100,exponentThreeDigitExpAndSigFigs,15,8,'.','0',0,_S("1.2349876E+103")),
+    RtoB_TEST(1234.9876E103,exponentThreeDigitExpAndSigFigs,15,8,'.','0',0,_S("1.2349876E+106")),
+    RtoB_TEST(1234.9876E200,exponentThreeDigitExpAndSigFigs,16,9,'.','0',0,_S("1.2349876E+203")),
+    RtoB_TEST(1234.9876E300,exponentThreeDigitExpAndSigFigs,17,10,'.','0',0,_S("1.2349876E+303"))
+	};
+
+GLDEF_D TUint size_testcalc=sizeof(testcalc);
+	
+GLDEF_D ERR_TEST testerr[]=
+    {
+    // FIXED - special values
+	ERR_TEST(KPosInfTReal64,fixedNoTriads,32,4,'.','0',0,_S("Inf"),KErrOverflow),
+	ERR_TEST(KNegInfTReal64,fixedNoTriads,32,4,'.','0',0,_S("-Inf"),KErrOverflow),
+	ERR_TEST(KNaNTReal64,fixedNoTriads,32,4,'.','0',0,_S("NaN"),KErrArgument),	
+	ERR_TEST(K1EMinus324Real64,fixedNoTriads,32,4,'.','0',0,_S("0.0000"),6),	
+	//       - no space for sign and no triads - does not fit 
+	ERR_TEST(1234.9876E95,fixedNoTriads,12,0,'.','0',0,_S("Inf"),KErrOverflow),
+	ERR_TEST(-1234.9876E95,fixedNoTriads,12,0,'.','0',0,_S("-Inf"),KErrOverflow),
+	ERR_TEST(1234.9876,fixedNoTriads,8,4,'.','0',0,_S("Inf"),KErrOverflow),
+	ERR_TEST(1234.9876E-8,fixedNoTriads,3,7,'.','0',0),
+	ERR_TEST(1234.9876E-8,fixedNoTriads,8,7,'.','0',0),
+	//		 - no space for sign and triads - does not fit
+	ERR_TEST(1234.9876E-8,KRealFormatFixed,10,10,'.','0',0),
+	ERR_TEST(1234.9876E-107,KRealFormatFixed,12,11,'.','0',0),
+    ERR_TEST(1234.9876E-109,KRealFormatFixed,12,11,'.','0',0),
+    ERR_TEST(1234.9876E-110,KRealFormatFixed,12,11,'.','0',0),
+    ERR_TEST(1234.9876E-200,KRealFormatFixed,12,11,'.','0',0),
+    ERR_TEST(1234.9876E-300,KRealFormatFixed,12,11,'.','0',0),
+	//
+	ERR_TEST(1234.9876E4,KRealFormatFixed,8,0,'.',',',3,_S("Inf"),KErrOverflow),
+	ERR_TEST(1234.9876E4,KRealFormatFixed,9,0,'.',',',3,_S("Inf"),KErrOverflow),
+	ERR_TEST(1234.9876E95,KRealFormatFixed,12,6,'.','0',0,_S("Inf"),KErrOverflow),
+	ERR_TEST(1234.9876E96,KRealFormatFixed,12,6,'.','0',0,_S("Inf"),KErrOverflow),		
+    ERR_TEST(1234.9876E97,KRealFormatFixed,12,6,'.','0',0,_S("Inf"),KErrOverflow),	
+    ERR_TEST(1234.9876E100,KRealFormatFixed,12,6,'.','0',0,_S("Inf"),KErrOverflow),	
+    ERR_TEST(1234.9876E103,KRealFormatFixed,12,6,'.','0',0,_S("Inf"),KErrOverflow),	
+    ERR_TEST(1234.9876E200,KRealFormatFixed,12,6,'.','0',0,_S("Inf"),KErrOverflow),	
+    ERR_TEST(1234.9876E300,KRealFormatFixed,12,6,'.','0',0,_S("Inf"),KErrOverflow),
+	//		 - space for sign and no triads - does not fit
+	ERR_TEST(1234.9876,fixedSpaceForSign,9,4,'.','0',0,_S("Inf"),KErrOverflow),
+	ERR_TEST(1234.9876E-8,fixedSpaceForSign,11,9,'.','0',0),
+	//		 - space for sign and triads - does not fit
+	ERR_TEST(1234.9876E4,fixedTriadsAndSign,9,0,'.',',',3,_S("Inf"),KErrOverflow),
+	ERR_TEST(1234.9876E4,fixedTriadsAndSign,10,0,'.',',',3,_S("Inf"),KErrOverflow),
+	//		 - no error, returns length
+	ERR_TEST(1234.9876,fixedNoTriads,9,4,'.','0',0,_S("1234.9876"),9),
+    ERR_TEST(1234.9876E4,KRealFormatFixed,11,0,'.',',',3,_S("12,349,876"),10),
+	ERR_TEST(1234.9876,fixedSpaceForSign,10,4,'.','0',0,_S("1234.9876"),9),
+	ERR_TEST(-1234.9876,fixedSpaceForSign,10,4,'.','0',0,_S("-1234.9876"),10),
+    ERR_TEST(1234.9876E4,fixedTriadsAndSign,12,0,'.',',',3,_S("12,349,876"),10),
+	ERR_TEST(1234.9876E-101,KRealFormatFixed,12,6,'.','0',0,_S("0.000000"),8),
+    ERR_TEST(1234.9876E-102,KRealFormatFixed,12,6,'.','0',0,_S("0.000000"),8),
+    ERR_TEST(1234.9876E-103,KRealFormatFixed,12,6,'.','0',0,_S("0.000000"),8),
+	
+	// EXPONENT - special values
+	ERR_TEST(KPosInfTReal64,KRealFormatExponent,32,6,'.','0',0,_S("Inf"),KErrOverflow),
+	ERR_TEST(KNegInfTReal64,KRealFormatExponent,32,6,'.','0',0,_S("-Inf"),KErrOverflow),  
+	ERR_TEST(KNaNTReal64,KRealFormatExponent,32,6,'.','0',0,_S("NaN"),KErrArgument),
+ 	ERR_TEST(K5EMinus324Real64,exponentThreeDigitExp,32,6,'.',',',0,_S("4.940656E-324"),13),
+ 	ERR_TEST(K1EMinus324Real64,KRealFormatExponent,32,6,'.','0',0,_S("0.000000E+00"),12),
+	//			- only two digits allowed - underflow
+	ERR_TEST(1234.9876E-103,KRealFormatExponent,12,6,'.','0',0,_S("0"),KErrUnderflow),
+    ERR_TEST(1234.9876E-110,KRealFormatExponent,12,6,'.','0',0,_S("0"),KErrUnderflow),
+    ERR_TEST(1234.9876E-200,KRealFormatExponent,12,6,'.','0',0,_S("0"),KErrUnderflow),
+    ERR_TEST(1234.9876E-300,KRealFormatExponent,12,6,'.','0',0,_S("0"),KErrUnderflow),
+    //									  - overflow
+	ERR_TEST(1234.9876E97,KRealFormatExponent,12,6,'.','0',0,_S("Inf"),KErrOverflow),
+	ERR_TEST(-1234.9876E97,KRealFormatExponent,12,6,'.','0',0,_S("-Inf"),KErrOverflow),
+    ERR_TEST(1234.9876E100,KRealFormatExponent,12,6,'.','0',0,_S("Inf"),KErrOverflow),
+    ERR_TEST(1234.9876E200,KRealFormatExponent,12,6,'.','0',0,_S("Inf"),KErrOverflow),
+    ERR_TEST(1234.9876E300,KRealFormatExponent,12,6,'.','0',0,_S("Inf"),KErrOverflow),
+	//									  - does not fit
+	ERR_TEST(1234.9876E24,KRealFormatExponent,12,7,'.','0',0),
+    ERR_TEST(1234.9876E95,KRealFormatExponent,6,3,'.','0',0),
+    ERR_TEST(1234.9876E-76,KRealFormatExponent,8,7,'.','0',0),
+    ERR_TEST(1234.9876E-98,KRealFormatExponent,9,4,'.','0',0),
+	// 			- three digits allowed - does not fit
+	ERR_TEST(1234.9876E240,exponentThreeDigitExp,13,7,'.','0',0),
+    ERR_TEST(1234.9876E98,exponentThreeDigitExp,6,1,'.','0',0),
+    ERR_TEST(1234.9876E-160,exponentThreeDigitExp,9,7,'.','0',0),
+    ERR_TEST(1234.9876E-98,exponentThreeDigitExp,9,4,'.','0',0),
+	// 			- two digit exponent - no error, returns length
+	ERR_TEST(1234.9876E95,KRealFormatExponent,12,6,'.','0',0,_S("1.234988E+98"),12),
+    ERR_TEST(1234.9876E96,KRealFormatExponent,12,6,'.','0',0,_S("1.234988E+99"),12),
+	ERR_TEST(1234.9876E-101,KRealFormatExponent,12,6,'.','0',0,_S("1.234988E-98"),12),
+    ERR_TEST(1234.9876E-102,KRealFormatExponent,12,6,'.','0',0,_S("1.234988E-99"),12),
+	//			- three-digit exponent - no error, returns length
+    ERR_TEST(1234.9876E125,exponentThreeDigitExp,13,6,'.','0',0,_S("1.234988E+128"),13),
+    ERR_TEST(1234.9876E126,exponentThreeDigitExp,13,6,'.','0',0,_S("1.234988E+129"),13),
+	ERR_TEST(1234.9876E-139,exponentThreeDigitExp,13,6,'.','0',0,_S("1.234988E-136"),13),
+    ERR_TEST(1234.9876E-142,exponentThreeDigitExp,13,6,'.','0',0,_S("1.234988E-139"),13),
+
+	// GENERAL - only two-digit exponents allowed - underflow
+	ERR_TEST(1234.9876E-103,KRealFormatGeneral,12,6,'.','0',0,_S("0"),KErrUnderflow),
+    ERR_TEST(1234.9876E-107,KRealFormatGeneral,12,6,'.','0',0,_S("0"),KErrUnderflow),
+    ERR_TEST(1234.9876E-200,KRealFormatGeneral,12,6,'.','0',0,_S("0"),KErrUnderflow),
+    ERR_TEST(1234.9876E-300,KRealFormatGeneral,12,6,'.','0',0,_S("0"),KErrUnderflow),    
+	// 											  - overflow
+	ERR_TEST(1234.9876E97,KRealFormatGeneral,12,6,'.','0',0,_S("Inf"),KErrOverflow),
+    ERR_TEST(1234.9876E100,KRealFormatGeneral,12,6,'.','0',0,_S("Inf"),KErrOverflow),
+    ERR_TEST(1234.9876E200,KRealFormatGeneral,12,6,'.','0',0,_S("Inf"),KErrOverflow),
+    ERR_TEST(1234.9876E300,KRealFormatGeneral,12,6,'.','0',0,_S("Inf"),KErrOverflow),
+	// 		   - space for sign needed
+	ERR_TEST(1,generalSpaceForSign,1,0,'.',',',0),
+    //		   - no errors, returns length
+	ERR_TEST(1234.9876E-101,KRealFormatGeneral,12,6,'.','0',0,_S("1.234988E-98"),12),
+    ERR_TEST(1234.9876E-104,generalThreeDigitExp,13,6,'.','0',0,_S("1.234988E-101"),13),
+    ERR_TEST(1234.9876E95,KRealFormatGeneral,12,6,'.','0',0,_S("1.234988E+98"),12),
+    ERR_TEST(1234.9876E99,generalThreeDigitExp,13,6,'.','0',0,_S("1.234988E+102"),13),
+	ERR_TEST(1234.9876,generalSpaceForSign,10,4,'.','0',0,_S("1234.9876"),9),
+	ERR_TEST(-1234.9876,generalSpaceForSign,10,4,'.','0',0,_S("-1234.9876"),10),
+
+	// NO EXPONENT - not enough space
+	ERR_TEST(1234.9876E95,KRealFormatNoExponent,12,10,'.','0',0,_S("Inf"),KErrOverflow),
+	ERR_TEST(1234.9876E103,KRealFormatNoExponent,12,10,'.','0',0,_S("Inf"),KErrOverflow),	
+    ERR_TEST(1234.9876E200,KRealFormatNoExponent,12,10,'.','0',0,_S("Inf"),KErrOverflow),	
+    ERR_TEST(1234.9876E300,KRealFormatNoExponent,12,10,'.','0',0,_S("Inf"),KErrOverflow),
+	//
+	ERR_TEST(1234.9876E-101,KRealFormatNoExponent,12,10,'.','0',0,_S("0"),KErrUnderflow),
+    ERR_TEST(1234.9876E-104,KRealFormatNoExponent,13,11,'.','0',0,_S("0"),KErrUnderflow),
+	ERR_TEST(1234.9876E-107,KRealFormatNoExponent,12,10,'.','0',0,_S("0"),KErrUnderflow),
+    ERR_TEST(1234.9876E-109,KRealFormatNoExponent,12,10,'.','0',0,_S("0"),KErrUnderflow),
+    ERR_TEST(1234.9876E-110,KRealFormatNoExponent,12,10,'.','0',0,_S("0"),KErrUnderflow),
+    ERR_TEST(1234.9876E-200,KRealFormatNoExponent,12,10,'.','0',0,_S("0"),KErrUnderflow),
+    ERR_TEST(1234.9876E-300,KRealFormatNoExponent,12,10,'.','0',0,_S("0"),KErrUnderflow),
+	//
+    ERR_TEST(.00568,KRealFormatNoExponent,3,3,'.','0',0,_S("0"),KErrUnderflow),
+    ERR_TEST(12345.0,KRealFormatNoExponent,5,5,'.',',',3,_S("Inf"),KErrOverflow),
+    ERR_TEST(100000.0,KRealFormatNoExponent,6,6,'.',',',3,_S("Inf"),KErrOverflow),
+	ERR_TEST(100000.0,KRealFormatNoExponent,6,5,'.',',',3,_S("Inf"),KErrOverflow),
+    ERR_TEST(99999.999,KRealFormatNoExponent,6,6,'.',',',3,_S("Inf"),KErrOverflow),
+    ERR_TEST(1234567890.675,KRealFormatNoExponent,12,12,'.',',',3,_S("Inf"),KErrOverflow),
+    ERR_TEST(1234567890.675,KRealFormatNoExponent,12,9,'.',',',3,_S("Inf"),KErrOverflow),
+	ERR_TEST(1.0E3,KRealFormatNoExponent,4,4,'.',',',3,_S("Inf"),KErrOverflow),
+	ERR_TEST(1234567890120.00,noExponentCalc,14,12,'.',',',0,_S("Inf"),KErrOverflow),
+	ERR_TEST(999999999999.90,noExponentCalc,14,12,'.',',',0,_S("Inf"),KErrOverflow),
+	//
+	ERR_TEST(1234.9876,KRealFormatNoExponent,9,8,'.','0',0,_S("1234.9876"),9),
+	ERR_TEST(1234.9876,KRealFormatNoExponent,12,12,'.','0',0,_S("1234.9876"),9),
+	ERR_TEST(-1234.9876,KRealFormatNoExponent,10,10,'.','0',0,_S("-1234.9876"),10),
+	ERR_TEST(-1234.9876,KRealFormatNoExponent,12,11,'.','0',0,_S("-1234.9876"),10),
+	//
+	//CALCULATOR - only two-digit exponents allowed - underflow
+	ERR_TEST(1234.9876E-103,KRealFormatCalculator,12,6,'.','0',0,_S("0"),KErrUnderflow),
+    ERR_TEST(1234.9876E-107,KRealFormatCalculator,12,6,'.','0',0,_S("0"),KErrUnderflow),
+    ERR_TEST(1234.9876E-200,KRealFormatCalculator,12,6,'.','0',0,_S("0"),KErrUnderflow),
+    ERR_TEST(1234.9876E-300,KRealFormatCalculator,12,6,'.','0',0,_S("0"),KErrUnderflow),    
+	//  											- overflow
+	ERR_TEST(1234.9876E97,KRealFormatCalculator,12,6,'.','0',0,_S("Inf"),KErrOverflow),
+    ERR_TEST(1234.9876E100,KRealFormatCalculator,12,6,'.','0',0,_S("Inf"),KErrOverflow),
+    ERR_TEST(1234.9876E200,KRealFormatCalculator,12,6,'.','0',0,_S("Inf"),KErrOverflow),
+    ERR_TEST(1234.9876E300,KRealFormatCalculator,12,6,'.','0',0,_S("Inf"),KErrOverflow),
+	//									            - does not fit
+	ERR_TEST(1234.9876E24,KRealFormatCalculator,12,7,'.','0',0),
+    ERR_TEST(1234.9876E95,KRealFormatCalculator,6,2,'.','0',0),
+    ERR_TEST(1234.9876E-76,KRealFormatCalculator,9,6,'.','0',0),
+    ERR_TEST(1234.9876E-98,KRealFormatCalculator,6,4,'.','0',0),
+	ERR_TEST(-1234.9876E24,KRealFormatCalculator,9,8,'.','0',0),
+    ERR_TEST(-1234.9876E95,KRealFormatCalculator,4,2,'.','0',0),
+    ERR_TEST(-1234.9876E-76,KRealFormatCalculator,10,7,'.','0',0),
+    ERR_TEST(-1234.9876E-98,KRealFormatCalculator,9,4,'.','0',0),
+	// 			- three digits allowed - does not fit
+	ERR_TEST(1234.9876E240,calculatorThreeDigitExp,13,7,'.','0',0),
+    ERR_TEST(1234.9876E98,calculatorThreeDigitExp,6,1,'.','0',0),
+    ERR_TEST(1234.9876E-160,calculatorThreeDigitExp,9,7,'.','0',0),
+    ERR_TEST(1234.9876E-98,calculatorThreeDigitExp,10,6,'.','0',0),
+	ERR_TEST(-1234.9876E240,calculatorThreeDigitExp,11,8,'.','0',0),
+    ERR_TEST(-1234.9876E98,calculatorThreeDigitExp,7,1,'.','0',0),
+    ERR_TEST(-1234.9876E-160,calculatorThreeDigitExp,10,7,'.','0',0),
+    ERR_TEST(-1234.9876E-98,calculatorThreeDigitExp,11,6,'.','0',0),
+	//
+    ERR_TEST(1234.9876E24,calculatorThreeDigitExp,13,7,'.','0',0),
+    ERR_TEST(1234.9876E95,calculatorThreeDigitExp,9,7,'.','0',0),
+    ERR_TEST(1234.9876E-76,calculatorThreeDigitExp,12,6,'.','0',0),
+    ERR_TEST(1234.9876E-98,calculatorThreeDigitExp,6,4,'.','0',0),
+	ERR_TEST(-1234.9876E24,calculatorThreeDigitExp,9,8,'.','0',0),
+    ERR_TEST(-1234.9876E95,calculatorThreeDigitExp,8,2,'.','0',0),
+    ERR_TEST(-1234.9876E-76,calculatorThreeDigitExp,10,7,'.','0',0),
+    ERR_TEST(-1234.9876E-98,calculatorThreeDigitExp,10,4,'.','0',0)
+	};
+
+GLDEF_D TUint size_testerr=sizeof(testerr);
+
+
+GLDEF_D DtoR_ERR_TEST testerr2[]=
+	{
+	DtoR_ERR_TEST(KNullDesC,KErrGeneral),
+	DtoR_ERR_TEST(_L("E-20"),KErrGeneral), 
+	DtoR_ERR_TEST(_L("1.#INF"),KErrNone),
+	DtoR_ERR_TEST(_L("1.#NAN"),KErrNone),
+	DtoR_ERR_TEST(_L("c.fgh"),KErrGeneral),
+	DtoR_ERR_TEST(_L("xyz"),KErrGeneral),
+	DtoR_ERR_TEST(_L("1.0E"),KErrNone),
+	DtoR_ERR_TEST(_L("1.0E2147483648"),KErrOverflow),
+	DtoR_ERR_TEST(_L("1.234567801234567890E+308"),KErrNone),
+	DtoR_ERR_TEST(_L("3.456789012345678901E-308"),KErrNone),
+	DtoR_ERR_TEST(_L("1.797693134862316E+308"),KErrOverflow),
+	DtoR_ERR_TEST(_L("2.225073858507201E-308"),KErrNone),
+	DtoR_ERR_TEST(_L("3.0E+308"),KErrOverflow),
+	DtoR_ERR_TEST(_L("1.0E-308"),KErrNone),
+	DtoR_ERR_TEST(_L("3.0E310"),KErrOverflow),
+	DtoR_ERR_TEST(_L("3.0E-310"),KErrNone),
+	DtoR_ERR_TEST(_L("1.0E-325"),KErrUnderflow),
+	DtoR_ERR_TEST(_L("2.0E-400"),KErrUnderflow),
+	DtoR_ERR_TEST(_L("2.0E+400"),KErrOverflow),
+	};
+
+GLDEF_D TUint size_testerr2=sizeof(testerr2);
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32test/math/t_float3.cpp	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,330 @@
+// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32test\math\t_float3.cpp
+// File for T_FLOAT.CPP containing data	for test5, test6, test7 and test8
+// T_FLOAT.CPP split into header files because there seems to be too much static data for GCC
+// compiler
+// 
+//
+
+#include "t_float.h"
+#include <e32math.h>
+
+GLDEF_D DtoR_TEST64 testd2[]=
+    {
+	DtoR_TEST64(_L("1.000000000000000000000001"),1.0),
+	DtoR_TEST64(_L("1.00000000000000000000001"),1.0),
+	DtoR_TEST64(_L("1.0000000000000000000001"),1.0),
+	DtoR_TEST64(_L("1.000000000000000000001"),1.0),
+	DtoR_TEST64(_L("1.0000000000000000001"),1.0),
+	DtoR_TEST64(_L("1.000000000000000001"),1.0),
+	DtoR_TEST64(_L("1.000000000000001"),1.000000000000001),
+	DtoR_TEST64(_L("1.0000000000000001E+10"),1.0E+10),
+	DtoR_TEST64(_L("1.0000000000000001E-10"),1.0E-10),
+	DtoR_TEST64(_L("1.00000000000001E8"),1.00000000000001E8),
+	DtoR_TEST64(_L("1.00000000000001E-8"),1.00000000000001E-8),
+	//
+	DtoR_TEST64(_L("1.23412341234e-7"),1.23412341234E-7),
+	DtoR_TEST64(_L("0.000000123412341234"),1.23412341234E-7),
+	DtoR_TEST64(_L("0.0000000123412341234"),1.23412341234E-8),
+	//
+	DtoR_TEST64(_L("0.29"),0.29),
+	DtoR_TEST64(_L("0.2900"),0.2900),
+	DtoR_TEST64(_L("0.2900"),0.29),
+	//
+    DtoR_TEST64(_L("0.0"),0.0),
+    DtoR_TEST64(_L("1.0"),1.0),
+    DtoR_TEST64(_L("10.0"),10.0),
+    DtoR_TEST64(_L("100.0"),100.0),
+    DtoR_TEST64(_L("1000.0"),1000.0),
+    DtoR_TEST64(_L("0.1"),0.1),
+    DtoR_TEST64(_L("0.01"),0.01),
+    DtoR_TEST64(_L("0.001"),0.001),
+    DtoR_TEST64(_L("0.0001"),0.0001),
+	//
+	DtoR_TEST64(_L("9.99999999999999999"),9.99999999999999999),
+	DtoR_TEST64(_L("9.99999999999999"),9.99999999999999),
+	DtoR_TEST64(_L("9.9999999999999"),9.9999999999999),
+    DtoR_TEST64(_L("9.999999999"),9.999999999),
+	//
+	DtoR_TEST64(_L(".015"),0.015),
+	DtoR_TEST64(_L("1.00E-15"),1.0E-15),
+	DtoR_TEST64(_L("1.0E-07"),1.00E-7),
+	//
+    DtoR_TEST64(_L("1024.0"),1024.0),
+    DtoR_TEST64(_L("1E10"),1E10),
+    DtoR_TEST64(_L("1E20"),1E20),
+    DtoR_TEST64(_L("1E30"),1E30),
+    DtoR_TEST64(_L("1E40"),1E40),
+    DtoR_TEST64(_L("1E50"),1E50),
+//	DtoR_TEST64(_L("1E60"),1E60),		
+    DtoR_TEST64(_L("1E70"),1E70),
+    DtoR_TEST64(_L("1E80"),1E80),
+    DtoR_TEST64(_L("1E90"),1E90),
+    DtoR_TEST64(_L("1E98"),1E98),
+//	DtoR_TEST64(_L("1E99"),1E99),
+    DtoR_TEST64(_L("1E100"),1E100),
+    DtoR_TEST64(_L("1E200"),1E200),
+	DtoR_TEST64(_L("1E300"),1E300),		
+    DtoR_TEST64(_L("1.7976931348623157E+308"),1.7976931348623157E+308),
+	//
+	DtoR_TEST64(_L("-1024.0"),-1024.0),
+    DtoR_TEST64(_L("-1E10"),-1E10),
+    DtoR_TEST64(_L("-1E20"),-1E20),
+    DtoR_TEST64(_L("-1E30"),-1E30),
+    DtoR_TEST64(_L("-1E40"),-1E40),
+	DtoR_TEST64(_L("-1E50"),-1E50),
+//  DtoR_TEST64(_L("-1E60"),-1E60),		
+    DtoR_TEST64(_L("-1E70"),-1E70),
+    DtoR_TEST64(_L("-1E80"),-1E80),
+    DtoR_TEST64(_L("-1E90"),-1E90),
+    DtoR_TEST64(_L("-1E98"),-1E98),
+//	DtoR_TEST64(_L("-1E99"),-1E99),									
+	DtoR_TEST64(_L("-1E100"),-1E100),
+    DtoR_TEST64(_L("-1E200"),-1E200),
+	DtoR_TEST64(_L("-1E300"),-1E300),	
+    DtoR_TEST64(_L("-1.7976931348623157E+308"),-1.7976931348623157E+308),
+	//
+	DtoR_TEST64(_L("123456789012345.0"),123456789012345.0),
+	DtoR_TEST64(_L("12345678901234567.0"),12345678901234568.0),		// 54 bits.  Check we are rounding up
+	DtoR_TEST64(_L("1.23456789012345"),1.23456789012345),
+	DtoR_TEST64(_L("1.2345678901234567"),1.2345678901234567),
+	DtoR_TEST64(_L("1.2345678901234567890"),1.2345678901234567890), 
+//	DtoR_TEST64(_L("1.23456789012345E+38"),1.23456789012345E+38),
+	DtoR_TEST64(_L("1.2345678901234567E+38"),1.2345678901234567E+38),
+	DtoR_TEST64(_L("1.23456789012345E+299"),1.23456789012345E+299),
+//	DtoR_TEST64(_L("1.2345678901234567E+299"),1.2345678901234567E+299),	
+//	DtoR_TEST64(_L("1.23456789012345E-75"),1.23456789012345E-75),
+	DtoR_TEST64(_L("1.2345678901234567E-75"),1.2345678901234567E-75),
+	DtoR_TEST64(_L("1.23456789012345E-146"),1.23456789012345E-146),
+//	DtoR_TEST64(_L("1.2345678901234567E-146"),1.2345678901234567E-146),
+	//
+	DtoR_TEST64(_L("1E-10"),1E-10),
+//	DtoR_TEST64(_L("1E-20"),1E-20),		
+    DtoR_TEST64(_L("1E-30"),1E-30),
+//	DtoR_TEST64(_L("1E-40"),1E-40),		
+	DtoR_TEST64(_L("1E-50"),1E-50),		
+    DtoR_TEST64(_L("1E-60"),1E-60),
+	DtoR_TEST64(_L("1E-70"),1E-70),		
+    DtoR_TEST64(_L("1E-80"),1E-80),
+	DtoR_TEST64(_L("1E-90"),1E-90),
+    DtoR_TEST64(_L("1E-98"),1E-98),
+	DtoR_TEST64(_L("1E-99"),1E-99),
+//	DtoR_TEST64(_L("1E-100"),1E-100),
+//	DtoR_TEST64(_L("1E-200"),1E-200),
+	DtoR_TEST64(_L("1E-300"),1E-300),  
+	DtoR_TEST64(_L("2.2250738585072015E-308"),2.2250738585072015E-308),
+	//
+	DtoR_TEST64(_L("-1E-10"),-1E-10),
+//	DtoR_TEST64(_L("-1E-20"),-1E-20),	
+    DtoR_TEST64(_L("-1E-30"),-1E-30),
+//	DtoR_TEST64(_L("-1E-40"),-1E-40),	
+	DtoR_TEST64(_L("-1E-50"),-1E-50),	
+    DtoR_TEST64(_L("-1E-60"),-1E-60),	
+	DtoR_TEST64(_L("-1E-70"),-1E-70),	
+    DtoR_TEST64(_L("-1E-80"),-1E-80),
+	DtoR_TEST64(_L("-1E-90"),-1E-90),
+    DtoR_TEST64(_L("-1E-98"),-1E-98),
+	DtoR_TEST64(_L("-1E-99"),-1E-99), 
+//	DtoR_TEST64(_L("-1E-100"),-1E-100),
+//	DtoR_TEST64(_L("-1E-200"),-1E-200),
+	DtoR_TEST64(_L("-1E-300"),-1E-300),
+	DtoR_TEST64(_L("-2.2250738585072015E-308"),-2.2250738585072015E-308),
+	//
+	DtoR_TEST64(_L("+1.23"),1.23),
+	DtoR_TEST64(_L("003.45"),3.45),
+	DtoR_TEST64(_L("0.0000000000000015"),1.5E-15),
+//	DtoR_TEST64(_L("1.234e-40"),1.234E-40)	
+    };
+
+GLDEF_D TUint size_testd2=sizeof(testd2);
+
+GLDEF_D DtoR_TEST64 testApprox[]=
+	{
+
+	DtoR_TEST64(_L("1.23412341234e-11"),1.23412341234E-11),
+	DtoR_TEST64(_L("0.0000000000123412341234"),1.23412341234E-11),	
+
+	// Pow10() exact
+	DtoR_TEST64(_L("1.2345678901234567E-146"),1.2345678901234567E-146),
+
+	// Pow10() inexact
+	DtoR_TEST64(_L("1E-40"),1E-40),
+	DtoR_TEST64(_L("-1E-40"),-1E-40),
+	DtoR_TEST64(_L("1E60"),1E60),
+	DtoR_TEST64(_L("-1E60"),-1E60),
+	DtoR_TEST64(_L("1E-20"),1E-20),
+	DtoR_TEST64(_L("-1E-20"),-1E-20),
+	DtoR_TEST64(_L("1E99"),1E99),
+	DtoR_TEST64(_L("-1E99"),-1E99),
+	DtoR_TEST64(_L("1.2345678901234567E+299"),1.2345678901234567E+299),
+	DtoR_TEST64(_L("1.23456789012345E-75"),1.23456789012345E-75),
+	DtoR_TEST64(_L("1E-100"),1E-100),
+	DtoR_TEST64(_L("-1E-100"),-1E-100),
+	DtoR_TEST64(_L("1E-200"),1E-200),
+	DtoR_TEST64(_L("-1E-200"),-1E-200),
+	DtoR_TEST64(_L("1.234e-40"),1.234E-40),
+	DtoR_TEST64(_L("1.23456789012345E+38"),1.23456789012345E+38),
+	};
+
+GLDEF_D TUint size_testApprox=sizeof(testApprox);
+
+GLDEF_D DtoR_TEST32 testd32[]=
+    {
+	DtoR_TEST32(_L("0.29"),0.29f),
+	//
+    DtoR_TEST32(_L("0.0"),0.0f),
+    DtoR_TEST32(_L("1.0"),1.0f),
+    DtoR_TEST32(_L("10.0"),10.0f),
+    DtoR_TEST32(_L("100.0"),100.0f),
+    DtoR_TEST32(_L("1000.0"),1000.0f),
+    DtoR_TEST32(_L("0.1"),0.1f),
+    DtoR_TEST32(_L("0.01"),0.01f),
+    DtoR_TEST32(_L("0.001"),0.001f),
+    DtoR_TEST32(_L("0.0001"),0.0001f),
+	//
+	DtoR_TEST32(_L("9.99999999999999"),10.0f),
+	DtoR_TEST32(_L("9.9999999"),9.99999999f),
+    DtoR_TEST32(_L("9.9999"),9.9999f),
+	//
+    DtoR_TEST32(_L(".015"),0.015f),
+	DtoR_TEST32(_L("1.00E-15"),1.0E-15f),
+	DtoR_TEST32(_L("1.0E-07"),1.0E-7f),
+	//
+    DtoR_TEST32(_L("1024.0"),1024.0f),
+    DtoR_TEST32(_L("1E10"),1E10f),
+    DtoR_TEST32(_L("1E20"),1E+20f),
+    DtoR_TEST32(_L("1E30"),1E30f),
+    DtoR_TEST32(_L("3.40282356E+38"),KMaxTReal32),
+	//
+	DtoR_TEST32(_L("-1024.0"),-1024.0f),
+    DtoR_TEST32(_L("-1E10"),-1E10f),
+    DtoR_TEST32(_L("-1E20"),-1E20f),
+    DtoR_TEST32(_L("-1E30"),-1E+30f),
+    DtoR_TEST32(_L("-3.40282356E+38"),-KMaxTReal32),
+	//
+	DtoR_TEST32(_L("1234567.0"),1234567.0f),
+	DtoR_TEST32(_L("1234567890.0"),1234567890.0f),
+	DtoR_TEST32(_L("1.234567"),1.234567f),
+	DtoR_TEST32(_L("1.234567890"),1.234567890f),
+	DtoR_TEST32(_L("1.23456789012"),1.23456789012f),
+	DtoR_TEST32(_L("1.23456E+38"),1.23456E+38f),
+	DtoR_TEST32(_L("1.23456789E+38"),1.23456789E+38f),
+	DtoR_TEST32(_L("1.23456E-13"),1.23456E-13f),
+	DtoR_TEST32(_L("1.23456789012E-13"),1.23456789012E-13f),
+	//
+	DtoR_TEST32(_L("1E-10"),1E-10f),
+	DtoR_TEST32(_L("1E-20"),1E-20f),
+    DtoR_TEST32(_L("1E-30"),1E-30f),
+    DtoR_TEST32(_L("1.17549436e-38"),1.17549436e-38f),
+	//
+	DtoR_TEST32(_L("-1E-10"),-1E-10f),
+	DtoR_TEST32(_L("-1E-20"),-1E-20f),
+    DtoR_TEST32(_L("-1E-30"),-1E-30f),
+    DtoR_TEST32(_L("-1.17549436e-38"),-1.17549436e-38f),
+	//
+	DtoR_TEST32(_L("+1.23"),1.23f),
+	DtoR_TEST32(_L("003.45"),3.45f),
+	DtoR_TEST32(_L("0.0000000000000015"),1.5E-15f),
+	DtoR_TEST32(_L("1.234e-4"),1.234E-4f)	
+    };
+
+GLDEF_D TUint size_testd32=sizeof(testd32);
+
+GLDEF_D DtoR_ERR_TEST testerr3[]=
+	{
+	DtoR_ERR_TEST(KNullDesC,KErrGeneral),
+	DtoR_ERR_TEST(_L("E-20"),KErrGeneral), 
+	DtoR_ERR_TEST(_L("1.#INF"),KErrNone),
+	DtoR_ERR_TEST(_L("1.#NAN"),KErrNone),
+	DtoR_ERR_TEST(_L("c.fgh"),KErrGeneral),
+	DtoR_ERR_TEST(_L("xyz"),KErrGeneral),
+	DtoR_ERR_TEST(_L("1.0E"),KErrNone),
+	DtoR_ERR_TEST(_L("1.0E2147483648"),KErrOverflow),
+	DtoR_ERR_TEST(_L("1.234567801234567890E+38"),KErrNone),
+	DtoR_ERR_TEST(_L("3.456789012345678901E-38"),KErrNone),
+	DtoR_ERR_TEST(_L("3.4028236E+38"),KErrOverflow),
+	DtoR_ERR_TEST(_L("1.1754943E-38"),KErrNone),
+	DtoR_ERR_TEST(_L("1.0E-38"),KErrNone),
+	DtoR_ERR_TEST(_L("4.0E+38"),KErrOverflow),
+	DtoR_ERR_TEST(_L("1.0E-39"),KErrNone),
+	DtoR_ERR_TEST(_L("1.0E+39"),KErrOverflow),
+	DtoR_ERR_TEST(_L("3.0E40"),KErrOverflow),
+	DtoR_ERR_TEST(_L("6.9E-46"),KErrUnderflow),
+	DtoR_ERR_TEST(_L("1.0E-325"),KErrUnderflow),
+	DtoR_ERR_TEST(_L("2.0E-400"),KErrUnderflow),
+	DtoR_ERR_TEST(_L("2.0E+400"),KErrOverflow),
+	};
+
+GLDEF_D TUint size_testerr3=sizeof(testerr3);
+
+GLDEF_D CALC_TEST calctest[]=
+	{
+	CALC_TEST(_L("1.23412341234"),KRealFormatCalculator,20,12,'.',',',0,_S("1.23412341234")),
+	CALC_TEST(_L("0.123412341234"),KRealFormatCalculator,20,12,'.',',',0,_S("1.23412341234E-01")),
+	CALC_TEST(_L("0.0123412341234"),KRealFormatCalculator,20,12,'.',',',0,_S("1.23412341234E-02")),
+	CALC_TEST(_L("0.00123412341234"),KRealFormatCalculator,20,12,'.',',',0,_S("1.23412341234E-03")),
+	CALC_TEST(_L("0.000123412341234"),KRealFormatCalculator,20,12,'.',',',0,_S("1.23412341234E-04")),
+	CALC_TEST(_L("0.0000123412341234"),KRealFormatCalculator,20,12,'.',',',0,_S("1.23412341234E-05")),
+	CALC_TEST(_L("0.00000123412341234"),KRealFormatCalculator,20,12,'.',',',0,_S("1.23412341234E-06")),
+	CALC_TEST(_L("0.000000123412341234"),KRealFormatCalculator,20,12,'.',',',0,_S("1.23412341234E-07")),
+	CALC_TEST(_L("0.0000000123412341234"),KRealFormatCalculator,20,12,'.',',',0,_S("1.23412341234E-08")),
+	CALC_TEST(_L("0.00000000123412341234"),KRealFormatCalculator,20,12,'.',',',0,_S("1.23412341234E-09")),
+	CALC_TEST(_L("0.000000000123412341234"),KRealFormatCalculator,20,12,'.',',',0,_S("1.23412341234E-10")),
+	CALC_TEST(_L("0.0000000000123412341234"),KRealFormatCalculator,20,12,'.',',',0,_S("1.23412341234E-11")),
+	CALC_TEST(_L("0.00000000000123412341234"),KRealFormatCalculator,20,12,'.',',',0,_S("1.23412341234E-12")),
+	CALC_TEST(_L("1.23412341234E-7"),KRealFormatCalculator,20,12,'.',',',0,_S("1.23412341234E-07")),
+	CALC_TEST(_L("1.23412341234E-8"),KRealFormatCalculator,20,12,'.',',',0,_S("1.23412341234E-08")),
+	CALC_TEST(_L("1.23412341234E-9"),KRealFormatCalculator,20,12,'.',',',0,_S("1.23412341234E-09")),
+	CALC_TEST(_L("1.23412341234E-10"),KRealFormatCalculator,20,12,'.',',',0,_S("1.23412341234E-10")),
+	CALC_TEST(_L("1.23412341234E-11"),KRealFormatCalculator,20,12,'.',',',0,_S("1.23412341234E-11")),
+	CALC_TEST(_L("1.23412341234E-12"),KRealFormatCalculator,20,12,'.',',',0,_S("1.23412341234E-12")),
+	CALC_TEST(_L("0.00000000000000"),KRealFormatCalculator,20,12,'.',',',0,_S("0")),
+	CALC_TEST(_L("0.000000000000009999999999999"),KRealFormatCalculator,20,12,'.',',',0,_S("1E-14")),
+	CALC_TEST(_L("0.000000000000000000009999999999999"),KRealFormatCalculator,20,12,'.',',',0,_S("1E-20")),
+	CALC_TEST(_L("999999999999.5"),KRealFormatCalculator,20,12,'.',',',0,_S("1E+12")),
+	CALC_TEST(_L("999999999999.4"),KRealFormatCalculator,20,12,'.',',',0,_S("999999999999")),
+	CALC_TEST(_L("1.234123412341"),KRealFormatCalculator,20,12,'.',',',0,_S("1.23412341234")),
+	CALC_TEST(_L("0.123412341234"),KRealFormatCalculator,20,12,'.',',',0,_S("1.23412341234E-01")),
+	CALC_TEST(_L("0.012341234123"),KRealFormatCalculator,20,12,'.',',',0,_S("1.2341234123E-02")),
+	CALC_TEST(_L("0.001234123412"),KRealFormatCalculator,20,12,'.',',',0,_S("1.234123412E-03")),
+	CALC_TEST(_L("0.000123412341"),KRealFormatCalculator,20,12,'.',',',0,_S("1.23412341E-04")),
+	CALC_TEST(_L("0.000012341234"),KRealFormatCalculator,20,12,'.',',',0,_S("1.2341234E-05")),
+	CALC_TEST(_L("0.000001234123"),KRealFormatCalculator,20,12,'.',',',0,_S("1.234123E-06")),
+	CALC_TEST(_L("0.000000123412"),KRealFormatCalculator,20,12,'.',',',0,_S("1.23412E-07")),
+	CALC_TEST(_L("0.000000012341"),KRealFormatCalculator,20,12,'.',',',0,_S("1.2341E-08")),
+	CALC_TEST(_L("0.000000001234"),KRealFormatCalculator,20,12,'.',',',0,_S("1.234E-09")),
+	CALC_TEST(_L("0.000000000123"),KRealFormatCalculator,20,12,'.',',',0,_S("1.23E-10")),
+	CALC_TEST(_L("0.000000000012"),KRealFormatCalculator,20,12,'.',',',0,_S("1.2E-11")),
+	CALC_TEST(_L("0.000000000001"),KRealFormatCalculator,20,12,'.',',',0,_S("1E-12")),
+	CALC_TEST(_L("0.12341234123"),KRealFormatCalculator,20,12,'.',',',0,_S("0.12341234123")),
+	CALC_TEST(_L("0.01234123412"),KRealFormatCalculator,20,12,'.',',',0,_S("0.01234123412")),
+	CALC_TEST(_L("0.00123412341"),KRealFormatCalculator,20,12,'.',',',0,_S("0.00123412341")),
+	CALC_TEST(_L("0.00012341234"),KRealFormatCalculator,20,12,'.',',',0,_S("0.00012341234")),
+	CALC_TEST(_L("0.00001234123"),KRealFormatCalculator,20,12,'.',',',0,_S("0.00001234123")),
+	CALC_TEST(_L("0.00000123412"),KRealFormatCalculator,20,12,'.',',',0,_S("0.00000123412")),
+	CALC_TEST(_L("0.00000012341"),KRealFormatCalculator,20,12,'.',',',0,_S("0.00000012341")),
+	CALC_TEST(_L("0.00000001234"),KRealFormatCalculator,20,12,'.',',',0,_S("0.00000001234")),
+	CALC_TEST(_L("0.00000000123"),KRealFormatCalculator,20,12,'.',',',0,_S("0.00000000123")),
+	CALC_TEST(_L("0.00000000012"),KRealFormatCalculator,20,12,'.',',',0,_S("0.00000000012")),
+	CALC_TEST(_L("0.00000000001"),KRealFormatCalculator,20,12,'.',',',0,_S("0.00000000001")),
+	CALC_TEST(_L("0.000000000001"),KRealFormatCalculator,20,12,'.',',',0,_S("1E-12")),	
+	CALC_TEST(_L("-1.234E19"),KRealFormatCalculator,20,12,'.',',',0,_S("-1.234E+19")),	
+	};
+
+GLDEF_D TUint size_calctest=sizeof(calctest);
+
+
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32test/math/t_fltcl.cpp	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,75 @@
+// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32test\math\t_fltcl.cpp
+// Class member functions for T_FLOAT.CPP
+// T_FLOAT.CPP split into header files because there seems to be too much static
+// data for GCC compiler
+// 
+//
+
+
+#include "t_float.h"
+
+RtoB_TEST::RtoB_TEST()
+	{
+
+	num=0.0;
+	format.iType=KRealFormatGeneral;
+	format.iWidth=KDefaultRealWidth;
+	format.iPlaces=0;
+	TLocale locale;
+	format.iPoint=locale.DecimalSeparator();
+	format.iTriad=locale.ThousandsSeparator();
+	format.iTriLen=1;
+	res=_S("0");
+	}
+
+RtoB_TEST::RtoB_TEST(TReal aNum,TInt aType,TInt aWidth,TInt aDecimals,TChar aPoint,TChar aTriad,TInt aTrilen,const TText* aRes)
+	{
+
+	num=aNum;
+	format.iType=aType;
+	format.iWidth=aWidth;
+	format.iPlaces=aDecimals;
+	format.iPoint=aPoint;
+	format.iTriad=aTriad;
+	format.iTriLen=aTrilen;
+	res=aRes;
+	}
+
+ERR_TEST::ERR_TEST(TReal aNum,TInt aType,TInt aWidth,TInt aDecimals,TChar aPoint,TChar aTriad, TInt aTrilen,const TText* aRes,TInt aErr)
+	{
+
+	rtob.num=aNum;
+	rtob.format.iType=aType;
+	rtob.format.iWidth=aWidth;
+	rtob.format.iPlaces=aDecimals;
+	rtob.format.iPoint=aPoint;
+	rtob.format.iTriad=aTriad;
+	rtob.format.iTriLen=aTrilen;
+	rtob.res=aRes;
+	err=aErr;	
+	}
+
+CALC_TEST::CALC_TEST(const TDesC& aDes,TInt aType,TInt aWidth,TInt aDecimals,TChar aPoint,TChar aTriad,TInt aTrilen,const TText* aRes)
+	: iLex(aDes)
+	{
+	iFormat.iType=aType;
+	iFormat.iWidth=aWidth;
+	iFormat.iPlaces=aDecimals;
+	iFormat.iPoint=aPoint;
+	iFormat.iTriad=aTriad;
+	iFormat.iTriLen=aTrilen;
+	iRes=aRes;
+	}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32test/math/t_i64.cpp	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,1472 @@
+// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32test\math\t_i64.cpp
+// Tests TInt64
+// Overview:
+// Test 64-bit integer functionality.
+// API Information:
+// TInt64.
+// Details:
+// - Construct TInt64 with specified range of integer, real, high
+// and low values and check constructor, copy constructor are as expected.
+// - Test all the operators for range of values and check it is as expected.
+// - Check the logical shift of specified number of bits is as expected.
+// - Check multiplication of 64 bit integer by the specified 64 bit integer 
+// using MulTop, fast multiplication of 64 bit integer by 10.
+// - Verify the 64 bit integer divide and mod results are as expected.
+// Platforms/Drives/Compatibility:
+// All.
+// Assumptions/Requirement/Pre-requisites:
+// Failures and causes:
+// Base Port information:
+// 
+//
+
+#include <e32test.h>
+#include <e32math.h>
+
+inline TInt __i64multop(TInt64& aX, TInt64& aValue)
+			{	Uint64 __lowResult; \
+				Uint64 __highResult; \
+				Math::UMul64(aX, aValue, __highResult, __lowResult); \
+				aX = static_cast<TInt64>(__highResult); \
+				return (__lowResult == UI64LIT(0x0000000000000000)) ?	-2 : \
+				(__lowResult < UI64LIT(0x8000000000000000)) ?	-1 : \
+				(__lowResult == UI64LIT(0x8000000000000000)) ?	0  : \
+				/*__lowResult > UI64LIT(0x8000000000000000)*/	1; \
+			}
+
+#define	I64MULTOP(x, value) __i64multop(x, (value))
+
+
+TInt HexMulAdd(TUint8 a1,TUint8 a2,TUint8& answer,TUint8& carry)
+	{
+	TUint x1= a1>'9' ? a1-'a'+10 : a1-'0';
+	TUint x2= a2>'9' ? a2-'a'+10 : a2-'0';
+	TUint a= answer>'9' ? answer-'a'+10 : answer-'0';
+	TUint c= carry>'9' ? carry-'a'+10 : carry-'0';
+	if (x1>15) return (KErrArgument);
+	if (x2>15) return (KErrArgument);
+	if (a>15) return (KErrArgument);
+	if (c>15) return (KErrArgument);
+	a+=(x1*x2)+c;
+	c=a/16;
+	a=a%16;
+	a= a>9 ? a-10+'a' : a+'0';
+	c= c>9 ? c-10+'a' : c+'0';
+	answer=(TUint8)a;
+	carry=(TUint8)c;
+	return(KErrNone);
+	}
+
+TInt HexMul(TDesC8& a1,TDesC8& a2,TDes8& a3)
+//
+// Infinite precision hex multiplier
+//
+	{
+	TInt l1=a1.Length();
+	TInt l2=a2.Length();
+	TInt l3=l1+l2;
+	if (a3.MaxLength()<l3)
+		return(KErrArgument);
+	a3.Zero();
+	TInt x;
+	TInt y;
+	TInt z;
+	for (x=0;x<l3;x++)
+		a3.Append('0');
+	for (y=0;y<l2;y++)
+		{
+		TUint8 carry='0';
+		for (z=0;z<l1;z++)
+			{
+			if(HexMulAdd(a2[l2-y-1],a1[l1-z-1],a3[l3-y-z-1],carry)!=KErrNone)
+				return(KErrArgument);
+			}
+		if(HexMulAdd('0','0',a3[l3-y-l1-1],carry)!=KErrNone)
+			return(KErrArgument);
+		}
+	return(KErrNone);
+	}
+
+
+LOCAL_D RTest test(_L("T_I64"));
+
+LOCAL_C void SlowDivMod(const TInt64& aA, const TInt64& aB, TInt64& aDiv, TInt64& aMod)
+//
+//	Calculate Division/Remainder using repeated subtraction
+//
+	{
+		TInt negative=0;
+		TInt64 t=0;
+
+		if (aA<0)
+			{
+			negative=1;
+			aMod=-aA;
+			}
+		else
+			{
+			aMod=aA;
+			}
+		if (aB<0)
+			{
+			if (negative)
+				negative=0;
+			else
+				negative=1;
+			t=-aB;
+			}
+		else
+			{
+			t=aB;
+			}
+		aDiv=0;
+
+		if ((t & UI64LIT(0xffffffff00000000)) == 0)
+			{
+			while (aMod >= (t << 31))
+				{
+				aDiv += static_cast<TUint32>(1 << 31);
+				aMod -= t << 31;
+				}
+			}
+		if ((t & UI64LIT(0xffffff0000000000)) == 0)
+			{
+			while (aMod >= (t << 23))
+				{
+				aDiv += 1 << 23;
+				aMod -= t << 23;
+				}
+			}
+		if ((t & UI64LIT(0xffff000000000000)) == 0)
+			{
+			while (aMod >= (t << 15))
+				{
+				aDiv += 1 << 15;
+				aMod -= t << 15;
+				}
+			}
+		if ((t & UI64LIT(0xff00000000000000)) == 0)
+			{
+			while (aMod >= (t << 7))
+				{
+				aDiv += 1 << 7;
+				aMod -= t << 7;
+				}
+			}
+		if ((t & UI64LIT(0xf000000000000000)) == 0)
+			{
+			while (aMod >= (t << 3))
+				{
+				aDiv += 1 << 3;
+				aMod -= t << 3;
+				}
+			}
+		while (aMod >= t)
+			{
+			++aDiv;
+			aMod -= t;
+			}
+
+		if (negative)
+			{
+			aDiv=-aDiv;
+			}
+
+		if (aA < 0)
+			{
+			aMod =- aMod;	
+			}
+	}
+
+LOCAL_C void DivModTest(const TInt64& aA, const TInt64& aB)
+//
+//	Test DivMod against SlowDivMod
+//
+	{
+
+	if (aB!=0)
+		{
+		TInt64 n(aA),d(aB);
+		TInt64 div=0,mod=0,res=0;
+		
+		SlowDivMod(n,d,div,mod);
+		
+		res = n % d;
+		n /= d;
+		
+		test(n==div);
+		test(res==mod);
+		}
+	}
+
+LOCAL_C void Test1()
+	{
+	// Test the constructors
+
+	// TInt64()
+	test.Start(_L("Default constructor"));
+	TInt64 t1;
+	t1 = 0; // to prevent uninitialised warnings
+	(void)(t1 > 0); // to prevent unused warnings
+	
+	// TInt64(TInt aVal)
+	test.Next(_L("TInt64(TInt aVal)"));
+	TInt64 t2(0);
+	test(I64LOW(t2)==0 && I64HIGH(t2)==0);
+	TInt64 t3(1);  	 
+	test(I64LOW(t3)==1 && I64HIGH(t3)==0);
+	TInt64 t4(KMaxTInt32);
+	test(I64LOW(t4)==(TUint)KMaxTInt32 && I64HIGH(t4)==0);
+	TInt64 t5(-1);
+	test(I64INT(t5)==-1);
+	test(I64LOW(t5)==KMaxTUint32 && I64HIGH(t5)==KMaxTUint32);
+	TInt64 t6(KMinTInt32); 	
+	test(I64INT(t6)==KMinTInt32);
+
+	// TInt64(TUint aVal)
+	test.Next(_L("TInt64(TUint aVal)"));
+	TInt64 t7((TUint)0);
+	test(I64LOW(t7)==0 && I64HIGH(t7)==0);
+	TInt64 t8((TUint)1);  	 
+	test(I64LOW(t8)==1 && I64HIGH(t8)==0);
+	TInt64 t9(KMaxTUint32);
+	test(I64LOW(t9)==KMaxTUint32 && I64HIGH(t9)==0);
+
+	// TInt64(TUint aHigh,TUint aLow)
+	test.Next(_L("TInt64(TUint aHigh,TUint aLow)"));
+	TInt64 t10 = MAKE_TINT64(0,0);
+	test(I64LOW(t10)==0 && I64HIGH(t10)==0);
+	TInt64 t11 = MAKE_TINT64(KMaxTUint32,KMaxTUint32);   // highest value stored === (2**64)-1
+	test(I64LOW(t11)==KMaxTUint32 && I64HIGH(t11)==KMaxTUint32);
+
+	// TInt64(TReal aVal)
+	test.Next(_L("TInt64(TReal aVal)"));
+
+
+	TInt64 t12((TInt64)1.0);
+	test(I64LOW(t12)==1 && I64HIGH(t12)==0);
+	TInt64 t15((TInt64)4.99);
+	test(I64LOW(t15)==4 && I64HIGH(t15)==0);
+	
+	TReal x;
+	
+	x = -9.223372036854776831e18; // -2^63 - 2^10 (to ensure rounding outside of TInt64 range)
+	TInt64 t16((TInt64)x);
+	test(t16==KMinTInt64);
+	TInt64 t17((TInt64)0.5);
+	test(I64LOW(t17)==0 && I64HIGH(t17)==0);
+	TInt64 t18((TInt64)0.0);
+	test(I64LOW(t18)==0 && I64HIGH(t18)==0);
+	TInt64 t19((TInt64)-123325.23411412);
+	test(I64LOW(t19)==(TUint)(-123325) && I64HIGH(t19)==0xffffffff);
+	TInt64 t20((TInt64)1.0E-1);
+	test(I64LOW(t20)==0 && I64HIGH(t20)==0);
+	
+	x = 9.223372036854776831e18; // 2^63 + 2^10 (to ensure rounding outside of TInt64 range)
+	TInt64 t21((TInt64)x);
+
+	// IEEE 754 does not specify the value to be returned when a conversion
+	// is performed on a value that is outside the range of the target, only
+	// that an invalid operation exception be raised if the io fp exception
+	// is not masked.
+#if !defined(__TOOLS2__)
+	// The x86 FPU returns KMin... as the "indefinite number"
+	test(t21 == KMinTInt64);
+#endif
+
+	TReal limit=1048576.0*1048576.0*8192.0;		// integers <2^53 in modulus can be represented exactly
+	TInt64 t22((TInt64)limit);
+	test(I64LOW(t22)==0 && I64HIGH(t22)==0x00200000);
+	TInt64 t23((TInt64)(limit-1.0));
+	test(I64LOW(t23)==0xffffffff && I64HIGH(t23)==0x001fffff);
+	TReal i64limit=limit*1024.0;				// 2^63
+	TInt64 t24((TInt64)i64limit);
+	
+	// IEEE 754 does not specify the value to be returned when a conversion
+	// is performed on a value that is outside the range of the target, only
+	// that an invalid operation exception be raised if the io fp exception
+	// is not masked.
+#if !defined(__TOOLS2__)
+	// The x86 FPU returns KMin... as the "indefinite number"
+	test(t24 == KMinTInt64);
+#endif
+
+	TInt64 t25((TInt64)(i64limit-1024.0));
+	test(I64LOW(t25)==0xfffffc00 && I64HIGH(t25)==0x7fffffff);
+	TInt64 t26((TInt64)-i64limit);
+	test(I64LOW(t26)==0x00000000 && I64HIGH(t26)==0x80000000);
+	TInt64 t27((TInt64)(1024.0-i64limit));
+	test(I64LOW(t27)==0x00000400 && I64HIGH(t27)==0x80000000);
+
+
+	TInt i;
+	TInt64 l;
+	for (i=-99; i<100; i++)
+		{
+		x=1;
+		l=1;
+		TReal a(i);
+		TInt64 b(i);
+		while (Abs(x)<limit)
+			{
+//			test.Printf(_L("Testing %g\n"),x);
+			TInt64 ll((TInt64)x);
+			test(ll==l);
+			ll=0;
+			ll = (TInt64)x;
+			test(ll==l);
+			x*=a;
+			l*=b;
+			if (i==1 || i==0 || (i==-1 && l==TInt64(1)))
+				break;
+			}
+		}
+
+	// TInt64::GetTReal
+	test.Next(_L("TInt64::GetTReal"));
+
+	l = MAKE_TINT64(0x7fffffff,0xffffffff);
+	x = I64REAL(l);
+
+	TReal xx = i64limit - 1.0;
+	test(x == xx);
+
+	l = MAKE_TINT64(0x7fffffff,0xfffffc00);
+	x = I64REAL(l);
+
+	test(x == (i64limit - 1024.0));
+
+	l = MAKE_TINT64(0x80000000,0x00000000);
+	x = I64REAL(l);
+
+	test(x == -i64limit);
+
+	l = MAKE_TINT64(0x80000000,0x00000400);
+	x = I64REAL(l);
+
+	test(x == (1024.0 - i64limit));
+
+	l = MAKE_TINT64(0x00000001,0x00000000);
+	x = I64REAL(l);
+
+	test(x == (65536.0 * 65536.0));
+
+	l = MAKE_TINT64(0xffffffff,0x00000000);
+	x = I64REAL(l);
+
+	test(x == (-65536.0 * 65536.0));
+
+	for (i=-99; i<100; i++)
+		{
+		x=1;
+		l=1;
+		TReal a(i);
+		TInt64 b(i);
+		while (Abs(x)<limit)
+			{
+//			test.Printf(_L("Testing %g\n"),x);
+			TReal y = I64REAL(l);
+			test(y==x);
+			x*=a;
+			l*=b;
+			if (i==1 || i==0 || (i==-1 && l==TInt64(1)))
+				break;
+			}
+		}
+
+	// TInt64(const TInt64& aVal)
+	test.Next(_L("Copy constructor"));
+	TInt64 t13(t10);
+	test(I64LOW(t13)==I64LOW(t10) && I64HIGH(t13)==I64HIGH(t10));
+
+	test.Next(_L("Set"));
+	t13 = MAKE_TINT64(0, 0);
+	test(I64LOW(t13)==0 && I64HIGH(t13)==0);
+	test.End();
+	}
+
+LOCAL_C void Test1_2()
+//
+//	Test Unary operators -, and +
+//
+	{
+	TInt64 r(0),q(0);
+
+	r=1;
+	test(-r==-1);
+	test(+r==1);
+	r=-100;
+	test(-r==100);
+	test(+r==-100);
+	r = MAKE_TINT64(540423,21344);
+	test(-r==(q-r));
+	test(+r==r);
+	test(+r==MAKE_TINT64(540423,21344));
+	r=0;
+	test(-r==0);
+	test(+r==0);
+	}
+
+
+LOCAL_C void Test2()
+	{
+	// Test the operators
+
+	// =
+	test.Start(_L("="));
+	TInt64 r=0,r2=0, a = MAKE_TINT64(12345,54321);
+	r=KMaxTInt32;
+	test(I64LOW(r)==(TUint)KMaxTInt32 && I64HIGH(r)==0);
+	r2=r=KMinTInt32;
+	test(I64INT(r)==KMinTInt32);
+	test(I64INT(r2)==KMinTInt32);
+	r2=r=KMaxTUint32;
+	test(I64LOW(r)==KMaxTUint32 && I64HIGH(r)==0);
+	test(I64LOW(r2)==KMaxTUint32 && I64HIGH(r2)==0);
+	r2=r=a;
+	test(I64LOW(r)==I64LOW(a) && I64HIGH(r)==I64HIGH(a));
+	test(I64LOW(r2)==I64LOW(a) && I64HIGH(r2)==I64HIGH(a));
+
+	r2=r=(TInt64)((TReal)1.2);
+	test(r==1);
+	test(r2==1);
+	r2=r=(TInt64)((TReal)20.9);
+	test(r==20);
+	test(r2==20);
+	r2=r=(TInt64)((TReal)-100.2);
+	test(r==-100);
+	test(r2==-100);
+	
+
+
+	// +=, -=, *=, /=, %=, >>=, <<=, >>, <<
+	// += 
+	test.Next(_L("+="));
+	r=-1;
+	r+=1;
+	test(I64INT(r)==0);
+
+	r+=1;
+	test(I64INT(r)==1);
+
+	r=KMaxTUint32;
+	r+=1;
+	test(I64INT(r)-1==(TInt)KMaxTUint32);
+
+	r=KMinTInt32;
+	r+=1;
+	test(I64INT(r)==KMinTInt32+1);
+
+	r=0;
+	r+=MAKE_TINT64(0,0x80000000u);
+	test(r==MAKE_TINT64(0,0x80000000u));
+
+	// -=
+	test.Next(_L("-="));						 
+	r=-1;
+	r-=1;
+	test(I64INT(r)==-2);
+	r=0;
+	r-=1;
+	test(I64INT(r)==-1);
+	r=1;
+	r-=1;
+	test(I64INT(r)==0);
+	r=KMaxTUint32;
+	r+=1;
+	r-=1;
+	test(I64HIGH(r)==0 && I64LOW(r)==KMaxTUint32);
+	test(I64INT(r)==(TInt)KMaxTUint32);
+	r-=1;
+	test(I64INT(r)==(TInt)(KMaxTUint32-1));
+
+
+	// *= 
+	test.Next(_L("*="));
+	r=KMaxTUint32;			// ffffffff * 2 = 1 fffffffe
+	r*=2;
+	test(I64HIGH(r)==1 && I64LOW(r)==KMaxTUint32-1);
+
+	r=KMaxTUint32-1;
+	r*=2;
+	r+=2;
+	test(I64HIGH(r)==1 && I64LOW(r)==KMaxTUint32-1);
+
+	r=KMaxTUint32;
+	r+=1;
+	r*=2;
+	test(I64HIGH(r)==2 && I64LOW(r)==0);
+
+	TUint PosMinTInt=(TUint)KMinTInt32;
+	r=PosMinTInt;
+	r*=-1;
+	test(I64INT(r)==KMinTInt32);
+
+	r=KMinTInt32;
+	r*=-1;
+	r-=1;
+	test(I64INT(r)==KMaxTInt32);
+
+	r=KMaxTUint32;	   	// ffffffff * ffffffff + (2 * ffffffff) = ffffffff ffffffff
+	r*=KMaxTUint32;
+	r+=KMaxTUint32;
+	r+=KMaxTUint32;
+	test(I64LOW(r)==KMaxTUint32 && I64HIGH(r)==KMaxTUint32);
+
+	r=KMaxTUint32;
+	r+=1;
+	r*=2;
+	test(I64LOW(r)==0 && I64HIGH(r)==2);
+
+
+	// /=
+	test.Next(_L("/="));
+	r=4;
+	r/=2;
+	test(I64INT(r)==2);
+	r=4;
+	r/=-2;
+	test(I64INT(r)==-2);
+	r=-4;
+	r/=1;
+	test(I64INT(r)==-4);
+	r=-8;
+
+	r/=-2;
+	test(I64INT(r)==4);
+	r=4;
+
+	r/=4;
+	test(I64INT(r)==1);
+	r=0;
+
+	r/=4;
+	test(I64INT(r)==0);
+	r=KMaxTUint32;
+	TInt64 z(KMaxTUint32);
+	r/=z;
+	test(I64INT(r)==1);
+	r=KMinTInt32;
+	z=KMinTInt32;
+	r/=z;
+	test(I64INT(r)==1);
+	r=KMinTInt32;
+	z = MAKE_TINT64(0,(TUint)KMinTInt32);
+	r/=z;
+	test(I64INT(r)==-1);
+	r=KMaxTUint32;			
+	r*=2;
+	r/=2;
+	test(I64HIGH(r)==0 && I64LOW(r)==KMaxTUint32);
+   	r=KMaxTUint32;
+	a=KMaxTUint32;
+	r*=z;
+	r/=z;
+	test(I64HIGH(r)==0 && I64LOW(r)==KMaxTUint32);
+	r = MAKE_TINT64(0,(TUint)KMinTInt32);
+	r/=-1;
+	test(I64LOW(r)==(TUint)KMinTInt32);
+	r=0;
+	r/=KMaxTUint32;
+	test(I64INT(r)==0);
+	r=0;
+	r/=KMinTInt32;
+	test(I64INT(r)==0);
+	r=0;
+	TInt64 b = MAKE_TINT64(KMaxTUint32,KMaxTUint32);
+	r/=b;
+	test(I64INT(r)==0);
+	TInt64 c = MAKE_TINT64(KMaxTUint32,KMaxTUint32);	  // -1/Anything == 0
+	TInt64* cptr = &c;		// MSVC compiler calculates -1/anything at compile time
+	*cptr /= KMaxTUint32;	// and gets it wrong if we don't use a pointer, bizarre.
+	test(I64LOW(c)==0 && I64HIGH(c)==0);
+	r=-1;
+	z=1;
+	r/=z;
+	test(r==-1);
+	r=-r;
+	r/=z;
+	test(r==1);
+	r = MAKE_TINT64(0x01,KMaxTUint32);
+	z=2;
+	r/=z;
+	test(r==TInt64(KMaxTUint32));
+	r = MAKE_TINT64(0x01,KMaxTUint32);
+	z = MAKE_TINT64(0,KMaxTUint32);
+	r/=z;
+	test(r==TInt64(2));
+	r = MAKE_TINT64(1,0);
+	r/=z;
+	test(r==TInt64(1));
+	r = MAKE_TINT64(6221,5621243);
+	z = MAKE_TINT64(3,42011);
+	r/=z;
+	test(r==2073);
+	r=100;
+	z=99;
+	r/=z;
+	test(r==1);
+	r = MAKE_TINT64(17,KMaxTUint32);
+	z = MAKE_TINT64(0,8);
+	test((r/=z)==MAKE_TINT64(0x2, 0x3fffffff));
+
+	// %=
+	test.Next(_L("%="));
+	r=4;
+	r%=4;
+	test(I64INT(r)==0);
+	r=4;
+	r%=1;
+	test(I64INT(r)==0);
+	r=5;
+	r%=3;
+	test(I64INT(r)==2);
+	r=(-5);
+	r%=3;
+	test(I64INT(r)==(-2));
+	r = MAKE_TINT64(134,KMaxTUint32-10342);
+	z = MAKE_TINT64(134,0);
+	test((r%=z)==KMaxTUint32-10342);
+	r = MAKE_TINT64(134,KMaxTUint32-10342);
+	z = MAKE_TINT64(134,KMaxTUint32-10343);
+	test((r%=z)==1);
+	r = MAKE_TINT64(1363,0xfd432ab0u);
+	z = MAKE_TINT64(0,16);
+	test((r%=z)==0);
+	
+	r=-10;
+	r%=3;
+	test(r==-1);
+	r=-10;
+	r%=-3;
+	test(r==-1);
+	r=10;
+	r%=3;
+	test(r==1);
+	r=10;
+	r%=-3;
+	test(r==1);
+
+	// <<= and >>=
+	// <<=
+	test.Next(_L("<<="));
+	r=1;
+	r<<=32;
+	test(I64LOW(r)==0 && I64HIGH(r)==1);
+	r<<=31;
+	test(I64LOW(r)==0 && I64HIGH(r)==0x80000000);
+
+	r=1;
+	r<<=31;
+	test(I64LOW(r)==0x80000000 && I64HIGH(r)==0);
+	r<<=32;
+	test(I64LOW(r)==0 && I64HIGH(r)==0x80000000);
+
+	r=1;
+	r<<=63;
+	test(I64LOW(r)==0 && I64HIGH(r)==0x80000000);
+
+	r=0;
+	r<<=32;
+	test(I64LOW(r)==0 && I64HIGH(r)==0);
+
+	r=0xC0000000; 	// 1100000..........
+	r<<=1;
+	test(I64HIGH(r)==1 && I64LOW(r)==0x80000000);	// 100000.......
+	r<<=1;
+	test(I64HIGH(r)==3 && I64LOW(r)==0);
+	r<<=1;
+	test(I64HIGH(r)==6 && I64LOW(r)==0);
+
+	r = MAKE_TINT64(0,KMaxTUint32);
+	r<<=32;
+	test(I64LOW(r)==0 && I64HIGH(r)==KMaxTUint32);
+
+	// >>=
+	test.Next(_L(">>="));
+	r = MAKE_TINT64(3,0);
+	r>>=1;
+	test(I64HIGH(r)==1 && I64LOW(r)==0x80000000);
+	r>>=1;
+	test(I64HIGH(r)==0 && I64LOW(r)==0xC0000000);
+
+	r = MAKE_TINT64(0x80000000,0);  
+	r>>=(31);
+	test(I64HIGH(r)==KMaxTUint32 && I64LOW(r)==0);
+	r>>=(32);
+	test(I64HIGH(r)==KMaxTUint32 && I64LOW(r)==KMaxTUint32);
+
+	r = MAKE_TINT64(0x80000000,0);
+	r>>=(32);
+	test(I64HIGH(r)==KMaxTUint32 && I64LOW(r)==0x80000000);
+
+	r = MAKE_TINT64(0x80000000,0);
+	r>>=63;
+	test(I64LOW(r)==KMaxTUint32 && I64HIGH(r)==KMaxTUint32);
+
+	r = MAKE_TINT64(KMaxTUint32, 0);
+	r>>=32;
+	test(I64HIGH(r)==KMaxTUint32 && I64LOW(r)==KMaxTUint32);
+
+	// <<
+	test.Next(_L("<<"));
+	r=1;
+	TInt64 t = r<<32;
+	test(I64LOW(t)==0 && I64HIGH(t)==1);
+	t = t<<31;
+	test(I64LOW(t)==0 && I64HIGH(t)==0x80000000);
+
+	r=1;
+	t = r<<31;
+	test(I64LOW(t)==0x80000000 && I64HIGH(t)==0);
+	t = t<<32;
+	test(I64LOW(t)==0 && I64HIGH(t)==0x80000000);
+
+	r=1;
+	t = r<<63;
+	test(I64LOW(t)==0 && I64HIGH(t)==0x80000000);
+
+	r=0;
+	t = r<<32;
+	test(I64LOW(t)==0 && I64HIGH(t)==0);
+
+	r=0xC0000000; 	// 1100000..........
+	t = r<<1;
+	test(I64HIGH(t)==1 && I64LOW(t)==0x80000000);	// 100000.......
+	t = t<<1;
+	test(I64HIGH(t)==3 && I64LOW(t)==0);
+	t = t<<1;
+	test(I64HIGH(t)==6 && I64LOW(t)==0);
+
+	r = MAKE_TINT64(0,KMaxTUint32);
+	t = r<<32;
+	test(I64LOW(t)==0 && I64HIGH(t)==KMaxTUint32);
+
+	// >>
+	test.Next(_L(">>"));
+	r = MAKE_TINT64(3,0);
+	t = r>>1;
+	test(I64HIGH(t)==1 && I64LOW(t)==0x80000000);
+	t = t>>1;
+	test(I64HIGH(t)==0 && I64LOW(t)==0xC0000000);
+
+	r = MAKE_TINT64(0x80000000,0);  
+	t = r>>(31);
+	test(I64HIGH(t)==KMaxTUint32 && I64LOW(t)==0);
+	t = t>>(32);
+	test(I64HIGH(t)==KMaxTUint32 && I64LOW(t)==KMaxTUint32);
+	t = t>>1;
+	test(I64HIGH(t)==KMaxTUint32 && I64LOW(t)==KMaxTUint32);
+	t = t>>16;
+	test(I64HIGH(t)==KMaxTUint32 && I64LOW(t)==KMaxTUint32);
+
+	r = MAKE_TINT64(0x80000000,0);
+	t = r>>(32);
+	test(I64HIGH(t)==KMaxTUint32 && I64LOW(t)==0x80000000);
+
+	r = MAKE_TINT64(0x80000000,0);
+	t = r>>63;
+	test(I64LOW(t)==KMaxTUint32 && I64HIGH(t)==KMaxTUint32);
+
+	r = MAKE_TINT64(KMaxTUint32, 0);
+	t = r>>32;
+	test(I64HIGH(t)==KMaxTUint32 && I64LOW(t)==KMaxTUint32);
+
+	r = MAKE_TINT64(0x40000000,0);
+	t = r>>30;
+	test(I64HIGH(t)==1 && I64LOW(t)==0);
+	t = r>>31;
+	test(I64HIGH(t)==0 && I64LOW(t)==0x80000000);
+	t = r>>62;
+	test(I64HIGH(t)==0 && I64LOW(t)==1);
+	t = r>>63;
+	test(I64HIGH(t)==0 && I64LOW(t)==0);
+
+	test.End();
+	}
+
+LOCAL_C void Test3()
+	{
+	// Test some more operators
+
+	// unary -
+	test.Start(_L("unary -"));
+	TInt64 r=0, x(KMinTInt32);
+	r=-x;
+	test(I64INT(r)==KMinTInt32);
+
+	x = MAKE_TINT64(0,0x80000000);
+	r=-x;
+	test(I64INT(r)==KMinTInt32);
+
+	// ++
+	// post increment
+	test.Next(_L("++"));
+	x=-1;
+	r=x++;
+	test(I64INT(r)==-1 && I64INT(x)==0);
+	r=x++;
+	test(I64INT(r)==0 && I64INT(x)==1);
+	r=x++;
+	test(I64INT(r)==1 && I64INT(x)==2);
+
+	x=KMinTInt32;
+	r=x++;
+	test(I64INT(r)==KMinTInt32 && I64INT(x)==KMinTInt32+1);
+
+	x=KMaxTUint32;
+	r=x++;
+	test(I64INT(r)==(TInt)KMaxTUint32 && I64HIGH(x)==1 && I64LOW(x)==0);
+	r=x++;
+	test(I64HIGH(r)==1 && I64LOW(r)==0 && I64HIGH(x)==1 && I64LOW(x)==1);
+
+	// pre increment;
+	x=-1;
+	r=++x;
+	test(I64INT(r)==0 && I64INT(x)==0);
+	r=++x;
+	test(I64INT(r)==1 && I64INT(x)==1);
+	r=++x;
+	test(I64INT(r)==2 && I64INT(x)==2);
+
+	x=KMinTInt32;
+	r=++x;
+	test(I64INT(r)==KMinTInt32+1 && I64INT(x)==KMinTInt32+1);
+
+	x=KMaxTUint32;
+	r=++x;
+	test(I64HIGH(r) && I64HIGH(x)==1 && I64LOW(x)==0);
+	r=x++;
+	test(I64HIGH(r)==1 && I64LOW(r)==0 && I64HIGH(x)==1 && I64LOW(x)==1);
+
+	
+	// --
+	test.Next(_L("--"));
+	// post decrement	   
+	x=1;
+	r=x--;
+	test(I64INT(r)==1 && I64INT(x)==0);
+	r=x--;
+	test(I64INT(r)==0 && I64INT(x)==-1);
+	r=x--;
+	test(I64INT(r)==-1 && I64INT(x)==-2);
+
+	x=KMinTInt32+1;
+	r=x--;
+	test(I64INT(r)==KMinTInt32+1 && I64INT(x)==KMinTInt32);
+
+	x=KMaxTUint32;
+	x+=1;
+	r=x--;
+	test(I64HIGH(r)==1 && I64LOW(r)==0 && I64HIGH(x)==0 && I64LOW(x)==KMaxTUint32);
+	r=x--;
+	test(I64HIGH(r)==0 && I64LOW(r)==KMaxTUint32 && I64HIGH(x)==0 && I64LOW(x)==KMaxTUint32-1);
+
+	x = MAKE_TINT64(KMaxTUint32,KMaxTUint32);
+	r=x--;
+	test(I64HIGH(r)==KMaxTUint32 && I64LOW(r)==KMaxTUint32 && I64HIGH(x)==KMaxTUint32 && I64LOW(x)==KMaxTUint32-1);
+
+	// pre decrement	   
+	x=1;
+	r=--x;
+	test(I64INT(r)==0 && I64INT(x)==0);
+	r=--x;
+	test(I64INT(r)==-1 && I64INT(x)==-1);
+	r=--x;
+	test(I64INT(r)==-2 && I64INT(x)==-2);
+
+	x=KMinTInt32+1;
+	r=--x;
+	test(I64INT(r)==KMinTInt32 && I64INT(x)==KMinTInt32);
+
+	x=KMaxTUint32;
+	x+=1;
+	r=--x;
+	test(I64HIGH(r)==0 && I64LOW(r)==KMaxTUint32 && I64HIGH(x)==0 && I64LOW(x)==KMaxTUint32);
+	r=--x;
+	test(I64HIGH(r)==0 && I64LOW(r)==KMaxTUint32-1 && I64HIGH(x)==0 && I64LOW(x)==KMaxTUint32-1);
+
+	x = MAKE_TINT64(KMaxTUint32,KMaxTUint32);
+	r=--x;
+	test(I64HIGH(r)==KMaxTUint32 && I64LOW(r)==KMaxTUint32-1 && I64HIGH(x)==KMaxTUint32 && I64LOW(x)==KMaxTUint32-1);
+
+  
+
+	// Binary +
+	test.Next(_L("Binary +"));
+	x=KMinTInt32;
+	r=x+1;
+	test(I64INT(r)==KMinTInt32+1 && I64INT(x)==KMinTInt32);
+
+	x=-1;
+	r=x+1;
+	test(I64INT(r)==0 && I64INT(x)==-1);
+	x=r+1;
+	test(I64INT(r)==0 && I64INT(x)==1);
+
+	x=KMaxTUint32;
+	r=x+KMaxTUint32;
+	test(I64HIGH(r)==1 && I64LOW(r)==KMaxTUint-1);
+
+	x=KMaxTUint32;
+	x+=1;
+	r=x+(-1);
+	test(I64HIGH(r)==0 && I64LOW(r)==KMaxTUint32);
+
+	TInt64 y(0);
+	x=KMaxTUint32;
+	r=x+y;
+	test(I64HIGH(r)==0 && I64LOW(r)==KMaxTUint32);
+
+	y=KMaxTUint32;
+	r=x+y;
+	test(I64HIGH(r)==1 && I64LOW(r)==KMaxTUint32-1);
+
+	y=0;
+	x = MAKE_TINT64(KMaxTUint32,KMaxTUint32);
+	r=x+y;
+	test(I64HIGH(r)==KMaxTUint32 && I64LOW(r)==KMaxTUint32);
+
+	y=1;
+	x = MAKE_TINT64(KMaxTUint32,KMaxTUint32);
+	x-=1;
+	r=x+y;
+	test(I64HIGH(r)==KMaxTUint32 && I64LOW(r)==KMaxTUint32);
+
+	y=0;
+	x=KMinTInt32;
+	r=x+y;
+	test(I64INT(r)==KMinTInt32);
+
+	y=-1;
+	x=KMinTInt32;
+	x+=1;
+	r=x+y;
+	test(I64INT(r)==KMinTInt32);
+	
+	y=-1;
+	x=-1;
+	r=x+y;
+	test(I64INT(r)==-2);
+
+	y=-1;
+	x=KMaxTUint32;
+	r=x+y;
+	test(I64HIGH(r)==0 && I64LOW(r)==KMaxTUint32-1);
+	y=-1;
+	x+=1;
+	r=x+y;
+	test(I64HIGH(r)==0 && I64LOW(r)==KMaxTUint32);
+	y=-1;
+	x = MAKE_TINT64(KMaxTUint32,KMaxTUint32);
+	r=x+y;
+	test(I64HIGH(r)==KMaxTUint32 && I64LOW(r)==KMaxTUint32-1);
+
+	y=KMinTInt32;
+	x=KMaxTUint32;
+	r=x+y;
+	test(I64HIGH(r)==0 && I64LOW(r)==KMaxTUint32-(TUint)KMinTInt32);
+	x = MAKE_TINT64(KMaxTUint32,KMaxTUint32);
+	r=x+y;
+	test(I64HIGH(r)==KMaxTUint32 && I64LOW(r)==0x7fffffff);
+
+	y=KMinTInt32;
+	x=-(KMinTInt32+1);
+	x+=1;
+	r=x+y;
+	test(I64INT(r)==0);
+
+
+	// Binary -
+	test.Next(_L("Binary -"));
+	x=KMinTInt32+1;
+	r=x-1;
+	test(I64INT(r)==KMinTInt32);
+
+	x=2;
+	r=x-1;
+	test(I64INT(r)==1);
+	x=1;
+	r=x-1;
+	test(I64INT(r)==0);
+	x=0;
+	r=x-1;
+	test(I64INT(r)==-1);
+
+	x=KMaxTUint32;
+	r=x-KMaxTUint32;
+	test(I64INT(r)==0);
+
+	x=KMaxTUint32;
+	x+=1;
+	r=x-1;
+	test(I64HIGH(r)==0 && I64LOW(r)==KMaxTUint32);
+
+	x=KMaxTUint32;
+	r=x-1;
+	test(I64HIGH(r)==0 && I64LOW(r)==KMaxTUint32-1);
+
+	x = MAKE_TINT64(KMaxTUint32,KMaxTUint32);
+	r=x-1;
+	test(I64HIGH(r)==KMaxTUint32 && I64LOW(r)==KMaxTUint32-1);
+
+
+	y=0;
+	x=KMaxTUint32;
+	r=x-y;
+	test(I64HIGH(r)==0 && I64LOW(r)==KMaxTUint32);
+
+	y=KMaxTUint32;
+	r=x-y;
+	test(I64INT(r)==0);
+
+	x=KMaxTUint32;
+	x+=1;
+	y=1;
+	r=x-1;
+   	test(I64HIGH(r)==0 && I64LOW(r)==KMaxTUint32);
+	x-=1;
+	r=x-1;
+	test(I64HIGH(r)==0 && I64LOW(r)==KMaxTUint32-1);
+
+	y=0;
+	x = MAKE_TINT64(KMaxTUint32,KMaxTUint32);
+	r=x-y;
+	test(I64HIGH(r)==KMaxTUint32 && I64LOW(r)==KMaxTUint32);
+
+	y=1;
+	x = MAKE_TINT64(KMaxTUint32,KMaxTUint32);
+	r=x-y;
+	test(I64HIGH(r)==KMaxTUint32 && I64LOW(r)==KMaxTUint32-1);
+
+	y=0;
+	x=KMinTInt32;
+	r=x-y;
+	test(I64INT(r)==KMinTInt32);
+
+	y=1;
+	x=KMinTInt32;
+	x+=1;
+	r=x-y;
+	test(I64INT(r)==KMinTInt32);
+	
+	y=1;
+	x=1;
+	r=x-y;
+	test(I64INT(r)==0);
+
+	y=-1;
+	x=-1;
+	r=x-y;
+	test(I64INT(r)==0);
+
+	x=0;
+	y=KMinTInt32;
+	r=x-y;
+	test(I64INT(r)==KMinTInt32);
+
+	x=KMinTInt32;
+	y=KMinTInt32;
+	r=x-y;
+	test(I64INT(r)==0);
+
+	test.End();
+	}
+
+
+LOCAL_C void Test4()
+// still more operators
+	{
+	// * 
+	test.Start(_L("Binary *"));
+	TInt64 r(0), x(1), y(0);
+	r=x*y;
+	test(I64INT(r)==0);
+
+	y=-1;
+	r=x*y;
+	test(I64INT(r)==-1);
+
+	x=-1;
+	r=x*y;
+	test(I64INT(r)==1);
+
+	x=KMinTInt32;
+	r=x*y;
+	test(I64INT(r)==KMinTInt32);
+
+	y=0;
+	r=x*y;
+	test(I64INT(r)==0);
+
+	y=KMinTInt32;
+	r=x*y;
+	test(I64LOW(r)==0 && I64HIGH(r)==0x40000000);
+
+	y=KMaxTUint32;
+	x=KMaxTUint32;
+	r=x*y;
+	test(I64LOW(r)==1 && I64HIGH(r)==0xfffffffe);
+
+
+	// /
+	test.Next(_L("Binary /"));
+	x=5;
+	y=5;
+	r=x/y;
+	test(I64INT(r)==1);
+
+	y=1;
+	r=x/y;
+	test(I64INT(r)==5);
+
+	x=-5;
+	r=x/y;
+	test(I64INT(r)==-5);
+
+	y=-1;
+	r=x/y;
+	test(I64INT(r)==5);
+	
+	x=-1;
+	r=x/y;
+	test(I64INT(r)==1);
+
+	x=0;
+	r=x/y;
+	test(I64INT(r)==0);
+
+	x=KMinTInt32;
+	y=-1;
+	r=x/y;
+	test(I64INT(r)==KMinTInt32);
+
+	x=KMinTInt32;
+	y=KMinTInt32;
+	r=x/y;
+	test(I64INT(r)==1);
+
+	x=KMaxTUint32;
+	y=KMaxTUint32;
+	r=x/y;
+	test(I64INT(r)==1);
+
+	x = MAKE_TINT64(KMaxTUint32,KMaxTUint32);
+	r=x/y;	   
+	test(I64INT(r)==0);
+
+	y = MAKE_TINT64(KMaxTUint32,KMaxTUint32);
+	r=x/y;
+	test(I64INT(r)==1);
+
+	y=KMinTInt32;
+	r=x/y;
+	test(I64INT(r)==0);
+  
+    x = MAKE_TINT64(4,257629747);
+    y=KMaxTInt;
+	r=x/y;
+	test(I64LOW(r)==8 && I64HIGH(r)==0);
+
+	x = MAKE_TINT64(3452,533254);
+	x=-x;
+	x=x/x;
+	test(x==1);
+
+  	// %
+	test.Next(_L("binary %%"));
+	x=2341;
+	y=2340;
+	test(x%y==1);
+	y=2;
+	test(x%y==1);
+	x = MAKE_TINT64(234893,23494);
+	test(x%x==0);
+	test(x%y==0);
+	x=-x;
+	y=10;
+	test(x%y==-2);
+	test(x%(-y)==-2);
+	
+					 
+	// Lsr
+	test.Next(_L("Lsr"));
+
+	r = MAKE_TINT64(3,0);
+	I64LSR(r, 1);
+	test(I64HIGH(r)==1 && I64LOW(r)==0x80000000);
+	I64LSR(r, 1);
+	test(I64HIGH(r)==0 && I64LOW(r)==0xC0000000);
+
+	r = MAKE_TINT64(0x80000000,0);  
+	I64LSR(r, 31);
+	test(I64HIGH(r)==1 && I64LOW(r)==0);
+	//test(I64HIGH(r)==KMaxTUint32 && I64LOW(r)==0);
+	I64LSR(r, 32);
+	//test(I64HIGH(r)==KMaxTUint32 && I64LOW(r)==KMaxTUint32);
+	test(I64HIGH(r)==0 && I64LOW(r)==1);
+
+	r = MAKE_TINT64(0x80000000,0);
+	I64LSR(r, 32);
+	test(I64HIGH(r)==0 && I64LOW(r)==0x80000000);
+	//test(I64HIGH(r)==KMaxTUint32 && I64LOW(r)==0x80000000);
+
+	r = MAKE_TINT64(0x80000000,0);
+	I64LSR(r, 63);
+	test(I64LOW(r)==1 && I64HIGH(r)==0);
+	//test(I64LOW(r)==KMaxTUint32 && I64HIGH(r)==KMaxTUint32);
+
+	r = MAKE_TINT64(KMaxTUint32, 0);
+	I64LSR(r, 32);
+	test(I64HIGH(r)==0 && I64LOW(r)==KMaxTUint32);
+	//test(I64HIGH(r)==KMaxTUint32 && I64LOW(r)==KMaxTUint32);
+
+
+	// Mul10
+	test.Next(_L("Mul10"));
+	const TInt64 KMaxDiv10= KMaxTInt64 / 10;
+	const TInt64 KStep=MAKE_TINT64(0x003dfe03, 0xf7ea23cd);
+	for(TInt64 jj=-KMaxDiv10; jj<=KMaxDiv10; jj+=KStep)
+		{
+		r=jj;
+		r *= 10;
+		test(r==jj*10);
+		r/=10;
+		test(r==jj);
+		}
+
+	r=KMinTInt32/10;
+	r *= 10;
+	test(I64INT(r)==(KMinTInt/10)*10);
+
+	r=KMaxTUint32;
+	r *= 10;
+	test(I64HIGH(r)==9 && I64LOW(r)==0xFFFFFFF6);
+
+	r/=10;
+	test(r==MAKE_TINT64(0,KMaxTUint32));
+
+
+	// DivMod
+	test.Next(_L("DivMod"));
+	TInt64 seed = MAKE_TINT64(0x0000336a,0xb2001a78);
+	for (TInt i=0; i<200; i++)
+		{
+		TInt o=Math::Rand(seed);
+		TInt p=Math::Rand(seed);
+		TInt r=Math::Rand(seed);
+		TInt q=Math::Rand(seed);
+
+		DivModTest(MAKE_TINT64(0,q), MAKE_TINT64(0,r));
+		DivModTest(MAKE_TINT64(r,q), MAKE_TINT64(o,p));
+		DivModTest(MAKE_TINT64(p,q), MAKE_TINT64(0,o));
+		DivModTest(MAKE_TINT64(0,p), MAKE_TINT64(r,o));
+		
+		DivModTest(-MAKE_TINT64(0,q), -MAKE_TINT64(0,r));
+		DivModTest( MAKE_TINT64(0,q), -MAKE_TINT64(0,r));
+		DivModTest(-MAKE_TINT64(0,q),  MAKE_TINT64(0,r));
+
+		DivModTest(-MAKE_TINT64(r,q), -MAKE_TINT64(o,p));
+		DivModTest( MAKE_TINT64(r,q), -MAKE_TINT64(o,p));
+		DivModTest(-MAKE_TINT64(r,q),  MAKE_TINT64(o,p));
+
+		DivModTest(-MAKE_TINT64(0,p), -MAKE_TINT64(r,o));
+ 		DivModTest( MAKE_TINT64(0,p), -MAKE_TINT64(r,o));
+		DivModTest(-MAKE_TINT64(0,p),  MAKE_TINT64(r,o));
+		}
+
+	test.End();
+	}
+
+LOCAL_C void Test5()
+// still more operators
+	{
+
+	// fast multiply by 10
+	test.Start(_L("Mul10"));
+   	TInt64 r(0);
+	r *= 10;
+	test(I64INT(r)==0);
+
+	r=-1;
+	r *= 10;
+	test(I64INT(r)==-10);
+
+	r=KMinTInt32/10;
+	r *= 10;
+	test(I64INT(r)==KMinTInt32-(KMinTInt32%10));
+
+	r=1;
+	r *= 10;
+	test(I64INT(r)==10);
+
+	r=KMaxTUint32/10;
+	r *= 10;
+	test(I64LOW(r)==(KMaxTUint32-(KMaxTUint%10)) && I64HIGH(r)==0);
+
+	r *= 10;
+	test(r==TInt64(KMaxTUint32-(KMaxTUint%10))*10);
+
+	r *= 10;
+	test(r==TInt64(KMaxTUint32-(KMaxTUint%10))*100);
+
+ 	// Comparisons
+	test.Next(_L("Comparison operators"));
+
+	// == , !=, <= and >=
+	test.Next(_L("==, !=, <= and >="));
+	r=KMinTInt32;
+	TInt64 x(KMinTInt32);
+	TInt64 y(100);
+	test(r==x && r!=y && r>=x && r<=x);
+
+	r=-1;
+	x=-1;
+	test(r==x && r!=y && r>=x && r<=x);
+
+	r=0;
+	x=0;
+	test(r==x && r!=y && r>=x && r<=x);
+
+	r=1;
+	x=1;
+	test(r==x && r!=y && r>=x && r<=x);
+
+	r=KMaxTUint32;
+	x=KMaxTUint32;
+	test(r==x && r!=y && r>=x && r<=x);
+
+	r = MAKE_TINT64(KMaxTUint32,KMaxTUint32);
+	x = MAKE_TINT64(KMaxTUint32,KMaxTUint32);
+	test(x==r && x!=y && x>=r && x<=r);
+
+	//>=, <=, > and <
+	test.Next(_L(">=, <=, > and <"));
+	r=KMinTInt32;
+	x=KMinTInt32+1;
+	test(x>r && x>=r && r<x && r<=x);
+
+	r=1;
+	x=-1;
+	test(r>x && x<r && r>=x && x<=r);
+
+	r=KMaxTUint32;
+	x=KMaxTUint32-1;
+	test(r>x && x<r && r>=x && x<=r);
+
+	r+=1;
+	x+=1;
+	test(r>x && x<r && r>=x && x<=r);
+
+	r = MAKE_TINT64(KMaxTUint32,KMaxTUint32);
+	x = MAKE_TINT64(KMaxTUint32,KMaxTUint32-1);
+	test(r>x && x<r && r>=x && x<=r);
+
+	r = MAKE_TINT64(0x80000000,0);
+	x = MAKE_TINT64(KMaxTInt32,KMaxTUint32);
+	test(r<x);
+	test(x>r);
+	test(x!=r);
+	test(r<=x);
+	test(x>=r);
+	test(r<0 && x>0);
+
+	x = MAKE_TINT64(0x80000000,1);
+	test(r<x && x>r && x!=r && r<=x && x>=r);
+
+	r = MAKE_TINT64(KMaxTInt32,KMaxTUint32);
+	--r;
+	test(r>x && x<r && x!=r && r>=x && x<=r);
+
+	// multiply top bits
+	test.Next(_L("MulTop"));
+   	r=0;
+    x=0;
+	I64MULTOP(r, x);
+	test(I64INT(r)==0);
+
+	r=1;
+    x=1;
+	I64MULTOP(r, x);
+	test(I64INT(r)==0);
+
+	r = MAKE_TINT64(KMaxTInt,KMaxTUint);
+    x=2;
+	I64MULTOP(r, x);
+	test(I64INT(r)==0);
+
+	r = MAKE_TINT64(KMaxTInt,KMaxTUint);
+    x=4;
+	I64MULTOP(r, x);
+	test(I64INT(r)==1);
+
+    r = MAKE_TINT64(0x80000000,0);
+    x = MAKE_TINT64(0x80000000,0);
+	I64MULTOP(r, x);
+    r>>=32;
+	test(I64INT(r)==0x40000000);
+
+    r = MAKE_TINT64(0x18763529,0x93263921);
+    x = MAKE_TINT64(0x0abcdef0,0x647239ea);
+    TInt64 r2=r;
+    TInt64 x2=x;
+    I64MULTOP(r, x2);
+    I64MULTOP(x, r2);
+    test(r==x);
+
+//	TInt64(0xac11b680,0x1e603000) * TInt64(0x014a5c20,0xc9d58740)
+
+	TPtrC8 a4=_L8("ac11b6801e603000");
+	TPtrC8 a5=_L8("014a5c20c9d58740");
+	TBuf8<64> a6;
+	HexMul(a4,a5,a6);
+
+	x = MAKE_TINT64(0x014a5c20,0xc9d58740); 
+
+	r = MAKE_TINT64(0xac11b680,0x1e603000);
+	y = MAKE_TINT64(0x0963fbc4,0x415c0000); // Expected result (bottom 64 bits)
+
+	r *= x;
+
+	test(r==y);
+
+	r = MAKE_TINT64(0xac11b680,0x1e603000);
+	y = MAKE_TINT64(0x00de0cc1,0xa89d70dc); // Expected result (top 64 bits)
+	I64MULTOP(r, x);
+	test(r==y);
+
+	test.End();
+	}
+
+
+GLDEF_C TInt E32Main()
+    {
+	test.Title();
+	test.Start(_L("Constructors"));
+	Test1();
+	test.Next(_L("Unary operators"));
+	Test1_2();
+	test.Next(_L("Operators 1"));
+	Test2();
+	test.Next(_L("Operators 2"));
+	Test3();
+	test.Next(_L("Operators 3"));
+	Test4();
+	test.Next(_L("Operators 4"));
+	Test5();
+	test.End();
+	return(KErrNone);
+    }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32test/math/t_i64_2.cpp	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,484 @@
+// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32test\math\t_i64_2.cpp
+// Overview:
+// Test 64-bit integer functionality.
+// API Information:
+// TInt64, TUInt64.
+// Details:
+// - Construct TInt64 and TUInt64 and verify the results.
+// - Test the unary and shift operators and check results are as expected.
+// - Test the  + - * / and % operators, verify results are as expected.
+// - Test the  + - * / and % operators with random numbers, verify results 
+// are as expected.
+// - Test the conversion of TInt64 to/from TReal. Verify that the results
+// are as expected.
+// - Test the conversion of TInt64 to/from text. Verify that the results
+// are as expected.
+// Platforms/Drives/Compatibility:
+// All.
+// Assumptions/Requirement/Pre-requisites:
+// Failures and causes:
+// Base Port information:
+// 
+//
+
+#include <e32test.h>
+#include <e32math.h>
+#include "largeint.h"
+#include "../misc/prbs.h"
+
+typedef TLargeInt<2> I64;
+typedef TLargeInt<4> I128;
+
+RTest test(_L("T_I64_2"));
+TUint Seed[2];
+
+TUint64 Random64()
+	{
+	TUint h = Random(Seed);
+	TUint l = Random(Seed);
+	return MAKE_TUINT64(h,l);
+	}
+
+#define BOOL(x)	((x)?1:0)
+
+#define FOREACH(p, table, esize)	\
+	for(p=table; p<(const TUint32*)((const TUint8*)table+sizeof(table)); p+=esize/sizeof(TUint32))
+
+const TUint32 Table1[] =
+	{
+	0x00000000, 0x00000000,
+	0x00000001, 0x00000000,
+	0x0000cc01, 0x00000000,
+	0x00db2701, 0x00000000,
+	0xcc9ffcd1, 0x00000000,
+	0x00000000, 0xffffffff,
+	0xeeeeeeee, 0xffffffff,
+	0x04030201, 0x00000055,
+	0x04030201, 0x00006655,
+	0x04030201, 0x00776655,
+	0x04030201, 0x33776655,
+	0xf9de6484, 0xb504f333
+	};
+
+void Test1()
+	{
+	test.Next(_L("Unary operators and shifts"));
+
+	const TUint32* p;
+	FOREACH(p,Table1,8)
+		{
+		I64 a(p);
+		TInt64 b = MAKE_TINT64(p[1], p[0]);
+		I64 c(b);
+		test(a==c);
+		TUint64 d = MAKE_TUINT64(p[1], p[0]);
+		I64 e(d);
+		test(a==e);
+		I64 c2(~b);
+		I64 c3(-b);
+		a.Not();
+		test(c2==a);
+		a.Not();
+		test(c==a);
+		a.Neg();
+		test(c3==a);
+		a.Neg();
+		test(c==a);
+		}
+	FOREACH(p,Table1,8)
+		{
+		I64 a(p);
+		TInt64 s = MAKE_TINT64(p[1], p[0]);
+		TUint64 u = MAKE_TUINT64(p[1], p[0]);
+		TInt n;
+		for (n=0; n<64; ++n)
+			{
+			I64 b(a), c(a), d(a);
+			b.Lsl(n), c.Lsr(n), d.Asr(n);
+			TInt64 s2 = s<<n;
+			TInt64 s3 = s>>n;
+			TUint64 u2 = u<<n;
+			TUint64 u3 = u>>n;
+//			test.Printf(_L("s2=%lx\ns3=%lx\n,u2=%lx\n,u3=%lx\n"),s2,s3,u2,u3);
+			test(b == I64(s2));
+			test(b == I64(u2));
+			test(c == I64(u3));
+			test(d == I64(s3));
+			}
+		}
+	}
+
+const TUint32 Table2[] =
+	{
+	0x00000000, 0x00000000, 0x00000000, 0x00000000,
+	0x00000001, 0x00000000, 0x00000000, 0x00000000,
+	0x05f5e100, 0x00000000, 0x000000cb, 0x00000000,
+	0xffffff9c, 0xffffffff, 0x00129cbb, 0x00000000,
+	0xffffcd03, 0xffffffff, 0xffff9123, 0xffffffff,
+	0xf9de6484, 0xb504f333, 0xf9de6484, 0xb504f333,
+	0xf9de6484, 0xb504f333, 0x2168c235, 0xc90fdaa2,
+	0xf9de6484, 0xb504f333, 0x000000cb, 0x00000000,
+	0xf9de6484, 0xb504f333, 0x800000cb, 0x00000000,
+	0xf9de6484, 0xb504f333, 0x000000cb, 0x00000001,
+	0xf9de6484, 0xb504f333, 0xfffffed9, 0xffffffff,
+	0xf9de6484, 0xb504f333, 0x197383db, 0xffffffff,
+	0xf9de6484, 0xb504f333, 0x197383db, 0xffffffec,
+	0x38aa3b29, 0x5c17f0bc, 0x000019c7, 0x00000000,
+	0x38aa3b29, 0x5c17f0bc, 0x800019c7, 0x00000000,
+	0x38aa3b29, 0x5c17f0bc, 0x000019c7, 0x00000003,
+	0x38aa3b29, 0x5c17f0bc, 0x197383db, 0xffffffff,
+	0x38aa3b29, 0x5c17f0bc, 0x197383db, 0xffffffec,
+	0x00123456, 0x00000000, 0x8cb9fc1b, 0x00000000,
+	0x00000123, 0x00000000, 0x8cb9fc1b, 0x0000cc9f,
+	0xfffffe33, 0xffffffff, 0x8cb9fc1b, 0x0000cc9f
+	};
+
+void Test2(const TUint32* p)
+	{
+	I64 a(p), b(p+2);
+	TInt64 x = MAKE_TINT64(p[1], p[0]);
+	TInt64 y = MAKE_TINT64(p[3], p[2]);
+	TUint64 u = MAKE_TUINT64(p[1], p[0]);
+	TUint64 v = MAKE_TUINT64(p[3], p[2]);
+	{
+	I64 c(a); c.Add(b); test(c==I64(x+y)); test(c==I64(u+v));
+	test(c==I64(y+x)); test(c==I64(v+u));
+	}
+	{
+	I64 c(a); c.Sub(b); test(c==I64(x-y)); test(c==I64(u-v));
+	I64 d(b); d.Sub(a); test(d==I64(y-x)); test(d==I64(v-u));
+	}
+	{
+	I64 c(a); c.Mul(b); test(c==I64(x*y)); test(c==I64(u*v));
+	test(c==I64(y*x)); test(c==I64(v*u));
+	}
+	{
+	I128 c = a.LongMultS(b);
+	TUint32 t[4];
+	Math::Mul64(x, y, *(TInt64*)(t+2), *(TUint64*)t);
+	test(c==I128(t));
+	Math::Mul64(y, x, *(TInt64*)(t+2), *(TUint64*)t);
+	test(c==I128(t));
+	}
+	{
+	I128 c = a.LongMultU(b);
+	TUint32 t[4];
+	Math::UMul64(u, v, *(TUint64*)(t+2), *(TUint64*)t);
+	test(c==I128(t));
+	Math::UMul64(v, u, *(TUint64*)(t+2), *(TUint64*)t);
+	test(c==I128(t));
+	}
+	if (y!=0)
+		{
+		I64 r; I64 q(a); q.DivS(b,r);
+		test(q==I64(x/y));
+		test(r==I64(x%y));
+		TInt64 r2;
+		TInt64 q2 = Math::DivMod64(x, y, r2);
+		test(q==I64(q2));
+		test(r==I64(r2));
+		}
+	if (x!=0)
+		{
+		I64 r; I64 q(b); q.DivS(a,r);
+		test(q==I64(y/x));
+		test(r==I64(y%x));
+		TInt64 r2;
+		TInt64 q2 = Math::DivMod64(y, x, r2);
+		test(q==I64(q2));
+		test(r==I64(r2));
+		}
+	if (v!=0)
+		{
+		I64 r; I64 q(a); q.DivU(b,r);
+		test(q==I64(u/v));
+		test(r==I64(u%v));
+		TUint64 r2;
+		TUint64 q2 = Math::UDivMod64(u, v, r2);
+		test(q==I64(q2));
+		test(r==I64(r2));
+		}
+	if (u!=0)
+		{
+		I64 r; I64 q(b); q.DivU(a,r);
+		test(q==I64(v/u));
+		test(r==I64(v%u));
+		TUint64 r2;
+		TUint64 q2 = Math::UDivMod64(v, u, r2);
+		test(q==I64(q2));
+		test(r==I64(r2));
+		}
+	{
+	TInt cmpu = a.CompareU(b);
+	TInt cmps = a.CompareS(b);
+	TInt equ = BOOL(u==v);
+	TInt neu = BOOL(u!=v);
+	TInt hi = BOOL(u>v);
+	TInt hs = BOOL(u>=v);
+	TInt lo = BOOL(u<v);
+	TInt ls = BOOL(u<=v);
+
+	TInt eqs = BOOL(x==y);
+	TInt nes = BOOL(x!=y);
+	TInt gt = BOOL(x>y);
+	TInt ge = BOOL(x>=y);
+	TInt lt = BOOL(x<y);
+	TInt le = BOOL(x<=y);
+
+	test(equ==eqs);
+	test(neu==nes);
+	test(equ!=neu);
+	if (cmpu>0)
+		test(!equ && hi && hs && !lo && !ls);
+	else if (cmpu<0)
+		test(!equ && !hi && !hs && lo && ls);
+	else
+		test(equ && !hi && hs && !lo && ls);
+	if (cmps>0)
+		test(!eqs && gt && ge && !lt && !le);
+	else if (cmps<0)
+		test(!eqs && !gt && !ge && lt && le);
+	else
+		test(eqs && !gt && ge && !lt && le);
+	}
+	}
+
+void Test2()
+	{
+	test.Next(_L("Test + - * / % (1)"));
+	const TUint32* p;
+	FOREACH(p,Table2,16)
+		{
+		Test2(p);
+		}
+	}
+
+void Test3()
+	{
+	test.Next(_L("Test + - * / % (2)"));
+	TInt i;
+	for (i=0; i<100; ++i)
+		{
+		TUint32 p[4];
+		p[0] = Random(Seed);
+		p[1] = Random(Seed);
+		p[2] = Random(Seed);
+		p[3] = Random(Seed);
+		Test2(p);
+		}
+	}
+
+void Test4()
+	{
+	test.Next(_L("Test conversion to/from TReal"));
+	TReal x;
+	TReal limit=1048576.0*1048576.0*8192.0;
+	TInt64 t22 = (TInt64)limit;
+	test(t22 == TInt64(1)<<53);
+	TInt64 t23 = (TInt64)(limit-1.0);
+	test(t23 == (TInt64(1)<<53)-1);
+
+
+	TInt i;
+	TInt64 l;
+	for (i=-99; i<100; i++)
+		{
+		x=1;
+		l=1;
+		TReal a(i);
+		TInt64 b(i);
+		while (Abs(x)<limit)
+			{
+			TInt64 ll = (TInt64)x;
+//			test.Printf(_L("r64 %g -> i64 %lx (%lx)\n"), x, ll, l);
+			test(ll==l);
+			ll=0;
+			ll = (TInt64)x;
+			test(ll==l);
+			x*=a;
+			l*=b;
+			if (i==1 || i==0 || (i==-1 && l==TInt64(1)))
+				break;
+			}
+		}
+
+	TReal i64limit = 1024.0*limit;
+	l=MAKE_TINT64(0x7fffffff,0xfffffc00);
+	x=(TReal)l;
+	test(x==i64limit-1024.0);
+	l=MAKE_TINT64(0x80000000,0x00000000);
+	x=(TReal)l;
+	test(x==-i64limit);
+	l=MAKE_TINT64(0x80000000,0x00000400);
+	x=(TReal)l;
+	test(x==1024.0-i64limit);
+	l=MAKE_TINT64(0x00000001,0x00000000);
+	x=(TReal)l;
+	test(x==65536.0*65536.0);
+	l=MAKE_TINT64(0xffffffff,0x00000000);
+	x=(TReal)l;
+	test(x==-65536.0*65536.0);
+
+	for (i=-99; i<100; i++)
+		{
+		x=1;
+		l=1;
+		TReal a(i);
+		TInt64 b(i);
+		while (Abs(x)<limit)
+			{
+			TReal y = (TReal)l;
+			test(y==x);
+			x*=a;
+			l*=b;
+			if (i==1 || i==0 || (i==-1 && l==TInt64(1)))
+				break;
+			}
+		}
+ 
+	}
+
+_LIT8(KTestHex8,"0 1 8 a 1b 2c7 10000000 100000000 1901cbfdc b504f333f9de6484 ffffffffffffffff");
+_LIT16(KTestHex16,"0 1 8 a 1b 2c7 10000000 100000000 1901cbfdc b504f333f9de6484 ffffffffffffffff");
+
+const TUint32 TestHexTable[] =
+	{
+	0x00000000, 0x00000000,
+	0x00000001, 0x00000000,
+	0x00000008, 0x00000000,
+	0x0000000a, 0x00000000,
+	0x0000001b, 0x00000000,
+	0x000002c7, 0x00000000,
+	0x10000000, 0x00000000,
+	0x00000000, 0x00000001,
+	0x901cbfdc, 0x00000001,
+	0xf9de6484, 0xb504f333,
+	0xffffffff, 0xffffffff
+	};
+
+_LIT8(KTestDec8,"0 1 8 100 6561 536870912 2147483648 4294967295 4294967296 549755813888 1000000000000000 9223372036854775807	\
+					-9223372036854775808 -9223372036854775807 -9000000000000000000 -1099511627776 -4294967296 -1000 -1");
+_LIT16(KTestDec16,"0 1 8 100 6561 536870912 2147483648 4294967295 4294967296 549755813888 1000000000000000 9223372036854775807	\
+					-9223372036854775808 -9223372036854775807 -9000000000000000000 -1099511627776 -4294967296 -1000 -1");
+
+const TUint32 TestDecTable[] =
+	{
+	0x00000000, 0x00000000,
+	0x00000001, 0x00000000,
+	0x00000008, 0x00000000,
+	0x00000064, 0x00000000,
+	0x000019a1, 0x00000000,
+	0x20000000, 0x00000000,
+	0x80000000, 0x00000000,
+	0xffffffff, 0x00000000,
+	0x00000000, 0x00000001,
+	0x00000000, 0x00000080,
+	0xa4c68000, 0x00038d7e,
+	0xffffffff, 0x7fffffff,
+	0x00000000, 0x80000000,
+	0x00000001, 0x80000000,
+	0x1d7c0000, 0x831993af,
+	0x00000000, 0xffffff00,
+	0x00000000, 0xffffffff,
+	0xfffffc18, 0xffffffff,
+	0xffffffff, 0xffffffff
+	};
+
+void Test5()
+	{
+	test.Next(_L("Test conversion to/from text"));
+	TLex8 lex8;
+	lex8.Assign(KTestHex8());
+	TInt64 u;
+	const TUint32* p = TestHexTable;
+	for (; !lex8.Eos(); lex8.SkipSpace(), p+=2)
+		{
+		lex8.Mark();
+		test(lex8.Val(u,EHex)==KErrNone);
+		test(u == MAKE_TINT64(p[1], p[0]));
+		TPtrC8 text = lex8.MarkedToken();
+		TBuf8<64> b;
+		b.Num(u,EHex);
+		test(b==text);
+		b.NumUC(u,EHex);
+		TBuf8<64> uc = text;
+		uc.UpperCase();
+		test(b==uc);
+		}
+	lex8.Assign(KTestDec8());
+	TInt64 s;
+	p = TestDecTable;
+	for (; !lex8.Eos(); lex8.SkipSpace(), p+=2)
+		{
+		lex8.Mark();
+		test(lex8.Val(s)==KErrNone);
+		test(s == MAKE_TINT64(p[1], p[0]));
+		TPtrC8 text = lex8.MarkedToken();
+		TBuf8<64> b;
+		b.Num(s);
+		test(b==text);
+		}
+
+	TLex16 lex16;
+	lex16.Assign(KTestHex16());
+	p = TestHexTable;
+	for (; !lex16.Eos(); lex16.SkipSpace(), p+=2)
+		{
+		lex16.Mark();
+		test(lex16.Val(u,EHex)==KErrNone);
+		test(u == MAKE_TINT64(p[1], p[0]));
+		TPtrC16 text = lex16.MarkedToken();
+		TBuf16<64> b;
+		b.Num(u,EHex);
+		test(b==text);
+		b.NumUC(u,EHex);
+		TBuf16<64> uc = text;
+		uc.UpperCase();
+		test(b==uc);
+		}
+	lex16.Assign(KTestDec16());
+	p = TestDecTable;
+	for (; !lex16.Eos(); lex16.SkipSpace(), p+=2)
+		{
+		lex16.Mark();
+		test(lex16.Val(s)==KErrNone);
+		test(s == MAKE_TINT64(p[1], p[0]));
+		TPtrC16 text = lex16.MarkedToken();
+		TBuf16<64> b;
+		b.Num(s);
+		test(b==text);
+		}
+	}
+
+GLDEF_C TInt E32Main()
+    {
+
+	Seed[0] = 0xb8aa3b29;
+	Seed[1] = 0;
+
+	test.Title();
+	test.Start(_L("Testing 64 bit integers"));
+
+	Test1();
+	Test2();
+	Test3();
+	Test4();
+	Test5();
+
+	test.End();
+	return(KErrNone);
+    }
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32test/math/t_math.cpp	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,2926 @@
+// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32test\math\t_math.cpp
+// T_MATH.CPP - Test routines for the maths functions
+// NB When considering the accuracy of the results (i.e. the tolerance used in testApprox()) it
+// should be remembered that the results expected are not always given to full precision and so
+// the results obtained are mostly as accurate as can be expected.
+// Overview:
+// Test functionality of the Math library.
+// API Information:
+// Math.
+// Details:
+// - Test math's trigonometric, powers, roots, logs, modulo, sqrt, exp,
+// Int, Frac, rounding for range of input values are as expected.
+// - Test the returned error values are as expected when illegal math's
+// operations are done.
+// - Check the return value is KErrTotalLossOfPrecision when incorrect values
+// is passed to modulo function.
+// - Test for success when the same variable for both operands in some 
+// Math functions are used.
+// Platforms/Drives/Compatibility:
+// All.
+// Assumptions/Requirement/Pre-requisites:
+// Failures and causes:
+// Base Port information:
+// 
+//
+
+#include "t_math.h"
+#include "t_vals.h"
+
+LOCAL_D RTest test(_L("T_MATH"));
+
+LOCAL_D TInt64 rseed = MAKE_TINT64(123456789,987654321);
+
+typedef struct
+    {
+    TReal num; // input number
+    TReal res; // expected result
+    } SQRT_TEST;
+
+LOCAL_D SQRT_TEST testsqrt[]=
+    {
+    {0.0,0.0}, // zero
+	{KNegZeroTReal64,KNegZeroTReal64},
+    {1.0,1.0},
+    {.64,.8},
+    {.81,.9},
+    {9,3},
+    {25,5},
+    {10000,100},
+    {400,20},
+    {6.25,2.5},
+    {1E-98,1E-49},
+    {1E-98,1E-49},
+    {1E98,1E49},
+    {1.0000000001,1.00000000005}
+    };
+
+typedef struct
+    {
+    TReal num; // input number
+    TReal res; // expected result
+    } TESTLN;
+
+LOCAL_D TESTLN testln[]=
+    {
+    {.001,-6.9077552789821317},
+    {.002,-6.2146080984221917},
+    {.023,-3.7722610630529874},
+    {.004,-5.5214609178622464},
+    {.050,-2.9957322735539910},
+    {.100,-2.3025850929940457},
+    {.150,-1.8971199848858813},
+    {.200,-1.6094379124341004},
+    {.250,-1.3862943611198906},
+    {.300,-1.2039728043259360},
+    {.350,-1.0498221244986777},
+    {.400,-0.9162907318741551},
+    {.450,-0.7985076962177716},
+    {.500,-0.6931471805599453},
+    {.550,-0.5978370007556204},
+    {.600,-0.5108256237659907},
+    {.650,-0.4307829160924543},
+    {.700,-0.3566749439387324},
+    {.750,-0.2876820724517809},
+    {.980,-0.0202027073175194},
+    {.985,-0.0151136378100482},
+    {.990,-0.0100503358535014},
+    {.995,-0.0050125418235443},
+    {.088,-2.4304184645039306},
+    {1,0}
+    };
+
+typedef struct
+    {
+    TReal val; // value for which the exponent is to be found
+    TReal result; // result
+    } EXP;
+
+LOCAL_D EXP testexp[]=
+    {
+    {4E-20,1.0}, 
+	{5.4E-20,1.0},
+	{0.0,1.0},
+	{5E-324,1.0},
+    };
+
+typedef struct
+    {
+    TReal number; // number to be raised to a power
+    TReal power; // power
+    TReal result; // result
+    } POWER;
+
+LOCAL_D POWER testpow[]=
+    {
+	{45,3,91125.0},
+	{-2,4,16},
+    {2,-3,0.125},
+    {-2,3,-8},
+    {16,20,1.208925819614628E+24},
+    };
+
+// Added by AnnW, October 1996
+LOCAL_D const POWER testpowexact[]=
+	{
+	{0.0,1.0,0.0},
+	{0,7,0},
+	{0.0,16.0,0.0},
+	{0.0,3.9271E-17,0.0},
+	{-2,0,1},
+    {1,0,1},
+	{1.545243,0,1},
+	{4.8,0.0,1.0},
+	{195.0,0.0,1.0},
+	{1.0E-7,0.0,1.0},
+	{1.0,2.0,1.0},
+	{1.0,1.0E-6,1.0},
+	{1.0,1.0E+10,1.0},
+	{-1.0,2.0,1.0},
+	{-1.0,1.0000000001E+10,-1.0},
+	{-1.0,1.0E+10,1.0},
+	{1.593704102953967e+3,1.0,1.593704102953967e+3},
+	{1.234567E+50,1.0,1.234567E+50},
+	{1.2345678901234567E+146,1.0,1.2345678901234567E+146},
+	{-7.6543210987654321E-53,1.0,-7.6543210987654321E-53},
+	{0.0,2.0,0.0},
+	{KNegZeroTReal64,4.0,0.0},
+	{KPosInfTReal64,-2.0,0.0},
+	{KNegInfTReal64,-2.0,0.0},
+	{2.0,KNegInfTReal64,0.0},
+	{-2.0,KNegInfTReal64,0.0},
+	{0.5,KPosInfTReal64,0.0},
+	{-0.5,KPosInfTReal64,0.0},
+	{KPosInfTReal64,-5.0,0.0},
+	{KPosInfTReal64,-6.0,0.0},
+	{KNegInfTReal64,KNegInfTReal64,0.0},
+	{KPosInfTReal64,KNegInfTReal64,0.0},
+	};
+
+// Check ISO requirements on Pow()
+//
+typedef struct
+	{
+	TReal number;	// number to be raised to a power
+	TReal power;	// power
+	TInt rc;		// return value from Pow()
+	TReal result;	// numerical result
+	} POWERISO;
+
+const TReal KPosZeroTReal64 = 0.0;
+
+LOCAL_D const POWERISO testpow_iso[] =
+	{
+	// pow(+/-0, y) returns +/-INF and raises the ''divide-by-zero''
+	// floating-point exception for y an odd integer < 0
+	{ KPosZeroTReal64, -3.0, KErrOverflow, KPosInfTReal64 },	// 0
+	{ KNegZeroTReal64, -3.0, KErrOverflow, KNegInfTReal64 },	// 1
+
+	// pow(+/-0, y) returns +INF and raises the ''divide-by-zero''
+	// floating-point exception for y < 0 and not an odd integer
+	{ KPosZeroTReal64, -2.0, KErrOverflow, KPosInfTReal64 },	// 2
+	{ KNegZeroTReal64, -2.0, KErrOverflow, KPosInfTReal64 },	// 3
+
+	// pow(+/-0, y) returns +/-0 for y an odd integer > 0
+	{ KPosZeroTReal64, 3.0, KErrNone, KPosZeroTReal64 },		// 4
+	{ KNegZeroTReal64, 3.0, KErrNone, KNegZeroTReal64 },		// 5
+
+	// pow(+/-0, y) returns +0 for y > 0 and not an odd integer
+	{ KPosZeroTReal64, 2.0, KErrNone, KPosZeroTReal64 },		// 6
+	{ KNegZeroTReal64, 2.0, KErrNone, KPosZeroTReal64 },		// 7
+
+	// pow(-1, +/-INF) returns 1
+	{ -1.0, KPosInfTReal64, KErrNone, 1.0 },					// 8
+	{ -1.0, KNegInfTReal64, KErrNone, 1.0 },					// 9
+
+	// pow(+1, y) returns 1 for any y, even a NaN
+	{ 1.0, 1.0, KErrNone, 1.0 },								// 10
+	{ 1.0, 10.0, KErrNone, 1.0 },								// 11
+	{ 1.0, -1.0, KErrNone, 1.0 },								// 12
+	{ 1.0, -10.0, KErrNone, 1.0 },								// 13
+	{ 1.0, 0.5, KErrNone, 1.0 },								// 14
+	{ 1.0, -0.5, KErrNone, 1.0 },								// 15
+	{ 1.0, KPosInfTReal64, KErrNone, 1.0 },						// 16
+	{ 1.0, KNegInfTReal64, KErrNone, 1.0 },						// 17
+	{ 1.0, KNaNTReal64, KErrNone, 1.0 },						// 18
+
+	// pow(x, +/-0) returns 1 for any x, even a NaN
+	{  1.0, KPosZeroTReal64, KErrNone, 1.0 },					// 19
+	{  1.0, KNegZeroTReal64, KErrNone, 1.0 },					// 20
+	{  2.0, KPosZeroTReal64, KErrNone, 1.0 },					// 21
+	{  2.0, KNegZeroTReal64, KErrNone, 1.0 },					// 22
+	{  0.5, KPosZeroTReal64, KErrNone, 1.0 },					// 23
+	{  0.5, KNegZeroTReal64, KErrNone, 1.0 },					// 24
+	{ -1.0, KPosZeroTReal64, KErrNone, 1.0 },					// 25
+	{ -1.0, KNegZeroTReal64, KErrNone, 1.0 },					// 26
+	{ -2.0, KPosZeroTReal64, KErrNone, 1.0 },					// 27
+	{ -2.0, KNegZeroTReal64, KErrNone, 1.0 },					// 28
+	{ -0.5, KPosZeroTReal64, KErrNone, 1.0 },					// 29
+	{ -0.5, KNegZeroTReal64, KErrNone, 1.0 },					// 30
+	{ KPosZeroTReal64, KPosZeroTReal64, KErrNone, 1.0 },		// 31
+	{ KPosZeroTReal64, KNegZeroTReal64, KErrNone, 1.0 },		// 32
+	{ KNegZeroTReal64, KPosZeroTReal64, KErrNone, 1.0 },		// 33
+	{ KNegZeroTReal64, KNegZeroTReal64, KErrNone, 1.0 },		// 34
+	{ KPosInfTReal64, KPosZeroTReal64, KErrNone, 1.0 },			// 35
+	{ KPosInfTReal64, KNegZeroTReal64, KErrNone, 1.0 },			// 36
+	{ KNegInfTReal64, KPosZeroTReal64, KErrNone, 1.0 },			// 37
+	{ KNegInfTReal64, KNegZeroTReal64, KErrNone, 1.0 },			// 38
+	{ KNaNTReal64, KPosZeroTReal64, KErrNone, 1.0 },			// 39
+	{ KNaNTReal64, KNegZeroTReal64, KErrNone, 1.0 },			// 40
+
+	// pow(x, y) returns a NaN and raises the ''invalid'' floating-point
+	// exception for finite x < 0 and finite non-integer y
+	{ -1.0, 1.5, KErrArgument, KNaNTReal64 },					// 41
+
+	// pow(x, -INF) returns +INF for |x| < 1
+	{ 0.5, KNegInfTReal64, KErrOverflow, KPosInfTReal64 },		// 42
+	{ -0.5, KNegInfTReal64, KErrOverflow, KPosInfTReal64 },		// 43
+
+	// pow(x, -INF) returns +0 for |x| > 1
+	{ 2, KNegInfTReal64, KErrNone, KPosZeroTReal64 },			// 44
+	{ -2, KNegInfTReal64, KErrNone, KPosZeroTReal64 },			// 45
+	{ 4.5, KNegInfTReal64, KErrNone, KPosZeroTReal64 },			// 46
+	{ -4.5, KNegInfTReal64, KErrNone, KPosZeroTReal64 },		// 47
+
+	// pow(x, +INF) returns +0 for |x| < 1
+	{ .5, KPosInfTReal64, KErrNone, KPosZeroTReal64 },			// 48
+	{ -.5, KPosInfTReal64, KErrNone, KPosZeroTReal64 },			// 49
+
+	// pow(x, +INF) returns +INF for |x| > 1
+	{ 2, KPosInfTReal64, KErrOverflow, KPosInfTReal64 },		// 50
+	{ -2, KPosInfTReal64, KErrOverflow, KPosInfTReal64 },		// 51
+	{ 4.5, KPosInfTReal64, KErrOverflow, KPosInfTReal64 },		// 52
+	{ -4.5, KPosInfTReal64, KErrOverflow, KPosInfTReal64 },		// 53
+
+	// pow(-INF, y) returns -0 for y an odd integer < 0
+	{ KNegInfTReal64, -1, KErrNone, KNegZeroTReal64 },			// 54
+	{ KNegInfTReal64, -5, KErrNone, KNegZeroTReal64 },			// 55
+
+	// pow(-INF, y) returns +0 for y < 0 and not an odd integer
+	{ KNegInfTReal64, -2, KErrNone, KPosZeroTReal64 },			// 56
+	{ KNegInfTReal64, -5.5, KErrNone, KPosZeroTReal64 },		// 57
+
+	// pow(-INF, y) returns -INF for y an odd integer > 0
+	{ KNegInfTReal64, 1, KErrOverflow, KNegInfTReal64 },		// 58
+	{ KNegInfTReal64, 5, KErrOverflow, KNegInfTReal64 },		// 59
+
+	// pow(-INF, y) returns +INF for y > 0 and not an odd integer
+	{ KNegInfTReal64, 2, KErrOverflow, KPosInfTReal64 },		// 60
+	{ KNegInfTReal64, 5.5, KErrOverflow, KPosInfTReal64 },		// 61
+
+	// pow(+INF, y) returns +0 for y < 0
+	{ KPosInfTReal64, -1, KErrNone, KPosZeroTReal64 },			// 62
+	{ KPosInfTReal64, -2, KErrNone, KPosZeroTReal64 },			// 63
+	{ KPosInfTReal64, -5, KErrNone, KPosZeroTReal64 },			// 64
+	{ KPosInfTReal64, -5.5, KErrNone, KPosZeroTReal64 },		// 65
+
+	// pow(+INF, y) returns +INF for y > 0
+	{ KPosInfTReal64, 1, KErrOverflow, KPosInfTReal64 },		// 66
+	{ KPosInfTReal64, 2, KErrOverflow, KPosInfTReal64 },		// 67
+	{ KPosInfTReal64, 5, KErrOverflow, KPosInfTReal64 },		// 68
+	{ KPosInfTReal64, 5.5, KErrOverflow, KPosInfTReal64 },		// 69
+	};
+
+struct POW10_TEST
+    {
+    TInt num; // input number
+    TReal res; // expected result
+    };
+
+LOCAL_D POW10_TEST pow10teste[]=
+	{
+	{300,1.0E300},		
+	{-162,1.0E-162},
+	{-300,1.0E-300},
+	{-99,1.0E-99},
+//	};
+
+//LOCAL_D POW10_TEST pow10testa[]=
+//	{
+	{99,1.0E99},
+	{283,1.0E283},
+	{-89,1.0E-89},
+	{-200,1.0E-200},
+	{-43,1.0E-43},
+	{24,1.0E24},
+ 	{-310,K1EMinus310Real64},
+ 	{-323,K1EMinus323Real64}
+	};
+
+typedef struct
+    {
+    TReal num; // input number
+    TReal res; // expected result
+    } TESTSINE;
+
+#pragma warning ( disable : 4204 ) // non-constant aggregate initializer
+LOCAL_D TESTSINE testsin[]=
+    {
+	{0.5,0.4794255386042029},						// These were found using S3a
+	{1.2,0.9320390859672263},
+	{1.6,0.9995736030415051},
+	{28.6,-0.3199399618841981},
+	{-18.3,0.5223085896267315},
+	{KPi/4,0.7071067811865474},
+	{3*KPi/4,0.7071067811865474},
+	{5*KPi/4,-0.7071067811865474},
+	{-KPi/4,-0.7071067811865474},
+	{KPi/3,0.8660254037844387},
+	{-KPi/3,-0.8660254037844387},
+	{KPi/6,0.5},
+	{-KPi/6,-0.5},
+	{150*KDegToRad,0.5},
+	{210*KDegToRad,-0.5},
+//	{KPi+1.0E-15,-7.657143961860984E-16},	// loss of significance will limit accuracy here
+//	2*(KPi+1.0E-15),1.5314287923721969e-15}
+    };
+    
+typedef struct
+    {
+    TReal num; // input number
+    TReal res; // expected result
+    } TESTCOSINE;
+
+LOCAL_D TESTCOSINE testcos[]=
+	{
+	{0.5,0.8775825618903727},			// These were found using S3a
+	{1.2,0.3623577544766734},
+	{1.6,-0.0291995223012888},
+	{28.6,-0.9474378189567576},
+	{-18.3,0.8527565521308730},
+	{KPi/4,0.7071067811865474},
+	{3*KPi/4,-0.7071067811865474},
+	{5*KPi/4,-0.7071067811865474},
+	{-KPi/4,0.7071067811865474},
+	{KPi/6,0.8660254037844387},
+	{5*KPi/6,-0.8660254037844387},
+	{KPi/3,0.5},
+	{4*KPi/3,-0.5},
+	{120*KDegToRad,-0.5},
+	{300*KDegToRad,0.5},
+	{KPi+1.0E-15,-1.0},
+	{2*(KPi+1.0E-15),1.0}
+	};
+
+typedef struct
+    {
+    TReal angle; // angle for which the tangent is to be found
+    TReal result; // result
+    } TAN;
+
+LOCAL_D TAN testtan[]=
+    {
+	{KPi/4,1.0},
+	{-KPi/4,-1.0},
+	{45*KDegToRad,1.0},
+	{KPi/3,1.732050807568877},					// Added by AnnW - Calculated on S3a
+	{2*KPi/3,-1.732050807568878},				//
+	{KPi/6,0.5773502691896257},					//
+	{-KPi/6,-0.5773502691896257},				//
+	{89*KDegToRad,57.28996163075913},			// these two should be the same!
+	{91*KDegToRad,-57.28996163075955},			//
+    {4E-123,4E-123},								
+    {-4E-123,-4E-123},	
+    };
+    
+typedef struct
+    {
+    TReal num; // input number
+    TReal res; // expected result
+    } TESTASC;
+
+LOCAL_D TESTASC testas[]=
+    {
+    {.75,.848062078981},
+    {.82,.961411018764},
+    {.87,1.055202320549},
+    {.89,1.097345169523},
+    {.90,1.119769514999},
+    {.92,1.168080485214},
+    {.94,1.222630305522},
+    {.96,1.287002217587},
+    {.99,1.429256853470},
+    {1.0,1.570796326795},
+	{0.0,0},
+	{-1.0, -90.0*KDegToRad},
+	{0.5,30.0*KDegToRad}
+    };
+
+typedef struct
+    {
+    TReal num1; // Divisor
+    TReal num2; // Divand
+    TReal res; // expected result
+    } TESTATAN2;
+
+LOCAL_D TESTATAN2 testat2[]=
+    {
+    {5E-49,7E306,0.0}, // underflow, zero returned
+    {5E49,7E-306,KPiBy2}, // overflow, pi/2 returned
+    {0.45,0.5,0.732815101787},
+    {0.12,0.3,0.380506377112},
+    {0.3,0.0,KPiBy2}, // overflow, pi/2 returned
+    {-0.3,0.0,-KPiBy2}, // overflow, -pi/2 returned
+    {0.0,0.3,0.0},
+    };
+#pragma warning ( default : 4204 )
+
+typedef struct
+    {
+    TReal num; // input number
+    TReal res; // expected result
+    } INT_TEST;
+
+LOCAL_D INT_TEST testint1[]=
+    {
+    {1.0,1.0},
+    {1.47934,1.0},
+    {-72.86345,-72.0},
+    {-734.9999,-734.0},
+    {4855.9974,4855.0},
+    {232478.35,232478.0},
+    {0.029345,0.0},
+    {0.9437,0.0},
+    {-0.2634,0.0},
+    {-0.98976,0.0},
+    {32769.36946,32769.0},
+    {-32774.997937,-32774.0},
+    {8738465.38749,8738465.0},
+    {-2348645.34965,-2348645.0},
+    {2147483655.7565,2147483655.0},
+    {-2147483657.89453,-2147483657.0},
+    {2374843546.34E2,2374843546.34E2},
+    {34780656.37643E12,34780656.37643E12},
+    {-2374843546.34E2,-2374843546.34E2},
+    {-34780656.37643E12,-34780656.37643E12},
+    {468650.3874E47,468650.3874E47},
+    {-4965.5987636E34,-4965.5987636E34},
+    };
+
+typedef struct
+    {
+    TReal num; // input number
+    TInt16 res; // expected result
+    } INTI_TEST;
+
+LOCAL_D INTI_TEST testint2[]=
+    {
+    {1.0,1},
+    {1.47934,1},
+    {-72.86345,-72},
+    {-734.9999,-734},
+    {4855.9974,4855},
+    {0.029345,0},
+    {0.9437,0},
+    {-0.2634,0},
+    {-0.98976,0},
+    {3234.56,3234},
+    {4698.435,4698},
+    {-32767.47658,-32767},
+    {32767.9830857,32767},
+    {-32768.47658,-32767-1}
+    };
+
+typedef struct
+    {
+    TReal num; // input number
+    TInt32 res; // expected result
+    } INTL_TEST;
+
+LOCAL_D INTL_TEST testint3[]=
+    {
+    {1.0,1l},
+    {1.47934,1l},
+    {-72.86345,-72l},
+    {-734.9999,-734l},
+    {4855.9974,4855l},
+    {0.029345,0l},
+    {0.9437,0l},
+    {-0.2634,0l},
+    {-0.98976,0l},
+    {3234.56,3234l},
+    {4698.435,4698l},
+    {-32767.47658,-32767l},
+    {32767.9830857,32767l},
+    {32769.36946,32769l},
+    {-32774.997937,-32774l},
+    {64835903.74605,64835903l},
+    {-46652024.393,-46652024l},
+    {2147483647.34576,2147483647l},
+    {-2147483647.9501,-2147483647l},
+    {-2147483648.00,0x80000000l}, 
+    {-2147483648.6843,0x80000000l}
+    };
+
+typedef struct
+    {
+    TReal num; // input number
+    TReal res; // expected result
+    } FRAC_TEST;
+
+LOCAL_D FRAC_TEST testfrac[]=
+    {
+	{0.0,0.0},
+	{KNegZeroTReal64,0.0},
+    {1.0,0.0},
+    {1.47934,.47934},
+    {-72.86345,-.86345},
+    {-734.9999,-.9999},
+    {4855.9974,.9974},
+    {232478.35,.35},
+    {0.029345,.029345},
+    {0.9437,0.9437},
+    {-0.2634,-.2634},
+    {-0.98976,-.98976},
+    {32769.36946,.36946},
+    {-32774.997937,-0.997937},
+    {8738465.38749,0.38749},
+    {-2348645.34965,-0.34965},
+    {2147483655.7565,0.7565},
+    {-2147483657.89453,-.89453},
+    {2374843546.34E2,0.0},
+    {34780656.37643E12,0.0},
+    {-2374843546.34E2,0.0},
+    {-34780656.37643E12,0.0},
+    {468650.3874E47,0.0},
+    {-4965.5987636E34,0.0}
+    };
+
+typedef struct
+    {
+    TReal num; // input number
+    TReal mod; // modulo
+    TReal res; // expected result
+    } MOD_TEST;
+
+LOCAL_D MOD_TEST testmod[]=
+    {
+    {4.0,2.0,0.0},
+    {3.0,2.0,1.0},
+    {56.847,2.3,1.647},
+    {-65.6478,.65,-.6478},
+    {-6858.78432,-87.5323,-31.26492},
+    {7665.140215,-34.98,4.520215},
+    {.4645,1.0,0.4645},
+    {-.246,1.0,-.246},
+	{1.0,KPosInfTReal64,1.0},
+	{1.0,KNegInfTReal64,1.0},
+	{1.0E17,8.0,0.0},
+	//
+	{1.0,3.0,1.0},				//0
+	{2.0,3.0,2.0},
+	{4.0,3.0,1.0},
+	{8.0,3.0,2.0},
+	{16.0,3.0,1.0},
+	{32.0,3.0,2.0},
+	{64.0,3.0,1.0},
+	{128.0,3.0,2.0},
+	{256.0,3.0,1.0},
+	{512.0,3.0,2.0},
+	{1024.0,3.0,1.0},			//10
+	{2048.0,3.0,2.0},
+	{4096.0,3.0,1.0},
+	{8192.0,3.0,2.0},
+	{16384.0,3.0,1.0},
+	{32768.0,3.0,2.0},
+	{65536.0,3.0,1.0},
+	{131072.0,3.0,2.0},
+	{262144.0,3.0,1.0},
+	{524288.0,3.0,2.0},
+	{1048576.0,3.0,1.0},		//20
+	{2097152.0,3.0,2.0},
+	{4194304.0,3.0,1.0},
+	{8388608.0,3.0,2.0},
+	{16777216.0,3.0,1.0},
+	{33554432.0,3.0,2.0},
+	{67108864.0,3.0,1.0},
+	{134217728.0,3.0,2.0},
+	{268435456.0,3.0,1.0},
+	{536870912.0,3.0,2.0},
+	{1073741824.0,3.0,1.0},		//30
+	{2147483648.0,3.0,2.0},
+	{4294967296.0,3.0,1.0},
+	{8589934592.0,3.0,2.0},
+	{17179869184.0,3.0,1.0},
+	{34359738368.0,3.0,2.0},
+	{68719476736.0,3.0,1.0},
+	{137438953472.0,3.0,2.0},
+	{274877906944.0,3.0,1.0},
+	{549755813888.0,3.0,2.0},
+	{1099511627776.0,3.0,1.0},	//40
+	{2199023255552.0,3.0,2.0},
+	{4398046511104.0,3.0,1.0},
+	{8796093022208.0,3.0,2.0},
+	{17592186044416.0,3.0,1.0},
+	{35184372088832.0,3.0,2.0},
+	{70368744177664.0,3.0,1.0},
+	{140737488355328.0,3.0,2.0},
+	{281474976710656.0,3.0,1.0},
+	{562949953421312.0,3.0,2.0},
+	{1125899906842624.0,3.0,1.0},	//50
+	{2251799813685248.0,3.0,2.0},
+	{4503599627370496.0,3.0,1.0},
+	{9007199254740992.0,3.0,2.0},
+	{18014398509481984.0,3.0,1.0},
+	{6.626176E-34,299792458.0,6.626176E-34},
+	{-1.6022E-19,6.022045E23,-1.6022E-19},
+	{0.0,2.71828182845904524,0.0}
+    };
+
+// expected result is unused in following - will be zero in all cases
+LOCAL_D MOD_TEST testmod2[]=
+    {
+	{1.0E17,7.9,0.0},
+	{1.0E100,4.0,0.0},
+	{KMaxTReal64,5.0,0.0},
+	{-KMaxTReal64,5.0,0.0},
+	{0.125,1.0E-17,0.0},
+	{36028797019963968.0,2.0,0.0},   // 2**55,2**1
+	//
+	{36028797019963968.0,3.0,0.0},	//55
+	{72057594039927936.0,3.0,0.0},
+	{144115188079855872.0,3.0,0.0},
+	{288230376159711744.0,3.0,0.0},
+	};
+
+TInt testApprox(TReal aFound,TReal aExpect,TReal aTol)
+//
+// Tests relative error, i.e. whether (aFound-aExpect)/aFound <= aTol
+//
+	{
+
+	TRealX diff,check,l,r,t;
+	l.Set(aFound);
+	r.Set(aExpect);
+	t.Set(aTol);
+	if (l.Mult(check,t)==KErrUnderflow)
+		{
+		l*=TRealX(1.0E20);
+		r*=TRealX(1.0E20);
+		}
+	diff=l-r;
+	if (diff.IsZero())
+		return ETrue;
+	if (!l.IsZero())
+		diff.DivEq(l);
+	if (Abs(TReal(diff))<=aTol)
+		return ETrue;
+	return EFalse;
+	}
+
+LOCAL_C void randrng(TReal& pret,TReal& llim,TReal& ulim)
+/*
+Returns a random number in the range [llim,ulim]
+*/
+    {
+
+    pret=Math::FRand(rseed);
+    pret*=ulim-llim;
+    pret+=llim;
+    }
+
+LOCAL_C TReal taylor(TReal x,TInt k)
+/*
+Evaluate the Taylor series approximation to arc sine up to terms of order k
+*/
+    //TReal x; // argument
+    //TInt k; // Highest order term
+    {
+
+    TInt i,j;
+    TReal den,num,res,term,di;
+
+    den=1;
+    num=1;
+    term=0;
+    for (i=1;i<=k;i+=2)
+		{
+		for (j=2;j<i;j+=2)
+			{
+			num*=j;
+			if (j<(i-1))
+			den*=j+1;
+			}
+		di=(TReal)i;
+		Math::Pow(res,x,di);
+		term+=(res*den)/(i*num);
+		num=1;
+		den=1;
+		}
+    return(term);
+    }
+
+LOCAL_C TReal tayatan(TReal val)
+/* 
+Finds the taylor series approximation to the arc tangent function 
+*/
+    //TReal val;
+    {
+
+    TInt i;
+    TReal sgn,s,d,di,term,res;
+    
+    term=0.0;
+    s=(-1.0);
+    for (i=0;i<8;i++)
+		{
+		di=(TReal)i;
+		d=2.0*di;
+		Math::Pow(sgn,s,di);
+		Math::Pow(res,val,d);
+		term+=(sgn*res)/(2.0*di+1.0);
+		}
+    return(val*term);
+    }
+
+LOCAL_C void AssortedTests()
+//
+// Tests the methods with just a handful of values each 
+// All tests as accurate as possible - if exact answer given, tests for equality
+//
+	{
+
+	TReal trg,src;
+
+	// ASin
+	test.Start(_L("Math::ASin()"));
+	test(Math::ASin(trg,0.0)==KErrNone);
+	test(trg==0.0);
+
+	test(Math::ASin(trg,1.0)==KErrNone);
+	test(testApprox(trg,1.5707963267949,5.0E-15));
+
+	// ACos
+	test.Next(_L("Math::ACos()"));
+	test(Math::ACos(trg,0)==KErrNone);
+	test(testApprox(trg,1.5707963267949,5.0E-15));
+
+	test(Math::ACos(trg,1.0)==KErrNone);
+	test(trg==0.0);
+
+	// ATan
+	test.Next(_L("Math::ATan()"));
+	test(Math::ATan(trg,0.0)==KErrNone);
+	test(trg==0.0);
+
+	test(Math::ATan(trg,1.0)==KErrNone);
+	test(testApprox(trg,0.78539816339745,5.0E-15));	
+
+	test(Math::Tan(trg,KPi/4)==KErrNone);
+	test(testApprox(trg,1.0,1.0E-15));
+	test(Math::ATan(trg,trg)==KErrNone);
+	test(testApprox(trg,KPi/4,1e-15));
+
+	// Sqrt
+	test.Next(_L("Math::Sqrt()"));
+	test(Math::Sqrt(trg,0.0)==KErrNone);
+	test(trg==0.0);
+	
+	test(Math::Sqrt(trg,-1.0)==KErrArgument);
+
+	test(Math::Sqrt(trg,100.0)==KErrNone);
+	test(testApprox(trg,10.0,1.0E-15));	
+
+	test(Math::Sqrt(trg,56.25)==KErrNone);
+	test(trg==7.5);
+
+	// Pow10
+	test.Next(_L("Math::Pow10()"));
+	test(Math::Pow10(trg,-2)==KErrNone);
+	test(trg==0.01);	
+
+	test(Math::Pow10(trg,-1)==KErrNone);
+	test(trg==0.1);
+
+	test(Math::Pow10(trg,0)==KErrNone);
+	test(trg==1.0);
+
+	test(Math::Pow10(trg,1)==KErrNone);
+	test(trg==10.0);
+
+	test(Math::Pow10(trg,2)==KErrNone);
+	test(trg==100.0);
+
+	// Ln
+	test.Next(_L("Math::Ln()"));
+	test(Math::Ln(trg,0.0)==KErrOverflow);
+	
+	test(Math::Ln(trg,1.0)==KErrNone);
+	test(trg==0.0);
+
+	test(Math::Ln(trg,2)==KErrNone);
+	test(testApprox(trg,0.69314718055995,1.0E-14));	
+
+	// Log
+	test.Next(_L("Math::Log()"));
+	test(Math::Log(trg,0)==KErrOverflow);
+
+	test(Math::Log(trg,1)==KErrNone);
+	test(trg==0);
+
+	test(Math::Log(trg,10)==KErrNone);
+	test(trg==1);
+
+	test(Math::Log(trg,100000)==KErrNone);
+	test(trg==5);
+
+	// Sin
+	test.Next(_L("Math::Sin()"));
+	test(Math::Sin(trg,0)==KErrNone);
+	test(trg==0);   
+
+	test(Math::Sin(trg,1)==KErrNone);
+	test(testApprox(trg,0.84147098480790,5.0E-15));	
+
+	test(Math::Sin(trg,KPi)==KErrNone);
+//    test(trg==0.0);
+	test(Abs(trg)<1e-15);
+
+	test(Math::Sin(trg,KPiBy2)==KErrNone);
+	test(testApprox(trg,1.0,1.0E-15));
+
+	test(Math::Sin(trg,10.0*KPi)==KErrNone);
+//   test(trg==0.0);
+	test(Abs(trg)<2e-15);
+
+	test(Math::Sin(trg,3)==KErrNone);
+	test(trg==0.1411200080598672);
+
+	test(Math::Sin(trg,4)==KErrNone);
+	test(trg==-0.7568024953079282);
+
+	test(Math::Sin(trg,3.1415)==KErrNone);
+	test(testApprox(trg,9.26535896605E-5,2.0E-13));	
+
+	test(Math::Sin(trg,3.1416)==KErrNone);
+	test(testApprox(trg,-7.3464102066435914E-6,1.0E-11));	
+
+	test(Math::Sin(trg,(10.0*KPi)+0.001)==KErrNone);
+	test(testApprox(trg,0.000999999833333,4.0E-13));	
+
+	// Cos
+	test.Next(_L("Math::Cos()"));
+	test(Math::Cos(trg,0.0)==KErrNone);
+	test(testApprox(trg,1.0,1.0E-15));		
+
+	test(Math::Cos(trg,1)==KErrNone);
+	test(testApprox(trg,0.54030230586814,1.0E-15));		
+
+    test(Math::Cos(trg,KPiBy2)==KErrNone);
+//    test(trg==0.0);
+	test(Abs(trg)<1e-15);
+
+	test(Math::Cos(trg,KPi)==KErrNone);
+	test(trg==-1.0);
+
+    test(Math::Cos(trg,KPiBy2+KPi)==KErrNone);
+//    test(trg==0.0);
+	test(Abs(trg)<1e-15);
+	
+	test(Math::Cos(trg,89.99999*KDegToRad)==KErrNone);
+	test(testApprox(trg,1.745329252E-07,5.0E-10));		
+
+	test(Math::Cos(trg,90.00001*KDegToRad)==KErrNone);
+	test(testApprox(trg,-1.7453292516217e-007,5.0E-10));			
+
+	// Tan
+	test.Next(_L("Math::Tan()"));
+	test(Math::Tan(trg,0.0)==KErrNone);
+    test(trg==0.0);   
+
+	test(Math::Tan(trg,1)==KErrNone);
+	test(testApprox(trg,1.5574077246549,2.0E-15));			
+
+	// Pow
+	test.Next(_L("Math::Pow()"));
+	src=10;
+	test(Math::Pow(trg,src,-1.0)==KErrNone);
+	test(testApprox(trg,0.1,1.0E-15));			
+
+	test(Math::Pow(trg,src,0.0)==KErrNone);
+	test(trg==1.0);
+
+	test(Math::Pow(trg,src,2.0)==KErrNone);
+	test(testApprox(trg,100.0,1.0E-15));			
+
+	src=1.0;
+	test(Math::Pow(trg,src,10000000000000000.0)==KErrNone);
+	test(trg==1.0);
+
+	test.End();
+	}       
+
+LOCAL_C void sqrtest1(TReal low,TReal upp)
+/*
+Test the identity sqrt(x*x)=x  on the range low<=x<upp
+*/
+    {
+    
+	TReal x,y,res;
+
+    for (TInt j=0;j<100;j++)
+		{
+		randrng(x,low,upp);
+		y=x*x;
+		test(Math::Sqrt(res,y)==KErrNone);
+		test(testApprox(res,x,1.0E-15));
+		}
+    }
+
+LOCAL_C void sqrtest2()
+/*
+Tests specific numbers
+*/
+    {
+    
+	TReal root;
+
+	// test errors
+	test(Math::Sqrt(root,KNaNTReal64)==KErrArgument);
+	test(Math::IsNaN(root));
+	test(Math::Sqrt(root,-1)==KErrArgument);
+	test(Math::IsNaN(root));
+	test(Math::Sqrt(root,KNegInfTReal64)==KErrArgument);
+	test(Math::IsNaN(root));
+	test(Math::Sqrt(root,KPosInfTReal64)==KErrOverflow);
+	test(root==KPosInfTReal64);
+
+    TInt i=sizeof(testsqrt)/sizeof(SQRT_TEST);
+    for (TInt j=0;j<i;j++) 
+		{
+		test(Math::Sqrt(root,testsqrt[j].num)==KErrNone);
+		test(testApprox(root,testsqrt[j].res,1.0E-15));
+		}
+
+	// a couple of denormal tests
+	test(Math::Sqrt(root,4E-322)==KErrNone);
+	test(testApprox(root,2E-161,1.0E-3));
+	test(Math::Sqrt(root,1.6E-309)==KErrNone);
+	test(testApprox(root,4E-155,1.0E-15));	
+    }
+
+LOCAL_C void logtest()
+/*
+Test numbers in the range sqrt(.1) to .9, using the identity 
+log(x)=log(11x/10)-log(1.1) 
+*/
+    {
+
+    TReal res,x;
+    TReal cnstlog,cnstlogx;
+
+    TReal low=.316227766017;
+    TReal upp=0.9;
+    TReal cnst=11.0/10.0;
+    test(Math::Log(cnstlog,cnst)==KErrNone);
+    for (TInt j=0;j<10;j++)
+		{
+		randrng(x,low,upp);
+		test(Math::Log(res,x)==KErrNone); 
+		TReal num=cnst*x;
+		test(Math::Log(cnstlogx,num)==KErrNone);
+		test(testApprox(res,(cnstlogx-cnstlog),1.0E-15));
+		}
+    }
+
+LOCAL_C void lntest1()
+/* 
+Test selected numbers 
+*/
+    {
+ 
+    TReal res;
+
+	// test errors
+//	test(Math::Ln(res,KNegZeroTReal64)==KErrArgument);
+	test(Math::Ln(res,KNegZeroTReal64)==KErrOverflow);
+	test(Math::IsInfinite(res));
+	test(Math::Ln(res,-34)==KErrArgument);
+	test(Math::IsNaN(res));
+	test(Math::Ln(res,KNaNTReal64)==KErrArgument);
+	test(Math::IsNaN(res));
+	test(Math::Ln(res,KNegInfTReal64)==KErrArgument);
+	test(Math::IsNaN(res));
+	test(Math::Ln(res,KPosInfTReal64)==KErrOverflow);
+	test(res==KPosInfTReal64);
+	test(Math::Ln(res,0.0)==KErrOverflow);
+	test(res==KNegInfTReal64);
+	test(Math::Ln(res,2.71828182845904524)==KErrNone);
+	test(testApprox(res,1.0,1e-15));
+	test(Math::Ln(res,7.389056098930650227)==KErrNone);
+	test(testApprox(res,2.0,1e-15));
+
+    TInt i=sizeof(testln)/sizeof(TESTLN);
+    for (TInt j=0;j<i;j++) 
+		{
+		test(Math::Ln(res,testln[j].num)==KErrNone);
+		test(testApprox(res,testln[j].res,1.0E-14));
+		}
+
+	// test some denormals
+ 	test(Math::Log(res,K1EMinus322Real64)==KErrNone);
+	test(testApprox(res,-322.0,2.0E-5));
+ 	test(Math::Log(res,K1EMinus313Real64)==KErrNone);
+	test(testApprox(res,-313.0,1.0E-13));	
+    }
+
+LOCAL_C void lntest2()
+/* 
+Test numbers near to one against the Taylor series approximation 
+*/
+    {
+    
+	TReal x,res;
+    
+    TReal low=.999999989463;
+    TReal upp=1.00000001054;
+    for (TInt k=0;k<10;k++)
+		{
+		randrng(x,low,upp);
+		TRealX tot=0.0;
+		TRealX xx(x-1);
+		TInt sign=-1;
+		for (TInt i=4;i>0;i--)
+			{
+			tot+=TRealX(sign)/TRealX(i);
+			tot*=xx;
+			sign=-sign;
+			}
+		TReal tot2=(TReal)tot;
+		test(Math::Ln(res,x)==KErrNone);
+		test(testApprox(res,tot2,1.0E-15));
+		}
+    }
+
+LOCAL_C void lntest3()
+/* 
+Test numbers in the range sqrt(.5) to 15/16, using the identity 
+ln(x)=ln(17x/16)-ln(17/16) 
+*/
+    {
+
+    TReal x,cnstln,cnstlnx,res;
+
+	TReal low=KSqhf;
+    TReal upp=15.0/16.0;
+    TReal cnst=17.0/16.0;
+    test(Math::Ln(cnstln,cnst)==KErrNone);
+	for (TInt j=0;j<10;j++)
+		{
+		randrng(x,low,upp);
+		test(Math::Ln(res,x)==KErrNone);
+		TReal num=cnst*x;
+		test(Math::Ln(cnstlnx,num)==KErrNone);
+		test(testApprox(res,(cnstlnx-cnstln),1.0E-15));
+		}
+    }
+
+LOCAL_C void lntest4()
+/* 
+Test numbers in the range 16 to 240 using the identity ln(x*x)=2ln(x) 
+*/
+    {
+
+    TReal cnstlnx,res;
+
+    TReal low=16.0;
+    TReal upp=240.0;
+    TReal x=16.0;
+	test(Math::Ln(res,-1)==KErrArgument);
+    for (TInt j=0;j<10;j++)
+		{
+		randrng(x,low,upp);
+		TReal num=x*x;
+		test(Math::Ln(res,num)==KErrNone);
+		test(Math::Ln(cnstlnx,x)==KErrNone);
+		test(testApprox(res,2*cnstlnx,1.0E-15));
+		}
+    }
+
+LOCAL_C void exptest1()
+/* 
+To test exponent for specific values 
+*/
+    {
+
+    TReal res;
+
+	// test errors
+	test(Math::Exp(res,KNaNTReal64)==KErrArgument);
+	test(Math::IsNaN(res));
+	test(Math::Exp(res,KPosInfTReal64)==KErrOverflow);
+	test(res==KPosInfTReal64);
+	test(Math::Exp(res,709.8)==KErrOverflow);
+	test(res==KPosInfTReal64);
+	test(Math::Exp(res,KNegInfTReal64)==KErrUnderflow);
+	test(Math::IsZero(res));
+	test(Math::Exp(res,-745.2)==KErrUnderflow);
+	test(Math::IsZero(res));
+
+    TInt i=sizeof(testexp)/sizeof(EXP);
+    for (TInt j=0;j<i;j++)
+		{
+		test(Math::Exp(res,testexp[j].val)==KErrNone);
+		test(testApprox(res,testexp[j].result,0));	// NB only tests values with results of 1
+		}
+
+	// test some denormals
+	test(Math::Exp(res,5E-324)==KErrNone);
+	test(testApprox(res,1.0,0));
+	test(Math::Exp(res,-6E-318)==KErrNone);
+	test(testApprox(res,1.0,0));	
+	}
+
+LOCAL_C void exptest2(TReal cnst,TReal ll,TReal ul)
+/*
+Test the identity exp(x-cnst)=exp(x)*exp(-cnst) for x in the range [ul,ll]
+*/
+    //TReal cnst; // constant used in the identity
+    //TReal ll; // Lower limit of the range
+    //TReal ul; // Upper limit of the range
+    {
+
+    TReal cnstexp,cnstexpx,x,res;
+
+    test(Math::Exp(cnstexp,cnst)==KErrNone);
+    for (TInt j=0;j<10;j++)
+		{
+		randrng(x,ll,ul);
+		test(Math::Exp(res,x)==KErrNone);
+		TReal num=x+cnst;
+		test(Math::Exp(cnstexpx,num)==KErrNone);
+		test(testApprox(cnstexpx,(res*cnstexp),1.0E-15));
+		}
+    }
+
+LOCAL_C void exptest3()
+/* 
+Test for systematic error 
+*/
+    {
+    
+	TReal step,ul,v;
+
+    TReal x=1.0123;
+    TReal y=x/2;
+    test(Math::Exp(v,y)==KErrNone);
+    test(Math::Exp(step,x)==KErrNone);
+    test(Math::Sqrt(ul,step)==KErrNone);
+	test(testApprox(ul,v,1.0E-15));
+    }
+
+LOCAL_C void powtest1()
+/*
+Test selected numbers
+*/
+    {
+    
+	TReal res;
+	
+	// test errors
+	test(Math::Pow(res,10,-1E8)==KErrUnderflow);
+	test(res==0.0);
+	test(Math::Pow(res,10,-KMaxTReal64)==KErrUnderflow);
+	test(res==0.0);
+	test(Math::Pow(res,10,-5.5E307)==KErrUnderflow);
+	test(res==0.0);
+	test(Math::Pow(res,10,-5.4E307)==KErrUnderflow);
+	test(res==0.0);
+	test(Math::Pow(res,10,-1E300)==KErrUnderflow);
+	test(res==0.0);
+	test(Math::Pow(res,10,-1E10)==KErrUnderflow);
+	test(res==0.0);
+	
+	test(Math::Pow(res,10,5.5E307)==KErrOverflow);
+	test(res==KPosInfTReal64);
+	test(Math::Pow(res,10,5.4E307)==KErrOverflow);
+	test(res==KPosInfTReal64);
+	test(Math::Pow(res,10,1E308)==KErrOverflow);
+	test(res==KPosInfTReal64);
+	test(Math::Pow(res,10,1.7E308)==KErrOverflow);
+	test(res==KPosInfTReal64);
+	test(Math::Pow(res,10,KMaxTReal64)==KErrOverflow);
+	test(res==KPosInfTReal64);
+	
+	test(Math::Pow(res,1.0,KNaNTReal64)==KErrNone);
+	test(res==1.0);
+	test(Math::Pow(res,KNaNTReal64,1.0)==KErrArgument);
+	test(Math::IsNaN(res));
+	test(Math::Pow(res,0.0,KNaNTReal64)==KErrArgument);
+	test(Math::IsNaN(res));
+	test(Math::Pow(res,KNaNTReal64,0.0)==KErrNone);
+	test(res==1.0);
+	test(Math::Pow(res,KNaNTReal64,KNaNTReal64)==KErrArgument);
+	test(Math::IsNaN(res));
+	test(Math::Pow(res,KPosInfTReal64,KPosInfTReal64)==KErrOverflow);
+	test(res==KPosInfTReal64);
+//	test(Math::Pow(res,KNegInfTReal64,KPosInfTReal64)==KErrOverflow);
+//	test(res==KPosInfTReal64);
+	test(Math::Pow(res,KNegInfTReal64,KPosInfTReal64)==KErrOverflow);
+	test(res==KPosInfTReal64);
+	test(Math::Pow(res,2.0,KPosInfTReal64)==KErrOverflow);
+	test(res==KPosInfTReal64);
+//	test(Math::Pow(res,-2.0,KPosInfTReal64)==KErrOverflow);
+//	test(res==KPosInfTReal64);
+	test(Math::Pow(res,-2.0,KPosInfTReal64)==KErrOverflow);
+	test(res==KPosInfTReal64);
+	test(Math::Pow(res,0.5,KNegInfTReal64)==KErrOverflow);
+	test(res==KPosInfTReal64);
+//	test(Math::Pow(res,-0.5,KNegInfTReal64)==KErrOverflow);
+//	test(res==KPosInfTReal64);
+	test(Math::Pow(res,-0.5,KNegInfTReal64)==KErrOverflow);
+	test(res==KPosInfTReal64);
+//	test(Math::Pow(res,1.0,KPosInfTReal64)==KErrArgument);
+//	test(Math::IsNaN(res));
+	test(Math::Pow(res,1.0,KPosInfTReal64)==KErrNone);
+	test(res==1.0);
+	test(Math::Pow(res,-1.0,KPosInfTReal64)==KErrNone);
+	test(res==1.0);
+//	test(Math::Pow(res,1.0,KNegInfTReal64)==KErrArgument);
+//	test(Math::IsNaN(res));
+	test(Math::Pow(res,1.0,KNegInfTReal64)==KErrNone);
+	test(res==1.0);
+	test(Math::Pow(res,-1.0,KNegInfTReal64)==KErrNone);
+	test(res==1.0);
+	test(Math::Pow(res,0.0,0.0)==KErrNone);
+	test(res==1.0);
+	test(Math::Pow(res,KNegZeroTReal64,KNegZeroTReal64)==KErrNone);
+	test(res==1.0);
+	test(Math::Pow(res,0.0,KNegZeroTReal64)==KErrNone);
+	test(res==1.0);
+	test(Math::Pow(res,KNegZeroTReal64,0.0)==KErrNone);
+	test(res==1.0);
+	test(Math::Pow(res,KPosInfTReal64,2.0)==KErrOverflow);
+	test(res==KPosInfTReal64);
+	test(Math::Pow(res,0.0,-2.0)==KErrOverflow);
+	test(res==KPosInfTReal64);
+	test(Math::Pow(res,-2.0,-2.6)==KErrArgument);
+	test(Math::IsNaN(res));
+	test(Math::Pow(res,-2.0,4.8)==KErrArgument);
+	test(Math::IsNaN(res));
+	test(Math::Pow(res,KNegZeroTReal64,-5)==KErrOverflow);
+	test(res==KNegInfTReal64);
+	test(Math::Pow(res,KNegZeroTReal64,-6)==KErrOverflow);
+	test(res==KPosInfTReal64);
+	test(Math::Pow(res,30,999999)==KErrOverflow);	// checking bug fixed
+	test(res==KPosInfTReal64);
+	test(Math::Pow(res,200,200)==KErrOverflow);
+	test(res==KPosInfTReal64);
+	test(Math::Pow(res,200,2000)==KErrOverflow);	// checking bug fixed
+	test(res==KPosInfTReal64);
+	test(Math::Pow(res,1000,1000)==KErrOverflow);
+	test(res==KPosInfTReal64);
+	test(Math::Pow(res,1000,100)==KErrNone);
+	test(testApprox(res,1E+300,3.0E-15));
+	test(Math::Pow(res,1000,-1000)==KErrUnderflow);
+	test(Math::IsZero(res));
+	test(Math::Pow(res,1000,-100)==KErrNone);
+	test(testApprox(res,1E-300,4.0E-15));
+	
+	TInt j;
+    TInt i=sizeof(testpow)/sizeof(POWER);
+    for (j=0;j<i;j++)
+		{
+		test(Math::Pow(res,testpow[j].number,testpow[j].power)==KErrNone);
+		test(testApprox(res,testpow[j].result,1.0E-15));
+		}
+
+	// Added by AnnW, October 1996
+	TInt size = sizeof(testpowexact)/sizeof(POWER);
+	for (j=0; j<size; j++)
+		{
+		test(Math::Pow(res,testpowexact[j].number,testpowexact[j].power)==KErrNone);
+		test(res==testpowexact[j].result);
+		}
+
+	// denormals (base only - do not know results for denormal power)
+ 	test(Math::Pow(res,K5EMinus324Real64,1.0)==KErrNone);
+ 	test(res==K5EMinus324Real64);
+ 	test(Math::Pow(res,K5EMinus324Real64,0.0)==KErrNone);
+	test(res==1.0);
+	test(Math::Pow(res,2E-160,2.0)==KErrNone);
+	test(testApprox(res,K4EMinus320Real64,1.0E-4));		
+
+	// This test is to check that reduce() is working properly
+	// This is only a very approximate test due to loss of significance for such nos
+	TReal base,power;
+	for (TReal powerOfTwo=16.0; powerOfTwo<=54.0; powerOfTwo++)
+		{
+		Math::Pow(power,2.0,powerOfTwo);
+		power+=0.7;
+ 		Math::Pow(base,2.0,1/power);
+		test(Math::Pow(res,base,power)==KErrNone);
+		test((2.0-res)<=1.0);
+		}
+    }
+
+LOCAL_C void powtest2(TReal low,TReal upp)
+/*
+Test the identity (x**2)**1.5=x**3  on the range low<=x<upp
+*/
+    //TReal low; // lower limit of range to test
+    //TReal upp; // upper limit of range to test 
+    {
+    
+	TReal res,rres,x;
+
+	for (TInt j=0;j<10;j++)
+		{
+		randrng(x,low,upp);
+		TReal y=2;
+		test(Math::Pow(res,x,y)==KErrNone);
+		TReal xr=res;
+		y=1.5;
+		test(Math::Pow(res,xr,y)==KErrNone);
+		TReal yr=3;
+		test(Math::Pow(rres,x,yr)==KErrNone);    
+		test(testApprox(rres,res,1.0E-14));
+		}
+    }
+
+LOCAL_C void powtest3()
+/* 
+Test the identity x**1=x 
+*/
+    {
+    
+	TReal x,res;
+ 
+    TReal low=.5;
+    TReal upp=1.0;
+    for (TInt j=0;j<10;j++)
+		{
+		randrng(x,low,upp);
+		TReal y=1.0;
+		test(Math::Pow(res,x,y)==KErrNone);
+		test(testApprox(res,x,1.0E-15));
+		}
+    }
+
+LOCAL_C void powtest4()
+/* 
+Test the identity (x**2)**(y/2)=x**y 
+*/
+    {
+    
+	TReal res,xr,rres,x,y;
+    
+    TReal low=.01;
+    TReal upp=10.0;
+    TReal lowy=-98; // range for y
+    TReal uppy=98;
+    for (TInt j=0;j<10;j++)
+		{
+		randrng(x,low,upp);
+		randrng(y,lowy,uppy);
+		test(Math::Pow(res,x,y)==KErrNone);
+		TReal yr=2;
+		test(Math::Pow(xr,x,yr)==KErrNone);
+		y/=2;
+		test(Math::Pow(rres,xr,y)==KErrNone);
+		test(testApprox(res,rres,5.0E-14));
+		}
+    }
+
+LOCAL_C void powtest5()
+/* 
+Test the identity x**y=1/(x**(-y)) 
+*/
+    {
+    
+	TReal x,y;
+    TReal res,rres;
+    
+	test(Math::Pow(res,-2,-3.765)==KErrArgument);
+    TReal low=0.5;
+    TReal upp=1.0;
+    for (TInt j=0;j<10;j++)
+		{
+		randrng(x,low,upp);
+		randrng(y,low,upp);
+		test(Math::Pow(res,x,y)==KErrNone);
+		y*=(-1);
+		test(Math::Pow(rres,x,y)==KErrNone);
+		rres=1/rres;
+		test(testApprox(res,rres,5.0E-15));
+		}
+    }
+
+LOCAL_C void powtest6()
+/* 
+Test specific ISO requirements on Pow()
+*/
+	{
+	TInt i;
+	TInt n = sizeof(testpow_iso) / sizeof(POWERISO);
+	for (i = 0; i < n; i++)
+		{
+		TReal ans;
+		TInt rc;
+
+		// If one of these tests fails, convert the "failed check xx" number
+		// to an index in testpow_iso[] by subtracting 1 and then dividing by 2.
+		// If the original number was odd, the first test (rc == xxx) failed.
+		// If the original number was even, the second test (.result) failed.
+		rc = Math::Pow(ans, testpow_iso[i].number, testpow_iso[i].power);
+		test(rc == testpow_iso[i].rc);
+		test((rc == KErrArgument) || (ans == testpow_iso[i].result));
+		}
+	}
+
+LOCAL_C void pow10test()
+//
+// Test Pow10() for various selected values - results should indicate which string to 
+// binary conversions would NOT be expected to be exact - see t_float
+//
+	{
+
+	TReal res;
+
+	// test errors
+	test(Math::Pow10(res,-324)==KErrUnderflow);
+	test(res==0.0);
+	test(Math::Pow10(res,-400)==KErrUnderflow);
+	test(res==0.0);
+	test(Math::Pow10(res,309)==KErrOverflow);
+	test(res==KPosInfTReal64);
+	test(Math::Pow10(res,400)==KErrOverflow);
+	test(res==KPosInfTReal64);
+
+	TInt j;
+	TInt i=sizeof(pow10teste)/sizeof(POW10_TEST);
+
+	for (j=0; j<i; j++)
+		{
+		test(Math::Pow10(res,pow10teste[j].num)==KErrNone);
+		test(res==pow10teste[j].res);
+		}
+
+/*	i=sizeof(pow10testa)/sizeof(POW10_TEST);
+	
+	for (j=0; j<i; j++)
+		{
+		test(Math::Pow10(res,pow10testa[j].num)==KErrNone);
+		test(testApprox(res,pow10testa[j].res,1.0E-15));
+		}
+*/	}
+
+LOCAL_C void sintest1(TReal low,TReal upp)
+/*
+Test the identity sin(x)=sin(x/3)[3-4*(sin(x/3))**2] on the range low<=x<upp
+*/
+    //TReal low; // lower limit of range to test
+    //TReal upp; // upper limit of range to test 
+    {
+    
+	TReal x,res,rres;
+
+    for (TInt j=0;j<100;j++)
+		{
+		randrng(x,low,upp);
+		test(Math::Sin(res,x)==KErrNone);
+		x/=3;
+		test(Math::Sin(rres,x)==KErrNone);
+		TReal err=rres*rres;
+		err*=4;
+		err=3-err;
+		err*=rres;
+		test(testApprox(res,err,1.0E-12));
+		}
+    }
+
+LOCAL_C void sintest2()
+/* 
+Test selected values (which may not give exact results) 
+*/
+    {
+    
+	TReal res;
+	
+	// test errors
+	test(Math::Sin(res,KNaNTReal64)==KErrArgument);
+	test(Math::IsNaN(res));
+	test(Math::Sin(res,KPosInfTReal64)==KErrArgument);
+	test(Math::IsNaN(res));
+	test(Math::Sin(res,KNegInfTReal64)==KErrArgument);
+	test(Math::IsNaN(res));
+	test(Math::Sin(res,2147483648.0*KPi)==KErrArgument);
+	test(Math::IsNaN(res));
+	test(Math::Sin(res,-1E+10)==KErrArgument);
+	test(Math::IsNaN(res));
+
+	TInt i=sizeof(testsin)/sizeof(TESTSINE);
+    TInt j;
+    
+	for (j=0;j<i;j++)
+		{
+		TReal x=testsin[j].num;
+		TReal y=testsin[j].res;
+		test(Math::Sin(res,x)==KErrNone);
+   		test(testApprox(res,y,1.0E-15));
+		}
+
+	//Added by AnnW, October 1996
+	TInt mult=101;
+	for (j=-(mult-1); j<mult; j++)
+		{
+		test(Math::Sin(res, (4*j+1)*KPiBy2)==KErrNone);
+		test(testApprox(res,1.0,1.0E-15));
+
+		test(Math::Sin(res, (4*j+3)*KPiBy2)==KErrNone);
+		test(testApprox(res,-1.0,1.0E-15));
+
+		test(Math::Sin(res, ((4*j+1)*90)*KDegToRad)==KErrNone);
+		test(testApprox(res,1.0,1.0E-15));
+
+		test(Math::Sin(res, ((4*j+3)*90)*KDegToRad)==KErrNone);
+		test(testApprox(res,-1.0,1.0E-15));
+		}
+	//
+    }
+
+LOCAL_C void sintest3()
+/* 
+To test the identity sin(-x)=-sin(x) on the range [0,10*pi] 
+*/        
+    {
+    
+	TReal x,res,rres;
+
+    TReal low=0.0;
+    TReal upp=10*KPi;
+    for (TInt j=0;j<10;j++)
+		{
+		randrng(x,low,upp);
+		test(Math::Sin(res,x)==KErrNone);
+		x*=(-1);
+		test(Math::Sin(rres,x)==KErrNone);
+		test(testApprox(rres,-res,1.0E-15));
+		}
+    }
+
+LOCAL_C void sintest4()
+/* 
+To test the identity sin(x)=x for x<<1 
+*/        
+    {
+    
+	TReal res,x;
+    TReal low=1E-90;
+    TReal upp=1E-10;
+
+    for (TInt j=0;j<10;j++)
+		{
+		randrng(x,low,upp);
+		test(Math::Sin(res,x)==KErrNone);
+		test(testApprox(res,x,1.0E-15));
+		}
+
+	// test some denormals
+	test(Math::Sin(res,5E-324)==KErrNone);
+	test(testApprox(res,5E-324,1.0E-15));
+	test(Math::Sin(res,7E-317)==KErrNone);
+	test(testApprox(res,7E-317,1.0E-15));		
+    }
+/*
+LOCAL_C void sintest5()
+//
+// To test that exact results are given for multiples of pi and
+// values sufficiently close to them 
+// Added by AnnW, October 1996
+//
+	{
+	
+	TReal res;
+	TInt j;
+	TInt mult=101; // can use up to 32768
+
+    test(Math::Sin(res,KNegZeroTReal64)==KErrNone);
+	test(res==0.0);
+
+    for (j=-(mult-1); j<mult; j++)
+		{
+		test(Math::Sin(res, j*KPi)==KErrNone);
+		test(res==0.0);
+		test(Math::Sin(res, j*(KPi+1.224E-16))==KErrNone);
+		test(res==0.0);
+		test(Math::Sin(res, (j*180)*KDegToRad)==KErrNone);
+		test(res==0.0);
+		if (j!=0)
+			{
+			test(Math::Sin(res, j*(KPi+1.0E-14))==KErrNone);
+			test(res!=0.0);
+			}		
+		}
+	}
+*/
+LOCAL_C void costest1()
+/* 
+To test the identity cos(x)=cos(x/3)[4*(cos(x/3)**2)-3] on the interval 
+[7*pi,7.5*pi] 
+Added by AnnW, October 1996
+*/
+    {
+
+    TReal x,res,rres;
+
+    TReal low=7*KPi;
+    TReal upp=7.5*KPi;
+    for (TInt j=0;j<100;j++)
+		{
+		randrng(x,low,upp);
+		test(Math::Cos(res,x)==KErrNone);
+		x/=3;
+		test(Math::Cos(rres,x)==KErrNone);
+		test(testApprox(res,rres*(4*(rres*rres)-3),5.0E-13));
+		}
+    }
+
+LOCAL_C void costest2()
+/*
+Test selected values (which may not give exact results) 
+Added by AnnW, October 1996
+*/
+    {
+    
+	TReal res;
+
+	// test errors
+	test(Math::Cos(res,KNaNTReal64)==KErrArgument);
+	test(Math::IsNaN(res));
+	test(Math::Cos(res,KPosInfTReal64)==KErrArgument);
+	test(Math::IsNaN(res));
+	test(Math::Cos(res,KNegInfTReal64)==KErrArgument);
+	test(Math::IsNaN(res));
+	test(Math::Cos(res,(2147483648.0*KPi))==KErrArgument);
+	test(Math::IsNaN(res));
+	test(Math::Sin(res,-1E+10)==KErrArgument);
+	test(Math::IsNaN(res));
+
+	TInt j;
+	TInt mult=101;
+	TInt i=sizeof(testcos)/sizeof(TESTCOSINE);
+
+    for (j=0; j<i; j++)
+		{
+		test(Math::Cos(res,testcos[j].num)==KErrNone);
+		test(testApprox(res,testcos[j].res,1.0E-15));		
+		}
+
+	test(Math::Cos(res,KNegZeroTReal64)==KErrNone);
+	test(testApprox(res,1.0,1E-15));
+
+    for (j=-(mult-1); j<mult; j++)
+		{
+		test(Math::Cos(res, (2*j)*KPi)==KErrNone);
+		test(testApprox(res,1.0,1.0E-15));		
+
+		test(Math::Cos(res, (2*j+1)*KPi)==KErrNone);
+		test(testApprox(res,-1.0,1.0E-15));		
+
+		test(Math::Cos(res, (2*j)*(KPi+1.224E-16))==KErrNone);
+		test(testApprox(res,1.0,1.0E-15));		
+
+		test(Math::Cos(res, (2*j+1)*(KPi+1.224E-16))==KErrNone);
+		test(testApprox(res,-1.0,1.0E-15));		
+
+		test(Math::Cos(res, ((2*j)*180)*KDegToRad)==KErrNone);
+		test(testApprox(res,1.0,1.0E-15));		
+
+		test(Math::Cos(res, ((2*j+1)*180)*KDegToRad)==KErrNone);
+		test(testApprox(res,-1.0,1.0E-15));		
+		}
+    }
+
+LOCAL_C void costest3()
+/* 
+To test the identity cos(-x)=cos(x) on the range [0,10*pi]
+Added by AnnW, October 1996 
+*/        
+    {
+
+    TReal x,res,rres;
+
+    TReal low=0.0;
+    TReal upp=10*KPi;
+    for (TInt j=0;j<10;j++)
+		{
+		randrng(x,low,upp);
+		test(Math::Cos(res,x)==KErrNone);
+		x*=(-1);
+		test(Math::Cos(rres,x)==KErrNone);
+		test(testApprox(rres,res,1.0E-15));		
+		}
+    }
+
+LOCAL_C void costest4()
+/* 
+To test the identity cos(x)=1 for x<<1 
+Added by Annw, October 1996
+*/        
+    {
+
+    TReal res,x;
+    TReal low=1E-90;
+    TReal upp=1E-10;
+
+    for (TInt j=0;j<10;j++)
+		{
+		randrng(x,low,upp);
+		test(Math::Cos(res,x)==KErrNone);
+		test(testApprox(res,1.0,1.0E-15));
+		}
+
+	// test some denormals
+	test(Math::Cos(res,5E-324)==KErrNone);
+	test(testApprox(res,1.0,1.0E-15));
+	test(Math::Cos(res,1.34E-315)==KErrNone);
+	test(testApprox(res,1.0,1.0E-15));			
+    }
+/*
+LOCAL_C void costest5()
+//
+// To test that exact results are given for multiples of KPi and
+// values sufficiently close to them 
+// Added by AnnW, October 1996
+//
+	{
+
+	TReal res;
+	TInt mult=101;	// can use up to 32768
+	TInt j;
+    
+    for (j=-(mult-1); j<mult; j++)
+		{
+		test(Math::Cos(res, (2*j+1)*KPiBy2)==KErrNone);
+		test(res==0.0);
+		test(Math::Cos(res, (2*j+1)*KPiBy2+(j+1)*1.224E-16)==KErrNone);
+		test(res==0.0);
+		test(Math::Cos(res, (2*j+1)*90*KDegToRad)==KErrNone);
+		test(res==0.0);
+		if (j!=0)
+			{
+			test(Math::Sin(res, (2*j+1)*(KPiBy2+1.0E-14))==KErrNone);
+			test(res!=0.0);
+			}
+		}
+	}
+*/
+LOCAL_C void tantest1(TReal low,TReal upp)
+/*
+Test the identity tan(x)=(2*tan(x/2))/(1-tan(x/2)**2) on the range low<=x<upp
+*/
+    //TReal low; // lower limit of range to test
+    //TReal upp; // upper limit of range to test 
+    {
+
+    TReal x,res,rres;
+
+    for (TInt j=0;j<100;j++)
+		{
+		if (j==90)
+			{
+			test(1);
+			}
+		randrng(x,low,upp);
+		test(Math::Tan(res,x)==KErrNone);
+		x/=2;
+		test(Math::Tan(rres,x)==KErrNone);
+		TReal ex=(2*rres)/(1-rres*rres);
+		test(testApprox(res,ex,1.0E-15));		
+		}
+    }
+
+LOCAL_C void tantest2()
+/* 
+To test tangent for specific  arguments 
+*/
+    {
+
+    TReal res;
+
+	// test errors
+	test(Math::Tan(res,KNaNTReal64)==KErrArgument);
+	test(Math::IsNaN(res));
+	test(Math::Tan(res,KPosInfTReal64)==KErrArgument);
+	test(Math::IsNaN(res));
+	test(Math::Tan(res,KNegInfTReal64)==KErrArgument);
+	test(Math::IsNaN(res));
+	test(Math::Tan(res, 1073741824.0*KPi)==KErrArgument);
+	test(Math::IsNaN(res));
+	test(Math::Tan(res, 4.0E+102)==KErrArgument);
+	test(Math::IsNaN(res));
+	test(Math::Tan(res, -4.0E+102)==KErrArgument);
+	test(Math::IsNaN(res));
+    
+	TInt j;
+	TInt mult=101;	// can use up to 32768
+    TInt i=sizeof(testtan)/sizeof(TAN);
+    for (j=0;j<i;j++)
+		{
+		test(Math::Tan(res,testtan[j].angle)==KErrNone);
+		test(testApprox(res,testtan[j].result,1.0E-15));		
+		}
+
+	//Added by AnnW, October 1996
+	for (j=-(mult-1); j<mult; j++)
+		{
+//		test(Math::Tan(res, (2*j+1)*KPiBy2)==KErrOverflow);
+//		test(Math::IsInfinite(res));	// this test is no longer valid
+		test(Math::Tan(res, (2*j+1)*(KPiBy2+1.0E-15))!=KErrOverflow);
+		test(Math::IsFinite(res));
+		}
+	
+	// Check that signs are correct
+	test(Math::Tan(res,KPiBy2+5E-16)==KErrNone);
+	test(res<0);
+	test(Math::Tan(res,KPiBy2-5E-16)==KErrNone);
+	test(res>0);
+	}
+
+LOCAL_C void tantest3()
+/* 
+To test the identity tan(-x)=-tan(x) on the range [-1.5,1.5] 
+*/        
+    {
+
+    TReal x,res,rres;
+
+    TReal low=(-1.5);
+    TReal upp=1.5;
+    for (TInt j=0;j<10;j++)
+		{
+		randrng(x,low,upp);
+		test(Math::Tan(res,x)==KErrNone);
+		x*=(-1);
+		test(Math::Tan(rres,x)==KErrNone);
+		test(testApprox(rres,-res,1.0E-15));		
+		}
+    }
+
+LOCAL_C void tantest4()
+/* 
+To test the identity tan(x)=x for x<<1 
+*/        
+    {
+
+    TReal x,res;
+
+    TReal low=1E-90;
+    TReal upp=1E-10;
+    for (TInt j=0;j<10;j++)
+		{
+		randrng(x,low,upp);
+		test(Math::Tan(res,x)==KErrNone);
+		test(testApprox(res,x,1.0E-15));		
+		}
+
+	// Check some denormals
+	test(Math::Tan(res,5E-324)==KErrNone);
+	test(res==5E-324);
+	test(Math::Tan(res,-1.234567891234E-315)==KErrNone);
+	test(res==-1.234567891234E-315);	
+    }
+/*
+LOCAL_C void tantest5()
+
+// To test that exact results are given for multiples of KPi
+// Added by AnnW, October 1996
+
+	{
+
+    TReal res;
+	TInt j;
+	TInt mult=101;	// can use up to 32768
+
+	test(Math::Tan(res,KNegZeroTReal64)==KErrNone);
+	test(res==KNegZeroTReal64);
+    
+    for (j=-(mult-1); j<mult; j++)
+		{
+		test(Math::Tan(res, j*KPi)==KErrNone);
+		test(res==0.0);
+		test(Math::Tan(res, j*(KPi+1.224E-16))==KErrNone);
+		test(res==0.0);
+		test(Math::Tan(res, (j*180)*KDegToRad)==KErrNone);
+		test(res==0.0);
+		if (j!=0)
+			{
+			test(Math::Sin(res, j*(KPi+1.0E-14))==KErrNone);
+			test(res!=0.0);
+			}
+		}
+	}
+*/
+LOCAL_C void astest1(TReal low,TReal upp,TInt k,TInt cosflg)
+/*
+Tests random numbers in the range [low,upp] using the Taylor approximation 
+*/
+    //TReal low; // lower limit of range to test
+    //TReal upp; // upper limit of range to test 
+    //TInt k; // Highest order term to be used in the taylor approximation
+    //TInt cosflg; // Flag for arc cos
+    {
+
+    TReal res,x;
+
+    for (TInt j=0;j<100;j++)
+		{
+		randrng(x,low,upp);
+		if (cosflg)
+			test(Math::ACos(res,x)==KErrNone);
+		else
+			test(Math::ASin(res,x)==KErrNone);
+		TReal tres=taylor(x,k);
+		if (cosflg)
+			tres=KPiBy2-tres;
+		test(testApprox(tres,res,5.0E-15));		
+		}
+    }
+
+LOCAL_C void astest2()
+/* 
+To test the identity arc sin(x)=x for x<<1 
+*/        
+    {
+
+    TReal x,res;
+
+    TReal low=1E-90;
+    TReal upp=1E-10;
+    for (TInt j=0;j<100;j++)
+		{
+		randrng(x,low,upp);
+		test(Math::ASin(res,x)==KErrNone);
+		test(testApprox(res,x,1.0E-15));		
+		}
+
+	// Check some denormals
+	test(Math::ASin(res,5E-324)==KErrNone);
+	test(res==5E-324);		
+	test(Math::ASin(res,-8.912345678E-318)==KErrNone);
+	test(res==-8.912345678E-318);		
+    }
+
+LOCAL_C void astest3()
+/* 
+To test the identity arc sin(-x)=-arc sin(x) 
+*/        
+    {
+
+    TReal res,rres,x;
+
+    TReal low=0.0;
+    TReal upp=1.0;
+    for (TInt j=0;j<100;j++)
+		{
+		randrng(x,low,upp);
+		test(Math::ASin(res,x)==KErrNone);
+		TReal y=(-x);
+		test(Math::ASin(rres,y)==KErrNone);
+		test(testApprox(rres,-res,1.0E-15));		
+		}
+    }
+
+LOCAL_C void astest4(TInt k,TInt sgn)
+/* 
+Test selected numbers 
+*/
+    //TInt k; // arc cosine flag
+    //TInt sgn; // sign flag for range    
+    {
+
+    TReal res;
+
+	// test errors
+	test(Math::ASin(res,KNaNTReal64)==KErrArgument);
+	test(Math::IsNaN(res));
+	test(Math::ASin(res,KPosInfTReal64)==KErrArgument);
+	test(Math::IsNaN(res));
+	test(Math::ASin(res,KNegInfTReal64)==KErrArgument);
+	test(Math::IsNaN(res));
+	test(Math::ASin(res,1.0000000000001)==KErrArgument);
+	test(Math::IsNaN(res));
+	test(Math::ASin(res,-1.0000000000001)==KErrArgument);
+	test(Math::IsNaN(res));
+	test(Math::ACos(res,KNaNTReal64)==KErrArgument);
+	test(Math::IsNaN(res));
+	test(Math::ACos(res,KPosInfTReal64)==KErrArgument);
+	test(Math::IsNaN(res));
+	test(Math::ACos(res,KNegInfTReal64)==KErrArgument);
+	test(Math::IsNaN(res));
+	test(Math::ACos(res,1.0000000000001)==KErrArgument);
+	test(Math::IsNaN(res));
+	test(Math::ACos(res,-1.0000000000001)==KErrArgument);
+	test(Math::IsNaN(res));
+
+	test(Math::ASin(res,0.0)==KErrNone);
+	test(res==0.0);
+	test(Math::ASin(res,KNegZeroTReal64)==KErrNone);
+	test(res==0.0);
+
+    TInt i=sizeof(testas)/sizeof(TESTASC);
+    for (TInt j=0;j<i;j++) 
+		{
+		// NB Results for comparison only given to 12 or 13 decimal places, so can't expect 
+		// better accuracy
+		if (k)
+			{
+			testas[j].num*=sgn;
+			testas[j].res*=sgn;
+			test(Math::ACos(res,testas[j].num)==KErrNone);
+			test(testApprox(res,(KPiBy2-testas[j].res),1.0E-11));	
+			}
+		else
+			{
+			test(Math::ASin(res,testas[j].num)==KErrNone);
+			test(testApprox(res,testas[j].res,1.0E-12));	
+			}
+		}
+
+	// Check some denormals for ACos()
+	test(Math::ACos(res,5E-324)==KErrNone);
+	test(res==KPiBy2);	
+	test(Math::ACos(res,-9.87654E-320)==KErrNone);
+	test(res==KPiBy2);						
+    }
+
+LOCAL_C void attest1()
+/* 
+Random argument tests for x in the primary range, comparing the result with a 
+Taylor series approximation
+*/
+    {
+
+    TReal res,x;
+
+    TReal low=(-0.0625);
+    TReal upp=0.0625;
+    for (TInt i=0;i<10;i++)
+		{
+		randrng(x,low,upp);
+		test(Math::ATan(res,x)==KErrNone);
+		TReal tres=tayatan(x);
+		test(testApprox(res,tres,1.0E-15));		
+		}
+    }
+
+LOCAL_C void attest2()
+/* 
+Random argument tests for x outside the primary range, using the identity
+arctan(u)=arctan(v)+arctan[(u-v)/(1+uv)]
+*/
+    {
+
+    TReal x,res,rres,atcnst;
+
+    TReal low=0.0625;
+    TReal upp=2.0-KSqt3;
+    TReal cnst=0.0625;
+    test(Math::ATan(atcnst,cnst)==KErrNone);
+    for (TInt i=0;i<10;i++)
+		{
+		randrng(x,low,upp);
+		test(Math::ATan(res,x)==KErrNone);
+		TReal y=(x-cnst)/(1+x*cnst);
+		test(Math::ATan(rres,y)==KErrNone);
+		test(testApprox(res,(atcnst+rres),1.0E-15));		
+		}
+    }                   
+
+LOCAL_C void attest3()
+/*
+Check that the identity arctan(-x)=-arctan(x) holds
+*/
+    {
+
+    TReal res,rres,x;
+    TReal low=0.0;
+    TReal upp=1.0;
+    for (TInt i=0;i<10;i++)
+		{
+		randrng(x,upp,low);
+		test(Math::ATan(res,x)==KErrNone);
+		x=(-x);
+		test(Math::ATan(rres,x)==KErrNone);
+		test(testApprox(res,-rres,1.0E-15));		
+		}
+    }           
+
+LOCAL_C void attest4()
+/* 
+Check that the identity arctan(x)=x for Abs(x)<1 holds
+*/
+    {
+
+    TReal x,res;
+
+    TReal low=1E-90;
+    TReal upp=1E-20;
+    for (TInt i=0;i<10;i++)
+		{
+		randrng(x,low,upp);
+		test(Math::ATan(res,x)==KErrNone);
+		test(testApprox(res,x,1.0E-15));		
+		}
+
+	// Check some denormals
+	test(Math::ATan(res,-5E-324)==KErrNone);
+	test(res==-5E-324);		
+	test(Math::ATan(res,7.123E-322)==KErrNone);
+	test(res==7.123E-322);			
+    }
+
+LOCAL_C void attest5()
+/*
+Tests selected values
+*/
+    {
+
+    TReal res;
+
+	// test errors, special cases
+	test(Math::ATan(res,KNaNTReal64)==KErrArgument);
+	test(Math::IsNaN(res));
+	test(Math::ATan(res,0.0)==KErrNone);
+	test(res==0.0);
+	test(Math::ATan(res,KNegZeroTReal64)==KErrNone);
+	test(res==0.0);
+	test(Math::ATan(res,KPosInfTReal64)==KErrNone);
+	test(res==KPiBy2);
+	test(Math::ATan(res,KNegInfTReal64)==KErrNone);
+	test(res==-KPiBy2);
+
+	test(Math::ATan(res,KNaNTReal64,1.0)==KErrArgument);
+	test(Math::IsNaN(res));
+	test(Math::ATan(res,1.0,KNaNTReal64)==KErrArgument);
+	test(Math::IsNaN(res));
+	test(Math::ATan(res,KNaNTReal64,KNaNTReal64)==KErrArgument);
+	test(Math::IsNaN(res));
+	test(Math::ATan(res,0.0,KNegZeroTReal64)==KErrArgument);
+	test(Math::IsNaN(res));
+	test(Math::ATan(res,KNegZeroTReal64,KNegZeroTReal64)==KErrArgument);
+	test(Math::IsNaN(res));	
+	test(Math::ATan(res,0.0,0.0)==KErrArgument);
+	test(Math::IsNaN(res));	
+	test(Math::ATan(res,KNegZeroTReal64,KNegZeroTReal64)==KErrArgument);
+	test(Math::IsNaN(res));	
+	test(Math::ATan(res,KPosInfTReal64,KNegInfTReal64)==KErrNone);
+	test(res==3.0*(KPiBy2/2.0));
+	test(Math::ATan(res,KPosInfTReal64,KPosInfTReal64)==KErrNone);
+	test(res==KPiBy2/2.0);
+	test(Math::ATan(res,KNegInfTReal64,KPosInfTReal64)==KErrNone);
+	test(res==-(KPiBy2/2.0));
+	test(Math::ATan(res,KNegInfTReal64,KNegInfTReal64)==KErrNone);
+	test(res==-3.0*(KPiBy2/2.0));
+	test(Math::ATan(res,KNegZeroTReal64,1.0)==KErrNone);
+	test(res==0.0);
+	test(Math::ATan(res,0.0,1.0)==KErrNone);
+	test(res==0.0);	
+	test(Math::ATan(res,0.0,-1.0)==KErrNone);
+	test(res==KPi);	
+	test(Math::ATan(res,1.0,KPosInfTReal64)==KErrNone);
+	test(res==0.0);
+	test(Math::ATan(res,1.0,KNegInfTReal64)==KErrNone);
+	test(res==KPi);
+	test(Math::ATan(res,0.0,KPosInfTReal64)==KErrNone);	
+	test(res==0.0);
+	test(Math::ATan(res,KPosInfTReal64,1.0)==KErrNone);	
+	test(res==KPiBy2);
+	test(Math::ATan(res,KNegInfTReal64,1.0)==KErrNone);	
+	test(res==-KPiBy2);
+	test(Math::ATan(res,1.0,0.0)==KErrNone);	
+	test(res==KPiBy2);
+	test(Math::ATan(res,1.0,KNegZeroTReal64)==KErrNone);	
+	test(res==KPiBy2);
+	test(Math::ATan(res,KPosInfTReal64,-1.0)==KErrNone);	
+	test(res==KPiBy2);
+	test(Math::ATan(res,KNegInfTReal64,-1.0)==KErrNone);	
+	test(res==-KPiBy2);
+	test(Math::ATan(res,-1.0,0.0)==KErrNone);	
+	test(res==-KPiBy2);
+	test(Math::ATan(res,-1.0,KNegZeroTReal64)==KErrNone);	
+	test(res==-KPiBy2);
+	test(Math::ATan(res,5E-324,10)==KErrNone);	
+	test(res==0.0);
+	test(Math::ATan(res,1E+308,0.1)==KErrNone);	
+	test(res==KPiBy2);
+
+    TInt i=sizeof(testat2)/sizeof(TESTATAN2);
+    for (TInt j=0;j<i;j++) 
+		{
+		// NB Some results only given to 12 dp so cannot expect better accuracy
+		test(Math::ATan(res,testat2[j].num1,testat2[j].num2)==KErrNone);
+		test(testApprox(res,testat2[j].res,1.0E-12));		
+		}	
+    }
+
+LOCAL_C void inttest1()
+/*
+Tests specific numbers
+*/
+    {
+
+    TReal res;
+
+	// Specials
+	test(Math::Int(res,KNaNTReal64)==KErrArgument);
+	test(Math::IsNaN(res));
+	test(Math::Int(res,KPosInfTReal64)==KErrOverflow);
+	test(res==KPosInfTReal64);
+	test(Math::Int(res,KNegInfTReal64)==KErrOverflow);
+	test(res==KNegInfTReal64);
+
+    TInt i=sizeof(testint1)/sizeof(INT_TEST);
+    for (TInt j=0;j<i;j++) 
+		{
+		test(Math::Int(res,testint1[j].num)==KErrNone);
+		test(res==testint1[j].res);
+		}
+
+	// Check some denormals
+	test(Math::Int(res,5E-324)==KErrNone);
+	test(res==0.0);
+	test(Math::Int(res,1.45E-309)==KErrNone);
+	test(res==0.0);
+    }
+
+LOCAL_C void inttest2()
+/*
+Tests specific numbers
+*/
+    {
+
+    TInt16 res;
+
+	// test errors
+	test(Math::Int(res,KNaNTReal64)==KErrArgument);
+	test(res==0);
+	test(Math::Int(res,KPosInfTReal64)==KErrOverflow);
+	test(res==TInt16(KMaxTInt16));	
+	test(Math::Int(res,32768.9830857)==KErrOverflow);
+	test(res==TInt16(KMaxTInt16));
+	test(Math::Int(res,32769.36946)==KErrOverflow);
+	test(res==TInt16(KMaxTInt16));
+	test(Math::Int(res,KNegInfTReal64)==KErrUnderflow);
+    test(res==TInt16(KMinTInt16));
+	test(Math::Int(res,-32774.997937)==KErrUnderflow);
+    test(res==TInt16(KMinTInt16));
+
+    TInt i=sizeof(testint2)/sizeof(INTI_TEST);
+    for (TInt j=0;j<i;j++) 
+		{
+		test(Math::Int(res,testint2[j].num)==KErrNone);
+		test(res==testint2[j].res);		
+		}
+
+	// Check some denormals
+	test(Math::Int(res,5E-324)==KErrNone);
+	test(res==0.0);
+	test(Math::Int(res,1.45E-309)==KErrNone);
+	test(res==0.0);
+	}
+
+LOCAL_C void inttest3()
+/*
+Tests specific numbers
+*/
+    {
+
+    TInt32 res;
+
+    // test errors
+	test(Math::Int(res,KNaNTReal64)==KErrArgument);
+	test(res==0);
+	test(Math::Int(res,KPosInfTReal64)==KErrOverflow);
+	test(res==KMaxTInt32);
+	test(Math::Int(res,2147483648.34576)==KErrOverflow);
+	test(res==KMaxTInt32);
+    test(Math::Int(res,2147553576.8794365)==KErrOverflow);
+	test(res==KMaxTInt32);
+    test(Math::Int(res,KNegInfTReal64)==KErrUnderflow);
+	test(res==KMinTInt32);
+	test(Math::Int(res,-2147496757.583)==KErrUnderflow);
+	test(res==KMinTInt32);
+    
+	TInt i=sizeof(testint3)/sizeof(INTL_TEST);
+    for (TInt j=0;j<i;j++) 
+		{
+		test(Math::Int(res,testint3[j].num)==KErrNone);
+		test(res==testint3[j].res);
+		}
+
+	// Check some denormals
+	test(Math::Int(res,5E-324)==KErrNone);
+	test(res==0.0);
+	test(Math::Int(res,1.45E-309)==KErrNone);
+	test(res==0.0);
+	}
+
+LOCAL_C void inttest4()
+	{
+	// tests Int()
+	TInt16 tint16;
+	TInt32 tint32;
+	TReal trg,src=100.0;
+
+	test.Start(_L("Math::Int()"));
+	src=0.0;
+	test(Math::Int(trg,src)==KErrNone);  
+	test(trg==0.0);
+	test(Math::Int(tint16,src)==KErrNone);
+	test(tint16==0);
+	test(Math::Int(tint32,src)==KErrNone);
+	test(tint32==0);
+
+    src=0.1233456789;
+	test(Math::Int(trg,src)==KErrNone);  
+	test(trg==0.0);
+	test(Math::Int(tint16,src)==KErrNone);
+	test(tint16==0);
+	test(Math::Int(tint32,src)==KErrNone);
+	test(tint32==0);
+
+	src=-0.5;
+	test(Math::Int(trg,src)==KErrNone);  
+	test(trg==0.0);
+	test(Math::Int(tint16,src)==KErrNone);
+	test(tint16==0);
+	test(Math::Int(tint32,src)==KErrNone);
+	test(tint32==0);
+
+	src=1.123456789;
+	test(Math::Int(trg,src)==KErrNone);  
+	test(trg==1.0);
+	test(Math::Int(tint16,src)==KErrNone);
+	test(tint16==1);
+	test(Math::Int(tint32,src)==KErrNone);
+	test(tint32==1);
+
+	src=-1.12345678;
+	test(Math::Int(trg,src)==KErrNone);  
+	test(trg==-1.0);
+	test(Math::Int(tint16,src)==KErrNone);
+	test(tint16==-1);
+	test(Math::Int(tint32,src)==KErrNone);
+	test(tint32==-1);
+
+	src=KMaxTInt16-0.1; 
+	test(Math::Int(trg,src)==KErrNone);  
+	test(trg==KMaxTInt16-1);
+	test(Math::Int(tint16,src)==KErrNone);
+	test(tint16==KMaxTInt16-1);
+	test(Math::Int(tint32,src)==KErrNone);
+	test(tint32==KMaxTInt16-1);
+
+	src=KMaxTInt16+0.5; 
+	test(Math::Int(trg,src)==KErrNone);  
+	test(trg==KMaxTInt16);
+	test(Math::Int(tint16,src)==KErrNone);
+	test(tint16==KMaxTInt16);
+	test(Math::Int(tint32,src)==KErrNone);
+	test(tint32==KMaxTInt16);
+
+	src=KMaxTInt16+1; 
+	test(Math::Int(trg,src)==KErrNone);  
+	test(trg==KMaxTInt16+1);
+	test(Math::Int(tint16,src)==KErrOverflow);
+	test(Math::Int(tint32,src)==KErrNone);
+	test(tint32==KMaxTInt16+1);
+
+	src=KMinTInt16-0.1; 
+	test(Math::Int(trg,src)==KErrNone);  
+	test(trg==KMinTInt16);
+	test(Math::Int(tint16,src)==KErrNone);
+	test(tint16==KMinTInt16);
+	test(Math::Int(tint32,src)==KErrNone);
+	test(tint32==KMinTInt16);
+
+	src=KMinTInt16; 
+	test(Math::Int(trg,src)==KErrNone);  
+	test(trg==KMinTInt16);
+	test(Math::Int(tint16,src)==KErrNone);
+	test(tint16==KMinTInt16);
+	test(Math::Int(tint32,src)==KErrNone);
+	test(tint32==KMinTInt16);
+
+	src=KMinTInt16-1; 
+	test(Math::Int(trg,src)==KErrNone);  
+	test(trg==KMinTInt16-1);
+	test(Math::Int(tint16,src)==KErrUnderflow);
+	test(Math::Int(tint32,src)==KErrNone);
+	test(tint32==KMinTInt16-1);
+
+	src=KMaxTInt32-0.1; 
+	test(Math::Int(trg,src)==KErrNone);  
+	test(trg==KMaxTInt32-1);
+	test(Math::Int(tint16,src)==KErrOverflow);
+	test(Math::Int(tint32,src)==KErrNone);
+	test(tint32==KMaxTInt32-1);
+
+	src=KMaxTInt32+0.5; 
+	test(Math::Int(trg,src)==KErrNone);  
+	test(trg==KMaxTInt32);
+	test(Math::Int(tint16,src)==KErrOverflow);
+	test(Math::Int(tint32,src)==KErrNone);
+	test(tint32==KMaxTInt32);
+
+	src=KMaxTInt32; 
+	src+=1;
+	test(Math::Int(trg,src)==KErrNone);  
+	test(trg==(TUint32)KMaxTInt32+1);
+	test(Math::Int(tint16,src)==KErrOverflow);
+	test(Math::Int(tint32,src)==KErrOverflow);
+
+	src=KMinTInt32+0.1; 
+	test(Math::Int(trg,src)==KErrNone);  
+	test(trg==KMinTInt32+1);
+	test(Math::Int(tint16,src)==KErrUnderflow);
+	test(Math::Int(tint32,src)==KErrNone);
+	test(tint32==KMinTInt32+1);
+
+	src=KMinTInt32; 
+	test(Math::Int(trg,src)==KErrNone);  
+	test(trg==KMinTInt32);
+	test(Math::Int(tint16,src)==KErrUnderflow);
+	test(Math::Int(tint32,src)==KErrNone);
+	test(tint32==KMinTInt32);
+
+	src=KMinTInt32;
+	src-=1; 
+	test(Math::Int(trg,src)==KErrNone);  
+	test((trg+1)==KMinTInt32);
+	test(Math::Int(tint16,src)==KErrUnderflow);
+	test(Math::Int(tint32,src)==KErrUnderflow);
+
+	src=KMaxTUint32-0.1;
+	test(Math::Int(trg,src)==KErrNone);  
+	test(trg==KMaxTUint32-1);
+	test(Math::Int(tint16,src)==KErrOverflow);
+	test(Math::Int(tint32,src)==KErrOverflow);
+
+	src=KMaxTUint32;
+	test(Math::Int(trg,src)==KErrNone);  
+	test(trg==KMaxTUint32);
+	test(Math::Int(tint16,src)==KErrOverflow);
+	test(Math::Int(tint32,src)==KErrOverflow);
+
+	test.End();
+	}
+
+LOCAL_C void fractest1()
+/*
+Tests specific numbers
+*/
+    {
+
+    TReal res;
+
+	// test errors
+	test(Math::Frac(res,KNaNTReal64)==KErrArgument);
+	test(Math::IsNaN(res));
+	test(Math::Frac(res,KPosInfTReal64)==KErrOverflow);
+	test(res==0.0);
+	test(Math::Frac(res,KNegInfTReal64)==KErrOverflow);
+	test(res==0.0);
+
+    TInt i=sizeof(testfrac)/sizeof(FRAC_TEST);
+    for (TInt j=0;j<i;j++) 
+		{
+		test(Math::Frac(res,testfrac[j].num)==KErrNone);
+		TReal err=(res-testfrac[j].res);
+		if (res)
+			err/=testfrac[j].num;	// NB num not res
+		test(Abs(err)<1.0E-15);
+		}
+
+	// Check some denormals
+	test(Math::Frac(res,5E-324)==KErrNone);
+	test(res==5E-324);
+	test(Math::Frac(res,1.23456789E-314)==KErrNone);
+	test(res==1.23456789E-314);
+    }
+
+LOCAL_C void fractest2()
+	{
+	// tests Frac() 
+	test.Start(_L("Math::Frac()"));
+	TReal trg,src;
+
+	src=0.0;
+	test(Math::Frac(trg,src)==KErrNone);
+	test(trg==0.0);
+
+	src=0.1;
+	test(Math::Frac(trg,src)==KErrNone);
+	test(trg==0.1);
+
+	src=-0.1;
+	test(Math::Frac(trg,src)==KErrNone);
+	test(trg==-0.1);
+
+	src=7.5;
+	test(Math::Frac(trg,src)==KErrNone);
+	test(trg==0.5);
+
+	src=-7.5;
+	test(Math::Frac(trg,src)==KErrNone);
+	test(trg==-0.5);
+
+	src=5.998046875;
+	test(Math::Frac(trg,src)==KErrNone);
+	test(trg==0.998046875);
+
+	src=-5.998046875;
+	test(Math::Frac(trg,src)==KErrNone);
+	test(trg==-0.998046875);
+
+	src=-0.00000000001;
+	test(Math::Frac(trg,src)==KErrNone);
+	test(trg==-0.00000000001);
+
+	src=1000000000000.5;
+	test(Math::Frac(trg,src)==KErrNone);
+	test(trg==0.5);
+
+	src=1099511627776.0;
+	src+=0.000244140625;
+	test(Math::Frac(trg,src)==KErrNone);
+	test(trg==0.000244140625);
+
+	src=-KMaxTInt32;
+	src+=0.5;
+	test(Math::Frac(trg,src)==KErrNone);
+	test(trg==-0.5);
+
+	src=KMaxTUint32;
+	src+=0.5;
+	test(Math::Frac(trg,src)==KErrNone);
+	test(trg==0.5);
+
+	test.End();
+	}
+
+LOCAL_C void modtest1()
+/*
+Test modulo function using specified values
+*/
+    {
+
+    TReal res;
+
+	// test errors
+	test(Math::Mod(res,KNaNTReal64,1.0)==KErrArgument);
+	test(Math::IsNaN(res));
+	test(Math::Mod(res,1.0,KNaNTReal64)==KErrArgument);
+	test(Math::IsNaN(res));
+	test(Math::Mod(res,KNaNTReal64,KNaNTReal64)==KErrArgument);
+	test(Math::IsNaN(res));
+	test(Math::Mod(res,KPosInfTReal64,2.0)==KErrArgument);
+	test(Math::IsNaN(res));
+	test(Math::Mod(res,KNegInfTReal64,2.0)==KErrArgument);
+	test(Math::IsNaN(res));
+	test(Math::Mod(res,2.0,KNegZeroTReal64)==KErrArgument);
+	test(Math::IsNaN(res));
+	test(Math::Mod(res,1.0,0.0)==KErrArgument);
+	test(Math::IsNaN(res));
+
+    TInt i=sizeof(testmod)/sizeof(MOD_TEST);
+    for (TInt j=0;j<i;j++) 
+		{
+		test(Math::Mod(res,testmod[j].num,testmod[j].mod)==KErrNone);
+		test(testApprox(res,testmod[j].res,5.0E-13));		
+		}
+
+	// Check some denormals
+ 	test(Math::Mod(res,K1Point2EMinus320Real64,K5EMinus321Real64)==KErrNone);
+ 	test(res==K2EMinus321Real64);		
+ 	test(Math::Mod(res,K1Point234EMinus316Real64,K1Point234EMinus316Real64)==KErrNone);
+	test(res==0.0);		
+    }
+
+LOCAL_C void modtest2()
+/*
+Test modulo function for values which will be incorrect so return KErrTotalLossOfPrecision
+*/
+    {
+
+    TReal res;
+
+	TInt i=sizeof(testmod2)/sizeof(MOD_TEST);
+    for (TInt j=0;j<i;j++) 
+		{
+		test(Math::Mod(res,testmod2[j].num,testmod2[j].mod)==KErrTotalLossOfPrecision);
+		test(Math::IsZero(res));
+		}
+	}
+
+LOCAL_C void DuplicateTest()
+//
+// Tests that you can use the same variable for both operands in some Math functions
+// NB results only given to 12 or 13 significant figures so cannot expect better accuracy
+//
+	{
+
+	TReal inOut;
+	test.Start(_L("ACos"));
+	inOut=-0.5;
+	test(Math::ACos(inOut,inOut)==KErrNone);
+	test(testApprox(inOut,2.094395102393,1.0E-13));			
+
+	test.Next(_L("ASin"));
+	inOut=-0.5;
+	test(Math::ASin(inOut,inOut)==KErrNone);
+	test(testApprox(inOut,-0.523598775598,6.0E-13));			
+
+	test.Next(_L("ATan"));
+	inOut=0.5;
+	test(Math::ATan(inOut,inOut)==KErrNone);
+	test(testApprox(inOut,0.463647609001,5.0E-13));			
+	inOut=-0.25;
+	TReal another=-0.5;
+	test(Math::ATan(inOut,inOut,another)==KErrNone);
+	test(testApprox(inOut,-2.677945044589,5.0E-15));			
+	inOut=-0.5;
+	another=0.25;
+	test(Math::ATan(inOut,another,inOut)==KErrNone);
+	test(testApprox(inOut,2.677945044589,5.0E-15));			
+
+	test.Next(_L("Cos"));
+	inOut=1;
+	test(Math::Cos(inOut,inOut)==KErrNone);
+	test(testApprox(inOut,0.540302305868,3.0E-13));			
+
+	test.Next(_L("Exp"));
+	inOut=0.5;
+	test(Math::Exp(inOut,inOut)==KErrNone);
+	test(testApprox(inOut,1.648721270700,1.0E-13));			
+
+	test.Next(_L("Frac"));
+	inOut=56.123456789;
+	test(Math::Frac(inOut,inOut)==KErrNone);
+	test(testApprox(inOut,0.123456789,2.0E-14));
+
+	test.Next(_L("Int"));
+	inOut=56.123456789;
+	test(Math::Int(inOut,inOut)==KErrNone);
+	test(inOut==56);
+	
+	test.Next(_L("Log"));
+	inOut=0.5;
+	test(Math::Log(inOut,inOut)==KErrNone);
+	test(testApprox(inOut,-0.301029995664,7.0E-14));				
+
+	test.Next(_L("Ln"));
+	inOut=0.5;
+	test(Math::Ln(inOut,inOut)==KErrNone);
+	test(testApprox(inOut,-0.693147180560,8.0E-14));				
+
+	test.Next(_L("Mod"));
+	inOut=53;
+	another=17;
+	test(Math::Mod(inOut,inOut,another)==KErrNone);
+	test(inOut==2);
+	inOut=17;
+	another=53;
+	test(Math::Mod(inOut,another,inOut)==KErrNone);
+	test(inOut==2);
+
+	test.Next(_L("Pow"));
+	inOut=-5;
+	another=3;
+	test(Math::Pow(inOut,inOut,another)==KErrNone);
+	test(inOut==-125.0);
+	another=-5;
+	inOut=3;
+	test(Math::Pow(inOut,another,inOut)==KErrNone);
+	test(inOut==-125.0);
+
+	test.Next(_L("Sin"));
+	inOut=1;
+	test(Math::Sin(inOut,inOut)==KErrNone);
+	test(testApprox(inOut,0.84147098480790,5.0E-15));				
+
+	test.Next(_L("Round"));
+	inOut=123.4567;
+	test(Math::Round(inOut,inOut,2)==KErrNone);
+	test(testApprox(inOut,123.46,1.0E-15));				
+
+	test.Next(_L("Sqrt"));
+	inOut=53;
+	test(Math::Sqrt(inOut,inOut)==KErrNone);
+	test(testApprox(inOut,7.280109889281,7.0E-14));				
+
+	test.Next(_L("Tan"));
+	inOut=1;
+	test(Math::Tan(inOut,inOut)==KErrNone);
+	test(testApprox(inOut,1.557407724655,7.0E-14));				
+
+	test.End();
+	}
+
+LOCAL_C void specialtest()
+//
+// Tests functions which test for specials
+// 
+	{
+
+	test(Math::IsZero(0.0));
+	test(Math::IsZero(KNegZeroTReal64));
+	test(Math::IsZero(0.0));
+	test(!Math::IsZero(1.0));
+	test(!Math::IsZero(KPosInfTReal64));
+	test(!Math::IsZero(KNaNTReal64));
+ 	test(!Math::IsZero(K5EMinus324Real64));
+
+	test(Math::IsNaN(KNaNTReal64));
+	test(!Math::IsNaN(KPosInfTReal64));
+	test(!Math::IsNaN(KNegInfTReal64));
+	test(!Math::IsNaN(0.0));
+	test(!Math::IsNaN(1.0));
+
+	test(Math::IsInfinite(KPosInfTReal64));
+	test(Math::IsInfinite(KNegInfTReal64));
+	test(!Math::IsInfinite(KNaNTReal64));
+	test(!Math::IsInfinite(0.0));
+	test(!Math::IsInfinite(KMaxTReal64));
+
+	test(!Math::IsFinite(KPosInfTReal64));
+	test(!Math::IsFinite(KNegInfTReal64));
+	test(!Math::IsFinite(KNaNTReal64));
+	test(Math::IsFinite(0.0));
+	test(Math::IsFinite(KMaxTReal64));
+	test(Math::IsFinite(5E-324));	
+	test(Math::IsFinite(1.0));
+	}
+
+void _matherr(TExcType aType)
+//
+// Dummy function to handle exceptions
+//
+	{
+
+	test.Printf(_L("_matherr: Exception type %u handled\n"),TUint(aType));
+	}
+
+GLDEF_C TInt E32Main()
+    {
+	test.Title();
+
+	test.Start(_L("Assorted tests"));
+	AssortedTests();
+
+	test.Next(_L("sqrtest1(KSqhf,1.0)"));
+    sqrtest1(KSqhf,1.0);
+	test.Next(_L("sqrtest1(1.0,1.41421356238)"));
+    sqrtest1(1.0,1.41421356238);
+	test.Next(_L("sqrtest2"));
+    sqrtest2();                  
+
+	test.Next(_L("logtest"));
+    logtest();
+	test.Next(_L("lntest1"));
+    lntest1();
+	test.Next(_L("lntest2"));
+    lntest2();
+	test.Next(_L("lntest3"));
+    lntest3();
+	test.Next(_L("lntest4"));
+    lntest4();
+
+	test.Next(_L("exptest1"));
+    exptest1();
+	test.Next(_L("exptest2(-0.0625,-.9375,1.0625)"));
+    exptest2(-0.0625,-0.9375,1.0625);
+	test.Next(_L("exptest2(-29.0/16.0),1.0,88.0)"));
+    exptest2((-29.0/16.0),1.0,88.0);
+	test.Next(_L("exptest2(-29.0/16.0),-1.0,-88.0)"));
+    exptest2((-29.0/16.0),-1.0,-88.0);
+	test.Next(_L("exptest3"));
+    exptest3();
+
+	test.Next(_L("powtest1"));
+    powtest1();
+	test.Next(_L("powtest2(.5,1.0)"));
+    powtest2(.5,1.0);
+	test.Next(_L("powtest2(1.0,1.0E33)"));
+    powtest2(1.0,1.0E33);
+	test.Next(_L("powtest3"));
+    powtest3();
+	test.Next(_L("powtest4"));
+    powtest4();
+	test.Next(_L("powtest5"));
+    powtest5();
+	test.Next(_L("powtest6"));
+    powtest6();
+	
+	test.Next(_L("pow10test"));
+	pow10test();
+														
+	test.Next(_L("sintest1(3*KPi,3.5*KPi)"));
+    sintest1(3*KPi,3.5*KPi);
+	test.Next(_L("sintest1(3*KPi,3.5*KPi)"));
+    sintest1(6*KPi,6.5*KPi);
+	test.Next(_L("sintest2"));
+    sintest2();
+	test.Next(_L("sintest3"));    
+	sintest3();
+	test.Next(_L("sintest4"));
+    sintest4();
+//	test.Next(_L("sintest5"));		// this test is no longer valid
+//	sintest5();
+
+	test.Next(_L("costest1"));
+	costest1();
+	test.Next(_L("costest2"));
+	costest2();
+	test.Next(_L("costest3"));
+	costest3();
+	test.Next(_L("costest4"));
+	costest4();
+//	test.Next(_L("costest5"));		// this test is no longer valid
+//	costest5();
+
+	test.Next(_L("tantest1(-.25*KPi,.25*KPi)"));                                            
+    tantest1(-.25*KPi,.25*KPi);
+	test.Next(_L("tantest1(.875*KPi,1.125*KPi)"));
+    tantest1(.875*KPi,1.125*KPi);
+	test.Next(_L("tantest1(6*KPi,6.25*KPi)"));
+    tantest1(6*KPi,6.25*KPi);
+	test.Next(_L("tantest2"));
+    tantest2();   
+	test.Next(_L("tantest3"));
+    tantest3();
+	test.Next(_L("tantest4"));
+    tantest4();
+//	test.Next(_L("tantest5"));		// this test is no longer valid
+//	tantest5();
+
+	test.Next(_L("astest1(-.125,0.125,15,0)"));
+    astest1(-.125,0.125,15,0);
+	test.Next(_L("astest1(-.125,0.125,15,1)"));
+    astest1(-.125,0.125,15,1);
+	test.Next(_L("astest2"));
+    astest2();
+	test.Next(_L("astest3"));
+    astest3();
+	test.Next(_L("astest4(0,1)"));
+    astest4(0,1);
+	test.Next(_L("astest4(1,1)"));
+    astest4(1,1);
+	test.Next(_L("astest4(1,-1)"));
+    astest4(1,-1);
+		  
+	test.Next(_L("attest1"));
+    attest1();
+	test.Next(_L("attest2"));
+    attest2();
+	test.Next(_L("attest3"));
+    attest3();
+	test.Next(_L("attest4"));
+    attest4();
+	test.Next(_L("attest5"));
+    attest5();
+
+    test.Next(_L("inttest1"));
+    inttest1();	
+	test.Next(_L("intitest2"));
+    inttest2();	
+	test.Next(_L("inttest3"));
+    inttest3();	
+	test.Next(_L("inttest4"));
+	inttest4();	
+
+	test.Next(_L("fractest1"));
+    fractest1();	
+	test.Next(_L("fractest2"));
+	fractest2();
+
+	test.Next(_L("modtest1"));
+    modtest1();
+	test.Next(_L("modtest2"));
+    modtest2();
+
+	test.Next(_L("Test duplicate parameters"));
+	DuplicateTest();
+
+	test.Next(_L("Test Math::Is...() functions"));
+	specialtest();
+
+	test.End();
+	return(KErrNone);
+    }
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32test/math/t_math.h	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,60 @@
+// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32test\math\t_math.h
+// Copy of e32\umath\um_std.h for E32\TMATH directory
+// 
+//
+
+
+#include <e32math.h>
+#include <e32std.h>
+#include <e32test.h>
+
+struct SReal32
+    {
+    unsigned man:23;
+    unsigned exp:8;
+    unsigned sign:1;
+    };
+
+#if defined(__DOUBLE_WORDS_SWAPPED__)
+struct SReal64
+    {
+    unsigned msm:20;
+    unsigned exp:11;
+    unsigned sign:1;
+    TUint lsm;
+    };
+#define DVAL(m0,m1,m2,m3,e)     {(TUint)((m0<<16)|m1),e+KExponentBias,0,(TUint)((m2<<16)|m3)}
+#else
+struct SReal64
+    {
+    TUint lsm;
+    unsigned msm:20;
+    unsigned exp:11;
+    unsigned sign:1;
+    };
+#define DVAL(m0,m1,m2,m3,e)     {(TUint)((m2<<16)|m3),(TUint)((m0<<16)|m1),e+KExponentBias,0}
+#endif
+
+enum TMathPanic
+    {
+	EMathDivideByZero,
+	EMathOverflow,
+	EMathUnderflow,
+	EMathBadOperand,
+    EMathUnknownError
+    };
+
+GLREF_C void Panic(TMathPanic aPanic);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32test/math/t_math2.cpp	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,25364 @@
+/*
+* Copyright (c) 1997-2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Symbian Foundation License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+* e32test\math\t_math2.cpp
+*
+*/
+
+
+/**
+Overview:
+	Test accuracy of functions in the maths library.
+
+API Information:
+	Math. 
+
+Details:
+	- Test division and remainders of specified data is as per IEEE 754 standards.
+	- Calculate sine, cosine, tangent of specified number and test its accuracy is
+	  as expected.
+	- Calculate exponential, Logarithm, Square root, Arctangent, Arcsine of 
+	  specified number and test its accuracy is as expected.
+	- Calculate the power of value raised to specified real value is as expected. 
+
+Platforms/Drives/Compatibility:
+	All 
+
+Assumptions/Requirement/Pre-requisites:
+	
+Failures and causes:
+	
+Base Port information:
+*/
+
+#include <e32std.h>
+#include <e32test.h>
+#include <e32math.h>
+
+
+LOCAL_D RTest test(_L("T_MATH2"));
+
+LOCAL_D TUint32 IEEERemainderTestVectors[]=
+	{
+	// IEEE Remainder test vector data - 6 words per test
+	// dividend high, dividend low, divisor high, divisor low, result high, result low
+
+	// java lang spec tests
+	0x7fffffff, 0xffffffff, 0x40080000, 0x00000000, 0x7fffffff, 0xffffffff,
+	0x40080000, 0x00000000, 0x7fffffff, 0xffffffff, 0x7fffffff, 0xffffffff,
+	0x7ff00000, 0x00000000, 0x40080000, 0x00000000, 0x7fffffff, 0xffffffff,
+	0xfff00000, 0x00000000, 0x40080000, 0x00000000, 0x7fffffff, 0xffffffff,
+	0x40080000, 0x00000000, 0x00000000, 0x00000000, 0x7fffffff, 0xffffffff,
+	0x40080000, 0x00000000, 0x80000000, 0x00000000, 0x7fffffff, 0xffffffff,
+	0x40080000, 0x00000000, 0x7ff00000, 0x00000000, 0x40080000, 0x00000000,
+	0x40080000, 0x00000000, 0xfff00000, 0x00000000, 0x40080000, 0x00000000,
+	// Interval tests with first index from -1.000000e+04 to 1.000000e+05 by 4.375340e+02 and second index from -1.000000e+01 to 1.000000e+01 by 3.789500e+00
+	0xc0c38800, 0x00000000, 0xc0240000, 0x00000000, 0x80000000, 0x00000000,
+	0xc0c38800, 0x00000000, 0xc018d78d, 0x4fdf3b64, 0xbff1851e, 0xb851f460,
+	0xc0c38800, 0x00000000, 0xc0035e35, 0x3f7ced91, 0x3ff26a7e, 0xf9db15a6,
+	0xc0c38800, 0x00000000, 0x3ff5e560, 0x4189374c, 0xbfd7b645, 0xa1caa6f0,
+	0xc0c38800, 0x00000000, 0x4014a1ca, 0xc083126e, 0x3ff5cac0, 0x83125ca8,
+	0xc0c38800, 0x00000000, 0x4021e51e, 0xb851eb85, 0x400a70a3, 0xd70a3b58,
+	0xc0c2ad3b, 0xa5e353f8, 0xc0240000, 0x00000000, 0xc003ba5e, 0x353f8000,
+	0xc0c2ad3b, 0xa5e353f8, 0xc018d78d, 0x4fdf3b64, 0x3ffb4395, 0x81061640,
+	0xc0c2ad3b, 0xa5e353f8, 0xc0035e35, 0x3f7ced91, 0x3fdef9db, 0x22d09a70,
+	0xc0c2ad3b, 0xa5e353f8, 0x3ff5e560, 0x4189374c, 0x3fe39581, 0x0624dd20,
+	0xc0c2ad3b, 0xa5e353f8, 0x4014a1ca, 0xc083126e, 0x3fddd2f1, 0xa9fb8a40,
+	0xc0c2ad3b, 0xa5e353f8, 0x4021e51e, 0xb851eb85, 0x40034ac0, 0x83126984,
+	0xc0c1d277, 0x4bc6a7f0, 0xc0240000, 0x00000000, 0xc013ba5e, 0x353f8000,
+	0xc0c1d277, 0x4bc6a7f0, 0xc018d78d, 0x4fdf3b64, 0xbffb51eb, 0x851eccb0,
+	0xc0c1d277, 0x4bc6a7f0, 0xc0035e35, 0x3f7ced91, 0xbfc76c8b, 0x43964370,
+	0xc0c1d277, 0x4bc6a7f0, 0x3ff5e560, 0x4189374c, 0x3fcced91, 0x68727c80,
+	0xc0c1d277, 0x4bc6a7f0, 0x4014a1ca, 0xc083126e, 0xbfdb851e, 0xb8525e20,
+	0xc0c1d277, 0x4bc6a7f0, 0x4021e51e, 0xb851eb85, 0x3ff849ba, 0x5e352f60,
+	0xc0c0f7b2, 0xf1a9fbe8, 0xc0240000, 0x00000000, 0x4004d0e5, 0x60418000,
+	0xc0c0f7b2, 0xf1a9fbe8, 0xc018d78d, 0x4fdf3b64, 0x3ff176c8, 0xb4393df0,
+	0xc0c0f7b2, 0xf1a9fbe8, 0xc0035e35, 0x3f7ced91, 0xbfeb3333, 0x33336ef0,
+	0xc0c0f7b2, 0xf1a9fbe8, 0x3ff5e560, 0x4189374c, 0xbfc47ae1, 0x47ae7b80,
+	0xc0c0f7b2, 0xf1a9fbe8, 0x4014a1ca, 0xc083126e, 0xbff5374b, 0xc6a811a0,
+	0xc0c0f7b2, 0xf1a9fbe8, 0x4021e51e, 0xb851eb85, 0x3fe3fbe7, 0x6c8b1770,
+	0xc0c01cee, 0x978d4fe0, 0xc0240000, 0x00000000, 0x3fc16872, 0xb0200000,
+	0xc0c01cee, 0x978d4fe0, 0xc018d78d, 0x4fdf3b64, 0xc0028f5c, 0x28f5d280,
+	0xc0c01cee, 0x978d4fe0, 0xc0035e35, 0x3f7ced91, 0x3feced91, 0x68726940,
+	0xc0c01cee, 0x978d4fe0, 0x3ff5e560, 0x4189374c, 0xbfe178d4, 0xfdf3dce0,
+	0xc0c01cee, 0x978d4fe0, 0x4014a1ca, 0xc083126e, 0xc001c6a7, 0xef9dc5dc,
+	0xc0c01cee, 0x978d4fe0, 0x4021e51e, 0xb851eb85, 0xbfd1374b, 0xc6a85fc0,
+	0xc0be8454, 0x7ae147b0, 0xc0240000, 0x00000000, 0xc002a3d7, 0x0a3d8000,
+	0xc0be8454, 0x7ae147b0, 0xc018d78d, 0x4fdf3b64, 0x3fdea7ef, 0x9db19680,
+	0xc0be8454, 0x7ae147b0, 0xc0035e35, 0x3f7ced91, 0x3fce5604, 0x18922cb0,
+	0xc0be8454, 0x7ae147b0, 0x3ff5e560, 0x4189374c, 0x3fdbef9d, 0xb22ca770,
+	0xc0be8454, 0x7ae147b0, 0x4014a1ca, 0xc083126e, 0x400051eb, 0x851ea1f4,
+	0xc0be8454, 0x7ae147b0, 0x4021e51e, 0xb851eb85, 0xbff29999, 0x9999bb98,
+	0xc0bccecb, 0xc6a7efa0, 0xc0240000, 0x00000000, 0xc0132f1a, 0x9fbe8000,
+	0xc0bccecb, 0xc6a7efa0, 0xc018d78d, 0x4fdf3b64, 0xc00775c2, 0x8f5c3ea8,
+	0xc0bccecb, 0xc6a7efa0, 0xc0035e35, 0x3f7ced91, 0xbfdb851e, 0xb852a5d0,
+	0xc0bccecb, 0xc6a7efa0, 0x3ff5e560, 0x4189374c, 0x3fa9db22, 0xd0e15b80,
+	0xc0bccecb, 0xc6a7efa0, 0x4014a1ca, 0xc083126e, 0x3ff24dd2, 0xf1a9c9d0,
+	0xc0bccecb, 0xc6a7efa0, 0x4021e51e, 0xb851eb85, 0xc00072b0, 0x20c4afa0,
+	0xc0bb1943, 0x126e9790, 0xc0240000, 0x00000000, 0x4005e76c, 0x8b438000,
+	0xc0bb1943, 0x126e9790, 0xc018d78d, 0x4fdf3b64, 0xbfc11687, 0x2b039580,
+	0xc0bb1943, 0x126e9790, 0xc0035e35, 0x3f7ced91, 0xbff18d4f, 0xdf3b987e,
+	0xc0bb1943, 0x126e9790, 0x3ff5e560, 0x4189374c, 0xbfd578d4, 0xfdf45090,
+	0xc0bb1943, 0x126e9790, 0x4014a1ca, 0xc083126e, 0x3fcfbe76, 0xc8b27dc0,
+	0xc0bb1943, 0x126e9790, 0x4021e51e, 0xb851eb85, 0xc0079893, 0x74bc8174,
+	0xc0b963ba, 0x5e353f80, 0xc0240000, 0x00000000, 0x3fd16872, 0xb0200000,
+	0xc0b963ba, 0x5e353f80, 0xc018d78d, 0x4fdf3b64, 0x400552f1, 0xa9fbcbf8,
+	0xc0b963ba, 0x5e353f80, 0xc0035e35, 0x3f7ced91, 0x3fe50624, 0xdd2ea734,
+	0xc0b963ba, 0x5e353f80, 0x3ff5e560, 0x4189374c, 0x3fe4b439, 0x58100850,
+	0xc0b963ba, 0x5e353f80, 0x4014a1ca, 0xc083126e, 0xbfe4bc6a, 0x7efa54c0,
+	0xc0b963ba, 0x5e353f80, 0x4021e51e, 0xb851eb85, 0xc00ebe76, 0xc8b45348,
+	0xc0b7ae31, 0xa9fbe770, 0xc0240000, 0x00000000, 0xc0018d4f, 0xdf3b8000,
+	0xc0b7ae31, 0xa9fbe770, 0xc018d78d, 0x4fdf3b64, 0xbfe7df3b, 0x645a9600,
+	0xc0b7ae31, 0xa9fbe770, 0xc0035e35, 0x3f7ced91, 0xbf847ae1, 0x47cdb800,
+	0xc0b7ae31, 0xa9fbe770, 0x3ff5e560, 0x4189374c, 0x3fd0b439, 0x580f94a0,
+	0xc0b7ae31, 0xa9fbe770, 0x4014a1ca, 0xc083126e, 0xbff8b439, 0x5810a478,
+	0xc0b7ae31, 0xa9fbe770, 0x4021e51e, 0xb851eb85, 0x4010d810, 0x624dc47c,
+	0xc0b5f8a8, 0xf5c28f60, 0xc0240000, 0x00000000, 0xc012a3d7, 0x0a3d8000,
+	0xc0b5f8a8, 0xf5c28f60, 0xc018d78d, 0x4fdf3b64, 0x40006c8b, 0x43955fd0,
+	0xc0b5f8a8, 0xf5c28f60, 0xc0035e35, 0x3f7ced91, 0xbfe5a9fb, 0xe76d14f4,
+	0xc0b5f8a8, 0xf5c28f60, 0x3ff5e560, 0x4189374c, 0xbfc00000, 0x0001cec0,
+	0xc0b5f8a8, 0xf5c28f60, 0x4014a1ca, 0xc083126e, 0xc003851e, 0xb8520f48,
+	0xc0b5f8a8, 0xf5c28f60, 0x4021e51e, 0xb851eb85, 0x400a8a3d, 0x70a3b724,
+	0xc0b44320, 0x41893750, 0xc0240000, 0x00000000, 0x4006fdf3, 0xb6458000,
+	0xc0b44320, 0x41893750, 0xc018d78d, 0x4fdf3b64, 0xbff5bc6a, 0x7efa2350,
+	0xc0b44320, 0x41893750, 0xc0035e35, 0x3f7ced91, 0x3ff13b64, 0x5a1c619e,
+	0xc0b44320, 0x41893750, 0x3ff5e560, 0x4189374c, 0xbfe05a1c, 0xac08b1b0,
+	0xc0b44320, 0x41893750, 0x4014a1ca, 0xc083126e, 0x3ffd26e9, 0x78d4b110,
+	0xc0b44320, 0x41893750, 0x4021e51e, 0xb851eb85, 0x4003645a, 0x1cabe550,
+	0xc0b28d97, 0x8d4fdf40, 0xc0240000, 0x00000000, 0x3fda1cac, 0x08300000,
+	0xc0b28d97, 0x8d4fdf40, 0xc018d78d, 0x4fdf3b64, 0x3ff70c49, 0xba5de750,
+	0xc0b28d97, 0x8d4fdf40, 0xc0035e35, 0x3f7ced91, 0x3fda3d70, 0xa3d5ca50,
+	0xc0b28d97, 0x8d4fdf40, 0x3ff5e560, 0x4189374c, 0x3fde2d0e, 0x5602fdd0,
+	0xc0b28d97, 0x8d4fdf40, 0x4014a1ca, 0xc083126e, 0x3feda1ca, 0xc0826df0,
+	0xc0b28d97, 0x8d4fdf40, 0x4021e51e, 0xb851eb85, 0x3ff87ced, 0x916826f8,
+	0xc0b0d80e, 0xd9168730, 0xc0240000, 0x00000000, 0xc00076c8, 0xb4398000,
+	0xc0b0d80e, 0xd9168730, 0xc018d78d, 0x4fdf3b64, 0xbfff8937, 0x4bc6fba0,
+	0xc0b0d80e, 0xd9168730, 0xc0035e35, 0x3f7ced91, 0xbfd072b0, 0x20c5f1d8,
+	0xc0b0d80e, 0xd9168730, 0x3ff5e560, 0x4189374c, 0x3fb5e353, 0xf7ca0740,
+	0xc0b0d80e, 0xd9168730, 0x4014a1ca, 0xc083126e, 0x3f9eb851, 0xeb6f3800,
+	0xc0b0d80e, 0xd9168730, 0x4021e51e, 0xb851eb85, 0x3fe4624d, 0xd2f106a0,
+	0xc0ae450c, 0x49ba5e3f, 0xc0240000, 0x00000000, 0xc0121893, 0x74bc7e00,
+	0xc0ae450c, 0x49ba5e3f, 0xc018d78d, 0x4fdf3b64, 0x3fea7ef9, 0xdb222e00,
+	0xc0ae450c, 0x49ba5e3f, 0xc0035e35, 0x3f7ced91, 0xbfed9168, 0x72b0c700,
+	0xc0ae450c, 0x49ba5e3f, 0x3ff5e560, 0x4189374c, 0xbfd33b64, 0x5a1dda30,
+	0xc0ae450c, 0x49ba5e3f, 0x4014a1ca, 0xc083126e, 0xbfebb645, 0xa1cb6a70,
+	0xc0ae450c, 0x49ba5e3f, 0x4021e51e, 0xb851eb85, 0xbfd06a7e, 0xf9dc6160,
+	0xc0aad9fa, 0xe147ae1e, 0xc0240000, 0x00000000, 0x4008147a, 0xe1478800,
+	0xc0aad9fa, 0xe147ae1e, 0xc018d78d, 0x4fdf3b64, 0xc004ab02, 0x0c49e1f8,
+	0xc0aad9fa, 0xe147ae1e, 0xc0035e35, 0x3f7ced91, 0x3fea8f5c, 0x28f52130,
+	0xc0aad9fa, 0xe147ae1e, 0x3ff5e560, 0x4189374c, 0x3fe5d2f1, 0xa9fb5380,
+	0xc0aad9fa, 0xe147ae1e, 0x4014a1ca, 0xc083126e, 0xbffc3126, 0xe9792750,
+	0xc0aad9fa, 0xe147ae1e, 0x4021e51e, 0xb851eb85, 0xbff26666, 0x6666b400,
+	0xc0a76ee9, 0x78d4fdfd, 0xc0240000, 0x00000000, 0x3fe16872, 0xb0203000,
+	0xc0a76ee9, 0x78d4fdfd, 0xc018d78d, 0x4fdf3b64, 0x3fcb9581, 0x06227580,
+	0xc0a76ee9, 0x78d4fdfd, 0xc0035e35, 0x3f7ced91, 0x3fc4dd2f, 0x1a9d4c70,
+	0xc0a76ee9, 0x78d4fdfd, 0x3ff5e560, 0x4189374c, 0x3fd2f1a9, 0xfbe64b00,
+	0xc0a76ee9, 0x78d4fdfd, 0x4014a1ca, 0xc083126e, 0x4003ffff, 0xffffd828,
+	0xc0a76ee9, 0x78d4fdfd, 0x4021e51e, 0xb851eb85, 0xc0005916, 0x872b27d4,
+	0xc0a403d8, 0x10624ddc, 0xc0240000, 0x00000000, 0xbffec083, 0x126ee000,
+	0xc0a403d8, 0x10624ddc, 0xc018d78d, 0x4fdf3b64, 0x40081db2, 0x2d0e30a8,
+	0xc0a403d8, 0x10624ddc, 0xc0035e35, 0x3f7ced91, 0xbfe020c4, 0x9ba67af8,
+	0xc0a403d8, 0x10624ddc, 0x3ff5e560, 0x4189374c, 0xbfb70a3d, 0x70a84400,
+	0xc0a403d8, 0x10624ddc, 0x4014a1ca, 0xc083126e, 0x3ff9a9fb, 0xe76c3e38,
+	0xc0a403d8, 0x10624ddc, 0x4021e51e, 0xb851eb85, 0xc0077ef9, 0xdb22f5a8,
+	0xc0a098c6, 0xa7ef9dbb, 0xc0240000, 0x00000000, 0xc0118d4f, 0xdf3b7600,
+	0xc0a098c6, 0xa7ef9dbb, 0xc018d78d, 0x4fdf3b64, 0xbfd96872, 0xb021e680,
+	0xc0a098c6, 0xa7ef9dbb, 0xc0035e35, 0x3f7ced91, 0xbff2bc6a, 0x7efa2486,
+	0xc0a098c6, 0xa7ef9dbb, 0x3ff5e560, 0x4189374c, 0xbfde76c8, 0xb43a6d00,
+	0xc0a098c6, 0xa7ef9dbb, 0x4014a1ca, 0xc083126e, 0x3fe6a7ef, 0x9db19840,
+	0xc0a098c6, 0xa7ef9dbb, 0x4021e51e, 0xb851eb85, 0xc00ea4dd, 0x2f1ac37c,
+	0xc09a5b6a, 0x7ef9db34, 0xc0240000, 0x00000000, 0x40092b02, 0x0c499800,
+	0xc09a5b6a, 0x7ef9db34, 0xc018d78d, 0x4fdf3b64, 0x4003374b, 0xc6a7cc80,
+	0xc09a5b6a, 0x7ef9db34, 0xc0035e35, 0x3f7ced91, 0x3fe2a7ef, 0x9db19f24,
+	0xc09a5b6a, 0x7ef9db34, 0x3ff5e560, 0x4189374c, 0x3fe0353f, 0x7ced0a18,
+	0xc09a5b6a, 0x7ef9db34, 0x4014a1ca, 0xc083126e, 0xbfc81062, 0x4dd52fc0,
+	0xc09a5b6a, 0x7ef9db34, 0x4021e51e, 0xb851eb85, 0x4010e4dd, 0x2f1a8e62,
+	0xc0938547, 0xae147af2, 0xc0240000, 0x00000000, 0x3fe5c28f, 0x5c287000,
+	0xc0938547, 0xae147af2, 0xc018d78d, 0x4fdf3b64, 0xbff026e9, 0x78d541f0,
+	0xc0938547, 0xae147af2, 0xc0035e35, 0x3f7ced91, 0xbfb58106, 0x24e17780,
+	0xc0938547, 0xae147af2, 0x3ff5e560, 0x4189374c, 0x3fbed916, 0x8726e0c0,
+	0xc0938547, 0xae147af2, 0x4014a1ca, 0xc083126e, 0xbff15810, 0x624e1810,
+	0xc0938547, 0xae147af2, 0x4021e51e, 0xb851eb85, 0x400aa3d7, 0x0a3d4ef0,
+	0xc0895e49, 0xba5e3561, 0xc0240000, 0x00000000, 0xbffc9374, 0xbc6ac200,
+	0xc0895e49, 0xba5e3561, 0xc018d78d, 0x4fdf3b64, 0x3ffca1ca, 0xc082ceb0,
+	0xc0895e49, 0xba5e3561, 0xc0035e35, 0x3f7ced91, 0xbfe80831, 0x26ea0104,
+	0xc0895e49, 0xba5e3561, 0x3ff5e560, 0x4189374c, 0xbfd0fdf3, 0xb646abd0,
+	0xc0895e49, 0xba5e3561, 0x4014a1ca, 0xc083126e, 0xbfffae14, 0x7ae18c28,
+	0xc0895e49, 0xba5e3561, 0x4021e51e, 0xb851eb85, 0x40037df3, 0xb645801c,
+	0xc0776408, 0x3126e9bc, 0xc0240000, 0x00000000, 0xc011020c, 0x49ba6f00,
+	0xc0776408, 0x3126e9bc, 0xc018d78d, 0x4fdf3b64, 0xbff9f3b6, 0x45a20e40,
+	0xc0776408, 0x3126e9bc, 0xc0035e35, 0x3f7ced91, 0x3ff00c49, 0xba5df196,
+	0xc0776408, 0x3126e9bc, 0x3ff5e560, 0x4189374c, 0xbfe4d916, 0x872b87e8,
+	0xc0776408, 0x3126e9bc, 0x4014a1ca, 0xc083126e, 0x40024189, 0x374ba4bc,
+	0xc0776408, 0x3126e9bc, 0x4021e51e, 0xb851eb85, 0x3ff8b020, 0xc49b6290,
+	0x404fa418, 0x9374ba50, 0xc0240000, 0x00000000, 0x400a4189, 0x374ba500,
+	0x404fa418, 0x9374ba50, 0xc018d78d, 0x4fdf3b64, 0x3ff2d4fd, 0xf3b60260,
+	0x404fa418, 0x9374ba50, 0xc0035e35, 0x3f7ced91, 0x3fd58106, 0x24dc2230,
+	0x404fa418, 0x9374ba50, 0x3ff5e560, 0x4189374c, 0x3fd52f1a, 0x9fbd6960,
+	0x404fa418, 0x9374ba50, 0x4014a1ca, 0xc083126e, 0x3ff62d0e, 0x5603d560,
+	0x404fa418, 0x9374ba50, 0x4021e51e, 0xb851eb85, 0x3fe4c8b4, 0x395789d0,
+	0x407f4d0e, 0x56041850, 0xc0240000, 0x00000000, 0x3fea1cac, 0x0830a000,
+	0x407f4d0e, 0x56041850, 0xc018d78d, 0x4fdf3b64, 0xc001e041, 0x89376d48,
+	0x407f4d0e, 0x56041850, 0xc0035e35, 0x3f7ced91, 0xbfd52f1a, 0x9fbf81f8,
+	0x407f4d0e, 0x56041850, 0x3ff5e560, 0x4189374c, 0xbfac28f5, 0xc297d500,
+	0x407f4d0e, 0x56041850, 0x4014a1ca, 0xc083126e, 0x3fdf5c28, 0xf5c18520,
+	0x407f4d0e, 0x56041850, 0x4021e51e, 0xb851eb85, 0xbfcf3b64, 0x5a1ec600,
+	0x408d52cc, 0xccccccab, 0xc0240000, 0x00000000, 0xbffa6666, 0x6666aa00,
+	0x408d52cc, 0xccccccab, 0xc018d78d, 0x4fdf3b64, 0x3fe21062, 0x4dd26c20,
+	0x408d52cc, 0xccccccab, 0xc0035e35, 0x3f7ced91, 0xbfefef9d, 0xb22d9310,
+	0x408d52cc, 0xccccccab, 0x3ff5e560, 0x4189374c, 0xbfdc3958, 0x10635ea0,
+	0x408d52cc, 0xccccccab, 0x4014a1ca, 0xc083126e, 0xbfd9fbe7, 0x6c8c4b40,
+	0x408d52cc, 0xccccccab, 0x4021e51e, 0xb851eb85, 0xbff23333, 0x33337668,
+	0x40957f89, 0x374bc697, 0xc0240000, 0x00000000, 0xc01076c8, 0xb4396900,
+	0x40957f89, 0x374bc697, 0xc018d78d, 0x4fdf3b64, 0xc006c6a7, 0xef9dd370,
+	0x40957f89, 0x374bc697, 0xc0035e35, 0x3f7ced91, 0x3fe83126, 0xe9785120,
+	0x40957f89, 0x374bc697, 0x3ff5e560, 0x4189374c, 0x3fe153f7, 0xced88d48,
+	0x40957f89, 0x374bc697, 0x4014a1ca, 0xc083126e, 0xbff4d4fd, 0xf3b686e8,
+	0x40957f89, 0x374bc697, 0x4021e51e, 0xb851eb85, 0xc0003f7c, 0xed918a08,
+	0x409c55ac, 0x083126d8, 0xc0240000, 0x00000000, 0x400b5810, 0x624db000,
+	0x409c55ac, 0x083126d8, 0xc018d78d, 0x4fdf3b64, 0xbfa89374, 0xbc730800,
+	0x409c55ac, 0x083126d8, 0xc0035e35, 0x3f7ced91, 0x3fb6c8b4, 0x3953d860,
+	0x409c55ac, 0x083126d8, 0x3ff5e560, 0x4189374c, 0x3fc3e76c, 0x8b415d20,
+	0x409c55ac, 0x083126d8, 0x4014a1ca, 0xc083126e, 0xc0019581, 0x0624fe80,
+	0x409c55ac, 0x083126d8, 0x4021e51e, 0xb851eb85, 0xc0076560, 0x418959dc,
+	0x40a195e7, 0x6c8b438d, 0xc0240000, 0x00000000, 0x3fee76c8, 0xb438d000,
+	0x40a195e7, 0x6c8b438d, 0xc018d78d, 0x4fdf3b64, 0x4006020c, 0x49ba3d30,
+	0x40a195e7, 0x6c8b438d, 0xc0035e35, 0x3f7ced91, 0xbfe27ef9, 0xdb235308,
+	0x40a195e7, 0x6c8b438d, 0x3ff5e560, 0x4189374c, 0xbfcd8106, 0x24df5ae0,
+	0x40a195e7, 0x6c8b438d, 0x4014a1ca, 0xc083126e, 0x40008312, 0x6e976d50,
+	0x40a195e7, 0x6c8b438d, 0x4021e51e, 0xb851eb85, 0xc00e8b43, 0x958127b0,
+	0x40a500f8, 0xd4fdf3ae, 0xc0240000, 0x00000000, 0xbff83958, 0x10629000,
+	0x40a500f8, 0xd4fdf3ae, 0xc018d78d, 0x4fdf3b64, 0xbfe522d0, 0xe560c120,
+	0x40a500f8, 0xd4fdf3ae, 0xc0035e35, 0x3f7ced91, 0x3ff2d0e5, 0x60414a94,
+	0x40a500f8, 0xd4fdf3ae, 0x3ff5e560, 0x4189374c, 0xbfe3ba5e, 0x354004b8,
+	0x40a500f8, 0xd4fdf3ae, 0x4014a1ca, 0xc083126e, 0x3ff2b020, 0xc49b6888,
+	0x40a500f8, 0xd4fdf3ae, 0x4021e51e, 0xb851eb85, 0x4010f1a9, 0xfbe75c48,
+	0x40a86c0a, 0x3d70a3cf, 0xc0240000, 0x00000000, 0xc00fd70a, 0x3d70c400,
+	0x40a86c0a, 0x3d70a3cf, 0xc018d78d, 0x4fdf3b64, 0x40011ba5, 0xe353d908,
+	0x40a86c0a, 0x3d70a3cf, 0xc0035e35, 0x3f7ced91, 0x3fe049ba, 0x5e34c714,
+	0x40a86c0a, 0x3d70a3cf, 0x3ff5e560, 0x4189374c, 0x3fd76c8b, 0x439477c0,
+	0x40a86c0a, 0x3d70a3cf, 0x4014a1ca, 0xc083126e, 0x3fd16872, 0xb01fd9c0,
+	0x40a86c0a, 0x3d70a3cf, 0x4021e51e, 0xb851eb85, 0x400abd70, 0xa3d6eabc,
+	0x40abd71b, 0xa5e353f0, 0xc0240000, 0x00000000, 0x400c6e97, 0x8d4fc000,
+	0x40abd71b, 0xa5e353f0, 0xc018d78d, 0x4fdf3b64, 0xbff45e35, 0x3f7d28e0,
+	0x40abd71b, 0xa5e353f0, 0xc0035e35, 0x3f7ced91, 0xbfc43958, 0x10641c00,
+	0x40abd71b, 0xa5e353f0, 0x3ff5e560, 0x4189374c, 0xbf947ae1, 0x47be4400,
+	0x40abd71b, 0xa5e353f0, 0x4014a1ca, 0xc083126e, 0xbfe3f7ce, 0xd916f750,
+	0x40abd71b, 0xa5e353f0, 0x4021e51e, 0xb851eb85, 0x4003978d, 0x4fdf1ce8,
+	0x40af422d, 0x0e560411, 0xc0240000, 0x00000000, 0x3ff16872, 0xb0208800,
+	0x40af422d, 0x0e560411, 0xc018d78d, 0x4fdf3b64, 0x3ff86a7e, 0xf9dae9c0,
+	0x40af422d, 0x0e560411, 0xc0035e35, 0x3f7ced91, 0xbfea6666, 0x6666d514,
+	0x40af422d, 0x0e560411, 0x3ff5e560, 0x4189374c, 0xbfd9fbe7, 0x6c8c4040,
+	0x40af422d, 0x0e560411, 0x4014a1ca, 0xc083126e, 0xbff851eb, 0x851eedc0,
+	0x40af422d, 0x0e560411, 0x4021e51e, 0xb851eb85, 0x3ff8e353, 0xf7ce9e28,
+	0x40b1569f, 0x3b645a19, 0xc0240000, 0x00000000, 0xbff60c49, 0xba5e7000,
+	0x40b1569f, 0x3b645a19, 0xc018d78d, 0x4fdf3b64, 0xbffe2b02, 0x0c49f130,
+	0x40b1569f, 0x3b645a19, 0xc0035e35, 0x3f7ced91, 0x3fedba5e, 0x353f131c,
+	0x40b1569f, 0x3b645a19, 0x3ff5e560, 0x4189374c, 0x3fe272b0, 0x20c42078,
+	0x40b1569f, 0x3b645a19, 0x4014a1ca, 0xc083126e, 0xc00353f7, 0xced92fec,
+	0x40b1569f, 0x3b645a19, 0x4021e51e, 0xb851eb85, 0x3fe52f1a, 0x9fbe0500,
+	0x40b30c27, 0xef9db229, 0xc0240000, 0x00000000, 0xc00ec083, 0x126eb800,
+	0x40b30c27, 0xef9db229, 0xc018d78d, 0x4fdf3b64, 0x3fed3b64, 0x5a1c32e0,
+	0x40b30c27, 0xef9db229, 0xc0035e35, 0x3f7ced91, 0x3fd0c49b, 0xa5e26a10,
+	0x40b30c27, 0xef9db229, 0x3ff5e560, 0x4189374c, 0x3fc8624d, 0xd2ef89e0,
+	0x40b30c27, 0xef9db229, 0x4014a1ca, 0xc083126e, 0x3ffd8937, 0x4bc66fc8,
+	0x40b30c27, 0xef9db229, 0x4021e51e, 0xb851eb85, 0xbfcda1ca, 0xc0850940,
+	0x40b4c1b0, 0xa3d70a39, 0xc0240000, 0x00000000, 0x400d851e, 0xb851c800,
+	0x40b4c1b0, 0xa3d70a39, 0xc018d78d, 0x4fdf3b64, 0xc003fbe7, 0x6c8b64c0,
+	0x40b4c1b0, 0xa3d70a39, 0xc0035e35, 0x3f7ced91, 0xbfd9eb85, 0x1eb95218,
+	0x40b4c1b0, 0xa3d70a39, 0x3ff5e560, 0x4189374c, 0xbfc90624, 0xdd316e20,
+	0x40b4c1b0, 0xa3d70a39, 0x4014a1ca, 0xc083126e, 0x3fee6666, 0x6665eb60,
+	0x40b4c1b0, 0xa3d70a39, 0x4021e51e, 0xb851eb85, 0xbff20000, 0x000044d0,
+	0x40b67739, 0x58106249, 0xc0240000, 0x00000000, 0x3ff39581, 0x06249000,
+	0x40b67739, 0x58106249, 0xc018d78d, 0x4fdf3b64, 0x3fd34395, 0x81050480,
+	0x40b67739, 0x58106249, 0xc0035e35, 0x3f7ced91, 0xbff126e9, 0x78d54390,
+	0x40b67739, 0x58106249, 0x3ff5e560, 0x4189374c, 0xbfe29ba5, 0xe3549988,
+	0x40b67739, 0x58106249, 0x4014a1ca, 0xc083126e, 0x3faba5e3, 0x53ef7300,
+	0x40b67739, 0x58106249, 0x4021e51e, 0xb851eb85, 0xc00025e3, 0x53f7f43c,
+	0x40b82cc2, 0x0c49ba59, 0xc0240000, 0x00000000, 0xbff3df3b, 0x645a7000,
+	0x40b82cc2, 0x0c49ba59, 0xc018d78d, 0x4fdf3b64, 0x4008cccc, 0xcccca5e0,
+	0x40b82cc2, 0x0c49ba59, 0xc0035e35, 0x3f7ced91, 0x3fe5d2f1, 0xa9fb5110,
+	0x40b82cc2, 0x0c49ba59, 0x3ff5e560, 0x4189374c, 0x3fd9a9fb, 0xe76b2e20,
+	0x40b82cc2, 0x0c49ba59, 0x4014a1ca, 0xc083126e, 0xbfeaf1a9, 0xfbe7fd00,
+	0x40b82cc2, 0x0c49ba59, 0x4021e51e, 0xb851eb85, 0xc0074bc6, 0xa7efc610,
+	0x40b9e24a, 0xc0831269, 0xc0240000, 0x00000000, 0xc00da9fb, 0xe76cb800,
+	0x40b9e24a, 0xc0831269, 0xc018d78d, 0x4fdf3b64, 0xbfd3ef9d, 0xb22e5cc0,
+	0x40b9e24a, 0xc0831269, 0xc0035e35, 0x3f7ced91, 0x3f8eb851, 0xeb5cbf00,
+	0x40b9e24a, 0xc0831269, 0x3ff5e560, 0x4189374c, 0x3f8eb851, 0xeb564400,
+	0x40b9e24a, 0xc0831269, 0x4014a1ca, 0xc083126e, 0xbffbced9, 0x16877898,
+	0x40b9e24a, 0xc0831269, 0x4021e51e, 0xb851eb85, 0xc00e71a9, 0xfbe797e4,
+	0x40bb97d3, 0x74bc6a79, 0xc0240000, 0x00000000, 0x400e9ba5, 0xe353c800,
+	0x40bb97d3, 0x74bc6a79, 0xc018d78d, 0x4fdf3b64, 0x4003e666, 0x666639b8,
+	0x40bb97d3, 0x74bc6a79, 0xc0035e35, 0x3f7ced91, 0xbfe4dd2f, 0x1aa06b18,
+	0x40bb97d3, 0x74bc6a79, 0x3ff5e560, 0x4189374c, 0xbfd7be76, 0xc8b5c9e0,
+	0x40bb97d3, 0x74bc6a79, 0x4014a1ca, 0xc083126e, 0x40043126, 0xe978ab84,
+	0x40bb97d3, 0x74bc6a79, 0x4021e51e, 0xb851eb85, 0x4010fe76, 0xc8b4222e,
+	0x40bd4d5c, 0x28f5c289, 0xc0240000, 0x00000000, 0x3ff5c28f, 0x5c289000,
+	0x40bd4d5c, 0x28f5c289, 0xc018d78d, 0x4fdf3b64, 0xbfed9168, 0x72b0df00,
+	0x40bd4d5c, 0x28f5c289, 0xc0035e35, 0x3f7ced91, 0x3ff1a1ca, 0xc082b68c,
+	0x40bd4d5c, 0x28f5c289, 0x3ff5e560, 0x4189374c, 0x3fe39168, 0x72af4ba8,
+	0x40bd4d5c, 0x28f5c289, 0x4014a1ca, 0xc083126e, 0x3ffa0c49, 0xba5ddcf0,
+	0x40bd4d5c, 0x28f5c289, 0x4021e51e, 0xb851eb85, 0x400ad70a, 0x3d707288,
+	0x40bf02e4, 0xdd2f1a99, 0xc0240000, 0x00000000, 0xbff1b22d, 0x0e567000,
+	0x40bf02e4, 0xdd2f1a99, 0xc018d78d, 0x4fdf3b64, 0x3ffdffff, 0xffff9b20,
+	0x40bf02e4, 0xdd2f1a99, 0xc0035e35, 0x3f7ced91, 0x3fdbd70a, 0x3d6f1e08,
+	0x40bf02e4, 0xdd2f1a99, 0x3ff5e560, 0x4189374c, 0x3fccdd2f, 0x1a9c36a0,
+	0x40bf02e4, 0xdd2f1a99, 0x4014a1ca, 0xc083126e, 0x3fe76c8b, 0x4394c5b0,
+	0x40bf02e4, 0xdd2f1a99, 0x4021e51e, 0xb851eb85, 0x4003b126, 0xe978a0b4,
+	0x40c05c36, 0xc8b43955, 0xc0240000, 0x00000000, 0xc00c9374, 0xbc6ab000,
+	0x40c05c36, 0xc8b43955, 0xc018d78d, 0x4fdf3b64, 0xbff89581, 0x062537d0,
+	0x40c05c36, 0xc8b43955, 0xc0035e35, 0x3f7ced91, 0xbfcdb22d, 0x0e58bc40,
+	0x40c05c36, 0xc8b43955, 0x3ff5e560, 0x4189374c, 0xbfc48b43, 0x95844160,
+	0x40c05c36, 0xc8b43955, 0x4014a1ca, 0xc083126e, 0xbfc4fdf3, 0xb6483a00,
+	0x40c05c36, 0xc8b43955, 0x4021e51e, 0xb851eb85, 0x3ff91687, 0x2b01adc0,
+	0x40c136fb, 0x22d0e55d, 0xc0240000, 0x00000000, 0x400fb22d, 0x0e55d000,
+	0x40c136fb, 0x22d0e55d, 0xc018d78d, 0x4fdf3b64, 0x3ff43333, 0x3332d2d0,
+	0x40c136fb, 0x22d0e55d, 0xc0035e35, 0x3f7ced91, 0xbfecc49b, 0xa5e40d24,
+	0x40c136fb, 0x22d0e55d, 0x3ff5e560, 0x4189374c, 0xbfe17ced, 0x91694e58,
+	0x40c136fb, 0x22d0e55d, 0x4014a1ca, 0xc083126e, 0xbff0f5c2, 0x8f5c8158,
+	0x40c136fb, 0x22d0e55d, 0x4021e51e, 0xb851eb85, 0x3fe59581, 0x06241430,
+	0x40c211bf, 0x7ced9165, 0xc0240000, 0x00000000, 0x3ff7ef9d, 0xb22ca000,
+	0x40c211bf, 0x7ced9165, 0xc018d78d, 0x4fdf3b64, 0xc0013126, 0xe9790810,
+	0x40c211bf, 0x7ced9165, 0xc0035e35, 0x3f7ced91, 0x3feb5c28, 0xf5c1cb0c,
+	0x40c211bf, 0x7ced9165, 0x3ff5e560, 0x4189374c, 0x3fdbe76c, 0x8b41c480,
+	0x40c211bf, 0x7ced9165, 0x4014a1ca, 0xc083126e, 0xbfff4bc6, 0xa7effb70,
+	0x40c211bf, 0x7ced9165, 0x4021e51e, 0xb851eb85, 0xbfcc0831, 0x26eccc80,
+	0x40c2ec83, 0xd70a3d6d, 0xc0240000, 0x00000000, 0xbfef0a3d, 0x70a4c000,
+	0x40c2ec83, 0xd70a3d6d, 0xc018d78d, 0x4fdf3b64, 0x3fe4cccc, 0xcccbf500,
+	0x40c2ec83, 0xd70a3d6d, 0xc0035e35, 0x3f7ced91, 0x3fc81062, 0x4dcfb3e0,
+	0x40c2ec83, 0xd70a3d6d, 0x3ff5e560, 0x4189374c, 0x3fa99999, 0x998a4400,
+	0x40c2ec83, 0xd70a3d6d, 0x4014a1ca, 0xc083126e, 0x400272b0, 0x20c46a18,
+	0x40c2ec83, 0xd70a3d6d, 0x4021e51e, 0xb851eb85, 0xbff1cccc, 0xcccd3d38,
+	0x40c3c748, 0x3126e975, 0xc0240000, 0x00000000, 0xc00b7ced, 0x9168b000,
+	0x40c3c748, 0x3126e975, 0xc018d78d, 0x4fdf3b64, 0xc006178d, 0x4fdf7438,
+	0x40c3c748, 0x3126e975, 0xc0035e35, 0x3f7ced91, 0xbfdea7ef, 0x9db3e238,
+	0x40c3c748, 0x3126e975, 0x3ff5e560, 0x4189374c, 0xbfd58106, 0x24df3380,
+	0x40c3c748, 0x3126e975, 0x4014a1ca, 0xc083126e, 0x3ff68f5c, 0x28f55a18,
+	0x40c3c748, 0x3126e975, 0x4021e51e, 0xb851eb85, 0xc0000c49, 0xba5e7070,
+	0x40c4a20c, 0x8b43957d, 0xc0240000, 0x00000000, 0x4010645a, 0x1cabe800,
+	0x40c4a20c, 0x8b43957d, 0xc018d78d, 0x4fdf3b64, 0x3fa33333, 0x33244600,
+	0x40c4a20c, 0x8b43957d, 0xc0035e35, 0x3f7ced91, 0xbff25604, 0x1893e798,
+	0x40c4a20c, 0x8b43957d, 0x3ff5e560, 0x4189374c, 0x3fe4b020, 0xc49a96d8,
+	0x40c4a20c, 0x8b43957d, 0x4014a1ca, 0xc083126e, 0x3fe072b0, 0x20c3c000,
+	0x40c4a20c, 0x8b43957d, 0x4021e51e, 0xb851eb85, 0xc007322d, 0x0e564244,
+	0x40c57cd0, 0xe5604185, 0xc0240000, 0x00000000, 0x3ffa1cac, 0x0830a000,
+	0x40c57cd0, 0xe5604185, 0xc018d78d, 0x4fdf3b64, 0x4006b126, 0xe9789668,
+	0x40c57cd0, 0xe5604185, 0xc0035e35, 0x3f7ced91, 0x3fe374bc, 0x6a7e0900,
+	0x40c57cd0, 0xe5604185, 0x3ff5e560, 0x4189374c, 0x3fd0ac08, 0x3124b1b0,
+	0x40c57cd0, 0xe5604185, 0x4014a1ca, 0xc083126e, 0xbfd872b0, 0x20c66860,
+	0x40c57cd0, 0xe5604185, 0x4021e51e, 0xb851eb85, 0xc00e5810, 0x624e1418,
+	0x40c65795, 0x3f7ced8d, 0xc0240000, 0x00000000, 0xbfeab020, 0xc49cc000,
+	0x40c65795, 0x3f7ced8d, 0xc018d78d, 0x4fdf3b64, 0xbfe26666, 0x66676c40,
+	0x40c65795, 0x3f7ced8d, 0xc0035e35, 0x3f7ced91, 0xbfae353f, 0x7cfd5140,
+	0x40c65795, 0x3f7ced8d, 0x3ff5e560, 0x4189374c, 0xbfc01062, 0x4dd794a0,
+	0x40c65795, 0x3f7ced8d, 0x4014a1ca, 0xc083126e, 0xbff472b0, 0x20c51430,
+	0x40c65795, 0x3f7ced8d, 0x4021e51e, 0xb851eb85, 0x40110b43, 0x9580e414,
+	0x40c73259, 0x99999995, 0xc0240000, 0x00000000, 0xc00a6666, 0x6666b000,
+	0x40c73259, 0x99999995, 0xc018d78d, 0x4fdf3b64, 0x4001cac0, 0x83122a40,
+	0x40c73259, 0x99999995, 0xc0035e35, 0x3f7ced91, 0xbfe73b64, 0x5a1db328,
+	0x40c73259, 0x99999995, 0x3ff5e560, 0x4189374c, 0xbfe05e35, 0x3f7e2328,
+	0x40c73259, 0x99999995, 0x4014a1ca, 0xc083126e, 0xc001645a, 0x1cac4724,
+	0x40c73259, 0x99999995, 0x4021e51e, 0xb851eb85, 0x400af0a3, 0xd709f654,
+	0x40c80d1d, 0xf3b6459d, 0xc0240000, 0x00000000, 0x4010ef9d, 0xb22ce800,
+	0x40c80d1d, 0xf3b6459d, 0xc018d78d, 0x4fdf3b64, 0xbff30000, 0x00008e70,
+	0x40c80d1d, 0xf3b6459d, 0xc0035e35, 0x3f7ced91, 0x3ff072b0, 0x20c41284,
+	0x40c80d1d, 0xf3b6459d, 0x3ff5e560, 0x4189374c, 0x3fde24dd, 0x2f181ae0,
+	0x40c80d1d, 0xf3b6459d, 0x4014a1ca, 0xc083126e, 0x4000b439, 0x581020ac,
+	0x40c80d1d, 0xf3b6459d, 0x4021e51e, 0xb851eb85, 0x4003cac0, 0x83122480,
+	0x40c8e7e2, 0x4dd2f1a5, 0xc0240000, 0x00000000, 0x3ffc49ba, 0x5e34a000,
+	0x40c8e7e2, 0x4dd2f1a5, 0xc018d78d, 0x4fdf3b64, 0x3ff9c8b4, 0x39577c30,
+	0x40c8e7e2, 0x4dd2f1a5, 0xc0035e35, 0x3f7ced91, 0x3fd71a9f, 0xbe748de8,
+	0x40c8e7e2, 0x4dd2f1a5, 0x3ff5e560, 0x4189374c, 0x3fb5c28f, 0x5c1e7b80,
+	0x40c8e7e2, 0x4dd2f1a5, 0x4014a1ca, 0xc083126e, 0x3ff3126e, 0x978cc740,
+	0x40c8e7e2, 0x4dd2f1a5, 0x4021e51e, 0xb851eb85, 0x3ff949ba, 0x5e34a558,
+	0x40c9c2a6, 0xa7ef9dad, 0xc0240000, 0x00000000, 0xbfe65604, 0x1894c000,
+	0x40c9c2a6, 0xa7ef9dad, 0xc018d78d, 0x4fdf3b64, 0xbffccccc, 0xcccd66c0,
+	0x40c9c2a6, 0xa7ef9dad, 0xc0035e35, 0x3f7ced91, 0xbfd39581, 0x06272e40,
+	0x40c9c2a6, 0xa7ef9dad, 0x3ff5e560, 0x4189374c, 0xbfd34395, 0x8108dd20,
+	0x40c9c2a6, 0xa7ef9dad, 0x4014a1ca, 0xc083126e, 0x3fd2f1a9, 0xfbe534a0,
+	0x40c9c2a6, 0xa7ef9dad, 0x4021e51e, 0xb851eb85, 0x3fe5fbe7, 0x6c8a0360,
+	0x40ca9d6b, 0x020c49b5, 0xc0240000, 0x00000000, 0xc0094fdf, 0x3b64b000,
+	0x40ca9d6b, 0x020c49b5, 0xc018d78d, 0x4fdf3b64, 0x3feff7ce, 0xd91547c0,
+	0x40ca9d6b, 0x020c49b5, 0xc0035e35, 0x3f7ced91, 0xbfef22d0, 0xe5617534,
+	0x40ca9d6b, 0x020c49b5, 0x3ff5e560, 0x4189374c, 0x3fe5ced9, 0x1685c208,
+	0x40ca9d6b, 0x020c49b5, 0x4014a1ca, 0xc083126e, 0xbfe33333, 0x333459e0,
+	0x40ca9d6b, 0x020c49b5, 0x4021e51e, 0xb851eb85, 0xbfca6e97, 0x8d550fc0,
+	0x40cb782f, 0x5c28f5bd, 0xc0240000, 0x00000000, 0x40117ae1, 0x47ade800,
+	0x40cb782f, 0x5c28f5bd, 0xc018d78d, 0x4fdf3b64, 0xc0034ccc, 0xcccd1f88,
+	0x40cb782f, 0x5c28f5bd, 0xc0035e35, 0x3f7ced91, 0x3fe8fdf3, 0xb64462fc,
+	0x40cb782f, 0x5c28f5bd, 0x3ff5e560, 0x4189374c, 0x3fd2e978, 0xd4fb0810,
+	0x40cb782f, 0x5c28f5bd, 0x4014a1ca, 0xc083126e, 0xbff7ef9d, 0xb22da708,
+	0x40cb782f, 0x5c28f5bd, 0x4021e51e, 0xb851eb85, 0xbff19999, 0x999a45a0,
+	0x40cc52f3, 0xb645a1c5, 0xc0240000, 0x00000000, 0x3ffe76c8, 0xb438a000,
+	0x40cc52f3, 0xb645a1c5, 0xc018d78d, 0x4fdf3b64, 0x3fd8bc6a, 0x7ef72e40,
+	0x40cc52f3, 0xb645a1c5, 0xc0035e35, 0x3f7ced91, 0x3fbd2f1a, 0x9fb42740,
+	0x40cc52f3, 0xb645a1c5, 0x3ff5e560, 0x4189374c, 0xbfb72b02, 0x0c55cfc0,
+	0x40cc52f3, 0xb645a1c5, 0x4014a1ca, 0xc083126e, 0xc00322d0, 0xe5609090,
+	0x40cc52f3, 0xb645a1c5, 0x4021e51e, 0xb851eb85, 0xbfffe560, 0x4189e948,
+	0x40cd2db8, 0x10624dcd, 0xc0240000, 0x00000000, 0xbfe1fbe7, 0x6c8cc000,
+	0x40cd2db8, 0x10624dcd, 0xc018d78d, 0x4fdf3b64, 0xc0083333, 0x33338bb0,
+	0x40cd2db8, 0x10624dcd, 0xc0035e35, 0x3f7ced91, 0xbfe1b22d, 0x0e57592c,
+	0x40cd2db8, 0x10624dcd, 0x3ff5e560, 0x4189374c, 0xbfde7ef9, 0xdb25eff0,
+	0x40cd2db8, 0x10624dcd, 0x4014a1ca, 0xc083126e, 0x3ffdeb85, 0x1eb7ae80,
+	0x40cd2db8, 0x10624dcd, 0x4021e51e, 0xb851eb85, 0xc0071893, 0x74bcc678,
+	0x40ce087c, 0x6a7ef9d5, 0xc0240000, 0x00000000, 0xc0083958, 0x1062b000,
+	0x40ce087c, 0x6a7ef9d5, 0xc018d78d, 0x4fdf3b64, 0xbfcced91, 0x68786600,
+	0x40ce087c, 0x6a7ef9d5, 0xc0035e35, 0x3f7ced91, 0x3ff3374b, 0xc6a73f82,
+	0x40ce087c, 0x6a7ef9d5, 0x3ff5e560, 0x4189374c, 0x3fe03126, 0xe97738a0,
+	0x40ce087c, 0x6a7ef9d5, 0x4014a1ca, 0xc083126e, 0x3fef2b02, 0x0c4868d0,
+	0x40ce087c, 0x6a7ef9d5, 0x4021e51e, 0xb851eb85, 0xc00e3e76, 0xc8b4984c,
+	0x40cee340, 0xc49ba5dd, 0xc0240000, 0x00000000, 0x40120624, 0xdd2ee800,
+	0x40cee340, 0xc49ba5dd, 0xc018d78d, 0x4fdf3b64, 0x40049581, 0x06247ef0,
+	0x40cee340, 0xc49ba5dd, 0xc0035e35, 0x3f7ced91, 0x3fe11687, 0x2b00a0f0,
+	0x40cee340, 0xc49ba5dd, 0x3ff5e560, 0x4189374c, 0x3fbeb851, 0xeb77d500,
+	0x40cee340, 0xc49ba5dd, 0x4014a1ca, 0xc083126e, 0x3fb3f7ce, 0xd90ba500,
+	0x40cee340, 0xc49ba5dd, 0x4021e51e, 0xb851eb85, 0x40111810, 0x624da1fa,
+	0x40cfbe05, 0x1eb851e5, 0xc0240000, 0x00000000, 0x400051eb, 0x851e5000,
+	0x40cfbe05, 0x1eb851e5, 0xc018d78d, 0x4fdf3b64, 0xbfead4fd, 0xf3b7ca20,
+	0x40cfbe05, 0x1eb851e5, 0xc0035e35, 0x3f7ced91, 0xbfc10624, 0xdd34f490,
+	0x40cfbe05, 0x1eb851e5, 0x3ff5e560, 0x4189374c, 0xbfd10624, 0xdd3286c0,
+	0x40cfbe05, 0x1eb851e5, 0x4014a1ca, 0xc083126e, 0xbfea2d0e, 0x56057f90,
+	0x40cfbe05, 0x1eb851e5, 0x4021e51e, 0xb851eb85, 0x400b0a3d, 0x70a37220,
+	0x40d04c64, 0xbc6a7ef7, 0xc0240000, 0x00000000, 0xbfdb4395, 0x81090000,
+	0x40d04c64, 0xbc6a7ef7, 0xc018d78d, 0x4fdf3b64, 0x3fff5e35, 0x3f7c4590,
+	0x40d04c64, 0xbc6a7ef7, 0xc0035e35, 0x3f7ced91, 0xbfe99999, 0x999adb38,
+	0x40d04c64, 0xbc6a7ef7, 0x3ff5e560, 0x4189374c, 0xbfe4dd2f, 0x1aa14160,
+	0x40d04c64, 0xbc6a7ef7, 0x4014a1ca, 0xc083126e, 0xbffb6c8b, 0x439619e0,
+	0x40d04c64, 0xbc6a7ef7, 0x4021e51e, 0xb851eb85, 0x4003e45a, 0x1cabb04c,
+	0x40d0b9c6, 0xe978d4fb, 0xc0240000, 0x00000000, 0xc00722d0, 0xe560a000,
+	0x40d0b9c6, 0xe978d4fb, 0xc018d78d, 0x4fdf3b64, 0xbff7374b, 0xc6a89d60,
+	0x40d0b9c6, 0xe978d4fb, 0xc0035e35, 0x3f7ced91, 0x3fee872b, 0x020afcf8,
+	0x40d0b9c6, 0xe978d4fb, 0x3ff5e560, 0x4189374c, 0x3fd526e9, 0x78d1de70,
+	0x40d0b9c6, 0xe978d4fb, 0x4014a1ca, 0xc083126e, 0x4004624d, 0xd2f15ae0,
+	0x40d0b9c6, 0xe978d4fb, 0x4021e51e, 0xb851eb85, 0x3ff97ced, 0x9167bcf0,
+	0x40d12729, 0x16872aff, 0xc0240000, 0x00000000, 0x40129168, 0x72aff000,
+	0x40d12729, 0x16872aff, 0xc018d78d, 0x4fdf3b64, 0x3ff59168, 0x72af6d40,
+	0x40d12729, 0x16872aff, 0xc0035e35, 0x3f7ced91, 0x3fd25e35, 0x3f7a3dc8,
+	0x40d12729, 0x16872aff, 0x3ff5e560, 0x4189374c, 0xbfac6a7e, 0xf9f4ec80,
+	0x40d12729, 0x16872aff, 0x4014a1ca, 0xc083126e, 0x3ffa6e97, 0x8d4f3ba8,
+	0x40d12729, 0x16872aff, 0x4021e51e, 0xb851eb85, 0x3fe6624d, 0xd2f03290,
+	0x40d1948b, 0x43958103, 0xc0240000, 0x00000000, 0x40016872, 0xb0206000,
+	0x40d1948b, 0x43958103, 0xc018d78d, 0x4fdf3b64, 0xc000820c, 0x49babad8,
+	0x40d1948b, 0x43958103, 0xc0035e35, 0x3f7ced91, 0xbfd851eb, 0x85217e60,
+	0x40d1948b, 0x43958103, 0x3ff5e560, 0x4189374c, 0xbfdc4189, 0x374f1990,
+	0x40d1948b, 0x43958103, 0x4014a1ca, 0xc083126e, 0x3fe83126, 0xe9778320,
+	0x40d1948b, 0x43958103, 0x4021e51e, 0xb851eb85, 0xbfc8d4fd, 0xf3bc5300,
+	0x40d201ed, 0x70a3d707, 0xc0240000, 0x00000000, 0xbfd28f5c, 0x28f90000,
+	0x40d201ed, 0x70a3d707, 0xc018d78d, 0x4fdf3b64, 0x3fe78937, 0x4bc529e0,
+	0x40d201ed, 0x70a3d707, 0xc0035e35, 0x3f7ced91, 0xbff0c083, 0x126f4ea2,
+	0x40d201ed, 0x70a3d707, 0x3ff5e560, 0x4189374c, 0x3fe14fdf, 0x3b62a3d0,
+	0x40d201ed, 0x70a3d707, 0x4014a1ca, 0xc083126e, 0xbfc1eb85, 0x1ebdc440,
+	0x40d201ed, 0x70a3d707, 0x4021e51e, 0xb851eb85, 0xbff16666, 0x66672e08,
+	0x40d26f4f, 0x9db22d0b, 0xc0240000, 0x00000000, 0xc0060c49, 0xba5ea000,
+	0x40d26f4f, 0x9db22d0b, 0xc018d78d, 0x4fdf3b64, 0xc0056872, 0xb0212700,
+	0x40d26f4f, 0x9db22d0b, 0xc0035e35, 0x3f7ced91, 0x3fe69fbe, 0x76c73aec,
+	0x40d26f4f, 0x9db22d0b, 0x3ff5e560, 0x4189374c, 0x3fc3d70a, 0x3d699740,
+	0x40d26f4f, 0x9db22d0b, 0x4014a1ca, 0xc083126e, 0xbff09374, 0xbc6b32a0,
+	0x40d26f4f, 0x9db22d0b, 0x4021e51e, 0xb851eb85, 0xbfffb22d, 0x0e56d1b0,
+	0x40d2dcb1, 0xcac0830f, 0xc0240000, 0x00000000, 0x40131cac, 0x0830f000,
+	0x40d2dcb1, 0xcac0830f, 0xc018d78d, 0x4fdf3b64, 0x3fbf7ced, 0x915bca00,
+	0x40d2dcb1, 0xcac0830f, 0xc0035e35, 0x3f7ced91, 0x3fa47ae1, 0x4795cd80,
+	0x40d2dcb1, 0xcac0830f, 0x3ff5e560, 0x4189374c, 0xbfcd9168, 0x72b760c0,
+	0x40d2dcb1, 0xcac0830f, 0x4014a1ca, 0xc083126e, 0xbffee978, 0xd4feacb8,
+	0x40d2dcb1, 0xcac0830f, 0x4021e51e, 0xb851eb85, 0xc006fef9, 0xdb233aac,
+	0x40d34a13, 0xf7ced913, 0xc0240000, 0x00000000, 0x40027ef9, 0xdb226000,
+	0x40d34a13, 0xf7ced913, 0xc018d78d, 0x4fdf3b64, 0x40076041, 0x8936e3a0,
+	0x40d34a13, 0xf7ced913, 0xc0035e35, 0x3f7ced91, 0xbfe41062, 0x4dd4813c,
+	0x40d34a13, 0xf7ced913, 0x3ff5e560, 0x4189374c, 0xbfe3be76, 0xc8b61630,
+	0x40d34a13, 0xf7ced913, 0x4014a1ca, 0xc083126e, 0x4002a3d7, 0x0a3d1174,
+	0x40d34a13, 0xf7ced913, 0x4021e51e, 0xb851eb85, 0xc00e24dd, 0x2f1b0c80,
+	0x40d3b776, 0x24dd2f17, 0xc0240000, 0x00000000, 0xbfc3b645, 0xa1d20000,
+	0x40d3b776, 0x24dd2f17, 0xc018d78d, 0x4fdf3b64, 0xbfdf53f7, 0xcedc6ec0,
+	0x40d3b776, 0x24dd2f17, 0xc0035e35, 0x3f7ced91, 0x3ff20831, 0x26e8ab7a,
+	0x40d3b776, 0x24dd2f17, 0x3ff5e560, 0x4189374c, 0x3fd7645a, 0x1ca834d0,
+	0x40d3b776, 0x24dd2f17, 0x4014a1ca, 0xc083126e, 0x3ff6f1a9, 0xfbe6a8d0,
+	0x40d3b776, 0x24dd2f17, 0x4021e51e, 0xb851eb85, 0x401124dd, 0x2f1a67e0,
+	0x40d424d8, 0x51eb851b, 0xc0240000, 0x00000000, 0xc004f5c2, 0x8f5ca000,
+	0x40d424d8, 0x51eb851b, 0xc018d78d, 0x4fdf3b64, 0x400279db, 0x22d07778,
+	0x40d424d8, 0x51eb851b, 0xc0035e35, 0x3f7ced91, 0x3fdd70a3, 0xd706f1c0,
+	0x40d424d8, 0x51eb851b, 0x3ff5e560, 0x4189374c, 0xbf94fdf3, 0xb6847300,
+	0x40d424d8, 0x51eb851b, 0x4014a1ca, 0xc083126e, 0x3fe1374b, 0xc6a65d70,
+	0x40d424d8, 0x51eb851b, 0x4021e51e, 0xb851eb85, 0x400b23d7, 0x0a3cfdec,
+	0x40d4923a, 0x7ef9db1f, 0xc0240000, 0x00000000, 0x4013a7ef, 0x9db1f000,
+	0x40d4923a, 0x7ef9db1f, 0xc018d78d, 0x4fdf3b64, 0xbff1a1ca, 0xc083f400,
+	0x40d4923a, 0x7ef9db1f, 0xc0035e35, 0x3f7ced91, 0xbfca7ef9, 0xdb2994d0,
+	0x40d4923a, 0x7ef9db1f, 0x3ff5e560, 0x4189374c, 0xbfda0418, 0x9378c330,
+	0x40d4923a, 0x7ef9db1f, 0x4014a1ca, 0xc083126e, 0xbfd6e978, 0xd5012d80,
+	0x40d4923a, 0x7ef9db1f, 0x4021e51e, 0xb851eb85, 0x4003fdf3, 0xb6452c18,
+	0x40d4ff9c, 0xac083123, 0xc0240000, 0x00000000, 0x40039581, 0x06246000,
+	0x40d4ff9c, 0xac083123, 0xc018d78d, 0x4fdf3b64, 0x3ffb26e9, 0x78d416a0,
+	0x40d4ff9c, 0xac083123, 0xc0035e35, 0x3f7ced91, 0xbfebf7ce, 0xd9184348,
+	0x40d4ff9c, 0xac083123, 0x3ff5e560, 0x4189374c, 0x3fe26e97, 0x8d4dcf00,
+	0x40d4ff9c, 0xac083123, 0x4014a1ca, 0xc083126e, 0xbff41062, 0x4dd3c578,
+	0x40d4ff9c, 0xac083123, 0x4021e51e, 0xb851eb85, 0x3ff9b020, 0xc49ab488,
+	0x40d56cfe, 0xd9168727, 0xc0240000, 0x00000000, 0xbf926e97, 0x8d900000,
+	0x40d56cfe, 0xd9168727, 0xc018d78d, 0x4fdf3b64, 0xbffb6e97, 0x8d50cc50,
+	0x40d56cfe, 0xd9168727, 0xc0035e35, 0x3f7ced91, 0x3fec28f5, 0xc28d94e8,
+	0x40d56cfe, 0xd9168727, 0x3ff5e560, 0x4189374c, 0x3fc851eb, 0x85164400,
+	0x40d56cfe, 0xd9168727, 0x4014a1ca, 0xc083126e, 0xc0013333, 0x33339fc8,
+	0x40d56cfe, 0xd9168727, 0x4021e51e, 0xb851eb85, 0x3fe6c8b4, 0x395621c0,
+	0x40d5da61, 0x0624dd2b, 0xc0240000, 0x00000000, 0xc003df3b, 0x645aa000,
+	0x40d5da61, 0x0624dd2b, 0xc018d78d, 0x4fdf3b64, 0x3ff15a1c, 0xac073e50,
+	0x40d5da61, 0x0624dd2b, 0xc0035e35, 0x3f7ced91, 0x3fcb4395, 0x80fedb50,
+	0x40d5da61, 0x0624dd2b, 0x3ff5e560, 0x4189374c, 0xbfc91687, 0x2b0ab400,
+	0x40d5da61, 0x0624dd2b, 0x4014a1ca, 0xc083126e, 0x4000e560, 0x4188c808,
+	0x40d5da61, 0x0624dd2b, 0x4021e51e, 0xb851eb85, 0xbfc73b64, 0x5a249640,
+	0x40d647c3, 0x3333332f, 0xc0240000, 0x00000000, 0xc013cccc, 0xcccd1000,
+	0x40d647c3, 0x3333332f, 0xc018d78d, 0x4fdf3b64, 0xc0029db2, 0x2d0ed250,
+	0x40d647c3, 0x3333332f, 0xc0035e35, 0x3f7ced91, 0xbfdd0e56, 0x041c4e80,
+	0x40d647c3, 0x3333332f, 0x3ff5e560, 0x4189374c, 0xbfe29fbe, 0x76caeb00,
+	0x40d647c3, 0x3333332f, 0x4014a1ca, 0xc083126e, 0x3ff374bc, 0x6a7e15f8,
+	0x40d647c3, 0x3333332f, 0x4021e51e, 0xb851eb85, 0xbff13333, 0x33343670,
+	0x40d6b525, 0x60418933, 0xc0240000, 0x00000000, 0x4004ac08, 0x31266000,
+	0x40d6b525, 0x60418933, 0xc018d78d, 0x4fdf3b64, 0x3fde353f, 0x7ce99800,
+	0x40d6b525, 0x60418933, 0xc0035e35, 0x3f7ced91, 0xbff1ef9d, 0xb22e02aa,
+	0x40d6b525, 0x60418933, 0x3ff5e560, 0x4189374c, 0x3fd9a1ca, 0xc07e8b30,
+	0x40d6b525, 0x60418933, 0x4014a1ca, 0xc083126e, 0x3fd47ae1, 0x47aa6f80,
+	0x40d6b525, 0x60418933, 0x4021e51e, 0xb851eb85, 0xbfff7ef9, 0xdb23da18,
+	0x40d72287, 0x8d4fdf37, 0xc0240000, 0x00000000, 0x3fbe353f, 0x7cdc0000,
+	0x40d72287, 0x8d4fdf37, 0xc018d78d, 0x4fdf3b64, 0xc0078418, 0x93753e78,
+	0x40d72287, 0x8d4fdf37, 0xc0035e35, 0x3f7ced91, 0x3fe44189, 0x3749d2dc,
+	0x40d72287, 0x8d4fdf37, 0x3ff5e560, 0x4189374c, 0x3f8db22d, 0x0dc1e600,
+	0x40d72287, 0x8d4fdf37, 0x4014a1ca, 0xc083126e, 0xbfe26e97, 0x8d51bc70,
+	0x40d72287, 0x8d4fdf37, 0x4021e51e, 0xb851eb85, 0xc006e560, 0x4189bee0,
+	0x40d78fe9, 0xba5e353b, 0xc0240000, 0x00000000, 0xc002c8b4, 0x3958a000,
+	0x40d78fe9, 0xba5e353b, 0xc018d78d, 0x4fdf3b64, 0xbfc1fbe7, 0x6c939280,
+	0x40d78fe9, 0xba5e353b, 0xc0035e35, 0x3f7ced91, 0xbfa16872, 0xb040b380,
+	0x40d78fe9, 0xba5e353b, 0x3ff5e560, 0x4189374c, 0xbfd7c6a7, 0xefa26cd0,
+	0x40d78fe9, 0xba5e353b, 0x4014a1ca, 0xc083126e, 0xbff78d4f, 0xdf3c5850,
+	0x40d78fe9, 0xba5e353b, 0x4021e51e, 0xb851eb85, 0xc00e0b43, 0x958190b4,
+	0x40d7fd4b, 0xe76c8b3f, 0xc0240000, 0x00000000, 0xc0134189, 0x374c1000,
+	0x40d7fd4b, 0xe76c8b3f, 0xc018d78d, 0x4fdf3b64, 0x4005449b, 0xa5e2cc28,
+	0x40d7fd4b, 0xe76c8b3f, 0xc0035e35, 0x3f7ced91, 0xbfe66e97, 0x8d51e94c,
+	0x40d7fd4b, 0xe76c8b3f, 0x3ff5e560, 0x4189374c, 0x3fe38d4f, 0xdf38fa30,
+	0x40d7fd4b, 0xe76c8b3f, 0x4014a1ca, 0xc083126e, 0xc002f1a9, 0xfbe7e934,
+	0x40d7fd4b, 0xe76c8b3f, 0x4021e51e, 0xb851eb85, 0x401131a9, 0xfbe725c6,
+	0x40d86aae, 0x147ae143, 0xc0240000, 0x00000000, 0x4005c28f, 0x5c286000,
+	0x40d86aae, 0x147ae143, 0xc018d78d, 0x4fdf3b64, 0xbfe81893, 0x74be9540,
+	0x40d86aae, 0x147ae143, 0xc0035e35, 0x3f7ced91, 0x3ff0d916, 0x8729f772,
+	0x40d86aae, 0x147ae143, 0x3ff5e560, 0x4189374c, 0x3fcccccc, 0xccc2f0c0,
+	0x40d86aae, 0x147ae143, 0x4014a1ca, 0xc083126e, 0x3ffe4dd2, 0xf1a8fd38,
+	0x40d86aae, 0x147ae143, 0x4021e51e, 0xb851eb85, 0x400b3d70, 0xa3d679b8,
+	0x40d8d810, 0x41893747, 0xc0240000, 0x00000000, 0x3fd04189, 0x37470000,
+	0x40d8d810, 0x41893747, 0xc018d78d, 0x4fdf3b64, 0x40005e35, 0x3f7c6000,
+	0x40d8d810, 0x41893747, 0xc0035e35, 0x3f7ced91, 0x3fd8b439, 0x580c21a0,
+	0x40d8d810, 0x41893747, 0x3ff5e560, 0x4189374c, 0xbfc49ba5, 0xe35e0740,
+	0x40d8d810, 0x41893747, 0x4014a1ca, 0xc083126e, 0x3fefef9d, 0xb22b0640,
+	0x40d8d810, 0x41893747, 0x4021e51e, 0xb851eb85, 0x4004178d, 0x4fdea7e4,
+	0x40d94572, 0x6e978d4b, 0xc0240000, 0x00000000, 0xc001b22d, 0x0e56a000,
+	0x40d94572, 0x6e978d4b, 0xc018d78d, 0x4fdf3b64, 0xbff5d916, 0x872c22f0,
+	0x40d94572, 0x6e978d4b, 0xc0035e35, 0x3f7ced91, 0xbfd1fbe7, 0x6c8f9a88,
+	0x40d94572, 0x6e978d4b, 0x3ff5e560, 0x4189374c, 0xbfe18106, 0x24dfbfd0,
+	0x40d94572, 0x6e978d4b, 0x4014a1ca, 0xc083126e, 0x3fba1cac, 0x08209080,
+	0x40d94572, 0x6e978d4b, 0x4021e51e, 0xb851eb85, 0x3ff9e353, 0xf7cdac20,
+	0x40d9b2d4, 0x9ba5e34f, 0xc0240000, 0x00000000, 0xc012b645, 0xa1cb1000,
+	0x40d9b2d4, 0x9ba5e34f, 0xc018d78d, 0x4fdf3b64, 0x3ff6ef9d, 0xb22be7b0,
+	0x40d9b2d4, 0x9ba5e34f, 0xc0035e35, 0x3f7ced91, 0xbfee5604, 0x1895ab58,
+	0x40d9b2d4, 0x9ba5e34f, 0x3ff5e560, 0x4189374c, 0x3fdbdf3b, 0x6454e190,
+	0x40d9b2d4, 0x9ba5e34f, 0x4014a1ca, 0xc083126e, 0xbfe96872, 0xb022e220,
+	0x40d9b2d4, 0x9ba5e34f, 0x4021e51e, 0xb851eb85, 0x3fe72f1a, 0x9fbc10f0,
+	0x40da2036, 0xc8b43953, 0xc0240000, 0x00000000, 0x4006d916, 0x872a6000,
+	0x40da2036, 0xc8b43953, 0xc018d78d, 0x4fdf3b64, 0xbfffa5e3, 0x53f8fb40,
+	0x40da2036, 0xc8b43953, 0xc0035e35, 0x3f7ced91, 0x3fe9cac0, 0x83102cd8,
+	0x40da2036, 0xc8b43953, 0x3ff5e560, 0x4189374c, 0x3fa95810, 0x62232c80,
+	0x40da2036, 0xc8b43953, 0x4014a1ca, 0xc083126e, 0xbffb0a3d, 0x70a4eb28,
+	0x40da2036, 0xc8b43953, 0x4021e51e, 0xb851eb85, 0xbfc5a1ca, 0xc08cd980,
+	0x40da8d98, 0xf5c28f57, 0xc0240000, 0x00000000, 0x3fd8f5c2, 0x8f570000,
+	0x40da8d98, 0xf5c28f57, 0xc018d78d, 0x4fdf3b64, 0x3fea45a1, 0xcabe1ec0,
+	0x40da8d98, 0xf5c28f57, 0xc0035e35, 0x3f7ced91, 0x3fc1cac0, 0x83093b10,
+	0x40da8d98, 0xf5c28f57, 0x3ff5e560, 0x4189374c, 0xbfd58937, 0x4bcc1670,
+	0x40da8d98, 0xf5c28f57, 0x4014a1ca, 0xc083126e, 0x40049374, 0xbc69f23c,
+	0x40da8d98, 0xf5c28f57, 0x4021e51e, 0xb851eb85, 0xbff10000, 0x00013ed8,
+	0x40dafafb, 0x22d0e55b, 0xc0240000, 0x00000000, 0xc0009ba5, 0xe354a000,
+	0x40dafafb, 0x22d0e55b, 0xc018d78d, 0x4fdf3b64, 0xc004b958, 0x1062e9c8,
+	0x40dafafb, 0x22d0e55b, 0xc0035e35, 0x3f7ced91, 0xbfe0e560, 0x418b8f50,
+	0x40dafafb, 0x22d0e55b, 0x3ff5e560, 0x4189374c, 0x3fe4ac08, 0x31242560,
+	0x40dafafb, 0x22d0e55b, 0x4014a1ca, 0xc083126e, 0x3ffad0e5, 0x60406a60,
+	0x40dafafb, 0x22d0e55b, 0x4021e51e, 0xb851eb85, 0xbfff4bc6, 0xa7f0e280,
+	0x40db685d, 0x4fdf3b5f, 0xc0240000, 0x00000000, 0xc0122b02, 0x0c4a1000,
+	0x40db685d, 0x4fdf3b5f, 0xc018d78d, 0x4fdf3b64, 0x3fcab020, 0xc491b880,
+	0x40db685d, 0x4fdf3b5f, 0xc0035e35, 0x3f7ced91, 0xbff31eb8, 0x51ecb6b2,
+	0x40db685d, 0x4fdf3b5f, 0x3ff5e560, 0x4189374c, 0x3fd0a3d7, 0x0a37cec0,
+	0x40db685d, 0x4fdf3b5f, 0x4014a1ca, 0xc083126e, 0x3fe8f5c2, 0x8f59e090,
+	0x40db685d, 0x4fdf3b5f, 0x4021e51e, 0xb851eb85, 0xc006cbc6, 0xa7f04314,
+	0x40dbd5bf, 0x7ced9163, 0xc0240000, 0x00000000, 0x4007ef9d, 0xb22c6000,
+	0x40dbd5bf, 0x7ced9163, 0xc018d78d, 0x4fdf3b64, 0x40080f5c, 0x28f520d8,
+	0x40dbd5bf, 0x7ced9163, 0xc0035e35, 0x3f7ced91, 0x3fe1e353, 0xf7cc6acc,
+	0x40dbd5bf, 0x7ced9163, 0x3ff5e560, 0x4189374c, 0xbfc020c4, 0x9bb15a80,
+	0x40dbd5bf, 0x7ced9163, 0x4014a1ca, 0xc083126e, 0xbfbdb22d, 0x0e689d00,
+	0x40dbd5bf, 0x7ced9163, 0x4021e51e, 0xb851eb85, 0xc00df1a9, 0xfbe814e8,
+	0x40dc4321, 0xa9fbe767, 0xc0240000, 0x00000000, 0x3fe0d4fd, 0xf3b38000,
+	0x40dc4321, 0xa9fbe767, 0xc018d78d, 0x4fdf3b64, 0xbfd9db22, 0xd0ea8500,
+	0x40dc4321, 0xa9fbe767, 0xc0035e35, 0x3f7ced91, 0xbfbba5e3, 0x540b9a40,
+	0x40dc4321, 0xa9fbe767, 0x3ff5e560, 0x4189374c, 0xbfe0624d, 0xd2f494a0,
+	0x40dc4321, 0xa9fbe767, 0x4014a1ca, 0xc083126e, 0xbff03126, 0xe97a03e8,
+	0x40dc4321, 0xa9fbe767, 0x4021e51e, 0xb851eb85, 0x40113e76, 0xc8b3e3ac,
+	0x40dcb083, 0xd70a3d6b, 0xc0240000, 0x00000000, 0xbfff0a3d, 0x70a54000,
+	0x40dcb083, 0xd70a3d6b, 0xc018d78d, 0x4fdf3b64, 0x400328f5, 0xc28eb4b0,
+	0x40dcb083, 0xd70a3d6b, 0xc0035e35, 0x3f7ced91, 0xbfe8cccc, 0xcccf515c,
+	0x40dcb083, 0xd70a3d6b, 0x3ff5e560, 0x4189374c, 0x3fde1cac, 0x082b37f0,
+	0x40dcb083, 0xd70a3d6b, 0x4014a1ca, 0xc083126e, 0xbffe872b, 0x020d7e00,
+	0x40dcb083, 0xd70a3d6b, 0x4021e51e, 0xb851eb85, 0x400b570a, 0x3d6ff584,
+	0x40dd1de6, 0x0418936f, 0xc0240000, 0x00000000, 0xc0119fbe, 0x76c91000,
+	0x40dd1de6, 0x0418936f, 0xc018d78d, 0x4fdf3b64, 0xbff04395, 0x81077990,
+	0x40dd1de6, 0x0418936f, 0xc0035e35, 0x3f7ced91, 0x3fef53f7, 0xced686d4,
+	0x40dd1de6, 0x0418936f, 0x3ff5e560, 0x4189374c, 0x3fb5a1ca, 0xc06aefc0,
+	0x40dd1de6, 0x0418936f, 0x4014a1ca, 0xc083126e, 0x4002d4fd, 0xf3b5a8d0,
+	0x40dd1de6, 0x0418936f, 0x4021e51e, 0xb851eb85, 0x40043126, 0xe97823b0,
+	0x40dd8b48, 0x3126e973, 0xc0240000, 0x00000000, 0x40090624, 0xdd2e6000,
+	0x40dd8b48, 0x3126e973, 0xc018d78d, 0x4fdf3b64, 0x3ffc851e, 0xb8509110,
+	0x40dd8b48, 0x3126e973, 0xc0035e35, 0x3f7ced91, 0x3fd3f7ce, 0xd9115180,
+	0x40dd8b48, 0x3126e973, 0x3ff5e560, 0x4189374c, 0xbfd34bc6, 0xa7f5c010,
+	0x40dd8b48, 0x3126e973, 0x4014a1ca, 0xc083126e, 0x3ff753f7, 0xced7d788,
+	0x40dd8b48, 0x3126e973, 0x4021e51e, 0xb851eb85, 0x3ffa1687, 0x2b00a3b8,
+	0x40ddf8aa, 0x5e353f77, 0xc0240000, 0x00000000, 0x3fe52f1a, 0x9fbb8000,
+	0x40ddf8aa, 0x5e353f77, 0xc018d78d, 0x4fdf3b64, 0xbffa1062, 0x4dd451e0,
+	0x40ddf8aa, 0x5e353f77, 0xc0035e35, 0x3f7ced91, 0xbfd6b851, 0xeb8a6aa8,
+	0x40ddf8aa, 0x5e353f77, 0x3ff5e560, 0x4189374c, 0x3fe5cac0, 0x830f5090,
+	0x40ddf8aa, 0x5e353f77, 0x4014a1ca, 0xc083126e, 0x3fe1fbe7, 0x6c88bae0,
+	0x40ddf8aa, 0x5e353f77, 0x4021e51e, 0xb851eb85, 0x3fe79581, 0x06220020,
+	0x40de660c, 0x8b43957b, 0xc0240000, 0x00000000, 0xbffcdd2f, 0x1aa14000,
+	0x40de660c, 0x8b43957b, 0xc018d78d, 0x4fdf3b64, 0x3ff2b851, 0xeb83b8c0,
+	0x40de660c, 0x8b43957b, 0xc0035e35, 0x3f7ced91, 0xbff05a1c, 0xac0989b4,
+	0x40de660c, 0x8b43957b, 0x3ff5e560, 0x4189374c, 0x3fd2e147, 0xae0e2520,
+	0x40de660c, 0x8b43957b, 0x4014a1ca, 0xc083126e, 0xbfd56041, 0x893c72a0,
+	0x40de660c, 0x8b43957b, 0x4021e51e, 0xb851eb85, 0xbfc40831, 0x26f51cc0,
+	0x40ded36e, 0xb851eb7f, 0xc0240000, 0x00000000, 0xc011147a, 0xe1481000,
+	0x40ded36e, 0xb851eb7f, 0xc018d78d, 0x4fdf3b64, 0xc001ee97, 0x8d509518,
+	0x40ded36e, 0xb851eb7f, 0xc0035e35, 0x3f7ced91, 0x3fe76c8b, 0x4392c4c8,
+	0x40ded36e, 0xb851eb7f, 0x3ff5e560, 0x4189374c, 0xbfb74bc6, 0xa8095b80,
+	0x40ded36e, 0xb851eb7f, 0x4014a1ca, 0xc083126e, 0xbff3ae14, 0x7ae296c0,
+	0x40ded36e, 0xb851eb7f, 0x4021e51e, 0xb851eb85, 0xbff0cccc, 0xccce4740,
+	0x40df40d0, 0xe5604183, 0xc0240000, 0x00000000, 0x400a1cac, 0x08306000,
+	0x40df40d0, 0xe5604183, 0xc018d78d, 0x4fdf3b64, 0x3fe1d70a, 0x3d6dc0e0,
+	0x40df40d0, 0xe5604183, 0xc0035e35, 0x3f7ced91, 0x3fb0a3d7, 0x0a2735a0,
+	0x40df40d0, 0xe5604183, 0x3ff5e560, 0x4189374c, 0xbfde872b, 0x0212d2e0,
+	0x40df40d0, 0xe5604183, 0x4014a1ca, 0xc083126e, 0xc001020c, 0x49bb086c,
+	0x40df40d0, 0xe5604183, 0x4021e51e, 0xb851eb85, 0xbfff1893, 0x74bdeae8,
+	0x40dfae33, 0x126e9787, 0xc0240000, 0x00000000, 0x3fe98937, 0x4bc38000,
+	0x40dfae33, 0x126e9787, 0xc018d78d, 0x4fdf3b64, 0xc006d4fd, 0xf3b70140,
+	0x40dfae33, 0x126e9787, 0xc0035e35, 0x3f7ced91, 0xbfe34395, 0x8108f760,
+	0x40dfae33, 0x126e9787, 0x3ff5e560, 0x4189374c, 0x3fe02d0e, 0x5600c728,
+	0x40dfae33, 0x126e9787, 0x4014a1ca, 0xc083126e, 0x40011687, 0x2b015f64,
+	0x40dfae33, 0x126e9787, 0x4021e51e, 0xb851eb85, 0xc006b22d, 0x0e56c748,
+	0x40e00dca, 0x9fbe76c6, 0xc0240000, 0x00000000, 0xbffab020, 0xc49d0000,
+	0x40e00dca, 0x9fbe76c6, 0xc018d78d, 0x4fdf3b64, 0xbfac28f5, 0xc2b6fc00,
+	0x40e00dca, 0x9fbe76c6, 0xc0035e35, 0x3f7ced91, 0x3ff26e97, 0x8d4eb068,
+	0x40e00dca, 0x9fbe76c6, 0x3ff5e560, 0x4189374c, 0x3fbe978d, 0x4fc84940,
+	0x40e00dca, 0x9fbe76c6, 0x4014a1ca, 0xc083126e, 0x3ff3d70a, 0x3d6f84b0,
+	0x40e00dca, 0x9fbe76c6, 0x4021e51e, 0xb851eb85, 0xc00dd810, 0x624e791c,
+	0x40e0447b, 0xb645a1c8, 0xc0240000, 0x00000000, 0xc0108937, 0x4bc70000,
+	0x40e0447b, 0xb645a1c8, 0xc018d78d, 0x4fdf3b64, 0x4005f3b6, 0x45a12960,
+	0x40e0447b, 0xb645a1c8, 0xc0035e35, 0x3f7ced91, 0x3fdf0a3d, 0x709f0578,
+	0x40e0447b, 0xb645a1c8, 0x3ff5e560, 0x4189374c, 0xbfd10e56, 0x041e69b0,
+	0x40e0447b, 0xb645a1c8, 0x4014a1ca, 0xc083126e, 0x3fd60418, 0x93702a60,
+	0x40e0447b, 0xb645a1c8, 0x4021e51e, 0xb851eb85, 0x40114b43, 0x9580b192,
+	0x40e07b2c, 0xccccccca, 0xc0240000, 0x00000000, 0x400b3333, 0x33328000,
+	0x40e07b2c, 0xccccccca, 0xc018d78d, 0x4fdf3b64, 0xbfe55c28, 0xf5c52060,
+	0x40e07b2c, 0xccccccca, 0xc0035e35, 0x3f7ced91, 0xbfc74bc6, 0xa7f96d60,
+	0x40e07b2c, 0xccccccca, 0x3ff5e560, 0x4189374c, 0xbfe4e147, 0xae1772d8,
+	0x40e07b2c, 0xccccccca, 0x4014a1ca, 0xc083126e, 0xbfe1a9fb, 0xe76edf00,
+	0x40e07b2c, 0xccccccca, 0x4021e51e, 0xb851eb85, 0x400b70a3, 0xd7099150,
+	0x40e0b1dd, 0xe353f7cc, 0xc0240000, 0x00000000, 0x3fede353, 0xf7cc0000,
+	0x40e0b1dd, 0xe353f7cc, 0xc018d78d, 0x4fdf3b64, 0x40010d4f, 0xdf3abd38,
+	0x40e0b1dd, 0xe353f7cc, 0xc0035e35, 0x3f7ced91, 0xbfeb2b02, 0x0c4c396c,
+	0x40e0b1dd, 0xe353f7cc, 0x3ff5e560, 0x4189374c, 0x3fd51eb8, 0x51e57b80,
+	0x40e0b1dd, 0xe353f7cc, 0x4014a1ca, 0xc083126e, 0xbff72b02, 0x0c4ae998,
+	0x40e0b1dd, 0xe353f7cc, 0x4021e51e, 0xb851eb85, 0x40044ac0, 0x8311bf7c,
+	0x40e0e88e, 0xf9db22ce, 0xc0240000, 0x00000000, 0xbff88312, 0x6e990000,
+	0x40e0e88e, 0xf9db22ce, 0xc018d78d, 0x4fdf3b64, 0xbff47ae1, 0x47af6880,
+	0x40e0e88e, 0xf9db22ce, 0xc0035e35, 0x3f7ced91, 0x3fecf5c2, 0x8f599ec4,
+	0x40e0e88e, 0xf9db22ce, 0x3ff5e560, 0x4189374c, 0xbfacac08, 0x31580400,
+	0x40e0e88e, 0xf9db22ce, 0x4014a1ca, 0xc083126e, 0xc002c083, 0x126f31d8,
+	0x40e0e88e, 0xf9db22ce, 0x4021e51e, 0xb851eb85, 0x3ffa49ba, 0x5e33db50,
+	0x40e11f40, 0x10624dd0, 0xc0240000, 0x00000000, 0xc00ffbe7, 0x6c8c0000,
+	0x40e11f40, 0x10624dd0, 0xc018d78d, 0x4fdf3b64, 0x3ff84dd2, 0xf1a8a220,
+	0x40e11f40, 0x10624dd0, 0xc0035e35, 0x3f7ced91, 0x3fce76c8, 0xb42f02c0,
+	0x40e11f40, 0x10624dd0, 0x3ff5e560, 0x4189374c, 0xbfdc49ba, 0x5e3b7c80,
+	0x40e11f40, 0x10624dd0, 0x4014a1ca, 0xc083126e, 0x3ffeb020, 0xc49a6bf0,
+	0x40e11f40, 0x10624dd0, 0x4021e51e, 0xb851eb85, 0x3fe7fbe7, 0x6c886f50,
+	0x40e155f1, 0x26e978d2, 0xc0240000, 0x00000000, 0x400c49ba, 0x5e348000,
+	0x40e155f1, 0x26e978d2, 0xc018d78d, 0x4fdf3b64, 0xbffe47ae, 0x147c40d0,
+	0x40e155f1, 0x26e978d2, 0xc0035e35, 0x3f7ced91, 0xbfdb74bc, 0x6a843ac8,
+	0x40e155f1, 0x26e978d2, 0x3ff5e560, 0x4189374c, 0x3fe14bc6, 0xa7ec7258,
+	0x40e155f1, 0x26e978d2, 0x4014a1ca, 0xc083126e, 0x3ff05a1c, 0xac06f1d8,
+	0x40e155f1, 0x26e978d2, 0x4021e51e, 0xb851eb85, 0xbfc26e97, 0x8d5b6000,
+	0x40e18ca2, 0x3d70a3d4, 0xc0240000, 0x00000000, 0x3ff11eb8, 0x51ea0000,
+	0x40e18ca2, 0x3d70a3d4, 0xc018d78d, 0x4fdf3b64, 0x3fed020c, 0x49b793a0,
+	0x40e18ca2, 0x3d70a3d4, 0xc0035e35, 0x3f7ced91, 0xbff18937, 0x4bc7fdbc,
+	0x40e18ca2, 0x3d70a3d4, 0x3ff5e560, 0x4189374c, 0x3fc3c6a7, 0xef90d160,
+	0x40e18ca2, 0x3d70a3d4, 0x4014a1ca, 0xc083126e, 0x3fc020c4, 0x9b9bbe00,
+	0x40e18ca2, 0x3d70a3d4, 0x4021e51e, 0xb851eb85, 0xbff09999, 0x999b0fa8,
+	0x40e1c353, 0x53f7ced6, 0xc0240000, 0x00000000, 0xbff65604, 0x18950000,
+	0x40e1c353, 0x53f7ced6, 0xc018d78d, 0x4fdf3b64, 0xc0040a3d, 0x70a48c90,
+	0x40e1c353, 0x53f7ced6, 0xc0035e35, 0x3f7ced91, 0x3fe50e56, 0x0415dcb8,
+	0x40e1c353, 0x53f7ced6, 0x3ff5e560, 0x4189374c, 0xbfcda1ca, 0xc09026a0,
+	0x40e1c353, 0x53f7ced6, 0x4014a1ca, 0xc083126e, 0xbfe8a3d7, 0x0a4004b0,
+	0x40e1c353, 0x53f7ced6, 0x4021e51e, 0xb851eb85, 0xbffee560, 0x418ab350,
+	0x40e1fa04, 0x6a7ef9d8, 0xc0240000, 0x00000000, 0xc00ee560, 0x418a0000,
+	0x40e1fa04, 0x6a7ef9d8, 0xc018d78d, 0x4fdf3b64, 0x3fd2d0e5, 0x603bc600,
+	0x40e1fa04, 0x6a7ef9d8, 0xc0035e35, 0x3f7ced91, 0xbf826e97, 0x8e005700,
+	0x40e1fa04, 0x6a7ef9d8, 0x3ff5e560, 0x4189374c, 0xbfe3c28f, 0x5c2c47a8,
+	0x40e1fa04, 0x6a7ef9d8, 0x4014a1ca, 0xc083126e, 0xbffaa7ef, 0x9db37c70,
+	0x40e1fa04, 0x6a7ef9d8, 0x4021e51e, 0xb851eb85, 0xc0069893, 0x74bd2b7c,
+	0x40e230b5, 0x810624da, 0xc0240000, 0x00000000, 0x400d6041, 0x89368000,
+	0x40e230b5, 0x810624da, 0xc018d78d, 0x4fdf3b64, 0x4008be76, 0xc8b37e10,
+	0x40e230b5, 0x810624da, 0xc0035e35, 0x3f7ced91, 0xbfe5a1ca, 0xc085df70,
+	0x40e230b5, 0x810624da, 0x3ff5e560, 0x4189374c, 0x3fd75c28, 0xf5bbd1e0,
+	0x40e230b5, 0x810624da, 0x4014a1ca, 0xc083126e, 0xc0047ef9, 0xdb237b44,
+	0x40e230b5, 0x810624da, 0x4021e51e, 0xb851eb85, 0xc00dbe76, 0xc8b4fd50,
+	0x40e26766, 0x978d4fdc, 0xc0240000, 0x00000000, 0x3ff34bc6, 0xa7ee0000,
+	0x40e26766, 0x978d4fdc, 0xc018d78d, 0x4fdf3b64, 0xbfd4624d, 0xd2f79b40,
+	0x40e26766, 0x978d4fdc, 0xc0035e35, 0x3f7ced91, 0x3ff13f7c, 0xed8ffc60,
+	0x40e26766, 0x978d4fdc, 0x3ff5e560, 0x4189374c, 0xbf958106, 0x254aa200,
+	0x40e26766, 0x978d4fdc, 0x4014a1ca, 0xc083126e, 0x3ffb3333, 0x3331d918,
+	0x40e26766, 0x978d4fdc, 0x4021e51e, 0xb851eb85, 0x40115810, 0x624d6f78,
+	0x40e29e17, 0xae147ade, 0xc0240000, 0x00000000, 0xbff428f5, 0xc2910000,
+	0x40e29e17, 0xae147ade, 0xc018d78d, 0x4fdf3b64, 0x4003d810, 0x624d11e8,
+	0x40e29e17, 0xae147ade, 0xc0035e35, 0x3f7ced91, 0x3fda4dd2, 0xf1a43558,
+	0x40e29e17, 0xae147ade, 0x3ff5e560, 0x4189374c, 0xbfda0c49, 0xba652620,
+	0x40e29e17, 0xae147ade, 0x4014a1ca, 0xc083126e, 0x3fe9ba5e, 0x353cbe00,
+	0x40e29e17, 0xae147ade, 0x4021e51e, 0xb851eb85, 0x400b8a3d, 0x70a30d1c,
+	0x40e2d4c8, 0xc49ba5e0, 0xc0240000, 0x00000000, 0xc00dced9, 0x16880000,
+	0x40e2d4c8, 0xc49ba5e0, 0xc018d78d, 0x4fdf3b64, 0xbfedcac0, 0x83157e40,
+	0x40e2d4c8, 0xc49ba5e0, 0xc0035e35, 0x3f7ced91, 0xbfd0624d, 0xd2f786d0,
+	0x40e2d4c8, 0xc49ba5e0, 0x3ff5e560, 0x4189374c, 0x3fe26a7e, 0xf9d79d88,
+	0x40e2d4c8, 0xc49ba5e0, 0x4014a1ca, 0xc083126e, 0xbfb78d4f, 0xdf51b180,
+	0x40e2d4c8, 0xc49ba5e0, 0x4021e51e, 0xb851eb85, 0x4004645a, 0x1cab3b48,
+	0x40e30b79, 0xdb22d0e2, 0xc0240000, 0x00000000, 0x400e76c8, 0xb4388000,
+	0x40e30b79, 0xdb22d0e2, 0xc018d78d, 0x4fdf3b64, 0x3ffde353, 0xf7cd4b80,
+	0x40e30b79, 0xdb22d0e2, 0xc0035e35, 0x3f7ced91, 0xbfed8937, 0x4bc9a17c,
+	0x40e30b79, 0xdb22d0e2, 0x3ff5e560, 0x4189374c, 0x3fc84189, 0x373d7e20,
+	0x40e30b79, 0xdb22d0e2, 0x4014a1ca, 0xc083126e, 0xbfef9db2, 0x2d112a60,
+	0x40e30b79, 0xdb22d0e2, 0x4021e51e, 0xb851eb85, 0x3ffa7ced, 0x9166d2e8,
+	0x40e3422a, 0xf1a9fbe4, 0xc0240000, 0x00000000, 0x3ff578d4, 0xfdf20000,
+	0x40e3422a, 0xf1a9fbe4, 0xc018d78d, 0x4fdf3b64, 0xbff8b22d, 0x0e579770,
+	0x40e3422a, 0xf1a9fbe4, 0xc0035e35, 0x3f7ced91, 0x3fea978d, 0x4fdc36b4,
+	0x40e3422a, 0xf1a9fbe4, 0x3ff5e560, 0x4189374c, 0xbfc926e9, 0x78e379e0,
+	0x40e3422a, 0xf1a9fbe4, 0x4014a1ca, 0xc083126e, 0xbffe24dd, 0x2f1c0f48,
+	0x40e3422a, 0xf1a9fbe4, 0x4021e51e, 0xb851eb85, 0x3fe8624d, 0xd2ee5e80,
+	0x40e378dc, 0x083126e6, 0xc0240000, 0x00000000, 0xbff1fbe7, 0x6c8d0000,
+	0x40e378dc, 0x083126e6, 0xc018d78d, 0x4fdf3b64, 0x3ff41687, 0x2b007330,
+	0x40e378dc, 0x083126e6, 0xc0035e35, 0x3f7ced91, 0x3fc4fdf3, 0xb6396280,
+	0x40e378dc, 0x083126e6, 0x3ff5e560, 0x4189374c, 0xbfe2a3d7, 0x0a411c78,
+	0x40e378dc, 0x083126e6, 0x4014a1ca, 0xc083126e, 0x40030624, 0xdd2e602c,
+	0x40e378dc, 0x083126e6, 0x4021e51e, 0xb851eb85, 0xbfc0d4fd, 0xf3c3a340,
+	0x40e3af8d, 0x1eb851e8, 0xc0240000, 0x00000000, 0xc00cb851, 0xeb860000,
+	0x40e3af8d, 0x1eb851e8, 0xc018d78d, 0x4fdf3b64, 0xc0013f7c, 0xed9237e0,
+	0x40e3af8d, 0x1eb851e8, 0xc0035e35, 0x3f7ced91, 0xbfe01893, 0x74bf8574,
+	0x40e3af8d, 0x1eb851e8, 0x3ff5e560, 0x4189374c, 0x3fd99999, 0x99922840,
+	0x40e3af8d, 0x1eb851e8, 0x4014a1ca, 0xc083126e, 0x3ff7b645, 0xa1c94640,
+	0x40e3af8d, 0x1eb851e8, 0x4021e51e, 0xb851eb85, 0xbff06666, 0x66681810,
+	0x40e3e63e, 0x353f7cea, 0xc0240000, 0x00000000, 0x400f8d4f, 0xdf3a8000,
+	0x40e3e63e, 0x353f7cea, 0xc018d78d, 0x4fdf3b64, 0x3fe49374, 0xbc6735c0,
+	0x40e3e63e, 0x353f7cea, 0xc0035e35, 0x3f7ced91, 0xbff2b851, 0xeb86b1c4,
+	0x40e3e63e, 0x353f7cea, 0x3ff5e560, 0x4189374c, 0x3f8cac08, 0x30358800,
+	0x40e3e63e, 0x353f7cea, 0x4014a1ca, 0xc083126e, 0x3fe2c083, 0x126b9850,
+	0x40e3e63e, 0x353f7cea, 0x4021e51e, 0xb851eb85, 0xbffeb22d, 0x0e57bbb8,
+	0x40e41cef, 0x4bc6a7ec, 0xc0240000, 0x00000000, 0x3ff7a5e3, 0x53f60000,
+	0x40e41cef, 0x4bc6a7ec, 0xc018d78d, 0x4fdf3b64, 0xc00625e3, 0x53f8a408,
+	0x40e41cef, 0x4bc6a7ec, 0xc0035e35, 0x3f7ced91, 0x3fe2b020, 0xc49874a8,
+	0x40e41cef, 0x4bc6a7ec, 0x3ff5e560, 0x4189374c, 0xbfd7ced9, 0x168ecfc0,
+	0x40e41cef, 0x4bc6a7ec, 0x4014a1ca, 0xc083126e, 0xbfd3d70a, 0x3d76b7c0,
+	0x40e41cef, 0x4bc6a7ec, 0x4021e51e, 0xb851eb85, 0xc0067ef9, 0xdb23afb0,
+	0x40e453a0, 0x624dd2ee, 0xc0240000, 0x00000000, 0xbfef9db2, 0x2d120000,
+	0x40e453a0, 0x624dd2ee, 0xc018d78d, 0x4fdf3b64, 0x3f9f3b64, 0x59b0a400,
+	0x40e453a0, 0x624dd2ee, 0xc0035e35, 0x3f7ced91, 0xbfb53f7c, 0xedab4b60,
+	0x40e453a0, 0x624dd2ee, 0x3ff5e560, 0x4189374c, 0x3fe38937, 0x4bc2c8b8,
+	0x40e453a0, 0x624dd2ee, 0x4014a1ca, 0xc083126e, 0xbff34bc6, 0xa7f12808,
+	0x40e453a0, 0x624dd2ee, 0x4021e51e, 0xb851eb85, 0xc00da4dd, 0x2f1b8184,
+	0x40e48a51, 0x78d4fdf0, 0xc0240000, 0x00000000, 0xc00ba1ca, 0xc0840000,
+	0x40e48a51, 0x78d4fdf0, 0xc018d78d, 0x4fdf3b64, 0x4006a2d0, 0xe55f6698,
+	0x40e48a51, 0x78d4fdf0, 0xc0035e35, 0x3f7ced91, 0xbfe80000, 0x00034780,
+	0x40e48a51, 0x78d4fdf0, 0x3ff5e560, 0x4189374c, 0x3fccbc6a, 0x7eea2ae0,
+	0x40e48a51, 0x78d4fdf0, 0x4014a1ca, 0xc083126e, 0xc000d0e5, 0x60425110,
+	0x40e48a51, 0x78d4fdf0, 0x4021e51e, 0xb851eb85, 0x401164dd, 0x2f1a2d5e,
+	0x40e4c102, 0x8f5c28f2, 0xc0240000, 0x00000000, 0x401051eb, 0x851e4000,
+	0x40e4c102, 0x8f5c28f2, 0xc018d78d, 0x4fdf3b64, 0xbfe29fbe, 0x76cc2b80,
+	0x40e4c102, 0x8f5c28f2, 0xc0035e35, 0x3f7ced91, 0x3ff01062, 0x4dd14858,
+	0x40e4c102, 0x8f5c28f2, 0x3ff5e560, 0x4189374c, 0xbfc4ac08, 0x3136cd20,
+	0x40e4c102, 0x8f5c28f2, 0x4014a1ca, 0xc083126e, 0x400147ae, 0x147a16c0,
+	0x40e4c102, 0x8f5c28f2, 0x4021e51e, 0xb851eb85, 0x400ba3d7, 0x0a3c88e8,
+	0x40e4f7b3, 0xa5e353f4, 0xc0240000, 0x00000000, 0x3ff9d2f1, 0xa9fa0000,
+	0x40e4f7b3, 0xa5e353f4, 0xc018d78d, 0x4fdf3b64, 0x4001bc6a, 0x7ef8fa70,
+	0x40e4f7b3, 0xa5e353f4, 0xc0035e35, 0x3f7ced91, 0x3fd59168, 0x72a96538,
+	0x40e4f7b3, 0xa5e353f4, 0x3ff5e560, 0x4189374c, 0xbfe1851e, 0xb855f148,
+	0x40e4f7b3, 0xa5e353f4, 0x4014a1ca, 0xc083126e, 0x3ff43958, 0x1060b368,
+	0x40e4f7b3, 0xa5e353f4, 0x4021e51e, 0xb851eb85, 0x40047df3, 0xb644b714,
+	0x40e52e64, 0xbc6a7ef6, 0xc0240000, 0x00000000, 0xbfeb4395, 0x810a0000,
+	0x40e52e64, 0xbc6a7ef6, 0xc018d78d, 0x4fdf3b64, 0xbff31cac, 0x0832ee10,
+	0x40e52e64, 0xbc6a7ef6, 0xc0035e35, 0x3f7ced91, 0xbfd51eb8, 0x51f256f0,
+	0x40e52e64, 0xbc6a7ef6, 0x3ff5e560, 0x4189374c, 0x3fdbd70a, 0x3d687ea0,
+	0x40e52e64, 0xbc6a7ef6, 0x4014a1ca, 0xc083126e, 0x3fd78d4f, 0xdf34e540,
+	0x40e52e64, 0xbc6a7ef6, 0x4021e51e, 0xb851eb85, 0x3ffab020, 0xc499ca80,
+	0x40e56515, 0xd2f1a9f8, 0xc0240000, 0x00000000, 0xc00a8b43, 0x95820000,
+	0x40e56515, 0xd2f1a9f8, 0xc018d78d, 0x4fdf3b64, 0x3ff9ac08, 0x31251c90,
+	0x40e56515, 0xd2f1a9f8, 0xc0035e35, 0x3f7ced91, 0xbfefe76c, 0x8b47098c,
+	0x40e56515, 0xd2f1a9f8, 0x3ff5e560, 0x4189374c, 0x3fa91687, 0x2ac01500,
+	0x40e56515, 0xd2f1a9f8, 0x4014a1ca, 0xc083126e, 0xbfe0e560, 0x418c8190,
+	0x40e56515, 0xd2f1a9f8, 0x4021e51e, 0xb851eb85, 0x3fe8c8b4, 0x39544db0,
+	0x40e59bc6, 0xe978d4fa, 0xc0240000, 0x00000000, 0x4010dd2f, 0x1a9f4000,
+	0x40e59bc6, 0xe978d4fa, 0xc018d78d, 0x4fdf3b64, 0xbffce978, 0xd4ffc660,
+	0x40e59bc6, 0xe978d4fa, 0xc0035e35, 0x3f7ced91, 0x3fe83958, 0x105ecea4,
+	0x40e59bc6, 0xe978d4fa, 0x3ff5e560, 0x4189374c, 0xbfd59168, 0x72b87960,
+	0x40e59bc6, 0xe978d4fa, 0x4014a1ca, 0xc083126e, 0xbff6c8b4, 0x3959bae0,
+	0x40e59bc6, 0xe978d4fa, 0x4021e51e, 0xb851eb85, 0xbfbe76c8, 0xb457cd00,
+	0x40e5d277, 0xfffffffc, 0xc0240000, 0x00000000, 0x3ffbffff, 0xfffe0000,
+	0x40e5d277, 0xfffffffc, 0xc018d78d, 0x4fdf3b64, 0x3fefbe76, 0xc8b08880,
+	0x40e5d277, 0xfffffffc, 0xc0035e35, 0x3f7ced91, 0x3fb70a3d, 0x70878480,
+	0x40e5d277, 0xfffffffc, 0x3ff5e560, 0x4189374c, 0x3fe4a7ef, 0x9dadf3e8,
+	0x40e5d277, 0xfffffffc, 0x4014a1ca, 0xc083126e, 0xc0028f5c, 0x28f69a7c,
+	0x40e5d277, 0xfffffffc, 0x4021e51e, 0xb851eb85, 0xbff03333, 0x33352078,
+	0x40e60929, 0x16872afe, 0xc0240000, 0x00000000, 0xbfe6e978, 0xd5020000,
+	0x40e60929, 0x16872afe, 0xc018d78d, 0x4fdf3b64, 0xc0035b22, 0xd0e64f58,
+	0x40e60929, 0x16872afe, 0xc0035e35, 0x3f7ced91, 0xbfe276c8, 0xb43ced84,
+	0x40e60929, 0x16872afe, 0x3ff5e560, 0x4189374c, 0x3fd09ba5, 0xe34b6bd0,
+	0x40e60929, 0x16872afe, 0x4014a1ca, 0xc083126e, 0x3fff126e, 0x978b9aa8,
+	0x40e60929, 0x16872afe, 0x4021e51e, 0xb851eb85, 0xbffe7ef9, 0xdb24c420,
+	0x40e63fda, 0x2d0e5600, 0xc0240000, 0x00000000, 0xc00974bc, 0x6a800000,
+	0x40e63fda, 0x2d0e5600, 0xc018d78d, 0x4fdf3b64, 0x3fd849ba, 0x5e2dafc0,
+	0x40e63fda, 0x2d0e5600, 0xc0035e35, 0x3f7ced91, 0x3ff2d4fd, 0xf3b47556,
+	0x40e63fda, 0x2d0e5600, 0x3ff5e560, 0x4189374c, 0xbfc03126, 0xe98a2060,
+	0x40e63fda, 0x2d0e5600, 0x4014a1ca, 0xc083126e, 0x3ff0bc6a, 0x7ef82090,
+	0x40e63fda, 0x2d0e5600, 0x4021e51e, 0xb851eb85, 0xc0066560, 0x418a33e4,
+	0x40e6768b, 0x43958102, 0xc0240000, 0x00000000, 0x40116872, 0xb0204000,
+	0x40e6768b, 0x43958102, 0xc018d78d, 0x4fdf3b64, 0xc0084189, 0x374cbb80,
+	0x40e6768b, 0x43958102, 0xc0035e35, 0x3f7ced91, 0x3fe051eb, 0x851b0c98,
+	0x40e6768b, 0x43958102, 0x3ff5e560, 0x4189374c, 0xbfe06666, 0x666ac618,
+	0x40e6768b, 0x43958102, 0x4014a1ca, 0xc083126e, 0x3fc33333, 0x332533c0,
+	0x40e6768b, 0x43958102, 0x4021e51e, 0xb851eb85, 0xc00d8b43, 0x958205b8,
+	0x40e6ad3c, 0x5a1cac04, 0xc0240000, 0x00000000, 0x3ffe2d0e, 0x56020000,
+	0x40e6ad3c, 0x5a1cac04, 0xc018d78d, 0x4fdf3b64, 0xbfcdd2f1, 0xaa0b6300,
+	0x40e6ad3c, 0x5a1cac04, 0xc0035e35, 0x3f7ced91, 0xbfc41893, 0x74cb45f0,
+	0x40e6ad3c, 0x5a1cac04, 0x3ff5e560, 0x4189374c, 0x3fde147a, 0xe13ed500,
+	0x40e6ad3c, 0x5a1cac04, 0x4014a1ca, 0xc083126e, 0xbfe7df3b, 0x645da740,
+	0x40e6ad3c, 0x5a1cac04, 0x4021e51e, 0xb851eb85, 0x401171a9, 0xfbe6eb44,
+	0x40e6e3ed, 0x70a3d706, 0xc0240000, 0x00000000, 0xbfe28f5c, 0x28fa0000,
+	0x40e6e3ed, 0x70a3d706, 0xc018d78d, 0x4fdf3b64, 0x4004872b, 0x020b4f20,
+	0x40e6e3ed, 0x70a3d706, 0xc0035e35, 0x3f7ced91, 0xbfea5e35, 0x3f80af90,
+	0x40e6e3ed, 0x70a3d706, 0x3ff5e560, 0x4189374c, 0x3fb58106, 0x24b96400,
+	0x40e6e3ed, 0x70a3d706, 0x4014a1ca, 0xc083126e, 0xbffa45a1, 0xcac24db8,
+	0x40e6e3ed, 0x70a3d706, 0x4021e51e, 0xb851eb85, 0x400bbd70, 0xa3d604b4,
+	0x40e71a9e, 0x872b0208, 0xc0240000, 0x00000000, 0xc0085e35, 0x3f7e0000,
+	0x40e71a9e, 0x872b0208, 0xc018d78d, 0x4fdf3b64, 0xbfeb0e56, 0x041c8960,
+	0x40e71a9e, 0x872b0208, 0xc0035e35, 0x3f7ced91, 0x3fedc28f, 0x5c2528a0,
+	0x40e71a9e, 0x872b0208, 0x3ff5e560, 0x4189374c, 0xbfd353f7, 0xcee22300,
+	0x40e71a9e, 0x872b0208, 0x4014a1ca, 0xc083126e, 0xc0044dd2, 0xf1aae3e8,
+	0x40e71a9e, 0x872b0208, 0x4021e51e, 0xb851eb85, 0x4004978d, 0x4fde32e0,
+	0x40e7514f, 0x9db22d0a, 0xc0240000, 0x00000000, 0x4011f3b6, 0x45a14000,
+	0x40e7514f, 0x9db22d0a, 0xc018d78d, 0x4fdf3b64, 0x3fff4189, 0x3749c5f0,
+	0x40e7514f, 0x9db22d0a, 0xc0035e35, 0x3f7ced91, 0x3fd0d4fd, 0xf3ae9518,
+	0x40e7514f, 0x9db22d0a, 0x3ff5e560, 0x4189374c, 0x3fe5c6a7, 0xef991f18,
+	0x40e7514f, 0x9db22d0a, 0x4014a1ca, 0xc083126e, 0x3ffb9581, 0x062307d0,
+	0x40e7514f, 0x9db22d0a, 0x4021e51e, 0xb851eb85, 0x3ffae353, 0xf7ccc218,
+	0x40e78800, 0xb439580c, 0xc0240000, 0x00000000, 0x40002d0e, 0x56030000,
+	0x40e78800, 0xb439580c, 0xc018d78d, 0x4fdf3b64, 0xbff753f7, 0xcedb1d00,
+	0x40e78800, 0xb439580c, 0xc0035e35, 0x3f7ced91, 0xbfd9db22, 0xd0ed2710,
+	0x40e78800, 0xb439580c, 0x3ff5e560, 0x4189374c, 0x3fd2d916, 0x8721c230,
+	0x40e78800, 0xb439580c, 0x4014a1ca, 0xc083126e, 0x3fea7ef9, 0xdb1f1b70,
+	0x40e78800, 0xb439580c, 0x4021e51e, 0xb851eb85, 0x3fe92f1a, 0x9fba3ce0,
+	0x40e7beb1, 0xcac0830e, 0xc0240000, 0x00000000, 0xbfdc6a7e, 0xf9e40000,
+	0x40e7beb1, 0xcac0830e, 0xc018d78d, 0x4fdf3b64, 0x3ff574bc, 0x6a7ceda0,
+	0x40e7beb1, 0xcac0830e, 0xc0035e35, 0x3f7ced91, 0xbff122d0, 0xe56238ce,
+	0x40e7beb1, 0xcac0830e, 0x3ff5e560, 0x4189374c, 0xbfb76c8b, 0x43bae740,
+	0x40e7beb1, 0xcac0830e, 0x4014a1ca, 0xc083126e, 0xbfb16872, 0xb03ec600,
+	0x40e7beb1, 0xcac0830e, 0x4021e51e, 0xb851eb85, 0xbfbb4395, 0x81285380,
+	0x40e7f562, 0xe147ae10, 0xc0240000, 0x00000000, 0xc00747ae, 0x147c0000,
+	0x40e7f562, 0xe147ae10, 0xc018d78d, 0x4fdf3b64, 0xc0009062, 0x4dd3faa8,
+	0x40e7f562, 0xe147ae10, 0xc0035e35, 0x3f7ced91, 0x3fe5db22, 0xd0e16694,
+	0x40e7f562, 0xe147ae10, 0x3ff5e560, 0x4189374c, 0xbfde8f5c, 0x28ff35d0,
+	0x40e7f562, 0xe147ae10, 0x4014a1ca, 0xc083126e, 0xbfeed916, 0x872eccf0,
+	0x40e7f562, 0xe147ae10, 0x4021e51e, 0xb851eb85, 0xbff00000, 0x000228e0,
+	0x40e82c13, 0xf7ced912, 0xc0240000, 0x00000000, 0x40127ef9, 0xdb224000,
+	0x40e82c13, 0xf7ced912, 0xc018d78d, 0x4fdf3b64, 0x3fe74fdf, 0x3b602aa0,
+	0x40e82c13, 0xf7ced912, 0xc0035e35, 0x3f7ced91, 0x3f90624d, 0xd2711000,
+	0x40e82c13, 0xf7ced912, 0x3ff5e560, 0x4189374c, 0x3fe028f5, 0xc28a95b0,
+	0x40e82c13, 0xf7ced912, 0x4014a1ca, 0xc083126e, 0xbffdc28f, 0x5c2ae090,
+	0x40e82c13, 0xf7ced912, 0x4021e51e, 0xb851eb85, 0xbffe4bc6, 0xa7f1cc88,
+	0x40e862c5, 0x0e560414, 0xc0240000, 0x00000000, 0x40014395, 0x81050000,
+	0x40e862c5, 0x0e560414, 0xc018d78d, 0x4fdf3b64, 0xc00576c8, 0xb43a66d0,
+	0x40e862c5, 0x0e560414, 0xc0035e35, 0x3f7ced91, 0xbfe4d4fd, 0xf3ba5594,
+	0x40e862c5, 0x0e560414, 0x3ff5e560, 0x4189374c, 0x3fbe76c8, 0xb412bd80,
+	0x40e862c5, 0x0e560414, 0x4014a1ca, 0xc083126e, 0x4003374b, 0xc6a6f788,
+	0x40e862c5, 0x0e560414, 0x4021e51e, 0xb851eb85, 0xc0064bc6, 0xa7f0b818,
+	0x40e89976, 0x24dd2f16, 0xc0240000, 0x00000000, 0xbfd3b645, 0xa1d40000,
+	0x40e89976, 0x24dd2f16, 0xc018d78d, 0x4fdf3b64, 0x3fbdb22d, 0x0e33d000,
+	0x40e89976, 0x24dd2f16, 0xc0035e35, 0x3f7ced91, 0x3ff1a5e3, 0x53f5c14e,
+	0x40e89976, 0x24dd2f16, 0x3ff5e560, 0x4189374c, 0xbfd11687, 0x2b0bcca0,
+	0x40e89976, 0x24dd2f16, 0x4014a1ca, 0xc083126e, 0x3ff81893, 0x74ba74f8,
+	0x40e89976, 0x24dd2f16, 0x4021e51e, 0xb851eb85, 0xc00d71a9, 0xfbe889ec,
+	0x40e8d027, 0x3b645a18, 0xc0240000, 0x00000000, 0xc0063126, 0xe97a0000,
+	0x40e8d027, 0x3b645a18, 0xc018d78d, 0x4fdf3b64, 0x400751eb, 0x851da3d0,
+	0x40e8d027, 0x3b645a18, 0xc0035e35, 0x3f7ced91, 0x3fdbe76c, 0x8b3b4910,
+	0x40e8d027, 0x3b645a18, 0x3ff5e560, 0x4189374c, 0xbfe4e560, 0x418e2450,
+	0x40e8d027, 0x3b645a18, 0x4014a1ca, 0xc083126e, 0x3fe3851e, 0xb84df5c0,
+	0x40e8d027, 0x3b645a18, 0x4021e51e, 0xb851eb85, 0x40117e76, 0xc8b3a92a,
+	0x40e906d8, 0x51eb851a, 0xc0240000, 0x00000000, 0x40130a3d, 0x70a34000,
+	0x40e906d8, 0x51eb851a, 0xc018d78d, 0x4fdf3b64, 0xbfdfc6a7, 0xefa66d40,
+	0x40e906d8, 0x51eb851a, 0xc0035e35, 0x3f7ced91, 0xbfcd9168, 0x72c0e630,
+	0x40e906d8, 0x51eb851a, 0x3ff5e560, 0x4189374c, 0x3fd51687, 0x2af81890,
+	0x40e906d8, 0x51eb851a, 0x4014a1ca, 0xc083126e, 0xbfd24dd2, 0xf1b1fce0,
+	0x40e906d8, 0x51eb851a, 0x4021e51e, 0xb851eb85, 0x400bd70a, 0x3d6f8080,
+	0x40e93d89, 0x6872b01c, 0xc0240000, 0x00000000, 0x40025a1c, 0xac070000,
+	0x40e93d89, 0x6872b01c, 0xc018d78d, 0x4fdf3b64, 0x40026b85, 0x1eb737a8,
+	0x40e93d89, 0x6872b01c, 0xc0035e35, 0x3f7ced91, 0xbfecbc6a, 0x7efe17a0,
+	0x40e93d89, 0x6872b01c, 0x3ff5e560, 0x4189374c, 0xbfaced91, 0x68c31b80,
+	0x40e93d89, 0x6872b01c, 0x4014a1ca, 0xc083126e, 0xbff2e978, 0xd4fff950,
+	0x40e93d89, 0x6872b01c, 0x4021e51e, 0xb851eb85, 0x4004b126, 0xe977aeac,
+	0x40e9743a, 0x7ef9db1e, 0xc0240000, 0x00000000, 0xbfc60418, 0x93880000,
+	0x40e9743a, 0x7ef9db1e, 0xc018d78d, 0x4fdf3b64, 0xbff1be76, 0xc8b673a0,
+	0x40e9743a, 0x7ef9db1e, 0xc0035e35, 0x3f7ced91, 0x3feb645a, 0x1ca7c090,
+	0x40e9743a, 0x7ef9db1e, 0x3ff5e560, 0x4189374c, 0xbfdc51eb, 0x8528df70,
+	0x40e9743a, 0x7ef9db1e, 0x4014a1ca, 0xc083126e, 0xc0009fbe, 0x76c9b9b4,
+	0x40e9743a, 0x7ef9db1e, 0x4021e51e, 0xb851eb85, 0x3ffb1687, 0x2affb9b0,
+	0x40e9aaeb, 0x95810620, 0xc0240000, 0x00000000, 0xc0051a9f, 0xbe780000,
+	0x40e9aaeb, 0x95810620, 0xc018d78d, 0x4fdf3b64, 0x3ffb0a3d, 0x70a19700,
+	0x40e9aaeb, 0x95810620, 0xc0035e35, 0x3f7ced91, 0x3fc83126, 0xe96789f0,
+	0x40e9aaeb, 0x95810620, 0x3ff5e560, 0x4189374c, 0x3fe147ae, 0x1475c0e0,
+	0x40e9aaeb, 0x95810620, 0x4014a1ca, 0xc083126e, 0x400178d4, 0xfdf2ae1c,
+	0x40e9aaeb, 0x95810620, 0x4021e51e, 0xb851eb85, 0x3fe99581, 0x06202c10,
+	0x40e9e19c, 0xac083122, 0xc0240000, 0x00000000, 0x40139581, 0x06244000,
+	0x40e9e19c, 0xac083122, 0xc018d78d, 0x4fdf3b64, 0xbffb8b43, 0x95834bf0,
+	0x40e9e19c, 0xac083122, 0xc0035e35, 0x3f7ced91, 0xbfde978d, 0x4fe7f730,
+	0x40e9e19c, 0xac083122, 0x3ff5e560, 0x4189374c, 0x3fc3b645, 0xa1b60b80,
+	0x40e9e19c, 0xac083122, 0x4014a1ca, 0xc083126e, 0x3ff49ba5, 0xe351e220,
+	0x40e9e19c, 0xac083122, 0x4021e51e, 0xb851eb85, 0xbfb81062, 0x4df8da00,
+	0x40ea184d, 0xc28f5c24, 0xc0240000, 0x00000000, 0x400370a3, 0xd7090000,
+	0x40ea184d, 0xc28f5c24, 0xc018d78d, 0x4fdf3b64, 0x3ff13d70, 0xa3d4beb0,
+	0x40ea184d, 0xc28f5c24, 0xc0035e35, 0x3f7ced91, 0xbff251eb, 0x8520ecd6,
+	0x40ea184d, 0xc28f5c24, 0x3ff5e560, 0x4189374c, 0xbfcdb22d, 0x0e6aec80,
+	0x40ea184d, 0xc28f5c24, 0x4014a1ca, 0xc083126e, 0x3fd91687, 0x2af9a020,
+	0x40ea184d, 0xc28f5c24, 0x4021e51e, 0xb851eb85, 0xbfef9999, 0x999e6290,
+	0x40ea4efe, 0xd9168726, 0xc0240000, 0x00000000, 0xbfa26e97, 0x8da00000,
+	0x40ea4efe, 0xd9168726, 0xc018d78d, 0x4fdf3b64, 0xc002ac08, 0x31281220,
+	0x40ea4efe, 0xd9168726, 0xc0035e35, 0x3f7ced91, 0x3fe37ced, 0x9163fe84,
+	0x40ea4efe, 0xd9168726, 0x3ff5e560, 0x4189374c, 0xbfe3c6a7, 0xefa2f920,
+	0x40ea4efe, 0xd9168726, 0x4014a1ca, 0xc083126e, 0xbfe020c4, 0x9baa2420,
+	0x40ea4efe, 0xd9168726, 0x4021e51e, 0xb851eb85, 0xbffe1893, 0x74bed4f0,
+	0x40ea85af, 0xef9db228, 0xc0240000, 0x00000000, 0xc0040418, 0x93760000,
+	0x40ea85af, 0xef9db228, 0xc018d78d, 0x4fdf3b64, 0x3fddc28f, 0x5c1f9980,
+	0x40ea85af, 0xef9db228, 0xc0035e35, 0x3f7ced91, 0xbfadb22d, 0x0e9df900,
+	0x40ea85af, 0xef9db228, 0x3ff5e560, 0x4189374c, 0x3fd753f7, 0xcece6ef0,
+	0x40ea85af, 0xef9db228, 0x4014a1ca, 0xc083126e, 0xbff66666, 0x66688c28,
+	0x40ea85af, 0xef9db228, 0x4021e51e, 0xb851eb85, 0xc006322d, 0x0e573c4c,
+	0x40eabc61, 0x0624dd2a, 0xc0240000, 0x00000000, 0xc013df3b, 0x645ac000,
+	0x40eabc61, 0x0624dd2a, 0xc018d78d, 0x4fdf3b64, 0xc007926e, 0x978e7e48,
+	0x40eabc61, 0x0624dd2a, 0xc0035e35, 0x3f7ced91, 0xbfe73333, 0x3337bda4,
+	0x40eabc61, 0x0624dd2a, 0x3ff5e560, 0x4189374c, 0xbf960418, 0x9420d100,
+	0x40eabc61, 0x0624dd2a, 0x4014a1ca, 0xc083126e, 0xc0025e35, 0x3f7e0320,
+	0x40eabc61, 0x0624dd2a, 0x4021e51e, 0xb851eb85, 0xc00d5810, 0x624f0e20,
+	0x40eaf312, 0x1cac082c, 0xc0240000, 0x00000000, 0x4004872b, 0x020b0000,
+	0x40eaf312, 0x1cac082c, 0xc018d78d, 0x4fdf3b64, 0xbfc2e147, 0xae278f80,
+	0x40eaf312, 0x1cac082c, 0xc0035e35, 0x3f7ced91, 0x3ff076c8, 0xb4370d46,
+	0x40eaf312, 0x1cac082c, 0x3ff5e560, 0x4189374c, 0xbfda147a, 0xe1528910,
+	0x40eaf312, 0x1cac082c, 0x4014a1ca, 0xc083126e, 0x3fff74bc, 0x6a7cc960,
+	0x40eaf312, 0x1cac082c, 0x4021e51e, 0xb851eb85, 0x40118b43, 0x95806710,
+	0x40eb29c3, 0x3333332e, 0xc0240000, 0x00000000, 0x3fb99999, 0x99700000,
+	0x40eb29c3, 0x3333332e, 0xc018d78d, 0x4fdf3b64, 0x40053645, 0xa1c98c58,
+	0x40eb29c3, 0x3333332e, 0xc0035e35, 0x3f7ced91, 0x3fd72b02, 0x0c4078f0,
+	0x40eb29c3, 0x3333332e, 0x3ff5e560, 0x4189374c, 0x3fe26666, 0x6660ec10,
+	0x40eb29c3, 0x3333332e, 0x4014a1ca, 0xc083126e, 0x3ff11eb8, 0x51e94f48,
+	0x40eb29c3, 0x3333332e, 0x4021e51e, 0xb851eb85, 0x400bf0a3, 0xd708fc4c,
+	0x40eb6074, 0x49ba5e30, 0xc0240000, 0x00000000, 0xc002ed91, 0x68740000,
+	0x40eb6074, 0x49ba5e30, 0xc018d78d, 0x4fdf3b64, 0xbfe851eb, 0x85239480,
+	0x40eb6074, 0x49ba5e30, 0xc0035e35, 0x3f7ced91, 0xbfd3851e, 0xb85b4338,
+	0x40eb6074, 0x49ba5e30, 0x3ff5e560, 0x4189374c, 0x3fc83126, 0xe962b840,
+	0x40eb6074, 0x49ba5e30, 0x4014a1ca, 0xc083126e, 0x3fc645a1, 0xcaaea980,
+	0x40eb6074, 0x49ba5e30, 0x4021e51e, 0xb851eb85, 0x4004cac0, 0x83112a78,
+	0x40eb9725, 0x60418932, 0xc0240000, 0x00000000, 0xc01353f7, 0xced9c000,
+	0x40eb9725, 0x60418932, 0xc018d78d, 0x4fdf3b64, 0x40004fdf, 0x3b632030,
+	0x40eb9725, 0x60418932, 0xc0035e35, 0x3f7ced91, 0xbfef1a9f, 0xbe7b7fb0,
+	0x40eb9725, 0x60418932, 0x3ff5e560, 0x4189374c, 0xbfc9374b, 0xc6be3fc0,
+	0x40eb9725, 0x60418932, 0x4014a1ca, 0xc083126e, 0xbfe71a9f, 0xbe7b49d0,
+	0x40eb9725, 0x60418932, 0x4021e51e, 0xb851eb85, 0x3ffb49ba, 0x5e32b148,
+	0x40ebcdd6, 0x76c8b434, 0xc0240000, 0x00000000, 0x40059db2, 0x2d0d0000,
+	0x40ebcdd6, 0x76c8b434, 0xc018d78d, 0x4fdf3b64, 0xbff5f5c2, 0x8f5ea290,
+	0x40ebcdd6, 0x76c8b434, 0xc0035e35, 0x3f7ced91, 0x3fe90624, 0xdd2a5880,
+	0x40ebcdd6, 0x76c8b434, 0x3ff5e560, 0x4189374c, 0xbfe2a7ef, 0x9db7cdf0,
+	0x40ebcdd6, 0x76c8b434, 0x4014a1ca, 0xc083126e, 0xbff9e353, 0xf7d11f00,
+	0x40ebcdd6, 0x76c8b434, 0x4021e51e, 0xb851eb85, 0x3fe9fbe7, 0x6c861b40,
+	0x40ec0487, 0x8d4fdf36, 0xc0240000, 0x00000000, 0x3fce353f, 0x7cd80000,
+	0x40ec0487, 0x8d4fdf36, 0xc018d78d, 0x4fdf3b64, 0x3ff6d2f1, 0xa9f96810,
+	0x40ec0487, 0x8d4fdf36, 0xc0035e35, 0x3f7ced91, 0x3fbd70a3, 0xd6e3d360,
+	0x40ec0487, 0x8d4fdf36, 0x3ff5e560, 0x4189374c, 0x3fd99168, 0x72a4c550,
+	0x40ec0487, 0x8d4fdf36, 0x4014a1ca, 0xc083126e, 0xc0041cac, 0x08324c8c,
+	0x40ec0487, 0x8d4fdf36, 0x4021e51e, 0xb851eb85, 0xbfb4dd2f, 0x1ac96080,
+	0x40ec3b38, 0xa3d70a38, 0xc0240000, 0x00000000, 0xc001d70a, 0x3d720000,
+	0x40ec3b38, 0xa3d70a38, 0xc018d78d, 0x4fdf3b64, 0xbfffc28f, 0x5c2b7ae0,
+	0x40ec3b38, 0xa3d70a38, 0xc0035e35, 0x3f7ced91, 0xbfe1a9fb, 0xe77163a8,
+	0x40ec3b38, 0xa3d70a38, 0x3ff5e560, 0x4189374c, 0x3f8ba5e3, 0x52892a00,
+	0x40ec3b38, 0xa3d70a38, 0x4014a1ca, 0xc083126e, 0x3ffbf7ce, 0xd9143688,
+	0x40ec3b38, 0xa3d70a38, 0x4021e51e, 0xb851eb85, 0xbfef3333, 0x33387360,
+	0x40ec71e9, 0xba5e353a, 0xc0240000, 0x00000000, 0xc012c8b4, 0x3958c000,
+	0x40ec71e9, 0xba5e353a, 0xc018d78d, 0x4fdf3b64, 0x3fea0c49, 0xba591f80,
+	0x40ec71e9, 0xba5e353a, 0xc0035e35, 0x3f7ced91, 0x3ff33b64, 0x5a1a3a44,
+	0x40ec71e9, 0xba5e353a, 0x3ff5e560, 0x4189374c, 0xbfd7d70a, 0x3d7c32b0,
+	0x40ec71e9, 0xba5e353a, 0x4014a1ca, 0xc083126e, 0x3feb4395, 0x810178e0,
+	0x40ec71e9, 0xba5e353a, 0x4021e51e, 0xb851eb85, 0xbffde560, 0x418bdd58,
+	0x40eca89a, 0xd0e5603c, 0xc0240000, 0x00000000, 0x4006b439, 0x580f0000,
+	0x40eca89a, 0xd0e5603c, 0xc018d78d, 0x4fdf3b64, 0xc004c7ae, 0x147c2998,
+	0x40eca89a, 0xd0e5603c, 0xc0035e35, 0x3f7ced91, 0x3fe11eb8, 0x51e69674,
+	0x40eca89a, 0xd0e5603c, 0x3ff5e560, 0x4189374c, 0x3fe3851e, 0xb84c1740,
+	0x40eca89a, 0xd0e5603c, 0x4014a1ca, 0xc083126e, 0xbfa6872b, 0x0257b500,
+	0x40eca89a, 0xd0e5603c, 0x4021e51e, 0xb851eb85, 0xc0061893, 0x74bdc080,
+	0x40ecdf4b, 0xe76c8b3e, 0xc0240000, 0x00000000, 0x3fd7ced9, 0x167c0000,
+	0x40ecdf4b, 0xe76c8b3e, 0xc018d78d, 0x4fdf3b64, 0x3fc9cac0, 0x82fdbb80,
+	0x40ecdf4b, 0xe76c8b3e, 0xc0035e35, 0x3f7ced91, 0xbfc0e560, 0x419d1e80,
+	0x40ecdf4b, 0xe76c8b3e, 0x3ff5e560, 0x4189374c, 0x3fccac08, 0x310f6500,
+	0x40ecdf4b, 0xe76c8b3e, 0x4014a1ca, 0xc083126e, 0xbfee147a, 0xe14c6f80,
+	0x40ecdf4b, 0xe76c8b3e, 0x4021e51e, 0xb851eb85, 0xc00d3e76, 0xc8b59254,
+	0x40ed15fc, 0xfdf3b640, 0xc0240000, 0x00000000, 0xc000c083, 0x12700000,
+	0x40ed15fc, 0xfdf3b640, 0xc018d78d, 0x4fdf3b64, 0x40080106, 0x24dbe108,
+	0x40ed15fc, 0xfdf3b640, 0xc0035e35, 0x3f7ced91, 0xbfe99168, 0x72b525b4,
+	0x40ed15fc, 0xfdf3b640, 0x3ff5e560, 0x4189374c, 0xbfc4bc6a, 0x7f119300,
+	0x40ed15fc, 0xfdf3b640, 0x4014a1ca, 0xc083126e, 0xbffd6041, 0x8939b1d8,
+	0x40ed15fc, 0xfdf3b640, 0x4021e51e, 0xb851eb85, 0x40119810, 0x624d24f6,
+	0x40ed4cae, 0x147ae142, 0xc0240000, 0x00000000, 0xc0123d70, 0xa3d7c000,
+	0x40ed4cae, 0x147ae142, 0xc018d78d, 0x4fdf3b64, 0xbfda4dd2, 0xf1b48380,
+	0x40ed4cae, 0x147ae142, 0xc0035e35, 0x3f7ced91, 0x3fee8f5c, 0x28f0b27c,
+	0x40ed4cae, 0x147ae142, 0x3ff5e560, 0x4189374c, 0xbfe18937, 0x4bcca2c0,
+	0x40ed4cae, 0x147ae142, 0x4014a1ca, 0xc083126e, 0x40036872, 0xb01f8ee4,
+	0x40ed4cae, 0x147ae142, 0x4021e51e, 0xb851eb85, 0x400c0a3d, 0x70a27818,
+	0x40ed835f, 0x2b020c44, 0xc0240000, 0x00000000, 0x4007cac0, 0x83110000,
+	0x40ed835f, 0x2b020c44, 0xc018d78d, 0x4fdf3b64, 0x40031a9f, 0xbe7574e0,
+	0x40ed835f, 0x2b020c44, 0xc0035e35, 0x3f7ced91, 0x3fd26e97, 0x8d45a8d0,
+	0x40ed835f, 0x2b020c44, 0x3ff5e560, 0x4189374c, 0x3fdbced9, 0x167b1bb0,
+	0x40ed835f, 0x2b020c44, 0x4014a1ca, 0xc083126e, 0x3ff87ae1, 0x47aba3b0,
+	0x40ed835f, 0x2b020c44, 0x4021e51e, 0xb851eb85, 0x4004e45a, 0x1caaa644,
+	0x40edba10, 0x41893746, 0xc0240000, 0x00000000, 0x3fe04189, 0x37460000,
+	0x40edba10, 0x41893746, 0xc018d78d, 0x4fdf3b64, 0xbff06041, 0x8939f930,
+	0x40edba10, 0x41893746, 0xc0035e35, 0x3f7ced91, 0xbfd84189, 0x37561358,
+	0x40edba10, 0x41893746, 0x3ff5e560, 0x4189374c, 0x3fa8d4fd, 0xf354fd80,
+	0x40edba10, 0x41893746, 0x4014a1ca, 0xc083126e, 0x3fe449ba, 0x5e305330,
+	0x40edba10, 0x41893746, 0x4021e51e, 0xb851eb85, 0x3ffb7ced, 0x9165a8e0,
+	0x40edf0c1, 0x58106248, 0xc0240000, 0x00000000, 0xbfff53f7, 0xcedc0000,
+	0x40edf0c1, 0x58106248, 0xc018d78d, 0x4fdf3b64, 0x3ffc6872, 0xb01e1170,
+	0x40edf0c1, 0x58106248, 0xc0035e35, 0x3f7ced91, 0xbff0bc6a, 0x7efc73e0,
+	0x40edf0c1, 0x58106248, 0x3ff5e560, 0x4189374c, 0xbfd59999, 0x99a5dc50,
+	0x40edf0c1, 0x58106248, 0x4014a1ca, 0xc083126e, 0xbfd0c49b, 0xa5ed4200,
+	0x40edf0c1, 0x58106248, 0x4021e51e, 0xb851eb85, 0x3fea624d, 0xd2ec0a70,
+	0x40ee2772, 0x6e978d4a, 0xc0240000, 0x00000000, 0xc011b22d, 0x0e56c000,
+	0x40ee2772, 0x6e978d4a, 0xc018d78d, 0x4fdf3b64, 0xbffa2d0e, 0x5606d180,
+	0x40ee2772, 0x6e978d4a, 0xc0035e35, 0x3f7ced91, 0x3fe6a7ef, 0x9dacf070,
+	0x40ee2772, 0x6e978d4a, 0x3ff5e560, 0x4189374c, 0x3fe4a3d7, 0x0a374270,
+	0x40ee2772, 0x6e978d4a, 0x4014a1ca, 0xc083126e, 0xbff2872b, 0x020eca98,
+	0x40ee2772, 0x6e978d4a, 0x4021e51e, 0xb851eb85, 0xbfb1a9fb, 0xe799e700,
+	0x40ee5e23, 0x851eb84c, 0xc0240000, 0x00000000, 0x4008e147, 0xae130000,
+	0x40ee5e23, 0x851eb84c, 0xc018d78d, 0x4fdf3b64, 0x3ff29ba5, 0xe3513920,
+	0x40ee5e23, 0x851eb84c, 0xc0035e35, 0x3f7ced91, 0x3fa4fdf3, 0xb5f125c0,
+	0x40ee5e23, 0x851eb84c, 0x3ff5e560, 0x4189374c, 0x3fd09374, 0xbc5e08e0,
+	0x40ee5e23, 0x851eb84c, 0x4014a1ca, 0xc083126e, 0xc0006e97, 0x8d512258,
+	0x40ee5e23, 0x851eb84c, 0x4021e51e, 0xb851eb85, 0xbfeecccc, 0xccd28430,
+	0x40ee94d4, 0x9ba5e34e, 0xc0240000, 0x00000000, 0x3fe49ba5, 0xe34e0000,
+	0x40ee94d4, 0x9ba5e34e, 0xc018d78d, 0x4fdf3b64, 0xc001fced, 0x9169d4e8,
+	0x40ee94d4, 0x9ba5e34e, 0xc0035e35, 0x3f7ced91, 0xbfe40831, 0x26eecbb8,
+	0x40ee94d4, 0x9ba5e34e, 0x3ff5e560, 0x4189374c, 0xbfc04189, 0x3764e640,
+	0x40ee94d4, 0x9ba5e34e, 0x4014a1ca, 0xc083126e, 0x4001a9fb, 0xe76b4578,
+	0x40ee94d4, 0x9ba5e34e, 0x4021e51e, 0xb851eb85, 0xbffdb22d, 0x0e58e5c0,
+	0x40eecb85, 0xb22d0e50, 0xc0240000, 0x00000000, 0xbffd26e9, 0x78d80000,
+	0x40eecb85, 0xb22d0e50, 0xc018d78d, 0x4fdf3b64, 0x3fe19db2, 0x2d08c1a0,
+	0x40eecb85, 0xb22d0e50, 0xc0035e35, 0x3f7ced91, 0x3ff20c49, 0xba5b863c,
+	0x40eecb85, 0xb22d0e50, 0x3ff5e560, 0x4189374c, 0xbfe06a7e, 0xf9e17790,
+	0x40eecb85, 0xb22d0e50, 0x4014a1ca, 0xc083126e, 0x3ff4fdf3, 0xb64310d8,
+	0x40eecb85, 0xb22d0e50, 0x4021e51e, 0xb851eb85, 0xc005fef9, 0xdb2444b4,
+	0x40ef0236, 0xc8b43952, 0xc0240000, 0x00000000, 0xc01126e9, 0x78d5c000,
+	0x40ef0236, 0xc8b43952, 0xc018d78d, 0x4fdf3b64, 0xc006e353, 0xf7d04110,
+	0x40ef0236, 0xc8b43952, 0xc0035e35, 0x3f7ced91, 0x3fdd8106, 0x24d25cc8,
+	0x40ef0236, 0xc8b43952, 0x3ff5e560, 0x4189374c, 0x3fde0c49, 0xba517210,
+	0x40ef0236, 0xc8b43952, 0x4014a1ca, 0xc083126e, 0x3fda9fbe, 0x76be5b00,
+	0x40ef0236, 0xc8b43952, 0x4021e51e, 0xb851eb85, 0xc00d24dd, 0x2f1c1688,
+	0x40ef38e7, 0xdf3b6454, 0xc0240000, 0x00000000, 0x4009f7ce, 0xd9150000,
+	0x40ef38e7, 0xdf3b6454, 0xc018d78d, 0x4fdf3b64, 0xbfafbe76, 0xc90ef000,
+	0x40ef38e7, 0xdf3b6454, 0xc0035e35, 0x3f7ced91, 0xbfca5e35, 0x3f92bec0,
+	0x40ef38e7, 0xdf3b6454, 0x3ff5e560, 0x4189374c, 0x3fb56041, 0x8903d840,
+	0x40ef38e7, 0xdf3b6454, 0x4014a1ca, 0xc083126e, 0xbfdeb851, 0xeb8f8d60,
+	0x40ef38e7, 0xdf3b6454, 0x4021e51e, 0xb851eb85, 0x4011a4dd, 0x2f19e2dc,
+	0x40ef6f98, 0xf5c28f56, 0xc0240000, 0x00000000, 0x3fe8f5c2, 0x8f560000,
+	0x40ef6f98, 0xf5c28f56, 0xc018d78d, 0x4fdf3b64, 0x4005e560, 0x4187c990,
+	0x40ef6f98, 0xf5c28f56, 0xc0035e35, 0x3f7ced91, 0xbfebef9d, 0xb2328dc4,
+	0x40ef6f98, 0xf5c28f56, 0x3ff5e560, 0x4189374c, 0xbfd35c28, 0xf5cf85f0,
+	0x40ef6f98, 0xf5c28f56, 0x4014a1ca, 0xc083126e, 0xbff60418, 0x93775d70,
+	0x40ef6f98, 0xf5c28f56, 0x4021e51e, 0xb851eb85, 0x400c23d7, 0x0a3bf3e4,
+	0x40efa64a, 0x0c49ba58, 0xc0240000, 0x00000000, 0xbffaf9db, 0x22d40000,
+	0x40efa64a, 0x0c49ba58, 0xc018d78d, 0x4fdf3b64, 0xbfe59581, 0x062a9fa0,
+	0x40efa64a, 0x0c49ba58, 0xc0035e35, 0x3f7ced91, 0x3fec3126, 0xe9734a6c,
+	0x40efa64a, 0x0c49ba58, 0x3ff5e560, 0x4189374c, 0x3fe5c28f, 0x5c226da0,
+	0x40efa64a, 0x0c49ba58, 0x4014a1ca, 0xc083126e, 0xc0022d0e, 0x56056bc4,
+	0x40efa64a, 0x0c49ba58, 0x4021e51e, 0xb851eb85, 0x4004fdf3, 0xb6442210,
+	0x40efdcfb, 0x22d0e55a, 0xc0240000, 0x00000000, 0xc0109ba5, 0xe354c000,
+	0x40efdcfb, 0x22d0e55a, 0xc018d78d, 0x4fdf3b64, 0x4000fef9, 0xdb215d68,
+	0x40efdcfb, 0x22d0e55a, 0xc0035e35, 0x3f7ced91, 0x3fcb645a, 0x1c95b160,
+	0x40efdcfb, 0x22d0e55a, 0x3ff5e560, 0x4189374c, 0x3fd2d0e5, 0x60345f40,
+	0x40efdcfb, 0x22d0e55a, 0x4014a1ca, 0xc083126e, 0x3fffd70a, 0x3d6df818,
+	0x40efdcfb, 0x22d0e55a, 0x4021e51e, 0xb851eb85, 0x3ffbb020, 0xc498a078,
+	0x40f009d6, 0x1cac082e, 0xc0240000, 0x00000000, 0x400b0e56, 0x04170000,
+	0x40f009d6, 0x1cac082e, 0xc018d78d, 0x4fdf3b64, 0xbff4978d, 0x4fe22820,
+	0x40f009d6, 0x1cac082e, 0xc0035e35, 0x3f7ced91, 0xbfdcfdf3, 0xb650e378,
+	0x40f009d6, 0x1cac082e, 0x3ff5e560, 0x4189374c, 0xbfb78d4f, 0xdf707300,
+	0x40f009d6, 0x1cac082e, 0x4014a1ca, 0xc083126e, 0x3ff18106, 0x24da7e00,
+	0x40f009d6, 0x1cac082e, 0x4021e51e, 0xb851eb85, 0x3feac8b4, 0x3951f9a0,
+	0x40f0252e, 0xa7ef9daf, 0xc0240000, 0x00000000, 0x3fed4fdf, 0x3b5e0000,
+	0x40f0252e, 0xa7ef9daf, 0xc018d78d, 0x4fdf3b64, 0x3ff83126, 0xe975e280,
+	0x40f0252e, 0xa7ef9daf, 0xc0035e35, 0x3f7ced91, 0xbff1eb85, 0x1ebb27e8,
+	0x40f0252e, 0xa7ef9daf, 0x3ff5e560, 0x4189374c, 0xbfde978d, 0x4fec98c0,
+	0x40f0252e, 0xa7ef9daf, 0x4014a1ca, 0xc083126e, 0x3fc95810, 0x62381f40,
+	0x40f0252e, 0xa7ef9daf, 0x4021e51e, 0xb851eb85, 0xbfaced91, 0x68d4db00,
+	0x40f04087, 0x33333330, 0xc0240000, 0x00000000, 0xbff8cccc, 0xccd00000,
+	0x40f04087, 0x33333330, 0xc018d78d, 0x4fdf3b64, 0xbffe645a, 0x1caf0070,
+	0x40f04087, 0x33333330, 0xc0035e35, 0x3f7ced91, 0x3fe449ba, 0x5e2f8860,
+	0x40f04087, 0x33333330, 0x3ff5e560, 0x4189374c, 0x3fe024dd, 0x2f13e438,
+	0x40f04087, 0x33333330, 0x4014a1ca, 0xc083126e, 0xbfe65604, 0x1898ec60,
+	0x40f04087, 0x33333330, 0x4021e51e, 0xb851eb85, 0xbfee6666, 0x666c9500,
+	0x40f05bdf, 0xbe76c8b1, 0xc0240000, 0x00000000, 0xc0101062, 0x4dd3c000,
+	0x40f05bdf, 0xbe76c8b1, 0xc018d78d, 0x4fdf3b64, 0x3fecc8b4, 0x39521460,
+	0x40f05bdf, 0xbe76c8b1, 0xc0035e35, 0x3f7ced91, 0xbfa0e560, 0x41e55b40,
+	0x40f05bdf, 0xbe76c8b1, 0x3ff5e560, 0x4189374c, 0x3fbe5604, 0x185d31c0,
+	0x40f05bdf, 0xbe76c8b1, 0x4014a1ca, 0xc083126e, 0xbff98106, 0x24dff048,
+	0x40f05bdf, 0xbe76c8b1, 0x4021e51e, 0xb851eb85, 0xbffd7ef9, 0xdb25ee28,
+	0x40f07738, 0x49ba5e32, 0xc0240000, 0x00000000, 0x400c24dd, 0x2f190000,
+	0x40f07738, 0x49ba5e32, 0xc018d78d, 0x4fdf3b64, 0xc0041893, 0x74bdec60,
+	0x40f07738, 0x49ba5e32, 0xc0035e35, 0x3f7ced91, 0xbfe66666, 0x666c33c8,
+	0x40f07738, 0x49ba5e32, 0x3ff5e560, 0x4189374c, 0xbfd11eb8, 0x51f92f90,
+	0x40f07738, 0x49ba5e32, 0x4014a1ca, 0xc083126e, 0xc003eb85, 0x1eb9b530,
+	0x40f07738, 0x49ba5e32, 0x4021e51e, 0xb851eb85, 0xc005e560, 0x418ac8e8,
+	0x40f09290, 0xd4fdf3b3, 0xc0240000, 0x00000000, 0x3ff0d4fd, 0xf3b30000,
+	0x40f09290, 0xd4fdf3b3, 0xc018d78d, 0x4fdf3b64, 0x3fd25e35, 0x3f70c780,
+	0x40f09290, 0xd4fdf3b3, 0xc0035e35, 0x3f7ced91, 0x3ff0dd2f, 0x1a9cd234,
+	0x40f09290, 0xd4fdf3b3, 0x3ff5e560, 0x4189374c, 0xbfe4e978, 0xd504d5c8,
+	0x40f09290, 0xd4fdf3b3, 0x4014a1ca, 0xc083126e, 0x3ffc5a1c, 0xac056540,
+	0x40f09290, 0xd4fdf3b3, 0x4021e51e, 0xb851eb85, 0xc00d0b43, 0x95829abc,
+	0x40f0ade9, 0x60418934, 0xc0240000, 0x00000000, 0xbff69fbe, 0x76cc0000,
+	0x40f0ade9, 0x60418934, 0xc018d78d, 0x4fdf3b64, 0x4008b020, 0xc49a1e40,
+	0x40f0ade9, 0x60418934, 0xc0035e35, 0x3f7ced91, 0x3fd8c49b, 0xa5d78ca8,
+	0x40f0ade9, 0x60418934, 0x3ff5e560, 0x4189374c, 0x3fd50e56, 0x040ab5a0,
+	0x40f0ade9, 0x60418934, 0x4014a1ca, 0xc083126e, 0x3fec0831, 0x26e3d650,
+	0x40f0ade9, 0x60418934, 0x4021e51e, 0xb851eb85, 0x4011b1a9, 0xfbe6a0c2,
+	0x40f0c941, 0xeb851eb5, 0xc0240000, 0x00000000, 0xc00f0a3d, 0x70a58000,
+	0x40f0c941, 0xeb851eb5, 0xc018d78d, 0x4fdf3b64, 0xbfd4d4fd, 0xf3c299c0,
+	0x40f0c941, 0xeb851eb5, 0xc0035e35, 0x3f7ced91, 0xbfd1eb85, 0x1ec42f80,
+	0x40f0c941, 0xeb851eb5, 0x3ff5e560, 0x4189374c, 0xbfad2f1a, 0xa02e3300,
+	0x40f0c941, 0xeb851eb5, 0x4014a1ca, 0xc083126e, 0xbf947ae1, 0x4863bc00,
+	0x40f0c941, 0xeb851eb5, 0x4021e51e, 0xb851eb85, 0x400c3d70, 0xa3d56fb0,
+	0x40f0e49a, 0x76c8b436, 0xc0240000, 0x00000000, 0x400d3b64, 0x5a1b0000,
+	0x40f0e49a, 0x76c8b436, 0xc018d78d, 0x4fdf3b64, 0x4003c9ba, 0x5e33b218,
+	0x40f0e49a, 0x76c8b436, 0xc0035e35, 0x3f7ced91, 0xbfee4dd2, 0xf1aff5d4,
+	0x40f0e49a, 0x76c8b436, 0x3ff5e560, 0x4189374c, 0xbfdc5a1c, 0xac164260,
+	0x40f0e49a, 0x76c8b436, 0x4014a1ca, 0xc083126e, 0xbfed4fdf, 0x3b6a1210,
+	0x40f0e49a, 0x76c8b436, 0x4021e51e, 0xb851eb85, 0x4005178d, 0x4fdd9ddc,
+	0x40f0fff3, 0x020c49b7, 0xc0240000, 0x00000000, 0x3ff3020c, 0x49b70000,
+	0x40f0fff3, 0x020c49b7, 0xc018d78d, 0x4fdf3b64, 0xbfee0418, 0x937afd80,
+	0x40f0fff3, 0x020c49b7, 0xc0035e35, 0x3f7ced91, 0x3fe9d2f1, 0xa9f5e25c,
+	0x40f0fff3, 0x020c49b7, 0x3ff5e560, 0x4189374c, 0x3fe14395, 0x80ff0f68,
+	0x40f0fff3, 0x020c49b7, 0x4014a1ca, 0xc083126e, 0xbffcfdf3, 0xb6488320,
+	0x40f0fff3, 0x020c49b7, 0x4021e51e, 0xb851eb85, 0x3ffbe353, 0xf7cb9810,
+	0x40f11b4b, 0x8d4fdf38, 0xc0240000, 0x00000000, 0xbff472b0, 0x20c80000,
+	0x40f11b4b, 0x8d4fdf38, 0xc018d78d, 0x4fdf3b64, 0x3ffdc6a7, 0xef9a8be0,
+	0x40f11b4b, 0x8d4fdf38, 0xc0035e35, 0x3f7ced91, 0x3fc1eb85, 0x1ea01120,
+	0x40f11b4b, 0x8d4fdf38, 0x3ff5e560, 0x4189374c, 0x3fc3a5e3, 0x53db45a0,
+	0x40f11b4b, 0x8d4fdf38, 0x4014a1ca, 0xc083126e, 0x40039999, 0x99982640,
+	0x40f11b4b, 0x8d4fdf38, 0x4021e51e, 0xb851eb85, 0x3feb2f1a, 0x9fb7e8d0,
+	0x40f136a4, 0x189374b9, 0xc0240000, 0x00000000, 0xc00df3b6, 0x45a38000,
+	0x40f136a4, 0x189374b9, 0xc018d78d, 0x4fdf3b64, 0xbff8ced9, 0x168a5710,
+	0x40f136a4, 0x189374b9, 0xc0035e35, 0x3f7ced91, 0xbfe0dd2f, 0x1aa5d9cc,
+	0x40f136a4, 0x189374b9, 0x3ff5e560, 0x4189374c, 0xbfcdc28f, 0x5c45b260,
+	0x40f136a4, 0x189374b9, 0x4014a1ca, 0xc083126e, 0x3ff8dd2f, 0x1a9cd268,
+	0x40f136a4, 0x189374b9, 0x4021e51e, 0xb851eb85, 0xbfa6872b, 0x0275e800,
+	0x40f151fc, 0xa3d70a3a, 0xc0240000, 0x00000000, 0x400e51eb, 0x851d0000,
+	0x40f151fc, 0xa3d70a3a, 0xc018d78d, 0x4fdf3b64, 0x3ff3f9db, 0x22cdb390,
+	0x40f151fc, 0xa3d70a3a, 0xc0035e35, 0x3f7ced91, 0xbff31a9f, 0xbe79dbf0,
+	0x40f151fc, 0xa3d70a3a, 0x3ff5e560, 0x4189374c, 0xbfe3cac0, 0x8319aa98,
+	0x40f151fc, 0xa3d70a3a, 0x4014a1ca, 0xc083126e, 0x3fe50e56, 0x0412b0a0,
+	0x40f151fc, 0xa3d70a3a, 0x4021e51e, 0xb851eb85, 0xbfee0000, 0x0006a5d0,
+	0x40f16d55, 0x2f1a9fbb, 0xc0240000, 0x00000000, 0x3ff52f1a, 0x9fbb0000,
+	0x40f16d55, 0x2f1a9fbb, 0xc018d78d, 0x4fdf3b64, 0xc0014dd2, 0xf1ab97b0,
+	0x40f16d55, 0x2f1a9fbb, 0xc0035e35, 0x3f7ced91, 0x3fe1eb85, 0x1eb22050,
+	0x40f16d55, 0x2f1a9fbb, 0x3ff5e560, 0x4189374c, 0x3fd74bc6, 0xa7e10c00,
+	0x40f16d55, 0x2f1a9fbb, 0x4014a1ca, 0xc083126e, 0xbfce76c8, 0xb4510e40,
+	0x40f16d55, 0x2f1a9fbb, 0x4021e51e, 0xb851eb85, 0xbffd4bc6, 0xa7f2f690,
+	0x40f188ad, 0xba5e353c, 0xc0240000, 0x00000000, 0xbff245a1, 0xcac40000,
+	0x40f188ad, 0xba5e353c, 0xc018d78d, 0x4fdf3b64, 0x3fe45a1c, 0xac01b680,
+	0x40f188ad, 0xba5e353c, 0xc0035e35, 0x3f7ced91, 0xbfbb645a, 0x1cddee20,
+	0x40f188ad, 0xba5e353c, 0x3ff5e560, 0x4189374c, 0xbf96872b, 0x02f70000,
+	0x40f188ad, 0xba5e353c, 0x4014a1ca, 0xc083126e, 0xbff224dd, 0x2f1d9be0,
+	0x40f188ad, 0xba5e353c, 0x4021e51e, 0xb851eb85, 0xc005cbc6, 0xa7f14d1c,
+	0x40f1a406, 0x45a1cabd, 0xc0240000, 0x00000000, 0xc00cdd2f, 0x1aa18000,
+	0x40f1a406, 0x45a1cabd, 0xc018d78d, 0x4fdf3b64, 0xc0063439, 0x581203d8,
+	0x40f1a406, 0x45a1cabd, 0xc0035e35, 0x3f7ced91, 0xbfe8c49b, 0xa5e99bd8,
+	0x40f1a406, 0x45a1cabd, 0x3ff5e560, 0x4189374c, 0xbfda1cac, 0x083fec00,
+	0x40f1a406, 0x45a1cabd, 0x4014a1ca, 0xc083126e, 0xc0003d70, 0xa3d88afc,
+	0x40f1a406, 0x45a1cabd, 0x4021e51e, 0xb851eb85, 0xc00cf1a9, 0xfbe91ef0,
+	0x40f1bf5e, 0xd0e5603e, 0xc0240000, 0x00000000, 0x400f6872, 0xb01f0000,
+	0x40f1bf5e, 0xd0e5603e, 0xc018d78d, 0x4fdf3b64, 0x3f981062, 0x4d00bc00,
+	0x40f1bf5e, 0xd0e5603e, 0xc0035e35, 0x3f7ced91, 0x3fef5c28, 0xf5bc3c58,
+	0x40f1bf5e, 0xd0e5603e, 0x3ff5e560, 0x4189374c, 0x3fe2624d, 0xd2ea3a98,
+	0x40f1bf5e, 0xd0e5603e, 0x4014a1ca, 0xc083126e, 0x4001db22, 0xd0e3dcd4,
+	0x40f1bf5e, 0xd0e5603e, 0x4021e51e, 0xb851eb85, 0x4011be76, 0xc8b35ea8,
+	0x40f1dab7, 0x5c28f5bf, 0xc0240000, 0x00000000, 0x3ff75c28, 0xf5bf0000,
+	0x40f1dab7, 0x5c28f5bf, 0xc018d78d, 0x4fdf3b64, 0x4006947a, 0xe14606c8,
+	0x40f1dab7, 0x5c28f5bf, 0xc0035e35, 0x3f7ced91, 0x3fd40831, 0x26dcbc88,
+	0x40f1dab7, 0x5c28f5bf, 0x3ff5e560, 0x4189374c, 0x3fc820c4, 0x9b87f260,
+	0x40f1dab7, 0x5c28f5bf, 0x4014a1ca, 0xc083126e, 0x3ff56041, 0x89343f90,
+	0x40f1dab7, 0x5c28f5bf, 0x4021e51e, 0xb851eb85, 0x400c570a, 0x3d6eeb7c,
+	0x40f1f60f, 0xe76c8b40, 0xc0240000, 0x00000000, 0xbff01893, 0x74c00000,
+	0x40f1f60f, 0xe76c8b40, 0xc018d78d, 0x4fdf3b64, 0xbfe2d916, 0x8731aac0,
+	0x40f1f60f, 0xe76c8b40, 0xc0035e35, 0x3f7ced91, 0xbfd6a7ef, 0x9dbeffa0,
+	0x40f1f60f, 0xe76c8b40, 0x3ff5e560, 0x4189374c, 0xbfc947ae, 0x149905a0,
+	0x40f1f60f, 0xe76c8b40, 0x4014a1ca, 0xc083126e, 0x3fdc28f5, 0xc28315e0,
+	0x40f1f60f, 0xe76c8b40, 0x4021e51e, 0xb851eb85, 0x40053126, 0xe97719a8,
+	0x40f21168, 0x72b020c1, 0xc0240000, 0x00000000, 0xc00bc6a7, 0xef9f8000,
+	0x40f21168, 0x72b020c1, 0xc018d78d, 0x4fdf3b64, 0x4001ae14, 0x7adf9aa0,
+	0x40f21168, 0x72b020c1, 0xc0035e35, 0x3f7ced91, 0xbff05604, 0x1896aef2,
+	0x40f21168, 0x72b020c1, 0x3ff5e560, 0x4189374c, 0xbfe2ac08, 0x312e7f68,
+	0x40f21168, 0x72b020c1, 0x4014a1ca, 0xc083126e, 0xbfdd2f1a, 0x9fcad280,
+	0x40f21168, 0x72b020c1, 0x4021e51e, 0xb851eb85, 0x3ffc1687, 0x2afe8fa8,
+	0x40f22cc0, 0xfdf3b642, 0xc0240000, 0x00000000, 0x40103f7c, 0xed908000,
+	0x40f22cc0, 0xfdf3b642, 0xc018d78d, 0x4fdf3b64, 0xbff33958, 0x1065adb0,
+	0x40f22cc0, 0xfdf3b642, 0xc0035e35, 0x3f7ced91, 0x3fe774bc, 0x6a787a4c,
+	0x40f22cc0, 0xfdf3b642, 0x3ff5e560, 0x4189374c, 0x3fd98937, 0x4bb76260,
+	0x40f22cc0, 0xfdf3b642, 0x4014a1ca, 0xc083126e, 0xbff5a1ca, 0xc0862eb8,
+	0x40f22cc0, 0xfdf3b642, 0x4021e51e, 0xb851eb85, 0x3feb9581, 0x061dd800,
+	0x40f24819, 0x89374bc3, 0xc0240000, 0x00000000, 0x3ff98937, 0x4bc30000,
+	0x40f24819, 0x89374bc3, 0xc018d78d, 0x4fdf3b64, 0x3ff98f5c, 0x28f25cf0,
+	0x40f24819, 0x89374bc3, 0xc0035e35, 0x3f7ced91, 0x3fb0e560, 0x4154e1c0,
+	0x40f24819, 0x89374bc3, 0x3ff5e560, 0x4189374c, 0x3f8a9fbe, 0x74dccc00,
+	0x40f24819, 0x89374bc3, 0x4014a1ca, 0xc083126e, 0xc001fbe7, 0x6c8cd468,
+	0x40f24819, 0x89374bc3, 0x4021e51e, 0xb851eb85, 0xbfa020c4, 0x9c16f500,
+	0x40f26372, 0x147ae144, 0xc0240000, 0x00000000, 0xbfebd70a, 0x3d780000,
+	0x40f26372, 0x147ae144, 0xc018d78d, 0x4fdf3b64, 0xbffd0624, 0xdd328600,
+	0x40f26372, 0x147ae144, 0xc0035e35, 0x3f7ced91, 0xbfe33b64, 0x5a2341dc,
+	0x40f26372, 0x147ae144, 0x3ff5e560, 0x4189374c, 0xbfd7df3b, 0x646995a0,
+	0x40f26372, 0x147ae144, 0x4014a1ca, 0xc083126e, 0x40001cac, 0x082f9368,
+	0x40f26372, 0x147ae144, 0x4021e51e, 0xb851eb85, 0xbfed9999, 0x99a0b6a0,
+	0x40f27eca, 0x9fbe76c5, 0xc0240000, 0x00000000, 0xc00ab020, 0xc49d8000,
+	0x40f27eca, 0x9fbe76c5, 0xc018d78d, 0x4fdf3b64, 0x3fef851e, 0xb84b0940,
+	0x40f27eca, 0x9fbe76c5, 0xc0035e35, 0x3f7ced91, 0x3ff272b0, 0x20c14b2a,
+	0x40f27eca, 0x9fbe76c5, 0x3ff5e560, 0x4189374c, 0x3fe38106, 0x24d565c8,
+	0x40f27eca, 0x9fbe76c5, 0x4014a1ca, 0xc083126e, 0x3ff1e353, 0xf7cbacb8,
+	0x40f27eca, 0x9fbe76c5, 0x4021e51e, 0xb851eb85, 0xbffd1893, 0x74bffef8,
+	0x40f29a23, 0x2b020c46, 0xc0240000, 0x00000000, 0x4010cac0, 0x83118000,
+	0x40f29a23, 0x2b020c46, 0xc018d78d, 0x4fdf3b64, 0xc0036978, 0xd4ffaf28,
+	0x40f29a23, 0x2b020c46, 0xc0035e35, 0x3f7ced91, 0x3fdf1a9f, 0xbe697080,
+	0x40f29a23, 0x2b020c46, 0x3ff5e560, 0x4189374c, 0x3fcc9ba5, 0xe3349f20,
+	0x40f29a23, 0x2b020c46, 0x4014a1ca, 0xc083126e, 0x3fcc6a7e, 0xf9c19500,
+	0x40f29a23, 0x2b020c46, 0x4021e51e, 0xb851eb85, 0xc005b22d, 0x0e57d150,
+	0x40f2b57b, 0xb645a1c7, 0xc0240000, 0x00000000, 0x3ffbb645, 0xa1c70000,
+	0x40f2b57b, 0xb645a1c7, 0xc018d78d, 0x4fdf3b64, 0x3fd7d70a, 0x3d62b140,
+	0x40f2b57b, 0xb645a1c7, 0xc0035e35, 0x3f7ced91, 0xbfc72b02, 0x0c649750,
+	0x40f2b57b, 0xb645a1c7, 0x3ff5e560, 0x4189374c, 0xbfc4cccc, 0xccec58e0,
+	0x40f2b57b, 0xb645a1c7, 0x4014a1ca, 0xc083126e, 0xbfe59168, 0x72b68ef0,
+	0x40f2b57b, 0xb645a1c7, 0x4021e51e, 0xb851eb85, 0xc00cd810, 0x624fa324,
+	0x40f2d0d4, 0x41893748, 0xc0240000, 0x00000000, 0xbfe77ced, 0x91700000,
+	0x40f2d0d4, 0x41893748, 0xc018d78d, 0x4fdf3b64, 0xc0084fdf, 0x3b661b50,
+	0x40f2d0d4, 0x41893748, 0xc0035e35, 0x3f7ced91, 0xbfeb22d0, 0xe56703e8,
+	0x40f2d0d4, 0x41893748, 0x3ff5e560, 0x4189374c, 0xbfe18d4f, 0xdf435438,
+	0x40f2d0d4, 0x41893748, 0x4014a1ca, 0xc083126e, 0xbff91eb8, 0x51eec190,
+	0x40f2d0d4, 0x41893748, 0x4021e51e, 0xb851eb85, 0x4011cb43, 0x95801c8e,
+	0x40f2ec2c, 0xccccccc9, 0xc0240000, 0x00000000, 0xc0099999, 0x999b8000,
+	0x40f2ec2c, 0xccccccc9, 0xc018d78d, 0x4fdf3b64, 0xbfceb851, 0xeba16000,
+	0x40f2ec2c, 0xccccccc9, 0xc0035e35, 0x3f7ced91, 0x3fecfdf3, 0xb63ed448,
+	0x40f2ec2c, 0xccccccc9, 0x3ff5e560, 0x4189374c, 0x3fdbc6a7, 0xef8db8c0,
+	0x40f2ec2c, 0xccccccc9, 0x4014a1ca, 0xc083126e, 0xc003ba5e, 0x35411dd4,
+	0x40f2ec2c, 0xccccccc9, 0x4021e51e, 0xb851eb85, 0x400c70a3, 0xd7086748,
+	0x40f30785, 0x5810624a, 0xc0240000, 0x00000000, 0x40115604, 0x18928000,
+	0x40f30785, 0x5810624a, 0xc018d78d, 0x4fdf3b64, 0x400478d4, 0xfdf1ef50,
+	0x40f30785, 0x5810624a, 0xc0035e35, 0x3f7ced91, 0x3fce978d, 0x4fc3d8d0,
+	0x40f30785, 0x5810624a, 0x3ff5e560, 0x4189374c, 0x3fa89374, 0xbbe9e600,
+	0x40f30785, 0x5810624a, 0x4014a1ca, 0xc083126e, 0x3ffcbc6a, 0x7ef693f8,
+	0x40f30785, 0x5810624a, 0x4021e51e, 0xb851eb85, 0x40054ac0, 0x83109574,
+	0x40f322dd, 0xe353f7cb, 0xc0240000, 0x00000000, 0x3ffde353, 0xf7cb0000,
+	0x40f322dd, 0xe353f7cb, 0xc018d78d, 0x4fdf3b64, 0xbfeb47ae, 0x148208a0,
+	0x40f322dd, 0xe353f7cb, 0xc0035e35, 0x3f7ced91, 0xbfdb645a, 0x1cb9cfc0,
+	0x40f322dd, 0xe353f7cb, 0x3ff5e560, 0x4189374c, 0xbfd5a1ca, 0xc0933f40,
+	0x40f322dd, 0xe353f7cb, 0x4014a1ca, 0xc083126e, 0x3feccccc, 0xccc633c0,
+	0x40f322dd, 0xe353f7cb, 0x4021e51e, 0xb851eb85, 0x3ffc49ba, 0x5e318740,
+	0x40f33e36, 0x6e978d4c, 0xc0240000, 0x00000000, 0xbfe322d0, 0xe5680000,
+	0x40f33e36, 0x6e978d4c, 0xc018d78d, 0x4fdf3b64, 0x3fff24dd, 0x2f170650,
+	0x40f33e36, 0x6e978d4c, 0xc0035e35, 0x3f7ced91, 0xbff1851e, 0xb85562fa,
+	0x40f33e36, 0x6e978d4c, 0x3ff5e560, 0x4189374c, 0x3fe49fbe, 0x76c090f8,
+	0x40f33e36, 0x6e978d4c, 0x4014a1ca, 0xc083126e, 0x3f70624d, 0xcf9fc800,
+	0x40f33e36, 0x6e978d4c, 0x4021e51e, 0xb851eb85, 0x3febfbe7, 0x6c83c730,
+	0x40f3598e, 0xf9db22cd, 0xc0240000, 0x00000000, 0xc0088312, 0x6e998000,
+	0x40f3598e, 0xf9db22cd, 0xc018d78d, 0x4fdf3b64, 0xbff770a3, 0xd70ddca0,
+	0x40f3598e, 0xf9db22cd, 0xc0035e35, 0x3f7ced91, 0x3fe51687, 0x2afb123c,
+	0x40f3598e, 0xf9db22cd, 0x3ff5e560, 0x4189374c, 0x3fd08b43, 0x9570a5f0,
+	0x40f3598e, 0xf9db22cd, 0x4014a1ca, 0xc083126e, 0xbfec8b43, 0x9587b4a0,
+	0x40f3598e, 0xf9db22cd, 0x4021e51e, 0xb851eb85, 0xbf9374bc, 0x6b700400,
+	0x40f374e7, 0x851eb84e, 0xc0240000, 0x00000000, 0x4011e147, 0xae138000,
+	0x40f374e7, 0x851eb84e, 0xc018d78d, 0x4fdf3b64, 0x3ff55810, 0x624a2e00,
+	0x40f374e7, 0x851eb84e, 0xc0035e35, 0x3f7ced91, 0xbf80624d, 0xd4b2f600,
+	0x40f374e7, 0x851eb84e, 0x3ff5e560, 0x4189374c, 0xbfc051eb, 0x853fac20,
+	0x40f374e7, 0x851eb84e, 0x4014a1ca, 0xc083126e, 0xbffc9ba5, 0xe3575468,
+	0x40f374e7, 0x851eb84e, 0x4021e51e, 0xb851eb85, 0xbfed3333, 0x333ac770,
+	0x40f39040, 0x10624dcf, 0xc0240000, 0x00000000, 0x40000831, 0x26e78000,
+	0x40f39040, 0x10624dcf, 0xc018d78d, 0x4fdf3b64, 0xc0009eb8, 0x51ed5a78,
+	0x40f39040, 0x10624dcf, 0xc0035e35, 0x3f7ced91, 0xbfe59999, 0x99a0a9ec,
+	0x40f39040, 0x10624dcf, 0x3ff5e560, 0x4189374c, 0xbfe06e97, 0x8d582908,
+	0x40f39040, 0x10624dcf, 0x4014a1ca, 0xc083126e, 0x4003cac0, 0x8310bd9c,
+	0x40f39040, 0x10624dcf, 0x4021e51e, 0xb851eb85, 0xbffce560, 0x418d0760,
+	0x40f3ab98, 0x9ba5e350, 0xc0240000, 0x00000000, 0xbfdd9168, 0x72c00000,
+	0x40f3ab98, 0x9ba5e350, 0xc018d78d, 0x4fdf3b64, 0x3fe71687, 0x2afaab60,
+	0x40f3ab98, 0x9ba5e350, 0xc0035e35, 0x3f7ced91, 0x3ff14395, 0x81029722,
+	0x40f3ab98, 0x9ba5e350, 0x3ff5e560, 0x4189374c, 0x3fde0418, 0x93640f20,
+	0x40f3ab98, 0x9ba5e350, 0x4014a1ca, 0xc083126e, 0x3ff93f7c, 0xed8e0120,
+	0x40f3ab98, 0x9ba5e350, 0x4021e51e, 0xb851eb85, 0xc0059893, 0x74be5584,
+	0x40f3c6f1, 0x26e978d1, 0xc0240000, 0x00000000, 0xc0076c8b, 0x43978000,
+	0x40f3c6f1, 0x26e978d1, 0xc018d78d, 0x4fdf3b64, 0xc005851e, 0xb853c6a0,
+	0x40f3c6f1, 0x26e978d1, 0xc0035e35, 0x3f7ced91, 0x3fda5e35, 0x3f6ea060,
+	0x40f3c6f1, 0x26e978d1, 0x3ff5e560, 0x4189374c, 0x3fb53f7c, 0xed4e4c80,
+	0x40f3c6f1, 0x26e978d1, 0x4014a1ca, 0xc083126e, 0x3fe5d2f1, 0xa9f50e10,
+	0x40f3c6f1, 0x26e978d1, 0x4021e51e, 0xb851eb85, 0xc00cbe76, 0xc8b62758,
+	0x40f3e249, 0xb22d0e52, 0xc0240000, 0x00000000, 0x40126c8b, 0x43948000,
+	0x40f3e249, 0xb22d0e52, 0xc018d78d, 0x4fdf3b64, 0x3fbbe76c, 0x8b07d600,
+	0x40f3e249, 0xb22d0e52, 0xc0035e35, 0x3f7ced91, 0xbfd051eb, 0x852d1bc8,
+	0x40f3e249, 0xb22d0e52, 0x3ff5e560, 0x4189374c, 0xbfd3645a, 0x1cbce8e0,
+	0x40f3e249, 0xb22d0e52, 0x4014a1ca, 0xc083126e, 0xbfcb645a, 0x1cc79880,
+	0x40f3e249, 0xb22d0e52, 0x4021e51e, 0xb851eb85, 0x4011d810, 0x624cda74,
+	0x40f3fda2, 0x3d70a3d3, 0xc0240000, 0x00000000, 0x40011eb8, 0x51e98000,
+	0x40f3fda2, 0x3d70a3d3, 0xc018d78d, 0x4fdf3b64, 0x40074395, 0x81044400,
+	0x40f3fda2, 0x3d70a3d3, 0xc0035e35, 0x3f7ced91, 0xbfed8106, 0x24e46bf8,
+	0x40f3fda2, 0x3d70a3d3, 0x3ff5e560, 0x4189374c, 0x3fe5be76, 0xc8abbc28,
+	0x40f3fda2, 0x3d70a3d3, 0x4014a1ca, 0xc083126e, 0xbff1c28f, 0x5c2c6d28,
+	0x40f3fda2, 0x3d70a3d3, 0x4021e51e, 0xb851eb85, 0x400c8a3d, 0x70a1e314,
+	0x40f418fa, 0xc8b43954, 0xc0240000, 0x00000000, 0xbfd4dd2f, 0x1ab00000,
+	0x40f418fa, 0xc8b43954, 0xc018d78d, 0x4fdf3b64, 0xbfe01cac, 0x0838b5e0,
+	0x40f418fa, 0xc8b43954, 0xc0035e35, 0x3f7ced91, 0x3fea9fbe, 0x76c16c38,
+	0x40f418fa, 0xc8b43954, 0x3ff5e560, 0x4189374c, 0x3fd2c8b4, 0x3946fc50,
+	0x40f418fa, 0xc8b43954, 0x4014a1ca, 0xc083126e, 0xc0000c49, 0xba5ff3a0,
+	0x40f418fa, 0xc8b43954, 0x4021e51e, 0xb851eb85, 0x4005645a, 0x1caa1140,
+	0x40f43453, 0x53f7ced5, 0xc0240000, 0x00000000, 0xc0065604, 0x18958000,
+	0x40f43453, 0x53f7ced5, 0xc018d78d, 0x4fdf3b64, 0x40025d2f, 0x1a9dd7d8,
+	0x40f43453, 0x53f7ced5, 0xc0035e35, 0x3f7ced91, 0x3fc51eb8, 0x51ce3890,
+	0x40f43453, 0x53f7ced5, 0x3ff5e560, 0x4189374c, 0xbfb7ae14, 0x7b25fec0,
+	0x40f43453, 0x53f7ced5, 0x4014a1ca, 0xc083126e, 0x40020c49, 0xba5c7430,
+	0x40f43453, 0x53f7ced5, 0x4021e51e, 0xb851eb85, 0x3ffc7ced, 0x91647ed8,
+	0x40f44fab, 0xdf3b6456, 0xc0240000, 0x00000000, 0x4012f7ce, 0xd9158000,
+	0x40f44fab, 0xdf3b6456, 0xc018d78d, 0x4fdf3b64, 0xbff1db22, 0xd0e93340,
+	0x40f44fab, 0xdf3b6456, 0xc0035e35, 0x3f7ced91, 0xbfe01062, 0x4dda4ff0,
+	0x40f44fab, 0xdf3b6456, 0x3ff5e560, 0x4189374c, 0xbfde9fbe, 0x76d9fbb0,
+	0x40f44fab, 0xdf3b6456, 0x4014a1ca, 0xc083126e, 0x3ff5c28f, 0x5c256e48,
+	0x40f44fab, 0xdf3b6456, 0x4021e51e, 0xb851eb85, 0x3fec624d, 0xd2e9b660,
+	0x40f46b04, 0x6a7ef9d7, 0xc0240000, 0x00000000, 0x4002353f, 0x7ceb8000,
+	0x40f46b04, 0x6a7ef9d7, 0xc018d78d, 0x4fdf3b64, 0x3ffaed91, 0x686ed760,
+	0x40f46b04, 0x6a7ef9d7, 0xc0035e35, 0x3f7ced91, 0xbff2b439, 0x58141702,
+	0x40f46b04, 0x6a7ef9d7, 0x3ff5e560, 0x4189374c, 0x3fe020c4, 0x9b9d32c0,
+	0x40f46b04, 0x6a7ef9d7, 0x4014a1ca, 0xc083126e, 0x3fddb22d, 0x0e47d0c0,
+	0x40f46b04, 0x6a7ef9d7, 0x4021e51e, 0xb851eb85, 0xbf7a9fbe, 0x7ac87800,
+	0x40f4865c, 0xf5c28f58, 0xc0240000, 0x00000000, 0xbfc851eb, 0x85400000,
+	0x40f4865c, 0xf5c28f58, 0xc018d78d, 0x4fdf3b64, 0xbffba7ef, 0x9db60b90,
+	0x40f4865c, 0xf5c28f58, 0xc0035e35, 0x3f7ced91, 0x3fe2b851, 0xeb7daa2c,
+	0x40f4865c, 0xf5c28f58, 0x3ff5e560, 0x4189374c, 0x3fbe353f, 0x7ca7a600,
+	0x40f4865c, 0xf5c28f58, 0x4014a1ca, 0xc083126e, 0xbfdba5e3, 0x540617a0,
+	0x40f4865c, 0xf5c28f58, 0x4021e51e, 0xb851eb85, 0xbfeccccc, 0xccd4d840,
+	0x40f4a1b5, 0x810624d9, 0xc0240000, 0x00000000, 0xc0053f7c, 0xed938000,
+	0x40f4a1b5, 0x810624d9, 0xc018d78d, 0x4fdf3b64, 0x3ff120c4, 0x9ba1ff10,
+	0x40f4a1b5, 0x810624d9, 0xc0035e35, 0x3f7ced91, 0xbfb4fdf3, 0xb6819f40,
+	0x40f4a1b5, 0x810624d9, 0x3ff5e560, 0x4189374c, 0xbfd126e9, 0x78e69280,
+	0x40f4a1b5, 0x810624d9, 0x4014a1ca, 0xc083126e, 0xbff53f7c, 0xed950000,
+	0x40f4a1b5, 0x810624d9, 0x4021e51e, 0xb851eb85, 0xbffcb22d, 0x0e5a0fc8,
+	0x40f4bd0e, 0x0c49ba5a, 0xc0240000, 0x00000000, 0x40138312, 0x6e968000,
+	0x40f4bd0e, 0x0c49ba5a, 0xc018d78d, 0x4fdf3b64, 0xc002ba5e, 0x354171f0,
+	0x40f4bd0e, 0x0c49ba5a, 0xc0035e35, 0x3f7ced91, 0xbfe7f7ce, 0xd91e11fc,
+	0x40f4bd0e, 0x0c49ba5a, 0x3ff5e560, 0x4189374c, 0xbfe4ed91, 0x687b8740,
+	0x40f4bd0e, 0x0c49ba5a, 0x4014a1ca, 0xc083126e, 0xc001cac0, 0x83143d0c,
+	0x40f4bd0e, 0x0c49ba5a, 0x4021e51e, 0xb851eb85, 0xc0057ef9, 0xdb24d9b8,
+	0x40f4d866, 0x978d4fdb, 0xc0240000, 0x00000000, 0x40034bc6, 0xa7ed8000,
+	0x40f4d866, 0x978d4fdb, 0xc018d78d, 0x4fdf3b64, 0x3fdd4fdf, 0x3b549b00,
+	0x40f4d866, 0x978d4fdb, 0xc0035e35, 0x3f7ced91, 0x3ff0147a, 0xe143e31a,
+	0x40f4d866, 0x978d4fdb, 0x3ff5e560, 0x4189374c, 0x3fd50624, 0xdd1d52b0,
+	0x40f4d866, 0x978d4fdb, 0x4014a1ca, 0xc083126e, 0x40004dd2, 0xf1a82ac4,
+	0x40f4d866, 0x978d4fdb, 0x4021e51e, 0xb851eb85, 0xc00ca4dd, 0x2f1cab8c,
+	0x40f4f3bf, 0x22d0e55c, 0xc0240000, 0x00000000, 0xbfaba5e3, 0x54800000,
+	0x40f4f3bf, 0x22d0e55c, 0xc018d78d, 0x4fdf3b64, 0xc007a0c4, 0x9ba7de18,
+	0x40f4f3bf, 0x22d0e55c, 0xc0035e35, 0x3f7ced91, 0x3fd5a1ca, 0xc073d040,
+	0x40f4f3bf, 0x22d0e55c, 0x3ff5e560, 0x4189374c, 0xbfad70a3, 0xd7994a80,
+	0x40f4f3bf, 0x22d0e55c, 0x4014a1ca, 0xc083126e, 0x3ff245a1, 0xcabcdb70,
+	0x40f4f3bf, 0x22d0e55c, 0x4021e51e, 0xb851eb85, 0x4011e4dd, 0x2f19985a,
+	0x40f50f17, 0xae147add, 0xc0240000, 0x00000000, 0xc00428f5, 0xc2918000,
+	0x40f50f17, 0xae147add, 0xc018d78d, 0x4fdf3b64, 0xbfc3c6a7, 0xefbd8c80,
+	0x40f50f17, 0xae147add, 0xc0035e35, 0x3f7ced91, 0xbfd50e56, 0x0427ebe8,
+	0x40f50f17, 0xae147add, 0x3ff5e560, 0x4189374c, 0xbfdc624d, 0xd303a550,
+	0x40f50f17, 0xae147add, 0x4014a1ca, 0xc083126e, 0x3fcf7ced, 0x914b0ac0,
+	0x40f50f17, 0xae147add, 0x4021e51e, 0xb851eb85, 0x400ca3d7, 0x0a3b5ee0,
+	0x40f52a70, 0x3958105e, 0xc0240000, 0x00000000, 0xc013f1a9, 0xfbe88000,
+	0x40f52a70, 0x3958105e, 0xc018d78d, 0x4fdf3b64, 0x400527ef, 0x9db02c88,
+	0x40f52a70, 0x3958105e, 0xc0035e35, 0x3f7ced91, 0xbfefdf3b, 0x6461d408,
+	0x40f52a70, 0x3958105e, 0x3ff5e560, 0x4189374c, 0x3fe13f7c, 0xed885df0,
+	0x40f52a70, 0x3958105e, 0x4014a1ca, 0xc083126e, 0xbfe4cccc, 0xccd43180,
+	0x40f52a70, 0x3958105e, 0x4021e51e, 0xb851eb85, 0x40057df3, 0xb6438d0c,
+	0x40f545c8, 0xc49ba5df, 0xc0240000, 0x00000000, 0x4004624d, 0xd2ef8000,
+	0x40f545c8, 0xc49ba5df, 0xc018d78d, 0x4fdf3b64, 0xbfe88b43, 0x958913c0,
+	0x40f545c8, 0xc49ba5df, 0xc0035e35, 0x3f7ced91, 0x3fe84189, 0x37440428,
+	0x40f545c8, 0xc49ba5df, 0x3ff5e560, 0x4189374c, 0x3fc39581, 0x06007fc0,
+	0x40f545c8, 0xc49ba5df, 0x4014a1ca, 0xc083126e, 0xbff8bc6a, 0x7efd92d8,
+	0x40f545c8, 0xc49ba5df, 0x4021e51e, 0xb851eb85, 0x3ffcb020, 0xc4977670,
+	0x40f56121, 0x4fdf3b60, 0xc0240000, 0x00000000, 0x3fb4fdf3, 0xb6000000,
+	0x40f56121, 0x4fdf3b60, 0xc018d78d, 0x4fdf3b64, 0x40004189, 0x3749c060,
+	0x40f56121, 0x4fdf3b60, 0xc0035e35, 0x3f7ced91, 0x3fb74bc6, 0xa7b130a0,
+	0x40f56121, 0x4fdf3b60, 0x3ff5e560, 0x4189374c, 0xbfcdd2f1, 0xaa207840,
+	0x40f56121, 0x4fdf3b60, 0x4014a1ca, 0xc083126e, 0xc0038937, 0x4bc88678,
+	0x40f56121, 0x4fdf3b60, 0x4021e51e, 0xb851eb85, 0x3fecc8b4, 0x394fa590,
+	0x40f57c79, 0xdb22d0e1, 0xc0240000, 0x00000000, 0xc003126e, 0x978f8000,
+	0x40f57c79, 0xdb22d0e1, 0xc018d78d, 0x4fdf3b64, 0xbff6126e, 0x97916230,
+	0x40f57c79, 0xdb22d0e1, 0xc0035e35, 0x3f7ced91, 0xbfe26e97, 0x8d57b800,
+	0x40f57c79, 0xdb22d0e1, 0x3ff5e560, 0x4189374c, 0xbfe3ced9, 0x16905c10,
+	0x40f57c79, 0xdb22d0e1, 0x4014a1ca, 0xc083126e, 0x3ffd1eb8, 0x51e7c2b0,
+	0x40f57c79, 0xdb22d0e1, 0x4021e51e, 0xb851eb85, 0x3f789374, 0xb82f2000,
+	0x40f597d2, 0x66666662, 0xc0240000, 0x00000000, 0xc0136666, 0x66678000,
+	0x40f597d2, 0x66666662, 0xc018d78d, 0x4fdf3b64, 0x3ff6b645, 0xa1c6a870,
+	0x40f597d2, 0x66666662, 0xc0035e35, 0x3f7ced91, 0x3ff2d916, 0x87271018,
+	0x40f597d2, 0x66666662, 0x3ff5e560, 0x4189374c, 0x3fd74395, 0x80f3a910,
+	0x40f597d2, 0x66666662, 0x4014a1ca, 0xc083126e, 0x3fed9168, 0x72a89130,
+	0x40f597d2, 0x66666662, 0x4021e51e, 0xb851eb85, 0xbfec6666, 0x666ee910,
+	0x40f5b32a, 0xf1a9fbe3, 0xc0240000, 0x00000000, 0x400578d4, 0xfdf18000,
+	0x40f5b32a, 0xf1a9fbe3, 0xc018d78d, 0x4fdf3b64, 0xbfffdf3b, 0x645e3a80,
+	0x40f5b32a, 0xf1a9fbe3, 0xc0035e35, 0x3f7ced91, 0x3fe05a1c, 0xac00421c,
+	0x40f5b32a, 0xf1a9fbe3, 0x3ff5e560, 0x4189374c, 0xbf970a3d, 0x71cd2f00,
+	0x40f5b32a, 0xf1a9fbe3, 0x4014a1ca, 0xc083126e, 0x3f9cac08, 0x3033a000,
+	0x40f5b32a, 0xf1a9fbe3, 0x4021e51e, 0xb851eb85, 0xbffc7ef9, 0xdb271830,
+	0x40f5ce83, 0x7ced9164, 0xc0240000, 0x00000000, 0x3fcbe76c, 0x8b200000,
+	0x40f5ce83, 0x7ced9164, 0xc018d78d, 0x4fdf3b64, 0x3fe9d2f1, 0xa9f3a040,
+	0x40f5ce83, 0x7ced9164, 0xc0035e35, 0x3f7ced91, 0xbfc3f7ce, 0xd9366fe0,
+	0x40f5ce83, 0x7ced9164, 0x3ff5e560, 0x4189374c, 0xbfda24dd, 0x2f2d4ef0,
+	0x40f5ce83, 0x7ced9164, 0x4014a1ca, 0xc083126e, 0xbfebc6a7, 0xefa55730,
+	0x40f5ce83, 0x7ced9164, 0x4021e51e, 0xb851eb85, 0xc0056560, 0x418b5dec,
+	0x40f5e9dc, 0x083126e5, 0xc0240000, 0x00000000, 0xc001fbe7, 0x6c8d8000,
+	0x40f5e9dc, 0x083126e5, 0xc018d78d, 0x4fdf3b64, 0xc004d604, 0x18958968,
+	0x40f5e9dc, 0x083126e5, 0xc0035e35, 0x3f7ced91, 0xbfea5604, 0x189b7a0c,
+	0x40f5e9dc, 0x083126e5, 0x3ff5e560, 0x4189374c, 0x3fe25e35, 0x3f738920,
+	0x40f5e9dc, 0x083126e5, 0x4014a1ca, 0xc083126e, 0xbffc3958, 0x106625b0,
+	0x40f5e9dc, 0x083126e5, 0x4021e51e, 0xb851eb85, 0xc00c8b43, 0x95832fc0,
+	0x40f60534, 0x9374bc66, 0xc0240000, 0x00000000, 0xc012db22, 0xd0e68000,
+	0x40f60534, 0x9374bc66, 0xc018d78d, 0x4fdf3b64, 0x3fc8e560, 0x4167be80,
+	0x40f60534, 0x9374bc66, 0xc0035e35, 0x3f7ced91, 0x3fedcac0, 0x830a5e24,
+	0x40f60534, 0x9374bc66, 0x3ff5e560, 0x4189374c, 0x3fc81062, 0x4dad2c80,
+	0x40f60534, 0x9374bc66, 0x4014a1ca, 0xc083126e, 0x4003fbe7, 0x6c8954f8,
+	0x40f60534, 0x9374bc66, 0x4021e51e, 0xb851eb85, 0xc011d893, 0x74bd80ca,
+	0x40f6208d, 0x1eb851e7, 0xc0240000, 0x00000000, 0x40068f5c, 0x28f38000,
+	0x40f6208d, 0x1eb851e7, 0xc018d78d, 0x4fdf3b64, 0x4007f2b0, 0x20c28138,
+	0x40f6208d, 0x1eb851e7, 0xc0035e35, 0x3f7ced91, 0x3fd0e560, 0x41790020,
+	0x40f6208d, 0x1eb851e7, 0x3ff5e560, 0x4189374c, 0xbfc95810, 0x6273cb80,
+	0x40f6208d, 0x1eb851e7, 0x4014a1ca, 0xc083126e, 0x3ff9a1ca, 0xc07f2fd8,
+	0x40f6208d, 0x1eb851e7, 0x4021e51e, 0xb851eb85, 0x400cbd70, 0xa3d4daac,
+	0x40f63be5, 0xa9fbe768, 0xc0240000, 0x00000000, 0x3fd6a7ef, 0x9da00000,
+	0x40f63be5, 0xa9fbe768, 0xc018d78d, 0x4fdf3b64, 0xbfdac083, 0x127f8200,
+	0x40f63be5, 0xa9fbe768, 0xc0035e35, 0x3f7ced91, 0xbfd9cac0, 0x8322bc08,
+	0x40f63be5, 0xa9fbe768, 0x3ff5e560, 0x4189374c, 0xbfe2b020, 0xc4a530e0,
+	0x40f63be5, 0xa9fbe768, 0x4014a1ca, 0xc083126e, 0x3fe6978d, 0x4fd76b80,
+	0x40f63be5, 0xa9fbe768, 0x4021e51e, 0xb851eb85, 0x4005978d, 0x4fdd08d8,
+	0x40f6573e, 0x353f7ce9, 0xc0240000, 0x00000000, 0xc000e560, 0x418b8000,
+	0x40f6573e, 0x353f7ce9, 0xc018d78d, 0x4fdf3b64, 0x40030c49, 0xba5c1510,
+	0x40f6573e, 0x353f7ce9, 0xc0035e35, 0x3f7ced91, 0xbff11eb8, 0x51ef9e0c,
+	0x40f6573e, 0x353f7ce9, 0x3ff5e560, 0x4189374c, 0x3fd98106, 0x24c9ff70,
+	0x40f6573e, 0x353f7ce9, 0x4014a1ca, 0xc083126e, 0xbfc851eb, 0x853e22c0,
+	0x40f6573e, 0x353f7ce9, 0x4021e51e, 0xb851eb85, 0x3ffce353, 0xf7ca6e08,
+	0x40f67296, 0xc083126a, 0xc0240000, 0x00000000, 0xc0124fdf, 0x3b658000,
+	0x40f67296, 0xc083126a, 0xc018d78d, 0x4fdf3b64, 0xbff07ced, 0x916cb8d0,
+	0x40f67296, 0xc083126a, 0xc0035e35, 0x3f7ced91, 0x3fe5e353, 0xf7c69c18,
+	0x40f67296, 0xc083126a, 0x3ff5e560, 0x4189374c, 0x3f899999, 0x97306e00,
+	0x40f67296, 0xc083126a, 0x4014a1ca, 0xc083126e, 0xbff16041, 0x893b3e70,
+	0x40f67296, 0xc083126a, 0x4021e51e, 0xb851eb85, 0x3fed2f1a, 0x9fb594c0,
+	0x40f68def, 0x4bc6a7eb, 0xc0240000, 0x00000000, 0x4007a5e3, 0x53f58000,
+	0x40f68def, 0x4bc6a7eb, 0xc018d78d, 0x4fdf3b64, 0x3ffc4bc6, 0xa7eb51d0,
+	0x40f68def, 0x4bc6a7eb, 0xc0035e35, 0x3f7ced91, 0x3f916872, 0xaf17c080,
+	0x40f68def, 0x4bc6a7eb, 0x3ff5e560, 0x4189374c, 0xbfd7e76c, 0x8b56f890,
+	0x40f68def, 0x4bc6a7eb, 0x4014a1ca, 0xc083126e, 0xbfffb645, 0xa1ceb888,
+	0x40f68def, 0x4bc6a7eb, 0x4021e51e, 0xb851eb85, 0x3f92f1a9, 0xfac9ae00,
+	0x40f6a947, 0xd70a3d6c, 0xc0240000, 0x00000000, 0x3fdf5c28, 0xf5b00000,
+	0x40f6a947, 0xd70a3d6c, 0xc018d78d, 0x4fdf3b64, 0xbffa49ba, 0x5e399120,
+	0x40f6a947, 0xd70a3d6c, 0xc0035e35, 0x3f7ced91, 0xbfe4cccc, 0xccd52010,
+	0x40f6a947, 0xd70a3d6c, 0x3ff5e560, 0x4189374c, 0x3fe37ced, 0x915eb450,
+	0x40f6a947, 0xd70a3d6c, 0x4014a1ca, 0xc083126e, 0x40023d70, 0xa3d50b8c,
+	0x40f6a947, 0xd70a3d6c, 0x4021e51e, 0xb851eb85, 0xbfec0000, 0x0008f9e0,
+	0x40f6c4a0, 0x624dd2ed, 0xc0240000, 0x00000000, 0xbfff9db2, 0x2d130000,
+	0x40f6c4a0, 0x624dd2ed, 0xc018d78d, 0x4fdf3b64, 0x3ff27ef9, 0xdb1e7980,
+	0x40f6c4a0, 0x624dd2ed, 0xc0035e35, 0x3f7ced91, 0x3ff1a9fb, 0xe7685c10,
+	0x40f6c4a0, 0x624dd2ed, 0x3ff5e560, 0x4189374c, 0x3fcc8b43, 0x9559d940,
+	0x40f6c4a0, 0x624dd2ed, 0x4014a1ca, 0xc083126e, 0x3ff624dd, 0x2f169d00,
+	0x40f6c4a0, 0x624dd2ed, 0x4021e51e, 0xb851eb85, 0xbffc4bc6, 0xa7f42098,
+	0x40f6dff8, 0xed91686e, 0xc0240000, 0x00000000, 0xc011c49b, 0xa5e48000,
+	0x40f6dff8, 0xed91686e, 0xc018d78d, 0x4fdf3b64, 0xc0020b43, 0x958334b8,
+	0x40f6dff8, 0xed91686e, 0xc0035e35, 0x3f7ced91, 0x3fdbf7ce, 0xd905b418,
+	0x40f6dff8, 0xed91686e, 0x3ff5e560, 0x4189374c, 0xbfc4dd2f, 0x1ac71ec0,
+	0x40f6dff8, 0xed91686e, 0x4014a1ca, 0xc083126e, 0x3fdf3b64, 0x5a0c8ba0,
+	0x40f6dff8, 0xed91686e, 0x4021e51e, 0xb851eb85, 0xc0054bc6, 0xa7f1e220,
+	0x40f6fb51, 0x78d4fdef, 0xc0240000, 0x00000000, 0x4008bc6a, 0x7ef78000,
+	0x40f6fb51, 0x78d4fdef, 0xc018d78d, 0x4fdf3b64, 0x3fe1645a, 0x1ca34260,
+	0x40f6fb51, 0x78d4fdef, 0xc0035e35, 0x3f7ced91, 0xbfcd70a3, 0xd72c1020,
+	0x40f6fb51, 0x78d4fdef, 0x3ff5e560, 0x4189374c, 0xbfe19168, 0x72ba05b0,
+	0x40f6fb51, 0x78d4fdef, 0x4014a1ca, 0xc083126e, 0xbfda1cac, 0x08415cc0,
+	0x40f6fb51, 0x78d4fdef, 0x4021e51e, 0xb851eb85, 0xc00c71a9, 0xfbe9b3f4,
+	0x40f716aa, 0x04189370, 0xc0240000, 0x00000000, 0x3fe40831, 0x26e00000,
+	0x40f716aa, 0x04189370, 0xc018d78d, 0x4fdf3b64, 0xc006f1a9, 0xfbe9a0e0,
+	0x40f716aa, 0x04189370, 0xc0035e35, 0x3f7ced91, 0xbfecb439, 0x5818e21c,
+	0x40f716aa, 0x04189370, 0x3ff5e560, 0x4189374c, 0x3fdbbe76, 0xc8a055d0,
+	0x40f716aa, 0x04189370, 0x4014a1ca, 0xc083126e, 0xbff4dd2f, 0x1aa3d148,
+	0x40f716aa, 0x04189370, 0x4021e51e, 0xb851eb85, 0xc011cbc6, 0xa7f0c2e4,
+	0x40f73202, 0x8f5c28f1, 0xc0240000, 0x00000000, 0xbffd70a3, 0xd70f0000,
+	0x40f73202, 0x8f5c28f1, 0xc018d78d, 0x4fdf3b64, 0xbfb1a9fb, 0xe7b37200,
+	0x40f73202, 0x8f5c28f1, 0xc0035e35, 0x3f7ced91, 0x3feb6c8b, 0x438cf614,
+	0x40f73202, 0x8f5c28f1, 0x3ff5e560, 0x4189374c, 0x3fa851eb, 0x847ece80,
+	0x40f73202, 0x8f5c28f1, 0x4014a1ca, 0xc083126e, 0xc0019999, 0x999ba5b0,
+	0x40f73202, 0x8f5c28f1, 0x4021e51e, 0xb851eb85, 0x400cd70a, 0x3d6e5678,
+	0x40f74d5b, 0x1a9fbe72, 0xc0240000, 0x00000000, 0xc0113958, 0x10638000,
+	0x40f74d5b, 0x1a9fbe72, 0xc018d78d, 0x4fdf3b64, 0x4005d70a, 0x3d6e69c0,
+	0x40f74d5b, 0x1a9fbe72, 0xc0035e35, 0x3f7ced91, 0x3fc851eb, 0x84fc6000,
+	0x40f74d5b, 0x1a9fbe72, 0x3ff5e560, 0x4189374c, 0xbfd5a9fb, 0xe780a230,
+	0x40f74d5b, 0x1a9fbe72, 0x4014a1ca, 0xc083126e, 0x40007ef9, 0xdb20c220,
+	0x40f74d5b, 0x1a9fbe72, 0x4021e51e, 0xb851eb85, 0x4005b126, 0xe97684a4,
+	0x40f768b3, 0xa5e353f3, 0xc0240000, 0x00000000, 0x4009d2f1, 0xa9f98000,
+	0x40f768b3, 0xa5e353f3, 0xc018d78d, 0x4fdf3b64, 0xbfe5ced9, 0x16901ee0,
+	0x40f768b3, 0xa5e353f3, 0xc0035e35, 0x3f7ced91, 0xbfde872b, 0x021d8c28,
+	0x40f768b3, 0xa5e353f3, 0x3ff5e560, 0x4189374c, 0x3fe49ba5, 0xe349df80,
+	0x40f768b3, 0xa5e353f3, 0x4014a1ca, 0xc083126e, 0x3ff2a7ef, 0x9dae0a28,
+	0x40f768b3, 0xa5e353f3, 0x4021e51e, 0xb851eb85, 0x3ffd1687, 0x2afd65a0,
+	0x40f7840c, 0x3126e974, 0xc0240000, 0x00000000, 0x3fe8624d, 0xd2e80000,
+	0x40f7840c, 0x3126e974, 0xc018d78d, 0x4fdf3b64, 0x4000f0a3, 0xd707fd98,
+	0x40f7840c, 0x3126e974, 0xc0035e35, 0x3f7ced91, 0xbff24dd2, 0xf1ae5214,
+	0x40f7840c, 0x3126e974, 0x3ff5e560, 0x4189374c, 0x3fd08312, 0x6e834300,
+	0x40f7840c, 0x3126e974, 0x4014a1ca, 0xc083126e, 0x3fd147ae, 0x146a4040,
+	0x40f7840c, 0x3126e974, 0x4021e51e, 0xb851eb85, 0x3fed9581, 0x061b83f0,
+	0x40f79f64, 0xbc6a7ef5, 0xc0240000, 0x00000000, 0xbffb4395, 0x810b0000,
+	0x40f79f64, 0xbc6a7ef5, 0xc018d78d, 0x4fdf3b64, 0xbff4b439, 0x5814e7c0,
+	0x40f79f64, 0xbc6a7ef5, 0xc0035e35, 0x3f7ced91, 0x3fe3851e, 0xb8493408,
+	0x40f79f64, 0xbc6a7ef5, 0x3ff5e560, 0x4189374c, 0xbfc0624d, 0xd31a7200,
+	0x40f79f64, 0xbc6a7ef5, 0x4014a1ca, 0xc083126e, 0xbfe40831, 0x26f1d410,
+	0x40f79f64, 0xbc6a7ef5, 0x4021e51e, 0xb851eb85, 0x3f9fbe76, 0xc7879400,
+	0x40f7babd, 0x47ae1476, 0xc0240000, 0x00000000, 0xc010ae14, 0x7ae28000,
+	0x40f7babd, 0x47ae1476, 0xc018d78d, 0x4fdf3b64, 0x3ff8147a, 0xe14322e0,
+	0x40f7babd, 0x47ae1476, 0xc0035e35, 0x3f7ced91, 0xbfad2f1a, 0xa04aa0c0,
+	0x40f7babd, 0x47ae1476, 0x3ff5e560, 0x4189374c, 0xbfe072b0, 0x20ceda80,
+	0x40f7babd, 0x47ae1476, 0x4014a1ca, 0xc083126e, 0xbff85a1c, 0xac0c6420,
+	0x40f7babd, 0x47ae1476, 0x4021e51e, 0xb851eb85, 0xbfeb9999, 0x99a30ab0,
+	0x40f7d615, 0xd2f1a9f7, 0xc0240000, 0x00000000, 0x400ae978, 0xd4fb8000,
+	0x40f7d615, 0xd2f1a9f7, 0xc018d78d, 0x4fdf3b64, 0xbffe8106, 0x24e1c010,
+	0x40f7d615, 0xd2f1a9f7, 0xc0035e35, 0x3f7ced91, 0xbfe72b02, 0x0c528820,
+	0x40f7d615, 0xd2f1a9f7, 0x3ff5e560, 0x4189374c, 0x3fddfbe7, 0x6c76ac30,
+	0x40f7d615, 0xd2f1a9f7, 0x4014a1ca, 0xc083126e, 0xc0035810, 0x624fef1c,
+	0x40f7d615, 0xd2f1a9f7, 0x4021e51e, 0xb851eb85, 0xbffc1893, 0x74c12900,
+	0x40f7f16e, 0x5e353f78, 0xc0240000, 0x00000000, 0x3fecbc6a, 0x7ef00000,
+	0x40f7f16e, 0x5e353f78, 0xc018d78d, 0x4fdf3b64, 0x3fec8f5c, 0x28ec9520,
+	0x40f7f16e, 0x5e353f78, 0xc0035e35, 0x3f7ced91, 0x3ff07ae1, 0x47a9a808,
+	0x40f7f16e, 0x5e353f78, 0x3ff5e560, 0x4189374c, 0x3fb51eb8, 0x5198c0c0,
+	0x40f7f16e, 0x5e353f78, 0x4014a1ca, 0xc083126e, 0x3ffd8106, 0x24d8f168,
+	0x40f7f16e, 0x5e353f78, 0x4021e51e, 0xb851eb85, 0xc005322d, 0x0e586654,
+	0x40f80cc6, 0xe978d4f9, 0xc0240000, 0x00000000, 0xbff91687, 0x2b070000,
+	0x40f80cc6, 0xe978d4f9, 0xc018d78d, 0x4fdf3b64, 0xc00426e9, 0x78d74c30,
+	0x40f80cc6, 0xe978d4f9, 0xc0035e35, 0x3f7ced91, 0x3fd73b64, 0x5a0ae3f8,
+	0x40f80cc6, 0xe978d4f9, 0x3ff5e560, 0x4189374c, 0xbfd36c8b, 0x43aa4bd0,
+	0x40f80cc6, 0xe978d4f9, 0x4014a1ca, 0xc083126e, 0x3fee5604, 0x188aeea0,
+	0x40f80cc6, 0xe978d4f9, 0x4021e51e, 0xb851eb85, 0xc00c5810, 0x62503828,
+	0x40f8281f, 0x74bc6a7a, 0xc0240000, 0x00000000, 0xc01022d0, 0xe5618000,
+	0x40f8281f, 0x74bc6a7a, 0xc018d78d, 0x4fdf3b64, 0x3fd1eb85, 0x1ea5c900,
+	0x40f8281f, 0x74bc6a7a, 0xc0035e35, 0x3f7ced91, 0xbfd374bc, 0x6a90d830,
+	0x40f8281f, 0x74bc6a7a, 0x3ff5e560, 0x4189374c, 0x3fe5ba5e, 0x35350ab0,
+	0x40f8281f, 0x74bc6a7a, 0x4014a1ca, 0xc083126e, 0x3faa9fbe, 0x763fa700,
+	0x40f8281f, 0x74bc6a7a, 0x4021e51e, 0xb851eb85, 0xc011bef9, 0xdb2404fe,
+	0x40f84377, 0xfffffffb, 0xc0240000, 0x00000000, 0x400bffff, 0xfffd8000,
+	0x40f84377, 0xfffffffb, 0xc018d78d, 0x4fdf3b64, 0x4008a1ca, 0xc080be70,
+	0x40f84377, 0xfffffffb, 0xc0035e35, 0x3f7ced91, 0xbfef126e, 0x97964a2c,
+	0x40f84377, 0xfffffffb, 0x3ff5e560, 0x4189374c, 0x3fd2c083, 0x12599960,
+	0x40f84377, 0xfffffffb, 0x4014a1ca, 0xc083126e, 0xbfeb020c, 0x49c2f9c0,
+	0x40f84377, 0xfffffffb, 0x4021e51e, 0xb851eb85, 0x400cf0a3, 0xd707d244,
+	0x40f85ed0, 0x8b43957c, 0xc0240000, 0x00000000, 0x3ff08b43, 0x957c0000,
+	0x40f85ed0, 0x8b43957c, 0xc018d78d, 0x4fdf3b64, 0xbfd547ae, 0x148d9840,
+	0x40f85ed0, 0x8b43957c, 0xc0035e35, 0x3f7ced91, 0x3fe90e56, 0x040f8e04,
+	0x40f85ed0, 0x8b43957c, 0x3ff5e560, 0x4189374c, 0xbfb7ced9, 0x16db8a80,
+	0x40f85ed0, 0x8b43957c, 0x4014a1ca, 0xc083126e, 0xbffbd70a, 0x3d74f6f8,
+	0x40f85ed0, 0x8b43957c, 0x4021e51e, 0xb851eb85, 0x4005cac0, 0x83100070,
+	// IEEEremainder(6.0,9.0) should be -3.0
+	0x40180000, 0x00000000, 0x40220000, 0x00000000, 0xc0080000, 0x00000000
+	};
+
+LOCAL_D const TUint32 SineTest[] =
+	{
+	0x00000000,0x00000000, 0x00000000,0x00000000,
+	0x3F50624D,0xD2F1A9FC, 0x3F50624D,0xA5218A62,
+	0x3F60624D,0xD2F1A9FC, 0x3F60624D,0x1BB12D61,
+	0x3F689374,0xBC6A7EFA, 0x3F689372,0x51F0E492,
+	0x3F70624D,0xD2F1A9FC, 0x3F70624A,0xF5EFD464,
+	0x3F747AE1,0x47AE147B, 0x3F747ADB,0xB006A986,
+	0x3F789374,0xBC6A7EFA, 0x3F78936B,0x1284F039,
+	0x3F7CAC08,0x3126E979, 0x3F7CABF8,0xD8B2BD8A,
+	0x3F80624D,0xD2F1A9FC, 0x3F806242,0x5EEC20C6,
+	0x3F826E97,0x8D4FDF3B, 0x3F826E87,0x3E9EE5EC,
+	0x3F847AE1,0x47AE147B, 0x3F847ACA,0xE915E807,
+	0x3F86872B,0x020C49BA, 0x3F86870D,0x3BF5752C,
+	0x3F889374,0xBC6A7EFA, 0x3F88934E,0x14E1F1F4,
+	0x3F8A9FBE,0x76C8B439, 0x3F8A9F8D,0x517FDBBB,
+	0x3F8CAC08,0x3126E979, 0x3F8CABCA,0xCF73CAE6,
+	0x3F8EB851,0xEB851EB8, 0x3F8EB806,0x6C62751D,
+	0x3F90624D,0xD2F1A9FC, 0x3F906220,0x02F857C9,
+	0x3F916872,0xB020C49C, 0x3F91683B,0xBCE1B89B,
+	0x3F926E97,0x8D4FDF3B, 0x3F926E56,0x52BFEA83,
+	0x3F9374BC,0x6A7EF9DB, 0x3F93746F,0xB3658E26,
+	0x3F947AE1,0x47AE147B, 0x3F947A87,0xCDA55867,
+	0x3F958106,0x24DD2F1B, 0x3F95809E,0x90521391,
+	0x3F96872B,0x020C49BA, 0x3F9686B3,0xEA3EA071,
+	0x3F978D4F,0xDF3B645A, 0x3F978CC7,0xCA3DF77B,
+	0x3F989374,0xBC6A7EFA, 0x3F9892DA,0x1F2329E6,
+	0x3F999999,0x9999999A, 0x3F9998EA,0xD7C162CE,
+	0x3F9A9FBE,0x76C8B439, 0x3F9A9EF9,0xE2EBE852,
+	0x3F9BA5E3,0x53F7CED9, 0x3F9BA507,0x2F761CB9,
+	0x3F9CAC08,0x3126E979, 0x3F9CAB12,0xAC337F8E,
+	0x3F9DB22D,0x0E560419, 0x3F9DB11C,0x47F7AEC1,
+	0x3F9EB851,0xEB851EB8, 0x3F9EB723,0xF19667C6,
+	0x3F9FBE76,0xC8B43958, 0x3F9FBD29,0x97E388BA,
+	0x3FA0624D,0xD2F1A9FC, 0x3FA06196,0x94D988BF,
+	0x3FA0E560,0x4189374C, 0x3FA0E497,0x4AEC926B,
+	0x3FA16872,0xB020C49C, 0x3FA16796,0xE59504C8,
+	0x3FA1EB85,0x1EB851EC, 0x3FA1EA95,0x5C3D15CE,
+	0x3FA26E97,0x8D4FDF3B, 0x3FA26D92,0xA64F0E99,
+	0x3FA2F1A9,0xFBE76C8B, 0x3FA2F08E,0xBB354BFA,
+	0x3FA374BC,0x6A7EF9DB, 0x3FA37389,0x925A3F01,
+	0x3FA3F7CE,0xD916872B, 0x3FA3F683,0x23286D94,
+	0x3FA47AE1,0x47AE147B, 0x3FA4797B,0x650A72FB,
+	0x3FA4FDF3,0xB645A1CB, 0x3FA4FC72,0x4F6B0071,
+	0x3FA58106,0x24DD2F1B, 0x3FA57F67,0xD9B4DDB3,
+	0x3FA60418,0x9374BC6A, 0x3FA6025B,0xFB52E994,
+	0x3FA6872B,0x020C49BA, 0x3FA6854E,0xABB01A88,
+	0x3FA70A3D,0x70A3D70A, 0x3FA7083F,0xE2377F36,
+	0x3FA78D4F,0xDF3B645A, 0x3FA78B2F,0x96543F09,
+	0x3FA81062,0x4DD2F1AA, 0x3FA80E1D,0xBF719ABE,
+	0x3FA89374,0xBC6A7EFA, 0x3FA8910A,0x54FAECF6,
+	0x3FA91687,0x2B020C4A, 0x3FA913F5,0x4E5BAAC3,
+	0x3FA99999,0x9999999A, 0x3FA996DE,0xA2FF643C,
+	0x3FAA1CAC,0x083126E9, 0x3FAA19C6,0x4A51C509,
+	0x3FAA9FBE,0x76C8B439, 0x3FAA9CAC,0x3BBE94F8,
+	0x3FAB22D0,0xE5604189, 0x3FAB1F90,0x6EB1B886,
+	0x3FABA5E3,0x53F7CED9, 0x3FABA272,0xDA973174,
+	0x3FAC28F5,0xC28F5C29, 0x3FAC2553,0x76DB1F55,
+	0x3FACAC08,0x3126E979, 0x3FACA832,0x3AE9C021,
+	0x3FAD2F1A,0x9FBE76C9, 0x3FAD2B0F,0x1E2F70BE,
+	0x3FADB22D,0x0E560419, 0x3FADADEA,0x1818AD98,
+	0x3FAE353F,0x7CED9168, 0x3FAE30C3,0x2012132B,
+	0x3FAEB851,0xEB851EB8, 0x3FAEB39A,0x2D885E96,
+	0x3FAF3B64,0x5A1CAC08, 0x3FAF366F,0x37E86E2A,
+	0x3FAFBE76,0xC8B43958, 0x3FAFB942,0x369F41F9,
+	0x3FB020C4,0x9BA5E354, 0x3FB01E09,0x908CFE33,
+	0x3FB0624D,0xD2F1A9FC, 0x3FB05F70,0xF762F15C,
+	0x3FB0A3D7,0x0A3D70A4, 0x3FB0A0D7,0x4B882ED2,
+	0x3FB0E560,0x4189374C, 0x3FB0E23C,0x88B37CF1,
+	0x3FB126E9,0x78D4FDF4, 0x3FB123A0,0xAA9BB45E,
+	0x3FB16872,0xB020C49C, 0x3FB16503,0xACF7C04C,
+	0x3FB1A9FB,0xE76C8B44, 0x3FB1A665,0x8B7E9EC9,
+	0x3FB1EB85,0x1EB851EC, 0x3FB1E7C6,0x41E76101,
+	0x3FB22D0E,0x56041893, 0x3FB22925,0xCBE92B89,
+	0x3FB26E97,0x8D4FDF3B, 0x3FB26A84,0x253B36A8,
+	0x3FB2B020,0xC49BA5E3, 0x3FB2ABE1,0x4994CE9A,
+	0x3FB2F1A9,0xFBE76C8B, 0x3FB2ED3D,0x34AD53D9,
+	0x3FB33333,0x33333333, 0x3FB32E97,0xE23C3B6C,
+	0x3FB374BC,0x6A7EF9DB, 0x3FB36FF1,0x4DF90F24,
+	0x3FB3B645,0xA1CAC083, 0x3FB3B149,0x739B6DED,
+	0x3FB3F7CE,0xD916872B, 0x3FB3F2A0,0x4EDB0C10,
+	0x3FB43958,0x10624DD3, 0x3FB433F5,0xDB6FB37E,
+	0x3FB47AE1,0x47AE147B, 0x3FB4754A,0x15114416,
+	0x3FB4BC6A,0x7EF9DB23, 0x3FB4B69C,0xF777B3EE,
+	0x3FB4FDF3,0xB645A1CB, 0x3FB4F7EE,0x7E5B0F9A,
+	0x3FB53F7C,0xED916873, 0x3FB5393E,0xA5737A76,
+	0x3FB58106,0x24DD2F1B, 0x3FB57A8D,0x68792EEB,
+	0x3FB5C28F,0x5C28F5C3, 0x3FB5BBDA,0xC3247EB6,
+	0x3FB60418,0x9374BC6A, 0x3FB5FD26,0xB12DD335,
+	0x3FB645A1,0xCAC08312, 0x3FB63E71,0x2E4DADAA,
+	0x3FB6872B,0x020C49BA, 0x3FB67FBA,0x363CA784,
+	0x3FB6C8B4,0x39581062, 0x3FB6C101,0xC4B372A7,
+	0x3FB70A3D,0x70A3D70A, 0x3FB70247,0xD56AD9B5,
+	0x3FB74BC6,0xA7EF9DB2, 0x3FB7438C,0x641BC055,
+	0x3FB78D4F,0xDF3B645A, 0x3FB784CF,0x6C7F2377,
+	0x3FB7CED9,0x16872B02, 0x3FB7C610,0xEA4E19A4,
+	0x3FB81062,0x4DD2F1AA, 0x3FB80750,0xD941D33D,
+	0x3FB851EB,0x851EB852, 0x3FB8488F,0x35139AC9,
+	0x3FB89374,0xBC6A7EFA, 0x3FB889CB,0xF97CD539,
+	0x3FB8D4FD,0xF3B645A2, 0x3FB8CB07,0x22370233,
+	0x3FB91687,0x2B020C4A, 0x3FB90C40,0xAAFBBC56,
+	0x3FB95810,0x624DD2F2, 0x3FB94D78,0x8F84B985,
+	0x3FB99999,0x9999999A, 0x3FB98EAE,0xCB8BCB2C,
+	0x3FB9DB22,0xD0E56042, 0x3FB9CFE3,0x5ACADE8B,
+	0x3FBA1CAC,0x083126E9, 0x3FBA1116,0x38FBFCF8,
+	0x3FBA5E35,0x3F7CED91, 0x3FBA5247,0x61D94C31,
+	0x3FBA9FBE,0x76C8B439, 0x3FBA9376,0xD11D0E97,
+	0x3FBAE147,0xAE147AE1, 0x3FBAD4A4,0x8281A37D,
+	0x3FBB22D0,0xE5604189, 0x3FBB15D0,0x71C18772,
+	0x3FBB645A,0x1CAC0831, 0x3FBB56FA,0x9A975480,
+	0x3FBBA5E3,0x53F7CED9, 0x3FBB9822,0xF8BDC27E,
+	0x3FBBE76C,0x8B439581, 0x3FBBD949,0x87EFA74D,
+	0x3FBC28F5,0xC28F5C29, 0x3FBC1A6E,0x43E7F72B,
+	0x3FBC6A7E,0xF9DB22D1, 0x3FBC5B91,0x2861C4F0,
+	0x3FBCAC08,0x3126E979, 0x3FBC9CB2,0x3118425C,
+	0x3FBCED91,0x6872B021, 0x3FBCDDD1,0x59C6C05D,
+	0x3FBD2F1A,0x9FBE76C9, 0x3FBD1EEE,0x9E28AF58,
+	0x3FBD70A3,0xD70A3D71, 0x3FBD6009,0xF9F99F6D,
+	0x3FBDB22D,0x0E560419, 0x3FBDA123,0x68F540C1,
+	0x3FBDF3B6,0x45A1CAC1, 0x3FBDE23A,0xE6D763C6,
+	0x3FBE353F,0x7CED9168, 0x3FBE2350,0x6F5BF983,
+	0x3FBE76C8,0xB4395810, 0x3FBE6463,0xFE3F13D9,
+	0x3FBEB851,0xEB851EB8, 0x3FBEA575,0x8F3CE5CD,
+	0x3FBEF9DB,0x22D0E560, 0x3FBEE685,0x1E11C3CD,
+	0x3FBF3B64,0x5A1CAC08, 0x3FBF2792,0xA67A23FB,
+	0x3FBF7CED,0x916872B0, 0x3FBF689E,0x24329E72,
+	0x3FBFBE76,0xC8B43958, 0x3FBFA9A7,0x92F7ED8F,
+	0x3FC00000,0x00000000, 0x3FBFEAAE,0xEE86EE36,
+	0x3FC020C4,0x9BA5E354, 0x3FC015DA,0x194E500E,
+	0x3FC04189,0x374BC6A8, 0x3FC0365B,0xAD7B1308,
+	0x3FC0624D,0xD2F1A9FC, 0x3FC056DC,0x31A8631E,
+	0x3FC08312,0x6E978D50, 0x3FC0775B,0xA3B4F53A,
+	0x3FC0A3D7,0x0A3D70A4, 0x3FC097DA,0x017F903C,
+	0x3FC0C49B,0xA5E353F8, 0x3FC0B857,0x48E70D21,
+	0x3FC0E560,0x4189374C, 0x3FC0D8D3,0x77CA5721,
+	0x3FC10624,0xDD2F1AA0, 0x3FC0F94E,0x8C086BDA,
+	0x3FC126E9,0x78D4FDF4, 0x3FC119C8,0x83805B6E,
+	0x3FC147AE,0x147AE148, 0x3FC13A41,0x5C1148A8,
+	0x3FC16872,0xB020C49C, 0x3FC15AB9,0x139A6923,
+	0x3FC18937,0x4BC6A7F0, 0x3FC17B2F,0xA7FB0568,
+	0x3FC1A9FB,0xE76C8B44, 0x3FC19BA5,0x17127917,
+	0x3FC1CAC0,0x83126E98, 0x3FC1BC19,0x5EC03308,
+	0x3FC1EB85,0x1EB851EC, 0x3FC1DC8C,0x7CE3B56F,
+	0x3FC20C49,0xBA5E353F, 0x3FC1FCFE,0x6F5C95FF,
+	0x3FC22D0E,0x56041893, 0x3FC21D6F,0x340A7E12,
+	0x3FC24DD2,0xF1A9FBE7, 0x3FC23DDE,0xC8CD2AC5,
+	0x3FC26E97,0x8D4FDF3B, 0x3FC25E4D,0x2B846D23,
+	0x3FC28F5C,0x28F5C28F, 0x3FC27EBA,0x5A102A42,
+	0x3FC2B020,0xC49BA5E3, 0x3FC29F26,0x52505B6F,
+	0x3FC2D0E5,0x60418937, 0x3FC2BF91,0x12250E49,
+	0x3FC2F1A9,0xFBE76C8B, 0x3FC2DFFA,0x976E64EB,
+	0x3FC3126E,0x978D4FDF, 0x3FC30062,0xE00C960B,
+	0x3FC33333,0x33333333, 0x3FC320C9,0xE9DFED22,
+	0x3FC353F7,0xCED91687, 0x3FC3412F,0xB2C8CA8C,
+	0x3FC374BC,0x6A7EF9DB, 0x3FC36194,0x38A7A3AC,
+	0x3FC39581,0x0624DD2F, 0x3FC381F7,0x795D0315,
+	0x3FC3B645,0xA1CAC083, 0x3FC3A259,0x72C988A4,
+	0x3FC3D70A,0x3D70A3D7, 0x3FC3C2BA,0x22CDE9AD,
+	0x3FC3F7CE,0xD916872B, 0x3FC3E319,0x874AF119,
+	0x3FC41893,0x74BC6A7F, 0x3FC40377,0x9E217F8A,
+	0x3FC43958,0x10624DD3, 0x3FC423D4,0x65328B81,
+	0x3FC45A1C,0xAC083127, 0x3FC4442F,0xDA5F2180,
+	0x3FC47AE1,0x47AE147B, 0x3FC46489,0xFB88642F,
+	0x3FC49BA5,0xE353F7CF, 0x3FC484E2,0xC68F8C7C,
+	0x3FC4BC6A,0x7EF9DB23, 0x3FC4A53A,0x3955E9C4,
+	0x3FC4DD2F,0x1A9FBE77, 0x3FC4C590,0x51BCE1F1,
+	0x3FC4FDF3,0xB645A1CB, 0x3FC4E5E5,0x0DA5F1A2,
+	0x3FC51EB8,0x51EB851F, 0x3FC50638,0x6AF2AC4C,
+	0x3FC53F7C,0xED916873, 0x3FC5268A,0x6784BC5E,
+	0x3FC56041,0x89374BC7, 0x3FC546DB,0x013DE364,
+	0x3FC58106,0x24DD2F1B, 0x3FC5672A,0x35FFFA2F,
+	0x3FC5A1CA,0xC083126F, 0x3FC58778,0x03ACF0F0,
+	0x3FC5C28F,0x5C28F5C3, 0x3FC5A7C4,0x6826CF64,
+	0x3FC5E353,0xF7CED917, 0x3FC5C80F,0x614FB4F2,
+	0x3FC60418,0x9374BC6A, 0x3FC5E858,0xED09D8D0,
+	0x3FC624DD,0x2F1A9FBE, 0x3FC608A1,0x09378A2B,
+	0x3FC645A1,0xCAC08312, 0x3FC628E7,0xB3BB3041,
+	0x3FC66666,0x66666666, 0x3FC6492C,0xEA774A8E,
+	0x3FC6872B,0x020C49BA, 0x3FC66970,0xAB4E70E8,
+	0x3FC6A7EF,0x9DB22D0E, 0x3FC689B2,0xF42353AA,
+	0x3FC6C8B4,0x39581062, 0x3FC6A9F3,0xC2D8BBCF,
+	0x3FC6E978,0xD4FDF3B6, 0x3FC6CA33,0x15518B1D,
+	0x3FC70A3D,0x70A3D70A, 0x3FC6EA70,0xE970BC45,
+	0x3FC72B02,0x0C49BA5E, 0x3FC70AAD,0x3D196304,
+	0x3FC74BC6,0xA7EF9DB2, 0x3FC72AE8,0x0E2EAC4D,
+	0x3FC76C8B,0x43958106, 0x3FC74B21,0x5A93DE66,
+	0x3FC78D4F,0xDF3B645A, 0x3FC76B59,0x202C5910,
+	0x3FC7AE14,0x7AE147AE, 0x3FC78B8F,0x5CDB95A7,
+	0x3FC7CED9,0x16872B02, 0x3FC7ABC4,0x0E852747,
+	0x3FC7EF9D,0xB22D0E56, 0x3FC7CBF7,0x330CBAF0,
+	0x3FC81062,0x4DD2F1AA, 0x3FC7EC28,0xC85617A9,
+	0x3FC83126,0xE978D4FE, 0x3FC80C58,0xCC451EA4,
+	0x3FC851EB,0x851EB852, 0x3FC82C87,0x3CBDCB5D,
+	0x3FC872B0,0x20C49BA6, 0x3FC84CB4,0x17A433C5,
+	0x3FC89374,0xBC6A7EFA, 0x3FC86CDF,0x5ADC8860,
+	0x3FC8B439,0x5810624E, 0x3FC88D09,0x044B1469,
+	0x3FC8D4FD,0xF3B645A2, 0x3FC8AD31,0x11D43DF6,
+	0x3FC8F5C2,0x8F5C28F6, 0x3FC8CD57,0x815C861D,
+	0x3FC91687,0x2B020C4A, 0x3FC8ED7C,0x50C88914,
+	0x3FC9374B,0xC6A7EF9E, 0x3FC90D9F,0x7DFCFE58,
+	0x3FC95810,0x624DD2F2, 0x3FC92DC1,0x06DEB8CD,
+	0x3FC978D4,0xFDF3B646, 0x3FC94DE0,0xE952A6E4,
+	0x3FC99999,0x9999999A, 0x3FC96DFF,0x233DD2BC,
+	0x3FC9BA5E,0x353F7CEE, 0x3FC98E1B,0xB2856248,
+	0x3FC9DB22,0xD0E56042, 0x3FC9AE36,0x950E976F,
+	0x3FC9FBE7,0x6C8B4396, 0x3FC9CE4F,0xC8BED032,
+	0x3FCA1CAC,0x083126E9, 0x3FC9EE67,0x4B7B86CE,
+	0x3FCA3D70,0xA3D70A3D, 0x3FCA0E7D,0x1B2A51E2,
+	0x3FCA5E35,0x3F7CED91, 0x3FCA2E91,0x35B0E48D,
+	0x3FCA7EF9,0xDB22D0E5, 0x3FCA4EA3,0x98F50E96,
+	0x3FCA9FBE,0x76C8B439, 0x3FCA6EB4,0x42DCBC8D,
+	0x3FCAC083,0x126E978D, 0x3FCA8EC3,0x314DF7EE,
+	0x3FCAE147,0xAE147AE1, 0x3FCAAED0,0x622EE747,
+	0x3FCB020C,0x49BA5E35, 0x3FCACEDB,0xD365CE58,
+	0x3FCB22D0,0xE5604189, 0x3FCAEEE5,0x82D90E37,
+	0x3FCB4395,0x810624DD, 0x3FCB0EED,0x6E6F2575,
+	0x3FCB645A,0x1CAC0831, 0x3FCB2EF3,0x940EB040,
+	0x3FCB851E,0xB851EB85, 0x3FCB4EF7,0xF19E6886,
+	0x3FCBA5E3,0x53F7CED9, 0x3FCB6EFA,0x85052617,
+	0x3FCBC6A7,0xEF9DB22D, 0x3FCB8EFB,0x4C29DECC,
+	0x3FCBE76C,0x8B439581, 0x3FCBAEFA,0x44F3A6A6,
+	0x3FCC0831,0x26E978D5, 0x3FCBCEF7,0x6D49AFF5,
+	0x3FCC28F5,0xC28F5C29, 0x3FCBEEF2,0xC3134B77,
+	0x3FCC49BA,0x5E353F7D, 0x3FCC0EEC,0x4437E87F,
+	0x3FCC6A7E,0xF9DB22D1, 0x3FCC2EE3,0xEE9F1515,
+	0x3FCC8B43,0x95810625, 0x3FCC4ED9,0xC0307E1D,
+	0x3FCCAC08,0x3126E979, 0x3FCC6ECD,0xB6D3EF75,
+	0x3FCCCCCC,0xCCCCCCCD, 0x3FCC8EBF,0xD071541E,
+	0x3FCCED91,0x6872B021, 0x3FCCAEB0,0x0AF0B65A,
+	0x3FCD0E56,0x04189375, 0x3FCCCE9E,0x643A3FD2,
+	0x3FCD2F1A,0x9FBE76C9, 0x3FCCEE8A,0xDA3639B7,
+	0x3FCD4FDF,0x3B645A1D, 0x3FCD0E75,0x6ACD0CEA,
+	0x3FCD70A3,0xD70A3D71, 0x3FCD2E5E,0x13E74218,
+	0x3FCD9168,0x72B020C5, 0x3FCD4E44,0xD36D81E2,
+	0x3FCDB22D,0x0E560419, 0x3FCD6E29,0xA74894FF,
+	0x3FCDD2F1,0xA9FBE76D, 0x3FCD8E0C,0x8D61645E,
+	0x3FCDF3B6,0x45A1CAC1, 0x3FCDADED,0x83A0F94B,
+	0x3FCE147A,0xE147AE14, 0x3FCDCDCC,0x87F07D90,
+	0x3FCE353F,0x7CED9168, 0x3FCDEDA9,0x98393B9A,
+	0x3FCE5604,0x189374BC, 0x3FCE0D84,0xB2649E9B,
+	0x3FCE76C8,0xB4395810, 0x3FCE2D5D,0xD45C32AB,
+	0x3FCE978D,0x4FDF3B64, 0x3FCE4D34,0xFC09A4F0,
+	0x3FCEB851,0xEB851EB8, 0x3FCE6D0A,0x2756C3BC,
+	0x3FCED916,0x872B020C, 0x3FCE8CDD,0x542D7EB4,
+	0x3FCEF9DB,0x22D0E560, 0x3FCEACAE,0x8077E6EE,
+	0x3FCF1A9F,0xBE76C8B4, 0x3FCECC7D,0xAA202F1C,
+	0x3FCF3B64,0x5A1CAC08, 0x3FCEEC4A,0xCF10ABA5,
+	0x3FCF5C28,0xF5C28F5C, 0x3FCF0C15,0xED33D2D1,
+	0x3FCF7CED,0x916872B0, 0x3FCF2BDF,0x02743CE5,
+	0x3FCF9DB2,0x2D0E5604, 0x3FCF4BA6,0x0CBCA44C,
+	0x3FCFBE76,0xC8B43958, 0x3FCF6B6B,0x09F7E5B4,
+	0x3FCFDF3B,0x645A1CAC, 0x3FCF8B2D,0xF8110036,
+	0x3FD00000,0x00000000, 0x3FCFAAEE,0xD4F31577,
+	0x3FD01062,0x4DD2F1AA, 0x3FCFCAAD,0x9E8969C8,
+	0x3FD020C4,0x9BA5E354, 0x3FCFEA6A,0x52BF6450,
+	0x3FD03126,0xE978D4FE, 0x3FD00512,0x77C04793,
+	0x3FD04189,0x374BC6A8, 0x3FD014EE,0xB95C4BBE,
+	0x3FD051EB,0x851EB852, 0x3FD024C9,0xED29A6DE,
+	0x3FD0624D,0xD2F1A9FC, 0x3FD034A4,0x121E52D8,
+	0x3FD072B0,0x20C49BA6, 0x3FD0447D,0x27305B4F,
+	0x3FD08312,0x6E978D50, 0x3FD05455,0x2B55DDB9,
+	0x3FD09374,0xBC6A7EFA, 0x3FD0642C,0x1D85096F,
+	0x3FD0A3D7,0x0A3D70A4, 0x3FD07401,0xFCB41FBD,
+	0x3FD0B439,0x5810624E, 0x3FD083D6,0xC7D973F6,
+	0x3FD0C49B,0xA5E353F8, 0x3FD093AA,0x7DEB6B84,
+	0x3FD0D4FD,0xF3B645A2, 0x3FD0A37D,0x1DE07DFA,
+	0x3FD0E560,0x4189374C, 0x3FD0B34E,0xA6AF3523,
+	0x3FD0F5C2,0x8F5C28F6, 0x3FD0C31F,0x174E2D16,
+	0x3FD10624,0xDD2F1AA0, 0x3FD0D2EE,0x6EB4144A,
+	0x3FD11687,0x2B020C4A, 0x3FD0E2BC,0xABD7AB9F,
+	0x3FD126E9,0x78D4FDF4, 0x3FD0F289,0xCDAFC678,
+	0x3FD1374B,0xC6A7EF9E, 0x3FD10255,0xD3334AC8,
+	0x3FD147AE,0x147AE148, 0x3FD11220,0xBB593124,
+	0x3FD15810,0x624DD2F2, 0x3FD121EA,0x851884D5,
+	0x3FD16872,0xB020C49C, 0x3FD131B3,0x2F6863E9,
+	0x3FD178D4,0xFDF3B646, 0x3FD1417A,0xB93FFF43,
+	0x3FD18937,0x4BC6A7F0, 0x3FD15141,0x21969AB1,
+	0x3FD19999,0x9999999A, 0x3FD16106,0x67638CF6,
+	0x3FD1A9FB,0xE76C8B44, 0x3FD170CA,0x899E3FE3,
+	0x3FD1BA5E,0x353F7CEE, 0x3FD1808D,0x873E3062,
+	0x3FD1CAC0,0x83126E98, 0x3FD1904F,0x5F3AEE8C,
+	0x3FD1DB22,0xD0E56042, 0x3FD1A010,0x108C1DB7,
+	0x3FD1EB85,0x1EB851EC, 0x3FD1AFCF,0x9A29748A,
+	0x3FD1FBE7,0x6C8B4396, 0x3FD1BF8D,0xFB0ABD0C,
+	0x3FD20C49,0xBA5E353F, 0x3FD1CF4B,0x3227D4B7,
+	0x3FD21CAC,0x083126E9, 0x3FD1DF07,0x3E78AC89,
+	0x3FD22D0E,0x56041893, 0x3FD1EEC2,0x1EF54914,
+	0x3FD23D70,0xA3D70A3D, 0x3FD1FE7B,0xD295C292,
+	0x3FD24DD2,0xF1A9FBE7, 0x3FD20E34,0x585244F2,
+	0x3FD25E35,0x3F7CED91, 0x3FD21DEB,0xAF230FEE,
+	0x3FD26E97,0x8D4FDF3B, 0x3FD22DA1,0xD6007719,
+	0x3FD27EF9,0xDB22D0E5, 0x3FD23D56,0xCBE2E1F2,
+	0x3FD28F5C,0x28F5C28F, 0x3FD24D0A,0x8FC2CBF6,
+	0x3FD29FBE,0x76C8B439, 0x3FD25CBD,0x2098C4AD,
+	0x3FD2B020,0xC49BA5E3, 0x3FD26C6E,0x7D5D6FC0,
+	0x3FD2C083,0x126E978D, 0x3FD27C1E,0xA5098509,
+	0x3FD2D0E5,0x60418937, 0x3FD28BCD,0x9695D0A4,
+	0x3FD2E147,0xAE147AE1, 0x3FD29B7B,0x50FB32FD,
+	0x3FD2F1A9,0xFBE76C8B, 0x3FD2AB27,0xD332A0E9,
+	0x3FD3020C,0x49BA5E35, 0x3FD2BAD3,0x1C3523AE,
+	0x3FD3126E,0x978D4FDF, 0x3FD2CA7D,0x2AFBD91B,
+	0x3FD322D0,0xE5604189, 0x3FD2DA25,0xFE7FF398,
+	0x3FD33333,0x33333333, 0x3FD2E9CD,0x95BABA33,
+	0x3FD34395,0x810624DD, 0x3FD2F973,0xEFA588B8,
+	0x3FD353F7,0xCED91687, 0x3FD30919,0x0B39CFBC,
+	0x3FD3645A,0x1CAC0831, 0x3FD318BC,0xE77114B2,
+	0x3FD374BC,0x6A7EF9DB, 0x3FD3285F,0x8344F1FA,
+	0x3FD3851E,0xB851EB85, 0x3FD33800,0xDDAF16F5,
+	0x3FD39581,0x0624DD2F, 0x3FD347A0,0xF5A94813,
+	0x3FD3A5E3,0x53F7CED9, 0x3FD3573F,0xCA2D5EE5,
+	0x3FD3B645,0xA1CAC083, 0x3FD366DD,0x5A354A32,
+	0x3FD3C6A7,0xEF9DB22D, 0x3FD37679,0xA4BB0E00,
+	0x3FD3D70A,0x3D70A3D7, 0x3FD38614,0xA8B8C3AF,
+	0x3FD3E76C,0x8B439581, 0x3FD395AE,0x65289A02,
+	0x3FD3F7CE,0xD916872B, 0x3FD3A546,0xD904D535,
+	0x3FD40831,0x26E978D5, 0x3FD3B4DE,0x0347CF0C,
+	0x3FD41893,0x74BC6A7F, 0x3FD3C473,0xE2EBF6E5,
+	0x3FD428F5,0xC28F5C29, 0x3FD3D408,0x76EBD1C9,
+	0x3FD43958,0x10624DD3, 0x3FD3E39B,0xBE41FA7C,
+	0x3FD449BA,0x5E353F7D, 0x3FD3F32D,0xB7E92191,
+	0x3FD45A1C,0xAC083127, 0x3FD402BE,0x62DC0D78,
+	0x3FD46A7E,0xF9DB22D1, 0x3FD4124D,0xBE159A90,
+	0x3FD47AE1,0x47AE147B, 0x3FD421DB,0xC890BB3A,
+	0x3FD48B43,0x95810625, 0x3FD43168,0x814877E8,
+	0x3FD49BA5,0xE353F7CF, 0x3FD440F3,0xE737EF2D,
+	0x3FD4AC08,0x3126E979, 0x3FD4507D,0xF95A55D3,
+	0x3FD4BC6A,0x7EF9DB23, 0x3FD46006,0xB6AAF6E7,
+	0x3FD4CCCC,0xCCCCCCCD, 0x3FD46F8E,0x1E2533CC,
+	0x3FD4DD2F,0x1A9FBE77, 0x3FD47F14,0x2EC4844C,
+	0x3FD4ED91,0x6872B021, 0x3FD48E98,0xE78476AA,
+	0x3FD4FDF3,0xB645A1CB, 0x3FD49E1C,0x4760AFB2,
+	0x3FD50E56,0x04189375, 0x3FD4AD9E,0x4D54EAC9,
+	0x3FD51EB8,0x51EB851F, 0x3FD4BD1E,0xF85CFA01,
+	0x3FD52F1A,0x9FBE76C9, 0x3FD4CC9E,0x4774C628,
+	0x3FD53F7C,0xED916873, 0x3FD4DC1C,0x39984ED8,
+	0x3FD54FDF,0x3B645A1D, 0x3FD4EB98,0xCDC3AA8D,
+	0x3FD56041,0x89374BC7, 0x3FD4FB14,0x02F306AE,
+	0x3FD570A3,0xD70A3D71, 0x3FD50A8D,0xD822A7A6,
+	0x3FD58106,0x24DD2F1B, 0x3FD51A06,0x4C4EE8EF,
+	0x3FD59168,0x72B020C5, 0x3FD5297D,0x5E743D28,
+	0x3FD5A1CA,0xC083126F, 0x3FD538F3,0x0D8F2E23,
+	0x3FD5B22D,0x0E560419, 0x3FD54867,0x589C5CF4,
+	0x3FD5C28F,0x5C28F5C3, 0x3FD557DA,0x3E988208,
+	0x3FD5D2F1,0xA9FBE76D, 0x3FD5674B,0xBE806D32,
+	0x3FD5E353,0xF7CED917, 0x3FD576BB,0xD75105BA,
+	0x3FD5F3B6,0x45A1CAC1, 0x3FD5862A,0x88074A73,
+	0x3FD60418,0x9374BC6A, 0x3FD59597,0xCFA051C9,
+	0x3FD6147A,0xE147AE14, 0x3FD5A503,0xAD1949D2,
+	0x3FD624DD,0x2F1A9FBE, 0x3FD5B46E,0x1F6F7861,
+	0x3FD6353F,0x7CED9168, 0x3FD5C3D7,0x25A03B13,
+	0x3FD645A1,0xCAC08312, 0x3FD5D33E,0xBEA90765,
+	0x3FD65604,0x189374BC, 0x3FD5E2A4,0xE9876ABF,
+	0x3FD66666,0x66666666, 0x3FD5F209,0xA5390A8B,
+	0x3FD676C8,0xB4395810, 0x3FD6016C,0xF0BBA442,
+	0x3FD6872B,0x020C49BA, 0x3FD610CE,0xCB0D0D7F,
+	0x3FD6978D,0x4FDF3B64, 0x3FD6202F,0x332B340E,
+	0x3FD6A7EF,0x9DB22D0E, 0x3FD62F8E,0x28141DFE,
+	0x3FD6B851,0xEB851EB8, 0x3FD63EEB,0xA8C5E9B3,
+	0x3FD6C8B4,0x39581062, 0x3FD64E47,0xB43ECDF4,
+	0x3FD6D916,0x872B020C, 0x3FD65DA2,0x497D19FF,
+	0x3FD6E978,0xD4FDF3B6, 0x3FD66CFB,0x677F3598,
+	0x3FD6F9DB,0x22D0E560, 0x3FD67C53,0x0D43A11A,
+	0x3FD70A3D,0x70A3D70A, 0x3FD68BA9,0x39C8F589,
+	0x3FD71A9F,0xBE76C8B4, 0x3FD69AFD,0xEC0DE4A3,
+	0x3FD72B02,0x0C49BA5E, 0x3FD6AA51,0x231138ED,
+	0x3FD73B64,0x5A1CAC08, 0x3FD6B9A2,0xDDD1D5CA,
+	0x3FD74BC6,0xA7EF9DB2, 0x3FD6C8F3,0x1B4EB787,
+	0x3FD75C28,0xF5C28F5C, 0x3FD6D841,0xDA86F36E,
+	0x3FD76C8B,0x43958106, 0x3FD6E78F,0x1A79B7D7,
+	0x3FD77CED,0x916872B0, 0x3FD6F6DA,0xDA264C36,
+	0x3FD78D4F,0xDF3B645A, 0x3FD70625,0x188C1132,
+	0x3FD79DB2,0x2D0E5604, 0x3FD7156D,0xD4AA80AE,
+	0x3FD7AE14,0x7AE147AE, 0x3FD724B5,0x0D812DDF,
+	0x3FD7BE76,0xC8B43958, 0x3FD733FA,0xC20FC55C,
+	0x3FD7CED9,0x16872B02, 0x3FD7433E,0xF1560D2F,
+	0x3FD7DF3B,0x645A1CAC, 0x3FD75281,0x9A53E4E3,
+	0x3FD7EF9D,0xB22D0E56, 0x3FD761C2,0xBC094599,
+	0x3FD80000,0x00000000, 0x3FD77102,0x55764214,
+	0x3FD81062,0x4DD2F1AA, 0x3FD78040,0x659B06CF,
+	0x3FD820C4,0x9BA5E354, 0x3FD78F7C,0xEB77DA0A,
+	0x3FD83126,0xE978D4FE, 0x3FD79EB7,0xE60D1BDC,
+	0x3FD84189,0x374BC6A8, 0x3FD7ADF1,0x545B4644,
+	0x3FD851EB,0x851EB852, 0x3FD7BD29,0x3562ED39,
+	0x3FD8624D,0xD2F1A9FC, 0x3FD7CC5F,0x8824BEBC,
+	0x3FD872B0,0x20C49BA6, 0x3FD7DB94,0x4BA182E6,
+	0x3FD88312,0x6E978D50, 0x3FD7EAC7,0x7EDA1BFD,
+	0x3FD89374,0xBC6A7EFA, 0x3FD7F9F9,0x20CF8681,
+	0x3FD8A3D7,0x0A3D70A4, 0x3FD80929,0x3082D93F,
+	0x3FD8B439,0x5810624E, 0x3FD81857,0xACF5455F,
+	0x3FD8C49B,0xA5E353F8, 0x3FD82784,0x95281678,
+	0x3FD8D4FD,0xF3B645A2, 0x3FD836AF,0xE81CB29F,
+	0x3FD8E560,0x4189374C, 0x3FD845D9,0xA4D49A78,
+	0x3FD8F5C2,0x8F5C28F6, 0x3FD85501,0xCA516945,
+	0x3FD90624,0xDD2F1AA0, 0x3FD86428,0x5794D4FB,
+	0x3FD91687,0x2B020C4A, 0x3FD8734D,0x4BA0AE4C,
+	0x3FD926E9,0x78D4FDF4, 0x3FD88270,0xA576E0C0,
+	0x3FD9374B,0xC6A7EF9E, 0x3FD89192,0x641972BD,
+	0x3FD947AE,0x147AE148, 0x3FD8A0B2,0x868A859F,
+	0x3FD95810,0x624DD2F2, 0x3FD8AFD1,0x0BCC55C4,
+	0x3FD96872,0xB020C49C, 0x3FD8BEED,0xF2E13A9E,
+	0x3FD978D4,0xFDF3B646, 0x3FD8CE09,0x3ACBA6C4,
+	0x3FD98937,0x4BC6A7F0, 0x3FD8DD22,0xE28E2802,
+	0x3FD99999,0x9999999A, 0x3FD8EC3A,0xE92B676B,
+	0x3FD9A9FB,0xE76C8B44, 0x3FD8FB51,0x4DA62967,
+	0x3FD9BA5E,0x353F7CEE, 0x3FD90A66,0x0F014DC6,
+	0x3FD9CAC0,0x83126E98, 0x3FD91979,0x2C3FCFD1,
+	0x3FD9DB22,0xD0E56042, 0x3FD9288A,0xA464C656,
+	0x3FD9EB85,0x1EB851EC, 0x3FD9379A,0x767363BE,
+	0x3FD9FBE7,0x6C8B4396, 0x3FD946A8,0xA16EF61D,
+	0x3FDA0C49,0xBA5E353F, 0x3FD955B5,0x245AE73D,
+	0x3FDA1CAC,0x083126E9, 0x3FD964BF,0xFE3ABCB8,
+	0x3FDA2D0E,0x56041893, 0x3FD973C9,0x2E1217FD,
+	0x3FDA3D70,0xA3D70A3D, 0x3FD982D0,0xB2E4B66B,
+	0x3FDA4DD2,0xF1A9FBE7, 0x3FD991D6,0x8BB6715B,
+	0x3FDA5E35,0x3F7CED91, 0x3FD9A0DA,0xB78B3E34,
+	0x3FDA6E97,0x8D4FDF3B, 0x3FD9AFDD,0x35672E7B,
+	0x3FDA7EF9,0xDB22D0E5, 0x3FD9BEDE,0x044E6FDF,
+	0x3FDA8F5C,0x28F5C28F, 0x3FD9CDDD,0x23454C51,
+	0x3FDA9FBE,0x76C8B439, 0x3FD9DCDA,0x91502A0F,
+	0x3FDAB020,0xC49BA5E3, 0x3FD9EBD6,0x4D738BB8,
+	0x3FDAC083,0x126E978D, 0x3FD9FAD0,0x56B41057,
+	0x3FDAD0E5,0x60418937, 0x3FDA09C8,0xAC16737C,
+	0x3FDAE147,0xAE147AE1, 0x3FDA18BF,0x4C9F8D43,
+	0x3FDAF1A9,0xFBE76C8B, 0x3FDA27B4,0x3754526D,
+	0x3FDB020C,0x49BA5E35, 0x3FDA36A7,0x6B39D46A,
+	0x3FDB126E,0x978D4FDF, 0x3FDA4598,0xE755416D,
+	0x3FDB22D0,0xE5604189, 0x3FDA5488,0xAAABE47B,
+	0x3FDB3333,0x33333333, 0x3FDA6376,0xB443257D,
+	0x3FDB4395,0x810624DD, 0x3FDA7263,0x0320894E,
+	0x3FDB53F7,0xCED91687, 0x3FDA814D,0x9649B1CD,
+	0x3FDB645A,0x1CAC0831, 0x3FDA9036,0x6CC45DED,
+	0x3FDB74BC,0x6A7EF9DB, 0x3FDA9F1D,0x859669C6,
+	0x3FDB851E,0xB851EB85, 0x3FDAAE02,0xDFC5CEA5,
+	0x3FDB9581,0x0624DD2F, 0x3FDABCE6,0x7A58A31C,
+	0x3FDBA5E3,0x53F7CED9, 0x3FDACBC8,0x54551B12,
+	0x3FDBB645,0xA1CAC083, 0x3FDADAA8,0x6CC187D6,
+	0x3FDBC6A7,0xEF9DB22D, 0x3FDAE986,0xC2A4582C,
+	0x3FDBD70A,0x3D70A3D7, 0x3FDAF863,0x5504185D,
+	0x3FDBE76C,0x8B439581, 0x3FDB073E,0x22E7724D,
+	0x3FDBF7CE,0xD916872B, 0x3FDB1617,0x2B552D85,
+	0x3FDC0831,0x26E978D5, 0x3FDB24EE,0x6D542F46,
+	0x3FDC1893,0x74BC6A7F, 0x3FDB33C3,0xE7EB7A99,
+	0x3FDC28F5,0xC28F5C29, 0x3FDB4297,0x9A223061,
+	0x3FDC3958,0x10624DD3, 0x3FDB5169,0x82FF8F67,
+	0x3FDC49BA,0x5E353F7D, 0x3FDB6039,0xA18AF470,
+	0x3FDC5A1C,0xAC083127, 0x3FDB6F07,0xF4CBDA48,
+	0x3FDC6A7E,0xF9DB22D1, 0x3FDB7DD4,0x7BC9D9D6,
+	0x3FDC7AE1,0x47AE147B, 0x3FDB8C9F,0x358CAA2B,
+	0x3FDC8B43,0x95810625, 0x3FDB9B68,0x211C2090,
+	0x3FDC9BA5,0xE353F7CF, 0x3FDBAA2F,0x3D80309B,
+	0x3FDCAC08,0x3126E979, 0x3FDBB8F4,0x89C0EC3C,
+	0x3FDCBC6A,0x7EF9DB23, 0x3FDBC7B8,0x04E683CD,
+	0x3FDCCCCC,0xCCCCCCCD, 0x3FDBD679,0xADF94625,
+	0x3FDCDD2F,0x1A9FBE77, 0x3FDBE539,0x8401A0A4,
+	0x3FDCED91,0x6872B021, 0x3FDBF3F7,0x86081F48,
+	0x3FDCFDF3,0xB645A1CB, 0x3FDC02B3,0xB3156CB9,
+	0x3FDD0E56,0x04189375, 0x3FDC116E,0x0A32525C,
+	0x3FDD1EB8,0x51EB851F, 0x3FDC2026,0x8A67B863,
+	0x3FDD2F1A,0x9FBE76C9, 0x3FDC2EDD,0x32BEA5DA,
+	0x3FDD3F7C,0xED916873, 0x3FDC3D92,0x024040BD,
+	0x3FDD4FDF,0x3B645A1D, 0x3FDC4C44,0xF7F5CE02,
+	0x3FDD6041,0x89374BC7, 0x3FDC5AF6,0x12E8B1AD,
+	0x3FDD70A3,0xD70A3D71, 0x3FDC69A5,0x52226EE0,
+	0x3FDD8106,0x24DD2F1B, 0x3FDC7852,0xB4ACA7E9,
+	0x3FDD9168,0x72B020C5, 0x3FDC86FE,0x39911E54,
+	0x3FDDA1CA,0xC083126F, 0x3FDC95A7,0xDFD9B2FA,
+	0x3FDDB22D,0x0E560419, 0x3FDCA44F,0xA6906613,
+	0x3FDDC28F,0x5C28F5C3, 0x3FDCB2F5,0x8CBF5745,
+	0x3FDDD2F1,0xA9FBE76D, 0x3FDCC199,0x9170C5B2,
+	0x3FDDE353,0xF7CED917, 0x3FDCD03B,0xB3AF100B,
+	0x3FDDF3B6,0x45A1CAC1, 0x3FDCDEDB,0xF284B49F,
+	0x3FDE0418,0x9374BC6A, 0x3FDCED7A,0x4CFC516D,
+	0x3FDE147A,0xE147AE14, 0x3FDCFC16,0xC220A430,
+	0x3FDE24DD,0x2F1A9FBE, 0x3FDD0AB1,0x50FC8A73,
+	0x3FDE353F,0x7CED9168, 0x3FDD1949,0xF89B019E,
+	0x3FDE45A1,0xCAC08312, 0x3FDD27E0,0xB8072709,
+	0x3FDE5604,0x189374BC, 0x3FDD3675,0x8E4C380A,
+	0x3FDE6666,0x66666666, 0x3FDD4508,0x7A759204,
+	0x3FDE76C8,0xB4395810, 0x3FDD5399,0x7B8EB27D,
+	0x3FDE872B,0x020C49BA, 0x3FDD6228,0x90A33724,
+	0x3FDE978D,0x4FDF3B64, 0x3FDD70B5,0xB8BEDDEB,
+	0x3FDEA7EF,0x9DB22D0E, 0x3FDD7F40,0xF2ED8511,
+	0x3FDEB851,0xEB851EB8, 0x3FDD8DCA,0x3E3B2B35,
+	0x3FDEC8B4,0x39581062, 0x3FDD9C51,0x99B3EF61,
+	0x3FDED916,0x872B020C, 0x3FDDAAD7,0x04641123,
+	0x3FDEE978,0xD4FDF3B6, 0x3FDDB95A,0x7D57F094,
+	0x3FDEF9DB,0x22D0E560, 0x3FDDC7DC,0x039C0E6C,
+	0x3FDF0A3D,0x70A3D70A, 0x3FDDD65B,0x963D0C13,
+	0x3FDF1A9F,0xBE76C8B4, 0x3FDDE4D9,0x3447ABAE,
+	0x3FDF2B02,0x0C49BA5E, 0x3FDDF354,0xDCC8D032,
+	0x3FDF3B64,0x5A1CAC08, 0x3FDE01CE,0x8ECD7D70,
+	0x3FDF4BC6,0xA7EF9DB2, 0x3FDE1046,0x4962D82B,
+	0x3FDF5C28,0xF5C28F5C, 0x3FDE1EBC,0x0B962620,
+	0x3FDF6C8B,0x43958106, 0x3FDE2D2F,0xD474CE1D,
+	0x3FDF7CED,0x916872B0, 0x3FDE3BA1,0xA30C580E,
+	0x3FDF8D4F,0xDF3B645A, 0x3FDE4A11,0x766A6D0C,
+	0x3FDF9DB2,0x2D0E5604, 0x3FDE587F,0x4D9CD76C,
+	0x3FDFAE14,0x7AE147AE, 0x3FDE66EB,0x27B182D6,
+	0x3FDFBE76,0xC8B43958, 0x3FDE7555,0x03B67C49,
+	0x3FDFCED9,0x16872B02, 0x3FDE83BC,0xE0B9F237,
+	0x3FDFDF3B,0x645A1CAC, 0x3FDE9222,0xBDCA348C,
+	0x3FDFEF9D,0xB22D0E56, 0x3FDEA086,0x99F5B4C2,
+	0x3FE00000,0x00000000, 0x3FDEAEE8,0x744B05F0,
+	0x3FE00831,0x26E978D5, 0x3FDEBD48,0x4BD8DCDA,
+	0x3FE01062,0x4DD2F1AA, 0x3FDECBA6,0x1FAE0FFF,
+	0x3FE01893,0x74BC6A7F, 0x3FDEDA01,0xEED997AD,
+	0x3FE020C4,0x9BA5E354, 0x3FDEE85B,0xB86A8E0C,
+	0x3FE028F5,0xC28F5C29, 0x3FDEF6B3,0x7B702F32,
+	0x3FE03126,0xE978D4FE, 0x3FDF0509,0x36F9D92E,
+	0x3FE03958,0x10624DD3, 0x3FDF135C,0xEA170C1C,
+	0x3FE04189,0x374BC6A8, 0x3FDF21AE,0x93D76A34,
+	0x3FE049BA,0x5E353F7D, 0x3FDF2FFE,0x334AB7D7,
+	0x3FE051EB,0x851EB852, 0x3FDF3E4B,0xC780DBA3,
+	0x3FE05A1C,0xAC083127, 0x3FDF4C97,0x4F89DE80,
+	0x3FE0624D,0xD2F1A9FC, 0x3FDF5AE0,0xCA75EBAF,
+	0x3FE06A7E,0xF9DB22D1, 0x3FDF6928,0x375550DB,
+	0x3FE072B0,0x20C49BA6, 0x3FDF776D,0x95387E29,
+	0x3FE07AE1,0x47AE147B, 0x3FDF85B0,0xE330064A,
+	0x3FE08312,0x6E978D50, 0x3FDF93F2,0x204C9E83,
+	0x3FE08B43,0x95810625, 0x3FDFA231,0x4B9F1EC6,
+	0x3FE09374,0xBC6A7EFA, 0x3FDFB06E,0x643881BB,
+	0x3FE09BA5,0xE353F7CF, 0x3FDFBEA9,0x6929E4D2,
+	0x3FE0A3D7,0x0A3D70A4, 0x3FDFCCE2,0x59848856,
+	0x3FE0AC08,0x3126E979, 0x3FDFDB19,0x3459CF74,
+	0x3FE0B439,0x5810624E, 0x3FDFE94D,0xF8BB4055,
+	0x3FE0BC6A,0x7EF9DB23, 0x3FDFF780,0xA5BA8426,
+	0x3FE0C49B,0xA5E353F8, 0x3FE002D8,0x9D34B395,
+	0x3FE0CCCC,0xCCCCCCCD, 0x3FE009EF,0xDAECEC66,
+	0x3FE0D4FD,0xF3B645A2, 0x3FE01106,0x0B8EF5D4,
+	0x3FE0DD2F,0x1A9FBE77, 0x3FE0181B,0x2EA3EAD3,
+	0x3FE0E560,0x4189374C, 0x3FE01F2F,0x43B4F7FE,
+	0x3FE0ED91,0x6872B021, 0x3FE02642,0x4A4B5BA4,
+	0x3FE0F5C2,0x8F5C28F6, 0x3FE02D54,0x41F065CD,
+	0x3FE0FDF3,0xB645A1CB, 0x3FE03465,0x2A2D7844,
+	0x3FE10624,0xDD2F1AA0, 0x3FE03B75,0x028C069B,
+	0x3FE10E56,0x04189375, 0x3FE04283,0xCA959638,
+	0x3FE11687,0x2B020C4A, 0x3FE04991,0x81D3BE58,
+	0x3FE11EB8,0x51EB851F, 0x3FE0509E,0x27D0281A,
+	0x3FE126E9,0x78D4FDF4, 0x3FE057A9,0xBC148E83,
+	0x3FE12F1A,0x9FBE76C9, 0x3FE05EB4,0x3E2ABE8D,
+	0x3FE1374B,0xC6A7EF9E, 0x3FE065BD,0xAD9C9724,
+	0x3FE13F7C,0xED916873, 0x3FE06CC6,0x09F40939,
+	0x3FE147AE,0x147AE148, 0x3FE073CD,0x52BB17C2,
+	0x3FE14FDF,0x3B645A1D, 0x3FE07AD3,0x877BD7C3,
+	0x3FE15810,0x624DD2F2, 0x3FE081D8,0xA7C0705A,
+	0x3FE16041,0x89374BC7, 0x3FE088DC,0xB3131AC2,
+	0x3FE16872,0xB020C49C, 0x3FE08FDF,0xA8FE225B,
+	0x3FE170A3,0xD70A3D71, 0x3FE096E1,0x890BE4B6,
+	0x3FE178D4,0xFDF3B646, 0x3FE09DE2,0x52C6D197,
+	0x3FE18106,0x24DD2F1B, 0x3FE0A4E2,0x05B96B02,
+	0x3FE18937,0x4BC6A7F0, 0x3FE0ABE0,0xA16E453F,
+	0x3FE19168,0x72B020C5, 0x3FE0B2DE,0x257006E1,
+	0x3FE19999,0x9999999A, 0x3FE0B9DA,0x914968D4,
+	0x3FE1A1CA,0xC083126F, 0x3FE0C0D5,0xE485365C,
+	0x3FE1A9FB,0xE76C8B44, 0x3FE0C7D0,0x1EAE4D23,
+	0x3FE1B22D,0x0E560419, 0x3FE0CEC9,0x3F4F9D3E,
+	0x3FE1BA5E,0x353F7CEE, 0x3FE0D5C1,0x45F42936,
+	0x3FE1C28F,0x5C28F5C3, 0x3FE0DCB8,0x3227060F,
+	0x3FE1CAC0,0x83126E98, 0x3FE0E3AE,0x03735B4F,
+	0x3FE1D2F1,0xA9FBE76D, 0x3FE0EAA2,0xB9646305,
+	0x3FE1DB22,0xD0E56042, 0x3FE0F196,0x538569D5,
+	0x3FE1E353,0xF7CED917, 0x3FE0F888,0xD161CEFA,
+	0x3FE1EB85,0x1EB851EC, 0x3FE0FF7A,0x32850452,
+	0x3FE1F3B6,0x45A1CAC1, 0x3FE1066A,0x767A8E63,
+	0x3FE1FBE7,0x6C8B4396, 0x3FE10D59,0x9CCE0463,
+	0x3FE20418,0x9374BC6A, 0x3FE11447,0xA50B1040,
+	0x3FE20C49,0xBA5E353F, 0x3FE11B34,0x8EBD6EAA,
+	0x3FE2147A,0xE147AE14, 0x3FE12220,0x5970EF16,
+	0x3FE21CAC,0x083126E9, 0x3FE1290B,0x04B173CA,
+	0x3FE224DD,0x2F1A9FBE, 0x3FE12FF4,0x900AF1DF,
+	0x3FE22D0E,0x56041893, 0x3FE136DC,0xFB097151,
+	0x3FE2353F,0x7CED9168, 0x3FE13DC4,0x45390CFD,
+	0x3FE23D70,0xA3D70A3D, 0x3FE144AA,0x6E25F2B2,
+	0x3FE245A1,0xCAC08312, 0x3FE14B8F,0x755C6331,
+	0x3FE24DD2,0xF1A9FBE7, 0x3FE15273,0x5A68B238,
+	0x3FE25604,0x189374BC, 0x3FE15956,0x1CD74689,
+	0x3FE25E35,0x3F7CED91, 0x3FE16037,0xBC3499F4,
+	0x3FE26666,0x66666666, 0x3FE16718,0x380D3959,
+	0x3FE26E97,0x8D4FDF3B, 0x3FE16DF7,0x8FEDC4B4,
+	0x3FE276C8,0xB4395810, 0x3FE174D5,0xC362EF26,
+	0x3FE27EF9,0xDB22D0E5, 0x3FE17BB2,0xD1F97EF6,
+	0x3FE2872B,0x020C49BA, 0x3FE1828E,0xBB3E4D9F,
+	0x3FE28F5C,0x28F5C28F, 0x3FE18969,0x7EBE47D4,
+	0x3FE2978D,0x4FDF3B64, 0x3FE19043,0x1C066D89,
+	0x3FE29FBE,0x76C8B439, 0x3FE1971B,0x92A3D1FB,
+	0x3FE2A7EF,0x9DB22D0E, 0x3FE19DF2,0xE2239BB5,
+	0x3FE2B020,0xC49BA5E3, 0x3FE1A4C9,0x0A13049B,
+	0x3FE2B851,0xEB851EB8, 0x3FE1AB9E,0x09FF59EE,
+	0x3FE2C083,0x126E978D, 0x3FE1B271,0xE175FC57,
+	0x3FE2C8B4,0x39581062, 0x3FE1B944,0x90045FEB,
+	0x3FE2D0E5,0x60418937, 0x3FE1C016,0x15380C35,
+	0x3FE2D916,0x872B020C, 0x3FE1C6E6,0x709E9C3E,
+	0x3FE2E147,0xAE147AE1, 0x3FE1CDB5,0xA1C5BE92,
+	0x3FE2E978,0xD4FDF3B6, 0x3FE1D483,0xA83B3548,
+	0x3FE2F1A9,0xFBE76C8B, 0x3FE1DB50,0x838CD60C,
+	0x3FE2F9DB,0x22D0E560, 0x3FE1E21C,0x33488A24,
+	0x3FE3020C,0x49BA5E35, 0x3FE1E8E6,0xB6FC4E78,
+	0x3FE30A3D,0x70A3D70A, 0x3FE1EFB0,0x0E36339A,
+	0x3FE3126E,0x978D4FDF, 0x3FE1F678,0x38845DCD,
+	0x3FE31A9F,0xBE76C8B4, 0x3FE1FD3F,0x3575050D,
+	0x3FE322D0,0xE5604189, 0x3FE20405,0x04967515,
+	0x3FE32B02,0x0C49BA5E, 0x3FE20AC9,0xA5770D68,
+	0x3FE33333,0x33333333, 0x3FE2118D,0x17A54159,
+	0x3FE33B64,0x5A1CAC08, 0x3FE2184F,0x5AAF9810,
+	0x3FE34395,0x810624DD, 0x3FE21F10,0x6E24AC94,
+	0x3FE34BC6,0xA7EF9DB2, 0x3FE225D0,0x51932DD0,
+	0x3FE353F7,0xCED91687, 0x3FE22C8F,0x0489DE9D,
+	0x3FE35C28,0xF5C28F5C, 0x3FE2334C,0x869795C8,
+	0x3FE3645A,0x1CAC0831, 0x3FE23A08,0xD74B3E18,
+	0x3FE36C8B,0x43958106, 0x3FE240C3,0xF633D658,
+	0x3FE374BC,0x6A7EF9DB, 0x3FE2477D,0xE2E0715F,
+	0x3FE37CED,0x916872B0, 0x3FE24E36,0x9CE03613,
+	0x3FE3851E,0xB851EB85, 0x3FE254EE,0x23C25F74,
+	0x3FE38D4F,0xDF3B645A, 0x3FE25BA4,0x77163CA3,
+	0x3FE39581,0x0624DD2F, 0x3FE26259,0x966B30EA,
+	0x3FE39DB2,0x2D0E5604, 0x3FE2690D,0x8150B3BF,
+	0x3FE3A5E3,0x53F7CED9, 0x3FE26FC0,0x375650D3,
+	0x3FE3AE14,0x7AE147AE, 0x3FE27671,0xB80BA812,
+	0x3FE3B645,0xA1CAC083, 0x3FE27D22,0x03006DAE,
+	0x3FE3BE76,0xC8B43958, 0x3FE283D1,0x17C46A26,
+	0x3FE3C6A7,0xEF9DB22D, 0x3FE28A7E,0xF5E77A4D,
+	0x3FE3CED9,0x16872B02, 0x3FE2912B,0x9CF98F52,
+	0x3FE3D70A,0x3D70A3D7, 0x3FE297D7,0x0C8AAEC7,
+	0x3FE3DF3B,0x645A1CAC, 0x3FE29E81,0x442AF2A7,
+	0x3FE3E76C,0x8B439581, 0x3FE2A52A,0x436A895F,
+	0x3FE3EF9D,0xB22D0E56, 0x3FE2ABD2,0x09D9B5D6,
+	0x3FE3F7CE,0xD916872B, 0x3FE2B278,0x9708CF71,
+	0x3FE40000,0x00000000, 0x3FE2B91D,0xEA88421E,
+	0x3FE40831,0x26E978D5, 0x3FE2BFC2,0x03E88E59,
+	0x3FE41062,0x4DD2F1AA, 0x3FE2C664,0xE2BA4935,
+	0x3FE41893,0x74BC6A7F, 0x3FE2CD06,0x868E1C62,
+	0x3FE420C4,0x9BA5E354, 0x3FE2D3A6,0xEEF4C634,
+	0x3FE428F5,0xC28F5C29, 0x3FE2DA46,0x1B7F19AC,
+	0x3FE43126,0xE978D4FE, 0x3FE2E0E4,0x0BBDFE7E,
+	0x3FE43958,0x10624DD3, 0x3FE2E780,0xBF427117,
+	0x3FE44189,0x374BC6A8, 0x3FE2EE1C,0x359D82A8,
+	0x3FE449BA,0x5E353F7D, 0x3FE2F4B6,0x6E60592B,
+	0x3FE451EB,0x851EB852, 0x3FE2FB4F,0x691C2F68,
+	0x3FE45A1C,0xAC083127, 0x3FE301E7,0x25625502,
+	0x3FE4624D,0xD2F1A9FC, 0x3FE3087D,0xA2C42E77,
+	0x3FE46A7E,0xF9DB22D1, 0x3FE30F12,0xE0D3352F,
+	0x3FE472B0,0x20C49BA6, 0x3FE315A6,0xDF20F77C,
+	0x3FE47AE1,0x47AE147B, 0x3FE31C39,0x9D3F18A8,
+	0x3FE48312,0x6E978D50, 0x3FE322CB,0x1ABF50F5,
+	0x3FE48B43,0x95810625, 0x3FE3295B,0x57336DAB,
+	0x3FE49374,0xBC6A7EFA, 0x3FE32FEA,0x522D511B,
+	0x3FE49BA5,0xE353F7CF, 0x3FE33678,0x0B3EF2A9,
+	0x3FE4A3D7,0x0A3D70A4, 0x3FE33D04,0x81FA5ECF,
+	0x3FE4AC08,0x3126E979, 0x3FE3438F,0xB5F1B728,
+	0x3FE4B439,0x5810624E, 0x3FE34A19,0xA6B73279,
+	0x3FE4BC6A,0x7EF9DB23, 0x3FE350A2,0x53DD1CB0,
+	0x3FE4C49B,0xA5E353F8, 0x3FE35729,0xBCF5D6F5,
+	0x3FE4CCCC,0xCCCCCCCD, 0x3FE35DAF,0xE193D7AB,
+	0x3FE4D4FD,0xF3B645A2, 0x3FE36434,0xC149AA79,
+	0x3FE4DD2F,0x1A9FBE77, 0x3FE36AB8,0x5BA9F04F,
+	0x3FE4E560,0x4189374C, 0x3FE3713A,0xB0475F74,
+	0x3FE4ED91,0x6872B021, 0x3FE377BB,0xBEB4C383,
+	0x3FE4F5C2,0x8F5C28F6, 0x3FE37E3B,0x8684FD7C,
+	0x3FE4FDF3,0xB645A1CB, 0x3FE384BA,0x074B03C3,
+	0x3FE50624,0xDD2F1AA0, 0x3FE38B37,0x4099E22D,
+	0x3FE50E56,0x04189375, 0x3FE391B3,0x3204BA05,
+	0x3FE51687,0x2B020C4A, 0x3FE3982D,0xDB1EC212,
+	0x3FE51EB8,0x51EB851F, 0x3FE39EA7,0x3B7B46A0,
+	0x3FE526E9,0x78D4FDF4, 0x3FE3A51F,0x52ADA986,
+	0x3FE52F1A,0x9FBE76C9, 0x3FE3AB96,0x2049622E,
+	0x3FE5374B,0xC6A7EF9E, 0x3FE3B20B,0xA3E1FD9A,
+	0x3FE53F7C,0xED916873, 0x3FE3B87F,0xDD0B1E6F,
+	0x3FE547AE,0x147AE148, 0x3FE3BEF2,0xCB587CF9,
+	0x3FE54FDF,0x3B645A1D, 0x3FE3C564,0x6E5DE731,
+	0x3FE55810,0x624DD2F2, 0x3FE3CBD4,0xC5AF40C8,
+	0x3FE56041,0x89374BC7, 0x3FE3D243,0xD0E0832C,
+	0x3FE56872,0xB020C49C, 0x3FE3D8B1,0x8F85BD8E,
+	0x3FE570A3,0xD70A3D71, 0x3FE3DF1E,0x013314EC,
+	0x3FE578D4,0xFDF3B646, 0x3FE3E589,0x257CC414,
+	0x3FE58106,0x24DD2F1B, 0x3FE3EBF2,0xFBF71BAF,
+	0x3FE58937,0x4BC6A7F0, 0x3FE3F25B,0x84368246,
+	0x3FE59168,0x72B020C5, 0x3FE3F8C2,0xBDCF744A,
+	0x3FE59999,0x9999999A, 0x3FE3FF28,0xA8568418,
+	0x3FE5A1CA,0xC083126F, 0x3FE4058D,0x43605A06,
+	0x3FE5A9FB,0xE76C8B44, 0x3FE40BF0,0x8E81B464,
+	0x3FE5B22D,0x0E560419, 0x3FE41252,0x894F6788,
+	0x3FE5BA5E,0x353F7CEE, 0x3FE418B3,0x335E5DD0,
+	0x3FE5C28F,0x5C28F5C3, 0x3FE41F12,0x8C4397AD,
+	0x3FE5CAC0,0x83126E98, 0x3FE42570,0x93942BA8,
+	0x3FE5D2F1,0xA9FBE76D, 0x3FE42BCD,0x48E5466C,
+	0x3FE5DB22,0xD0E56042, 0x3FE43228,0xABCC2AC7,
+	0x3FE5E353,0xF7CED917, 0x3FE43882,0xBBDE31B7,
+	0x3FE5EB85,0x1EB851EC, 0x3FE43EDB,0x78B0CA6E,
+	0x3FE5F3B6,0x45A1CAC1, 0x3FE44532,0xE1D97A5B,
+	0x3FE5FBE7,0x6C8B4396, 0x3FE44B88,0xF6EDDD2D,
+	0x3FE60418,0x9374BC6A, 0x3FE451DD,0xB783A4DE,
+	0x3FE60C49,0xBA5E353F, 0x3FE45831,0x233099B9,
+	0x3FE6147A,0xE147AE14, 0x3FE45E83,0x398A9A60,
+	0x3FE61CAC,0x083126E9, 0x3FE464D3,0xFA279BD4,
+	0x3FE624DD,0x2F1A9FBE, 0x3FE46B23,0x649DA97A,
+	0x3FE62D0E,0x56041893, 0x3FE47171,0x7882E525,
+	0x3FE6353F,0x7CED9168, 0x3FE477BE,0x356D871A,
+	0x3FE63D70,0xA3D70A3D, 0x3FE47E09,0x9AF3DE19,
+	0x3FE645A1,0xCAC08312, 0x3FE48453,0xA8AC4F63,
+	0x3FE64DD2,0xF1A9FBE7, 0x3FE48A9C,0x5E2D56C1,
+	0x3FE65604,0x189374BC, 0x3FE490E3,0xBB0D868B,
+	0x3FE65E35,0x3F7CED91, 0x3FE49729,0xBEE387AF,
+	0x3FE66666,0x66666666, 0x3FE49D6E,0x694619B8,
+	0x3FE66E97,0x8D4FDF3B, 0x3FE4A3B1,0xB9CC12D4,
+	0x3FE676C8,0xB4395810, 0x3FE4A9F3,0xB00C5FDC,
+	0x3FE67EF9,0xDB22D0E5, 0x3FE4B034,0x4B9E045B,
+	0x3FE6872B,0x020C49BA, 0x3FE4B673,0x8C181A94,
+	0x3FE68F5C,0x28F5C28F, 0x3FE4BCB1,0x7111D388,
+	0x3FE6978D,0x4FDF3B64, 0x3FE4C2ED,0xFA227700,
+	0x3FE69FBE,0x76C8B439, 0x3FE4C929,0x26E16392,
+	0x3FE6A7EF,0x9DB22D0E, 0x3FE4CF62,0xF6E60EA5,
+	0x3FE6B020,0xC49BA5E3, 0x3FE4D59B,0x69C8047F,
+	0x3FE6B851,0xEB851EB8, 0x3FE4DBD2,0x7F1EE843,
+	0x3FE6C083,0x126E978D, 0x3FE4E208,0x36827401,
+	0x3FE6C8B4,0x39581062, 0x3FE4E83C,0x8F8A78B4,
+	0x3FE6D0E5,0x60418937, 0x3FE4EE6F,0x89CEDE4F,
+	0x3FE6D916,0x872B020C, 0x3FE4F4A1,0x24E7A3C2,
+	0x3FE6E147,0xAE147AE1, 0x3FE4FAD1,0x606CDF00,
+	0x3FE6E978,0xD4FDF3B6, 0x3FE50100,0x3BF6BD07,
+	0x3FE6F1A9,0xFBE76C8B, 0x3FE5072D,0xB71D81E7,
+	0x3FE6F9DB,0x22D0E560, 0x3FE50D59,0xD17988C6,
+	0x3FE7020C,0x49BA5E35, 0x3FE51384,0x8AA343E9,
+	0x3FE70A3D,0x70A3D70A, 0x3FE519AD,0xE2333CBE,
+	0x3FE7126E,0x978D4FDF, 0x3FE51FD5,0xD7C213DC,
+	0x3FE71A9F,0xBE76C8B4, 0x3FE525FC,0x6AE8810E,
+	0x3FE722D0,0xE5604189, 0x3FE52C21,0x9B3F535A,
+	0x3FE72B02,0x0C49BA5E, 0x3FE53245,0x685F7105,
+	0x3FE73333,0x33333333, 0x3FE53867,0xD1E1D79D,
+	0x3FE73B64,0x5A1CAC08, 0x3FE53E88,0xD75F9BFE,
+	0x3FE74395,0x810624DD, 0x3FE544A8,0x7871EA58,
+	0x3FE74BC6,0xA7EF9DB2, 0x3FE54AC6,0xB4B20639,
+	0x3FE753F7,0xCED91687, 0x3FE550E3,0x8BB94A8E,
+	0x3FE75C28,0xF5C28F5C, 0x3FE556FE,0xFD2129B1,
+	0x3FE7645A,0x1CAC0831, 0x3FE55D19,0x08832D68,
+	0x3FE76C8B,0x43958106, 0x3FE56331,0xAD78F6F4,
+	0x3FE774BC,0x6A7EF9DB, 0x3FE56948,0xEB9C3F0F,
+	0x3FE77CED,0x916872B0, 0x3FE56F5E,0xC286D5FA,
+	0x3FE7851E,0xB851EB85, 0x3FE57573,0x31D2A380,
+	0x3FE78D4F,0xDF3B645A, 0x3FE57B86,0x3919A6FD,
+	0x3FE79581,0x0624DD2F, 0x3FE58197,0xD7F5F765,
+	0x3FE79DB2,0x2D0E5604, 0x3FE587A8,0x0E01C34B,
+	0x3FE7A5E3,0x53F7CED9, 0x3FE58DB6,0xDAD750E8,
+	0x3FE7AE14,0x7AE147AE, 0x3FE593C4,0x3E10FE20,
+	0x3FE7B645,0xA1CAC083, 0x3FE599D0,0x3749408C,
+	0x3FE7BE76,0xC8B43958, 0x3FE59FDA,0xC61AA57B,
+	0x3FE7C6A7,0xEF9DB22D, 0x3FE5A5E3,0xEA1FD1FF,
+	0x3FE7CED9,0x16872B02, 0x3FE5ABEB,0xA2F382F0,
+	0x3FE7D70A,0x3D70A3D7, 0x3FE5B1F1,0xF0308CF4,
+	0x3FE7DF3B,0x645A1CAC, 0x3FE5B7F6,0xD171DC82,
+	0x3FE7E76C,0x8B439581, 0x3FE5BDFA,0x465275EE,
+	0x3FE7EF9D,0xB22D0E56, 0x3FE5C3FC,0x4E6D756F,
+	0x3FE7F7CE,0xD916872B, 0x3FE5C9FC,0xE95E0F20,
+	0x3FE80000,0x00000000, 0x3FE5CFFC,0x16BF8F0D,
+	0x3FE80831,0x26E978D5, 0x3FE5D5F9,0xD62D5937,
+	0x3FE81062,0x4DD2F1AA, 0x3FE5DBF6,0x2742E999,
+	0x3FE81893,0x74BC6A7F, 0x3FE5E1F1,0x099BD432,
+	0x3FE820C4,0x9BA5E354, 0x3FE5E7EA,0x7CD3C508,
+	0x3FE828F5,0xC28F5C29, 0x3FE5EDE2,0x80868033,
+	0x3FE83126,0xE978D4FE, 0x3FE5F3D9,0x144FE1DE,
+	0x3FE83958,0x10624DD3, 0x3FE5F9CE,0x37CBDE53,
+	0x3FE84189,0x374BC6A8, 0x3FE5FFC1,0xEA9681FE,
+	0x3FE849BA,0x5E353F7D, 0x3FE605B4,0x2C4BF175,
+	0x3FE851EB,0x851EB852, 0x3FE60BA4,0xFC88697D,
+	0x3FE85A1C,0xAC083127, 0x3FE61194,0x5AE83F14,
+	0x3FE8624D,0xD2F1A9FC, 0x3FE61782,0x4707DF72,
+	0x3FE86A7E,0xF9DB22D1, 0x3FE61D6E,0xC083D016,
+	0x3FE872B0,0x20C49BA6, 0x3FE62359,0xC6F8AEC8,
+	0x3FE87AE1,0x47AE147B, 0x3FE62943,0x5A0331A0,
+	0x3FE88312,0x6E978D50, 0x3FE62F2B,0x7940270E,
+	0x3FE88B43,0x95810625, 0x3FE63512,0x244C75E1,
+	0x3FE89374,0xBC6A7EFA, 0x3FE63AF7,0x5AC51D4A,
+	0x3FE89BA5,0xE353F7CF, 0x3FE640DB,0x1C4734E7,
+	0x3FE8A3D7,0x0A3D70A4, 0x3FE646BD,0x686FECC6,
+	0x3FE8AC08,0x3126E979, 0x3FE64C9E,0x3EDC8D6D,
+	0x3FE8B439,0x5810624E, 0x3FE6527D,0x9F2A77E1,
+	0x3FE8BC6A,0x7EF9DB23, 0x3FE6585B,0x88F725A9,
+	0x3FE8C49B,0xA5E353F8, 0x3FE65E37,0xFBE028DB,
+	0x3FE8CCCC,0xCCCCCCCD, 0x3FE66412,0xF7832C1B,
+	0x3FE8D4FD,0xF3B645A2, 0x3FE669EC,0x7B7DF2A9,
+	0x3FE8DD2F,0x1A9FBE77, 0x3FE66FC4,0x876E5860,
+	0x3FE8E560,0x4189374C, 0x3FE6759B,0x1AF251C0,
+	0x3FE8ED91,0x6872B021, 0x3FE67B70,0x35A7EBF8,
+	0x3FE8F5C2,0x8F5C28F6, 0x3FE68143,0xD72D4CE4,
+	0x3FE8FDF3,0xB645A1CB, 0x3FE68715,0xFF20B31C,
+	0x3FE90624,0xDD2F1AA0, 0x3FE68CE6,0xAD2075F5,
+	0x3FE90E56,0x04189375, 0x3FE692B5,0xE0CB0587,
+	0x3FE91687,0x2B020C4A, 0x3FE69883,0x99BEEABA,
+	0x3FE91EB8,0x51EB851F, 0x3FE69E4F,0xD79AC743,
+	0x3FE926E9,0x78D4FDF4, 0x3FE6A41A,0x99FD55B2,
+	0x3FE92F1A,0x9FBE76C9, 0x3FE6A9E3,0xE0856975,
+	0x3FE9374B,0xC6A7EF9E, 0x3FE6AFAB,0xAAD1EEDF,
+	0x3FE93F7C,0xED916873, 0x3FE6B571,0xF881EB2C,
+	0x3FE947AE,0x147AE148, 0x3FE6BB36,0xC9347C8E,
+	0x3FE94FDF,0x3B645A1D, 0x3FE6C0FA,0x1C88DA2B,
+	0x3FE95810,0x624DD2F2, 0x3FE6C6BB,0xF21E5429,
+	0x3FE96041,0x89374BC7, 0x3FE6CC7C,0x499453B2,
+	0x3FE96872,0xB020C49C, 0x3FE6D23B,0x228A5AFC,
+	0x3FE970A3,0xD70A3D71, 0x3FE6D7F8,0x7CA0054E,
+	0x3FE978D4,0xFDF3B646, 0x3FE6DDB4,0x57750704,
+	0x3FE98106,0x24DD2F1B, 0x3FE6E36E,0xB2A92D9D,
+	0x3FE98937,0x4BC6A7F0, 0x3FE6E927,0x8DDC5FB7,
+	0x3FE99168,0x72B020C5, 0x3FE6EEDE,0xE8AE9D1E,
+	0x3FE99999,0x9999999A, 0x3FE6F494,0xC2BFFECD,
+	0x3FE9A1CA,0xC083126F, 0x3FE6FA49,0x1BB0B6F7,
+	0x3FE9A9FB,0xE76C8B44, 0x3FE6FFFB,0xF321110D,
+	0x3FE9B22D,0x0E560419, 0x3FE705AD,0x48B171C2,
+	0x3FE9BA5E,0x353F7CEE, 0x3FE70B5D,0x1C025713,
+	0x3FE9C28F,0x5C28F5C3, 0x3FE7110B,0x6CB4584E,
+	0x3FE9CAC0,0x83126E98, 0x3FE716B8,0x3A682619,
+	0x3FE9D2F1,0xA9FBE76D, 0x3FE71C63,0x84BE8A72,
+	0x3FE9DB22,0xD0E56042, 0x3FE7220D,0x4B5868C0,
+	0x3FE9E353,0xF7CED917, 0x3FE727B5,0x8DD6BDCD,
+	0x3FE9EB85,0x1EB851EC, 0x3FE72D5C,0x4BDA9FD7,
+	0x3FE9F3B6,0x45A1CAC1, 0x3FE73301,0x85053E8F,
+	0x3FE9FBE7,0x6C8B4396, 0x3FE738A5,0x38F7E324,
+	0x3FEA0418,0x9374BC6A, 0x3FE73E47,0x6753F043,
+	0x3FEA0C49,0xBA5E353F, 0x3FE743E8,0x0FBAE227,
+	0x3FEA147A,0xE147AE14, 0x3FE74987,0x31CE4E95,
+	0x3FEA1CAC,0x083126E9, 0x3FE74F24,0xCD2FE4E8,
+	0x3FEA24DD,0x2F1A9FBE, 0x3FE754C0,0xE1816E16,
+	0x3FEA2D0E,0x56041893, 0x3FE75A5B,0x6E64CCB4,
+	0x3FEA353F,0x7CED9168, 0x3FE75FF4,0x737BFD01,
+	0x3FEA3D70,0xA3D70A3D, 0x3FE7658B,0xF06914E8,
+	0x3FEA45A1,0xCAC08312, 0x3FE76B21,0xE4CE4408,
+	0x3FEA4DD2,0xF1A9FBE7, 0x3FE770B6,0x504DD3B7,
+	0x3FEA5604,0x189374BC, 0x3FE77649,0x328A270E,
+	0x3FEA5E35,0x3F7CED91, 0x3FE77BDA,0x8B25BAEB,
+	0x3FEA6666,0x66666666, 0x3FE7816A,0x59C325F7,
+	0x3FEA6E97,0x8D4FDF3B, 0x3FE786F8,0x9E0518AD,
+	0x3FEA76C8,0xB4395810, 0x3FE78C85,0x578E5D61,
+	0x3FEA7EF9,0xDB22D0E5, 0x3FE79210,0x8601D846,
+	0x3FEA872B,0x020C49BA, 0x3FE7979A,0x29028772,
+	0x3FEA8F5C,0x28F5C28F, 0x3FE79D22,0x403382E6,
+	0x3FEA978D,0x4FDF3B64, 0x3FE7A2A8,0xCB37FC95,
+	0x3FEA9FBE,0x76C8B439, 0x3FE7A82D,0xC9B34065,
+	0x3FEAA7EF,0x9DB22D0E, 0x3FE7ADB1,0x3B48B43E,
+	0x3FEAB020,0xC49BA5E3, 0x3FE7B333,0x1F9BD806,
+	0x3FEAB851,0xEB851EB8, 0x3FE7B8B3,0x765045AE,
+	0x3FEAC083,0x126E978D, 0x3FE7BE32,0x3F09B137,
+	0x3FEAC8B4,0x39581062, 0x3FE7C3AF,0x796BE8B5,
+	0x3FEAD0E5,0x60418937, 0x3FE7C92B,0x251AD459,
+	0x3FEAD916,0x872B020C, 0x3FE7CEA5,0x41BA7673,
+	0x3FEAE147,0xAE147AE1, 0x3FE7D41D,0xCEEEEB7B,
+	0x3FEAE978,0xD4FDF3B6, 0x3FE7D994,0xCC5C6A17,
+	0x3FEAF1A9,0xFBE76C8B, 0x3FE7DF0A,0x39A7431F,
+	0x3FEAF9DB,0x22D0E560, 0x3FE7E47E,0x1673E1A5,
+	0x3FEB020C,0x49BA5E35, 0x3FE7E9F0,0x6266CAF9,
+	0x3FEB0A3D,0x70A3D70A, 0x3FE7EF61,0x1D249EB1,
+	0x3FEB126E,0x978D4FDF, 0x3FE7F4D0,0x465216AF,
+	0x3FEB1A9F,0xBE76C8B4, 0x3FE7FA3D,0xDD940724,
+	0x3FEB22D0,0xE5604189, 0x3FE7FFA9,0xE28F5E99,
+	0x3FEB2B02,0x0C49BA5E, 0x3FE80514,0x54E925F6,
+	0x3FEB3333,0x33333333, 0x3FE80A7D,0x34468083,
+	0x3FEB3B64,0x5A1CAC08, 0x3FE80FE4,0x804CABF2,
+	0x3FEB4395,0x810624DD, 0x3FE8154A,0x38A10066,
+	0x3FEB4BC6,0xA7EF9DB2, 0x3FE81AAE,0x5CE8F073,
+	0x3FEB53F7,0xCED91687, 0x3FE82010,0xECCA092C,
+	0x3FEB5C28,0xF5C28F5C, 0x3FE82571,0xE7E9F221,
+	0x3FEB645A,0x1CAC0831, 0x3FE82AD1,0x4DEE6D6B,
+	0x3FEB6C8B,0x43958106, 0x3FE8302F,0x1E7D57AE,
+	0x3FEB74BC,0x6A7EF9DB, 0x3FE8358B,0x593CA823,
+	0x3FEB7CED,0x916872B0, 0x3FE83AE5,0xFDD27099,
+	0x3FEB851E,0xB851EB85, 0x3FE8403F,0x0BE4DD7E,
+	0x3FEB8D4F,0xDF3B645A, 0x3FE84596,0x831A35E4,
+	0x3FEB9581,0x0624DD2F, 0x3FE84AEC,0x6318DB87,
+	0x3FEB9DB2,0x2D0E5604, 0x3FE85040,0xAB874AD4,
+	0x3FEBA5E3,0x53F7CED9, 0x3FE85593,0x5C0C1AEC,
+	0x3FEBAE14,0x7AE147AE, 0x3FE85AE4,0x744DFDAD,
+	0x3FEBB645,0xA1CAC083, 0x3FE86033,0xF3F3BFB6,
+	0x3FEBBE76,0xC8B43958, 0x3FE86581,0xDAA4486D,
+	0x3FEBC6A7,0xEF9DB22D, 0x3FE86ACE,0x28069A06,
+	0x3FEBCED9,0x16872B02, 0x3FE87018,0xDBC1D187,
+	0x3FEBD70A,0x3D70A3D7, 0x3FE87561,0xF57D26D0,
+	0x3FEBDF3B,0x645A1CAC, 0x3FE87AA9,0x74DFEC9F,
+	0x3FEBE76C,0x8B439581, 0x3FE87FEF,0x59919096,
+	0x3FEBEF9D,0xB22D0E56, 0x3FE88533,0xA3399B42,
+	0x3FEBF7CE,0xD916872B, 0x3FE88A76,0x517FB01F,
+	0x3FEC0000,0x00000000, 0x3FE88FB7,0x640B8DA2,
+	0x3FEC0831,0x26E978D5, 0x3FE894F6,0xDA850D37,
+	0x3FEC1062,0x4DD2F1AA, 0x3FE89A34,0xB494234E,
+	0x3FEC1893,0x74BC6A7F, 0x3FE89F70,0xF1E0DF5F,
+	0x3FEC20C4,0x9BA5E354, 0x3FE8A4AB,0x92136BEE,
+	0x3FEC28F5,0xC28F5C29, 0x3FE8A9E4,0x94D40E90,
+	0x3FEC3126,0xE978D4FE, 0x3FE8AF1B,0xF9CB27F5,
+	0x3FEC3958,0x10624DD3, 0x3FE8B451,0xC0A133EA,
+	0x3FEC4189,0x374BC6A8, 0x3FE8B985,0xE8FEC961,
+	0x3FEC49BA,0x5E353F7D, 0x3FE8BEB8,0x728C9A73,
+	0x3FEC51EB,0x851EB852, 0x3FE8C3E9,0x5CF3746C,
+	0x3FEC5A1C,0xAC083127, 0x3FE8C918,0xA7DC3FCB,
+	0x3FEC624D,0xD2F1A9FC, 0x3FE8CE46,0x52F00049,
+	0x3FEC6A7E,0xF9DB22D1, 0x3FE8D372,0x5DD7D4E1,
+	0x3FEC72B0,0x20C49BA6, 0x3FE8D89C,0xC83CF7D5,
+	0x3FEC7AE1,0x47AE147B, 0x3FE8DDC5,0x91C8BEB0,
+	0x3FEC8312,0x6E978D50, 0x3FE8E2EC,0xBA249A52,
+	0x3FEC8B43,0x95810625, 0x3FE8E812,0x40FA16EF,
+	0x3FEC9374,0xBC6A7EFA, 0x3FE8ED36,0x25F2DC1A,
+	0x3FEC9BA5,0xE353F7CF, 0x3FE8F258,0x68B8ACC8,
+	0x3FECA3D7,0x0A3D70A4, 0x3FE8F779,0x08F56756,
+	0x3FECAC08,0x3126E979, 0x3FE8FC98,0x0653058F,
+	0x3FECB439,0x5810624E, 0x3FE901B5,0x607B9CB2,
+	0x3FECBC6A,0x7EF9DB23, 0x3FE906D1,0x17195D76,
+	0x3FECC49B,0xA5E353F8, 0x3FE90BEB,0x29D69412,
+	0x3FECCCCC,0xCCCCCCCD, 0x3FE91103,0x985DA841,
+	0x3FECD4FD,0xF3B645A2, 0x3FE9161A,0x62591D47,
+	0x3FECDD2F,0x1A9FBE77, 0x3FE91B2F,0x877391F9,
+	0x3FECE560,0x4189374C, 0x3FE92043,0x0757C0C0,
+	0x3FECED91,0x6872B021, 0x3FE92554,0xE1B07FA0,
+	0x3FECF5C2,0x8F5C28F6, 0x3FE92A65,0x1628C03F,
+	0x3FECFDF3,0xB645A1CB, 0x3FE92F73,0xA46B8FE6,
+	0x3FED0624,0xDD2F1AA0, 0x3FE93480,0x8C24178C,
+	0x3FED0E56,0x04189375, 0x3FE9398B,0xCCFD9BD8,
+	0x3FED1687,0x2B020C4A, 0x3FE93E95,0x66A37D27,
+	0x3FED1EB8,0x51EB851F, 0x3FE9439D,0x58C13794,
+	0x3FED26E9,0x78D4FDF4, 0x3FE948A3,0xA30262F9,
+	0x3FED2F1A,0x9FBE76C9, 0x3FE94DA8,0x4512B2FA,
+	0x3FED374B,0xC6A7EF9E, 0x3FE952AB,0x3E9DF706,
+	0x3FED3F7C,0xED916873, 0x3FE957AC,0x8F501A5F,
+	0x3FED47AE,0x147AE148, 0x3FE95CAC,0x36D5241F,
+	0x3FED4FDF,0x3B645A1D, 0x3FE961AA,0x34D9373B,
+	0x3FED5810,0x624DD2F2, 0x3FE966A6,0x8908928E,
+	0x3FED6041,0x89374BC7, 0x3FE96BA1,0x330F90D9,
+	0x3FED6872,0xB020C49C, 0x3FE9709A,0x329AA8CC,
+	0x3FED70A3,0xD70A3D71, 0x3FE97591,0x87566D0A,
+	0x3FED78D4,0xFDF3B646, 0x3FE97A87,0x30EF8C2E,
+	0x3FED8106,0x24DD2F1B, 0x3FE97F7B,0x2F12D0D2,
+	0x3FED8937,0x4BC6A7F0, 0x3FE9846D,0x816D2193,
+	0x3FED9168,0x72B020C5, 0x3FE9895E,0x27AB8116,
+	0x3FED9999,0x9999999A, 0x3FE98E4D,0x217B0E12,
+	0x3FEDA1CA,0xC083126F, 0x3FE9933A,0x6E89034D,
+	0x3FEDA9FB,0xE76C8B44, 0x3FE99826,0x0E82B7AB,
+	0x3FEDB22D,0x0E560419, 0x3FE99D10,0x01159E2C,
+	0x3FEDBA5E,0x353F7CEE, 0x3FE9A1F8,0x45EF45F5,
+	0x3FEDC28F,0x5C28F5C3, 0x3FE9A6DE,0xDCBD5A54,
+	0x3FEDCAC0,0x83126E98, 0x3FE9ABC3,0xC52DA2C6,
+	0x3FEDD2F1,0xA9FBE76D, 0x3FE9B0A6,0xFEEE02FE,
+	0x3FEDDB22,0xD0E56042, 0x3FE9B588,0x89AC7AE7,
+	0x3FEDE353,0xF7CED917, 0x3FE9BA68,0x651726AB,
+	0x3FEDEB85,0x1EB851EC, 0x3FE9BF46,0x90DC3EB9,
+	0x3FEDF3B6,0x45A1CAC1, 0x3FE9C423,0x0CAA17CA,
+	0x3FEDFBE7,0x6C8B4396, 0x3FE9C8FD,0xD82F22E7,
+	0x3FEE0418,0x9374BC6A, 0x3FE9CDD6,0xF319ED6B,
+	0x3FEE0C49,0xBA5E353F, 0x3FE9D2AE,0x5D19210E,
+	0x3FEE147A,0xE147AE14, 0x3FE9D784,0x15DB83E4,
+	0x3FEE1CAC,0x083126E9, 0x3FE9DC58,0x1D0FF869,
+	0x3FEE24DD,0x2F1A9FBE, 0x3FE9E12A,0x72657D80,
+	0x3FEE2D0E,0x56041893, 0x3FE9E5FB,0x158B2E7B,
+	0x3FEE353F,0x7CED9168, 0x3FE9EACA,0x06304324,
+	0x3FEE3D70,0xA3D70A3D, 0x3FE9EF97,0x44040FBA,
+	0x3FEE45A1,0xCAC08312, 0x3FE9F462,0xCEB604FF,
+	0x3FEE4DD2,0xF1A9FBE7, 0x3FE9F92C,0xA5F5B037,
+	0x3FEE5604,0x189374BC, 0x3FE9FDF4,0xC972BB30,
+	0x3FEE5E35,0x3F7CED91, 0x3FEA02BB,0x38DCEC48,
+	0x3FEE6666,0x66666666, 0x3FEA077F,0xF3E4266F,
+	0x3FEE6E97,0x8D4FDF3B, 0x3FEA0C42,0xFA386930,
+	0x3FEE76C8,0xB4395810, 0x3FEA1104,0x4B89D0B4,
+	0x3FEE7EF9,0xDB22D0E5, 0x3FEA15C3,0xE78895C8,
+	0x3FEE872B,0x020C49BA, 0x3FEA1A81,0xCDE50DE2,
+	0x3FEE8F5C,0x28F5C28F, 0x3FEA1F3D,0xFE4FAB27,
+	0x3FEE978D,0x4FDF3B64, 0x3FEA23F8,0x7878FC6E,
+	0x3FEE9FBE,0x76C8B439, 0x3FEA28B1,0x3C11AD47,
+	0x3FEEA7EF,0x9DB22D0E, 0x3FEA2D68,0x48CA8602,
+	0x3FEEB020,0xC49BA5E3, 0x3FEA321D,0x9E546BAF,
+	0x3FEEB851,0xEB851EB8, 0x3FEA36D1,0x3C606028,
+	0x3FEEC083,0x126E978D, 0x3FEA3B83,0x229F8214,
+	0x3FEEC8B4,0x39581062, 0x3FEA4033,0x50C30CEE,
+	0x3FEED0E5,0x60418937, 0x3FEA44E1,0xC67C5907,
+	0x3FEED916,0x872B020C, 0x3FEA498E,0x837CDB8C,
+	0x3FEEE147,0xAE147AE1, 0x3FEA4E39,0x87762690,
+	0x3FEEE978,0xD4FDF3B6, 0x3FEA52E2,0xD219E90A,
+	0x3FEEF1A9,0xFBE76C8B, 0x3FEA578A,0x6319EEDD,
+	0x3FEEF9DB,0x22D0E560, 0x3FEA5C30,0x3A2820E1,
+	0x3FEF020C,0x49BA5E35, 0x3FEA60D4,0x56F684E0,
+	0x3FEF0A3D,0x70A3D70A, 0x3FEA6576,0xB9373DA3,
+	0x3FEF126E,0x978D4FDF, 0x3FEA6A17,0x609C8AF3,
+	0x3FEF1A9F,0xBE76C8B4, 0x3FEA6EB6,0x4CD8C99E,
+	0x3FEF22D0,0xE5604189, 0x3FEA7353,0x7D9E737E,
+	0x3FEF2B02,0x0C49BA5E, 0x3FEA77EE,0xF2A01F7E,
+	0x3FEF3333,0x33333333, 0x3FEA7C88,0xAB90819B,
+	0x3FEF3B64,0x5A1CAC08, 0x3FEA8120,0xA8226AEF,
+	0x3FEF4395,0x810624DD, 0x3FEA85B6,0xE808C9B3,
+	0x3FEF4BC6,0xA7EF9DB2, 0x3FEA8A4B,0x6AF6A943,
+	0x3FEF53F7,0xCED91687, 0x3FEA8EDE,0x309F3225,
+	0x3FEF5C28,0xF5C28F5C, 0x3FEA936F,0x38B5AA0E,
+	0x3FEF645A,0x1CAC0831, 0x3FEA97FE,0x82ED73E6,
+	0x3FEF6C8B,0x43958106, 0x3FEA9C8C,0x0EFA0FCD,
+	0x3FEF74BC,0x6A7EF9DB, 0x3FEAA117,0xDC8F1B21,
+	0x3FEF7CED,0x916872B0, 0x3FEAA5A1,0xEB605083,
+	0x3FEF851E,0xB851EB85, 0x3FEAAA2A,0x3B2187DA,
+	0x3FEF8D4F,0xDF3B645A, 0x3FEAAEB0,0xCB86B65A,
+	0x3FEF9581,0x0624DD2F, 0x3FEAB335,0x9C43EE8A,
+	0x3FEF9DB2,0x2D0E5604, 0x3FEAB7B8,0xAD0D6045,
+	0x3FEFA5E3,0x53F7CED9, 0x3FEABC39,0xFD9758C4,
+	0x3FEFAE14,0x7AE147AE, 0x3FEAC0B9,0x8D96429D,
+	0x3FEFB645,0xA1CAC083, 0x3FEAC537,0x5CBEA5CE,
+	0x3FEFBE76,0xC8B43958, 0x3FEAC9B3,0x6AC527BF,
+	0x3FEFC6A7,0xEF9DB22D, 0x3FEACE2D,0xB75E8B46,
+	0x3FEFCED9,0x16872B02, 0x3FEAD2A6,0x423FB0AF,
+	0x3FEFD70A,0x3D70A3D7, 0x3FEAD71D,0x0B1D95BC,
+	0x3FEFDF3B,0x645A1CAC, 0x3FEADB92,0x11AD55AF,
+	0x3FEFE76C,0x8B439581, 0x3FEAE005,0x55A4294E,
+	0x3FEFEF9D,0xB22D0E56, 0x3FEAE476,0xD6B766E4,
+	0x3FEFF7CE,0xD916872B, 0x3FEAE8E6,0x949C824C,
+	0x3FF00000,0x00000000, 0x3FEAED54,0x8F090CEE,
+	0x3FF00418,0x9374BC6A, 0x3FEAF1C0,0xC5B2B5CC,
+	0x3FF00831,0x26E978D5, 0x3FEAF62B,0x384F4984,
+	0x3FF00C49,0xBA5E353F, 0x3FEAFA93,0xE694B251,
+	0x3FF01062,0x4DD2F1AA, 0x3FEAFEFA,0xD038F814,
+	0x3FF0147A,0xE147AE14, 0x3FEB035F,0xF4F24059,
+	0x3FF01893,0x74BC6A7F, 0x3FEB07C3,0x5476CE5C,
+	0x3FF01CAC,0x083126E9, 0x3FEB0C24,0xEE7D0306,
+	0x3FF020C4,0x9BA5E354, 0x3FEB1084,0xC2BB5D02,
+	0x3FF024DD,0x2F1A9FBE, 0x3FEB14E2,0xD0E878B0,
+	0x3FF028F5,0xC28F5C29, 0x3FEB193F,0x18BB1036,
+	0x3FF02D0E,0x56041893, 0x3FEB1D99,0x99E9FB7F,
+	0x3FF03126,0xE978D4FE, 0x3FEB21F2,0x542C3045,
+	0x3FF0353F,0x7CED9168, 0x3FEB2649,0x4738C20D,
+	0x3FF03958,0x10624DD3, 0x3FEB2A9E,0x72C6E236,
+	0x3FF03D70,0xA3D70A3D, 0x3FEB2EF1,0xD68DDFF6,
+	0x3FF04189,0x374BC6A8, 0x3FEB3343,0x72452863,
+	0x3FF045A1,0xCAC08312, 0x3FEB3793,0x45A44675,
+	0x3FF049BA,0x5E353F7D, 0x3FEB3BE1,0x5062E30F,
+	0x3FF04DD2,0xF1A9FBE7, 0x3FEB402D,0x9238C4FE,
+	0x3FF051EB,0x851EB852, 0x3FEB4478,0x0ADDD103,
+	0x3FF05604,0x189374BC, 0x3FEB48C0,0xBA0A09D2,
+	0x3FF05A1C,0xAC083127, 0x3FEB4D07,0x9F75901E,
+	0x3FF05E35,0x3F7CED91, 0x3FEB514C,0xBAD8A298,
+	0x3FF0624D,0xD2F1A9FC, 0x3FEB5590,0x0BEB9DF6,
+	0x3FF06666,0x66666666, 0x3FEB59D1,0x9266FCF5,
+	0x3FF06A7E,0xF9DB22D1, 0x3FEB5E11,0x4E035864,
+	0x3FF06E97,0x8D4FDF3B, 0x3FEB624F,0x3E796721,
+	0x3FF072B0,0x20C49BA6, 0x3FEB668B,0x6381FE24,
+	0x3FF076C8,0xB4395810, 0x3FEB6AC5,0xBCD6107D,
+	0x3FF07AE1,0x47AE147B, 0x3FEB6EFE,0x4A2EAF62,
+	0x3FF07EF9,0xDB22D0E5, 0x3FEB7335,0x0B450A29,
+	0x3FF08312,0x6E978D50, 0x3FEB7769,0xFFD26E56,
+	0x3FF0872B,0x020C49BA, 0x3FEB7B9D,0x27904798,
+	0x3FF08B43,0x95810625, 0x3FEB7FCE,0x82381FD5,
+	0x3FF08F5C,0x28F5C28F, 0x3FEB83FE,0x0F839F26,
+	0x3FF09374,0xBC6A7EFA, 0x3FEB882B,0xCF2C8BE5,
+	0x3FF0978D,0x4FDF3B64, 0x3FEB8C57,0xC0ECCAA8,
+	0x3FF09BA5,0xE353F7CF, 0x3FEB9081,0xE47E5E51,
+	0x3FF09FBE,0x76C8B439, 0x3FEB94AA,0x399B6806,
+	0x3FF0A3D7,0x0A3D70A4, 0x3FEB98D0,0xBFFE273F,
+	0x3FF0A7EF,0x9DB22D0E, 0x3FEB9CF5,0x7760F9C6,
+	0x3FF0AC08,0x3126E979, 0x3FEBA118,0x5F7E5BBE,
+	0x3FF0B020,0xC49BA5E3, 0x3FEBA539,0x7810E7A5,
+	0x3FF0B439,0x5810624E, 0x3FEBA958,0xC0D3565D,
+	0x3FF0B851,0xEB851EB8, 0x3FEBAD76,0x39807F27,
+	0x3FF0BC6A,0x7EF9DB23, 0x3FEBB191,0xE1D357B6,
+	0x3FF0C083,0x126E978D, 0x3FEBB5AB,0xB986F426,
+	0x3FF0C49B,0xA5E353F8, 0x3FEBB9C3,0xC0568708,
+	0x3FF0C8B4,0x39581062, 0x3FEBBDD9,0xF5FD6165,
+	0x3FF0CCCC,0xCCCCCCCD, 0x3FEBC1EE,0x5A36F2C1,
+	0x3FF0D0E5,0x60418937, 0x3FEBC600,0xECBEC920,
+	0x3FF0D4FD,0xF3B645A2, 0x3FEBCA11,0xAD50910E,
+	0x3FF0D916,0x872B020C, 0x3FEBCE20,0x9BA8159C,
+	0x3FF0DD2F,0x1A9FBE77, 0x3FEBD22D,0xB781406F,
+	0x3FF0E147,0xAE147AE1, 0x3FEBD639,0x009819B8,
+	0x3FF0E560,0x4189374C, 0x3FEBDA42,0x76A8C845,
+	0x3FF0E978,0xD4FDF3B6, 0x3FEBDE4A,0x196F9179,
+	0x3FF0ED91,0x6872B021, 0x3FEBE24F,0xE8A8D95D,
+	0x3FF0F1A9,0xFBE76C8B, 0x3FEBE653,0xE411229A,
+	0x3FF0F5C2,0x8F5C28F6, 0x3FEBEA56,0x0B650E83,
+	0x3FF0F9DB,0x22D0E560, 0x3FEBEE56,0x5E615D18,
+	0x3FF0FDF3,0xB645A1CB, 0x3FEBF254,0xDCC2ED0C,
+	0x3FF1020C,0x49BA5E35, 0x3FEBF651,0x8646BBC4,
+	0x3FF10624,0xDD2F1AA0, 0x3FEBFA4C,0x5AA9E564,
+	0x3FF10A3D,0x70A3D70A, 0x3FEBFE45,0x59A9A4CB,
+	0x3FF10E56,0x04189375, 0x3FEC023C,0x8303539E,
+	0x3FF1126E,0x978D4FDF, 0x3FEC0631,0xD6746A45,
+	0x3FF11687,0x2B020C4A, 0x3FEC0A25,0x53BA7FFA,
+	0x3FF11A9F,0xBE76C8B4, 0x3FEC0E16,0xFA934AC1,
+	0x3FF11EB8,0x51EB851F, 0x3FEC1206,0xCABC9F77,
+	0x3FF122D0,0xE5604189, 0x3FEC15F4,0xC3F471CE,
+	0x3FF126E9,0x78D4FDF4, 0x3FEC19E0,0xE5F8D459,
+	0x3FF12B02,0x0C49BA5E, 0x3FEC1DCB,0x3087F889,
+	0x3FF12F1A,0x9FBE76C9, 0x3FEC21B3,0xA3602EB7,
+	0x3FF13333,0x33333333, 0x3FEC259A,0x3E3FE625,
+	0x3FF1374B,0xC6A7EF9E, 0x3FEC297F,0x00E5AD04,
+	0x3FF13B64,0x5A1CAC08, 0x3FEC2D61,0xEB103077,
+	0x3FF13F7C,0xED916873, 0x3FEC3142,0xFC7E3C99,
+	0x3FF14395,0x810624DD, 0x3FEC3522,0x34EEBC7D,
+	0x3FF147AE,0x147AE148, 0x3FEC38FF,0x9420BA3B,
+	0x3FF14BC6,0xA7EF9DB2, 0x3FEC3CDB,0x19D35EE9,
+	0x3FF14FDF,0x3B645A1D, 0x3FEC40B4,0xC5C5F2AA,
+	0x3FF153F7,0xCED91687, 0x3FEC448C,0x97B7DCA8,
+	0x3FF15810,0x624DD2F2, 0x3FEC4862,0x8F68A322,
+	0x3FF15C28,0xF5C28F5C, 0x3FEC4C36,0xAC97EB6A,
+	0x3FF16041,0x89374BC7, 0x3FEC5008,0xEF0579EA,
+	0x3FF1645A,0x1CAC0831, 0x3FEC53D9,0x5671322A,
+	0x3FF16872,0xB020C49C, 0x3FEC57A7,0xE29B16D4,
+	0x3FF16C8B,0x43958106, 0x3FEC5B74,0x934349B5,
+	0x3FF170A3,0xD70A3D71, 0x3FEC5F3F,0x682A0BC7,
+	0x3FF174BC,0x6A7EF9DB, 0x3FEC6308,0x610FBD2F,
+	0x3FF178D4,0xFDF3B646, 0x3FEC66CF,0x7DB4DD46,
+	0x3FF17CED,0x916872B0, 0x3FEC6A94,0xBDDA0A99,
+	0x3FF18106,0x24DD2F1B, 0x3FEC6E58,0x214002F3,
+	0x3FF1851E,0xB851EB85, 0x3FEC7219,0xA7A7A359,
+	0x3FF18937,0x4BC6A7F0, 0x3FEC75D9,0x50D1E817,
+	0x3FF18D4F,0xDF3B645A, 0x3FEC7997,0x1C7FECBB,
+	0x3FF19168,0x72B020C5, 0x3FEC7D53,0x0A72EC23,
+	0x3FF19581,0x0624DD2F, 0x3FEC810D,0x1A6C4078,
+	0x3FF19999,0x9999999A, 0x3FEC84C5,0x4C2D6338,
+	0x3FF19DB2,0x2D0E5604, 0x3FEC887B,0x9F77ED36,
+	0x3FF1A1CA,0xC083126F, 0x3FEC8C30,0x140D96A6,
+	0x3FF1A5E3,0x53F7CED9, 0x3FEC8FE2,0xA9B03713,
+	0x3FF1A9FB,0xE76C8B44, 0x3FEC9393,0x6021C573,
+	0x3FF1AE14,0x7AE147AE, 0x3FEC9742,0x3724581E,
+	0x3FF1B22D,0x0E560419, 0x3FEC9AEF,0x2E7A24DC,
+	0x3FF1B645,0xA1CAC083, 0x3FEC9E9A,0x45E580E1,
+	0x3FF1BA5E,0x353F7CEE, 0x3FECA243,0x7D28E0D7,
+	0x3FF1BE76,0xC8B43958, 0x3FECA5EA,0xD406D8DE,
+	0x3FF1C28F,0x5C28F5C3, 0x3FECA990,0x4A421C93,
+	0x3FF1C6A7,0xEF9DB22D, 0x3FECAD33,0xDF9D7F12,
+	0x3FF1CAC0,0x83126E98, 0x3FECB0D5,0x93DBF2FC,
+	0x3FF1CED9,0x16872B02, 0x3FECB475,0x66C08A77,
+	0x3FF1D2F1,0xA9FBE76D, 0x3FECB813,0x580E7738,
+	0x3FF1D70A,0x3D70A3D7, 0x3FECBBAF,0x67890A81,
+	0x3FF1DB22,0xD0E56042, 0x3FECBF49,0x94F3B52A,
+	0x3FF1DF3B,0x645A1CAC, 0x3FECC2E1,0xE012079F,
+	0x3FF1E353,0xF7CED917, 0x3FECC678,0x48A7B1EE,
+	0x3FF1E76C,0x8B439581, 0x3FECCA0C,0xCE7883BE,
+	0x3FF1EB85,0x1EB851EC, 0x3FECCD9F,0x71486C5E,
+	0x3FF1EF9D,0xB22D0E56, 0x3FECD130,0x30DB7AC0,
+	0x3FF1F3B6,0x45A1CAC1, 0x3FECD4BF,0x0CF5DD87,
+	0x3FF1F7CE,0xD916872B, 0x3FECD84C,0x055BE300,
+	0x3FF1FBE7,0x6C8B4396, 0x3FECDBD7,0x19D1F930,
+	0x3FF20000,0x00000000, 0x3FECDF60,0x4A1CADCE,
+	0x3FF20418,0x9374BC6A, 0x3FECE2E7,0x9600AE50,
+	0x3FF20831,0x26E978D5, 0x3FECE66C,0xFD42C7EB,
+	0x3FF20C49,0xBA5E353F, 0x3FECE9F0,0x7FA7E793,
+	0x3FF21062,0x4DD2F1AA, 0x3FECED72,0x1CF51A07,
+	0x3FF2147A,0xE147AE14, 0x3FECF0F1,0xD4EF8BCD,
+	0x3FF21893,0x74BC6A7F, 0x3FECF46F,0xA75C893D,
+	0x3FF21CAC,0x083126E9, 0x3FECF7EB,0x94017E7D,
+	0x3FF220C4,0x9BA5E354, 0x3FECFB65,0x9AA3F78C,
+	0x3FF224DD,0x2F1A9FBE, 0x3FECFEDD,0xBB09A042,
+	0x3FF228F5,0xC28F5C29, 0x3FED0253,0xF4F84456,
+	0x3FF22D0E,0x56041893, 0x3FED05C8,0x4835CF5D,
+	0x3FF23126,0xE978D4FE, 0x3FED093A,0xB4884CD6,
+	0x3FF2353F,0x7CED9168, 0x3FED0CAB,0x39B5E826,
+	0x3FF23958,0x10624DD3, 0x3FED1019,0xD784EC9F,
+	0x3FF23D70,0xA3D70A3D, 0x3FED1386,0x8DBBC585,
+	0x3FF24189,0x374BC6A8, 0x3FED16F1,0x5C20FE11,
+	0x3FF245A1,0xCAC08312, 0x3FED1A5A,0x427B4171,
+	0x3FF249BA,0x5E353F7D, 0x3FED1DC1,0x40915AD3,
+	0x3FF24DD2,0xF1A9FBE7, 0x3FED2126,0x562A3562,
+	0x3FF251EB,0x851EB852, 0x3FED2489,0x830CDC4E,
+	0x3FF25604,0x189374BC, 0x3FED27EA,0xC7007ACC,
+	0x3FF25A1C,0xAC083127, 0x3FED2B4A,0x21CC5C20,
+	0x3FF25E35,0x3F7CED91, 0x3FED2EA7,0x9337EB98,
+	0x3FF2624D,0xD2F1A9FC, 0x3FED3203,0x1B0AB499,
+	0x3FF26666,0x66666666, 0x3FED355C,0xB90C6298,
+	0x3FF26A7E,0xF9DB22D1, 0x3FED38B4,0x6D04C12C,
+	0x3FF26E97,0x8D4FDF3B, 0x3FED3C0A,0x36BBBC01,
+	0x3FF272B0,0x20C49BA6, 0x3FED3F5E,0x15F95EEA,
+	0x3FF276C8,0xB4395810, 0x3FED42B0,0x0A85D5DC,
+	0x3FF27AE1,0x47AE147B, 0x3FED4600,0x14296CF6,
+	0x3FF27EF9,0xDB22D0E5, 0x3FED494E,0x32AC9081,
+	0x3FF28312,0x6E978D50, 0x3FED4C9A,0x65D7CCF9,
+	0x3FF2872B,0x020C49BA, 0x3FED4FE4,0xAD73CF0A,
+	0x3FF28B43,0x95810625, 0x3FED532D,0x09496398,
+	0x3FF28F5C,0x28F5C28F, 0x3FED5673,0x792177C3,
+	0x3FF29374,0xBC6A7EFA, 0x3FED59B7,0xFCC518E9,
+	0x3FF2978D,0x4FDF3B64, 0x3FED5CFA,0x93FD74A7,
+	0x3FF29BA5,0xE353F7CF, 0x3FED603B,0x3E93D8E4,
+	0x3FF29FBE,0x76C8B439, 0x3FED6379,0xFC51B3CB,
+	0x3FF2A3D7,0x0A3D70A4, 0x3FED66B6,0xCD0093D9,
+	0x3FF2A7EF,0x9DB22D0E, 0x3FED69F1,0xB06A27D5,
+	0x3FF2AC08,0x3126E979, 0x3FED6D2A,0xA6583EDF,
+	0x3FF2B020,0xC49BA5E3, 0x3FED7061,0xAE94C86B,
+	0x3FF2B439,0x5810624E, 0x3FED7396,0xC8E9D44B,
+	0x3FF2B851,0xEB851EB8, 0x3FED76C9,0xF52192AC,
+	0x3FF2BC6A,0x7EF9DB23, 0x3FED79FB,0x3306541E,
+	0x3FF2C083,0x126E978D, 0x3FED7D2A,0x82628997,
+	0x3FF2C49B,0xA5E353F8, 0x3FED8057,0xE300C476,
+	0x3FF2C8B4,0x39581062, 0x3FED8383,0x54ABB684,
+	0x3FF2CCCC,0xCCCCCCCD, 0x3FED86AC,0xD72E31FF,
+	0x3FF2D0E5,0x60418937, 0x3FED89D4,0x6A532992,
+	0x3FF2D4FD,0xF3B645A2, 0x3FED8CFA,0x0DE5B064,
+	0x3FF2D916,0x872B020C, 0x3FED901D,0xC1B0FA13,
+	0x3FF2DD2F,0x1A9FBE77, 0x3FED933F,0x85805ABE,
+	0x3FF2E147,0xAE147AE1, 0x3FED965F,0x591F4701,
+	0x3FF2E560,0x4189374C, 0x3FED997D,0x3C595401,
+	0x3FF2E978,0xD4FDF3B6, 0x3FED9C99,0x2EFA3767,
+	0x3FF2ED91,0x6872B021, 0x3FED9FB3,0x30CDC76C,
+	0x3FF2F1A9,0xFBE76C8B, 0x3FEDA2CB,0x419FFAD4,
+	0x3FF2F5C2,0x8F5C28F6, 0x3FEDA5E1,0x613CE8F8,
+	0x3FF2F9DB,0x22D0E560, 0x3FEDA8F5,0x8F70C9C5,
+	0x3FF2FDF3,0xB645A1CB, 0x3FEDAC07,0xCC07F5C2,
+	0x3FF3020C,0x49BA5E35, 0x3FEDAF18,0x16CEE612,
+	0x3FF30624,0xDD2F1AA0, 0x3FEDB226,0x6F92347A,
+	0x3FF30A3D,0x70A3D70A, 0x3FEDB532,0xD61E9B5E,
+	0x3FF30E56,0x04189375, 0x3FEDB83D,0x4A40F5CF,
+	0x3FF3126E,0x978D4FDF, 0x3FEDBB45,0xCBC63F81,
+	0x3FF31687,0x2B020C4A, 0x3FEDBE4C,0x5A7B94DA,
+	0x3FF31A9F,0xBE76C8B4, 0x3FEDC150,0xF62E32EF,
+	0x3FF31EB8,0x51EB851F, 0x3FEDC453,0x9EAB778A,
+	0x3FF322D0,0xE5604189, 0x3FEDC754,0x53C0E12B,
+	0x3FF326E9,0x78D4FDF4, 0x3FEDCA53,0x153C0F0E,
+	0x3FF32B02,0x0C49BA5E, 0x3FEDCD4F,0xE2EAC12B,
+	0x3FF32F1A,0x9FBE76C9, 0x3FEDD04A,0xBC9AD83E,
+	0x3FF33333,0x33333333, 0x3FEDD343,0xA21A55C4,
+	0x3FF3374B,0xC6A7EF9E, 0x3FEDD63A,0x93375C07,
+	0x3FF33B64,0x5A1CAC08, 0x3FEDD92F,0x8FC02E15,
+	0x3FF33F7C,0xED916873, 0x3FEDDC22,0x97832FD2,
+	0x3FF34395,0x810624DD, 0x3FEDDF13,0xAA4EE5EC,
+	0x3FF347AE,0x147AE148, 0x3FEDE202,0xC7F1F5ED,
+	0x3FF34BC6,0xA7EF9DB2, 0x3FEDE4EF,0xF03B2631,
+	0x3FF34FDF,0x3B645A1D, 0x3FEDE7DB,0x22F95DF4,
+	0x3FF353F7,0xCED91687, 0x3FEDEAC4,0x5FFBA54C,
+	0x3FF35810,0x624DD2F2, 0x3FEDEDAB,0xA7112535,
+	0x3FF35C28,0xF5C28F5C, 0x3FEDF090,0xF809278C,
+	0x3FF36041,0x89374BC7, 0x3FEDF374,0x52B3171B,
+	0x3FF3645A,0x1CAC0831, 0x3FEDF655,0xB6DE7F92,
+	0x3FF36872,0xB020C49C, 0x3FEDF935,0x245B0D93,
+	0x3FF36C8B,0x43958106, 0x3FEDFC12,0x9AF88EAF,
+	0x3FF370A3,0xD70A3D71, 0x3FEDFEEE,0x1A86F16F,
+	0x3FF374BC,0x6A7EF9DB, 0x3FEE01C7,0xA2D64551,
+	0x3FF378D4,0xFDF3B646, 0x3FEE049F,0x33B6BACF,
+	0x3FF37CED,0x916872B0, 0x3FEE0774,0xCCF8A362,
+	0x3FF38106,0x24DD2F1B, 0x3FEE0A48,0x6E6C7184,
+	0x3FF3851E,0xB851EB85, 0x3FEE0D1A,0x17E2B8B3,
+	0x3FF38937,0x4BC6A7F0, 0x3FEE0FE9,0xC92C2D74,
+	0x3FF38D4F,0xDF3B645A, 0x3FEE12B7,0x8219A558,
+	0x3FF39168,0x72B020C5, 0x3FEE1583,0x427C16FD,
+	0x3FF39581,0x0624DD2F, 0x3FEE184D,0x0A249A12,
+	0x3FF39999,0x9999999A, 0x3FEE1B14,0xD8E4675B,
+	0x3FF39DB2,0x2D0E5604, 0x3FEE1DDA,0xAE8CD8AF,
+	0x3FF3A1CA,0xC083126F, 0x3FEE209E,0x8AEF6904,
+	0x3FF3A5E3,0x53F7CED9, 0x3FEE2360,0x6DDDB46B,
+	0x3FF3A9FB,0xE76C8B44, 0x3FEE2620,0x57297815,
+	0x3FF3AE14,0x7AE147AE, 0x3FEE28DE,0x46A49254,
+	0x3FF3B22D,0x0E560419, 0x3FEE2B9A,0x3C2102A6,
+	0x3FF3B645,0xA1CAC083, 0x3FEE2E54,0x3770E9AB,
+	0x3FF3BA5E,0x353F7CEE, 0x3FEE310C,0x38668935,
+	0x3FF3BE76,0xC8B43958, 0x3FEE33C2,0x3ED44442,
+	0x3FF3C28F,0x5C28F5C3, 0x3FEE3676,0x4A8C9F04,
+	0x3FF3C6A7,0xEF9DB22D, 0x3FEE3928,0x5B623EE0,
+	0x3FF3CAC0,0x83126E98, 0x3FEE3BD8,0x7127EA75,
+	0x3FF3CED9,0x16872B02, 0x3FEE3E86,0x8BB0899D,
+	0x3FF3D2F1,0xA9FBE76D, 0x3FEE4132,0xAACF256F,
+	0x3FF3D70A,0x3D70A3D7, 0x3FEE43DC,0xCE56E842,
+	0x3FF3DB22,0xD0E56042, 0x3FEE4684,0xF61B1DB6,
+	0x3FF3DF3B,0x645A1CAC, 0x3FEE492B,0x21EF32AA,
+	0x3FF3E353,0xF7CED917, 0x3FEE4BCF,0x51A6B54F,
+	0x3FF3E76C,0x8B439581, 0x3FEE4E71,0x8515551D,
+	0x3FF3EB85,0x1EB851EC, 0x3FEE5111,0xBC0EE2DD,
+	0x3FF3EF9D,0xB22D0E56, 0x3FEE53AF,0xF66750AB,
+	0x3FF3F3B6,0x45A1CAC1, 0x3FEE564C,0x33F2B1FA,
+	0x3FF3F7CE,0xD916872B, 0x3FEE58E6,0x74853B91,
+	0x3FF3FBE7,0x6C8B4396, 0x3FEE5B7E,0xB7F34397,
+	0x3FF40000,0x00000000, 0x3FEE5E14,0xFE11418C,
+	0x3FF40418,0x9374BC6A, 0x3FEE60A9,0x46B3CE56,
+	0x3FF40831,0x26E978D5, 0x3FEE633B,0x91AFA43B,
+	0x3FF40C49,0xBA5E353F, 0x3FEE65CB,0xDED99EE9,
+	0x3FF41062,0x4DD2F1AA, 0x3FEE685A,0x2E06BB78,
+	0x3FF4147A,0xE147AE14, 0x3FEE6AE6,0x7F0C186A,
+	0x3FF41893,0x74BC6A7F, 0x3FEE6D70,0xD1BEF5B2,
+	0x3FF41CAC,0x083126E9, 0x3FEE6FF9,0x25F4B4B2,
+	0x3FF420C4,0x9BA5E354, 0x3FEE727F,0x7B82D846,
+	0x3FF424DD,0x2F1A9FBE, 0x3FEE7503,0xD23F04BC,
+	0x3FF428F5,0xC28F5C29, 0x3FEE7786,0x29FEFFDE,
+	0x3FF42D0E,0x56041893, 0x3FEE7A06,0x8298B0F3,
+	0x3FF43126,0xE978D4FE, 0x3FEE7C84,0xDBE220C3,
+	0x3FF4353F,0x7CED9168, 0x3FEE7F01,0x35B17996,
+	0x3FF43958,0x10624DD3, 0x3FEE817B,0x8FDD073B,
+	0x3FF43D70,0xA3D70A3D, 0x3FEE83F3,0xEA3B3706,
+	0x3FF44189,0x374BC6A8, 0x3FEE866A,0x44A297DB,
+	0x3FF445A1,0xCAC08312, 0x3FEE88DE,0x9EE9DA26,
+	0x3FF449BA,0x5E353F7D, 0x3FEE8B50,0xF8E7CFE6,
+	0x3FF44DD2,0xF1A9FBE7, 0x3FEE8DC1,0x52736CAA,
+	0x3FF451EB,0x851EB852, 0x3FEE902F,0xAB63C59C,
+	0x3FF45604,0x189374BC, 0x3FEE929C,0x03901177,
+	0x3FF45A1C,0xAC083127, 0x3FEE9506,0x5ACFA896,
+	0x3FF45E35,0x3F7CED91, 0x3FEE976E,0xB0FA04EE,
+	0x3FF4624D,0xD2F1A9FC, 0x3FEE99D5,0x05E6C218,
+	0x3FF46666,0x66666666, 0x3FEE9C39,0x596D9D4C,
+	0x3FF46A7E,0xF9DB22D1, 0x3FEE9E9B,0xAB66756A,
+	0x3FF46E97,0x8D4FDF3B, 0x3FEEA0FB,0xFBA94AF7,
+	0x3FF472B0,0x20C49BA6, 0x3FEEA35A,0x4A0E4027,
+	0x3FF476C8,0xB4395810, 0x3FEEA5B6,0x966D98D6,
+	0x3FF47AE1,0x47AE147B, 0x3FEEA810,0xE09FBA95,
+	0x3FF47EF9,0xDB22D0E5, 0x3FEEAA69,0x287D2CA4,
+	0x3FF48312,0x6E978D50, 0x3FEEACBF,0x6DDE97FA,
+	0x3FF4872B,0x020C49BA, 0x3FEEAF13,0xB09CC744,
+	0x3FF48B43,0x95810625, 0x3FEEB165,0xF090A6EA,
+	0x3FF48F5C,0x28F5C28F, 0x3FEEB3B6,0x2D934510,
+	0x3FF49374,0xBC6A7EFA, 0x3FEEB604,0x677DD19C,
+	0x3FF4978D,0x4FDF3B64, 0x3FEEB850,0x9E299E32,
+	0x3FF49BA5,0xE353F7CF, 0x3FEEBA9A,0xD1701E3D,
+	0x3FF49FBE,0x76C8B439, 0x3FEEBCE3,0x012AE6ED,
+	0x3FF4A3D7,0x0A3D70A4, 0x3FEEBF29,0x2D33AF3F,
+	0x3FF4A7EF,0x9DB22D0E, 0x3FEEC16D,0x55644FF7,
+	0x3FF4AC08,0x3126E979, 0x3FEEC3AF,0x7996C3AB,
+	0x3FF4B020,0xC49BA5E3, 0x3FEEC5EF,0x99A526C1,
+	0x3FF4B439,0x5810624E, 0x3FEEC82D,0xB569B772,
+	0x3FF4B851,0xEB851EB8, 0x3FEECA69,0xCCBED5CC,
+	0x3FF4BC6A,0x7EF9DB23, 0x3FEECCA3,0xDF7F03B9,
+	0x3FF4C083,0x126E978D, 0x3FEECEDB,0xED84E4F9,
+	0x3FF4C49B,0xA5E353F8, 0x3FEED111,0xF6AB3F2C,
+	0x3FF4C8B4,0x39581062, 0x3FEED345,0xFACCF9D1,
+	0x3FF4CCCC,0xCCCCCCCD, 0x3FEED577,0xF9C51E4B,
+	0x3FF4D0E5,0x60418937, 0x3FEED7A7,0xF36ED7DE,
+	0x3FF4D4FD,0xF3B645A2, 0x3FEED9D5,0xE7A573B8,
+	0x3FF4D916,0x872B020C, 0x3FEEDC01,0xD64460EE,
+	0x3FF4DD2F,0x1A9FBE77, 0x3FEEDE2B,0xBF273083,
+	0x3FF4E147,0xAE147AE1, 0x3FEEE053,0xA2299567,
+	0x3FF4E560,0x4189374C, 0x3FEEE279,0x7F27647A,
+	0x3FF4E978,0xD4FDF3B6, 0x3FEEE49D,0x55FC9490,
+	0x3FF4ED91,0x6872B021, 0x3FEEE6BF,0x26853E71,
+	0x3FF4F1A9,0xFBE76C8B, 0x3FEEE8DE,0xF09D9CDF,
+	0x3FF4F5C2,0x8F5C28F6, 0x3FEEEAFC,0xB4220C93,
+	0x3FF4F9DB,0x22D0E560, 0x3FEEED18,0x70EF0C45,
+	0x3FF4FDF3,0xB645A1CB, 0x3FEEEF32,0x26E13CA9,
+	0x3FF5020C,0x49BA5E35, 0x3FEEF149,0xD5D56075,
+	0x3FF50624,0xDD2F1AA0, 0x3FEEF35F,0x7DA85C63,
+	0x3FF50A3D,0x70A3D70A, 0x3FEEF573,0x1E373732,
+	0x3FF50E56,0x04189375, 0x3FEEF784,0xB75F19AA,
+	0x3FF5126E,0x978D4FDF, 0x3FEEF994,0x48FD4E9A,
+	0x3FF51687,0x2B020C4A, 0x3FEEFBA1,0xD2EF42E0,
+	0x3FF51A9F,0xBE76C8B4, 0x3FEEFDAD,0x55128569,
+	0x3FF51EB8,0x51EB851F, 0x3FEEFFB6,0xCF44C730,
+	0x3FF522D0,0xE5604189, 0x3FEF01BE,0x4163DB47,
+	0x3FF526E9,0x78D4FDF4, 0x3FEF03C3,0xAB4DB6D3,
+	0x3FF52B02,0x0C49BA5E, 0x3FEF05C7,0x0CE07111,
+	0x3FF52F1A,0x9FBE76C9, 0x3FEF07C8,0x65FA4358,
+	0x3FF53333,0x33333333, 0x3FEF09C7,0xB679891A,
+	0x3FF5374B,0xC6A7EF9E, 0x3FEF0BC4,0xFE3CBFEB,
+	0x3FF53B64,0x5A1CAC08, 0x3FEF0DC0,0x3D22877A,
+	0x3FF53F7C,0xED916873, 0x3FEF0FB9,0x7309A19D,
+	0x3FF54395,0x810624DD, 0x3FEF11B0,0x9FD0F24E,
+	0x3FF547AE,0x147AE148, 0x3FEF13A5,0xC3577FAC,
+	0x3FF54BC6,0xA7EF9DB2, 0x3FEF1598,0xDD7C7201,
+	0x3FF54FDF,0x3B645A1D, 0x3FEF1789,0xEE1F13C2,
+	0x3FF553F7,0xCED91687, 0x3FEF1978,0xF51ED191,
+	0x3FF55810,0x624DD2F2, 0x3FEF1B65,0xF25B3A41,
+	0x3FF55C28,0xF5C28F5C, 0x3FEF1D50,0xE5B3FED5,
+	0x3FF56041,0x89374BC7, 0x3FEF1F39,0xCF08F284,
+	0x3FF5645A,0x1CAC0831, 0x3FEF2120,0xAE3A0ABB,
+	0x3FF56872,0xB020C49C, 0x3FEF2305,0x83275F22,
+	0x3FF56C8B,0x43958106, 0x3FEF24E8,0x4DB12996,
+	0x3FF570A3,0xD70A3D71, 0x3FEF26C9,0x0DB7C635,
+	0x3FF574BC,0x6A7EF9DB, 0x3FEF28A7,0xC31BB357,
+	0x3FF578D4,0xFDF3B646, 0x3FEF2A84,0x6DBD9199,
+	0x3FF57CED,0x916872B0, 0x3FEF2C5F,0x0D7E23D6,
+	0x3FF58106,0x24DD2F1B, 0x3FEF2E37,0xA23E4F31,
+	0x3FF5851E,0xB851EB85, 0x3FEF300E,0x2BDF1B11,
+	0x3FF58937,0x4BC6A7F0, 0x3FEF31E2,0xAA41B127,
+	0x3FF58D4F,0xDF3B645A, 0x3FEF33B5,0x1D475D6D,
+	0x3FF59168,0x72B020C5, 0x3FEF3585,0x84D18E2D,
+	0x3FF59581,0x0624DD2F, 0x3FEF3753,0xE0C1D3FA,
+	0x3FF59999,0x9999999A, 0x3FEF3920,0x30F9E1BE,
+	0x3FF59DB2,0x2D0E5604, 0x3FEF3AEA,0x755B8CB0,
+	0x3FF5A1CA,0xC083126F, 0x3FEF3CB2,0xADC8CC60,
+	0x3FF5A5E3,0x53F7CED9, 0x3FEF3E78,0xDA23BAB0,
+	0x3FF5A9FB,0xE76C8B44, 0x3FEF403C,0xFA4E93DF,
+	0x3FF5AE14,0x7AE147AE, 0x3FEF41FF,0x0E2BB682,
+	0x3FF5B22D,0x0E560419, 0x3FEF43BF,0x159DA38F,
+	0x3FF5B645,0xA1CAC083, 0x3FEF457D,0x1086FE57,
+	0x3FF5BA5E,0x353F7CEE, 0x3FEF4738,0xFECA8C8B,
+	0x3FF5BE76,0xC8B43958, 0x3FEF48F2,0xE04B3641,
+	0x3FF5C28F,0x5C28F5C3, 0x3FEF4AAA,0xB4EC05F1,
+	0x3FF5C6A7,0xEF9DB22D, 0x3FEF4C60,0x7C902877,
+	0x3FF5CAC0,0x83126E98, 0x3FEF4E14,0x371AED1C,
+	0x3FF5CED9,0x16872B02, 0x3FEF4FC5,0xE46FC58E,
+	0x3FF5D2F1,0xA9FBE76D, 0x3FEF5175,0x847245E9,
+	0x3FF5D70A,0x3D70A3D7, 0x3FEF5323,0x170624B5,
+	0x3FF5DB22,0xD0E56042, 0x3FEF54CE,0x9C0F3AEC,
+	0x3FF5DF3B,0x645A1CAC, 0x3FEF5678,0x137183F4,
+	0x3FF5E353,0xF7CED917, 0x3FEF581F,0x7D111DAB,
+	0x3FF5E76C,0x8B439581, 0x3FEF59C4,0xD8D24862,
+	0x3FF5EB85,0x1EB851EC, 0x3FEF5B68,0x269966E0,
+	0x3FF5EF9D,0xB22D0E56, 0x3FEF5D09,0x664AFE66,
+	0x3FF5F3B6,0x45A1CAC1, 0x3FEF5EA8,0x97CBB6AC,
+	0x3FF5F7CE,0xD916872B, 0x3FEF6045,0xBB0059EB,
+	0x3FF5FBE7,0x6C8B4396, 0x3FEF61E0,0xCFCDD4D5,
+	0x3FF60000,0x00000000, 0x3FEF6379,0xD619369D,
+	0x3FF60418,0x9374BC6A, 0x3FEF6510,0xCDC7B0FA,
+	0x3FF60831,0x26E978D5, 0x3FEF66A5,0xB6BE9823,
+	0x3FF60C49,0xBA5E353F, 0x3FEF6838,0x90E362D5,
+	0x3FF61062,0x4DD2F1AA, 0x3FEF69C9,0x5C1BAA54,
+	0x3FF6147A,0xE147AE14, 0x3FEF6B58,0x184D2A6A,
+	0x3FF61893,0x74BC6A7F, 0x3FEF6CE4,0xC55DC16F,
+	0x3FF61CAC,0x083126E9, 0x3FEF6E6F,0x63337043,
+	0x3FF620C4,0x9BA5E354, 0x3FEF6FF7,0xF1B45A56,
+	0x3FF624DD,0x2F1A9FBE, 0x3FEF717E,0x70C6C5A4,
+	0x3FF628F5,0xC28F5C29, 0x3FEF7302,0xE0511ABF,
+	0x3FF62D0E,0x56041893, 0x3FEF7485,0x4039E4C7,
+	0x3FF63126,0xE978D4FE, 0x3FEF7605,0x9067D172,
+	0x3FF6353F,0x7CED9168, 0x3FEF7783,0xD0C1B10B,
+	0x3FF63958,0x10624DD3, 0x3FEF7900,0x012E7675,
+	0x3FF63D70,0xA3D70A3D, 0x3FEF7A7A,0x2195372D,
+	0x3FF64189,0x374BC6A8, 0x3FEF7BF2,0x31DD2B49,
+	0x3FF645A1,0xCAC08312, 0x3FEF7D68,0x31EDAD7C,
+	0x3FF649BA,0x5E353F7D, 0x3FEF7EDC,0x21AE3B19,
+	0x3FF64DD2,0xF1A9FBE7, 0x3FEF804E,0x0106740F,
+	0x3FF651EB,0x851EB852, 0x3FEF81BD,0xCFDE1AF1,
+	0x3FF65604,0x189374BC, 0x3FEF832B,0x8E1D14F3,
+	0x3FF65A1C,0xAC083127, 0x3FEF8497,0x3BAB69F0,
+	0x3FF65E35,0x3F7CED91, 0x3FEF8600,0xD8714466,
+	0x3FF6624D,0xD2F1A9FC, 0x3FEF8768,0x6456F17D,
+	0x3FF66666,0x66666666, 0x3FEF88CD,0xDF44E102,
+	0x3FF66A7E,0xF9DB22D1, 0x3FEF8A31,0x4923A572,
+	0x3FF66E97,0x8D4FDF3B, 0x3FEF8B92,0xA1DBF3F3,
+	0x3FF672B0,0x20C49BA6, 0x3FEF8CF1,0xE956A458,
+	0x3FF676C8,0xB4395810, 0x3FEF8E4F,0x1F7CB126,
+	0x3FF67AE1,0x47AE147B, 0x3FEF8FAA,0x44373790,
+	0x3FF67EF9,0xDB22D0E5, 0x3FEF9103,0x576F777D,
+	0x3FF68312,0x6E978D50, 0x3FEF925A,0x590ED386,
+	0x3FF6872B,0x020C49BA, 0x3FEF93AF,0x48FED0FB,
+	0x3FF68B43,0x95810625, 0x3FEF9502,0x272917E1,
+	0x3FF68F5C,0x28F5C28F, 0x3FEF9652,0xF37772F7,
+	0x3FF69374,0xBC6A7EFA, 0x3FEF97A1,0xADD3CFB3,
+	0x3FF6978D,0x4FDF3B64, 0x3FEF98EE,0x56283E48,
+	0x3FF69BA5,0xE353F7CF, 0x3FEF9A38,0xEC5EF1A6,
+	0x3FF69FBE,0x76C8B439, 0x3FEF9B81,0x70623F78,
+	0x3FF6A3D7,0x0A3D70A4, 0x3FEF9CC7,0xE21CA02B,
+	0x3FF6A7EF,0x9DB22D0E, 0x3FEF9E0C,0x4178AEEB,
+	0x3FF6AC08,0x3126E979, 0x3FEF9F4E,0x8E6129A8,
+	0x3FF6B020,0xC49BA5E3, 0x3FEFA08E,0xC8C0F114,
+	0x3FF6B439,0x5810624E, 0x3FEFA1CC,0xF08308A6,
+	0x3FF6B851,0xEB851EB8, 0x3FEFA309,0x0592969A,
+	0x3FF6BC6A,0x7EF9DB23, 0x3FEFA443,0x07DAE3F8,
+	0x3FF6C083,0x126E978D, 0x3FEFA57A,0xF7475C8C,
+	0x3FF6C49B,0xA5E353F8, 0x3FEFA6B0,0xD3C38EEF,
+	0x3FF6C8B4,0x39581062, 0x3FEFA7E4,0x9D3B2C85,
+	0x3FF6CCCC,0xCCCCCCCD, 0x3FEFA916,0x539A0980,
+	0x3FF6D0E5,0x60418937, 0x3FEFAA45,0xF6CC1CDE,
+	0x3FF6D4FD,0xF3B645A2, 0x3FEFAB73,0x86BD806F,
+	0x3FF6D916,0x872B020C, 0x3FEFAC9F,0x035A70D2,
+	0x3FF6DD2F,0x1A9FBE77, 0x3FEFADC8,0x6C8F4D7A,
+	0x3FF6E147,0xAE147AE1, 0x3FEFAEEF,0xC24898AD,
+	0x3FF6E560,0x4189374C, 0x3FEFB015,0x0472F786,
+	0x3FF6E978,0xD4FDF3B6, 0x3FEFB138,0x32FB31F3,
+	0x3FF6ED91,0x6872B021, 0x3FEFB259,0x4DCE32BF,
+	0x3FF6F1A9,0xFBE76C8B, 0x3FEFB378,0x54D90789,
+	0x3FF6F5C2,0x8F5C28F6, 0x3FEFB495,0x4808E0CC,
+	0x3FF6F9DB,0x22D0E560, 0x3FEFB5B0,0x274B11DC,
+	0x3FF6FDF3,0xB645A1CB, 0x3FEFB6C8,0xF28D10ED,
+	0x3FF7020C,0x49BA5E35, 0x3FEFB7DF,0xA9BC770B,
+	0x3FF70624,0xDD2F1AA0, 0x3FEFB8F4,0x4CC70027,
+	0x3FF70A3D,0x70A3D70A, 0x3FEFBA06,0xDB9A8B0D,
+	0x3FF70E56,0x04189375, 0x3FEFBB17,0x5625196D,
+	0x3FF7126E,0x978D4FDF, 0x3FEFBC25,0xBC54CFD6,
+	0x3FF71687,0x2B020C4A, 0x3FEFBD32,0x0E17F5BF,
+	0x3FF71A9F,0xBE76C8B4, 0x3FEFBE3C,0x4B5CF57F,
+	0x3FF71EB8,0x51EB851F, 0x3FEFBF44,0x74125C57,
+	0x3FF722D0,0xE5604189, 0x3FEFC04A,0x8826DA6B,
+	0x3FF726E9,0x78D4FDF4, 0x3FEFC14E,0x878942C9,
+	0x3FF72B02,0x0C49BA5E, 0x3FEFC250,0x72288B69,
+	0x3FF72F1A,0x9FBE76C9, 0x3FEFC350,0x47F3CD2B,
+	0x3FF73333,0x33333333, 0x3FEFC44E,0x08DA43DC,
+	0x3FF7374B,0xC6A7EF9E, 0x3FEFC549,0xB4CB4E36,
+	0x3FF73B64,0x5A1CAC08, 0x3FEFC643,0x4BB66DDD,
+	0x3FF73F7C,0xED916873, 0x3FEFC73A,0xCD8B4769,
+	0x3FF74395,0x810624DD, 0x3FEFC830,0x3A39A25E,
+	0x3FF747AE,0x147AE148, 0x3FEFC923,0x91B16932,
+	0x3FF74BC6,0xA7EF9DB2, 0x3FEFCA14,0xD3E2A94B,
+	0x3FF74FDF,0x3B645A1D, 0x3FEFCB04,0x00BD9305,
+	0x3FF753F7,0xCED91687, 0x3FEFCBF1,0x183279AE,
+	0x3FF75810,0x624DD2F2, 0x3FEFCCDC,0x1A31D38A,
+	0x3FF75C28,0xF5C28F5C, 0x3FEFCDC5,0x06AC39D1,
+	0x3FF76041,0x89374BC7, 0x3FEFCEAB,0xDD9268B4,
+	0x3FF7645A,0x1CAC0831, 0x3FEFCF90,0x9ED53F5A,
+	0x3FF76872,0xB020C49C, 0x3FEFD073,0x4A65BFE6,
+	0x3FF76C8B,0x43958106, 0x3FEFD153,0xE0350F72,
+	0x3FF770A3,0xD70A3D71, 0x3FEFD232,0x60347615,
+	0x3FF774BC,0x6A7EF9DB, 0x3FEFD30E,0xCA555EDF,
+	0x3FF778D4,0xFDF3B646, 0x3FEFD3E9,0x1E8957E0,
+	0x3FF77CED,0x916872B0, 0x3FEFD4C1,0x5CC21225,
+	0x3FF78106,0x24DD2F1B, 0x3FEFD597,0x84F161B8,
+	0x3FF7851E,0xB851EB85, 0x3FEFD66B,0x97093DA5,
+	0x3FF78937,0x4BC6A7F0, 0x3FEFD73D,0x92FBBFF6,
+	0x3FF78D4F,0xDF3B645A, 0x3FEFD80D,0x78BB25BA,
+	0x3FF79168,0x72B020C5, 0x3FEFD8DB,0x4839CEFF,
+	0x3FF79581,0x0624DD2F, 0x3FEFD9A7,0x016A3ED7,
+	0x3FF79999,0x9999999A, 0x3FEFDA70,0xA43F1B5A,
+	0x3FF79DB2,0x2D0E5604, 0x3FEFDB38,0x30AB2DA4,
+	0x3FF7A1CA,0xC083126F, 0x3FEFDBFD,0xA6A161D5,
+	0x3FF7A5E3,0x53F7CED9, 0x3FEFDCC1,0x0614C717,
+	0x3FF7A9FB,0xE76C8B44, 0x3FEFDD82,0x4EF88F9A,
+	0x3FF7AE14,0x7AE147AE, 0x3FEFDE41,0x81401095,
+	0x3FF7B22D,0x0E560419, 0x3FEFDEFE,0x9CDEC24C,
+	0x3FF7B645,0xA1CAC083, 0x3FEFDFB9,0xA1C84008,
+	0x3FF7BA5E,0x353F7CEE, 0x3FEFE072,0x8FF04823,
+	0x3FF7BE76,0xC8B43958, 0x3FEFE129,0x674ABBFD,
+	0x3FF7C28F,0x5C28F5C3, 0x3FEFE1DE,0x27CBA006,
+	0x3FF7C6A7,0xEF9DB22D, 0x3FEFE290,0xD1671BBA,
+	0x3FF7CAC0,0x83126E98, 0x3FEFE341,0x641179A4,
+	0x3FF7CED9,0x16872B02, 0x3FEFE3EF,0xDFBF275C,
+	0x3FF7D2F1,0xA9FBE76D, 0x3FEFE49C,0x4464B58C,
+	0x3FF7D70A,0x3D70A3D7, 0x3FEFE546,0x91F6D7ED,
+	0x3FF7DB22,0xD0E56042, 0x3FEFE5EE,0xC86A6548,
+	0x3FF7DF3B,0x645A1CAC, 0x3FEFE694,0xE7B4577A,
+	0x3FF7E353,0xF7CED917, 0x3FEFE738,0xEFC9CB72,
+	0x3FF7E76C,0x8B439581, 0x3FEFE7DA,0xE0A00130,
+	0x3FF7EB85,0x1EB851EC, 0x3FEFE87A,0xBA2C5BCC,
+	0x3FF7EF9D,0xB22D0E56, 0x3FEFE918,0x7C64616E,
+	0x3FF7F3B6,0x45A1CAC1, 0x3FEFE9B4,0x273DBB58,
+	0x3FF7F7CE,0xD916872B, 0x3FEFEA4D,0xBAAE35DE,
+	0x3FF7FBE7,0x6C8B4396, 0x3FEFEAE5,0x36ABC06E,
+	0x3FF80000,0x00000000, 0x3FEFEB7A,0x9B2C6D8B,
+	0x3FF80418,0x9374BC6A, 0x3FEFEC0D,0xE82672D0,
+	0x3FF80831,0x26E978D5, 0x3FEFEC9F,0x1D9028F3,
+	0x3FF80C49,0xBA5E353F, 0x3FEFED2E,0x3B600BC1,
+	0x3FF81062,0x4DD2F1AA, 0x3FEFEDBB,0x418CBA21,
+	0x3FF8147A,0xE147AE14, 0x3FEFEE46,0x300CF615,
+	0x3FF81893,0x74BC6A7F, 0x3FEFEECF,0x06D7A4BB,
+	0x3FF81CAC,0x083126E9, 0x3FEFEF55,0xC5E3CE4C,
+	0x3FF820C4,0x9BA5E354, 0x3FEFEFDA,0x6D289E1C,
+	0x3FF824DD,0x2F1A9FBE, 0x3FEFF05C,0xFC9D629E,
+	0x3FF828F5,0xC28F5C29, 0x3FEFF0DD,0x74398D62,
+	0x3FF82D0E,0x56041893, 0x3FEFF15B,0xD3F4B314,
+	0x3FF83126,0xE978D4FE, 0x3FEFF1D8,0x1BC68B81,
+	0x3FF8353F,0x7CED9168, 0x3FEFF252,0x4BA6F195,
+	0x3FF83958,0x10624DD3, 0x3FEFF2CA,0x638DE359,
+	0x3FF83D70,0xA3D70A3D, 0x3FEFF340,0x637381F9,
+	0x3FF84189,0x374BC6A8, 0x3FEFF3B4,0x4B5011C0,
+	0x3FF845A1,0xCAC08312, 0x3FEFF426,0x1B1BFA1C,
+	0x3FF849BA,0x5E353F7D, 0x3FEFF495,0xD2CFC59A,
+	0x3FF84DD2,0xF1A9FBE7, 0x3FEFF503,0x726421EC,
+	0x3FF851EB,0x851EB852, 0x3FEFF56E,0xF9D1DFE4,
+	0x3FF85604,0x189374BC, 0x3FEFF5D8,0x6911F37A,
+	0x3FF85A1C,0xAC083127, 0x3FEFF63F,0xC01D73C6,
+	0x3FF85E35,0x3F7CED91, 0x3FEFF6A4,0xFEED9B08,
+	0x3FF8624D,0xD2F1A9FC, 0x3FEFF708,0x257BC6A1,
+	0x3FF86666,0x66666666, 0x3FEFF769,0x33C1771A,
+	0x3FF86A7E,0xF9DB22D1, 0x3FEFF7C8,0x29B8501E,
+	0x3FF86E97,0x8D4FDF3B, 0x3FEFF825,0x075A1881,
+	0x3FF872B0,0x20C49BA6, 0x3FEFF87F,0xCCA0BA3B,
+	0x3FF876C8,0xB4395810, 0x3FEFF8D8,0x7986426B,
+	0x3FF87AE1,0x47AE147B, 0x3FEFF92F,0x0E04E157,
+	0x3FF87EF9,0xDB22D0E5, 0x3FEFF983,0x8A16EA6D,
+	0x3FF88312,0x6E978D50, 0x3FEFF9D5,0xEDB6D443,
+	0x3FF8872B,0x020C49BA, 0x3FEFFA26,0x38DF3895,
+	0x3FF88B43,0x95810625, 0x3FEFFA74,0x6B8AD449,
+	0x3FF88F5C,0x28F5C28F, 0x3FEFFAC0,0x85B4876E,
+	0x3FF89374,0xBC6A7EFA, 0x3FEFFB0A,0x8757553B,
+	0x3FF8978D,0x4FDF3B64, 0x3FEFFB52,0x706E6412,
+	0x3FF89BA5,0xE353F7CF, 0x3FEFFB98,0x40F4FD7C,
+	0x3FF89FBE,0x76C8B439, 0x3FEFFBDB,0xF8E68E2F,
+	0x3FF8A3D7,0x0A3D70A4, 0x3FEFFC1D,0x983EA60A,
+	0x3FF8A7EF,0x9DB22D0E, 0x3FEFFC5D,0x1EF8F817,
+	0x3FF8AC08,0x3126E979, 0x3FEFFC9A,0x8D115A8A,
+	0x3FF8B020,0xC49BA5E3, 0x3FEFFCD5,0xE283C6C3,
+	0x3FF8B439,0x5810624E, 0x3FEFFD0F,0x1F4C594F,
+	0x3FF8B851,0xEB851EB8, 0x3FEFFD46,0x436751E3,
+	0x3FF8BC6A,0x7EF9DB23, 0x3FEFFD7B,0x4ED11363,
+	0x3FF8C083,0x126E978D, 0x3FEFFDAE,0x418623DE,
+	0x3FF8C49B,0xA5E353F8, 0x3FEFFDDF,0x1B832C90,
+	0x3FF8C8B4,0x39581062, 0x3FEFFE0D,0xDCC4F9E2,
+	0x3FF8CCCC,0xCCCCCCCD, 0x3FEFFE3A,0x85487B68,
+	0x3FF8D0E5,0x60418937, 0x3FEFFE65,0x150AC3E4,
+	0x3FF8D4FD,0xF3B645A2, 0x3FEFFE8D,0x8C090947,
+	0x3FF8D916,0x872B020C, 0x3FEFFEB3,0xEA40A4AD,
+	0x3FF8DD2F,0x1A9FBE77, 0x3FEFFED8,0x2FAF1261,
+	0x3FF8E147,0xAE147AE1, 0x3FEFFEFA,0x5C51F1DB,
+	0x3FF8E560,0x4189374C, 0x3FEFFF1A,0x702705C1,
+	0x3FF8E978,0xD4FDF3B6, 0x3FEFFF38,0x6B2C33E8,
+	0x3FF8ED91,0x6872B021, 0x3FEFFF54,0x4D5F8552,
+	0x3FF8F1A9,0xFBE76C8B, 0x3FEFFF6E,0x16BF2630,
+	0x3FF8F5C2,0x8F5C28F6, 0x3FEFFF85,0xC74965E2,
+	0x3FF8F9DB,0x22D0E560, 0x3FEFFF9B,0x5EFCB6F5,
+	0x3FF8FDF3,0xB645A1CB, 0x3FEFFFAE,0xDDD7AF26,
+	0x3FF9020C,0x49BA5E35, 0x3FEFFFC0,0x43D90760,
+	0x3FF90624,0xDD2F1AA0, 0x3FEFFFCF,0x90FF9BBD,
+	0x3FF90A3D,0x70A3D70A, 0x3FEFFFDC,0xC54A6B87,
+	0x3FF90E56,0x04189375, 0x3FEFFFE7,0xE0B89936,
+	0x3FF9126E,0x978D4FDF, 0x3FEFFFF0,0xE3496A70,
+	0x3FF91687,0x2B020C4A, 0x3FEFFFF7,0xCCFC480D,
+	0x3FF91A9F,0xBE76C8B4, 0x3FEFFFFC,0x9DD0BE11,
+	0x3FF91EB8,0x51EB851F, 0x3FEFFFFF,0x55C67BB1,
+	0x3FF922D0,0xE5604189, 0x3FEFFFFF,0xF4DD5351,
+	0x3FF926E9,0x78D4FDF4, 0x3FEFFFFE,0x7B153A84,
+	0x3FF92B02,0x0C49BA5E, 0x3FEFFFFA,0xE86E4A0B,
+	0x3FF92F1A,0x9FBE76C9, 0x3FEFFFF5,0x3CE8BDD8,
+	0x3FF93333,0x33333333, 0x3FEFFFED,0x7884F50C,
+	0x3FF9374B,0xC6A7EF9E, 0x3FEFFFE3,0x9B4371F7,
+	0x3FF93B64,0x5A1CAC08, 0x3FEFFFD7,0xA524DA16,
+	0x3FF93F7C,0xED916873, 0x3FEFFFC9,0x9629F618,
+	0x3FF94395,0x810624DD, 0x3FEFFFB9,0x6E53B1DA,
+	0x3FF947AE,0x147AE148, 0x3FEFFFA7,0x2DA31C68,
+	0x3FF94BC6,0xA7EF9DB2, 0x3FEFFF92,0xD41967FB,
+	0x3FF94FDF,0x3B645A1D, 0x3FEFFF7C,0x61B7E9FF,
+	0x3FF953F7,0xCED91687, 0x3FEFFF63,0xD6801B0A,
+	0x3FF95810,0x624DD2F2, 0x3FEFFF49,0x327396E5,
+	0x3FF95C28,0xF5C28F5C, 0x3FEFFF2C,0x75941C84,
+	0x3FF96041,0x89374BC7, 0x3FEFFF0D,0x9FE38E0B,
+	0x3FF9645A,0x1CAC0831, 0x3FEFFEEC,0xB163F0CC,
+	0x3FF96872,0xB020C49C, 0x3FEFFEC9,0xAA176D48,
+	0x3FF96C8B,0x43958106, 0x3FEFFEA4,0x8A004F2D,
+	0x3FF970A3,0xD70A3D71, 0x3FEFFE7D,0x51210557,
+	0x3FF974BC,0x6A7EF9DB, 0x3FEFFE53,0xFF7C21D0,
+	0x3FF978D4,0xFDF3B646, 0x3FEFFE28,0x951459CF,
+	0x3FF97CED,0x916872B0, 0x3FEFFDFB,0x11EC85BA,
+	0x3FF98106,0x24DD2F1B, 0x3FEFFDCB,0x7607A121,
+	0x3FF9851E,0xB851EB85, 0x3FEFFD99,0xC168CAC5,
+	0x3FF98937,0x4BC6A7F0, 0x3FEFFD65,0xF4134490,
+	0x3FF98D4F,0xDF3B645A, 0x3FEFFD30,0x0E0A739B,
+	0x3FF99168,0x72B020C5, 0x3FEFFCF8,0x0F51E02A,
+	0x3FF99581,0x0624DD2F, 0x3FEFFCBD,0xF7ED35AF,
+	0x3FF99999,0x9999999A, 0x3FEFFC81,0xC7E042C5,
+	0x3FF9C28F,0x5C28F5C3, 0x3FEFF9B4,0x9EDEFDF4,
+	0x3FF9EB85,0x1EB851EC, 0x3FEFF615,0xE87927FA,
+	0x3FFA147A,0xE147AE14, 0x3FEFF1A5,0xBC680174,
+	0x3FFA3D70,0xA3D70A3D, 0x3FEFEC64,0x37C17F07,
+	0x3FFA6666,0x66666666, 0x3FEFE651,0x7CF78AC8,
+	0x3FFA8F5C,0x28F5C28F, 0x3FEFDF6D,0xB3D7227B,
+	0x3FFAB851,0xEB851EB8, 0x3FEFD7B9,0x098752C1,
+	0x3FFAE147,0xAE147AE1, 0x3FEFCF33,0xB0880F2B,
+	0x3FFB0A3D,0x70A3D70A, 0x3FEFC5DD,0xE0B0E74A,
+	0x3FFB3333,0x33333333, 0x3FEFBBB7,0xD72F98B6,
+	0x3FFB5C28,0xF5C28F5C, 0x3FEFB0C1,0xD6867E1F,
+	0x3FFB851E,0xB851EB85, 0x3FEFA4FC,0x268ADB6D,
+	0x3FFBAE14,0x7AE147AE, 0x3FEF9867,0x146306FE,
+	0x3FFBD70A,0x3D70A3D7, 0x3FEF8B02,0xF284700C,
+	0x3FFC0000,0x00000000, 0x3FEF7CD0,0x18B18246,
+	0x3FFC28F5,0xC28F5C29, 0x3FEF6DCE,0xE3F766AD,
+	0x3FFC51EB,0x851EB852, 0x3FEF5DFF,0xB6ABA1C5,
+	0x3FFC7AE1,0x47AE147B, 0x3FEF4D62,0xF8698F23,
+	0x3FFCA3D7,0x0A3D70A4, 0x3FEF3BF9,0x160FBA71,
+	0x3FFCCCCC,0xCCCCCCCD, 0x3FEF29C2,0x81BD15F0,
+	0x3FFCF5C2,0x8F5C28F6, 0x3FEF16BF,0xB2CE0E97,
+	0x3FFD1EB8,0x51EB851F, 0x3FEF02F1,0x25D97DD2,
+	0x3FFD47AE,0x147AE148, 0x3FEEEE57,0x5CAD7904,
+	0x3FFD70A3,0xD70A3D71, 0x3FEED8F2,0xDE4BFED7,
+	0x3FFD9999,0x9999999A, 0x3FEEC2C4,0x36E78275,
+	0x3FFDC28F,0x5C28F5C3, 0x3FEEABCB,0xF7DF54BE,
+	0x3FFDEB85,0x1EB851EC, 0x3FEE940A,0xB7BBEB94,
+	0x3FFE147A,0xE147AE14, 0x3FEE7B81,0x122B0754,
+	0x3FFE3D70,0xA3D70A3D, 0x3FEE622F,0xA7FBB698,
+	0x3FFE6666,0x66666666, 0x3FEE4817,0x1F1A3857,
+	0x3FFE8F5C,0x28F5C28F, 0x3FEE2D38,0x228BBC85,
+	0x3FFEB851,0xEB851EB8, 0x3FEE1193,0x626A0345,
+	0x3FFEE147,0xAE147AE1, 0x3FEDF529,0x93DEDADB,
+	0x3FFF0A3D,0x70A3D70A, 0x3FEDD7FB,0x711F7C60,
+	0x3FFF3333,0x33333333, 0x3FEDBA09,0xB967C778,
+	0x3FFF5C28,0xF5C28F5C, 0x3FED9B55,0x30F55D09,
+	0x3FFF851E,0xB851EB85, 0x3FED7BDE,0xA102992C,
+	0x3FFFAE14,0x7AE147AE, 0x3FED5BA6,0xD7C16C69,
+	0x3FFFD70A,0x3D70A3D7, 0x3FED3AAE,0xA856146C,
+	0x40000000,0x00000000, 0x3FED18F6,0xEAD1B446,
+	0x4000147A,0xE147AE14, 0x3FECF680,0x7C2CCC6F,
+	0x400028F5,0xC28F5C29, 0x3FECD34C,0x3E4192A0,
+	0x40003D70,0xA3D70A3D, 0x3FECAF5B,0x17C629B6,
+	0x400051EB,0x851EB852, 0x3FEC8AAD,0xF446B9AB,
+	0x40006666,0x66666666, 0x3FEC6545,0xC41F67FD,
+	0x40007AE1,0x47AE147B, 0x3FEC3F23,0x7C763065,
+	0x40008F5C,0x28F5C28F, 0x3FEC1848,0x17349E4E,
+	0x4000A3D7,0x0A3D70A4, 0x3FEBF0B4,0x930166FC,
+	0x4000B851,0xEB851EB8, 0x3FEBC869,0xF339E4B7,
+	0x4000CCCC,0xCCCCCCCD, 0x3FEB9F69,0x3FEB72FB,
+	0x4000E147,0xAE147AE1, 0x3FEB75B3,0x85CCAC10,
+	0x4000F5C2,0x8F5C28F6, 0x3FEB4B49,0xD63687F1,
+	0x40010A3D,0x70A3D70A, 0x3FEB202D,0x471D5CF8,
+	0x40011EB8,0x51EB851F, 0x3FEAF45E,0xF309C235,
+	0x40013333,0x33333333, 0x3FEAC7DF,0xF91153EA,
+	0x400147AE,0x147AE148, 0x3FEA9AB1,0x7CCF5A0D,
+	0x40015C28,0xF5C28F5C, 0x3FEA6CD4,0xA65D5148,
+	0x400170A3,0xD70A3D71, 0x3FEA3E4A,0xA24B566B,
+	0x4001851E,0xB851EB85, 0x3FEA0F14,0xA19874B8,
+	0x40019999,0x9999999A, 0x3FE9DF33,0xD9AAD708,
+	0x4001AE14,0x7AE147AE, 0x3FE9AEA9,0x8447DC31,
+	0x4001C28F,0x5C28F5C3, 0x3FE97D76,0xDF8C0EA5,
+	0x4001D70A,0x3D70A3D7, 0x3FE94B9D,0x2DE2FFBF,
+	0x4001EB85,0x1EB851EC, 0x3FE9191D,0xB5FF06B6,
+	0x40020000,0x00000000, 0x3FE8E5F9,0xC2D0E3A9,
+	0x4002147A,0xE147AE14, 0x3FE8B232,0xA37F46B7,
+	0x400228F5,0xC28F5C29, 0x3FE87DC9,0xAB5E3B9C,
+	0x40023D70,0xA3D70A3D, 0x3FE848C0,0x31E679E5,
+	0x400251EB,0x851EB852, 0x3FE81317,0x92AC99F3,
+	0x40026666,0x66666666, 0x3FE7DCD1,0x2D582F24,
+	0x40027AE1,0x47AE147B, 0x3FE7A5EE,0x659AC72D,
+	0x40028F5C,0x28F5C28F, 0x3FE76E70,0xA326CF21,
+	0x4002A3D7,0x0A3D70A4, 0x3FE73659,0x51A65E10,
+	0x4002B851,0xEB851EB8, 0x3FE6FDA9,0xE0B1E5D3,
+	0x4002CCCC,0xCCCCCCCD, 0x3FE6C463,0xC3C6C9E8,
+	0x4002E147,0xAE147AE1, 0x3FE68A88,0x723DDCF7,
+	0x4002F5C2,0x8F5C28F6, 0x3FE65019,0x6741C4DC,
+	0x40030A3D,0x70A3D70A, 0x3FE61518,0x21C545E0,
+	0x40031EB8,0x51EB851F, 0x3FE5D986,0x247974F6,
+	0x40033333,0x33333333, 0x3FE59D64,0xF5C3D19B,
+	0x400347AE,0x147AE148, 0x3FE560B6,0x1FB44749,
+	0x40035C28,0xF5C28F5C, 0x3FE5237B,0x2FFB1706,
+	0x400370A3,0xD70A3D71, 0x3FE4E5B5,0xB7DEA911,
+	0x4003851E,0xB851EB85, 0x3FE4A767,0x4C314729,
+	0x40039999,0x9999999A, 0x3FE46891,0x8546BF7C,
+	0x4003AE14,0x7AE147AE, 0x3FE42935,0xFEE9F0B6,
+	0x4003C28F,0x5C28F5C3, 0x3FE3E956,0x58523F3F,
+	0x4003D70A,0x3D70A3D7, 0x3FE3A8F4,0x3418F429,
+	0x4003EB85,0x1EB851EC, 0x3FE36811,0x382E85CD,
+	0x40040000,0x00000000, 0x3FE326AF,0x0DCFCAB1,
+	0x4004147A,0xE147AE14, 0x3FE2E4CF,0x617B169D,
+	0x400428F5,0xC28F5C29, 0x3FE2A273,0xE2E54284,
+	0x40043D70,0xA3D70A3D, 0x3FE25F9E,0x44EE9F55,
+	0x400451EB,0x851EB852, 0x3FE21C50,0x3D97D3E9,
+	0x40046666,0x66666666, 0x3FE1D88B,0x85F6A6A5,
+	0x40047AE1,0x47AE147B, 0x3FE19451,0xDA2AB2B7,
+	0x40048F5C,0x28F5C28F, 0x3FE14FA4,0xF9520997,
+	0x4004A3D7,0x0A3D70A4, 0x3FE10A86,0xA57DC0BA,
+	0x4004B851,0xEB851EB8, 0x3FE0C4F8,0xA3A66C23,
+	0x4004CCCC,0xCCCCCCCD, 0x3FE07EFC,0xBBA085BB,
+	0x4004E147,0xAE147AE1, 0x3FE03894,0xB810C219,
+	0x4004F5C2,0x8F5C28F6, 0x3FDFE384,0xCCC0A55E,
+	0x40050A3D,0x70A3D70A, 0x3FDF550F,0x2D622BFF,
+	0x40051EB8,0x51EB851F, 0x3FDEC5CC,0x37A36B9F,
+	0x40053333,0x33333333, 0x3FDE35BF,0x96636804,
+	0x400547AE,0x147AE148, 0x3FDDA4EC,0xF9AACC0D,
+	0x40055C28,0xF5C28F5C, 0x3FDD1358,0x1693BF1F,
+	0x400570A3,0xD70A3D71, 0x3FDC8104,0xA73198F8,
+	0x4005851E,0xB851EB85, 0x3FDBEDF6,0x6A78754D,
+	0x40059999,0x9999999A, 0x3FDB5A31,0x2424A70C,
+	0x4005AE14,0x7AE147AE, 0x3FDAC5B8,0x9CA20CAC,
+	0x4005C28F,0x5C28F5C3, 0x3FDA3090,0xA0F34560,
+	0x4005D70A,0x3D70A3D7, 0x3FD99ABD,0x0298C8A6,
+	0x4005EB85,0x1EB851EC, 0x3FD90441,0x9777DFF0,
+	0x40060000,0x00000000, 0x3FD86D22,0x39C183FB,
+	0x4006147A,0xE147AE14, 0x3FD7D562,0xC7D91D8E,
+	0x400628F5,0xC28F5C29, 0x3FD73D07,0x243B2B02,
+	0x40063D70,0xA3D70A3D, 0x3FD6A413,0x3563CAEE,
+	0x400651EB,0x851EB852, 0x3FD60A8A,0xE5B52C59,
+	0x40066666,0x66666666, 0x3FD57072,0x235DE5C8,
+	0x40067AE1,0x47AE147B, 0x3FD4D5CC,0xE03F32F1,
+	0x40068F5C,0x28F5C28F, 0x3FD43A9F,0x11D31AB2,
+	0x4006A3D7,0x0A3D70A4, 0x3FD39EEC,0xB1127CF3,
+	0x4006B851,0xEB851EB8, 0x3FD302B9,0xBA5B0A1C,
+	0x4006CCCC,0xCCCCCCCD, 0x3FD2660A,0x2D5523D7,
+	0x4006E147,0xAE147AE1, 0x3FD1C8E2,0x0CD9A8B6,
+	0x4006F5C2,0x8F5C28F6, 0x3FD12B45,0x5ED7AA77,
+	0x40070A3D,0x70A3D70A, 0x3FD08D38,0x2C3A108B,
+	0x40071EB8,0x51EB851F, 0x3FCFDD7D,0x019A4D22,
+	0x40073333,0x33333333, 0x3FCE9FB8,0xD64830E3,
+	0x400747AE,0x147AE148, 0x3FCD612B,0xF8FCB783,
+	0x40075C28,0xF5C28F5C, 0x3FCC21DE,0x915A1052,
+	0x400770A3,0xD70A3D71, 0x3FCAE1D8,0xCBF03CDB,
+	0x4007851E,0xB851EB85, 0x3FC9A122,0xDA077FAF,
+	0x40079999,0x9999999A, 0x3FC85FC4,0xF16AAB46,
+	0x4007AE14,0x7AE147AE, 0x3FC71DC7,0x4C31544D,
+	0x4007C28F,0x5C28F5C3, 0x3FC5DB32,0x2889E6C6,
+	0x4007D70A,0x3D70A3D7, 0x3FC4980D,0xC883A15C,
+	0x4007EB85,0x1EB851EC, 0x3FC35462,0x71D87651,
+	0x40080000,0x00000000, 0x3FC21038,0x6DB6D55B,
+	0x4008147A,0xE147AE14, 0x3FC0CB98,0x088B5DF8,
+	0x400828F5,0xC28F5C29, 0x3FBF0D13,0x2394FA2B,
+	0x40083D70,0xA3D70A3D, 0x3FBC822A,0xB773EDC8,
+	0x400851EB,0x851EB852, 0x3FB9F687,0x7674BB23,
+	0x40086666,0x66666666, 0x3FB76A3A,0x0F20EFBE,
+	0x40087AE1,0x47AE147B, 0x3FB4DD53,0x345D2E1A,
+	0x40088F5C,0x28F5C28F, 0x3FB24FE3,0x9CFBBF03,
+	0x4008A3D7,0x0A3D70A4, 0x3FAF83F8,0x069E0E35,
+	0x4008B851,0xEB851EB8, 0x3FAA675A,0x4977CEEC,
+	0x4008CCCC,0xCCCCCCCD, 0x3FA54A0F,0x8298102E,
+	0x4008E147,0xAE147AE1, 0x3FA02C39,0x36802625,
+	0x4008F5C2,0x8F5C28F6, 0x3F961BF1,0xDA877CCC,
+	0x40090A3D,0x70A3D70A, 0x3F87BDC0,0xC6B48734,
+	0x40091EB8,0x51EB851F, 0x3F5A1812,0x0C2C1274,
+	0x40093333,0x33333333, 0xBF8137D1,0xA3EE270D,
+	0x400947AE,0x147AE148, 0xBF92D91A,0x59453A07,
+	0x40095C28,0xF5C28F5C, 0xBF9D15D0,0x5B0B6F91,
+	0x400970A3,0xD70A3D71, 0xBFA3A8E3,0xE02B7A3E,
+	0x4009851E,0xB851EB85, 0xBFA8C65E,0xBB8B1A8A,
+	0x40099999,0x9999999A, 0xBFADE337,0x39E82D32,
+	0x4009AE14,0x7AE147AE, 0xBFB17FA5,0xECD729F6,
+	0x4009C28F,0x5C28F5C3, 0xBFB40D3D,0x8F266A95,
+	0x4009D70A,0x3D70A3D7, 0xBFB69A51,0xC8890766,
+	0x4009EB85,0x1EB851EC, 0xBFB926D1,0xE103632B,
+	0x400A0000,0x00000000, 0xBFBBB2AD,0x2464A48C,
+	0x400A147A,0xE147AE14, 0xBFBE3DD2,0xE2B42F28,
+	0x400A28F5,0xC28F5C29, 0xBFC06419,0x384F7FE2,
+	0x400A3D70,0xA3D70A3D, 0xBFC1A8DD,0x93F27504,
+	0x400A51EB,0x851EB852, 0xBFC2ED2E,0x33E2DB1E,
+	0x400A6666,0x66666666, 0xBFC43102,0xCAB70C87,
+	0x400A7AE1,0x47AE147B, 0xBFC57453,0x0E32434A,
+	0x400A8F5C,0x28F5C28F, 0xBFC6B716,0xB77AECD3,
+	0x400AA3D7,0x0A3D70A4, 0xBFC7F945,0x8350E869,
+	0x400AB851,0xEB851EB8, 0xBFC93AD7,0x3243AD13,
+	0x400ACCCC,0xCCCCCCCD, 0xBFCA7BC3,0x88E85781,
+	0x400AE147,0xAE147AE1, 0xBFCBBC02,0x500F9C99,
+	0x400AF5C2,0x8F5C28F6, 0xBFCCFB8B,0x54FBA14D,
+	0x400B0A3D,0x70A3D70A, 0xBFCE3A56,0x6995B44A,
+	0x400B1EB8,0x51EB851F, 0xBFCF785B,0x64A3EA2C,
+	0x400B3333,0x33333333, 0xBFD05AC9,0x10FF4C6C,
+	0x400B47AE,0x147AE148, 0xBFD0F8F9,0x4162D949,
+	0x400B5C28,0xF5C28F5C, 0xBFD196BA,0x36CAFEC3,
+	0x400B70A3,0xD70A3D71, 0xBFD23407,0xE75F1422,
+	0x400B851E,0xB851EB85, 0xBFD2D0DE,0x4C39DC04,
+	0x400B9999,0x9999999A, 0xBFD36D39,0x6183E89C,
+	0x400BAE14,0x7AE147AE, 0xBFD40915,0x268DEB78,
+	0x400BC28F,0x5C28F5C3, 0xBFD4A46D,0x9DEAF10F,
+	0x400BD70A,0x3D70A3D7, 0xBFD53F3E,0xCD8A8678,
+	0x400BEB85,0x1EB851EC, 0xBFD5D984,0xBED2C998,
+	0x400C0000,0x00000000, 0xBFD6733B,0x7EBA621F,
+	0x400C147A,0xE147AE14, 0xBFD70C5F,0x1DE2639E,
+	0x400C28F5,0xC28F5C29, 0xBFD7A4EB,0xB0B01748,
+	0x400C3D70,0xA3D70A3D, 0xBFD83CDD,0x4F66AD08,
+	0x400C51EB,0x851EB852, 0xBFD8D430,0x1640D38A,
+	0x400C6666,0x66666666, 0xBFD96AE0,0x258A35D0,
+	0x400C7AE1,0x47AE147B, 0xBFDA00E9,0xA1B8DE9D,
+	0x400C8F5C,0x28F5C28F, 0xBFDA9648,0xB386801C,
+	0x400CA3D7,0x0A3D70A4, 0xBFDB2AF9,0x8809A00B,
+	0x400CB851,0xEB851EB8, 0xBFDBBEF8,0x50CEA6D7,
+	0x400CCCCC,0xCCCCCCCD, 0xBFDC5241,0x43F0D1F1,
+	0x400CE147,0xAE147AE1, 0xBFDCE4D0,0x9C3307D8,
+	0x400CF5C2,0x8F5C28F6, 0xBFDD76A2,0x99188E09,
+	0x400D0A3D,0x70A3D70A, 0xBFDE07B3,0x7EFD9F61,
+	0x400D1EB8,0x51EB851F, 0xBFDE97FF,0x972FE32A,
+	0x400D3333,0x33333333, 0xBFDF2783,0x3006C351,
+	0x400D47AE,0x147AE148, 0xBFDFB63A,0x9CFBA20A,
+	0x400D5C28,0xF5C28F5C, 0xBFE02211,0x1B60F6AE,
+	0x400D70A3,0xD70A3D71, 0xBFE0689B,0x2DAF8872,
+	0x400D851E,0xB851EB85, 0xBFE0AEB9,0xB7212221,
+	0x400D9999,0x9999999A, 0xBFE0F46A,0xEC2E1B41,
+	0x400DAE14,0x7AE147AE, 0xBFE139AD,0x041B4A7D,
+	0x400DC28F,0x5C28F5C3, 0xBFE17E7E,0x3905B6F8,
+	0x400DD70A,0x3D70A3D7, 0xBFE1C2DC,0xC7EE36C4,
+	0x400DEB85,0x1EB851EC, 0xBFE206C6,0xF0C4FA98,
+	0x400E0000,0x00000000, 0xBFE24A3A,0xF6750621,
+	0x400E147A,0xE147AE14, 0xBFE28D37,0x1EEF94F2,
+	0x400E28F5,0xC28F5C29, 0xBFE2CFB9,0xB3376B84,
+	0x400E3D70,0xA3D70A3D, 0xBFE311C0,0xFF6C1424,
+	0x400E51EB,0x851EB852, 0xBFE3534B,0x52D50789,
+	0x400E6666,0x66666666, 0xBFE39456,0xFFECC09D,
+	0x400E7AE1,0x47AE147B, 0xBFE3D4E2,0x5C6BBB78,
+	0x400E8F5C,0x28F5C28F, 0xBFE414EB,0xC1535EE7,
+	0x400EA3D7,0x0A3D70A4, 0xBFE45471,0x8AF8D0AA,
+	0x400EB851,0xEB851EB8, 0xBFE49372,0x190FB3A3,
+	0x400ECCCC,0xCCCCCCCD, 0xBFE4D1EB,0xCEB4D02B,
+	0x400EE147,0xAE147AE1, 0xBFE50FDD,0x1278A5E0,
+	0x400EF5C2,0x8F5C28F6, 0xBFE54D44,0x4E69E6F5,
+	0x400F0A3D,0x70A3D70A, 0xBFE58A1F,0xF01FDC7F,
+	0x400F1EB8,0x51EB851F, 0xBFE5C66E,0x68C4B3BD,
+	0x400F3333,0x33333333, 0xBFE6022E,0x2D1FB3CB,
+	0x400F47AE,0x147AE148, 0xBFE63D5D,0xB59F5BD3,
+	0x400F5C28,0xF5C28F5C, 0xBFE677FB,0x7E636920,
+	0x400F70A3,0xD70A3D71, 0xBFE6B206,0x0746C52B,
+	0x400F851E,0xB851EB85, 0xBFE6EB7B,0xD3E95B05,
+	0x400F9999,0x9999999A, 0xBFE7245B,0x6BB9D440,
+	0x400FAE14,0x7AE147AE, 0xBFE75CA3,0x59FF3CB1,
+	0x400FC28F,0x5C28F5C3, 0xBFE79452,0x2DE28D2E,
+	0x400FD70A,0x3D70A3D7, 0xBFE7CB66,0x7A781CAB,
+	0x400FEB85,0x1EB851EC, 0xBFE801DE,0xD6C8F7DB,
+	0x40100000,0x00000000, 0xBFE837B9,0xDDDC1EAE,
+	0x40100A3D,0x70A3D70A, 0xBFE86CF6,0x2EBFA7DA,
+	0x4010147A,0xE147AE14, 0xBFE8A192,0x6C91C9D3,
+	0x40101EB8,0x51EB851F, 0xBFE8D58D,0x3E89C943,
+	0x401028F5,0xC28F5C29, 0xBFE908E5,0x5000CC81,
+	0x40103333,0x33333333, 0xBFE93B99,0x507A942B,
+	0x40103D70,0xA3D70A3D, 0xBFE96DA7,0xF3AE183E,
+	0x401047AE,0x147AE148, 0xBFE99F0F,0xF18E09C5,
+	0x401051EB,0x851EB852, 0xBFE9CFD0,0x065138AD,
+	0x40105C28,0xF5C28F5C, 0xBFE9FFE6,0xF27ADDD3,
+	0x40106666,0x66666666, 0xBFEA2F53,0x7AE2C8B8,
+	0x401070A3,0xD70A3D71, 0xBFEA5E14,0x68BD70F3,
+	0x40107AE1,0x47AE147B, 0xBFEA8C28,0x89A3EAE6,
+	0x4010851E,0xB851EB85, 0xBFEAB98E,0xAF9BBFE6,
+	0x40108F5C,0x28F5C28F, 0xBFEAE645,0xB11EA92E,
+	0x40109999,0x9999999A, 0xBFEB124C,0x69222DBC,
+	0x4010A3D7,0x0A3D70A4, 0xBFEB3DA1,0xB71F22B8,
+	0x4010AE14,0x7AE147AE, 0xBFEB6844,0x7F190E71,
+	0x4010B851,0xEB851EB8, 0xBFEB9233,0xA9A56D63,
+	0x4010C28F,0x5C28F5C3, 0xBFEBBB6E,0x23F2D970,
+	0x4010CCCC,0xCCCCCCCD, 0xBFEBE3F2,0xDFD012D8,
+	0x4010D70A,0x3D70A3D7, 0xBFEC0BC0,0xD3B2EB03,
+	0x4010E147,0xAE147AE1, 0xBFEC32D6,0xFABF10B3,
+	0x4010EB85,0x1EB851EC, 0xBFEC5934,0x54CCBD95,
+	0x4010F5C2,0x8F5C28F6, 0xBFEC7ED7,0xE66F44EF,
+	0x40110000,0x00000000, 0xBFECA3C0,0xB8FB8370,
+	0x40110A3D,0x70A3D70A, 0xBFECC7ED,0xDA8E2FAD,
+	0x4011147A,0xE147AE14, 0xBFECEB5E,0x5E120B5D,
+	0x40111EB8,0x51EB851F, 0xBFED0E11,0x5B45F51B,
+	0x401128F5,0xC28F5C29, 0xBFED3005,0xEEC2DA6D,
+	0x40113333,0x33333333, 0xBFED513B,0x3A018A25,
+	0x40113D70,0xA3D70A3D, 0xBFED71B0,0x636066AD,
+	0x401147AE,0x147AE148, 0xBFED9164,0x9628F84B,
+	0x401151EB,0x851EB852, 0xBFEDB057,0x02955F22,
+	0x40115C28,0xF5C28F5C, 0xBFEDCE86,0xDDD5A4E3,
+	0x40116666,0x66666666, 0xBFEDEBF3,0x6214EDEA,
+	0x401170A3,0xD70A3D71, 0xBFEE089B,0xCE7E89BF,
+	0x40117AE1,0x47AE147B, 0xBFEE247F,0x6742E2C9,
+	0x4011851E,0xB851EB85, 0xBFEE3F9D,0x759C4D2E,
+	0x40118F5C,0x28F5C28F, 0xBFEE59F5,0x47D3B49C,
+	0x40119999,0x9999999A, 0xBFEE7386,0x314528EF,
+	0x4011A3D7,0x0A3D70A4, 0xBFEE8C4F,0x8A64499B,
+	0x4011AE14,0x7AE147AE, 0xBFEEA450,0xB0C08FB8,
+	0x4011B851,0xEB851EB8, 0xBFEEBB89,0x07097691,
+	0x4011C28F,0x5C28F5C3, 0xBFEED1F7,0xF5128298,
+	0x4011CCCC,0xCCCCCCCD, 0xBFEEE79C,0xE7D726A9,
+	0x4011D70A,0x3D70A3D7, 0xBFEEFC77,0x517E8793,
+	0x4011E147,0xAE147AE1, 0xBFEF1086,0xA95F1DA8,
+	0x4011EB85,0x1EB851EC, 0xBFEF23CA,0x6C023462,
+	0x4011F5C2,0x8F5C28F6, 0xBFEF3642,0x1B2747E8,
+	0x40120000,0x00000000, 0xBFEF47ED,0x3DC74080,
+	0x40120A3D,0x70A3D70A, 0xBFEF58CB,0x60178BB1,
+	0x4012147A,0xE147AE14, 0xBFEF68DC,0x138D1319,
+	0x40121EB8,0x51EB851F, 0xBFEF781E,0xEEDF10E9,
+	0x401228F5,0xC28F5C29, 0xBFEF8693,0x8E09C1D3,
+	0x40123333,0x33333333, 0xBFEF9439,0x9250F48D,
+	0x40123D70,0xA3D70A3D, 0xBFEFA110,0xA24276A3,
+	0x401247AE,0x147AE148, 0xBFEFAD18,0x69B85EA7,
+	0x401251EB,0x851EB852, 0xBFEFB850,0x99DB33A8,
+	0x40125C28,0xF5C28F5C, 0xBFEFC2B8,0xE923F1E9,
+	0x40126666,0x66666666, 0xBFEFCC51,0x135DECB9,
+	0x401270A3,0xD70A3D71, 0xBFEFD518,0xD9A88D75,
+	0x40127AE1,0x47AE147B, 0xBFEFDD10,0x0278EF91,
+	0x4012851E,0xB851EB85, 0xBFEFE436,0x599B59C0,
+	0x40128F5C,0x28F5C28F, 0xBFEFEA8B,0xB0349405,
+	0x40129999,0x9999999A, 0xBFEFF00F,0xDCC31ACE,
+	0x4012A3D7,0x0A3D70A4, 0xBFEFF4C2,0xBB202EEF,
+	0x4012AE14,0x7AE147AE, 0xBFEFF8A4,0x2C80C295,
+	0x4012B851,0xEB851EB8, 0xBFEFFBB4,0x17764310,
+	0x4012C28F,0x5C28F5C3, 0xBFEFFDF2,0x67EF3F7E,
+	0x4012CCCC,0xCCCCCCCD, 0xBFEFFF5F,0x0F37EC52,
+	0x4012D70A,0x3D70A3D7, 0xBFEFFFFA,0x03FA83AC,
+	0x4012E147,0xAE147AE1, 0xBFEFFFC3,0x423F8286,
+	0x4012EB85,0x1EB851EC, 0xBFEFFEBA,0xCB6DC2B5,
+	0x4012F5C2,0x8F5C28F6, 0xBFEFFCE0,0xA64A71BA,
+	0x40130000,0x00000000, 0xBFEFFA34,0xDEF8E460,
+	0x40130A3D,0x70A3D70A, 0xBFEFF6B7,0x86FA4733,
+	0x4013147A,0xE147AE14, 0xBFEFF268,0xB52D2BC8,
+	0x40131EB8,0x51EB851F, 0xBFEFED48,0x85CCF2DC,
+	0x401328F5,0xC28F5C29, 0xBFEFE757,0x1A71134F,
+	0x40133333,0x33333333, 0xBFEFE094,0x9A0C3E00,
+	0x40133D70,0xA3D70A3D, 0xBFEFD901,0x30EB5E8D,
+	0x401347AE,0x147AE148, 0xBFEFD09D,0x10B478FD,
+	0x401351EB,0x851EB852, 0xBFEFC768,0x70656469,
+	0x40135C28,0xF5C28F5C, 0xBFEFBD63,0x8C52628E,
+	0x40136666,0x66666666, 0xBFEFB28E,0xA6249473,
+	0x401370A3,0xD70A3D71, 0xBFEFA6EA,0x04D84C19,
+	0x40137AE1,0x47AE147B, 0xBFEF9A75,0xF4BB3B4A,
+	0x4013851E,0xB851EB85, 0xBFEF8D32,0xC76A7F82,
+	0x40138F5C,0x28F5C28F, 0xBFEF7F20,0xD3D08B19,
+	0x40139999,0x9999999A, 0xBFEF7040,0x7622EBA4,
+	0x4013A3D7,0x0A3D70A4, 0xBFEF6092,0x0FDFEDB0,
+	0x4013AE14,0x7AE147AE, 0xBFEF5016,0x07CC1DCA,
+	0x4013B851,0xEB851EB8, 0xBFEF3ECC,0xC9EFA709,
+	0x4013C28F,0x5C28F5C3, 0xBFEF2CB6,0xC7938F0C,
+	0x4013CCCC,0xCCCCCCCD, 0xBFEF19D4,0x773ECF93,
+	0x4013D70A,0x3D70A3D7, 0xBFEF0626,0x54B34DB1,
+	0x4013E147,0xAE147AE1, 0xBFEEF1AC,0xE0EAAEC8,
+	0x4013EB85,0x1EB851EC, 0xBFEEDC68,0xA2130B42,
+	0x4013F5C2,0x8F5C28F6, 0xBFEEC65A,0x238B7F41,
+	0x40140000,0x00000000, 0xBFEEAF81,0xF5E09933,
+	0x40140A3D,0x70A3D70A, 0xBFEE97E0,0xAEC8A688,
+	0x4014147A,0xE147AE14, 0xBFEE7F76,0xE91FDE8D,
+	0x40141EB8,0x51EB851F, 0xBFEE6645,0x44E46B89,
+	0x401428F5,0xC28F5C29, 0xBFEE4C4C,0x6732523C,
+	0x40143333,0x33333333, 0xBFEE318C,0xFA3F37C9,
+	0x40143D70,0xA3D70A3D, 0xBFEE1607,0xAD560644,
+	0x401447AE,0x147AE148, 0xBFEDF9BD,0x34D26FE0,
+	0x401451EB,0x851EB852, 0xBFEDDCAE,0x4A1C5102,
+	0x40145C28,0xF5C28F5C, 0xBFEDBEDB,0xABA2F11E,
+	0x40146666,0x66666666, 0xBFEDA046,0x1CD822BC,
+	0x401470A3,0xD70A3D71, 0xBFED80EE,0x662B4296,
+	0x40147AE1,0x47AE147B, 0xBFED60D5,0x5504161A,
+	0x4014851E,0xB851EB85, 0xBFED3FFB,0xBBBD8930,
+	0x40148F5C,0x28F5C28F, 0xBFED1E62,0x71A04BB4,
+	0x40149999,0x9999999A, 0xBFECFC0A,0x52DD4E96,
+	0x4014A3D7,0x0A3D70A4, 0xBFECD8F4,0x408820D8,
+	0x4014AE14,0x7AE147AE, 0xBFECB521,0x20912C71,
+	0x4014B851,0xEB851EB8, 0xBFEC9091,0xDDBFD36F,
+	0x4014C28F,0x5C28F5C3, 0xBFEC6B47,0x67AC6D4F,
+	0x4014CCCC,0xCCCCCCCD, 0xBFEC4542,0xB2BA24D7,
+	0x4014D70A,0x3D70A3D7, 0xBFEC1E84,0xB810B668,
+	0x4014E147,0xAE147AE1, 0xBFEBF70E,0x75960F2E,
+	0x4014EB85,0x1EB851EC, 0xBFEBCEE0,0xEDE7CD32,
+	0x4014F5C2,0x8F5C28F6, 0xBFEBA5FD,0x2854A088,
+	0x40150000,0x00000000, 0xBFEB7C64,0x30D58DA3,
+	0x40150A3D,0x70A3D70A, 0xBFEB5217,0x18071138,
+	0x4015147A,0xE147AE14, 0xBFEB2716,0xF32225A8,
+	0x40151EB8,0x51EB851F, 0xBFEAFB64,0xDBF52A31,
+	0x401528F5,0xC28F5C29, 0xBFEACF01,0xF0DCAC29,
+	0x40153333,0x33333333, 0xBFEAA1EF,0x54BC123B,
+	0x40153D70,0xA3D70A3D, 0xBFEA742E,0x2EF62A19,
+	0x401547AE,0x147AE148, 0xBFEA45BF,0xAB6598A1,
+	0x401551EB,0x851EB852, 0xBFEA16A4,0xFA552CD7,
+	0x40155C28,0xF5C28F5C, 0xBFE9E6DF,0x50781594,
+	0x40156666,0x66666666, 0xBFE9B66F,0xE6E1FA88,
+	0x401570A3,0xD70A3D71, 0xBFE98557,0xFAFEF867,
+	0x40157AE1,0x47AE147B, 0xBFE95398,0xCE8B80C9,
+	0x4015851E,0xB851EB85, 0xBFE92133,0xA78C1D7E,
+	0x40158F5C,0x28F5C28F, 0xBFE8EE29,0xD0451817,
+	0x40159999,0x9999999A, 0xBFE8BA7C,0x97320570,
+	0x4015A3D7,0x0A3D70A4, 0xBFE8862D,0x4EFD35B4,
+	0x4015AE14,0x7AE147AE, 0xBFE8513D,0x4E7708CC,
+	0x4015B851,0xEB851EB8, 0xBFE81BAD,0xF08D27D0,
+	0x4015C28F,0x5C28F5C3, 0xBFE7E580,0x9441A35C,
+	0x4015CCCC,0xCCCCCCCD, 0xBFE7AEB6,0x9CA1F74F,
+	0x4015D70A,0x3D70A3D7, 0xBFE77751,0x70BDF3CE,
+	0x4015E147,0xAE147AE1, 0xBFE73F52,0x7B9E8C3D,
+	0x4015EB85,0x1EB851EC, 0xBFE706BB,0x2C3C8C04,
+	0x4015F5C2,0x8F5C28F6, 0xBFE6CD8C,0xF57731B3,
+	0x40160000,0x00000000, 0xBFE693C9,0x4E0AB057,
+	0x40160A3D,0x70A3D70A, 0xBFE65971,0xB08697B7,
+	0x4016147A,0xE147AE14, 0xBFE61E87,0x9B442369,
+	0x40161EB8,0x51EB851F, 0xBFE5E30C,0x905C7109,
+	0x401628F5,0xC28F5C29, 0xBFE5A702,0x159E9E04,
+	0x40163333,0x33333333, 0xBFE56A69,0xB485CCD3,
+	0x40163D70,0xA3D70A3D, 0xBFE52D44,0xFA2F1262,
+	0x401647AE,0x147AE148, 0xBFE4EF95,0x774F4B7F,
+	0x401651EB,0x851EB852, 0xBFE4B15C,0xC028DAE9,
+	0x40165C28,0xF5C28F5C, 0xBFE4729C,0x6C814FD9,
+	0x40166666,0x66666666, 0xBFE43356,0x1796F5BB,
+	0x401670A3,0xD70A3D71, 0xBFE3F38B,0x60164D0B,
+	0x40167AE1,0x47AE147B, 0xBFE3B33D,0xE80F6DD8,
+	0x4016851E,0xB851EB85, 0xBFE3726F,0x54EB53D5,
+	0x40168F5C,0x28F5C28F, 0xBFE33121,0x4F6114B4,
+	0x40169999,0x9999999A, 0xBFE2EF55,0x836B00B5,
+	0x4016A3D7,0x0A3D70A4, 0xBFE2AD0D,0xA03BADFF,
+	0x4016AE14,0x7AE147AE, 0xBFE26A4B,0x5832EE95,
+	0x4016B851,0xEB851EB8, 0xBFE22710,0x60D2B1C0,
+	0x4016C28F,0x5C28F5C3, 0xBFE1E35E,0x72B3D0CB,
+	0x4016CCCC,0xCCCCCCCD, 0xBFE19F37,0x497AC7A0,
+	0x4016D70A,0x3D70A3D7, 0xBFE15A9C,0xA3CC5935,
+	0x4016E147,0xAE147AE1, 0xBFE11590,0x4342208A,
+	0x4016EB85,0x1EB851EC, 0xBFE0D013,0xEC5F0E27,
+	0x4016F5C2,0x8F5C28F6, 0xBFE08A29,0x6683D2A4,
+	0x40170000,0x00000000, 0xBFE043D2,0x7BE3362F,
+	0x40170A3D,0x70A3D70A, 0xBFDFFA21,0xF2ECBB9B,
+	0x4017147A,0xE147AE14, 0xBFDF6BCD,0x5DE1FCB6,
+	0x40171EB8,0x51EB851F, 0xBFDEDCAA,0xDD6AFB2F,
+	0x401728F5,0xC28F5C29, 0xBFDE4CBE,0x1B92039D,
+	0x40173333,0x33333333, 0xBFDDBC0A,0xC78EDFD8,
+	0x40173D70,0xA3D70A3D, 0xBFDD2A94,0x95AEB1CA,
+	0x401747AE,0x147AE148, 0xBFDC985F,0x3F3BAC93,
+	0x401751EB,0x851EB852, 0xBFDC056E,0x8264AD54,
+	0x40175C28,0xF5C28F5C, 0xBFDB71C6,0x2224B35F,
+	0x40176666,0x66666666, 0xBFDADD69,0xE62A3979,
+	0x401770A3,0xD70A3D71, 0xBFDA485D,0x9ABE7006,
+	0x40177AE1,0x47AE147B, 0xBFD9B2A5,0x10AC5952,
+	0x4017851E,0xB851EB85, 0xBFD91C44,0x1D27C7C9,
+	0x40178F5C,0x28F5C28F, 0xBFD8853E,0x99B43FD2,
+	0x40179999,0x9999999A, 0xBFD7ED98,0x640BBD1B,
+	0x4017A3D7,0x0A3D70A4, 0xBFD75555,0x5E055C97,
+	0x4017AE14,0x7AE147AE, 0xBFD6BC79,0x6D7BEAFC,
+	0x4017B851,0xEB851EB8, 0xBFD62308,0x7C345980,
+	0x4017C28F,0x5C28F5C3, 0xBFD58906,0x77C41896,
+	0x4017CCCC,0xCCCCCCCD, 0xBFD4EE77,0x51775A0A,
+	0x4017D70A,0x3D70A3D7, 0xBFD4535E,0xFE373A29,
+	0x4017E147,0xAE147AE1, 0xBFD3B7C1,0x766FD1D8,
+	0x4017EB85,0x1EB851EC, 0xBFD31BA2,0xB5F63148,
+	0x4017F5C2,0x8F5C28F6, 0xBFD27F06,0xBBEE44B0,
+	0x40180000,0x00000000, 0xBFD1E1F1,0x8AB0A2C0,
+	0x40180A3D,0x70A3D70A, 0xBFD14467,0x27B046A7,
+	0x4018147A,0xE147AE14, 0xBFD0A66B,0x9B60357B,
+	0x40181EB8,0x51EB851F, 0xBFD00802,0xF1190FF5,
+	0x401828F5,0xC28F5C29, 0xBFCED262,0x6DFD22FC,
+	0x40183333,0x33333333, 0xBFCD93F4,0xFBC9F8AA,
+	0x40183D70,0xA3D70A3D, 0xBFCC54C5,0xB26CE959,
+	0x401847AE,0x147AE148, 0xBFCB14DC,0xBDB094F6,
+	0x401851EB,0x851EB852, 0xBFC9D442,0x4E2066CE,
+	0x40185C28,0xF5C28F5C, 0xBFC892FE,0x98D2E904,
+	0x40186666,0x66666666, 0xBFC75119,0xD733FB7B,
+	0x401870A3,0xD70A3D71, 0xBFC60E9C,0x46CEED9F,
+	0x40187AE1,0x47AE147B, 0xBFC4CB8E,0x29187DE2,
+	0x4018851E,0xB851EB85, 0xBFC387F7,0xC338BE5F,
+	0x40188F5C,0x28F5C28F, 0xBFC243E1,0x5DD4E279,
+	0x40189999,0x9999999A, 0xBFC0FF53,0x44D8F4DA,
+	0x4018A3D7,0x0A3D70A4, 0xBFBF74AB,0x8E82F16F,
+	0x4018AE14,0x7AE147AE, 0xBFBCE9E2,0x6DC9EB9B,
+	0x4018B851,0xEB851EB8, 0xBFBA5E5B,0xD07AE5B3,
+	0x4018C28F,0x5C28F5C3, 0xBFB7D228,0x6463BC2E,
+	0x4018CCCC,0xCCCCCCCD, 0xBFB54558,0xDBBECD1D,
+	0x4018D70A,0x3D70A3D7, 0xBFB2B7FD,0xECC58B58,
+	0x4018E147,0xAE147AE1, 0xBFB02A28,0x5142F9F1,
+	0x4018EB85,0x1EB851EC, 0xBFAB37D1,0x8C4C1D8D,
+	0x4018F5C2,0x8F5C28F6, 0xBFA61AA0,0x1628040A,
+	0x40190000,0x00000000, 0xBFA0FCDD,0xC3F512BC,
+	0x40190A3D,0x70A3D70A, 0xBF97BD58,0x3A881B26,
+	0x4019147A,0xE147AE14, 0xBF8B00B2,0xB1FD4F19,
+	0x40191EB8,0x51EB851F, 0xBF6A180F,0xE0F0FDA7,
+	0x401928F5,0xC28F5C29, 0x3F7BE9AB,0x04151703,
+	0x40193333,0x33333333, 0x3F9137A9,0xC2CB3E7E,
+	};
+
+LOCAL_D const TUint32 CosineTest[] =
+	{
+	0x00000000,0x00000000, 0x3FF00000,0x00000000,
+	0x3F50624D,0xD2F1A9FC, 0x3FEFFFFE,0xF390876C,
+	0x3F60624D,0xD2F1A9FC, 0x3FEFFFFB,0xCE422F47,
+	0x3F689374,0xBC6A7EFA, 0x3FEFFFF6,0x90152C59,
+	0x3F70624D,0xD2F1A9FC, 0x3FEFFFEF,0x3909D697,
+	0x3F747AE1,0x47AE147B, 0x3FEFFFE5,0xC920A926,
+	0x3F789374,0xBC6A7EFA, 0x3FEFFFDA,0x405A425B,
+	0x3F7CAC08,0x3126E979, 0x3FEFFFCC,0x9EB763B9,
+	0x3F80624D,0xD2F1A9FC, 0x3FEFFFBC,0xE438F1F2,
+	0x3F826E97,0x8D4FDF3B, 0x3FEFFFAB,0x10DFF4E7,
+	0x3F847AE1,0x47AE147B, 0x3FEFFF97,0x24AD97AA,
+	0x3F86872B,0x020C49BA, 0x3FEFFF81,0x1FA32879,
+	0x3F889374,0xBC6A7EFA, 0x3FEFFF69,0x01C218C1,
+	0x3F8A9FBE,0x76C8B439, 0x3FEFFF4E,0xCB0BFD20,
+	0x3F8CAC08,0x3126E979, 0x3FEFFF32,0x7B828D61,
+	0x3F8EB851,0xEB851EB8, 0x3FEFFF14,0x1327A47C,
+	0x3F90624D,0xD2F1A9FC, 0x3FEFFEF3,0x91FD409A,
+	0x3F916872,0xB020C49C, 0x3FEFFED0,0xF8058311,
+	0x3F926E97,0x8D4FDF3B, 0x3FEFFEAC,0x4542B064,
+	0x3F9374BC,0x6A7EF9DB, 0x3FEFFE85,0x79B73046,
+	0x3F947AE1,0x47AE147B, 0x3FEFFE5C,0x95658D96,
+	0x3F958106,0x24DD2F1B, 0x3FEFFE31,0x98507662,
+	0x3F96872B,0x020C49BA, 0x3FEFFE04,0x827ABBE4,
+	0x3F978D4F,0xDF3B645A, 0x3FEFFDD5,0x53E75284,
+	0x3F989374,0xBC6A7EFA, 0x3FEFFDA4,0x0C9951D6,
+	0x3F999999,0x9999999A, 0x3FEFFD70,0xAC93F49E,
+	0x3F9A9FBE,0x76C8B439, 0x3FEFFD3B,0x33DA98C8,
+	0x3F9BA5E3,0x53F7CED9, 0x3FEFFD03,0xA270BF6F,
+	0x3F9CAC08,0x3126E979, 0x3FEFFCC9,0xF85A0CDB,
+	0x3F9DB22D,0x0E560419, 0x3FEFFC8E,0x359A487E,
+	0x3F9EB851,0xEB851EB8, 0x3FEFFC50,0x5A355CF6,
+	0x3F9FBE76,0xC8B43958, 0x3FEFFC10,0x662F580D,
+	0x3FA0624D,0xD2F1A9FC, 0x3FEFFBCE,0x598C6AB9,
+	0x3FA0E560,0x4189374C, 0x3FEFFB8A,0x3450E918,
+	0x3FA16872,0xB020C49C, 0x3FEFFB43,0xF6814A76,
+	0x3FA1EB85,0x1EB851EC, 0x3FEFFAFB,0xA0222947,
+	0x3FA26E97,0x8D4FDF3B, 0x3FEFFAB1,0x3138432A,
+	0x3FA2F1A9,0xFBE76C8B, 0x3FEFFA64,0xA9C878E6,
+	0x3FA374BC,0x6A7EF9DB, 0x3FEFFA16,0x09D7CE6F,
+	0x3FA3F7CE,0xD916872B, 0x3FEFF9C5,0x516B6ADF,
+	0x3FA47AE1,0x47AE147B, 0x3FEFF972,0x80889878,
+	0x3FA4FDF3,0xB645A1CB, 0x3FEFF91D,0x9734C4A8,
+	0x3FA58106,0x24DD2F1B, 0x3FEFF8C6,0x95758001,
+	0x3FA60418,0x9374BC6A, 0x3FEFF86D,0x7B507E3F,
+	0x3FA6872B,0x020C49BA, 0x3FEFF812,0x48CB9646,
+	0x3FA70A3D,0x70A3D70A, 0x3FEFF7B4,0xFDECC21E,
+	0x3FA78D4F,0xDF3B645A, 0x3FEFF755,0x9ABA1EF7,
+	0x3FA81062,0x4DD2F1AA, 0x3FEFF6F4,0x1F39ED28,
+	0x3FA89374,0xBC6A7EFA, 0x3FEFF690,0x8B72902C,
+	0x3FA91687,0x2B020C4A, 0x3FEFF62A,0xDF6A8EA5,
+	0x3FA99999,0x9999999A, 0x3FEFF5C3,0x1B289258,
+	0x3FAA1CAC,0x083126E9, 0x3FEFF559,0x3EB3682F,
+	0x3FAA9FBE,0x76C8B439, 0x3FEFF4ED,0x4A12003A,
+	0x3FAB22D0,0xE5604189, 0x3FEFF47F,0x3D4B6DA8,
+	0x3FABA5E3,0x53F7CED9, 0x3FEFF40F,0x1866E6D0,
+	0x3FAC28F5,0xC28F5C29, 0x3FEFF39C,0xDB6BC529,
+	0x3FACAC08,0x3126E979, 0x3FEFF328,0x8661854B,
+	0x3FAD2F1A,0x9FBE76C9, 0x3FEFF2B2,0x194FC6F1,
+	0x3FADB22D,0x0E560419, 0x3FEFF239,0x943E4CF8,
+	0x3FAE353F,0x7CED9168, 0x3FEFF1BE,0xF734FD5D,
+	0x3FAEB851,0xEB851EB8, 0x3FEFF142,0x423BE13B,
+	0x3FAF3B64,0x5A1CAC08, 0x3FEFF0C3,0x755B24CF,
+	0x3FAFBE76,0xC8B43958, 0x3FEFF042,0x909B1774,
+	0x3FB020C4,0x9BA5E354, 0x3FEFEFBF,0x94042BA3,
+	0x3FB0624D,0xD2F1A9FC, 0x3FEFEF3A,0x7F9EF6F5,
+	0x3FB0A3D7,0x0A3D70A4, 0x3FEFEEB3,0x5374321D,
+	0x3FB0E560,0x4189374C, 0x3FEFEE2A,0x0F8CB8ED,
+	0x3FB126E9,0x78D4FDF4, 0x3FEFED9E,0xB3F18A54,
+	0x3FB16872,0xB020C49C, 0x3FEFED11,0x40ABC85A,
+	0x3FB1A9FB,0xE76C8B44, 0x3FEFEC81,0xB5C4B823,
+	0x3FB1EB85,0x1EB851EC, 0x3FEFEBF0,0x1345C1EF,
+	0x3FB22D0E,0x56041893, 0x3FEFEB5C,0x59387115,
+	0x3FB26E97,0x8D4FDF3B, 0x3FEFEAC6,0x87A67408,
+	0x3FB2B020,0xC49BA5E3, 0x3FEFEA2E,0x9E999C51,
+	0x3FB2F1A9,0xFBE76C8B, 0x3FEFE994,0x9E1BDE93,
+	0x3FB33333,0x33333333, 0x3FEFE8F8,0x86375286,
+	0x3FB374BC,0x6A7EF9DB, 0x3FEFE85A,0x56F632FA,
+	0x3FB3B645,0xA1CAC083, 0x3FEFE7BA,0x1062DDD4,
+	0x3FB3F7CE,0xD916872B, 0x3FEFE717,0xB287D411,
+	0x3FB43958,0x10624DD3, 0x3FEFE673,0x3D6FB9BE,
+	0x3FB47AE1,0x47AE147B, 0x3FEFE5CC,0xB12555FF,
+	0x3FB4BC6A,0x7EF9DB23, 0x3FEFE524,0x0DB39309,
+	0x3FB4FDF3,0xB645A1CB, 0x3FEFE479,0x53257E27,
+	0x3FB53F7C,0xED916873, 0x3FEFE3CC,0x818647B2,
+	0x3FB58106,0x24DD2F1B, 0x3FEFE31D,0x98E14314,
+	0x3FB5C28F,0x5C28F5C3, 0x3FEFE26C,0x9941E6CA,
+	0x3FB60418,0x9374BC6A, 0x3FEFE1B9,0x82B3CC5F,
+	0x3FB645A1,0xCAC08312, 0x3FEFE104,0x5542B06B,
+	0x3FB6872B,0x020C49BA, 0x3FEFE04D,0x10FA7296,
+	0x3FB6C8B4,0x39581062, 0x3FEFDF93,0xB5E71595,
+	0x3FB70A3D,0x70A3D70A, 0x3FEFDED8,0x4414BF29,
+	0x3FB74BC6,0xA7EF9DB2, 0x3FEFDE1A,0xBB8FB81D,
+	0x3FB78D4F,0xDF3B645A, 0x3FEFDD5B,0x1C646C4A,
+	0x3FB7CED9,0x16872B02, 0x3FEFDC99,0x669F6A90,
+	0x3FB81062,0x4DD2F1AA, 0x3FEFDBD5,0x9A4D64DA,
+	0x3FB851EB,0x851EB852, 0x3FEFDB0F,0xB77B301A,
+	0x3FB89374,0xBC6A7EFA, 0x3FEFDA47,0xBE35C449,
+	0x3FB8D4FD,0xF3B645A2, 0x3FEFD97D,0xAE8A3C69,
+	0x3FB91687,0x2B020C4A, 0x3FEFD8B1,0x8885D67F,
+	0x3FB95810,0x624DD2F2, 0x3FEFD7E3,0x4C35F398,
+	0x3FB99999,0x9999999A, 0x3FEFD712,0xF9A817C1,
+	0x3FB9DB22,0xD0E56042, 0x3FEFD640,0x90E9EA0C,
+	0x3FBA1CAC,0x083126E9, 0x3FEFD56C,0x1209348F,
+	0x3FBA5E35,0x3F7CED91, 0x3FEFD495,0x7D13E45F,
+	0x3FBA9FBE,0x76C8B439, 0x3FEFD3BC,0xD2180992,
+	0x3FBAE147,0xAE147AE1, 0x3FEFD2E2,0x1123D73D,
+	0x3FBB22D0,0xE5604189, 0x3FEFD205,0x3A45A375,
+	0x3FBB645A,0x1CAC0831, 0x3FEFD126,0x4D8BE74B,
+	0x3FBBA5E3,0x53F7CED9, 0x3FEFD045,0x4B053ECD,
+	0x3FBBE76C,0x8B439581, 0x3FEFCF62,0x32C06905,
+	0x3FBC28F5,0xC28F5C29, 0x3FEFCE7D,0x04CC47F8,
+	0x3FBC6A7E,0xF9DB22D1, 0x3FEFCD95,0xC137E0A5,
+	0x3FBCAC08,0x3126E979, 0x3FEFCCAC,0x68125B02,
+	0x3FBCED91,0x6872B021, 0x3FEFCBC0,0xF96B01FE,
+	0x3FBD2F1A,0x9FBE76C9, 0x3FEFCAD3,0x7551437F,
+	0x3FBD70A3,0xD70A3D71, 0x3FEFC9E3,0xDBD4B061,
+	0x3FBDB22D,0x0E560419, 0x3FEFC8F2,0x2D04FC74,
+	0x3FBDF3B6,0x45A1CAC1, 0x3FEFC7FE,0x68F1FE7B,
+	0x3FBE353F,0x7CED9168, 0x3FEFC708,0x8FABB02E,
+	0x3FBE76C8,0xB4395810, 0x3FEFC610,0xA1422E33,
+	0x3FBEB851,0xEB851EB8, 0x3FEFC516,0x9DC5B825,
+	0x3FBEF9DB,0x22D0E560, 0x3FEFC41A,0x8546B08B,
+	0x3FBF3B64,0x5A1CAC08, 0x3FEFC31C,0x57D59CDC,
+	0x3FBF7CED,0x916872B0, 0x3FEFC21C,0x1583257B,
+	0x3FBFBE76,0xC8B43958, 0x3FEFC119,0xBE6015BA,
+	0x3FC00000,0x00000000, 0x3FEFC015,0x527D5BD3,
+	0x3FC020C4,0x9BA5E354, 0x3FEFBF0E,0xD1EC08ED,
+	0x3FC04189,0x374BC6A8, 0x3FEFBE06,0x3CBD5114,
+	0x3FC0624D,0xD2F1A9FC, 0x3FEFBCFB,0x93028B40,
+	0x3FC08312,0x6E978D50, 0x3FEFBBEE,0xD4CD314D,
+	0x3FC0A3D7,0x0A3D70A4, 0x3FEFBAE0,0x022EDFFE,
+	0x3FC0C49B,0xA5E353F8, 0x3FEFB9CF,0x1B3956F8,
+	0x3FC0E560,0x4189374C, 0x3FEFB8BC,0x1FFE78C7,
+	0x3FC10624,0xDD2F1AA0, 0x3FEFB7A7,0x10904AD6,
+	0x3FC126E9,0x78D4FDF4, 0x3FEFB68F,0xED00F571,
+	0x3FC147AE,0x147AE148, 0x3FEFB576,0xB562C3C5,
+	0x3FC16872,0xB020C49C, 0x3FEFB45B,0x69C823DD,
+	0x3FC18937,0x4BC6A7F0, 0x3FEFB33E,0x0A43A6A1,
+	0x3FC1A9FB,0xE76C8B44, 0x3FEFB21E,0x96E7FFD5,
+	0x3FC1CAC0,0x83126E98, 0x3FEFB0FD,0x0FC80618,
+	0x3FC1EB85,0x1EB851EC, 0x3FEFAFD9,0x74F6B2E2,
+	0x3FC20C49,0xBA5E353F, 0x3FEFAEB3,0xC6872285,
+	0x3FC22D0E,0x56041893, 0x3FEFAD8C,0x048C9427,
+	0x3FC24DD2,0xF1A9FBE7, 0x3FEFAC62,0x2F1A69C7,
+	0x3FC26E97,0x8D4FDF3B, 0x3FEFAB36,0x46442837,
+	0x3FC28F5C,0x28F5C28F, 0x3FEFAA08,0x4A1D771C,
+	0x3FC2B020,0xC49BA5E3, 0x3FEFA8D8,0x3ABA20EE,
+	0x3FC2D0E5,0x60418937, 0x3FEFA7A6,0x182E12F5,
+	0x3FC2F1A9,0xFBE76C8B, 0x3FEFA671,0xE28D5D49,
+	0x3FC3126E,0x978D4FDF, 0x3FEFA53B,0x99EC32CE,
+	0x3FC33333,0x33333333, 0x3FEFA403,0x3E5EE937,
+	0x3FC353F7,0xCED91687, 0x3FEFA2C8,0xCFF9F903,
+	0x3FC374BC,0x6A7EF9DB, 0x3FEFA18C,0x4ED1FD78,
+	0x3FC39581,0x0624DD2F, 0x3FEFA04D,0xBAFBB4A7,
+	0x3FC3B645,0xA1CAC083, 0x3FEF9F0D,0x148BFF67,
+	0x3FC3D70A,0x3D70A3D7, 0x3FEF9DCA,0x5B97E158,
+	0x3FC3F7CE,0xD916872B, 0x3FEF9C85,0x903480DA,
+	0x3FC41893,0x74BC6A7F, 0x3FEF9B3E,0xB2772714,
+	0x3FC43958,0x10624DD3, 0x3FEF99F5,0xC2753FED,
+	0x3FC45A1C,0xAC083127, 0x3FEF98AA,0xC0445A0C,
+	0x3FC47AE1,0x47AE147B, 0x3FEF975D,0xABFA26D9,
+	0x3FC49BA5,0xE353F7CF, 0x3FEF960E,0x85AC7A78,
+	0x3FC4BC6A,0x7EF9DB23, 0x3FEF94BD,0x4D714BC9,
+	0x3FC4DD2F,0x1A9FBE77, 0x3FEF936A,0x035EB469,
+	0x3FC4FDF3,0xB645A1CB, 0x3FEF9214,0xA78AF0AA,
+	0x3FC51EB8,0x51EB851F, 0x3FEF90BD,0x3A0C5F9A,
+	0x3FC53F7C,0xED916873, 0x3FEF8F63,0xBAF982FB,
+	0x3FC56041,0x89374BC7, 0x3FEF8E08,0x2A68FF45,
+	0x3FC58106,0x24DD2F1B, 0x3FEF8CAA,0x88719BA3,
+	0x3FC5A1CA,0xC083126F, 0x3FEF8B4A,0xD52A41F1,
+	0x3FC5C28F,0x5C28F5C3, 0x3FEF89E9,0x10A9FEBE,
+	0x3FC5E353,0xF7CED917, 0x3FEF8885,0x3B080143,
+	0x3FC60418,0x9374BC6A, 0x3FEF871F,0x545B9B6C,
+	0x3FC624DD,0x2F1A9FBE, 0x3FEF85B7,0x5CBC41CE,
+	0x3FC645A1,0xCAC08312, 0x3FEF844D,0x54418BA7,
+	0x3FC66666,0x66666666, 0x3FEF82E1,0x3B0332E1,
+	0x3FC6872B,0x020C49BA, 0x3FEF8173,0x1119140B,
+	0x3FC6A7EF,0x9DB22D0E, 0x3FEF8002,0xD69B2E59,
+	0x3FC6C8B4,0x39581062, 0x3FEF7E90,0x8BA1A3A6,
+	0x3FC6E978,0xD4FDF3B6, 0x3FEF7D1C,0x3044B86C,
+	0x3FC70A3D,0x70A3D70A, 0x3FEF7BA5,0xC49CD3C9,
+	0x3FC72B02,0x0C49BA5E, 0x3FEF7A2D,0x48C27F77,
+	0x3FC74BC6,0xA7EF9DB2, 0x3FEF78B2,0xBCCE67D1,
+	0x3FC76C8B,0x43958106, 0x3FEF7736,0x20D95BCC,
+	0x3FC78D4F,0xDF3B645A, 0x3FEF75B7,0x74FC4CF8,
+	0x3FC7AE14,0x7AE147AE, 0x3FEF7436,0xB9504F7E,
+	0x3FC7CED9,0x16872B02, 0x3FEF72B3,0xEDEE9A1D,
+	0x3FC7EF9D,0xB22D0E56, 0x3FEF712F,0x12F0862C,
+	0x3FC81062,0x4DD2F1AA, 0x3FEF6FA8,0x286F8F92,
+	0x3FC83126,0xE978D4FE, 0x3FEF6E1F,0x2E8554CD,
+	0x3FC851EB,0x851EB852, 0x3FEF6C94,0x254B96E7,
+	0x3FC872B0,0x20C49BA6, 0x3FEF6B07,0x0CDC397C,
+	0x3FC89374,0xBC6A7EFA, 0x3FEF6977,0xE55142B2,
+	0x3FC8B439,0x5810624E, 0x3FEF67E6,0xAEC4DB3F,
+	0x3FC8D4FD,0xF3B645A2, 0x3FEF6653,0x69514E5D,
+	0x3FC8F5C2,0x8F5C28F6, 0x3FEF64BE,0x151109D3,
+	0x3FC91687,0x2B020C4A, 0x3FEF6326,0xB21E9DEB,
+	0x3FC9374B,0xC6A7EF9E, 0x3FEF618D,0x4094BD75,
+	0x3FC95810,0x624DD2F2, 0x3FEF5FF1,0xC08E3DC4,
+	0x3FC978D4,0xFDF3B646, 0x3FEF5E54,0x322616AA,
+	0x3FC99999,0x9999999A, 0x3FEF5CB4,0x9577627A,
+	0x3FC9BA5E,0x353F7CEE, 0x3FEF5B12,0xEA9D5E04,
+	0x3FC9DB22,0xD0E56042, 0x3FEF596F,0x31B36894,
+	0x3FC9FBE7,0x6C8B4396, 0x3FEF57C9,0x6AD503EF,
+	0x3FCA1CAC,0x083126E9, 0x3FEF5621,0x961DD453,
+	0x3FCA3D70,0xA3D70A3D, 0x3FEF5477,0xB3A9A074,
+	0x3FCA5E35,0x3F7CED91, 0x3FEF52CB,0xC3945179,
+	0x3FCA7EF9,0xDB22D0E5, 0x3FEF511D,0xC5F9F2FE,
+	0x3FCA9FBE,0x76C8B439, 0x3FEF4F6D,0xBAF6B30E,
+	0x3FCAC083,0x126E978D, 0x3FEF4DBB,0xA2A6E224,
+	0x3FCAE147,0xAE147AE1, 0x3FEF4C07,0x7D26F327,
+	0x3FCB020C,0x49BA5E35, 0x3FEF4A51,0x4A937B6A,
+	0x3FCB22D0,0xE5604189, 0x3FEF4899,0x0B0932A8,
+	0x3FCB4395,0x810624DD, 0x3FEF46DE,0xBEA4F306,
+	0x3FCB645A,0x1CAC0831, 0x3FEF4522,0x6583B90D,
+	0x3FCB851E,0xB851EB85, 0x3FEF4363,0xFFC2A3A8,
+	0x3FCBA5E3,0x53F7CED9, 0x3FEF41A3,0x8D7EF428,
+	0x3FCBC6A7,0xEF9DB22D, 0x3FEF3FE1,0x0ED60E39,
+	0x3FCBE76C,0x8B439581, 0x3FEF3E1C,0x83E577E7,
+	0x3FCC0831,0x26E978D5, 0x3FEF3C55,0xECCAD99C,
+	0x3FCC28F5,0xC28F5C29, 0x3FEF3A8D,0x49A3FE19,
+	0x3FCC49BA,0x5E353F7D, 0x3FEF38C2,0x9A8ED278,
+	0x3FCC6A7E,0xF9DB22D1, 0x3FEF36F5,0xDFA96629,
+	0x3FCC8B43,0x95810625, 0x3FEF3527,0x1911EAF1,
+	0x3FCCAC08,0x3126E979, 0x3FEF3356,0x46E6B4E7,
+	0x3FCCCCCC,0xCCCCCCCD, 0x3FEF3183,0x69463A71,
+	0x3FCCED91,0x6872B021, 0x3FEF2FAE,0x804F1443,
+	0x3FCD0E56,0x04189375, 0x3FEF2DD7,0x8C1FFD60,
+	0x3FCD2F1A,0x9FBE76C9, 0x3FEF2BFE,0x8CD7D312,
+	0x3FCD4FDF,0x3B645A1D, 0x3FEF2A23,0x829594EC,
+	0x3FCD70A3,0xD70A3D71, 0x3FEF2846,0x6D7864C9,
+	0x3FCD9168,0x72B020C5, 0x3FEF2667,0x4D9F86C4,
+	0x3FCDB22D,0x0E560419, 0x3FEF2486,0x232A613F,
+	0x3FCDD2F1,0xA9FBE76D, 0x3FEF22A2,0xEE387CD7,
+	0x3FCDF3B6,0x45A1CAC1, 0x3FEF20BD,0xAEE9846C,
+	0x3FCE147A,0xE147AE14, 0x3FEF1ED6,0x655D4515,
+	0x3FCE353F,0x7CED9168, 0x3FEF1CED,0x11B3AE25,
+	0x3FCE5604,0x189374BC, 0x3FEF1B01,0xB40CD128,
+	0x3FCE76C8,0xB4395810, 0x3FEF1914,0x4C88E1DC,
+	0x3FCE978D,0x4FDF3B64, 0x3FEF1724,0xDB483636,
+	0x3FCEB851,0xEB851EB8, 0x3FEF1533,0x606B465A,
+	0x3FCED916,0x872B020C, 0x3FEF133F,0xDC12AC9B,
+	0x3FCEF9DB,0x22D0E560, 0x3FEF114A,0x4E5F257C,
+	0x3FCF1A9F,0xBE76C8B4, 0x3FEF0F52,0xB7718FA7,
+	0x3FCF3B64,0x5A1CAC08, 0x3FEF0D59,0x176AEBF1,
+	0x3FCF5C28,0xF5C28F5C, 0x3FEF0B5D,0x6E6C5D55,
+	0x3FCF7CED,0x916872B0, 0x3FEF095F,0xBC9728F3,
+	0x3FCF9DB2,0x2D0E5604, 0x3FEF0760,0x020CB60C,
+	0x3FCFBE76,0xC8B43958, 0x3FEF055E,0x3EEE8E03,
+	0x3FCFDF3B,0x645A1CAC, 0x3FEF035A,0x735E5C56,
+	0x3FD00000,0x00000000, 0x3FEF0154,0x9F7DEEA1,
+	0x3FD01062,0x4DD2F1AA, 0x3FEEFF4C,0xC36F3499,
+	0x3FD020C4,0x9BA5E354, 0x3FEEFD42,0xDF544009,
+	0x3FD03126,0xE978D4FE, 0x3FEEFB36,0xF34F44D2,
+	0x3FD04189,0x374BC6A8, 0x3FEEF928,0xFF8298E8,
+	0x3FD051EB,0x851EB852, 0x3FEEF719,0x0410B44E,
+	0x3FD0624D,0xD2F1A9FC, 0x3FEEF507,0x011C3117,
+	0x3FD072B0,0x20C49BA6, 0x3FEEF2F2,0xF6C7CB60,
+	0x3FD08312,0x6E978D50, 0x3FEEF0DC,0xE5366151,
+	0x3FD09374,0xBC6A7EFA, 0x3FEEEEC4,0xCC8AF31A,
+	0x3FD0A3D7,0x0A3D70A4, 0x3FEEECAA,0xACE8A2EF,
+	0x3FD0B439,0x5810624E, 0x3FEEEA8E,0x8672B506,
+	0x3FD0C49B,0xA5E353F8, 0x3FEEE870,0x594C8F97,
+	0x3FD0D4FD,0xF3B645A2, 0x3FEEE650,0x2599BAD8,
+	0x3FD0E560,0x4189374C, 0x3FEEE42D,0xEB7DE0F9,
+	0x3FD0F5C2,0x8F5C28F6, 0x3FEEE209,0xAB1CCE26,
+	0x3FD10624,0xDD2F1AA0, 0x3FEEDFE3,0x649A7081,
+	0x3FD11687,0x2B020C4A, 0x3FEEDDBB,0x181AD820,
+	0x3FD126E9,0x78D4FDF4, 0x3FEEDB90,0xC5C2370D,
+	0x3FD1374B,0xC6A7EF9E, 0x3FEED964,0x6DB4E141,
+	0x3FD147AE,0x147AE148, 0x3FEED736,0x10174CA3,
+	0x3FD15810,0x624DD2F2, 0x3FEED505,0xAD0E1104,
+	0x3FD16872,0xB020C49C, 0x3FEED2D3,0x44BDE821,
+	0x3FD178D4,0xFDF3B646, 0x3FEED09E,0xD74BAD9A,
+	0x3FD18937,0x4BC6A7F0, 0x3FEECE68,0x64DC5EF5,
+	0x3FD19999,0x9999999A, 0x3FEECC2F,0xED951B99,
+	0x3FD1A9FB,0xE76C8B44, 0x3FEEC9F5,0x719B24CC,
+	0x3FD1BA5E,0x353F7CEE, 0x3FEEC7B8,0xF113DDB3,
+	0x3FD1CAC0,0x83126E98, 0x3FEEC57A,0x6C24CB49,
+	0x3FD1DB22,0xD0E56042, 0x3FEEC339,0xE2F39465,
+	0x3FD1EB85,0x1EB851EC, 0x3FEEC0F7,0x55A601B1,
+	0x3FD1FBE7,0x6C8B4396, 0x3FEEBEB2,0xC461FDAB,
+	0x3FD20C49,0xBA5E353F, 0x3FEEBC6C,0x2F4D94A1,
+	0x3FD21CAC,0x083126E9, 0x3FEEBA23,0x968EF4AE,
+	0x3FD22D0E,0x56041893, 0x3FEEB7D8,0xFA4C6DB9,
+	0x3FD23D70,0xA3D70A3D, 0x3FEEB58C,0x5AAC7174,
+	0x3FD24DD2,0xF1A9FBE7, 0x3FEEB33D,0xB7D59355,
+	0x3FD25E35,0x3F7CED91, 0x3FEEB0ED,0x11EE8895,
+	0x3FD26E97,0x8D4FDF3B, 0x3FEEAE9A,0x691E2832,
+	0x3FD27EF9,0xDB22D0E5, 0x3FEEAC45,0xBD8B6AE5,
+	0x3FD28F5C,0x28F5C28F, 0x3FEEA9EF,0x0F5D6B26,
+	0x3FD29FBE,0x76C8B439, 0x3FEEA796,0x5EBB6524,
+	0x3FD2B020,0xC49BA5E3, 0x3FEEA53B,0xABCCB6C8,
+	0x3FD2C083,0x126E978D, 0x3FEEA2DE,0xF6B8DFAE,
+	0x3FD2D0E5,0x60418937, 0x3FEEA080,0x3FA78123,
+	0x3FD2E147,0xAE147AE1, 0x3FEE9E1F,0x86C05E25,
+	0x3FD2F1A9,0xFBE76C8B, 0x3FEE9BBC,0xCC2B5B5E,
+	0x3FD3020C,0x49BA5E35, 0x3FEE9958,0x10107F22,
+	0x3FD3126E,0x978D4FDF, 0x3FEE96F1,0x5297F16D,
+	0x3FD322D0,0xE5604189, 0x3FEE9488,0x93E9FBDF,
+	0x3FD33333,0x33333333, 0x3FEE921D,0xD42F09BA,
+	0x3FD34395,0x810624DD, 0x3FEE8FB1,0x138FA7E2,
+	0x3FD353F7,0xCED91687, 0x3FEE8D42,0x523484D6,
+	0x3FD3645A,0x1CAC0831, 0x3FEE8AD1,0x904670AE,
+	0x3FD374BC,0x6A7EF9DB, 0x3FEE885E,0xCDEE5D1C,
+	0x3FD3851E,0xB851EB85, 0x3FEE85EA,0x0B555D66,
+	0x3FD39581,0x0624DD2F, 0x3FEE8373,0x48A4A663,
+	0x3FD3A5E3,0x53F7CED9, 0x3FEE80FA,0x86058E7B,
+	0x3FD3B645,0xA1CAC083, 0x3FEE7E7F,0xC3A18DA3,
+	0x3FD3C6A7,0xEF9DB22D, 0x3FEE7C03,0x01A23D59,
+	0x3FD3D70A,0x3D70A3D7, 0x3FEE7984,0x403158A2,
+	0x3FD3E76C,0x8B439581, 0x3FEE7703,0x7F78BC09,
+	0x3FD3F7CE,0xD916872B, 0x3FEE7480,0xBFA2659B,
+	0x3FD40831,0x26E978D5, 0x3FEE71FC,0x00D874E1,
+	0x3FD41893,0x74BC6A7F, 0x3FEE6F75,0x43452AE5,
+	0x3FD428F5,0xC28F5C29, 0x3FEE6CEC,0x8712EA26,
+	0x3FD43958,0x10624DD3, 0x3FEE6A61,0xCC6C369E,
+	0x3FD449BA,0x5E353F7D, 0x3FEE67D5,0x137BB5B8,
+	0x3FD45A1C,0xAC083127, 0x3FEE6546,0x5C6C2E51,
+	0x3FD46A7E,0xF9DB22D1, 0x3FEE62B5,0xA76888B5,
+	0x3FD47AE1,0x47AE147B, 0x3FEE6022,0xF49BCE9B,
+	0x3FD48B43,0x95810625, 0x3FEE5D8E,0x44312B24,
+	0x3FD49BA5,0xE353F7CF, 0x3FEE5AF7,0x9653EAD4,
+	0x3FD4AC08,0x3126E979, 0x3FEE585E,0xEB2F7B96,
+	0x3FD4BC6A,0x7EF9DB23, 0x3FEE55C4,0x42EF6CB2,
+	0x3FD4CCCC,0xCCCCCCCD, 0x3FEE5327,0x9DBF6ED0,
+	0x3FD4DD2F,0x1A9FBE77, 0x3FEE5088,0xFBCB53F0,
+	0x3FD4ED91,0x6872B021, 0x3FEE4DE8,0x5D3F0F6C,
+	0x3FD4FDF3,0xB645A1CB, 0x3FEE4B45,0xC246B5F1,
+	0x3FD50E56,0x04189375, 0x3FEE48A1,0x2B0E7D7F,
+	0x3FD51EB8,0x51EB851F, 0x3FEE45FA,0x97C2BD65,
+	0x3FD52F1A,0x9FBE76C9, 0x3FEE4352,0x088FEE3D,
+	0x3FD53F7C,0xED916873, 0x3FEE40A7,0x7DA2A9EC,
+	0x3FD54FDF,0x3B645A1D, 0x3FEE3DFA,0xF727AB9B,
+	0x3FD56041,0x89374BC7, 0x3FEE3B4C,0x754BCFB9,
+	0x3FD570A3,0xD70A3D71, 0x3FEE389B,0xF83C13F4,
+	0x3FD58106,0x24DD2F1B, 0x3FEE35E9,0x80259736,
+	0x3FD59168,0x72B020C5, 0x3FEE3335,0x0D3599A5,
+	0x3FD5A1CA,0xC083126F, 0x3FEE307E,0x9F997CA0,
+	0x3FD5B22D,0x0E560419, 0x3FEE2DC6,0x377EC2B8,
+	0x3FD5C28F,0x5C28F5C3, 0x3FEE2B0B,0xD5130FB1,
+	0x3FD5D2F1,0xA9FBE76D, 0x3FEE284F,0x7884287D,
+	0x3FD5E353,0xF7CED917, 0x3FEE2591,0x21FFF339,
+	0x3FD5F3B6,0x45A1CAC1, 0x3FEE22D0,0xD1B4772D,
+	0x3FD60418,0x9374BC6A, 0x3FEE200E,0x87CFDCC3,
+	0x3FD6147A,0xE147AE14, 0x3FEE1D4A,0x44806D8A,
+	0x3FD624DD,0x2F1A9FBE, 0x3FEE1A84,0x07F49430,
+	0x3FD6353F,0x7CED9168, 0x3FEE17BB,0xD25ADC7F,
+	0x3FD645A1,0xCAC08312, 0x3FEE14F1,0xA3E1F35C,
+	0x3FD65604,0x189374BC, 0x3FEE1225,0x7CB8A6BF,
+	0x3FD66666,0x66666666, 0x3FEE0F57,0x5D0DE5B7,
+	0x3FD676C8,0xB4395810, 0x3FEE0C87,0x4510C061,
+	0x3FD6872B,0x020C49BA, 0x3FEE09B5,0x34F067E8,
+	0x3FD6978D,0x4FDF3B64, 0x3FEE06E1,0x2CDC2E80,
+	0x3FD6A7EF,0x9DB22D0E, 0x3FEE040B,0x2D038765,
+	0x3FD6B851,0xEB851EB8, 0x3FEE0133,0x359606D7,
+	0x3FD6C8B4,0x39581062, 0x3FEDFE59,0x46C36215,
+	0x3FD6D916,0x872B020C, 0x3FEDFB7D,0x60BB6F5D,
+	0x3FD6E978,0xD4FDF3B6, 0x3FEDF89F,0x83AE25E7,
+	0x3FD6F9DB,0x22D0E560, 0x3FEDF5BF,0xAFCB9DE3,
+	0x3FD70A3D,0x70A3D70A, 0x3FEDF2DD,0xE5441074,
+	0x3FD71A9F,0xBE76C8B4, 0x3FEDEFFA,0x2447D7B0,
+	0x3FD72B02,0x0C49BA5E, 0x3FEDED14,0x6D076E97,
+	0x3FD73B64,0x5A1CAC08, 0x3FEDEA2C,0xBFB37117,
+	0x3FD74BC6,0xA7EF9DB2, 0x3FEDE743,0x1C7C9C04,
+	0x3FD75C28,0xF5C28F5C, 0x3FEDE457,0x8393CD18,
+	0x3FD76C8B,0x43958106, 0x3FEDE169,0xF52A02EB,
+	0x3FD77CED,0x916872B0, 0x3FEDDE7A,0x71705CF6,
+	0x3FD78D4F,0xDF3B645A, 0x3FEDDB88,0xF8981B8A,
+	0x3FD79DB2,0x2D0E5604, 0x3FEDD895,0x8AD29FD1,
+	0x3FD7AE14,0x7AE147AE, 0x3FEDD5A0,0x28516BC9,
+	0x3FD7BE76,0xC8B43958, 0x3FEDD2A8,0xD1462240,
+	0x3FD7CED9,0x16872B02, 0x3FEDCFAF,0x85E286D2,
+	0x3FD7DF3B,0x645A1CAC, 0x3FEDCCB4,0x46587DE7,
+	0x3FD7EF9D,0xB22D0E56, 0x3FEDC9B7,0x12DA0CAC,
+	0x3FD80000,0x00000000, 0x3FEDC6B7,0xEB995912,
+	0x3FD81062,0x4DD2F1AA, 0x3FEDC3B6,0xD0C8A9CC,
+	0x3FD820C4,0x9BA5E354, 0x3FEDC0B3,0xC29A664A,
+	0x3FD83126,0xE978D4FE, 0x3FEDBDAE,0xC14116B4,
+	0x3FD84189,0x374BC6A8, 0x3FEDBAA7,0xCCEF63EB,
+	0x3FD851EB,0x851EB852, 0x3FEDB79E,0xE5D81782,
+	0x3FD8624D,0xD2F1A9FC, 0x3FEDB494,0x0C2E1BBD,
+	0x3FD872B0,0x20C49BA6, 0x3FEDB187,0x40247B8B,
+	0x3FD88312,0x6E978D50, 0x3FEDAE78,0x81EE6287,
+	0x3FD89374,0xBC6A7EFA, 0x3FEDAB67,0xD1BF1CEE,
+	0x3FD8A3D7,0x0A3D70A4, 0x3FEDA855,0x2FCA17A5,
+	0x3FD8B439,0x5810624E, 0x3FEDA540,0x9C42E02B,
+	0x3FD8C49B,0xA5E353F8, 0x3FEDA22A,0x175D249D,
+	0x3FD8D4FD,0xF3B645A2, 0x3FED9F11,0xA14CB3B2,
+	0x3FD8E560,0x4189374C, 0x3FED9BF7,0x3A457CB3,
+	0x3FD8F5C2,0x8F5C28F6, 0x3FED98DA,0xE27B8F7E,
+	0x3FD90624,0xDD2F1AA0, 0x3FED95BC,0x9A231C7C,
+	0x3FD91687,0x2B020C4A, 0x3FED929C,0x617074A3,
+	0x3FD926E9,0x78D4FDF4, 0x3FED8F7A,0x3898096F,
+	0x3FD9374B,0xC6A7EF9E, 0x3FED8C56,0x1FCE6CE3,
+	0x3FD947AE,0x147AE148, 0x3FED8930,0x1748517E,
+	0x3FD95810,0x624DD2F2, 0x3FED8608,0x1F3A8A3F,
+	0x3FD96872,0xB020C49C, 0x3FED82DE,0x37DA0A9E,
+	0x3FD978D4,0xFDF3B646, 0x3FED7FB2,0x615BE68A,
+	0x3FD98937,0x4BC6A7F0, 0x3FED7C84,0x9BF55262,
+	0x3FD99999,0x9999999A, 0x3FED7954,0xE7DBA2F8,
+	0x3FD9A9FB,0xE76C8B44, 0x3FED7623,0x45444D86,
+	0x3FD9BA5E,0x353F7CEE, 0x3FED72EF,0xB464E7B0,
+	0x3FD9CAC0,0x83126E98, 0x3FED6FBA,0x35732780,
+	0x3FD9DB22,0xD0E56042, 0x3FED6C82,0xC8A4E35E,
+	0x3FD9EB85,0x1EB851EC, 0x3FED6949,0x6E301211,
+	0x3FD9FBE7,0x6C8B4396, 0x3FED660E,0x264ACABC,
+	0x3FDA0C49,0xBA5E353F, 0x3FED62D0,0xF12B44D6,
+	0x3FDA1CAC,0x083126E9, 0x3FED5F91,0xCF07D82A,
+	0x3FDA2D0E,0x56041893, 0x3FED5C50,0xC016FCD1,
+	0x3FDA3D70,0xA3D70A3D, 0x3FED590D,0xC48F4B33,
+	0x3FDA4DD2,0xF1A9FBE7, 0x3FED55C8,0xDCA77BFD,
+	0x3FDA5E35,0x3F7CED91, 0x3FED5282,0x08966824,
+	0x3FDA6E97,0x8D4FDF3B, 0x3FED4F39,0x489308DA,
+	0x3FDA7EF9,0xDB22D0E5, 0x3FED4BEE,0x9CD47791,
+	0x3FDA8F5C,0x28F5C28F, 0x3FED48A2,0x0591EDF6,
+	0x3FDA9FBE,0x76C8B439, 0x3FED4553,0x8302C5E9,
+	0x3FDAB020,0xC49BA5E3, 0x3FED4203,0x155E7980,
+	0x3FDAC083,0x126E978D, 0x3FED3EB0,0xBCDCA2FE,
+	0x3FDAD0E5,0x60418937, 0x3FED3B5C,0x79B4FCD2,
+	0x3FDAE147,0xAE147AE1, 0x3FED3806,0x4C1F6191,
+	0x3FDAF1A9,0xFBE76C8B, 0x3FED34AE,0x3453CBF7,
+	0x3FDB020C,0x49BA5E35, 0x3FED3154,0x328A56DF,
+	0x3FDB126E,0x978D4FDF, 0x3FED2DF8,0x46FB3D40,
+	0x3FDB22D0,0xE5604189, 0x3FED2A9A,0x71DEDA2B,
+	0x3FDB3333,0x33333333, 0x3FED273A,0xB36DA8C6,
+	0x3FDB4395,0x810624DD, 0x3FED23D9,0x0BE04448,
+	0x3FDB53F7,0xCED91687, 0x3FED2075,0x7B6F67F6,
+	0x3FDB645A,0x1CAC0831, 0x3FED1D10,0x0253EF22,
+	0x3FDB74BC,0x6A7EF9DB, 0x3FED19A8,0xA0C6D51F,
+	0x3FDB851E,0xB851EB85, 0x3FED163F,0x57013548,
+	0x3FDB9581,0x0624DD2F, 0x3FED12D4,0x253C4AF5,
+	0x3FDBA5E3,0x53F7CED9, 0x3FED0F67,0x0BB17177,
+	0x3FDBB645,0xA1CAC083, 0x3FED0BF8,0x0A9A241B,
+	0x3FDBC6A7,0xEF9DB22D, 0x3FED0887,0x222FFE1D,
+	0x3FDBD70A,0x3D70A3D7, 0x3FED0514,0x52ACBAAD,
+	0x3FDBE76C,0x8B439581, 0x3FED019F,0x9C4A34E4,
+	0x3FDBF7CE,0xD916872B, 0x3FECFE28,0xFF4267C5,
+	0x3FDC0831,0x26E978D5, 0x3FECFAB0,0x7BCF6E38,
+	0x3FDC1893,0x74BC6A7F, 0x3FECF736,0x122B8305,
+	0x3FDC28F5,0xC28F5C29, 0x3FECF3B9,0xC29100CF,
+	0x3FDC3958,0x10624DD3, 0x3FECF03B,0x8D3A6217,
+	0x3FDC49BA,0x5E353F7D, 0x3FECECBB,0x7262412E,
+	0x3FDC5A1C,0xAC083127, 0x3FECE939,0x72435839,
+	0x3FDC6A7E,0xF9DB22D1, 0x3FECE5B5,0x8D18812B,
+	0x3FDC7AE1,0x47AE147B, 0x3FECE22F,0xC31CB5C0,
+	0x3FDC8B43,0x95810625, 0x3FECDEA8,0x148B0F7A,
+	0x3FDC9BA5,0xE353F7CF, 0x3FECDB1E,0x819EC79D,
+	0x3FDCAC08,0x3126E979, 0x3FECD793,0x0A93372B,
+	0x3FDCBC6A,0x7EF9DB23, 0x3FECD405,0xAFA3D6DF,
+	0x3FDCCCCC,0xCCCCCCCD, 0x3FECD076,0x710C3F2D,
+	0x3FDCDD2F,0x1A9FBE77, 0x3FECCCE5,0x4F08283A,
+	0x3FDCED91,0x6872B021, 0x3FECC952,0x49D369D9,
+	0x3FDCFDF3,0xB645A1CB, 0x3FECC5BD,0x61A9FB88,
+	0x3FDD0E56,0x04189375, 0x3FECC226,0x96C7F46C,
+	0x3FDD1EB8,0x51EB851F, 0x3FECBE8D,0xE9698B4D,
+	0x3FDD2F1A,0x9FBE76C9, 0x3FECBAF3,0x59CB1690,
+	0x3FDD3F7C,0xED916873, 0x3FECB756,0xE8290C37,
+	0x3FDD4FDF,0x3B645A1D, 0x3FECB3B8,0x94C001DA,
+	0x3FDD6041,0x89374BC7, 0x3FECB018,0x5FCCACA2,
+	0x3FDD70A3,0xD70A3D71, 0x3FECAC76,0x498BE14B,
+	0x3FDD8106,0x24DD2F1B, 0x3FECA8D2,0x523A9419,
+	0x3FDD9168,0x72B020C5, 0x3FECA52C,0x7A15D8D7,
+	0x3FDDA1CA,0xC083126F, 0x3FECA184,0xC15AE2D3,
+	0x3FDDB22D,0x0E560419, 0x3FEC9DDB,0x284704DC,
+	0x3FDDC28F,0x5C28F5C3, 0x3FEC9A2F,0xAF17B138,
+	0x3FDDD2F1,0xA9FBE76D, 0x3FEC9682,0x560A79A8,
+	0x3FDDE353,0xF7CED917, 0x3FEC92D3,0x1D5D0F5D,
+	0x3FDDF3B6,0x45A1CAC1, 0x3FEC8F22,0x054D42F8,
+	0x3FDE0418,0x9374BC6A, 0x3FEC8B6F,0x0E190485,
+	0x3FDE147A,0xE147AE14, 0x3FEC87BA,0x37FE6375,
+	0x3FDE24DD,0x2F1A9FBE, 0x3FEC8403,0x833B8E9D,
+	0x3FDE353F,0x7CED9168, 0x3FEC804A,0xF00ED431,
+	0x3FDE45A1,0xCAC08312, 0x3FEC7C90,0x7EB6A1BD,
+	0x3FDE5604,0x189374BC, 0x3FEC78D4,0x2F718428,
+	0x3FDE6666,0x66666666, 0x3FEC7516,0x027E27A5,
+	0x3FDE76C8,0xB4395810, 0x3FEC7155,0xF81B57BB,
+	0x3FDE872B,0x020C49BA, 0x3FEC6D94,0x1087FF37,
+	0x3FDE978D,0x4FDF3B64, 0x3FEC69D0,0x4C03282F,
+	0x3FDEA7EF,0x9DB22D0E, 0x3FEC660A,0xAACBFBF7,
+	0x3FDEB851,0xEB851EB8, 0x3FEC6243,0x2D21C324,
+	0x3FDEC8B4,0x39581062, 0x3FEC5E79,0xD343E584,
+	0x3FDED916,0x872B020C, 0x3FEC5AAE,0x9D71EA19,
+	0x3FDEE978,0xD4FDF3B6, 0x3FEC56E1,0x8BEB7717,
+	0x3FDEF9DB,0x22D0E560, 0x3FEC5312,0x9EF051DE,
+	0x3FDF0A3D,0x70A3D70A, 0x3FEC4F41,0xD6C05EF9,
+	0x3FDF1A9F,0xBE76C8B4, 0x3FEC4B6F,0x339BA216,
+	0x3FDF2B02,0x0C49BA5E, 0x3FEC479A,0xB5C23E03,
+	0x3FDF3B64,0x5A1CAC08, 0x3FEC43C4,0x5D7474AC,
+	0x3FDF4BC6,0xA7EF9DB2, 0x3FEC3FEC,0x2AF2A713,
+	0x3FDF5C28,0xF5C28F5C, 0x3FEC3C12,0x1E7D554F,
+	0x3FDF6C8B,0x43958106, 0x3FEC3836,0x38551E88,
+	0x3FDF7CED,0x916872B0, 0x3FEC3458,0x78BAC0EE,
+	0x3FDF8D4F,0xDF3B645A, 0x3FEC3078,0xDFEF19BA,
+	0x3FDF9DB2,0x2D0E5604, 0x3FEC2C97,0x6E332528,
+	0x3FDFAE14,0x7AE147AE, 0x3FEC28B4,0x23C7FE73,
+	0x3FDFBE76,0xC8B43958, 0x3FEC24CF,0x00EEDFCF,
+	0x3FDFCED9,0x16872B02, 0x3FEC20E8,0x05E92266,
+	0x3FDFDF3B,0x645A1CAC, 0x3FEC1CFF,0x32F83E56,
+	0x3FDFEF9D,0xB22D0E56, 0x3FEC1914,0x885DCAA8,
+	0x3FE00000,0x00000000, 0x3FEC1528,0x065B7D50,
+	0x3FE00831,0x26E978D5, 0x3FEC1139,0xAD332B24,
+	0x3FE01062,0x4DD2F1AA, 0x3FEC0D49,0x7D26C7DF,
+	0x3FE01893,0x74BC6A7F, 0x3FEC0957,0x76786614,
+	0x3FE020C4,0x9BA5E354, 0x3FEC0563,0x996A3730,
+	0x3FE028F5,0xC28F5C29, 0x3FEC016D,0xE63E8B74,
+	0x3FE03126,0xE978D4FE, 0x3FEBFD76,0x5D37D1EF,
+	0x3FE03958,0x10624DD3, 0x3FEBF97C,0xFE98987C,
+	0x3FE04189,0x374BC6A8, 0x3FEBF581,0xCAA38BBA,
+	0x3FE049BA,0x5E353F7D, 0x3FEBF184,0xC19B770F,
+	0x3FE051EB,0x851EB852, 0x3FEBED85,0xE3C34499,
+	0x3FE05A1C,0xAC083127, 0x3FEBE985,0x315DFD33,
+	0x3FE0624D,0xD2F1A9FC, 0x3FEBE582,0xAAAEC86D,
+	0x3FE06A7E,0xF9DB22D1, 0x3FEBE17E,0x4FF8EC86,
+	0x3FE072B0,0x20C49BA6, 0x3FEBDD78,0x217FCE6A,
+	0x3FE07AE1,0x47AE147B, 0x3FEBD970,0x1F86F1AC,
+	0x3FE08312,0x6E978D50, 0x3FEBD566,0x4A51F884,
+	0x3FE08B43,0x95810625, 0x3FEBD15A,0xA224A3C8,
+	0x3FE09374,0xBC6A7EFA, 0x3FEBCD4D,0x2742D2E7,
+	0x3FE09BA5,0xE353F7CF, 0x3FEBC93D,0xD9F083E8,
+	0x3FE0A3D7,0x0A3D70A4, 0x3FEBC52C,0xBA71D363,
+	0x3FE0AC08,0x3126E979, 0x3FEBC119,0xC90AFC7D,
+	0x3FE0B439,0x5810624E, 0x3FEBBD05,0x060058E4,
+	0x3FE0BC6A,0x7EF9DB23, 0x3FEBB8EE,0x719660C9,
+	0x3FE0C49B,0xA5E353F8, 0x3FEBB4D6,0x0C11AADD,
+	0x3FE0CCCC,0xCCCCCCCD, 0x3FEBB0BB,0xD5B6EC4E,
+	0x3FE0D4FD,0xF3B645A2, 0x3FEBAC9F,0xCECAF8BF,
+	0x3FE0DD2F,0x1A9FBE77, 0x3FEBA881,0xF792C244,
+	0x3FE0E560,0x4189374C, 0x3FEBA462,0x50535960,
+	0x3FE0ED91,0x6872B021, 0x3FEBA040,0xD951ED01,
+	0x3FE0F5C2,0x8F5C28F6, 0x3FEB9C1D,0x92D3CA76,
+	0x3FE0FDF3,0xB645A1CB, 0x3FEB97F8,0x7D1E5D70,
+	0x3FE10624,0xDD2F1AA0, 0x3FEB93D1,0x98772FFB,
+	0x3FE10E56,0x04189375, 0x3FEB8FA8,0xE523EA7B,
+	0x3FE11687,0x2B020C4A, 0x3FEB8B7E,0x636A53A4,
+	0x3FE11EB8,0x51EB851F, 0x3FEB8752,0x1390507A,
+	0x3FE126E9,0x78D4FDF4, 0x3FEB8323,0xF5DBE44A,
+	0x3FE12F1A,0x9FBE76C9, 0x3FEB7EF4,0x0A9330A3,
+	0x3FE1374B,0xC6A7EF9E, 0x3FEB7AC2,0x51FC7558,
+	0x3FE13F7C,0xED916873, 0x3FEB768E,0xCC5E1074,
+	0x3FE147AE,0x147AE148, 0x3FEB7259,0x79FE7E3C,
+	0x3FE14FDF,0x3B645A1D, 0x3FEB6E22,0x5B245923,
+	0x3FE15810,0x624DD2F2, 0x3FEB69E9,0x701659CE,
+	0x3FE16041,0x89374BC7, 0x3FEB65AE,0xB91B5708,
+	0x3FE16872,0xB020C49C, 0x3FEB6172,0x367A45C0,
+	0x3FE170A3,0xD70A3D71, 0x3FEB5D33,0xE87A3908,
+	0x3FE178D4,0xFDF3B646, 0x3FEB58F3,0xCF62620A,
+	0x3FE18106,0x24DD2F1B, 0x3FEB54B1,0xEB7A1006,
+	0x3FE18937,0x4BC6A7F0, 0x3FEB506E,0x3D08B04F,
+	0x3FE19168,0x72B020C5, 0x3FEB4C28,0xC455CE45,
+	0x3FE19999,0x9999999A, 0x3FEB47E1,0x81A91350,
+	0x3FE1A1CA,0xC083126F, 0x3FEB4398,0x754A46DB,
+	0x3FE1A9FB,0xE76C8B44, 0x3FEB3F4D,0x9F814E51,
+	0x3FE1B22D,0x0E560419, 0x3FEB3B01,0x00962D16,
+	0x3FE1BA5E,0x353F7CEE, 0x3FEB36B2,0x98D10483,
+	0x3FE1C28F,0x5C28F5C3, 0x3FEB3262,0x687A13E3,
+	0x3FE1CAC0,0x83126E98, 0x3FEB2E10,0x6FD9B86D,
+	0x3FE1D2F1,0xA9FBE76D, 0x3FEB29BC,0xAF386D3F,
+	0x3FE1DB22,0xD0E56042, 0x3FEB2567,0x26DECB58,
+	0x3FE1E353,0xF7CED917, 0x3FEB210F,0xD7158997,
+	0x3FE1EB85,0x1EB851EC, 0x3FEB1CB6,0xC0257CB2,
+	0x3FE1F3B6,0x45A1CAC1, 0x3FEB185B,0xE2579735,
+	0x3FE1FBE7,0x6C8B4396, 0x3FEB13FF,0x3DF4E979,
+	0x3FE20418,0x9374BC6A, 0x3FEB0FA0,0xD346A1A5,
+	0x3FE20C49,0xBA5E353F, 0x3FEB0B40,0xA2960BA2,
+	0x3FE2147A,0xE147AE14, 0x3FEB06DE,0xAC2C911D,
+	0x3FE21CAC,0x083126E9, 0x3FEB027A,0xF053B97E,
+	0x3FE224DD,0x2F1A9FBE, 0x3FEAFE15,0x6F5529E3,
+	0x3FE22D0E,0x56041893, 0x3FEAF9AE,0x297AA520,
+	0x3FE2353F,0x7CED9168, 0x3FEAF545,0x1F0E0BB3,
+	0x3FE23D70,0xA3D70A3D, 0x3FEAF0DA,0x50595BC6,
+	0x3FE245A1,0xCAC08312, 0x3FEAEC6D,0xBDA6B124,
+	0x3FE24DD2,0xF1A9FBE7, 0x3FEAE7FF,0x6740453A,
+	0x3FE25604,0x189374BC, 0x3FEAE38F,0x4D706F0E,
+	0x3FE25E35,0x3F7CED91, 0x3FEADF1D,0x7081A33B,
+	0x3FE26666,0x66666666, 0x3FEADAA9,0xD0BE73ED,
+	0x3FE26E97,0x8D4FDF3B, 0x3FEAD634,0x6E7190DD,
+	0x3FE276C8,0xB4395810, 0x3FEAD1BD,0x49E5C747,
+	0x3FE27EF9,0xDB22D0E5, 0x3FEACD44,0x636601EE,
+	0x3FE2872B,0x020C49BA, 0x3FEAC8C9,0xBB3D490D,
+	0x3FE28F5C,0x28F5C28F, 0x3FEAC44D,0x51B6C25B,
+	0x3FE2978D,0x4FDF3B64, 0x3FEABFCF,0x271DB100,
+	0x3FE29FBE,0x76C8B439, 0x3FEABB4F,0x3BBD7593,
+	0x3FE2A7EF,0x9DB22D0E, 0x3FEAB6CD,0x8FE18E13,
+	0x3FE2B020,0xC49BA5E3, 0x3FEAB24A,0x23D595E4,
+	0x3FE2B851,0xEB851EB8, 0x3FEAADC4,0xF7E545CB,
+	0x3FE2C083,0x126E978D, 0x3FEAA93E,0x0C5C73E5,
+	0x3FE2C8B4,0x39581062, 0x3FEAA4B5,0x618713A5,
+	0x3FE2D0E5,0x60418937, 0x3FEAA02A,0xF7B135D0,
+	0x3FE2D916,0x872B020C, 0x3FEA9B9E,0xCF270874,
+	0x3FE2E147,0xAE147AE1, 0x3FEA9710,0xE834D6E7,
+	0x3FE2E978,0xD4FDF3B6, 0x3FEA9281,0x432709C0,
+	0x3FE2F1A9,0xFBE76C8B, 0x3FEA8DEF,0xE04A26D3,
+	0x3FE2F9DB,0x22D0E560, 0x3FEA895C,0xBFEAD12A,
+	0x3FE3020C,0x49BA5E35, 0x3FEA84C7,0xE255C904,
+	0x3FE30A3D,0x70A3D70A, 0x3FEA8031,0x47D7EBCB,
+	0x3FE3126E,0x978D4FDF, 0x3FEA7B98,0xF0BE3412,
+	0x3FE31A9F,0xBE76C8B4, 0x3FEA76FE,0xDD55B98F,
+	0x3FE322D0,0xE5604189, 0x3FEA7263,0x0DEBB117,
+	0x3FE32B02,0x0C49BA5E, 0x3FEA6DC5,0x82CD6C99,
+	0x3FE33333,0x33333333, 0x3FEA6926,0x3C485B15,
+	0x3FE33B64,0x5A1CAC08, 0x3FEA6485,0x3AAA089D,
+	0x3FE34395,0x810624DD, 0x3FEA5FE2,0x7E401E4C,
+	0x3FE34BC6,0xA7EF9DB2, 0x3FEA5B3E,0x07586242,
+	0x3FE353F7,0xCED91687, 0x3FEA5697,0xD640B79F,
+	0x3FE35C28,0xF5C28F5C, 0x3FEA51EF,0xEB471E7C,
+	0x3FE3645A,0x1CAC0831, 0x3FEA4D46,0x46B9B3EA,
+	0x3FE36C8B,0x43958106, 0x3FEA489A,0xE8E6B1E8,
+	0x3FE374BC,0x6A7EF9DB, 0x3FEA43ED,0xD21C6F63,
+	0x3FE37CED,0x916872B0, 0x3FEA3F3F,0x02A9602C,
+	0x3FE3851E,0xB851EB85, 0x3FEA3A8E,0x7ADC14F6,
+	0x3FE38D4F,0xDF3B645A, 0x3FEA35DC,0x3B033B50,
+	0x3FE39581,0x0624DD2F, 0x3FEA3128,0x436D9DA0,
+	0x3FE39DB2,0x2D0E5604, 0x3FEA2C72,0x946A231B,
+	0x3FE3A5E3,0x53F7CED9, 0x3FEA27BB,0x2E47CFC6,
+	0x3FE3AE14,0x7AE147AE, 0x3FEA2302,0x1155C46B,
+	0x3FE3B645,0xA1CAC083, 0x3FEA1E47,0x3DE33E97,
+	0x3FE3BE76,0xC8B43958, 0x3FEA198A,0xB43F9893,
+	0x3FE3C6A7,0xEF9DB22D, 0x3FEA14CC,0x74BA4961,
+	0x3FE3CED9,0x16872B02, 0x3FEA100C,0x7FA2E4B4,
+	0x3FE3D70A,0x3D70A3D7, 0x3FEA0B4A,0xD5491AEC,
+	0x3FE3DF3B,0x645A1CAC, 0x3FEA0687,0x75FCB914,
+	0x3FE3E76C,0x8B439581, 0x3FEA01C2,0x620DA8D5,
+	0x3FE3EF9D,0xB22D0E56, 0x3FE9FCFB,0x99CBF07A,
+	0x3FE3F7CE,0xD916872B, 0x3FE9F833,0x1D87B2E3,
+	0x3FE40000,0x00000000, 0x3FE9F368,0xED912F85,
+	0x3FE40831,0x26E978D5, 0x3FE9EE9D,0x0A38C262,
+	0x3FE41062,0x4DD2F1AA, 0x3FE9E9CF,0x73CEE405,
+	0x3FE41893,0x74BC6A7F, 0x3FE9E500,0x2AA4297B,
+	0x3FE420C4,0x9BA5E354, 0x3FE9E02F,0x2F094451,
+	0x3FE428F5,0xC28F5C29, 0x3FE9DB5C,0x814F028B,
+	0x3FE43126,0xE978D4FE, 0x3FE9D688,0x21C64EA1,
+	0x3FE43958,0x10624DD3, 0x3FE9D1B2,0x10C02F78,
+	0x3FE44189,0x374BC6A8, 0x3FE9CCDA,0x4E8DC860,
+	0x3FE449BA,0x5E353F7D, 0x3FE9C800,0xDB80590B,
+	0x3FE451EB,0x851EB852, 0x3FE9C325,0xB7E93D88,
+	0x3FE45A1C,0xAC083127, 0x3FE9BE48,0xE419EE41,
+	0x3FE4624D,0xD2F1A9FC, 0x3FE9B96A,0x6063FFF2,
+	0x3FE46A7E,0xF9DB22D1, 0x3FE9B48A,0x2D1923A6,
+	0x3FE472B0,0x20C49BA6, 0x3FE9AFA8,0x4A8B26B1,
+	0x3FE47AE1,0x47AE147B, 0x3FE9AAC4,0xB90BF2A8,
+	0x3FE48312,0x6E978D50, 0x3FE9A5DF,0x78ED8D60,
+	0x3FE48B43,0x95810625, 0x3FE9A0F8,0x8A8218E7,
+	0x3FE49374,0xBC6A7EFA, 0x3FE99C0F,0xEE1BD37D,
+	0x3FE49BA5,0xE353F7CF, 0x3FE99725,0xA40D1791,
+	0x3FE4A3D7,0x0A3D70A4, 0x3FE99239,0xACA85BBA,
+	0x3FE4AC08,0x3126E979, 0x3FE98D4C,0x084032B1,
+	0x3FE4B439,0x5810624E, 0x3FE9885C,0xB7274B4E,
+	0x3FE4BC6A,0x7EF9DB23, 0x3FE9836B,0xB9B07081,
+	0x3FE4C49B,0xA5E353F8, 0x3FE97E79,0x102E894D,
+	0x3FE4CCCC,0xCCCCCCCD, 0x3FE97984,0xBAF498C2,
+	0x3FE4D4FD,0xF3B645A2, 0x3FE9748E,0xBA55BDF6,
+	0x3FE4DD2F,0x1A9FBE77, 0x3FE96F97,0x0EA53406,
+	0x3FE4E560,0x4189374C, 0x3FE96A9D,0xB8365209,
+	0x3FE4ED91,0x6872B021, 0x3FE965A2,0xB75C8B0C,
+	0x3FE4F5C2,0x8F5C28F6, 0x3FE960A6,0x0C6B6E13,
+	0x3FE4FDF3,0xB645A1CB, 0x3FE95BA7,0xB7B6A609,
+	0x3FE50624,0xDD2F1AA0, 0x3FE956A7,0xB991F9C5,
+	0x3FE50E56,0x04189375, 0x3FE951A6,0x12514BFD,
+	0x3FE51687,0x2B020C4A, 0x3FE94CA2,0xC2489B42,
+	0x3FE51EB8,0x51EB851F, 0x3FE9479D,0xC9CC0200,
+	0x3FE526E9,0x78D4FDF4, 0x3FE94297,0x292FB670,
+	0x3FE52F1A,0x9FBE76C9, 0x3FE93D8E,0xE0C80A98,
+	0x3FE5374B,0xC6A7EF9E, 0x3FE93884,0xF0E96C44,
+	0x3FE53F7C,0xED916873, 0x3FE93379,0x59E86502,
+	0x3FE547AE,0x147AE148, 0x3FE92E6C,0x1C199A18,
+	0x3FE54FDF,0x3B645A1D, 0x3FE9295D,0x37D1CC85,
+	0x3FE55810,0x624DD2F2, 0x3FE9244C,0xAD65D8F4,
+	0x3FE56041,0x89374BC7, 0x3FE91F3A,0x7D2AB7BF,
+	0x3FE56872,0xB020C49C, 0x3FE91A26,0xA7757CE0,
+	0x3FE570A3,0xD70A3D71, 0x3FE91511,0x2C9B57F4,
+	0x3FE578D4,0xFDF3B646, 0x3FE90FFA,0x0CF19430,
+	0x3FE58106,0x24DD2F1B, 0x3FE90AE1,0x48CD985C,
+	0x3FE58937,0x4BC6A7F0, 0x3FE905C6,0xE084E6D1,
+	0x3FE59168,0x72B020C5, 0x3FE900AA,0xD46D1D6E,
+	0x3FE59999,0x9999999A, 0x3FE8FB8D,0x24DBF597,
+	0x3FE5A1CA,0xC083126F, 0x3FE8F66D,0xD227442E,
+	0x3FE5A9FB,0xE76C8B44, 0x3FE8F14C,0xDCA4F98C,
+	0x3FE5B22D,0x0E560419, 0x3FE8EC2A,0x44AB217D,
+	0x3FE5BA5E,0x353F7CEE, 0x3FE8E706,0x0A8FE338,
+	0x3FE5C28F,0x5C28F5C3, 0x3FE8E1E0,0x2EA9815D,
+	0x3FE5CAC0,0x83126E98, 0x3FE8DCB8,0xB14E59ED,
+	0x3FE5D2F1,0xA9FBE76D, 0x3FE8D78F,0x92D4E644,
+	0x3FE5DB22,0xD0E56042, 0x3FE8D264,0xD393BB15,
+	0x3FE5E353,0xF7CED917, 0x3FE8CD38,0x73E18863,
+	0x3FE5EB85,0x1EB851EC, 0x3FE8C80A,0x7415197C,
+	0x3FE5F3B6,0x45A1CAC1, 0x3FE8C2DA,0xD48554F2,
+	0x3FE5FBE7,0x6C8B4396, 0x3FE8BDA9,0x95893C98,
+	0x3FE60418,0x9374BC6A, 0x3FE8B876,0xB777ED7A,
+	0x3FE60C49,0xBA5E353F, 0x3FE8B342,0x3AA89FD6,
+	0x3FE6147A,0xE147AE14, 0x3FE8AE0C,0x1F72A71B,
+	0x3FE61CAC,0x083126E9, 0x3FE8A8D4,0x662D71DF,
+	0x3FE624DD,0x2F1A9FBE, 0x3FE8A39B,0x0F3089DC,
+	0x3FE62D0E,0x56041893, 0x3FE89E60,0x1AD393E8,
+	0x3FE6353F,0x7CED9168, 0x3FE89923,0x896E4FF1,
+	0x3FE63D70,0xA3D70A3D, 0x3FE893E5,0x5B5898F4,
+	0x3FE645A1,0xCAC08312, 0x3FE88EA5,0x90EA64FE,
+	0x3FE64DD2,0xF1A9FBE7, 0x3FE88964,0x2A7BC51E,
+	0x3FE65604,0x189374BC, 0x3FE88421,0x2864E567,
+	0x3FE65E35,0x3F7CED91, 0x3FE87EDC,0x8AFE0CE3,
+	0x3FE66666,0x66666666, 0x3FE87996,0x529F9D93,
+	0x3FE66E97,0x8D4FDF3B, 0x3FE8744E,0x7FA21465,
+	0x3FE676C8,0xB4395810, 0x3FE86F05,0x125E0933,
+	0x3FE67EF9,0xDB22D0E5, 0x3FE869BA,0x0B2C2EB7,
+	0x3FE6872B,0x020C49BA, 0x3FE8646D,0x6A65528A,
+	0x3FE68F5C,0x28F5C28F, 0x3FE85F1F,0x30625D1D,
+	0x3FE6978D,0x4FDF3B64, 0x3FE859CF,0x5D7C51B2,
+	0x3FE69FBE,0x76C8B439, 0x3FE8547D,0xF20C4E58,
+	0x3FE6A7EF,0x9DB22D0E, 0x3FE84F2A,0xEE6B8BE3,
+	0x3FE6B020,0xC49BA5E3, 0x3FE849D6,0x52F35DE8,
+	0x3FE6B851,0xEB851EB8, 0x3FE84480,0x1FFD32B6,
+	0x3FE6C083,0x126E978D, 0x3FE83F28,0x55E29351,
+	0x3FE6C8B4,0x39581062, 0x3FE839CE,0xF4FD236C,
+	0x3FE6D0E5,0x60418937, 0x3FE83473,0xFDA6A161,
+	0x3FE6D916,0x872B020C, 0x3FE82F17,0x7038E630,
+	0x3FE6E147,0xAE147AE1, 0x3FE829B9,0x4D0DE573,
+	0x3FE6E978,0xD4FDF3B6, 0x3FE82459,0x947FAD5E,
+	0x3FE6F1A9,0xFBE76C8B, 0x3FE81EF8,0x46E866B4,
+	0x3FE6F9DB,0x22D0E560, 0x3FE81995,0x64A254C4,
+	0x3FE7020C,0x49BA5E35, 0x3FE81430,0xEE07D563,
+	0x3FE70A3D,0x70A3D70A, 0x3FE80ECA,0xE37360E6,
+	0x3FE7126E,0x978D4FDF, 0x3FE80963,0x453F8A19,
+	0x3FE71A9F,0xBE76C8B4, 0x3FE803FA,0x13C6FE3F,
+	0x3FE722D0,0xE5604189, 0x3FE7FE8F,0x4F648507,
+	0x3FE72B02,0x0C49BA5E, 0x3FE7F922,0xF8730088,
+	0x3FE73333,0x33333333, 0x3FE7F3B5,0x0F4D6D3A,
+	0x3FE73B64,0x5A1CAC08, 0x3FE7EE45,0x944EE1F2,
+	0x3FE74395,0x810624DD, 0x3FE7E8D4,0x87D28FDB,
+	0x3FE74BC6,0xA7EF9DB2, 0x3FE7E361,0xEA33C26F,
+	0x3FE753F7,0xCED91687, 0x3FE7DDED,0xBBCDDF72,
+	0x3FE75C28,0xF5C28F5C, 0x3FE7D877,0xFCFC66ED,
+	0x3FE7645A,0x1CAC0831, 0x3FE7D300,0xAE1AF326,
+	0x3FE76C8B,0x43958106, 0x3FE7CD87,0xCF85389A,
+	0x3FE774BC,0x6A7EF9DB, 0x3FE7C80D,0x619705FB,
+	0x3FE77CED,0x916872B0, 0x3FE7C291,0x64AC4424,
+	0x3FE7851E,0xB851EB85, 0x3FE7BD13,0xD920F617,
+	0x3FE78D4F,0xDF3B645A, 0x3FE7B794,0xBF5138F6,
+	0x3FE79581,0x0624DD2F, 0x3FE7B214,0x179943FB,
+	0x3FE79DB2,0x2D0E5604, 0x3FE7AC91,0xE2556877,
+	0x3FE7A5E3,0x53F7CED9, 0x3FE7A70E,0x1FE211C7,
+	0x3FE7AE14,0x7AE147AE, 0x3FE7A188,0xD09BC54F,
+	0x3FE7B645,0xA1CAC083, 0x3FE79C01,0xF4DF2275,
+	0x3FE7BE76,0xC8B43958, 0x3FE79679,0x8D08E29B,
+	0x3FE7C6A7,0xEF9DB22D, 0x3FE790EF,0x9975D91A,
+	0x3FE7CED9,0x16872B02, 0x3FE78B64,0x1A82F336,
+	0x3FE7D70A,0x3D70A3D7, 0x3FE785D7,0x108D3820,
+	0x3FE7DF3B,0x645A1CAC, 0x3FE78048,0x7BF1C8EC,
+	0x3FE7E76C,0x8B439581, 0x3FE77AB8,0x5D0DE089,
+	0x3FE7EF9D,0xB22D0E56, 0x3FE77526,0xB43ED3BF,
+	0x3FE7F7CE,0xD916872B, 0x3FE76F93,0x81E21125,
+	0x3FE80000,0x00000000, 0x3FE769FE,0xC655211F,
+	0x3FE80831,0x26E978D5, 0x3FE76468,0x81F5A5D4,
+	0x3FE81062,0x4DD2F1AA, 0x3FE75ED0,0xB5215B29,
+	0x3FE81893,0x74BC6A7F, 0x3FE75937,0x603616BD,
+	0x3FE820C4,0x9BA5E354, 0x3FE7539C,0x8391C7E0,
+	0x3FE828F5,0xC28F5C29, 0x3FE74E00,0x1F92778E,
+	0x3FE83126,0xE978D4FE, 0x3FE74862,0x3496486A,
+	0x3FE83958,0x10624DD3, 0x3FE742C2,0xC2FB76B6,
+	0x3FE84189,0x374BC6A8, 0x3FE73D21,0xCB20584D,
+	0x3FE849BA,0x5E353F7D, 0x3FE7377F,0x4D635C9D,
+	0x3FE851EB,0x851EB852, 0x3FE731DB,0x4A230CA3,
+	0x3FE85A1C,0xAC083127, 0x3FE72C35,0xC1BE0AE1,
+	0x3FE8624D,0xD2F1A9FC, 0x3FE7268E,0xB493135B,
+	0x3FE86A7E,0xF9DB22D1, 0x3FE720E6,0x2300FB8E,
+	0x3FE872B0,0x20C49BA6, 0x3FE71B3C,0x0D66B26F,
+	0x3FE87AE1,0x47AE147B, 0x3FE71590,0x7423405C,
+	0x3FE88312,0x6E978D50, 0x3FE70FE3,0x5795C71E,
+	0x3FE88B43,0x95810625, 0x3FE70A34,0xB81D81DF,
+	0x3FE89374,0xBC6A7EFA, 0x3FE70484,0x9619C525,
+	0x3FE89BA5,0xE353F7CF, 0x3FE6FED2,0xF1E9FECA,
+	0x3FE8A3D7,0x0A3D70A4, 0x3FE6F91F,0xCBEDB5F7,
+	0x3FE8AC08,0x3126E979, 0x3FE6F36B,0x24848B20,
+	0x3FE8B439,0x5810624E, 0x3FE6EDB4,0xFC0E37F7,
+	0x3FE8BC6A,0x7EF9DB23, 0x3FE6E7FD,0x52EA8F6D,
+	0x3FE8C49B,0xA5E353F8, 0x3FE6E244,0x29797DAA,
+	0x3FE8CCCC,0xCCCCCCCD, 0x3FE6DC89,0x801B0802,
+	0x3FE8D4FD,0xF3B645A2, 0x3FE6D6CD,0x572F4CF4,
+	0x3FE8DD2F,0x1A9FBE77, 0x3FE6D10F,0xAF168424,
+	0x3FE8E560,0x4189374C, 0x3FE6CB50,0x8830FE4F,
+	0x3FE8ED91,0x6872B021, 0x3FE6C58F,0xE2DF254A,
+	0x3FE8F5C2,0x8F5C28F6, 0x3FE6BFCD,0xBF817BFA,
+	0x3FE8FDF3,0xB645A1CB, 0x3FE6BA0A,0x1E789E4F,
+	0x3FE90624,0xDD2F1AA0, 0x3FE6B445,0x00254139,
+	0x3FE90E56,0x04189375, 0x3FE6AE7E,0x64E832A7,
+	0x3FE91687,0x2B020C4A, 0x3FE6A8B6,0x4D225980,
+	0x3FE91EB8,0x51EB851F, 0x3FE6A2EC,0xB934B59A,
+	0x3FE926E9,0x78D4FDF4, 0x3FE69D21,0xA9805FB3,
+	0x3FE92F1A,0x9FBE76C9, 0x3FE69755,0x1E668970,
+	0x3FE9374B,0xC6A7EF9E, 0x3FE69187,0x18487D51,
+	0x3FE93F7C,0xED916873, 0x3FE68BB7,0x97879EAE,
+	0x3FE947AE,0x147AE148, 0x3FE685E6,0x9C8569AF,
+	0x3FE94FDF,0x3B645A1D, 0x3FE68014,0x27A37345,
+	0x3FE95810,0x624DD2F2, 0x3FE67A40,0x39436927,
+	0x3FE96041,0x89374BC7, 0x3FE6746A,0xD1C711C7,
+	0x3FE96872,0xB020C49C, 0x3FE66E93,0xF1904C50,
+	0x3FE970A3,0xD70A3D71, 0x3FE668BB,0x9901109B,
+	0x3FE978D4,0xFDF3B646, 0x3FE662E1,0xC87B6F2C,
+	0x3FE98106,0x24DD2F1B, 0x3FE65D06,0x8061912D,
+	0x3FE98937,0x4BC6A7F0, 0x3FE65729,0xC115B861,
+	0x3FE99168,0x72B020C5, 0x3FE6514B,0x8AFA3F25,
+	0x3FE99999,0x9999999A, 0x3FE64B6B,0xDE719865,
+	0x3FE9A1CA,0xC083126F, 0x3FE6458A,0xBBDE4F97,
+	0x3FE9A9FB,0xE76C8B44, 0x3FE63FA8,0x23A308B3,
+	0x3FE9B22D,0x0E560419, 0x3FE639C4,0x16228031,
+	0x3FE9BA5E,0x353F7CEE, 0x3FE633DE,0x93BF8AFD,
+	0x3FE9C28F,0x5C28F5C3, 0x3FE62DF7,0x9CDD1674,
+	0x3FE9CAC0,0x83126E98, 0x3FE6280F,0x31DE285B,
+	0x3FE9D2F1,0xA9FBE76D, 0x3FE62225,0x5325DEDC,
+	0x3FE9DB22,0xD0E56042, 0x3FE61C3A,0x0117707C,
+	0x3FE9E353,0xF7CED917, 0x3FE6164D,0x3C162C18,
+	0x3FE9EB85,0x1EB851EC, 0x3FE6105F,0x048578D9,
+	0x3FE9F3B6,0x45A1CAC1, 0x3FE60A6F,0x5AC8D635,
+	0x3FE9FBE7,0x6C8B4396, 0x3FE6047E,0x3F43DBE1,
+	0x3FEA0418,0x9374BC6A, 0x3FE5FE8B,0xB25A39D1,
+	0x3FEA0C49,0xBA5E353F, 0x3FE5F897,0xB46FB82B,
+	0x3FEA147A,0xE147AE14, 0x3FE5F2A2,0x45E83747,
+	0x3FEA1CAC,0x083126E9, 0x3FE5ECAB,0x6727AFA2,
+	0x3FEA24DD,0x2F1A9FBE, 0x3FE5E6B3,0x189231DF,
+	0x3FEA2D0E,0x56041893, 0x3FE5E0B9,0x5A8BE6BA,
+	0x3FEA353F,0x7CED9168, 0x3FE5DABE,0x2D790F01,
+	0x3FEA3D70,0xA3D70A3D, 0x3FE5D4C1,0x91BE0395,
+	0x3FEA45A1,0xCAC08312, 0x3FE5CEC3,0x87BF355B,
+	0x3FEA4DD2,0xF1A9FBE7, 0x3FE5C8C4,0x0FE12D3A,
+	0x3FEA5604,0x189374BC, 0x3FE5C2C3,0x2A888C14,
+	0x3FEA5E35,0x3F7CED91, 0x3FE5BCC0,0xD81A0ABD,
+	0x3FEA6666,0x66666666, 0x3FE5B6BD,0x18FA79F8,
+	0x3FEA6E97,0x8D4FDF3B, 0x3FE5B0B7,0xED8EC26D,
+	0x3FEA76C8,0xB4395810, 0x3FE5AAB1,0x563BE4A5,
+	0x3FEA7EF9,0xDB22D0E5, 0x3FE5A4A9,0x5366F901,
+	0x3FEA872B,0x020C49BA, 0x3FE59E9F,0xE5752FB7,
+	0x3FEA8F5C,0x28F5C28F, 0x3FE59895,0x0CCBD0C6,
+	0x3FEA978D,0x4FDF3B64, 0x3FE59288,0xC9D03BF4,
+	0x3FEA9FBE,0x76C8B439, 0x3FE58C7B,0x1CE7E8C7,
+	0x3FEAA7EF,0x9DB22D0E, 0x3FE5866C,0x0678667A,
+	0x3FEAB020,0xC49BA5E3, 0x3FE5805B,0x86E75BFC,
+	0x3FEAB851,0xEB851EB8, 0x3FE57A49,0x9E9A87E6,
+	0x3FEAC083,0x126E978D, 0x3FE57436,0x4DF7C074,
+	0x3FEAC8B4,0x39581062, 0x3FE56E21,0x9564F382,
+	0x3FEAD0E5,0x60418937, 0x3FE5680B,0x75482680,
+	0x3FEAD916,0x872B020C, 0x3FE561F3,0xEE07766F,
+	0x3FEAE147,0xAE147AE1, 0x3FE55BDB,0x000917DB,
+	0x3FEAE978,0xD4FDF3B6, 0x3FE555C0,0xABB356D1,
+	0x3FEAF1A9,0xFBE76C8B, 0x3FE54FA4,0xF16C96D9,
+	0x3FEAF9DB,0x22D0E560, 0x3FE54987,0xD19B52F2,
+	0x3FEB020C,0x49BA5E35, 0x3FE54369,0x4CA61D8A,
+	0x3FEB0A3D,0x70A3D70A, 0x3FE53D49,0x62F3A075,
+	0x3FEB126E,0x978D4FDF, 0x3FE53728,0x14EA9CE9,
+	0x3FEB1A9F,0xBE76C8B4, 0x3FE53105,0x62F1EB77,
+	0x3FEB22D0,0xE5604189, 0x3FE52AE1,0x4D707C02,
+	0x3FEB2B02,0x0C49BA5E, 0x3FE524BB,0xD4CD55BC,
+	0x3FEB3333,0x33333333, 0x3FE51E94,0xF96F971B,
+	0x3FEB3B64,0x5A1CAC08, 0x3FE5186C,0xBBBE75D6,
+	0x3FEB4395,0x810624DD, 0x3FE51243,0x1C213EDB,
+	0x3FEB4BC6,0xA7EF9DB2, 0x3FE50C18,0x1AFF564B,
+	0x3FEB53F7,0xCED91687, 0x3FE505EB,0xB8C03773,
+	0x3FEB5C28,0xF5C28F5C, 0x3FE4FFBD,0xF5CB74C1,
+	0x3FEB645A,0x1CAC0831, 0x3FE4F98E,0xD288B7C5,
+	0x3FEB6C8B,0x43958106, 0x3FE4F35E,0x4F5FC121,
+	0x3FEB74BC,0x6A7EF9DB, 0x3FE4ED2C,0x6CB8688B,
+	0x3FEB7CED,0x916872B0, 0x3FE4E6F9,0x2AFA9CBE,
+	0x3FEB851E,0xB851EB85, 0x3FE4E0C4,0x8A8E637C,
+	0x3FEB8D4F,0xDF3B645A, 0x3FE4DA8E,0x8BDBD97E,
+	0x3FEB9581,0x0624DD2F, 0x3FE4D457,0x2F4B3274,
+	0x3FEB9DB2,0x2D0E5604, 0x3FE4CE1E,0x7544B8FC,
+	0x3FEBA5E3,0x53F7CED9, 0x3FE4C7E4,0x5E30CE9A,
+	0x3FEBAE14,0x7AE147AE, 0x3FE4C1A8,0xEA77EBB3,
+	0x3FEBB645,0xA1CAC083, 0x3FE4BB6C,0x1A829F84,
+	0x3FEBBE76,0xC8B43958, 0x3FE4B52D,0xEEB9901D,
+	0x3FEBC6A7,0xEF9DB22D, 0x3FE4AEEE,0x67857A5A,
+	0x3FEBCED9,0x16872B02, 0x3FE4A8AD,0x854F31DD,
+	0x3FEBD70A,0x3D70A3D7, 0x3FE4A26B,0x487FA102,
+	0x3FEBDF3B,0x645A1CAC, 0x3FE49C27,0xB17FC8DF,
+	0x3FEBE76C,0x8B439581, 0x3FE495E2,0xC0B8C13A,
+	0x3FEBEF9D,0xB22D0E56, 0x3FE48F9C,0x7693B882,
+	0x3FEBF7CE,0xD916872B, 0x3FE48954,0xD379F3C6,
+	0x3FEC0000,0x00000000, 0x3FE4830B,0xD7D4CEB3,
+	0x3FEC0831,0x26E978D5, 0x3FE47CC1,0x840DBB8B,
+	0x3FEC1062,0x4DD2F1AA, 0x3FE47675,0xD88E431B,
+	0x3FEC1893,0x74BC6A7F, 0x3FE47028,0xD5C004B8,
+	0x3FEC20C4,0x9BA5E354, 0x3FE469DA,0x7C0CB637,
+	0x3FEC28F5,0xC28F5C29, 0x3FE4638A,0xCBDE23E6,
+	0x3FEC3126,0xE978D4FE, 0x3FE45D39,0xC59E3084,
+	0x3FEC3958,0x10624DD3, 0x3FE456E7,0x69B6D53B,
+	0x3FEC4189,0x374BC6A8, 0x3FE45093,0xB892219A,
+	0x3FEC49BA,0x5E353F7D, 0x3FE44A3E,0xB29A3B8D,
+	0x3FEC51EB,0x851EB852, 0x3FE443E8,0x58395F54,
+	0x3FEC5A1C,0xAC083127, 0x3FE43D90,0xA9D9DF81,
+	0x3FEC624D,0xD2F1A9FC, 0x3FE43737,0xA7E624EC,
+	0x3FEC6A7E,0xF9DB22D1, 0x3FE430DD,0x52C8AEB0,
+	0x3FEC72B0,0x20C49BA6, 0x3FE42A81,0xAAEC1220,
+	0x3FEC7AE1,0x47AE147B, 0x3FE42424,0xB0BAFAC4,
+	0x3FEC8312,0x6E978D50, 0x3FE41DC6,0x64A02A50,
+	0x3FEC8B43,0x95810625, 0x3FE41766,0xC706789C,
+	0x3FEC9374,0xBC6A7EFA, 0x3FE41105,0xD858D3A1,
+	0x3FEC9BA5,0xE353F7CF, 0x3FE40AA3,0x99023F6C,
+	0x3FECA3D7,0x0A3D70A4, 0x3FE40440,0x096DD61B,
+	0x3FECAC08,0x3126E979, 0x3FE3FDDB,0x2A06C7D8,
+	0x3FECB439,0x5810624E, 0x3FE3F774,0xFB385ACB,
+	0x3FECBC6A,0x7EF9DB23, 0x3FE3F10D,0x7D6DEB19,
+	0x3FECC49B,0xA5E353F8, 0x3FE3EAA4,0xB112EADD,
+	0x3FECCCCC,0xCCCCCCCD, 0x3FE3E43A,0x9692E21C,
+	0x3FECD4FD,0xF3B645A2, 0x3FE3DDCF,0x2E596EC3,
+	0x3FECDD2F,0x1A9FBE77, 0x3FE3D762,0x78D2449D,
+	0x3FECE560,0x4189374C, 0x3FE3D0F4,0x76692D4D,
+	0x3FECED91,0x6872B021, 0x3FE3CA85,0x278A0847,
+	0x3FECF5C2,0x8F5C28F6, 0x3FE3C414,0x8CA0CAC8,
+	0x3FECFDF3,0xB645A1CB, 0x3FE3BDA2,0xA6197FD3,
+	0x3FED0624,0xDD2F1AA0, 0x3FE3B72F,0x74604821,
+	0x3FED0E56,0x04189375, 0x3FE3B0BA,0xF7E15A25,
+	0x3FED1687,0x2B020C4A, 0x3FE3AA45,0x310901FC,
+	0x3FED1EB8,0x51EB851F, 0x3FE3A3CE,0x2043A16B,
+	0x3FED26E9,0x78D4FDF4, 0x3FE39D55,0xC5FDAFD5,
+	0x3FED2F1A,0x9FBE76C9, 0x3FE396DC,0x22A3BA36,
+	0x3FED374B,0xC6A7EF9E, 0x3FE39061,0x36A2631B,
+	0x3FED3F7C,0xED916873, 0x3FE389E5,0x0266629A,
+	0x3FED47AE,0x147AE148, 0x3FE38367,0x865C864D,
+	0x3FED4FDF,0x3B645A1D, 0x3FE37CE8,0xC2F1B14A,
+	0x3FED5810,0x624DD2F2, 0x3FE37668,0xB892DC19,
+	0x3FED6041,0x89374BC7, 0x3FE36FE7,0x67AD14B2,
+	0x3FED6872,0xB020C49C, 0x3FE36964,0xD0AD7E72,
+	0x3FED70A3,0xD70A3D71, 0x3FE362E0,0xF4015215,
+	0x3FED78D4,0xFDF3B646, 0x3FE35C5B,0xD215DDB0,
+	0x3FED8106,0x24DD2F1B, 0x3FE355D5,0x6B5884A6,
+	0x3FED8937,0x4BC6A7F0, 0x3FE34F4D,0xC036BFA7,
+	0x3FED9168,0x72B020C5, 0x3FE348C4,0xD11E1CA4,
+	0x3FED9999,0x9999999A, 0x3FE3423A,0x9E7C3EC9,
+	0x3FEDA1CA,0xC083126F, 0x3FE33BAF,0x28BEDE75,
+	0x3FEDA9FB,0xE76C8B44, 0x3FE33522,0x7053C936,
+	0x3FEDB22D,0x0E560419, 0x3FE32E94,0x75A8E1BE,
+	0x3FEDBA5E,0x353F7CEE, 0x3FE32805,0x392C1FDE,
+	0x3FEDC28F,0x5C28F5C3, 0x3FE32174,0xBB4B9080,
+	0x3FEDCAC0,0x83126E98, 0x3FE31AE2,0xFC75559A,
+	0x3FEDD2F1,0xA9FBE76D, 0x3FE3144F,0xFD17A62F,
+	0x3FEDDB22,0xD0E56042, 0x3FE30DBB,0xBDA0CE40,
+	0x3FEDE353,0xF7CED917, 0x3FE30726,0x3E7F2ECB,
+	0x3FEDEB85,0x1EB851EC, 0x3FE3008F,0x80213DC1,
+	0x3FEDF3B6,0x45A1CAC1, 0x3FE2F9F7,0x82F585FC,
+	0x3FEDFBE7,0x6C8B4396, 0x3FE2F35E,0x476AA73F,
+	0x3FEE0418,0x9374BC6A, 0x3FE2ECC3,0xCDEF5627,
+	0x3FEE0C49,0xBA5E353F, 0x3FE2E628,0x16F25C28,
+	0x3FEE147A,0xE147AE14, 0x3FE2DF8B,0x22E29786,
+	0x3FEE1CAC,0x083126E9, 0x3FE2D8EC,0xF22EFB4B,
+	0x3FEE24DD,0x2F1A9FBE, 0x3FE2D24D,0x85468F41,
+	0x3FEE2D0E,0x56041893, 0x3FE2CBAC,0xDC986FEF,
+	0x3FEE353F,0x7CED9168, 0x3FE2C50A,0xF893CE88,
+	0x3FEE3D70,0xA3D70A3D, 0x3FE2BE67,0xD9A7F0EF,
+	0x3FEE45A1,0xCAC08312, 0x3FE2B7C3,0x804431A5,
+	0x3FEE4DD2,0xF1A9FBE7, 0x3FE2B11D,0xECD7FFCB,
+	0x3FEE5604,0x189374BC, 0x3FE2AA77,0x1FD2DF16,
+	0x3FEE5E35,0x3F7CED91, 0x3FE2A3CF,0x19A467C5,
+	0x3FEE6666,0x66666666, 0x3FE29D25,0xDABC46A2,
+	0x3FEE6E97,0x8D4FDF3B, 0x3FE2967B,0x638A3CF0,
+	0x3FEE76C8,0xB4395810, 0x3FE28FCF,0xB47E206F,
+	0x3FEE7EF9,0xDB22D0E5, 0x3FE28922,0xCE07DB4C,
+	0x3FEE872B,0x020C49BA, 0x3FE28274,0xB0976C1C,
+	0x3FEE8F5C,0x28F5C28F, 0x3FE27BC5,0x5C9CE5D6,
+	0x3FEE978D,0x4FDF3B64, 0x3FE27514,0xD2886FCD,
+	0x3FEE9FBE,0x76C8B439, 0x3FE26E63,0x12CA45A4,
+	0x3FEEA7EF,0x9DB22D0E, 0x3FE267B0,0x1DD2B74B,
+	0x3FEEB020,0xC49BA5E3, 0x3FE260FB,0xF41228F4,
+	0x3FEEB851,0xEB851EB8, 0x3FE25A46,0x95F91310,
+	0x3FEEC083,0x126E978D, 0x3FE25390,0x03F80243,
+	0x3FEEC8B4,0x39581062, 0x3FE24CD8,0x3E7F9760,
+	0x3FEED0E5,0x60418937, 0x3FE2461F,0x46008761,
+	0x3FEED916,0x872B020C, 0x3FE23F65,0x1AEB9B5C,
+	0x3FEEE147,0xAE147AE1, 0x3FE238A9,0xBDB1B084,
+	0x3FEEE978,0xD4FDF3B6, 0x3FE231ED,0x2EC3B816,
+	0x3FEEF1A9,0xFBE76C8B, 0x3FE22B2F,0x6E92B75D,
+	0x3FEEF9DB,0x22D0E560, 0x3FE22470,0x7D8FC7A3,
+	0x3FEF020C,0x49BA5E35, 0x3FE21DB0,0x5C2C162C,
+	0x3FEF0A3D,0x70A3D70A, 0x3FE216EF,0x0AD8E430,
+	0x3FEF126E,0x978D4FDF, 0x3FE2102C,0x8A0786D0,
+	0x3FEF1A9F,0xBE76C8B4, 0x3FE20968,0xDA296712,
+	0x3FEF22D0,0xE5604189, 0x3FE202A3,0xFBB001DA,
+	0x3FEF2B02,0x0C49BA5E, 0x3FE1FBDD,0xEF0CE7DD,
+	0x3FEF3333,0x33333333, 0x3FE1F516,0xB4B1BDA1,
+	0x3FEF3B64,0x5A1CAC08, 0x3FE1EE4E,0x4D103B71,
+	0x3FEF4395,0x810624DD, 0x3FE1E784,0xB89A2D56,
+	0x3FEF4BC6,0xA7EF9DB2, 0x3FE1E0B9,0xF7C1730F,
+	0x3FEF53F7,0xCED91687, 0x3FE1D9EE,0x0AF8000E,
+	0x3FEF5C28,0xF5C28F5C, 0x3FE1D320,0xF2AFDB6A,
+	0x3FEF645A,0x1CAC0831, 0x3FE1CC52,0xAF5B1FDC,
+	0x3FEF6C8B,0x43958106, 0x3FE1C583,0x416BFBB6,
+	0x3FEF74BC,0x6A7EF9DB, 0x3FE1BEB2,0xA954B0DB,
+	0x3FEF7CED,0x916872B0, 0x3FE1B7E0,0xE78794BB,
+	0x3FEF851E,0xB851EB85, 0x3FE1B10D,0xFC771045,
+	0x3FEF8D4F,0xDF3B645A, 0x3FE1AA39,0xE8959FE5,
+	0x3FEF9581,0x0624DD2F, 0x3FE1A364,0xAC55D37C,
+	0x3FEF9DB2,0x2D0E5604, 0x3FE19C8E,0x482A4E55,
+	0x3FEFA5E3,0x53F7CED9, 0x3FE195B6,0xBC85C721,
+	0x3FEFAE14,0x7AE147AE, 0x3FE18EDE,0x09DB07EE,
+	0x3FEFB645,0xA1CAC083, 0x3FE18804,0x309CEE20,
+	0x3FEFBE76,0xC8B43958, 0x3FE18129,0x313E6A68,
+	0x3FEFC6A7,0xEF9DB22D, 0x3FE17A4D,0x0C3280BE,
+	0x3FEFCED9,0x16872B02, 0x3FE1736F,0xC1EC485B,
+	0x3FEFD70A,0x3D70A3D7, 0x3FE16C91,0x52DEEBAD,
+	0x3FEFDF3B,0x645A1CAC, 0x3FE165B1,0xBF7DA853,
+	0x3FEFE76C,0x8B439581, 0x3FE15ED1,0x083BCF15,
+	0x3FEFEF9D,0xB22D0E56, 0x3FE157EF,0x2D8CC3DB,
+	0x3FEFF7CE,0xD916872B, 0x3FE1510C,0x2FE3FDA7,
+	0x3FF00000,0x00000000, 0x3FE14A28,0x0FB5068C,
+	0x3FF00418,0x9374BC6A, 0x3FE14342,0xCD737BA8,
+	0x3FF00831,0x26E978D5, 0x3FE13C5C,0x69930D1A,
+	0x3FF00C49,0xBA5E353F, 0x3FE13574,0xE4877E00,
+	0x3FF01062,0x4DD2F1AA, 0x3FE12E8C,0x3EC4A465,
+	0x3FF0147A,0xE147AE14, 0x3FE127A2,0x78BE6947,
+	0x3FF01893,0x74BC6A7F, 0x3FE120B7,0x92E8C882,
+	0x3FF01CAC,0x083126E9, 0x3FE119CB,0x8DB7D0D5,
+	0x3FF020C4,0x9BA5E354, 0x3FE112DE,0x699FA3CC,
+	0x3FF024DD,0x2F1A9FBE, 0x3FE10BF0,0x271475C9,
+	0x3FF028F5,0xC28F5C29, 0x3FE10500,0xC68A8DED,
+	0x3FF02D0E,0x56041893, 0x3FE0FE10,0x4876461C,
+	0x3FF03126,0xE978D4FE, 0x3FE0F71E,0xAD4C0AEC,
+	0x3FF0353F,0x7CED9168, 0x3FE0F02B,0xF5805BA8,
+	0x3FF03958,0x10624DD3, 0x3FE0E938,0x2187CA3B,
+	0x3FF03D70,0xA3D70A3D, 0x3FE0E243,0x31D6FB38,
+	0x3FF04189,0x374BC6A8, 0x3FE0DB4D,0x26E2A5C0,
+	0x3FF045A1,0xCAC08312, 0x3FE0D456,0x011F938E,
+	0x3FF049BA,0x5E353F7D, 0x3FE0CD5D,0xC102A0DF,
+	0x3FF04DD2,0xF1A9FBE7, 0x3FE0C664,0x6700BC77,
+	0x3FF051EB,0x851EB852, 0x3FE0BF69,0xF38EE78C,
+	0x3FF05604,0x189374BC, 0x3FE0B86E,0x672235CE,
+	0x3FF05A1C,0xAC083127, 0x3FE0B171,0xC22FCD4E,
+	0x3FF05E35,0x3F7CED91, 0x3FE0AA74,0x052CE689,
+	0x3FF0624D,0xD2F1A9FC, 0x3FE0A375,0x308ECC4E,
+	0x3FF06666,0x66666666, 0x3FE09C75,0x44CADBC7,
+	0x3FF06A7E,0xF9DB22D1, 0x3FE09574,0x42568460,
+	0x3FF06E97,0x8D4FDF3B, 0x3FE08E72,0x29A747D4,
+	0x3FF072B0,0x20C49BA6, 0x3FE0876E,0xFB32BA0E,
+	0x3FF076C8,0xB4395810, 0x3FE0806A,0xB76E8138,
+	0x3FF07AE1,0x47AE147B, 0x3FE07965,0x5ED055A0,
+	0x3FF07EF9,0xDB22D0E5, 0x3FE0725E,0xF1CE01BF,
+	0x3FF08312,0x6E978D50, 0x3FE06B57,0x70DD6225,
+	0x3FF0872B,0x020C49BA, 0x3FE0644E,0xDC74657F,
+	0x3FF08B43,0x95810625, 0x3FE05D45,0x35090C80,
+	0x3FF08F5C,0x28F5C28F, 0x3FE0563A,0x7B1169E7,
+	0x3FF09374,0xBC6A7EFA, 0x3FE04F2E,0xAF03A26B,
+	0x3FF0978D,0x4FDF3B64, 0x3FE04821,0xD155ECC0,
+	0x3FF09BA5,0xE353F7CF, 0x3FE04113,0xE27E9184,
+	0x3FF09FBE,0x76C8B439, 0x3FE03A04,0xE2F3EB3E,
+	0x3FF0A3D7,0x0A3D70A4, 0x3FE032F4,0xD32C6653,
+	0x3FF0A7EF,0x9DB22D0E, 0x3FE02BE3,0xB39E8101,
+	0x3FF0AC08,0x3126E979, 0x3FE024D1,0x84C0CB53,
+	0x3FF0B020,0xC49BA5E3, 0x3FE01DBE,0x4709E71F,
+	0x3FF0B439,0x5810624E, 0x3FE016A9,0xFAF087F8,
+	0x3FF0B851,0xEB851EB8, 0x3FE00F94,0xA0EB732D,
+	0x3FF0BC6A,0x7EF9DB23, 0x3FE0087E,0x39717FB8,
+	0x3FF0C083,0x126E978D, 0x3FE00166,0xC4F99643,
+	0x3FF0C49B,0xA5E353F8, 0x3FDFF49C,0x87F56223,
+	0x3FF0C8B4,0x39581062, 0x3FDFE669,0x6DD7B80E,
+	0x3FF0CCCC,0xCCCCCCCD, 0x3FDFD834,0x3C886923,
+	0x3FF0D0E5,0x60418937, 0x3FDFC9FC,0xF4F5D35F,
+	0x3FF0D4FD,0xF3B645A2, 0x3FDFBBC3,0x980E77B4,
+	0x3FF0D916,0x872B020C, 0x3FDFAD88,0x26C0FA17,
+	0x3FF0DD2F,0x1A9FBE77, 0x3FDF9F4A,0xA1FC2152,
+	0x3FF0E147,0xAE147AE1, 0x3FDF910B,0x0AAED712,
+	0x3FF0E560,0x4189374C, 0x3FDF82C9,0x61C827BB,
+	0x3FF0E978,0xD4FDF3B6, 0x3FDF7485,0xA8374274,
+	0x3FF0ED91,0x6872B021, 0x3FDF663F,0xDEEB78FC,
+	0x3FF0F1A9,0xFBE76C8B, 0x3FDF57F8,0x06D43FB5,
+	0x3FF0F5C2,0x8F5C28F6, 0x3FDF49AE,0x20E12D79,
+	0x3FF0F9DB,0x22D0E560, 0x3FDF3B62,0x2E01FBA8,
+	0x3FF0FDF3,0xB645A1CB, 0x3FDF2D14,0x2F2685FA,
+	0x3FF1020C,0x49BA5E35, 0x3FDF1EC4,0x253ECA8A,
+	0x3FF10624,0xDD2F1AA0, 0x3FDF1072,0x113AE9B0,
+	0x3FF10A3D,0x70A3D70A, 0x3FDF021D,0xF40B2606,
+	0x3FF10E56,0x04189375, 0x3FDEF3C7,0xCE9FE443,
+	0x3FF1126E,0x978D4FDF, 0x3FDEE56F,0xA1E9AB41,
+	0x3FF11687,0x2B020C4A, 0x3FDED715,0x6ED923D6,
+	0x3FF11A9F,0xBE76C8B4, 0x3FDEC8B9,0x365F18DF,
+	0x3FF11EB8,0x51EB851F, 0x3FDEBA5A,0xF96C7713,
+	0x3FF122D0,0xE5604189, 0x3FDEABFA,0xB8F24D0F,
+	0x3FF126E9,0x78D4FDF4, 0x3FDE9D98,0x75E1CB2C,
+	0x3FF12B02,0x0C49BA5E, 0x3FDE8F34,0x312C438C,
+	0x3FF12F1A,0x9FBE76C9, 0x3FDE80CD,0xEBC329E9,
+	0x3FF13333,0x33333333, 0x3FDE7265,0xA69813A9,
+	0x3FF1374B,0xC6A7EF9E, 0x3FDE63FB,0x629CB7A9,
+	0x3FF13B64,0x5A1CAC08, 0x3FDE558F,0x20C2EE52,
+	0x3FF13F7C,0xED916873, 0x3FDE4720,0xE1FCB167,
+	0x3FF14395,0x810624DD, 0x3FDE38B0,0xA73C1C14,
+	0x3FF147AE,0x147AE148, 0x3FDE2A3E,0x71736AC3,
+	0x3FF14BC6,0xA7EF9DB2, 0x3FDE1BCA,0x4194FB23,
+	0x3FF14FDF,0x3B645A1D, 0x3FDE0D54,0x18934C04,
+	0x3FF153F7,0xCED91687, 0x3FDDFEDB,0xF760FD5B,
+	0x3FF15810,0x624DD2F2, 0x3FDDF061,0xDEF0D01B,
+	0x3FF15C28,0xF5C28F5C, 0x3FDDE1E5,0xD035A642,
+	0x3FF16041,0x89374BC7, 0x3FDDD367,0xCC2282A9,
+	0x3FF1645A,0x1CAC0831, 0x3FDDC4E7,0xD3AA8912,
+	0x3FF16872,0xB020C49C, 0x3FDDB665,0xE7C0FDFE,
+	0x3FF16C8B,0x43958106, 0x3FDDA7E2,0x095946B6,
+	0x3FF170A3,0xD70A3D71, 0x3FDD995C,0x3966E91F,
+	0x3FF174BC,0x6A7EF9DB, 0x3FDD8AD4,0x78DD8BCB,
+	0x3FF178D4,0xFDF3B646, 0x3FDD7C4A,0xC8B0F5C6,
+	0x3FF17CED,0x916872B0, 0x3FDD6DBF,0x29D50EA8,
+	0x3FF18106,0x24DD2F1B, 0x3FDD5F31,0x9D3DDE63,
+	0x3FF1851E,0xB851EB85, 0x3FDD50A2,0x23DF8D56,
+	0x3FF18937,0x4BC6A7F0, 0x3FDD4210,0xBEAE641C,
+	0x3FF18D4F,0xDF3B645A, 0x3FDD337D,0x6E9ECB99,
+	0x3FF19168,0x72B020C5, 0x3FDD24E8,0x34A54CCF,
+	0x3FF19581,0x0624DD2F, 0x3FDD1651,0x11B690EA,
+	0x3FF19999,0x9999999A, 0x3FDD07B8,0x06C76111,
+	0x3FF19DB2,0x2D0E5604, 0x3FDCF91D,0x14CCA677,
+	0x3FF1A1CA,0xC083126F, 0x3FDCEA80,0x3CBB6A2B,
+	0x3FF1A5E3,0x53F7CED9, 0x3FDCDBE1,0x7F88D525,
+	0x3FF1A9FB,0xE76C8B44, 0x3FDCCD40,0xDE2A301A,
+	0x3FF1AE14,0x7AE147AE, 0x3FDCBE9E,0x5994E38A,
+	0x3FF1B22D,0x0E560419, 0x3FDCAFF9,0xF2BE7790,
+	0x3FF1B645,0xA1CAC083, 0x3FDCA153,0xAA9C93F0,
+	0x3FF1BA5E,0x353F7CEE, 0x3FDC92AB,0x8224FFEB,
+	0x3FF1BE76,0xC8B43958, 0x3FDC8401,0x7A4DA24C,
+	0x3FF1C28F,0x5C28F5C3, 0x3FDC7555,0x940C8139,
+	0x3FF1C6A7,0xEF9DB22D, 0x3FDC66A7,0xD057C240,
+	0x3FF1CAC0,0x83126E98, 0x3FDC57F8,0x3025AA2C,
+	0x3FF1CED9,0x16872B02, 0x3FDC4946,0xB46C9D12,
+	0x3FF1D2F1,0xA9FBE76D, 0x3FDC3A93,0x5E231E21,
+	0x3FF1D70A,0x3D70A3D7, 0x3FDC2BDE,0x2E3FCFAF,
+	0x3FF1DB22,0xD0E56042, 0x3FDC1D27,0x25B97310,
+	0x3FF1DF3B,0x645A1CAC, 0x3FDC0E6E,0x4586E89F,
+	0x3FF1E353,0xF7CED917, 0x3FDBFFB3,0x8E9F2F90,
+	0x3FF1E76C,0x8B439581, 0x3FDBF0F7,0x01F96601,
+	0x3FF1EB85,0x1EB851EC, 0x3FDBE238,0xA08CC8CB,
+	0x3FF1EF9D,0xB22D0E56, 0x3FDBD378,0x6B50B38B,
+	0x3FF1F3B6,0x45A1CAC1, 0x3FDBC4B6,0x633CA07B,
+	0x3FF1F7CE,0xD916872B, 0x3FDBB5F2,0x8948287A,
+	0x3FF1FBE7,0x6C8B4396, 0x3FDBA72C,0xDE6B02E3,
+	0x3FF20000,0x00000000, 0x3FDB9865,0x639D0596,
+	0x3FF20418,0x9374BC6A, 0x3FDB899C,0x19D624CD,
+	0x3FF20831,0x26E978D5, 0x3FDB7AD1,0x020E731F,
+	0x3FF20C49,0xBA5E353F, 0x3FDB6C04,0x1D3E2171,
+	0x3FF21062,0x4DD2F1AA, 0x3FDB5D35,0x6C5D7ED0,
+	0x3FF2147A,0xE147AE14, 0x3FDB4E64,0xF064F881,
+	0x3FF21893,0x74BC6A7F, 0x3FDB3F92,0xAA4D19CF,
+	0x3FF21CAC,0x083126E9, 0x3FDB30BE,0x9B0E8C1A,
+	0x3FF220C4,0x9BA5E354, 0x3FDB21E8,0xC3A216A8,
+	0x3FF224DD,0x2F1A9FBE, 0x3FDB1311,0x25009EB5,
+	0x3FF228F5,0xC28F5C29, 0x3FDB0437,0xC0232741,
+	0x3FF22D0E,0x56041893, 0x3FDAF55C,0x9602D123,
+	0x3FF23126,0xE978D4FE, 0x3FDAE67F,0xA798DAD5,
+	0x3FF2353F,0x7CED9168, 0x3FDAD7A0,0xF5DEA083,
+	0x3FF23958,0x10624DD3, 0x3FDAC8C0,0x81CD9BE1,
+	0x3FF23D70,0xA3D70A3D, 0x3FDAB9DE,0x4C5F6434,
+	0x3FF24189,0x374BC6A8, 0x3FDAAAFA,0x568DAE24,
+	0x3FF245A1,0xCAC08312, 0x3FDA9C14,0xA1524BCD,
+	0x3FF249BA,0x5E353F7D, 0x3FDA8D2D,0x2DA72C8B,
+	0x3FF24DD2,0xF1A9FBE7, 0x3FDA7E43,0xFC865D0F,
+	0x3FF251EB,0x851EB852, 0x3FDA6F59,0x0EEA0729,
+	0x3FF25604,0x189374BC, 0x3FDA606C,0x65CC71DB,
+	0x3FF25A1C,0xAC083127, 0x3FDA517E,0x0228012A,
+	0x3FF25E35,0x3F7CED91, 0x3FDA428D,0xE4F73627,
+	0x3FF2624D,0xD2F1A9FC, 0x3FDA339C,0x0F34AEC6,
+	0x3FF26666,0x66666666, 0x3FDA24A8,0x81DB25EB,
+	0x3FF26A7E,0xF9DB22D1, 0x3FDA15B3,0x3DE57336,
+	0x3FF26E97,0x8D4FDF3B, 0x3FDA06BC,0x444E8B19,
+	0x3FF272B0,0x20C49BA6, 0x3FD9F7C3,0x96117EA3,
+	0x3FF276C8,0xB4395810, 0x3FD9E8C9,0x34297B8F,
+	0x3FF27AE1,0x47AE147B, 0x3FD9D9CD,0x1F91CC19,
+	0x3FF27EF9,0xDB22D0E5, 0x3FD9CACF,0x5945D705,
+	0x3FF28312,0x6E978D50, 0x3FD9BBCF,0xE2411F79,
+	0x3FF2872B,0x020C49BA, 0x3FD9ACCE,0xBB7F4501,
+	0x3FF28B43,0x95810625, 0x3FD99DCB,0xE5FC0369,
+	0x3FF28F5C,0x28F5C28F, 0x3FD98EC7,0x62B332C5,
+	0x3FF29374,0xBC6A7EFA, 0x3FD97FC1,0x32A0C746,
+	0x3FF2978D,0x4FDF3B64, 0x3FD970B9,0x56C0D144,
+	0x3FF29BA5,0xE353F7CF, 0x3FD961AF,0xD00F7D13,
+	0x3FF29FBE,0x76C8B439, 0x3FD952A4,0x9F89130D,
+	0x3FF2A3D7,0x0A3D70A4, 0x3FD94397,0xC629F767,
+	0x3FF2A7EF,0x9DB22D0E, 0x3FD93489,0x44EEAA3C,
+	0x3FF2AC08,0x3126E979, 0x3FD92579,0x1CD3C75F,
+	0x3FF2B020,0xC49BA5E3, 0x3FD91667,0x4ED60669,
+	0x3FF2B439,0x5810624E, 0x3FD90753,0xDBF23A89,
+	0x3FF2B851,0xEB851EB8, 0x3FD8F83E,0xC5255295,
+	0x3FF2BC6A,0x7EF9DB23, 0x3FD8E928,0x0B6C58D7,
+	0x3FF2C083,0x126E978D, 0x3FD8DA0F,0xAFC4731C,
+	0x3FF2C49B,0xA5E353F8, 0x3FD8CAF5,0xB32AE287,
+	0x3FF2C8B4,0x39581062, 0x3FD8BBDA,0x169D039C,
+	0x3FF2CCCC,0xCCCCCCCD, 0x3FD8ACBC,0xDB184E14,
+	0x3FF2D0E5,0x60418937, 0x3FD89D9E,0x019A54E8,
+	0x3FF2D4FD,0xF3B645A2, 0x3FD88E7D,0x8B20C623,
+	0x3FF2D916,0x872B020C, 0x3FD87F5B,0x78A96AF1,
+	0x3FF2DD2F,0x1A9FBE77, 0x3FD87037,0xCB32276D,
+	0x3FF2E147,0xAE147AE1, 0x3FD86112,0x83B8FAB3,
+	0x3FF2E560,0x4189374C, 0x3FD851EB,0xA33BFEAC,
+	0x3FF2E978,0xD4FDF3B6, 0x3FD842C3,0x2AB96821,
+	0x3FF2ED91,0x6872B021, 0x3FD83399,0x1B2F8687,
+	0x3FF2F1A9,0xFBE76C8B, 0x3FD8246D,0x759CC411,
+	0x3FF2F5C2,0x8F5C28F6, 0x3FD81540,0x3AFFA57C,
+	0x3FF2F9DB,0x22D0E560, 0x3FD80611,0x6C56CA24,
+	0x3FF2FDF3,0xB645A1CB, 0x3FD7F6E1,0x0AA0EBCC,
+	0x3FF3020C,0x49BA5E35, 0x3FD7E7AF,0x16DCDEB4,
+	0x3FF30624,0xDD2F1AA0, 0x3FD7D87B,0x92099163,
+	0x3FF30A3D,0x70A3D70A, 0x3FD7C946,0x7D260CBA,
+	0x3FF30E56,0x04189375, 0x3FD7BA0F,0xD93173C3,
+	0x3FF3126E,0x978D4FDF, 0x3FD7AAD7,0xA72B03BC,
+	0x3FF31687,0x2B020C4A, 0x3FD79B9D,0xE81213ED,
+	0x3FF31A9F,0xBE76C8B4, 0x3FD78C62,0x9CE615B1,
+	0x3FF31EB8,0x51EB851F, 0x3FD77D25,0xC6A6944B,
+	0x3FF322D0,0xE5604189, 0x3FD76DE7,0x665334EF,
+	0x3FF326E9,0x78D4FDF4, 0x3FD75EA7,0x7CEBB697,
+	0x3FF32B02,0x0C49BA5E, 0x3FD74F66,0x0B6FF20E,
+	0x3FF32F1A,0x9FBE76C9, 0x3FD74023,0x12DFD9C3,
+	0x3FF33333,0x33333333, 0x3FD730DE,0x943B79D4,
+	0x3FF3374B,0xC6A7EF9E, 0x3FD72198,0x9082F7E1,
+	0x3FF33B64,0x5A1CAC08, 0x3FD71251,0x08B69318,
+	0x3FF33F7C,0xED916873, 0x3FD70307,0xFDD6A409,
+	0x3FF34395,0x810624DD, 0x3FD6F3BD,0x70E39CAF,
+	0x3FF347AE,0x147AE148, 0x3FD6E471,0x62DE0843,
+	0x3FF34BC6,0xA7EF9DB2, 0x3FD6D523,0xD4C68B4B,
+	0x3FF34FDF,0x3B645A1D, 0x3FD6C5D4,0xC79DE369,
+	0x3FF353F7,0xCED91687, 0x3FD6B684,0x3C64E769,
+	0x3FF35810,0x624DD2F2, 0x3FD6A732,0x341C8711,
+	0x3FF35C28,0xF5C28F5C, 0x3FD697DE,0xAFC5CB30,
+	0x3FF36041,0x89374BC7, 0x3FD68889,0xB061D56D,
+	0x3FF3645A,0x1CAC0831, 0x3FD67933,0x36F1E059,
+	0x3FF36872,0xB020C49C, 0x3FD669DB,0x44773F38,
+	0x3FF36C8B,0x43958106, 0x3FD65A81,0xD9F35E15,
+	0x3FF370A3,0xD70A3D71, 0x3FD64B26,0xF867C192,
+	0x3FF374BC,0x6A7EF9DB, 0x3FD63BCA,0xA0D606F1,
+	0x3FF378D4,0xFDF3B646, 0x3FD62C6C,0xD43FE3EA,
+	0x3FF37CED,0x916872B0, 0x3FD61D0D,0x93A726B7,
+	0x3FF38106,0x24DD2F1B, 0x3FD60DAC,0xE00DB5E2,
+	0x3FF3851E,0xB851EB85, 0x3FD5FE4A,0xBA759056,
+	0x3FF38937,0x4BC6A7F0, 0x3FD5EEE7,0x23E0CD2E,
+	0x3FF38D4F,0xDF3B645A, 0x3FD5DF82,0x1D519BC2,
+	0x3FF39168,0x72B020C5, 0x3FD5D01B,0xA7CA437A,
+	0x3FF39581,0x0624DD2F, 0x3FD5C0B3,0xC44D23D9,
+	0x3FF39999,0x9999999A, 0x3FD5B14A,0x73DCB44E,
+	0x3FF39DB2,0x2D0E5604, 0x3FD5A1DF,0xB77B8443,
+	0x3FF3A1CA,0xC083126F, 0x3FD59273,0x902C3AED,
+	0x3FF3A5E3,0x53F7CED9, 0x3FD58305,0xFEF19758,
+	0x3FF3A9FB,0xE76C8B44, 0x3FD57397,0x04CE703A,
+	0x3FF3AE14,0x7AE147AE, 0x3FD56426,0xA2C5B3FE,
+	0x3FF3B22D,0x0E560419, 0x3FD554B4,0xD9DA6896,
+	0x3FF3B645,0xA1CAC083, 0x3FD54541,0xAB0FAB8A,
+	0x3FF3BA5E,0x353F7CEE, 0x3FD535CD,0x1768B1C5,
+	0x3FF3BE76,0xC8B43958, 0x3FD52657,0x1FE8C7A5,
+	0x3FF3C28F,0x5C28F5C3, 0x3FD516DF,0xC59350CB,
+	0x3FF3C6A7,0xEF9DB22D, 0x3FD50767,0x096BC829,
+	0x3FF3CAC0,0x83126E98, 0x3FD4F7EC,0xEC75BFCF,
+	0x3FF3CED9,0x16872B02, 0x3FD4E871,0x6FB4E100,
+	0x3FF3D2F1,0xA9FBE76D, 0x3FD4D8F4,0x942CEBFA,
+	0x3FF3D70A,0x3D70A3D7, 0x3FD4C976,0x5AE1B809,
+	0x3FF3DB22,0xD0E56042, 0x3FD4B9F6,0xC4D73356,
+	0x3FF3DF3B,0x645A1CAC, 0x3FD4AA75,0xD31162F3,
+	0x3FF3E353,0xF7CED917, 0x3FD49AF3,0x869462AD,
+	0x3FF3E76C,0x8B439581, 0x3FD48B6F,0xE064651B,
+	0x3FF3EB85,0x1EB851EC, 0x3FD47BEA,0xE185B36A,
+	0x3FF3EF9D,0xB22D0E56, 0x3FD46C64,0x8AFCAD6F,
+	0x3FF3F3B6,0x45A1CAC1, 0x3FD45CDC,0xDDCDC975,
+	0x3FF3F7CE,0xD916872B, 0x3FD44D53,0xDAFD944B,
+	0x3FF3FBE7,0x6C8B4396, 0x3FD43DC9,0x8390B113,
+	0x3FF40000,0x00000000, 0x3FD42E3D,0xD88BD952,
+	0x3FF40418,0x9374BC6A, 0x3FD41EB0,0xDAF3DCC3,
+	0x3FF40831,0x26E978D5, 0x3FD40F22,0x8BCDA152,
+	0x3FF40C49,0xBA5E353F, 0x3FD3FF92,0xEC1E2314,
+	0x3FF41062,0x4DD2F1AA, 0x3FD3F001,0xFCEA741F,
+	0x3FF4147A,0xE147AE14, 0x3FD3E06F,0xBF37BC92,
+	0x3FF41893,0x74BC6A7F, 0x3FD3D0DC,0x340B3A6C,
+	0x3FF41CAC,0x083126E9, 0x3FD3C147,0x5C6A4195,
+	0x3FF420C4,0x9BA5E354, 0x3FD3B1B1,0x395A3BAE,
+	0x3FF424DD,0x2F1A9FBE, 0x3FD3A219,0xCBE0A823,
+	0x3FF428F5,0xC28F5C29, 0x3FD39281,0x15031BF4,
+	0x3FF42D0E,0x56041893, 0x3FD382E7,0x15C741C9,
+	0x3FF43126,0xE978D4FE, 0x3FD3734B,0xCF32D9C0,
+	0x3FF4353F,0x7CED9168, 0x3FD363AF,0x424BB97A,
+	0x3FF43958,0x10624DD3, 0x3FD35411,0x7017CBEB,
+	0x3FF43D70,0xA3D70A3D, 0x3FD34472,0x599D1168,
+	0x3FF44189,0x374BC6A8, 0x3FD334D1,0xFFE19F77,
+	0x3FF445A1,0xCAC08312, 0x3FD32530,0x63EBA0DD,
+	0x3FF449BA,0x5E353F7D, 0x3FD3158D,0x86C1556D,
+	0x3FF44DD2,0xF1A9FBE7, 0x3FD305E9,0x69691219,
+	0x3FF451EB,0x851EB852, 0x3FD2F644,0x0CE940BB,
+	0x3FF45604,0x189374BC, 0x3FD2E69D,0x7248602A,
+	0x3FF45A1C,0xAC083127, 0x3FD2D6F5,0x9A8D0406,
+	0x3FF45E35,0x3F7CED91, 0x3FD2C74C,0x86BDD4C7,
+	0x3FF4624D,0xD2F1A9FC, 0x3FD2B7A2,0x37E18F8B,
+	0x3FF46666,0x66666666, 0x3FD2A7F6,0xAEFF0628,
+	0x3FF46A7E,0xF9DB22D1, 0x3FD29849,0xED1D1EF6,
+	0x3FF46E97,0x8D4FDF3B, 0x3FD2889B,0xF342D4E1,
+	0x3FF472B0,0x20C49BA6, 0x3FD278EC,0xC2773737,
+	0x3FF476C8,0xB4395810, 0x3FD2693C,0x5BC169B8,
+	0x3FF47AE1,0x47AE147B, 0x3FD2598A,0xC028A462,
+	0x3FF47EF9,0xDB22D0E5, 0x3FD249D7,0xF0B43380,
+	0x3FF48312,0x6E978D50, 0x3FD23A23,0xEE6B777E,
+	0x3FF4872B,0x020C49BA, 0x3FD22A6E,0xBA55E4F0,
+	0x3FF48B43,0x95810625, 0x3FD21AB8,0x557B0467,
+	0x3FF48F5C,0x28F5C28F, 0x3FD20B00,0xC0E2727B,
+	0x3FF49374,0xBC6A7EFA, 0x3FD1FB47,0xFD93DF9E,
+	0x3FF4978D,0x4FDF3B64, 0x3FD1EB8E,0x0C971026,
+	0x3FF49BA5,0xE353F7CF, 0x3FD1DBD2,0xEEF3DC22,
+	0x3FF49FBE,0x76C8B439, 0x3FD1CC16,0xA5B22F62,
+	0x3FF4A3D7,0x0A3D70A4, 0x3FD1BC59,0x31DA094A,
+	0x3FF4A7EF,0x9DB22D0E, 0x3FD1AC9A,0x94737CE0,
+	0x3FF4AC08,0x3126E979, 0x3FD19CDA,0xCE86B099,
+	0x3FF4B020,0xC49BA5E3, 0x3FD18D19,0xE11BDE68,
+	0x3FF4B439,0x5810624E, 0x3FD17D57,0xCD3B5392,
+	0x3FF4B851,0xEB851EB8, 0x3FD16D94,0x93ED70B2,
+	0x3FF4BC6A,0x7EF9DB23, 0x3FD15DD0,0x363AA993,
+	0x3FF4C083,0x126E978D, 0x3FD14E0A,0xB52B8536,
+	0x3FF4C49B,0xA5E353F8, 0x3FD13E44,0x11C89DA8,
+	0x3FF4C8B4,0x39581062, 0x3FD12E7C,0x4D1AA008,
+	0x3FF4CCCC,0xCCCCCCCD, 0x3FD11EB3,0x682A4C5F,
+	0x3FF4D0E5,0x60418937, 0x3FD10EE9,0x640075A8,
+	0x3FF4D4FD,0xF3B645A2, 0x3FD0FF1E,0x41A601A1,
+	0x3FF4D916,0x872B020C, 0x3FD0EF52,0x0223E8DA,
+	0x3FF4DD2F,0x1A9FBE77, 0x3FD0DF84,0xA6833683,
+	0x3FF4E147,0xAE147AE1, 0x3FD0CFB6,0x2FCD0879,
+	0x3FF4E560,0x4189374C, 0x3FD0BFE6,0x9F0A8F1A,
+	0x3FF4E978,0xD4FDF3B6, 0x3FD0B015,0xF5450D4D,
+	0x3FF4ED91,0x6872B021, 0x3FD0A044,0x3385D853,
+	0x3FF4F1A9,0xFBE76C8B, 0x3FD09071,0x5AD657DA,
+	0x3FF4F5C2,0x8F5C28F6, 0x3FD0809D,0x6C4005C5,
+	0x3FF4F9DB,0x22D0E560, 0x3FD070C8,0x68CC6E3C,
+	0x3FF4FDF3,0xB645A1CB, 0x3FD060F2,0x51852F80,
+	0x3FF5020C,0x49BA5E35, 0x3FD0511B,0x2773F9F3,
+	0x3FF50624,0xDD2F1AA0, 0x3FD04142,0xEBA28FE9,
+	0x3FF50A3D,0x70A3D70A, 0x3FD03169,0x9F1AC5B8,
+	0x3FF50E56,0x04189375, 0x3FD0218F,0x42E68185,
+	0x3FF5126E,0x978D4FDF, 0x3FD011B3,0xD80FBB52,
+	0x3FF51687,0x2B020C4A, 0x3FD001D7,0x5FA07CD0,
+	0x3FF51A9F,0xBE76C8B4, 0x3FCFE3F3,0xB545C2CE,
+	0x3FF51EB8,0x51EB851F, 0x3FCFC436,0x94422C19,
+	0x3FF522D0,0xE5604189, 0x3FCFA477,0x5E4AB298,
+	0x3FF526E9,0x78D4FDF4, 0x3FCF84B6,0x1573F632,
+	0x3FF52B02,0x0C49BA5E, 0x3FCF64F2,0xBBD2B9B6,
+	0x3FF52F1A,0x9FBE76C9, 0x3FCF452D,0x537BE27D,
+	0x3FF53333,0x33333333, 0x3FCF2565,0xDE847882,
+	0x3FF5374B,0xC6A7EF9E, 0x3FCF059C,0x5F01A605,
+	0x3FF53B64,0x5A1CAC08, 0x3FCEE5D0,0xD708B7A3,
+	0x3FF53F7C,0xED916873, 0x3FCEC603,0x48AF1BF4,
+	0x3FF54395,0x810624DD, 0x3FCEA633,0xB60A63AB,
+	0x3FF547AE,0x147AE148, 0x3FCE8662,0x21304130,
+	0x3FF54BC6,0xA7EF9DB2, 0x3FCE668E,0x8C3688BE,
+	0x3FF54FDF,0x3B645A1D, 0x3FCE46B8,0xF9333000,
+	0x3FF553F7,0xCED91687, 0x3FCE26E1,0x6A3C4E2E,
+	0x3FF55810,0x624DD2F2, 0x3FCE0707,0xE1681BAA,
+	0x3FF55C28,0xF5C28F5C, 0x3FCDE72C,0x60CCF21E,
+	0x3FF56041,0x89374BC7, 0x3FCDC74E,0xEA814C15,
+	0x3FF5645A,0x1CAC0831, 0x3FCDA76F,0x809BC51F,
+	0x3FF56872,0xB020C49C, 0x3FCD878E,0x25331967,
+	0x3FF56C8B,0x43958106, 0x3FCD67AA,0xDA5E25D3,
+	0x3FF570A3,0xD70A3D71, 0x3FCD47C5,0xA233E7A3,
+	0x3FF574BC,0x6A7EF9DB, 0x3FCD27DE,0x7ECB7C8A,
+	0x3FF578D4,0xFDF3B646, 0x3FCD07F5,0x723C224C,
+	0x3FF57CED,0x916872B0, 0x3FCCE80A,0x7E9D36DE,
+	0x3FF58106,0x24DD2F1B, 0x3FCCC81D,0xA60637FF,
+	0x3FF5851E,0xB851EB85, 0x3FCCA82E,0xEA8EC355,
+	0x3FF58937,0x4BC6A7F0, 0x3FCC883E,0x4E4E960F,
+	0x3FF58D4F,0xDF3B645A, 0x3FCC684B,0xD35D8CFB,
+	0x3FF59168,0x72B020C5, 0x3FCC4857,0x7BD3A428,
+	0x3FF59581,0x0624DD2F, 0x3FCC2861,0x49C8F6FF,
+	0x3FF59999,0x9999999A, 0x3FCC0869,0x3F55BFE4,
+	0x3FF59DB2,0x2D0E5604, 0x3FCBE86F,0x5E92584F,
+	0x3FF5A1CA,0xC083126F, 0x3FCBC873,0xA997386C,
+	0x3FF5A5E3,0x53F7CED9, 0x3FCBA876,0x227CF736,
+	0x3FF5A9FB,0xE76C8B44, 0x3FCB8876,0xCB5C4A13,
+	0x3FF5AE14,0x7AE147AE, 0x3FCB6875,0xA64E04F3,
+	0x3FF5B22D,0x0E560419, 0x3FCB4872,0xB56B19ED,
+	0x3FF5B645,0xA1CAC083, 0x3FCB286D,0xFACC9958,
+	0x3FF5BA5E,0x353F7CEE, 0x3FCB0867,0x788BB16C,
+	0x3FF5BE76,0xC8B43958, 0x3FCAE85F,0x30C1AE5E,
+	0x3FF5C28F,0x5C28F5C3, 0x3FCAC855,0x2587F9FC,
+	0x3FF5C6A7,0xEF9DB22D, 0x3FCAA849,0x58F81BC8,
+	0x3FF5CAC0,0x83126E98, 0x3FCA883B,0xCD2BB898,
+	0x3FF5CED9,0x16872B02, 0x3FCA682C,0x843C92B1,
+	0x3FF5D2F1,0xA9FBE76D, 0x3FCA481B,0x80448964,
+	0x3FF5D70A,0x3D70A3D7, 0x3FCA2808,0xC35D992D,
+	0x3FF5DB22,0xD0E56042, 0x3FCA07F4,0x4FA1DB4A,
+	0x3FF5DF3B,0x645A1CAC, 0x3FC9E7DE,0x272B85DD,
+	0x3FF5E353,0xF7CED917, 0x3FC9C7C6,0x4C14EB89,
+	0x3FF5E76C,0x8B439581, 0x3FC9A7AC,0xC0787B89,
+	0x3FF5EB85,0x1EB851EC, 0x3FC98791,0x8670C154,
+	0x3FF5EF9D,0xB22D0E56, 0x3FC96774,0xA01864B5,
+	0x3FF5F3B6,0x45A1CAC1, 0x3FC94756,0x0F8A2968,
+	0x3FF5F7CE,0xD916872B, 0x3FC92735,0xD6E0EF39,
+	0x3FF5FBE7,0x6C8B4396, 0x3FC90713,0xF837B19E,
+	0x3FF60000,0x00000000, 0x3FC8E6F0,0x75A987D6,
+	0x3FF60418,0x9374BC6A, 0x3FC8C6CB,0x5151A48D,
+	0x3FF60831,0x26E978D5, 0x3FC8A6A4,0x8D4B55CF,
+	0x3FF60C49,0xBA5E353F, 0x3FC8867C,0x2BB204FE,
+	0x3FF61062,0x4DD2F1AA, 0x3FC86652,0x2EA13679,
+	0x3FF6147A,0xE147AE14, 0x3FC84626,0x983489B3,
+	0x3FF61893,0x74BC6A7F, 0x3FC825F9,0x6A87B8D6,
+	0x3FF61CAC,0x083126E9, 0x3FC805CA,0xA7B698D9,
+	0x3FF620C4,0x9BA5E354, 0x3FC7E59A,0x51DD1924,
+	0x3FF624DD,0x2F1A9FBE, 0x3FC7C568,0x6B1743A5,
+	0x3FF628F5,0xC28F5C29, 0x3FC7A534,0xF5813C74,
+	0x3FF62D0E,0x56041893, 0x3FC784FF,0xF33741E9,
+	0x3FF63126,0xE978D4FE, 0x3FC764C9,0x6655AC3E,
+	0x3FF6353F,0x7CED9168, 0x3FC74491,0x50F8EDA7,
+	0x3FF63958,0x10624DD3, 0x3FC72457,0xB53D91F2,
+	0x3FF63D70,0xA3D70A3D, 0x3FC7041C,0x95403EA2,
+	0x3FF64189,0x374BC6A8, 0x3FC6E3DF,0xF31DB28B,
+	0x3FF645A1,0xCAC08312, 0x3FC6C3A1,0xD0F2C5F2,
+	0x3FF649BA,0x5E353F7D, 0x3FC6A362,0x30DC6A25,
+	0x3FF64DD2,0xF1A9FBE7, 0x3FC68321,0x14F7A999,
+	0x3FF651EB,0x851EB852, 0x3FC662DE,0x7F61A789,
+	0x3FF65604,0x189374BC, 0x3FC6429A,0x7237A00F,
+	0x3FF65A1C,0xAC083127, 0x3FC62254,0xEF96E7C3,
+	0x3FF65E35,0x3F7CED91, 0x3FC6020D,0xF99CEBD6,
+	0x3FF6624D,0xD2F1A9FC, 0x3FC5E1C5,0x926731AF,
+	0x3FF66666,0x66666666, 0x3FC5C17B,0xBC13570B,
+	0x3FF66A7E,0xF9DB22D1, 0x3FC5A130,0x78BF1191,
+	0x3FF66E97,0x8D4FDF3B, 0x3FC580E3,0xCA882EF7,
+	0x3FF672B0,0x20C49BA6, 0x3FC56095,0xB38C949B,
+	0x3FF676C8,0xB4395810, 0x3FC54046,0x35EA3F9E,
+	0x3FF67AE1,0x47AE147B, 0x3FC51FF5,0x53BF4485,
+	0x3FF67EF9,0xDB22D0E5, 0x3FC4FFA3,0x0F29CF50,
+	0x3FF68312,0x6E978D50, 0x3FC4DF4F,0x6A48231A,
+	0x3FF6872B,0x020C49BA, 0x3FC4BEFA,0x67389A35,
+	0x3FF68B43,0x95810625, 0x3FC49EA4,0x0819A5C5,
+	0x3FF68F5C,0x28F5C28F, 0x3FC47E4C,0x4F09CDDF,
+	0x3FF69374,0xBC6A7EFA, 0x3FC45DF3,0x3E27B123,
+	0x3FF6978D,0x4FDF3B64, 0x3FC43D98,0xD79204D9,
+	0x3FF69BA5,0xE353F7CF, 0x3FC41D3D,0x1D67948F,
+	0x3FF69FBE,0x76C8B439, 0x3FC3FCE0,0x11C74233,
+	0x3FF6A3D7,0x0A3D70A4, 0x3FC3DC81,0xB6D005B1,
+	0x3FF6A7EF,0x9DB22D0E, 0x3FC3BC22,0x0EA0ED0F,
+	0x3FF6AC08,0x3126E979, 0x3FC39BC1,0x1B591C0B,
+	0x3FF6B020,0xC49BA5E3, 0x3FC37B5E,0xDF17CC33,
+	0x3FF6B439,0x5810624E, 0x3FC35AFB,0x5BFC4C87,
+	0x3FF6B851,0xEB851EB8, 0x3FC33A96,0x94260190,
+	0x3FF6BC6A,0x7EF9DB23, 0x3FC31A30,0x89B46502,
+	0x3FF6C083,0x126E978D, 0x3FC2F9C9,0x3EC705D4,
+	0x3FF6C49B,0xA5E353F8, 0x3FC2D960,0xB57D87DD,
+	0x3FF6C8B4,0x39581062, 0x3FC2B8F6,0xEFF7A3F2,
+	0x3FF6CCCC,0xCCCCCCCD, 0x3FC2988B,0xF0552782,
+	0x3FF6D0E5,0x60418937, 0x3FC2781F,0xB8B5F4B2,
+	0x3FF6D4FD,0xF3B645A2, 0x3FC257B2,0x4B3A01F7,
+	0x3FF6D916,0x872B020C, 0x3FC23743,0xAA015A39,
+	0x3FF6DD2F,0x1A9FBE77, 0x3FC216D3,0xD72C1C66,
+	0x3FF6E147,0xAE147AE1, 0x3FC1F662,0xD4DA7B97,
+	0x3FF6E560,0x4189374C, 0x3FC1D5F0,0xA52CBEA6,
+	0x3FF6E978,0xD4FDF3B6, 0x3FC1B57D,0x4A434050,
+	0x3FF6ED91,0x6872B021, 0x3FC19508,0xC63E6ECC,
+	0x3FF6F1A9,0xFBE76C8B, 0x3FC17493,0x1B3ECBEA,
+	0x3FF6F5C2,0x8F5C28F6, 0x3FC1541C,0x4B64ECAF,
+	0x3FF6F9DB,0x22D0E560, 0x3FC133A4,0x58D17972,
+	0x3FF6FDF3,0xB645A1CB, 0x3FC1132B,0x45A52D77,
+	0x3FF7020C,0x49BA5E35, 0x3FC0F2B1,0x1400D70B,
+	0x3FF70624,0xDD2F1AA0, 0x3FC0D235,0xC6055722,
+	0x3FF70A3D,0x70A3D70A, 0x3FC0B1B9,0x5DD3A173,
+	0x3FF70E56,0x04189375, 0x3FC0913B,0xDD8CBC13,
+	0x3FF7126E,0x978D4FDF, 0x3FC070BD,0x4751BF93,
+	0x3FF71687,0x2B020C4A, 0x3FC0503D,0x9D43D699,
+	0x3FF71A9F,0xBE76C8B4, 0x3FC02FBC,0xE1843E00,
+	0x3FF71EB8,0x51EB851F, 0x3FC00F3B,0x16344474,
+	0x3FF722D0,0xE5604189, 0x3FBFDD70,0x7AEA9516,
+	0x3FF726E9,0x78D4FDF4, 0x3FBF9C68,0xB2D184CA,
+	0x3FF72B02,0x0C49BA5E, 0x3FBF5B5E,0xD8605F8A,
+	0x3FF72F1A,0x9FBE76C9, 0x3FBF1A52,0xEFDA4F61,
+	0x3FF73333,0x33333333, 0x3FBED944,0xFD82A112,
+	0x3FF7374B,0xC6A7EF9E, 0x3FBE9835,0x059CC352,
+	0x3FF73B64,0x5A1CAC08, 0x3FBE5723,0x0C6C4704,
+	0x3FF73F7C,0xED916873, 0x3FBE160F,0x1634DE6D,
+	0x3FF74395,0x810624DD, 0x3FBDD4F9,0x273A5D6D,
+	0x3FF747AE,0x147AE148, 0x3FBD93E1,0x43C0B8BA,
+	0x3FF74BC6,0xA7EF9DB2, 0x3FBD52C7,0x700C0617,
+	0x3FF74FDF,0x3B645A1D, 0x3FBD11AB,0xB0607B8B,
+	0x3FF753F7,0xCED91687, 0x3FBCD08E,0x09026F9C,
+	0x3FF75810,0x624DD2F2, 0x3FBC8F6E,0x7E365886,
+	0x3FF75C28,0xF5C28F5C, 0x3FBC4E4D,0x1440CC73,
+	0x3FF76041,0x89374BC7, 0x3FBC0D29,0xCF6680B5,
+	0x3FF7645A,0x1CAC0831, 0x3FBBCC04,0xB3EC49FD,
+	0x3FF76872,0xB020C49C, 0x3FBB8ADD,0xC6171B93,
+	0x3FF76C8B,0x43958106, 0x3FBB49B5,0x0A2C0790,
+	0x3FF770A3,0xD70A3D71, 0x3FBB088A,0x84703E15,
+	0x3FF774BC,0x6A7EF9DB, 0x3FBAC75E,0x39290D85,
+	0x3FF778D4,0xFDF3B646, 0x3FBA8630,0x2C9BE1BB,
+	0x3FF77CED,0x916872B0, 0x3FBA4500,0x630E4443,
+	0x3FF78106,0x24DD2F1B, 0x3FBA03CE,0xE0C5DB95,
+	0x3FF7851E,0xB851EB85, 0x3FB9C29B,0xAA086B4A,
+	0x3FF78937,0x4BC6A7F0, 0x3FB98166,0xC31BD354,
+	0x3FF78D4F,0xDF3B645A, 0x3FB94030,0x3046103B,
+	0x3FF79168,0x72B020C5, 0x3FB8FEF7,0xF5CD3A50,
+	0x3FF79581,0x0624DD2F, 0x3FB8BDBE,0x17F785E8,
+	0x3FF79999,0x9999999A, 0x3FB87C82,0x9B0B4294,
+	0x3FF79DB2,0x2D0E5604, 0x3FB83B45,0x834EDB58,
+	0x3FF7A1CA,0xC083126F, 0x3FB7FA06,0xD508D5E6,
+	0x3FF7A5E3,0x53F7CED9, 0x3FB7B8C6,0x947FD2D3,
+	0x3FF7A9FB,0xE76C8B44, 0x3FB77784,0xC5FA8CD2,
+	0x3FF7AE14,0x7AE147AE, 0x3FB73641,0x6DBFD8EA,
+	0x3FF7B22D,0x0E560419, 0x3FB6F4FC,0x9016A5AF,
+	0x3FF7B645,0xA1CAC083, 0x3FB6B3B6,0x3145FB7E,
+	0x3FF7BA5E,0x353F7CEE, 0x3FB6726E,0x5594FBAD,
+	0x3FF7BE76,0xC8B43958, 0x3FB63125,0x014AE0CB,
+	0x3FF7C28F,0x5C28F5C3, 0x3FB5EFDA,0x38AEFDD5,
+	0x3FF7C6A7,0xEF9DB22D, 0x3FB5AE8E,0x0008BE6E,
+	0x3FF7CAC0,0x83126E98, 0x3FB56D40,0x5B9FA617,
+	0x3FF7CED9,0x16872B02, 0x3FB52BF1,0x4FBB5069,
+	0x3FF7D2F1,0xA9FBE76D, 0x3FB4EAA0,0xE0A3704C,
+	0x3FF7D70A,0x3D70A3D7, 0x3FB4A94F,0x129FD030,
+	0x3FF7DB22,0xD0E56042, 0x3FB467FB,0xE9F85141,
+	0x3FF7DF3B,0x645A1CAC, 0x3FB426A7,0x6AF4EBA7,
+	0x3FF7E353,0xF7CED917, 0x3FB3E551,0x99DDADB8,
+	0x3FF7E76C,0x8B439581, 0x3FB3A3FA,0x7AFABC32,
+	0x3FF7EB85,0x1EB851EC, 0x3FB362A2,0x12945172,
+	0x3FF7EF9D,0xB22D0E56, 0x3FB32148,0x64F2BDAF,
+	0x3FF7F3B6,0x45A1CAC1, 0x3FB2DFED,0x765E6631,
+	0x3FF7F7CE,0xD916872B, 0x3FB29E91,0x4B1FC587,
+	0x3FF7FBE7,0x6C8B4396, 0x3FB25D33,0xE77F6AC0,
+	0x3FF80000,0x00000000, 0x3FB21BD5,0x4FC5F9A7,
+	0x3FF80418,0x9374BC6A, 0x3FB1DA75,0x883C2A06,
+	0x3FF80831,0x26E978D5, 0x3FB19914,0x952AC790,
+	0x3FF80C49,0xBA5E353F, 0x3FB157B2,0x7ADAB1C9,
+	0x3FF81062,0x4DD2F1AA, 0x3FB1164F,0x3D94DB50,
+	0x3FF8147A,0xE147AE14, 0x3FB0D4EA,0xE1A24A14,
+	0x3FF81893,0x74BC6A7F, 0x3FB09385,0x6B4C168F,
+	0x3FF81CAC,0x083126E9, 0x3FB0521E,0xDEDB6BFC,
+	0x3FF820C4,0x9BA5E354, 0x3FB010B7,0x4099878E,
+	0x3FF824DD,0x2F1A9FBE, 0x3FAF9E9D,0x299F715A,
+	0x3FF828F5,0xC28F5C29, 0x3FAF1BC9,0xBF8EC052,
+	0x3FF82D0E,0x56041893, 0x3FAE98F4,0x4B93E0E9,
+	0x3FF83126,0xE978D4FE, 0x3FAE161C,0xD641D9BA,
+	0x3FF8353F,0x7CED9168, 0x3FAD9343,0x682BD381,
+	0x3FF83958,0x10624DD3, 0x3FAD1068,0x09E51792,
+	0x3FF83D70,0xA3D70A3D, 0x3FAC8D8A,0xC4011043,
+	0x3FF84189,0x374BC6A8, 0x3FAC0AAB,0x9F134761,
+	0x3FF845A1,0xCAC08312, 0x3FAB87CA,0xA3AF669C,
+	0x3FF849BA,0x5E353F7D, 0x3FAB04E7,0xDA6935FA,
+	0x3FF84DD2,0xF1A9FBE7, 0x3FAA8203,0x4BD49C47,
+	0x3FF851EB,0x851EB852, 0x3FA9FF1D,0x00859D82,
+	0x3FF85604,0x189374BC, 0x3FA97C35,0x01105B51,
+	0x3FF85A1C,0xAC083127, 0x3FA8F94B,0x5609136F,
+	0x3FF85E35,0x3F7CED91, 0x3FA87660,0x0804201D,
+	0x3FF8624D,0xD2F1A9FC, 0x3FA7F373,0x1F95F690,
+	0x3FF86666,0x66666666, 0x3FA77084,0xA5532764,
+	0x3FF86A7E,0xF9DB22D1, 0x3FA6ED94,0xA1D05D09,
+	0x3FF86E97,0x8D4FDF3B, 0x3FA66AA3,0x1DA25C37,
+	0x3FF872B0,0x20C49BA6, 0x3FA5E7B0,0x215E025A,
+	0x3FF876C8,0xB4395810, 0x3FA564BB,0xB5984603,
+	0x3FF87AE1,0x47AE147B, 0x3FA4E1C5,0xE2E6355C,
+	0x3FF87EF9,0xDB22D0E5, 0x3FA45ECE,0xB1DCF690,
+	0x3FF88312,0x6E978D50, 0x3FA3DBD6,0x2B11C643,
+	0x3FF8872B,0x020C49BA, 0x3FA358DC,0x5719F7FF,
+	0x3FF88B43,0x95810625, 0x3FA2D5E1,0x3E8AF4A2,
+	0x3FF88F5C,0x28F5C28F, 0x3FA252E4,0xE9FA3AD0,
+	0x3FF89374,0xBC6A7EFA, 0x3FA1CFE7,0x61FD5D63,
+	0x3FF8978D,0x4FDF3B64, 0x3FA14CE8,0xAF2A03DC,
+	0x3FF89BA5,0xE353F7CF, 0x3FA0C9E8,0xDA15E8D0,
+	0x3FF89FBE,0x76C8B439, 0x3FA046E7,0xEB56DA59,
+	0x3FF8A3D7,0x0A3D70A4, 0x3F9F87CB,0xD7057113,
+	0x3FF8A7EF,0x9DB22D0E, 0x3F9E81C5,0xC65EEBAE,
+	0x3FF8AC08,0x3126E979, 0x3F9D7BBD,0xB5E62B1A,
+	0x3FF8B020,0xC49BA5E3, 0x3F9C75B3,0xB6C7587B,
+	0x3FF8B439,0x5810624E, 0x3F9B6FA7,0xDA2EBC5D,
+	0x3FF8B851,0xEB851EB8, 0x3F9A699A,0x3148BF98,
+	0x3FF8BC6A,0x7EF9DB23, 0x3F99638A,0xCD41E830,
+	0x3FF8C083,0x126E978D, 0x3F985D79,0xBF46DA32,
+	0x3FF8C49B,0xA5E353F8, 0x3F975767,0x18845494,
+	0x3FF8C8B4,0x39581062, 0x3F965152,0xEA273219,
+	0x3FF8CCCC,0xCCCCCCCD, 0x3F954B3D,0x455C662C,
+	0x3FF8D0E5,0x60418937, 0x3F944526,0x3B50FDC3,
+	0x3FF8D4FD,0xF3B645A2, 0x3F933F0D,0xDD321C3D,
+	0x3FF8D916,0x872B020C, 0x3F9238F4,0x3C2CFC43,
+	0x3FF8DD2F,0x1A9FBE77, 0x3F9132D9,0x696EECA7,
+	0x3FF8E147,0xAE147AE1, 0x3F902CBD,0x76255144,
+	0x3FF8E560,0x4189374C, 0x3F8E4D40,0xE6FB3FBC,
+	0x3FF8E978,0xD4FDF3B6, 0x3F8C4104,0xE54AC206,
+	0x3FF8ED91,0x6872B021, 0x3F8A34C7,0x099459CF,
+	0x3FF8F1A9,0xFBE76C8B, 0x3F882887,0x76335895,
+	0x3FF8F5C2,0x8F5C28F6, 0x3F861C46,0x4D832AA4,
+	0x3FF8F9DB,0x22D0E560, 0x3F841003,0xB1DF58D9,
+	0x3FF8FDF3,0xB645A1CB, 0x3F8203BF,0xC5A3825E,
+	0x3FF9020C,0x49BA5E35, 0x3F7FEEF5,0x5656BCE0,
+	0x3FF90624,0xDD2F1AA0, 0x3F7BD669,0x09A56C2F,
+	0x3FF90A3D,0x70A3D70A, 0x3F77BDDA,0xE9EACBDB,
+	0x3FF90E56,0x04189375, 0x3F73A54B,0x3BDEAFAE,
+	0x3FF9126E,0x978D4FDF, 0x3F6F1974,0x8872131E,
+	0x3FF91687,0x2B020C4A, 0x3F66E850,0x8F63B9FC,
+	0x3FF91A9F,0xBE76C8B4, 0x3F5D6E56,0x2C050A4C,
+	0x3FF91EB8,0x51EB851F, 0x3F4A1812,0x96FADBFB,
+	0x3FF922D0,0xE5604189, 0xBF2AB223,0x7F755EA9,
+	0x3FF926E9,0x78D4FDF4, 0xBF53B891,0xF35E8FB4,
+	0x3FF92B02,0x0C49BA5E, 0xBF620D6F,0x15F8BEEA,
+	0x3FF92F1A,0x9FBE76C9, 0xBF6A3E94,0x03636E0B,
+	0x3FF93333,0x33333333, 0xBF7137DB,0x9C3F8A04,
+	0x3FF9374B,0xC6A7EF9E, 0xBF75506C,0x15EDCA44,
+	0x3FF93B64,0x5A1CAC08, 0xBF7968FB,0x2A047886,
+	0x3FF93F7C,0xED916873, 0xBF7D8188,0x93CBB0FB,
+	0x3FF94395,0x810624DD, 0xBF80CD0A,0x0745D3E2,
+	0x3FF947AE,0x147AE148, 0xBF82D94E,0xAAC65ABB,
+	0x3FF94BC6,0xA7EF9DB2, 0xBF84E592,0x120BA9C8,
+	0x3FF94FDF,0x3B645A1D, 0xBF86F1D4,0x1ABA1487,
+	0x3FF953F7,0xCED91687, 0xBF88FE14,0xA276036D,
+	0x3FF95810,0x624DD2F2, 0xBF8B0A53,0x86E3FA29,
+	0x3FF95C28,0xF5C28F5C, 0xBF8D1690,0xA5A895E7,
+	0x3FF96041,0x89374BC7, 0xBF8F22CB,0xDC68938C,
+	0x3FF9645A,0x1CAC0831, 0xBF909782,0x846466FD,
+	0x3FF96872,0xB020C49C, 0xBF919D9E,0x04372227,
+	0x3FF96C8B,0x43958106, 0xBF92A3B8,0x5C7F0C11,
+	0x3FF970A3,0xD70A3D71, 0xBF93A9D1,0x7C0EC9E7,
+	0x3FF974BC,0x6A7EF9DB, 0xBF94AFE9,0x51B91451,
+	0x3FF978D4,0xFDF3B646, 0xBF95B5FF,0xCC50BA99,
+	0x3FF97CED,0x916872B0, 0xBF96BC14,0xDAA8A1C7,
+	0x3FF98106,0x24DD2F1B, 0xBF97C228,0x6B93C7C0,
+	0x3FF9851E,0xB851EB85, 0xBF98C83A,0x6DE5426B,
+	0x3FF98937,0x4BC6A7F0, 0xBF99CE4A,0xD07042CC,
+	0x3FF98D4F,0xDF3B645A, 0xBF9AD459,0x82081429,
+	0x3FF99168,0x72B020C5, 0xBF9BDA66,0x71801F27,
+	0x3FF99581,0x0624DD2F, 0xBF9CE071,0x8DABE8E9,
+	0x3FF99999,0x9999999A, 0xBF9DE67A,0xC55F1633,
+	0x3FF9C28F,0x5C28F5C3, 0xBFA41130,0x0D5A577C,
+	0x3FF9EB85,0x1EB851EC, 0xBFA92E9F,0x353A306B,
+	0x3FFA147A,0xE147AE14, 0xBFAE4B69,0x54DF58F0,
+	0x3FFA3D70,0xA3D70A3D, 0xBFB1B3B6,0x7589D014,
+	0x3FFA6666,0x66666666, 0xBFB44144,0x3DDAF9D1,
+	0x3FFA8F5C,0x28F5C28F, 0xBFB6CE4D,0x484AE8DE,
+	0x3FFAB851,0xEB851EB8, 0xBFB95AC0,0xDD274A32,
+	0x3FFAE147,0xAE147AE1, 0xBFBBE68E,0x489147C2,
+	0x3FFB0A3D,0x70A3D70A, 0xBFBE71A4,0xDAEAFE97,
+	0x3FFB3333,0x33333333, 0xBFC07DF9,0xF4A26C86,
+	0x3FFB5C28,0xF5C28F5C, 0xBFC1C2B5,0x66E56530,
+	0x3FFB851E,0xB851EB85, 0xBFC306FC,0x7418B465,
+	0x3FFBAE14,0x7AE147AE, 0xBFC44AC6,0xCF1171A2,
+	0x3FFBD70A,0x3D70A3D7, 0xBFC58E0C,0x2DD5E82E,
+	0x3FFC0000,0x00000000, 0xBFC6D0C4,0x49D3E98A,
+	0x3FFC28F5,0xC28F5C29, 0xBFC812E6,0xE017099D,
+	0x3FFC51EB,0x851EB852, 0xBFC9546B,0xB17EC324,
+	0x3FFC7AE1,0x47AE147B, 0xBFCA954A,0x82F48311,
+	0x3FFCA3D7,0x0A3D70A4, 0xBFCBD57B,0x1DA19971,
+	0x3FFCCCCC,0xCCCCCCCD, 0xBFCD14F5,0x4F250E7A,
+	0x3FFCF5C2,0x8F5C28F6, 0xBFCE53B0,0xE9C95A58,
+	0x3FFD1EB8,0x51EB851F, 0xBFCF91A5,0xC4B9FE6D,
+	0x3FFD47AE,0x147AE148, 0xBFD06765,0xDE1C7F43,
+	0x3FFD70A3,0xD70A3D71, 0xBFD1058D,0x58EA1C64,
+	0x3FFD9999,0x9999999A, 0xBFD1A345,0x464D4D6E,
+	0x3FFDC28F,0x5C28F5C3, 0xBFD24089,0x9CA89989,
+	0x3FFDEB85,0x1EB851EC, 0xBFD2DD56,0x55540E05,
+	0x3FFE147A,0xE147AE14, 0xBFD379A7,0x6CB7A0CC,
+	0x3FFE3D70,0xA3D70A3D, 0xBFD41578,0xE2657ED4,
+	0x3FFE6666,0x66666666, 0xBFD4B0C6,0xB93445AB,
+	0x3FFE8F5C,0x28F5C28F, 0xBFD54B8C,0xF75927C0,
+	0x3FFEB851,0xEB851EB8, 0xBFD5E5C7,0xA681FA89,
+	0x3FFEE147,0xAE147AE1, 0xBFD67F72,0xD3EF2DE3,
+	0x3FFF0A3D,0x70A3D70A, 0xBFD7188A,0x908DAC14,
+	0x3FFF3333,0x33333333, 0xBFD7B10A,0xF110A1B0,
+	0x3FFF5C28,0xF5C28F5C, 0xBFD848F0,0x0E0B2CC7,
+	0x3FFF851E,0xB851EB85, 0xBFD8E036,0x0409F2A9,
+	0x3FFFAE14,0x7AE147AE, 0xBFD976D8,0xF3AC9BA9,
+	0x3FFFD70A,0x3D70A3D7, 0xBFDA0CD5,0x01BF3419,
+	0x40000000,0x00000000, 0xBFDAA226,0x57537205,
+	0x4000147A,0xE147AE14, 0xBFDB36C9,0x21D9DED1,
+	0x400028F5,0xC28F5C29, 0xBFDBCAB9,0x933AE461,
+	0x40003D70,0xA3D70A3D, 0xBFDC5DF3,0xE1EFBCA9,
+	0x400051EB,0x851EB852, 0xBFDCF074,0x491B43C0,
+	0x40006666,0x66666666, 0xBFDD8237,0x08A2AAED,
+	0x40007AE1,0x47AE147B, 0xBFDE1338,0x65460CF2,
+	0x40008F5C,0x28F5C28F, 0xBFDEA374,0xA8B8E21F,
+	0x4000A3D7,0x0A3D70A4, 0xBFDF32E8,0x21BA545C,
+	0x4000B851,0xEB851EB8, 0xBFDFC18F,0x242D71B0,
+	0x4000CCCC,0xCCCCCCCD, 0xBFE027B3,0x04989ECA,
+	0x4000E147,0xAE147AE1, 0xBFE06E34,0x979C4FBA,
+	0x4000F5C2,0x8F5C28F6, 0xBFE0B44A,0x7D111769,
+	0x40010A3D,0x70A3D70A, 0xBFE0F9F2,0xE9A7EDAB,
+	0x40011EB8,0x51EB851F, 0xBFE13F2C,0x14DF389D,
+	0x40013333,0x33333333, 0xBFE183F4,0x390E7C4A,
+	0x400147AE,0x147AE148, 0xBFE1C849,0x9371F7D4,
+	0x40015C28,0xF5C28F5C, 0xBFE20C2A,0x64362F76,
+	0x400170A3,0xD70A3D71, 0xBFE24F94,0xEE836376,
+	0x4001851E,0xB851EB85, 0xBFE29287,0x7888F359,
+	0x40019999,0x9999999A, 0xBFE2D500,0x4B88AD70,
+	0x4001AE14,0x7AE147AE, 0xBFE316FD,0xB3E20A13,
+	0x4001C28F,0x5C28F5C3, 0xBFE3587E,0x011D529E,
+	0x4001D70A,0x3D70A3D7, 0xBFE3997F,0x85F6B38B,
+	0x4001EB85,0x1EB851EC, 0xBFE3DA00,0x986939C2,
+	0x40020000,0x00000000, 0xBFE419FF,0x91B9BA6D,
+	0x4002147A,0xE147AE14, 0xBFE4597A,0xCE81A573,
+	0x400228F5,0xC28F5C29, 0xBFE49870,0xAEB9C1FF,
+	0x40023D70,0xA3D70A3D, 0xBFE4D6DF,0x95C4D4E9,
+	0x400251EB,0x851EB852, 0xBFE514C5,0xEA7A30E8,
+	0x40026666,0x66666666, 0xBFE55222,0x17302FE1,
+	0x40027AE1,0x47AE147B, 0xBFE58EF2,0x89C6958F,
+	0x40028F5C,0x28F5C28F, 0xBFE5CB35,0xB3B0DAC2,
+	0x4002A3D7,0x0A3D70A4, 0xBFE606EA,0x0A00615E,
+	0x4002B851,0xEB851EB8, 0xBFE6420E,0x056E9079,
+	0x4002CCCC,0xCCCCCCCD, 0xBFE67CA0,0x2266D8B1,
+	0x4002E147,0xAE147AE1, 0xBFE6B69E,0xE110A01B,
+	0x4002F5C2,0x8F5C28F6, 0xBFE6F008,0xC55915E8,
+	0x40030A3D,0x70A3D70A, 0xBFE728DC,0x56FCED22,
+	0x40031EB8,0x51EB851F, 0xBFE76118,0x2191FE9D,
+	0x40033333,0x33333333, 0xBFE798BA,0xB490D185,
+	0x400347AE,0x147AE148, 0xBFE7CFC2,0xA35E0A9E,
+	0x40035C28,0xF5C28F5C, 0xBFE8062E,0x8553C1AA,
+	0x400370A3,0xD70A3D71, 0xBFE83BFC,0xF5CABCFF,
+	0x4003851E,0xB851EB85, 0xBFE8712C,0x942392CF,
+	0x40039999,0x9999999A, 0xBFE8A5BC,0x03CFB027,
+	0x4003AE14,0x7AE147AE, 0xBFE8D9A9,0xEC5A4526,
+	0x4003C28F,0x5C28F5C3, 0xBFE90CF4,0xF9711676,
+	0x4003D70A,0x3D70A3D7, 0xBFE93F9B,0xDAED338D,
+	0x4003EB85,0x1EB851EC, 0xBFE9719D,0x44DB91B8,
+	0x40040000,0x00000000, 0xBFE9A2F7,0xEF858B7D,
+	0x4004147A,0xE147AE14, 0xBFE9D3AA,0x9779445D,
+	0x400428F5,0xC28F5C29, 0xBFEA03B3,0xFD91F07C,
+	0x40043D70,0xA3D70A3D, 0xBFEA3312,0xE7000028,
+	0x400451EB,0x851EB852, 0xBFEA61C6,0x1D512F03,
+	0x40046666,0x66666666, 0xBFEA8FCC,0x6E78767A,
+	0x40047AE1,0x47AE147B, 0xBFEABD24,0xACD5E390,
+	0x40048F5C,0x28F5C28F, 0xBFEAE9CD,0xAF3E4F7E,
+	0x4004A3D7,0x0A3D70A4, 0xBFEB15C6,0x5102FB4D,
+	0x4004B851,0xEB851EB8, 0xBFEB410D,0x71F90DDA,
+	0x4004CCCC,0xCCCCCCCD, 0xBFEB6BA1,0xF680F470,
+	0x4004E147,0xAE147AE1, 0xBFEB9582,0xC78DA573,
+	0x4004F5C2,0x8F5C28F6, 0xBFEBBEAE,0xD2ABC535,
+	0x40050A3D,0x70A3D70A, 0xBFEBE725,0x0A08AC8A,
+	0x40051EB8,0x51EB851F, 0xBFEC0EE4,0x6479511D,
+	0x40053333,0x33333333, 0xBFEC35EB,0xDD810F30,
+	0x400547AE,0x147AE148, 0xBFEC5C3A,0x755854C7,
+	0x40055C28,0xF5C28F5C, 0xBFEC81CF,0x30F32DDD,
+	0x400570A3,0xD70A3D71, 0xBFECA6A9,0x1A07B1B0,
+	0x4005851E,0xB851EB85, 0xBFECCAC7,0x3F1450C3,
+	0x40059999,0x9999999A, 0xBFECEE28,0xB36603A6,
+	0x4005AE14,0x7AE147AE, 0xBFED10CC,0x8F1E5A21,
+	0x4005C28F,0x5C28F5C3, 0xBFED32B1,0xEF396AD0,
+	0x4005D70A,0x3D70A3D7, 0xBFED53D7,0xF593A2D8,
+	0x4005EB85,0x1EB851EC, 0xBFED743D,0xC8EF75BF,
+	0x40060000,0x00000000, 0xBFED93E2,0x94FAED14,
+	0x4006147A,0xE147AE14, 0xBFEDB2C5,0x8A5517E9,
+	0x400628F5,0xC28F5C29, 0xBFEDD0E5,0xDE9359E3,
+	0x40063D70,0xA3D70A3D, 0xBFEDEE42,0xCC4699C0,
+	0x400651EB,0x851EB852, 0xBFEE0ADB,0x93004F43,
+	0x40066666,0x66666666, 0xBFEE26AF,0x7757704A,
+	0x40067AE1,0x47AE147B, 0xBFEE41BD,0xC2ED3D08,
+	0x40068F5C,0x28F5C28F, 0xBFEE5C05,0xC471EB28,
+	0x4006A3D7,0x0A3D70A4, 0xBFEE7586,0xCFA92FDE,
+	0x4006B851,0xEB851EB8, 0xBFEE8E40,0x3D6EA89A,
+	0x4006CCCC,0xCCCCCCCD, 0xBFEEA631,0x6BBA2275,
+	0x4006E147,0xAE147AE1, 0xBFEEBD59,0xBDA3C008,
+	0x4006F5C2,0x8F5C28F6, 0xBFEED3B8,0x9B67FDC1,
+	0x40070A3D,0x70A3D70A, 0xBFEEE94D,0x726B946E,
+	0x40071EB8,0x51EB851F, 0xBFEEFE17,0xB53F3A13,
+	0x40073333,0x33333333, 0xBFEF1216,0xDBA340C9,
+	0x400747AE,0x147AE148, 0xBFEF254A,0x628B13AA,
+	0x40075C28,0xF5C28F5C, 0xBFEF37B1,0xCC2091A6,
+	0x400770A3,0xD70A3D71, 0xBFEF494C,0x9FC74636,
+	0x4007851E,0xB851EB85, 0xBFEF5A1A,0x6A1F7FBC,
+	0x40079999,0x9999999A, 0xBFEF6A1A,0xBD0943B2,
+	0x4007AE14,0x7AE147AE, 0xBFEF794D,0x2FA7204B,
+	0x4007C28F,0x5C28F5C3, 0xBFEF87B1,0x5E60DBC2,
+	0x4007D70A,0x3D70A3D7, 0xBFEF9546,0xEAE600FE,
+	0x4007EB85,0x1EB851EC, 0xBFEFA20D,0x7C3049B5,
+	0x40080000,0x00000000, 0xBFEFAE04,0xBE85E5D2,
+	0x4008147A,0xE147AE14, 0xBFEFB92C,0x637BA02C,
+	0x400828F5,0xC28F5C29, 0xBFEFC384,0x21F6E06F,
+	0x40083D70,0xA3D70A3D, 0xBFEFCD0B,0xB62F8A36,
+	0x400851EB,0x851EB852, 0xBFEFD5C2,0xE1B1B93F,
+	0x40086666,0x66666666, 0xBFEFDDA9,0x6B5F5AB4,
+	0x40087AE1,0x47AE147B, 0xBFEFE4BF,0x1F71A380,
+	0x40088F5C,0x28F5C28F, 0xBFEFEB03,0xCF7A639D,
+	0x4008A3D7,0x0A3D70A4, 0xBFEFF077,0x52653661,
+	0x4008B851,0xEB851EB8, 0xBFEFF519,0x84788FB0,
+	0x4008CCCC,0xCCCCCCCD, 0xBFEFF8EA,0x4756A624,
+	0x4008E147,0xAE147AE1, 0xBFEFFBE9,0x81FE3A05,
+	0x4008F5C2,0x8F5C28F6, 0xBFEFFE17,0x20CB3931,
+	0x40090A3D,0x70A3D70A, 0xBFEFFF73,0x15773FCE,
+	0x40091EB8,0x51EB851F, 0xBFEFFFFD,0x5719F5D7,
+	0x40093333,0x33333333, 0xBFEFFFB5,0xE2294982,
+	0x400947AE,0x147AE148, 0xBFEFFE9C,0xB879866A,
+	0x40095C28,0xF5C28F5C, 0xBFEFFCB1,0xE13D499A,
+	0x400970A3,0xD70A3D71, 0xBFEFF9F5,0x6905525B,
+	0x4009851E,0xB851EB85, 0xBFEFF667,0x61C02FDD,
+	0x40099999,0x9999999A, 0xBFEFF207,0xE2B9CBB6,
+	0x4009AE14,0x7AE147AE, 0xBFEFECD7,0x089AD12E,
+	0x4009C28F,0x5C28F5C3, 0xBFEFE6D4,0xF567F175,
+	0x4009D70A,0x3D70A3D7, 0xBFEFE001,0xD08104AF,
+	0x4009EB85,0x1EB851EC, 0xBFEFD85D,0xC6A007E8,
+	0x400A0000,0x00000000, 0xBFEFCFE9,0x09D7F7F8,
+	0x400A147A,0xE147AE14, 0xBFEFC6A3,0xD1938959,
+	0x400A28F5,0xC28F5C29, 0xBFEFBC8E,0x5A93BCF9,
+	0x400A3D70,0xA3D70A3D, 0xBFEFB1A8,0xE6EE5214,
+	0x400A51EB,0x851EB852, 0xBFEFA5F3,0xBE0C1519,
+	0x400A6666,0x66666666, 0xBFEF996F,0x2CA70BB6,
+	0x400A7AE1,0x47AE147B, 0xBFEF8C1B,0x84C87DF9,
+	0x400A8F5C,0x28F5C28F, 0xBFEF7DF9,0x1DC6DCB6,
+	0x400AA3D7,0x0A3D70A4, 0xBFEF6F08,0x54438527,
+	0x400AB851,0xEB851EB8, 0xBFEF5F49,0x8A2861DA,
+	0x400ACCCC,0xCCCCCCCD, 0xBFEF4EBD,0x26A56907,
+	0x400AE147,0xAE147AE1, 0xBFEF3D63,0x962DF84F,
+	0x400AF5C2,0x8F5C28F6, 0xBFEF2B3D,0x4A760DFE,
+	0x400B0A3D,0x70A3D70A, 0xBFEF184A,0xBA6F5FEA,
+	0x400B1EB8,0x51EB851F, 0xBFEF048C,0x62464FE5,
+	0x400B3333,0x33333333, 0xBFEEF002,0xC35EBE04,
+	0x400B47AE,0x147AE148, 0xBFEEDAAE,0x6450B89B,
+	0x400B5C28,0xF5C28F5C, 0xBFEEC48F,0xD0E50A38,
+	0x400B70A3,0xD70A3D71, 0xBFEEADA7,0x9A11A585,
+	0x400B851E,0xB851EB85, 0xBFEE95F6,0x55F5EF4B,
+	0x400B9999,0x9999999A, 0xBFEE7D7C,0x9FD6E698,
+	0x400BAE14,0x7AE147AE, 0xBFEE643B,0x181B2B33,
+	0x400BC28F,0x5C28F5C3, 0xBFEE4A32,0x6446E264,
+	0x400BD70A,0x3D70A3D7, 0xBFEE2F63,0x2EF77A47,
+	0x400BEB85,0x1EB851EC, 0xBFEE13CE,0x27DF4B9A,
+	0x400C0000,0x00000000, 0xBFEDF774,0x03C11A5F,
+	0x400C147A,0xE147AE14, 0xBFEDDA55,0x7C6B752D,
+	0x400C28F5,0xC28F5C29, 0xBFEDBC73,0x50B3F388,
+	0x400C3D70,0xA3D70A3D, 0xBFED9DCE,0x44725339,
+	0x400C51EB,0x851EB852, 0xBFED7E67,0x207B74D8,
+	0x400C6666,0x66666666, 0xBFED5E3E,0xB29C37A4,
+	0x400C7AE1,0x47AE147B, 0xBFED3D55,0xCD9434C8,
+	0x400C8F5C,0x28F5C28F, 0xBFED1BAD,0x49105A38,
+	0x400CA3D7,0x0A3D70A4, 0xBFECF946,0x01A5653C,
+	0x400CB851,0xEB851EB8, 0xBFECD620,0xD8CA3CE2,
+	0x400CCCCC,0xCCCCCCCD, 0xBFECB23E,0xB4D22C59,
+	0x400CE147,0xAE147AE1, 0xBFEC8DA0,0x80E6FD8F,
+	0x400CF5C2,0x8F5C28F6, 0xBFEC6847,0x2D02F3F8,
+	0x400D0A3D,0x70A3D70A, 0xBFEC4233,0xADEAA7EE,
+	0x400D1EB8,0x51EB851F, 0xBFEC1B66,0xFD26C281,
+	0x400D3333,0x33333333, 0xBFEBF3E2,0x18FD9A38,
+	0x400D47AE,0x147AE148, 0xBFEBCBA6,0x046CB098,
+	0x400D5C28,0xF5C28F5C, 0xBFEBA2B3,0xC72210E8,
+	0x400D70A3,0xD70A3D71, 0xBFEB790C,0x6D759014,
+	0x400D851E,0xB851EB85, 0xBFEB4EB1,0x0861EE25,
+	0x400D9999,0x9999999A, 0xBFEB23A2,0xAD7DD937,
+	0x400DAE14,0x7AE147AE, 0xBFEAF7E2,0x76F4D258,
+	0x400DC28F,0x5C28F5C3, 0xBFEACB71,0x837FF43F,
+	0x400DD70A,0x3D70A3D7, 0xBFEA9E50,0xF65E9C50,
+	0x400DEB85,0x1EB851EC, 0xBFEA7081,0xF74EF5D9,
+	0x400E0000,0x00000000, 0xBFEA4205,0xB28667F7,
+	0x400E147A,0xE147AE14, 0xBFEA12DD,0x58A9E618,
+	0x400E28F5,0xC28F5C29, 0xBFE9E30A,0x1EC62384,
+	0x400E3D70,0xA3D70A3D, 0xBFE9B28D,0x3E47AA03,
+	0x400E51EB,0x851EB852, 0xBFE98167,0xF4F2D3C3,
+	0x400E6666,0x66666666, 0xBFE94F9B,0x84DBA8EB,
+	0x400E7AE1,0x47AE147B, 0xBFE91D29,0x345DA0C8,
+	0x400E8F5C,0x28F5C28F, 0xBFE8EA12,0x4E134713,
+	0x400EA3D7,0x0A3D70A4, 0xBFE8B658,0x20CDC53C,
+	0x400EB851,0xEB851EB8, 0xBFE881FB,0xFF8C5044,
+	0x400ECCCC,0xCCCCCCCD, 0xBFE84CFF,0x41737B03,
+	0x400EE147,0xAE147AE1, 0xBFE81763,0x41C46D74,
+	0x400EF5C2,0x8F5C28F6, 0xBFE7E129,0x5FD400DB,
+	0x400F0A3D,0x70A3D70A, 0xBFE7AA52,0xFF01C167,
+	0x400F1EB8,0x51EB851F, 0xBFE772E1,0x86AED527,
+	0x400F3333,0x33333333, 0xBFE73AD6,0x6234C8EA,
+	0x400F47AE,0x147AE148, 0xBFE70233,0x00DC42ED,
+	0x400F5C28,0xF5C28F5C, 0xBFE6C8F8,0xD5D39BEF,
+	0x400F70A3,0xD70A3D71, 0xBFE68F29,0x58255E91,
+	0x400F851E,0xB851EB85, 0xBFE654C6,0x02AEAD8D,
+	0x400F9999,0x9999999A, 0xBFE619D0,0x541590BD,
+	0x400FAE14,0x7AE147AE, 0xBFE5DE49,0xCEBF2979,
+	0x400FC28F,0x5C28F5C3, 0xBFE5A233,0xF8C5CE47,
+	0x400FD70A,0x3D70A3D7, 0xBFE56590,0x5BEF0E57,
+	0x400FEB85,0x1EB851EC, 0xBFE52860,0x85A19CDE,
+	0x40100000,0x00000000, 0xBFE4EAA6,0x06DB24C1,
+	0x40100A3D,0x70A3D70A, 0xBFE4AC62,0x7426049D,
+	0x4010147A,0xE147AE14, 0xBFE46D97,0x658EF3A5,
+	0x40101EB8,0x51EB851F, 0xBFE42E46,0x769A8F69,
+	0x401028F5,0xC28F5C29, 0xBFE3EE71,0x463AD30E,
+	0x40103333,0x33333333, 0xBFE3AE19,0x76C477C5,
+	0x40103D70,0xA3D70A3D, 0xBFE36D40,0xADE43F5E,
+	0x401047AE,0x147AE148, 0xBFE32BE8,0x949428BF,
+	0x401051EB,0x851EB852, 0xBFE2EA12,0xD7108EE5,
+	0x40105C28,0xF5C28F5C, 0xBFE2A7C1,0x24CD3249,
+	0x40106666,0x66666666, 0xBFE264F5,0x306A2D6A,
+	0x401070A3,0xD70A3D71, 0xBFE221B0,0xAFA8D471,
+	0x40107AE1,0x47AE147B, 0xBFE1DDF5,0x5B60806A,
+	0x4010851E,0xB851EB85, 0xBFE199C4,0xEF734612,
+	0x40108F5C,0x28F5C28F, 0xBFE15521,0x2AC298E8,
+	0x40109999,0x9999999A, 0xBFE1100B,0xCF23DA7C,
+	0x4010A3D7,0x0A3D70A4, 0xBFE0CA86,0xA154D68B,
+	0x4010AE14,0x7AE147AE, 0xBFE08493,0x68F02BC1,
+	0x4010B851,0xEB851EB8, 0xBFE03E33,0xF061A208,
+	0x4010C28F,0x5C28F5C3, 0xBFDFEED4,0x09B4DC5B,
+	0x4010CCCC,0xCCCCCCCD, 0xBFDF606E,0xEC8AC71D,
+	0x4010D70A,0x3D70A3D7, 0xBFDED13C,0x2E762740,
+	0x4010E147,0xAE147AE1, 0xBFDE413F,0x79EBB85C,
+	0x4010EB85,0x1EB851EC, 0xBFDDB07C,0x7E8BC86A,
+	0x4010F5C2,0x8F5C28F6, 0xBFDD1EF6,0xF10A0FDD,
+	0x40110000,0x00000000, 0xBFDC8CB2,0x8B1567F5,
+	0x40110A3D,0x70A3D70A, 0xBFDBF9B3,0x0B3F60F2,
+	0x4011147A,0xE147AE14, 0xBFDB65FC,0x34E3B807,
+	0x40111EB8,0x51EB851F, 0xBFDAD191,0xD00FADDB,
+	0x401128F5,0xC28F5C29, 0xBFDA3C77,0xA9693E9A,
+	0x40113333,0x33333333, 0xBFD9A6B1,0x92163B53,
+	0x40113D70,0xA3D70A3D, 0xBFD91043,0x5FA34669,
+	0x401147AE,0x147AE148, 0xBFD87930,0xEBEAB2D4,
+	0x401151EB,0x851EB852, 0xBFD7E17E,0x14FB478A,
+	0x40115C28,0xF5C28F5C, 0xBFD7492E,0xBCFEE6BF,
+	0x40116666,0x66666666, 0xBFD6B046,0xCA211AD8,
+	0x401170A3,0xD70A3D71, 0xBFD616CA,0x267588BE,
+	0x40117AE1,0x47AE147B, 0xBFD57CBC,0xBFDE48F2,
+	0x4011851E,0xB851EB85, 0xBFD4E222,0x87F22719,
+	0x40118F5C,0x28F5C28F, 0xBFD446FF,0x73E2C9D7,
+	0x40119999,0x9999999A, 0xBFD3AB57,0x7C62C2AA,
+	0x4011A3D7,0x0A3D70A4, 0xBFD30F2E,0x9D8B8730,
+	0x4011AE14,0x7AE147AE, 0xBFD27288,0xD6C35386,
+	0x4011B851,0xEB851EB8, 0xBFD1D56A,0x2AA2F7A3,
+	0x4011C28F,0x5C28F5C3, 0xBFD137D6,0x9EDB8F5A,
+	0x4011CCCC,0xCCCCCCCD, 0xBFD099D2,0x3C1C267C,
+	0x4011D70A,0x3D70A3D7, 0xBFCFF6C2,0x1BEE9175,
+	0x4011E147,0xAE147AE1, 0xBFCEB90E,0x4590FE71,
+	0x4011EB85,0x1EB851EC, 0xBFCD7A91,0x17337707,
+	0x4011F5C2,0x8F5C28F6, 0xBFCC3B52,0xB811629D,
+	0x40120000,0x00000000, 0xBFCAFB5B,0x54583D6A,
+	0x40120A3D,0x70A3D70A, 0xBFC9BAB3,0x1CF209C1,
+	0x4012147A,0xE147AE14, 0xBFC87962,0x474FA1B8,
+	0x40121EB8,0x51EB851F, 0xBFC73771,0x0D32EB2A,
+	0x401228F5,0xC28F5C29, 0xBFC5F4E7,0xAC78F004,
+	0x40123333,0x33333333, 0xBFC4B1CE,0x66E3DA72,
+	0x40123D70,0xA3D70A3D, 0xBFC36E2D,0x81E4D8C1,
+	0x401247AE,0x147AE148, 0xBFC22A0D,0x4665E862,
+	0x401251EB,0x851EB852, 0xBFC0E576,0x00938AE2,
+	0x40125C28,0xF5C28F5C, 0xBFBF40DF,0xFF4CC8A1,
+	0x40126666,0x66666666, 0xBFBCB607,0x2B598DCA,
+	0x401270A3,0xD70A3D71, 0xBFBA2A72,0x2EA856AE,
+	0x40127AE1,0x47AE147B, 0xBFB79E31,0xB7653184,
+	0x4012851E,0xB851EB85, 0xBFB51156,0x781FF707,
+	0x40128F5C,0x28F5C28F, 0xBFB283F1,0x275EDDF2,
+	0x40129999,0x9999999A, 0xBFAFEC24,0xFE61E5F2,
+	0x4012A3D7,0x0A3D70A4, 0xBFAACF96,0x7980F640,
+	0x4012AE14,0x7AE147AE, 0xBFA5B258,0x3FCA7E71,
+	0x4012B851,0xEB851EB8, 0xBFA0948B,0xD56D9095,
+	0x4012C28F,0x5C28F5C3, 0xBF96ECA5,0x847A2F19,
+	0x4012CCCC,0xCCCCCCCD, 0xBF895F3A,0x43506A34,
+	0x4012D70A,0x3D70A3D7, 0xBF63920C,0xDB9E96D1,
+	0x4012E147,0xAE147AE1, 0x3F7F2CA7,0xCBCDF569,
+	0x4012EB85,0x1EB851EC, 0x3F920862,0x6DF53129,
+	0x4012F5C2,0x8F5C28F6, 0x3F9C4524,0xBB47756D,
+	0x40130000,0x00000000, 0x3FA34096,0xE1D37B74,
+	0x40130A3D,0x70A3D70A, 0x3FA85E1D,0x3A474690,
+	0x4013147A,0xE147AE14, 0x3FAD7B03,0xE0F76592,
+	0x40131EB8,0x51EB851F, 0x3FB14B94,0xA9F95981,
+	0x401328F5,0xC28F5C29, 0x3FB3D936,0x0B1D182D,
+	0x40133333,0x33333333, 0x3FB66655,0x584E4040,
+	0x40133D70,0xA3D70A3D, 0x3FB8F2E1,0xD9489BA6,
+	0x401347AE,0x147AE148, 0x3FBB7ECA,0xD98A0030,
+	0x401351EB,0x851EB852, 0x3FBE09FF,0xA8BFC8DD,
+	0x40135C28,0xF5C28F5C, 0x3FC04A37,0xCD9A1B1B,
+	0x40136666,0x66666666, 0x3FC18F05,0x051DD6F7,
+	0x401370A3,0xD70A3D71, 0x3FC2D35F,0x2A50ED81,
+	0x40137AE1,0x47AE147B, 0x3FC4173D,0xEF8B5440,
+	0x4013851E,0xB851EB85, 0x3FC55A99,0x0A4D8C16,
+	0x40138F5C,0x28F5C28F, 0x3FC69D68,0x3376F6A7,
+	0x40139999,0x9999999A, 0x3FC7DFA3,0x277C1664,
+	0x4013A3D7,0x0A3D70A4, 0x3FC92141,0xA69CB65C,
+	0x4013AE14,0x7AE147AE, 0x3FCA623B,0x7519FA71,
+	0x4013B851,0xEB851EB8, 0x3FCBA288,0x5B6C540E,
+	0x4013C28F,0x5C28F5C3, 0x3FCCE220,0x26795BF7,
+	0x4013CCCC,0xCCCCCCCD, 0x3FCE20FA,0xA7C98E60,
+	0x4013D70A,0x3D70A3D7, 0x3FCF5F0F,0xB5BDE9D5,
+	0x4013E147,0xAE147AE1, 0x3FD04E2B,0x95E2B697,
+	0x4013EB85,0x1EB851EC, 0x3FD0EC64,0x75493A8B,
+	0x4013F5C2,0x8F5C28F6, 0x3FD18A2E,0x6C27FB2F,
+	0x40140000,0x00000000, 0x3FD22785,0x706B4AD9,
+	0x40140A3D,0x70A3D70A, 0x3FD2C465,0x7AF0CC69,
+	0x4014147A,0xE147AE14, 0x3FD360CA,0x87A1D8F0,
+	0x40141EB8,0x51EB851F, 0x3FD3FCB0,0x958DD15E,
+	0x401428F5,0xC28F5C29, 0x3FD49813,0xA7045B45,
+	0x40143333,0x33333333, 0x3FD532EF,0xC1AF88E2,
+	0x40143D70,0xA3D70A3D, 0x3FD5CD40,0xEEADEA96,
+	0x401447AE,0x147AE148, 0x3FD66703,0x3AAC8A13,
+	0x401451EB,0x851EB852, 0x3FD70032,0xB600CDE7,
+	0x40145C28,0xF5C28F5C, 0x3FD798CB,0x74C24599,
+	0x40146666,0x66666666, 0x3FD830C9,0x8EE45C9C,
+	0x401470A3,0xD70A3D71, 0x3FD8C829,0x204FF446,
+	0x40147AE1,0x47AE147B, 0x3FD95EE6,0x48FCE382,
+	0x4014851E,0xB851EB85, 0x3FD9F4FD,0x2D0B5C7E,
+	0x40148F5C,0x28F5C28F, 0x3FDA8A69,0xF4DD3682,
+	0x40149999,0x9999999A, 0x3FDB1F28,0xCD2F1C3E,
+	0x4014A3D7,0x0A3D70A4, 0x3FDBB335,0xE7319D34,
+	0x4014AE14,0x7AE147AE, 0x3FDC468D,0x78A22286,
+	0x4014B851,0xEB851EB8, 0x3FDCD92B,0xBBE3C55E,
+	0x4014C28F,0x5C28F5C3, 0x3FDD6B0C,0xF0180743,
+	0x4014CCCC,0xCCCCCCCD, 0x3FDDFC2D,0x59376AEE,
+	0x4014D70A,0x3D70A3D7, 0x3FDE8C89,0x4029EE0C,
+	0x4014E147,0xAE147AE1, 0x3FDF1C1C,0xF2DF6206,
+	0x4014EB85,0x1EB851EC, 0x3FDFAAE4,0xC467A434,
+	0x4014F5C2,0x8F5C28F6, 0x3FE01C6E,0x86855A0E,
+	0x40150000,0x00000000, 0x3FE06301,0x15305409,
+	0x40150A3D,0x70A3D70A, 0x3FE0A928,0x3FB4BF36,
+	0x4015147A,0xE147AE14, 0x3FE0EEE2,0x3A5265D1,
+	0x40151EB8,0x51EB851F, 0x3FE1342D,0x3C14A22B,
+	0x401528F5,0xC28F5C29, 0x3FE17907,0x7EDE1139,
+	0x40153333,0x33333333, 0x3FE1BD6F,0x3F7432D5,
+	0x40153D70,0xA3D70A3D, 0x3FE20162,0xBD8AF6C1,
+	0x401547AE,0x147AE148, 0x3FE244E0,0x3BD036A5,
+	0x401551EB,0x851EB852, 0x3FE287E5,0xFFF71C68,
+	0x40155C28,0xF5C28F5C, 0x3FE2CA72,0x52C374F4,
+	0x40156666,0x66666666, 0x3FE30C83,0x8014EEAA,
+	0x401570A3,0xD70A3D71, 0x3FE34E17,0xD6F2439C,
+	0x40157AE1,0x47AE147B, 0x3FE38F2D,0xA9944EF5,
+	0x4015851E,0xB851EB85, 0x3FE3CFC3,0x4D710DB3,
+	0x40158F5C,0x28F5C28F, 0x3FE40FD7,0x1B4689E5,
+	0x40159999,0x9999999A, 0x3FE44F67,0x6F25B08C,
+	0x4015A3D7,0x0A3D70A4, 0x3FE48E72,0xA87D1193,
+	0x4015AE14,0x7AE147AE, 0x3FE4CCF7,0x2A2389F3,
+	0x4015B851,0xEB851EB8, 0x3FE50AF3,0x5A62D745,
+	0x4015C28F,0x5C28F5C3, 0x3FE54865,0xA30214DE,
+	0x4015CCCC,0xCCCCCCCD, 0x3FE5854C,0x715021EB,
+	0x4015D70A,0x3D70A3D7, 0x3FE5C1A6,0x362DF0A2,
+	0x4015E147,0xAE147AE1, 0x3FE5FD71,0x6618BDD6,
+	0x4015EB85,0x1EB851EC, 0x3FE638AC,0x793430FE,
+	0x4015F5C2,0x8F5C28F6, 0x3FE67355,0xEB546437,
+	0x40160000,0x00000000, 0x3FE6AD6C,0x3C07D448,
+	0x40160A3D,0x70A3D70A, 0x3FE6E6ED,0xEEA13805,
+	0x4016147A,0xE147AE14, 0x3FE71FD9,0x8A413F1C,
+	0x40161EB8,0x51EB851F, 0x3FE7582D,0x99E037F6,
+	0x401628F5,0xC28F5C29, 0x3FE78FE8,0xAC579C4B,
+	0x40163333,0x33333333, 0x3FE7C709,0x546B8482,
+	0x40163D70,0xA3D70A3D, 0x3FE7FD8E,0x28D4012C,
+	0x401647AE,0x147AE148, 0x3FE83375,0xC4465AC2,
+	0x401651EB,0x851EB852, 0x3FE868BE,0xC57E370F,
+	0x40165C28,0xF5C28F5C, 0x3FE89D67,0xCF46A47B,
+	0x40166666,0x66666666, 0x3FE8D16F,0x88830A7F,
+	0x401670A3,0xD70A3D71, 0x3FE904D4,0x9C37FF65,
+	0x40167AE1,0x47AE147B, 0x3FE93795,0xB99402DA,
+	0x4016851E,0xB851EB85, 0x3FE969B1,0x93F81D60,
+	0x40168F5C,0x28F5C28F, 0x3FE99B26,0xE300641A,
+	0x40169999,0x9999999A, 0x3FE9CBF4,0x628C60F3,
+	0x4016A3D7,0x0A3D70A4, 0x3FE9FC18,0xD2C75EB5,
+	0x4016AE14,0x7AE147AE, 0x3FEA2B92,0xF8309930,
+	0x4016B851,0xEB851EB8, 0x3FEA5A61,0x9BA350D2,
+	0x4016C28F,0x5C28F5C3, 0x3FEA8883,0x8A5EC1C3,
+	0x4016CCCC,0xCCCCCCCD, 0x3FEAB5F7,0x960DFE2A,
+	0x4016D70A,0x3D70A3D7, 0x3FEAE2BC,0x94CFAB9D,
+	0x4016E147,0xAE147AE1, 0x3FEB0ED1,0x613DA33D,
+	0x4016EB85,0x1EB851EC, 0x3FEB3A34,0xDA74748B,
+	0x4016F5C2,0x8F5C28F6, 0x3FEB64E5,0xE41ACA96,
+	0x40170000,0x00000000, 0x3FEB8EE3,0x6668B394,
+	0x40170A3D,0x70A3D70A, 0x3FEBB82C,0x4E2ECA5E,
+	0x4017147A,0xE147AE14, 0x3FEBE0BF,0x8CDD41E4,
+	0x40171EB8,0x51EB851F, 0x3FEC089C,0x188AD258,
+	0x401728F5,0xC28F5C29, 0x3FEC2FC0,0xEBFB87C3,
+	0x40173333,0x33333333, 0x3FEC562D,0x06A77223,
+	0x40173D70,0xA3D70A3D, 0x3FEC7BDF,0x6CC13689,
+	0x401747AE,0x147AE148, 0x3FECA0D7,0x273C8152,
+	0x401751EB,0x851EB852, 0x3FECC513,0x43D45928,
+	0x40175C28,0xF5C28F5C, 0x3FECE892,0xD51152CB,
+	0x40176666,0x66666666, 0x3FED0B54,0xF24FA546,
+	0x401770A3,0xD70A3D71, 0x3FED2D58,0xB7C51E91,
+	0x40177AE1,0x47AE147B, 0x3FED4E9D,0x4686F85A,
+	0x4017851E,0xB851EB85, 0x3FED6F21,0xC48F8CFE,
+	0x40178F5C,0x28F5C28F, 0x3FED8EE5,0x5CC3EC4D,
+	0x40179999,0x9999999A, 0x3FEDADE7,0x3EF95029,
+	0x4017A3D7,0x0A3D70A4, 0x3FEDCC26,0x9FFA70B4,
+	0x4017AE14,0x7AE147AE, 0x3FEDE9A2,0xB98CB822,
+	0x4017B851,0xEB851EB8, 0x3FEE065A,0xCA7555BF,
+	0x4017C28F,0x5C28F5C3, 0x3FEE224E,0x167E3056,
+	0x4017CCCC,0xCCCCCCCD, 0x3FEE3D7B,0xE67AB792,
+	0x4017D70A,0x3D70A3D7, 0x3FEE57E3,0x884C9480,
+	0x4017E147,0xAE147AE1, 0x3FEE7184,0x4EE838D6,
+	0x4017EB85,0x1EB851EC, 0x3FEE8A5D,0x92594D06,
+	0x4017F5C2,0x8F5C28F6, 0x3FEEA26E,0xAFC6FCE5,
+	0x40180000,0x00000000, 0x3FEEB9B7,0x097822F5,
+	0x40180A3D,0x70A3D70A, 0x3FEED036,0x06D75201,
+	0x4018147A,0xE147AE14, 0x3FEEE5EB,0x1476BD14,
+	0x40181EB8,0x51EB851F, 0x3FEEFAD5,0xA413FDAC,
+	0x401828F5,0xC28F5C29, 0x3FEF0EF5,0x2C9BB7FF,
+	0x40183333,0x33333333, 0x3FEF2249,0x2A2D1D5A,
+	0x40183D70,0xA3D70A3D, 0x3FEF34D1,0x1E1D4C62,
+	0x401847AE,0x147AE148, 0x3FEF468C,0x8EFA8F33,
+	0x401851EB,0x851EB852, 0x3FEF577B,0x088F773D,
+	0x40185C28,0xF5C28F5C, 0x3FEF679C,0x1BE5D6E7,
+	0x40186666,0x66666666, 0x3FEF76EF,0x5F4998B2,
+	0x401870A3,0xD70A3D71, 0x3FEF8574,0x6E4B7400,
+	0x40187AE1,0x47AE147B, 0x3FEF932A,0xE9C37F3B,
+	0x4018851E,0xB851EB85, 0x3FEFA012,0x77D39F7D,
+	0x40188F5C,0x28F5C28F, 0x3FEFAC2A,0xC3E9D57F,
+	0x40189999,0x9999999A, 0x3FEFB773,0x7EC267D5,
+	0x4018A3D7,0x0A3D70A4, 0x3FEFC1EC,0x5E69EA60,
+	0x4018AE14,0x7AE147AE, 0x3FEFCB95,0x1E3F22FC,
+	0x4018B851,0xEB851EB8, 0x3FEFD46D,0x7EF4CB3D,
+	0x4018C28F,0x5C28F5C3, 0x3FEFDC75,0x46932F4E,
+	0x4018CCCC,0xCCCCCCCD, 0x3FEFE3AC,0x4079A9CE,
+	0x4018D70A,0x3D70A3D7, 0x3FEFEA12,0x3D5FFCBF,
+	0x4018E147,0xAE147AE1, 0x3FEFEFA7,0x1357875E,
+	0x4018EB85,0x1EB851EC, 0x3FEFF46A,0x9DCC58F2,
+	0x4018F5C2,0x8F5C28F6, 0x3FEFF85C,0xBD862083,
+	0x40190000,0x00000000, 0x3FEFFB7D,0x58A8F975,
+	0x40190A3D,0x70A3D70A, 0x3FEFFDCC,0x5AB614FE,
+	0x4019147A,0xE147AE14, 0x3FEFFF49,0xB48C407A,
+	0x40191EB8,0x51EB851F, 0x3FEFFFF5,0x5C68488E,
+	0x401928F5,0xC28F5C29, 0x3FEFFFCF,0x4DE53926,
+	0x40193333,0x33333333, 0x3FEFFED7,0x89FC7A41,
+	};
+
+LOCAL_D const TUint32 TanTest[] =
+	{
+	0x00000000,0x00000000, 0x00000000,0x00000000,
+	0x3F50624D,0xD2F1A9FC, 0x3F50624E,0x2E91EBE4,
+	0x3F60624D,0xD2F1A9FC, 0x3F60624F,0x4172CE6E,
+	0x3F689374,0xBC6A7EFA, 0x3F689379,0x915EFC1B,
+	0x3F70624D,0xD2F1A9FC, 0x3F706253,0x8CF808EE,
+	0x3F747AE1,0x47AE147B, 0x3F747AEC,0x77052979,
+	0x3F789374,0xBC6A7EFA, 0x3F789388,0x104A218C,
+	0x3F7CAC08,0x3126E979, 0x3F7CAC26,0xE23B9B56,
+	0x3F80624D,0xD2F1A9FC, 0x3F806264,0xBB27F8B4,
+	0x3F826E97,0x8D4FDF3B, 0x3F826EB8,0x2AFFBB68,
+	0x3F847AE1,0x47AE147B, 0x3F847B0E,0x05625F97,
+	0x3F86872B,0x020C49BA, 0x3F868766,0x8F0E7362,
+	0x3F889374,0xBC6A7EFA, 0x3F8893C2,0x0CC3ED54,
+	0x3F8A9FBE,0x76C8B439, 0x3F8AA020,0xC3445068,
+	0x3F8CAC08,0x3126E979, 0x3F8CAC82,0xF752D022,
+	0x3F8EB851,0xEB851EB8, 0x3F8EB8E8,0xEDB4749D,
+	0x3F90624D,0xD2F1A9FC, 0x3F9062A9,0x75981F52,
+	0x3F916872,0xB020C49C, 0x3F9168E0,0x9A47A5E6,
+	0x3F926E97,0x8D4FDF3B, 0x3F926F1A,0x074E7D43,
+	0x3F9374BC,0x6A7EF9DB, 0x3F937555,0xDF138724,
+	0x3F947AE1,0x47AE147B, 0x3F947B94,0x43FEE9CF,
+	0x3F958106,0x24DD2F1B, 0x3F9581D5,0x587A222E,
+	0x3F96872B,0x020C49BA, 0x3F968819,0x3EF015D9,
+	0x3F978D4F,0xDF3B645A, 0x3F978E60,0x19CD2533,
+	0x3F989374,0xBC6A7EFA, 0x3F9894AA,0x0B7F3D7A,
+	0x3F999999,0x9999999A, 0x3F999AF7,0x3675EADF,
+	0x3F9A9FBE,0x76C8B439, 0x3F9AA147,0xBD226AA2,
+	0x3F9BA5E3,0x53F7CED9, 0x3F9BA79B,0xC1F7BD2C,
+	0x3F9CAC08,0x3126E979, 0x3F9CADF3,0x676AB82B,
+	0x3F9DB22D,0x0E560419, 0x3F9DB44E,0xCFF218B4,
+	0x3F9EB851,0xEB851EB8, 0x3F9EBAAE,0x1E06955E,
+	0x3F9FBE76,0xC8B43958, 0x3F9FC111,0x7422F073,
+	0x3FA0624D,0xD2F1A9FC, 0x3FA063BC,0x7A620502,
+	0x3FA0E560,0x4189374C, 0x3FA0E6F2,0x61347911,
+	0x3FA16872,0xB020C49C, 0x3FA16A2A,0x7FC97D7E,
+	0x3FA1EB85,0x1EB851EC, 0x3FA1ED64,0xE762E589,
+	0x3FA26E97,0x8D4FDF3B, 0x3FA270A1,0xA943B7B3,
+	0x3FA2F1A9,0xFBE76C8B, 0x3FA2F3E0,0xD6B036D7,
+	0x3FA374BC,0x6A7EF9DB, 0x3FA37722,0x80EDEB43,
+	0x3FA3F7CE,0xD916872B, 0x3FA3FA66,0xB943ABD4,
+	0x3FA47AE1,0x47AE147B, 0x3FA47DAD,0x90F9A717,
+	0x3FA4FDF3,0xB645A1CB, 0x3FA500F7,0x19596C62,
+	0x3FA58106,0x24DD2F1B, 0x3FA58443,0x63ADF4FC,
+	0x3FA60418,0x9374BC6A, 0x3FA60792,0x8143AD38,
+	0x3FA6872B,0x020C49BA, 0x3FA68AE4,0x83687D9F,
+	0x3FA70A3D,0x70A3D70A, 0x3FA70E39,0x7B6BD410,
+	0x3FA78D4F,0xDF3B645A, 0x3FA79191,0x7A9EACEA,
+	0x3FA81062,0x4DD2F1AA, 0x3FA814EC,0x92539C35,
+	0x3FA89374,0xBC6A7EFA, 0x3FA8984A,0xD3DED6CC,
+	0x3FA91687,0x2B020C4A, 0x3FA91BAC,0x50963B88,
+	0x3FA99999,0x9999999A, 0x3FA99F11,0x19D15C71,
+	0x3FAA1CAC,0x083126E9, 0x3FAA2279,0x40E987EC,
+	0x3FAA9FBE,0x76C8B439, 0x3FAAA5E4,0xD739D1F0,
+	0x3FAB22D0,0xE5604189, 0x3FAB2953,0xEE1F1D37,
+	0x3FABA5E3,0x53F7CED9, 0x3FABACC6,0x96F82475,
+	0x3FAC28F5,0xC28F5C29, 0x3FAC303C,0xE3258391,
+	0x3FACAC08,0x3126E979, 0x3FACB3B6,0xE409C0E0,
+	0x3FAD2F1A,0x9FBE76C9, 0x3FAD3734,0xAB09565F,
+	0x3FADB22D,0x0E560419, 0x3FADBAB6,0x498ABAF4,
+	0x3FAE353F,0x7CED9168, 0x3FAE3E3B,0xD0F66BAC,
+	0x3FAEB851,0xEB851EB8, 0x3FAEC1C5,0x52B6F506,
+	0x3FAF3B64,0x5A1CAC08, 0x3FAF4552,0xE038FC2E,
+	0x3FAFBE76,0xC8B43958, 0x3FAFC8E4,0x8AEB4849,
+	0x3FB020C4,0x9BA5E354, 0x3FB0263D,0x321F65E1,
+	0x3FB0624D,0xD2F1A9FC, 0x3FB0680A,0x3ED356CA,
+	0x3FB0A3D7,0x0A3D70A4, 0x3FB0A9D9,0x744C294D,
+	0x3FB0E560,0x4189374C, 0x3FB0EBAA,0xDB45B370,
+	0x3FB126E9,0x78D4FDF4, 0x3FB12D7E,0x7C7CF37B,
+	0x3FB16872,0xB020C49C, 0x3FB16F54,0x60B014A5,
+	0x3FB1A9FB,0xE76C8B44, 0x3FB1B12C,0x909E73C1,
+	0x3FB1EB85,0x1EB851EC, 0x3FB1F307,0x1508A3E8,
+	0x3FB22D0E,0x56041893, 0x3FB234E3,0xF6B0732E,
+	0x3FB26E97,0x8D4FDF3B, 0x3FB276C3,0x3E58EF50,
+	0x3FB2B020,0xC49BA5E3, 0x3FB2B8A4,0xF4C66A65,
+	0x3FB2F1A9,0xFBE76C8B, 0x3FB2FA89,0x22BE7F94,
+	0x3FB33333,0x33333333, 0x3FB33C6F,0xD10817C8,
+	0x3FB374BC,0x6A7EF9DB, 0x3FB37E59,0x086B6E68,
+	0x3FB3B645,0xA1CAC083, 0x3FB3C044,0xD1B2160D,
+	0x3FB3F7CE,0xD916872B, 0x3FB40233,0x35A6FD3A,
+	0x3FB43958,0x10624DD3, 0x3FB44424,0x3D16731E,
+	0x3FB47AE1,0x47AE147B, 0x3FB48617,0xF0CE2C49,
+	0x3FB4BC6A,0x7EF9DB23, 0x3FB4C80E,0x599D476F,
+	0x3FB4FDF3,0xB645A1CB, 0x3FB50A07,0x80545224,
+	0x3FB53F7C,0xED916873, 0x3FB54C03,0x6DC54DA3,
+	0x3FB58106,0x24DD2F1B, 0x3FB58E02,0x2AC3B38B,
+	0x3FB5C28F,0x5C28F5C3, 0x3FB5D003,0xC0247AA7,
+	0x3FB60418,0x9374BC6A, 0x3FB61208,0x36BE1BB4,
+	0x3FB645A1,0xCAC08312, 0x3FB6540F,0x9768962B,
+	0x3FB6872B,0x020C49BA, 0x3FB69619,0xEAFD7506,
+	0x3FB6C8B4,0x39581062, 0x3FB6D827,0x3A57D390,
+	0x3FB70A3D,0x70A3D70A, 0x3FB71A37,0x8E546231,
+	0x3FB74BC6,0xA7EF9DB2, 0x3FB75C4A,0xEFD16B3C,
+	0x3FB78D4F,0xDF3B645A, 0x3FB79E61,0x67AED7C2,
+	0x3FB7CED9,0x16872B02, 0x3FB7E07A,0xFECE3462,
+	0x3FB81062,0x4DD2F1AA, 0x3FB82297,0xBE12B622,
+	0x3FB851EB,0x851EB852, 0x3FB864B7,0xAE613F42,
+	0x3FB89374,0xBC6A7EFA, 0x3FB8A6DA,0xD8A06415,
+	0x3FB8D4FD,0xF3B645A2, 0x3FB8E901,0x45B86FDC,
+	0x3FB91687,0x2B020C4A, 0x3FB92B2A,0xFE9369A1,
+	0x3FB95810,0x624DD2F2, 0x3FB96D58,0x0C1D1919,
+	0x3FB99999,0x9999999A, 0x3FB9AF88,0x77430B80,
+	0x3FB9DB22,0xD0E56042, 0x3FB9F1BC,0x48F4987D,
+	0x3FBA1CAC,0x083126E9, 0x3FBA33F3,0x8A22E705,
+	0x3FBA5E35,0x3F7CED91, 0x3FBA762E,0x43C0F247,
+	0x3FBA9FBE,0x76C8B439, 0x3FBAB86C,0x7EC38E8B,
+	0x3FBAE147,0xAE147AE1, 0x3FBAFAAE,0x44216E25,
+	0x3FBB22D0,0xE5604189, 0x3FBB3CF3,0x9CD3265C,
+	0x3FBB645A,0x1CAC0831, 0x3FBB7F3C,0x91D3345E,
+	0x3FBBA5E3,0x53F7CED9, 0x3FBBC189,0x2C1E022B,
+	0x3FBBE76C,0x8B439581, 0x3FBC03D9,0x74B1EB8D,
+	0x3FBC28F5,0xC28F5C29, 0x3FBC462D,0x748F430D,
+	0x3FBC6A7E,0xF9DB22D1, 0x3FBC8885,0x34B856E6,
+	0x3FBCAC08,0x3126E979, 0x3FBCCAE0,0xBE317607,
+	0x3FBCED91,0x6872B021, 0x3FBD0D40,0x1A00F506,
+	0x3FBD2F1A,0x9FBE76C9, 0x3FBD4FA3,0x512F3325,
+	0x3FBD70A3,0xD70A3D71, 0x3FBD920A,0x6CC69F53,
+	0x3FBDB22D,0x0E560419, 0x3FBDD475,0x75D3BD29,
+	0x3FBDF3B6,0x45A1CAC1, 0x3FBE16E4,0x756529F6,
+	0x3FBE353F,0x7CED9168, 0x3FBE5957,0x748BA1C5,
+	0x3FBE76C8,0xB4395810, 0x3FBE9BCE,0x7C5A0467,
+	0x3FBEB851,0xEB851EB8, 0x3FBEDE49,0x95E55A7F,
+	0x3FBEF9DB,0x22D0E560, 0x3FBF20C8,0xCA44DA93,
+	0x3FBF3B64,0x5A1CAC08, 0x3FBF634C,0x2291EE1D,
+	0x3FBF7CED,0x916872B0, 0x3FBFA5D3,0xA7E8369F,
+	0x3FBFBE76,0xC8B43958, 0x3FBFE85F,0x636592BA,
+	0x3FC00000,0x00000000, 0x3FC01577,0xAF1511A5,
+	0x3FC020C4,0x9BA5E354, 0x3FC036C1,0xD0AC283F,
+	0x3FC04189,0x374BC6A8, 0x3FC0580E,0x1B0A677C,
+	0x3FC0624D,0xD2F1A9FC, 0x3FC0795C,0x92C35279,
+	0x3FC08312,0x6E978D50, 0x3FC09AAD,0x3C6B97AE,
+	0x3FC0A3D7,0x0A3D70A4, 0x3FC0BC00,0x1C991383,
+	0x3FC0C49B,0xA5E353F8, 0x3FC0DD55,0x37E2D2E5,
+	0x3FC0E560,0x4189374C, 0x3FC0FEAC,0x92E115DB,
+	0x3FC10624,0xDD2F1AA0, 0x3FC12006,0x322D5220,
+	0x3FC126E9,0x78D4FDF4, 0x3FC14162,0x1A6235B7,
+	0x3FC147AE,0x147AE148, 0x3FC162C0,0x501BA989,
+	0x3FC16872,0xB020C49C, 0x3FC18420,0xD7F6D401,
+	0x3FC18937,0x4BC6A7F0, 0x3FC1A583,0xB6921BA7,
+	0x3FC1A9FB,0xE76C8B44, 0x3FC1C6E8,0xF08D29C0,
+	0x3FC1CAC0,0x83126E98, 0x3FC1E850,0x8A88ECEC,
+	0x3FC1EB85,0x1EB851EC, 0x3FC209BA,0x89279BCC,
+	0x3FC20C49,0xBA5E353F, 0x3FC22B26,0xF10CB79E,
+	0x3FC22D0E,0x56041893, 0x3FC24C95,0xC6DD0EE9,
+	0x3FC24DD2,0xF1A9FBE7, 0x3FC26E07,0x0F3EC01D,
+	0x3FC26E97,0x8D4FDF3B, 0x3FC28F7A,0xCED93C3F,
+	0x3FC28F5C,0x28F5C28F, 0x3FC2B0F1,0x0A55498E,
+	0x3FC2B020,0xC49BA5E3, 0x3FC2D269,0xC65D062F,
+	0x3FC2D0E5,0x60418937, 0x3FC2F3E5,0x079BEADC,
+	0x3FC2F1A9,0xFBE76C8B, 0x3FC31562,0xD2BECD8E,
+	0x3FC3126E,0x978D4FDF, 0x3FC336E3,0x2C73E42D,
+	0x3FC33333,0x33333333, 0x3FC35866,0x196AC743,
+	0x3FC353F7,0xCED91687, 0x3FC379EB,0x9E5474AA,
+	0x3FC374BC,0x6A7EF9DB, 0x3FC39B73,0xBFE35248,
+	0x3FC39581,0x0624DD2F, 0x3FC3BCFE,0x82CB30BC,
+	0x3FC3B645,0xA1CAC083, 0x3FC3DE8B,0xEBC14E1A,
+	0x3FC3D70A,0x3D70A3D7, 0x3FC4001B,0xFF7C58A4,
+	0x3FC3F7CE,0xD916872B, 0x3FC421AE,0xC2B47185,
+	0x3FC41893,0x74BC6A7F, 0x3FC44344,0x3A232F8C,
+	0x3FC43958,0x10624DD3, 0x3FC464DC,0x6A83A1E9,
+	0x3FC45A1C,0xAC083127, 0x3FC48677,0x589252F1,
+	0x3FC47AE1,0x47AE147B, 0x3FC4A815,0x090D4ADD,
+	0x3FC49BA5,0xE353F7CF, 0x3FC4C9B5,0x80B4128D,
+	0x3FC4BC6A,0x7EF9DB23, 0x3FC4EB58,0xC447B64F,
+	0x3FC4DD2F,0x1A9FBE77, 0x3FC50CFE,0xD88AC8A2,
+	0x3FC4FDF3,0xB645A1CB, 0x3FC52EA7,0xC2416505,
+	0x3FC51EB8,0x51EB851F, 0x3FC55053,0x863132BB,
+	0x3FC53F7C,0xED916873, 0x3FC57202,0x2921679D,
+	0x3FC56041,0x89374BC7, 0x3FC593B3,0xAFDACAE2,
+	0x3FC58106,0x24DD2F1B, 0x3FC5B568,0x1F27B7F5,
+	0x3FC5A1CA,0xC083126F, 0x3FC5D71F,0x7BD42144,
+	0x3FC5C28F,0x5C28F5C3, 0x3FC5F8D9,0xCAAD9312,
+	0x3FC5E353,0xF7CED917, 0x3FC61A97,0x10833651,
+	0x3FC60418,0x9374BC6A, 0x3FC63C57,0x5225D373,
+	0x3FC624DD,0x2F1A9FBE, 0x3FC65E1A,0x9467D54F,
+	0x3FC645A1,0xCAC08312, 0x3FC67FE0,0xDC1D4BED,
+	0x3FC66666,0x66666666, 0x3FC6A1AA,0x2E1BEF6F,
+	0x3FC6872B,0x020C49BA, 0x3FC6C376,0x8F3B22EC,
+	0x3FC6A7EF,0x9DB22D0E, 0x3FC6E546,0x0453F750,
+	0x3FC6C8B4,0x39581062, 0x3FC70718,0x92412E43,
+	0x3FC6E978,0xD4FDF3B6, 0x3FC728EE,0x3DDF3D0B,
+	0x3FC70A3D,0x70A3D70A, 0x3FC74AC7,0x0C0C4F74,
+	0x3FC72B02,0x0C49BA5E, 0x3FC76CA3,0x01A84ABA,
+	0x3FC74BC6,0xA7EF9DB2, 0x3FC78E82,0x2394D074,
+	0x3FC76C8B,0x43958106, 0x3FC7B064,0x76B54180,
+	0x3FC78D4F,0xDF3B645A, 0x3FC7D249,0xFFEEC0F6,
+	0x3FC7AE14,0x7AE147AE, 0x3FC7F432,0xC4283716,
+	0x3FC7CED9,0x16872B02, 0x3FC8161E,0xC84A543C,
+	0x3FC7EF9D,0xB22D0E56, 0x3FC8380E,0x113F93D8,
+	0x3FC81062,0x4DD2F1AA, 0x3FC85A00,0xA3F43F66,
+	0x3FC83126,0xE978D4FE, 0x3FC87BF6,0x85567163,
+	0x3FC851EB,0x851EB852, 0x3FC89DEF,0xBA561850,
+	0x3FC872B0,0x20C49BA6, 0x3FC8BFEC,0x47E4F9AD,
+	0x3FC89374,0xBC6A7EFA, 0x3FC8E1EC,0x32F6B4F9,
+	0x3FC8B439,0x5810624E, 0x3FC903EF,0x8080C6B8,
+	0x3FC8D4FD,0xF3B645A2, 0x3FC925F6,0x357A8B73,
+	0x3FC8F5C2,0x8F5C28F6, 0x3FC94800,0x56DD42C4,
+	0x3FC91687,0x2B020C4A, 0x3FC96A0D,0xE9A41260,
+	0x3FC9374B,0xC6A7EF9E, 0x3FC98C1E,0xF2CC091C,
+	0x3FC95810,0x624DD2F2, 0x3FC9AE33,0x77542205,
+	0x3FC978D4,0xFDF3B646, 0x3FC9D04B,0x7C3D4769,
+	0x3FC99999,0x9999999A, 0x3FC9F267,0x068A55EC,
+	0x3FC9BA5E,0x353F7CEE, 0x3FCA1486,0x1B401F9E,
+	0x3FC9DB22,0xD0E56042, 0x3FCA36A8,0xBF656F12,
+	0x3FC9FBE7,0x6C8B4396, 0x3FCA58CE,0xF8030A79,
+	0x3FCA1CAC,0x083126E9, 0x3FCA7AF8,0xCA23B6BB,
+	0x3FCA3D70,0xA3D70A3D, 0x3FCA9D26,0x3AD43A9A,
+	0x3FCA5E35,0x3F7CED91, 0x3FCABF57,0x4F2361D1,
+	0x3FCA7EF9,0xDB22D0E5, 0x3FCAE18C,0x0C220035,
+	0x3FCA9FBE,0x76C8B439, 0x3FCB03C4,0x76E2F4E0,
+	0x3FCAC083,0x126E978D, 0x3FCB2600,0x947B2D57,
+	0x3FCAE147,0xAE147AE1, 0x3FCB4840,0x6A01A8B4,
+	0x3FCB020C,0x49BA5E35, 0x3FCB6A83,0xFC8F7AD5,
+	0x3FCB22D0,0xE5604189, 0x3FCB8CCB,0x513FCF8D,
+	0x3FCB4395,0x810624DD, 0x3FCBAF16,0x6D2FEDD5,
+	0x3FCB645A,0x1CAC0831, 0x3FCBD165,0x557F3AFF,
+	0x3FCB851E,0xB851EB85, 0x3FCBF3B8,0x0F4F3DF4,
+	0x3FCBA5E3,0x53F7CED9, 0x3FCC160E,0x9FC3A267,
+	0x3FCBC6A7,0xEF9DB22D, 0x3FCC3869,0x0C023C18,
+	0x3FCBE76C,0x8B439581, 0x3FCC5AC7,0x59330A10,
+	0x3FCC0831,0x26E978D5, 0x3FCC7D29,0x8C8039E5,
+	0x3FCC28F5,0xC28F5C29, 0x3FCC9F8F,0xAB162AFC,
+	0x3FCC49BA,0x5E353F7D, 0x3FCCC1F9,0xBA2371D7,
+	0x3FCC6A7E,0xF9DB22D1, 0x3FCCE467,0xBED8DB56,
+	0x3FCC8B43,0x95810625, 0x3FCD06D9,0xBE69700E,
+	0x3FCCAC08,0x3126E979, 0x3FCD294F,0xBE0A778F,
+	0x3FCCCCCC,0xCCCCCCCD, 0x3FCD4BC9,0xC2F37BC0,
+	0x3FCCED91,0x6872B021, 0x3FCD6E47,0xD25E4C2D,
+	0x3FCD0E56,0x04189375, 0x3FCD90C9,0xF1870162,
+	0x3FCD2F1A,0x9FBE76C9, 0x3FCDB350,0x25AC0046,
+	0x3FCD4FDF,0x3B645A1D, 0x3FCDD5DA,0x740DFD78,
+	0x3FCD70A3,0xD70A3D71, 0x3FCDF868,0xE1F000B0,
+	0x3FCD9168,0x72B020C5, 0x3FCE1AFB,0x74976824,
+	0x3FCDB22D,0x0E560419, 0x3FCE3D92,0x314BEBEB,
+	0x3FCDD2F1,0xA9FBE76D, 0x3FCE602D,0x1D57A168,
+	0x3FCDF3B6,0x45A1CAC1, 0x3FCE82CC,0x3E06FEB6,
+	0x3FCE147A,0xE147AE14, 0x3FCEA56F,0x98A8DE18,
+	0x3FCE353F,0x7CED9168, 0x3FCEC817,0x328E816C,
+	0x3FCE5604,0x189374BC, 0x3FCEEAC3,0x110B959C,
+	0x3FCE76C8,0xB4395810, 0x3FCF0D73,0x39763619,
+	0x3FCE978D,0x4FDF3B64, 0x3FCF3027,0xB126F057,
+	0x3FCEB851,0xEB851EB8, 0x3FCF52E0,0x7D78C747,
+	0x3FCED916,0x872B020C, 0x3FCF759D,0xA3C936DE,
+	0x3FCEF9DB,0x22D0E560, 0x3FCF985F,0x29783796,
+	0x3FCF1A9F,0xBE76C8B4, 0x3FCFBB25,0x13E841F3,
+	0x3FCF3B64,0x5A1CAC08, 0x3FCFDDEF,0x687E5213,
+	0x3FCF5C28,0xF5C28F5C, 0x3FD0005F,0x1650F59C,
+	0x3FCF7CED,0x916872B0, 0x3FD011C8,0xB2DE8DAD,
+	0x3FCF9DB2,0x2D0E5604, 0x3FD02334,0x8C9E3F5D,
+	0x3FCFBE76,0xC8B43958, 0x3FD034A2,0xA647A1BD,
+	0x3FCFDF3B,0x645A1CAC, 0x3FD04613,0x0293969C,
+	0x3FD00000,0x00000000, 0x3FD05785,0xA43C4C56,
+	0x3FD01062,0x4DD2F1AA, 0x3FD068FA,0x8DFD3FA2,
+	0x3FD020C4,0x9BA5E354, 0x3FD07A71,0xC2933D69,
+	0x3FD03126,0xE978D4FE, 0x3FD08BEB,0x44BC6495,
+	0x3FD04189,0x374BC6A8, 0x3FD09D67,0x173827E8,
+	0x3FD051EB,0x851EB852, 0x3FD0AEE5,0x3CC74FD5,
+	0x3FD0624D,0xD2F1A9FC, 0x3FD0C065,0xB82BFC56,
+	0x3FD072B0,0x20C49BA6, 0x3FD0D1E8,0x8C29A6C9,
+	0x3FD08312,0x6E978D50, 0x3FD0E36D,0xBB8523CA,
+	0x3FD09374,0xBC6A7EFA, 0x3FD0F4F5,0x4904A512,
+	0x3FD0A3D7,0x0A3D70A4, 0x3FD1067F,0x376FBB57,
+	0x3FD0B439,0x5810624E, 0x3FD1180B,0x898F582C,
+	0x3FD0C49B,0xA5E353F8, 0x3FD1299A,0x422DCFE6,
+	0x3FD0D4FD,0xF3B645A2, 0x3FD13B2B,0x6416DB80,
+	0x3FD0E560,0x4189374C, 0x3FD14CBE,0xF2179A81,
+	0x3FD0F5C2,0x8F5C28F6, 0x3FD15E54,0xEEFE94E6,
+	0x3FD10624,0xDD2F1AA0, 0x3FD16FED,0x5D9BBD0B,
+	0x3FD11687,0x2B020C4A, 0x3FD18188,0x40C07198,
+	0x3FD126E9,0x78D4FDF4, 0x3FD19325,0x9B3F7F6D,
+	0x3FD1374B,0xC6A7EF9E, 0x3FD1A4C5,0x6FED2395,
+	0x3FD147AE,0x147AE148, 0x3FD1B667,0xC19F0D33,
+	0x3FD15810,0x624DD2F2, 0x3FD1C80C,0x932C5F7C,
+	0x3FD16872,0xB020C49C, 0x3FD1D9B3,0xE76DB3A6,
+	0x3FD178D4,0xFDF3B646, 0x3FD1EB5D,0xC13D1AE0,
+	0x3FD18937,0x4BC6A7F0, 0x3FD1FD0A,0x23762050,
+	0x3FD19999,0x9999999A, 0x3FD20EB9,0x10F5CB09,
+	0x3FD1A9FB,0xE76C8B44, 0x3FD2206A,0x8C9AA009,
+	0x3FD1BA5E,0x353F7CEE, 0x3FD2321E,0x9944A439,
+	0x3FD1CAC0,0x83126E98, 0x3FD243D5,0x39D55E6C,
+	0x3FD1DB22,0xD0E56042, 0x3FD2558E,0x712FD964,
+	0x3FD1EB85,0x1EB851EC, 0x3FD2674A,0x4238A5D5,
+	0x3FD1FBE7,0x6C8B4396, 0x3FD27908,0xAFD5DC69,
+	0x3FD20C49,0xBA5E353F, 0x3FD28AC9,0xBCEF1FD0,
+	0x3FD21CAC,0x083126E9, 0x3FD29C8D,0x6C6D9EC4,
+	0x3FD22D0E,0x56041893, 0x3FD2AE53,0xC13C1617,
+	0x3FD23D70,0xA3D70A3D, 0x3FD2C01C,0xBE46D2C4,
+	0x3FD24DD2,0xF1A9FBE7, 0x3FD2D1E8,0x667BB3FC,
+	0x3FD25E35,0x3F7CED91, 0x3FD2E3B6,0xBCCA2D3C,
+	0x3FD26E97,0x8D4FDF3B, 0x3FD2F587,0xC4234860,
+	0x3FD27EF9,0xDB22D0E5, 0x3FD3075B,0x7F79A7BB,
+	0x3FD28F5C,0x28F5C28F, 0x3FD31931,0xF1C1882F,
+	0x3FD29FBE,0x76C8B439, 0x3FD32B0B,0x1DF0C347,
+	0x3FD2B020,0xC49BA5E3, 0x3FD33CE7,0x06FED157,
+	0x3FD2C083,0x126E978D, 0x3FD34EC5,0xAFE4CB9A,
+	0x3FD2D0E5,0x60418937, 0x3FD360A7,0x1B9D6E52,
+	0x3FD2E147,0xAE147AE1, 0x3FD3728B,0x4D251AED,
+	0x3FD2F1A9,0xFBE76C8B, 0x3FD38472,0x4779DA2B,
+	0x3FD3020C,0x49BA5E35, 0x3FD3965C,0x0D9B5E46,
+	0x3FD3126E,0x978D4FDF, 0x3FD3A848,0xA28B0518,
+	0x3FD322D0,0xE5604189, 0x3FD3BA38,0x094BDA50,
+	0x3FD33333,0x33333333, 0x3FD3CC2A,0x44E29998,
+	0x3FD34395,0x810624DD, 0x3FD3DE1F,0x5855B0C8,
+	0x3FD353F7,0xCED91687, 0x3FD3F017,0x46AD421F,
+	0x3FD3645A,0x1CAC0831, 0x3FD40212,0x12F3266E,
+	0x3FD374BC,0x6A7EF9DB, 0x3FD4140F,0xC032EF59,
+	0x3FD3851E,0xB851EB85, 0x3FD42610,0x5179E98A,
+	0x3FD39581,0x0624DD2F, 0x3FD43813,0xC9D71EF1,
+	0x3FD3A5E3,0x53F7CED9, 0x3FD44A1A,0x2C5B5903,
+	0x3FD3B645,0xA1CAC083, 0x3FD45C23,0x7C1922F7,
+	0x3FD3C6A7,0xEF9DB22D, 0x3FD46E2F,0xBC24CC0D,
+	0x3FD3D70A,0x3D70A3D7, 0x3FD4803E,0xEF9469D0,
+	0x3FD3E76C,0x8B439581, 0x3FD49251,0x197FDA61,
+	0x3FD3F7CE,0xD916872B, 0x3FD4A466,0x3D00C6C1,
+	0x3FD40831,0x26E978D5, 0x3FD4B67E,0x5D32A51C,
+	0x3FD41893,0x74BC6A7F, 0x3FD4C899,0x7D32BB17,
+	0x3FD428F5,0xC28F5C29, 0x3FD4DAB7,0xA0202027,
+	0x3FD43958,0x10624DD3, 0x3FD4ECD8,0xC91BBFDE,
+	0x3FD449BA,0x5E353F7D, 0x3FD4FEFC,0xFB485C46,
+	0x3FD45A1C,0xAC083127, 0x3FD51124,0x39CA903B,
+	0x3FD46A7E,0xF9DB22D1, 0x3FD5234E,0x87C8D1C0,
+	0x3FD47AE1,0x47AE147B, 0x3FD5357B,0xE86B7466,
+	0x3FD48B43,0x95810625, 0x3FD547AC,0x5EDCABA2,
+	0x3FD49BA5,0xE353F7CF, 0x3FD559DF,0xEE488D3B,
+	0x3FD4AC08,0x3126E979, 0x3FD56C16,0x99DD13A7,
+	0x3FD4BC6A,0x7EF9DB23, 0x3FD57E50,0x64CA2078,
+	0x3FD4CCCC,0xCCCCCCCD, 0x3FD5908D,0x52417EC4,
+	0x3FD4DD2F,0x1A9FBE77, 0x3FD5A2CD,0x6576E593,
+	0x3FD4ED91,0x6872B021, 0x3FD5B510,0xA19FFA51,
+	0x3FD4FDF3,0xB645A1CB, 0x3FD5C757,0x09F4533D,
+	0x3FD50E56,0x04189375, 0x3FD5D9A0,0xA1AD79E4,
+	0x3FD51EB8,0x51EB851F, 0x3FD5EBED,0x6C06ED90,
+	0x3FD52F1A,0x9FBE76C9, 0x3FD5FE3D,0x6C3E25CC,
+	0x3FD53F7C,0xED916873, 0x3FD61090,0xA59294DA,
+	0x3FD54FDF,0x3B645A1D, 0x3FD622E7,0x1B45AA3A,
+	0x3FD56041,0x89374BC7, 0x3FD63540,0xD09AD524,
+	0x3FD570A3,0xD70A3D71, 0x3FD6479D,0xC8D78716,
+	0x3FD58106,0x24DD2F1B, 0x3FD659FE,0x07433658,
+	0x3FD59168,0x72B020C5, 0x3FD66C61,0x8F276088,
+	0x3FD5A1CA,0xC083126F, 0x3FD67EC8,0x63CF8D26,
+	0x3FD5B22D,0x0E560419, 0x3FD69132,0x88895028,
+	0x3FD5C28F,0x5C28F5C3, 0x3FD6A3A0,0x00A44C8C,
+	0x3FD5D2F1,0xA9FBE76D, 0x3FD6B610,0xCF7236EE,
+	0x3FD5E353,0xF7CED917, 0x3FD6C884,0xF846D822,
+	0x3FD5F3B6,0x45A1CAC1, 0x3FD6DAFC,0x7E780FCE,
+	0x3FD60418,0x9374BC6A, 0x3FD6ED77,0x655DD70D,
+	0x3FD6147A,0xE147AE14, 0x3FD6FFF5,0xB0524310,
+	0x3FD624DD,0x2F1A9FBE, 0x3FD71277,0x62B187BF,
+	0x3FD6353F,0x7CED9168, 0x3FD724FC,0x7FD9FA64,
+	0x3FD645A1,0xCAC08312, 0x3FD73785,0x0B2C1459,
+	0x3FD65604,0x189374BC, 0x3FD74A11,0x080A75AF,
+	0x3FD66666,0x66666666, 0x3FD75CA0,0x79D9E7E4,
+	0x3FD676C8,0xB4395810, 0x3FD76F33,0x64016095,
+	0x3FD6872B,0x020C49BA, 0x3FD781C9,0xC9EA0438,
+	0x3FD6978D,0x4FDF3B64, 0x3FD79463,0xAEFF28CF,
+	0x3FD6A7EF,0x9DB22D0E, 0x3FD7A701,0x16AE58AE,
+	0x3FD6B851,0xEB851EB8, 0x3FD7B9A2,0x04675536,
+	0x3FD6C8B4,0x39581062, 0x3FD7CC46,0x7B9C1998,
+	0x3FD6D916,0x872B020C, 0x3FD7DEEE,0x7FC0DD9E,
+	0x3FD6E978,0xD4FDF3B6, 0x3FD7F19A,0x144C1876,
+	0x3FD6F9DB,0x22D0E560, 0x3FD80449,0x3CB68379,
+	0x3FD70A3D,0x70A3D70A, 0x3FD816FB,0xFC7B1D03,
+	0x3FD71A9F,0xBE76C8B4, 0x3FD829B2,0x57172B3E,
+	0x3FD72B02,0x0C49BA5E, 0x3FD83C6C,0x500A3F02,
+	0x3FD73B64,0x5A1CAC08, 0x3FD84F29,0xEAD636A7,
+	0x3FD74BC6,0xA7EF9DB2, 0x3FD861EB,0x2AFF40E4,
+	0x3FD75C28,0xF5C28F5C, 0x3FD874B0,0x140BDFB4,
+	0x3FD76C8B,0x43958106, 0x3FD88778,0xA984EB35,
+	0x3FD77CED,0x916872B0, 0x3FD89A44,0xEEF5948F,
+	0x3FD78D4F,0xDF3B645A, 0x3FD8AD14,0xE7EB68E4,
+	0x3FD79DB2,0x2D0E5604, 0x3FD8BFE8,0x97F65436,
+	0x3FD7AE14,0x7AE147AE, 0x3FD8D2C0,0x02A8A461,
+	0x3FD7BE76,0xC8B43958, 0x3FD8E59B,0x2B970C08,
+	0x3FD7CED9,0x16872B02, 0x3FD8F87A,0x1658A591,
+	0x3FD7DF3B,0x645A1CAC, 0x3FD90B5C,0xC686F624,
+	0x3FD7EF9D,0xB22D0E56, 0x3FD91E43,0x3FBDF0A2,
+	0x3FD80000,0x00000000, 0x3FD9312D,0x859BF8B0,
+	0x3FD81062,0x4DD2F1AA, 0x3FD9441B,0x9BC1E5B7,
+	0x3FD820C4,0x9BA5E354, 0x3FD9570D,0x85D305F4,
+	0x3FD83126,0xE978D4FE, 0x3FD96A03,0x47752180,
+	0x3FD84189,0x374BC6A8, 0x3FD97CFC,0xE4507D62,
+	0x3FD851EB,0x851EB852, 0x3FD98FFA,0x600FDEA8,
+	0x3FD8624D,0xD2F1A9FC, 0x3FD9A2FB,0xBE608D7B,
+	0x3FD872B0,0x20C49BA6, 0x3FD9B601,0x02F2583B,
+	0x3FD88312,0x6E978D50, 0x3FD9C90A,0x317796A1,
+	0x3FD89374,0xBC6A7EFA, 0x3FD9DC17,0x4DA52CE3,
+	0x3FD8A3D7,0x0A3D70A4, 0x3FD9EF28,0x5B328ED9,
+	0x3FD8B439,0x5810624E, 0x3FDA023D,0x5DD9C326,
+	0x3FD8C49B,0xA5E353F8, 0x3FDA1556,0x5957666E,
+	0x3FD8D4FD,0xF3B645A2, 0x3FDA2873,0x516AAE80,
+	0x3FD8E560,0x4189374C, 0x3FDA3B94,0x49D56D94,
+	0x3FD8F5C2,0x8F5C28F6, 0x3FDA4EB9,0x465C1580,
+	0x3FD90624,0xDD2F1AA0, 0x3FDA61E2,0x4AC5BAF7,
+	0x3FD91687,0x2B020C4A, 0x3FDA750F,0x5ADC18CD,
+	0x3FD926E9,0x78D4FDF4, 0x3FDA8840,0x7A6B933E,
+	0x3FD9374B,0xC6A7EF9E, 0x3FDA9B75,0xAD433B34,
+	0x3FD947AE,0x147AE148, 0x3FDAAEAE,0xF734D197,
+	0x3FD95810,0x624DD2F2, 0x3FDAC1EC,0x5C14CA9F,
+	0x3FD96872,0xB020C49C, 0x3FDAD52D,0xDFBA512B,
+	0x3FD978D4,0xFDF3B646, 0x3FDAE873,0x85FF4A1B,
+	0x3FD98937,0x4BC6A7F0, 0x3FDAFBBD,0x52C057AB,
+	0x3FD99999,0x9999999A, 0x3FDB0F0B,0x49DCDCD8,
+	0x3FD9A9FB,0xE76C8B44, 0x3FDB225D,0x6F3700C8,
+	0x3FD9BA5E,0x353F7CEE, 0x3FDB35B3,0xC6B3B231,
+	0x3FD9CAC0,0x83126E98, 0x3FDB490E,0x543AAAC9,
+	0x3FD9DB22,0xD0E56042, 0x3FDB5C6D,0x1BB672BB,
+	0x3FD9EB85,0x1EB851EC, 0x3FDB6FD0,0x2114641A,
+	0x3FD9FBE7,0x6C8B4396, 0x3FDB8337,0x6844AE63,
+	0x3FDA0C49,0xBA5E353F, 0x3FDB96A2,0xF53A59F3,
+	0x3FDA1CAC,0x083126E9, 0x3FDBAA12,0xCBEB4B98,
+	0x3FDA2D0E,0x56041893, 0x3FDBBD86,0xF050480E,
+	0x3FDA3D70,0xA3D70A3D, 0x3FDBD0FF,0x6664F790,
+	0x3FDA4DD2,0xF1A9FBE7, 0x3FDBE47C,0x3227E96C,
+	0x3FDA5E35,0x3F7CED91, 0x3FDBF7FD,0x579A9793,
+	0x3FDA6E97,0x8D4FDF3B, 0x3FDC0B82,0xDAC16A3A,
+	0x3FDA7EF9,0xDB22D0E5, 0x3FDC1F0C,0xBFA3BB73,
+	0x3FDA8F5C,0x28F5C28F, 0x3FDC329B,0x0A4BDAD1,
+	0x3FDA9FBE,0x76C8B439, 0x3FDC462D,0xBEC71112,
+	0x3FDAB020,0xC49BA5E3, 0x3FDC59C4,0xE125A3CA,
+	0x3FDAC083,0x126E978D, 0x3FDC6D60,0x757AD914,
+	0x3FDAD0E5,0x60418937, 0x3FDC8100,0x7FDCFB47,
+	0x3FDAE147,0xAE147AE1, 0x3FDC94A5,0x04655CB0,
+	0x3FDAF1A9,0xFBE76C8B, 0x3FDCA84E,0x07305B52,
+	0x3FDB020C,0x49BA5E35, 0x3FDCBBFB,0x8C5D64A9,
+	0x3FDB126E,0x978D4FDF, 0x3FDCCFAD,0x980EF971,
+	0x3FDB22D0,0xE5604189, 0x3FDCE364,0x2E6AB175,
+	0x3FDB3333,0x33333333, 0x3FDCF71F,0x53993F60,
+	0x3FDB4395,0x810624DD, 0x3FDD0ADF,0x0BC67495,
+	0x3FDB53F7,0xCED91687, 0x3FDD1EA3,0x5B214507,
+	0x3FDB645A,0x1CAC0831, 0x3FDD326C,0x45DBCB1D,
+	0x3FDB74BC,0x6A7EF9DB, 0x3FDD4639,0xD02B4B97,
+	0x3FDB851E,0xB851EB85, 0x3FDD5A0B,0xFE483977,
+	0x3FDB9581,0x0624DD2F, 0x3FDD6DE2,0xD46E39F2,
+	0x3FDBA5E3,0x53F7CED9, 0x3FDD81BE,0x56DC2861,
+	0x3FDBB645,0xA1CAC083, 0x3FDD959E,0x89D41A41,
+	0x3FDBC6A7,0xEF9DB22D, 0x3FDDA983,0x719B6329,
+	0x3FDBD70A,0x3D70A3D7, 0x3FDDBD6D,0x127A98D6,
+	0x3FDBE76C,0x8B439581, 0x3FDDD15B,0x70BD972D,
+	0x3FDBF7CE,0xD916872B, 0x3FDDE54E,0x90B3844F,
+	0x3FDC0831,0x26E978D5, 0x3FDDF946,0x76AED4A6,
+	0x3FDC1893,0x74BC6A7F, 0x3FDE0D43,0x27054F04,
+	0x3FDC28F5,0xC28F5C29, 0x3FDE2144,0xA61010BB,
+	0x3FDC3958,0x10624DD3, 0x3FDE354A,0xF82B91C4,
+	0x3FDC49BA,0x5E353F7D, 0x3FDE4956,0x21B7A8E6,
+	0x3FDC5A1C,0xAC083127, 0x3FDE5D66,0x27178FE3,
+	0x3FDC6A7E,0xF9DB22D1, 0x3FDE717B,0x0CB1E7AD,
+	0x3FDC7AE1,0x47AE147B, 0x3FDE8594,0xD6F0BC9D,
+	0x3FDC8B43,0x95810625, 0x3FDE99B3,0x8A418AB5,
+	0x3FDC9BA5,0xE353F7CF, 0x3FDEADD7,0x2B1541DC,
+	0x3FDCAC08,0x3126E979, 0x3FDEC1FF,0xBDE04A31,
+	0x3FDCBC6A,0x7EF9DB23, 0x3FDED62D,0x471A8851,
+	0x3FDCCCCC,0xCCCCCCCD, 0x3FDEEA5F,0xCB3F61B4,
+	0x3FDCDD2F,0x1A9FBE77, 0x3FDEFE97,0x4ECDC0FE,
+	0x3FDCED91,0x6872B021, 0x3FDF12D3,0xD6481A68,
+	0x3FDCFDF3,0xB645A1CB, 0x3FDF2715,0x6634701F,
+	0x3FDD0E56,0x04189375, 0x3FDF3B5C,0x031C56B2,
+	0x3FDD1EB8,0x51EB851F, 0x3FDF4FA7,0xB18CF984,
+	0x3FDD2F1A,0x9FBE76C9, 0x3FDF63F8,0x76171F43,
+	0x3FDD3F7C,0xED916873, 0x3FDF784E,0x554F2E61,
+	0x3FDD4FDF,0x3B645A1D, 0x3FDF8CA9,0x53CD319E,
+	0x3FDD6041,0x89374BC7, 0x3FDFA109,0x762CDC8B,
+	0x3FDD70A3,0xD70A3D71, 0x3FDFB56E,0xC10D901B,
+	0x3FDD8106,0x24DD2F1B, 0x3FDFC9D9,0x39125F39,
+	0x3FDD9168,0x72B020C5, 0x3FDFDE48,0xE2E21362,
+	0x3FDDA1CA,0xC083126F, 0x3FDFF2BD,0xC3273145,
+	0x3FDDB22D,0x0E560419, 0x3FE0039B,0xEF47FEB7,
+	0x3FDDC28F,0x5C28F5C3, 0x3FE00DDB,0x9CE74077,
+	0x3FDDD2F1,0xA9FBE76D, 0x3FE0181D,0xECCC470A,
+	0x3FDDE353,0xF7CED917, 0x3FE02262,0xE153E292,
+	0x3FDDF3B6,0x45A1CAC1, 0x3FE02CAA,0x7CDCCC8D,
+	0x3FDE0418,0x9374BC6A, 0x3FE036F4,0xC1C7AA37,
+	0x3FDE147A,0xE147AE14, 0x3FE04141,0xB2770EF2,
+	0x3FDE24DD,0x2F1A9FBE, 0x3FE04B91,0x514F7EAD,
+	0x3FDE353F,0x7CED9168, 0x3FE055E3,0xA0B77055,
+	0x3FDE45A1,0xCAC08312, 0x3FE06038,0xA3175044,
+	0x3FDE5604,0x189374BC, 0x3FE06A90,0x5AD982B1,
+	0x3FDE6666,0x66666666, 0x3FE074EA,0xCA6A662C,
+	0x3FDE76C8,0xB4395810, 0x3FE07F47,0xF4385618,
+	0x3FDE872B,0x020C49BA, 0x3FE089A7,0xDAB3AD23,
+	0x3FDE978D,0x4FDF3B64, 0x3FE0940A,0x804EC7CD,
+	0x3FDEA7EF,0x9DB22D0E, 0x3FE09E6F,0xE77E06EA,
+	0x3FDEB851,0xEB851EB8, 0x3FE0A8D8,0x12B7D22A,
+	0x3FDEC8B4,0x39581062, 0x3FE0B343,0x04749AA5,
+	0x3FDED916,0x872B020C, 0x3FE0BDB0,0xBF2EDD67,
+	0x3FDEE978,0xD4FDF3B6, 0x3FE0C821,0x45632605,
+	0x3FDEF9DB,0x22D0E560, 0x3FE0D294,0x99901134,
+	0x3FDF0A3D,0x70A3D70A, 0x3FE0DD0A,0xBE364F5E,
+	0x3FDF1A9F,0xBE76C8B4, 0x3FE0E783,0xB5D8A740,
+	0x3FDF2B02,0x0C49BA5E, 0x3FE0F1FF,0x82FBF88E,
+	0x3FDF3B64,0x5A1CAC08, 0x3FE0FC7E,0x28273E93,
+	0x3FDF4BC6,0xA7EF9DB2, 0x3FE106FF,0xA7E392D9,
+	0x3FDF5C28,0xF5C28F5C, 0x3FE11184,0x04BC2FD6,
+	0x3FDF6C8B,0x43958106, 0x3FE11C0B,0x413E739C,
+	0x3FDF7CED,0x916872B0, 0x3FE12695,0x5FF9E286,
+	0x3FDF8D4F,0xDF3B645A, 0x3FE13122,0x638029F4,
+	0x3FDF9DB2,0x2D0E5604, 0x3FE13BB2,0x4E652305,
+	0x3FDFAE14,0x7AE147AE, 0x3FE14645,0x233ED550,
+	0x3FDFBE76,0xC8B43958, 0x3FE150DA,0xE4A579AB,
+	0x3FDFCED9,0x16872B02, 0x3FE15B73,0x95337CED,
+	0x3FDFDF3B,0x645A1CAC, 0x3FE1660F,0x378582BA,
+	0x3FDFEF9D,0xB22D0E56, 0x3FE170AD,0xCE3A684C,
+	0x3FE00000,0x00000000, 0x3FE17B4F,0x5BF3474A,
+	0x3FE00831,0x26E978D5, 0x3FE185F3,0xE353789A,
+	0x3FE01062,0x4DD2F1AA, 0x3FE1909B,0x67009737,
+	0x3FE01893,0x74BC6A7F, 0x3FE19B45,0xE9A28315,
+	0x3FE020C4,0x9BA5E354, 0x3FE1A5F3,0x6DE363FB,
+	0x3FE028F5,0xC28F5C29, 0x3FE1B0A3,0xF66FAC6C,
+	0x3FE03126,0xE978D4FE, 0x3FE1BB57,0x85F61C90,
+	0x3FE03958,0x10624DD3, 0x3FE1C60E,0x1F27C51F,
+	0x3FE04189,0x374BC6A8, 0x3FE1D0C7,0xC4B80A54,
+	0x3FE049BA,0x5E353F7D, 0x3FE1DB84,0x795CA6E2,
+	0x3FE051EB,0x851EB852, 0x3FE1E644,0x3FCDAEED,
+	0x3FE05A1C,0xAC083127, 0x3FE1F107,0x1AC5930A,
+	0x3FE0624D,0xD2F1A9FC, 0x3FE1FBCD,0x0D01233D,
+	0x3FE06A7E,0xF9DB22D1, 0x3FE20696,0x193F9203,
+	0x3FE072B0,0x20C49BA6, 0x3FE21162,0x4242775C,
+	0x3FE07AE1,0x47AE147B, 0x3FE21C31,0x8ACDD3D6,
+	0x3FE08312,0x6E978D50, 0x3FE22703,0xF5A813A5,
+	0x3FE08B43,0x95810625, 0x3FE231D9,0x859A11BA,
+	0x3FE09374,0xBC6A7EFA, 0x3FE23CB2,0x3D6F1ADC,
+	0x3FE09BA5,0xE353F7CF, 0x3FE2478E,0x1FF4F0C9,
+	0x3FE0A3D7,0x0A3D70A4, 0x3FE2526D,0x2FFBCD5E,
+	0x3FE0AC08,0x3126E979, 0x3FE25D4F,0x705665BE,
+	0x3FE0B439,0x5810624E, 0x3FE26834,0xE3D9ED7D,
+	0x3FE0BC6A,0x7EF9DB23, 0x3FE2731D,0x8D5E19DA,
+	0x3FE0C49B,0xA5E353F8, 0x3FE27E09,0x6FBD24ED,
+	0x3FE0CCCC,0xCCCCCCCD, 0x3FE288F8,0x8DD3D0EA,
+	0x3FE0D4FD,0xF3B645A2, 0x3FE293EA,0xEA816B5D,
+	0x3FE0DD2F,0x1A9FBE77, 0x3FE29EE0,0x88A7D070,
+	0x3FE0E560,0x4189374C, 0x3FE2A9D9,0x6B2B6E34,
+	0x3FE0ED91,0x6872B021, 0x3FE2B4D5,0x94F347F1,
+	0x3FE0F5C2,0x8F5C28F6, 0x3FE2BFD5,0x08E8F977,
+	0x3FE0FDF3,0xB645A1CB, 0x3FE2CAD7,0xC9F8BA79,
+	0x3FE10624,0xDD2F1AA0, 0x3FE2D5DD,0xDB1161E4,
+	0x3FE10E56,0x04189375, 0x3FE2E0E7,0x3F246948,
+	0x3FE11687,0x2B020C4A, 0x3FE2EBF3,0xF925F038,
+	0x3FE11EB8,0x51EB851F, 0x3FE2F704,0x0C0CBFBA,
+	0x3FE126E9,0x78D4FDF4, 0x3FE30217,0x7AD24DB4,
+	0x3FE12F1A,0x9FBE76C9, 0x3FE30D2E,0x4872C063,
+	0x3FE1374B,0xC6A7EF9E, 0x3FE31848,0x77ECF1D8,
+	0x3FE13F7C,0xED916873, 0x3FE32366,0x0C427371,
+	0x3FE147AE,0x147AE148, 0x3FE32E87,0x08779164,
+	0x3FE14FDF,0x3B645A1D, 0x3FE339AB,0x6F935645,
+	0x3FE15810,0x624DD2F2, 0x3FE344D3,0x449F8E97,
+	0x3FE16041,0x89374BC7, 0x3FE34FFE,0x8AA8CC5F,
+	0x3FE16872,0xB020C49C, 0x3FE35B2D,0x44BE6ABD,
+	0x3FE170A3,0xD70A3D71, 0x3FE3665F,0x75F2918C,
+	0x3FE178D4,0xFDF3B646, 0x3FE37195,0x215A3904,
+	0x3FE18106,0x24DD2F1B, 0x3FE37CCE,0x4A0D2D66,
+	0x3FE18937,0x4BC6A7F0, 0x3FE3880A,0xF32612A9,
+	0x3FE19168,0x72B020C5, 0x3FE3934B,0x1FC2682D,
+	0x3FE19999,0x9999999A, 0x3FE39E8E,0xD3028C79,
+	0x3FE1A1CA,0xC083126F, 0x3FE3A9D6,0x1009C0F3,
+	0x3FE1A9FB,0xE76C8B44, 0x3FE3B520,0xD9FE2DAD,
+	0x3FE1B22D,0x0E560419, 0x3FE3C06F,0x3408E528,
+	0x3FE1BA5E,0x353F7CEE, 0x3FE3CBC1,0x2155E829,
+	0x3FE1C28F,0x5C28F5C3, 0x3FE3D716,0xA514298B,
+	0x3FE1CAC0,0x83126E98, 0x3FE3E26F,0xC275921C,
+	0x3FE1D2F1,0xA9FBE76D, 0x3FE3EDCC,0x7CAF047E,
+	0x3FE1DB22,0xD0E56042, 0x3FE3F92C,0xD6F8610E,
+	0x3FE1E353,0xF7CED917, 0x3FE40490,0xD48C89CE,
+	0x3FE1EB85,0x1EB851EC, 0x3FE40FF8,0x78A9665B,
+	0x3FE1F3B6,0x45A1CAC1, 0x3FE41B63,0xC68FE7E4,
+	0x3FE1FBE7,0x6C8B4396, 0x3FE426D2,0xC1840D26,
+	0x3FE20418,0x9374BC6A, 0x3FE43245,0x6CCCE673,
+	0x3FE20C49,0xBA5E353F, 0x3FE43DBB,0xCBB499BE,
+	0x3FE2147A,0xE147AE14, 0x3FE44935,0xE18866A6,
+	0x3FE21CAC,0x083126E9, 0x3FE454B3,0xB198AA90,
+	0x3FE224DD,0x2F1A9FBE, 0x3FE46035,0x3F38E4C2,
+	0x3FE22D0E,0x56041893, 0x3FE46BBA,0x8DBFBA87,
+	0x3FE2353F,0x7CED9168, 0x3FE47743,0xA086FB5A,
+	0x3FE23D70,0xA3D70A3D, 0x3FE482D0,0x7AEBA510,
+	0x3FE245A1,0xCAC08312, 0x3FE48E61,0x204DE812,
+	0x3FE24DD2,0xF1A9FBE7, 0x3FE499F5,0x94112B97,
+	0x3FE25604,0x189374BC, 0x3FE4A58D,0xD99C11E9,
+	0x3FE25E35,0x3F7CED91, 0x3FE4B129,0xF4587CA9,
+	0x3FE26666,0x66666666, 0x3FE4BCC9,0xE7B39125,
+	0x3FE26E97,0x8D4FDF3B, 0x3FE4C86D,0xB71DBCA8,
+	0x3FE276C8,0xB4395810, 0x3FE4D415,0x660AB8D9,
+	0x3FE27EF9,0xDB22D0E5, 0x3FE4DFC0,0xF7F1901F,
+	0x3FE2872B,0x020C49BA, 0x3FE4EB70,0x704CA20A,
+	0x3FE28F5C,0x28F5C28F, 0x3FE4F723,0xD299A7C4,
+	0x3FE2978D,0x4FDF3B64, 0x3FE502DB,0x2259B888,
+	0x3FE29FBE,0x76C8B439, 0x3FE50E96,0x63114E21,
+	0x3FE2A7EF,0x9DB22D0E, 0x3FE51A55,0x9848496E,
+	0x3FE2B020,0xC49BA5E3, 0x3FE52618,0xC589F6EE,
+	0x3FE2B851,0xEB851EB8, 0x3FE531DF,0xEE651356,
+	0x3FE2C083,0x126E978D, 0x3FE53DAB,0x166BD028,
+	0x3FE2C8B4,0x39581062, 0x3FE5497A,0x4133D856,
+	0x3FE2D0E5,0x60418937, 0x3FE5554D,0x725654E8,
+	0x3FE2D916,0x872B020C, 0x3FE56124,0xAD6FF1AF,
+	0x3FE2E147,0xAE147AE1, 0x3FE56CFF,0xF620E1FA,
+	0x3FE2E978,0xD4FDF3B6, 0x3FE578DF,0x500CE553,
+	0x3FE2F1A9,0xFBE76C8B, 0x3FE584C2,0xBEDB4C46,
+	0x3FE2F9DB,0x22D0E560, 0x3FE590AA,0x4636FD2D,
+	0x3FE3020C,0x49BA5E35, 0x3FE59C95,0xE9CE7907,
+	0x3FE30A3D,0x70A3D70A, 0x3FE5A885,0xAD53E04E,
+	0x3FE3126E,0x978D4FDF, 0x3FE5B479,0x947CF7E0,
+	0x3FE31A9F,0xBE76C8B4, 0x3FE5C071,0xA3032DE9,
+	0x3FE322D0,0xE5604189, 0x3FE5CC6D,0xDCA39ED1,
+	0x3FE32B02,0x0C49BA5E, 0x3FE5D86E,0x451F1A3D,
+	0x3FE33333,0x33333333, 0x3FE5E472,0xE03A280C,
+	0x3FE33B64,0x5A1CAC08, 0x3FE5F07B,0xB1BD0D64,
+	0x3FE34395,0x810624DD, 0x3FE5FC88,0xBD73D1C3,
+	0x3FE34BC6,0xA7EF9DB2, 0x3FE6089A,0x072E4418,
+	0x3FE353F7,0xCED91687, 0x3FE614AF,0x92BFFFE6,
+	0x3FE35C28,0xF5C28F5C, 0x3FE620C9,0x6400726E,
+	0x3FE3645A,0x1CAC0831, 0x3FE62CE7,0x7ECADFDE,
+	0x3FE36C8B,0x43958106, 0x3FE63909,0xE6FE6891,
+	0x3FE374BC,0x6A7EF9DB, 0x3FE64530,0xA07E0E4D,
+	0x3FE37CED,0x916872B0, 0x3FE6515B,0xAF30B98E,
+	0x3FE3851E,0xB851EB85, 0x3FE65D8B,0x17013EDB,
+	0x3FE38D4F,0xDF3B645A, 0x3FE669BE,0xDBDE6420,
+	0x3FE39581,0x0624DD2F, 0x3FE675F7,0x01BAE614,
+	0x3FE39DB2,0x2D0E5604, 0x3FE68233,0x8C8D7DA3,
+	0x3FE3A5E3,0x53F7CED9, 0x3FE68E74,0x8050E566,
+	0x3FE3AE14,0x7AE147AE, 0x3FE69AB9,0xE103DF1F,
+	0x3FE3B645,0xA1CAC083, 0x3FE6A703,0xB2A9393F,
+	0x3FE3BE76,0xC8B43958, 0x3FE6B351,0xF947D479,
+	0x3FE3C6A7,0xEF9DB22D, 0x3FE6BFA4,0xB8EAA955,
+	0x3FE3CED9,0x16872B02, 0x3FE6CBFB,0xF5A0CDD7,
+	0x3FE3D70A,0x3D70A3D7, 0x3FE6D857,0xB37D7B26,
+	0x3FE3DF3B,0x645A1CAC, 0x3FE6E4B7,0xF698133F,
+	0x3FE3E76C,0x8B439581, 0x3FE6F11C,0xC30C26B2,
+	0x3FE3EF9D,0xB22D0E56, 0x3FE6FD86,0x1CF97A6A,
+	0x3FE3F7CE,0xD916872B, 0x3FE709F4,0x08840D78,
+	0x3FE40000,0x00000000, 0x3FE71666,0x89D41EF0,
+	0x3FE40831,0x26E978D5, 0x3FE722DD,0xA51633C4,
+	0x3FE41062,0x4DD2F1AA, 0x3FE72F59,0x5E7B1CB8,
+	0x3FE41893,0x74BC6A7F, 0x3FE73BD9,0xBA37FC4F,
+	0x3FE420C4,0x9BA5E354, 0x3FE7485E,0xBC864CCE,
+	0x3FE428F5,0xC28F5C29, 0x3FE754E8,0x69A3E641,
+	0x3FE43126,0xE978D4FE, 0x3FE76176,0xC5D30490,
+	0x3FE43958,0x10624DD3, 0x3FE76E09,0xD55A4D98,
+	0x3FE44189,0x374BC6A8, 0x3FE77AA1,0x9C84D752,
+	0x3FE449BA,0x5E353F7D, 0x3FE7873E,0x1FA22E03,
+	0x3FE451EB,0x851EB852, 0x3FE793DF,0x63065A74,
+	0x3FE45A1C,0xAC083127, 0x3FE7A085,0x6B09E838,
+	0x3FE4624D,0xD2F1A9FC, 0x3FE7AD30,0x3C09EBF7,
+	0x3FE46A7E,0xF9DB22D1, 0x3FE7B9DF,0xDA6809CB,
+	0x3FE472B0,0x20C49BA6, 0x3FE7C694,0x4A8A7B9C,
+	0x3FE47AE1,0x47AE147B, 0x3FE7D34D,0x90DC1794,
+	0x3FE48312,0x6E978D50, 0x3FE7E00B,0xB1CC5692,
+	0x3FE48B43,0x95810625, 0x3FE7ECCE,0xB1CF5AB0,
+	0x3FE49374,0xBC6A7EFA, 0x3FE7F996,0x955DF5CC,
+	0x3FE49BA5,0xE353F7CF, 0x3FE80663,0x60F5B022,
+	0x3FE4A3D7,0x0A3D70A4, 0x3FE81335,0x1918CEEE,
+	0x3FE4AC08,0x3126E979, 0x3FE8200B,0xC24E5B1B,
+	0x3FE4B439,0x5810624E, 0x3FE82CE7,0x612227F9,
+	0x3FE4BC6A,0x7EF9DB23, 0x3FE839C7,0xFA24DA03,
+	0x3FE4C49B,0xA5E353F8, 0x3FE846AD,0x91EBEDAB,
+	0x3FE4CCCC,0xCCCCCCCD, 0x3FE85398,0x2D11BE39,
+	0x3FE4D4FD,0xF3B645A2, 0x3FE86087,0xD0358CA9,
+	0x3FE4DD2F,0x1A9FBE77, 0x3FE86D7C,0x7FFB86A5,
+	0x3FE4E560,0x4189374C, 0x3FE87A76,0x410CCD79,
+	0x3FE4ED91,0x6872B021, 0x3FE88775,0x18177D20,
+	0x3FE4F5C2,0x8F5C28F6, 0x3FE89479,0x09CEB357,
+	0x3FE4FDF3,0xB645A1CB, 0x3FE8A182,0x1AEA96BC,
+	0x3FE50624,0xDD2F1AA0, 0x3FE8AE90,0x50285DF9,
+	0x3FE50E56,0x04189375, 0x3FE8BBA3,0xAE4A56FB,
+	0x3FE51687,0x2B020C4A, 0x3FE8C8BC,0x3A17EE38,
+	0x3FE51EB8,0x51EB851F, 0x3FE8D5D9,0xF85DB5FD,
+	0x3FE526E9,0x78D4FDF4, 0x3FE8E2FC,0xEDED6DC9,
+	0x3FE52F1A,0x9FBE76C9, 0x3FE8F025,0x1F9E09B8,
+	0x3FE5374B,0xC6A7EF9E, 0x3FE8FD52,0x924BB9F3,
+	0x3FE53F7C,0xED916873, 0x3FE90A85,0x4AD7F238,
+	0x3FE547AE,0x147AE148, 0x3FE917BD,0x4E297162,
+	0x3FE54FDF,0x3B645A1D, 0x3FE924FA,0xA12C4906,
+	0x3FE55810,0x624DD2F2, 0x3FE9323D,0x48D1E51B,
+	0x3FE56041,0x89374BC7, 0x3FE93F85,0x4A1113AE,
+	0x3FE56872,0xB020C49C, 0x3FE94CD2,0xA9E60CA2,
+	0x3FE570A3,0xD70A3D71, 0x3FE95A25,0x6D527983,
+	0x3FE578D4,0xFDF3B646, 0x3FE9677D,0x995D7D5B,
+	0x3FE58106,0x24DD2F1B, 0x3FE974DB,0x3313BCA1,
+	0x3FE58937,0x4BC6A7F0, 0x3FE9823E,0x3F87652F,
+	0x3FE59168,0x72B020C5, 0x3FE98FA6,0xC3D03643,
+	0x3FE59999,0x9999999A, 0x3FE99D14,0xC50B8893,
+	0x3FE5A1CA,0xC083126F, 0x3FE9AA88,0x485C566E,
+	0x3FE5A9FB,0xE76C8B44, 0x3FE9B801,0x52EB43E6,
+	0x3FE5B22D,0x0E560419, 0x3FE9C57F,0xE9E6A710,
+	0x3FE5BA5E,0x353F7CEE, 0x3FE9D304,0x1282904A,
+	0x3FE5C28F,0x5C28F5C3, 0x3FE9E08D,0xD1F8D294,
+	0x3FE5CAC0,0x83126E98, 0x3FE9EE1D,0x2D890BF7,
+	0x3FE5D2F1,0xA9FBE76D, 0x3FE9FBB2,0x2A78ADF7,
+	0x3FE5DB22,0xD0E56042, 0x3FEA094C,0xCE13061B,
+	0x3FE5E353,0xF7CED917, 0x3FEA16ED,0x1DA9467A,
+	0x3FE5EB85,0x1EB851EC, 0x3FEA2493,0x1E928E5D,
+	0x3FE5F3B6,0x45A1CAC1, 0x3FEA323E,0xD62BF2F1,
+	0x3FE5FBE7,0x6C8B4396, 0x3FEA3FF0,0x49D88802,
+	0x3FE60418,0x9374BC6A, 0x3FEA4DA7,0x7F0168C8,
+	0x3FE60C49,0xBA5E353F, 0x3FEA5B64,0x7B15C0CC,
+	0x3FE6147A,0xE147AE14, 0x3FEA6927,0x438AD4C9,
+	0x3FE61CAC,0x083126E9, 0x3FEA76EF,0xDDDC0BB0,
+	0x3FE624DD,0x2F1A9FBE, 0x3FEA84BE,0x4F8AF7AD,
+	0x3FE62D0E,0x56041893, 0x3FEA9292,0x9E1F5F49,
+	0x3FE6353F,0x7CED9168, 0x3FEAA06C,0xCF274691,
+	0x3FE63D70,0xA3D70A3D, 0x3FEAAE4C,0xE836F850,
+	0x3FE645A1,0xCAC08312, 0x3FEABC32,0xEEE90F5D,
+	0x3FE64DD2,0xF1A9FBE7, 0x3FEACA1E,0xE8DE7FF5,
+	0x3FE65604,0x189374BC, 0x3FEAD810,0xDBBEA128,
+	0x3FE65E35,0x3F7CED91, 0x3FEAE608,0xCD373653,
+	0x3FE66666,0x66666666, 0x3FEAF406,0xC2FC78AE,
+	0x3FE66E97,0x8D4FDF3B, 0x3FEB020A,0xC2C920EB,
+	0x3FE676C8,0xB4395810, 0x3FEB1014,0xD25E70E4,
+	0x3FE67EF9,0xDB22D0E5, 0x3FEB1E24,0xF7843D5A,
+	0x3FE6872B,0x020C49BA, 0x3FEB2C3B,0x3808F7C5,
+	0x3FE68F5C,0x28F5C28F, 0x3FEB3A57,0x99C1B83B,
+	0x3FE6978D,0x4FDF3B64, 0x3FEB487A,0x228A475E,
+	0x3FE69FBE,0x76C8B439, 0x3FEB56A2,0xD8452863,
+	0x3FE6A7EF,0x9DB22D0E, 0x3FEB64D1,0xC0DBA32D,
+	0x3FE6B020,0xC49BA5E3, 0x3FEB7306,0xE23DCE72,
+	0x3FE6B851,0xEB851EB8, 0x3FEB8142,0x426299F4,
+	0x3FE6C083,0x126E978D, 0x3FEB8F83,0xE747D8D7,
+	0x3FE6C8B4,0x39581062, 0x3FEB9DCB,0xD6F24BF6,
+	0x3FE6D0E5,0x60418937, 0x3FEBAC1A,0x176DAC5E,
+	0x3FE6D916,0x872B020C, 0x3FEBBA6E,0xAECCB5CC,
+	0x3FE6E147,0xAE147AE1, 0x3FEBC8C9,0xA329314A,
+	0x3FE6E978,0xD4FDF3B6, 0x3FEBD72A,0xFAA3FFD7,
+	0x3FE6F1A9,0xFBE76C8B, 0x3FEBE592,0xBB652523,
+	0x3FE6F9DB,0x22D0E560, 0x3FEBF400,0xEB9BD264,
+	0x3FE7020C,0x49BA5E35, 0x3FEC0275,0x917E7138,
+	0x3FE70A3D,0x70A3D70A, 0x3FEC10F0,0xB34AAE9D,
+	0x3FE7126E,0x978D4FDF, 0x3FEC1F72,0x574585FB,
+	0x3FE71A9F,0xBE76C8B4, 0x3FEC2DFA,0x83BB4C49,
+	0x3FE722D0,0xE5604189, 0x3FEC3C89,0x3EFFBB3B,
+	0x3FE72B02,0x0C49BA5E, 0x3FEC4B1E,0x8F6DFC8D,
+	0x3FE73333,0x33333333, 0x3FEC59BA,0x7B68B55E,
+	0x3FE73B64,0x5A1CAC08, 0x3FEC685D,0x095A11A4,
+	0x3FE74395,0x810624DD, 0x3FEC7706,0x3FB3CFAB,
+	0x3FE74BC6,0xA7EF9DB2, 0x3FEC85B6,0x24EF4BB8,
+	0x3FE753F7,0xCED91687, 0x3FEC946C,0xBF8D8BB3,
+	0x3FE75C28,0xF5C28F5C, 0x3FECA32A,0x16174AEE,
+	0x3FE7645A,0x1CAC0831, 0x3FECB1EE,0x2F1D05FE,
+	0x3FE76C8B,0x43958106, 0x3FECC0B9,0x113706AD,
+	0x3FE774BC,0x6A7EF9DB, 0x3FECCF8A,0xC3057001,
+	0x3FE77CED,0x916872B0, 0x3FECDE63,0x4B304A52,
+	0x3FE7851E,0xB851EB85, 0x3FECED42,0xB0678F85,
+	0x3FE78D4F,0xDF3B645A, 0x3FECFC28,0xF963374B,
+	0x3FE79581,0x0624DD2F, 0x3FED0B16,0x2CE34388,
+	0x3FE79DB2,0x2D0E5604, 0x3FED1A0A,0x51AFCCC3,
+	0x3FE7A5E3,0x53F7CED9, 0x3FED2905,0x6E990EB7,
+	0x3FE7AE14,0x7AE147AE, 0x3FED3807,0x8A7774F3,
+	0x3FE7B645,0xA1CAC083, 0x3FED4710,0xAC2BA799,
+	0x3FE7BE76,0xC8B43958, 0x3FED5620,0xDA9E982C,
+	0x3FE7C6A7,0xEF9DB22D, 0x3FED6538,0x1CC18E80,
+	0x3FE7CED9,0x16872B02, 0x3FED7456,0x798E35B7,
+	0x3FE7D70A,0x3D70A3D7, 0x3FED837B,0xF806A960,
+	0x3FE7DF3B,0x645A1CAC, 0x3FED92A8,0x9F3582A4,
+	0x3FE7E76C,0x8B439581, 0x3FEDA1DC,0x762DE599,
+	0x3FE7EF9D,0xB22D0E56, 0x3FEDB117,0x840B8EA0,
+	0x3FE7F7CE,0xD916872B, 0x3FEDC059,0xCFF2DFE2,
+	0x3FE80000,0x00000000, 0x3FEDCFA3,0x6110EEEC,
+	0x3FE80831,0x26E978D5, 0x3FEDDEF4,0x3E9B9257,
+	0x3FE81062,0x4DD2F1AA, 0x3FEDEE4C,0x6FD16F97,
+	0x3FE81893,0x74BC6A7F, 0x3FEDFDAB,0xFBFA08DB,
+	0x3FE820C4,0x9BA5E354, 0x3FEE0D12,0xEA65CB0C,
+	0x3FE828F5,0xC28F5C29, 0x3FEE1C81,0x426E1BE0,
+	0x3FE83126,0xE978D4FE, 0x3FEE2BF7,0x0B756811,
+	0x3FE83958,0x10624DD3, 0x3FEE3B74,0x4CE731A9,
+	0x3FE84189,0x374BC6A8, 0x3FEE4AF9,0x0E381E65,
+	0x3FE849BA,0x5E353F7D, 0x3FEE5A85,0x56E6063B,
+	0x3FE851EB,0x851EB852, 0x3FEE6A19,0x2E7801FA,
+	0x3FE85A1C,0xAC083127, 0x3FEE79B4,0x9C7E79FD,
+	0x3FE8624D,0xD2F1A9FC, 0x3FEE8957,0xA8933509,
+	0x3FE86A7E,0xF9DB22D1, 0x3FEE9902,0x5A596739,
+	0x3FE872B0,0x20C49BA6, 0x3FEEA8B4,0xB97DC10D,
+	0x3FE87AE1,0x47AE147B, 0x3FEEB86E,0xCDB67E96,
+	0x3FE88312,0x6E978D50, 0x3FEEC830,0x9EC376BE,
+	0x3FE88B43,0x95810625, 0x3FEED7FA,0x346E2AAB,
+	0x3FE89374,0xBC6A7EFA, 0x3FEEE7CB,0x9689D542,
+	0x3FE89BA5,0xE353F7CF, 0x3FEEF7A4,0xCCF37AC9,
+	0x3FE8A3D7,0x0A3D70A4, 0x3FEF0785,0xDF91F8A0,
+	0x3FE8AC08,0x3126E979, 0x3FEF176E,0xD6561520,
+	0x3FE8B439,0x5810624E, 0x3FEF275F,0xB93A8F96,
+	0x3FE8BC6A,0x7EF9DB23, 0x3FEF3758,0x9044305A,
+	0x3FE8C49B,0xA5E353F8, 0x3FEF4759,0x6381D906,
+	0x3FE8CCCC,0xCCCCCCCD, 0x3FEF5762,0x3B0C94D1,
+	0x3FE8D4FD,0xF3B645A2, 0x3FEF6773,0x1F07A904,
+	0x3FE8DD2F,0x1A9FBE77, 0x3FEF778C,0x17A0A58D,
+	0x3FE8E560,0x4189374C, 0x3FEF87AD,0x2D0F75BC,
+	0x3FE8ED91,0x6872B021, 0x3FEF97D6,0x67967113,
+	0x3FE8F5C2,0x8F5C28F6, 0x3FEFA807,0xCF826C45,
+	0x3FE8FDF3,0xB645A1CB, 0x3FEFB841,0x6D2ACA46,
+	0x3FE90624,0xDD2F1AA0, 0x3FEFC883,0x48F18D8C,
+	0x3FE90E56,0x04189375, 0x3FEFD8CD,0x6B436967,
+	0x3FE91687,0x2B020C4A, 0x3FEFE91F,0xDC97D37E,
+	0x3FE91EB8,0x51EB851F, 0x3FEFF97A,0xA571156E,
+	0x3FE926E9,0x78D4FDF4, 0x3FF004EE,0xE72E2F47,
+	0x3FE92F1A,0x9FBE76C9, 0x3FF00D24,0xAFF8EAE6,
+	0x3FE9374B,0xC6A7EF9E, 0x3FF0155E,0xB16A55E2,
+	0x3FE93F7C,0xED916873, 0x3FF01D9C,0xEFD9966A,
+	0x3FE947AE,0x147AE148, 0x3FF025DF,0x6FA369BF,
+	0x3FE94FDF,0x3B645A1D, 0x3FF02E26,0x352A2D6A,
+	0x3FE95810,0x624DD2F2, 0x3FF03671,0x44D5E886,
+	0x3FE96041,0x89374BC7, 0x3FF03EC0,0xA314551D,
+	0x3FE96872,0xB020C49C, 0x3FF04714,0x5458E99B,
+	0x3FE970A3,0xD70A3D71, 0x3FF04F6C,0x5D1CE251,
+	0x3FE978D4,0xFDF3B646, 0x3FF057C8,0xC1DF4B06,
+	0x3FE98106,0x24DD2F1B, 0x3FF06029,0x872508A5,
+	0x3FE98937,0x4BC6A7F0, 0x3FF0688E,0xB178E2F5,
+	0x3FE99168,0x72B020C5, 0x3FF070F8,0x456B8E6B,
+	0x3FE99999,0x9999999A, 0x3FF07966,0x4793B60B,
+	0x3FE9A1CA,0xC083126F, 0x3FF081D8,0xBC8E055D,
+	0x3FE9A9FB,0xE76C8B44, 0x3FF08A4F,0xA8FD327A,
+	0x3FE9B22D,0x0E560419, 0x3FF092CB,0x118A0829,
+	0x3FE9BA5E,0x353F7CEE, 0x3FF09B4A,0xFAE37011,
+	0x3FE9C28F,0x5C28F5C3, 0x3FF0A3CF,0x69BE7D01,
+	0x3FE9CAC0,0x83126E98, 0x3FF0AC58,0x62D67549,
+	0x3FE9D2F1,0xA9FBE76D, 0x3FF0B4E5,0xEAECDD2E,
+	0x3FE9DB22,0xD0E56042, 0x3FF0BD78,0x06C9816D,
+	0x3FE9E353,0xF7CED917, 0x3FF0C60E,0xBB3A81D5,
+	0x3FE9EB85,0x1EB851EC, 0x3FF0CEAA,0x0D145BF9,
+	0x3FE9F3B6,0x45A1CAC1, 0x3FF0D74A,0x0131F5F4,
+	0x3FE9FBE7,0x6C8B4396, 0x3FF0DFEE,0x9C74A944,
+	0x3FEA0418,0x9374BC6A, 0x3FF0E897,0xE3C44DB9,
+	0x3FEA0C49,0xBA5E353F, 0x3FF0F145,0xDC0F4484,
+	0x3FEA147A,0xE147AE14, 0x3FF0F9F8,0x8A4A834B,
+	0x3FEA1CAC,0x083126E9, 0x3FF102AF,0xF3719F65,
+	0x3FEA24DD,0x2F1A9FBE, 0x3FF10B6C,0x1C86D920,
+	0x3FEA2D0E,0x56041893, 0x3FF1142D,0x0A932724,
+	0x3FEA353F,0x7CED9168, 0x3FF11CF2,0xC2A641F1,
+	0x3FEA3D70,0xA3D70A3D, 0x3FF125BD,0x49D6AF6A,
+	0x3FEA45A1,0xCAC08312, 0x3FF12E8C,0xA541CE7E,
+	0x3FEA4DD2,0xF1A9FBE7, 0x3FF13760,0xDA0BE2EE,
+	0x3FEA5604,0x189374BC, 0x3FF14039,0xED60211D,
+	0x3FEA5E35,0x3F7CED91, 0x3FF14917,0xE470BA09,
+	0x3FEA6666,0x66666666, 0x3FF151FA,0xC476E74D,
+	0x3FEA6E97,0x8D4FDF3B, 0x3FF15AE2,0x92B2F74A,
+	0x3FEA76C8,0xB4395810, 0x3FF163CF,0x546C595C,
+	0x3FEA7EF9,0xDB22D0E5, 0x3FF16CC1,0x0EF1AA33,
+	0x3FEA872B,0x020C49BA, 0x3FF175B7,0xC798C03D,
+	0x3FEA8F5C,0x28F5C28F, 0x3FF17EB3,0x83BEB831,
+	0x3FEA978D,0x4FDF3B64, 0x3FF187B4,0x48C801B0,
+	0x3FEA9FBE,0x76C8B439, 0x3FF190BA,0x1C206BFF,
+	0x3FEAA7EF,0x9DB22D0E, 0x3FF199C5,0x033B32DE,
+	0x3FEAB020,0xC49BA5E3, 0x3FF1A2D5,0x03930B7A,
+	0x3FEAB851,0xEB851EB8, 0x3FF1ABEA,0x22AA317A,
+	0x3FEAC083,0x126E978D, 0x3FF1B504,0x660A7423,
+	0x3FEAC8B4,0x39581062, 0x3FF1BE23,0xD345439D,
+	0x3FEAD0E5,0x60418937, 0x3FF1C748,0x6FF3BE53,
+	0x3FEAD916,0x872B020C, 0x3FF1D072,0x41B6BE68,
+	0x3FEAE147,0xAE147AE1, 0x3FF1D9A1,0x4E36E755,
+	0x3FEAE978,0xD4FDF3B6, 0x3FF1E2D5,0x9B24B399,
+	0x3FEAF1A9,0xFBE76C8B, 0x3FF1EC0F,0x2E388287,
+	0x3FEAF9DB,0x22D0E560, 0x3FF1F54E,0x0D32A638,
+	0x3FEB020C,0x49BA5E35, 0x3FF1FE92,0x3DDB7193,
+	0x3FEB0A3D,0x70A3D70A, 0x3FF207DB,0xC6034677,
+	0x3FEB126E,0x978D4FDF, 0x3FF2112A,0xAB82A3FF,
+	0x3FEB1A9F,0xBE76C8B4, 0x3FF21A7E,0xF43A34EA,
+	0x3FEB22D0,0xE5604189, 0x3FF223D8,0xA612DE1C,
+	0x3FEB2B02,0x0C49BA5E, 0x3FF22D37,0xC6FDCD41,
+	0x3FEB3333,0x33333333, 0x3FF2369C,0x5CF4878D,
+	0x3FEB3B64,0x5A1CAC08, 0x3FF24006,0x6DF8F8A1,
+	0x3FEB4395,0x810624DD, 0x3FF24976,0x00158186,
+	0x3FEB4BC6,0xA7EF9DB2, 0x3FF252EB,0x195D07D1,
+	0x3FEB53F7,0xCED91687, 0x3FF25C65,0xBFEB04E2,
+	0x3FEB5C28,0xF5C28F5C, 0x3FF265E5,0xF9E39549,
+	0x3FEB645A,0x1CAC0831, 0x3FF26F6B,0xCD738845,
+	0x3FEB6C8B,0x43958106, 0x3FF278F7,0x40D06F6A,
+	0x3FEB74BC,0x6A7EF9DB, 0x3FF28288,0x5A38AE65,
+	0x3FEB7CED,0x916872B0, 0x3FF28C1F,0x1FF38AE8,
+	0x3FEB851E,0xB851EB85, 0x3FF295BB,0x98513CAD,
+	0x3FEB8D4F,0xDF3B645A, 0x3FF29F5D,0xC9AAFDAC,
+	0x3FEB9581,0x0624DD2F, 0x3FF2A905,0xBA631A61,
+	0x3FEB9DB2,0x2D0E5604, 0x3FF2B2B3,0x70E50246,
+	0x3FEBA5E3,0x53F7CED9, 0x3FF2BC66,0xF3A55868,
+	0x3FEBAE14,0x7AE147AE, 0x3FF2C620,0x49220420,
+	0x3FEBB645,0xA1CAC083, 0x3FF2CFDF,0x77E241F7,
+	0x3FEBBE76,0xC8B43958, 0x3FF2D9A4,0x8676B4A3,
+	0x3FEBC6A7,0xEF9DB22D, 0x3FF2E36F,0x7B797639,
+	0x3FEBCED9,0x16872B02, 0x3FF2ED40,0x5D8E2973,
+	0x3FEBD70A,0x3D70A3D7, 0x3FF2F717,0x33620B2C,
+	0x3FEBDF3B,0x645A1CAC, 0x3FF300F4,0x03AC03F8,
+	0x3FEBE76C,0x8B439581, 0x3FF30AD6,0xD52CB9E5,
+	0x3FEBEF9D,0xB22D0E56, 0x3FF314BF,0xAEAEA264,
+	0x3FEBF7CE,0xD916872B, 0x3FF31EAE,0x9706145C,
+	0x3FEC0000,0x00000000, 0x3FF328A3,0x95115A5E,
+	0x3FEC0831,0x26E978D5, 0x3FF3329E,0xAFB8C508,
+	0x3FEC1062,0x4DD2F1AA, 0x3FF33C9F,0xEDEEBD8E,
+	0x3FEC1893,0x74BC6A7F, 0x3FF346A7,0x56AFD869,
+	0x3FEC20C4,0x9BA5E354, 0x3FF350B4,0xF102E838,
+	0x3FEC28F5,0xC28F5C29, 0x3FF35AC8,0xC3F910BF,
+	0x3FEC3126,0xE978D4FE, 0x3FF364E2,0xD6ADDA1D,
+	0x3FEC3958,0x10624DD3, 0x3FF36F03,0x30474420,
+	0x3FEC4189,0x374BC6A8, 0x3FF37929,0xD7F5D9D1,
+	0x3FEC49BA,0x5E353F7D, 0x3FF38356,0xD4F4C522,
+	0x3FEC51EB,0x851EB852, 0x3FF38D8A,0x2E89E2C9,
+	0x3FEC5A1C,0xAC083127, 0x3FF397C3,0xEC05D651,
+	0x3FEC624D,0xD2F1A9FC, 0x3FF3A204,0x14C41E4A,
+	0x3FEC6A7E,0xF9DB22D1, 0x3FF3AC4A,0xB02B28B1,
+	0x3FEC72B0,0x20C49BA6, 0x3FF3B697,0xC5AC6780,
+	0x3FEC7AE1,0x47AE147B, 0x3FF3C0EB,0x5CC46571,
+	0x3FEC8312,0x6E978D50, 0x3FF3CB45,0x7CFADAED,
+	0x3FEC8B43,0x95810625, 0x3FF3D5A6,0x2DE2C329,
+	0x3FEC9374,0xBC6A7EFA, 0x3FF3E00D,0x771A7177,
+	0x3FEC9BA5,0xE353F7CF, 0x3FF3EA7B,0x604BA6C3,
+	0x3FECA3D7,0x0A3D70A4, 0x3FF3F4EF,0xF12BA744,
+	0x3FECAC08,0x3126E979, 0x3FF3FF6B,0x317B505E,
+	0x3FECB439,0x5810624E, 0x3FF409ED,0x29072EB4,
+	0x3FECBC6A,0x7EF9DB23, 0x3FF41475,0xDFA7946B,
+	0x3FECC49B,0xA5E353F8, 0x3FF41F05,0x5D40AFA9,
+	0x3FECCCCC,0xCCCCCCCD, 0x3FF4299B,0xA9C2A138,
+	0x3FECD4FD,0xF3B645A2, 0x3FF43438,0xCD29936D,
+	0x3FECDD2F,0x1A9FBE77, 0x3FF43EDC,0xCF7DD138,
+	0x3FECE560,0x4189374C, 0x3FF44987,0xB8D3DD6F,
+	0x3FECED91,0x6872B021, 0x3FF45439,0x914C8A4D,
+	0x3FECF5C2,0x8F5C28F6, 0x3FF45EF2,0x61151124,
+	0x3FECFDF3,0xB645A1CB, 0x3FF469B2,0x30672A4F,
+	0x3FED0624,0xDD2F1AA0, 0x3FF47479,0x0789254D,
+	0x3FED0E56,0x04189375, 0x3FF47F46,0xEECE0123,
+	0x3FED1687,0x2B020C4A, 0x3FF48A1B,0xEE9584EB,
+	0x3FED1EB8,0x51EB851F, 0x3FF494F8,0x0F4C58A5,
+	0x3FED26E9,0x78D4FDF4, 0x3FF49FDB,0x596C1E38,
+	0x3FED2F1A,0x9FBE76C9, 0x3FF4AAC5,0xD57B8AB6,
+	0x3FED374B,0xC6A7EF9E, 0x3FF4B5B7,0x8C0E7FD6,
+	0x3FED3F7C,0xED916873, 0x3FF4C0B0,0x85C625AE,
+	0x3FED47AE,0x147AE148, 0x3FF4CBB0,0xCB5104A3,
+	0x3FED4FDF,0x3B645A1D, 0x3FF4D6B8,0x656B1F99,
+	0x3FED5810,0x624DD2F2, 0x3FF4E1C7,0x5CDE0E65,
+	0x3FED6041,0x89374BC7, 0x3FF4ECDD,0xBA811873,
+	0x3FED6872,0xB020C49C, 0x3FF4F7FB,0x87394FB5,
+	0x3FED70A3,0xD70A3D71, 0x3FF50320,0xCBF9ABCC,
+	0x3FED78D4,0xFDF3B646, 0x3FF50E4D,0x91C32570,
+	0x3FED8106,0x24DD2F1B, 0x3FF51981,0xE1A4D220,
+	0x3FED8937,0x4BC6A7F0, 0x3FF524BD,0xC4BC000B,
+	0x3FED9168,0x72B020C5, 0x3FF53001,0x4434523D,
+	0x3FED9999,0x9999999A, 0x3FF53B4C,0x6947DD19,
+	0x3FEDA1CA,0xC083126F, 0x3FF5469F,0x3D3F4306,
+	0x3FEDA9FB,0xE76C8B44, 0x3FF551F9,0xC971D170,
+	0x3FEDB22D,0x0E560419, 0x3FF55D5C,0x17459E02,
+	0x3FEDBA5E,0x353F7CEE, 0x3FF568C6,0x302FA431,
+	0x3FEDC28F,0x5C28F5C3, 0x3FF57438,0x1DB3E303,
+	0x3FEDCAC0,0x83126E98, 0x3FF57FB1,0xE9657B27,
+	0x3FEDD2F1,0xA9FBE76D, 0x3FF58B33,0x9CE6CD4D,
+	0x3FEDDB22,0xD0E56042, 0x3FF596BD,0x41E998CF,
+	0x3FEDE353,0xF7CED917, 0x3FF5A24E,0xE22F1A9E,
+	0x3FEDEB85,0x1EB851EC, 0x3FF5ADE8,0x87882C79,
+	0x3FEDF3B6,0x45A1CAC1, 0x3FF5B98A,0x3BD5647A,
+	0x3FEDFBE7,0x6C8B4396, 0x3FF5C534,0x090734DD,
+	0x3FEE0418,0x9374BC6A, 0x3FF5D0E5,0xF91E0C29,
+	0x3FEE0C49,0xBA5E353F, 0x3FF5DCA0,0x162A7597,
+	0x3FEE147A,0xE147AE14, 0x3FF5E862,0x6A4D39CE,
+	0x3FEE1CAC,0x083126E9, 0x3FF5F42C,0xFFB77FEF,
+	0x3FEE24DD,0x2F1A9FBE, 0x3FF5FFFF,0xE0AAEEF5,
+	0x3FEE2D0E,0x56041893, 0x3FF60BDB,0x1779CF5C,
+	0x3FEE353F,0x7CED9168, 0x3FF617BE,0xAE872D27,
+	0x3FEE3D70,0xA3D70A3D, 0x3FF623AA,0xB046FA33,
+	0x3FEE45A1,0xCAC08312, 0x3FF62F9F,0x273E30DA,
+	0x3FEE4DD2,0xF1A9FBE7, 0x3FF63B9C,0x1E02F6F9,
+	0x3FEE5604,0x189374BC, 0x3FF647A1,0x9F3CC13D,
+	0x3FEE5E35,0x3F7CED91, 0x3FF653AF,0xB5A476D1,
+	0x3FEE6666,0x66666666, 0x3FF65FC6,0x6C04955F,
+	0x3FEE6E97,0x8D4FDF3B, 0x3FF66BE5,0xCD39556F,
+	0x3FEE76C8,0xB4395810, 0x3FF6780D,0xE430CF1D,
+	0x3FEE7EF9,0xDB22D0E5, 0x3FF6843E,0xBBEB1F29,
+	0x3FEE872B,0x020C49BA, 0x3FF69078,0x5F7A8C68,
+	0x3FEE8F5C,0x28F5C28F, 0x3FF69CBA,0xDA03AD8D,
+	0x3FEE978D,0x4FDF3B64, 0x3FF6A906,0x36BD8F54,
+	0x3FEE9FBE,0x76C8B439, 0x3FF6B55A,0x80F1DB0C,
+	0x3FEEA7EF,0x9DB22D0E, 0x3FF6C1B7,0xC3FCFD81,
+	0x3FEEB020,0xC49BA5E3, 0x3FF6CE1E,0x0B4E4E46,
+	0x3FEEB851,0xEB851EB8, 0x3FF6DA8D,0x62683765,
+	0x3FEEC083,0x126E978D, 0x3FF6E705,0xD4E05D6F,
+	0x3FEEC8B4,0x39581062, 0x3FF6F387,0x6E5FC7F9,
+	0x3FEED0E5,0x60418937, 0x3FF70012,0x3AA30A73,
+	0x3FEED916,0x872B020C, 0x3FF70CA6,0x457A6D70,
+	0x3FEEE147,0xAE147AE1, 0x3FF71943,0x9ACA1855,
+	0x3FEEE978,0xD4FDF3B6, 0x3FF725EA,0x468A3B70,
+	0x3FEEF1A9,0xFBE76C8B, 0x3FF7329A,0x54C73A77,
+	0x3FEEF9DB,0x22D0E560, 0x3FF73F53,0xD1A1D77C,
+	0x3FEF020C,0x49BA5E35, 0x3FF74C16,0xC94F5E46,
+	0x3FEF0A3D,0x70A3D70A, 0x3FF758E3,0x4819D01E,
+	0x3FEF126E,0x978D4FDF, 0x3FF765B9,0x5A601009,
+	0x3FEF1A9F,0xBE76C8B4, 0x3FF77299,0x0C960F77,
+	0x3FEF22D0,0xE5604189, 0x3FF77F82,0x6B44FB5F,
+	0x3FEF2B02,0x0C49BA5E, 0x3FF78C75,0x830B69D7,
+	0x3FEF3333,0x33333333, 0x3FF79972,0x609D881A,
+	0x3FEF3B64,0x5A1CAC08, 0x3FF7A679,0x10C54907,
+	0x3FEF4395,0x810624DD, 0x3FF7B389,0xA0629420,
+	0x3FEF4BC6,0xA7EF9DB2, 0x3FF7C0A4,0x1C6B74F2,
+	0x3FEF53F7,0xCED91687, 0x3FF7CDC8,0x91EC4B0A,
+	0x3FEF5C28,0xF5C28F5C, 0x3FF7DAF7,0x0E07FA5D,
+	0x3FEF645A,0x1CAC0831, 0x3FF7E82F,0x9DF81C2B,
+	0x3FEF6C8B,0x43958106, 0x3FF7F572,0x4F0D306E,
+	0x3FEF74BC,0x6A7EF9DB, 0x3FF802BF,0x2EAECFBA,
+	0x3FEF7CED,0x916872B0, 0x3FF81016,0x4A5BDDAF,
+	0x3FEF851E,0xB851EB85, 0x3FF81D77,0xAFAABBE4,
+	0x3FEF8D4F,0xDF3B645A, 0x3FF82AE3,0x6C497D5E,
+	0x3FEF9581,0x0624DD2F, 0x3FF83859,0x8DFE1A8A,
+	0x3FEF9DB2,0x2D0E5604, 0x3FF845DA,0x22A6A5C3,
+	0x3FEFA5E3,0x53F7CED9, 0x3FF85365,0x38398065,
+	0x3FEFAE14,0x7AE147AE, 0x3FF860FA,0xDCC59064,
+	0x3FEFB645,0xA1CAC083, 0x3FF86E9B,0x1E727679,
+	0x3FEFBE76,0xC8B43958, 0x3FF87C46,0x0B80C4DB,
+	0x3FEFC6A7,0xEF9DB22D, 0x3FF889FB,0xB24A368C,
+	0x3FEFCED9,0x16872B02, 0x3FF897BC,0x2141E735,
+	0x3FEFD70A,0x3D70A3D7, 0x3FF8A587,0x66F48B9B,
+	0x3FEFDF3B,0x645A1CAC, 0x3FF8B35D,0x9208AAA9,
+	0x3FEFE76C,0x8B439581, 0x3FF8C13E,0xB13ED714,
+	0x3FEFEF9D,0xB22D0E56, 0x3FF8CF2A,0xD371E995,
+	0x3FEFF7CE,0xD916872B, 0x3FF8DD22,0x07973BCA,
+	0x3FF00000,0x00000000, 0x3FF8EB24,0x5CBEE3A6,
+	0x3FF00418,0x9374BC6A, 0x3FF8F931,0xE213EF8D,
+	0x3FF00831,0x26E978D5, 0x3FF9074A,0xA6DCA317,
+	0x3FF00C49,0xBA5E353F, 0x3FF9156E,0xBA7AB45C,
+	0x3FF01062,0x4DD2F1AA, 0x3FF9239E,0x2C6B8A10,
+	0x3FF0147A,0xE147AE14, 0x3FF931D9,0x0C487A1C,
+	0x3FF01893,0x74BC6A7F, 0x3FF9401F,0x69C70909,
+	0x3FF01CAC,0x083126E9, 0x3FF94E71,0x54B929F1,
+	0x3FF020C4,0x9BA5E354, 0x3FF95CCE,0xDD0D7F4C,
+	0x3FF024DD,0x2F1A9FBE, 0x3FF96B38,0x12CF9C33,
+	0x3FF028F5,0xC28F5C29, 0x3FF979AD,0x0628469C,
+	0x3FF02D0E,0x56041893, 0x3FF9882D,0xC75DBA05,
+	0x3FF03126,0xE978D4FE, 0x3FF996BA,0x66D3EB15,
+	0x3FF0353F,0x7CED9168, 0x3FF9A552,0xF50CCBC0,
+	0x3FF03958,0x10624DD3, 0x3FF9B3F7,0x82A8905D,
+	0x3FF03D70,0xA3D70A3D, 0x3FF9C2A8,0x2065F540,
+	0x3FF04189,0x374BC6A8, 0x3FF9D164,0xDF228554,
+	0x3FF045A1,0xCAC08312, 0x3FF9E02D,0xCFDAE13D,
+	0x3FF049BA,0x5E353F7D, 0x3FF9EF03,0x03AB0771,
+	0x3FF04DD2,0xF1A9FBE7, 0x3FF9FDE4,0x8BCE9CF0,
+	0x3FF051EB,0x851EB852, 0x3FFA0CD2,0x79A136F0,
+	0x3FF05604,0x189374BC, 0x3FFA1BCC,0xDE9EA52B,
+	0x3FF05A1C,0xAC083127, 0x3FFA2AD3,0xCC633D2C,
+	0x3FF05E35,0x3F7CED91, 0x3FFA39E7,0x54AC263A,
+	0x3FF0624D,0xD2F1A9FC, 0x3FFA4907,0x8957A654,
+	0x3FF06666,0x66666666, 0x3FFA5834,0x7C656FC7,
+	0x3FF06A7E,0xF9DB22D1, 0x3FFA676E,0x3FF6EFDF,
+	0x3FF06E97,0x8D4FDF3B, 0x3FFA76B4,0xE64F9E32,
+	0x3FF072B0,0x20C49BA6, 0x3FFA8608,0x81D54D12,
+	0x3FF076C8,0xB4395810, 0x3FFA9569,0x25107A9E,
+	0x3FF07AE1,0x47AE147B, 0x3FFAA4D6,0xE2ACA2FD,
+	0x3FF07EF9,0xDB22D0E5, 0x3FFAB451,0xCD78933E,
+	0x3FF08312,0x6E978D50, 0x3FFAC3D9,0xF866BD6A,
+	0x3FF0872B,0x020C49BA, 0x3FFAD36F,0x768D8D41,
+	0x3FF08B43,0x95810625, 0x3FFAE312,0x5B27BE2F,
+	0x3FF08F5C,0x28F5C28F, 0x3FFAF2C2,0xB994B1EF,
+	0x3FF09374,0xBC6A7EFA, 0x3FFB0280,0xA558C872,
+	0x3FF0978D,0x4FDF3B64, 0x3FFB124C,0x321DB876,
+	0x3FF09BA5,0xE353F7CF, 0x3FFB2225,0x73B2E96B,
+	0x3FF09FBE,0x76C8B439, 0x3FFB320C,0x7E0DCE0C,
+	0x3FF0A3D7,0x0A3D70A4, 0x3FFB4201,0x654A404D,
+	0x3FF0A7EF,0x9DB22D0E, 0x3FFB5204,0x3DAADE06,
+	0x3FF0AC08,0x3126E979, 0x3FFB6215,0x1B9966F8,
+	0x3FF0B020,0xC49BA5E3, 0x3FFB7234,0x13A71B98,
+	0x3FF0B439,0x5810624E, 0x3FFB8261,0x3A8D1D37,
+	0x3FF0B851,0xEB851EB8, 0x3FFB929C,0xA52CCEFB,
+	0x3FF0BC6A,0x7EF9DB23, 0x3FFBA2E6,0x68903840,
+	0x3FF0C083,0x126E978D, 0x3FFBB33E,0x99EA67C9,
+	0x3FF0C49B,0xA5E353F8, 0x3FFBC3A5,0x4E97D862,
+	0x3FF0C8B4,0x39581062, 0x3FFBD41A,0x9C1ED667,
+	0x3FF0CCCC,0xCCCCCCCD, 0x3FFBE49E,0x982FE6AF,
+	0x3FF0D0E5,0x60418937, 0x3FFBF531,0x58A62E72,
+	0x3FF0D4FD,0xF3B645A2, 0x3FFC05D2,0xF387DC99,
+	0x3FF0D916,0x872B020C, 0x3FFC1683,0x7F069411,
+	0x3FF0DD2F,0x1A9FBE77, 0x3FFC2743,0x117FD78D,
+	0x3FF0E147,0xAE147AE1, 0x3FFC3811,0xC17D7652,
+	0x3FF0E560,0x4189374C, 0x3FFC48EF,0xA5B5FA8A,
+	0x3FF0E978,0xD4FDF3B6, 0x3FFC59DC,0xD50D1894,
+	0x3FF0ED91,0x6872B021, 0x3FFC6AD9,0x66941FEF,
+	0x3FF0F1A9,0xFBE76C8B, 0x3FFC7BE5,0x718A6D2F,
+	0x3FF0F5C2,0x8F5C28F6, 0x3FFC8D01,0x0D5DDD90,
+	0x3FF0F9DB,0x22D0E560, 0x3FFC9E2C,0x51AB439E,
+	0x3FF0FDF3,0xB645A1CB, 0x3FFCAF67,0x563EDD7E,
+	0x3FF1020C,0x49BA5E35, 0x3FFCC0B2,0x3314CC67,
+	0x3FF10624,0xDD2F1AA0, 0x3FFCD20D,0x00598DB4,
+	0x3FF10A3D,0x70A3D70A, 0x3FFCE377,0xD66A7535,
+	0x3FF10E56,0x04189375, 0x3FFCF4F2,0xCDD6292B,
+	0x3FF1126E,0x978D4FDF, 0x3FFD067D,0xFF5D1F81,
+	0x3FF11687,0x2B020C4A, 0x3FFD1819,0x83F21CC6,
+	0x3FF11A9F,0xBE76C8B4, 0x3FFD29C5,0x74BAB466,
+	0x3FF11EB8,0x51EB851F, 0x3FFD3B81,0xEB0FCAB1,
+	0x3FF122D0,0xE5604189, 0x3FFD4D4F,0x007E182F,
+	0x3FF126E9,0x78D4FDF4, 0x3FFD5F2C,0xCEC6AEC9,
+	0x3FF12B02,0x0C49BA5E, 0x3FFD711B,0x6FDF804E,
+	0x3FF12F1A,0x9FBE76C9, 0x3FFD831A,0xFDF3E6DA,
+	0x3FF13333,0x33333333, 0x3FFD952B,0x93652E99,
+	0x3FF1374B,0xC6A7EF9E, 0x3FFDA74D,0x4ACB2185,
+	0x3FF13B64,0x5A1CAC08, 0x3FFDB980,0x3EF49488,
+	0x3FF13F7C,0xED916873, 0x3FFDCBC4,0x8AE7F6A5,
+	0x3FF14395,0x810624DD, 0x3FFDDE1A,0x49E3E18E,
+	0x3FF147AE,0x147AE148, 0x3FFDF081,0x975FAC51,
+	0x3FF14BC6,0xA7EF9DB2, 0x3FFE02FA,0x8F0BFF84,
+	0x3FF14FDF,0x3B645A1D, 0x3FFE1585,0x4CD36B87,
+	0x3FF153F7,0xCED91687, 0x3FFE2821,0xECDB005E,
+	0x3FF15810,0x624DD2F2, 0x3FFE3AD0,0x8B82E7B1,
+	0x3FF15C28,0xF5C28F5C, 0x3FFE4D91,0x45670063,
+	0x3FF16041,0x89374BC7, 0x3FFE6064,0x375F7C69,
+	0x3FF1645A,0x1CAC0831, 0x3FFE7349,0x7E818049,
+	0x3FF16872,0xB020C49C, 0x3FFE8641,0x381FC4D8,
+	0x3FF16C8B,0x43958106, 0x3FFE994B,0x81CB3ABD,
+	0x3FF170A3,0xD70A3D71, 0x3FFEAC68,0x7953B03F,
+	0x3FF174BC,0x6A7EF9DB, 0x3FFEBF98,0x3CC878DF,
+	0x3FF178D4,0xFDF3B646, 0x3FFED2DA,0xEA791759,
+	0x3FF17CED,0x916872B0, 0x3FFEE630,0xA0F5E974,
+	0x3FF18106,0x24DD2F1B, 0x3FFEF999,0x7F10D655,
+	0x3FF1851E,0xB851EB85, 0x3FFF0D15,0xA3DDFEA9,
+	0x3FF18937,0x4BC6A7F0, 0x3FFF20A5,0x2EB46F5F,
+	0x3FF18D4F,0xDF3B645A, 0x3FFF3448,0x3F2ED658,
+	0x3FF19168,0x72B020C5, 0x3FFF47FE,0xF52C39AB,
+	0x3FF19581,0x0624DD2F, 0x3FFF5BC9,0x70D0B0F5,
+	0x3FF19999,0x9999999A, 0x3FFF6FA7,0xD286214E,
+	0x3FF19DB2,0x2D0E5604, 0x3FFF839A,0x3AFCFB5D,
+	0x3FF1A1CA,0xC083126F, 0x3FFF97A0,0xCB2CFC21,
+	0x3FF1A5E3,0x53F7CED9, 0x3FFFABBB,0xA455EFEE,
+	0x3FF1A9FB,0xE76C8B44, 0x3FFFBFEA,0xE800782E,
+	0x3FF1AE14,0x7AE147AE, 0x3FFFD42E,0xB7FED370,
+	0x3FF1B22D,0x0E560419, 0x3FFFE887,0x366DA849,
+	0x3FF1B645,0xA1CAC083, 0x3FFFFCF4,0x85B4D293,
+	0x3FF1BA5E,0x353F7CEE, 0x400008BB,0x644419CE,
+	0x3FF1BE76,0xC8B43958, 0x40001307,0x10F44261,
+	0x3FF1C28F,0x5C28F5C3, 0x40001D5D,0x5A92168C,
+	0x3FF1C6A7,0xEF9DB22D, 0x400027BE,0x52EC0CBF,
+	0x3FF1CAC0,0x83126E98, 0x4000322A,0x0BF84BF6,
+	0x3FF1CED9,0x16872B02, 0x40003CA0,0x97D51AA2,
+	0x3FF1D2F1,0xA9FBE76D, 0x40004722,0x08C94F2B,
+	0x3FF1D70A,0x3D70A3D7, 0x400051AE,0x7144C1CC,
+	0x3FF1DB22,0xD0E56042, 0x40005C45,0xE3E0C018,
+	0x3FF1DF3B,0x645A1CAC, 0x400066E8,0x736081D4,
+	0x3FF1E353,0xF7CED917, 0x40007196,0x32B19F91,
+	0x3FF1E76C,0x8B439581, 0x40007C4F,0x34EC8AA9,
+	0x3FF1EB85,0x1EB851EC, 0x40008713,0x8D550704,
+	0x3FF1EF9D,0xB22D0E56, 0x400091E3,0x4F5AA64E,
+	0x3FF1F3B6,0x45A1CAC1, 0x40009CBE,0x8E9944FF,
+	0x3FF1F7CE,0xD916872B, 0x4000A7A5,0x5ED988E5,
+	0x3FF1FBE7,0x6C8B4396, 0x4000B297,0xD411618C,
+	0x3FF20000,0x00000000, 0x4000BD96,0x02648A36,
+	0x3FF20418,0x9374BC6A, 0x4000C89F,0xFE250DBC,
+	0x3FF20831,0x26E978D5, 0x4000D3B5,0xDBD3CC1A,
+	0x3FF20C49,0xBA5E353F, 0x4000DED7,0xB02101CD,
+	0x3FF21062,0x4DD2F1AA, 0x4000EA05,0x8FECD124,
+	0x3FF2147A,0xE147AE14, 0x4000F53F,0x9047CD42,
+	0x3FF21893,0x74BC6A7F, 0x40010085,0xC6738737,
+	0x3FF21CAC,0x083126E9, 0x40010BD8,0x47E31CD3,
+	0x3FF220C4,0x9BA5E354, 0x40011737,0x2A3BC9A4,
+	0x3FF224DD,0x2F1A9FBE, 0x400122A2,0x835579BD,
+	0x3FF228F5,0xC28F5C29, 0x40012E1A,0x693B5EB6,
+	0x3FF22D0E,0x56041893, 0x4001399E,0xF22C8685,
+	0x3FF23126,0xE978D4FE, 0x40014530,0x349C74A5,
+	0x3FF2353F,0x7CED9168, 0x400150CE,0x4733BD25,
+	0x3FF23958,0x10624DD3, 0x40015C79,0x40D0A212,
+	0x3FF23D70,0xA3D70A3D, 0x40016831,0x3887B2E3,
+	0x3FF24189,0x374BC6A8, 0x400173F6,0x45A46E4E,
+	0x3FF245A1,0xCAC08312, 0x40017FC8,0x7FA9E62D,
+	0x3FF249BA,0x5E353F7D, 0x40018BA7,0xFE5365E8,
+	0x3FF24DD2,0xF1A9FBE7, 0x40019794,0xD9951AFD,
+	0x3FF251EB,0x851EB852, 0x4001A38F,0x299CC01A,
+	0x3FF25604,0x189374BC, 0x4001AF97,0x06D24A7A,
+	0x3FF25A1C,0xAC083127, 0x4001BBAC,0x89D899D9,
+	0x3FF25E35,0x3F7CED91, 0x4001C7CF,0xCB8E2AC1,
+	0x3FF2624D,0xD2F1A9FC, 0x4001D400,0xE50DCB8B,
+	0x3FF26666,0x66666666, 0x4001E03F,0xEFAF53C9,
+	0x3FF26A7E,0xF9DB22D1, 0x4001EC8D,0x05085E7D,
+	0x3FF26E97,0x8D4FDF3B, 0x4001F8E8,0x3EED06C9,
+	0x3FF272B0,0x20C49BA6, 0x40020551,0xB770A787,
+	0x3FF276C8,0xB4395810, 0x400211C9,0x88E69D73,
+	0x3FF27AE1,0x47AE147B, 0x40021E4F,0xCDE30C53,
+	0x3FF27EF9,0xDB22D0E5, 0x40022AE4,0xA13BA6C4,
+	0x3FF28312,0x6E978D50, 0x40023788,0x1E087927,
+	0x3FF2872B,0x020C49BA, 0x4002443A,0x5FA4B744,
+	0x3FF28B43,0x95810625, 0x400250FB,0x81AF8D26,
+	0x3FF28F5C,0x28F5C28F, 0x40025DCB,0xA00CF2D0,
+	0x3FF29374,0xBC6A7EFA, 0x40026AAA,0xD6E6833D,
+	0x3FF2978D,0x4FDF3B64, 0x40027799,0x42AC5654,
+	0x3FF29BA5,0xE353F7CF, 0x40028497,0x0015DE48,
+	0x3FF29FBE,0x76C8B439, 0x400291A4,0x2C22C803,
+	0x3FF2A3D7,0x0A3D70A4, 0x40029EC0,0xE41BDF1C,
+	0x3FF2A7EF,0x9DB22D0E, 0x4002ABED,0x4593F4F3,
+	0x3FF2AC08,0x3126E979, 0x4002B929,0x6E68CB7A,
+	0x3FF2B020,0xC49BA5E3, 0x4002C675,0x7CC4033E,
+	0x3FF2B439,0x5810624E, 0x4002D3D1,0x8F1C0D3A,
+	0x3FF2B851,0xEB851EB8, 0x4002E13D,0xC4352012,
+	0x3FF2BC6A,0x7EF9DB23, 0x4002EEBA,0x3B223132,
+	0x3FF2C083,0x126E978D, 0x4002FC47,0x1345F173,
+	0x3FF2C49B,0xA5E353F8, 0x400309E4,0x6C53CDC9,
+	0x3FF2C8B4,0x39581062, 0x40031792,0x6650F39F,
+	0x3FF2CCCC,0xCCCCCCCD, 0x40032551,0x21955956,
+	0x3FF2D0E5,0x60418937, 0x40033320,0xBECCCA94,
+	0x3FF2D4FD,0xF3B645A2, 0x40034101,0x5EF7F8E5,
+	0x3FF2D916,0x872B020C, 0x40034EF3,0x236D9048,
+	0x3FF2DD2F,0x1A9FBE77, 0x40035CF6,0x2DDB5033,
+	0x3FF2E147,0xAE147AE1, 0x40036B0A,0xA04728B4,
+	0x3FF2E560,0x4189374C, 0x40037930,0x9D105C24,
+	0x3FF2E978,0xD4FDF3B6, 0x40038768,0x46F0A521,
+	0x3FF2ED91,0x6872B021, 0x400395B1,0xC0FD614D,
+	0x3FF2F1A9,0xFBE76C8B, 0x4003A40D,0x2EA8C076,
+	0x3FF2F5C2,0x8F5C28F6, 0x4003B27A,0xB3C2F8A9,
+	0x3FF2F9DB,0x22D0E560, 0x4003C0FA,0x747B7EDE,
+	0x3FF2FDF3,0xB645A1CB, 0x4003CF8C,0x956244C4,
+	0x3FF3020C,0x49BA5E35, 0x4003DE31,0x3B68FB49,
+	0x3FF30624,0xDD2F1AA0, 0x4003ECE8,0x8BE45A6D,
+	0x3FF30A3D,0x70A3D70A, 0x4003FBB2,0xAC8D6E08,
+	0x3FF30E56,0x04189375, 0x40040A8F,0xC382E810,
+	0x3FF3126E,0x978D4FDF, 0x4004197F,0xF74A77F5,
+	0x3FF31687,0x2B020C4A, 0x40042883,0x6ED227B6,
+	0x3FF31A9F,0xBE76C8B4, 0x4004379A,0x5171BE48,
+	0x3FF31EB8,0x51EB851F, 0x400446C4,0xC6EC27DB,
+	0x3FF322D0,0xE5604189, 0x40045602,0xF770E3B0,
+	0x3FF326E9,0x78D4FDF4, 0x40046555,0x0B9D7803,
+	0x3FF32B02,0x0C49BA5E, 0x400474BB,0x2C7EEBBB,
+	0x3FF32F1A,0x9FBE76C9, 0x40048435,0x8393466A,
+	0x3FF33333,0x33333333, 0x400493C4,0x3ACB164D,
+	0x3FF3374B,0xC6A7EF9E, 0x4004A367,0x7C8AFCD3,
+	0x3FF33B64,0x5A1CAC08, 0x4004B31F,0x73AD4166,
+	0x3FF33F7C,0xED916873, 0x4004C2EC,0x4B836AFA,
+	0x3FF34395,0x810624DD, 0x4004D2CE,0x2FD7E01A,
+	0x3FF347AE,0x147AE148, 0x4004E2C5,0x4CEF8DFA,
+	0x3FF34BC6,0xA7EF9DB2, 0x4004F2D1,0xCF8B964F,
+	0x3FF34FDF,0x3B645A1D, 0x400502F3,0xE4EB046D,
+	0x3FF353F7,0xCED91687, 0x4005132B,0xBACC8971,
+	0x3FF35810,0x624DD2F2, 0x40052379,0x7F703FF9,
+	0x3FF35C28,0xF5C28F5C, 0x400533DD,0x61997726,
+	0x3FF36041,0x89374BC7, 0x40054457,0x9090858A,
+	0x3FF3645A,0x1CAC0831, 0x400554E8,0x3C24A39D,
+	0x3FF36872,0xB020C49C, 0x4005658F,0x94ADCE68,
+	0x3FF36C8B,0x43958106, 0x4005764D,0xCB0EB214,
+	0x3FF370A3,0xD70A3D71, 0x40058723,0x10B69CF9,
+	0x3FF374BC,0x6A7EF9DB, 0x4005980F,0x97A37ADE,
+	0x3FF378D4,0xFDF3B646, 0x4005A913,0x9263D914,
+	0x3FF37CED,0x916872B0, 0x4005BA2F,0x3418F31D,
+	0x3FF38106,0x24DD2F1B, 0x4005CB62,0xB078C87A,
+	0x3FF3851E,0xB851EB85, 0x4005DCAE,0x3BD03B67,
+	0x3FF38937,0x4BC6A7F0, 0x4005EE12,0x0B053920,
+	0x3FF38D4F,0xDF3B645A, 0x4005FF8E,0x5398EB60,
+	0x3FF39168,0x72B020C5, 0x40061123,0x4BA9F3E2,
+	0x3FF39581,0x0624DD2F, 0x400622D1,0x29F6B16E,
+	0x3FF39999,0x9999999A, 0x40063498,0x25DF8F4F,
+	0x3FF39DB2,0x2D0E5604, 0x40064678,0x77695EC4,
+	0x3FF3A1CA,0xC083126F, 0x40065872,0x573FBB41,
+	0x3FF3A5E3,0x53F7CED9, 0x40066A85,0xFEB77915,
+	0x3FF3A9FB,0xE76C8B44, 0x40067CB3,0xA7D11F49,
+	0x3FF3AE14,0x7AE147AE, 0x40068EFB,0x8D3B6C6B,
+	0x3FF3B22D,0x0E560419, 0x4006A15D,0xEA55E6F0,
+	0x3FF3B645,0xA1CAC083, 0x4006B3DA,0xFB337900,
+	0x3FF3BA5E,0x353F7CEE, 0x4006C672,0xFC9D1859,
+	0x3FF3BE76,0xC8B43958, 0x4006D926,0x2C147A13,
+	0x3FF3C28F,0x5C28F5C3, 0x4006EBF4,0xC7D6D2FC,
+	0x3FF3C6A7,0xEF9DB22D, 0x4006FEDF,0x0EDFA455,
+	0x3FF3CAC0,0x83126E98, 0x400711E5,0x40EB95B4,
+	0x3FF3CED9,0x16872B02, 0x40072507,0x9E7B5BC7,
+	0x3FF3D2F1,0xA9FBE76D, 0x40073846,0x68D6ACD2,
+	0x3FF3D70A,0x3D70A3D7, 0x40074BA1,0xE20F4298,
+	0x3FF3DB22,0xD0E56042, 0x40075F1A,0x4D03EA90,
+	0x3FF3DF3B,0x645A1CAC, 0x400772AF,0xED63A422,
+	0x3FF3E353,0xF7CED917, 0x40078663,0x07B0CDC9,
+	0x3FF3E76C,0x8B439581, 0x40079A33,0xE14460D8,
+	0x3FF3EB85,0x1EB851EC, 0x4007AE22,0xC0513CC9,
+	0x3FF3EF9D,0xB22D0E56, 0x4007C22F,0xEBE781D4,
+	0x3FF3F3B6,0x45A1CAC1, 0x4007D65B,0xABF7FBBF,
+	0x3FF3F7CE,0xD916872B, 0x4007EAA6,0x49579C9B,
+	0x3FF3FBE7,0x6C8B4396, 0x4007FF10,0x0DC30874,
+	0x3FF40000,0x00000000, 0x40081399,0x43E231A8,
+	0x3FF40418,0x9374BC6A, 0x40082842,0x374C06DE,
+	0x3FF40831,0x26E978D5, 0x40083D0B,0x348A3289,
+	0x3FF40C49,0xBA5E353F, 0x400851F4,0x891CEC8B,
+	0x3FF41062,0x4DD2F1AA, 0x400866FE,0x837EDE83,
+	0x3FF4147A,0xE147AE14, 0x40087C29,0x73291ACF,
+	0x3FF41893,0x74BC6A7F, 0x40089175,0xA8972725,
+	0x3FF41CAC,0x083126E9, 0x4008A6E3,0x754B1AB1,
+	0x3FF420C4,0x9BA5E354, 0x4008BC73,0x2BD1D0B6,
+	0x3FF424DD,0x2F1A9FBE, 0x4008D225,0x1FC72F8A,
+	0x3FF428F5,0xC28F5C29, 0x4008E7F9,0xA5DA8510,
+	0x3FF42D0E,0x56041893, 0x4008FDF1,0x13D2F873,
+	0x3FF43126,0xE978D4FE, 0x4009140B,0xC094125B,
+	0x3FF4353F,0x7CED9168, 0x40092A4A,0x04225B61,
+	0x3FF43958,0x10624DD3, 0x400940AC,0x37A81204,
+	0x3FF43D70,0xA3D70A3D, 0x40095732,0xB579F7E5,
+	0x3FF44189,0x374BC6A8, 0x40096DDD,0xD91C3795,
+	0x3FF445A1,0xCAC08312, 0x400984AD,0xFF4762CE,
+	0x3FF449BA,0x5E353F7D, 0x40099BA3,0x85ED8A53,
+	0x3FF44DD2,0xF1A9FBE7, 0x4009B2BE,0xCC3F6F68,
+	0x3FF451EB,0x851EB852, 0x4009CA00,0x32B1D025,
+	0x3FF45604,0x189374BC, 0x4009E168,0x1B02CE9D,
+	0x3FF45A1C,0xAC083127, 0x4009F8F6,0xE83F7414,
+	0x3FF45E35,0x3F7CED91, 0x400A10AC,0xFEC9505D,
+	0x3FF4624D,0xD2F1A9FC, 0x400A288A,0xC45C369E,
+	0x3FF46666,0x66666666, 0x400A4090,0xA0141789,
+	0x3FF46A7E,0xF9DB22D1, 0x400A58BE,0xFA72FA71,
+	0x3FF46E97,0x8D4FDF3B, 0x400A7116,0x3D671537,
+	0x3FF472B0,0x20C49BA6, 0x400A8996,0xD4510492,
+	0x3FF476C8,0xB4395810, 0x400AA241,0x2C0A24B2,
+	0x3FF47AE1,0x47AE147B, 0x400ABB15,0xB2EB0BC6,
+	0x3FF47EF9,0xDB22D0E5, 0x400AD414,0xD8D22683,
+	0x3FF48312,0x6E978D50, 0x400AED3F,0x0F2A7825,
+	0x3FF4872B,0x020C49BA, 0x400B0694,0xC8F27E26,
+	0x3FF48B43,0x95810625, 0x400B2016,0x7AC33932,
+	0x3FF48F5C,0x28F5C28F, 0x400B39C4,0x9AD75B88,
+	0x3FF49374,0xBC6A7EFA, 0x400B539F,0xA1129E82,
+	0x3FF4978D,0x4FDF3B64, 0x400B6DA8,0x07093F60,
+	0x3FF49BA5,0xE353F7CF, 0x400B87DE,0x4807A52B,
+	0x3FF49FBE,0x76C8B439, 0x400BA242,0xE11A2FDA,
+	0x3FF4A3D7,0x0A3D70A4, 0x400BBCD6,0x511532A0,
+	0x3FF4A7EF,0x9DB22D0E, 0x400BD799,0x189D1996,
+	0x3FF4AC08,0x3126E979, 0x400BF28B,0xBA2EBCAE,
+	0x3FF4B020,0xC49BA5E3, 0x400C0DAE,0xBA27E04F,
+	0x3FF4B439,0x5810624E, 0x400C2902,0x9ECFE57D,
+	0x3FF4B851,0xEB851EB8, 0x400C4487,0xF060AA00,
+	0x3FF4BC6A,0x7EF9DB23, 0x400C603F,0x390F9A90,
+	0x3FF4C083,0x126E978D, 0x400C7C29,0x0516F77B,
+	0x3FF4C49B,0xA5E353F8, 0x400C9845,0xE2BF4DE6,
+	0x3FF4C8B4,0x39581062, 0x400CB496,0x62692628,
+	0x3FF4CCCC,0xCCCCCCCD, 0x400CD11B,0x1696E97E,
+	0x3FF4D0E5,0x60418937, 0x400CEDD4,0x93F6FFAE,
+	0x3FF4D4FD,0xF3B645A2, 0x400D0AC3,0x716E26E0,
+	0x3FF4D916,0x872B020C, 0x400D27E8,0x4822065B,
+	0x3FF4DD2F,0x1A9FBE77, 0x400D4543,0xB383FE9C,
+	0x3FF4E147,0xAE147AE1, 0x400D62D6,0x515C3767,
+	0x3FF4E560,0x4189374C, 0x400D80A0,0xC1D4EE7D,
+	0x3FF4E978,0xD4FDF3B6, 0x400D9EA3,0xA78607A6,
+	0x3FF4ED91,0x6872B021, 0x400DBCDF,0xA780E0CC,
+	0x3FF4F1A9,0xFBE76C8B, 0x400DDB55,0x695C6B08,
+	0x3FF4F5C2,0x8F5C28F6, 0x400DFA05,0x97418B64,
+	0x3FF4F9DB,0x22D0E560, 0x400E18F0,0xDDF7C44F,
+	0x3FF4FDF3,0xB645A1CB, 0x400E3817,0xECF22ABC,
+	0x3FF5020C,0x49BA5E35, 0x400E577B,0x765CA7F1,
+	0x3FF50624,0xDD2F1AA0, 0x400E771C,0x2F298B1D,
+	0x3FF50A3D,0x70A3D70A, 0x400E96FA,0xCF1F6BF5,
+	0x3FF50E56,0x04189375, 0x400EB718,0x10E7617A,
+	0x3FF5126E,0x978D4FDF, 0x400ED774,0xB21B8E48,
+	0x3FF51687,0x2B020C4A, 0x400EF811,0x735605CC,
+	0x3FF51A9F,0xBE76C8B4, 0x400F18EF,0x18400BD9,
+	0x3FF51EB8,0x51EB851F, 0x400F3A0E,0x67A1B218,
+	0x3FF522D0,0xE5604189, 0x400F5B70,0x2B71D507,
+	0x3FF526E9,0x78D4FDF4, 0x400F7D15,0x30E67C26,
+	0x3FF52B02,0x0C49BA5E, 0x400F9EFE,0x48859F26,
+	0x3FF52F1A,0x9FBE76C9, 0x400FC12C,0x463653FE,
+	0x3FF53333,0x33333333, 0x400FE3A0,0x015267D0,
+	0x3FF5374B,0xC6A7EF9E, 0x4010032D,0x2A5C3365,
+	0x3FF53B64,0x5A1CAC08, 0x401014AE,0x0F6F0A85,
+	0x3FF53F7C,0xED916873, 0x40102653,0x20F1AE7C,
+	0x3FF54395,0x810624DD, 0x4010381C,0xD1D2DAA4,
+	0x3FF547AE,0x147AE148, 0x40104A0B,0x96EA01A9,
+	0x3FF54BC6,0xA7EF9DB2, 0x40105C1F,0xE7017E18,
+	0x3FF54FDF,0x3B645A1D, 0x40106E5A,0x3AE104C6,
+	0x3FF553F7,0xCED91687, 0x401080BB,0x0D585A62,
+	0x3FF55810,0x624DD2F2, 0x40109342,0xDB4A4ED0,
+	0x3FF55C28,0xF5C28F5C, 0x4010A5F2,0x23B7FFC0,
+	0x3FF56041,0x89374BC7, 0x4010B8C9,0x67CC6532,
+	0x3FF5645A,0x1CAC0831, 0x4010CBC9,0x2AE8299D,
+	0x3FF56872,0xB020C49C, 0x4010DEF1,0xF2ADD07B,
+	0x3FF56C8B,0x43958106, 0x4010F244,0x470E2D14,
+	0x3FF570A3,0xD70A3D71, 0x401105C0,0xB2552C86,
+	0x3FF574BC,0x6A7EF9DB, 0x40111967,0xC136F4FD,
+	0x3FF578D4,0xFDF3B646, 0x40112D3A,0x02DD5D51,
+	0x3FF57CED,0x916872B0, 0x40114138,0x08F5BF25,
+	0x3FF58106,0x24DD2F1B, 0x40115562,0x67BF26EC,
+	0x3FF5851E,0xB851EB85, 0x401169B9,0xB618E425,
+	0x3FF58937,0x4BC6A7F0, 0x40117E3E,0x8D917D68,
+	0x3FF58D4F,0xDF3B645A, 0x401192F1,0x8A760AC4,
+	0x3FF59168,0x72B020C5, 0x4011A7D3,0x4BE1FA47,
+	0x3FF59581,0x0624DD2F, 0x4011BCE4,0x73CF4167,
+	0x3FF59999,0x9999999A, 0x4011D225,0xA726FF61,
+	0x3FF59DB2,0x2D0E5604, 0x4011E797,0x8DD29388,
+	0x3FF5A1CA,0xC083126F, 0x4011FD3A,0xD2CD2BD7,
+	0x3FF5A5E3,0x53F7CED9, 0x40121310,0x2435CF05,
+	0x3FF5A9FB,0xE76C8B44, 0x40122918,0x3361E6B9,
+	0x3FF5AE14,0x7AE147AE, 0x40123F53,0xB4F04D66,
+	0x3FF5B22D,0x0E560419, 0x401255C3,0x60DCE4B2,
+	0x3FF5B645,0xA1CAC083, 0x40126C67,0xF294B850,
+	0x3FF5BA5E,0x353F7CEE, 0x40128342,0x290AB27C,
+	0x3FF5BE76,0xC8B43958, 0x40129A52,0xC6CCE64E,
+	0x3FF5C28F,0x5C28F5C3, 0x4012B19A,0x921A7586,
+	0x3FF5C6A7,0xEF9DB22D, 0x4012C91A,0x54FA1658,
+	0x3FF5CAC0,0x83126E98, 0x4012E0D2,0xDD513F32,
+	0x3FF5CED9,0x16872B02, 0x4012F8C4,0xFCFBFD80,
+	0x3FF5D2F1,0xA9FBE76D, 0x401310F1,0x89E57DD2,
+	0x3FF5D70A,0x3D70A3D7, 0x40132959,0x5E214ABF,
+	0x3FF5DB22,0xD0E56042, 0x401341FD,0x58054982,
+	0x3FF5DF3B,0x645A1CAC, 0x40135ADE,0x5A447A11,
+	0x3FF5E353,0xF7CED917, 0x401373FD,0x4C0A8235,
+	0x3FF5E76C,0x8B439581, 0x40138D5B,0x191809DE,
+	0x3FF5EB85,0x1EB851EC, 0x4013A6F8,0xB1DFF0D6,
+	0x3FF5EF9D,0xB22D0E56, 0x4013C0D7,0x0BA5649C,
+	0x3FF5F3B6,0x45A1CAC1, 0x4013DAF7,0x209ADF11,
+	0x3FF5F7CE,0xD916872B, 0x4013F559,0xF002157C,
+	0x3FF5FBE7,0x6C8B4396, 0x40141000,0x7E4CE12E,
+	0x3FF60000,0x00000000, 0x40142AEB,0xD53F29E4,
+	0x3FF60418,0x9374BC6A, 0x4014461D,0x0411DBFE,
+	0x3FF60831,0x26E978D5, 0x40146195,0x1F96F391,
+	0x3FF60C49,0xBA5E353F, 0x40147D55,0x425EA69B,
+	0x3FF61062,0x4DD2F1AA, 0x4014995E,0x8CDDB91C,
+	0x3FF6147A,0xE147AE14, 0x4014B5B2,0x2595055E,
+	0x3FF61893,0x74BC6A7F, 0x4014D251,0x393A4498,
+	0x3FF61CAC,0x083126E9, 0x4014EF3C,0xFAE222ED,
+	0x3FF620C4,0x9BA5E354, 0x40150C76,0xA42BAC08,
+	0x3FF624DD,0x2F1A9FBE, 0x401529FF,0x756D1C53,
+	0x3FF628F5,0xC28F5C29, 0x401547D8,0xB5E22530,
+	0x3FF62D0E,0x56041893, 0x40156603,0xB3DBB13B,
+	0x3FF63126,0xE978D4FE, 0x40158481,0xC4F13842,
+	0x3FF6353F,0x7CED9168, 0x4015A354,0x4633B13C,
+	0x3FF63958,0x10624DD3, 0x4015C27C,0x9C62332A,
+	0x3FF63D70,0xA3D70A3D, 0x4015E1FC,0x3420549C,
+	0x3FF64189,0x374BC6A8, 0x401601D4,0x822E5C34,
+	0x3FF645A1,0xCAC08312, 0x40162207,0x03A35366,
+	0x3FF649BA,0x5E353F7D, 0x40164295,0x3E290F61,
+	0x3FF64DD2,0xF1A9FBE7, 0x40166380,0xC03A4314,
+	0x3FF651EB,0x851EB852, 0x401684CB,0x2162B00A,
+	0x3FF65604,0x189374BC, 0x4016A676,0x02818ACE,
+	0x3FF65A1C,0xAC083127, 0x4016C883,0x0E0E2A9E,
+	0x3FF65E35,0x3F7CED91, 0x4016EAF3,0xF85F1B27,
+	0x3FF6624D,0xD2F1A9FC, 0x40170DCA,0x7FF3AA2E,
+	0x3FF66666,0x66666666, 0x40173108,0x6DC00A35,
+	0x3FF66A7E,0xF9DB22D1, 0x401754AF,0x957C2654,
+	0x3FF66E97,0x8D4FDF3B, 0x401778C1,0xD5F542E9,
+	0x3FF672B0,0x20C49BA6, 0x40179D41,0x196289FF,
+	0x3FF676C8,0xB4395810, 0x4017C22F,0x55BCA1C1,
+	0x3FF67AE1,0x47AE147B, 0x4017E78E,0x8D186EF6,
+	0x3FF67EF9,0xDB22D0E5, 0x40180D60,0xCE0524CC,
+	0x3FF68312,0x6E978D50, 0x401833A8,0x33EDC75A,
+	0x3FF6872B,0x020C49BA, 0x40185A66,0xE77E457D,
+	0x3FF68B43,0x95810625, 0x4018819F,0x1F0C5326,
+	0x3FF68F5C,0x28F5C28F, 0x4018A953,0x1F042CA2,
+	0x3FF69374,0xBC6A7EFA, 0x4018D185,0x3A596FF2,
+	0x3FF6978D,0x4FDF3B64, 0x4018FA37,0xD2FC391A,
+	0x3FF69BA5,0xE353F7CF, 0x4019236D,0x5A52B2FB,
+	0x3FF69FBE,0x76C8B439, 0x40194D28,0x51B74E7B,
+	0x3FF6A3D7,0x0A3D70A4, 0x4019776B,0x4AFBD6A0,
+	0x3FF6A7EF,0x9DB22D0E, 0x4019A238,0xE8F198B5,
+	0x3FF6AC08,0x3126E979, 0x4019CD93,0xDFF6DCE6,
+	0x3FF6B020,0xC49BA5E3, 0x4019F97E,0xF689EC5D,
+	0x3FF6B439,0x5810624E, 0x401A25FD,0x05E1E7BF,
+	0x3FF6B851,0xEB851EB8, 0x401A5310,0xFA8DB1C8,
+	0x3FF6BC6A,0x7EF9DB23, 0x401A80BD,0xD5193815,
+	0x3FF6C083,0x126E978D, 0x401AAF06,0xAAB96578,
+	0x3FF6C49B,0xA5E353F8, 0x401ADDEE,0xA5FF0FFB,
+	0x3FF6C8B4,0x39581062, 0x401B0D79,0x07913660,
+	0x3FF6CCCC,0xCCCCCCCD, 0x401B3DA9,0x26EEE877,
+	0x3FF6D0E5,0x60418937, 0x401B6E82,0x733937B1,
+	0x3FF6D4FD,0xF3B645A2, 0x401BA008,0x74059580,
+	0x3FF6D916,0x872B020C, 0x401BD23E,0xCA3907D4,
+	0x3FF6DD2F,0x1A9FBE77, 0x401C0529,0x30ECA4DD,
+	0x3FF6E147,0xAE147AE1, 0x401C38CB,0x7E5BCAA8,
+	0x3FF6E560,0x4189374C, 0x401C6D29,0xA4DC90E3,
+	0x3FF6E978,0xD4FDF3B6, 0x401CA247,0xB3E2F74E,
+	0x3FF6ED91,0x6872B021, 0x401CD829,0xD90F5DFE,
+	0x3FF6F1A9,0xFBE76C8B, 0x401D0ED4,0x6148D9C4,
+	0x3FF6F5C2,0x8F5C28F6, 0x401D464B,0xB9E402E1,
+	0x3FF6F9DB,0x22D0E560, 0x401D7E94,0x71D6E229,
+	0x3FF6FDF3,0xB645A1CB, 0x401DB7B3,0x3AFAAE13,
+	0x3FF7020C,0x49BA5E35, 0x401DF1AC,0xEB5C1051,
+	0x3FF70624,0xDD2F1AA0, 0x401E2C86,0x7E9ABB51,
+	0x3FF70A3D,0x70A3D70A, 0x401E6845,0x17591FAE,
+	0x3FF70E56,0x04189375, 0x401EA4EE,0x00BD21EC,
+	0x3FF7126E,0x978D4FDF, 0x401EE286,0xB002BB55,
+	0x3FF71687,0x2B020C4A, 0x401F2114,0xC62182EE,
+	0x3FF71A9F,0xBE76C8B4, 0x401F609E,0x118627FD,
+	0x3FF71EB8,0x51EB851F, 0x401FA128,0x8FE0FC01,
+	0x3FF722D0,0xE5604189, 0x401FE2BA,0x700AB8B3,
+	0x3FF726E9,0x78D4FDF4, 0x402012AD,0x0A0062E4,
+	0x3FF72B02,0x0C49BA5E, 0x40203487,0x097D29BD,
+	0x3FF72F1A,0x9FBE76C9, 0x402056EE,0x9DCBDC90,
+	0x3FF73333,0x33333333, 0x402079E7,0x4B16CDC3,
+	0x3FF7374B,0xC6A7EF9E, 0x40209D74,0xB396BE46,
+	0x3FF73B64,0x5A1CAC08, 0x4020C19A,0x98D6B6DE,
+	0x3FF73F7C,0xED916873, 0x4020E65C,0xDD0860BB,
+	0x3FF74395,0x810624DD, 0x40210BBF,0x8469D982,
+	0x3FF747AE,0x147AE148, 0x402131C6,0xB6BE124A,
+	0x3FF74BC6,0xA7EF9DB2, 0x40215876,0xC0D8DA07,
+	0x3FF74FDF,0x3B645A1D, 0x40217FD4,0x163FCA28,
+	0x3FF753F7,0xCED91687, 0x4021A7E3,0x52E16021,
+	0x3FF75810,0x624DD2F2, 0x4021D0A9,0x3CE3A865,
+	0x3FF75C28,0xF5C28F5C, 0x4021FA2A,0xC68BF6EF,
+	0x3FF76041,0x89374BC7, 0x4022246D,0x10414757,
+	0x3FF7645A,0x1CAC0831, 0x40224F75,0x6AAAFA55,
+	0x3FF76872,0xB020C49C, 0x40227B49,0x58EDC96E,
+	0x3FF76C8B,0x43958106, 0x4022A7EE,0x9308EA7D,
+	0x3FF770A3,0xD70A3D71, 0x4022D56B,0x08558594,
+	0x3FF774BC,0x6A7EF9DB, 0x402303C4,0xE22AC6C2,
+	0x3FF778D4,0xFDF3B646, 0x40233302,0x86A90528,
+	0x3FF77CED,0x916872B0, 0x4023632A,0x9BAEA747,
+	0x3FF78106,0x24DD2F1B, 0x40239444,0x09F9A4BE,
+	0x3FF7851E,0xB851EB85, 0x4023C656,0x0078BD2B,
+	0x3FF78937,0x4BC6A7F0, 0x4023F967,0xF7CFBE5B,
+	0x3FF78D4F,0xDF3B645A, 0x40242D81,0xB6127661,
+	0x3FF79168,0x72B020C5, 0x402462AB,0x52BA3CFC,
+	0x3FF79581,0x0624DD2F, 0x402498ED,0x3ADA4F51,
+	0x3FF79999,0x9999999A, 0x4024D050,0x359796D5,
+	0x3FF79DB2,0x2D0E5604, 0x402508DD,0x68E8D431,
+	0x3FF7A1CA,0xC083126F, 0x4025429E,0x5EA496D3,
+	0x3FF7A5E3,0x53F7CED9, 0x40257D9D,0x09E2DDE0,
+	0x3FF7A9FB,0xE76C8B44, 0x4025B9E3,0xCCB8C57B,
+	0x3FF7AE14,0x7AE147AE, 0x4025F77D,0x7E552FCC,
+	0x3FF7B22D,0x0E560419, 0x40263675,0x7185FB0F,
+	0x3FF7B645,0xA1CAC083, 0x402676D7,0x7BAE00BA,
+	0x3FF7BA5E,0x353F7CEE, 0x4026B8AF,0xFC34DDB8,
+	0x3FF7BE76,0xC8B43958, 0x4026FC0B,0xE47A5416,
+	0x3FF7C28F,0x5C28F5C3, 0x402740F8,0xC05804E9,
+	0x3FF7C6A7,0xEF9DB22D, 0x40278784,0xBF3D406E,
+	0x3FF7CAC0,0x83126E98, 0x4027CFBE,0xBDF1CDC7,
+	0x3FF7CED9,0x16872B02, 0x402819B6,0x510DC5D5,
+	0x3FF7D2F1,0xA9FBE76D, 0x4028657B,0xD0360274,
+	0x3FF7D70A,0x3D70A3D7, 0x4028B320,0x622E27CE,
+	0x3FF7DB22,0xD0E56042, 0x402902B6,0x09D306F7,
+	0x3FF7DF3B,0x645A1CAC, 0x4029544F,0xB411FB8E,
+	0x3FF7E353,0xF7CED917, 0x4029A801,0x46F40A2C,
+	0x3FF7E76C,0x8B439581, 0x4029FDDF,0xB1D5DF96,
+	0x3FF7EB85,0x1EB851EC, 0x402A5600,0xFEE87CC2,
+	0x3FF7EF9D,0xB22D0E56, 0x402AB07C,0x66194F9A,
+	0x3FF7F3B6,0x45A1CAC1, 0x402B0D6A,0x6183D30F,
+	0x3FF7F7CE,0xD916872B, 0x402B6CE4,0xC3928B1A,
+	0x3FF7FBE7,0x6C8B4396, 0x402BCF06,0xCEF96E07,
+	0x3FF80000,0x00000000, 0x402C33ED,0x50B88777,
+	0x3FF80418,0x9374BC6A, 0x402C9BB6,0xBC5B04B9,
+	0x3FF80831,0x26E978D5, 0x402D0683,0x4AACE61B,
+	0x3FF80C49,0xBA5E353F, 0x402D7475,0x1B28737E,
+	0x3FF81062,0x4DD2F1AA, 0x402DE5B0,0x58645F01,
+	0x3FF8147A,0xE147AE14, 0x402E5A5B,0x5FD45A8A,
+	0x3FF81893,0x74BC6A7F, 0x402ED29E,0xED38037E,
+	0x3FF81CAC,0x083126E9, 0x402F4EA6,0x4A1F86AC,
+	0x3FF820C4,0x9BA5E354, 0x402FCE9F,0x81FA9192,
+	0x3FF824DD,0x2F1A9FBE, 0x4030295D,0xCD9A9B13,
+	0x3FF828F5,0xC28F5C29, 0x40306D97,0x6AFBE05E,
+	0x3FF82D0E,0x56041893, 0x4030B418,0x7899336B,
+	0x3FF83126,0xE978D4FE, 0x4030FCFE,0xBB5A5C79,
+	0x3FF8353F,0x7CED9168, 0x4031486A,0x0795A4CD,
+	0x3FF83958,0x10624DD3, 0x4031967C,0x6F7E64B2,
+	0x3FF83D70,0xA3D70A3D, 0x4031E75A,0x7691C5A3,
+	0x3FF84189,0x374BC6A8, 0x40323B2B,0x4AA50407,
+	0x3FF845A1,0xCAC08312, 0x40329219,0x0350BF75,
+	0x3FF849BA,0x5E353F7D, 0x4032EC50,0xE8915934,
+	0x3FF84DD2,0xF1A9FBE7, 0x40334A03,0xC195B7AC,
+	0x3FF851EB,0x851EB852, 0x4033AB66,0x2CDD1001,
+	0x3FF85604,0x189374BC, 0x403410B1,0x02F2AFC1,
+	0x3FF85A1C,0xAC083127, 0x40347A21,0xC54DB1CD,
+	0x3FF85E35,0x3F7CED91, 0x4034E7FB,0x1B1BC6AF,
+	0x3FF8624D,0xD2F1A9FC, 0x40355A85,0x5E0C0EAF,
+	0x3FF86666,0x66666666, 0x4035D20F,0x398C1887,
+	0x3FF86A7E,0xF9DB22D1, 0x40364EEE,0x5F58ED6F,
+	0x3FF86E97,0x8D4FDF3B, 0x4036D180,0x54CCD600,
+	0x3FF872B0,0x20C49BA6, 0x40375A2B,0x5CF5AC4F,
+	0x3FF876C8,0xB4395810, 0x4037E95F,0x8445CAB8,
+	0x3FF87AE1,0x47AE147B, 0x40387F97,0xD3A3ADE9,
+	0x3FF87EF9,0xDB22D0E5, 0x40391D5B,0xB1C5123A,
+	0x3FF88312,0x6E978D50, 0x4039C340,0x7B2FEC60,
+	0x3FF8872B,0x020C49BA, 0x403A71EB,0x5B002FB7,
+	0x3FF88B43,0x95810625, 0x403B2A13,0x70C4AD0A,
+	0x3FF88F5C,0x28F5C28F, 0x403BEC84,0x52863AFE,
+	0x3FF89374,0xBC6A7EFA, 0x403CBA20,0xFD83A86E,
+	0x3FF8978D,0x4FDF3B64, 0x403D93E7,0x4C907AB9,
+	0x3FF89BA5,0xE353F7CF, 0x403E7AF4,0x109C659E,
+	0x3FF89FBE,0x76C8B439, 0x403F7087,0xEF168952,
+	0x3FF8A3D7,0x0A3D70A4, 0x40403B06,0x9992D105,
+	0x3FF8A7EF,0x9DB22D0E, 0x4040C68F,0x6560B76D,
+	0x3FF8AC08,0x3126E979, 0x40415BC8,0x5C49746A,
+	0x3FF8B020,0xC49BA5E3, 0x4041FBBD,0x2C3DE2D8,
+	0x3FF8B439,0x5810624E, 0x4042A7A1,0x7856581D,
+	0x3FF8B851,0xEB851EB8, 0x404360D8,0x977FD248,
+	0x3FF8BC6A,0x7EF9DB23, 0x404428FF,0x32E960E5,
+	0x3FF8C083,0x126E978D, 0x404501F7,0x5151C17F,
+	0x3FF8C49B,0xA5E353F8, 0x4045EDF7,0x8DDBBBDF,
+	0x3FF8C8B4,0x39581062, 0x4046EF9E,0x7F0969A7,
+	0x3FF8CCCC,0xCCCCCCCD, 0x40480A0B,0xB6C0C707,
+	0x3FF8D0E5,0x60418937, 0x40494100,0x561299FA,
+	0x3FF8D4FD,0xF3B645A2, 0x404A990A,0x07280BDB,
+	0x3FF8D916,0x872B020C, 0x404C17BC,0x74780F7A,
+	0x3FF8DD2F,0x1A9FBE77, 0x404DC3FF,0x4723BB31,
+	0x3FF8E147,0xAE147AE1, 0x404FA679,0xC53F8565,
+	0x3FF8E560,0x4189374C, 0x4050E515,0x09F5A46E,
+	0x3FF8E978,0xD4FDF3B6, 0x40521E9F,0x20CB9352,
+	0x3FF8ED91,0x6872B021, 0x40538929,0x8A49520B,
+	0x3FF8F1A9,0xFBE76C8B, 0x4055312A,0x80BABBCC,
+	0x3FF8F5C2,0x8F5C28F6, 0x405727B6,0x362EE236,
+	0x3FF8F9DB,0x22D0E560, 0x405984DA,0x19D34704,
+	0x3FF8FDF3,0xB645A1CB, 0x405C6B93,0x9B7A3844,
+	0x3FF9020C,0x49BA5E35, 0x40600869,0xF1D75740,
+	0x3FF90624,0xDD2F1AA0, 0x4062645A,0x6E205DA5,
+	0x3FF90A3D,0x70A3D70A, 0x406590AD,0x07938A7E,
+	0x3FF90E56,0x04189375, 0x406A0FB8,0x9921391A,
+	0x3FF9126E,0x978D4FDF, 0x40707694,0x7D81C7BF,
+	0x3FF91687,0x2B020C4A, 0x407659C6,0xE87561F1,
+	0x3FF91A9F,0xBE76C8B4, 0x40816587,0x20AEECD5,
+	0x3FF91EB8,0x51EB851F, 0x40939F0F,0xF737E7F3,
+	0x3FF922D0,0xE5604189, 0xC0B32DD3,0x70F4C17F,
+	0x3FF926E9,0x78D4FDF4, 0xC089F651,0xAC5B68ED,
+	0x3FF92B02,0x0C49BA5E, 0xC07C5C97,0xCA7AE7B0,
+	0x3FF92F1A,0x9FBE76C9, 0xC0738240,0x074B6B17,
+	0x3FF93333,0x33333333, 0xC06DBC58,0x5E7C6259,
+	0x3FF9374B,0xC6A7EF9E, 0xC0680572,0x5CC5B468,
+	0x3FF93B64,0x5A1CAC08, 0xC064262B,0x0B50C86F,
+	0x3FF93F7C,0xED916873, 0xC0615A19,0xF21D0FA4,
+	0x3FF94395,0x810624DD, 0xC05E7935,0x593189CB,
+	0x3FF947AE,0x147AE148, 0xC05B298C,0x8D46CFC5,
+	0x3FF94BC6,0xA7EF9DB2, 0xC0588008,0x8B1BA75E,
+	0x3FF94FDF,0x3B645A1D, 0xC056502C,0x58DA5128,
+	0x3FF953F7,0xCED91687, 0xC0547C0F,0xF41BCFAF,
+	0x3FF95810,0x624DD2F2, 0xC052EEDA,0xB5F98D4F,
+	0x3FF95C28,0xF5C28F5C, 0xC0519992,0xDC47E516,
+	0x3FF96041,0x89374BC7, 0xC050712F,0x48B6624D,
+	0x3FF9645A,0x1CAC0831, 0xC04EDAC0,0x87B87325,
+	0x3FF96872,0xB020C49C, 0xC04D0F89,0x993D2403,
+	0x3FF96C8B,0x43958106, 0xC04B76C5,0x6C89F0F0,
+	0x3FF970A3,0xD70A3D71, 0xC04A0892,0x76263F1D,
+	0x3FF974BC,0x6A7EF9DB, 0xC048BE9E,0x9B8B207B,
+	0x3FF978D4,0xFDF3B646, 0xC04793C9,0x021CB2DB,
+	0x3FF97CED,0x916872B0, 0xC04683DD,0x52183947,
+	0x3FF98106,0x24DD2F1B, 0xC0458B60,0xBFC12676,
+	0x3FF9851E,0xB851EB85, 0xC044A76B,0xB6D06F42,
+	0x3FF98937,0x4BC6A7F0, 0xC043D58C,0xA5DFE44C,
+	0x3FF98D4F,0xDF3B645A, 0xC04313B1,0x79C9CA32,
+	0x3FF99168,0x72B020C5, 0xC0426016,0x107854F3,
+	0x3FF99581,0x0624DD2F, 0xC041B936,0x6794B439,
+	0x3FF99999,0x9999999A, 0xC0411DC3,0xA1F73BEA,
+	0x3FF9C28F,0x5C28F5C3, 0xC0397EA7,0x960E5A09,
+	0x3FF9EB85,0x1EB851EC, 0xC0344EAA,0x092D3149,
+	0x3FFA147A,0xE147AE14, 0xC030DF00,0xB784AFBC,
+	0x3FFA3D70,0xA3D70A3D, 0xC02CDAA2,0xFD8020CA,
+	0x3FFA6666,0x66666666, 0xC02932D2,0xD5A0CCB7,
+	0x3FFA8F5C,0x28F5C28F, 0xC0265C71,0x18986042,
+	0x3FFAB851,0xEB851EB8, 0xC0241828,0x47401DE0,
+	0x3FFAE147,0xAE147AE1, 0xC0223DD5,0xB025AC2B,
+	0x3FFB0A3D,0x70A3D70A, 0xC020B2CE,0x67522C38,
+	0x3FFB3333,0x33333333, 0xC01EC952,0x123D33F2,
+	0x3FFB5C28,0xF5C28F5C, 0xC01C8C8D,0x2706C27A,
+	0x3FFB851E,0xB851EB85, 0xC01A9C19,0x0EC19308,
+	0x3FFBAE14,0x7AE147AE, 0xC018E994,0x2E7A9555,
+	0x3FFBD70A,0x3D70A3D7, 0xC0176A03,0x3F52E80D,
+	0x3FFC0000,0x00000000, 0xC01614DE,0x7972B0BB,
+	0x3FFC28F5,0xC28F5C29, 0xC014E36B,0xC0AD26C4,
+	0x3FFC51EB,0x851EB852, 0xC013D04A,0xC375EFA4,
+	0x3FFC7AE1,0x47AE147B, 0xC012D722,0x55D37577,
+	0x3FFCA3D7,0x0A3D70A4, 0xC011F464,0x6B624FDA,
+	0x3FFCCCCC,0xCCCCCCCD, 0xC0112521,0xC7CA80BD,
+	0x3FFCF5C2,0x8F5C28F6, 0xC01066E8,0xCC881F7F,
+	0x3FFD1EB8,0x51EB851F, 0xC00F6F58,0x89958315,
+	0x3FFD47AE,0x147AE148, 0xC00E2B60,0x0DB74600,
+	0x3FFD70A3,0xD70A3D71, 0xC00CFEF3,0xCD5EE04E,
+	0x3FFD9999,0x9999999A, 0xC00BE78B,0xC91E1650,
+	0x3FFDC28F,0x5C28F5C3, 0xC00AE2F9,0x9ED055CC,
+	0x3FFDEB85,0x1EB851EC, 0xC009EF59,0x8FDC25B9,
+	0x3FFE147A,0xE147AE14, 0xC0090B06,0x6F617168,
+	0x3FFE3D70,0xA3D70A3D, 0xC008348F,0xD530F01A,
+	0x3FFE6666,0x66666666, 0xC0076AB2,0x1A0DF38B,
+	0x3FFE8F5C,0x28F5C28F, 0xC006AC4F,0xBEDC1F14,
+	0x3FFEB851,0xEB851EB8, 0xC005F86B,0xF5F91262,
+	0x3FFEE147,0xAE147AE1, 0xC0054E26,0x1635E74B,
+	0x3FFF0A3D,0x70A3D70A, 0xC004ACB5,0xCB251BE2,
+	0x3FFF3333,0x33333333, 0xC0041367,0xDFC9C347,
+	0x3FFF5C28,0xF5C28F5C, 0xC003819B,0x87E3E8DF,
+	0x3FFF851E,0xB851EB85, 0xC002F6C0,0x11A68542,
+	0x3FFFAE14,0x7AE147AE, 0xC0027252,0xEDFA8CC6,
+	0x3FFFD70A,0x3D70A3D7, 0xC001F3DE,0x00DB394C,
+	0x40000000,0x00000000, 0xC0017AF6,0x2E0950F8,
+	0x4000147A,0xE147AE14, 0xC001073A,0x18777A95,
+	0x400028F5,0xC28F5C29, 0xC0009851,0x0C882451,
+	0x40003D70,0xA3D70A3D, 0xC0002DEA,0x0E9606EB,
+	0x400051EB,0x851EB852, 0xBFFF8F76,0x10BA6B13,
+	0x40006666,0x66666666, 0xBFFECB00,0x21842076,
+	0x40007AE1,0x47AE147B, 0xBFFE0DF5,0x946081BC,
+	0x40008F5C,0x28F5C28F, 0xBFFD57E3,0xA8CD66A0,
+	0x4000A3D7,0x0A3D70A4, 0xBFFCA860,0x9E09CA5B,
+	0x4000B851,0xEB851EB8, 0xBFFBFF0A,0xD52E814F,
+	0x4000CCCC,0xCCCCCCCD, 0xBFFB5B88,0x0C6F419E,
+	0x4000E147,0xAE147AE1, 0xBFFABD84,0xB03FE6A3,
+	0x4000F5C2,0x8F5C28F6, 0xBFFA24B3,0x3F939F84,
+	0x40010A3D,0x70A3D70A, 0xBFF990CB,0xC0D1EB78,
+	0x40011EB8,0x51EB851F, 0xBFF9018B,0x45734C5E,
+	0x40013333,0x33333333, 0xBFF876B3,0x7A80440D,
+	0x400147AE,0x147AE148, 0xBFF7F00A,0x446ABF38,
+	0x40015C28,0xF5C28F5C, 0xBFF76D59,0x64EE63D0,
+	0x400170A3,0xD70A3D71, 0xBFF6EE6E,0x29D0CD96,
+	0x4001851E,0xB851EB85, 0xBFF67319,0x2380E0BE,
+	0x40019999,0x9999999A, 0xBFF5FB2D,0xE2B500EB,
+	0x4001AE14,0x7AE147AE, 0xBFF58682,0xBC440B6B,
+	0x4001C28F,0x5C28F5C3, 0xBFF514F0,0x928D1D1F,
+	0x4001D70A,0x3D70A3D7, 0xBFF4A652,0xA3D70C9D,
+	0x4001EB85,0x1EB851EC, 0xBFF43A86,0x5D228F65,
+	0x40020000,0x00000000, 0xBFF3D16B,0x30F9ADCF,
+	0x4002147A,0xE147AE14, 0xBFF36AE2,0x71D4C753,
+	0x400228F5,0xC28F5C29, 0xBFF306CF,0x2FB9489E,
+	0x40023D70,0xA3D70A3D, 0xBFF2A516,0x18C090EC,
+	0x400251EB,0x851EB852, 0xBFF2459D,0x5C3E9543,
+	0x40026666,0x66666666, 0xBFF1E84C,0x9047C337,
+	0x40027AE1,0x47AE147B, 0xBFF18D0C,0x995C9E9A,
+	0x40028F5C,0x28F5C28F, 0xBFF133C7,0x9407BAC9,
+	0x4002A3D7,0x0A3D70A4, 0xBFF0DC68,0xC04018F0,
+	0x4002B851,0xEB851EB8, 0xBFF086DC,0x6E66BD32,
+	0x4002CCCC,0xCCCCCCCD, 0xBFF0330F,0xEDBA860A,
+	0x4002E147,0xAE147AE1, 0xBFEFC1E2,0xF84221F4,
+	0x4002F5C2,0x8F5C28F6, 0xBFEF20E0,0x6E4D9304,
+	0x40030A3D,0x70A3D70A, 0xBFEE82F8,0x1C366935,
+	0x40031EB8,0x51EB851F, 0xBFEDE80B,0x6A625622,
+	0x40033333,0x33333333, 0xBFED4FFD,0x331A1C6C,
+	0x400347AE,0x147AE148, 0xBFECBAB1,0xAC5A320E,
+	0x40035C28,0xF5C28F5C, 0xBFEC280E,0x53339FE0,
+	0x400370A3,0xD70A3D71, 0xBFEB97F9,0xD89C7A0F,
+	0x4003851E,0xB851EB85, 0xBFEB0A5C,0x0F924FE5,
+	0x40039999,0x9999999A, 0xBFEA7F1D,0xDC73A18D,
+	0x4003AE14,0x7AE147AE, 0xBFE9F629,0x2577D856,
+	0x4003C28F,0x5C28F5C3, 0xBFE96F68,0xC42F6A54,
+	0x4003D70A,0x3D70A3D7, 0xBFE8EAC8,0x77F7CAEA,
+	0x4003EB85,0x1EB851EC, 0xBFE86834,0xD9508D7E,
+	0x40040000,0x00000000, 0xBFE7E79B,0x4E00BB15,
+	0x4004147A,0xE147AE14, 0xBFE768E9,0xFDFCCC3A,
+	0x400428F5,0xC28F5C29, 0xBFE6EC0F,0xC8FF094F,
+	0x40043D70,0xA3D70A3D, 0xBFE670FC,0x3CC5423D,
+	0x400451EB,0x851EB852, 0xBFE5F79F,0x8BE7E214,
+	0x40046666,0x66666666, 0xBFE57FEA,0x853F5E3C,
+	0x40047AE1,0x47AE147B, 0xBFE509CE,0x8BCDE2E4,
+	0x40048F5C,0x28F5C28F, 0xBFE4953D,0x8F23EECD,
+	0x4004A3D7,0x0A3D70A4, 0xBFE4222A,0x04374B8F,
+	0x4004B851,0xEB851EB8, 0xBFE3B086,0xDEA47CAD,
+	0x4004CCCC,0xCCCCCCCD, 0xBFE34047,0x8A535B2B,
+	0x4004E147,0xAE147AE1, 0xBFE2D15F,0xE57823E1,
+	0x4004F5C2,0x8F5C28F6, 0xBFE263C4,0x3AEAC051,
+	0x40050A3D,0x70A3D70A, 0xBFE1F769,0x3CCE8ACA,
+	0x40051EB8,0x51EB851F, 0xBFE18C43,0xFF853AF4,
+	0x40053333,0x33333333, 0xBFE12249,0xF4E80DBB,
+	0x400547AE,0x147AE148, 0xBFE0B970,0xE7C29638,
+	0x40055C28,0xF5C28F5C, 0xBFE051AE,0xF78AFB49,
+	0x400570A3,0xD70A3D71, 0xBFDFD5F5,0x28A7639E,
+	0x4005851E,0xB851EB85, 0xBFDF0A94,0xF5E6187B,
+	0x40059999,0x9999999A, 0xBFDE412B,0x62BA7143,
+	0x4005AE14,0x7AE147AE, 0xBFDD79A7,0x065B07EC,
+	0x4005C28F,0x5C28F5C3, 0xBFDCB3F6,0xFCB7E02F,
+	0x4005D70A,0x3D70A3D7, 0xBFDBF00A,0xE038BC8B,
+	0x4005EB85,0x1EB851EC, 0xBFDB2DD2,0xC3C97C79,
+	0x40060000,0x00000000, 0xBFDA6D3F,0x2D2FBDDF,
+	0x4006147A,0xE147AE14, 0xBFD9AE41,0x0FA54A23,
+	0x400628F5,0xC28F5C29, 0xBFD8F0C9,0xC6B32406,
+	0x40063D70,0xA3D70A3D, 0xBFD834CB,0x11494F1D,
+	0x400651EB,0x851EB852, 0xBFD77A37,0x0D0FA9A0,
+	0x40066666,0x66666666, 0xBFD6C100,0x31EC6D8F,
+	0x40067AE1,0x47AE147B, 0xBFD60919,0x4DBD22FB,
+	0x40068F5C,0x28F5C28F, 0xBFD55275,0x803F0213,
+	0x4006A3D7,0x0A3D70A4, 0xBFD49D08,0x3723F05E,
+	0x4006B851,0xEB851EB8, 0xBFD3E8C5,0x2A51724F,
+	0x4006CCCC,0xCCCCCCCD, 0xBFD335A0,0x58471083,
+	0x4006E147,0xAE147AE1, 0xBFD2838E,0x02A9D7B2,
+	0x4006F5C2,0x8F5C28F6, 0xBFD1D282,0xAAF2BADC,
+	0x40070A3D,0x70A3D70A, 0xBFD12273,0x0F3DC1BE,
+	0x40071EB8,0x51EB851F, 0xBFD07354,0x27380945,
+	0x40073333,0x33333333, 0xBFCF8A36,0x4255739F,
+	0x400747AE,0x147AE148, 0xBFCE2F7A,0xBE425D06,
+	0x40075C28,0xF5C28F5C, 0xBFCCD660,0xE8514668,
+	0x400770A3,0xD70A3D71, 0xBFCB7ED4,0x434FA4BA,
+	0x4007851E,0xB851EB85, 0xBFCA28C0,0xA99A06CD,
+	0x40079999,0x9999999A, 0xBFC8D412,0x482234DD,
+	0x4007AE14,0x7AE147AE, 0xBFC780B5,0x999C9D3F,
+	0x4007C28F,0x5C28F5C3, 0xBFC62E97,0x61D274B1,
+	0x4007D70A,0x3D70A3D7, 0xBFC4DDA4,0xA9161384,
+	0x4007EB85,0x1EB851EC, 0xBFC38DCA,0xB7D7307D,
+	0x40080000,0x00000000, 0xBFC23EF7,0x1254B86F,
+	0x4008147A,0xE147AE14, 0xBFC0F117,0x746A1536,
+	0x400828F5,0xC28F5C29, 0xBFBF4833,0x9AEBA09F,
+	0x40083D70,0xA3D70A3D, 0xBFBCAFD8,0x78AF1E09,
+	0x400851EB,0x851EB852, 0xBFBA18FA,0x1706F131,
+	0x40086666,0x66666666, 0xBFB78375,0x5A525376,
+	0x40087AE1,0x47AE147B, 0xBFB4EF27,0x6ED8C87F,
+	0x40088F5C,0x28F5C28F, 0xBFB25BED,0xC15B774D,
+	0x4008A3D7,0x0A3D70A4, 0xBFAF934B,0xEF861D63,
+	0x4008B851,0xEB851EB8, 0xBFAA705B,0xD3CDC956,
+	0x4008CCCC,0xCCCCCCCD, 0xBFA54EC7,0x34D41690,
+	0x4008E147,0xAE147AE1, 0xBFA02E4A,0x5F565CE2,
+	0x4008F5C2,0x8F5C28F6, 0xBF961D43,0xB310503E,
+	0x40090A3D,0x70A3D70A, 0xBF87BE29,0x54AD5EB0,
+	0x40091EB8,0x51EB851F, 0xBF5A1814,0x37675567,
+	0x40093333,0x33333333, 0x3F8137F9,0x856D6E41,
+	0x400947AE,0x147AE148, 0x3F92D9EB,0xA4F62313,
+	0x40095C28,0xF5C28F5C, 0x3F9D18D1,0xB72C1B1B,
+	0x400970A3,0xD70A3D71, 0x3FA3AC9A,0xBFF3086B,
+	0x4009851E,0xB851EB85, 0x3FA8CDCE,0xE9FD6569,
+	0x40099999,0x9999999A, 0x3FADF048,0xF9266060,
+	0x4009AE14,0x7AE147AE, 0x3FB18A26,0x67EEAFBE,
+	0x4009C28F,0x5C28F5C3, 0x3FB41D0F,0x50D2CBD6,
+	0x4009D70A,0x3D70A3D7, 0x3FB6B101,0x80A79C58,
+	0x4009EB85,0x1EB851EC, 0x3FB9461F,0x77AD405C,
+	0x400A0000,0x00000000, 0x3FBBDC8B,0xF445936C,
+	0x400A147A,0xE147AE14, 0x3FBE7469,0xFA596046,
+	0x400A28F5,0xC28F5C29, 0x3FC086EE,0x6D6E387C,
+	0x400A3D70,0xA3D70A3D, 0x3FC1D484,0x1DB9FC33,
+	0x400A51EB,0x851EB852, 0x3FC32308,0x0F2175C4,
+	0x400A6666,0x66666666, 0x3FC4728C,0x74EFFCF3,
+	0x400A7AE1,0x47AE147B, 0x3FC5C323,0xB8BC7E0F,
+	0x400A8F5C,0x28F5C28F, 0x3FC714E0,0x7E93E585,
+	0x400AA3D7,0x0A3D70A4, 0x3FC867D5,0xA93E50A7,
+	0x400AB851,0xEB851EB8, 0x3FC9BC16,0x5EA125B4,
+	0x400ACCCC,0xCCCCCCCD, 0x3FCB11B6,0x0C40508C,
+	0x400AE147,0xAE147AE1, 0x3FCC68C8,0x6BE0F671,
+	0x400AF5C2,0x8F5C28F6, 0x3FCDC161,0x885012CC,
+	0x400B0A3D,0x70A3D70A, 0x3FCF1B95,0xC24F8827,
+	0x400B1EB8,0x51EB851F, 0x3FD03BBC,0xEAD62A78,
+	0x400B3333,0x33333333, 0x3FD0EA91,0x6F405CD1,
+	0x400B47AE,0x147AE148, 0x3FD19A53,0x2F52A3EA,
+	0x400B5C28,0xF5C28F5C, 0x3FD24B0D,0x21A9FA95,
+	0x400B70A3,0xD70A3D71, 0x3FD2FCCA,0x75803EAD,
+	0x400B851E,0xB851EB85, 0x3FD3AF96,0x95B4C42B,
+	0x400B9999,0x9999999A, 0x3FD4637D,0x2BF3206B,
+	0x400BAE14,0x7AE147AE, 0x3FD5188A,0x23FA1C89,
+	0x400BC28F,0x5C28F5C3, 0x3FD5CEC9,0xAF04DD47,
+	0x400BD70A,0x3D70A3D7, 0x3FD68648,0x47586C2C,
+	0x400BEB85,0x1EB851EC, 0x3FD73F12,0xB3F7F1AE,
+	0x400C0000,0x00000000, 0x3FD7F936,0x0C8212A7,
+	0x400C147A,0xE147AE14, 0x3FD8B4BF,0xBD3A0CE3,
+	0x400C28F5,0xC28F5C29, 0x3FD971BD,0x8B3F572C,
+	0x400C3D70,0xA3D70A3D, 0x3FDA303D,0x98F6B846,
+	0x400C51EB,0x851EB852, 0x3FDAF04E,0x6AA7F9CC,
+	0x400C6666,0x66666666, 0x3FDBB1FE,0xEB539007,
+	0x400C7AE1,0x47AE147B, 0x3FDC755E,0x71C3CB76,
+	0x400C8F5C,0x28F5C28F, 0x3FDD3A7C,0xC5DD64C3,
+	0x400CA3D7,0x0A3D70A4, 0x3FDE016A,0x2633799A,
+	0x400CB851,0xEB851EB8, 0x3FDECA37,0x4DE35722,
+	0x400CCCCC,0xCCCCCCCD, 0x3FDF94F5,0x7ABCC018,
+	0x400CE147,0xAE147AE1, 0x3FE030DB,0x39DDD7B5,
+	0x400CF5C2,0x8F5C28F6, 0x3FE09846,0x47EC7B6E,
+	0x400D0A3D,0x70A3D70A, 0x3FE100C5,0x5E9BBD7C,
+	0x400D1EB8,0x51EB851F, 0x3FE16A62,0x445A1E5C,
+	0x400D3333,0x33333333, 0x3FE1D527,0x12EFEA2B,
+	0x400D47AE,0x147AE148, 0x3FE2411E,0x3BB441CA,
+	0x400D5C28,0xF5C28F5C, 0x3FE2AE52,0x8BFE46FB,
+	0x400D70A3,0xD70A3D71, 0x3FE31CCF,0x31D68FC4,
+	0x400D851E,0xB851EB85, 0x3FE38C9F,0xC0ED5649,
+	0x400D9999,0x9999999A, 0x3FE3FDD0,0x37DA3554,
+	0x400DAE14,0x7AE147AE, 0x3FE4706D,0x05AAA22E,
+	0x400DC28F,0x5C28F5C3, 0x3FE4E483,0x0FC4C04C,
+	0x400DD70A,0x3D70A3D7, 0x3FE55A1F,0xB8249E6D,
+	0x400DEB85,0x1EB851EC, 0x3FE5D150,0xE3FA6D5E,
+	0x400E0000,0x00000000, 0x3FE64A25,0x02B0CA3B,
+	0x400E147A,0xE147AE14, 0x3FE6C4AB,0x1562CFC7,
+	0x400E28F5,0xC28F5C29, 0x3FE740F2,0xB6CA47FE,
+	0x400E3D70,0xA3D70A3D, 0x3FE7BF0C,0x23AF0ED3,
+	0x400E51EB,0x851EB852, 0x3FE83F08,0x43E17FCE,
+	0x400E6666,0x66666666, 0x3FE8C0F8,0xB3CAA42E,
+	0x400E7AE1,0x47AE147B, 0x3FE944EF,0xCE9DCB31,
+	0x400E8F5C,0x28F5C28F, 0x3FE9CB00,0xB9383FC0,
+	0x400EA3D7,0x0A3D70A4, 0x3FEA533F,0x6DBCF6E1,
+	0x400EB851,0xEB851EB8, 0x3FEADDC0,0xC7FB5569,
+	0x400ECCCC,0xCCCCCCCD, 0x3FEB6A9A,0x92B193F9,
+	0x400EE147,0xAE147AE1, 0x3FEBF9E3,0x95BCD327,
+	0x400EF5C2,0x8F5C28F6, 0x3FEC8BB3,0xA54AAA88,
+	0x400F0A3D,0x70A3D70A, 0x3FED2023,0xB221E225,
+	0x400F1EB8,0x51EB851F, 0x3FEDB74D,0xDB1A2351,
+	0x400F3333,0x33333333, 0x3FEE514D,0x7FDCC3DA,
+	0x400F47AE,0x147AE148, 0x3FEEEE3F,0x550B6B09,
+	0x400F5C28,0xF5C28F5C, 0x3FEF8E41,0x79EC34DB,
+	0x400F70A3,0xD70A3D71, 0x3FF018B9,0xC7DF1AD3,
+	0x400F851E,0xB851EB85, 0x3FF06BFB,0x696E6D99,
+	0x400F9999,0x9999999A, 0x3FF0C0F7,0x1AEE59E4,
+	0x400FAE14,0x7AE147AE, 0x3FF117BF,0x3F6853A1,
+	0x400FC28F,0x5C28F5C3, 0x3FF17067,0x3375E0EE,
+	0x400FD70A,0x3D70A3D7, 0x3FF1CB03,0x5E5CAFC7,
+	0x400FEB85,0x1EB851EC, 0x3FF227A9,0x4495F7D8,
+	0x40100000,0x00000000, 0x3FF2866F,0x9BE4DE13,
+	0x40100A3D,0x70A3D70A, 0x3FF2E76E,0x6123A1FA,
+	0x4010147A,0xE147AE14, 0x3FF34ABE,0xEFF3F3ED,
+	0x40101EB8,0x51EB851F, 0x3FF3B07C,0x1C84085B,
+	0x401028F5,0xC28F5C29, 0x3FF418C2,0x4F9FE0DA,
+	0x40103333,0x33333333, 0x3FF483AF,0xA54CF833,
+	0x40103D70,0xA3D70A3D, 0x3FF4F164,0x0E361CC1,
+	0x401047AE,0x147AE148, 0x3FF56201,0x7435F6EE,
+	0x401051EB,0x851EB852, 0x3FF5D5AB,0xE258A65E,
+	0x40105C28,0xF5C28F5C, 0x3FF64C89,0xB0B83EB8,
+	0x40106666,0x66666666, 0x3FF6C6C3,0xB4A4F47E,
+	0x401070A3,0xD70A3D71, 0x3FF74485,0x7598C740,
+	0x40107AE1,0x47AE147B, 0x3FF7C5FD,0x6787B78C,
+	0x4010851E,0xB851EB85, 0x3FF84B5D,0x2B318524,
+	0x40108F5C,0x28F5C28F, 0x3FF8D4D9,0xD530FF49,
+	0x40109999,0x9999999A, 0x3FF962AC,0x3C9FB267,
+	0x4010A3D7,0x0A3D70A4, 0x3FF9F511,0x5243D841,
+	0x4010AE14,0x7AE147AE, 0x3FFA8C4A,0x8162B618,
+	0x4010B851,0xEB851EB8, 0x3FFB289E,0x1B7BF881,
+	0x4010C28F,0x5C28F5C3, 0x3FFBCA57,0xD0645308,
+	0x4010CCCC,0xCCCCCCCD, 0x3FFC71C9,0x34701778,
+	0x4010D70A,0x3D70A3D7, 0x3FFD1F4A,0x56A3619E,
+	0x4010E147,0xAE147AE1, 0x3FFDD33A,0x692EF174,
+	0x4010EB85,0x1EB851EC, 0x3FFE8E00,0x7EE183CE,
+	0x4010F5C2,0x8F5C28F6, 0x3FFF500C,0x60A89856,
+	0x40110000,0x00000000, 0x40000CEB,0xBF628F31,
+	0x40110A3D,0x70A3D70A, 0x400075F3,0x00FEB2B6,
+	0x4011147A,0xE147AE14, 0x4000E364,0x00EE10ED,
+	0x40111EB8,0x51EB851F, 0x4001558D,0x72FE0A92,
+	0x401128F5,0xC28F5C29, 0x4001CCC5,0x7CC15EC5,
+	0x40113333,0x33333333, 0x4002496A,0x9CA760A9,
+	0x40113D70,0xA3D70A3D, 0x4002CBE4,0xB388298E,
+	0x401147AE,0x147AE148, 0x400354A6,0x36CB66E9,
+	0x401151EB,0x851EB852, 0x4003E42D,0x929899F0,
+	0x40115C28,0xF5C28F5C, 0x40047B06,0xC51868FC,
+	0x40116666,0x66666666, 0x400519CD,0x3DCCEF9A,
+	0x401170A3,0xD70A3D71, 0x4005C12E,0x0E879FEB,
+	0x40117AE1,0x47AE147B, 0x400671EA,0x7EAC4FD2,
+	0x4011851E,0xB851EB85, 0x40072CDB,0x1575275A,
+	0x40118F5C,0x28F5C28F, 0x4007F2F3,0x350E3F18,
+	0x40119999,0x9999999A, 0x4008C545,0x66FDBDEC,
+	0x4011A3D7,0x0A3D70A4, 0x4009A508,0x82E370F9,
+	0x4011AE14,0x7AE147AE, 0x400A939D,0xE3D5A677,
+	0x4011B851,0xEB851EB8, 0x400B9298,0xEF70163E,
+	0x4011C28F,0x5C28F5C3, 0x400CA3C8,0x455D4218,
+	0x4011CCCC,0xCCCCCCCD, 0x400DC941,0x089849E0,
+	0x4011D70A,0x3D70A3D7, 0x400F056C,0xD78A2EDB,
+	0x4011E147,0xAE147AE1, 0x40102D8D,0x9CAF3190,
+	0x4011EB85,0x1EB851EC, 0x4010E6CB,0xC599C19C,
+	0x4011F5C2,0x8F5C28F6, 0x4011B062,0x6BDC4851,
+	0x40120000,0x00000000, 0x40128CA0,0xC62BF595,
+	0x40120A3D,0x70A3D70A, 0x40137E4A,0xE22E6BDD,
+	0x4012147A,0xE147AE14, 0x401488B8,0x020BC6EA,
+	0x40121EB8,0x51EB851F, 0x4015AFFA,0xF7407ABD,
+	0x401228F5,0xC28F5C29, 0x4016F918,0x89139216,
+	0x40123333,0x33333333, 0x40186A51,0xF4A4BCE8,
+	0x40123D70,0xA3D70A3D, 0x401A0B8C,0xC23408C5,
+	0x401247AE,0x147AE148, 0x401BE6E6,0x5B418FD1,
+	0x401251EB,0x851EB852, 0x401E098A,0x83E8B7AB,
+	0x40125C28,0xF5C28F5C, 0x40204279,0x7C85C3DD,
+	0x40126666,0x66666666, 0x4021B868,0xD80B4C11,
+	0x401270A3,0xD70A3D71, 0x4023770D,0x3005D2D4,
+	0x40127AE1,0x47AE147B, 0x40259602,0x7F4B226B,
+	0x4012851E,0xB851EB85, 0x4028385B,0x1B77EDE6,
+	0x40128F5C,0x28F5C28F, 0x402B948A,0x80D7055A,
+	0x40129999,0x9999999A, 0x403001F6,0xA713EF1D,
+	0x4012A3D7,0x0A3D70A4, 0x4033120D,0x6E567C5F,
+	0x4012AE14,0x7AE147AE, 0x403793B0,0x14CFE6DD,
+	0x4012B851,0xEB851EB8, 0x403EDD28,0xA291F23C,
+	0x4012C28F,0x5C28F5C3, 0x40465424,0x9701608D,
+	0x4012CCCC,0xCCCCCCCD, 0x40542D9D,0xE890C6A9,
+	0x4012D70A,0x3D70A3D7, 0x407A2967,0xB8BA248E,
+	0x4012E147,0xAE147AE1, 0xC0606C59,0x52D96EAC,
+	0x4012EB85,0x1EB851EC, 0xC04C636C,0xD62A6257,
+	0x4012F5C2,0x8F5C28F6, 0xC0421AA6,0xF169ED66,
+	0x40130000,0x00000000, 0xC03A934E,0x58D7CC85,
+	0x40130A3D,0x70A3D70A, 0xC034FCD7,0xD2DC29C4,
+	0x4013147A,0xE147AE14, 0xC03156AD,0x56671A8A,
+	0x40131EB8,0x51EB851F, 0xC02D8930,0x0597B53B,
+	0x401328F5,0xC28F5C29, 0xC029B7C0,0x1A22AC84,
+	0x40133333,0x33333333, 0xC026C50D,0xC43253B3,
+	0x40133D70,0xA3D70A3D, 0xC0246CA3,0xCECE8128,
+	0x401347AE,0x147AE148, 0xC022837F,0x4AE886B8,
+	0x401351EB,0x851EB852, 0xC020ED3E,0x254228AF,
+	0x40135C28,0xF5C28F5C, 0xC01F2CC7,0xB61F8BFB,
+	0x40136666,0x66666666, 0xC01CE23B,0xE0FADD61,
+	0x401370A3,0xD70A3D71, 0xC01AE6B1,0x8CE5AA9C,
+	0x40137AE1,0x47AE147B, 0xC0192B1E,0xD5C27D9D,
+	0x4013851E,0xB851EB85, 0xC017A410,0x99DC50C6,
+	0x40138F5C,0x28F5C28F, 0xC01648A7,0xD51B1884,
+	0x40139999,0x9999999A, 0xC01511E9,0xB3C687CB,
+	0x4013A3D7,0x0A3D70A4, 0xC013FA45,0x0FCBE1B5,
+	0x4013AE14,0x7AE147AE, 0xC012FD3B,0x55E7BA64,
+	0x4013B851,0xEB851EB8, 0xC0121721,0x6F136D8C,
+	0x4013C28F,0x5C28F5C3, 0xC01144F1,0x4B5C7084,
+	0x4013CCCC,0xCCCCCCCD, 0xC0108427,0x27EA8A1F,
+	0x4013D70A,0x3D70A3D7, 0xC00FA54E,0x7E67A867,
+	0x4013E147,0xAE147AE1, 0xC00E5D53,0x340A0A6A,
+	0x4013EB85,0x1EB851EC, 0xC00D2D54,0xCE016933,
+	0x4013F5C2,0x8F5C28F6, 0xC00C12BB,0x68F3A9E7,
+	0x40140000,0x00000000, 0xC00B0B4B,0x739BBB07,
+	0x40140A3D,0x70A3D70A, 0xC00A1516,0x2C226A73,
+	0x4014147A,0xE147AE14, 0xC0092E6D,0x23F265CB,
+	0x40141EB8,0x51EB851F, 0xC00855D8,0x1F563A3F,
+	0x401428F5,0xC28F5C29, 0xC0078A0C,0xCFDDA8E4,
+	0x40143333,0x33333333, 0xC006C9E8,0x07199B18,
+	0x40143D70,0xA3D70A3D, 0xC0061468,0x15E5C4AB,
+	0x401447AE,0x147AE148, 0xC00568A8,0x1D6B1E39,
+	0x401451EB,0x851EB852, 0xC004C5DC,0x23D3F339,
+	0x40145C28,0xF5C28F5C, 0xC0042B4D,0xC86A9F1B,
+	0x40146666,0x66666666, 0xC0039859,0x7A58D5D2,
+	0x401470A3,0xD70A3D71, 0xC0030C6C,0x1B083445,
+	0x40147AE1,0x47AE147B, 0xC0028700,0xF9A84E4C,
+	0x4014851E,0xB851EB85, 0xC00207A0,0x18E8E15E,
+	0x40148F5C,0x28F5C28F, 0xC0018DDC,0xB2C28011,
+	0x40149999,0x9999999A, 0xC0011953,0xF06083E8,
+	0x4014A3D7,0x0A3D70A4, 0xC000A9AB,0xCE054241,
+	0x4014AE14,0x7AE147AE, 0xC0003E92,0x242E5A61,
+	0x4014B851,0xEB851EB8, 0xBFFFAF77,0xA0CB2BDF,
+	0x4014C28F,0x5C28F5C3, 0xBFFEE9C7,0xF233E017,
+	0x4014CCCC,0xCCCCCCCD, 0xBFFE2B96,0xD13EA593,
+	0x4014D70A,0x3D70A3D7, 0xBFFD746F,0xF826A0D3,
+	0x4014E147,0xAE147AE1, 0xBFFCC3E8,0x46D108A5,
+	0x4014EB85,0x1EB851EC, 0xBFFC199C,0xE08DA66F,
+	0x4014F5C2,0x8F5C28F6, 0xBFFB7532,0x63919678,
+	0x40150000,0x00000000, 0xBFFAD654,0x36D2B404,
+	0x40150A3D,0x70A3D70A, 0xBFFA3CB3,0xEB67679B,
+	0x4015147A,0xE147AE14, 0xBFF9A808,0xAEF79B2F,
+	0x40151EB8,0x51EB851F, 0xBFF9180E,0xCD24004B,
+	0x401528F5,0xC28F5C29, 0xBFF88C87,0x3E13753C,
+	0x40153333,0x33333333, 0xBFF80537,0x409587B1,
+	0x40153D70,0xA3D70A3D, 0xBFF781E7,0xFE7EC38B,
+	0x401547AE,0x147AE148, 0xBFF70266,0x3A11352C,
+	0x401551EB,0x851EB852, 0xBFF68682,0x036A98E0,
+	0x40155C28,0xF5C28F5C, 0xBFF60E0E,0x75132642,
+	0x40156666,0x66666666, 0xBFF598E1,0x76E4A597,
+	0x401570A3,0xD70A3D71, 0xBFF526D3,0x869A3A55,
+	0x40157AE1,0x47AE147B, 0xBFF4B7BF,0x856EAB69,
+	0x4015851E,0xB851EB85, 0xBFF44B82,0x8A416B2B,
+	0x40158F5C,0x28F5C28F, 0xBFF3E1FB,0xB7CAA946,
+	0x40159999,0x9999999A, 0xBFF37B0C,0x1674A47B,
+	0x4015A3D7,0x0A3D70A4, 0xBFF31696,0x717C9515,
+	0x4015AE14,0x7AE147AE, 0xBFF2B47F,0x37081E28,
+	0x4015B851,0xEB851EB8, 0xBFF254AC,0x5AE577BD,
+	0x4015C28F,0x5C28F5C3, 0xBFF1F705,0x3BB4A007,
+	0x4015CCCC,0xCCCCCCCD, 0xBFF19B72,0x8A3F0291,
+	0x4015D70A,0x3D70A3D7, 0xBFF141DE,0x32C947CD,
+	0x4015E147,0xAE147AE1, 0xBFF0EA33,0x4830863E,
+	0x4015EB85,0x1EB851EC, 0xBFF0945D,0xF0A8ED4E,
+	0x4015F5C2,0x8F5C28F6, 0xBFF0404B,0x53F8523F,
+	0x40160000,0x00000000, 0xBFEFDBD3,0x1615B07A,
+	0x40160A3D,0x70A3D70A, 0xBFEF3A4F,0x2186A1B7,
+	0x4016147A,0xE147AE14, 0xBFEE9BEA,0x67D7E721,
+	0x40161EB8,0x51EB851F, 0xBFEE0086,0x145D7263,
+	0x401628F5,0xC28F5C29, 0xBFED6804,0xC7FE16EE,
+	0x40163333,0x33333333, 0xBFECD24A,0x82C132C9,
+	0x40163D70,0xA3D70A3D, 0xBFEC3F3C,0x8EF2141B,
+	0x401647AE,0x147AE148, 0xBFEBAEC1,0x6DB7F4D2,
+	0x401651EB,0x851EB852, 0xBFEB20C0,0xC50475AA,
+	0x40165C28,0xF5C28F5C, 0xBFEA9523,0x4EBD3E38,
+	0x40166666,0x66666666, 0xBFEA0BD2,0xC907E03E,
+	0x401670A3,0xD70A3D71, 0xBFE984B9,0xE7A1523E,
+	0x40167AE1,0x47AE147B, 0xBFE8FFC4,0x462C55D1,
+	0x4016851E,0xB851EB85, 0xBFE87CDE,0x5B63EA04,
+	0x40168F5C,0x28F5C28F, 0xBFE7FBF5,0x6D208C16,
+	0x40169999,0x9999999A, 0xBFE77CF7,0x85207F68,
+	0x4016A3D7,0x0A3D70A4, 0xBFE6FFD3,0x6684AB8F,
+	0x4016AE14,0x7AE147AE, 0xBFE68478,0x83F4D287,
+	0x4016B851,0xEB851EB8, 0xBFE60AD6,0xF65EFAB5,
+	0x4016C28F,0x5C28F5C3, 0xBFE592DF,0x7446E4A5,
+	0x4016CCCC,0xCCCCCCCD, 0xBFE51C83,0x499B4CC8,
+	0x4016D70A,0x3D70A3D7, 0xBFE4A7B4,0x50078A21,
+	0x4016E147,0xAE147AE1, 0xBFE43464,0xE7B8DBC0,
+	0x4016EB85,0x1EB851EC, 0xBFE3C287,0xF08F63B2,
+	0x4016F5C2,0x8F5C28F6, 0xBFE35210,0xC3B36E38,
+	0x40170000,0x00000000, 0xBFE2E2F3,0x2D88343E,
+	0x40170A3D,0x70A3D70A, 0xBFE27523,0x67F5CE4C,
+	0x4017147A,0xE147AE14, 0xBFE20896,0x15048503,
+	0x40171EB8,0x51EB851F, 0xBFE19D40,0x39C41C69,
+	0x401728F5,0xC28F5C29, 0xBFE13317,0x397A1CF1,
+	0x40173333,0x33333333, 0xBFE0CA10,0xD11279EF,
+	0x40173D70,0xA3D70A3D, 0xBFE06223,0x12CE4C3B,
+	0x401747AE,0x147AE148, 0xBFDFF688,0xC4594A0F,
+	0x401751EB,0x851EB852, 0xBFDF2AD6,0xE0138D02,
+	0x40175C28,0xF5C28F5C, 0xBFDE611E,0x6DE2A27D,
+	0x40176666,0x66666666, 0xBFDD994D,0xEF40685C,
+	0x401770A3,0xD70A3D71, 0xBFDCD354,0x6B66C789,
+	0x40177AE1,0x47AE147B, 0xBFDC0F21,0x69012494,
+	0x4017851E,0xB851EB85, 0xBFDB4CA4,0xE82CA40C,
+	0x40178F5C,0x28F5C28F, 0xBFDA8BCF,0x5CC26F7F,
+	0x40179999,0x9999999A, 0xBFD9CC91,0xA8E776FC,
+	0x4017A3D7,0x0A3D70A4, 0xBFD90EDD,0x17DD78C2,
+	0x4017AE14,0x7AE147AE, 0xBFD852A3,0x59115C7C,
+	0x4017B851,0xEB851EB8, 0xBFD797D6,0x7B6332C0,
+	0x4017C28F,0x5C28F5C3, 0xBFD6DE68,0xE8A4629E,
+	0x4017CCCC,0xCCCCCCCD, 0xBFD6264D,0x6148C8A4,
+	0x4017D70A,0x3D70A3D7, 0xBFD56F76,0xF847BBD0,
+	0x4017E147,0xAE147AE1, 0xBFD4B9D9,0x0F2A1F35,
+	0x4017EB85,0x1EB851EC, 0xBFD40567,0x5242D07B,
+	0x4017F5C2,0x8F5C28F6, 0xBFD35215,0xB50EEE4E,
+	0x40180000,0x00000000, 0xBFD29FD8,0x6EBB95BE,
+	0x40180A3D,0x70A3D70A, 0xBFD1EEA3,0xF6CEDB3D,
+	0x4018147A,0xE147AE14, 0xBFD13E6D,0x01F1E224,
+	0x40181EB8,0x51EB851F, 0xBFD08F28,0x7EDA1559,
+	0x401828F5,0xC28F5C29, 0xBFCFC197,0x269F3F77,
+	0x40183333,0x33333333, 0xBFCE6697,0x329EB7B0,
+	0x40183D70,0xA3D70A3D, 0xBFCD0D3C,0x388D19B7,
+	0x401847AE,0x147AE148, 0xBFCBB571,0xACCD8DC5,
+	0x401851EB,0x851EB852, 0xBFCA5F23,0x5C2106DA,
+	0x40185C28,0xF5C28F5C, 0xBFC90A3D,0x66A5E076,
+	0x40186666,0x66666666, 0xBFC7B6AC,0x3AFF3643,
+	0x401870A3,0xD70A3D71, 0xBFC6645C,0x91A15744,
+	0x40187AE1,0x47AE147B, 0xBFC5133B,0x6840D861,
+	0x4018851E,0xB851EB85, 0xBFC3C335,0xFD61E310,
+	0x40188F5C,0x28F5C28F, 0xBFC27439,0xCC057B7F,
+	0x40189999,0x9999999A, 0xBFC12634,0x87728D50,
+	0x4018A3D7,0x0A3D70A4, 0xBFBFB228,0x2E314F16,
+	0x4018AE14,0x7AE147AE, 0xBFBD198D,0x2514C2E4,
+	0x4018B851,0xEB851EB8, 0xBFBA8274,0x7B1AF1B0,
+	0x4018C28F,0x5C28F5C3, 0xBFB7ECBB,0x087D8E67,
+	0x4018CCCC,0xCCCCCCCD, 0xBFB5583D,0xEE907AF9,
+	0x4018D70A,0x3D70A3D7, 0xBFB2C4DA,0x904E42B0,
+	0x4018E147,0xAE147AE1, 0xBFB0326E,0x8B01AE21,
+	0x4018EB85,0x1EB851EC, 0xBFAB41AF,0x5E1229DA,
+	0x4018F5C2,0x8F5C28F6, 0xBFA61FE7,0xF160582C,
+	0x40190000,0x00000000, 0xBFA0FF43,0x123A338E,
+	0x40190A3D,0x70A3D70A, 0xBF97BEFA,0x7D36BBC6,
+	0x4019147A,0xE147AE14, 0xBF8B014C,0x890D5442,
+	0x40191EB8,0x51EB851F, 0xBF6A1818,0x8DDF1E5A,
+	0x401928F5,0xC28F5C29, 0x3F7BE9D5,0x7E31634E,
+	0x40193333,0x33333333, 0x3F913849,0x4AF2A746,
+	};
+
+LOCAL_D const TUint32 ExpTest[] =
+	{
+	0xC0000000,0x00000000, 0x3FC152AA,0xA3BF81CC,
+	0xBFFFD70A,0x3D70A3D7, 0x3FC17F3C,0x56E69205,
+	0xBFFFAE14,0x7AE147AE, 0x3FC1AC40,0xB56ABECC,
+	0xBFFF851E,0xB851EB85, 0x3FC1D9B8,0xE652C462,
+	0xBFFF5C28,0xF5C28F5C, 0x3FC207A6,0x139C6D76,
+	0xBFFF3333,0x33333333, 0x3FC23609,0x6A44340F,
+	0xBFFF0A3D,0x70A3D70A, 0x3FC264E4,0x1A4CF61B,
+	0xBFFEE147,0xAE147AE1, 0x3FC29437,0x56C7BDD5,
+	0xBFFEB851,0xEB851EB8, 0x3FC2C404,0x55DB9E2B,
+	0xBFFE8F5C,0x28F5C28F, 0x3FC2F44C,0x50CDA35E,
+	0xBFFE6666,0x66666666, 0x3FC32510,0x8408D817,
+	0xBFFE3D70,0xA3D70A3D, 0x3FC35652,0x2F265F15,
+	0xBFFE147A,0xE147AE14, 0x3FC38812,0x94F5A1B7,
+	0xBFFDEB85,0x1EB851EC, 0x3FC3BA52,0xFB849391,
+	0xBFFDC28F,0x5C28F5C3, 0x3FC3ED14,0xAC280B4D,
+	0xBFFD9999,0x9999999A, 0x3FC42058,0xF38430F0,
+	0xBFFD70A3,0xD70A3D71, 0x3FC45421,0x219501EA,
+	0xBFFD47AE,0x147AE148, 0x3FC4886E,0x89B6EAFE,
+	0xBFFD1EB8,0x51EB851F, 0x3FC4BD42,0x82AF7851,
+	0xBFFCF5C2,0x8F5C28F6, 0x3FC4F29E,0x66B61BD1,
+	0xBFFCCCCC,0xCCCCCCCD, 0x3FC52883,0x937D0A33,
+	0xBFFCA3D7,0x0A3D70A4, 0x3FC55EF3,0x6A3A2EBA,
+	0xBFFC7AE1,0x47AE147B, 0x3FC595EF,0x4FB0360C,
+	0xBFFC51EB,0x851EB852, 0x3FC5CD78,0xAC37B046,
+	0xBFFC28F5,0xC28F5C29, 0x3FC60590,0xEBC84A91,
+	0xBFFC0000,0x00000000, 0x3FC63E39,0x7E022073,
+	0xBFFBD70A,0x3D70A3D7, 0x3FC67773,0xD637251A,
+	0xBFFBAE14,0x7AE147AE, 0x3FC6B141,0x6B74A4E0,
+	0xBFFB851E,0xB851EB85, 0x3FC6EBA3,0xB88CDF38,
+	0xBFFB5C28,0xF5C28F5C, 0x3FC7269C,0x3C20B964,
+	0xBFFB3333,0x33333333, 0x3FC7622C,0x78A98A07,
+	0xBFFB0A3D,0x70A3D70A, 0x3FC79E55,0xF482FDFE,
+	0xBFFAE147,0xAE147AE1, 0x3FC7DB1A,0x39F516A4,
+	0xBFFAB851,0xEB851EB8, 0x3FC8187A,0xD73E41CB,
+	0xBFFA8F5C,0x28F5C28F, 0x3FC85679,0x5E9D8BB1,
+	0xBFFA6666,0x66666666, 0x3FC89517,0x665CEB31,
+	0xBFFA3D70,0xA3D70A3D, 0x3FC8D456,0x88DBA86F,
+	0xBFFA147A,0xE147AE14, 0x3FC91438,0x6498DE48,
+	0xBFF9EB85,0x1EB851EC, 0x3FC954BE,0x9C3E16C7,
+	0xBFF9C28F,0x5C28F5C3, 0x3FC995EA,0xD6AA02F2,
+	0xBFF99999,0x9999999A, 0x3FC9D7BE,0xBEFB4E15,
+	0xBFF970A3,0xD70A3D71, 0x3FCA1A3C,0x049B8D00,
+	0xBFF947AE,0x147AE148, 0x3FCA5D64,0x5B4A4953,
+	0xBFF91EB8,0x51EB851F, 0x3FCAA139,0x7B282942,
+	0xBFF8F5C2,0x8F5C28F6, 0x3FCAE5BD,0x20C23400,
+	0xBFF8CCCC,0xCCCCCCCD, 0x3FCB2AF1,0x0D1D3336,
+	0xBFF8A3D7,0x0A3D70A4, 0x3FCB70D7,0x05C131B3,
+	0xBFF87AE1,0x47AE147B, 0x3FCBB770,0xD4C517B9,
+	0xBFF851EB,0x851EB852, 0x3FCBFEC0,0x48DA6523,
+	0xBFF828F5,0xC28F5C29, 0x3FCC46C7,0x355909C1,
+	0xBFF80000,0x00000000, 0x3FCC8F87,0x724B5C1D,
+	0xBFF7D70A,0x3D70A3D7, 0x3FCCD902,0xDC7A2F1B,
+	0xBFF7AE14,0x7AE147AE, 0x3FCD233B,0x557906A1,
+	0xBFF7851E,0xB851EB85, 0x3FCD6E32,0xC3B26BB0,
+	0xBFF75C28,0xF5C28F5C, 0x3FCDB9EB,0x12746030,
+	0xBFF73333,0x33333333, 0x3FCE0666,0x31FCF2C8,
+	0xBFF70A3D,0x70A3D70A, 0x3FCE53A6,0x1786F313,
+	0xBFF6E147,0xAE147AE1, 0x3FCEA1AC,0xBD56C680,
+	0xBFF6B851,0xEB851EB8, 0x3FCEF07C,0x22C75E39,
+	0xBFF68F5C,0x28F5C28F, 0x3FCF4016,0x4C574E67,
+	0xBFF66666,0x66666666, 0x3FCF907D,0x43B60715,
+	0xBFF63D70,0xA3D70A3D, 0x3FCFE1B3,0x17D12F2E,
+	0xBFF6147A,0xE147AE14, 0x3FD019DC,0xEE7110E0,
+	0xBFF5EB85,0x1EB851EC, 0x3FD04349,0xD63DC704,
+	0xBFF5C28F,0x5C28F5C3, 0x3FD06D21,0x52CB9D41,
+	0xBFF59999,0x9999999A, 0x3FD09764,0x7651F5AD,
+	0xBFF570A3,0xD70A3D71, 0x3FD0C214,0x55C9B65A,
+	0xBFF547AE,0x147AE148, 0x3FD0ED32,0x08F46082,
+	0xBFF51EB8,0x51EB851F, 0x3FD118BE,0xAA6339F2,
+	0xBFF4F5C2,0x8F5C28F6, 0x3FD144BB,0x577E88E7,
+	0xBFF4CCCC,0xCCCCCCCD, 0x3FD17129,0x308CE281,
+	0xBFF4A3D7,0x0A3D70A4, 0x3FD19E09,0x58BA8C05,
+	0xBFF47AE1,0x47AE147B, 0x3FD1CB5C,0xF620EF1F,
+	0xBFF451EB,0x851EB852, 0x3FD1F925,0x31CE214D,
+	0xBFF428F5,0xC28F5C29, 0x3FD22763,0x37CC7EAB,
+	0xBFF40000,0x00000000, 0x3FD25618,0x372A584F,
+	0xBFF3D70A,0x3D70A3D7, 0x3FD28545,0x6201B66B,
+	0xBFF3AE14,0x7AE147AE, 0x3FD2B4EB,0xED802E61,
+	0xBFF3851E,0xB851EB85, 0x3FD2E50D,0x11EECCFF,
+	0xBFF35C28,0xF5C28F5C, 0x3FD315AA,0x0ABA1522,
+	0xBFF33333,0x33333333, 0x3FD346C4,0x167A12DF,
+	0xBFF30A3D,0x70A3D70A, 0x3FD3785C,0x76FA8377,
+	0xBFF2E147,0xAE147AE1, 0x3FD3AA74,0x7143124B,
+	0xBFF2B851,0xEB851EB8, 0x3FD3DD0D,0x4D9FAAFC,
+	0xBFF28F5C,0x28F5C28F, 0x3FD41028,0x57A8E0F5,
+	0xBFF26666,0x66666666, 0x3FD443C6,0xDE4C6C98,
+	0xBFF23D70,0xA3D70A3D, 0x3FD477EA,0x33D5BE3C,
+	0xBFF2147A,0xE147AE14, 0x3FD4AC93,0xADF6A741,
+	0xBFF1EB85,0x1EB851EC, 0x3FD4E1C4,0xA5D0196A,
+	0xBFF1C28F,0x5C28F5C3, 0x3FD5177E,0x77FAFCB5,
+	0xBFF19999,0x9999999A, 0x3FD54DC2,0x84911BF1,
+	0xBFF170A3,0xD70A3D71, 0x3FD58492,0x2F36284C,
+	0xBFF147AE,0x147AE148, 0x3FD5BBEE,0xDF20D40E,
+	0xBFF11EB8,0x51EB851F, 0x3FD5F3D9,0xFF2404C6,
+	0xBFF0F5C2,0x8F5C28F6, 0x3FD62C54,0xFDB81D17,
+	0xBFF0CCCC,0xCCCCCCCD, 0x3FD66561,0x4D045E75,
+	0xBFF0A3D7,0x0A3D70A4, 0x3FD69F00,0x62E862FE,
+	0xBFF07AE1,0x47AE147B, 0x3FD6D933,0xB905AFB6,
+	0xBFF051EB,0x851EB852, 0x3FD713FC,0xCCC95F67,
+	0xBFF028F5,0xC28F5C29, 0x3FD74F5D,0x1F75E65B,
+	0xBFF00000,0x00000000, 0x3FD78B56,0x362CEF38,
+	0xBFEFAE14,0x7AE147AE, 0x3FD7C7E9,0x99F9513C,
+	0xBFEF5C28,0xF5C28F5C, 0x3FD80518,0xD7D9201A,
+	0xBFEF0A3D,0x70A3D70A, 0x3FD842E5,0x80C7D5BA,
+	0xBFEEB851,0xEB851EB8, 0x3FD88151,0x29C89622,
+	0xBFEE6666,0x66666666, 0x3FD8C05D,0x6BF08DC0,
+	0xBFEE147A,0xE147AE14, 0x3FD9000B,0xE4716A6D,
+	0xBFEDC28F,0x5C28F5C3, 0x3FD9405E,0x34A3EF55,
+	0xBFED70A3,0xD70A3D71, 0x3FD98156,0x0212A425,
+	0xBFED1EB8,0x51EB851F, 0x3FD9C2F4,0xF6849FA4,
+	0xBFECCCCC,0xCCCCCCCD, 0x3FDA053C,0xC0086E1E,
+	0xBFEC7AE1,0x47AE147B, 0x3FDA482F,0x10FF13D7,
+	0xBFEC28F5,0xC28F5C29, 0x3FDA8BCD,0xA0272BCD,
+	0xBFEBD70A,0x3D70A3D7, 0x3FDAD01A,0x28A8231C,
+	0xBFEB851E,0xB851EB85, 0x3FDB1516,0x6A1D9143,
+	0xBFEB3333,0x33333333, 0x3FDB5AC4,0x28A2AD9E,
+	0xBFEAE147,0xAE147AE1, 0x3FDBA125,0x2CDDE255,
+	0xBFEA8F5C,0x28F5C28F, 0x3FDBE83B,0x440C7D1A,
+	0xBFEA3D70,0xA3D70A3D, 0x3FDC3008,0x400E7DF6,
+	0xBFE9EB85,0x1EB851EC, 0x3FDC788D,0xF7728474,
+	0xBFE99999,0x9999999A, 0x3FDCC1CE,0x4581DB88,
+	0xBFE947AE,0x147AE148, 0x3FDD0BCB,0x0A4CA463,
+	0xBFE8F5C2,0x8F5C28F6, 0x3FDD5686,0x2AB620A0,
+	0xBFE8A3D7,0x0A3D70A4, 0x3FDDA201,0x90811C13,
+	0xBFE851EB,0x851EB852, 0x3FDDEE3F,0x2A5C767A,
+	0xBFE80000,0x00000000, 0x3FDE3B40,0xEBEFCD7E,
+	0xBFE7AE14,0x7AE147AE, 0x3FDE8908,0xCDE84743,
+	0xBFE75C28,0xF5C28F5C, 0x3FDED798,0xCE057DDF,
+	0xBFE70A3D,0x70A3D70A, 0x3FDF26F2,0xEF268C13,
+	0xBFE6B851,0xEB851EB8, 0x3FDF7719,0x39573B94,
+	0xBFE66666,0x66666666, 0x3FDFC80D,0xB9DD5542,
+	0xBFE6147A,0xE147AE14, 0x3FE00CE9,0x41A309CC,
+	0xBFE5C28F,0x5C28F5C3, 0x3FE03634,0xD6B9DBDD,
+	0xBFE570A3,0xD70A3D71, 0x3FE05FEA,0xAAD5A0BE,
+	0xBFE51EB8,0x51EB851F, 0x3FE08A0B,0xCF512550,
+	0xBFE4CCCC,0xCCCCCCCD, 0x3FE0B499,0x584682EA,
+	0xBFE47AE1,0x47AE147B, 0x3FE0DF94,0x5C9630CE,
+	0xBFE428F5,0xC28F5C29, 0x3FE10AFD,0xF5EE27D7,
+	0xBFE3D70A,0x3D70A3D7, 0x3FE136D7,0x40D1187E,
+	0xBFE3851E,0xB851EB85, 0x3FE16321,0x5C9DB371,
+	0xBFE33333,0x33333333, 0x3FE18FDD,0x6B9604E3,
+	0xBFE2E147,0xAE147AE1, 0x3FE1BD0C,0x92E6E2D2,
+	0xBFE28F5C,0x28F5C28F, 0x3FE1EAAF,0xFAAF6E5C,
+	0xBFE23D70,0xA3D70A3D, 0x3FE218C8,0xCE08A877,
+	0xBFE1EB85,0x1EB851EC, 0x3FE24758,0x3B0D1A19,
+	0xBFE19999,0x9999999A, 0x3FE2765F,0x72E0901C,
+	0xBFE147AE,0x147AE148, 0x3FE2A5DF,0xA9B7EB07,
+	0xBFE0F5C2,0x8F5C28F6, 0x3FE2D5DA,0x16E102ED,
+	0xBFE0A3D7,0x0A3D70A4, 0x3FE3064F,0xF4CA9F9D,
+	0xBFE051EB,0x851EB852, 0x3FE33742,0x810C854E,
+	0xBFE00000,0x00000000, 0x3FE368B2,0xFC6F960A,
+	0xBFDF5C28,0xF5C28F5C, 0x3FE39AA2,0xAAF607F6,
+	0xBFDEB851,0xEB851EB8, 0x3FE3CD12,0xD3E3B0C7,
+	0xBFDE147A,0xE147AE14, 0x3FE40004,0xC1C6668C,
+	0xBFDD70A3,0xD70A3D71, 0x3FE43379,0xC27E7600,
+	0xBFDCCCCC,0xCCCCCCCD, 0x3FE46773,0x27472EA9,
+	0xBFDC28F5,0xC28F5C29, 0x3FE49BF2,0x44BF84EF,
+	0xBFDB851E,0xB851EB85, 0x3FE4D0F8,0x72F2CA6E,
+	0xBFDAE147,0xAE147AE1, 0x3FE50687,0x0D617CB6,
+	0xBFDA3D70,0xA3D70A3D, 0x3FE53C9F,0x730A2AB1,
+	0xBFD99999,0x9999999A, 0x3FE57343,0x067270EE,
+	0xBFD8F5C2,0x8F5C28F6, 0x3FE5AA73,0x2DB00D0E,
+	0xBFD851EB,0x851EB852, 0x3FE5E231,0x52720888,
+	0xBFD7AE14,0x7AE147AE, 0x3FE61A7E,0xE209FAFF,
+	0xBFD70A3D,0x70A3D70A, 0x3FE6535D,0x4D756470,
+	0xBFD66666,0x66666666, 0x3FE68CCE,0x09671F71,
+	0xBFD5C28F,0x5C28F5C3, 0x3FE6C6D2,0x8E50EBB5,
+	0xBFD51EB8,0x51EB851F, 0x3FE7016C,0x586D1129,
+	0xBFD47AE1,0x47AE147B, 0x3FE73C9C,0xE7C81BCE,
+	0xBFD3D70A,0x3D70A3D7, 0x3FE77865,0xC04AB0AB,
+	0xBFD33333,0x33333333, 0x3FE7B4C8,0x69C37C05,
+	0xBFD28F5C,0x28F5C28F, 0x3FE7F1C6,0x6FF13921,
+	0xBFD1EB85,0x1EB851EC, 0x3FE82F61,0x628CD3D9,
+	0xBFD147AE,0x147AE148, 0x3FE86D9A,0xD553A443,
+	0xBFD0A3D7,0x0A3D70A4, 0x3FE8AC74,0x6011C4A6,
+	0xBFD00000,0x00000000, 0x3FE8EBEF,0x9EAC820B,
+	0xBFCEB851,0xEB851EB8, 0x3FE92C0E,0x312CE7A9,
+	0xBFCD70A3,0xD70A3D71, 0x3FE96CD1,0xBBCA6572,
+	0xBFCC28F5,0xC28F5C29, 0x3FE9AE3B,0xE6F59209,
+	0xBFCAE147,0xAE147AE1, 0x3FE9F04E,0x5F630862,
+	0xBFC99999,0x9999999A, 0x3FEA330A,0xD6166159,
+	0xBFC851EB,0x851EB852, 0x3FEA7673,0x006D4985,
+	0xBFC70A3D,0x70A3D70A, 0x3FEABA88,0x982AB390,
+	0xBFC5C28F,0x5C28F5C3, 0x3FEAFF4D,0x5B82275F,
+	0xBFC47AE1,0x47AE147B, 0x3FEB44C3,0x0D232E50,
+	0xBFC33333,0x33333333, 0x3FEB8AEB,0x7444DCE0,
+	0xBFC1EB85,0x1EB851EC, 0x3FEBD1C8,0x5CB179FC,
+	0xBFC0A3D7,0x0A3D70A4, 0x3FEC195B,0x96D2444E,
+	0xBFBEB851,0xEB851EB8, 0x3FEC61A6,0xF7BB55D8,
+	0xBFBC28F5,0xC28F5C29, 0x3FECAAAC,0x5937A61E,
+	0xBFB99999,0x9999999A, 0x3FECF46D,0x99D52B3A,
+	0xBFB70A3D,0x70A3D70A, 0x3FED3EEC,0x9CF11A26,
+	0xBFB47AE1,0x47AE147B, 0x3FED8A2B,0x4AC44685,
+	0xBFB1EB85,0x1EB851EC, 0x3FEDD62B,0x906FA24C,
+	0xBFAEB851,0xEB851EB8, 0x3FEE22EF,0x6008DD87,
+	0xBFA99999,0x9999999A, 0x3FEE7078,0xB0A726A6,
+	0xBFA47AE1,0x47AE147B, 0x3FEEBEC9,0x7E700B8D,
+	0xBF9EB851,0xEB851EB8, 0x3FEF0DE3,0xCAA47BCF,
+	0xBF947AE1,0x47AE147B, 0x3FEF5DC9,0x9BADEC5B,
+	0xBF847AE1,0x47AE147B, 0x3FEFAE7C,0xFD2B9CFE,
+	0x00000000,0x00000000, 0x3FF00000,0x00000000,
+	0x3F847AE1,0x47AE147B, 0x3FF0292A,0x5D2F2226,
+	0x3F947AE1,0x47AE147B, 0x3FF052BE,0xA3EC0132,
+	0x3F9EB851,0xEB851EB8, 0x3FF07CBD,0xE4B58641,
+	0x3FA47AE1,0x47AE147B, 0x3FF0A729,0x32C7B125,
+	0x3FA99999,0x9999999A, 0x3FF0D201,0xA422A433,
+	0x3FAEB851,0xEB851EB8, 0x3FF0FD48,0x5191C228,
+	0x3FB1EB85,0x1EB851EC, 0x3FF128FE,0x56B2DE6A,
+	0x3FB47AE1,0x47AE147B, 0x3FF15524,0xD1FD7FBD,
+	0x3FB70A3D,0x70A3D70A, 0x3FF181BC,0xE4CA35AD,
+	0x3FB99999,0x9999999A, 0x3FF1AEC7,0xB35A00D4,
+	0x3FBC28F5,0xC28F5C29, 0x3FF1DC46,0x64DDCE2D,
+	0x3FBEB851,0xEB851EB8, 0x3FF20A3A,0x237E05AC,
+	0x3FC0A3D7,0x0A3D70A4, 0x3FF238A4,0x1C622C3F,
+	0x3FC1EB85,0x1EB851EC, 0x3FF26785,0x7FB8997E,
+	0x3FC33333,0x33333333, 0x3FF296DF,0x80BE4122,
+	0x3FC47AE1,0x47AE147B, 0x3FF2C6B3,0x55C69097,
+	0x3FC5C28F,0x5C28F5C3, 0x3FF2F702,0x384360B7,
+	0x3FC70A3D,0x70A3D70A, 0x3FF327CD,0x64CCFC08,
+	0x3FC851EB,0x851EB852, 0x3FF35916,0x1B2A3990,
+	0x3FC99999,0x9999999A, 0x3FF38ADD,0x9E58AC8D,
+	0x3FCAE147,0xAE147AE1, 0x3FF3BD25,0x3494E939,
+	0x3FCC28F5,0xC28F5C29, 0x3FF3EFEE,0x2762DED6,
+	0x3FCD70A3,0xD70A3D71, 0x3FF42339,0xC3964733,
+	0x3FCEB851,0xEB851EB8, 0x3FF45709,0x595B2BEA,
+	0x3FD00000,0x00000000, 0x3FF48B5E,0x3C3E8186,
+	0x3FD0A3D7,0x0A3D70A4, 0x3FF4C039,0xC336D8D3,
+	0x3FD147AE,0x147AE148, 0x3FF4F59D,0x48AD2681,
+	0x3FD1EB85,0x1EB851EC, 0x3FF52B8A,0x2A85A16B,
+	0x3FD28F5C,0x28F5C28F, 0x3FF56201,0xCA28B7A4,
+	0x3FD33333,0x33333333, 0x3FF59905,0x8C8C1A96,
+	0x3FD3D70A,0x3D70A3D7, 0x3FF5D096,0xDA3BE264,
+	0x3FD47AE1,0x47AE147B, 0x3FF608B7,0x1F63C8D5,
+	0x3FD51EB8,0x51EB851F, 0x3FF64167,0xCBD87BF5,
+	0x3FD5C28F,0x5C28F5C3, 0x3FF67AAA,0x532108BD,
+	0x3FD66666,0x66666666, 0x3FF6B480,0x2C805DEC,
+	0x3FD70A3D,0x70A3D70A, 0x3FF6EEEA,0xD2FEE75F,
+	0x3FD7AE14,0x7AE147AE, 0x3FF729EB,0xC574421D,
+	0x3FD851EB,0x851EB852, 0x3FF76584,0x86910958,
+	0x3FD8F5C2,0x8F5C28F6, 0x3FF7A1B6,0x9CE8BCB1,
+	0x3FD99999,0x9999999A, 0x3FF7DE83,0x92FBBFE0,
+	0x3FDA3D70,0xA3D70A3D, 0x3FF81BEC,0xF741742B,
+	0x3FDAE147,0xAE147AE1, 0x3FF859F4,0x5C326BCB,
+	0x3FDB851E,0xB851EB85, 0x3FF8989B,0x5852B794,
+	0x3FDC28F5,0xC28F5C29, 0x3FF8D7E3,0x863C4F1C,
+	0x3FDCCCCC,0xCCCCCCCD, 0x3FF917CE,0x84A993B5,
+	0x3FDD70A3,0xD70A3D71, 0x3FF9585D,0xF67FEE5D,
+	0x3FDE147A,0xE147AE14, 0x3FF99993,0x82DA8915,
+	0x3FDEB851,0xEB851EB8, 0x3FF9DB70,0xD51523C0,
+	0x3FDF5C28,0xF5C28F5C, 0x3FFA1DF7,0x9CD704E5,
+	0x3FE00000,0x00000000, 0x3FFA6129,0x8E1E069C,
+	0x3FE051EB,0x851EB852, 0x3FFAA508,0x6149BFDE,
+	0x3FE0A3D7,0x0A3D70A4, 0x3FFAE995,0xD326CA98,
+	0x3FE0F5C2,0x8F5C28F6, 0x3FFB2ED3,0xA4FA26B9,
+	0x3FE147AE,0x147AE148, 0x3FFB74C3,0x9C8CBA8F,
+	0x3FE19999,0x9999999A, 0x3FFBBB67,0x8436F0B5,
+	0x3FE1EB85,0x1EB851EC, 0x3FFC02C1,0x2AEC73F0,
+	0x3FE23D70,0xA3D70A3D, 0x3FFC4AD2,0x6448092F,
+	0x3FE28F5C,0x28F5C28F, 0x3FFC939D,0x08978818,
+	0x3FE2E147,0xAE147AE1, 0x3FFCDD22,0xF4E7F250,
+	0x3FE33333,0x33333333, 0x3FFD2766,0x0B11A9EF,
+	0x3FE3851E,0xB851EB85, 0x3FFD7268,0x31C4C757,
+	0x3FE3D70A,0x3D70A3D7, 0x3FFDBE2B,0x54958EC8,
+	0x3FE428F5,0xC28F5C29, 0x3FFE0AB1,0x64090605,
+	0x3FE47AE1,0x47AE147B, 0x3FFE57FC,0x55A1AA5A,
+	0x3FE4CCCC,0xCCCCCCCD, 0x3FFEA60E,0x23EC4752,
+	0x3FE51EB8,0x51EB851F, 0x3FFEF4E8,0xCE8CEE7A,
+	0x3FE570A3,0xD70A3D71, 0x3FFF448E,0x5A4C107E,
+	0x3FE5C28F,0x5C28F5C3, 0x3FFF9500,0xD123B7FC,
+	0x3FE6147A,0xE147AE14, 0x3FFFE642,0x424CE65B,
+	0x3FE66666,0x66666666, 0x40001C2A,0x61268987,
+	0x3FE6B851,0xEB851EB8, 0x4000459D,0x3581E6C0,
+	0x3FE70A3D,0x70A3D70A, 0x40006F7A,0xADDC4114,
+	0x3FE75C28,0xF5C28F5C, 0x400099C3,0xDC94317C,
+	0x3FE7AE14,0x7AE147AE, 0x4000C479,0xD6CA39D0,
+	0x3FE80000,0x00000000, 0x4000EF9D,0xB467DCF8,
+	0x3FE851EB,0x851EB852, 0x40011B30,0x9026C95C,
+	0x3FE8A3D7,0x0A3D70A4, 0x40014733,0x879815CE,
+	0x3FE8F5C2,0x8F5C28F6, 0x400173A7,0xBB2B9101,
+	0x3FE947AE,0x147AE148, 0x4001A08E,0x4E3723E4,
+	0x3FE99999,0x9999999A, 0x4001CDE8,0x66FE46E9,
+	0x3FE9EB85,0x1EB851EC, 0x4001FBB7,0x2EB98A8C,
+	0x3FEA3D70,0xA3D70A3D, 0x400229FB,0xD19E3331,
+	0x3FEA8F5C,0x28F5C28F, 0x400258B7,0x7EE5E89E,
+	0x3FEAE147,0xAE147AE1, 0x400287EB,0x68D67933,
+	0x3FEB3333,0x33333333, 0x4002B798,0xC4C9B11F,
+	0x3FEB851E,0xB851EB85, 0x4002E7C0,0xCB3545C2,
+	0x3FEBD70A,0x3D70A3D7, 0x40031864,0xB7B2D56E,
+	0x3FEC28F5,0xC28F5C29, 0x40034985,0xC907FBBC,
+	0x3FEC7AE1,0x47AE147B, 0x40037B25,0x412E7AAA,
+	0x3FECCCCC,0xCCCCCCCD, 0x4003AD44,0x655C78BC,
+	0x3FED1EB8,0x51EB851F, 0x4003DFE4,0x7E0CD449,
+	0x3FED70A3,0xD70A3D71, 0x40041306,0xD7078C43,
+	0x3FEDC28F,0x5C28F5C3, 0x400446AC,0xBF6A3E8D,
+	0x3FEE147A,0xE147AE14, 0x40047AD7,0x89B0BC3E,
+	0x3FEE6666,0x66666666, 0x4004AF88,0x8BBDB3F0,
+	0x3FEEB851,0xEB851EB8, 0x4004E4C1,0x1EE37254,
+	0x3FEF0A3D,0x70A3D70A, 0x40051A82,0x9FECB951,
+	0x3FEF5C28,0xF5C28F5C, 0x400550CE,0x6F25ADE5,
+	0x3FEFAE14,0x7AE147AE, 0x400587A5,0xF064DCF9,
+	0x3FF00000,0x00000000, 0x4005BF0A,0x8B145769,
+	0x3FF028F5,0xC28F5C29, 0x4005F6FD,0xAA3AE580,
+	0x3FF051EB,0x851EB852, 0x40062F80,0xBC85521F,
+	0x3FF07AE1,0x47AE147B, 0x40066895,0x344FCDCC,
+	0x3FF0A3D7,0x0A3D70A4, 0x4006A23C,0x87AF69E8,
+	0x3FF0CCCC,0xCCCCCCCD, 0x4006DC78,0x307BAC49,
+	0x3FF0F5C2,0x8F5C28F6, 0x40071749,0xAC583B7E,
+	0x3FF11EB8,0x51EB851F, 0x400752B2,0x7CBEA3E9,
+	0x3FF147AE,0x147AE148, 0x40078EB4,0x2708360B,
+	0x3FF170A3,0xD70A3D71, 0x4007CB50,0x3477FE27,
+	0x3FF19999,0x9999999A, 0x40080888,0x3244D593,
+	0x3FF1C28F,0x5C28F5C3, 0x4008465D,0xB1A38DEB,
+	0x3FF1EB85,0x1EB851EC, 0x400884D2,0x47D13670,
+	0x3FF2147A,0xE147AE14, 0x4008C3E7,0x8E1D7BCF,
+	0x3FF23D70,0xA3D70A3D, 0x4009039F,0x21F522A8,
+	0x3FF26666,0x66666666, 0x400943FA,0xA4EC9CF1,
+	0x3FF28F5C,0x28F5C28F, 0x400984FB,0xBCCABAAD,
+	0x3FF2B851,0xEB851EB8, 0x4009C6A4,0x13937614,
+	0x3FF2E147,0xAE147AE1, 0x400A08F5,0x5792DB8E,
+	0x3FF30A3D,0x70A3D70A, 0x400A4BF1,0x3B680DB1,
+	0x3FF33333,0x33333333, 0x400A8F99,0x761065A4,
+	0x3FF35C28,0xF5C28F5C, 0x400AD3EF,0xC2F2B016,
+	0x3FF3851E,0xB851EB85, 0x400B18F5,0xE1EA8727,
+	0x3FF3AE14,0x7AE147AE, 0x400B5EAD,0x9753C982,
+	0x3FF3D70A,0x3D70A3D7, 0x400BA518,0xAC162EFB,
+	0x3FF40000,0x00000000, 0x400BEC38,0xEDB0FAF0,
+	0x3FF428F5,0xC28F5C29, 0x400C3410,0x2E46CCCA,
+	0x3FF451EB,0x851EB852, 0x400C7CA0,0x44A98EDF,
+	0x3FF47AE1,0x47AE147B, 0x400CC5EB,0x0C66840E,
+	0x3FF4A3D7,0x0A3D70A4, 0x400D0FF2,0x65D27452,
+	0x3FF4CCCC,0xCCCCCCCD, 0x400D5AB8,0x3615F8B4,
+	0x3FF4F5C2,0x8F5C28F6, 0x400DA63E,0x6739E6DA,
+	0x3FF51EB8,0x51EB851F, 0x400DF286,0xE833DC89,
+	0x3FF547AE,0x147AE148, 0x400E3F93,0xACF2EB74,
+	0x3FF570A3,0xD70A3D71, 0x400E8D66,0xAE6C659C,
+	0x3FF59999,0x9999999A, 0x400EDC01,0xEAA8CAA6,
+	0x3FF5C28F,0x5C28F5C3, 0x400F2B67,0x64D0D670,
+	0x3FF5EB85,0x1EB851EC, 0x400F7B99,0x253AB13B,
+	0x3FF6147A,0xE147AE14, 0x400FCC99,0x397741C6,
+	0x3FF63D70,0xA3D70A3D, 0x40100F34,0xDA2FD0DB,
+	0x3FF66666,0x66666666, 0x40103886,0x57115A47,
+	0x3FF68F5C,0x28F5C28F, 0x40106242,0x222970CF,
+	0x3FF6B851,0xEB851EB8, 0x40108C69,0x4CF9F8AE,
+	0x3FF6E147,0xAE147AE1, 0x4010B6FC,0xEBC48723,
+	0x3FF70A3D,0x70A3D70A, 0x4010E1FE,0x159174EF,
+	0x3FF73333,0x33333333, 0x40110D6D,0xE4370309,
+	0x3FF75C28,0xF5C28F5C, 0x4011394D,0x746091A9,
+	0x3FF7851E,0xB851EB85, 0x4011659D,0xE595E9E7,
+	0x3FF7AE14,0x7AE147AE, 0x40119260,0x5A429A20,
+	0x3FF7D70A,0x3D70A3D7, 0x4011BF95,0xF7BD6542,
+	0x3FF80000,0x00000000, 0x4011ED3F,0xE64FC541,
+	0x3FF828F5,0xC28F5C29, 0x40121B5F,0x513D80D6,
+	0x3FF851EB,0x851EB852, 0x401249F5,0x66CC54C7,
+	0x3FF87AE1,0x47AE147B, 0x40127903,0x584BB0E9,
+	0x3FF8A3D7,0x0A3D70A4, 0x4012A88A,0x5A1C88FD,
+	0x3FF8CCCC,0xCCCCCCCD, 0x4012D88B,0xA3B939BD,
+	0x3FF8F5C2,0x8F5C28F6, 0x40130908,0x6FBD8222,
+	0x3FF91EB8,0x51EB851F, 0x40133A01,0xFBEE9144,
+	0x3FF947AE,0x147AE148, 0x40136B79,0x894328E3,
+	0x3FF970A3,0xD70A3D71, 0x40139D70,0x5BEBD4E2,
+	0x3FF99999,0x9999999A, 0x4013CFE7,0xBB5B37EC,
+	0x3FF9C28F,0x5C28F5C3, 0x401402E0,0xF24E6D6E,
+	0x3FF9EB85,0x1EB851EC, 0x4014365D,0x4ED58120,
+	0x3FFA147A,0xE147AE14, 0x40146A5E,0x225BFC5B,
+	0x3FFA3D70,0xA3D70A3D, 0x40149EE4,0xC1B18972,
+	0x3FFA6666,0x66666666, 0x4014D3F2,0x8512AD3E,
+	0x3FFA8F5C,0x28F5C28F, 0x40150988,0xC831971D,
+	0x3FFAB851,0xEB851EB8, 0x40153FA8,0xEA3F07A7,
+	0x3FFAE147,0xAE147AE1, 0x40157654,0x4DF34E3C,
+	0x3FFB0A3D,0x70A3D70A, 0x4015AD8C,0x59975DBF,
+	0x3FFB3333,0x33333333, 0x4015E552,0x770DF8A7,
+	0x3FFB5C28,0xF5C28F5C, 0x40161DA8,0x13DCF4AB,
+	0x3FFB851E,0xB851EB85, 0x4016568E,0xA1369647,
+	0x3FFBAE14,0x7AE147AE, 0x40169007,0x94030451,
+	0x3FFBD70A,0x3D70A3D7, 0x4016CA14,0x64E9D3DF,
+	0x3FFC0000,0x00000000, 0x401704B6,0x905BACBF,
+	0x3FFC28F5,0xC28F5C29, 0x40173FEF,0x969C06BB,
+	0x3FFC51EB,0x851EB852, 0x40177BC0,0xFBCAFFF1,
+	0x3FFC7AE1,0x47AE147B, 0x4017B82C,0x47EF4C73,
+	0x3FFCA3D7,0x0A3D70A4, 0x4017F533,0x07003F80,
+	0x3FFCCCCC,0xCCCCCCCD, 0x401832D6,0xC8EFEE85,
+	0x3FFCF5C2,0x8F5C28F6, 0x40187119,0x21B56E3B,
+	0x3FFD1EB8,0x51EB851F, 0x4018AFFB,0xA9572A1B,
+	0x3FFD47AE,0x147AE148, 0x4018EF7F,0xFBF55668,
+	0x3FFD70A3,0xD70A3D71, 0x40192FA7,0xB9D47D23,
+	0x3FFD9999,0x9999999A, 0x40197074,0x87682618,
+	0x3FFDC28F,0x5C28F5C3, 0x4019B1E8,0x0D5D9A61,
+	0x3FFDEB85,0x1EB851EC, 0x4019F403,0xF8A6C392,
+	0x3FFE147A,0xE147AE14, 0x401A36C9,0xFA8526E1,
+	0x3FFE3D70,0xA3D70A3D, 0x401A7A3B,0xC894FC97,
+	0x3FFE6666,0x66666666, 0x401ABE5B,0x1CD863F6,
+	0x3FFE8F5C,0x28F5C28F, 0x401B0329,0xB5C2B407,
+	0x3FFEB851,0xEB851EB8, 0x401B48A9,0x5643E976,
+	0x3FFEE147,0xAE147AE1, 0x401B8EDB,0xC5D431E1,
+	0x3FFF0A3D,0x70A3D70A, 0x401BD5C2,0xD07F94D4,
+	0x3FFF3333,0x33333333, 0x401C1D60,0x46F1BAC1,
+	0x3FFF5C28,0xF5C28F5C, 0x401C65B5,0xFE81D254,
+	0x3FFF851E,0xB851EB85, 0x401CAEC5,0xD13E944E,
+	0x3FFFAE14,0x7AE147AE, 0x401CF891,0x9DFA665C,
+	0x3FFFD70A,0x3D70A3D7, 0x401D431B,0x48579D1C,
+	0x40000000,0x00000000, 0x401D8E64,0xB8D4DDAE,
+	0x4000147A,0xE147AE14, 0x401DDA6F,0xDCD99F23,
+	0x400028F5,0xC28F5C29, 0x401E273E,0xA6C2CC1C,
+	0x40003D70,0xA3D70A3D, 0x401E74D3,0x0DEF84D2,
+	0x400051EB,0x851EB852, 0x401EC32F,0x0ECE021B,
+	0x40006666,0x66666666, 0x401F1254,0xAAE89965,
+	0x40007AE1,0x47AE147B, 0x401F6245,0xE8F2E25E,
+	0x40008F5C,0x28F5C28F, 0x401FB304,0xD4D6FE42,
+	0x4000A3D7,0x0A3D70A4, 0x40200249,0xBFE180C0,
+	0x4000B851,0xEB851EB8, 0x40202B7A,0x001B3FD8,
+	0x4000CCCC,0xCCCCCCCD, 0x40205514,0x39081D4F,
+	0x4000E147,0xAE147AE1, 0x40207F19,0x7B4DFA21,
+	0x4000F5C2,0x8F5C28F6, 0x4020A98A,0xDA50324D,
+	0x40010A3D,0x70A3D70A, 0x4020D469,0x6C36A98D,
+	0x40011EB8,0x51EB851F, 0x4020FFB6,0x49F4EA56,
+	0x40013333,0x33333333, 0x40212B72,0x8F51570E,
+	0x400147AE,0x147AE148, 0x4021579F,0x5AEC6DDB,
+	0x40015C28,0xF5C28F5C, 0x4021843D,0xCE481F09,
+	0x400170A3,0xD70A3D71, 0x4021B14F,0x0DCF366E,
+	0x4001851E,0xB851EB85, 0x4021DED4,0x40DCD7C4,
+	0x40019999,0x9999999A, 0x40220CCE,0x91C40E5F,
+	0x4001AE14,0x7AE147AE, 0x40223B3F,0x2DD7703A,
+	0x4001C28F,0x5C28F5C3, 0x40226A27,0x4570D4CE,
+	0x4001D70A,0x3D70A3D7, 0x40229988,0x0BF91F9C,
+	0x4001EB85,0x1EB851EC, 0x4022C962,0xB7F01EE4,
+	0x40020000,0x00000000, 0x4022F9B8,0x82F47E81,
+	0x4002147A,0xE147AE14, 0x40232A8A,0xA9CBCF4D,
+	0x400228F5,0xC28F5C29, 0x40235BDA,0x6C6AA323,
+	0x40023D70,0xA3D70A3D, 0x40238DA9,0x0DFCBDB6,
+	0x400251EB,0x851EB852, 0x4023BFF7,0xD4ED5A92,
+	0x40026666,0x66666666, 0x4023F2C8,0x0AEF884D,
+	0x40027AE1,0x47AE147B, 0x4024261A,0xFD069950,
+	0x40028F5C,0x28F5C28F, 0x402459F1,0xFB8EAA38,
+	0x4002A3D7,0x0A3D70A4, 0x40248E4E,0x5A453E51,
+	0x4002B851,0xEB851EB8, 0x4024C331,0x7051F208,
+	0x4002CCCC,0xCCCCCCCD, 0x4024F89C,0x984F43EC,
+	0x4002E147,0xAE147AE1, 0x40252E91,0x3053741D,
+	0x4002F5C2,0x8F5C28F6, 0x40256510,0x99F97ABC,
+	0x40030A3D,0x70A3D70A, 0x40259C1C,0x3A6A153E,
+	0x40031EB8,0x51EB851F, 0x4025D3B5,0x7A64EB33,
+	0x40033333,0x33333333, 0x40260BDD,0xC649CA68,
+	0x400347AE,0x147AE148, 0x40264496,0x8E21FAFC,
+	0x40035C28,0xF5C28F5C, 0x40267DE1,0x45A9AB42,
+	0x400370A3,0xD70A3D71, 0x4026B7BF,0x64597414,
+	0x4003851E,0xB851EB85, 0x4026F232,0x656FF56E,
+	0x40039999,0x9999999A, 0x40272D3B,0xC7FB8BF6,
+	0x4003AE14,0x7AE147AE, 0x402768DD,0x0EE41F51,
+	0x4003C28F,0x5C28F5C3, 0x4027A517,0xC0F509E1,
+	0x4003D70A,0x3D70A3D7, 0x4027E1ED,0x68E719CB,
+	0x4003EB85,0x1EB851EC, 0x40281F5F,0x956AABF2,
+	0x40040000,0x00000000, 0x40285D6F,0xD931E0BB,
+	0x4004147A,0xE147AE14, 0x40289C1F,0xCAFAEB45,
+	0x400428F5,0xC28F5C29, 0x4028DB71,0x059A7B04,
+	0x40043D70,0xA3D70A3D, 0x40291B65,0x2806402E,
+	0x400451EB,0x851EB852, 0x40295BFD,0xD55F8B4D,
+	0x40046666,0x66666666, 0x40299D3C,0xB4FE07FD,
+	0x40047AE1,0x47AE147B, 0x4029DF23,0x727A9378,
+	0x40048F5C,0x28F5C28F, 0x402A21B3,0xBDBA2ECC,
+	0x4004A3D7,0x0A3D70A4, 0x402A64EF,0x4AF90D74,
+	0x4004B851,0xEB851EB8, 0x402AA8D7,0xD2D5C02B,
+	0x4004CCCC,0xCCCCCCCD, 0x402AED6F,0x125C7CB5,
+	0x4004E147,0xAE147AE1, 0x402B32B6,0xCB128270,
+	0x4004F5C2,0x8F5C28F6, 0x402B78B0,0xC3019C73,
+	0x40050A3D,0x70A3D70A, 0x402BBF5E,0xC4C3C10E,
+	0x40051EB8,0x51EB851F, 0x402C06C2,0x9F8ECF68,
+	0x40053333,0x33333333, 0x402C4EDE,0x27406B1D,
+	0x400547AE,0x147AE148, 0x402C97B3,0x3469F697,
+	0x40055C28,0xF5C28F5C, 0x402CE143,0xA45CABFA,
+	0x400570A3,0xD70A3D71, 0x402D2B91,0x5935D56E,
+	0x4005851E,0xB851EB85, 0x402D769E,0x39EB24A0,
+	0x40059999,0x9999999A, 0x402DC26C,0x32572A3E,
+	0x4005AE14,0x7AE147AE, 0x402E0EFD,0x3345ED44,
+	0x4005C28F,0x5C28F5C3, 0x402E5C53,0x3281A2F8,
+	0x4005D70A,0x3D70A3D7, 0x402EAA70,0x2ADF8753,
+	0x4005EB85,0x1EB851EC, 0x402EF956,0x1C4CD6C1,
+	0x40060000,0x00000000, 0x402F4907,0x0BDBE8FD,
+	0x4006147A,0xE147AE14, 0x402F9985,0x03D16DE2,
+	0x400628F5,0xC28F5C29, 0x402FEAD2,0x13B1CC22,
+	0x40063D70,0xA3D70A3D, 0x40301E78,0x28275135,
+	0x400651EB,0x851EB852, 0x403047F0,0xE9EA35AF,
+	0x40066666,0x66666666, 0x403071D4,0x5EEC2242,
+	0x40067AE1,0x47AE147B, 0x40309C23,0x99B2EC67,
+	0x40068F5C,0x28F5C28F, 0x4030C6DF,0xAF86B764,
+	0x4006A3D7,0x0A3D70A4, 0x4030F209,0xB8790D89,
+	0x4006B851,0xEB851EB8, 0x40311DA2,0xCF6C0BA0,
+	0x4006CCCC,0xCCCCCCCD, 0x403149AC,0x12199EE6,
+	0x4006E147,0xAE147AE1, 0x40317626,0xA11AD589,
+	0x4006F5C2,0x8F5C28F6, 0x4031A313,0x9FEF4212,
+	0x40070A3D,0x70A3D70A, 0x4031D074,0x350471BF,
+	0x40071EB8,0x51EB851F, 0x4031FE49,0x89BD761F,
+	0x40073333,0x33333333, 0x40322C94,0xCA7A81FE,
+	0x400747AE,0x147AE148, 0x40325B57,0x26A09A06,
+	0x40075C28,0xF5C28F5C, 0x40328A91,0xD0A15904,
+	0x400770A3,0xD70A3D71, 0x4032BA45,0xFE02C84D,
+	0x4007851E,0xB851EB85, 0x4032EA74,0xE7674C2F,
+	0x40079999,0x9999999A, 0x40331B1F,0xC895A4EB,
+	0x4007AE14,0x7AE147AE, 0x40334C47,0xE081041C,
+	0x4007C28F,0x5C28F5C3, 0x40337DEE,0x71513717,
+	0x4007D70A,0x3D70A3D7, 0x4033B014,0xC06AE622,
+	0x4007EB85,0x1EB851EC, 0x4033E2BC,0x1677E90A,
+	0x40080000,0x00000000, 0x403415E5,0xBF6FB106,
+	0x4008147A,0xE147AE14, 0x40344993,0x0A9FC85A,
+	0x400828F5,0xC28F5C29, 0x40347DC5,0x4AB467CB,
+	0x40083D70,0xA3D70A3D, 0x4034B27D,0xD5C12220,
+	0x400851EB,0x851EB852, 0x4034E7BE,0x0549A60D,
+	0x40086666,0x66666666, 0x40351D87,0x364A9682,
+	0x40087AE1,0x47AE147B, 0x403553DA,0xC94279E3,
+	0x40088F5C,0x28F5C28F, 0x40358ABA,0x223AC012,
+	0x4008A3D7,0x0A3D70A4, 0x4035C226,0xA8D0DFDF,
+	0x4008B851,0xEB851EB8, 0x4035FA21,0xC83F8BB7,
+	0x4008CCCC,0xCCCCCCCD, 0x403632AC,0xEF67FE3D,
+	0x4008E147,0xAE147AE1, 0x40366BC9,0x90DB5E95,
+	0x4008F5C2,0x8F5C28F6, 0x4036A579,0x22E43D0D,
+	0x40090A3D,0x70A3D70A, 0x4036DFBD,0x1F902804,
+	0x40091EB8,0x51EB851F, 0x40371A97,0x04B9599C,
+	0x40093333,0x33333333, 0x40375608,0x54107E2E,
+	0x400947AE,0x147AE148, 0x40379212,0x9326940E,
+	0x40095C28,0xF5C28F5C, 0x4037CEB7,0x4B76E48B,
+	0x400970A3,0xD70A3D71, 0x40380BF8,0x0A7116BF,
+	0x4009851E,0xB851EB85, 0x403849D6,0x61835C2A,
+	0x40099999,0x9999999A, 0x40388853,0xE624B794,
+	0x4009AE14,0x7AE147AE, 0x4038C772,0x31DF5E46,
+	0x4009C28F,0x5C28F5C3, 0x40390732,0xE25B3419,
+	0x4009D70A,0x3D70A3D7, 0x40394797,0x99686251,
+	0x4009EB85,0x1EB851EC, 0x403988A1,0xFD0A09EE,
+	0x400A0000,0x00000000, 0x4039CA53,0xB781114B,
+	0x400A147A,0xE147AE14, 0x403A0CAE,0x77570DB5,
+	0x400A28F5,0xC28F5C29, 0x403A4FB3,0xEF6948FE,
+	0x400A3D70,0xA3D70A3D, 0x403A9365,0xD6F3E365,
+	0x400A51EB,0x851EB852, 0x403AD7C5,0xE99D1243,
+	0x400A6666,0x66666666, 0x403B1CD5,0xE7807B7B,
+	0x400A7AE1,0x47AE147B, 0x403B6297,0x953AAE4F,
+	0x400A8F5C,0x28F5C28F, 0x403BA90C,0xBBF4B98A,
+	0x400AA3D7,0x0A3D70A4, 0x403BF037,0x296FDFAD,
+	0x400AB851,0xEB851EB8, 0x403C3818,0xB0116903,
+	0x400ACCCC,0xCCCCCCCD, 0x403C80B3,0x26EE9453,
+	0x400AE147,0xAE147AE1, 0x403CCA08,0x69D8A616,
+	0x400AF5C2,0x8F5C28F6, 0x403D141A,0x596916ED,
+	0x400B0A3D,0x70A3D70A, 0x403D5EEA,0xDB0DE12F,
+	0x400B1EB8,0x51EB851F, 0x403DAA7B,0xD915EE62,
+	0x400B3333,0x33333333, 0x403DF6CF,0x42BDA468,
+	0x400B47AE,0x147AE148, 0x403E43E7,0x0C3B933A,
+	0x400B5C28,0xF5C28F5C, 0x403E91C5,0x2ECD4305,
+	0x400B70A3,0xD70A3D71, 0x403EE06B,0xA8C42370,
+	0x400B851E,0xB851EB85, 0x403F2FDC,0x7D929BF4,
+	0x400B9999,0x9999999A, 0x403F8019,0xB5D93E09,
+	0x400BAE14,0x7AE147AE, 0x403FD125,0x5F741909,
+	0x400BC28F,0x5C28F5C3, 0x40401180,0xC6C4184F,
+	0x400BD70A,0x3D70A3D7, 0x40403AD8,0x2C488AC8,
+	0x400BEB85,0x1EB851EC, 0x40406499,0xEF3750EC,
+	0x400C0000,0x00000000, 0x40408EC7,0x21396BDB,
+	0x400C147A,0xE147AE14, 0x4040B960,0xD6B7F267,
+	0x400C28F5,0xC28F5C29, 0x4040E468,0x26E32487,
+	0x400C3D70,0xA3D70A3D, 0x40410FDE,0x2BB99109,
+	0x400C51EB,0x851EB852, 0x40413BC4,0x020F4DBB,
+	0x400C6666,0x66666666, 0x4041681A,0xC99541FD,
+	0x400C7AE1,0x47AE147B, 0x404194E3,0xA4E08449,
+	0x400C8F5C,0x28F5C28F, 0x4041C21F,0xB971CA7A,
+	0x400CA3D7,0x0A3D70A4, 0x4041EFD0,0x2FBCED67,
+	0x400CB851,0xEB851EB8, 0x40421DF6,0x33307FA8,
+	0x400CCCCC,0xCCCCCCCD, 0x40424C92,0xF23D7807,
+	0x400CE147,0xAE147AE1, 0x40427BA7,0x9E5EEF8A,
+	0x400CF5C2,0x8F5C28F6, 0x4042AB35,0x6C21F382,
+	0x400D0A3D,0x70A3D70A, 0x4042DB3D,0x932D6BA4,
+	0x400D1EB8,0x51EB851F, 0x40430BC1,0x4E4A148C,
+	0x400D3333,0x33333333, 0x40433CC1,0xDB6A8EA8,
+	0x400D47AE,0x147AE148, 0x40436E40,0x7BB38202,
+	0x400D5C28,0xF5C28F5C, 0x4043A03E,0x7383D6DB,
+	0x400D70A3,0xD70A3D71, 0x4043D2BD,0x0A7D0388,
+	0x400D851E,0xB851EB85, 0x404405BD,0x8B8B6F8F,
+	0x400D9999,0x9999999A, 0x40443941,0x44EEEC81,
+	0x400DAE14,0x7AE147AE, 0x40446D49,0x8843446C,
+	0x400DC28F,0x5C28F5C3, 0x4044A1D7,0xAA88DE86,
+	0x400DD70A,0x3D70A3D7, 0x4044D6ED,0x042D79E9,
+	0x400DEB85,0x1EB851EC, 0x40450C8A,0xF114FEE5,
+	0x400E0000,0x00000000, 0x404542B2,0xD0A266E7,
+	0x400E147A,0xE147AE14, 0x40457966,0x05C0BB62,
+	0x400E28F5,0xC28F5C29, 0x4045B0A5,0xF6EC2BD1,
+	0x400E3D70,0xA3D70A3D, 0x4045E874,0x0E3B3B0A,
+	0x400E51EB,0x851EB852, 0x404620D1,0xB9680458,
+	0x400E6666,0x66666666, 0x404659C0,0x69D9983C,
+	0x400E7AE1,0x47AE147B, 0x40469341,0x94AD7170,
+	0x400E8F5C,0x28F5C28F, 0x4046CD56,0xB2C10218,
+	0x400EA3D7,0x0A3D70A4, 0x40470801,0x40BB59B3,
+	0x400EB851,0xEB851EB8, 0x40474342,0xBF16E3A7,
+	0x400ECCCC,0xCCCCCCCD, 0x40477F1C,0xB22B3F1E,
+	0x400EE147,0xAE147AE1, 0x4047BB90,0xA2372FF6,
+	0x400EF5C2,0x8F5C28F6, 0x4047F8A0,0x1B6AA983,
+	0x400F0A3D,0x70A3D70A, 0x4048364C,0xADF0F2EC,
+	0x400F1EB8,0x51EB851F, 0x40487497,0xEDFAE5D6,
+	0x400F3333,0x33333333, 0x4048B383,0x73C9473C,
+	0x400F47AE,0x147AE148, 0x4048F310,0xDBB73B11,
+	0x400F5C28,0xF5C28F5C, 0x40493341,0xC644D297,
+	0x400F70A3,0xD70A3D71, 0x40497417,0xD821B614,
+	0x400F851E,0xB851EB85, 0x4049B594,0xBA37E9C0,
+	0x400F9999,0x9999999A, 0x4049F7BA,0x19B6AE9A,
+	0x400FAE14,0x7AE147AE, 0x404A3A89,0xA81D7F0D,
+	0x400FC28F,0x5C28F5C3, 0x404A7E05,0x1B472802,
+	0x400FD70A,0x3D70A3D7, 0x404AC22E,0x2D74FE5B,
+	0x400FEB85,0x1EB851EC, 0x404B0706,0x9D5A3169,
+	0x40100000,0x00000000, 0x404B4C90,0x2E273A58,
+	0x40100A3D,0x70A3D70A, 0x404B92CC,0xA795693B,
+	0x4010147A,0xE147AE14, 0x404BD9BD,0xD5F28FA1,
+	0x40101EB8,0x51EB851F, 0x404C2165,0x8A2CC94E,
+	0x401028F5,0xC28F5C29, 0x404C69C5,0x99DE631E,
+	0x40103333,0x33333333, 0x404CB2DF,0xDF59E0CA,
+	0x40103D70,0xA3D70A3D, 0x404CFCB6,0x39B62159,
+	0x401047AE,0x147AE148, 0x404D474A,0x8CDAA2F8,
+	0x401051EB,0x851EB852, 0x404D929E,0xC18BE631,
+	0x40105C28,0xF5C28F5C, 0x404DDEB4,0xC577F152,
+	0x40106666,0x66666666, 0x404E2B8E,0x8B42F3B6,
+	0x401070A3,0xD70A3D71, 0x404E792E,0x0A9409BD,
+	0x40107AE1,0x47AE147B, 0x404EC795,0x40222178,
+	0x4010851E,0xB851EB85, 0x404F16C6,0x2DC100C3,
+	0x40108F5C,0x28F5C28F, 0x404F66C2,0xDA6E6C99,
+	0x40109999,0x9999999A, 0x404FB78D,0x525F726F,
+	0x4010A3D7,0x0A3D70A4, 0x40500493,0xD386E9C7,
+	0x4010AE14,0x7AE147AE, 0x40502DC9,0xF7A2C99F,
+	0x4010B851,0xEB851EB8, 0x4050576A,0x239953C7,
+	0x4010C28F,0x5C28F5C3, 0x40508175,0x683766BB,
+	0x4010CCCC,0xCCCCCCCD, 0x4050ABEC,0xD907C034,
+	0x4010D70A,0x3D70A3D7, 0x4050D6D1,0x8C5A0B0E,
+	0x4010E147,0xAE147AE1, 0x40510224,0x9B49FF2F,
+	0x4010EB85,0x1EB851EC, 0x40512DE7,0x21C693D2,
+	0x4010F5C2,0x8F5C28F6, 0x40515A1A,0x3E99444B,
+	0x40110000,0x00000000, 0x405186BF,0x136D679D,
+	0x40110A3D,0x70A3D70A, 0x4051B3D6,0xC4D79ACF,
+	0x4011147A,0xE147AE14, 0x4051E162,0x7A5D3E69,
+	0x40111EB8,0x51EB851F, 0x40520F63,0x5E7C0733,
+	0x401128F5,0xC28F5C29, 0x40523DDA,0x9EB1A260,
+	0x40113333,0x33333333, 0x40526CC9,0x6B836D7D,
+	0x40113D70,0xA3D70A3D, 0x40529C30,0xF8864221,
+	0x401147AE,0x147AE148, 0x4052CC12,0x7C6655BC,
+	0x401151EB,0x851EB852, 0x4052FC6F,0x30EF2D8B,
+	0x40115C28,0xF5C28F5C, 0x40532D48,0x5313A73C,
+	0x40116666,0x66666666, 0x40535E9F,0x22F61600,
+	0x401170A3,0xD70A3D71, 0x40539074,0xE3F074A9,
+	0x40117AE1,0x47AE147B, 0x4053C2CA,0xDC9CACB0,
+	0x4011851E,0xB851EB85, 0x4053F5A2,0x56DCF2C8,
+	0x40118F5C,0x28F5C28F, 0x405428FC,0x9FE438B9,
+	0x40119999,0x9999999A, 0x40545CDB,0x083EB514,
+	0x4011A3D7,0x0A3D70A4, 0x4054913E,0xE3DA80C1,
+	0x4011AE14,0x7AE147AE, 0x4054C629,0x8A104AE3,
+	0x4011B851,0xEB851EB8, 0x4054FB9C,0x55AC22F0,
+	0x4011C28F,0x5C28F5C3, 0x40553198,0xA4F65988,
+	0x4011CCCC,0xCCCCCCCD, 0x4055681F,0xD9BC77FE,
+	0x4011D70A,0x3D70A3D7, 0x40559F33,0x595A4F2F,
+	0x4011E147,0xAE147AE1, 0x4055D6D4,0x8CC31D6A,
+	0x4011EB85,0x1EB851EC, 0x40560F04,0xE08ACC09,
+	0x4011F5C2,0x8F5C28F6, 0x405647C5,0xC4EF44AC,
+	0x40120000,0x00000000, 0x40568118,0xADE1DEAA,
+	0x40120A3D,0x70A3D70A, 0x4056BAFF,0x1310E498,
+	0x4012147A,0xE147AE14, 0x4056F57A,0x6FF1325D,
+	0x40121EB8,0x51EB851F, 0x4057308C,0x43C7EC0F,
+	0x401228F5,0xC28F5C29, 0x40576C36,0x11B44DAC,
+	0x40123333,0x33333333, 0x4057A879,0x60B9944F,
+	0x40123D70,0xA3D70A3D, 0x4057E557,0xBBC900A6,
+	0x401247AE,0x147AE148, 0x405822D2,0xB1CBF352,
+	0x401251EB,0x851EB852, 0x405860EB,0xD5AE2320,
+	0x40125C28,0xF5C28F5C, 0x40589FA4,0xBE67EDC9,
+	0x40126666,0x66666666, 0x4058DEFF,0x0708C2FF,
+	0x401270A3,0xD70A3D71, 0x40591EFC,0x4EC1AA6A,
+	0x40127AE1,0x47AE147B, 0x40595F9E,0x38EFE497,
+	0x4012851E,0xB851EB85, 0x4059A0E6,0x6D27A779,
+	0x40128F5C,0x28F5C28F, 0x4059E2D6,0x973EF64F,
+	0x40129999,0x9999999A, 0x405A2570,0x67589596,
+	0x4012A3D7,0x0A3D70A4, 0x405A68B5,0x91EF1AFE,
+	0x4012AE14,0x7AE147AE, 0x405AACA7,0xCFE01A19,
+	0x4012B851,0xEB851EB8, 0x405AF148,0xDE776D8B,
+	0x4012C28F,0x5C28F5C3, 0x405B369A,0x7F7A9D67,
+	0x4012CCCC,0xCCCCCCCD, 0x405B7C9E,0x793462BB,
+	0x4012D70A,0x3D70A3D7, 0x405BC356,0x968048FC,
+	0x4012E147,0xAE147AE1, 0x405C0AC4,0xA6D66D21,
+	0x4012EB85,0x1EB851EC, 0x405C52EA,0x7E575B17,
+	0x4012F5C2,0x8F5C28F6, 0x405C9BC9,0xF5D80998,
+	0x40130000,0x00000000, 0x405CE564,0xEAEDF51C,
+	0x40130A3D,0x70A3D70A, 0x405D2FBD,0x3FFB59AA,
+	0x4013147A,0xE147AE14, 0x405D7AD4,0xDC3B8C3D,
+	0x40131EB8,0x51EB851F, 0x405DC6AD,0xABCF73F4,
+	0x401328F5,0xC28F5C29, 0x405E1349,0x9FCA232E,
+	0x40133333,0x33333333, 0x405E60AA,0xAE3D9163,
+	0x40133D70,0xA3D70A3D, 0x405EAED2,0xD2477568,
+	0x401347AE,0x147AE148, 0x405EFDC4,0x0C1E40F5,
+	0x401351EB,0x851EB852, 0x405F4D80,0x611E3D66,
+	0x40135C28,0xF5C28F5C, 0x405F9E09,0xDBD6CA7E,
+	0x40136666,0x66666666, 0x405FEF62,0x8C17BEFD,
+	0x401370A3,0xD70A3D71, 0x406020C6,0x437F75E2,
+	0x40137AE1,0x47AE147B, 0x40604A44,0xF382E0C9,
+	0x4013851E,0xB851EB85, 0x4060742E,0x66078D17,
+	0x40138F5C,0x28F5C28F, 0x40609E83,0xADBA925B,
+	0x40139999,0x9999999A, 0x4060C945,0xE00BBAFC,
+	0x4013A3D7,0x0A3D70A4, 0x4060F476,0x15349E61,
+	0x4013AE14,0x7AE147AE, 0x40612015,0x683FCD86,
+	0x4013B851,0xEB851EB8, 0x40614C24,0xF71011E5,
+	0x4013C28F,0x5C28F5C3, 0x406178A5,0xE267BF15,
+	0x4013CCCC,0xCCCCCCCD, 0x4061A599,0x4DF01723,
+	0x4013D70A,0x3D70A3D7, 0x4061D300,0x6040C226,
+	0x4013E147,0xAE147AE1, 0x406200DC,0x42E758CC,
+	0x4013EB85,0x1EB851EC, 0x40622F2E,0x226F027B,
+	0x4013F5C2,0x8F5C28F6, 0x40625DF7,0x2E6826E3,
+	0x40140000,0x00000000, 0x40628D38,0x9970338F,
+	0x3FE00000,0x00000000, 0x3FFA6129,0x8E1E069C,
+	0x3FF00000,0x00000000, 0x4005BF0A,0x8B145769,
+	0x3FF80000,0x00000000, 0x4011ED3F,0xE64FC541,
+	0x40000000,0x00000000, 0x401D8E64,0xB8D4DDAE,
+	0x40040000,0x00000000, 0x40285D6F,0xD931E0BB,
+	0x40080000,0x00000000, 0x403415E5,0xBF6FB106,
+	0x400C0000,0x00000000, 0x40408EC7,0x21396BDB,
+	0x40100000,0x00000000, 0x404B4C90,0x2E273A58,
+	0x40120000,0x00000000, 0x40568118,0xADE1DEAA,
+	0x40140000,0x00000000, 0x40628D38,0x9970338F,
+	0x40160000,0x00000000, 0x406E9624,0x4F21BBF6,
+	0x40180000,0x00000000, 0x407936DC,0x5690C08F,
+	0x401A0000,0x00000000, 0x4084C922,0x10816C89,
+	0x401C0000,0x00000000, 0x40912288,0x5AAEDDAA,
+	0x401E0000,0x00000000, 0x409C402B,0x6EB1F6AD,
+	0x40200000,0x00000000, 0x40A749EA,0x7D470C6E,
+	0x40210000,0x00000000, 0x40B332C4,0xD2B7C4A1,
+	0x40220000,0x00000000, 0x40BFA715,0x7C470F82,
+	0x40230000,0x00000000, 0x40CA17DD,0x08C11DC1,
+	0x40240000,0x00000000, 0x40D5829D,0xCF950560,
+	0x40250000,0x00000000, 0x40E1BB70,0x15E84D3B,
+	0x40260000,0x00000000, 0x40ED3C44,0x88EE4F7F,
+	0x40270000,0x00000000, 0x40F819BC,0x560F6113,
+	0x40280000,0x00000000, 0x4103DE16,0x54D37C9A,
+	0x40290000,0x00000000, 0x411060C5,0x2565BA66,
+	0x402A0000,0x00000000, 0x411B00B5,0x916AC955,
+	0x402B0000,0x00000000, 0x41264290,0xBD5CAD8B,
+	0x402C0000,0x00000000, 0x413259AC,0x48BF05D7,
+	0x402D0000,0x00000000, 0x413E4127,0x437732B7,
+	0x402E0000,0x00000000, 0x4148F0CC,0xAFAD2A87,
+	0x402F0000,0x00000000, 0x41548F60,0x9E7B6BBE,
+	0x40300000,0x00000000, 0x4160F2EB,0xD0A80020,
+	0x40308000,0x00000000, 0x416BF1AB,0xEDB9FCBA,
+	0x40310000,0x00000000, 0x41770934,0x8C0EA4F9,
+	0x40318000,0x00000000, 0x4182FD6C,0x832E3C72,
+	0x40320000,0x00000000, 0x418F4F22,0x091940BD,
+	0x40328000,0x00000000, 0x4199CF5C,0x2F003C7E,
+	0x40330000,0x00000000, 0x41A546D8,0xF9ED26E1,
+	0x40338000,0x00000000, 0x41B18A2A,0xAE0AA052,
+	0x40340000,0x00000000, 0x41BCEB08,0x8B68E804,
+	0x40348000,0x00000000, 0x41C7D6C4,0xF0BCDD5C,
+	0x40350000,0x00000000, 0x41D3A6E1,0xFD9EECFD,
+	0x40358000,0x00000000, 0x41E03343,0x00327298,
+	0x40360000,0x00000000, 0x41EAB5AD,0xB9C43600,
+	0x40368000,0x00000000, 0x41F604B6,0x8CF05F66,
+	0x40370000,0x00000000, 0x420226AF,0x33B1FDC1,
+	0x40378000,0x00000000, 0x420DED16,0x5E84FAD6,
+	0x40380000,0x00000000, 0x4218AB7F,0xB5475FB7,
+	0x40388000,0x00000000, 0x4224563F,0xA7B34AF7,
+	0x40390000,0x00000000, 0x4230C3D3,0x920962C9,
+	0x40398000,0x00000000, 0x423BA406,0x8AAC2B6E,
+	0x403A0000,0x00000000, 0x4246C932,0x696A6B5D,
+	0x403A8000,0x00000000, 0x4252C8A8,0x6D70C9E9,
+	0x403B0000,0x00000000, 0x425EF822,0xF7F6731D,
+	0x403B8000,0x00000000, 0x426987A4,0xCAEED87A,
+	0x403C0000,0x00000000, 0x42750BBA,0x3796379A,
+	0x403C8000,0x00000000, 0x4281596E,0x2E20ED6C,
+	0x403D0000,0x00000000, 0x428C9AAE,0x4631C056,
+	0x403D8000,0x00000000, 0x42979487,0x9E85B948,
+	0x403E0000,0x00000000, 0x42A37047,0x0AEC28ED,
+	0x403E8000,0x00000000, 0x42B0063F,0x4E687BA2,
+	0x403F0000,0x00000000, 0x42BA6B76,0x5D8CDF6D,
+	0x403F8000,0x00000000, 0x42C5C788,0x39D357DD,
+	0x40400000,0x00000000, 0x42D1F43F,0xCC4B662C,
+	0x40404000,0x00000000, 0x42DD99EF,0x101DF23C,
+	0x40408000,0x00000000, 0x42E866F3,0x4A725782,
+	0x4040C000,0x00000000, 0x42F41DBD,0x6E3E063E,
+	0x40410000,0x00000000, 0x4300953E,0x2F3A1EF7,
+	0x40414000,0x00000000, 0x430B5738,0xE777C243,
+	0x40418000,0x00000000, 0x431689E2,0x21BC8D5B,
+	0x4041C000,0x00000000, 0x43229476,0xF5A23301,
+	0x40420000,0x00000000, 0x432EA215,0xA1D20D76,
+	0x40424000,0x00000000, 0x433940B4,0xACC4E544,
+	0x40428000,0x00000000, 0x4344D13F,0xBB1A001A,
+	0x4042C000,0x00000000, 0x43512939,0x19C201E5,
+	0x40430000,0x00000000, 0x435C4B33,0x4617CC67,
+	0x40434000,0x00000000, 0x43675302,0x5A61BFE5,
+	0x40438000,0x00000000, 0x43733A43,0xD282A519,
+	0x4043C000,0x00000000, 0x437FB371,0x61577EDD,
+	0x40440000,0x00000000, 0x438A220D,0x397972EB,
+	0x40444000,0x00000000, 0x43958B03,0xE6797728,
+	0x40448000,0x00000000, 0x43A1C25C,0x88DF6862,
+	0x4044C000,0x00000000, 0x43AD47AE,0xCF343BC7,
+	0x40450000,0x00000000, 0x43B82325,0x58201159,
+	0x40454000,0x00000000, 0x43C3E5D8,0x3907A3DC,
+	0x40458000,0x00000000, 0x43D0672A,0x3C9EB871,
+	0x4045C000,0x00000000, 0x43DB0B40,0xACA0085D,
+	0x40460000,0x00000000, 0x43E64B41,0xC6D37832,
+	0x40464000,0x00000000, 0x43F260D6,0x845DA877,
+	0x40468000,0x00000000, 0x43FE4CF7,0x66FE49BE,
+	0x4046C000,0x00000000, 0x4408FA89,0xAACDC2F3,
+	0x40470000,0x00000000, 0x44149767,0xBC0483E3,
+	0x40474000,0x00000000, 0x4420F989,0xF8A5B043,
+	0x40478000,0x00000000, 0x442BFC95,0x1EB8BB76,
+	0x4047C000,0x00000000, 0x44371233,0x24E55FF0,
+	0x40480000,0x00000000, 0x444304D6,0xAECA254B,
+	0x40484000,0x00000000, 0x444F5B5B,0x96E0E83F,
+	0x40488000,0x00000000, 0x4459D970,0x10884251,
+	0x4048C000,0x00000000, 0x44654F27,0xBA858A92,
+	0x40490000,0x00000000, 0x44719103,0xE4080B45,
+	0x40494000,0x00000000, 0x447CF653,0x19C5751A,
+	0x40498000,0x00000000, 0x4487E013,0xCD114461,
+	0x4049C000,0x00000000, 0x4493AE8E,0x53C5C183,
+	0x404A0000,0x00000000, 0x44A03996,0x528E074C,
+	0x404A4000,0x00000000, 0x44AAC01B,0x892A053E,
+	0x404A8000,0x00000000, 0x44B60D4F,0x6FDAC731,
+	0x404AC000,0x00000000, 0x44C22DC5,0x86AA59DC,
+	0x404B0000,0x00000000, 0x44CDF8C5,0xAF17BA3B,
+	0x404B4000,0x00000000, 0x44D8B521,0xA1575C36,
+	0x404B8000,0x00000000, 0x44E45E30,0x76D61699,
+	0x404BC000,0x00000000, 0x44F0CA5F,0x56995724,
+	0x404C0000,0x00000000, 0x44FBAED1,0x6A6E0DA7,
+	0x404C4000,0x00000000, 0x4506D218,0x043213F2,
+	0x404C8000,0x00000000, 0x4512CFFD,0xFEBDE1A1,
+	0x404CC000,0x00000000, 0x451F043A,0x8DE1068B,
+	0x404D0000,0x00000000, 0x4529919C,0xABEFCB69,
+	0x404D4000,0x00000000, 0x453513F1,0xE2BAE577,
+	0x404D8000,0x00000000, 0x45416034,0x5C9953E3,
+	0x404DC000,0x00000000, 0x454CA5D9,0x74C7236B,
+	0x404E0000,0x00000000, 0x45579DBC,0x9DC53C66,
+	0x404E4000,0x00000000, 0x456377DE,0x0EEA46D4,
+	0x404E8000,0x00000000, 0x45700C81,0x0D464097,
+	0x404EC000,0x00000000, 0x457A75C7,0x328A6C4A,
+	0x404F0000,0x00000000, 0x4585D009,0x394C5C27,
+	0x404F4000,0x00000000, 0x4591FB42,0x6DEF2C39,
+	0x404F8000,0x00000000, 0x459DA57D,0xE8F107A8,
+	0x404FC000,0x00000000, 0x45A8707A,0x72A1734B,
+	0x40500000,0x00000000, 0x45B42598,0x2CF597CD,
+	0x40502000,0x00000000, 0x45C09BB7,0xC3748815,
+	0x40504000,0x00000000, 0x45CB61E5,0xCA3A5E31,
+	0x40506000,0x00000000, 0x45D692AF,0x03E6F5B0,
+	0x40508000,0x00000000, 0x45E29BB8,0x25DFCF87,
+	0x4050A000,0x00000000, 0x45EEAE0B,0x9E421D1C,
+	0x4050C000,0x00000000, 0x45F94A90,0xDB0D6FE2,
+	0x4050E000,0x00000000, 0x4604D960,0x90EF2239,
+	0x40510000,0x00000000, 0x46112FEC,0x759586FD,
+	0x40512000,0x00000000, 0x461C563F,0x6C1356B4,
+	0x40514000,0x00000000, 0x46275C1D,0xC469E3AF,
+	0x40516000,0x00000000, 0x463341C5,0xBF963CE7,
+	0x40518000,0x00000000, 0x463FBFD2,0x19C43B04,
+	0x4051A000,0x00000000, 0x464A2C41,0x6493BA80,
+	0x4051C000,0x00000000, 0x4655936D,0x44E1A146,
+	0x4051E000,0x00000000, 0x4661C94B,0xAFE692C7,
+	0x40520000,0x00000000, 0x466D531D,0x8A7EE79C,
+	0x40522000,0x00000000, 0x46782C92,0x06CD1D60,
+	0x40524000,0x00000000, 0x4683ED9D,0x24A2D51B,
+	0x40526000,0x00000000, 0x46906D91,0xD30DCDE0,
+	0x40528000,0x00000000, 0x469B15CF,0xE5B6E17B,
+	0x4052A000,0x00000000, 0x46A653F6,0x35117C78,
+	0x4052C000,0x00000000, 0x46B26803,0x8C2C0E00,
+	0x4052E000,0x00000000, 0x46BE58CC,0x27502323,
+	0x40530000,0x00000000, 0x46C9044A,0x73545D48,
+	0x40532000,0x00000000, 0x46D49F71,0xFBFC0AD9,
+	0x40534000,0x00000000, 0x46E1002A,0xB6218B38,
+	0x40536000,0x00000000, 0x46EC0782,0x925582B3,
+	0x40538000,0x00000000, 0x46F71B35,0x40CBF921,
+	0x4053A000,0x00000000, 0x47030C43,0xBF8CCA52,
+	0x4053C000,0x00000000, 0x470F6799,0xEA9C414A,
+	0x4053E000,0x00000000, 0x4719E387,0xE16485E8,
+	0x40540000,0x00000000, 0x47255779,0xB984F3EB,
+	0x40542000,0x00000000, 0x473197DF,0xC6928977,
+	0x40544000,0x00000000, 0x473D01A2,0x10C44AA4,
+	0x40546000,0x00000000, 0x4747E966,0x4BCC6BD3,
+	0x40548000,0x00000000, 0x4753B63D,0xA8E91210,
+	0x4054A000,0x00000000, 0x47603FEC,0x1D2F9220,
+	0x4054C000,0x00000000, 0x476ACA8D,0x6B0116B8,
+	0x4054E000,0x00000000, 0x477615EB,0xAE1E65D3,
+	0x40550000,0x00000000, 0x478234DE,0x9E0C74E9,
+	0x40552000,0x00000000, 0x478E0479,0x8FA440E0,
+	0x40554000,0x00000000, 0x4798BEC7,0x503CA477,
+	0x40556000,0x00000000, 0x47A46624,0x5FB1A8AC,
+	0x40558000,0x00000000, 0x47B0D0ED,0xA9796B90,
+	0x4055A000,0x00000000, 0x47BBB9A0,0x80F78D1D,
+	0x4055C000,0x00000000, 0x47C6DB01,0x18477245,
+	0x4055E000,0x00000000, 0x47D2D756,0x6D26536B,
+	0x40560000,0x00000000, 0x47DF1056,0xDC7BF22D,
+	0x40562000,0x00000000, 0x47E99B98,0x7155FE28,
+	0x40564000,0x00000000, 0x47F51C2C,0xC3433801,
+	0x40566000,0x00000000, 0x480166FD,0x3030B0D9,
+	0x40568000,0x00000000, 0x480CB108,0xFFBEC164,
+	0x4056A000,0x00000000, 0x4817A6F5,0x355242DC,
+	0x4056C000,0x00000000, 0x48237F78,0x0991B584,
+	0x4056E000,0x00000000, 0x483012C5,0x3D8D219E,
+	0x40570000,0x00000000, 0x483A801C,0x0EA8AC4D,
+	0x40572000,0x00000000, 0x4845D88D,0x8ACAC826,
+	0x40574000,0x00000000, 0x48520247,0xCC4C46C1,
+	0x40576000,0x00000000, 0x485DB111,0x451085D5,
+	0x40578000,0x00000000, 0x48687A05,0x53328015,
+	0x4057A000,0x00000000, 0x48742D75,0xFCC87AD2,
+	0x4057C000,0x00000000, 0x4880A233,0xDEE4F9BB,
+	0x4057E000,0x00000000, 0x488B6C96,0xD80F107F,
+	0x40580000,0x00000000, 0x48969B7F,0x55B808BA,
+	0x40582000,0x00000000, 0x48A2A2FC,0x2B43BE44,
+	0x40584000,0x00000000, 0x48AEBA06,0x4644060A,
+	0x40586000,0x00000000, 0x48B95470,0xE2EA9DB8,
+	0x40588000,0x00000000, 0x48C4E184,0x933D9364,
+	0x4058A000,0x00000000, 0x48D136A2,0x6F2E8B18,
+	0x4058C000,0x00000000, 0x48DC614F,0xE2531841,
+	0x4058E000,0x00000000, 0x48E7653C,0xBCC25D25,
+	0x40590000,0x00000000, 0x48F3494A,0x9B171BF5,
+	0x40592000,0x00000000, 0x48FFCC37,0xA76F9E76,
+	0x40594000,0x00000000, 0x490A3679,0x8B9D969B,
+	0x40596000,0x00000000, 0x49159BD9,0xEC154EC8,
+	0x40598000,0x00000000, 0x4921D03D,0x8C0C04AF,
+	0x4059A000,0x00000000, 0x492D5E90,0xBC8BD761,
+	0x4059C000,0x00000000, 0x49383602,0x6385C974,
+	0x4059E000,0x00000000, 0x4943F565,0x18D3D2F8,
+	0x405A0000,0x00000000, 0x495073FB,0xE9AC901D,
+	0x405A2000,0x00000000, 0x495B2063,0x3E4AD321,
+	0x405A4000,0x00000000, 0x49665CAE,0x0969F286,
+	0x405A6000,0x00000000, 0x49726F33,0x6141DA0F,
+	0x405A8000,0x00000000, 0x497E64A5,0x8639CAE8,
+	0x405AA000,0x00000000, 0x49890E0F,0x0ABD0B2B,
+	0x405AC000,0x00000000, 0x4994A77F,0x5F9B50F9,
+	0x405AE000,0x00000000, 0x49A106CE,0x0A1DD99B,
+	0x405B0000,0x00000000, 0x49AC1274,0x4A3A28E3,
+	0x405B2000,0x00000000, 0x49B7243A,0xE1217BC2,
+	0x405B4000,0x00000000, 0x49C313B3,0xB6978E85,
+	0x405B6000,0x00000000, 0x49CF73DD,0x06286A13,
+	0x405B8000,0x00000000, 0x49D9EDA3,0xA31E587E,
+	0x405BA000,0x00000000, 0x49E55FCE,0xF82F9F2A,
+	0x405BC000,0x00000000, 0x49F19EBE,0x56B56453,
+	0x405BE000,0x00000000, 0x49FD0CF5,0x721E1715,
+	0x405C0000,0x00000000, 0x4A07F2BC,0x6E599B7E,
+	0x405C2000,0x00000000, 0x4A13BDEF,0xFE345805,
+	0x405C4000,0x00000000, 0x4A204644,0x610DF2FF,
+	0x405C6000,0x00000000, 0x4A2AD503,0x60E07179,
+	0x405C8000,0x00000000, 0x4A361E8B,0x490AC4E6,
+	0x405CA000,0x00000000, 0x4A423BFA,0x7AECE97D,
+	0x405CC000,0x00000000, 0x4A4E1032,0x01F299B3,
+	0x405CE000,0x00000000, 0x4A58C870,0xC36F2A0F,
+	0x405D0000,0x00000000, 0x4A646E1B,0x637BEAF5,
+	0x405D2000,0x00000000, 0x4A70D77E,0x8BA91AFA,
+	0x405D4000,0x00000000, 0x4A7BC473,0xCFEDE104,
+	0x405D6000,0x00000000, 0x4A86E3ED,0xA705C221,
+	0x405D8000,0x00000000, 0x4A92DEB1,0xB9C85E2D,
+	0x405DA000,0x00000000, 0x4A9F1C77,0xE59F267F,
+	0x405DC000,0x00000000, 0x4AA9A598,0x1CA67D10,
+	0x405DE000,0x00000000, 0x4AB5246A,0xDA6FE687,
+	0x405E0000,0x00000000, 0x4AC16DC8,0xA9EF670B,
+	0x405E2000,0x00000000, 0x4ACCBC3C,0xE8CC8037,
+	0x405E4000,0x00000000, 0x4AD7B031,0x66942309,
+	0x405E6000,0x00000000, 0x4AE38714,0xFC0AAE39,
+	0x405E8000,0x00000000, 0x4AF0190B,0xE03150A7,
+	0x405EA000,0x00000000, 0x4AFA8A74,0xF37A3B89,
+	0x405EC000,0x00000000, 0x4B05E115,0x2F9A8119,
+	0x405EE000,0x00000000, 0x4B12094F,0xE8744FC6,
+	0x405F0000,0x00000000, 0x4B1DBCA9,0x263F8487,
+	0x405F2000,0x00000000, 0x4B288393,0xED995AD5,
+	0x405F4000,0x00000000, 0x4B343556,0xDEE93BEE,
+	0x405F6000,0x00000000, 0x4B40A8B2,0x828828F5,
+	0x405F8000,0x00000000, 0x4B4B774C,0x12967DFA,
+	0x405FA000,0x00000000, 0x4B56A453,0x18873D6F,
+	0x405FC000,0x00000000, 0x4B62AA43,0x06E922C2,
+	0x405FE000,0x00000000, 0x4B6EC605,0x9BAA9964,
+	0x40600000,0x00000000, 0x4B795E54,0xC5DD4217,
+	0x40601000,0x00000000, 0x4B84E9AB,0xC3428FC2,
+	0x40602000,0x00000000, 0x4B913D5B,0x07929253,
+	0x40603000,0x00000000, 0x4B9C6C64,0xAA863BD3,
+	0x40604000,0x00000000, 0x4BA76E5F,0x44CE9C2F,
+	0x40605000,0x00000000, 0x4BB350D2,0x662A4469,
+	0x40606000,0x00000000, 0x4BBFD8A2,0x0C3CC006,
+	0x40607000,0x00000000, 0x4BCA40B5,0xB025449B,
+	0x40608000,0x00000000, 0x4BD5A449,0xDD5CCAB9,
+	0x40609000,0x00000000, 0x4BE1D732,0x1E5E5FE0,
+	0x4060A000,0x00000000, 0x4BED6A08,0x67193D6C,
+	0x4060B000,0x00000000, 0x4BF83F76,0x6FB9E947,
+	0x4060C000,0x00000000, 0x4C03FD30,0x16C9D64C,
+	0x4060D000,0x00000000, 0x4C107A68,0x8174F605,
+	0x4060E000,0x00000000, 0x4C1B2AFA,0xB7F7FC66,
+	0x4060F000,0x00000000, 0x4C266569,0x453096F6,
+	0x40610000,0x00000000, 0x4C327666,0x04B71D6D,
+	0x40611000,0x00000000, 0x4C3E7083,0x85890112,
+	0x40612000,0x00000000, 0x4C4917D7,0x728472A7,
+	0x40613000,0x00000000, 0x4C54AF8F,0xE81C20F2,
+	0x40614000,0x00000000, 0x4C610D73,0xF59D48DF,
+	0x40615000,0x00000000, 0x4C6C1D6A,0x48112ABF,
+	0x40616000,0x00000000, 0x4C772D44,0x07457C1D,
+	0x40617000,0x00000000, 0x4C831B26,0x950C45E2,
+	0x40618000,0x00000000, 0x4C8F8024,0xEB633B1D,
+	0x40619000,0x00000000, 0x4C99F7C3,0x573FA4E3,
+	0x4061A000,0x00000000, 0x4CA56827,0x77CA4725,
+	0x4061B000,0x00000000, 0x4CB1A59F,0x957C4DA5,
+	0x4061C000,0x00000000, 0x4CBD184D,0x3F8C34F5,
+	0x4061D000,0x00000000, 0x4CC7FC16,0x3624A908,
+	0x4061E000,0x00000000, 0x4CD3C5A5,0x54D381AF,
+	0x4061F000,0x00000000, 0x4CE04C9F,0x1F206A37,
+	0x40620000,0x00000000, 0x4CEADF7D,0x6C5FBB7A,
+	0x40621000,0x00000000, 0x4CF6272E,0x41EFF102,
+	0x40622000,0x00000000, 0x4D024319,0x1E60BE32,
+	0x40623000,0x00000000, 0x4D0E1BEF,0x07CB81B3,
+	0x40624000,0x00000000, 0x4D18D21D,0xFC67715A,
+	0x40625000,0x00000000, 0x4D247615,0x836B4039,
+	0x40626000,0x00000000, 0x4D30DE11,0xFE284410,
+	0x40627000,0x00000000, 0x4D3BCF4B,0x58F6E506,
+	0x40628000,0x00000000, 0x4D46ECDD,0xB1C8C6E7,
+	0x40629000,0x00000000, 0x4D52E60F,0xE5C2B091,
+	0x4062A000,0x00000000, 0x4D5F289D,0xAB234C40,
+	0x4062B000,0x00000000, 0x4D69AF9B,0xAF66EC63,
+	0x4062C000,0x00000000, 0x4D752CAC,0x29822593,
+	0x4062D000,0x00000000, 0x4D817496,0xCADE4071,
+	0x4062E000,0x00000000, 0x4D8CC775,0x31A4F011,
+	0x4062F000,0x00000000, 0x4D97B971,0x32F2BF9C,
+	0x40630000,0x00000000, 0x4DA38EB4,0xE77DDDDD,
+	0x40631000,0x00000000, 0x4DB01F54,0xF6275EFD,
+	0x40632000,0x00000000, 0x4DBA94D1,0xE2925340,
+	0x40633000,0x00000000, 0x4DC5E9A0,0x2907EDDB,
+	0x40634000,0x00000000, 0x4DD2105A,0xC3794C20,
+	0x40635000,0x00000000, 0x4DDDC845,0x8E41CB9F,
+	0x40636000,0x00000000, 0x4DE88D26,0x434A71B6,
+	0x40637000,0x00000000, 0x4DF43D3A,0xD48ADF74,
+	0x40638000,0x00000000, 0x4E00AF33,0xAF5B2D7A,
+	0x40639000,0x00000000, 0x4E0B8205,0x7B71EE1D,
+	0x4063A000,0x00000000, 0x4E16AD2A,0x4DAC90E3,
+	0x4063B000,0x00000000, 0x4E22B18C,0xB9EB8F14,
+	0x4063C000,0x00000000, 0x4E2ED209,0xA0495E91,
+	0x4063D000,0x00000000, 0x4E39683C,0x8566C699,
+	0x4063E000,0x00000000, 0x4E44F1D6,0x223BCF5A,
+	0x4063F000,0x00000000, 0x4E514416,0x3FC786E6,
+	0x40640000,0x00000000, 0x4E5C777D,0xC65C9488,
+	0x40641000,0x00000000, 0x4E677785,0x5DF29B7F,
+	0x40642000,0x00000000, 0x4E73585D,0x21F52AD4,
+	0x40643000,0x00000000, 0x4E7FE511,0x4A0F7329,
+	0x40644000,0x00000000, 0x4E8A4AF5,0xD3B99D59,
+	0x40645000,0x00000000, 0x4E95ACBD,0x1A00E054,
+	0x40646000,0x00000000, 0x4EA1DE29,0x67ECAFCC,
+	0x40647000,0x00000000, 0x4EAD7584,0x8BE5FA4C,
+	0x40648000,0x00000000, 0x4EB848EE,0x2CD9E02A,
+	0x40649000,0x00000000, 0x4EC404FE,0x1FB48E53,
+	0x4064A000,0x00000000, 0x4ED080D7,0x9B61580F,
+	0x4064B000,0x00000000, 0x4EDB3596,0x545B1D51,
+	0x4064C000,0x00000000, 0x4EE66E27,0xE9B9AB09,
+	0x4064D000,0x00000000, 0x4EF27D9B,0x77A45640,
+	0x4064E000,0x00000000, 0x4EFE7C66,0x270C39F4,
+	0x4064F000,0x00000000, 0x4F0921A3,0xAC27CE67,
+	0x40650000,0x00000000, 0x4F14B7A3,0x96B8BFF6,
+	0x40651000,0x00000000, 0x4F21141C,0x79A2EB78,
+	0x40652000,0x00000000, 0x4F2C2864,0x8D85AB83,
+	0x40653000,0x00000000, 0x4F373650,0xB49817C0,
+	0x40654000,0x00000000, 0x4F43229C,0x5C0D358F,
+	0x40655000,0x00000000, 0x4F4F8C71,0x9C2B477D,
+	0x40656000,0x00000000, 0x4F5A01E6,0xFF52EFB1,
+	0x40657000,0x00000000, 0x4F657083,0x399A257D,
+	0x40658000,0x00000000, 0x4F71AC83,0x83F35FBD,
+	0x40659000,0x00000000, 0x4F7D23A9,0x7AC8AB1E,
+	0x4065A000,0x00000000, 0x4F880573,0xA499F824,
+	0x4065B000,0x00000000, 0x4F93CD5D,0xADF2F278,
+	0x4065C000,0x00000000, 0x4FA052FC,0x585E98A2,
+	0x4065D000,0x00000000, 0x4FAAE9FB,0x8F1739DF,
+	0x4065E000,0x00000000, 0x4FB62FD4,0x9A1E79F8,
+	0x4065F000,0x00000000, 0x4FC24A3A,0x897D65CA,
+	0x40660000,0x00000000, 0x4FCE27B0,0xA2F86833,
+	0x40661000,0x00000000, 0x4FD8DBCE,0xFC9E91B7,
+	0x40662000,0x00000000, 0x4FE47E12,0xC0B6846F,
+	0x40663000,0x00000000, 0x4FF0E4A8,0x01F72969,
+	0x40664000,0x00000000, 0x4FFBDA27,0x1DB91986,
+	0x40665000,0x00000000, 0x5006F5D1,0x39ECCBC1,
+	0x40666000,0x00000000, 0x5012ED70,0xF2346931,
+	0x40667000,0x00000000, 0x501F34C8,0x2EE1C4BE,
+	0x40668000,0x00000000, 0x5029B9A3,0x2B1D8885,
+	0x40669000,0x00000000, 0x503534F0,0xB1BBA718,
+	0x4066A000,0x00000000, 0x50417B67,0x94066E66,
+	0x4066B000,0x00000000, 0x504CD2B1,0xDBFD4B90,
+	0x4066C000,0x00000000, 0x5057C2B4,0x9BD687CA,
+	0x4066D000,0x00000000, 0x50639657,0xCD14652F,
+	0x4066E000,0x00000000, 0x507025A0,0x80643D67,
+	0x4066F000,0x00000000, 0x507A9F32,0xDD84CA29,
+	0x40670000,0x00000000, 0x5085F22E,0x785FF70E,
+	0x40671000,0x00000000, 0x50921768,0x5E6DABA5,
+	0x40672000,0x00000000, 0x509DD3E6,0x7EDBD369,
+	0x40673000,0x00000000, 0x50A896BC,0x55BAC44C,
+	0x40674000,0x00000000, 0x50B44521,0xDEE0E199,
+	0x40675000,0x00000000, 0x50C0B5B7,0x665B81D4,
+	0x40676000,0x00000000, 0x50CB8CC3,0x14434B52,
+	0x40677000,0x00000000, 0x50D6B604,0xF6808676,
+	0x40678000,0x00000000, 0x50E2B8D9,0x45670408,
+	0x40679000,0x00000000, 0x50EEDE12,0x55F49388,
+	0x4067A000,0x00000000, 0x50F97228,0x23092B4D,
+	0x4067B000,0x00000000, 0x5104FA03,0xB1678640,
+	0x4067C000,0x00000000, 0x51114AD4,0x18D3B94C,
+	0x4067D000,0x00000000, 0x511C829B,0x37869E1B,
+	0x4067E000,0x00000000, 0x512780AF,0x0992E0C5,
+	0x4067F000,0x00000000, 0x51335FEA,0xCF9DB657,
+	0x40680000,0x00000000, 0x513FF185,0x62CC483E,
+	0x40681000,0x00000000, 0x514A5539,0xF7EA156F,
+	0x40682000,0x00000000, 0x5155B533,0xA34ADB32,
+	0x40683000,0x00000000, 0x5161E523,0x69C669BA,
+	0x40684000,0x00000000, 0x516D8105,0x2CB19D0C,
+	0x40685000,0x00000000, 0x51785269,0x9C56A145,
+	0x40686000,0x00000000, 0x51840CCF,0x34C420DE,
+	0x40687000,0x00000000, 0x51908749,0x386C7074,
+	0x40688000,0x00000000, 0x519B4036,0x1511970E,
+	0x40689000,0x00000000, 0x51A676E9,0xF859F4DC,
+	0x4068A000,0x00000000, 0x51B284D3,0xBB227032,
+	0x4068B000,0x00000000, 0x51BE884D,0x6C929E71,
+	0x4068C000,0x00000000, 0x51C92B73,0xB924EDF1,
+	0x4068D000,0x00000000, 0x51D4BFBA,0x6CABEDF1,
+	0x4068E000,0x00000000, 0x51E11AC7,0x97323903,
+	0x4068F000,0x00000000, 0x51EC3363,0x1C437534,
+	0x40690000,0x00000000, 0x51F73F60,0xEA79F5B9,
+	0x40691000,0x00000000, 0x52032A15,0x0CBD140C,
+	0x40692000,0x00000000, 0x520F98C3,0x1A5FDD25,
+	0x40693000,0x00000000, 0x521A0C0E,0x9CE35791,
+	0x40694000,0x00000000, 0x522578E2,0x3EE4F2D2,
+	0x40695000,0x00000000, 0x5231B36A,0x23271D9A,
+	0x40696000,0x00000000, 0x523D2F0A,0x258E2D01,
+	0x40697000,0x00000000, 0x52480ED4,0xBB267ACE,
+	0x40698000,0x00000000, 0x5253D519,0x0ABF8313,
+	0x40699000,0x00000000, 0x5260595C,0x0DC07FCA,
+	0x4069A000,0x00000000, 0x526AF47D,0xCA9FD133,
+	0x4069B000,0x00000000, 0x5276387E,0x52E77303,
+	0x4069C000,0x00000000, 0x5282515E,0xBD58BF5C,
+	0x4069D000,0x00000000, 0x528E3376,0xD5436F25,
+	0x4069E000,0x00000000, 0x5298E583,0xC58E35C4,
+	0x4069F000,0x00000000, 0x52A48613,0x1C950CED,
+	0x406A0000,0x00000000, 0x52B0EB40,0x981671AC,
+	0x406A1000,0x00000000, 0x52BBE507,0x1FDBA3DE,
+	0x406A2000,0x00000000, 0x52C6FEC8,0x40CEA3D5,
+	0x406A3000,0x00000000, 0x52D2F4D4,0xE03D16C2,
+	0x406A4000,0x00000000, 0x52DF40F7,0x72B4AA1B,
+	0x406A5000,0x00000000, 0x52E9C3AE,0x9151263B,
+	0x406A6000,0x00000000, 0x52F53D38,0x745E9AA6,
+	0x406A7000,0x00000000, 0x5301823B,0x067189D1,
+	0x406A8000,0x00000000, 0x530CDDF2,0xE98B780D,
+	0x406A9000,0x00000000, 0x5317CBFB,0xA2A87780,
+	0x406AA000,0x00000000, 0x53239DFD,0xADF7D8F2,
+	0x406AB000,0x00000000, 0x53302BEE,0x7FDD3C52,
+	0x406AC000,0x00000000, 0x533AA997,0xE5E614A7,
+	0x406AD000,0x00000000, 0x5345FAC0,0x1EF00751,
+	0x406AE000,0x00000000, 0x53521E78,0xBA644953,
+	0x406AF000,0x00000000, 0x535DDF8B,0xF9D2C4D9,
+	0x406B0000,0x00000000, 0x5368A056,0x265FE3CE,
+	0x406B1000,0x00000000, 0x53744D0B,0xFF1F369E,
+	0x406B2000,0x00000000, 0x5380BC3D,0xA8870386,
+	0x406B3000,0x00000000, 0x538B9784,0xDEAD232E,
+	0x406B4000,0x00000000, 0x5396BEE3,0x145C2812,
+	0x406B5000,0x00000000, 0x53A2C028,0xAA77F150,
+	0x406B6000,0x00000000, 0x53AEEA1F,0xBE812D0F,
+	0x406B7000,0x00000000, 0x53B97C17,0xA0470700,
+	0x406B8000,0x00000000, 0x53C50234,0x720464C9,
+	0x406B9000,0x00000000, 0x53D15194,0x93BDE06C,
+	0x406BA000,0x00000000, 0x53DC8DBC,0xFFB57D24,
+	0x406BB000,0x00000000, 0x53E789DC,0x49147CE7,
+	0x406BC000,0x00000000, 0x53F3677B,0x704A40D8,
+	0x406BD000,0x00000000, 0x53FFFDFE,0x58588CD5,
+	0x406BE000,0x00000000, 0x540A5F82,0x1E46BD6C,
+	0x406BF000,0x00000000, 0x5415BDAD,0x7A848783,
+	0x406C0000,0x00000000, 0x5421EC20,0x24FB6CEF,
+	0x406C1000,0x00000000, 0x542D8C8A,0x4B3C6378,
+	0x406C2000,0x00000000, 0x54385BE8,0xBFA1AFCE,
+	0x406C3000,0x00000000, 0x544414A3,0x57292A80,
+	0x406C4000,0x00000000, 0x54508DBD,0x59915B4F,
+	0x406C5000,0x00000000, 0x545B4AD9,0xFBB96C33,
+	0x406C6000,0x00000000, 0x54667FAF,0x7266BF9B,
+	0x406C7000,0x00000000, 0x54728C0E,0xD04AC49C,
+	0x406C8000,0x00000000, 0x547E9439,0x57EC0C43,
+	0x406C9000,0x00000000, 0x54893547,0x9AFA35DE,
+	0x406CA000,0x00000000, 0x5494C7D4,0x6B30E5B0,
+	0x406CB000,0x00000000, 0x54A12175,0x4F4F0E6B,
+	0x406CC000,0x00000000, 0x54AC3E65,0xF5F6F8E0,
+	0x406CD000,0x00000000, 0x54B74874,0xAA4C46C5,
+	0x406CE000,0x00000000, 0x54C33190,0xA83F0958,
+	0x406CF000,0x00000000, 0x54CFA519,0x67E1052B,
+	0x406D0000,0x00000000, 0x54DA163A,0x317C9571,
+	0x406D1000,0x00000000, 0x54E58144,0x88F0E6EE,
+	0x406D2000,0x00000000, 0x54F1BA53,0x74247313,
+	0x406D3000,0x00000000, 0x54FD3A6F,0x41981AEB,
+	0x406D4000,0x00000000, 0x55081839,0x7B37B180,
+	0x406D5000,0x00000000, 0x5513DCD7,0x6C6681AC,
+	0x406D6000,0x00000000, 0x55205FBE,0x403E820D,
+	0x406D7000,0x00000000, 0x552AFF04,0x209305AC,
+	0x406D8000,0x00000000, 0x5536412B,0x6D9C72F9,
+	0x406D9000,0x00000000, 0x55425885,0xBB09167F,
+	0x406DA000,0x00000000, 0x554E3F41,0xA0776B59,
+	0x406DB000,0x00000000, 0x5558EF3C,0x58B09B93,
+	0x406DC000,0x00000000, 0x55648E16,0x983EA89A,
+	0x406DD000,0x00000000, 0x5570F1DB,0xC18727B4,
+	0x406DE000,0x00000000, 0x557BEFEB,0x61064EA1,
+	0x406DF000,0x00000000, 0x558707C2,0xC7CBAA81,
+	0x406E0000,0x00000000, 0x5592FC3B,0xB0FCB841,
+	0x406E1000,0x00000000, 0x559F4D2B,0x7876CF99,
+	0x406E2000,0x00000000, 0x55A9CDBD,0xE38932E0,
+	0x406E3000,0x00000000, 0x55B54583,0x72ADAD98,
+	0x406E4000,0x00000000, 0x55C18911,0x2329934D,
+	0x406E5000,0x00000000, 0x55CCE938,0x5C0605DB,
+	0x406E6000,0x00000000, 0x55D7D546,0x48D217A1,
+	0x406E7000,0x00000000, 0x55E3A5A6,0x8B524219,
+	0x406E8000,0x00000000, 0x55F0323E,0xF5880BF3,
+	0x406E9000,0x00000000, 0x55FAB400,0xFD4B4509,
+	0x406EA000,0x00000000, 0x56060355,0x1E060B72,
+	0x406EB000,0x00000000, 0x5612258B,0xD8706B78,
+	0x406EC000,0x00000000, 0x561DEB36,0x00EC79D4,
+	0x406ED000,0x00000000, 0x5628A9F3,0xB6AFF351,
+	0x406EE000,0x00000000, 0x563454F9,0x367A4B04,
+	0x406EF000,0x00000000, 0x5640C2C6,0x76DBF332,
+	0x406F0000,0x00000000, 0x564BA24A,0xDC52A6B6,
+	0x406F1000,0x00000000, 0x5656C7C4,0xA8990654,
+	0x406F2000,0x00000000, 0x5662C77A,0xEA3B35AC,
+	0x406F3000,0x00000000, 0x566EF631,0xDBC4D70C,
+	0x406F4000,0x00000000, 0x5679860A,0xFEA3876D,
+	0x406F5000,0x00000000, 0x56850A68,0x655197B6,
+	0x406F6000,0x00000000, 0x56915857,0xB18D19C4,
+	0x406F7000,0x00000000, 0x569C98E3,0x209AFF5B,
+	0x406F8000,0x00000000, 0x56A7930D,0x1DDD0C34,
+	0x406F9000,0x00000000, 0x56B36F0F,0x0521972A,
+	0x406FA000,0x00000000, 0x56C0053E,0x164D25FF,
+	0x406FB000,0x00000000, 0x56CA69CE,0x48604213,
+	0x406FC000,0x00000000, 0x56D5C62A,0xA0F8323A,
+	0x406FD000,0x00000000, 0x56E1F31F,0x9A9C02D7,
+	0x406FE000,0x00000000, 0x56ED9813,0xE9473A60,
+	0x406FF000,0x00000000, 0x56F8656B,0x982D1F44,
+	0x40700000,0x00000000, 0x57041C7A,0x8814BEBA,
+	0x40700800,0x00000000, 0x57109433,0xFFCB96CA,
+	0x40701000,0x00000000, 0x571B5582,0x09F140FD,
+	0x40701800,0x00000000, 0x57268878,0x5935DBB2,
+	0x40702000,0x00000000, 0x5732934C,0xB8371AB4,
+	0x40702800,0x00000000, 0x573EA029,0xEAE91642,
+	0x40703000,0x00000000, 0x57493F1F,0x5326A019,
+	0x40703800,0x00000000, 0x5754CFF1,0x93835D18,
+	0x40704000,0x00000000, 0x57612825,0xA2FDAE13,
+	0x40704800,0x00000000, 0x576C496D,0x1C4D4EDC,
+	0x40705000,0x00000000, 0x5777518B,0xF570C588,
+	0x40705800,0x00000000, 0x5783390F,0x2FB6AF23,
+	0x40706000,0x00000000, 0x578FB174,0x868F8418,
+	0x40706800,0x00000000, 0x579A2069,0xBEAAFCC1,
+	0x40707000,0x00000000, 0x57A589AA,0x1904B8FD,
+	0x40707800,0x00000000, 0x57B1C13F,0x77F8B4FD,
+	0x40708000,0x00000000, 0x57BD45D8,0xD0A28247,
+	0x40708800,0x00000000, 0x57C821A1,0xE63BAB6A,
+	0x40709000,0x00000000, 0x57D3E498,0xD415B213,
+	0x40709800,0x00000000, 0x57E06622,0xF0D162C7,
+	0x4070A000,0x00000000, 0x57EB098E,0x928AFB64,
+	0x4070A800,0x00000000, 0x57F649DB,0xEB8F9483,
+	0x4070B000,0x00000000, 0x58025FAF,0x83A52372,
+	0x4070B800,0x00000000, 0x580E4B11,0x065FE4C8,
+	0x4070C000,0x00000000, 0x5818F8F8,0xB78094E9,
+	0x4070C800,0x00000000, 0x5824961D,0x34EBA01D,
+	0x4070D000,0x00000000, 0x5830F879,0x7F4ABAB9,
+	0x4070D800,0x00000000, 0x583BFAD3,0xE2E189D8,
+	0x4070E000,0x00000000, 0x584710C0,0xD041C387,
+	0x4070E800,0x00000000, 0x585303A5,0x6593BD1F,
+	0x4070F000,0x00000000, 0x585F5964,0x4203C1DE,
+	0x4070F800,0x00000000, 0x5869D7D1,0x234DB4A9,
+	0x40710000,0x00000000, 0x58754DD1,0xADEC0B48,
+	0x40710800,0x00000000, 0x58818FE9,0xEB38F352,
+	0x40711000,0x00000000, 0x588CF482,0x35243089,
+	0x40711800,0x00000000, 0x5897DE94,0x8FBD7E39,
+	0x40712000,0x00000000, 0x58A3AD52,0x664E1DF7,
+	0x40712800,0x00000000, 0x58B03891,0xE25ABC6B,
+	0x40713000,0x00000000, 0x58BABE6E,0x254A0BCA,
+	0x40713800,0x00000000, 0x58C60BED,0x76F072A2,
+	0x40714000,0x00000000, 0x58D22CA1,0xB9A5C3DF,
+	0x40714800,0x00000000, 0x58DDF6E4,0x95EF7D77,
+	0x40715000,0x00000000, 0x58E8B395,0x0821A800,
+	0x40715800,0x00000000, 0x58F45CE9,0x862703BA,
+	0x40716000,0x00000000, 0x5900C951,0xD258F4BF,
+	0x40716800,0x00000000, 0x590BAD15,0x0ED7AA99,
+	0x40717000,0x00000000, 0x5916D0A9,0xB49138CB,
+	0x40717800,0x00000000, 0x5922CED0,0x05CE1F1A,
+	0x40718000,0x00000000, 0x592F0248,0xAF95F4C5,
+	0x40718800,0x00000000, 0x59399002,0x3FA2717D,
+	0x40719000,0x00000000, 0x5945129F,0x8C8EC869,
+	0x40719800,0x00000000, 0x59515F1D,0x7348E98B,
+	0x4071A000,0x00000000, 0x595CA40D,0x9BE99BD8,
+	0x4071A800,0x00000000, 0x59679C41,0x8952B69E,
+	0x4071B000,0x00000000, 0x597376A5,0x8F4AF93B,
+	0x4071B800,0x00000000, 0x59800B7F,0x70BC2748,
+	0x4071C000,0x00000000, 0x598A741E,0x77C7EC9D,
+	0x4071C800,0x00000000, 0x5995CEAB,0x17F0A943,
+	0x4071D000,0x00000000, 0x59A1FA21,0xCBB8DF30,
+	0x4071D800,0x00000000, 0x59ADA3A2,0x0893BDDD,
+	0x4071E000,0x00000000, 0x59B86EF2,0x276B93A5,
+	0x4071E800,0x00000000, 0x59C42454,0xC8B8682D,
+	0x4071F000,0x00000000, 0x59D09AAD,0x2C170340,
+	0x4071F800,0x00000000, 0x59DB602E,0x41585B8E,
+	0x40720000,0x00000000, 0x59E69144,0xAE1D9F07,
+	0x40720800,0x00000000, 0x59F29A8D,0x7401A7B4,
+	0x40721000,0x00000000, 0x59FEAC1F,0x275B04AF,
+	0x40721800,0x00000000, 0x5A0948FA,0xE329BC12,
+	0x40722000,0x00000000, 0x5A14D811,0xE6DF8552,
+	0x40722800,0x00000000, 0x5A212ED8,0x9342BFFD,
+	0x40723000,0x00000000, 0x5A2C5478,0x90F4370C,
+	0x40723800,0x00000000, 0x5A375AA6,0xCD49B6C7,
+	0x40724000,0x00000000, 0x5A434090,0xA44810F8,
+	0x40724800,0x00000000, 0x5A4FBDD4,0x784CDA28,
+	0x40725000,0x00000000, 0x5A5A2A9D,0x45FB7BB3,
+	0x40725800,0x00000000, 0x5A659212,0xF0679FBC,
+	0x40726000,0x00000000, 0x5A71C82E,0x2FB1A15B,
+	0x40726800,0x00000000, 0x5A7D5146,0xD46A1DE3,
+	0x40727000,0x00000000, 0x5A882B0D,0xFDA106AA,
+	0x40727800,0x00000000, 0x5A93EC5D,0x42FB4DED,
+	0x40728000,0x00000000, 0x5AA06C8A,0x20724675,
+	0x40728800,0x00000000, 0x5AAB141D,0x22227699,
+	0x40729000,0x00000000, 0x5AB6528F,0xCE13764B,
+	0x40729800,0x00000000, 0x5AC266DC,0x18440B4A,
+	0x4072A000,0x00000000, 0x5ACE56E5,0x08C916D8,
+	0x4072A800,0x00000000, 0x5AD902B8,0xE3798770,
+	0x4072B000,0x00000000, 0x5AE49E26,0xF3D4B60A,
+	0x4072B800,0x00000000, 0x5AF0FF19,0xD262FE79,
+	0x4072C000,0x00000000, 0x5AFC05C0,0xA7166B4A,
+	0x4072C800,0x00000000, 0x5B0719C2,0x5B8F5B4A,
+	0x4072D000,0x00000000, 0x5B130B11,0xFF23056A,
+	0x4072D800,0x00000000, 0x5B1F65A1,0xD137C73F,
+	0x4072E000,0x00000000, 0x5B29E1E8,0x52274ADB,
+	0x4072E800,0x00000000, 0x5B355623,0x275D5D3E,
+	0x4072F000,0x00000000, 0x5B4196C5,0x5FAA7A5C,
+	0x4072F800,0x00000000, 0x5B4CFFD0,0x769DDF27,
+	0x40730000,0x00000000, 0x5B57E7E6,0x78D54EB5,
+	0x40730800,0x00000000, 0x5B63B501,0x40165E6B,
+	0x40731000,0x00000000, 0x5B703EE7,0x474BBDF2,
+	0x40731800,0x00000000, 0x5B7AC8DF,0x5F78B7CA,
+	0x40732000,0x00000000, 0x5B861489,0x2AFE2EA5,
+	0x40732800,0x00000000, 0x5B9233BA,0x5F186FF8,
+	0x40733000,0x00000000, 0x5B9E0297,0xBAA30C57,
+	0x40733800,0x00000000, 0x5BA8BD3A,0x1C2C4952,
+	0x40734000,0x00000000, 0x5BB464DC,0xEF5ABE49,
+	0x40734800,0x00000000, 0x5BC0CFDF,0xBBFD0F84,
+	0x40735000,0x00000000, 0x5BCBB7E3,0x77E0A776,
+	0x40735800,0x00000000, 0x5BD6D992,0x399F5E26,
+	0x40736000,0x00000000, 0x5BE2D627,0xFE4E6AF9,
+	0x40736800,0x00000000, 0x5BEF0E64,0x3BCBA12A,
+	0x40737000,0x00000000, 0x5BF999FD,0x64C82181,
+	0x40737800,0x00000000, 0x5C051AD9,0xE8FC1D15,
+	0x40738000,0x00000000, 0x5C1165E5,0xD9F93ADE,
+	0x40738800,0x00000000, 0x5C1CAF3C,0x7354735A,
+	0x40739000,0x00000000, 0x5C27A579,0x8CDC2FF0,
+	0x40739800,0x00000000, 0x5C337E3F,0x0FEE1A43,
+	0x4073A000,0x00000000, 0x5C4011C3,0x3C6D0DB8,
+	0x4073A800,0x00000000, 0x5C4A7E72,0xAE0FA2EF,
+	0x4073B000,0x00000000, 0x5C55D72E,0xE0B93BB4,
+	0x4073B800,0x00000000, 0x5C620126,0xB9632031,
+	0x4073C000,0x00000000, 0x5C6DAF34,0xAAE43996,
+	0x4073C800,0x00000000, 0x5C78787C,0x6ED041A6,
+	0x4073D000,0x00000000, 0x5C842C32,0x1A4628C7,
+	0x4073D800,0x00000000, 0x5C90A128,0xDF6FE365,
+	0x4073E000,0x00000000, 0x5C9B6ADE,0xA38EA430,
+	0x4073E800,0x00000000, 0x5CA69A14,0x7274E527,
+	0x4073F000,0x00000000, 0x5CB2A1D1,0x04C50F06,
+	0x4073F800,0x00000000, 0x5CBEB819,0x0F13D572,
+	0x40740000,0x00000000, 0x5CC952DA,0x4C83AF00,
+	0x40740800,0x00000000, 0x5CD4E035,0x66820AFE,
+	0x40741000,0x00000000, 0x5CE1358E,0x212351EF,
+	0x40741800,0x00000000, 0x5CEC5F88,0x559A191C,
+	0x40742000,0x00000000, 0x5CF763C5,0x3339E998,
+	0x40742800,0x00000000, 0x5D034815,0x0717AC6A,
+	0x40743000,0x00000000, 0x5D0FCA39,0x3EFB439C,
+	0x40743800,0x00000000, 0x5D1A34D4,0xC8FB9B73,
+	0x40744000,0x00000000, 0x5D259A7F,0x106151AC,
+	0x40744800,0x00000000, 0x5D31CF1F,0x9C5D5F7E,
+	0x40745000,0x00000000, 0x5D3D5CB9,0x4EAC5631,
+	0x40745800,0x00000000, 0x5D48347D,0xC2D6F085,
+	0x40746000,0x00000000, 0x5D53F424,0xBA4604DF,
+	0x40746800,0x00000000, 0x5D6072F3,0xD01AB2DA,
+	0x40747000,0x00000000, 0x5D6B1EAF,0xD0F4DBEE,
+	0x40747800,0x00000000, 0x5D765B47,0x167B3B33,
+	0x40748000,0x00000000, 0x5D826E0B,0x79FD6017,
+	0x40748800,0x00000000, 0x5D8E62BD,0xA97FF0A3,
+	0x40749000,0x00000000, 0x5D990C7C,0xDE176CFA,
+	0x40749800,0x00000000, 0x5DA4A633,0xD6332716,
+	0x4074A000,0x00000000, 0x5DB105BC,0xBBD22B5D,
+	0x4074A800,0x00000000, 0x5DBC10B1,0xAF4EAEB5,
+	0x4074B000,0x00000000, 0x5DC722C7,0x6B1366FE,
+	0x4074B800,0x00000000, 0x5DD31281,0x7ECBE1FD,
+	0x4074C000,0x00000000, 0x5DDF71E4,0x27EFE008,
+	0x4074C800,0x00000000, 0x5DE9EC03,0x719F2E06,
+	0x4074D000,0x00000000, 0x5DF55E77,0xE045CB62,
+	0x4074D800,0x00000000, 0x5E019DA3,0x81896117,
+	0x4074E000,0x00000000, 0x5E0D0B23,0x222BA489,
+	0x4074E800,0x00000000, 0x5E17F13C,0x0584BA1A,
+	0x4074F000,0x00000000, 0x5E23BCB3,0x19D66A0E,
+	0x4074F800,0x00000000, 0x5E30453F,0x2551E0F6,
+	0x40750000,0x00000000, 0x5E3AD354,0xAD6E368F,
+	0x40750800,0x00000000, 0x5E461D28,0x3B7EB40A,
+	0x40751000,0x00000000, 0x5E523AD5,0xC9DCF903,
+	0x40751800,0x00000000, 0x5E5E0E4F,0x70CF14C8,
+	0x40752000,0x00000000, 0x5E68C6E2,0xF447B147,
+	0x40752800,0x00000000, 0x5E746CD3,0x734B5106,
+	0x40753000,0x00000000, 0x5E80D670,0x34C7AE68,
+	0x40753800,0x00000000, 0x5E8BC2B6,0x1912BA16,
+	0x40754000,0x00000000, 0x5E96E27E,0x391E9C6C,
+	0x40754800,0x00000000, 0x5EA2DD82,0xD4DA463E,
+	0x40755000,0x00000000, 0x5EAF1A84,0x823DAF20,
+	0x40755800,0x00000000, 0x5EB9A3FC,0x6F998B6E,
+	0x40756000,0x00000000, 0x5EC52317,0x7BDA38EC,
+	0x40756800,0x00000000, 0x5ED16CB0,0xE6A65FE5,
+	0x40757000,0x00000000, 0x5EDCBA6F,0xA88F5082,
+	0x40757800,0x00000000, 0x5EE7AEB5,0x29E0B800,
+	0x40758000,0x00000000, 0x5EF385DB,0x883320EE,
+	0x40758800,0x00000000, 0x5F001809,0x7A53FBF1,
+	0x40759000,0x00000000, 0x5F0A88CA,0xECC9E7DB,
+	0x40759800,0x00000000, 0x5F15DFB5,0xFC9DB9FF,
+	0x4075A000,0x00000000, 0x5F22082E,0x64AC4EB5,
+	0x4075A800,0x00000000, 0x5F2DBACB,0xD1FBA904,
+	0x4075B000,0x00000000, 0x5F38820A,0x6FCEEEED,
+	0x4075B800,0x00000000, 0x5F443412,0x7DF079F0,
+	0x4075C000,0x00000000, 0x5F50A7A7,0x1AD2DC6D,
+	0x4075C800,0x00000000, 0x5F5B7593,0x3234A58E,
+	0x4075D000,0x00000000, 0x5F66A2E7,0xA7930F81,
+	0x4075D800,0x00000000, 0x5F72A917,0x6B9C6272,
+	0x4075E000,0x00000000, 0x5F7EC417,0xA3E63C6A,
+	0x4075E800,0x00000000, 0x5F895CBD,0x90B53415,
+	0x4075F000,0x00000000, 0x5F94E85C,0x13A81660,
+	0x4075F800,0x00000000, 0x5FA13C46,0x4DA4D7A0,
+	0x40760000,0x00000000, 0x5FAC6A9C,0x6BEE04C8,
+	0x40760800,0x00000000, 0x5FB76CE7,0x28A4B79A,
+	0x40761000,0x00000000, 0x5FC34F9C,0x594A7140,
+	0x40761800,0x00000000, 0x5FCFD6A2,0xDC7DB8FE,
+	0x40762000,0x00000000, 0x5FDA3F10,0x49398066,
+	0x40762800,0x00000000, 0x5FE5A2EE,0x7A3A0542,
+	0x40763000,0x00000000, 0x5FF1D613,0xBF0A8036,
+	0x40763800,0x00000000, 0x5FFD6830,0x4127418E,
+	0x40764000,0x00000000, 0x60083DF1,0x374D259D,
+	0x40764800,0x00000000, 0x6013FBEF,0x3B24FCBE,
+	0x40765000,0x00000000, 0x60207960,0x00C48F27,
+	0x40765800,0x00000000, 0x602B2946,0xA09E30A3,
+	0x40766000,0x00000000, 0x60366401,0xC61A8A8A,
+	0x40766800,0x00000000, 0x6042753D,0xA9E92116,
+	0x40767000,0x00000000, 0x604E6E9A,0xEA52153A,
+	0x40767800,0x00000000, 0x60591644,0xA8D6D3B2,
+	0x40768000,0x00000000, 0x6064AE43,0xDD40AA42,
+	0x40768800,0x00000000, 0x60710C62,0x3C9ADE9F,
+	0x40769000,0x00000000, 0x607C1BA6,0xFD34B612,
+	0x40769800,0x00000000, 0x60872BD0,0x002D64E0,
+	0x4076A000,0x00000000, 0x609319F3,0xE5B014A7,
+	0x4076A800,0x00000000, 0x609F7E2B,0x4809C6C3,
+	0x4076B000,0x00000000, 0x60A9F622,0x833F3047,
+	0x4076B800,0x00000000, 0x60B566CF,0xD9E9FC30,
+	0x4076C000,0x00000000, 0x60C1A484,0x51E14885,
+	0x4076C800,0x00000000, 0x60CD167A,0x3986BF89,
+	0x4076D000,0x00000000, 0x60D7FA95,0x37377F3C,
+	0x4076D800,0x00000000, 0x60E3C467,0xF4BA1C5E,
+	0x4076E000,0x00000000, 0x60F04B99,0x7D645645,
+	0x4076E800,0x00000000, 0x60FADDCE,0x10C21481,
+	0x4076F000,0x00000000, 0x610625CA,0xA9C1FA57,
+	0x4076F800,0x00000000, 0x611241F3,0xFB085438,
+	0x40770000,0x00000000, 0x611E1A0B,0xBA3C3728,
+	0x40770800,0x00000000, 0x6128D08F,0x91EC4CA1,
+	0x40771000,0x00000000, 0x613474CD,0x132F0B40,
+	0x40771800,0x00000000, 0x6140DD03,0x3DB8A011,
+	0x40772000,0x00000000, 0x614BCD8C,0xF413A3B1,
+	0x40772800,0x00000000, 0x6156EB6D,0xB46AA12E,
+	0x40773000,0x00000000, 0x6162E4E0,0x8A904D9A,
+	0x40773800,0x00000000, 0x616F26A9,0x84C4A9C3,
+	0x40774000,0x00000000, 0x6179ADFF,0x619C3B18,
+	0x40774800,0x00000000, 0x61852B58,0x466A3C55,
+	0x40775000,0x00000000, 0x6191737E,0x9A5911FE,
+	0x40775800,0x00000000, 0x619CC5A7,0x3D4EA81B,
+	0x40776000,0x00000000, 0x61A7B7F4,0x61C81AEE,
+	0x40776800,0x00000000, 0x61B38D7A,0xF942A789,
+	0x40777000,0x00000000, 0x61C01E52,0x2B6573E7,
+	0x40777800,0x00000000, 0x61CA9327,0x3589DB5E,
+	0x40778000,0x00000000, 0x61D5E840,0x6CEA7625,
+	0x40778800,0x00000000, 0x61E20F38,0xCEA65E67,
+	0x40779000,0x00000000, 0x61EDC667,0x7F9DB7B8,
+	0x40779800,0x00000000, 0x61F88B9C,0x2BDBF24A,
+	0x4077A000,0x00000000, 0x62043BF5,0xF4EA4CBB,
+	0x4077A800,0x00000000, 0x6210AE27,0xDF3CF630,
+	0x4077B000,0x00000000, 0x621B804B,0xEEEB8CFA,
+	0x4077B800,0x00000000, 0x6226ABBE,0x4ED00596,
+	0x4077C000,0x00000000, 0x6232B060,0xA9A32244,
+	0x4077C800,0x00000000, 0x623ED01A,0xE7A5A3AF,
+	0x4077D000,0x00000000, 0x624966A4,0xB13F9CBC,
+	0x4077D800,0x00000000, 0x6254F085,0xEF8F4B92,
+	0x4077E000,0x00000000, 0x62614301,0x19CD2ADB,
+	0x4077E800,0x00000000, 0x626C75B4,0xD59FB21D,
+	0x4077F000,0x00000000, 0x6277760C,0xAEEE052E,
+	0x4077F800,0x00000000, 0x62835726,0x9C05C1A3,
+	0x40780000,0x00000000, 0x628FE311,0x52B7EF6B,
+	0x40780800,0x00000000, 0x629A494F,0xC843EA66,
+	0x40781000,0x00000000, 0x62A5AB61,0x2F3A7119,
+	0x40781800,0x00000000, 0x62B1DD0A,0x98C7FDF5,
+	0x40782000,0x00000000, 0x62BD73AB,0xAD99A482,
+	0x40782800,0x00000000, 0x62C84768,0x5C73F22A,
+	0x40783000,0x00000000, 0x62D403BC,0xC6C7D1BC,
+	0x40783800,0x00000000, 0x62E07FCE,0xB36A2422,
+	0x40784000,0x00000000, 0x62EB33E1,0x92BB1ADE,
+	0x40784800,0x00000000, 0x62F66CBF,0xDE45903B,
+	0x40785000,0x00000000, 0x63027C72,0xA91FBAD6,
+	0x40785800,0x00000000, 0x630E7A7C,0xCD0DDBF0,
+	0x40786000,0x00000000, 0x63192010,0x4534DE5E,
+	0x40786800,0x00000000, 0x6324B657,0x0A37710D,
+	0x40787000,0x00000000, 0x6331130A,0x55C01A76,
+	0x40787800,0x00000000, 0x633C26A0,0x927389D6,
+	0x40788000,0x00000000, 0x634734DC,0x1C3D5C6C,
+	0x40788800,0x00000000, 0x63532169,0x34F1D05D,
+	0x40789000,0x00000000, 0x635F8A77,0x3363F085,
+	0x40789800,0x00000000, 0x636A0045,0x8891BD7C,
+	0x4078A000,0x00000000, 0x63756F2B,0x158F14E4,
+	0x4078A800,0x00000000, 0x6381AB67,0xD1BE3A25,
+	0x4078B000,0x00000000, 0x638D21D5,0xBE691B49,
+	0x4078B800,0x00000000, 0x639803F2,0x0F59EAF6,
+	0x4078C000,0x00000000, 0x63A3CC1F,0xD1EDC5F0,
+	0x4078C800,0x00000000, 0x63B051F6,0x507AAF34,
+	0x4078D000,0x00000000, 0x63BAE84B,0x8B0C7D2A,
+	0x4078D800,0x00000000, 0x63C62E70,0x77187C44,
+	0x4078E000,0x00000000, 0x63D24914,0xF3AFE2F6,
+	0x4078E800,0x00000000, 0x63DE25CC,0x98B3C61A,
+	0x4078F000,0x00000000, 0x63E8DA3F,0xF6931B1B,
+	0x4078F800,0x00000000, 0x63F47CC9,0xD03CB571,
+	0x40790000,0x00000000, 0x6400E398,0xD7D01704,
+	0x40790800,0x00000000, 0x640BD868,0x0A89CA2B,
+	0x40791000,0x00000000, 0x6416F460,0xACDFA1C0,
+	0x40791800,0x00000000, 0x6422EC41,0x208F8DA4,
+	0x40792000,0x00000000, 0x642F32D3,0x4539D4B2,
+	0x40792800,0x00000000, 0x6439B806,0x3C56546A,
+	0x40793000,0x00000000, 0x6445339C,0x49EDC516,
+	0x40793800,0x00000000, 0x64517A4E,0xF61A71E3,
+	0x40794000,0x00000000, 0x645CD0E3,0x3347995C,
+	0x40794800,0x00000000, 0x6467C137,0x35FAB153,
+	0x40795000,0x00000000, 0x6473951D,0x6445BC31,
+	0x40795800,0x00000000, 0x6480249D,0x50965708,
+	0x40796000,0x00000000, 0x648A9D87,0x89E33ADB,
+	0x40796800,0x00000000, 0x6495F0CE,0x32EC43E9,
+	0x40797000,0x00000000, 0x64A21645,0xF863ADE5,
+	0x40797800,0x00000000, 0x64ADD207,0xB58EC19A,
+	0x40798000,0x00000000, 0x64B89531,0xA46C33ED,
+	0x40798800,0x00000000, 0x64C443DC,0x80670A14,
+	0x40799000,0x00000000, 0x64D0B4AB,0x2DAB9B53,
+	0x40799800,0x00000000, 0x64DB8B08,0xDB552AA9,
+	0x4079A000,0x00000000, 0x64E6B498,0x6984352D,
+	0x4079A800,0x00000000, 0x64F2B7AC,0xBFF53D7B,
+	0x4079B000,0x00000000, 0x64FEDC22,0xDC262BD7,
+	0x4079B800,0x00000000, 0x6509708F,0xAFA4D0D6,
+	0x4079C000,0x00000000, 0x6514F8B2,0xFB75CAB5,
+	0x4079C800,0x00000000, 0x652149BE,0x86A28BA9,
+	0x4079D000,0x00000000, 0x652C80D1,0x945F81B6,
+	0x4079D800,0x00000000, 0x65377F35,0xC77A41A9,
+	0x4079E000,0x00000000, 0x65435EB3,0xD06F7247,
+	0x4079E800,0x00000000, 0x654FEF84,0xA38E58E1,
+	0x4079F000,0x00000000, 0x655A5393,0x47AA34FD,
+	0x4079F800,0x00000000, 0x6565B3D7,0x30ABCC28,
+	0x407A0000,0x00000000, 0x6571E404,0x2AA53CFD,
+	0x407A0800,0x00000000, 0x657D7F2B,0x95C2F20A,
+	0x407A1000,0x00000000, 0x658850E3,0x33BC3230,
+	0x407A1800,0x00000000, 0x65940B8D,0x5E5E9699,
+	0x407A2000,0x00000000, 0x65A0863F,0xE9061C49,
+	0x407A2800,0x00000000, 0x65AB3E80,0xA8E8E1E0,
+	0x407A3000,0x00000000, 0x65B67581,0x6050FD04,
+	0x407A3800,0x00000000, 0x65C283AA,0x78BA0762,
+	0x407A4000,0x00000000, 0x65CE8663,0x5382509D,
+	0x407A4800,0x00000000, 0x65D929DF,0xB4AF4491,
+	0x407A5000,0x00000000, 0x65E4BE6D,0x5E5227A4,
+	0x407A5800,0x00000000, 0x65F119B5,0x08454638,
+	0x407A6000,0x00000000, 0x65FC319E,0x70B6D934,
+	0x407A6800,0x00000000, 0x66073DEB,0xC0A3DE92,
+	0x407A7000,0x00000000, 0x661328E1,0x6DB3B964,
+	0x407A7800,0x00000000, 0x661F96C7,0xEBDD8D31,
+	0x407A8000,0x00000000, 0x662A0A6C,0x8321DB88,
+	0x407A8800,0x00000000, 0x66357789,0x947AB9AF,
+	0x407A9000,0x00000000, 0x6641B24E,0x022CA821,
+	0x407A9800,0x00000000, 0x664D2D35,0xB28D4F79,
+	0x407AA000,0x00000000, 0x66580D52,0x8F58D861,
+	0x407AA800,0x00000000, 0x6663D3DA,0xB29E2C9A,
+	0x407AB000,0x00000000, 0x66705855,0x9F8CDDBD,
+	0x407AB800,0x00000000, 0x667AF2CD,0x1DE63B75,
+	0x407AC000,0x00000000, 0x66863719,0xA4D337E8,
+	0x407AC800,0x00000000, 0x66925038,0xB4E972E6,
+	0x407AD000,0x00000000, 0x669E3192,0x0DFFC6D5,
+	0x407AD800,0x00000000, 0x66A8E3F4,0x23B5AFA3,
+	0x407AE000,0x00000000, 0x66B484C9,0xABAB9169,
+	0x407AE800,0x00000000, 0x66C0EA31,0x040EA9CE,
+	0x407AF000,0x00000000, 0x66CBE347,0x5E1C3855,
+	0x407AF800,0x00000000, 0x66D6FD57,0x23DA5B6B,
+	0x407B0000,0x00000000, 0x66E2F3A4,0x97F7830C,
+	0x407B0800,0x00000000, 0x66EF3F01,0xC5772C56,
+	0x407B1000,0x00000000, 0x66F9C211,0x014E93A7,
+	0x407B1800,0x00000000, 0x67053BE3,0x87A6EE8B,
+	0x407B2000,0x00000000, 0x67118121,0xFAF407D4,
+	0x407B2800,0x00000000, 0x671CDC23,0x8C2FEE27,
+	0x407B3000,0x00000000, 0x6727CA7D,0xA7E1607C,
+	0x407B3800,0x00000000, 0x67339CC2,0xCA65E103,
+	0x407B4000,0x00000000, 0x67402AEA,0xEADBE65C,
+	0x407B4800,0x00000000, 0x674AA7EB,0xEB6A6159,
+	0x407B5000,0x00000000, 0x6755F95F,0x4FF07902,
+	0x407B5800,0x00000000, 0x67621D55,0xE2F706F3,
+	0x407B6000,0x00000000, 0x676DDDAC,0x7593D338,
+	0x407B6800,0x00000000, 0x67789ECA,0xDAF52DA2,
+	0x407B7000,0x00000000, 0x67844BC6,0x219A92EF,
+	0x407B7800,0x00000000, 0x6790BB31,0x071C996E,
+	0x407B8000,0x00000000, 0x679B95C9,0xF913F1F2,
+	0x407B8800,0x00000000, 0x67A6BD75,0xF908928D,
+	0x407B9000,0x00000000, 0x67B2BEFB,0xAFAF11F3,
+	0x407B9800,0x00000000, 0x67BEE82F,0x833CAC46,
+	0x407BA000,0x00000000, 0x67C97A7E,0x8D674EEE,
+	0x407BA800,0x00000000, 0x67D500E3,0x389A3022,
+	0x407BB000,0x00000000, 0x67E1507E,0x952BA07A,
+	0x407BB800,0x00000000, 0x67EC8BF2,0xA9DE7D02,
+	0x407BC000,0x00000000, 0x67F78862,0x73AE678C,
+	0x407BC800,0x00000000, 0x68036643,0xF7ADCA9D,
+	0x407BD000,0x00000000, 0x680FFBFC,0xD0E62482,
+	0x407BD800,0x00000000, 0x681A5DDA,0xC8FC57A6,
+	0x407BE000,0x00000000, 0x6825BC50,0x7FD7CDEF,
+	0x407BE800,0x00000000, 0x6831EB00,0x75B20B87,
+	0x407BF000,0x00000000, 0x683D8AAF,0xFB634BD5,
+	0x407BF800,0x00000000, 0x68485A61,0xBE9751BD,
+	0x407C0000,0x00000000, 0x68541361,0x0319D4CC,
+	0x407C0800,0x00000000, 0x68608CB3,0xA29383FA,
+	0x407C1000,0x00000000, 0x686B4923,0xE4C56E4A,
+	0x407C1800,0x00000000, 0x68767E46,0x4D9206AA,
+	0x407C2000,0x00000000, 0x68828AE5,0x19D14E71,
+	0x407C2800,0x00000000, 0x688E924E,0x7F7F33E7,
+	0x407C3000,0x00000000, 0x689933B2,0xF8C452EC,
+	0x407C3800,0x00000000, 0x68A4C686,0xDACBF512,
+	0x407C4000,0x00000000, 0x68B12062,0x552E2E87,
+	0x407C4800,0x00000000, 0x68BC3CA0,0x99AAFA5B,
+	0x407C5000,0x00000000, 0x68C746FE,0xEEC205E9,
+	0x407C5800,0x00000000, 0x68D3305C,0x9118E579,
+	0x407C6000,0x00000000, 0x68DFA31D,0x735687C6,
+	0x407C6800,0x00000000, 0x68EA1497,0x747B2A87,
+	0x407C7000,0x00000000, 0x68F57FEB,0x57F30DEA,
+	0x407C7800,0x00000000, 0x6901B936,0xE4396D73,
+	0x407C8000,0x00000000, 0x690D389A,0x17AEA099,
+	0x407C8800,0x00000000, 0x691816B6,0xB8A1B10D,
+	0x407C9000,0x00000000, 0x6923DB98,0x97F88BA3,
+	0x407C9800,0x00000000, 0x69305EB7,0x6B9334AD,
+	0x407CA000,0x00000000, 0x693AFD52,0xCAE8B9E7,
+	0x407CA800,0x00000000, 0x69463FC6,0x3443AEEF,
+	0x407CB000,0x00000000, 0x6952575F,0x3FCB3E2D,
+	0x407CB800,0x00000000, 0x695E3D5C,0x1BEAF167,
+	0x407CC000,0x00000000, 0x6968EDAC,0x1ACE3095,
+	0x407CC800,0x00000000, 0x69748CCC,0xA6B35A83,
+	0x407CD000,0x00000000, 0x6980F0CB,0xC375532D,
+	0x407CD800,0x00000000, 0x698BEE2A,0xF0729E31,
+	0x407CE000,0x00000000, 0x69970651,0x1AB813A2,
+	0x407CE800,0x00000000, 0x69A2FB0A,0xF1E81ABF,
+	0x407CF000,0x00000000, 0x69AF4B35,0x0757662A,
+	0x407CF800,0x00000000, 0x69B9CC1F,0xB20C4DA0,
+	0x407D0000,0x00000000, 0x69C5442E,0x00D851D5,
+	0x407D0800,0x00000000, 0x69D187F7,0xA9EFC3BE,
+	0x407D1000,0x00000000, 0x69DCE768,0x49BE1B4F,
+	0x407D1800,0x00000000, 0x69E7D3C7,0xB8E59AA0,
+	0x407D2000,0x00000000, 0x69F3A46B,0x2CCD0C40,
+	0x407D2800,0x00000000, 0x6A00313A,0xFB2BC2B2,
+	0x407D3000,0x00000000, 0x6A0AB254,0x5BB447C1,
+	0x407D3800,0x00000000, 0x6A1601F3,0xC544ED4F,
+	0x407D4000,0x00000000, 0x6A222468,0x8F739E9B,
+	0x407D4800,0x00000000, 0x6A2DE955,0xC172AA02,
+	0x407D5000,0x00000000, 0x6A38A867,0xD0ECEB08,
+	0x407D5800,0x00000000, 0x6A4453B2,0xD9B94076,
+	0x407D6000,0x00000000, 0x6A50C1B9,0x6C8E2131,
+	0x407D6800,0x00000000, 0x6A5BA08F,0x49CAF990,
+	0x407D7000,0x00000000, 0x6A66C656,0xFEB698A8,
+	0x407D7800,0x00000000, 0x6A72C64D,0x79ED6C91,
+	0x407D8000,0x00000000, 0x6A7EF440,0xDEBEB36B,
+	0x407D8800,0x00000000, 0x6A898471,0x4C0A2C79,
+	0x407D9000,0x00000000, 0x6A950916,0xA83B9497,
+	0x407D9800,0x00000000, 0x6AA15741,0x466F7649,
+	0x407DA000,0x00000000, 0x6AAC9718,0x17CE5687,
+	0x407DA800,0x00000000, 0x6AB79192,0xB4EFFCBC,
+	0x407DB000,0x00000000, 0x6AC36DD7,0x12E784FD,
+	0x407DB800,0x00000000, 0x6AD0043C,0xEE529F72,
+	0x407DC000,0x00000000, 0x6ADA6826,0x4DCAE606,
+	0x407DC800,0x00000000, 0x6AE5C4CD,0x1E08AEAC,
+	0x407DD000,0x00000000, 0x6AF1F1FF,0x7AFEA1EC,
+	0x407DD800,0x00000000, 0x6AFD9638,0xE03B828E,
+	0x407DE000,0x00000000, 0x6B0863E3,0xFE774D18,
+	0x407DE800,0x00000000, 0x6B141B37,0xB62A8CB7,
+	0x407DF000,0x00000000, 0x6B209329,0xE10DC999,
+	0x407DF800,0x00000000, 0x6B2B53CB,0x47EF4A57,
+	0x407E0000,0x00000000, 0x6B36870E,0xA75E682D,
+	0x407E0800,0x00000000, 0x6B429222,0x8D7F458D,
+	0x407E1000,0x00000000, 0x6B4E9E3E,0x52D4FB85,
+	0x407E1800,0x00000000, 0x6B593D8A,0x12F2EB54,
+	0x407E2000,0x00000000, 0x6B64CEA3,0x80E07B71,
+	0x407E2800,0x00000000, 0x6B712712,0x3D7F0572,
+	0x407E3000,0x00000000, 0x6B7C47A7,0x0EFCEABA,
+	0x407E3800,0x00000000, 0x6B875015,0xA7F976E9,
+	0x407E4000,0x00000000, 0x6B9337DA,0xA044DC04,
+	0x407E4800,0x00000000, 0x6B9FAF77,0xCBAF86A5,
+	0x407E5000,0x00000000, 0x6BAA1EC6,0x5E29E512,
+	0x407E5800,0x00000000, 0x6BB58850,0x613EB443,
+	0x407E6000,0x00000000, 0x6BC1C022,0x78F1CE0F,
+	0x407E6800,0x00000000, 0x6BCD4402,0xEF89003C,
+	0x407E7000,0x00000000, 0x6BD8201E,0x8CA26D36,
+	0x407E7800,0x00000000, 0x6BE3E359,0x832A93EF,
+	0x407E8000,0x00000000, 0x6BF0651B,0xB58667C7,
+	0x407E8800,0x00000000, 0x6BFB07DC,0x93AE02E5,
+	0x407E9000,0x00000000, 0x6C064876,0x26BBE6CD,
+	0x407E9800,0x00000000, 0x6C125E88,0x956BEB90,
+	0x407EA000,0x00000000, 0x6C1E492A,0xC440B0F6,
+	0x407EA800,0x00000000, 0x6C28F767,0xDD5757F4,
+	0x407EB000,0x00000000, 0x6C3494D2,0xC28C45D0,
+	0x407EB800,0x00000000, 0x6C40F769,0x17057235,
+	0x407EC000,0x00000000, 0x6C4BF912,0xC335512C,
+	0x407EC800,0x00000000, 0x6C570F4E,0x92D69839,
+	0x407ED000,0x00000000, 0x6C630274,0x2F81B217,
+	0x407ED800,0x00000000, 0x6C6F576D,0x0CB5F103,
+	0x407EE000,0x00000000, 0x6C79D632,0x50176FF6,
+	0x407EE800,0x00000000, 0x6C854C7B,0xB6C5060A,
+	0x407EF000,0x00000000, 0x6C918ED0,0x0417FD64,
+	0x407EF800,0x00000000, 0x6C9CF2B1,0x6DA940DA,
+	0x407F0000,0x00000000, 0x6CA7DD15,0x6A715F16,
+	0x407F0800,0x00000000, 0x6CB3AC16,0x8CA5A886,
+	0x407F1000,0x00000000, 0x6CC0378D,0x827BECBD,
+	0x407F1800,0x00000000, 0x6CCABCC0,0xDC56851E,
+	0x407F2000,0x00000000, 0x6CD60A8B,0x9437FB07,
+	0x407F2800,0x00000000, 0x6CE22B7D,0xFEED1560,
+	0x407F3000,0x00000000, 0x6CEDF503,0x9AF1B491,
+	0x407F3800,0x00000000, 0x6CF8B208,0x87CA09CA,
+	0x407F4000,0x00000000, 0x6D045BA2,0xA9F7E439,
+	0x407F4800,0x00000000, 0x6D10C844,0x5EFEC68E,
+	0x407F5000,0x00000000, 0x6D1BAB58,0xCF1DFBE2,
+	0x407F5800,0x00000000, 0x6D26CF3B,0x7BE8495B,
+	0x407F6000,0x00000000, 0x6D32CDA2,0x1FCD896D,
+	0x407F6800,0x00000000, 0x6D3F0056,0xF082870F,
+	0x407F7000,0x00000000, 0x6D498E67,0xED111611,
+	0x407F7800,0x00000000, 0x6D55114D,0x4B998D6B,
+	0x407F8000,0x00000000, 0x6D615E06,0x9B7580CA,
+	0x407F8800,0x00000000, 0x6D6CA241,0xDFE16A1F,
+	0x407F9000,0x00000000, 0x6D779AC6,0x8CA512B5,
+	0x407F9800,0x00000000, 0x6D83756D,0x2343CED1,
+	0x407FA000,0x00000000, 0x6D900A7D,0xE459292B,
+	0x407FA800,0x00000000, 0x6D9A7275,0xD7A7102B,
+	0x407FB000,0x00000000, 0x6DA5CD4D,0x0C89278C,
+	0x407FB800,0x00000000, 0x6DB1F901,0x3B9BA2D2,
+	0x407FC000,0x00000000, 0x6DBDA1C6,0x460D161E,
+	0x407FC800,0x00000000, 0x6DC86D69,0xF4CEB104,
+	0x407FD000,0x00000000, 0x6DD42311,0x78C235D2,
+	0x407FD800,0x00000000, 0x6DE099A2,0xA570BDB7,
+	0x407FE000,0x00000000, 0x6DEB5E76,0xD405A221,
+	0x407FE800,0x00000000, 0x6DF68FDA,0x6F0C61F9,
+	0x407FF000,0x00000000, 0x6E029962,0xD4DE103D,
+	0x407FF800,0x00000000, 0x6E0EAA32,0xCF54D288,
+	0x40800000,0x00000000, 0x6E194765,0x04BA852E,
+	0x40800400,0x00000000, 0x6E24D6C3,0x51CBD815,
+	0x40800800,0x00000000, 0x6E312DC4,0xC23C62A5,
+	0x40800C00,0x00000000, 0x6E3C52B1,0xD25A4F42,
+	0x40801000,0x00000000, 0x6E47592F,0xEDAC601F,
+	0x40801400,0x00000000, 0x6E533F5B,0x9C5B963F,
+	0x40801800,0x00000000, 0x6E5FBBD6,0xF6C9EBDB,
+	0x40801C00,0x00000000, 0x6E6A28F9,0x41BAE076,
+	0x40802000,0x00000000, 0x6E7590B8,0xB1A4CEF4,
+	0x40802400,0x00000000, 0x6E81C710,0xC163770A,
+	0x40802800,0x00000000, 0x6E8D4F70,0x3BD90D4D,
+	0x40802C00,0x00000000, 0x6E98298A,0x0CC993FD,
+	0x40803000,0x00000000, 0x6EA3EB1D,0x75626C30,
+	0x40803400,0x00000000, 0x6EB06B82,0x7E5F8BE7,
+	0x40803800,0x00000000, 0x6EBB126A,0x79D0C0EA,
+	0x40803C00,0x00000000, 0x6EC65129,0x7D8E68F2,
+	0x40804000,0x00000000, 0x6ED265B4,0xB6E28EA1,
+	0x40804400,0x00000000, 0x6EDE54FE,0x08CD240F,
+	0x40804800,0x00000000, 0x6EE90127,0x6CCC73A1,
+	0x40804C00,0x00000000, 0x6EF49CDC,0x006F0249,
+	0x40805000,0x00000000, 0x6F00FE08,0xFFC0CA7A,
+	0x40805400,0x00000000, 0x6F0C03FE,0xD80D4C64,
+	0x40805800,0x00000000, 0x6F17184F,0x8D943F98,
+	0x40805C00,0x00000000, 0x6F2309E0,0x51E51706,
+	0x40806000,0x00000000, 0x6F2F63A9,0xD76EF559,
+	0x40806400,0x00000000, 0x6F39E048,0xDCF8814D,
+	0x40806800,0x00000000, 0x6F4554CC,0xAAB0A066,
+	0x40806C00,0x00000000, 0x6F5195AB,0x0A777488,
+	0x40807000,0x00000000, 0x6F5CFDFE,0xF9A92A43,
+	0x40807400,0x00000000, 0x6F67E666,0xBDEF3A8F,
+	0x40807800,0x00000000, 0x6F73B3C4,0xEB1A94F3,
+	0x40807C00,0x00000000, 0x6F803DE2,0x81C2C541,
+	0x40808000,0x00000000, 0x6F8AC731,0x6EE74ED5,
+	0x40808400,0x00000000, 0x6F961326,0xBE187EEF,
+	0x40808800,0x00000000, 0x6FA23296,0x32777761,
+	0x40808C00,0x00000000, 0x6FAE00B6,0x03D812F2,
+	0x40809000,0x00000000, 0x6FB8BBAD,0x0103B9D8,
+	0x40809400,0x00000000, 0x6FC46395,0x938BC85A,
+	0x40809800,0x00000000, 0x6FD0CED1,0xDF6D80DD,
+	0x40809C00,0x00000000, 0x6FDBB626,0x8AB15726,
+	0x4080A000,0x00000000, 0x6FE6D823,0x71F82D97,
+	0x4080A400,0x00000000, 0x6FF2D4F9,0xA26D13FE,
+	0x4080A800,0x00000000, 0x6FFF0C71,0xBA5F2499,
+	0x4080AC00,0x00000000, 0x70099862,0x72004FAD,
+	0x4080B000,0x00000000, 0x70151987,0x23F42CBE,
+	0x4080B400,0x00000000, 0x702164CE,0x95459A8C,
+	0x4080B800,0x00000000, 0x702CAD70,0x03CABD3E,
+	0x4080BC00,0x00000000, 0x7037A3FD,0xFC3446C2,
+	0x4080C000,0x00000000, 0x70437D06,0x29EA48C6,
+	0x4080C400,0x00000000, 0x705010C1,0x4B7A6398,
+	0x4080C800,0x00000000, 0x705A7CC9,0x6822A2C7,
+	0x4080CC00,0x00000000, 0x7065D5D0,0x4CA472DF,
+	0x4080D000,0x00000000, 0x70720005,0xB89A1B4E,
+	0x4080D400,0x00000000, 0x707DAD58,0x2E9A35EF,
+	0x4080D800,0x00000000, 0x708876F3,0xA3109AEE,
+	0x4080DC00,0x00000000, 0x70942AEE,0x4C12BEDA,
+	0x4080E000,0x00000000, 0x70A0A01D,0xF0B89337,
+	0x4080E400,0x00000000, 0x70AB6926,0x8AA843DD,
+	0x4080E800,0x00000000, 0x70B698A9,0xA5F2BA1D,
+	0x4080EC00,0x00000000, 0x70C2A0A5,0xF1084035,
+	0x4080F000,0x00000000, 0x70CEB62B,0xF6D099A4,
+	0x4080F400,0x00000000, 0x70D95143,0xCF9B2D9B,
+	0x4080F800,0x00000000, 0x70E4DEE6,0x4ECAA3C2,
+	0x4080FC00,0x00000000, 0x70F13479,0xE46B4387,
+	0x40810000,0x00000000, 0x70FC5DC0,0xE57174A2,
+	0x40810400,0x00000000, 0x7107624D,0xC13D7A61,
+	0x40810800,0x00000000, 0x711346DF,0x86817F67,
+	0x40810C00,0x00000000, 0x711FC83A,0xF687D56B,
+	0x40811000,0x00000000, 0x712A3330,0x20BB8CF2,
+	0x40811400,0x00000000, 0x71359924,0x4A6CFFEF,
+	0x40811800,0x00000000, 0x7141CE01,0xBE9C7EC8,
+	0x40811C00,0x00000000, 0x714D5AE1,0xFE5C1450,
+	0x40812000,0x00000000, 0x715832F9,0x3A863BA1,
+	0x40812400,0x00000000, 0x7163F2E4,0x6FCEB111,
+	0x40812800,0x00000000, 0x717071EB,0xC718172C,
+	0x40812C00,0x00000000, 0x717B1CFC,0x7EEC3ECE,
+	0x40813000,0x00000000, 0x718659E0,0x3A0E42FE,
+	0x40813400,0x00000000, 0x71926CE3,0xA546A7ED,
+	0x40813800,0x00000000, 0x719E60D5,0xEB5D1CE2,
+	0x40813C00,0x00000000, 0x71A90AEA,0xCAA96599,
+	0x40814000,0x00000000, 0x71B4A4E8,0x6194B8FD,
+	0x40814400,0x00000000, 0x71C104AB,0x7EA98433,
+	0x40814800,0x00000000, 0x71CC0EEF,0x30A430E4,
+	0x40814C00,0x00000000, 0x71D72154,0x0C4FE8F3,
+	0x40815000,0x00000000, 0x71E3114F,0x5A338843,
+	0x40815400,0x00000000, 0x71EF6FEB,0x695F5590,
+	0x40815800,0x00000000, 0x71F9EA63,0x5A38A191,
+	0x40815C00,0x00000000, 0x72055D20,0xDDDF347F,
+	0x40816000,0x00000000, 0x72119C88,0xBE195116,
+	0x40816400,0x00000000, 0x721D0950,0xEF764EBD,
+	0x40816800,0x00000000, 0x7227EFBB,0xB4CA4749,
+	0x40816C00,0x00000000, 0x7233BB76,0x4957255B,
+	0x40817000,0x00000000, 0x72404439,0xF9F70D32,
+	0x40817400,0x00000000, 0x724AD1A6,0x14FD78EA,
+	0x40817800,0x00000000, 0x72561BC5,0x4435D88C,
+	0x40817C00,0x00000000, 0x726239B1,0x2B273C87,
+	0x40818000,0x00000000, 0x726E0C6C,0xFDED96E2,
+	0x40818400,0x00000000, 0x7278C555,0x3E11BDA3,
+	0x40818800,0x00000000, 0x72846B8B,0x97AAAFC3,
+	0x40818C00,0x00000000, 0x7290D561,0xEED9AB01,
+	0x40819000,0x00000000, 0x729BC0F8,0x7E2A0DC0,
+	0x40819400,0x00000000, 0x72A6E10E,0xE24155A0,
+	0x40819800,0x00000000, 0x72B2DC54,0x02EA2744,
+	0x40819C00,0x00000000, 0x72BF1891,0x3E2C4157,
+	0x4081A000,0x00000000, 0x72C9A260,0xDC5CB4DD,
+	0x4081A400,0x00000000, 0x72D521C4,0x328C01A7,
+	0x4081A800,0x00000000, 0x72E16B99,0x34E80525,
+	0x4081AC00,0x00000000, 0x72ECB8A2,0x853DFF35,
+	0x4081B000,0x00000000, 0x72F7AD39,0x0504C236,
+	0x4081B400,0x00000000, 0x730384A2,0x280306F7,
+	0x4081B800,0x00000000, 0x73101707,0x24AA620B,
+	0x4081BC00,0x00000000, 0x731A8721,0x00D00771,
+	0x4081C000,0x00000000, 0x7325DE56,0xDFA64C4A,
+	0x4081C400,0x00000000, 0x7332070C,0xF30B8316,
+	0x4081C800,0x00000000, 0x733DB8EE,0x9BA5C134,
+	0x4081CC00,0x00000000, 0x73488081,0x0AB0B92E,
+	0x4081D000,0x00000000, 0x735432CE,0x314E8E01,
+	0x4081D400,0x00000000, 0x7360A69B,0xC3E1DF74,
+	0x4081D800,0x00000000, 0x736B73DA,0x6D77A018,
+	0x4081DC00,0x00000000, 0x7376A17C,0x4D68BC80,
+	0x4081E000,0x00000000, 0x7382A7EB,0xE318D57A,
+	0x4081E400,0x00000000, 0x738EC229,0xCB1AE773,
+	0x4081E800,0x00000000, 0x73995B26,0x751587AC,
+	0x4081EC00,0x00000000, 0x73A4E70C,0x7919F2DB,
+	0x4081F000,0x00000000, 0x73B13B31,0xA5110B69,
+	0x4081F400,0x00000000, 0x73BC68D4,0x49F14F90,
+	0x4081F800,0x00000000, 0x73C76B6F,0x24100909,
+	0x4081FC00,0x00000000, 0x73D34E66,0x5FDB74E5,
+	0x40820000,0x00000000, 0x73DFD4A3,0xCCCC1D98,
+	0x40820400,0x00000000, 0x73EA3D6A,0xFCB9F5F4,
+	0x40820800,0x00000000, 0x73F5A193,0x2CDF6917,
+	0x40820C00,0x00000000, 0x7401D4F5,0x71AB6520,
+	0x40821000,0x00000000, 0x740D6658,0x38D00FAB,
+	0x40821400,0x00000000, 0x74183C6C,0x174809B6,
+	0x40821800,0x00000000, 0x7423FAAE,0x739E7564,
+	0x40821C00,0x00000000, 0x74307857,0x90A9E11D,
+	0x40822000,0x00000000, 0x743B2792,0xA49C67FC,
+	0x40822400,0x00000000, 0x7446629A,0x5D8F06F0,
+	0x40822800,0x00000000, 0x74527415,0x61B0251F,
+	0x40822C00,0x00000000, 0x745E6CB2,0x6DBE2191,
+	0x40823000,0x00000000, 0x746914B1,0xF86AA42E,
+	0x40823400,0x00000000, 0x7474ACF7,0xE7370D42,
+	0x40823800,0x00000000, 0x74810B50,0x94C22C64,
+	0x40823C00,0x00000000, 0x748C19E3,0xCEA445EB,
+	0x40824000,0x00000000, 0x74972A5C,0x1068FC7E,
+	0x40824400,0x00000000, 0x74A318C1,0x498EB572,
+	0x40824800,0x00000000, 0x74AF7C31,0xC464AE3D,
+	0x40824C00,0x00000000, 0x74B9F481,0xC9618A2A,
+	0x40825000,0x00000000, 0x74C56578,0x51955475,
+	0x40825400,0x00000000, 0x74D1A369,0x20092344,
+	0x40825800,0x00000000, 0x74DD14A7,0x50C9D177,
+	0x40825C00,0x00000000, 0x74E7F914,0x506E2D4B,
+	0x40826000,0x00000000, 0x74F3C32A,0xA887226F,
+	0x40826400,0x00000000, 0x75004A93,0xEC0FE5E0,
+	0x40826800,0x00000000, 0x750ADC1E,0xD0307635,
+	0x40826C00,0x00000000, 0x75162467,0x27DFEA55,
+	0x40827000,0x00000000, 0x752240CE,0xEA1148AE,
+	0x40827400,0x00000000, 0x752E1828,0x8AFAC41B,
+	0x40827800,0x00000000, 0x7538CF01,0x406C6A50,
+	0x40827C00,0x00000000, 0x75447384,0xB78AD64D,
+	0x40828000,0x00000000, 0x7550DBF4,0x8E430396,
+	0x40828400,0x00000000, 0x755BCBCE,0xAB2DC675,
+	0x40828800,0x00000000, 0x7566E9FD,0xCE1F593A,
+	0x40828C00,0x00000000, 0x7572E3B1,0x42634DFA,
+	0x40829000,0x00000000, 0x757F24B5,0x7DC24AC4,
+	0x40829400,0x00000000, 0x7589AC63,0x2DABB909,
+	0x40829800,0x00000000, 0x75952A04,0x78A2186A,
+	0x40829C00,0x00000000, 0x75A17266,0x7B65695A,
+	0x4082A000,0x00000000, 0x75ACC3D9,0x65EF8971,
+	0x4082A400,0x00000000, 0x75B7B677,0xA87E3AA0,
+	0x4082A800,0x00000000, 0x75C38C41,0x1EB69117,
+	0x4082AC00,0x00000000, 0x75D01D4F,0x70DD9723,
+	0x4082B000,0x00000000, 0x75DA917C,0xA34244DC,
+	0x4082B400,0x00000000, 0x75E5E6E0,0xC6DAF0F6,
+	0x4082B800,0x00000000, 0x75F20E16,0xEC01BCA6,
+	0x4082BC00,0x00000000, 0x75FDC489,0x8EF34728,
+	0x4082C000,0x00000000, 0x76088A12,0x2D234B39,
+	0x4082C400,0x00000000, 0x76143AB1,0x29A8811A,
+	0x4082C800,0x00000000, 0x7620AD1C,0x1FE99A69,
+	0x4082CC00,0x00000000, 0x762B7E92,0x7E14C9FD,
+	0x4082D000,0x00000000, 0x7636AA52,0x66C63B13,
+	0x4082D400,0x00000000, 0x7642AF34,0xAC2B3E94,
+	0x4082D800,0x00000000, 0x764ECE2C,0x4E0708BD,
+	0x4082DC00,0x00000000, 0x7659650C,0xF6AACCA5,
+	0x4082E000,0x00000000, 0x7664EF35,0xD1F7558F,
+	0x4082E400,0x00000000, 0x767141EC,0x053383AD,
+	0x4082E800,0x00000000, 0x767C73EC,0x01897D05,
+	0x4082EC00,0x00000000, 0x76877494,0x1787DA24,
+	0x4082F000,0x00000000, 0x769355F0,0x298EC67C,
+	0x4082F400,0x00000000, 0x769FE111,0x7B7A5B2A,
+	0x4082F800,0x00000000, 0x76AA47A9,0xD744C255,
+	0x4082FC00,0x00000000, 0x76B5AA05,0x5A44AC6A,
+	0x40830000,0x00000000, 0x76C1DBEB,0xDB9F1388,
+	0x40830400,0x00000000, 0x76CD71D2,0xECF3A7E2,
+	0x40830800,0x00000000, 0x76D845E2,0xA47F335B,
+	0x40830C00,0x00000000, 0x76E4027B,0x82014252,
+	0x40831000,0x00000000, 0x76F07EC5,0xDC0F22CC,
+	0x40831400,0x00000000, 0x76FB322C,0xEC7DC8B9,
+	0x40831800,0x00000000, 0x77066B57,0xE964CB61,
+	0x40831C00,0x00000000, 0x77127B49,0xED376130,
+	0x40832000,0x00000000, 0x771E7893,0x91BE6C6F,
+	0x40832400,0x00000000, 0x77291E7C,0xF78D3A3B,
+	0x40832800,0x00000000, 0x7734B50A,0x92901CE5,
+	0x40832C00,0x00000000, 0x774111F8,0x430DB506,
+	0x40833000,0x00000000, 0x774C24DC,0xB3B87927,
+	0x40833400,0x00000000, 0x77573367,0x9B3F6BA0,
+	0x40833800,0x00000000, 0x77632036,0x2118BF56,
+	0x40833C00,0x00000000, 0x776F887C,0xEA5D5675,
+	0x40834000,0x00000000, 0x7779FEA4,0x2BFD8E3D,
+	0x40834400,0x00000000, 0x77856DD3,0x07181121,
+	0x40834800,0x00000000, 0x7791AA4C,0x3152E3C8,
+	0x40834C00,0x00000000, 0x779D2002,0x1F5D81DE,
+	0x40835000,0x00000000, 0x77A80270,0x92472297,
+	0x40835400,0x00000000, 0x77B3CAE2,0x09D6C9EF,
+	0x40835800,0x00000000, 0x77C050F0,0x5904D117,
+	0x40835C00,0x00000000, 0x77CAE69B,0xA21858AB,
+	0x40836000,0x00000000, 0x77D62D0C,0x6A6719E7,
+	0x40836400,0x00000000, 0x77E247EF,0x704AEBCE,
+	0x40836800,0x00000000, 0x77EE23E8,0xACC8D097,
+	0x40836C00,0x00000000, 0x77F8D8B1,0x098CA7F7,
+	0x40837000,0x00000000, 0x78047B80,0xF462F0F4,
+	0x40837400,0x00000000, 0x7810E289,0xBEA9AD0F,
+	0x40837800,0x00000000, 0x781BD6A9,0x1362CCAD,
+	0x40837C00,0x00000000, 0x7826F2F0,0x36EE57E4,
+	0x40838000,0x00000000, 0x7832EB11,0x61F782B7,
+	0x40838400,0x00000000, 0x783F30DE,0x7AFA66D3,
+	0x40838800,0x00000000, 0x7849B669,0x677367A7,
+	0x40838C00,0x00000000, 0x78553247,0xF777FAA3,
+	0x40839000,0x00000000, 0x78617936,0x69C6D744,
+	0x40839400,0x00000000, 0x786CCF14,0xA7945FBE,
+	0x40839800,0x00000000, 0x7877BFB9,0xE808F200,
+	0x40839C00,0x00000000, 0x788393E3,0x0F2DE2A5,
+	0x4083A000,0x00000000, 0x7890239A,0x3108D4F3,
+	0x4083A400,0x00000000, 0x789A9BDC,0x510CFF1B,
+	0x4083A800,0x00000000, 0x78A5EF6E,0x038F1FC9,
+	0x4083AC00,0x00000000, 0x78B21523,0xA48F156A,
+	0x4083B000,0x00000000, 0x78BDD029,0x0A47075C,
+	0x4083B400,0x00000000, 0x78C893A7,0x0BDD21E0,
+	0x4083B800,0x00000000, 0x78D44297,0x3653EDCD,
+	0x4083BC00,0x00000000, 0x78E0B39F,0x05CD1ED9,
+	0x4083C000,0x00000000, 0x78EB894E,0xBE21778C,
+	0x4083C400,0x00000000, 0x78F6B32B,0xF3638E04,
+	0x4083C800,0x00000000, 0x7902B680,0x4D5B58B3,
+	0x4083CC00,0x00000000, 0x790EDA33,0x816900C0,
+	0x4083D000,0x00000000, 0x79196EF7,0x55DCCC33,
+	0x4083D400,0x00000000, 0x7924F762,0x5AA0D80D,
+	0x4083D800,0x00000000, 0x793148A9,0x05D8DBEA,
+	0x4083DC00,0x00000000, 0x793C7F08,0x0DEA4282,
+	0x4083E000,0x00000000, 0x79477DBC,0x9D0946AF,
+	0x4083E400,0x00000000, 0x79535D7C,0xE4C13674,
+	0x4083E800,0x00000000, 0x795FED84,0x0476E1BE,
+	0x4083EC00,0x00000000, 0x796A51EC,0xB1EB3496,
+	0x4083F000,0x00000000, 0x7975B27A,0xD3E5EC3A,
+	0x4083F400,0x00000000, 0x7981E2E4,0xFD86DD3C,
+	0x4083F800,0x00000000, 0x798D7D52,0x1C8633E3,
+	0x4083FC00,0x00000000, 0x79984F5C,0xE39C7D74,
+	0x40840000,0x00000000, 0x79A40A4B,0x9C27178A,
+	0x40840400,0x00000000, 0x79B08536,0xAA427701,
+	0x40840800,0x00000000, 0x79BB3CCB,0x582D8E5D,
+	0x40840C00,0x00000000, 0x79C67418,0xDEE42BB3,
+	0x40841000,0x00000000, 0x79D28281,0x48F52492,
+	0x40841400,0x00000000, 0x79DE8479,0x592CEC4E,
+	0x40841800,0x00000000, 0x79E9284B,0xC98EC768,
+	0x40841C00,0x00000000, 0x79F4BD20,0x64DA8058,
+	0x40842000,0x00000000, 0x7A0118A2,0x8A8F752B,
+	0x40842400,0x00000000, 0x7A0C2FD9,0xE18C5EF9,
+	0x40842800,0x00000000, 0x7A173C76,0xAE33B12E,
+	0x40842C00,0x00000000, 0x7A2327AD,0xE1F437F9,
+	0x40843000,0x00000000, 0x7A2F94CC,0xDD28600F,
+	0x40843400,0x00000000, 0x7A3A08CA,0x83979AE6,
+	0x40843800,0x00000000, 0x7A457630,0xFFACFA49,
+	0x40843C00,0x00000000, 0x7A51B131,0xF302F3F3,
+	0x40844000,0x00000000, 0x7A5D2B61,0x5CEBDBE2,
+	0x40844400,0x00000000, 0x7A680BD0,0x7BC1EB66,
+	0x40844800,0x00000000, 0x7A73D29C,0x6E72CED5,
+	0x40844C00,0x00000000, 0x7A80574F,0x41CDB148,
+	0x40845000,0x00000000, 0x7A8AF11C,0x8C4DD193,
+	0x40845400,0x00000000, 0x7A9635B5,0x0D1C5038,
+	0x40845800,0x00000000, 0x7AA24F12,0xBEE9E227,
+	0x40845C00,0x00000000, 0x7AAE2FAD,0x6521A4D3,
+	0x40846000,0x00000000, 0x7AB8E264,0x9AEBF1DA,
+	0x40846400,0x00000000, 0x7AC48380,0x4F6A2E06,
+	0x40846800,0x00000000, 0x7AD0E921,0x810E2DE5,
+	0x40846C00,0x00000000, 0x7ADBE187,0xB87010B4,
+	0x40847000,0x00000000, 0x7AE6FBE6,0x1E0AF908,
+	0x40847400,0x00000000, 0x7AF2F274,0x62C63023,
+	0x40847800,0x00000000, 0x7AFF3D0C,0x37AE7434,
+	0x40847C00,0x00000000, 0x7B09C073,0x8B3A6478,
+	0x40848000,0x00000000, 0x7B153A8E,0xB04FAF7C,
+	0x40848400,0x00000000, 0x7B218009,0x0115C67D,
+	0x40848800,0x00000000, 0x7B2CDA54,0x4BE2308C,
+	0x40848C00,0x00000000, 0x7B37C8FF,0xC50DB704,
+	0x40849000,0x00000000, 0x7B439B87,0xFA926B13,
+	0x40849400,0x00000000, 0x7B5029E7,0x66214D24,
+	0x40849800,0x00000000, 0x7B5AA640,0x0BC477DC,
+	0x40849C00,0x00000000, 0x7B65F7FE,0x97101993,
+	0x4084A000,0x00000000, 0x7B721C33,0x1DC645E8,
+	0x4084A400,0x00000000, 0x7B7DDBCD,0x0F65F1F0,
+	0x4084A800,0x00000000, 0x7B889D3F,0xA8539F82,
+	0x4084AC00,0x00000000, 0x7B944A80,0x5884A1BD,
+	0x4084B000,0x00000000, 0x7BA0BA24,0x768A2A6F,
+	0x4084B400,0x00000000, 0x7BAB940F,0x2F4001E1,
+	0x4084B800,0x00000000, 0x7BB6BC08,0xF49993F9,
+	0x4084BC00,0x00000000, 0x7BC2BDCE,0xC7C56FDF,
+	0x4084C000,0x00000000, 0x7BCEE63F,0x67158979,
+	0x4084C400,0x00000000, 0x7BD978E5,0x942DECA5,
+	0x4084C800,0x00000000, 0x7BE4FF92,0x145502B2,
+	0x4084CC00,0x00000000, 0x7BF14F68,0xA807AA17,
+	0x4084D000,0x00000000, 0x7BFC8A28,0x70C48E4E,
+	0x4084D400,0x00000000, 0x7C0786E8,0xB5F932C9,
+	0x4084D800,0x00000000, 0x7C13650C,0x9298F9CA,
+	0x4084DC00,0x00000000, 0x7C1FF9FB,0x69A6C20B,
+	0x4084E000,0x00000000, 0x7C2A5C33,0x8E3D2B1E,
+	0x4084E400,0x00000000, 0x7C35BAF3,0x9B0CCB5A,
+	0x4084E800,0x00000000, 0x7C41E9E0,0xD8727F6B,
+	0x4084EC00,0x00000000, 0x7C4D88D5,0xC947B945,
+	0x4084F000,0x00000000, 0x7C5858DA,0xD6113CE5,
+	0x4084F400,0x00000000, 0x7C64121E,0xC3406B6B,
+	0x4084F800,0x00000000, 0x7C708BA9,0xFC3EDA5B,
+	0x4084FC00,0x00000000, 0x7C7B476D,0xE9498794,
+	0x40850000,0x00000000, 0x7C867CDD,0x3F624846,
+	0x40850400,0x00000000, 0x7C9289BB,0x7602A557,
+	0x40850800,0x00000000, 0x7C9E9063,0xC5D944BE,
+	0x40850C00,0x00000000, 0x7CA9321E,0x6FED805D,
+	0x40851000,0x00000000, 0x7CB4C539,0x5F514AE2,
+	0x40851400,0x00000000, 0x7CC11F4F,0x6C4B292A,
+	0x40851800,0x00000000, 0x7CCC3ADB,0x59CC32B6,
+	0x40851C00,0x00000000, 0x7CD74589,0x4AA6D19C,
+	0x40852000,0x00000000, 0x7CE32F28,0x8D4422DA,
+	0x40852400,0x00000000, 0x7CEFA121,0x9EA597F3,
+	0x40852800,0x00000000, 0x7CFA12F4,0xD1BB3776,
+	0x40852C00,0x00000000, 0x7D057E92,0x3C9A1ED2,
+	0x40853000,0x00000000, 0x7D11B81A,0x66261DE4,
+	0x40853400,0x00000000, 0x7D1D36C5,0x0B300837,
+	0x40853800,0x00000000, 0x7D281534,0x0E4BDA5E,
+	0x40853C00,0x00000000, 0x7D33DA59,0xD7885985,
+	0x40854000,0x00000000, 0x7D405DB0,0xA762C9AC,
+	0x40854400,0x00000000, 0x7D4AFBA1,0x906A31C7,
+	0x40854800,0x00000000, 0x7D563E61,0x1150F9CC,
+	0x40854C00,0x00000000, 0x7D625638,0xD704546A,
+	0x40855000,0x00000000, 0x7D6E3B76,0xB5CFDC19,
+	0x40855400,0x00000000, 0x7D78EC1B,0xF604569E,
+	0x40855800,0x00000000, 0x7D848B82,0xC9D83550,
+	0x40855C00,0x00000000, 0x7D90EFBB,0xD67170B8,
+	0x40856000,0x00000000, 0x7D9BEC6A,0x9BFD27F8,
+	0x40856400,0x00000000, 0x7DA704DF,0x84D26C33,
+	0x40856800,0x00000000, 0x7DB2F9DA,0x45EF311F,
+	0x40856C00,0x00000000, 0x7DBF493E,0xB5B90A9E,
+	0x40857000,0x00000000, 0x7DC9CA81,0x9A87EBC5,
+	0x40857400,0x00000000, 0x7DD542D8,0xA46BBBDB,
+	0x40857800,0x00000000, 0x7DE186DE,0x425C1646,
+	0x40857C00,0x00000000, 0x7DECE598,0x548F5530,
+	0x40858000,0x00000000, 0x7DF7D249,0x40F5E537,
+	0x40858400,0x00000000, 0x7E03A32F,0xE20E0DF7,
+	0x40858800,0x00000000, 0x7E103037,0x111C911B,
+	0x40858C00,0x00000000, 0x7E1AB0A7,0xD4FD8EA4,
+	0x40859000,0x00000000, 0x7E260092,0x82ABA144,
+	0x40859400,0x00000000, 0x7E322345,0x58BA71EC,
+	0x40859800,0x00000000, 0x7E3DE775,0xA015A7E4,
+	0x40859C00,0x00000000, 0x7E48A6DC,0x03FCB84B,
+	0x4085A000,0x00000000, 0x7E54526C,0x916EE2BF,
+	0x4085A400,0x00000000, 0x7E60C0AC,0x731EDDEE,
+	0x4085A800,0x00000000, 0x7E6B9ED3,0xD3136570,
+	0x4085AC00,0x00000000, 0x7E76C4E9,0x6BC1B23B,
+	0x4085B000,0x00000000, 0x7E82C520,0x1C863F21,
+	0x4085B400,0x00000000, 0x7E8EF250,0x00E213E6,
+	0x4085B800,0x00000000, 0x7E9982D7,0xB3212B2C,
+	0x4085BC00,0x00000000, 0x7EA507C5,0x0052DA3B,
+	0x4085C000,0x00000000, 0x7EB1562A,0xECC6EAB2,
+	0x4085C400,0x00000000, 0x7EBC954D,0x2BC9F7BC,
+	0x4085C800,0x00000000, 0x7EC79018,0x63BD0DEC,
+	0x4085CC00,0x00000000, 0x7ED36C9F,0x343CB85C,
+	0x4085D000,0x00000000, 0x7EE0033B,0xD677E517,
+	0x4085D400,0x00000000, 0x7EEA667E,0x6DCB2072,
+	0x4085D800,0x00000000, 0x7EF5C36F,0xB1036D55,
+	0x4085DC00,0x00000000, 0x7F01F0DF,0x6D72215E,
+	0x4085E000,0x00000000, 0x7F0D945D,0xF4F8EC8E,
+	0x4085E400,0x00000000, 0x7F18625C,0x7D4F56C2,
+	0x4085E800,0x00000000, 0x7F2419F4,0xF87E2B37,
+	0x4085EC00,0x00000000, 0x7F30921F,0xD2FFAB7C,
+	0x4085F000,0x00000000, 0x7F3B5214,0xA170249D,
+	0x4085F400,0x00000000, 0x7F4685A5,0x0C34C6AA,
+	0x4085F800,0x00000000, 0x7F5290F8,0x75798760,
+	0x4085FC00,0x00000000, 0x7F5E9C52,0xD993CE57,
+	0x40860000,0x00000000, 0x7F693BF4,0xEC282EFB,
+	0x40860400,0x00000000, 0x7F74CD55,0x83300AD2,
+	0x40860800,0x00000000, 0x7F8125FE,0xE944F2C3,
+	0x40860C00,0x00000000, 0x7F8C45E1,0x1E24D6E6,
+	0x40861000,0x00000000, 0x7F974E9F,0x71FA5B35,
+	0x40861400,0x00000000, 0x7FA336A6,0x242BF518,
+	0x40861800,0x00000000, 0x7FAFAD7B,0x30B5865E,
+	0x40861C00,0x00000000, 0x7FBA1D23,0x17F485AA,
+	0x40862000,0x00000000, 0x7FC586F6,0xBF260CF1,
+	0x40862400,0x00000000, 0x7FD1BF05,0x8BC994AD,
+	0x40862800,0x00000000, 0x7FDD422D,0x2BE5DC9B,
+	0xBFE00000,0x00000000, 0x3FE368B2,0xFC6F960A,
+	0xBFF00000,0x00000000, 0x3FD78B56,0x362CEF38,
+	0xBFF80000,0x00000000, 0x3FCC8F87,0x724B5C1D,
+	0xC0000000,0x00000000, 0x3FC152AA,0xA3BF81CC,
+	0xC0040000,0x00000000, 0x3FB50385,0xC094F425,
+	0xC0080000,0x00000000, 0x3FA97DB0,0xCCCEB0AF,
+	0xC00C0000,0x00000000, 0x3F9EEC10,0x18E4FF66,
+	0xC0100000,0x00000000, 0x3F92C155,0xB8213CF4,
+	0xC0120000,0x00000000, 0x3F86C050,0x4695C417,
+	0xC0140000,0x00000000, 0x3F7B993F,0xE00D5376,
+	0xC0160000,0x00000000, 0x3F70BD4A,0x5ACA7728,
+	0xC0180000,0x00000000, 0x3F644E51,0xF113D4D6,
+	0xC01A0000,0x00000000, 0x3F58A1E1,0x8A954FFA,
+	0xC01C0000,0x00000000, 0x3F4DE16B,0x9C24A98F,
+	0xC01E0000,0x00000000, 0x3F421F9B,0xA40F31D5,
+	0xC0200000,0x00000000, 0x3F35FC21,0x041027AD,
+	0xC0210000,0x00000000, 0x3F2AAB43,0xFB3940A1,
+	0xC0220000,0x00000000, 0x3F202CF2,0x2526545A,
+	0xC0230000,0x00000000, 0x3F139F38,0xA5498FE2,
+	0xC0240000,0x00000000, 0x3F07CD79,0xB5647C9B,
+	0xC0250000,0x00000000, 0x3EFCDFC2,0x63F6A0BA,
+	0xC0260000,0x00000000, 0x3EF18354,0x238F6764,
+	0xC0270000,0x00000000, 0x3EE53E8D,0x76780B04,
+	0xC0280000,0x00000000, 0x3ED9C54C,0x3B43BC8B,
+	0xC0290000,0x00000000, 0x3ECF42ED,0x3F68E690,
+	0xC02A0000,0x00000000, 0x3EC2F605,0x3B981D98,
+	0xC02B0000,0x00000000, 0x3EB70039,0x74E945DF,
+	0xC02C0000,0x00000000, 0x3EABE6C6,0xFDB01612,
+	0xC02D0000,0x00000000, 0x3EA0EC50,0x3D2696E8,
+	0xC02E0000,0x00000000, 0x3E94875C,0xA227EC38,
+	0xC02F0000,0x00000000, 0x3E88E713,0x8077168D,
+	0xC0300000,0x00000000, 0x3E7E355B,0xBAEE85CB,
+	0xC0308000,0x00000000, 0x3E725284,0xD838EF8C,
+	0xC0310000,0x00000000, 0x3E6639E3,0x175A689D,
+	0xC0318000,0x00000000, 0x3E5AF62E,0x927C4664,
+	0xC0320000,0x00000000, 0x3E505A62,0x8C699FA1,
+	0xC0328000,0x00000000, 0x3E43D657,0x76D812BC,
+	0xC0330000,0x00000000, 0x3E381056,0xFF2C5772,
+	0xC0338000,0x00000000, 0x3E2D30DE,0xB5F04C13,
+	0xC0340000,0x00000000, 0x3E21B486,0x55F37267,
+	0xC0348000,0x00000000, 0x3E157A3A,0xFEED00AB,
+	0xC0350000,0x00000000, 0x3E0A0DB0,0xD0DDB3EC,
+	0xC0358000,0x00000000, 0x3DFF9ABE,0x68B14E81,
+	0xC0360000,0x00000000, 0x3DF32B48,0xBF117DA2,
+	0xC0368000,0x00000000, 0x3DE740D6,0x2BB76E50,
+	0xC0370000,0x00000000, 0x3DDC3527,0xE433FAB1,
+	0xC0378000,0x00000000, 0x3DD11BDA,0x375761F2,
+	0xC0380000,0x00000000, 0x3DC4C107,0x8FE9228A,
+	0xC0388000,0x00000000, 0x3DB92D07,0xD6F15A44,
+	0xC0390000,0x00000000, 0x3DAE8A37,0xA45FC32E,
+	0xC0398000,0x00000000, 0x3DA285FD,0x102F8A43,
+	0xC03A0000,0x00000000, 0x3D967852,0xA7007E42,
+	0xC03A8000,0x00000000, 0x3D8B41EB,0x9CA96642,
+	0xC03B0000,0x00000000, 0x3D808852,0x98767E9A,
+	0xC03B8000,0x00000000, 0x3D740E11,0x1F58FA5B,
+	0xC03C0000,0x00000000, 0x3D6853F0,0x1D6D53BA,
+	0xC03C8000,0x00000000, 0x3D5D82DE,0xE15411B1,
+	0xC03D0000,0x00000000, 0x3D51E642,0xBAEB84A0,
+	0xC03D8000,0x00000000, 0x3D45B690,0x2BC47821,
+	0xC03E0000,0x00000000, 0x3D3A56E0,0xC2AC7F75,
+	0xC03E8000,0x00000000, 0x3D2FF386,0x4232B407,
+	0xC03F0000,0x00000000, 0x3D236121,0xE24D3BBA,
+	0xC03F8000,0x00000000, 0x3D178228,0x63549FCE,
+	0xC0400000,0x00000000, 0x3D0C8464,0xF7616468,
+	0xC0404000,0x00000000, 0x3D014BE9,0xBC6D7C42,
+	0xC0408000,0x00000000, 0x3CF4FB54,0x7C775DA8,
+	0xC040C000,0x00000000, 0x3CE973C0,0xB00B76CB,
+	0xC0410000,0x00000000, 0x3CDEE001,0xEED62AA0,
+	0xC0414000,0x00000000, 0x3CD2BA05,0xDDB1DAE4,
+	0xC0418000,0x00000000, 0x3CC6B771,0x9A59F0E0,
+	0xC041C000,0x00000000, 0x3CBB8E7D,0x68ED96BA,
+	0xC0420000,0x00000000, 0x3CB0B6C3,0xAFDDE064,
+	0xC0424000,0x00000000, 0x3CA44667,0x51C2BBE8,
+	0xC0428000,0x00000000, 0x3C989847,0x1FCA6055,
+	0xC042C000,0x00000000, 0x3C8DD5C5,0x66301EC8,
+	0xC0430000,0x00000000, 0x3C82188A,0xD6AE3303,
+	0xC0434000,0x00000000, 0x3C75F38E,0xD3EB9BDB,
+	0xC0438000,0x00000000, 0x3C6AA0DE,0x4BF35B38,
+	0xC043C000,0x00000000, 0x3C6026A3,0xC0738CFF,
+	0xC0440000,0x00000000, 0x3C539792,0x499B1A24,
+	0xC0444000,0x00000000, 0x3C47C432,0x199DF55A,
+	0xC0448000,0x00000000, 0x3C3CD480,0xA1B74820,
+	0xC044C000,0x00000000, 0x3C317C80,0x438BE74E,
+	0xC0450000,0x00000000, 0x3C253645,0x2EE2F75C,
+	0xC0454000,0x00000000, 0x3C19BB40,0x33CAA3AE,
+	0xC0458000,0x00000000, 0x3C0F36BD,0x37F42F3E,
+	0xC045C000,0x00000000, 0x3C02EEA0,0xD6E74738,
+	0xC0460000,0x00000000, 0x3BF6F741,0xDE1748EC,
+	0xC0464000,0x00000000, 0x3BEBDBE6,0x4CF27CD4,
+	0xC0468000,0x00000000, 0x3BE0E5B7,0x3D1FF53D,
+	0xC046C000,0x00000000, 0x3BD47F5B,0xC5D1A914,
+	0xC0470000,0x00000000, 0x3BC8DD5E,0x1BB09D7E,
+	0xC0474000,0x00000000, 0x3BBE2994,0xCB989E2F,
+	0xC0478000,0x00000000, 0x3BB24B60,0x31B49BDA,
+	0xC047C000,0x00000000, 0x3BA63138,0xD37A798A,
+	0xC0480000,0x00000000, 0x3B9AEBAB,0xAE3A41B5,
+	0xC0484000,0x00000000, 0x3B905402,0x70B1952E,
+	0xC0488000,0x00000000, 0x3B83CE9B,0x9DE78F85,
+	0xC048C000,0x00000000, 0x3B7806F5,0x5208CE4F,
+	0xC0490000,0x00000000, 0x3B6D257D,0x547E083F,
+	0xC0494000,0x00000000, 0x3B61AD9F,0x47F3722A,
+	0xC0498000,0x00000000, 0x3B5571DB,0x733A9D61,
+	0xC049C000,0x00000000, 0x3B4A0388,0x9042C921,
+	0xC04A0000,0x00000000, 0x3B3F8E6C,0x24B5592E,
+	0xC04A4000,0x00000000, 0x3B3323CF,0x966C2424,
+	0xC04A8000,0x00000000, 0x3B2737C5,0x645114B5,
+	0xC04AC000,0x00000000, 0x3B1C2A28,0xA4F0A533,
+	0xC04B0000,0x00000000, 0x3B11152E,0xAEB73C08,
+	0xC04B4000,0x00000000, 0x3B04B8F0,0x3815586B,
+	0xC04B8000,0x00000000, 0x3AF92337,0x2C67A074,
+	0xC04BC000,0x00000000, 0x3AEE7E4F,0x9FBB7321,
+	0xC04C0000,0x00000000, 0x3AE27EC4,0x58C65E3C,
+	0xC04C4000,0x00000000, 0x3AD66F90,0x0BC28643,
+	0xC04C8000,0x00000000, 0x3ACB374B,0x315F87C1,
+	0xC04CC000,0x00000000, 0x3AC081E0,0x93F5C945,
+	0xC04D0000,0x00000000, 0x3AB4063F,0x8CC8BB98,
+	0xC04D4000,0x00000000, 0x3AA84A74,0x15B285CB,
+	0xC04D8000,0x00000000, 0x3A9D775D,0x87DA854D,
+	0xC04DC000,0x00000000, 0x3A91DF48,0x490E49C9,
+	0xC04E0000,0x00000000, 0x3A85AE19,0x1A99585A,
+	0xC04E4000,0x00000000, 0x3A7A4C9B,0xF9A78412,
+	0xC04E8000,0x00000000, 0x3A6FE711,0x6182E9CC,
+	0xC04EC000,0x00000000, 0x3A635993,0xBB5E3AAB,
+	0xC04F0000,0x00000000, 0x3A5778FE,0x2497184C,
+	0xC04F4000,0x00000000, 0x3A4C7946,0xD3C1F04A,
+	0xC04F8000,0x00000000, 0x3A41452B,0x7723AED2,
+	0xC04FC000,0x00000000, 0x3A34F326,0x69FE335C,
+	0xC0500000,0x00000000, 0x3A2969D4,0x7321E4CC,
+	0xC0502000,0x00000000, 0x3A1ED3F8,0x77F42B71,
+	0xC0504000,0x00000000, 0x3A12B2B8,0xDD05B318,
+	0xC0506000,0x00000000, 0x3A06AE96,0x635D4B6B,
+	0xC0508000,0x00000000, 0x39FB83BF,0x23A9A9EB,
+	0xC050A000,0x00000000, 0x39F0B03F,0x90454DE5,
+	0xC050C000,0x00000000, 0x39E43E7F,0xC88B8056,
+	0xC050E000,0x00000000, 0x39D88EB0,0x7370563C,
+	0xC0510000,0x00000000, 0x39CDCA23,0xBAE16424,
+	0xC0512000,0x00000000, 0x39C2117C,0xCA7BA9B9,
+	0xC0514000,0x00000000, 0x39B5EAFF,0xFB34BA31,
+	0xC0516000,0x00000000, 0x39AA967C,0xAA5D5A0C,
+	0xC0518000,0x00000000, 0x39A02057,0xD1245CEB,
+	0xC051A000,0x00000000, 0x39938FEE,0xE9697020,
+	0xC051C000,0x00000000, 0x3987BAEE,0x1BFFA80B,
+	0xC051E000,0x00000000, 0x397CC943,0x42F43262,
+	0xC0520000,0x00000000, 0x397175AF,0x0CF60EC5,
+	0xC0522000,0x00000000, 0x39652E00,0x21EB2A50,
+	0xC0524000,0x00000000, 0x3959B138,0x170D6BFE,
+	0xC0526000,0x00000000, 0x394F2A91,0xF0E029BF,
+	0xC0528000,0x00000000, 0x3942E73F,0x53FBA844,
+	0xC052A000,0x00000000, 0x3936EE4D,0xC63B3CDC,
+	0xC052C000,0x00000000, 0x392BD109,0xD9D94BDA,
+	0xC052E000,0x00000000, 0x3920DF20,0xCF930023,
+	0xC0530000,0x00000000, 0x3914775E,0x0840BFDD,
+	0xC0532000,0x00000000, 0x3908D3AC,0x7FDF6990,
+	0xC0534000,0x00000000, 0x38FE1DD2,0x73AA8A4A,
+	0xC0536000,0x00000000, 0x38F2443E,0x541BADB8,
+	0xC0538000,0x00000000, 0x38E62891,0xF06B3450,
+	0xC053A000,0x00000000, 0x38DAE12C,0xE30B1D65,
+	0xC053C000,0x00000000, 0x38D04DA4,0xD1452919,
+	0xC053E000,0x00000000, 0x38C3C6E2,0xC8D491E3,
+	0xC0540000,0x00000000, 0x38B7FD97,0x4D372E45,
+	0xC0542000,0x00000000, 0x38AD1A20,0x62DC07E6,
+	0xC0544000,0x00000000, 0x38A1A6BA,0xEADB4FD1,
+	0xC0546000,0x00000000, 0x3895697F,0x2B378F40,
+	0xC0548000,0x00000000, 0x3889F964,0x45648B9F,
+	0xC054A000,0x00000000, 0x387F821E,0xAE730856,
+	0xC054C000,0x00000000, 0x38731C59,0x57A47DE2,
+	0xC054E000,0x00000000, 0x38672EB8,0x25B2B8BA,
+	0xC0550000,0x00000000, 0x385C1F2D,0xAF3B6A46,
+	0xC0552000,0x00000000, 0x38510E85,0xBFCA7EB3,
+	0xC0554000,0x00000000, 0x3844B0DC,0x07CABF98,
+	0xC0556000,0x00000000, 0x3839196A,0x5575168A,
+	0xC0558000,0x00000000, 0x382E726C,0x3F64D0FE,
+	0xC055A000,0x00000000, 0x3822778E,0x721B447B,
+	0xC055C000,0x00000000, 0x381666D0,0xDAD2961D,
+	0xC055E000,0x00000000, 0x380B2CAE,0xEAAB824A,
+	0xC0560000,0x00000000, 0x38007B71,0x12BC1FFE,
+	0xC0562000,0x00000000, 0x37F3FE71,0x068E4512,
+	0xC0564000,0x00000000, 0x37E840FB,0xC08FDC8A,
+	0xC0566000,0x00000000, 0x37DD6BE0,0xAAA7DE99,
+	0xC0568000,0x00000000, 0x37D1D850,0x8FA8246A,
+	0xC056A000,0x00000000, 0x37C5A5A5,0x56491736,
+	0xC056C000,0x00000000, 0x37BA425B,0x317EEACD,
+	0xC056E000,0x00000000, 0x37AFDAA1,0x5C0B3550,
+	0xC0570000,0x00000000, 0x37A35208,0x867C2683,
+	0xC0572000,0x00000000, 0x37976FD7,0x788F3169,
+	0xC0574000,0x00000000, 0x378C6E2D,0x05BBC000,
+	0xC0576000,0x00000000, 0x37813E6F,0xD2DB521B,
+	0xC0578000,0x00000000, 0x3774EAFB,0x87EAB0F2,
+	0xC057A000,0x00000000, 0x37695FEC,0x148F4BA7,
+	0xC057C000,0x00000000, 0x375EC7F3,0xB269EFA8,
+	0xC057E000,0x00000000, 0x3752AB6E,0xB5004409,
+	0xC0580000,0x00000000, 0x3746A5BE,0xA046B42E,
+	0xC0582000,0x00000000, 0x373B7905,0x0E9EE533,
+	0xC0584000,0x00000000, 0x3730A9BD,0xFB02D240,
+	0xC0586000,0x00000000, 0x3724369B,0x543A1A8B,
+	0xC0588000,0x00000000, 0x3718851D,0x84118908,
+	0xC058A000,0x00000000, 0x370DBE86,0x98733444,
+	0xC058C000,0x00000000, 0x37020A71,0x7E64A9BD,
+	0xC058E000,0x00000000, 0x36F5E274,0x789E0327,
+	0xC0590000,0x00000000, 0x36EA8C1F,0x14E2AF5D,
+	0xC0592000,0x00000000, 0x36E01A0E,0x5643644F,
+	0xC0594000,0x00000000, 0x36D3884E,0x838AEA68,
+	0xC0596000,0x00000000, 0x36C7B1AD,0xBB20821C,
+	0xC0598000,0x00000000, 0x36BCBE0A,0x45F75EB1,
+	0xC059A000,0x00000000, 0x36B16EE0,0x7EC4343B,
+	0xC059C000,0x00000000, 0x36A525BE,0x4E4E601D,
+	0xC059E000,0x00000000, 0x3699A733,0xE3852834,
+	0xC05A0000,0x00000000, 0x368F1E6B,0x68529E33,
+	0xC05A2000,0x00000000, 0x3682DFE0,0xB1B59FFF,
+	0xC05A4000,0x00000000, 0x3676E55D,0x2BF838A7,
+	0xC05A6000,0x00000000, 0x366BC631,0xA2BD4340,
+	0xC05A8000,0x00000000, 0x3660D88C,0xF37F00DD,
+	0xC05AA000,0x00000000, 0x36546F63,0x683DC7B6,
+	0xC05AC000,0x00000000, 0x3648C9FE,0xAB89B876,
+	0xC05AE000,0x00000000, 0x363E1214,0xB15A0B71,
+	0xC05B0000,0x00000000, 0x36323D1F,0x3E5834A0,
+	0xC05B2000,0x00000000, 0x36261FEE,0x6CDB7090,
+	0xC05B4000,0x00000000, 0x361AD6B2,0x2F55DB42,
+	0xC05B6000,0x00000000, 0x36104749,0xAD2C4A4B,
+	0xC05B8000,0x00000000, 0x3603BF2C,0xF6722E46,
+	0xC05BA000,0x00000000, 0x35F7F43C,0xEF4A6E74,
+	0xC05BC000,0x00000000, 0x35ED0EC7,0xDF4F7BD4,
+	0xC05BE000,0x00000000, 0x35E19FD9,0x3D9E7785,
+	0xC05C0000,0x00000000, 0x35D56126,0x259E093C,
+	0xC05C2000,0x00000000, 0x35C9EF43,0xEEB7C3F7,
+	0xC05C4000,0x00000000, 0x35BF75D6,0x040AEFF6,
+	0xC05C6000,0x00000000, 0x35B314E6,0x0197C223,
+	0xC05C8000,0x00000000, 0x35A725AE,0x6E7B9D35,
+	0xC05CA000,0x00000000, 0x359C1437,0x01686511,
+	0xC05CC000,0x00000000, 0x359107DF,0x698DA211,
+	0xC05CE000,0x00000000, 0x3584A8CA,0xFDCE846A,
+	0xC05D0000,0x00000000, 0x35790FA1,0x509BD50D,
+	0xC05D2000,0x00000000, 0x356E668D,0x818C96D5,
+	0xC05D4000,0x00000000, 0x3562705B,0x5B153FB8,
+	0xC05D6000,0x00000000, 0x35565E15,0x12DBD252,
+	0xC05D8000,0x00000000, 0x354B2216,0xC6EFDAC1,
+	0xC05DA000,0x00000000, 0x35407504,0x13CEB8D6,
+	0xC05DC000,0x00000000, 0x3533F6A5,0x8B795DE3,
+	0xC05DE000,0x00000000, 0x35283787,0x1C944DAC,
+	0xC05E0000,0x00000000, 0x351D6068,0x47FC727A,
+	0xC05E2000,0x00000000, 0x3511D15B,0x8DA98E36,
+	0xC05E4000,0x00000000, 0x35059D34,0xDD8A5473,
+	0xC05E6000,0x00000000, 0x34FA381E,0x68A32600,
+	0xC05E8000,0x00000000, 0x34EFCE36,0x2FE6E7D0,
+	0xC05EA000,0x00000000, 0x34E34A80,0x428105AF,
+	0xC05EC000,0x00000000, 0x34D766B4,0x5DD84F18,
+	0xC05EE000,0x00000000, 0x34CC6317,0x8B9E3CB0,
+	0xC05F0000,0x00000000, 0x34C137B6,0xCE8E052C,
+	0xC05F2000,0x00000000, 0x34B4E2D3,0xD4FE8E61,
+	0xC05F4000,0x00000000, 0x34A95607,0x92D19314,
+	0xC05F6000,0x00000000, 0x349EBBF3,0x9C631BF2,
+	0xC05F8000,0x00000000, 0x3492A427,0x64857B19,
+	0xC05FA000,0x00000000, 0x34869CEA,0x4FBD922A,
+	0xC05FC000,0x00000000, 0x347B6E4F,0x282B43F4,
+	0xC05FE000,0x00000000, 0x3470A33E,0xEF18E303,
+	0xC0600000,0x00000000, 0x34642EB9,0xF39AFB0B,
+	0xC0601000,0x00000000, 0x34587B8E,0x5038E1C3,
+	0xC0602000,0x00000000, 0x344DB2ED,0xFD20FA7C,
+	0xC0603000,0x00000000, 0x34420368,0xF156B202,
+	0xC0604000,0x00000000, 0x3435D9EC,0x4ADA7938,
+	0xC0605000,0x00000000, 0x342A81C5,0x89EF6B20,
+	0xC0606000,0x00000000, 0x342013C7,0x4EDBA307,
+	0xC0607000,0x00000000, 0x341380B1,0x16D6559C,
+	0xC0608000,0x00000000, 0x3407A870,0xF597FDBD,
+	0xC0609000,0x00000000, 0x33FCB2D5,0xA90B7702,
+	0xC060A000,0x00000000, 0x33F16814,0x97ED15B3,
+	0xC060B000,0x00000000, 0x33E51D7F,0xB2CAD2A2,
+	0xC060C000,0x00000000, 0x33D99D33,0x97AB8371,
+	0xC060D000,0x00000000, 0x33CF1249,0x9C720D9D,
+	0xC060E000,0x00000000, 0x33C2D884,0xEEF5FDCB,
+	0xC060F000,0x00000000, 0x33B6DC70,0x0DF1DB4B,
+	0xC0610000,0x00000000, 0x33ABBB5D,0xA5F7C823,
+	0xC0611000,0x00000000, 0x33A0D1FB,0xA7E3A4C0,
+	0xC0612000,0x00000000, 0x3394676B,0xE491D129,
+	0xC0613000,0x00000000, 0x3388C054,0x9D365B29,
+	0xC0614000,0x00000000, 0x337E065B,0x82DD95A0,
+	0xC0615000,0x00000000, 0x33723602,0xEF54AC69,
+	0xC0616000,0x00000000, 0x3366174E,0x477A895F,
+	0xC0617000,0x00000000, 0x335ACC3B,0x91821C8E,
+	0xC0618000,0x00000000, 0x335040F1,0x036F4863,
+	0xC0619000,0x00000000, 0x3343B77A,0x2593EE6B,
+	0xC061A000,0x00000000, 0x3337EAE6,0x36D6144E,
+	0xC061B000,0x00000000, 0x332D0373,0xC81E4174,
+	0xC061C000,0x00000000, 0x332198FA,0x3F30BE25,
+	0xC061D000,0x00000000, 0x331558D0,0x6128BD4E,
+	0xC061E000,0x00000000, 0x3309E527,0x8AB1D4CF,
+	0xC061F000,0x00000000, 0x32FF6992,0x239E5EF6,
+	0xC0620000,0x00000000, 0x32F30D75,0x9323998C,
+	0xC0621000,0x00000000, 0x32E71CA8,0x3D4B8E80,
+	0xC0622000,0x00000000, 0x32DC0944,0x99CC578E,
+	0xC0623000,0x00000000, 0x32D1013B,0xAAFD836F,
+	0xC0624000,0x00000000, 0x32C4A0BD,0x18E64DF7,
+	0xC0625000,0x00000000, 0x32B905DC,0x1C5E896B,
+	0xC0626000,0x00000000, 0x32AE5AB3,0x64643354,
+	0xC0627000,0x00000000, 0x32A2692B,0x129BC035,
+	0xC0628000,0x00000000, 0x3296555C,0xB289E44B,
+	0xC0629000,0x00000000, 0x328B1782,0xC48FB740,
+	0xC062A000,0x00000000, 0x32806E99,0x96332BA1,
+	0xC062B000,0x00000000, 0x3273EEDD,0x1A5A43C3,
+	0xC062C000,0x00000000, 0x32682E16,0x284F5EC5,
+	0xC062D000,0x00000000, 0x325D54F4,0x5E194458,
+	0xC062E000,0x00000000, 0x3251CA69,0x42036ABB,
+	0xC062F000,0x00000000, 0x324594C7,0xAF143039,
+	0xC0630000,0x00000000, 0x323A2DE5,0x9D8543CC,
+	0xC0631000,0x00000000, 0x322FC1CF,0xDB320F7E,
+	0xC0632000,0x00000000, 0x322342FA,0xEE475139,
+	0xC0633000,0x00000000, 0x32175D94,0xD30E6053,
+	0xC0634000,0x00000000, 0x320C5806,0x63B97826,
+	0xC0635000,0x00000000, 0x32013100,0x6935CD61,
+	0xC0636000,0x00000000, 0x31F4DAAF,0x4FFBFFB3,
+	0xC0637000,0x00000000, 0x31E94C26,0xEC673952,
+	0xC0638000,0x00000000, 0x31DEAFF8,0x340C0B95,
+	0xC0639000,0x00000000, 0x31D29CE2,0xEA79B46A,
+	0xC063A000,0x00000000, 0x31C69419,0x7069D2BB,
+	0xC063B000,0x00000000, 0x31BB639D,0x6EAD6486,
+	0xC063C000,0x00000000, 0x31B09CC2,0x6B8A5898,
+	0xC063D000,0x00000000, 0x31A426DB,0xA57B0A42,
+	0xC063E000,0x00000000, 0x31987202,0xD671DAE5,
+	0xC063F000,0x00000000, 0x318DA759,0xE726D293,
+	0xC0640000,0x00000000, 0x3181FC63,0x223FAC81,
+	0xC0641000,0x00000000, 0x3175D167,0x709DA0B4,
+	0xC0642000,0x00000000, 0x316A7770,0x07F03AC8,
+	0xC0643000,0x00000000, 0x31600D82,0xB9F87871,
+	0xC0644000,0x00000000, 0x31537916,0xA222F236,
+	0xC0645000,0x00000000, 0x31479F37,0xC9FE21AD,
+	0xC0646000,0x00000000, 0x313CA7A5,0x6A7BCFC8,
+	0xC0647000,0x00000000, 0x3131614B,0x5767D89A,
+	0xC0648000,0x00000000, 0x31251544,0x4E1F3930,
+	0xC0649000,0x00000000, 0x31199337,0x31FAC105,
+	0xC064A000,0x00000000, 0x310F062C,0x8B65B198,
+	0xC064B000,0x00000000, 0x3102D12C,0x0A9E0104,
+	0xC064C000,0x00000000, 0x30F6D386,0x6ACC4B97,
+	0xC064D000,0x00000000, 0x30EBB08D,0xE1E2E463,
+	0xC064E000,0x00000000, 0x30E0CB6C,0xEBC0FD13,
+	0xC064F000,0x00000000, 0x30D45F77,0x7C0665F8,
+	0xC0650000,0x00000000, 0x30C8B6AE,0x536CB5AF,
+	0xC0651000,0x00000000, 0x30BDFAA6,0xE66C4F31,
+	0xC0652000,0x00000000, 0x30B22EE9,0x65FBFD1B,
+	0xC0653000,0x00000000, 0x30A60EB1,0x7EF85D0D,
+	0xC0654000,0x00000000, 0x309AC1C9,0x07F821BE,
+	0xC0655000,0x00000000, 0x30903A9A,0xD316D390,
+	0xC0656000,0x00000000, 0x3083AFCA,0x550DD136,
+	0xC0657000,0x00000000, 0x3077E193,0x226E335D,
+	0xC0658000,0x00000000, 0x306CF824,0x1B8EE293,
+	0xC0659000,0x00000000, 0x3061921D,0xEE86611D,
+	0xC065A000,0x00000000, 0x3055507D,0xDC92DC42,
+	0xC065B000,0x00000000, 0x3049DB0F,0x17C8BAA3,
+	0xC065C000,0x00000000, 0x303F5D53,0x0B4F5EDD,
+	0xC065D000,0x00000000, 0x30330608,0x0B261DF1,
+	0xC065E000,0x00000000, 0x302713A5,0x90C2E245,
+	0xC065F000,0x00000000, 0x301BFE56,0x76BCAA44,
+	0xC0660000,0x00000000, 0x3010FA9A,0x8317651F,
+	0xC0661000,0x00000000, 0x300498B2,0x57D83DE3,
+	0xC0662000,0x00000000, 0x2FF8FC1A,0xB74075B7,
+	0xC0663000,0x00000000, 0x2FEE4EDD,0xE61DC97E,
+	0xC0664000,0x00000000, 0x2FE261FD,0x9796A399,
+	0xC0665000,0x00000000, 0x2FD64CA7,0xB888FA1D,
+	0xC0666000,0x00000000, 0x2FCB0CF2,0xE1EEDED3,
+	0xC0667000,0x00000000, 0x2FC06831,0x98EF71D5,
+	0xC0668000,0x00000000, 0x2FB3E717,0xB201AAD5,
+	0xC0669000,0x00000000, 0x2FA824A8,0xE2512510,
+	0xC066A000,0x00000000, 0x2F9D4984,0xEB4005E2,
+	0xC066B000,0x00000000, 0x2F91C379,0xABA70739,
+	0xC066C000,0x00000000, 0x2F858C5D,0xC99E4AE4,
+	0xC066D000,0x00000000, 0x2F7A23B0,0xCE96EDDA,
+	0xC066E000,0x00000000, 0x2F6FB56E,0x5C09773B,
+	0xC066F000,0x00000000, 0x2F633B78,0x88A9F49B,
+	0xC0670000,0x00000000, 0x2F575478,0xD6CDDEE7,
+	0xC0671000,0x00000000, 0x2F4C4CF9,0x8C5E2C92,
+	0xC0672000,0x00000000, 0x2F412A4C,0xA1CD1638,
+	0xC0673000,0x00000000, 0x2F34D28D,0xF7A5B4DC,
+	0xC0674000,0x00000000, 0x2F29424A,0x1FCF52E8,
+	0xC0675000,0x00000000, 0x2F1EA401,0x7791D026,
+	0xC0676000,0x00000000, 0x2F1295A1,0x45C1BAB3,
+	0xC0677000,0x00000000, 0x2F068B4C,0x00F3E95D,
+	0xC0678000,0x00000000, 0x2EFB58EF,0xE08487FC,
+	0xC0679000,0x00000000, 0x2EF09648,0x6F5A6E1A,
+	0xC067A000,0x00000000, 0x2EE41F00,0x68A7A854,
+	0xC067B000,0x00000000, 0x2ED8687B,0x15488026,
+	0xC067C000,0x00000000, 0x2ECD9BCA,0x54C1887C,
+	0xC067D000,0x00000000, 0x2EC1F560,0x100DEE0F,
+	0xC067E000,0x00000000, 0x2EB5C8E5,0xE89B7F87,
+	0xC067F000,0x00000000, 0x2EAA6D1E,0x8D526902,
+	0xC0680000,0x00000000, 0x2EA00740,0x96A5A34C,
+	0xC0681000,0x00000000, 0x2E93717F,0x24487465,
+	0xC0682000,0x00000000, 0x2E879602,0x36EB8104,
+	0xC0683000,0x00000000, 0x2E7C9C79,0x889467B5,
+	0xC0684000,0x00000000, 0x2E715A84,0xBC2C099D,
+	0xC0685000,0x00000000, 0x2E650D0C,0x1F0AC85B,
+	0xC0686000,0x00000000, 0x2E59893E,0xB0EDBC2F,
+	0xC0687000,0x00000000, 0x2E4EFA14,0x33557C10,
+	0xC0688000,0x00000000, 0x2E42C9D6,0x038F58D1,
+	0xC0689000,0x00000000, 0x2E36CAA0,0x412C37F9,
+	0xC068A000,0x00000000, 0x2E2BA5C2,0x54D94663,
+	0xC068B000,0x00000000, 0x2E20C4E0,0xBE177EE0,
+	0xC068C000,0x00000000, 0x2E145786,0x2D6588F1,
+	0xC068D000,0x00000000, 0x2E08AD0B,0xCCB4BEE1,
+	0xC068E000,0x00000000, 0x2DFDEEF6,0xDA3E109F,
+	0xC068F000,0x00000000, 0x2DF227D2,0xA1397AC6,
+	0xC0690000,0x00000000, 0x2DE60618,0x12054CFA,
+	0xC0691000,0x00000000, 0x2DDAB75A,0x9120CA42,
+	0xC0692000,0x00000000, 0x2DD03447,0x1B2BFC6C,
+	0xC0693000,0x00000000, 0x2DC3A81D,0x83B44A7F,
+	0xC0694000,0x00000000, 0x2DB7D843,0xB0A76D0D,
+	0xC0695000,0x00000000, 0x2DACECD8,0xD7E89519,
+	0xC0696000,0x00000000, 0x2DA18B44,0x4A94063D,
+	0xC0697000,0x00000000, 0x2D95482E,0x96981584,
+	0xC0698000,0x00000000, 0x2D89D0FA,0x94730B8E,
+	0xC0699000,0x00000000, 0x2D7F5118,0xB940B387,
+	0xC069A000,0x00000000, 0x2D72FE9D,0x687DDA2E,
+	0xC069B000,0x00000000, 0x2D670AA6,0x6782774A,
+	0xC069C000,0x00000000, 0x2D5BF36C,0x968F6C0E,
+	0xC069D000,0x00000000, 0x2D50F3FB,0xF0D8EE55,
+	0xC069E000,0x00000000, 0x2D4490AA,0xB96AF02F,
+	0xC069F000,0x00000000, 0x2D38F25D,0x1FC57078,
+	0xC06A0000,0x00000000, 0x2D2E430D,0x04EC3068,
+	0xC06A1000,0x00000000, 0x2D225AD2,0xE8EE34BD,
+	0xC06A2000,0x00000000, 0x2D1643F6,0x2385C65C,
+	0xC06A3000,0x00000000, 0x2D0B0267,0x1D71B93D,
+	0xC06A4000,0x00000000, 0x2D0061CC,0x1B09E660,
+	0xC06A5000,0x00000000, 0x2CF3DF55,0x5140BD7A,
+	0xC06A6000,0x00000000, 0x2CE81B3F,0x492A453B,
+	0xC06A7000,0x00000000, 0x2CDD3E19,0xEDB316C4,
+	0xC06A8000,0x00000000, 0x2CD1BC8C,0xC9861A79,
+	0xC06A9000,0x00000000, 0x2CC583F7,0x2BE0C4D9,
+	0xC06AA000,0x00000000, 0x2CBA197F,0xFA4A691E,
+	0xC06AB000,0x00000000, 0x2CAFA911,0xB08AA648,
+	0xC06AC000,0x00000000, 0x2CA333F9,0x10844D90,
+	0xC06AD000,0x00000000, 0x2C974B60,0x67B3CF3B,
+	0xC06AE000,0x00000000, 0x2C8C41F1,0x03DDBC48,
+	0xC06AF000,0x00000000, 0x2C81239B,0x774EB129,
+	0xC06B0000,0x00000000, 0x2C74CA6F,0xCABED982,
+	0xC06B1000,0x00000000, 0x2C693871,0x2B898A72,
+	0xC06B2000,0x00000000, 0x2C5E980F,0x65223146,
+	0xC06B3000,0x00000000, 0x2C528E62,0x7542C714,
+	0xC06B4000,0x00000000, 0x2C468282,0x0004CF81,
+	0xC06B5000,0x00000000, 0x2C3B4E46,0x7C1091DF,
+	0xC06B6000,0x00000000, 0x2C308FD0,0xF98CC130,
+	0xC06B7000,0x00000000, 0x2C241728,0x3BEEACF1,
+	0xC06B8000,0x00000000, 0x2C185EF7,0x0B496E3E,
+	0xC06B9000,0x00000000, 0x2C0D903F,0x442E9815,
+	0xC06BA000,0x00000000, 0x2C01EE5F,0xB9B0362F,
+	0xC06BB000,0x00000000, 0x2BF5C067,0xB1889D0C,
+	0xC06BC000,0x00000000, 0x2BEA62D1,0x1883DD7F,
+	0xC06BD000,0x00000000, 0x2BE00100,0xE3EF418F,
+	0xC06BE000,0x00000000, 0x2BD369EA,0x9C1F03D9,
+	0xC06BF000,0x00000000, 0x2BC78CD0,0x3AF93AF7,
+	0xC06C0000,0x00000000, 0x2BBC9152,0x01A1E776,
+	0xC06C1000,0x00000000, 0x2BB153C0,0xC5319C86,
+	0xC06C2000,0x00000000, 0x2BA504D7,0x244D31C8,
+	0xC06C3000,0x00000000, 0x2B997F4A,0x12FFE7E6,
+	0xC06C4000,0x00000000, 0x2B8EEE00,0x926A16FA,
+	0xC06C5000,0x00000000, 0x2B82C282,0xD8AC23F6,
+	0xC06C6000,0x00000000, 0x2B76C1BD,0x8FB6D644,
+	0xC06C7000,0x00000000, 0x2B6B9AFA,0xFD3640C5,
+	0xC06C8000,0x00000000, 0x2B60BE57,0x1DE802D5,
+	0xC06C9000,0x00000000, 0x2B544F97,0xF779B5BB,
+	0xC06CA000,0x00000000, 0x2B48A36D,0x07970034,
+	0xC06CB000,0x00000000, 0x2B3DE34B,0x5C8B6436,
+	0xC06CC000,0x00000000, 0x2B3220BE,0x9FF8E556,
+	0xC06CD000,0x00000000, 0x2B25FD81,0xFF523D5A,
+	0xC06CE000,0x00000000, 0x2B1AACF0,0x2B65943F,
+	0xC06CF000,0x00000000, 0x2B102DF5,0xDAB833D6,
+	0xC06D0000,0x00000000, 0x2B03A073,0xB05C42E7,
+	0xC06D1000,0x00000000, 0x2AF7CEF7,0xE016F071,
+	0xC06D2000,0x00000000, 0x2AECE191,0xFB733AC4,
+	0xC06D3000,0x00000000, 0x2AE1846D,0x524EBB8E,
+	0xC06D4000,0x00000000, 0x2AD53FE2,0x8DF496F2,
+	0xC06D5000,0x00000000, 0x2AC9C6E9,0xFF27F70A,
+	0xC06D6000,0x00000000, 0x2ABF44E3,0x2B95DAE1,
+	0xC06D7000,0x00000000, 0x2AB2F735,0xAA09C9F6,
+	0xC06D8000,0x00000000, 0x2AA701AA,0xC02BB536,
+	0xC06D9000,0x00000000, 0x2A9BE886,0xF79B51D1,
+	0xC06DA000,0x00000000, 0x2A90ED5F,0xF3402AFB,
+	0xC06DB000,0x00000000, 0x2A8488A6,0x3C657B08,
+	0xC06DC000,0x00000000, 0x2A78E8A3,0x5471E469,
+	0xC06DD000,0x00000000, 0x2A6E3740,0xBF02F2F0,
+	0xC06DE000,0x00000000, 0x2A6253AB,0x058B2B8A,
+	0xC06DF000,0x00000000, 0x2A563B47,0xF22D7FE0,
+	0xC06E0000,0x00000000, 0x2A4AF7DF,0x757D4EB7,
+	0xC06E1000,0x00000000, 0x2A405B69,0x1B894584,
+	0xC06E2000,0x00000000, 0x2A33D795,0xF6E91C26,
+	0xC06E3000,0x00000000, 0x2A2811D9,0x5B6BF328,
+	0xC06E4000,0x00000000, 0x2A1D32B3,0x63B58467,
+	0xC06E5000,0x00000000, 0x2A11B5A2,0x9A92C4A3,
+	0xC06E6000,0x00000000, 0x2A057B93,0xD4943E4D,
+	0xC06E7000,0x00000000, 0x29FA0F53,0x1F12959C,
+	0xC06E8000,0x00000000, 0x29EF9CB9,0xD6D3DFFE,
+	0xC06E9000,0x00000000, 0x29E32C7C,0x84B22BEA,
+	0xC06EA000,0x00000000, 0x29D7424B,0x845DC019,
+	0xC06EB000,0x00000000, 0x29CC36EC,0xC88A317E,
+	0xC06EC000,0x00000000, 0x29C11CEC,0xE8B5D57F,
+	0xC06ED000,0x00000000, 0x29B4C254,0xC80B14D0,
+	0xC06EE000,0x00000000, 0x29A92E9C,0x0E16205F,
+	0xC06EF000,0x00000000, 0x299E8C21,0xFAEBAC57,
+	0xC06F0000,0x00000000, 0x29928726,0x77E280EB,
+	0xC06F1000,0x00000000, 0x298679BB,0x6C46044F,
+	0xC06F2000,0x00000000, 0x297B43A1,0x3FB207F5,
+	0xC06F3000,0x00000000, 0x2970895C,0x092551E4,
+	0xC06F4000,0x00000000, 0x29640F53,0x1E1E6723,
+	0xC06F5000,0x00000000, 0x29585576,0xB701D2B1,
+	0xC06F6000,0x00000000, 0x294D84B8,0xB3AC2CDB,
+	0xC06F7000,0x00000000, 0x2941E762,0x1E15AEF0,
+	0xC06F8000,0x00000000, 0x2935B7EC,0xCA1A01D7,
+	0xC06F9000,0x00000000, 0x292A5887,0xA7F31CB0,
+	0xC06FA000,0x00000000, 0x291FF587,0x41C3A08D,
+	0xC06FB000,0x00000000, 0x29136259,0x087F3B99,
+	0xC06FC000,0x00000000, 0x290783A1,0xD4C0FAA7,
+	0xC06FD000,0x00000000, 0x28FC862E,0xD3F1A170,
+	0xC06FE000,0x00000000, 0x28F14CFF,0x7170EC0D,
+	0xC06FF000,0x00000000, 0x28E4FCA5,0x5CA6A3F9,
+	0xC0700000,0x00000000, 0x28D97559,0x56AD4E9C,
+	0xC0700800,0x00000000, 0x28CEE1F1,0xA6CCE40D,
+	0xC0701000,0x00000000, 0x28C2BB32,0x88D6F0AD,
+	0xC0701800,0x00000000, 0x28B6B8DE,0x5511E382,
+	0xC0702000,0x00000000, 0x28AB9037,0xD955CA2E,
+	0xC0702800,0x00000000, 0x28A0B7D0,0x0A33C517,
+	0xC0703000,0x00000000, 0x289447AC,0xD90DE0A6,
+	0xC0703800,0x00000000, 0x288899D2,0x029C957A,
+	0xC0704000,0x00000000, 0x287DD7A4,0x6B8D85D6,
+	0xC0704800,0x00000000, 0x287219AD,0x6126686B,
+	0xC0705000,0x00000000, 0x2865F4EF,0x4590950A,
+	0xC0705800,0x00000000, 0x285AA289,0xD5309C57,
+	0xC0706000,0x00000000, 0x285027A7,0x10C54ACD,
+	0xC0706800,0x00000000, 0x284398CC,0xD9DB17AA,
+	0xC0707000,0x00000000, 0x2837C5AF,0xAF527A12,
+	0xC0707800,0x00000000, 0x282CD64F,0x847760ED,
+	0xC0708000,0x00000000, 0x28217D99,0x04ABF72C,
+	0xC0708800,0x00000000, 0x28153799,0xC1650CA8,
+	0xC0709000,0x00000000, 0x2809BCDD,0x565F45B5,
+	0xC0709800,0x00000000, 0x27FF38B2,0x60730C9A,
+	0xC070A000,0x00000000, 0x27F2EFD0,0xCEA959AA,
+	0xC070A800,0x00000000, 0x27E6F8B2,0x99608C61,
+	0xC070B000,0x00000000, 0x27DBDDA5,0x9837B646,
+	0xC070B800,0x00000000, 0x27D0E6C6,0x894B8B8D,
+	0xC070C000,0x00000000, 0x27C480A4,0xDF8F6E9C,
+	0xC070C800,0x00000000, 0x27B8DEED,0x53CAD040,
+	0xC070D000,0x00000000, 0x27AE2B79,0x12964F75,
+	0xC070D800,0x00000000, 0x27A24C85,0xEC56ACC8,
+	0xC070E000,0x00000000, 0x2796329D,0x232DE199,
+	0xC070E800,0x00000000, 0x278AED5B,0xE87747B3,
+	0xC070F000,0x00000000, 0x27805508,0x9974ACB1,
+	0xC070F800,0x00000000, 0x2773CFD9,0xA1CCDD2B,
+	0xC0710000,0x00000000, 0x27680877,0x17A7F1BB,
+	0xC0710800,0x00000000, 0x275D2751,0x4B8B09AA,
+	0xC0711000,0x00000000, 0x2751AEBB,0x1DBF8F18,
+	0xC0711800,0x00000000, 0x27457333,0xC271D71A,
+	0xC0712000,0x00000000, 0x273A052A,0x3B62EE2A,
+	0xC0712800,0x00000000, 0x272F9066,0xCD042388,
+	0xC0713000,0x00000000, 0x27232502,0xE40FD165,
+	0xC0713800,0x00000000, 0x2717393A,0x2B69CA7C,
+	0xC0714000,0x00000000, 0x270C2BEC,0xD8B63E07,
+	0xC0714800,0x00000000, 0x27011640,0xF4FE2032,
+	0xC0715000,0x00000000, 0x26F4BA3C,0xEE4E8949,
+	0xC0715800,0x00000000, 0x26E924CA,0xC5F5EABB,
+	0xC0716000,0x00000000, 0x26DE8039,0x371D7439,
+	0xC0716800,0x00000000, 0x26D27FED,0x4C86FDAB,
+	0xC0717000,0x00000000, 0x26C670F8,0x44618C78,
+	0xC0717800,0x00000000, 0x26BB3900,0x29CA11FD,
+	0xC0718000,0x00000000, 0x26B082E9,0x9D288282,
+	0xC0718800,0x00000000, 0x26A40781,0x0E059D23,
+	0xC0719000,0x00000000, 0x26984BFA,0x16FF6B94,
+	0xC0719800,0x00000000, 0x268D7936,0xA17921AD,
+	0xC071A000,0x00000000, 0x2681E067,0x3C2DECBD,
+	0xC071A800,0x00000000, 0x2675AF75,0x31053785,
+	0xC071B000,0x00000000, 0x266A4E42,0x3A0F478C,
+	0xC071B800,0x00000000, 0x265FE911,0x991456DD,
+	0xC071C000,0x00000000, 0x26535ACA,0x684229D8,
+	0xC071C800,0x00000000, 0x26477A77,0x02DCF6E6,
+	0xC071D000,0x00000000, 0x263C7B0F,0xFDD19182,
+	0xC071D800,0x00000000, 0x26314640,0xBFE2B9B4,
+	0xC071E000,0x00000000, 0x2624F476,0xC6D7CA23,
+	0xC071E800,0x00000000, 0x26196B6C,0x7A729201,
+	0xC071F000,0x00000000, 0x260ED5E7,0x6EA7FC79,
+	0xC071F800,0x00000000, 0x2602B3E5,0x12F2BC7A,
+	0xC0720000,0x00000000, 0x25F6B002,0x8FE3A3B8,
+	0xC0720800,0x00000000, 0x25EB8578,0xE7947D03,
+	0xC0721000,0x00000000, 0x25E0B14B,0x81FC651F,
+	0xC0721800,0x00000000, 0x25D43FC4,0xD0ED7682,
+	0xC0722000,0x00000000, 0x25C8903A,0xBC4F2CB1,
+	0xC0722800,0x00000000, 0x25BDCC02,0x057E62AB,
+	0xC0723000,0x00000000, 0x25B2129E,0xE3AE9B2D,
+	0xC0723800,0x00000000, 0x25A5EC5F,0xE3723D57,
+	0xC0724000,0x00000000, 0x259A9827,0x8CEC9D6A,
+	0xC0724800,0x00000000, 0x2590215A,0xBC5D724B,
+	0xC0725000,0x00000000, 0x25839128,0xFF069A6E,
+	0xC0725800,0x00000000, 0x2577BC6B,0x1CF053B3,
+	0xC0726000,0x00000000, 0x256CCB11,0x713E403A,
+	0xC0726800,0x00000000, 0x256176C7,0x60A1971F,
+	0xC0727000,0x00000000, 0x25552F54,0x2FA6A0CE,
+	0xC0727800,0x00000000, 0x2549B2D4,0x98915917,
+	0xC0728000,0x00000000, 0x253F2C86,0x55FD39E2,
+	0xC0728800,0x00000000, 0x2532E86E,0xD53C662C,
+	0xC0729000,0x00000000, 0x2526EFBD,0xF1C3759B,
+	0xC0729800,0x00000000, 0x251BD2C8,0x76BC99AE,
+	0xC072A000,0x00000000, 0x2510E02F,0xB1F9E4EF,
+	0xC072A800,0x00000000, 0x250478A6,0xA1B0D4E6,
+	0xC072B000,0x00000000, 0x24F8D53B,0x1C55C677,
+	0xC072B800,0x00000000, 0x24EE1FB5,0xFDDB3799,
+	0xC072C000,0x00000000, 0x24E24563,0x9C3A49F7,
+	0xC072C800,0x00000000, 0x24D629F5,0xB5352A54,
+	0xC072D000,0x00000000, 0x24CAE2DC,0x74C5EC9D,
+	0xC072D800,0x00000000, 0x24C04EAA,0x93D39A5F,
+	0xC072E000,0x00000000, 0x24B3C820,0x50BE8C92,
+	0xC072E800,0x00000000, 0x24A7FF18,0x7C70929F,
+	0xC072F000,0x00000000, 0x249D1BF3,0xA3780EA3,
+	0xC072F800,0x00000000, 0x2491A7D6,0x51FF6C45,
+	0xC0730000,0x00000000, 0x24856AD6,0xF4332E86,
+	0xC0730800,0x00000000, 0x2479FB05,0x4DAF8837,
+	0xC0731000,0x00000000, 0x246F8418,0x913B2B95,
+	0xC0731800,0x00000000, 0x24631D8C,0x2D79F179,
+	0xC0732000,0x00000000, 0x2457302C,0x5B769158,
+	0xC0732800,0x00000000, 0x244C20F1,0x32B53B17,
+	0xC0733000,0x00000000, 0x24410F97,0x9B2393BD,
+	0xC0733800,0x00000000, 0x2434B228,0x3C4DD490,
+	0xC0734000,0x00000000, 0x24291AFD,0x51AA54F3,
+	0xC0734800,0x00000000, 0x241E7455,0x17E77100,
+	0xC0735000,0x00000000, 0x241278B6,0xF216C0AD,
+	0xC0735800,0x00000000, 0x24066838,0x8701F200,
+	0xC0736000,0x00000000, 0x23FB2E63,0x38BA7970,
+	0xC0736800,0x00000000, 0x23F07C79,0xB49B176B,
+	0xC0737000,0x00000000, 0x23E3FFB2,0x0A738C27,
+	0xC0737800,0x00000000, 0x23D84281,0x29D08755,
+	0xC0738000,0x00000000, 0x23CD6DB9,0x0BD50085,
+	0xC0738800,0x00000000, 0x23C1D96F,0x12E8EE34,
+	0xC0739000,0x00000000, 0x23B5A700,0xE5004888,
+	0xC0739800,0x00000000, 0x23AA4400,0xCD481B54,
+	0xC073A000,0x00000000, 0x239FDCA0,0xCBEB1B9C,
+	0xC073A800,0x00000000, 0x2393533E,0xBA414FC2,
+	0xC073B000,0x00000000, 0x2387714F,0xC3E7F204,
+	0xC073B800,0x00000000, 0x237C6FF5,0x7D905CBB,
+	0xC073C000,0x00000000, 0x23713F84,0xAF802D9D,
+	0xC073C800,0x00000000, 0x2364EC4B,0x61A1CBF8,
+	0xC073D000,0x00000000, 0x23596183,0x7CCCEACD,
+	0xC073D800,0x00000000, 0x234EC9E1,0xE82630A2,
+	0xC073E000,0x00000000, 0x2342AC9A,0x75E2F3FA,
+	0xC073E800,0x00000000, 0x2336A72A,0x3ED2E1B6,
+	0xC073F000,0x00000000, 0x232B7ABE,0x264F972D,
+	0xC073F800,0x00000000, 0x2320AAC9,0x8443E592,
+	0xC0740000,0x00000000, 0x231437DF,0xDDE45C6A,
+	0xC0740800,0x00000000, 0x230886A7,0x333905C3,
+	0xC0741000,0x00000000, 0x22FDC064,0x289898E4,
+	0xC0741800,0x00000000, 0x22F20B93,0x267E8023,
+	0xC0742000,0x00000000, 0x22E5E3D3,0xD7A9A1CD,
+	0xC0742800,0x00000000, 0x22DA8DC9,0x5104F056,
+	0xC0743000,0x00000000, 0x22D01B10,0xDC8B3B1D,
+	0xC0743800,0x00000000, 0x22C38988,0x1EB5111E,
+	0xC0744000,0x00000000, 0x22B7B32A,0x2787541B,
+	0xC0744800,0x00000000, 0x22ACBFD7,0xC011BC66,
+	0xC0745000,0x00000000, 0x22A16FF8,0x6525E12C,
+	0xC0745800,0x00000000, 0x22952711,0xD776FB6B,
+	0xC0746000,0x00000000, 0x2289A8CF,0xC4372B65,
+	0xC0746800,0x00000000, 0x227F205F,0x0A5A0D1B,
+	0xC0747000,0x00000000, 0x2272E10F,0xBCA33CB4,
+	0xC0747800,0x00000000, 0x2266E6CC,0xC7F771FA,
+	0xC0748000,0x00000000, 0x225BC7EF,0x9182A19B,
+	0xC0748800,0x00000000, 0x2250D99B,0x6C4A704B,
+	0xC0749000,0x00000000, 0x224470AB,0x81923181,
+	0xC0749800,0x00000000, 0x2238CB8C,0xAC98ED11,
+	0xC074A000,0x00000000, 0x222E13F7,0x7F074FF1,
+	0xC074A800,0x00000000, 0x22223E44,0x14200125,
+	0xC074B000,0x00000000, 0x22162151,0xA6F21C90,
+	0xC074B800,0x00000000, 0x220AD861,0x18D0259C,
+	0xC074C000,0x00000000, 0x2200484F,0x09ADEDE8,
+	0xC074C800,0x00000000, 0x21F3C06A,0x02912BE9,
+	0xC074D000,0x00000000, 0x21E7F5BD,0x8858B612,
+	0xC074D800,0x00000000, 0x21DD109A,0x69C1A855,
+	0xC074E000,0x00000000, 0x21D1A0F4,0x3645B77A,
+	0xC074E800,0x00000000, 0x21C5627D,0x68926316,
+	0xC074F000,0x00000000, 0x21B9F0E4,0x546D1388,
+	0xC074F800,0x00000000, 0x21AF77CF,0x21996E13,
+	0xC0750000,0x00000000, 0x21A31618,0x5FCDB131,
+	0xC0750800,0x00000000, 0x21972722,0x13234163,
+	0xC0751000,0x00000000, 0x218C15F9,0xD4DB28FE,
+	0xC0751800,0x00000000, 0x218108F0,0xDA2297F6,
+	0xC0752000,0x00000000, 0x2174AA16,0xB0CE0F41,
+	0xC0752800,0x00000000, 0x21691133,0xAFB55F9B,
+	0xC0753000,0x00000000, 0x215E6875,0x9B7A3FAE,
+	0xC0753800,0x00000000, 0x21527183,0x6778BB0A,
+	0xC0754000,0x00000000, 0x21465F7C,0x32D2440B,
+	0xC0754800,0x00000000, 0x213B23CA,0x6AE5A946,
+	0xC0755000,0x00000000, 0x2130760C,0x4E8236F6,
+	0xC0755800,0x00000000, 0x2123F7E6,0x1237E838,
+	0xC0756000,0x00000000, 0x2118390B,0xEE040482,
+	0xC0756800,0x00000000, 0x210D623F,0xF1000232,
+	0xC0757000,0x00000000, 0x2101D279,0xA1371C02,
+	0xC0757800,0x00000000, 0x20F59E8F,0xE4C1BFF5,
+	0xC0758000,0x00000000, 0x20EA39C3,0x600DF153,
+	0xC0758800,0x00000000, 0x20DFD034,0xD86321A1,
+	0xC0759000,0x00000000, 0x20D34BB5,0xFD56A155,
+	0xC0759800,0x00000000, 0x20C7682C,0x167D3998,
+	0xC075A000,0x00000000, 0x20BC64DF,0x517D5120,
+	0xC075A800,0x00000000, 0x20B138CB,0x3F42D666,
+	0xC075B000,0x00000000, 0x20A4E423,0x2BC64D77,
+	0xC075B800,0x00000000, 0x2099579E,0x5C3A2881,
+	0xC075C000,0x00000000, 0x208EBDE1,0x117307D4,
+	0xC075C800,0x00000000, 0x2082A552,0xB08B72C1,
+	0xC075D000,0x00000000, 0x20769E55,0x6086EEE2,
+	0xC075D800,0x00000000, 0x206B7007,0x93E4F9D5,
+	0xC075E000,0x00000000, 0x2060A44A,0x100CAC19,
+	0xC075E800,0x00000000, 0x20542FFD,0xFEBEEF96,
+	0xC075F000,0x00000000, 0x20487D17,0x65E4F251,
+	0xC075F800,0x00000000, 0x203DB4CA,0xD3177775,
+	0xC0760000,0x00000000, 0x2032048A,0x2883850B,
+	0xC0760800,0x00000000, 0x2025DB4B,0x20E9B007,
+	0xC0761000,0x00000000, 0x201A836F,0x1FE58BBE,
+	0xC0761800,0x00000000, 0x201014C9,0x705995C1,
+	0xC0762000,0x00000000, 0x200381EA,0x37BD35B3,
+	0xC0762800,0x00000000, 0x1FF7A9EC,0xCDAEDEDF,
+	0xC0763000,0x00000000, 0x1FECB4A2,0x6F3C63F6,
+	0xC0763800,0x00000000, 0x1FE1692C,0x112F82B6,
+	0xC0764000,0x00000000, 0x1FD51ED2,0xB794422F,
+	0xC0764800,0x00000000, 0x1FC99ECE,0xD7CA4F47,
+	0xC0765000,0x00000000, 0x1FBF143C,0x7BAFE995,
+	0xC0765800,0x00000000, 0x1FB2D9B3,0x83BE9AA2,
+	0xC0766000,0x00000000, 0x1FA6DDDF,0x1AA00AA3,
+	0xC0766800,0x00000000, 0x1F9BBD1A,0xE6E318A9,
+	0xC0767000,0x00000000, 0x1F90D309,0xB73CCAE2,
+	0xC0767800,0x00000000, 0x1F8468B3,0x7DFC8176,
+	0xC0768000,0x00000000, 0x1F78C1E2,0x031AFD5F,
+	0xC0768800,0x00000000, 0x1F6E083D,0x9450EFC6,
+	0xC0769000,0x00000000, 0x1F623727,0x52F23CC1,
+	0xC0769800,0x00000000, 0x1F5618B0,0xF713FE42,
+	0xC076A000,0x00000000, 0x1F4ACDE9,0xD2FD7A56,
+	0xC076A800,0x00000000, 0x1F4041F5,0xFA0BE761,
+	0xC076B000,0x00000000, 0x1F33B8B6,0xB6183219,
+	0xC076B800,0x00000000, 0x1F27EC66,0x39F3CAA8,
+	0xC076C000,0x00000000, 0x1F1D0545,0x9CAD9872,
+	0xC076C800,0x00000000, 0x1F119A14,0xC98634C6,
+	0xC076D000,0x00000000, 0x1F055A27,0x1E4A125D,
+	0xC076D800,0x00000000, 0x1EF9E6C7,0x4E10DA04,
+	0xC076E000,0x00000000, 0x1EEF6B8A,0x7C401BE2,
+	0xC076E800,0x00000000, 0x1EE30EA7,0x79E8A6FA,
+	0xC076F000,0x00000000, 0x1ED71E1B,0x510F90E2,
+	0xC076F800,0x00000000, 0x1ECC0B06,0xBD7CAEEA,
+	0xC0770000,0x00000000, 0x1EC1024C,0xB0F7F9E9,
+	0xC0770800,0x00000000, 0x1EB4A208,0x4A94CCBB,
+	0xC0771000,0x00000000, 0x1EA9076D,0xDE99A035,
+	0xC0771800,0x00000000, 0x1E9E5C9A,0xC00731EE,
+	0xC0772000,0x00000000, 0x1E926A52,0xAB944B6C,
+	0xC0772800,0x00000000, 0x1E8656C3,0x467E16A9,
+	0xC0773000,0x00000000, 0x1E7B1935,0xBEAEADB3,
+	0xC0773800,0x00000000, 0x1E706FA1,0x69E36941,
+	0xC0774000,0x00000000, 0x1E63F01D,0x2422DC00,
+	0xC0774800,0x00000000, 0x1E582F9A,0x62295194,
+	0xC0775000,0x00000000, 0x1E4D56CB,0x4F3B0E14,
+	0xC0775800,0x00000000, 0x1E41CB86,0xE60948B4,
+	0xC0776000,0x00000000, 0x1E359622,0x2F00A953,
+	0xC0776800,0x00000000, 0x1E2A2F89,0xF0D1BEA5,
+	0xC0777000,0x00000000, 0x1E1FC3CD,0xBC9858C5,
+	0xC0777800,0x00000000, 0x1E134430,0x305C8533,
+	0xC0778000,0x00000000, 0x1E075F0B,0xF938A647,
+	0xC0778800,0x00000000, 0x1DFC59CD,0x77E86566,
+	0xC0779000,0x00000000, 0x1DF13214,0x6E24A8F9,
+	0xC0779800,0x00000000, 0x1DE4DBFE,0x24076EBF,
+	0xC077A000,0x00000000, 0x1DD94DBD,0x1738B12B,
+	0xC077A800,0x00000000, 0x1DCEB1E4,0xE8BAC000,
+	0xC077B000,0x00000000, 0x1DC29E0D,0xC1D08325,
+	0xC077B800,0x00000000, 0x1DB69583,0xF3A7A302,
+	0xC077C000,0x00000000, 0x1DAB6555,0x2EB32927,
+	0xC077C800,0x00000000, 0x1DA09DCD,0x2459813C,
+	0xC077D000,0x00000000, 0x1D94281F,0x324A0531,
+	0xC077D800,0x00000000, 0x1D88738B,0x52DE5579,
+	0xC077E000,0x00000000, 0x1D7DA936,0x0336FDCE,
+	0xC077E800,0x00000000, 0x1D71FD83,0xE8AB82AC,
+	0xC077F000,0x00000000, 0x1D65D2C5,0xBDE5D77A,
+	0xC077F800,0x00000000, 0x1D5A7918,0xF7FB03C7,
+	0xC0780000,0x00000000, 0x1D500E84,0x76D3D23E,
+	0xC0780800,0x00000000, 0x1D437A4F,0x48F6360D,
+	0xC0781000,0x00000000, 0x1D37A0B3,0x0DFEE42C,
+	0xC0781800,0x00000000, 0x1D2CA971,0x7D096FFB,
+	0xC0782000,0x00000000, 0x1D216262,0x63B5908B,
+	0xC0782800,0x00000000, 0x1D151696,0xCEBD1847,
+	0xC0783000,0x00000000, 0x1D0994D1,0xD1C4EF99,
+	0xC0783800,0x00000000, 0x1CFF081E,0xA825EB44,
+	0xC0784000,0x00000000, 0x1CF2D25A,0x296FAD56,
+	0xC0784800,0x00000000, 0x1CE6D4F4,0xE8615096,
+	0xC0785000,0x00000000, 0x1CDBB24A,0x7537EE42,
+	0xC0785800,0x00000000, 0x1CD0CC7A,0x91D0F5EE,
+	0xC0786000,0x00000000, 0x1CC460BE,0x95B93B11,
+	0xC0786800,0x00000000, 0x1CB8B83B,0x1E6343C8,
+	0xC0787000,0x00000000, 0x1CADFC88,0x3BEF20CE,
+	0xC0787800,0x00000000, 0x1CA2300D,0x579BD371,
+	0xC0788000,0x00000000, 0x1C961013,0xA44A98A8,
+	0xC0788800,0x00000000, 0x1C8AC376,0xA1B611AE,
+	0xC0789000,0x00000000, 0x1C803B9F,0x63F62777,
+	0xC0789800,0x00000000, 0x1C73B106,0x6A278B32,
+	0xC078A000,0x00000000, 0x1C67E312,0x8FD5CD18,
+	0xC078A800,0x00000000, 0x1C5CF9F5,0x3A824D16,
+	0xC078B000,0x00000000, 0x1C519338,0x0AB510C9,
+	0xC078B800,0x00000000, 0x1C4551D4,0x141558C6,
+	0xC078C000,0x00000000, 0x1C39DCAE,0x3910BF72,
+	0xC078C800,0x00000000, 0x1C2F5F4A,0x9F51208F,
+	0xC078D000,0x00000000, 0x1C230739,0x7AA8DA7C,
+	0xC078D800,0x00000000, 0x1C171518,0x13DBBF70,
+	0xC078E000,0x00000000, 0x1C0C0017,0xEAEF1AA2,
+	0xC078E800,0x00000000, 0x1C00FBAB,0x1EA0EBAF,
+	0xC078F000,0x00000000, 0x1BF499FD,0x08681AF2,
+	0xC078F800,0x00000000, 0x1BE8FDAB,0xDCDA40F4,
+	0xC0790000,0x00000000, 0x1BDE50C4,0x83C04DCD,
+	0xC0790800,0x00000000, 0x1BD26324,0xBD513DE8,
+	0xC0791000,0x00000000, 0x1BC64E0D,0xC0B1829F,
+	0xC0791800,0x00000000, 0x1BBB0EA5,0x327933E8,
+	0xC0792000,0x00000000, 0x1BB06939,0x05C49814,
+	0xC0792800,0x00000000, 0x1BA3E857,0x3F05089B,
+	0xC0793000,0x00000000, 0x1B98262C,0x84D06CB5,
+	0xC0793800,0x00000000, 0x1B8D4B5B,0x24C7B9DD,
+	0xC0794000,0x00000000, 0x1B81C496,0xE050B08F,
+	0xC0794800,0x00000000, 0x1B758DB7,0xC2749068,
+	0xC0795000,0x00000000, 0x1B6A2554,0x7E0513F7,
+	0xC0795800,0x00000000, 0x1B5FB76B,0x76A76D99,
+	0xC0796000,0x00000000, 0x1B533CAD,0x522DD473,
+	0xC0796800,0x00000000, 0x1B4755EF,0x6AB69B91,
+	0xC0797000,0x00000000, 0x1B3C4EBF,0xEF2238B1,
+	0xC0797800,0x00000000, 0x1B312B60,0x3B20006F,
+	0xC0798000,0x00000000, 0x1B24D3DC,0x4927CBDA,
+	0xC0798800,0x00000000, 0x1B1943DF,0xAC478133,
+	0xC0799000,0x00000000, 0x1B0EA5ED,0x6C2A4D75,
+	0xC0799800,0x00000000, 0x1B0296CB,0xA896DE1B,
+	0xC079A000,0x00000000, 0x1AF68CB5,0xF6DD5C08,
+	0xC079A800,0x00000000, 0x1AEB5AA6,0xF5194C12,
+	0xC079B000,0x00000000, 0x1AE09752,0xC02D903D,
+	0xC079B800,0x00000000, 0x1AD42043,0x7752EA23,
+	0xC079C000,0x00000000, 0x1AC86A02,0xF8B1239C,
+	0xC079C800,0x00000000, 0x1ABD9DA5,0xB733DB96,
+	0xC079D000,0x00000000, 0x1AB1F680,0x65E4BCB1,
+	0xC079D800,0x00000000, 0x1AA5CA43,0xAD52093F,
+	0xC079E000,0x00000000, 0x1A9A6EC6,0xD7B289DD,
+	0xC079E800,0x00000000, 0x1A900841,0xEF05A000,
+	0xC079F000,0x00000000, 0x1A8372B7,0x5137B3C5,
+	0xC079F800,0x00000000, 0x1A77977C,0xE70FE08C,
+	0xC07A0000,0x00000000, 0x1A6C9E44,0xE7C4C3CF,
+	0xC07A0800,0x00000000, 0x1A615B9B,0x5BAF86C5,
+	0xC07A1000,0x00000000, 0x1A550E5E,0x1BB09E26,
+	0xC07A1800,0x00000000, 0x1A498AD8,0xB0A1CF33,
+	0xC07A2000,0x00000000, 0x1A3EFC05,0x8DE3E67A,
+	0xC07A2800,0x00000000, 0x1A32CB03,0xAC981201,
+	0xC07A3000,0x00000000, 0x1A26CC0E,0x2FDFDC75,
+	0xC07A3800,0x00000000, 0x1A1BA77E,0x3ADBB65A,
+	0xC07A4000,0x00000000, 0x1A10C5ED,0xFB075673,
+	0xC07A4800,0x00000000, 0x1A0458CC,0xC7924DAB,
+	0xC07A5000,0x00000000, 0x19F8AE97,0xFCF99F91,
+	0xC07A5800,0x00000000, 0x19EDF0D7,0x74199EE5,
+	0xC07A6000,0x00000000, 0x19E228F6,0x210807EB,
+	0xC07A6800,0x00000000, 0x19D60779,0xAD463813,
+	0xC07A7000,0x00000000, 0x19CAB907,0x8362B189,
+	0xC07A7800,0x00000000, 0x19C0354B,0x4675AF48,
+	0xC07A8000,0x00000000, 0x19B3A959,0x1D939844,
+	0xC07A8800,0x00000000, 0x19A7D9C2,0x88934804,
+	0xC07A9000,0x00000000, 0x199CEEA9,0x4186E084,
+	0xC07A9800,0x00000000, 0x19918C5D,0xF8C6E08D,
+	0xC07AA000,0x00000000, 0x19854984,0x48AFD169,
+	0xC07AA800,0x00000000, 0x1979D299,0x13E3413F,
+	0xC07AB000,0x00000000, 0x196F530F,0x88EF2209,
+	0xC07AB800,0x00000000, 0x1962FFCE,0x60ECC469,
+	0xC07AC000,0x00000000, 0x19570C18,0x5A2895CC,
+	0xC07AC800,0x00000000, 0x194BF52D,0x5B886049,
+	0xC07AD000,0x00000000, 0x1940F50C,0x221B0447,
+	0xC07AD800,0x00000000, 0x193491F4,0xE90E823E,
+	0xC07AE000,0x00000000, 0x1928F3ED,0xA8FB0088,
+	0xC07AE800,0x00000000, 0x191E44F2,0xE4D84D72,
+	0xC07AF000,0x00000000, 0x19125BF9,0x9B97CBCC,
+	0xC07AF800,0x00000000, 0x1906455B,0xA0192538,
+	0xC07B0000,0x00000000, 0x18FB0418,0xC4A989D9,
+	0xC07B0800,0x00000000, 0x18F062D3,0x212C0EB6,
+	0xC07B1000,0x00000000, 0x18E3E094,0x61AF856E,
+	0xC07B1800,0x00000000, 0x18D81CC2,0x5489E384,
+	0xC07B2000,0x00000000, 0x18CD3FEF,0x6FE84946,
+	0xC07B2800,0x00000000, 0x18C1BDA9,0x8EFEF969,
+	0xC07B3000,0x00000000, 0x18B58550,0x9DD58108,
+	0xC07B3800,0x00000000, 0x18AA1B23,0x061A1D4C,
+	0xC07B4000,0x00000000, 0x189FAB0E,0x04ADC91C,
+	0xC07B4800,0x00000000, 0x1893352D,0x61A5DA76,
+	0xC07B5000,0x00000000, 0x18874CD6,0x69940799,
+	0xC07B5800,0x00000000, 0x187C43B6,0xB57C1253,
+	0xC07B6000,0x00000000, 0x187124AE,0xA52F9DDC,
+	0xC07B6800,0x00000000, 0x1864CBBD,0x99EA7C91,
+	0xC07B7000,0x00000000, 0x18593A06,0x19E62B15,
+	0xC07B7800,0x00000000, 0x184E99FA,0x99EF5A94,
+	0xC07B8000,0x00000000, 0x18428F8C,0x63C3AB07,
+	0xC07B8800,0x00000000, 0x183683EB,0x68D0FDDF,
+	0xC07B9000,0x00000000, 0x182B4FFC,0xE5772C07,
+	0xC07B9800,0x00000000, 0x182090DA,0xE28C66EE,
+	0xC07BA000,0x00000000, 0x1814186A,0xCCA762E8,
+	0xC07BA800,0x00000000, 0x1808607E,0x55E9E22B,
+	0xC07BB000,0x00000000, 0x17FD9219,0xED4B7068,
+	0xC07BB800,0x00000000, 0x17F1EF7F,0x9F1DE17B,
+	0xC07BC000,0x00000000, 0x17E5C1C4,0xEDE2B7E9,
+	0xC07BC800,0x00000000, 0x17DA6478,0xBD79EC79,
+	0xC07BD000,0x00000000, 0x17D00201,0xD7FB0DB5,
+	0xC07BD800,0x00000000, 0x17C36B22,0x4F59C3FC,
+	0xC07BE000,0x00000000, 0x17B78E4A,0x577ADCB4,
+	0xC07BE800,0x00000000, 0x17AC931C,0xADBAECD1,
+	0xC07BF000,0x00000000, 0x17A154D6,0xF815489C,
+	0xC07BF800,0x00000000, 0x17950628,0x9D2E715B,
+	0xC07C0000,0x00000000, 0x178980E3,0x72DC48AD,
+	0xC07C0800,0x00000000, 0x177EEFF1,0x2B12679C,
+	0xC07C1000,0x00000000, 0x1772C3B0,0x0C19D57A,
+	0xC07C1800,0x00000000, 0x1766C32A,0xEFC0CE56,
+	0xC07C2000,0x00000000, 0x175B9CB6,0x3629A932,
+	0xC07C2800,0x00000000, 0x1750BF63,0xF1E0B51D,
+	0xC07C3000,0x00000000, 0x174450DE,0x12522184,
+	0xC07C3800,0x00000000, 0x1738A4F8,0x9D6682A0,
+	0xC07C4000,0x00000000, 0x172DE52B,0x3B08D7C9,
+	0xC07C4800,0x00000000, 0x172221E1,0xAE2288C8,
+	0xC07C5000,0x00000000, 0x1715FEE3,0x10B7ABB4,
+	0xC07C5800,0x00000000, 0x170AAE9C,0x766CBE8F,
+	0xC07C6000,0x00000000, 0x17002EF9,0xA093E03C,
+	0xC07C6800,0x00000000, 0x16F3A1AE,0xCF312F2D,
+	0xC07C7000,0x00000000, 0x16E7D076,0x22C153BF,
+	0xC07C7800,0x00000000, 0x16DCE361,0xB00318E2,
+	0xC07C8000,0x00000000, 0x16D18586,0x92B0A160,
+	0xC07C8800,0x00000000, 0x16C54137,0xBAD595D3,
+	0xC07C9000,0x00000000, 0x16B9C887,0xDCFF7642,
+	0xC07C9800,0x00000000, 0x16AF46D9,0x373D8059,
+	0xC07CA000,0x00000000, 0x16A2F866,0x2B934E56,
+	0xC07CA800,0x00000000, 0x1697031C,0x229765A2,
+	0xC07CB000,0x00000000, 0x168BEA47,0x0D9F1A19,
+	0xC07CB800,0x00000000, 0x1680EE6F,0xBA643F6D,
+	0xC07CC000,0x00000000, 0x167489EF,0xEB4F052E,
+	0xC07CC800,0x00000000, 0x1668EA33,0x418031DC,
+	0xC07CD000,0x00000000, 0x165E3925,0xE1829EDA,
+	0xC07CD800,0x00000000, 0x165254D1,0x45509B7D,
+	0xC07CE000,0x00000000, 0x16463CAC,0xE362200E,
+	0xC07CE800,0x00000000, 0x163AF990,0x73A49DF8,
+	0xC07CF000,0x00000000, 0x16305C6F,0xBB2079C6,
+	0xC07CF800,0x00000000, 0x1623D8D4,0x8AF3DFF3,
+	0xC07D0000,0x00000000, 0x1618135B,0xCFE6D2E6,
+	0xC07D0800,0x00000000, 0x160D3488,0x2EDFADD0,
+	0xC07D1000,0x00000000, 0x1601B6BE,0xF106327D,
+	0xC07D1800,0x00000000, 0x15F57CEC,0xBFDC06DF,
+	0xC07D2000,0x00000000, 0x15EA10F5,0x8783A1BE,
+	0xC07D2800,0x00000000, 0x15DF9EB5,0x64C99073,
+	0xC07D3000,0x00000000, 0x15D32DB0,0x5DA054BB,
+	0xC07D3800,0x00000000, 0x15C743C0,0xF46E62F0,
+	0xC07D4000,0x00000000, 0x15BC38B1,0xC947E18A,
+	0xC07D4800,0x00000000, 0x15B11DFF,0xAB4EA833,
+	0xC07D5000,0x00000000, 0x15A4C3A2,0x15131439,
+	0xC07D5800,0x00000000, 0x15993030,0x5E94D732,
+	0xC07D6000,0x00000000, 0x158E8E0C,0x7038478F,
+	0xC07D6800,0x00000000, 0x1582884F,0xF23C7F91,
+	0xC07D7000,0x00000000, 0x15767B24,0x482BF236,
+	0xC07D7800,0x00000000, 0x156B4556,0xFE2D34BC,
+	0xC07D8000,0x00000000, 0x15608A65,0x8A79F58B,
+	0xC07D8800,0x00000000, 0x15541095,0x3115AB5F,
+	0xC07D9000,0x00000000, 0x154856FD,0x6915A764,
+	0xC07D9800,0x00000000, 0x153D8692,0xA3BBCB8C,
+	0xC07DA000,0x00000000, 0x1531E881,0x934609FB,
+	0xC07DA800,0x00000000, 0x1525B949,0x7E4CD748,
+	0xC07DB000,0x00000000, 0x151A5A2E,0xA7BF96DD,
+	0xC07DB800,0x00000000, 0x150FF788,0x61811243,
+	0xC07DC000,0x00000000, 0x15036390,0x4234EF34,
+	0xC07DC800,0x00000000, 0x14F7851B,0x5DD96D4B,
+	0xC07DD000,0x00000000, 0x14EC87F8,0xCD392224,
+	0xC07DD800,0x00000000, 0x14E14E15,0x37DF2040,
+	0xC07DE000,0x00000000, 0x14D4FDF6,0x51F6AC5A,
+	0xC07DE800,0x00000000, 0x14C976F2,0x16F04E25,
+	0xC07DF000,0x00000000, 0x14BEE3E1,0x7DDAB2DD,
+	0xC07DF800,0x00000000, 0x14B2BC5F,0x46D77414,
+	0xC07E0000,0x00000000, 0x14A6BA4B,0x26A9CD8A,
+	0xC07E0800,0x00000000, 0x149B91F2,0x657DA318,
+	0xC07E1000,0x00000000, 0x1490B8DC,0x755E3E18,
+	0xC07E1800,0x00000000, 0x148448F2,0x74C3978A,
+	0xC07E2000,0x00000000, 0x14789B5C,0xFE32F146,
+	0xC07E2800,0x00000000, 0x146DD983,0x8EF5EAD3,
+	0xC07E3000,0x00000000, 0x14621ACF,0xFDD7705B,
+	0xC07E3800,0x00000000, 0x1455F64F,0xCD50456B,
+	0xC07E4000,0x00000000, 0x144AA435,0x793E3BEE,
+	0xC07E4800,0x00000000, 0x144028AA,0x715A7BE0,
+	0xC07E5000,0x00000000, 0x14339A07,0x7DD59A6E,
+	0xC07E5800,0x00000000, 0x1427C72D,0x5CF59618,
+	0xC07E6000,0x00000000, 0x141CD81E,0x843F67F6,
+	0xC07E6800,0x00000000, 0x14117EB1,0xD767B8A6,
+	0xC07E7000,0x00000000, 0x140538EE,0x69433DD8,
+	0xC07E7800,0x00000000, 0x13F9BE7A,0x92DD0E81,
+	0xC07E8000,0x00000000, 0x13EF3AA7,0xA8605559,
+	0xC07E8800,0x00000000, 0x13E2F100,0xD97BD28A,
+	0xC07E9000,0x00000000, 0x13D6FA23,0x6BCA0954,
+	0xC07E9800,0x00000000, 0x13CBDF64,0xFF8A8827,
+	0xC07EA000,0x00000000, 0x13C0E7D5,0xE67AFD77,
+	0xC07EA800,0x00000000, 0x13B481EE,0x0DF12057,
+	0xC07EB000,0x00000000, 0x13A8E07C,0xA4EEBBE2,
+	0xC07EB800,0x00000000, 0x139E2D5D,0x77F36390,
+	0xC07EC000,0x00000000, 0x13924DAB,0xB964C046,
+	0xC07EC800,0x00000000, 0x13863401,0x893A18D9,
+	0xC07ED000,0x00000000, 0x137AEF0C,0x3DCFFEFB,
+	0xC07ED800,0x00000000, 0x1370560E,0xD2A8E719,
+	0xC07EE000,0x00000000, 0x1363D117,0xB9A41B90,
+	0xC07EE800,0x00000000, 0x135809F8,0xF578E6C5,
+	0xC07EF000,0x00000000, 0x134D2925,0x5FF1867D,
+	0xC07EF800,0x00000000, 0x1341AFD7,0x0558D446,
+	0xC07F0000,0x00000000, 0x1335748C,0x27412D46,
+	0xC07F0800,0x00000000, 0x132A06CC,0x00B50348,
+	0xC07F1000,0x00000000, 0x131F9261,0x9519A49B,
+	0xC07F1800,0x00000000, 0x13132636,0x44F972B2,
+	0xC07F2000,0x00000000, 0x13073AAF,0x09E3B05D,
+	0xC07F2800,0x00000000, 0x12FC2DB1,0x28D83D3D,
+	0xC07F3000,0x00000000, 0x12F11753,0x4C78AC15,
+	0xC07F3800,0x00000000, 0x12E4BB89,0xB965A182,
+	0xC07F4000,0x00000000, 0x12D9265E,0x78D4438D,
+	0xC07F4800,0x00000000, 0x12CE8222,0xED342A1E,
+	0xC07F5000,0x00000000, 0x12C28116,0x52E75F7D,
+	0xC07F5800,0x00000000, 0x12B67260,0x9398284A,
+	0xC07F6000,0x00000000, 0x12AB3AB5,0x3D9C73EB,
+	0xC07F6800,0x00000000, 0x12A083F2,0xB6FA8E98,
+	0xC07F7000,0x00000000, 0x129408C2,0xA36C769C,
+	0xC07F7800,0x00000000, 0x12884D80,0x30C21A26,
+	0xC07F8000,0x00000000, 0x127D7B0F,0xD8C3ABB6,
+	0xC07F8800,0x00000000, 0x1271E186,0x414CB986,
+	0xC07F9000,0x00000000, 0x1265B0D1,0x5D45DC40,
+	0xC07F9800,0x00000000, 0x125A4FE8,0x94F290DE,
+	0xC07FA000,0x00000000, 0x124FEB11,0xF0C5BE05,
+	0xC07FA800,0x00000000, 0x12435C01,0x28A2311F,
+	0xC07FB000,0x00000000, 0x12377BEF,0xF8C5B2B3,
+	0xC07FB800,0x00000000, 0x122C7CD9,0x448D446D,
+	0xC07FC000,0x00000000, 0x12214756,0x1A05BEB0,
+	0xC07FC800,0x00000000, 0x1214F5C7,0x38C9E64F,
+	0xC07FD000,0x00000000, 0x12096D04,0x9B5A68FF,
+	0xC07FD800,0x00000000, 0x11FED7D6,0x8466C3F4,
+	0xC07FE000,0x00000000, 0x11F2B511,0x5BB3D972,
+	0xC07FE800,0x00000000, 0x11E6B16E,0xD3410867,
+	0xC07FF000,0x00000000, 0x11DB8732,0xC7342422,
+	0xC07FF800,0x00000000, 0x11D0B257,0x848180E7,
+	0xC0800000,0x00000000, 0x11C44109,0xEDB20931,
+	0xC0800400,0x00000000, 0x11B891C5,0x1DE88206,
+	0xC0800800,0x00000000, 0x11ADCDE0,0x6E1AA8B3,
+	0xC0800C00,0x00000000, 0x11A213C1,0x0F134487,
+	0xC0801000,0x00000000, 0x1195EDBF,0xE1C1D991,
+	0xC0801400,0x00000000, 0x118A99D2,0x8A41CB19,
+	0xC0801800,0x00000000, 0x1180225D,0xB7D3A3C5,
+	0xC0801C00,0x00000000, 0x11739263,0x285698FB,
+	0xC0802000,0x00000000, 0x1167BDE8,0x35C64224,
+	0xC0802400,0x00000000, 0x115CCCDF,0xBC84EAE3,
+	0xC0802800,0x00000000, 0x115177DF,0xC5E1F3B3,
+	0xC0802C00,0x00000000, 0x114530A8,0x52B5DF63,
+	0xC0803000,0x00000000, 0x1139B471,0x33F452F4,
+	0xC0803400,0x00000000, 0x112F2E7A,0xDA7C746B,
+	0xC0803800,0x00000000, 0x1122E99E,0x69861BD4,
+	0xC0803C00,0x00000000, 0x1116F12E,0x3462E3C8,
+	0xC0804000,0x00000000, 0x110BD487,0x2FA2901F,
+	0xC0804400,0x00000000, 0x1100E13E,0xA55E0328,
+	0xC0804800,0x00000000, 0x10F479EF,0x4FBCCA24,
+	0xC0804C00,0x00000000, 0x10E8D6C9,0xD1CC1958,
+	0xC0805000,0x00000000, 0x10DE2199,0xA65F706A,
+	0xC0805400,0x00000000, 0x10D24688,0xF6BDBA31,
+	0xC0805800,0x00000000, 0x10C62B59,0x904F3938,
+	0xC0805C00,0x00000000, 0x10BAE48C,0x2191DB9B,
+	0xC0806000,0x00000000, 0x10B04FB0,0x66CCC58F,
+	0xC0806400,0x00000000, 0x10A3C95D,0xEC92B164,
+	0xC0806800,0x00000000, 0x10980099,0xC3D259DE,
+	0xC0806C00,0x00000000, 0x108D1DC7,0x01621F8F,
+	0xC0807000,0x00000000, 0x1081A8F1,0xCAE9C04F,
+	0xC0807400,0x00000000, 0x10756C2E,0xD2BE7F0D,
+	0xC0807800,0x00000000, 0x1069FCA6,0x70223E80,
+	0xC0807C00,0x00000000, 0x105F8612,0x93BDA225,
+	0xC0808000,0x00000000, 0x10531EBF,0x168DD58E,
+	0xC0808400,0x00000000, 0x104731A0,0xA8927CAC,
+	0xC0808800,0x00000000, 0x103C22B4,0xD28063BD,
+	0xC0808C00,0x00000000, 0x103110A9,0x87A99BAF,
+	0xC0809000,0x00000000, 0x1024B374,0x85A6AE4A,
+	0xC0809400,0x00000000, 0x10191C90,0x6725C394,
+	0xC0809800,0x00000000, 0x100E763E,0x0F12CD39,
+	0xC0809C00,0x00000000, 0x100279DF,0x84AABC7F,
+	0xC080A000,0x00000000, 0x0FF669A0,0x49C014B6,
+	0xC080A400,0x00000000, 0x0FEB3017,0xA2269916,
+	0xC080A800,0x00000000, 0x0FE07D82,0x6712E6B6,
+	0xC080AC00,0x00000000, 0x0FD400F3,0x227AEEB9,
+	0xC080B000,0x00000000, 0x0FC84406,0xAB7D71AE,
+	0xC080B400,0x00000000, 0x0FBD6F91,0x8AA27EBD,
+	0xC080B800,0x00000000, 0x0FB1DA8D,0xA821DDAD,
+	0xC080BC00,0x00000000, 0x0FA5A85C,0x8983BC92,
+	0xC080C000,0x00000000, 0x0F9A45A6,0x83827EA0,
+	0xC080C400,0x00000000, 0x0F8FDEA0,0x5BDE75C9,
+	0xC080C800,0x00000000, 0x0F835475,0x017AF871,
+	0xC080CC00,0x00000000, 0x0F7772C8,0x26DA58D4,
+	0xC080D000,0x00000000, 0x0F6C71BE,0x1205DD8D,
+	0xC080D400,0x00000000, 0x0F614099,0x9D823B94,
+	0xC080D800,0x00000000, 0x0F54ED9B,0x506932EF,
+	0xC080DC00,0x00000000, 0x0F49631A,0xFE97B9B1,
+	0xC080E000,0x00000000, 0x0F3ECBD0,0x3CE14DD8,
+	0xC080E400,0x00000000, 0x0F32ADC6,0x49926059,
+	0xC080E800,0x00000000, 0x0F26A895,0xF42D3418,
+	0xC080EC00,0x00000000, 0x0F1B7C77,0x59AA4FF6,
+	0xC080F000,0x00000000, 0x0F10ABD5,0x1E4C7042,
+	0xC080F400,0x00000000, 0x0F043924,0x7BE94843,
+	0xC080F800,0x00000000, 0x0EF88830,0xFB115D59,
+	0xC080FC00,0x00000000, 0x0EEDC241,0xD6B1932C,
+	0xC0810000,0x00000000, 0x0EE20CB4,0xE0C2F693,
+	0xC0810400,0x00000000, 0x0ED5E533,0x4CBEBEC8,
+	0xC0810800,0x00000000, 0x0ECA8F73,0xA7E2AB8F,
+	0xC0810C00,0x00000000, 0x0EC01C13,0x7309D953,
+	0xC0811000,0x00000000, 0x0EB38AC1,0xCD8A5E11,
+	0xC0811400,0x00000000, 0x0EA7B4A6,0xABCA1802,
+	0xC0811800,0x00000000, 0x0E9CC1A5,0x571D69E9,
+	0xC0811C00,0x00000000, 0x0E917110,0x5D1587A6,
+	0xC0812000,0x00000000, 0x0E852865,0x75EB0E41,
+	0xC0812400,0x00000000, 0x0E79AA6B,0xBEBE254A,
+	0xC0812800,0x00000000, 0x0E6F2252,0xCBB76A33,
+	0xC0812C00,0x00000000, 0x0E62E23E,0xDA926562,
+	0xC0813000,0x00000000, 0x0E56E83C,0x7B04E02F,
+	0xC0813400,0x00000000, 0x0E4BC9AD,0x9C3FBD04,
+	0xC0813800,0x00000000, 0x0E40DAA9,0xF60C798E,
+	0xC0813C00,0x00000000, 0x0E3471F3,0xAF7A72A4,
+	0xC0814000,0x00000000, 0x0E28CD1A,0xC69E588E,
+	0xC0814400,0x00000000, 0x0E1E15DA,0x6AFC4D3E,
+	0xC0814800,0x00000000, 0x0E123F68,0xFC4575DB,
+	0xC0814C00,0x00000000, 0x0E0622B4,0xF7502E83,
+	0xC0815000,0x00000000, 0x0DFADA10,0x1D510258,
+	0xC0815400,0x00000000, 0x0DF04954,0x7693E4F4,
+	0xC0815800,0x00000000, 0x0DE3C1A7,0x2292901E,
+	0xC0815C00,0x00000000, 0x0DD7F73E,0x3985F587,
+	0xC0816000,0x00000000, 0x0DCD126D,0x11767245,
+	0xC0816400,0x00000000, 0x0DC1A20F,0x40AC4112,
+	0xC0816800,0x00000000, 0x0DB563D4,0xC10E0648,
+	0xC0816C00,0x00000000, 0x0DA9F284,0xD43FEA64,
+	0xC0817000,0x00000000, 0x0D9F79C8,0x5ED5E0EC,
+	0xC0817400,0x00000000, 0x0D93174A,0xD13A901B,
+	0xC0817800,0x00000000, 0x0D872895,0xCF19DE71,
+	0xC0817C00,0x00000000, 0x0D7C17BC,0xC4943A84,
+	0xC0818000,0x00000000, 0x0D710A02,0x5BDDCE90,
+	0xC0818400,0x00000000, 0x0D64AB62,0x789B3F6D,
+	0xC0818800,0x00000000, 0x0D5912C6,0x280B3FE7,
+	0xC0818C00,0x00000000, 0x0D4E6A5D,0xD404B0D4,
+	0xC0819000,0x00000000, 0x0D4272AB,0x866D760E,
+	0xC0819400,0x00000000, 0x0D3660E3,0x694EB13B,
+	0xC0819800,0x00000000, 0x0D2B257E,0x2A2DF540,
+	0xC0819C00,0x00000000, 0x0D207714,0x99C8147D,
+	0xC081A000,0x00000000, 0x0D13F926,0xAD10B4A7,
+	0xC081A400,0x00000000, 0x0D083A90,0xD7D67565,
+	0xC081A800,0x00000000, 0x0CFD6417,0xB798615D,
+	0xC081AC00,0x00000000, 0x0CF1D397,0xC6B5CE12,
+	0xC081B000,0x00000000, 0x0CE59FEB,0x01BCEEA9,
+	0xC081B400,0x00000000, 0x0CDA3B68,0x71DFA060,
+	0xC081B800,0x00000000, 0x0CCFD233,0xA0E64E00,
+	0xC081BC00,0x00000000, 0x0CC34CEB,0xCB9926B8,
+	0xC081C000,0x00000000, 0x0CB769A3,0xE6B296E5,
+	0xC081C400,0x00000000, 0x0CAC66A7,0x33F22068,
+	0xC081C800,0x00000000, 0x0CA139DF,0xC14E1511,
+	0xC081CC00,0x00000000, 0x0C94E572,0x97962240,
+	0xC081D000,0x00000000, 0x0C895935,0x3F25F783,
+	0xC081D400,0x00000000, 0x0C7EBFCE,0xA575BA73,
+	0xC081D800,0x00000000, 0x0C72A67E,0x0F56D28A,
+	0xC081DC00,0x00000000, 0x0C669FC0,0x88158C63,
+	0xC081E000,0x00000000, 0x0C5B71C0,0x1B3DED84,
+	0xC081E400,0x00000000, 0x0C50A555,0x41C161E9,
+	0xC081E800,0x00000000, 0x0C443142,0x1E359EAD,
+	0xC081EC00,0x00000000, 0x0C387EA0,0x94383D7A,
+	0xC081F000,0x00000000, 0x0C2DB6A7,0xC6F5DCCD,
+	0xC081F400,0x00000000, 0x0C2205AB,0x71D3E305,
+	0xC081F800,0x00000000, 0x0C15DCAA,0x0CF9CDC5,
+	0xC081FC00,0x00000000, 0x0C0A8518,0xD08CBA9A,
+	0xC0820000,0x00000000, 0x0C0015CB,0xA207FDA9,
+	0xC0820400,0x00000000, 0x0BF38323,0x6C479105,
+	0xC0820800,0x00000000, 0x0BE7AB68,0xBD9864AA,
+	0xC0820C00,0x00000000, 0x0BDCB66F,0x5253581E,
+	0xC0821000,0x00000000, 0x0BD16A43,0x9BF9113A,
+	0xC0821400,0x00000000, 0x0BC52025,0xD1A0DBF5,
+	0xC0821800,0x00000000, 0x0BB9A06A,0x31B3FFAD,
+	0xC0821C00,0x00000000, 0x0BAF162F,0x7A377C4D,
+	0xC0822000,0x00000000, 0x0BA2DAE2,0x2B815A8F,
+	0xC0822400,0x00000000, 0x0B96DF4E,0x3E5371D4,
+	0xC0822800,0x00000000, 0x0B8BBED8,0x43BB3EF0,
+	0xC0822C00,0x00000000, 0x0B80D417,0xD785EDD7,
+	0xC0823000,0x00000000, 0x0B7469FB,0x2BF30362,
+	0xC0823400,0x00000000, 0x0B68C36F,0x81EC1B2B,
+	0xC0823800,0x00000000, 0x0B5E0A1F,0xC40034A2,
+	0xC0823C00,0x00000000, 0x0B52384B,0xC8E64C4B,
+	0xC0824000,0x00000000, 0x0B461A13,0xBCEC2990,
+	0xC0824400,0x00000000, 0x0B3ACF98,0x2F74E138,
+	0xC0824800,0x00000000, 0x0B3042FB,0x010675D2,
+	0xC0824C00,0x00000000, 0x0B23B9F3,0x5A771BCB,
+	0xC0825000,0x00000000, 0x0B17EDE6,0x55271177,
+	0xC0825400,0x00000000, 0x0B0D0717,0x8E742492,
+	0xC0825800,0x00000000, 0x0B019B2F,0x659409CA,
+	0xC0825C00,0x00000000, 0x0AF55B7D,0xF0EA4C20,
+	0xC0826000,0x00000000, 0x0AE9E867,0x2B833817,
+	0xC0826400,0x00000000, 0x0ADF6D82,0xF48373C8,
+	0xC0826800,0x00000000, 0x0AD30FD9,0x73DD2691,
+	0xC0826C00,0x00000000, 0x0AC71F8E,0x7C1975D9,
+	0xC0827000,0x00000000, 0x0ABC0CC8,0xFD684DF1,
+	0xC0827400,0x00000000, 0x0AB1035D,0xC8120182,
+	0xC0827800,0x00000000, 0x0AA4A353,0x9108D490,
+	0xC0827C00,0x00000000, 0x0A9908FF,0xBA07361B,
+	0xC0828000,0x00000000, 0x0A8E5E82,0x3A3B0994,
+	0xC0828400,0x00000000, 0x0A826B7A,0x5716D93A,
+	0xC0828800,0x00000000, 0x0A765829,0xF0EF7C8F,
+	0xC0828C00,0x00000000, 0x0A6B1AE8,0xD4157ABA,
+	0xC0829000,0x00000000, 0x0A6070A9,0x4E1F9059,
+	0xC0829400,0x00000000, 0x0A53F15D,0x41FDE003,
+	0xC0829800,0x00000000, 0x0A48311E,0xB45C7CA5,
+	0xC0829C00,0x00000000, 0x0A3D58A2,0x5DE61EED,
+	0xC082A000,0x00000000, 0x0A31CCA4,0x9BF94C40,
+	0xC082A400,0x00000000, 0x0A25977C,0xC4A8696A,
+	0xC082A800,0x00000000, 0x0A1A312E,0x5E7AD231,
+	0xC082AC00,0x00000000, 0x0A0FC5CB,0xBDF91826,
+	0xC082B000,0x00000000, 0x0A034565,0x85D7102A,
+	0xC082B400,0x00000000, 0x09F76083,0x36EA2F37,
+	0xC082B800,0x00000000, 0x09EC5B94,0xA8A1E898,
+	0xC082BC00,0x00000000, 0x09E13328,0x84632FA5,
+	0xC082C000,0x00000000, 0x09D4DD4D,0x0D12C071,
+	0xC082C400,0x00000000, 0x09C94F53,0x5B837056,
+	0xC082C800,0x00000000, 0x09BEB3D1,0xBC502A62,
+	0xC082CC00,0x00000000, 0x09B29F38,0xABE56891,
+	0xC082D000,0x00000000, 0x09A696EE,0x8DA1D378,
+	0xC082D400,0x00000000, 0x099B670D,0x0A4D66C9,
+	0xC082D800,0x00000000, 0x09909ED7,0xEDE30E86,
+	0xC082DC00,0x00000000, 0x09842962,0xD363CE53,
+	0xC082E000,0x00000000, 0x09787513,0xE7E86E26,
+	0xC082E400,0x00000000, 0x096DAB12,0x3D2368AB,
+	0xC082E800,0x00000000, 0x0961FEA4,0xC133D172,
+	0xC082EC00,0x00000000, 0x0955D424,0x21266122,
+	0xC082F000,0x00000000, 0x094A7AC2,0x02AC7312,
+	0xC082F400,0x00000000, 0x09400F86,0x43D95176,
+	0xC082F800,0x00000000, 0x09337B88,0x03654D1B,
+	0xC082FC00,0x00000000, 0x0927A22E,0x69C901B3,
+	0xC0830000,0x00000000, 0x091CAB3D,0xAC71D32F,
+	0xC0830400,0x00000000, 0x09116379,0x818394A3,
+	0xC0830800,0x00000000, 0x090517E9,0x6495D782,
+	0xC0830C00,0x00000000, 0x08F9966C,0x8B4FF487,
+	0xC0831000,0x00000000, 0x08EF0A10,0xE423A904,
+	0xC0831400,0x00000000, 0x08E2D388,0x5B3416BE,
+	0xC0831800,0x00000000, 0x08D6D663,0x7CF293E3,
+	0xC0831C00,0x00000000, 0x08CBB407,0x246EEAD3,
+	0xC0832000,0x00000000, 0x08C0CD88,0x48CA512E,
+	0xC0832400,0x00000000, 0x08B46205,0xC3EFDF2E,
+	0xC0832800,0x00000000, 0x08A8B9C8,0x023C95F8,
+	0xC0832C00,0x00000000, 0x089DFE69,0xAFA213A3,
+	0xC0833000,0x00000000, 0x08923131,0x5B8B02C6,
+	0xC0833400,0x00000000, 0x08861175,0xDFD2DE88,
+	0xC0833800,0x00000000, 0x087AC524,0x5665858A,
+	0xC0833C00,0x00000000, 0x08703CA4,0x052D0954,
+	0xC0834000,0x00000000, 0x0863B242,0x93142DAB,
+	0xC0834400,0x00000000, 0x0857E492,0x15499393,
+	0xC0834800,0x00000000, 0x084CFBC6,0x76A188E2,
+	0xC0834C00,0x00000000, 0x08419452,0x3895364A,
+	0xC0835000,0x00000000, 0x0835532A,0x610E58A3,
+	0xC0835400,0x00000000, 0x0829DE4D,0x7461F2A9,
+	0xC0835800,0x00000000, 0x081F6142,0x52E8284B,
+	0xC0835C00,0x00000000, 0x0813086A,0xFD538E67,
+	0xC0836000,0x00000000, 0x0807168A,0xAE316C71,
+	0xC0836400,0x00000000, 0x07FC01D9,0x7B51D108,
+	0xC0836800,0x00000000, 0x07F0FCBB,0xCB435662,
+	0xC0836C00,0x00000000, 0x07E49B47,0xCDB567F7,
+	0xC0837000,0x00000000, 0x07D8FF3D,0x1B9CB882,
+	0xC0837400,0x00000000, 0x07CE52AB,0x3FE7C08D,
+	0xC0837800,0x00000000, 0x07C2644B,0xF58EA085,
+	0xC0837C00,0x00000000, 0x07B64F73,0xDF4E7A26,
+	0xC0838000,0x00000000, 0x07AB1057,0x9E40BCD8,
+	0xC0838400,0x00000000, 0x07A06A40,0x831F3461,
+	0xC0838800,0x00000000, 0x0793E996,0xE012FEE2,
+	0xC0838C00,0x00000000, 0x078827B0,0x3F9F6E83,
+	0xC0839000,0x00000000, 0x077D4D31,0x7BCD311C,
+	0xC0839400,0x00000000, 0x0771C5B4,0x26DD8383,
+	0xC0839800,0x00000000, 0x07658F11,0xD0FDA401,
+	0xC0839C00,0x00000000, 0x075A26F8,0x47C58BC3,
+	0xC083A000,0x00000000, 0x074FB968,0xB133627C,
+	0xC083A400,0x00000000, 0x07433DE2,0x2F0F7B7D,
+	0xC083A800,0x00000000, 0x07375766,0x161D6EFA,
+	0xC083AC00,0x00000000, 0x072C5086,0x6E65BA35,
+	0xC083B000,0x00000000, 0x07212C73,0xE5BBD5FC,
+	0xC083B400,0x00000000, 0x0714D52A,0xAFA195A6,
+	0xC083B800,0x00000000, 0x07094575,0x522F0869,
+	0xC083BC00,0x00000000, 0x06FEA7D9,0x7F9D74A6,
+	0xC083C000,0x00000000, 0x06F297F6,0x1E22C99D,
+	0xC083C400,0x00000000, 0x06E68E20,0x037A51BF,
+	0xC083C800,0x00000000, 0x06DB5C5E,0x2537C88E,
+	0xC083CC00,0x00000000, 0x06D0985D,0x21B4917C,
+	0xC083D000,0x00000000, 0x06C42186,0x9A4110E5,
+	0xC083D400,0x00000000, 0x06B86B8A,0xF4ADCC6C,
+	0xC083D800,0x00000000, 0x06AD9F81,0x3776CA1F,
+	0xC083DC00,0x00000000, 0x06A1F7A0,0xCDD0F45A,
+	0xC083E000,0x00000000, 0x0695CBA1,0x87F85526,
+	0xC083E400,0x00000000, 0x068A706F,0x3CAEED22,
+	0xC083E800,0x00000000, 0x06800943,0x578974D3,
+	0xC083EC00,0x00000000, 0x067373EF,0x91BB2152,
+	0xC083F000,0x00000000, 0x066798F7,0xAEF4551C,
+	0xC083F400,0x00000000, 0x065CA010,0x63C4A31B,
+	0xC083F800,0x00000000, 0x06515CB2,0x0CAC7D62,
+	0xC083FC00,0x00000000, 0x06450FB0,0x2D890D3D,
+	0xC0840000,0x00000000, 0x06398C72,0xCA0CAE46,
+	0xC0840400,0x00000000, 0x062EFDF7,0x07A3A70D,
+	0xC0840800,0x00000000, 0x0622CC31,0x688C252A,
+	0xC0840C00,0x00000000, 0x0616CD7C,0x3586C936,
+	0xC0841000,0x00000000, 0x060BA93A,0x3CB53A35,
+	0xC0841400,0x00000000, 0x0600C6FB,0x48D9F88F,
+	0xC0841800,0x00000000, 0x05F45A13,0x763AE1F1,
+	0xC0841C00,0x00000000, 0x05E8B024,0x461790A0,
+	0xC0842000,0x00000000, 0x05DDF2B8,0x2C19897E,
+	0xC0842400,0x00000000, 0x05D22A19,0xB31ECAA5,
+	0xC0842800,0x00000000, 0x05C608DB,0x5EB484AD,
+	0xC0842C00,0x00000000, 0x05BABAB4,0x908B9BAB,
+	0xC0843000,0x00000000, 0x05B0364F,0x82109118,
+	0xC0843400,0x00000000, 0x05A3AA94,0xCB3E1403,
+	0xC0843800,0x00000000, 0x0597DB41,0x7881EFAD,
+	0xC0843C00,0x00000000, 0x058CF079,0xC8459DD0,
+	0xC0844000,0x00000000, 0x05818D77,0xB8A44AD7,
+	0xC0844400,0x00000000, 0x05754ADA,0x1035B28E,
+	0xC0844800,0x00000000, 0x0569D437,0xAD527EDA,
+	0xC0844C00,0x00000000, 0x055F5506,0x78268673,
+	0xC0845000,0x00000000, 0x055300FF,0x6C7C2E28,
+	0xC0845400,0x00000000, 0x05470D8A,0x640274EF,
+	0xC0845800,0x00000000, 0x053BF6EE,0x3CA69D34,
+	0xC0845C00,0x00000000, 0x0530F61C,0x646F53FB,
+	0xC0846000,0x00000000, 0x0524933F,0x2D676E53,
+	0xC0846400,0x00000000, 0x0518F57E,0x4B4F6DF1,
+	0xC0846800,0x00000000, 0x050E46D8,0xE33D72F8,
+	0xC0846C00,0x00000000, 0x05025D20,0x60BCF3B2,
+	0xC0847000,0x00000000, 0x04F646C1,0x33183202,
+	0xC0847400,0x00000000, 0x04EB05CA,0x8713EFBB,
+	0xC0847800,0x00000000, 0x04E063DA,0x37CD3C33,
+	0xC0847C00,0x00000000, 0x04D3E1D3,0x862115AA,
+	0xC0848000,0x00000000, 0x04C81E45,0x782FC195,
+	0xC0848400,0x00000000, 0x04BD41C5,0x0F8FBFB0,
+	0xC0848800,0x00000000, 0x04B1BEC6,0x665408BB,
+	0xC0848C00,0x00000000, 0x04A586AA,0x257495B1,
+	0xC0849000,0x00000000, 0x049A1CC6,0x2C31E026,
+	0xC0849400,0x00000000, 0x048FAD0A,0x78B277BE,
+	0xC0849800,0x00000000, 0x04833661,0xC61DA1B7,
+	0xC0849C00,0x00000000, 0x04774E4C,0x82E92E0E,
+	0xC084A000,0x00000000, 0x046C457C,0x838EC18B,
+	0xC084A400,0x00000000, 0x046125C1,0xE452B8CC,
+	0xC084A800,0x00000000, 0x0454CD0B,0x7E05A5C6,
+	0xC084AC00,0x00000000, 0x04493B9B,0x21A83A1F,
+	0xC084B000,0x00000000, 0x043E9BE5,0xED8B2664,
+	0xC084B400,0x00000000, 0x043290B6,0x64F40B56,
+	0xC084B800,0x00000000, 0x04268554,0xE847D59B,
+	0xC084BC00,0x00000000, 0x041B51B3,0x6A5CC22B,
+	0xC084C000,0x00000000, 0x041091E4,0xDC3968C8,
+	0xC084C400,0x00000000, 0x040419AD,0x719B17A8,
+	0xC084C800,0x00000000, 0x03F86205,0xB914C66C,
+	0xC084CC00,0x00000000, 0x03ED93F4,0xB42D4482,
+	0xC084D000,0x00000000, 0x03E1F09F,0x9699E8FA,
+	0xC084D400,0x00000000, 0x03D5C322,0x40240796,
+	0xC084D800,0x00000000, 0x03CA6620,0x7D01DE07,
+	0xC084DC00,0x00000000, 0x03C00302,0xDC246720,
+	0xC084E000,0x00000000, 0x03B36C5A,0x1621103F,
+	0xC084E400,0x00000000, 0x03A78FC4,0x8BB35116,
+	0xC084E800,0x00000000, 0x039C94E7,0x769839F2,
+	0xC084EC00,0x00000000, 0x039155ED,0x3C6B9E1E,
+	0xC084F000,0x00000000, 0x0385077A,0x2B3A069B,
+	0xC084F400,0x00000000, 0x0379827C,0xEC656F24,
+	0xC084F800,0x00000000, 0x036EF1E1,0xE2DFE53B,
+	0xC084FC00,0x00000000, 0x0362C4DD,0x526B80BB,
+	0xC0850000,0x00000000, 0x0356C498,0x66B51C22,
+	0xC0850400,0x00000000, 0x034B9E71,0x8AE94AF2,
+	0xC0850800,0x00000000, 0x0340C070,0xD6B59CA4,
+	0xC0850C00,0x00000000, 0x03345224,0x419E607D,
+	0xC0851000,0x00000000, 0x0328A684,0x4C05657D,
+	0xC0851400,0x00000000, 0x031DE70B,0x379EE75F,
+	0xC0851800,0x00000000, 0x03122304,0xCE8D412E,
+	0xC0851C00,0x00000000, 0x03060044,0x3841D62C,
+	0xC0852000,0x00000000, 0x02FAB048,0xDC506EC0,
+	0xC0852400,0x00000000, 0x02F02FFD,0x76BA5F10,
+	0xC0852800,0x00000000, 0x02E3A2EA,0x01C991EE,
+	0xC0852C00,0x00000000, 0x02D7D1F4,0x7D652759,
+	0xC0853000,0x00000000, 0x02CCE531,0x81A80DE5,
+	0xC0853400,0x00000000, 0x02C1869F,0xE4B63400,
+	0xC0853800,0x00000000, 0x02B5428C,0xFD1C5F1E,
+	0xC0853C00,0x00000000, 0x02A9CA25,0xD4CBDADB,
+	0xC0854000,0x00000000, 0x029F48CF,0x6261D064,
+	0xC0854400,0x00000000, 0x0292F996,0xC035DD46,
+	0xC0854800,0x00000000, 0x0287048D,0x9C2DCB01,
+	0xC0854C00,0x00000000, 0x027BEC07,0x3FBD3202,
+	0xC0855000,0x00000000, 0x0270EF7F,0x9293E5DA,
+	0xC0855400,0x00000000, 0x02648B39,0xAEE5D690,
+	0xC0855800,0x00000000, 0x0258EBC3,0x47A39184,
+	0xC0855C00,0x00000000, 0x024E3B0B,0x226F71EF,
+	0xC0856000,0x00000000, 0x024255F7,0x978A67A0,
+	0xC0856400,0x00000000, 0x02363E11,0xEAF9B07D,
+	0xC0856800,0x00000000, 0x022AFB41,0x8CF3E80F,
+	0xC0856C00,0x00000000, 0x02205D76,0x6B3044CB,
+	0xC0857000,0x00000000, 0x0213DA13,0x32F99EDE,
+	0xC0857400,0x00000000, 0x020814DE,0x5C9E7BBA,
+	0xC0857800,0x00000000, 0x01FD365D,0x1770A040,
+	0xC0857C00,0x00000000, 0x01F1B7DB,0x594EDA35,
+	0xC0858000,0x00000000, 0x01E57E45,0xC0C5B59D,
+	0xC0858400,0x00000000, 0x01DA1298,0x0A327D8C,
+	0xC0858800,0x00000000, 0x01CFA0B1,0x12945ED6,
+	0xC0858C00,0x00000000, 0x01C32EE4,0x49DD2E00,
+	0xC0859000,0x00000000, 0x01B74536,0x7BEACEC7,
+	0xC0859400,0x00000000, 0x01AC3A76,0xE66ED2E1,
+	0xC0859800,0x00000000, 0x01A11F12,0x7F22EEA9,
+	0xC0859C00,0x00000000, 0x0194C4EF,0x7702704E,
+	0xC085A000,0x00000000, 0x018931C4,0xC86F15C5,
+	0xC085A400,0x00000000, 0x017E8FF7,0x04478297,
+	0xC085A800,0x00000000, 0x01728979,0x7F3EB1AF,
+	0xC085AC00,0x00000000, 0x01667C8D,0x3AB3B33F,
+	0xC085B000,0x00000000, 0x015B470C,0xD81CA546,
+	0xC085B400,0x00000000, 0x01508B6F,0x1C7574DA,
+	0xC085B800,0x00000000, 0x014411D7,0x58400B4D,
+	0xC085BC00,0x00000000, 0x01385884,0x33AA5B26,
+	0xC085C000,0x00000000, 0x012D886C,0xB184CAE4,
+	0xC085C400,0x00000000, 0x0121E9A1,0x1A7DB725,
+	0xC085C800,0x00000000, 0x0115BAA6,0x485E5782,
+	0xC085CC00,0x00000000, 0x010A5BD5,0xC21397D5,
+	0xC085D000,0x00000000, 0x00FFF989,0xA16D0DBB,
+	0xC085D400,0x00000000, 0x00F364C7,0x8F6F8FDB,
+	0xC085D800,0x00000000, 0x00E78694,0xFE9F73CC,
+	0xC085DC00,0x00000000, 0x00DC89C2,0xE339B392,
+	0xC085E000,0x00000000, 0x00D14F2B,0x0FB9307F,
+	0xC085E400,0x00000000, 0x00C4FF47,0x5C68CA02,
+	0xC085E800,0x00000000, 0x00B9788A,0xF0D610E6,
+	0xC085EC00,0x00000000, 0x00AEE5D1,0x74018A3B,
+	0xC085F000,0x00000000, 0x00A2BD8C,0x17B493DC,
+	0xC085F400,0x00000000, 0x0096BBB8,0x0F231E3D,
+	0xC085F800,0x00000000, 0x008B93AD,0x0D66DEFD,
+	0xC085FC00,0x00000000, 0x0080B9E8,0xF15E599E,
+	0xC0860000,0x00000000, 0x00744A38,0x24E5285F,
+	0xC0860400,0x00000000, 0x00689CE8,0x128F015B,
+	0xC0860800,0x00000000, 0x005DDB62,0xD06B3019,
+	0xC0860C00,0x00000000, 0x00521BF2,0xACC26F65,
+	0xC0861000,0x00000000, 0x0045F7B0,0x6B2C0FE5,
+	0xC0861400,0x00000000, 0x003AA5E1,0x381DE881,
+	0xC0861800,0x00000000, 0x003029AD,0xE2342558,
+	0xC0861C00,0x00000000, 0x00239B42,0x358BDF31,
+	0xC0862000,0x00000000, 0x0017C8AB,0x2288C9AB,
+	};
+
+LOCAL_D const TUint32 LnTest[] =
+	{
+	0x3FD00000,0x00000000, 0xBFF62E42,0xFEFA39EF,
+	0x3FD01062,0x4DD2F1AA, 0xBFF61DE9,0x0EED76F7,
+	0x3FD020C4,0x9BA5E354, 0xBFF60D9F,0xC3B96425,
+	0x3FD03126,0xE978D4FE, 0xBFF5FD66,0xFB9E280A,
+	0x3FD04189,0x374BC6A8, 0xBFF5ED3E,0x95422881,
+	0x3FD051EB,0x851EB852, 0xBFF5DD26,0x6FB06F4F,
+	0x3FD0624D,0xD2F1A9FC, 0xBFF5CD1E,0x6A5716C4,
+	0x3FD072B0,0x20C49BA6, 0xBFF5BD26,0x6505BE3E,
+	0x3FD08312,0x6E978D50, 0xBFF5AD3E,0x3FEC065D,
+	0x3FD09374,0xBC6A7EFA, 0xBFF59D65,0xDB9814AF,
+	0x3FD0A3D7,0x0A3D70A4, 0xBFF58D9D,0x18F51EBC,
+	0x3FD0B439,0x5810624E, 0xBFF57DE3,0xD949FC2E,
+	0x3FD0C49B,0xA5E353F8, 0xBFF56E39,0xFE37C000,
+	0x3FD0D4FD,0xF3B645A2, 0xBFF55E9F,0x69B8587E,
+	0x3FD0E560,0x4189374C, 0xBFF54F13,0xFE1D35F8,
+	0x3FD0F5C2,0x8F5C28F6, 0xBFF53F97,0x9E0DF7F8,
+	0x3FD10624,0xDD2F1AA0, 0xBFF5302A,0x2C8720D9,
+	0x3FD11687,0x2B020C4A, 0xBFF520CB,0x8CD8CF9D,
+	0x3FD126E9,0x78D4FDF4, 0xBFF5117B,0xA2A57FDC,
+	0x3FD1374B,0xC6A7EF9E, 0xBFF5023A,0x51E0CFA5,
+	0x3FD147AE,0x147AE148, 0xBFF4F307,0x7ECE4B36,
+	0x3FD15810,0x624DD2F2, 0xBFF4E3E3,0x0E003E69,
+	0x3FD16872,0xB020C49C, 0xBFF4D4CC,0xE4568BAF,
+	0x3FD178D4,0xFDF3B646, 0xBFF4C5C4,0xE6FD887D,
+	0x3FD18937,0x4BC6A7F0, 0xBFF4B6CA,0xFB6CDF16,
+	0x3FD19999,0x9999999A, 0xBFF4A7DF,0x07667582,
+	0x3FD1A9FB,0xE76C8B44, 0xBFF49900,0xF0F559A7,
+	0x3FD1BA5E,0x353F7CEE, 0xBFF48A30,0x9E6CB255,
+	0x3FD1CAC0,0x83126E98, 0xBFF47B6D,0xF666B540,
+	0x3FD1DB22,0xD0E56042, 0xBFF46CB8,0xDFC3A1B8,
+	0x3FD1EB85,0x1EB851EC, 0xBFF45E11,0x41A8C00F,
+	0x3FD1FBE7,0x6C8B4396, 0xBFF44F77,0x037F6597,
+	0x3FD20C49,0xBA5E353F, 0xBFF440EA,0x0CF3FD13,
+	0x3FD21CAC,0x083126E9, 0xBFF4326A,0x45F5138A,
+	0x3FD22D0E,0x56041893, 0xBFF423F7,0x96B2696E,
+	0x3FD23D70,0xA3D70A3D, 0xBFF41591,0xE79C07EB,
+	0x3FD24DD2,0xF1A9FBE7, 0xBFF40739,0x21615A50,
+	0x3FD25E35,0x3F7CED91, 0xBFF3F8ED,0x2CF04B8F,
+	0x3FD26E97,0x8D4FDF3B, 0xBFF3EAAD,0xF3746796,
+	0x3FD27EF9,0xDB22D0E5, 0xBFF3DC7B,0x5E56009A,
+	0x3FD28F5C,0x28F5C28F, 0xBFF3CE55,0x57395819,
+	0x3FD29FBE,0x76C8B439, 0xBFF3C03B,0xC7FDCB97,
+	0x3FD2B020,0xC49BA5E3, 0xBFF3B22E,0x9ABD04F9,
+	0x3FD2C083,0x126E978D, 0xBFF3A42D,0xB9CA2E6F,
+	0x3FD2D0E5,0x60418937, 0xBFF39639,0x0FB129D0,
+	0x3FD2E147,0xAE147AE1, 0xBFF38850,0x8735CB6B,
+	0x3FD2F1A9,0xFBE76C8B, 0xBFF37A74,0x0B531820,
+	0x3FD3020C,0x49BA5E35, 0xBFF36CA3,0x873A86CA,
+	0x3FD3126E,0x978D4FDF, 0xBFF35EDE,0xE65344D6,
+	0x3FD322D0,0xE5604189, 0xBFF35126,0x14397DFF,
+	0x3FD33333,0x33333333, 0xBFF34378,0xFCBDA721,
+	0x3FD34395,0x810624DD, 0xBFF335D7,0x8BE3CC08,
+	0x3FD353F7,0xCED91687, 0xBFF32841,0xADE2E03D,
+	0x3FD3645A,0x1CAC0831, 0xBFF31AB7,0x4F2412B4,
+	0x3FD374BC,0x6A7EF9DB, 0xBFF30D38,0x5C42244A,
+	0x3FD3851E,0xB851EB85, 0xBFF2FFC4,0xC208C11A,
+	0x3FD39581,0x0624DD2F, 0xBFF2F25C,0x6D73DC81,
+	0x3FD3A5E3,0x53F7CED9, 0xBFF2E4FF,0x4BAF0FD0,
+	0x3FD3B645,0xA1CAC083, 0xBFF2D7AD,0x4A14FBA3,
+	0x3FD3C6A7,0xEF9DB22D, 0xBFF2CA66,0x562EABC7,
+	0x3FD3D70A,0x3D70A3D7, 0xBFF2BD2A,0x5DB2FDA2,
+	0x3FD3E76C,0x8B439581, 0xBFF2AFF9,0x4E86091C,
+	0x3FD3F7CE,0xD916872B, 0xBFF2A2D3,0x16B88BEE,
+	0x3FD40831,0x26E978D5, 0xBFF295B7,0xA4875754,
+	0x3FD41893,0x74BC6A7F, 0xBFF288A6,0xE65AC018,
+	0x3FD428F5,0xC28F5C29, 0xBFF27BA0,0xCAC610E1,
+	0x3FD43958,0x10624DD3, 0xBFF26EA5,0x4086FEC6,
+	0x3FD449BA,0x5E353F7D, 0xBFF261B4,0x36852010,
+	0x3FD45A1C,0xAC083127, 0xBFF254CD,0x9BD16529,
+	0x3FD46A7E,0xF9DB22D1, 0xBFF247F1,0x5FA593AC,
+	0x3FD47AE1,0x47AE147B, 0xBFF23B1F,0x7163C380,
+	0x3FD48B43,0x95810625, 0xBFF22E57,0xC095DE09,
+	0x3FD49BA5,0xE353F7CF, 0xBFF2219A,0x3CED1F52,
+	0x3FD4AC08,0x3126E979, 0xBFF214E6,0xD6419934,
+	0x3FD4BC6A,0x7EF9DB23, 0xBFF2083D,0x7C91B867,
+	0x3FD4CCCC,0xCCCCCCCD, 0xBFF1FB9E,0x2001CB78,
+	0x3FD4DD2F,0x1A9FBE77, 0xBFF1EF08,0xB0DB8B9D,
+	0x3FD4ED91,0x6872B021, 0xBFF1E27D,0x1F8DA75D,
+	0x3FD4FDF3,0xB645A1CB, 0xBFF1D5FB,0x5CAB4EFF,
+	0x3FD50E56,0x04189375, 0xBFF1C983,0x58EBC2BD,
+	0x3FD51EB8,0x51EB851F, 0xBFF1BD15,0x0529E2B4,
+	0x3FD52F1A,0x9FBE76C9, 0xBFF1B0B0,0x5263C081,
+	0x3FD53F7C,0xED916873, 0xBFF1A455,0x31BA328B,
+	0x3FD54FDF,0x3B645A1D, 0xBFF19803,0x947068F1,
+	0x3FD56041,0x89374BC7, 0xBFF18BBB,0x6BEB840F,
+	0x3FD570A3,0xD70A3D71, 0xBFF17F7C,0xA9B22C98,
+	0x3FD58106,0x24DD2F1B, 0xBFF17347,0x3F6C2D40,
+	0x3FD59168,0x72B020C5, 0xBFF1671B,0x1EE20DE8,
+	0x3FD5A1CA,0xC083126F, 0xBFF15AF8,0x39FCB045,
+	0x3FD5B22D,0x0E560419, 0xBFF14EDE,0x82C4EE07,
+	0x3FD5C28F,0x5C28F5C3, 0xBFF142CD,0xEB63386A,
+	0x3FD5D2F1,0xA9FBE76D, 0xBFF136C6,0x661F3935,
+	0x3FD5E353,0xF7CED917, 0xBFF12AC7,0xE55F751B,
+	0x3FD5F3B6,0x45A1CAC1, 0xBFF11ED2,0x5BA8EF7B,
+	0x3FD60418,0x9374BC6A, 0xBFF112E5,0xBB9ECF78,
+	0x3FD6147A,0xE147AE14, 0xBFF10701,0xF8020663,
+	0x3FD624DD,0x2F1A9FBE, 0xBFF0FB27,0x03B0F76F,
+	0x3FD6353F,0x7CED9168, 0xBFF0EF54,0xD1A720AE,
+	0x3FD645A1,0xCAC08312, 0xBFF0E38B,0x54FCC54A,
+	0x3FD65604,0x189374BC, 0xBFF0D7CA,0x80E69901,
+	0x3FD66666,0x66666666, 0xBFF0CC12,0x48B56CCC,
+	0x3FD676C8,0xB4395810, 0xBFF0C062,0x9FD5DCC0,
+	0x3FD6872B,0x020C49BA, 0xBFF0B4BB,0x79CFFF14,
+	0x3FD6978D,0x4FDF3B64, 0xBFF0A91C,0xCA471450,
+	0x3FD6A7EF,0x9DB22D0E, 0xBFF09D86,0x84F9389C,
+	0x3FD6B851,0xEB851EB8, 0xBFF091F8,0x9DBF162A,
+	0x3FD6C8B4,0x39581062, 0xBFF08673,0x088B98B9,
+	0x3FD6D916,0x872B020C, 0xBFF07AF5,0xB96BA22C,
+	0x3FD6E978,0xD4FDF3B6, 0xBFF06F80,0xA485C029,
+	0x3FD6F9DB,0x22D0E560, 0xBFF06413,0xBE19E2CC,
+	0x3FD70A3D,0x70A3D70A, 0xBFF058AE,0xFA811452,
+	0x3FD71A9F,0xBE76C8B4, 0xBFF04D52,0x4E2D31CF,
+	0x3FD72B02,0x0C49BA5E, 0xBFF041FD,0xADA8A4DF,
+	0x3FD73B64,0x5A1CAC08, 0xBFF036B1,0x0D961E48,
+	0x3FD74BC6,0xA7EF9DB2, 0xBFF02B6C,0x62B05199,
+	0x3FD75C28,0xF5C28F5C, 0xBFF0202F,0xA1C9B1B5,
+	0x3FD76C8B,0x43958106, 0xBFF014FA,0xBFCC2E4B,
+	0x3FD77CED,0x916872B0, 0xBFF009CD,0xB1B8F237,
+	0x3FD78D4F,0xDF3B645A, 0xBFEFFD50,0xD9504585,
+	0x3FD79DB2,0x2D0E5604, 0xBFEFE715,0xCB913FA1,
+	0x3FD7AE14,0x7AE147AE, 0xBFEFD0EA,0x24BF89B7,
+	0x3FD7BE76,0xC8B43958, 0xBFEFBACD,0xCF9255A9,
+	0x3FD7CED9,0x16872B02, 0xBFEFA4C0,0xB6ECD5A7,
+	0x3FD7DF3B,0x645A1CAC, 0xBFEF8EC2,0xC5DDC33E,
+	0x3FD7EF9D,0xB22D0E56, 0xBFEF78D3,0xE79EE7FD,
+	0x3FD80000,0x00000000, 0xBFEF62F4,0x0794A7B8,
+	0x3FD81062,0x4DD2F1AA, 0xBFEF4D23,0x114D8C5B,
+	0x3FD820C4,0x9BA5E354, 0xBFEF3760,0xF081D343,
+	0x3FD83126,0xE978D4FE, 0xBFEF21AD,0x9112FC25,
+	0x3FD84189,0x374BC6A8, 0xBFEF0C08,0xDF0B596A,
+	0x3FD851EB,0x851EB852, 0xBFEEF672,0xC69DA20B,
+	0x3FD8624D,0xD2F1A9FC, 0xBFEEE0EB,0x342484DC,
+	0x3FD872B0,0x20C49BA6, 0xBFEECB72,0x14223D43,
+	0x3FD88312,0x6E978D50, 0xBFEEB607,0x53402957,
+	0x3FD89374,0xBC6A7EFA, 0xBFEEA0AA,0xDE4E6162,
+	0x3FD8A3D7,0x0A3D70A4, 0xBFEE8B5C,0xA24350BE,
+	0x3FD8B439,0x5810624E, 0xBFEE761C,0x8C3B5003,
+	0x3FD8C49B,0xA5E353F8, 0xBFEE60EA,0x89784093,
+	0x3FD8D4FD,0xF3B645A2, 0xBFEE4BC6,0x87612963,
+	0x3FD8E560,0x4189374C, 0xBFEE36B0,0x7381D516,
+	0x3FD8F5C2,0x8F5C28F6, 0xBFEE21A8,0x3B8A7153,
+	0x3FD90624,0xDD2F1AA0, 0xBFEE0CAD,0xCD4F2F5A,
+	0x3FD91687,0x2B020C4A, 0xBFEDF7C1,0x16C7E5D7,
+	0x3FD926E9,0x78D4FDF4, 0xBFEDE2E2,0x060FB3D9,
+	0x3FD9374B,0xC6A7EF9E, 0xBFEDCE10,0x8964A50A,
+	0x3FD947AE,0x147AE148, 0xBFEDB94C,0x8F275703,
+	0x3FD95810,0x624DD2F2, 0xBFEDA496,0x05DA9FCA,
+	0x3FD96872,0xB020C49C, 0xBFED8FEC,0xDC233575,
+	0x3FD978D4,0xFDF3B646, 0xBFED7B51,0x00C756E1,
+	0x3FD98937,0x4BC6A7F0, 0xBFED66C2,0x62AE758C,
+	0x3FD99999,0x9999999A, 0xBFED5240,0xF0E0E077,
+	0x3FD9A9FB,0xE76C8B44, 0xBFED3DCC,0x9A877023,
+	0x3FD9BA5E,0x353F7CEE, 0xBFED2965,0x4EEB3392,
+	0x3FD9CAC0,0x83126E98, 0xBFED150A,0xFD751E56,
+	0x3FD9DB22,0xD0E56042, 0xBFED00BD,0x95ADB79D,
+	0x3FD9EB85,0x1EB851EC, 0xBFECEC7D,0x073CCA46,
+	0x3FD9FBE7,0x6C8B4396, 0xBFECD849,0x41E915E9,
+	0x3FDA0C49,0xBA5E353F, 0xBFECC422,0x359800DF,
+	0x3FDA1CAC,0x083126E9, 0xBFECB007,0xD24D4B39,
+	0x3FDA2D0E,0x56041893, 0xBFEC9BFA,0x082AC2AE,
+	0x3FDA3D70,0xA3D70A3D, 0xBFEC87F8,0xC76FF776,
+	0x3FDA4DD2,0xF1A9FBE7, 0xBFEC7404,0x0079F207,
+	0x3FDA5E35,0x3F7CED91, 0xBFEC601B,0xA3C2E9C5,
+	0x3FDA6E97,0x8D4FDF3B, 0xBFEC4C3F,0xA1E1FC8E,
+	0x3FDA7EF9,0xDB22D0E5, 0xBFEC386F,0xEB8AE729,
+	0x3FDA8F5C,0x28F5C28F, 0xBFEC24AC,0x718DBE8F,
+	0x3FDA9FBE,0x76C8B439, 0xBFEC10F5,0x24D6AA13,
+	0x3FDAB020,0xC49BA5E3, 0xBFEBFD49,0xF66D9E5B,
+	0x3FDAC083,0x126E978D, 0xBFEBE9AA,0xD7761933,
+	0x3FDAD0E5,0x60418937, 0xBFEBD617,0xB92EDE28,
+	0x3FDAE147,0xAE147AE1, 0xBFEBC290,0x8CF1B3F9,
+	0x3FDAF1A9,0xFBE76C8B, 0xBFEBAF15,0x443322D0,
+	0x3FDB020C,0x49BA5E35, 0xBFEB9BA5,0xD082333D,
+	0x3FDB126E,0x978D4FDF, 0xBFEB8842,0x23882DFF,
+	0x3FDB22D0,0xE5604189, 0xBFEB74EA,0x2F085C8A,
+	0x3FDB3333,0x33333333, 0xBFEB619D,0xE4DFCA4D,
+	0x3FDB4395,0x810624DD, 0xBFEB4E5D,0x370506B6,
+	0x3FDB53F7,0xCED91687, 0xBFEB3B28,0x1787E7ED,
+	0x3FDB645A,0x1CAC0831, 0xBFEB27FE,0x78914E48,
+	0x3FDB74BC,0x6A7EF9DB, 0xBFEB14E0,0x4C62E87A,
+	0x3FDB851E,0xB851EB85, 0xBFEB01CD,0x8556F868,
+	0x3FDB9581,0x0624DD2F, 0xBFEAEEC6,0x15E018B7,
+	0x3FDBA5E3,0x53F7CED9, 0xBFEADBC9,0xF0890306,
+	0x3FDBB645,0xA1CAC083, 0xBFEAC8D9,0x07F456D1,
+	0x3FDBC6A7,0xEF9DB22D, 0xBFEAB5F3,0x4EDC60FD,
+	0x3FDBD70A,0x3D70A3D7, 0xBFEAA318,0xB812E40B,
+	0x3FDBE76C,0x8B439581, 0xBFEA9049,0x3680E0F1,
+	0x3FDBF7CE,0xD916872B, 0xBFEA7D84,0xBD266090,
+	0x3FDC0831,0x26E978D5, 0xBFEA6ACB,0x3F1A3DCC,
+	0x3FDC1893,0x74BC6A7F, 0xBFEA581C,0xAF89F043,
+	0x3FDC28F5,0xC28F5C29, 0xBFEA4579,0x01B9579F,
+	0x3FDC3958,0x10624DD3, 0xBFEA32E0,0x2902877A,
+	0x3FDC49BA,0x5E353F7D, 0xBFEA2052,0x18D593E8,
+	0x3FDC5A1C,0xAC083127, 0xBFEA0DCE,0xC4B85E82,
+	0x3FDC6A7E,0xF9DB22D1, 0xBFE9FB56,0x2046641A,
+	0x3FDC7AE1,0x47AE147B, 0xBFE9E8E8,0x1F308AE9,
+	0x3FDC8B43,0x95810625, 0xBFE9D684,0xB53CF164,
+	0x3FDC9BA5,0xE353F7CF, 0xBFE9C42B,0xD646BD85,
+	0x3FDCAC08,0x3126E979, 0xBFE9B1DD,0x763DECB8,
+	0x3FDCBC6A,0x7EF9DB23, 0xBFE99F99,0x8927243C,
+	0x3FDCCCCC,0xCCCCCCCD, 0xBFE98D60,0x031B821B,
+	0x3FDCDD2F,0x1A9FBE77, 0xBFE97B30,0xD8486E9C,
+	0x3FDCED91,0x6872B021, 0xBFE9690B,0xFCEF6E46,
+	0x3FDCFDF3,0xB645A1CB, 0xBFE956F1,0x6565F454,
+	0x3FDD0E56,0x04189375, 0xBFE944E1,0x061535BD,
+	0x3FDD1EB8,0x51EB851F, 0xBFE932DA,0xD379FCA8,
+	0x3FDD2F1A,0x9FBE76C9, 0xBFE920DE,0xC2247C6D,
+	0x3FDD3F7C,0xED916873, 0xBFE90EEC,0xC6B82605,
+	0x3FDD4FDF,0x3B645A1D, 0xBFE8FD04,0xD5EB7CFD,
+	0x3FDD6041,0x89374BC7, 0xBFE8EB26,0xE487ECDB,
+	0x3FDD70A3,0xD70A3D71, 0xBFE8D952,0xE7699EFC,
+	0x3FDD8106,0x24DD2F1B, 0xBFE8C788,0xD37F50EA,
+	0x3FDD9168,0x72B020C5, 0xBFE8B5C8,0x9DCA2B20,
+	0x3FDDA1CA,0xC083126F, 0xBFE8A412,0x3B5D9842,
+	0x3FDDB22D,0x0E560419, 0xBFE89265,0xA15F1CCA,
+	0x3FDDC28F,0x5C28F5C3, 0xBFE880C2,0xC5062F1E,
+	0x3FDDD2F1,0xA9FBE76D, 0xBFE86F29,0x9B9C1017,
+	0x3FDDE353,0xF7CED917, 0xBFE85D9A,0x1A7BA3F3,
+	0x3FDDF3B6,0x45A1CAC1, 0xBFE84C14,0x37114BB5,
+	0x3FDE0418,0x9374BC6A, 0xBFE83A97,0xE6DABEE9,
+	0x3FDE147A,0xE147AE14, 0xBFE82925,0x1F66E5D3,
+	0x3FDE24DD,0x2F1A9FBE, 0xBFE817BB,0xD655B40A,
+	0x3FDE353F,0x7CED9168, 0xBFE8065C,0x0158036F,
+	0x3FDE45A1,0xCAC08312, 0xBFE7F505,0x962F6F8F,
+	0x3FDE5604,0x189374BC, 0xBFE7E3B8,0x8AAE3166,
+	0x3FDE6666,0x66666666, 0xBFE7D274,0xD4B6FB83,
+	0x3FDE76C8,0xB4395810, 0xBFE7C13A,0x6A3CD68E,
+	0x3FDE872B,0x020C49BA, 0xBFE7B009,0x4142FE2D,
+	0x3FDE978D,0x4FDF3B64, 0xBFE79EE1,0x4FDCBE46,
+	0x3FDEA7EF,0x9DB22D0E, 0xBFE78DC2,0x8C2D50A0,
+	0x3FDEB851,0xEB851EB8, 0xBFE77CAC,0xEC67BADA,
+	0x3FDEC8B4,0x39581062, 0xBFE76BA0,0x66CEACCA,
+	0x3FDED916,0x872B020C, 0xBFE75A9C,0xF1B45F21,
+	0x3FDEE978,0xD4FDF3B6, 0xBFE749A2,0x837A727E,
+	0x3FDEF9DB,0x22D0E560, 0xBFE738B1,0x1291CEC6,
+	0x3FDF0A3D,0x70A3D70A, 0xBFE727C8,0x957A82DC,
+	0x3FDF1A9F,0xBE76C8B4, 0xBFE716E9,0x02C3A4A9,
+	0x3FDF2B02,0x0C49BA5E, 0xBFE70612,0x510B3181,
+	0x3FDF3B64,0x5A1CAC08, 0xBFE6F544,0x76FDEECE,
+	0x3FDF4BC6,0xA7EF9DB2, 0xBFE6E47F,0x6B574B15,
+	0x3FDF5C28,0xF5C28F5C, 0xBFE6D3C3,0x24E13F4F,
+	0x3FDF6C8B,0x43958106, 0xBFE6C30F,0x9A743088,
+	0x3FDF7CED,0x916872B0, 0xBFE6B264,0xC2F6D1D8,
+	0x3FDF8D4F,0xDF3B645A, 0xBFE6A1C2,0x955E06A0,
+	0x3FDF9DB2,0x2D0E5604, 0xBFE69129,0x08ACC51D,
+	0x3FDFAE14,0x7AE147AE, 0xBFE68098,0x13F3F942,
+	0x3FDFBE76,0xC8B43958, 0xBFE6700F,0xAE5267DE,
+	0x3FDFCED9,0x16872B02, 0xBFE65F8F,0xCEF4920C,
+	0x3FDFDF3B,0x645A1CAC, 0xBFE64F18,0x6D1498F1,
+	0x3FDFEF9D,0xB22D0E56, 0xBFE63EA9,0x7FFA21BB,
+	0x3FE00000,0x00000000, 0xBFE62E42,0xFEFA39EF,
+	0x3FE00831,0x26E978D5, 0xBFE61DE4,0xE1773BF8,
+	0x3FE01062,0x4DD2F1AA, 0xBFE60D8F,0x1EE0B3FF,
+	0x3FE01893,0x74BC6A7F, 0xBFE5FD41,0xAEB3450A,
+	0x3FE020C4,0x9BA5E354, 0xBFE5ECFC,0x88788E5B,
+	0x3FE028F5,0xC28F5C29, 0xBFE5DCBF,0xA3C71115,
+	0x3FE03126,0xE978D4FE, 0xBFE5CC8A,0xF8421624,
+	0x3FE03958,0x10624DD3, 0xBFE5BC5E,0x7D999465,
+	0x3FE04189,0x374BC6A8, 0xBFE5AC3A,0x2B8A1713,
+	0x3FE049BA,0x5E353F7D, 0xBFE59C1D,0xF9DCA470,
+	0x3FE051EB,0x851EB852, 0xBFE58C09,0xE066A4B0,
+	0x3FE05A1C,0xAC083127, 0xBFE57BFD,0xD709C922,
+	0x3FE0624D,0xD2F1A9FC, 0xBFE56BF9,0xD5B3F399,
+	0x3FE06A7E,0xF9DB22D1, 0xBFE55BFD,0xD45F1E11,
+	0x3FE072B0,0x20C49BA6, 0xBFE54C09,0xCB11428D,
+	0x3FE07AE1,0x47AE147B, 0xBFE53C1D,0xB1DC433C,
+	0x3FE08312,0x6E978D50, 0xBFE52C39,0x80DDD2CA,
+	0x3FE08B43,0x95810625, 0xBFE51C5D,0x303F5CFA,
+	0x3FE09374,0xBC6A7EFA, 0xBFE50C88,0xB835EF6F,
+	0x3FE09BA5,0xE353F7CF, 0xBFE4FCBC,0x110222B8,
+	0x3FE0A3D7,0x0A3D70A4, 0xBFE4ECF7,0x32F00389,
+	0x3FE0AC08,0x3126E979, 0xBFE4DD3A,0x1656FC3A,
+	0x3FE0B439,0x5810624E, 0xBFE4CD84,0xB399BE6D,
+	0x3FE0BC6A,0x7EF9DB23, 0xBFE4BDD7,0x03262CFD,
+	0x3FE0C49B,0xA5E353F8, 0xBFE4AE30,0xFD754610,
+	0x3FE0CCCC,0xCCCCCCCD, 0xBFE49E92,0x9B0B0D70,
+	0x3FE0D4FD,0xF3B645A2, 0xBFE48EFB,0xD476770C,
+	0x3FE0DD2F,0x1A9FBE77, 0xBFE47F6C,0xA25151B3,
+	0x3FE0E560,0x4189374C, 0xBFE46FE4,0xFD403201,
+	0x3FE0ED91,0x6872B021, 0xBFE46064,0xDDF25D81,
+	0x3FE0F5C2,0x8F5C28F6, 0xBFE450EC,0x3D21B601,
+	0x3FE0FDF3,0xB645A1CB, 0xBFE4417B,0x1392A512,
+	0x3FE10624,0xDD2F1AA0, 0xBFE43211,0x5A1407C3,
+	0x3FE10E56,0x04189375, 0xBFE422AF,0x097F1A87,
+	0x3FE11687,0x2B020C4A, 0xBFE41354,0x1AB7654B,
+	0x3FE11EB8,0x51EB851F, 0xBFE40400,0x86AAA7BF,
+	0x3FE126E9,0x78D4FDF4, 0xBFE3F4B4,0x4650C5C9,
+	0x3FE12F1A,0x9FBE76C9, 0xBFE3E56F,0x52ABB42C,
+	0x3FE1374B,0xC6A7EF9E, 0xBFE3D631,0xA4C7655A,
+	0x3FE13F7C,0xED916873, 0xBFE3C6FB,0x35B9B675,
+	0x3FE147AE,0x147AE148, 0xBFE3B7CB,0xFEA25C7D,
+	0x3FE14FDF,0x3B645A1D, 0xBFE3A8A3,0xF8AAD1A6,
+	0x3FE15810,0x624DD2F2, 0xBFE39983,0x1D0642E4,
+	0x3FE16041,0x89374BC7, 0xBFE38A69,0x64F17D97,
+	0x3FE16872,0xB020C49C, 0xBFE37B56,0xC9B2DD6E,
+	0x3FE170A3,0xD70A3D71, 0xBFE36C4B,0x449A3A68,
+	0x3FE178D4,0xFDF3B646, 0xBFE35D46,0xCF00D70A,
+	0x3FE18106,0x24DD2F1B, 0xBFE34E49,0x62494EB9,
+	0x3FE18937,0x4BC6A7F0, 0xBFE33F52,0xF7DF843C,
+	0x3FE19168,0x72B020C5, 0xBFE33063,0x89389070,
+	0x3FE19999,0x9999999A, 0xBFE3217B,0x0FD2B116,
+	0x3FE1A1CA,0xC083126F, 0xBFE31299,0x853537D5,
+	0x3FE1A9FB,0xE76C8B44, 0xBFE303BE,0xE2F0795E,
+	0x3FE1B22D,0x0E560419, 0xBFE2F4EB,0x229DBCBB,
+	0x3FE1BA5E,0x353F7CEE, 0xBFE2E61E,0x3DDF2ABA,
+	0x3FE1C28F,0x5C28F5C3, 0xBFE2D758,0x2E5FBD90,
+	0x3FE1CAC0,0x83126E98, 0xBFE2C898,0xEDD33091,
+	0x3FE1D2F1,0xA9FBE76D, 0xBFE2B9E0,0x75F5F013,
+	0x3FE1DB22,0xD0E56042, 0xBFE2AB2E,0xC08D0980,
+	0x3FE1E353,0xF7CED917, 0xBFE29C83,0xC7661B79,
+	0x3FE1EB85,0x1EB851EC, 0xBFE28DDF,0x8457462F,
+	0x3FE1F3B6,0x45A1CAC1, 0xBFE27F41,0xF13F1BD6,
+	0x3FE1FBE7,0x6C8B4396, 0xBFE270AB,0x0804913F,
+	0x3FE20418,0x9374BC6A, 0xBFE2621A,0xC296EE95,
+	0x3FE20C49,0xBA5E353F, 0xBFE25391,0x1AEDC036,
+	0x3FE2147A,0xE147AE14, 0xBFE2450E,0x0B08C7BE,
+	0x3FE21CAC,0x083126E9, 0xBFE23691,0x8CEFED24,
+	0x3FE224DD,0x2F1A9FBE, 0xBFE2281B,0x9AB33000,
+	0x3FE22D0E,0x56041893, 0xBFE219AC,0x2E6A98EE,
+	0x3FE2353F,0x7CED9168, 0xBFE20B43,0x42362B1A,
+	0x3FE23D70,0xA3D70A3D, 0xBFE1FCE0,0xD03DD5E6,
+	0x3FE245A1,0xCAC08312, 0xBFE1EE84,0xD2B166AD,
+	0x3FE24DD2,0xF1A9FBE7, 0xBFE1E02F,0x43C87AB2,
+	0x3FE25604,0x189374BC, 0xBFE1D1E0,0x1DC2711E,
+	0x3FE25E35,0x3F7CED91, 0xBFE1C397,0x5AE65D2E,
+	0x3FE26666,0x66666666, 0xBFE1B554,0xF582F875,
+	0x3FE26E97,0x8D4FDF3B, 0xBFE1A718,0xE7EE953D,
+	0x3FE276C8,0xB4395810, 0xBFE198E3,0x2C87110D,
+	0x3FE27EF9,0xDB22D0E5, 0xBFE18AB3,0xBDB1C745,
+	0x3FE2872B,0x020C49BA, 0xBFE17C8A,0x95DB83DE,
+	0x3FE28F5C,0x28F5C28F, 0xBFE16E67,0xAF787643,
+	0x3FE2978D,0x4FDF3B64, 0xBFE1604B,0x05042447,
+	0x3FE29FBE,0x76C8B439, 0xBFE15234,0x91015D3E,
+	0x3FE2A7EF,0x9DB22D0E, 0xBFE14424,0x4DFA2D29,
+	0x3FE2B020,0xC49BA5E3, 0xBFE1361A,0x367FD003,
+	0x3FE2B851,0xEB851EB8, 0xBFE12816,0x452AA52E,
+	0x3FE2C083,0x126E978D, 0xBFE11A18,0x749A22EF,
+	0x3FE2C8B4,0x39581062, 0xBFE10C20,0xBF74CA16,
+	0x3FE2D0E5,0x60418937, 0xBFE0FE2F,0x206819B2,
+	0x3FE2D916,0x872B020C, 0xBFE0F043,0x922882E9,
+	0x3FE2E147,0xAE147AE1, 0xBFE0E25E,0x0F715CE7,
+	0x3FE2E978,0xD4FDF3B6, 0xBFE0D47E,0x9304D8E5,
+	0x3FE2F1A9,0xFBE76C8B, 0xBFE0C6A5,0x17ABF651,
+	0x3FE2F9DB,0x22D0E560, 0xBFE0B8D1,0x98367706,
+	0x3FE3020C,0x49BA5E35, 0xBFE0AB04,0x0F7AD3A5,
+	0x3FE30A3D,0x70A3D70A, 0xBFE09D3C,0x78563006,
+	0x3FE3126E,0x978D4FDF, 0xBFE08F7A,0xCDAC4FBD,
+	0x3FE31A9F,0xBE76C8B4, 0xBFE081BF,0x0A678ABC,
+	0x3FE322D0,0xE5604189, 0xBFE07409,0x2978C20F,
+	0x3FE32B02,0x0C49BA5E, 0xBFE06659,0x25D754AA,
+	0x3FE33333,0x33333333, 0xBFE058AE,0xFA811452,
+	0x3FE33B64,0x5A1CAC08, 0xBFE04B0A,0xA27A3AA2,
+	0x3FE34395,0x810624DD, 0xBFE03D6C,0x18CD5E20,
+	0x3FE34BC6,0xA7EF9DB2, 0xBFE02FD3,0x588B676D,
+	0x3FE353F7,0xCED91687, 0xBFE02240,0x5CCB868C,
+	0x3FE35C28,0xF5C28F5C, 0xBFE014B3,0x20AB283E,
+	0x3FE3645A,0x1CAC0831, 0xBFE0072B,0x9F4DEB78,
+	0x3FE36C8B,0x43958106, 0xBFDFF353,0xA7BB2DD6,
+	0x3FE374BC,0x6A7EF9DB, 0xBFDFD85B,0x73141D49,
+	0x3FE37CED,0x916872B0, 0xBFDFBD6E,0x97129387,
+	0x3FE3851E,0xB851EB85, 0xBFDFA28D,0x0A2E908A,
+	0x3FE38D4F,0xDF3B645A, 0xBFDF87B6,0xC2EC11CA,
+	0x3FE39581,0x0624DD2F, 0xBFDF6CEB,0xB7DAFE25,
+	0x3FE39DB2,0x2D0E5604, 0xBFDF522B,0xDF9711F8,
+	0x3FE3A5E3,0x53F7CED9, 0xBFDF3777,0x30C7CB60,
+	0x3FE3AE14,0x7AE147AE, 0xBFDF1CCD,0xA220569F,
+	0x3FE3B645,0xA1CAC083, 0xBFDF022F,0x2A5F7AAE,
+	0x3FE3BE76,0xC8B43958, 0xBFDEE79B,0xC04F85F9,
+	0x3FE3C6A7,0xEF9DB22D, 0xBFDECD13,0x5AC63B3D,
+	0x3FE3CED9,0x16872B02, 0xBFDEB295,0xF0A4BE96,
+	0x3FE3D70A,0x3D70A3D7, 0xBFDE9823,0x78D782AA,
+	0x3FE3DF3B,0x645A1CAC, 0xBFDE7DBB,0xEA563605,
+	0x3FE3E76C,0x8B439581, 0xBFDE635F,0x3C23B092,
+	0x3FE3EF9D,0xB22D0E56, 0xBFDE490D,0x654DE143,
+	0x3FE3F7CE,0xD916872B, 0xBFDE2EC6,0x5CEDBBD8,
+	0x3FE40000,0x00000000, 0xBFDE148A,0x1A2726CE,
+	0x3FE40831,0x26E978D5, 0xBFDDFA58,0x9428E971,
+	0x3FE41062,0x4DD2F1AA, 0xBFDDE031,0xC22C9A19,
+	0x3FE41893,0x74BC6A7F, 0xBFDDC615,0x9B768C81,
+	0x3FE420C4,0x9BA5E354, 0xBFDDAC04,0x1755C04C,
+	0x3FE428F5,0xC28F5C29, 0xBFDD91FD,0x2D23CFA6,
+	0x3FE43126,0xE978D4FE, 0xBFDD7800,0xD444DE0D,
+	0x3FE43958,0x10624DD3, 0xBFDD5E0F,0x04278739,
+	0x3FE44189,0x374BC6A8, 0xBFDD4427,0xB444CE2C,
+	0x3FE449BA,0x5E353F7D, 0xBFDD2A4A,0xDC200C60,
+	0x3FE451EB,0x851EB852, 0xBFDD1078,0x7346E115,
+	0x3FE45A1C,0xAC083127, 0xBFDCF6B0,0x715120C7,
+	0x3FE4624D,0xD2F1A9FC, 0xBFDCDCF2,0xCDE0C4C1,
+	0x3FE46A7E,0xF9DB22D1, 0xBFDCC33F,0x80A1DAD2,
+	0x3FE472B0,0x20C49BA6, 0xBFDCA996,0x814A7520,
+	0x3FE47AE1,0x47AE147B, 0xBFDC8FF7,0xC79A9A21,
+	0x3FE48312,0x6E978D50, 0xBFDC7663,0x4B5C34B1,
+	0x3FE48B43,0x95810625, 0xBFDC5CD9,0x04630444,
+	0x3FE49374,0xBC6A7EFA, 0xBFDC4358,0xEA8C8D3F,
+	0x3FE49BA5,0xE353F7CF, 0xBFDC29E2,0xF5C00969,
+	0x3FE4A3D7,0x0A3D70A4, 0xBFDC1077,0x1DEE5883,
+	0x3FE4AC08,0x3126E979, 0xBFDBF715,0x5B11F0F3,
+	0x3FE4B439,0x5810624E, 0xBFDBDDBD,0xA52ED09A,
+	0x3FE4BC6A,0x7EF9DB23, 0xBFDBC46F,0xF4526DBF,
+	0x3FE4C49B,0xA5E353F8, 0xBFDBAB2C,0x4093A81B,
+	0x3FE4CCCC,0xCCCCCCCD, 0xBFDB91F2,0x8212BA02,
+	0x3FE4D4FD,0xF3B645A2, 0xBFDB78C2,0xB0F929AC,
+	0x3FE4DD2F,0x1A9FBE77, 0xBFDB5F9C,0xC579BA97,
+	0x3FE4E560,0x4189374C, 0xBFDB4680,0xB7D05F03,
+	0x3FE4ED91,0x6872B021, 0xBFDB2D6E,0x80422996,
+	0x3FE4F5C2,0x8F5C28F6, 0xBFDB1466,0x171D3F0F,
+	0x3FE4FDF3,0xB645A1CB, 0xBFDAFB67,0x74B8C81C,
+	0x3FE50624,0xDD2F1AA0, 0xBFDAE272,0x9174E34C,
+	0x3FE50E56,0x04189375, 0xBFDAC987,0x65BA9715,
+	0x3FE51687,0x2B020C4A, 0xBFDAB0A5,0xE9FBC402,
+	0x3FE51EB8,0x51EB851F, 0xBFDA97CE,0x16B316F1,
+	0x3FE526E9,0x78D4FDF4, 0xBFDA7EFF,0xE463FB6C,
+	0x3FE52F1A,0x9FBE76C9, 0xBFDA663B,0x4B9A8E25,
+	0x3FE5374B,0xC6A7EF9E, 0xBFDA4D80,0x44EB8F83,
+	0x3FE53F7C,0xED916873, 0xBFDA34CE,0xC8F4564E,
+	0x3FE547AE,0x147AE148, 0xBFDA1C26,0xD05AC275,
+	0x3FE54FDF,0x3B645A1D, 0xBFDA0388,0x53CD2FE6,
+	0x3FE55810,0x624DD2F2, 0xBFD9EAF3,0x4C02698D,
+	0x3FE56041,0x89374BC7, 0xBFD9D267,0xB1B99C5C,
+	0x3FE56872,0xB020C49C, 0xBFD9B9E5,0x7DBA4A7A,
+	0x3FE570A3,0xD70A3D71, 0xBFD9A16C,0xA8D43E81,
+	0x3FE578D4,0xFDF3B646, 0xBFD988FD,0x2BDF7ED7,
+	0x3FE58106,0x24DD2F1B, 0xBFD97096,0xFFBC4123,
+	0x3FE58937,0x4BC6A7F0, 0xBFD9583A,0x1D52DDD4,
+	0x3FE59168,0x72B020C5, 0xBFD93FE6,0x7D93C3C2,
+	0x3FE59999,0x9999999A, 0xBFD9279C,0x19776BE9,
+	0x3FE5A1CA,0xC083126F, 0xBFD90F5A,0xE9FE4D36,
+	0x3FE5A9FB,0xE76C8B44, 0xBFD8F722,0xE830D073,
+	0x3FE5B22D,0x0E560419, 0xBFD8DEF4,0x0D1F443F,
+	0x3FE5BA5E,0x353F7CEE, 0xBFD8C6CE,0x51E1D126,
+	0x3FE5C28F,0x5C28F5C3, 0xBFD8AEB1,0xAF986DCC,
+	0x3FE5CAC0,0x83126E98, 0xBFD8969E,0x1F6AD32D,
+	0x3FE5D2F1,0xA9FBE76D, 0xBFD87E93,0x9A8870F7,
+	0x3FE5DB22,0xD0E56042, 0xBFD86692,0x1A2861F4,
+	0x3FE5E353,0xF7CED917, 0xBFD84E99,0x9789608E,
+	0x3FE5EB85,0x1EB851EC, 0xBFD836AA,0x0BF1BB68,
+	0x3FE5F3B6,0x45A1CAC1, 0xBFD81EC3,0x70AF4A0C,
+	0x3FE5FBE7,0x6C8B4396, 0xBFD806E5,0xBF1761AE,
+	0x3FE60418,0x9374BC6A, 0xBFD7EF10,0xF086CA03,
+	0x3FE60C49,0xBA5E353F, 0xBFD7D744,0xFE61B228,
+	0x3FE6147A,0xE147AE14, 0xBFD7BF81,0xE213A5AF,
+	0x3FE61CAC,0x083126E9, 0xBFD7A7C7,0x950F81AC,
+	0x3FE624DD,0x2F1A9FBE, 0xBFD79016,0x10CF69DF,
+	0x3FE62D0E,0x56041893, 0xBFD7786D,0x4ED4BDF6,
+	0x3FE6353F,0x7CED9168, 0xBFD760CD,0x48A80ED9,
+	0x3FE63D70,0xA3D70A3D, 0xBFD74935,0xF7D91413,
+	0x3FE645A1,0xCAC08312, 0xBFD731A7,0x55FEA14A,
+	0x3FE64DD2,0xF1A9FBE7, 0xBFD71A21,0x5CB69BCA,
+	0x3FE65604,0x189374BC, 0xBFD702A4,0x05A5F024,
+	0x3FE65E35,0x3F7CED91, 0xBFD6EB2F,0x4A7887E4,
+	0x3FE66666,0x66666666, 0xBFD6D3C3,0x24E13F50,
+	0x3FE66E97,0x8D4FDF3B, 0xBFD6BC5F,0x8E99DB45,
+	0x3FE676C8,0xB4395810, 0xBFD6A504,0x8162FF20,
+	0x3FE67EF9,0xDB22D0E5, 0xBFD68DB1,0xF70422B8,
+	0x3FE6872B,0x020C49BA, 0xBFD67667,0xE94B8871,
+	0x3FE68F5C,0x28F5C28F, 0xBFD65F26,0x520E335A,
+	0x3FE6978D,0x4FDF3B64, 0xBFD647ED,0x2B27DD63,
+	0x3FE69FBE,0x76C8B439, 0xBFD630BC,0x6E7AED9C,
+	0x3FE6A7EF,0x9DB22D0E, 0xBFD61994,0x15F06E93,
+	0x3FE6B020,0xC49BA5E3, 0xBFD60274,0x1B7804B4,
+	0x3FE6B851,0xEB851EB8, 0xBFD5EB5C,0x7907E4CA,
+	0x3FE6C083,0x126E978D, 0xBFD5D44D,0x289CCA80,
+	0x3FE6C8B4,0x39581062, 0xBFD5BD46,0x2439EF06,
+	0x3FE6D0E5,0x60418937, 0xBFD5A647,0x65E8FFB5,
+	0x3FE6D916,0x872B020C, 0xBFD58F50,0xE7BA14D1,
+	0x3FE6E147,0xAE147AE1, 0xBFD57862,0xA3C3A852,
+	0x3FE6E978,0xD4FDF3B6, 0xBFD5617C,0x94228CC7,
+	0x3FE6F1A9,0xFBE76C8B, 0xBFD54A9E,0xB2F9E441,
+	0x3FE6F9DB,0x22D0E560, 0xBFD533C8,0xFA731752,
+	0x3FE7020C,0x49BA5E35, 0xBFD51CFB,0x64BDCC1A,
+	0x3FE70A3D,0x70A3D70A, 0xBFD50635,0xEC0FDD69,
+	0x3FE7126E,0x978D4FDF, 0xBFD4EF78,0x8AA551E9,
+	0x3FE71A9F,0xBE76C8B4, 0xBFD4D8C3,0x3AC0535F,
+	0x3FE722D0,0xE5604189, 0xBFD4C215,0xF6A925F7,
+	0x3FE72B02,0x0C49BA5E, 0xBFD4AB70,0xB8AE1F9E,
+	0x3FE73333,0x33333333, 0xBFD494D3,0x7B239F74,
+	0x3FE73B64,0x5A1CAC08, 0xBFD47E3E,0x38640541,
+	0x3FE74395,0x810624DD, 0xBFD467B0,0xEACFA902,
+	0x3FE74BC6,0xA7EF9DB2, 0xBFD4512B,0x8CCCD284,
+	0x3FE753F7,0xCED91687, 0xBFD43AAE,0x18C7B107,
+	0x3FE75C28,0xF5C28F5C, 0xBFD42438,0x893252F5,
+	0x3FE7645A,0x1CAC0831, 0xBFD40DCA,0xD8849DAE,
+	0x3FE76C8B,0x43958106, 0xBFD3F765,0x013C454F,
+	0x3FE774BC,0x6A7EF9DB, 0xBFD3E106,0xFDDCC4A1,
+	0x3FE77CED,0x916872B0, 0xBFD3CAB0,0xC8EF54FD,
+	0x3FE7851E,0xB851EB85, 0xBFD3B462,0x5D02E652,
+	0x3FE78D4F,0xDF3B645A, 0xBFD39E1B,0xB4AC172C,
+	0x3FE79581,0x0624DD2F, 0xBFD387DC,0xCA852CD1,
+	0x3FE79DB2,0x2D0E5604, 0xBFD371A5,0x992E0B64,
+	0x3FE7A5E3,0x53F7CED9, 0xBFD35B76,0x1B4C2E1F,
+	0x3FE7AE14,0x7AE147AE, 0xBFD3454E,0x4B8A9F90,
+	0x3FE7B645,0xA1CAC083, 0xBFD32F2E,0x2499F1EF,
+	0x3FE7BE76,0xC8B43958, 0xBFD31915,0xA1303773,
+	0x3FE7C6A7,0xEF9DB22D, 0xBFD30304,0xBC08FAC5,
+	0x3FE7CED9,0x16872B02, 0xBFD2ECFB,0x6FE5376F,
+	0x3FE7D70A,0x3D70A3D7, 0xBFD2D6F9,0xB78B5268,
+	0x3FE7DF3B,0x645A1CAC, 0xBFD2C0FF,0x8DC7129D,
+	0x3FE7E76C,0x8B439581, 0xBFD2AB0C,0xED699996,
+	0x3FE7EF9D,0xB22D0E56, 0xBFD29521,0xD1495C1B,
+	0x3FE7F7CE,0xD916872B, 0xBFD27F3E,0x34421AF0,
+	0x3FE80000,0x00000000, 0xBFD26962,0x1134DB92,
+	0x3FE80831,0x26E978D5, 0xBFD2538D,0x6307E10F,
+	0x3FE81062,0x4DD2F1AA, 0xBFD23DC0,0x24A6A4D8,
+	0x3FE81893,0x74BC6A7F, 0xBFD227FA,0x5101CFB3,
+	0x3FE820C4,0x9BA5E354, 0xBFD2123B,0xE30F32A8,
+	0x3FE828F5,0xC28F5C29, 0xBFD1FC84,0xD5C9C006,
+	0x3FE83126,0xE978D4FE, 0xBFD1E6D5,0x2431846B,
+	0x3FE83958,0x10624DD3, 0xBFD1D12C,0xC94B9FDF,
+	0x3FE84189,0x374BC6A8, 0xBFD1BB8B,0xC0223EF5,
+	0x3FE849BA,0x5E353F7D, 0xBFD1A5F2,0x03C493FC,
+	0x3FE851EB,0x851EB852, 0xBFD1905F,0x8F46D038,
+	0x3FE85A1C,0xAC083127, 0xBFD17AD4,0x5DC21D28,
+	0x3FE8624D,0xD2F1A9FC, 0xBFD16550,0x6A5495DA,
+	0x3FE86A7E,0xF9DB22D1, 0xBFD14FD3,0xB0214042,
+	0x3FE872B0,0x20C49BA6, 0xBFD13A5E,0x2A5006A7,
+	0x3FE87AE1,0x47AE147B, 0xBFD124EF,0xD40DB113,
+	0x3FE88312,0x6E978D50, 0xBFD10F88,0xA88BDED0,
+	0x3FE88B43,0x95810625, 0xBFD0FA28,0xA300FFF1,
+	0x3FE89374,0xBC6A7EFA, 0xBFD0E4CF,0xBEA84EE6,
+	0x3FE89BA5,0xE353F7CF, 0xBFD0CF7D,0xF6C1CA1B,
+	0x3FE8A3D7,0x0A3D70A4, 0xBFD0BA33,0x46922D9D,
+	0x3FE8AC08,0x3126E979, 0xBFD0A4EF,0xA962ECCF,
+	0x3FE8B439,0x5810624E, 0xBFD08FB3,0x1A822C28,
+	0x3FE8BC6A,0x7EF9DB23, 0xBFD07A7D,0x9542BAFB,
+	0x3FE8C49B,0xA5E353F8, 0xBFD0654F,0x14FC0D48,
+	0x3FE8CCCC,0xCCCCCCCD, 0xBFD05027,0x950A3599,
+	0x3FE8D4FD,0xF3B645A2, 0xBFD03B07,0x10CDDEE8,
+	0x3FE8DD2F,0x1A9FBE77, 0xBFD025ED,0x83AC4692,
+	0x3FE8E560,0x4189374C, 0xBFD010DA,0xE90F364E,
+	0x3FE8ED91,0x6872B021, 0xBFCFF79E,0x78C9FC65,
+	0x3FE8F5C2,0x8F5C28F6, 0xBFCFCD94,0xF240DD8E,
+	0x3FE8FDF3,0xB645A1CB, 0xBFCFA399,0x3571A62D,
+	0x3FE90624,0xDD2F1AA0, 0xBFCF79AB,0x3953D5AD,
+	0x3FE90E56,0x04189375, 0xBFCF4FCA,0xF4E7C91D,
+	0x3FE91687,0x2B020C4A, 0xBFCF25F8,0x5F36AF9F,
+	0x3FE91EB8,0x51EB851F, 0xBFCEFC33,0x6F527EDF,
+	0x3FE926E9,0x78D4FDF4, 0xBFCED27C,0x1C55E7A8,
+	0x3FE92F1A,0x9FBE76C9, 0xBFCEA8D2,0x5D644A84,
+	0x3FE9374B,0xC6A7EF9E, 0xBFCE7F36,0x29A9AC6D,
+	0x3FE93F7C,0xED916873, 0xBFCE55A7,0x785AAB99,
+	0x3FE947AE,0x147AE148, 0xBFCE2C26,0x40B4744F,
+	0x3FE94FDF,0x3B645A1D, 0xBFCE02B2,0x79FCB5D5,
+	0x3FE95810,0x624DD2F2, 0xBFCDD94C,0x1B81976B,
+	0x3FE96041,0x89374BC7, 0xBFCDAFF3,0x1C99AD5B,
+	0x3FE96872,0xB020C49C, 0xBFCD86A7,0x74A3EE16,
+	0x3FE970A3,0xD70A3D71, 0xBFCD5D69,0x1B07A76B,
+	0x3FE978D4,0xFDF3B646, 0xBFCD3438,0x073473C8,
+	0x3FE98106,0x24DD2F1B, 0xBFCD0B14,0x30A22F8D,
+	0x3FE98937,0x4BC6A7F0, 0xBFCCE1FD,0x8ED0EE73,
+	0x3FE99168,0x72B020C5, 0xBFCCB8F4,0x1948F104,
+	0x3FE99999,0x9999999A, 0xBFCC8FF7,0xC79A9A20,
+	0x3FE9A1CA,0xC083126F, 0xBFCC6708,0x915E6496,
+	0x3FE9A9FB,0xE76C8B44, 0xBFCC3E26,0x6E34D8CF,
+	0x3FE9B22D,0x0E560419, 0xBFCC1551,0x55C68285,
+	0x3FE9BA5E,0x353F7CEE, 0xBFCBEC89,0x3FC3E68C,
+	0x3FE9C28F,0x5C28F5C3, 0xBFCBC3CE,0x23E578B0,
+	0x3FE9CAC0,0x83126E98, 0xBFCB9B1F,0xF9EB919B,
+	0x3FE9D2F1,0xA9FBE76D, 0xBFCB727E,0xB99E64D0,
+	0x3FE9DB22,0xD0E56042, 0xBFCB49EA,0x5ACDF6B8,
+	0x3FE9E353,0xF7CED917, 0xBFCB2162,0xD55212B8,
+	0x3FE9EB85,0x1EB851EC, 0xBFCAF8E8,0x210A415B,
+	0x3FE9F3B6,0x45A1CAC1, 0xBFCAD07A,0x35DDBE8E,
+	0x3FE9FBE7,0x6C8B4396, 0xBFCAA819,0x0BBB6FE6,
+	0x3FEA0418,0x9374BC6A, 0xBFCA7FC4,0x9A99DAFB,
+	0x3FEA0C49,0xBA5E353F, 0xBFCA577C,0xDA771BBF,
+	0x3FEA147A,0xE147AE14, 0xBFCA2F41,0xC358DB0F,
+	0x3FEA1CAC,0x083126E9, 0xBFCA0713,0x4D4C4526,
+	0x3FEA24DD,0x2F1A9FBE, 0xBFC9DEF1,0x70660032,
+	0x3FEA2D0E,0x56041893, 0xBFC9B6DC,0x24C222FD,
+	0x3FEA353F,0x7CED9168, 0xBFC98ED3,0x62842B97,
+	0x3FEA3D70,0xA3D70A3D, 0xBFC966D7,0x21D6F61B,
+	0x3FEA45A1,0xCAC08312, 0xBFC93EE7,0x5AECB37C,
+	0x3FEA4DD2,0xF1A9FBE7, 0xBFC91704,0x05FEE05F,
+	0x3FEA5604,0x189374BC, 0xBFC8EF2D,0x1B4E3C09,
+	0x3FEA5E35,0x3F7CED91, 0xBFC8C762,0x9322BF57,
+	0x3FEA6666,0x66666666, 0xBFC89FA4,0x65CB93C4,
+	0x3FEA6E97,0x8D4FDF3B, 0xBFC877F2,0x8B9F0A7C,
+	0x3FEA76C8,0xB4395810, 0xBFC8504C,0xFCFA9385,
+	0x3FEA7EF9,0xDB22D0E5, 0xBFC828B3,0xB242B4E7,
+	0x3FEA872B,0x020C49BA, 0xBFC80126,0xA3E301F0,
+	0x3FEA8F5C,0x28F5C28F, 0xBFC7D9A5,0xCA4E127E,
+	0x3FEA978D,0x4FDF3B64, 0xBFC7B231,0x1DFD7A57,
+	0x3FEA9FBE,0x76C8B439, 0xBFC78AC8,0x9771C08D,
+	0x3FEAA7EF,0x9DB22D0E, 0xBFC7636C,0x2F3256F8,
+	0x3FEAB020,0xC49BA5E3, 0xBFC73C1B,0xDDCD91AF,
+	0x3FEAB851,0xEB851EB8, 0xBFC714D7,0x9BD89E9B,
+	0x3FEAC083,0x126E978D, 0xBFC6ED9F,0x61EF7D0E,
+	0x3FEAC8B4,0x39581062, 0xBFC6C673,0x28B4F56D,
+	0x3FEAD0E5,0x60418937, 0xBFC69F52,0xE8D290E2,
+	0x3FEAD916,0x872B020C, 0xBFC6783E,0x9AF8911F,
+	0x3FEAE147,0xAE147AE1, 0xBFC65136,0x37DDE829,
+	0x3FEAE978,0xD4FDF3B6, 0xBFC62A39,0xB8403032,
+	0x3FEAF1A9,0xFBE76C8B, 0xBFC60349,0x14E3A383,
+	0x3FEAF9DB,0x22D0E560, 0xBFC5DC64,0x46931468,
+	0x3FEB020C,0x49BA5E35, 0xBFC5B58B,0x461FE536,
+	0x3FEB0A3D,0x70A3D70A, 0xBFC58EBE,0x0C62004F,
+	0x3FEB126E,0x978D4FDF, 0xBFC567FC,0x9237D03E,
+	0x3FEB1A9F,0xBE76C8B4, 0xBFC54146,0xD08637D8,
+	0x3FEB22D0,0xE5604189, 0xBFC51A9C,0xC0388A6B,
+	0x3FEB2B02,0x0C49BA5E, 0xBFC4F3FE,0x5A4083F8,
+	0x3FEB3333,0x33333333, 0xBFC4CD6B,0x97964179,
+	0x3FEB3B64,0x5A1CAC08, 0xBFC4A6E4,0x71383935,
+	0x3FEB4395,0x810624DD, 0xBFC48068,0xE02B331C,
+	0x3FEB4BC6,0xA7EF9DB2, 0xBFC459F8,0xDD7A412F,
+	0x3FEB53F7,0xCED91687, 0xBFC43394,0x6236B7F6,
+	0x3FEB5C28,0xF5C28F5C, 0xBFC40D3B,0x677826FD,
+	0x3FEB645A,0x1CAC0831, 0xBFC3E6ED,0xE65C5165,
+	0x3FEB6C8B,0x43958106, 0xBFC3C0AB,0xD8072670,
+	0x3FEB74BC,0x6A7EF9DB, 0xBFC39A75,0x35A2BA2C,
+	0x3FEB7CED,0x916872B0, 0xBFC37449,0xF85F3E1A,
+	0x3FEB851E,0xB851EB85, 0xBFC34E2A,0x1972F9E3,
+	0x3FEB8D4F,0xDF3B645A, 0xBFC32815,0x921A441F,
+	0x3FEB9581,0x0624DD2F, 0xBFC3020C,0x5B977B1E,
+	0x3FEB9DB2,0x2D0E5604, 0xBFC2DC0E,0x6F32FDC2,
+	0x3FEBA5E3,0x53F7CED9, 0xBFC2B61B,0xC63B245B,
+	0x3FEBAE14,0x7AE147AE, 0xBFC29034,0x5A04399A,
+	0x3FEBB645,0xA1CAC083, 0xBFC26A58,0x23E87386,
+	0x3FEBBE76,0xC8B43958, 0xBFC24487,0x1D47EC7A,
+	0x3FEBC6A7,0xEF9DB22D, 0xBFC21EC1,0x3F889C35,
+	0x3FEBCED9,0x16872B02, 0xBFC1F906,0x841650ED,
+	0x3FEBD70A,0x3D70A3D7, 0xBFC1D356,0xE462A870,
+	0x3FEBDF3B,0x645A1CAC, 0xBFC1ADB2,0x59E5094D,
+	0x3FEBE76C,0x8B439581, 0xBFC18818,0xDE1A9C09,
+	0x3FEBEF9D,0xB22D0E56, 0xBFC1628A,0x6A86445F,
+	0x3FEBF7CE,0xD916872B, 0xBFC13D06,0xF8B09A84,
+	0x3FEC0000,0x00000000, 0xBFC1178E,0x8227E47C,
+	0x3FEC0831,0x26E978D5, 0xBFC0F221,0x00800F74,
+	0x3FEC1062,0x4DD2F1AA, 0xBFC0CCBE,0x6D52A928,
+	0x3FEC1893,0x74BC6A7F, 0xBFC0A766,0xC23ED951,
+	0x3FEC20C4,0x9BA5E354, 0xBFC08219,0xF8E95B21,
+	0x3FEC28F5,0xC28F5C29, 0xBFC05CD8,0x0AFC76BE,
+	0x3FEC3126,0xE978D4FE, 0xBFC037A0,0xF227FAD6,
+	0x3FEC3958,0x10624DD3, 0xBFC01274,0xA821362D,
+	0x3FEC4189,0x374BC6A8, 0xBFBFDAA6,0x4D45E27B,
+	0x3FEC49BA,0x5E353F7D, 0xBFBF9078,0xCEDACFC3,
+	0x3FEC51EB,0x851EB852, 0xBFBF4660,0xC88C8603,
+	0x3FEC5A1C,0xAC083127, 0xBFBEFC5E,0x2DF12499,
+	0x3FEC624D,0xD2F1A9FC, 0xBFBEB270,0xF2A98BFD,
+	0x3FEC6A7E,0xF9DB22D1, 0xBFBE6899,0x0A615153,
+	0x3FEC72B0,0x20C49BA6, 0xBFBE1ED6,0x68CEB215,
+	0x3FEC7AE1,0x47AE147B, 0xBFBDD529,0x01B287D1,
+	0x3FEC8312,0x6E978D50, 0xBFBD8B90,0xC8D83BF3,
+	0x3FEC8B43,0x95810625, 0xBFBD420D,0xB215BBA3,
+	0x3FEC9374,0xBC6A7EFA, 0xBFBCF89F,0xB14B6BB6,
+	0x3FEC9BA5,0xE353F7CF, 0xBFBCAF46,0xBA641CB0,
+	0x3FECA3D7,0x0A3D70A4, 0xBFBC6602,0xC154FED4,
+	0x3FECAC08,0x3126E979, 0xBFBC1CD3,0xBA1D9647,
+	0x3FECB439,0x5810624E, 0xBFBBD3B9,0x98C7AF45,
+	0x3FECBC6A,0x7EF9DB23, 0xBFBB8AB4,0x51675268,
+	0x3FECC49B,0xA5E353F8, 0xBFBB41C3,0xD81AB8FA,
+	0x3FECCCCC,0xCCCCCCCD, 0xBFBAF8E8,0x210A415C,
+	0x3FECD4FD,0xF3B645A2, 0xBFBAB021,0x2068637F,
+	0x3FECDD2F,0x1A9FBE77, 0xBFBA676E,0xCA71A569,
+	0x3FECE560,0x4189374C, 0xBFBA1ED1,0x136C8FCE,
+	0x3FECED91,0x6872B021, 0xBFB9D647,0xEFA9A2B4,
+	0x3FECF5C2,0x8F5C28F6, 0xBFB98DD3,0x53834A30,
+	0x3FECFDF3,0xB645A1CB, 0xBFB94573,0x335DD329,
+	0x3FED0624,0xDD2F1AA0, 0xBFB8FD27,0x83A76031,
+	0x3FED0E56,0x04189375, 0xBFB8B4F0,0x38D7DE6E,
+	0x3FED1687,0x2B020C4A, 0xBFB86CCD,0x4770FA8C,
+	0x3FED1EB8,0x51EB851F, 0xBFB824BE,0xA3FE15C9,
+	0x3FED26E9,0x78D4FDF4, 0xBFB7DCC4,0x43143B07,
+	0x3FED2F1A,0x9FBE76C9, 0xBFB794DE,0x195213F0,
+	0x3FED374B,0xC6A7EF9E, 0xBFB74D0C,0x1B5FDE30,
+	0x3FED3F7C,0xED916873, 0xBFB7054E,0x3DEF60B2,
+	0x3FED47AE,0x147AE148, 0xBFB6BDA4,0x75BBE0F6,
+	0x3FED4FDF,0x3B645A1D, 0xBFB6760E,0xB78A1871,
+	0x3FED5810,0x624DD2F2, 0xBFB62E8C,0xF82829FF,
+	0x3FED6041,0x89374BC7, 0xBFB5E71F,0x2C6D975E,
+	0x3FED6872,0xB020C49C, 0xBFB59FC5,0x493B36C2,
+	0x3FED70A3,0xD70A3D71, 0xBFB5587F,0x437B2869,
+	0x3FED78D4,0xFDF3B646, 0xBFB5114D,0x1020CC4D,
+	0x3FED8106,0x24DD2F1B, 0xBFB4CA2E,0xA428B7D9,
+	0x3FED8937,0x4BC6A7F0, 0xBFB48323,0xF498ABB1,
+	0x3FED9168,0x72B020C5, 0xBFB43C2C,0xF67F8985,
+	0x3FED9999,0x9999999A, 0xBFB3F549,0x9EF549F9,
+	0x3FEDA1CA,0xC083126F, 0xBFB3AE79,0xE31AF295,
+	0x3FEDA9FB,0xE76C8B44, 0xBFB367BD,0xB81A8BC1,
+	0x3FEDB22D,0x0E560419, 0xBFB32115,0x132716D5,
+	0x3FEDBA5E,0x353F7CEE, 0xBFB2DA7F,0xE97C8435,
+	0x3FEDC28F,0x5C28F5C3, 0xBFB293FE,0x305FA975,
+	0x3FEDCAC0,0x83126E98, 0xBFB24D8F,0xDD1E3794,
+	0x3FEDD2F1,0xA9FBE76D, 0xBFB20734,0xE50EB13D,
+	0x3FEDDB22,0xD0E56042, 0xBFB1C0ED,0x3D906115,
+	0x3FEDE353,0xF7CED917, 0xBFB17AB8,0xDC0B5020,
+	0x3FEDEB85,0x1EB851EC, 0xBFB13497,0xB5F03C25,
+	0x3FEDF3B6,0x45A1CAC1, 0xBFB0EE89,0xC0B88E2D,
+	0x3FEDFBE7,0x6C8B4396, 0xBFB0A88E,0xF1E65102,
+	0x3FEE0418,0x9374BC6A, 0xBFB062A7,0x3F0427CE,
+	0x3FEE0C49,0xBA5E353F, 0xBFB01CD2,0x9DA54498,
+	0x3FEE147A,0xE147AE14, 0xBFAFAE22,0x06CABE40,
+	0x3FEE1CAC,0x083126E9, 0xBFAF22C4,0xCBD156F4,
+	0x3FEE24DD,0x2F1A9FBE, 0xBFAE978D,0x75B7A1B0,
+	0x3FEE2D0E,0x56041893, 0xBFAE0C7B,0xEFE7C0BD,
+	0x3FEE353F,0x7CED9168, 0xBFAD8190,0x25DC9801,
+	0x3FEE3D70,0xA3D70A3D, 0xBFACF6CA,0x0321BAD9,
+	0x3FEE45A1,0xCAC08312, 0xBFAC6C29,0x73535A03,
+	0x3FEE4DD2,0xF1A9FBE7, 0xBFABE1AE,0x621E31A5,
+	0x3FEE5604,0x189374BC, 0xBFAB5758,0xBB3F7770,
+	0x3FEE5E35,0x3F7CED91, 0xBFAACD28,0x6A84C8D0,
+	0x3FEE6666,0x66666666, 0xBFAA431D,0x5BCC193E,
+	0x3FEE6E97,0x8D4FDF3B, 0xBFA9B937,0x7B03A0A9,
+	0x3FEE76C8,0xB4395810, 0xBFA92F76,0xB429C9F0,
+	0x3FEE7EF9,0xDB22D0E5, 0xBFA8A5DA,0xF34D217A,
+	0x3FEE872B,0x020C49BA, 0xBFA81C64,0x248C43E2,
+	0x3FEE8F5C,0x28F5C28F, 0xBFA79312,0x3415CCBD,
+	0x3FEE978D,0x4FDF3B64, 0xBFA709E5,0x0E284574,
+	0x3FEE9FBE,0x76C8B439, 0xBFA680DC,0x9F121438,
+	0x3FEEA7EF,0x9DB22D0E, 0xBFA5F7F8,0xD3316B08,
+	0x3FEEB020,0xC49BA5E3, 0xBFA56F39,0x96F436D4,
+	0x3FEEB851,0xEB851EB8, 0xBFA4E69E,0xD6D80EB3,
+	0x3FEEC083,0x126E978D, 0xBFA45E28,0x7F6A232F,
+	0x3FEEC8B4,0x39581062, 0xBFA3D5D6,0x7D472DA6,
+	0x3FEED0E5,0x60418937, 0xBFA34DA8,0xBD1B5FC8,
+	0x3FEED916,0x872B020C, 0xBFA2C59F,0x2BA25321,
+	0x3FEEE147,0xAE147AE1, 0xBFA23DB9,0xB5A6F8C1,
+	0x3FEEE978,0xD4FDF3B6, 0xBFA1B5F8,0x480388F4,
+	0x3FEEF1A9,0xFBE76C8B, 0xBFA12E5A,0xCFA17314,
+	0x3FEEF9DB,0x22D0E560, 0xBFA0A6E1,0x39794D70,
+	0x3FEF020C,0x49BA5E35, 0xBFA01F8B,0x7292C543,
+	0x3FEF0A3D,0x70A3D70A, 0xBF9F30B2,0xD0091D8A,
+	0x3FEF126E,0x978D4FDF, 0xBF9E2296,0x0DE8AAA3,
+	0x3FEF1A9F,0xBE76C8B4, 0xBF9D14C0,0x792D5741,
+	0x3FEF22D0,0xE5604189, 0xBF9C0731,0xEC5DF82A,
+	0x3FEF2B02,0x0C49BA5E, 0xBF9AF9EA,0x421EF240,
+	0x3FEF3333,0x33333333, 0xBF99ECE9,0x55321B70,
+	0x3FEF3B64,0x5A1CAC08, 0xBF98E02F,0x00769BCE,
+	0x3FEF4395,0x810624DD, 0xBF97D3BB,0x1EE8CED0,
+	0x3FEF4BC6,0xA7EF9DB2, 0xBF96C78D,0x8BA224BC,
+	0x3FEF53F7,0xCED91687, 0xBF95BBA6,0x21D90435,
+	0x3FEF5C28,0xF5C28F5C, 0xBF94B004,0xBCE0ABF7,
+	0x3FEF645A,0x1CAC0831, 0xBF93A4A9,0x382914B6,
+	0x3FEF6C8B,0x43958106, 0xBF929993,0x6F3ED324,
+	0x3FEF74BC,0x6A7EF9DB, 0xBF918EC3,0x3DCAFA23,
+	0x3FEF7CED,0x916872B0, 0xBF908438,0x7F92FD19,
+	0x3FEF851E,0xB851EB85, 0xBF8EF3E6,0x20F124D2,
+	0x3FEF8D4F,0xDF3B645A, 0xBF8CDFE5,0x98F32C36,
+	0x3FEF9581,0x0624DD2F, 0xBF8ACC6F,0x1F5FD940,
+	0x3FEF9DB2,0x2D0E5604, 0xBF88B982,0x6CA2CB84,
+	0x3FEFA5E3,0x53F7CED9, 0xBF86A71F,0x395F3F6F,
+	0x3FEFAE14,0x7AE147AE, 0xBF849545,0x3E6FD4BC,
+	0x3FEFB645,0xA1CAC083, 0xBF8283F4,0x34E6552E,
+	0x3FEFBE76,0xC8B43958, 0xBF80732B,0xD60B7B99,
+	0x3FEFC6A7,0xEF9DB22D, 0xBF7CC5D7,0xB6BD7664,
+	0x3FEFCED9,0x16872B02, 0xBF78A667,0xFD2C0E51,
+	0x3FEFD70A,0x3D70A3D7, 0xBF748807,0xF33B3513,
+	0x3FEFDF3B,0x645A1CAC, 0xBF706AB7,0x0D2F80D0,
+	0x3FEFE76C,0x8B439581, 0xBF689CE9,0x7F727142,
+	0x3FEFEF9D,0xB22D0E56, 0xBF606680,0xFFE7CC09,
+	0x3FEFF7CE,0xD916872B, 0xBF506467,0x0D979B73,
+	0x3FF00000,0x00000000, 0x80000000,0x00000000,
+	0x3FF00418,0x9374BC6A, 0x3F506035,0x4F8C3CC4,
+	0x3FF00831,0x26E978D5, 0x3F605E1D,0x82FDF749,
+	0x3FF00C49,0xBA5E353F, 0x3F688A09,0xA34CA9D6,
+	0x3FF01062,0x4DD2F1AA, 0x3F7059F0,0x0CC2F7FC,
+	0x3FF0147A,0xE147AE14, 0x3F746DD0,0xFAD671FA,
+	0x3FF01893,0x74BC6A7F, 0x3F7880A8,0x237A7261,
+	0x3FF01CAC,0x083126E9, 0x3F7C9276,0x0DE12CC4,
+	0x3FF020C4,0x9BA5E354, 0x3F80519D,0xA06AE4F3,
+	0x3FF024DD,0x2F1A9FBE, 0x3F82597C,0x215E6436,
+	0x3FF028F5,0xC28F5C29, 0x3F8460D6,0xCCCA367C,
+	0x3FF02D0E,0x56041893, 0x3F8667AD,0xE57A90E1,
+	0x3FF03126,0xE978D4FE, 0x3F886E01,0xAE08F2D9,
+	0x3FF0353F,0x7CED9168, 0x3F8A73D2,0x68DC557E,
+	0x3FF03958,0x10624DD3, 0x3F8C7920,0x58296295,
+	0x3FF03D70,0xA3D70A3D, 0x3F8E7DEB,0xBDF2A35D,
+	0x3FF04189,0x374BC6A8, 0x3F90411A,0x6E045B8A,
+	0x3FF045A1,0xCAC08312, 0x3F9142FD,0xFA0540A5,
+	0x3FF049BA,0x5E353F7D, 0x3F9244A0,0xA3B2AFEE,
+	0x3FF04DD2,0xF1A9FBE7, 0x3F934602,0x8BAAAC6B,
+	0x3FF051EB,0x851EB852, 0x3F944723,0xD272A7F6,
+	0x3FF05604,0x189374BC, 0x3F954804,0x987799EC,
+	0x3FF05A1C,0xAC083127, 0x3F9648A4,0xFE0E19B0,
+	0x3FF05E35,0x3F7CED91, 0x3F974905,0x2372751C,
+	0x3FF0624D,0xD2F1A9FC, 0x3F984925,0x28C8CAC5,
+	0x3FF06666,0x66666666, 0x3F994905,0x2E1D202E,
+	0x3FF06A7E,0xF9DB22D1, 0x3F9A48A5,0x53637BD3,
+	0x3FF06E97,0x8D4FDF3B, 0x3F9B4805,0xB877FB21,
+	0x3FF072B0,0x20C49BA6, 0x3F9C4726,0x7D1EEC3E,
+	0x3FF076C8,0xB4395810, 0x3F9D4607,0xC104E3C9,
+	0x3FF07AE1,0x47AE147B, 0x3F9E44A9,0xA3BED66B,
+	0x3FF07EF9,0xDB22D0E5, 0x3F9F430C,0x44CA2E59,
+	0x3FF08312,0x6E978D50, 0x3FA02097,0xE1C67254,
+	0x3FF0872B,0x020C49BA, 0x3FA09F8A,0x1FAACB4D,
+	0x3FF08B43,0x95810625, 0x3FA11E5C,0xEBADCF5A,
+	0x3FF08F5C,0x28F5C28F, 0x3FA19D10,0x555F94E8,
+	0x3FF09374,0xBC6A7EFA, 0x3FA21BA4,0x6C44A801,
+	0x3FF0978D,0x4FDF3B64, 0x3FA29A19,0x3FD614B8,
+	0x3FF09BA5,0xE353F7CF, 0x3FA3186E,0xDF817377,
+	0x3FF09FBE,0x76C8B439, 0x3FA396A5,0x5AA8F35A,
+	0x3FF0A3D7,0x0A3D70A4, 0x3FA414BC,0xC0A3665D,
+	0x3FF0A7EF,0x9DB22D0E, 0x3FA492B5,0x20BC4B99,
+	0x3FF0AC08,0x3126E979, 0x3FA5108E,0x8A33DB58,
+	0x3FF0B020,0xC49BA5E3, 0x3FA58E49,0x0C3F1137,
+	0x3FF0B439,0x5810624E, 0x3FA60BE4,0xB607B81F,
+	0x3FF0B851,0xEB851EB8, 0x3FA68961,0x96AC744C,
+	0x3FF0BC6A,0x7EF9DB23, 0x3FA706BF,0xBD40CF29,
+	0x3FF0C083,0x126E978D, 0x3FA783FF,0x38CD413E,
+	0x3FF0C49B,0xA5E353F8, 0x3FA80120,0x184F3DF2,
+	0x3FF0C8B4,0x39581062, 0x3FA87E22,0x6AB93D5D,
+	0x3FF0CCCC,0xCCCCCCCD, 0x3FA8FB06,0x3EF2C7F0,
+	0x3FF0D0E5,0x60418937, 0x3FA977CB,0xA3D8802B,
+	0x3FF0D4FD,0xF3B645A2, 0x3FA9F472,0xA83C2E32,
+	0x3FF0D916,0x872B020C, 0x3FAA70FB,0x5AE4C960,
+	0x3FF0DD2F,0x1A9FBE77, 0x3FAAED65,0xCA8E83C8,
+	0x3FF0E147,0xAE147AE1, 0x3FAB69B2,0x05EAD3AD,
+	0x3FF0E560,0x4189374C, 0x3FABE5E0,0x1BA07EE6,
+	0x3FF0E978,0xD4FDF3B6, 0x3FAC61F0,0x1A4BA446,
+	0x3FF0ED91,0x6872B021, 0x3FACDDE2,0x107DC6DD,
+	0x3FF0F1A9,0xFBE76C8B, 0x3FAD59B6,0x0CBDD74A,
+	0x3FF0F5C2,0x8F5C28F6, 0x3FADD56C,0x1D883EE6,
+	0x3FF0F9DB,0x22D0E560, 0x3FAE5104,0x514EE8FD,
+	0x3FF0FDF3,0xB645A1CB, 0x3FAECC7E,0xB6794DDA,
+	0x3FF1020C,0x49BA5E35, 0x3FAF47DB,0x5B647BEF,
+	0x3FF10624,0xDD2F1AA0, 0x3FAFC31A,0x4E6322C7,
+	0x3FF10A3D,0x70A3D70A, 0x3FB01F1D,0xCEDECE09,
+	0x3FF10E56,0x04189375, 0x3FB05C9F,0xABD8FB42,
+	0x3FF1126E,0x978D4FDF, 0x3FB09A12,0xC539FF63,
+	0x3FF11687,0x2B020C4A, 0x3FB0D777,0x2216A51E,
+	0x3FF11A9F,0xBE76C8B4, 0x3FB114CC,0xC97E9FF2,
+	0x3FF11EB8,0x51EB851F, 0x3FB15213,0xC27C9180,
+	0x3FF122D0,0xE5604189, 0x3FB18F4C,0x14160DEE,
+	0x3FF126E9,0x78D4FDF4, 0x3FB1CC75,0xC54BA132,
+	0x3FF12B02,0x0C49BA5E, 0x3FB20990,0xDD18D36A,
+	0x3FF12F1A,0x9FBE76C9, 0x3FB2469D,0x62742E1B,
+	0x3FF13333,0x33333333, 0x3FB2839B,0x5C4F407C,
+	0x3FF1374B,0xC6A7EF9E, 0x3FB2C08A,0xD196A4AA,
+	0x3FF13B64,0x5A1CAC08, 0x3FB2FD6B,0xC93203E9,
+	0x3FF13F7C,0xED916873, 0x3FB33A3E,0x4A041BCF,
+	0x3FF14395,0x810624DD, 0x3FB37702,0x5AEAC274,
+	0x3FF147AE,0x147AE148, 0x3FB3B3B8,0x02BEEB94,
+	0x3FF14BC6,0xA7EF9DB2, 0x3FB3F05F,0x4854ACB9,
+	0x3FF14FDF,0x3B645A1D, 0x3FB42CF8,0x327B424B,
+	0x3FF153F7,0xCED91687, 0x3FB46982,0xC7FD13B2,
+	0x3FF15810,0x624DD2F2, 0x3FB4A5FF,0x0F9FB85E,
+	0x3FF15C28,0xF5C28F5C, 0x3FB4E26D,0x1023FBD7,
+	0x3FF16041,0x89374BC7, 0x3FB51ECC,0xD045E2C0,
+	0x3FF1645A,0x1CAC0831, 0x3FB55B1E,0x56BCAEDD,
+	0x3FF16872,0xB020C49C, 0x3FB59761,0xAA3AE408,
+	0x3FF16C8B,0x43958106, 0x3FB5D396,0xD16E4C2E,
+	0x3FF170A3,0xD70A3D71, 0x3FB60FBD,0xD2FFFC37,
+	0x3FF174BC,0x6A7EF9DB, 0x3FB64BD6,0xB59457FC,
+	0x3FF178D4,0xFDF3B646, 0x3FB687E1,0x7FCB1726,
+	0x3FF17CED,0x916872B0, 0x3FB6C3DE,0x383F4915,
+	0x3FF18106,0x24DD2F1B, 0x3FB6FFCC,0xE58759B3,
+	0x3FF1851E,0xB851EB85, 0x3FB73BAD,0x8E35155A,
+	0x3FF18937,0x4BC6A7F0, 0x3FB77780,0x38D5AD96,
+	0x3FF18D4F,0xDF3B645A, 0x3FB7B344,0xEBF1BD00,
+	0x3FF19168,0x72B020C5, 0x3FB7EEFB,0xAE0D4BFA,
+	0x3FF19581,0x0624DD2F, 0x3FB82AA4,0x85A7D47D,
+	0x3FF19999,0x9999999A, 0x3FB8663F,0x793C46CC,
+	0x3FF19DB2,0x2D0E5604, 0x3FB8A1CC,0x8F410D3C,
+	0x3FF1A1CA,0xC083126F, 0x3FB8DD4B,0xCE2810D4,
+	0x3FF1A5E3,0x53F7CED9, 0x3FB918BD,0x3C5EBD13,
+	0x3FF1A9FB,0xE76C8B44, 0x3FB95420,0xE04E0486,
+	0x3FF1AE14,0x7AE147AE, 0x3FB98F76,0xC05A647E,
+	0x3FF1B22D,0x0E560419, 0x3FB9CABE,0xE2E3E9A4,
+	0x3FF1B645,0xA1CAC083, 0x3FBA05F9,0x4E4633A0,
+	0x3FF1BA5E,0x353F7CEE, 0x3FBA4126,0x08D879A6,
+	0x3FF1BE76,0xC8B43958, 0x3FBA7C45,0x18ED8E15,
+	0x3FF1C28F,0x5C28F5C3, 0x3FBAB756,0x84D3E2F6,
+	0x3FF1C6A7,0xEF9DB22D, 0x3FBAF25A,0x52D58D95,
+	0x3FF1CAC0,0x83126E98, 0x3FBB2D50,0x89384AF5,
+	0x3FF1CED9,0x16872B02, 0x3FBB6839,0x2E3D8364,
+	0x3FF1D2F1,0xA9FBE76D, 0x3FBBA314,0x48224EDE,
+	0x3FF1D70A,0x3D70A3D7, 0x3FBBDDE1,0xDD1F789F,
+	0x3FF1DB22,0xD0E56042, 0x3FBC18A1,0xF369837A,
+	0x3FF1DF3B,0x645A1CAC, 0x3FBC5354,0x9130AD5F,
+	0x3FF1E353,0xF7CED917, 0x3FBC8DF9,0xBCA0F3B2,
+	0x3FF1E76C,0x8B439581, 0x3FBCC891,0x7BE216BC,
+	0x3FF1EB85,0x1EB851EC, 0x3FBD031B,0xD5179E02,
+	0x3FF1EF9D,0xB22D0E56, 0x3FBD3D98,0xCE60DBAB,
+	0x3FF1F3B6,0x45A1CAC1, 0x3FBD7808,0x6DD8F0CA,
+	0x3FF1F7CE,0xD916872B, 0x3FBDB26A,0xB996D0C2,
+	0x3FF1FBE7,0x6C8B4396, 0x3FBDECBF,0xB7AD4583,
+	0x3FF20000,0x00000000, 0x3FBE2707,0x6E2AF2E6,
+	0x3FF20418,0x9374BC6A, 0x3FBE6141,0xE31A5AD3,
+	0x3FF20831,0x26E978D5, 0x3FBE9B6F,0x1C81E0DB,
+	0x3FF20C49,0xBA5E353F, 0x3FBED58F,0x2063CDCA,
+	0x3FF21062,0x4DD2F1AA, 0x3FBF0FA1,0xF4BE53C3,
+	0x3FF2147A,0xE147AE14, 0x3FBF49A7,0x9F8B9187,
+	0x3FF21893,0x74BC6A7F, 0x3FBF83A0,0x26C19690,
+	0x3FF21CAC,0x083126E9, 0x3FBFBD8B,0x90526656,
+	0x3FF220C4,0x9BA5E354, 0x3FBFF769,0xE22BFC60,
+	0x3FF224DD,0x2F1A9FBE, 0x3FC0189D,0x911C27BF,
+	0x3FF228F5,0xC28F5C29, 0x3FC0357F,0xAB2EAAEA,
+	0x3FF22D0E,0x56041893, 0x3FC0525B,0x423E8406,
+	0x3FF23126,0xE978D4FE, 0x3FC06F30,0x593AB2AE,
+	0x3FF2353F,0x7CED9168, 0x3FC08BFE,0xF3103B54,
+	0x3FF23958,0x10624DD3, 0x3FC0A8C7,0x12AA2941,
+	0x3FF23D70,0xA3D70A3D, 0x3FC0C588,0xBAF19025,
+	0x3FF24189,0x374BC6A8, 0x3FC0E243,0xEECD8E13,
+	0x3FF245A1,0xCAC08312, 0x3FC0FEF8,0xB1234D07,
+	0x3FF249BA,0x5E353F7D, 0x3FC11BA7,0x04D604E4,
+	0x3FF24DD2,0xF1A9FBE7, 0x3FC1384E,0xECC6FCF6,
+	0x3FF251EB,0x851EB852, 0x3FC154F0,0x6BD58DE8,
+	0x3FF25604,0x189374BC, 0x3FC1718B,0x84DF2346,
+	0x3FF25A1C,0xAC083127, 0x3FC18E20,0x3ABF3D6B,
+	0x3FF25E35,0x3F7CED91, 0x3FC1AAAE,0x904F7304,
+	0x3FF2624D,0xD2F1A9FC, 0x3FC1C736,0x886772F9,
+	0x3FF26666,0x66666666, 0x3FC1E3B8,0x25DD05E9,
+	0x3FF26A7E,0xF9DB22D1, 0x3FC20033,0x6B841012,
+	0x3FF26E97,0x8D4FDF3B, 0x3FC21CA8,0x5C2E92C8,
+	0x3FF272B0,0x20C49BA6, 0x3FC23916,0xFAACAE5B,
+	0x3FF276C8,0xB4395810, 0x3FC2557F,0x49CCA389,
+	0x3FF27AE1,0x47AE147B, 0x3FC271E1,0x4C5AD55E,
+	0x3FF27EF9,0xDB22D0E5, 0x3FC28E3D,0x0521CAA8,
+	0x3FF28312,0x6E978D50, 0x3FC2AA92,0x76EA2FCF,
+	0x3FF2872B,0x020C49BA, 0x3FC2C6E1,0xA47AD845,
+	0x3FF28B43,0x95810625, 0x3FC2E32A,0x9098C05C,
+	0x3FF28F5C,0x28F5C28F, 0x3FC2FF6D,0x3E070EB3,
+	0x3FF29374,0xBC6A7EFA, 0x3FC31BA9,0xAF871608,
+	0x3FF2978D,0x4FDF3B64, 0x3FC337DF,0xE7D856A0,
+	0x3FF29BA5,0xE353F7CF, 0x3FC3540F,0xE9B88018,
+	0x3FF29FBE,0x76C8B439, 0x3FC37039,0xB7E372C4,
+	0x3FF2A3D7,0x0A3D70A4, 0x3FC38C5D,0x55134183,
+	0x3FF2A7EF,0x9DB22D0E, 0x3FC3A87A,0xC4003319,
+	0x3FF2AC08,0x3126E979, 0x3FC3C492,0x0760C3FC,
+	0x3FF2B020,0xC49BA5E3, 0x3FC3E0A3,0x21E9A7AF,
+	0x3FF2B439,0x5810624E, 0x3FC3FCAE,0x164DCA87,
+	0x3FF2B851,0xEB851EB8, 0x3FC418B2,0xE73E5307,
+	0x3FF2BC6A,0x7EF9DB23, 0x3FC434B1,0x976AA39E,
+	0x3FF2C083,0x126E978D, 0x3FC450AA,0x29805C02,
+	0x3FF2C49B,0xA5E353F8, 0x3FC46C9C,0xA02B5AEB,
+	0x3FF2C8B4,0x39581062, 0x3FC48888,0xFE15BF67,
+	0x3FF2CCCC,0xCCCCCCCD, 0x3FC4A46F,0x45E7EA95,
+	0x3FF2D0E5,0x60418937, 0x3FC4C04F,0x7A4880F6,
+	0x3FF2D4FD,0xF3B645A2, 0x3FC4DC29,0x9DDC6C23,
+	0x3FF2D916,0x872B020C, 0x3FC4F7FD,0xB346DC19,
+	0x3FF2DD2F,0x1A9FBE77, 0x3FC513CB,0xBD2948F0,
+	0x3FF2E147,0xAE147AE1, 0x3FC52F93,0xBE237421,
+	0x3FF2E560,0x4189374C, 0x3FC54B55,0xB8D36A3C,
+	0x3FF2E978,0xD4FDF3B6, 0x3FC56711,0xAFD58428,
+	0x3FF2ED91,0x6872B021, 0x3FC582C7,0xA5C468D3,
+	0x3FF2F1A9,0xFBE76C8B, 0x3FC59E77,0x9D390E79,
+	0x3FF2F5C2,0x8F5C28F6, 0x3FC5BA21,0x98CABC49,
+	0x3FF2F9DB,0x22D0E560, 0x3FC5D5C5,0x9B0F0BA7,
+	0x3FF2FDF3,0xB645A1CB, 0x3FC5F163,0xA699E9D3,
+	0x3FF3020C,0x49BA5E35, 0x3FC60CFB,0xBDFD9929,
+	0x3FF30624,0xDD2F1AA0, 0x3FC6288D,0xE3CAB2C0,
+	0x3FF30A3D,0x70A3D70A, 0x3FC6441A,0x1A9027A6,
+	0x3FF30E56,0x04189375, 0x3FC65FA0,0x64DB4282,
+	0x3FF3126E,0x978D4FDF, 0x3FC67B20,0xC537A8CA,
+	0x3FF31687,0x2B020C4A, 0x3FC6969B,0x3E2F5C62,
+	0x3FF31A9F,0xBE76C8B4, 0x3FC6B20F,0xD24ABCCC,
+	0x3FF31EB8,0x51EB851F, 0x3FC6CD7E,0x841088C8,
+	0x3FF322D0,0xE5604189, 0x3FC6E8E7,0x5605DF80,
+	0x3FF326E9,0x78D4FDF4, 0x3FC7044A,0x4AAE4225,
+	0x3FF32B02,0x0C49BA5E, 0x3FC71FA7,0x648B9516,
+	0x3FF32F1A,0x9FBE76C9, 0x3FC73AFE,0xA61E217E,
+	0x3FF33333,0x33333333, 0x3FC75650,0x11E49675,
+	0x3FF3374B,0xC6A7EF9E, 0x3FC7719B,0xAA5C0A99,
+	0x3FF33B64,0x5A1CAC08, 0x3FC78CE1,0x71FFFD34,
+	0x3FF33F7C,0xED916873, 0x3FC7A821,0x6B4A57C9,
+	0x3FF34395,0x810624DD, 0x3FC7C35B,0x98B36F3C,
+	0x3FF347AE,0x147AE148, 0x3FC7DE8F,0xFCB2055D,
+	0x3FF34BC6,0xA7EF9DB2, 0x3FC7F9BE,0x99BB4A09,
+	0x3FF34FDF,0x3B645A1D, 0x3FC814E7,0x7242DCB5,
+	0x3FF353F7,0xCED91687, 0x3FC8300A,0x88BACD8E,
+	0x3FF35810,0x624DD2F2, 0x3FC84B27,0xDF939EFD,
+	0x3FF35C28,0xF5C28F5C, 0x3FC8663F,0x793C46C6,
+	0x3FF36041,0x89374BC7, 0x3FC88151,0x58222F88,
+	0x3FF3645A,0x1CAC0831, 0x3FC89C5D,0x7EB139DD,
+	0x3FF36872,0xB020C49C, 0x3FC8B763,0xEF53BDD5,
+	0x3FF36C8B,0x43958106, 0x3FC8D264,0xAC728C10,
+	0x3FF370A3,0xD70A3D71, 0x3FC8ED5F,0xB874EF3D,
+	0x3FF374BC,0x6A7EF9DB, 0x3FC90855,0x15C0AD2B,
+	0x3FF378D4,0xFDF3B646, 0x3FC92344,0xC6BA0847,
+	0x3FF37CED,0x916872B0, 0x3FC93E2E,0xCDC3C0AF,
+	0x3FF38106,0x24DD2F1B, 0x3FC95913,0x2D3F15A6,
+	0x3FF3851E,0xB851EB85, 0x3FC973F1,0xE78BC6A8,
+	0x3FF38937,0x4BC6A7F0, 0x3FC98ECA,0xFF0814DE,
+	0x3FF38D4F,0xDF3B645A, 0x3FC9A99E,0x7610C429,
+	0x3FF39168,0x72B020C5, 0x3FC9C46C,0x4F011C99,
+	0x3FF39581,0x0624DD2F, 0x3FC9DF34,0x8C32EB74,
+	0x3FF39999,0x9999999A, 0x3FC9F9F7,0x2FFE84A6,
+	0x3FF39DB2,0x2D0E5604, 0x3FCA14B4,0x3CBAC3CC,
+	0x3FF3A1CA,0xC083126F, 0x3FCA2F6B,0xB4BD0DA0,
+	0x3FF3A5E3,0x53F7CED9, 0x3FCA4A1D,0x9A5950FC,
+	0x3FF3A9FB,0xE76C8B44, 0x3FCA64C9,0xEFE20849,
+	0x3FF3AE14,0x7AE147AE, 0x3FCA7F70,0xB7A83A7F,
+	0x3FF3B22D,0x0E560419, 0x3FCA9A11,0xF3FB7C8E,
+	0x3FF3B645,0xA1CAC083, 0x3FCAB4AD,0xA729F260,
+	0x3FF3BA5E,0x353F7CEE, 0x3FCACF43,0xD380503E,
+	0x3FF3BE76,0xC8B43958, 0x3FCAE9D4,0x7B49DBCB,
+	0x3FF3C28F,0x5C28F5C3, 0x3FCB045F,0xA0D06D6D,
+	0x3FF3C6A7,0xEF9DB22D, 0x3FCB1EE5,0x465C7142,
+	0x3FF3CAC0,0x83126E98, 0x3FCB3965,0x6E34E888,
+	0x3FF3CED9,0x16872B02, 0x3FCB53E0,0x1A9F6A91,
+	0x3FF3D2F1,0xA9FBE76D, 0x3FCB6E55,0x4DE02621,
+	0x3FF3D70A,0x3D70A3D7, 0x3FCB88C5,0x0A39E268,
+	0x3FF3DB22,0xD0E56042, 0x3FCBA32F,0x51EE005E,
+	0x3FF3DF3B,0x645A1CAC, 0x3FCBBD94,0x273C7BB3,
+	0x3FF3E353,0xF7CED917, 0x3FCBD7F3,0x8C63EC2D,
+	0x3FF3E76C,0x8B439581, 0x3FCBF24D,0x83A18698,
+	0x3FF3EB85,0x1EB851EC, 0x3FCC0CA2,0x0F311E1E,
+	0x3FF3EF9D,0xB22D0E56, 0x3FCC26F1,0x314D2536,
+	0x3FF3F3B6,0x45A1CAC1, 0x3FCC413A,0xEC2EAEF8,
+	0x3FF3F7CE,0xD916872B, 0x3FCC5B7F,0x420D700C,
+	0x3FF3FBE7,0x6C8B4396, 0x3FCC75BE,0x351FBFFD,
+	0x3FF40000,0x00000000, 0x3FCC8FF7,0xC79A9A22,
+	0x3FF40418,0x9374BC6A, 0x3FCCAA2B,0xFBB19EE7,
+	0x3FF40831,0x26E978D5, 0x3FCCC45A,0xD39714DB,
+	0x3FF40C49,0xBA5E353F, 0x3FCCDE84,0x517BE9B1,
+	0x3FF41062,0x4DD2F1AA, 0x3FCCF8A8,0x778FB38C,
+	0x3FF4147A,0xE147AE14, 0x3FCD12C7,0x4800B1DE,
+	0x3FF41893,0x74BC6A7F, 0x3FCD2CE0,0xC4FBCEBB,
+	0x3FF41CAC,0x083126E9, 0x3FCD46F4,0xF0AC9FB4,
+	0x3FF420C4,0x9BA5E354, 0x3FCD6103,0xCD3D6725,
+	0x3FF424DD,0x2F1A9FBE, 0x3FCD7B0D,0x5CD71512,
+	0x3FF428F5,0xC28F5C29, 0x3FCD9511,0xA1A14871,
+	0x3FF42D0E,0x56041893, 0x3FCDAF10,0x9DC25005,
+	0x3FF43126,0xE978D4FE, 0x3FCDC90A,0x535F2BA4,
+	0x3FF4353F,0x7CED9168, 0x3FCDE2FE,0xC49B8D14,
+	0x3FF43958,0x10624DD3, 0x3FCDFCED,0xF399D94B,
+	0x3FF43D70,0xA3D70A3D, 0x3FCE16D7,0xE27B294C,
+	0x3FF44189,0x374BC6A8, 0x3FCE30BC,0x935F4B64,
+	0x3FF445A1,0xCAC08312, 0x3FCE4A9C,0x0864C404,
+	0x3FF449BA,0x5E353F7D, 0x3FCE6476,0x43A8CEFD,
+	0x3FF44DD2,0xF1A9FBE7, 0x3FCE7E4B,0x47476059,
+	0x3FF451EB,0x851EB852, 0x3FCE981B,0x155B2593,
+	0x3FF45604,0x189374BC, 0x3FCEB1E5,0xAFFD866F,
+	0x3FF45A1C,0xAC083127, 0x3FCECBAB,0x1946A62F,
+	0x3FF45E35,0x3F7CED91, 0x3FCEE56B,0x534D6468,
+	0x3FF4624D,0xD2F1A9FC, 0x3FCEFF26,0x60275E3A,
+	0x3FF46666,0x66666666, 0x3FCF18DC,0x41E8EF1D,
+	0x3FF46A7E,0xF9DB22D1, 0x3FCF328C,0xFAA53219,
+	0x3FF46E97,0x8D4FDF3B, 0x3FCF4C38,0x8C6E0292,
+	0x3FF472B0,0x20C49BA6, 0x3FCF65DE,0xF953FD7D,
+	0x3FF476C8,0xB4395810, 0x3FCF7F80,0x4366822B,
+	0x3FF47AE1,0x47AE147B, 0x3FCF991C,0x6CB3B37A,
+	0x3FF47EF9,0xDB22D0E5, 0x3FCFB2B3,0x774878A1,
+	0x3FF48312,0x6E978D50, 0x3FCFCC45,0x65307E5B,
+	0x3FF4872B,0x020C49BA, 0x3FCFE5D2,0x387637B5,
+	0x3FF48B43,0x95810625, 0x3FCFFF59,0xF322DF35,
+	0x3FF48F5C,0x28F5C28F, 0x3FD00C6E,0x4B9F3BD3,
+	0x3FF49374,0xBC6A7EFA, 0x3FD0192D,0x1367E6A0,
+	0x3FF4978D,0x4FDF3B64, 0x3FD025E9,0x51EE3B35,
+	0x3FF49BA5,0xE353F7CF, 0x3FD032A3,0x08346A75,
+	0x3FF49FBE,0x76C8B439, 0x3FD03F5A,0x373C0B51,
+	0x3FF4A3D7,0x0A3D70A4, 0x3FD04C0E,0xE0061B5B,
+	0x3FF4A7EF,0x9DB22D0E, 0x3FD058C1,0x0392FF2B,
+	0x3FF4AC08,0x3126E979, 0x3FD06570,0xA2E282EB,
+	0x3FF4B020,0xC49BA5E3, 0x3FD0721D,0xBEF3DABC,
+	0x3FF4B439,0x5810624E, 0x3FD07EC8,0x58C5A344,
+	0x3FF4B851,0xEB851EB8, 0x3FD08B70,0x7155E20F,
+	0x3FF4BC6A,0x7EF9DB23, 0x3FD09816,0x09A2061F,
+	0x3FF4C083,0x126E978D, 0x3FD0A4B9,0x22A6E849,
+	0x3FF4C49B,0xA5E353F8, 0x3FD0B159,0xBD60CBC4,
+	0x3FF4C8B4,0x39581062, 0x3FD0BDF7,0xDACB5E88,
+	0x3FF4CCCC,0xCCCCCCCD, 0x3FD0CA93,0x7BE1B9DC,
+	0x3FF4D0E5,0x60418937, 0x3FD0D72C,0xA19E62B2,
+	0x3FF4D4FD,0xF3B645A2, 0x3FD0E3C3,0x4CFB4A32,
+	0x3FF4D916,0x872B020C, 0x3FD0F057,0x7EF1CE1A,
+	0x3FF4DD2F,0x1A9FBE77, 0x3FD0FCE9,0x387AB948,
+	0x3FF4E147,0xAE147AE1, 0x3FD10978,0x7A8E4413,
+	0x3FF4E560,0x4189374C, 0x3FD11605,0x462414DB,
+	0x3FF4E978,0xD4FDF3B6, 0x3FD1228F,0x9C33405F,
+	0x3FF4ED91,0x6872B021, 0x3FD12F17,0x7DB24A48,
+	0x3FF4F1A9,0xFBE76C8B, 0x3FD13B9C,0xEB972584,
+	0x3FF4F5C2,0x8F5C28F6, 0x3FD1481F,0xE6D734CF,
+	0x3FF4F9DB,0x22D0E560, 0x3FD154A0,0x70674B09,
+	0x3FF4FDF3,0xB645A1CB, 0x3FD1611E,0x893BABC2,
+	0x3FF5020C,0x49BA5E35, 0x3FD16D9A,0x32480B8F,
+	0x3FF50624,0xDD2F1AA0, 0x3FD17A13,0x6C7F9093,
+	0x3FF50A3D,0x70A3D70A, 0x3FD1868A,0x38D4D2D6,
+	0x3FF50E56,0x04189375, 0x3FD192FE,0x9839DCC9,
+	0x3FF5126E,0x978D4FDF, 0x3FD19F70,0x8BA02BA3,
+	0x3FF51687,0x2B020C4A, 0x3FD1ABE0,0x13F8AFDC,
+	0x3FF51A9F,0xBE76C8B4, 0x3FD1B84D,0x3233CD8D,
+	0x3FF51EB8,0x51EB851F, 0x3FD1C4B7,0xE7415CEE,
+	0x3FF522D0,0xE5604189, 0x3FD1D120,0x3410AAAD,
+	0x3FF526E9,0x78D4FDF4, 0x3FD1DD86,0x19907873,
+	0x3FF52B02,0x0C49BA5E, 0x3FD1E9E9,0x98AEFD35,
+	0x3FF52F1A,0x9FBE76C9, 0x3FD1F64A,0xB259E5BA,
+	0x3FF53333,0x33333333, 0x3FD202A9,0x677E54EC,
+	0x3FF5374B,0xC6A7EF9E, 0x3FD20F05,0xB908E45C,
+	0x3FF53B64,0x5A1CAC08, 0x3FD21B5F,0xA7E5A492,
+	0x3FF53F7C,0xED916873, 0x3FD227B7,0x35001D90,
+	0x3FF54395,0x810624DD, 0x3FD2340C,0x61434F25,
+	0x3FF547AE,0x147AE148, 0x3FD2405F,0x2D99B16A,
+	0x3FF54BC6,0xA7EF9DB2, 0x3FD24CAF,0x9AED3514,
+	0x3FF54FDF,0x3B645A1D, 0x3FD258FD,0xAA2743F8,
+	0x3FF553F7,0xCED91687, 0x3FD26549,0x5C30C153,
+	0x3FF55810,0x624DD2F2, 0x3FD27192,0xB1F20A51,
+	0x3FF55C28,0xF5C28F5C, 0x3FD27DD9,0xAC52F657,
+	0x3FF56041,0x89374BC7, 0x3FD28A1E,0x4C3AD782,
+	0x3FF5645A,0x1CAC0831, 0x3FD29660,0x92907AF8,
+	0x3FF56872,0xB020C49C, 0x3FD2A2A0,0x803A2964,
+	0x3FF56C8B,0x43958106, 0x3FD2AEDE,0x161DA742,
+	0x3FF570A3,0xD70A3D71, 0x3FD2BB19,0x5520355D,
+	0x3FF574BC,0x6A7EF9DB, 0x3FD2C752,0x3E26911F,
+	0x3FF578D4,0xFDF3B646, 0x3FD2D388,0xD214F507,
+	0x3FF57CED,0x916872B0, 0x3FD2DFBD,0x11CF18FA,
+	0x3FF58106,0x24DD2F1B, 0x3FD2EBEE,0xFE3832BB,
+	0x3FF5851E,0xB851EB85, 0x3FD2F81E,0x9832F63A,
+	0x3FF58937,0x4BC6A7F0, 0x3FD3044B,0xE0A1960A,
+	0x3FF58D4F,0xDF3B645A, 0x3FD31076,0xD865C3B1,
+	0x3FF59168,0x72B020C5, 0x3FD31C9F,0x8060B01C,
+	0x3FF59581,0x0624DD2F, 0x3FD328C5,0xD9730BEE,
+	0x3FF59999,0x9999999A, 0x3FD334E9,0xE47D07F6,
+	0x3FF59DB2,0x2D0E5604, 0x3FD3410B,0xA25E5578,
+	0x3FF5A1CA,0xC083126F, 0x3FD34D2B,0x13F626A8,
+	0x3FF5A5E3,0x53F7CED9, 0x3FD35948,0x3A232EF1,
+	0x3FF5A9FB,0xE76C8B44, 0x3FD36563,0x15C3A36B,
+	0x3FF5AE14,0x7AE147AE, 0x3FD3717B,0xA7B53B27,
+	0x3FF5B22D,0x0E560419, 0x3FD37D91,0xF0D52FA0,
+	0x3FF5B645,0xA1CAC083, 0x3FD389A5,0xF2003D07,
+	0x3FF5BA5E,0x353F7CEE, 0x3FD395B7,0xAC12A2B9,
+	0x3FF5BE76,0xC8B43958, 0x3FD3A1C7,0x1FE82381,
+	0x3FF5C28F,0x5C28F5C3, 0x3FD3ADD4,0x4E5C0613,
+	0x3FF5C6A7,0xEF9DB22D, 0x3FD3B9DF,0x3849154E,
+	0x3FF5CAC0,0x83126E98, 0x3FD3C5E7,0xDE89A0B1,
+	0x3FF5CED9,0x16872B02, 0x3FD3D1EE,0x41F77CA4,
+	0x3FF5D2F1,0xA9FBE76D, 0x3FD3DDF2,0x636C02E7,
+	0x3FF5D70A,0x3D70A3D7, 0x3FD3E9F4,0x43C012D9,
+	0x3FF5DB22,0xD0E56042, 0x3FD3F5F3,0xE3CC11EB,
+	0x3FF5DF3B,0x645A1CAC, 0x3FD401F1,0x4467EBE3,
+	0x3FF5E353,0xF7CED917, 0x3FD40DEC,0x666B1351,
+	0x3FF5E76C,0x8B439581, 0x3FD419E5,0x4AAC81CF,
+	0x3FF5EB85,0x1EB851EC, 0x3FD425DB,0xF202B876,
+	0x3FF5EF9D,0xB22D0E56, 0x3FD431D0,0x5D43C01F,
+	0x3FF5F3B6,0x45A1CAC1, 0x3FD43DC2,0x8D4529D2,
+	0x3FF5F7CE,0xD916872B, 0x3FD449B2,0x82DC0F0D,
+	0x3FF5FBE7,0x6C8B4396, 0x3FD455A0,0x3EDD1230,
+	0x3FF60000,0x00000000, 0x3FD4618B,0xC21C5EC2,
+	0x3FF60418,0x9374BC6A, 0x3FD46D75,0x0D6DA9DB,
+	0x3FF60831,0x26E978D5, 0x3FD4795C,0x21A43274,
+	0x3FF60C49,0xBA5E353F, 0x3FD48540,0xFF92C1B6,
+	0x3FF61062,0x4DD2F1AA, 0x3FD49123,0xA80BAB69,
+	0x3FF6147A,0xE147AE14, 0x3FD49D04,0x1BE0CE2F,
+	0x3FF61893,0x74BC6A7F, 0x3FD4A8E2,0x5BE393F6,
+	0x3FF61CAC,0x083126E9, 0x3FD4B4BE,0x68E4F233,
+	0x3FF620C4,0x9BA5E354, 0x3FD4C098,0x43B56A55,
+	0x3FF624DD,0x2F1A9FBE, 0x3FD4CC6F,0xED2509FF,
+	0x3FF628F5,0xC28F5C29, 0x3FD4D845,0x66036B79,
+	0x3FF62D0E,0x56041893, 0x3FD4E418,0xAF1FB5E9,
+	0x3FF63126,0xE978D4FE, 0x3FD4EFE9,0xC9489DC3,
+	0x3FF6353F,0x7CED9168, 0x3FD4FBB8,0xB54C6506,
+	0x3FF63958,0x10624DD3, 0x3FD50785,0x73F8DBA6,
+	0x3FF63D70,0xA3D70A3D, 0x3FD51350,0x061B5FCB,
+	0x3FF64189,0x374BC6A8, 0x3FD51F18,0x6C80DE3B,
+	0x3FF645A1,0xCAC08312, 0x3FD52ADE,0xA7F5D294,
+	0x3FF649BA,0x5E353F7D, 0x3FD536A2,0xB94647BC,
+	0x3FF64DD2,0xF1A9FBE7, 0x3FD54264,0xA13DD815,
+	0x3FF651EB,0x851EB852, 0x3FD54E24,0x60A7ADEE,
+	0x3FF65604,0x189374BC, 0x3FD559E1,0xF84E83BA,
+	0x3FF65A1C,0xAC083127, 0x3FD5659D,0x68FCA47B,
+	0x3FF65E35,0x3F7CED91, 0x3FD57156,0xB37BEBFB,
+	0x3FF6624D,0xD2F1A9FC, 0x3FD57D0D,0xD895C734,
+	0x3FF66666,0x66666666, 0x3FD588C2,0xD913348F,
+	0x3FF66A7E,0xF9DB22D1, 0x3FD59475,0xB5BCC443,
+	0x3FF66E97,0x8D4FDF3B, 0x3FD5A026,0x6F5A9899,
+	0x3FF672B0,0x20C49BA6, 0x3FD5ABD5,0x06B4664A,
+	0x3FF676C8,0xB4395810, 0x3FD5B781,0x7C9174BF,
+	0x3FF67AE1,0x47AE147B, 0x3FD5C32B,0xD1B89E70,
+	0x3FF67EF9,0xDB22D0E5, 0x3FD5CED4,0x06F05126,
+	0x3FF68312,0x6E978D50, 0x3FD5DA7A,0x1CFE8E5A,
+	0x3FF6872B,0x020C49BA, 0x3FD5E61E,0x14A8EB6D,
+	0x3FF68B43,0x95810625, 0x3FD5F1BF,0xEEB49213,
+	0x3FF68F5C,0x28F5C28F, 0x3FD5FD5F,0xABE64084,
+	0x3FF69374,0xBC6A7EFA, 0x3FD608FD,0x4D0249E4,
+	0x3FF6978D,0x4FDF3B64, 0x3FD61498,0xD2CC967C,
+	0x3FF69BA5,0xE353F7CF, 0x3FD62032,0x3E08A417,
+	0x3FF69FBE,0x76C8B439, 0x3FD62BC9,0x8F798642,
+	0x3FF6A3D7,0x0A3D70A4, 0x3FD6375E,0xC7E1E6A8,
+	0x3FF6A7EF,0x9DB22D0E, 0x3FD642F1,0xE804054C,
+	0x3FF6AC08,0x3126E979, 0x3FD64E82,0xF0A1B8E9,
+	0x3FF6B020,0xC49BA5E3, 0x3FD65A11,0xE27C6F2A,
+	0x3FF6B439,0x5810624E, 0x3FD6659E,0xBE552D0D,
+	0x3FF6B851,0xEB851EB8, 0x3FD67129,0x84EC8F15,
+	0x3FF6BC6A,0x7EF9DB23, 0x3FD67CB2,0x3702C9AD,
+	0x3FF6C083,0x126E978D, 0x3FD68838,0xD557A95E,
+	0x3FF6C49B,0xA5E353F8, 0x3FD693BD,0x60AA932F,
+	0x3FF6C8B4,0x39581062, 0x3FD69F3F,0xD9BA84D8,
+	0x3FF6CCCC,0xCCCCCCCD, 0x3FD6AAC0,0x41461526,
+	0x3FF6D0E5,0x60418937, 0x3FD6B63E,0x980B7429,
+	0x3FF6D4FD,0xF3B645A2, 0x3FD6C1BA,0xDEC86B9B,
+	0x3FF6D916,0x872B020C, 0x3FD6CD35,0x163A5F0E,
+	0x3FF6DD2F,0x1A9FBE77, 0x3FD6D8AD,0x3F1E4C4C,
+	0x3FF6E147,0xAE147AE1, 0x3FD6E423,0x5A30CB8D,
+	0x3FF6E560,0x4189374C, 0x3FD6EF97,0x682E0FD1,
+	0x3FF6E978,0xD4FDF3B6, 0x3FD6FB09,0x69D1E717,
+	0x3FF6ED91,0x6872B021, 0x3FD70679,0x5FD7BAB9,
+	0x3FF6F1A9,0xFBE76C8B, 0x3FD711E7,0x4AFA8F9D,
+	0x3FF6F5C2,0x8F5C28F6, 0x3FD71D53,0x2BF50695,
+	0x3FF6F9DB,0x22D0E560, 0x3FD728BD,0x03815C8D,
+	0x3FF6FDF3,0xB645A1CB, 0x3FD73424,0xD2596AEC,
+	0x3FF7020C,0x49BA5E35, 0x3FD73F8A,0x9936A7C4,
+	0x3FF70624,0xDD2F1AA0, 0x3FD74AEE,0x58D2262D,
+	0x3FF70A3D,0x70A3D70A, 0x3FD75650,0x11E49676,
+	0x3FF70E56,0x04189375, 0x3FD761AF,0xC5264681,
+	0x3FF7126E,0x978D4FDF, 0x3FD76D0D,0x734F21F5,
+	0x3FF71687,0x2B020C4A, 0x3FD77869,0x1D16B299,
+	0x3FF71A9F,0xBE76C8B4, 0x3FD783C2,0xC334207F,
+	0x3FF71EB8,0x51EB851F, 0x3FD78F1A,0x665E3267,
+	0x3FF722D0,0xE5604189, 0x3FD79A70,0x074B4DE8,
+	0x3FF726E9,0x78D4FDF4, 0x3FD7A5C3,0xA6B177CC,
+	0x3FF72B02,0x0C49BA5E, 0x3FD7B115,0x45465441,
+	0x3FF72F1A,0x9FBE76C9, 0x3FD7BC64,0xE3BF272F,
+	0x3FF73333,0x33333333, 0x3FD7C7B2,0x82D0D46B,
+	0x3FF7374B,0xC6A7EF9E, 0x3FD7D2FE,0x232FE00D,
+	0x3FF73B64,0x5A1CAC08, 0x3FD7DE47,0xC5906E9E,
+	0x3FF73F7C,0xED916873, 0x3FD7E98F,0x6AA64574,
+	0x3FF74395,0x810624DD, 0x3FD7F4D5,0x1324CADC,
+	0x3FF747AE,0x147AE148, 0x3FD80018,0xBFBF0675,
+	0x3FF74BC6,0xA7EF9DB2, 0x3FD80B5A,0x7127A15A,
+	0x3FF74FDF,0x3B645A1D, 0x3FD8169A,0x2810E67F,
+	0x3FF753F7,0xCED91687, 0x3FD821D7,0xE52CC2D8,
+	0x3FF75810,0x624DD2F2, 0x3FD82D13,0xA92CC5B4,
+	0x3FF75C28,0xF5C28F5C, 0x3FD8384D,0x74C220E9,
+	0x3FF76041,0x89374BC7, 0x3FD84385,0x489DA929,
+	0x3FF7645A,0x1CAC0831, 0x3FD84EBB,0x256FD631,
+	0x3FF76872,0xB020C49C, 0x3FD859EF,0x0BE8C31B,
+	0x3FF76C8B,0x43958106, 0x3FD86520,0xFCB82E8F,
+	0x3FF770A3,0xD70A3D71, 0x3FD87050,0xF88D7B14,
+	0x3FF774BC,0x6A7EF9DB, 0x3FD87B7F,0x0017AF3E,
+	0x3FF778D4,0xFDF3B646, 0x3FD886AB,0x14057602,
+	0x3FF77CED,0x916872B0, 0x3FD891D5,0x35051EE1,
+	0x3FF78106,0x24DD2F1B, 0x3FD89CFD,0x63C49E40,
+	0x3FF7851E,0xB851EB85, 0x3FD8A823,0xA0F18D8C,
+	0x3FF78937,0x4BC6A7F0, 0x3FD8B347,0xED392B95,
+	0x3FF78D4F,0xDF3B645A, 0x3FD8BE6A,0x49485CB2,
+	0x3FF79168,0x72B020C5, 0x3FD8C98A,0xB5CBAB1B,
+	0x3FF79581,0x0624DD2F, 0x3FD8D4A9,0x336F470E,
+	0x3FF79999,0x9999999A, 0x3FD8DFC5,0xC2DF0724,
+	0x3FF79DB2,0x2D0E5604, 0x3FD8EAE0,0x64C6687A,
+	0x3FF7A1CA,0xC083126F, 0x3FD8F5F9,0x19D08F07,
+	0x3FF7A5E3,0x53F7CED9, 0x3FD9010F,0xE2A845C0,
+	0x3FF7A9FB,0xE76C8B44, 0x3FD90C24,0xBFF7FEEC,
+	0x3FF7AE14,0x7AE147AE, 0x3FD91737,0xB269D44E,
+	0x3FF7B22D,0x0E560419, 0x3FD92248,0xBAA78778,
+	0x3FF7B645,0xA1CAC083, 0x3FD92D57,0xD95A81F0,
+	0x3FF7BA5E,0x353F7CEE, 0x3FD93865,0x0F2BD582,
+	0x3FF7BE76,0xC8B43958, 0x3FD94370,0x5CC43C6B,
+	0x3FF7C28F,0x5C28F5C3, 0x3FD94E79,0xC2CC19A7,
+	0x3FF7C6A7,0xEF9DB22D, 0x3FD95981,0x41EB791A,
+	0x3FF7CAC0,0x83126E98, 0x3FD96486,0xDACA0FDE,
+	0x3FF7CED9,0x16872B02, 0x3FD96F8A,0x8E0F3C6F,
+	0x3FF7D2F1,0xA9FBE76D, 0x3FD97A8C,0x5C6206F7,
+	0x3FF7D70A,0x3D70A3D7, 0x3FD9858C,0x46692177,
+	0x3FF7DB22,0xD0E56042, 0x3FD9908A,0x4CCAE814,
+	0x3FF7DF3B,0x645A1CAC, 0x3FD99B86,0x702D6142,
+	0x3FF7E353,0xF7CED917, 0x3FD9A680,0xB1363E0E,
+	0x3FF7E76C,0x8B439581, 0x3FD9B179,0x108ADA49,
+	0x3FF7EB85,0x1EB851EC, 0x3FD9BC6F,0x8ED03CD3,
+	0x3FF7EF9D,0xB22D0E56, 0x3FD9C764,0x2CAB17C3,
+	0x3FF7F3B6,0x45A1CAC1, 0x3FD9D256,0xEABFC8B5,
+	0x3FF7F7CE,0xD916872B, 0x3FD9DD47,0xC9B258EF,
+	0x3FF7FBE7,0x6C8B4396, 0x3FD9E836,0xCA267DAD,
+	0x3FF80000,0x00000000, 0x3FD9F323,0xECBF984C,
+	0x3FF80418,0x9374BC6A, 0x3FD9FE0F,0x3220B68E,
+	0x3FF80831,0x26E978D5, 0x3FDA08F8,0x9AEC92D0,
+	0x3FF80C49,0xBA5E353F, 0x3FDA13E0,0x27C59439,
+	0x3FF81062,0x4DD2F1AA, 0x3FDA1EC5,0xD94DCF07,
+	0x3FF8147A,0xE147AE14, 0x3FDA29A9,0xB02704AE,
+	0x3FF81893,0x74BC6A7F, 0x3FDA348B,0xACF2A42C,
+	0x3FF81CAC,0x083126E9, 0x3FDA3F6B,0xD051CA25,
+	0x3FF820C4,0x9BA5E354, 0x3FDA4A4A,0x1AE54137,
+	0x3FF824DD,0x2F1A9FBE, 0x3FDA5526,0x8D4D8214,
+	0x3FF828F5,0xC28F5C29, 0x3FDA6001,0x282AB3D9,
+	0x3FF82D0E,0x56041893, 0x3FDA6AD9,0xEC1CAC26,
+	0x3FF83126,0xE978D4FE, 0x3FDA75B0,0xD9C2EF74,
+	0x3FF8353F,0x7CED9168, 0x3FDA8085,0xF1BCB12D,
+	0x3FF83958,0x10624DD3, 0x3FDA8B59,0x34A8D400,
+	0x3FF83D70,0xA3D70A3D, 0x3FDA962A,0xA325E9FE,
+	0x3FF84189,0x374BC6A8, 0x3FDAA0FA,0x3DD234EA,
+	0x3FF845A1,0xCAC08312, 0x3FDAABC8,0x054BA652,
+	0x3FF849BA,0x5E353F7D, 0x3FDAB693,0xFA2FDFE3,
+	0x3FF84DD2,0xF1A9FBE7, 0x3FDAC15E,0x1D1C3385,
+	0x3FF851EB,0x851EB852, 0x3FDACC26,0x6EADA3A7,
+	0x3FF85604,0x189374BC, 0x3FDAD6EC,0xEF80E35F,
+	0x3FF85A1C,0xAC083127, 0x3FDAE1B1,0xA03256B6,
+	0x3FF85E35,0x3F7CED91, 0x3FDAEC74,0x815E12C6,
+	0x3FF8624D,0xD2F1A9FC, 0x3FDAF735,0x939FDE05,
+	0x3FF86666,0x66666666, 0x3FDB01F4,0xD7933064,
+	0x3FF86A7E,0xF9DB22D1, 0x3FDB0CB2,0x4DD3339C,
+	0x3FF86E97,0x8D4FDF3B, 0x3FDB176D,0xF6FAC34A,
+	0x3FF872B0,0x20C49BA6, 0x3FDB2227,0xD3A46D37,
+	0x3FF876C8,0xB4395810, 0x3FDB2CDF,0xE46A717D,
+	0x3FF87AE1,0x47AE147B, 0x3FDB3796,0x29E6C2CB,
+	0x3FF87EF9,0xDB22D0E5, 0x3FDB424A,0xA4B30686,
+	0x3FF88312,0x6E978D50, 0x3FDB4CFD,0x5568950F,
+	0x3FF8872B,0x020C49BA, 0x3FDB57AE,0x3CA079E6,
+	0x3FF88B43,0x95810625, 0x3FDB625D,0x5AF373EE,
+	0x3FF88F5C,0x28F5C28F, 0x3FDB6D0A,0xB0F9F58E,
+	0x3FF89374,0xBC6A7EFA, 0x3FDB77B6,0x3F4C24F8,
+	0x3FF8978D,0x4FDF3B64, 0x3FDB8260,0x0681DC46,
+	0x3FF89BA5,0xE353F7CF, 0x3FDB8D08,0x0732A9C3,
+	0x3FF89FBE,0x76C8B439, 0x3FDB97AE,0x41F5D008,
+	0x3FF8A3D7,0x0A3D70A4, 0x3FDBA252,0xB7624642,
+	0x3FF8A7EF,0x9DB22D0E, 0x3FDBACF5,0x680EB851,
+	0x3FF8AC08,0x3126E979, 0x3FDBB796,0x54918710,
+	0x3FF8B020,0xC49BA5E3, 0x3FDBC235,0x7D80C86D,
+	0x3FF8B439,0x5810624E, 0x3FDBCCD2,0xE37247B7,
+	0x3FF8B851,0xEB851EB8, 0x3FDBD76E,0x86FB85B1,
+	0x3FF8BC6A,0x7EF9DB23, 0x3FDBE208,0x68B1B8E3,
+	0x3FF8C083,0x126E978D, 0x3FDBECA0,0x8929CDAF,
+	0x3FF8C49B,0xA5E353F8, 0x3FDBF736,0xE8F86696,
+	0x3FF8C8B4,0x39581062, 0x3FDC01CB,0x88B1DC5C,
+	0x3FF8CCCC,0xCCCCCCCD, 0x3FDC0C5E,0x68EA3E46,
+	0x3FF8D0E5,0x60418937, 0x3FDC16EF,0x8A355236,
+	0x3FF8D4FD,0xF3B645A2, 0x3FDC217E,0xED2694F6,
+	0x3FF8D916,0x872B020C, 0x3FDC2C0C,0x92513A4E,
+	0x3FF8DD2F,0x1A9FBE77, 0x3FDC3698,0x7A482D4C,
+	0x3FF8E147,0xAE147AE1, 0x3FDC4122,0xA59E105C,
+	0x3FF8E560,0x4189374C, 0x3FDC4BAB,0x14E53D91,
+	0x3FF8E978,0xD4FDF3B6, 0x3FDC5631,0xC8AFC6BA,
+	0x3FF8ED91,0x6872B021, 0x3FDC60B6,0xC18F75AC,
+	0x3FF8F1A9,0xFBE76C8B, 0x3FDC6B3A,0x0015CC5A,
+	0x3FF8F5C2,0x8F5C28F6, 0x3FDC75BB,0x84D40518,
+	0x3FF8F9DB,0x22D0E560, 0x3FDC803B,0x505B12B7,
+	0x3FF8FDF3,0xB645A1CB, 0x3FDC8AB9,0x633BA0C8,
+	0x3FF9020C,0x49BA5E35, 0x3FDC9535,0xBE0613B6,
+	0x3FF90624,0xDD2F1AA0, 0x3FDC9FB0,0x614A8908,
+	0x3FF90A3D,0x70A3D70A, 0x3FDCAA29,0x4D98D77E,
+	0x3FF90E56,0x04189375, 0x3FDCB4A0,0x83808F50,
+	0x3FF9126E,0x978D4FDF, 0x3FDCBF16,0x0390FA4A,
+	0x3FF91687,0x2B020C4A, 0x3FDCC989,0xCE591C0F,
+	0x3FF91A9F,0xBE76C8B4, 0x3FDCD3FB,0xE467B230,
+	0x3FF91EB8,0x51EB851F, 0x3FDCDE6C,0x464B346F,
+	0x3FF922D0,0xE5604189, 0x3FDCE8DA,0xF491D4DA,
+	0x3FF926E9,0x78D4FDF4, 0x3FDCF347,0xEFC9800A,
+	0x3FF92B02,0x0C49BA5E, 0x3FDCFDB3,0x387FDD3F,
+	0x3FF92F1A,0x9FBE76C9, 0x3FDD081C,0xCF424E9D,
+	0x3FF93333,0x33333333, 0x3FDD1284,0xB49DF149,
+	0x3FF9374B,0xC6A7EF9E, 0x3FDD1CEA,0xE91F9DA8,
+	0x3FF93B64,0x5A1CAC08, 0x3FDD274F,0x6D53E779,
+	0x3FF93F7C,0xED916873, 0x3FDD31B2,0x41C71E12,
+	0x3FF94395,0x810624DD, 0x3FDD3C13,0x67054C7E,
+	0x3FF947AE,0x147AE148, 0x3FDD4672,0xDD9A39B7,
+	0x3FF94BC6,0xA7EF9DB2, 0x3FDD50D0,0xA61168C4,
+	0x3FF94FDF,0x3B645A1D, 0x3FDD5B2C,0xC0F618F4,
+	0x3FF953F7,0xCED91687, 0x3FDD6587,0x2ED345FA,
+	0x3FF95810,0x624DD2F2, 0x3FDD6FDF,0xF033A829,
+	0x3FF95C28,0xF5C28F5C, 0x3FDD7A37,0x05A1B48F,
+	0x3FF96041,0x89374BC7, 0x3FDD848C,0x6FA79D31,
+	0x3FF9645A,0x1CAC0831, 0x3FDD8EE0,0x2ECF5126,
+	0x3FF96872,0xB020C49C, 0x3FDD9932,0x43A27CD3,
+	0x3FF96C8B,0x43958106, 0x3FDDA382,0xAEAA8A04,
+	0x3FF970A3,0xD70A3D71, 0x3FDDADD1,0x7070A029,
+	0x3FF974BC,0x6A7EF9DB, 0x3FDDB81E,0x897DA46E,
+	0x3FF978D4,0xFDF3B646, 0x3FDDC269,0xFA5A39FA,
+	0x3FF97CED,0x916872B0, 0x3FDDCCB3,0xC38EC206,
+	0x3FF98106,0x24DD2F1B, 0x3FDDD6FB,0xE5A35C18,
+	0x3FF9851E,0xB851EB85, 0x3FDDE142,0x611FE61D,
+	0x3FF98937,0x4BC6A7F0, 0x3FDDEB87,0x368BFCA5,
+	0x3FF98D4F,0xDF3B645A, 0x3FDDF5CA,0x666EFAFA,
+	0x3FF99168,0x72B020C5, 0x3FDE000B,0xF14FFB5C,
+	0x3FF99581,0x0624DD2F, 0x3FDE0A4B,0xD7B5D71B,
+	0x3FF99999,0x9999999A, 0x3FDE148A,0x1A2726CF,
+	0x3FF99DB2,0x2D0E5604, 0x3FDE1EC6,0xB92A426F,
+	0x3FF9A1CA,0xC083126F, 0x3FDE2901,0xB5454193,
+	0x3FF9A5E3,0x53F7CED9, 0x3FDE333B,0x0EFDFB83,
+	0x3FF9A9FB,0xE76C8B44, 0x3FDE3D72,0xC6DA0777,
+	0x3FF9AE14,0x7AE147AE, 0x3FDE47A8,0xDD5EBCAB,
+	0x3FF9B22D,0x0E560419, 0x3FDE51DD,0x5311329C,
+	0x3FF9B645,0xA1CAC083, 0x3FDE5C10,0x2876411F,
+	0x3FF9BA5E,0x353F7CEE, 0x3FDE6641,0x5E128098,
+	0x3FF9BE76,0xC8B43958, 0x3FDE7070,0xF46A4A16,
+	0x3FF9C28F,0x5C28F5C3, 0x3FDE7A9E,0xEC01B787,
+	0x3FF9C6A7,0xEF9DB22D, 0x3FDE84CB,0x455CA3D2,
+	0x3FF9CAC0,0x83126E98, 0x3FDE8EF6,0x00FEAB11,
+	0x3FF9CED9,0x16872B02, 0x3FDE991F,0x1F6B2AA7,
+	0x3FF9D2F1,0xA9FBE76D, 0x3FDEA346,0xA1254176,
+	0x3FF9D70A,0x3D70A3D7, 0x3FDEAD6C,0x86AFCFFB,
+	0x3FF9DB22,0xD0E56042, 0x3FDEB790,0xD08D7882,
+	0x3FF9DF3B,0x645A1CAC, 0x3FDEC1B3,0x7F409F3E,
+	0x3FF9E353,0xF7CED917, 0x3FDECBD4,0x934B6A83,
+	0x3FF9E76C,0x8B439581, 0x3FDED5F4,0x0D2FC2D7,
+	0x3FF9EB85,0x1EB851EC, 0x3FDEE011,0xED6F5331,
+	0x3FF9EF9D,0xB22D0E56, 0x3FDEEA2E,0x348B890A,
+	0x3FF9F3B6,0x45A1CAC1, 0x3FDEF448,0xE3059497,
+	0x3FF9F7CE,0xD916872B, 0x3FDEFE61,0xF95E68DD,
+	0x3FF9FBE7,0x6C8B4396, 0x3FDF0879,0x7816BBEB,
+	0x3FFA0000,0x00000000, 0x3FDF128F,0x5FAF06ED,
+	0x3FFA0418,0x9374BC6A, 0x3FDF1CA3,0xB0A78661,
+	0x3FFA0831,0x26E978D5, 0x3FDF26B6,0x6B803A3B,
+	0x3FFA0C49,0xBA5E353F, 0x3FDF30C7,0x90B8E5FF,
+	0x3FFA1062,0x4DD2F1AA, 0x3FDF3AD7,0x20D110FB,
+	0x3FFA147A,0xE147AE14, 0x3FDF44E5,0x1C480657,
+	0x3FFA1893,0x74BC6A7F, 0x3FDF4EF1,0x839CD550,
+	0x3FFA1CAC,0x083126E9, 0x3FDF58FC,0x574E514B,
+	0x3FFA20C4,0x9BA5E354, 0x3FDF6305,0x97DB120B,
+	0x3FFA24DD,0x2F1A9FBE, 0x3FDF6D0D,0x45C173C5,
+	0x3FFA28F5,0xC28F5C29, 0x3FDF7713,0x617F9758,
+	0x3FFA2D0E,0x56041893, 0x3FDF8117,0xEB936260,
+	0x3FFA3126,0xE978D4FE, 0x3FDF8B1A,0xE47A7F6C,
+	0x3FFA353F,0x7CED9168, 0x3FDF951C,0x4CB25E13,
+	0x3FFA3958,0x10624DD3, 0x3FDF9F1C,0x24B83329,
+	0x3FFA3D70,0xA3D70A3D, 0x3FDFA91A,0x6D08F8D1,
+	0x3FFA4189,0x374BC6A8, 0x3FDFB317,0x26216EB8,
+	0x3FFA45A1,0xCAC08312, 0x3FDFBD12,0x507E1A21,
+	0x3FFA49BA,0x5E353F7D, 0x3FDFC70B,0xEC9B4621,
+	0x3FFA4DD2,0xF1A9FBE7, 0x3FDFD103,0xFAF503AF,
+	0x3FFA51EB,0x851EB852, 0x3FDFDAFA,0x7C0729DA,
+	0x3FFA5604,0x189374BC, 0x3FDFE4EF,0x704D55DA,
+	0x3FFA5A1C,0xAC083127, 0x3FDFEEE2,0xD842EB49,
+	0x3FFA5E35,0x3F7CED91, 0x3FDFF8D4,0xB4631433,
+	0x3FFA624D,0xD2F1A9FC, 0x3FE00162,0x829460A5,
+	0x3FFA6666,0x66666666, 0x3FE00659,0xE58754FE,
+	0x3FFA6A7E,0xF9DB22D1, 0x3FE00B50,0x8347A653,
+	0x3FFA6E97,0x8D4FDF3B, 0x3FE01046,0x5C127750,
+	0x3FFA72B0,0x20C49BA6, 0x3FE0153B,0x7024CE40,
+	0x3FFA76C8,0xB4395810, 0x3FE01A2F,0xBFBB950E,
+	0x3FFA7AE1,0x47AE147B, 0x3FE01F23,0x4B139965,
+	0x3FFA7EF9,0xDB22D0E5, 0x3FE02416,0x12698CB6,
+	0x3FFA8312,0x6E978D50, 0x3FE02908,0x15FA0451,
+	0x3FFA872B,0x020C49BA, 0x3FE02DF9,0x56017973,
+	0x3FFA8B43,0x95810625, 0x3FE032E9,0xD2BC495A,
+	0x3FFA8F5C,0x28F5C28F, 0x3FE037D9,0x8C66B550,
+	0x3FFA9374,0xBC6A7EFA, 0x3FE03CC8,0x833CE2C5,
+	0x3FFA978D,0x4FDF3B64, 0x3FE041B6,0xB77ADB5A,
+	0x3FFA9BA5,0xE353F7CF, 0x3FE046A4,0x295C8CF4,
+	0x3FFA9FBE,0x76C8B439, 0x3FE04B90,0xD91DC9CC,
+	0x3FFAA3D7,0x0A3D70A4, 0x3FE0507C,0xC6FA4884,
+	0x3FFAA7EF,0x9DB22D0E, 0x3FE05567,0xF32DA431,
+	0x3FFAAC08,0x3126E979, 0x3FE05A52,0x5DF35C75,
+	0x3FFAB020,0xC49BA5E3, 0x3FE05F3C,0x0786D583,
+	0x3FFAB439,0x5810624E, 0x3FE06424,0xF0235842,
+	0x3FFAB851,0xEB851EB8, 0x3FE0690D,0x18041249,
+	0x3FFABC6A,0x7EF9DB23, 0x3FE06DF4,0x7F641601,
+	0x3FFAC083,0x126E978D, 0x3FE072DB,0x267E5AAC,
+	0x3FFAC49B,0xA5E353F8, 0x3FE077C1,0x0D8DBC7A,
+	0x3FFAC8B4,0x39581062, 0x3FE07CA6,0x34CCFC94,
+	0x3FFACCCC,0xCCCCCCCD, 0x3FE0818A,0x9C76C137,
+	0x3FFAD0E5,0x60418937, 0x3FE0866E,0x44C595B7,
+	0x3FFAD4FD,0xF3B645A2, 0x3FE08B51,0x2DF3EA9C,
+	0x3FFAD916,0x872B020C, 0x3FE09033,0x583C15A7,
+	0x3FFADD2F,0x1A9FBE77, 0x3FE09514,0xC3D851F0,
+	0x3FFAE147,0xAE147AE1, 0x3FE099F5,0x7102BFE5,
+	0x3FFAE560,0x4189374C, 0x3FE09ED5,0x5FF5656B,
+	0x3FFAE978,0xD4FDF3B6, 0x3FE0A3B4,0x90EA2DE3,
+	0x3FFAED91,0x6872B021, 0x3FE0A893,0x041AEA3F,
+	0x3FFAF1A9,0xFBE76C8B, 0x3FE0AD70,0xB9C1510F,
+	0x3FFAF5C2,0x8F5C28F6, 0x3FE0B24D,0xB216FE96,
+	0x3FFAF9DB,0x22D0E560, 0x3FE0B729,0xED5574D5,
+	0x3FFAFDF3,0xB645A1CB, 0x3FE0BC05,0x6BB61B9F,
+	0x3FFB020C,0x49BA5E35, 0x3FE0C0E0,0x2D7240A2,
+	0x3FFB0624,0xDD2F1AA0, 0x3FE0C5BA,0x32C31782,
+	0x3FFB0A3D,0x70A3D70A, 0x3FE0CA93,0x7BE1B9DC,
+	0x3FFB0E56,0x04189375, 0x3FE0CF6C,0x09072762,
+	0x3FFB126E,0x978D4FDF, 0x3FE0D443,0xDA6C45E0,
+	0x3FFB1687,0x2B020C4A, 0x3FE0D91A,0xF049E155,
+	0x3FFB1A9F,0xBE76C8B4, 0x3FE0DDF1,0x4AD8ABF9,
+	0x3FFB1EB8,0x51EB851F, 0x3FE0E2C6,0xEA513E58,
+	0x3FFB22D0,0xE5604189, 0x3FE0E79B,0xCEEC1754,
+	0x3FFB26E9,0x78D4FDF4, 0x3FE0EC6F,0xF8E19C44,
+	0x3FFB2B02,0x0C49BA5E, 0x3FE0F143,0x686A18F1,
+	0x3FFB2F1A,0x9FBE76C9, 0x3FE0F616,0x1DBDBFBA,
+	0x3FFB3333,0x33333333, 0x3FE0FAE8,0x1914A991,
+	0x3FFB374B,0xC6A7EF9E, 0x3FE0FFB9,0x5AA6D617,
+	0x3FFB3B64,0x5A1CAC08, 0x3FE10489,0xE2AC2BA2,
+	0x3FFB3F7C,0xED916873, 0x3FE10959,0xB15C7756,
+	0x3FFB4395,0x810624DD, 0x3FE10E28,0xC6EF6D28,
+	0x3FFB47AE,0x147AE148, 0x3FE112F7,0x239CA7FC,
+	0x3FFB4BC6,0xA7EF9DB2, 0x3FE117C4,0xC79BA9A3,
+	0x3FFB4FDF,0x3B645A1D, 0x3FE11C91,0xB323DAFC,
+	0x3FFB53F7,0xCED91687, 0x3FE1215D,0xE66C8BF2,
+	0x3FFB5810,0x624DD2F2, 0x3FE12629,0x61ACF398,
+	0x3FFB5C28,0xF5C28F5C, 0x3FE12AF4,0x251C3030,
+	0x3FFB6041,0x89374BC7, 0x3FE12FBE,0x30F1473F,
+	0x3FFB645A,0x1CAC0831, 0x3FE13487,0x85632596,
+	0x3FFB6872,0xB020C49C, 0x3FE13950,0x22A89F69,
+	0x3FFB6C8B,0x43958106, 0x3FE13E18,0x08F87053,
+	0x3FFB70A3,0xD70A3D71, 0x3FE142DF,0x38893B71,
+	0x3FFB74BC,0x6A7EF9DB, 0x3FE147A5,0xB1918B64,
+	0x3FFB78D4,0xFDF3B646, 0x3FE14C6B,0x7447D26B,
+	0x3FFB7CED,0x916872B0, 0x3FE15130,0x80E26A69,
+	0x3FFB8106,0x24DD2F1B, 0x3FE155F4,0xD79794F9,
+	0x3FFB851E,0xB851EB85, 0x3FE15AB8,0x789D7B77,
+	0x3FFB8937,0x4BC6A7F0, 0x3FE15F7B,0x642A2F16,
+	0x3FFB8D4F,0xDF3B645A, 0x3FE1643D,0x9A73A8E7,
+	0x3FFB9168,0x72B020C5, 0x3FE168FF,0x1BAFC9EE,
+	0x3FFB9581,0x0624DD2F, 0x3FE16DBF,0xE8145B28,
+	0x3FFB9999,0x9999999A, 0x3FE1727F,0xFFD70DA1,
+	0x3FFB9DB2,0x2D0E5604, 0x3FE1773F,0x632D7A7F,
+	0x3FFBA1CA,0xC083126F, 0x3FE17BFE,0x124D2310,
+	0x3FFBA5E3,0x53F7CED9, 0x3FE180BC,0x0D6B70D9,
+	0x3FFBA9FB,0xE76C8B44, 0x3FE18579,0x54BDB5A3,
+	0x3FFBAE14,0x7AE147AE, 0x3FE18A35,0xE8792B89,
+	0x3FFBB22D,0x0E560419, 0x3FE18EF1,0xC8D2F509,
+	0x3FFBB645,0xA1CAC083, 0x3FE193AC,0xF6001D0E,
+	0x3FFBBA5E,0x353F7CEE, 0x3FE19867,0x70359700,
+	0x3FFBBE76,0xC8B43958, 0x3FE19D21,0x37A83ED1,
+	0x3FFBC28F,0x5C28F5C3, 0x3FE1A1DA,0x4C8CD90C,
+	0x3FFBC6A7,0xEF9DB22D, 0x3FE1A692,0xAF1812E2,
+	0x3FFBCAC0,0x83126E98, 0x3FE1AB4A,0x5F7E8238,
+	0x3FFBCED9,0x16872B02, 0x3FE1B001,0x5DF4A5B4,
+	0x3FFBD2F1,0xA9FBE76D, 0x3FE1B4B7,0xAAAEE4CD,
+	0x3FFBD70A,0x3D70A3D7, 0x3FE1B96D,0x45E18FD3,
+	0x3FFBDB22,0xD0E56042, 0x3FE1BE22,0x2FC0E007,
+	0x3FFBDF3B,0x645A1CAC, 0x3FE1C2D6,0x6880F79C,
+	0x3FFBE353,0xF7CED917, 0x3FE1C789,0xF055E1CF,
+	0x3FFBE76C,0x8B439581, 0x3FE1CC3C,0xC77392ED,
+	0x3FFBEB85,0x1EB851EC, 0x3FE1D0EE,0xEE0DE867,
+	0x3FFBEF9D,0xB22D0E56, 0x3FE1D5A0,0x6458A8D7,
+	0x3FFBF3B6,0x45A1CAC1, 0x3FE1DA51,0x2A87841A,
+	0x3FFBF7CE,0xD916872B, 0x3FE1DF01,0x40CE134E,
+	0x3FFBFBE7,0x6C8B4396, 0x3FE1E3B0,0xA75FD8ED,
+	0x3FFC0000,0x00000000, 0x3FE1E85F,0x5E7040D0,
+	0x3FFC0418,0x9374BC6A, 0x3FE1ED0D,0x6632A044,
+	0x3FFC0831,0x26E978D5, 0x3FE1F1BA,0xBEDA3612,
+	0x3FFC0C49,0xBA5E353F, 0x3FE1F667,0x689A2A8E,
+	0x3FFC1062,0x4DD2F1AA, 0x3FE1FB13,0x63A58FA5,
+	0x3FFC147A,0xE147AE14, 0x3FE1FFBE,0xB02F60E8,
+	0x3FFC1893,0x74BC6A7F, 0x3FE20469,0x4E6A839B,
+	0x3FFC1CAC,0x083126E9, 0x3FE20913,0x3E89C6C0,
+	0x3FFC20C4,0x9BA5E354, 0x3FE20DBC,0x80BFE327,
+	0x3FFC24DD,0x2F1A9FBE, 0x3FE21265,0x153F7B77,
+	0x3FFC28F5,0xC28F5C29, 0x3FE2170C,0xFC3B1C40,
+	0x3FFC2D0E,0x56041893, 0x3FE21BB4,0x35E53C00,
+	0x3FFC3126,0xE978D4FE, 0x3FE2205A,0xC2703B3A,
+	0x3FFC353F,0x7CED9168, 0x3FE22500,0xA20E6478,
+	0x3FFC3958,0x10624DD3, 0x3FE229A5,0xD4F1EC64,
+	0x3FFC3D70,0xA3D70A3D, 0x3FE22E4A,0x5B4CF1C6,
+	0x3FFC4189,0x374BC6A8, 0x3FE232EE,0x35517DA0,
+	0x3FFC45A1,0xCAC08312, 0x3FE23791,0x6331832C,
+	0x3FFC49BA,0x5E353F7D, 0x3FE23C33,0xE51EDFF7,
+	0x3FFC4DD2,0xF1A9FBE7, 0x3FE240D5,0xBB4B5BDF,
+	0x3FFC51EB,0x851EB852, 0x3FE24576,0xE5E8A92F,
+	0x3FFC5604,0x189374BC, 0x3FE24A17,0x6528649B,
+	0x3FFC5A1C,0xAC083127, 0x3FE24EB7,0x393C155C,
+	0x3FFC5E35,0x3F7CED91, 0x3FE25356,0x62552D30,
+	0x3FFC624D,0xD2F1A9FC, 0x3FE257F4,0xE0A50870,
+	0x3FFC6666,0x66666666, 0x3FE25C92,0xB45CEE13,
+	0x3FFC6A7E,0xF9DB22D1, 0x3FE2612F,0xDDAE0FC5,
+	0x3FFC6E97,0x8D4FDF3B, 0x3FE265CC,0x5CC989E8,
+	0x3FFC72B0,0x20C49BA6, 0x3FE26A68,0x31E063AD,
+	0x3FFC76C8,0xB4395810, 0x3FE26F03,0x5D238F10,
+	0x3FFC7AE1,0x47AE147B, 0x3FE2739D,0xDEC3E8F5,
+	0x3FFC7EF9,0xDB22D0E5, 0x3FE27837,0xB6F23928,
+	0x3FFC8312,0x6E978D50, 0x3FE27CD0,0xE5DF3271,
+	0x3FFC872B,0x020C49BA, 0x3FE28169,0x6BBB7298,
+	0x3FFC8B43,0x95810625, 0x3FE28601,0x48B7827B,
+	0x3FFC8F5C,0x28F5C28F, 0x3FE28A98,0x7D03D60F,
+	0x3FFC9374,0xBC6A7EFA, 0x3FE28F2F,0x08D0CC78,
+	0x3FFC978D,0x4FDF3B64, 0x3FE293C4,0xEC4EB009,
+	0x3FFC9BA5,0xE353F7CF, 0x3FE2985A,0x27ADB659,
+	0x3FFC9FBE,0x76C8B439, 0x3FE29CEE,0xBB1E0049,
+	0x3FFCA3D7,0x0A3D70A4, 0x3FE2A182,0xA6CF9A15,
+	0x3FFCA7EF,0x9DB22D0E, 0x3FE2A615,0xEAF27B59,
+	0x3FFCAC08,0x3126E979, 0x3FE2AAA8,0x87B68726,
+	0x3FFCB020,0xC49BA5E3, 0x3FE2AF3A,0x7D4B8C04,
+	0x3FFCB439,0x5810624E, 0x3FE2B3CB,0xCBE14407,
+	0x3FFCB851,0xEB851EB8, 0x3FE2B85C,0x73A754CF,
+	0x3FFCBC6A,0x7EF9DB23, 0x3FE2BCEC,0x74CD4FA2,
+	0x3FFCC083,0x126E978D, 0x3FE2C17B,0xCF82B16C,
+	0x3FFCC49B,0xA5E353F8, 0x3FE2C60A,0x83F6E2D0,
+	0x3FFCC8B4,0x39581062, 0x3FE2CA98,0x92593832,
+	0x3FFCCCCC,0xCCCCCCCD, 0x3FE2CF25,0xFAD8F1C4,
+	0x3FFCD0E5,0x60418937, 0x3FE2D3B2,0xBDA53B8E,
+	0x3FFCD4FD,0xF3B645A2, 0x3FE2D83E,0xDAED2D7F,
+	0x3FFCD916,0x872B020C, 0x3FE2DCCA,0x52DFCB73,
+	0x3FFCDD2F,0x1A9FBE77, 0x3FE2E155,0x25AC0542,
+	0x3FFCE147,0xAE147AE1, 0x3FE2E5DF,0x5380B6C8,
+	0x3FFCE560,0x4189374C, 0x3FE2EA68,0xDC8CA7F6,
+	0x3FFCE978,0xD4FDF3B6, 0x3FE2EEF1,0xC0FE8CD4,
+	0x3FFCED91,0x6872B021, 0x3FE2F37A,0x01050599,
+	0x3FFCF1A9,0xFBE76C8B, 0x3FE2F801,0x9CCE9EA8,
+	0x3FFCF5C2,0x8F5C28F6, 0x3FE2FC88,0x9489D0A9,
+	0x3FFCF9DB,0x22D0E560, 0x3FE3010E,0xE8650088,
+	0x3FFCFDF3,0xB645A1CB, 0x3FE30594,0x988E7F8A,
+	0x3FFD020C,0x49BA5E35, 0x3FE30A19,0xA5348B50,
+	0x3FFD0624,0xDD2F1AA0, 0x3FE30E9E,0x0E854DE9,
+	0x3FFD0A3D,0x70A3D70A, 0x3FE31321,0xD4AEDDD7,
+	0x3FFD0E56,0x04189375, 0x3FE317A4,0xF7DF3E21,
+	0x3FFD126E,0x978D4FDF, 0x3FE31C27,0x78445E56,
+	0x3FFD1687,0x2B020C4A, 0x3FE320A9,0x560C1A9E,
+	0x3FFD1A9F,0xBE76C8B4, 0x3FE3252A,0x91643BC0,
+	0x3FFD1EB8,0x51EB851F, 0x3FE329AB,0x2A7A7736,
+	0x3FFD22D0,0xE5604189, 0x3FE32E2B,0x217C6F2A,
+	0x3FFD26E9,0x78D4FDF4, 0x3FE332AA,0x7697B28E,
+	0x3FFD2B02,0x0C49BA5E, 0x3FE33729,0x29F9BD1E,
+	0x3FFD2F1A,0x9FBE76C9, 0x3FE33BA7,0x3BCFF771,
+	0x3FFD3333,0x33333333, 0x3FE34024,0xAC47B6FD,
+	0x3FFD374B,0xC6A7EF9E, 0x3FE344A1,0x7B8E3E29,
+	0x3FFD3B64,0x5A1CAC08, 0x3FE3491D,0xA9D0BC52,
+	0x3FFD3F7C,0xED916873, 0x3FE34D99,0x373C4DD9,
+	0x3FFD4395,0x810624DD, 0x3FE35214,0x23FDFC2B,
+	0x3FFD47AE,0x147AE148, 0x3FE3568E,0x7042BDD0,
+	0x3FFD4BC6,0xA7EF9DB2, 0x3FE35B08,0x1C377670,
+	0x3FFD4FDF,0x3B645A1D, 0x3FE35F81,0x2808F6E1,
+	0x3FFD53F7,0xCED91687, 0x3FE363F9,0x93E3FD30,
+	0x3FFD5810,0x624DD2F2, 0x3FE36871,0x5FF534AF,
+	0x3FFD5C28,0xF5C28F5C, 0x3FE36CE8,0x8C6935F9,
+	0x3FFD6041,0x89374BC7, 0x3FE3715F,0x196C8703,
+	0x3FFD645A,0x1CAC0831, 0x3FE375D5,0x072B9B22,
+	0x3FFD6872,0xB020C49C, 0x3FE37A4A,0x55D2D317,
+	0x3FFD6C8B,0x43958106, 0x3FE37EBF,0x058E7D19,
+	0x3FFD70A3,0xD70A3D71, 0x3FE38333,0x168AD4E2,
+	0x3FFD74BC,0x6A7EF9DB, 0x3FE387A6,0x88F403B3,
+	0x3FFD78D4,0xFDF3B646, 0x3FE38C19,0x5CF62066,
+	0x3FFD7CED,0x916872B0, 0x3FE3908B,0x92BD2F70,
+	0x3FFD8106,0x24DD2F1B, 0x3FE394FD,0x2A7522F4,
+	0x3FFD851E,0xB851EB85, 0x3FE3996E,0x2449DAC6,
+	0x3FFD8937,0x4BC6A7F0, 0x3FE39DDE,0x80672479,
+	0x3FFD8D4F,0xDF3B645A, 0x3FE3A24E,0x3EF8BB67,
+	0x3FFD9168,0x72B020C5, 0x3FE3A6BD,0x602A48BF,
+	0x3FFD9581,0x0624DD2F, 0x3FE3AB2B,0xE4276386,
+	0x3FFD9999,0x9999999A, 0x3FE3AF99,0xCB1B90B0,
+	0x3FFD9DB2,0x2D0E5604, 0x3FE3B407,0x15324319,
+	0x3FFDA1CA,0xC083126F, 0x3FE3B873,0xC296DB9D,
+	0x3FFDA5E3,0x53F7CED9, 0x3FE3BCDF,0xD374A917,
+	0x3FFDA9FB,0xE76C8B44, 0x3FE3C14B,0x47F6E877,
+	0x3FFDAE14,0x7AE147AE, 0x3FE3C5B6,0x2048C4BE,
+	0x3FFDB22D,0x0E560419, 0x3FE3CA20,0x5C955715,
+	0x3FFDB645,0xA1CAC083, 0x3FE3CE89,0xFD07A6CA,
+	0x3FFDBA5E,0x353F7CEE, 0x3FE3D2F3,0x01CAA969,
+	0x3FFDBE76,0xC8B43958, 0x3FE3D75B,0x6B0942B5,
+	0x3FFDC28F,0x5C28F5C3, 0x3FE3DBC3,0x38EE44C1,
+	0x3FFDC6A7,0xEF9DB22D, 0x3FE3E02A,0x6BA46FED,
+	0x3FFDCAC0,0x83126E98, 0x3FE3E491,0x035672FD,
+	0x3FFDCED9,0x16872B02, 0x3FE3E8F7,0x002EEB13,
+	0x3FFDD2F1,0xA9FBE76D, 0x3FE3ED5C,0x625863C8,
+	0x3FFDD70A,0x3D70A3D7, 0x3FE3F1C1,0x29FD5729,
+	0x3FFDDB22,0xD0E56042, 0x3FE3F625,0x57482DCD,
+	0x3FFDDF3B,0x645A1CAC, 0x3FE3FA88,0xEA633ED0,
+	0x3FFDE353,0xF7CED917, 0x3FE3FEEB,0xE378CFEB,
+	0x3FFDE76C,0x8B439581, 0x3FE4034E,0x42B31573,
+	0x3FFDEB85,0x1EB851EC, 0x3FE407B0,0x083C326B,
+	0x3FFDEF9D,0xB22D0E56, 0x3FE40C11,0x343E3881,
+	0x3FFDF3B6,0x45A1CAC1, 0x3FE41071,0xC6E3282A,
+	0x3FFDF7CE,0xD916872B, 0x3FE414D1,0xC054F096,
+	0x3FFDFBE7,0x6C8B4396, 0x3FE41931,0x20BD6FCF,
+	0x3FFE0000,0x00000000, 0x3FE41D8F,0xE84672AE,
+	0x3FFE0418,0x9374BC6A, 0x3FE421EE,0x1719B4F5,
+	0x3FFE0831,0x26E978D5, 0x3FE4264B,0xAD60E150,
+	0x3FFE0C49,0xBA5E353F, 0x3FE42AA8,0xAB45915C,
+	0x3FFE1062,0x4DD2F1AA, 0x3FE42F05,0x10F14DBA,
+	0x3FFE147A,0xE147AE14, 0x3FE43360,0xDE8D8E0B,
+	0x3FFE1893,0x74BC6A7F, 0x3FE437BC,0x1443B909,
+	0x3FFE1CAC,0x083126E9, 0x3FE43C16,0xB23D2480,
+	0x3FFE20C4,0x9BA5E354, 0x3FE44070,0xB8A31565,
+	0x3FFE24DD,0x2F1A9FBE, 0x3FE444CA,0x279EBFD4,
+	0x3FFE28F5,0xC28F5C29, 0x3FE44922,0xFF594724,
+	0x3FFE2D0E,0x56041893, 0x3FE44D7B,0x3FFBBDE3,
+	0x3FFE3126,0xE978D4FE, 0x3FE451D2,0xE9AF25EF,
+	0x3FFE353F,0x7CED9168, 0x3FE45629,0xFC9C706F,
+	0x3FFE3958,0x10624DD3, 0x3FE45A80,0x78EC7DE9,
+	0x3FFE3D70,0xA3D70A3D, 0x3FE45ED6,0x5EC81E42,
+	0x3FFE4189,0x374BC6A8, 0x3FE4632B,0xAE5810CD,
+	0x3FFE45A1,0xCAC08312, 0x3FE46780,0x67C5044F,
+	0x3FFE49BA,0x5E353F7D, 0x3FE46BD4,0x8B37970F,
+	0x3FFE4DD2,0xF1A9FBE7, 0x3FE47028,0x18D856D5,
+	0x3FFE51EB,0x851EB852, 0x3FE4747B,0x10CFC0FD,
+	0x3FFE5604,0x189374BC, 0x3FE478CD,0x73464278,
+	0x3FFE5A1C,0xAC083127, 0x3FE47D1F,0x406437DB,
+	0x3FFE5E35,0x3F7CED91, 0x3FE48170,0x7851ED62,
+	0x3FFE624D,0xD2F1A9FC, 0x3FE485C1,0x1B379EFF,
+	0x3FFE6666,0x66666666, 0x3FE48A11,0x293D785B,
+	0x3FFE6A7E,0xF9DB22D1, 0x3FE48E60,0xA28B94EA,
+	0x3FFE6E97,0x8D4FDF3B, 0x3FE492AF,0x8749FFE5,
+	0x3FFE72B0,0x20C49BA6, 0x3FE496FD,0xD7A0B462,
+	0x3FFE76C8,0xB4395810, 0x3FE49B4B,0x93B79D50,
+	0x3FFE7AE1,0x47AE147B, 0x3FE49F98,0xBBB6958B,
+	0x3FFE7EF9,0xDB22D0E5, 0x3FE4A3E5,0x4FC567D8,
+	0x3FFE8312,0x6E978D50, 0x3FE4A831,0x500BCEFA,
+	0x3FFE872B,0x020C49BA, 0x3FE4AC7C,0xBCB175B1,
+	0x3FFE8B43,0x95810625, 0x3FE4B0C7,0x95DDF6CB,
+	0x3FFE8F5C,0x28F5C28F, 0x3FE4B511,0xDBB8DD23,
+	0x3FFE9374,0xBC6A7EFA, 0x3FE4B95B,0x8E69A3B4,
+	0x3FFE978D,0x4FDF3B64, 0x3FE4BDA4,0xAE17B598,
+	0x3FFE9BA5,0xE353F7CF, 0x3FE4C1ED,0x3AEA6E17,
+	0x3FFE9FBE,0x76C8B439, 0x3FE4C635,0x350918AC,
+	0x3FFEA3D7,0x0A3D70A4, 0x3FE4CA7C,0x9C9AF110,
+	0x3FFEA7EF,0x9DB22D0E, 0x3FE4CEC3,0x71C7233F,
+	0x3FFEAC08,0x3126E979, 0x3FE4D309,0xB4B4CB85,
+	0x3FFEB020,0xC49BA5E3, 0x3FE4D74F,0x658AF682,
+	0x3FFEB439,0x5810624E, 0x3FE4DB94,0x8470A136,
+	0x3FFEB851,0xEB851EB8, 0x3FE4DFD9,0x118CB904,
+	0x3FFEBC6A,0x7EF9DB23, 0x3FE4E41D,0x0D061BC3,
+	0x3FFEC083,0x126E978D, 0x3FE4E860,0x770397BC,
+	0x3FFEC49B,0xA5E353F8, 0x3FE4ECA3,0x4FABEBBD,
+	0x3FFEC8B4,0x39581062, 0x3FE4F0E5,0x9725C715,
+	0x3FFECCCC,0xCCCCCCCD, 0x3FE4F527,0x4D97C9A9,
+	0x3FFED0E5,0x60418937, 0x3FE4F968,0x732883F3,
+	0x3FFED4FD,0xF3B645A2, 0x3FE4FDA9,0x07FE770E,
+	0x3FFED916,0x872B020C, 0x3FE501E9,0x0C4014BD,
+	0x3FFEDD2F,0x1A9FBE77, 0x3FE50628,0x8013BF76,
+	0x3FFEE147,0xAE147AE1, 0x3FE50A67,0x639FCA63,
+	0x3FFEE560,0x4189374C, 0x3FE50EA5,0xB70A7975,
+	0x3FFEE978,0xD4FDF3B6, 0x3FE512E3,0x7A7A0160,
+	0x3FFEED91,0x6872B021, 0x3FE51720,0xAE1487AE,
+	0x3FFEF1A9,0xFBE76C8B, 0x3FE51B5D,0x520022BE,
+	0x3FFEF5C2,0x8F5C28F6, 0x3FE51F99,0x6662D9D4,
+	0x3FFEF9DB,0x22D0E560, 0x3FE523D4,0xEB62A518,
+	0x3FFEFDF3,0xB645A1CB, 0x3FE5280F,0xE1256DAA,
+	0x3FFF020C,0x49BA5E35, 0x3FE52C4A,0x47D10D9B,
+	0x3FFF0624,0xDD2F1AA0, 0x3FE53084,0x1F8B5004,
+	0x3FFF0A3D,0x70A3D70A, 0x3FE534BD,0x6879F103,
+	0x3FFF0E56,0x04189375, 0x3FE538F6,0x22C29DC8,
+	0x3FFF126E,0x978D4FDF, 0x3FE53D2E,0x4E8AF49A,
+	0x3FFF1687,0x2B020C4A, 0x3FE54165,0xEBF884E4,
+	0x3FFF1A9F,0xBE76C8B4, 0x3FE5459C,0xFB30CF35,
+	0x3FFF1EB8,0x51EB851F, 0x3FE549D3,0x7C594551,
+	0x3FFF22D0,0xE5604189, 0x3FE54E09,0x6F974A2E,
+	0x3FFF26E9,0x78D4FDF4, 0x3FE5523E,0xD5103208,
+	0x3FFF2B02,0x0C49BA5E, 0x3FE55673,0xACE9425D,
+	0x3FFF2F1A,0x9FBE76C9, 0x3FE55AA7,0xF747B200,
+	0x3FFF3333,0x33333333, 0x3FE55EDB,0xB450A914,
+	0x3FFF374B,0xC6A7EF9E, 0x3FE5630E,0xE4294121,
+	0x3FFF3B64,0x5A1CAC08, 0x3FE56741,0x86F68511,
+	0x3FFF3F7C,0xED916873, 0x3FE56B73,0x9CDD713F,
+	0x3FFF4395,0x810624DD, 0x3FE56FA5,0x2602F379,
+	0x3FFF47AE,0x147AE148, 0x3FE573D6,0x228BEB0C,
+	0x3FFF4BC6,0xA7EF9DB2, 0x3FE57806,0x929D28C9,
+	0x3FFF4FDF,0x3B645A1D, 0x3FE57C36,0x765B6F0F,
+	0x3FFF53F7,0xCED91687, 0x3FE58065,0xCDEB71CE,
+	0x3FFF5810,0x624DD2F2, 0x3FE58494,0x9971D694,
+	0x3FFF5C28,0xF5C28F5C, 0x3FE588C2,0xD913348F,
+	0x3FFF6041,0x89374BC7, 0x3FE58CF0,0x8CF4149E,
+	0x3FFF645A,0x1CAC0831, 0x3FE5911D,0xB538F14A,
+	0x3FFF6872,0xB020C49C, 0x3FE5954A,0x520636DB,
+	0x3FFF6C8B,0x43958106, 0x3FE59976,0x63804356,
+	0x3FFF70A3,0xD70A3D71, 0x3FE59DA1,0xE9CB668E,
+	0x3FFF74BC,0x6A7EF9DB, 0x3FE5A1CC,0xE50BE21E,
+	0x3FFF78D4,0xFDF3B646, 0x3FE5A5F7,0x5565E980,
+	0x3FFF7CED,0x916872B0, 0x3FE5AA21,0x3AFDA206,
+	0x3FFF8106,0x24DD2F1B, 0x3FE5AE4A,0x95F722EE,
+	0x3FFF851E,0xB851EB85, 0x3FE5B273,0x6676755C,
+	0x3FFF8937,0x4BC6A7F0, 0x3FE5B69B,0xAC9F946F,
+	0x3FFF8D4F,0xDF3B645A, 0x3FE5BAC3,0x68966D3E,
+	0x3FFF9168,0x72B020C5, 0x3FE5BEEA,0x9A7EDEE6,
+	0x3FFF9581,0x0624DD2F, 0x3FE5C311,0x427CBA8A,
+	0x3FFF9999,0x9999999A, 0x3FE5C737,0x60B3C364,
+	0x3FFF9DB2,0x2D0E5604, 0x3FE5CB5C,0xF547AEC1,
+	0x3FFFA1CA,0xC083126F, 0x3FE5CF82,0x005C2414,
+	0x3FFFA5E3,0x53F7CED9, 0x3FE5D3A6,0x8214BCF1,
+	0x3FFFA9FB,0xE76C8B44, 0x3FE5D7CA,0x7A950521,
+	0x3FFFAE14,0x7AE147AE, 0x3FE5DBED,0xEA007A9C,
+	0x3FFFB22D,0x0E560419, 0x3FE5E010,0xD07A8D9C,
+	0x3FFFB645,0xA1CAC083, 0x3FE5E433,0x2E26A09A,
+	0x3FFFBA5E,0x353F7CEE, 0x3FE5E855,0x0328085F,
+	0x3FFFBE76,0xC8B43958, 0x3FE5EC76,0x4FA20C01,
+	0x3FFFC28F,0x5C28F5C3, 0x3FE5F097,0x13B7E4F2,
+	0x3FFFC6A7,0xEF9DB22D, 0x3FE5F4B7,0x4F8CBF02,
+	0x3FFFCAC0,0x83126E98, 0x3FE5F8D7,0x0343B86C,
+	0x3FFFCED9,0x16872B02, 0x3FE5FCF6,0x2EFFE1D3,
+	0x3FFFD2F1,0xA9FBE76D, 0x3FE60114,0xD2E43E54,
+	0x3FFFD70A,0x3D70A3D7, 0x3FE60532,0xEF13C385,
+	0x3FFFDB22,0xD0E56042, 0x3FE60950,0x83B15982,
+	0x3FFFDF3B,0x645A1CAC, 0x3FE60D6D,0x90DFDAEE,
+	0x3FFFE353,0xF7CED917, 0x3FE6118A,0x16C214FE,
+	0x3FFFE76C,0x8B439581, 0x3FE615A6,0x157AC77E,
+	0x3FFFEB85,0x1EB851EC, 0x3FE619C1,0x8D2CA4DB,
+	0x3FFFEF9D,0xB22D0E56, 0x3FE61DDC,0x7DFA5223,
+	0x3FFFF3B6,0x45A1CAC1, 0x3FE621F6,0xE8066716,
+	0x3FFFF7CE,0xD916872B, 0x3FE62610,0xCB736E21,
+	0x3FFFFBE7,0x6C8B4396, 0x3FE62A2A,0x2863E472,
+	0x40000000,0x00000000, 0x3FE62E42,0xFEFA39EF,
+	0x4000020C,0x49BA5E35, 0x3FE6325B,0x4F58D14E,
+	0x40000418,0x9374BC6A, 0x3FE63673,0x19A2000E,
+	0x40000624,0xDD2F1AA0, 0x3FE63A8A,0x5DF80E87,
+	0x40000831,0x26E978D5, 0x3FE63EA1,0x1C7D37E6,
+	0x40000A3D,0x70A3D70A, 0x3FE642B7,0x5553AA43,
+	0x40000C49,0xBA5E353F, 0x3FE646CD,0x089D8699,
+	0x40000E56,0x04189375, 0x3FE64AE2,0x367CE0D8,
+	0x40001062,0x4DD2F1AA, 0x3FE64EF6,0xDF13BFDF,
+	0x4000126E,0x978D4FDF, 0x3FE6530B,0x02841D91,
+	0x4000147A,0xE147AE14, 0x3FE6571E,0xA0EFE6D3,
+	0x40001687,0x2B020C4A, 0x3FE65B31,0xBA78FB95,
+	0x40001893,0x74BC6A7F, 0x3FE65F44,0x4F412ED4,
+	0x40001A9F,0xBE76C8B4, 0x3FE66356,0x5F6A46A9,
+	0x40001CAC,0x083126E9, 0x3FE66767,0xEB15FC49,
+	0x40001EB8,0x51EB851F, 0x3FE66B78,0xF265FC11,
+	0x400020C4,0x9BA5E354, 0x3FE66F89,0x757BE583,
+	0x400022D0,0xE5604189, 0x3FE67399,0x74794B58,
+	0x400024DD,0x2F1A9FBE, 0x3FE677A8,0xEF7FB380,
+	0x400026E9,0x78D4FDF4, 0x3FE67BB7,0xE6B0972B,
+	0x400028F5,0xC28F5C29, 0x3FE67FC6,0x5A2D62C9,
+	0x40002B02,0x0C49BA5E, 0x3FE683D4,0x4A17761B,
+	0x40002D0E,0x56041893, 0x3FE687E1,0xB6902433,
+	0x40002F1A,0x9FBE76C9, 0x3FE68BEE,0x9FB8B37C,
+	0x40003126,0xE978D4FE, 0x3FE68FFB,0x05B25DBB,
+	0x40003333,0x33333333, 0x3FE69406,0xE89E5020,
+	0x4000353F,0x7CED9168, 0x3FE69812,0x489DAB45,
+	0x4000374B,0xC6A7EF9E, 0x3FE69C1D,0x25D18338,
+	0x40003958,0x10624DD3, 0x3FE6A027,0x805ADF7A,
+	0x40003B64,0x5A1CAC08, 0x3FE6A431,0x585ABB0E,
+	0x40003D70,0xA3D70A3D, 0x3FE6A83A,0xADF2047D,
+	0x40003F7C,0xED916873, 0x3FE6AC43,0x81419DDC,
+	0x40004189,0x374BC6A8, 0x3FE6B04B,0xD26A5CCC,
+	0x40004395,0x810624DD, 0x3FE6B453,0xA18D0A8B,
+	0x400045A1,0xCAC08312, 0x3FE6B85A,0xEECA63F4,
+	0x400047AE,0x147AE148, 0x3FE6BC61,0xBA431989,
+	0x400049BA,0x5E353F7D, 0x3FE6C068,0x0417CF6F,
+	0x40004BC6,0xA7EF9DB2, 0x3FE6C46D,0xCC691D81,
+	0x40004DD2,0xF1A9FBE7, 0x3FE6C873,0x13578F53,
+	0x40004FDF,0x3B645A1D, 0x3FE6CC77,0xD903A433,
+	0x400051EB,0x851EB852, 0x3FE6D07C,0x1D8DCF2F,
+	0x400053F7,0xCED91687, 0x3FE6D47F,0xE1167725,
+	0x40005604,0x189374BC, 0x3FE6D883,0x23BDF6BF,
+	0x40005810,0x624DD2F2, 0x3FE6DC85,0xE5A49C7F,
+	0x40005A1C,0xAC083127, 0x3FE6E088,0x26EAAABD,
+	0x40005C28,0xF5C28F5C, 0x3FE6E489,0xE7B057B9,
+	0x40005E35,0x3F7CED91, 0x3FE6E88B,0x2815CD98,
+	0x40006041,0x89374BC7, 0x3FE6EC8B,0xE83B2A70,
+	0x4000624D,0xD2F1A9FC, 0x3FE6F08C,0x28408045,
+	0x4000645A,0x1CAC0831, 0x3FE6F48B,0xE845D51A,
+	0x40006666,0x66666666, 0x3FE6F88B,0x286B22F1,
+	0x40006872,0xB020C49C, 0x3FE6FC89,0xE8D057D2,
+	0x40006A7E,0xF9DB22D1, 0x3FE70088,0x299555CE,
+	0x40006C8B,0x43958106, 0x3FE70485,0xEAD9F30B,
+	0x40006E97,0x8D4FDF3B, 0x3FE70883,0x2CBDF9C8,
+	0x400070A3,0xD70A3D71, 0x3FE70C7F,0xEF612861,
+	0x400072B0,0x20C49BA6, 0x3FE7107C,0x32E33151,
+	0x400074BC,0x6A7EF9DB, 0x3FE71477,0xF763BB43,
+	0x400076C8,0xB4395810, 0x3FE71873,0x3D02610D,
+	0x400078D4,0xFDF3B646, 0x3FE71C6E,0x03DEB1C1,
+	0x40007AE1,0x47AE147B, 0x3FE72068,0x4C1830A3,
+	0x40007CED,0x916872B0, 0x3FE72462,0x15CE553D,
+	0x40007EF9,0xDB22D0E5, 0x3FE7285B,0x61208B62,
+	0x40008106,0x24DD2F1B, 0x3FE72C54,0x2E2E3330,
+	0x40008312,0x6E978D50, 0x3FE7304C,0x7D16A114,
+	0x4000851E,0xB851EB85, 0x3FE73444,0x4DF91DD9,
+	0x4000872B,0x020C49BA, 0x3FE7383B,0xA0F4E6A4,
+	0x40008937,0x4BC6A7F0, 0x3FE73C32,0x76292D03,
+	0x40008B43,0x95810625, 0x3FE74028,0xCDB516E5,
+	0x40008D4F,0xDF3B645A, 0x3FE7441E,0xA7B7BEB0,
+	0x40008F5C,0x28F5C28F, 0x3FE74814,0x0450333E,
+	0x40009168,0x72B020C5, 0x3FE74C08,0xE39D77E3,
+	0x40009374,0xBC6A7EFA, 0x3FE74FFD,0x45BE846F,
+	0x40009581,0x0624DD2F, 0x3FE753F1,0x2AD24540,
+	0x4000978D,0x4FDF3B64, 0x3FE757E4,0x92F79B3B,
+	0x40009999,0x9999999A, 0x3FE75BD7,0x7E4D5BD9,
+	0x40009BA5,0xE353F7CF, 0x3FE75FC9,0xECF25127,
+	0x40009DB2,0x2D0E5604, 0x3FE763BB,0xDF0539D0,
+	0x40009FBE,0x76C8B439, 0x3FE767AD,0x54A4C925,
+	0x4000A1CA,0xC083126F, 0x3FE76B9E,0x4DEFA71C,
+	0x4000A3D7,0x0A3D70A4, 0x3FE76F8E,0xCB047055,
+	0x4000A5E3,0x53F7CED9, 0x3FE7737E,0xCC01B62A,
+	0x4000A7EF,0x9DB22D0E, 0x3FE7776E,0x5105FEA9,
+	0x4000A9FB,0xE76C8B44, 0x3FE77B5D,0x5A2FC4A3,
+	0x4000AC08,0x3126E979, 0x3FE77F4B,0xE79D77A5,
+	0x4000AE14,0x7AE147AE, 0x3FE78339,0xF96D7C0C,
+	0x4000B020,0xC49BA5E3, 0x3FE78727,0x8FBE2B03,
+	0x4000B22D,0x0E560419, 0x3FE78B14,0xAAADD288,
+	0x4000B439,0x5810624E, 0x3FE78F01,0x4A5AB571,
+	0x4000B645,0xA1CAC083, 0x3FE792ED,0x6EE30B76,
+	0x4000B851,0xEB851EB8, 0x3FE796D9,0x18650134,
+	0x4000BA5E,0x353F7CEE, 0x3FE79AC4,0x46FEB832,
+	0x4000BC6A,0x7EF9DB23, 0x3FE79EAE,0xFACE46E2,
+	0x4000BE76,0xC8B43958, 0x3FE7A299,0x33F1B8B1,
+	0x4000C083,0x126E978D, 0x3FE7A682,0xF2870E03,
+	0x4000C28F,0x5C28F5C3, 0x3FE7AA6C,0x36AC3C40,
+	0x4000C49B,0xA5E353F8, 0x3FE7AE55,0x007F2DCE,
+	0x4000C6A7,0xEF9DB22D, 0x3FE7B23D,0x501DC224,
+	0x4000C8B4,0x39581062, 0x3FE7B625,0x25A5CDC5,
+	0x4000CAC0,0x83126E98, 0x3FE7BA0C,0x81351A4E,
+	0x4000CCCC,0xCCCCCCCD, 0x3FE7BDF3,0x62E9666E,
+	0x4000CED9,0x16872B02, 0x3FE7C1D9,0xCAE065FD,
+	0x4000D0E5,0x60418937, 0x3FE7C5BF,0xB937C1F2,
+	0x4000D2F1,0xA9FBE76D, 0x3FE7C9A5,0x2E0D1874,
+	0x4000D4FD,0xF3B645A2, 0x3FE7CD8A,0x297DFCD2,
+	0x4000D70A,0x3D70A3D7, 0x3FE7D16E,0xABA7F797,
+	0x4000D916,0x872B020C, 0x3FE7D552,0xB4A88685,
+	0x4000DB22,0xD0E56042, 0x3FE7D936,0x449D1CA0,
+	0x4000DD2F,0x1A9FBE77, 0x3FE7DD19,0x5BA3222C,
+	0x4000DF3B,0x645A1CAC, 0x3FE7E0FB,0xF9D7F4BA,
+	0x4000E147,0xAE147AE1, 0x3FE7E4DE,0x1F58E72A,
+	0x4000E353,0xF7CED917, 0x3FE7E8BF,0xCC4341B3,
+	0x4000E560,0x4189374C, 0x3FE7ECA1,0x00B441DE,
+	0x4000E76C,0x8B439581, 0x3FE7F081,0xBCC91A99,
+	0x4000E978,0xD4FDF3B6, 0x3FE7F462,0x009EF434,
+	0x4000EB85,0x1EB851EC, 0x3FE7F841,0xCC52EC69,
+	0x4000ED91,0x6872B021, 0x3FE7FC21,0x2002165D,
+	0x4000EF9D,0xB22D0E56, 0x3FE7FFFF,0xFBC97AAA,
+	0x4000F1A9,0xFBE76C8B, 0x3FE803DE,0x5FC61764,
+	0x4000F3B6,0x45A1CAC1, 0x3FE807BC,0x4C14E01B,
+	0x4000F5C2,0x8F5C28F6, 0x3FE80B99,0xC0D2BDDE,
+	0x4000F7CE,0xD916872B, 0x3FE80F76,0xBE1C8F48,
+	0x4000F9DB,0x22D0E560, 0x3FE81353,0x440F287F,
+	0x4000FBE7,0x6C8B4396, 0x3FE8172F,0x52C7533D,
+	0x4000FDF3,0xB645A1CB, 0x3FE81B0A,0xEA61CECD,
+	0x40010000,0x00000000, 0x3FE81EE6,0x0AFB501A,
+	0x4001020C,0x49BA5E35, 0x3FE822C0,0xB4B081AE,
+	0x40010418,0x9374BC6A, 0x3FE8269A,0xE79E03BB,
+	0x40010624,0xDD2F1AA0, 0x3FE82A74,0xA3E06C1C,
+	0x40010831,0x26E978D5, 0x3FE82E4D,0xE9944658,
+	0x40010A3D,0x70A3D70A, 0x3FE83226,0xB8D613B0,
+	0x40010C49,0xBA5E353F, 0x3FE835FF,0x11C24B1D,
+	0x40010E56,0x04189375, 0x3FE839D6,0xF4755957,
+	0x40011062,0x4DD2F1AA, 0x3FE83DAE,0x610BA0D5,
+	0x4001126E,0x978D4FDF, 0x3FE84185,0x57A179DC,
+	0x4001147A,0xE147AE14, 0x3FE8455B,0xD853327A,
+	0x40011687,0x2B020C4A, 0x3FE84931,0xE33D0E93,
+	0x40011893,0x74BC6A7F, 0x3FE84D07,0x787B47DD,
+	0x40011A9F,0xBE76C8B4, 0x3FE850DC,0x982A0DED,
+	0x40011CAC,0x083126E9, 0x3FE854B1,0x4265863A,
+	0x40011EB8,0x51EB851F, 0x3FE85885,0x7749CC1F,
+	0x400120C4,0x9BA5E354, 0x3FE85C59,0x36F2F0DE,
+	0x400122D0,0xE5604189, 0x3FE8602C,0x817CFBAD,
+	0x400124DD,0x2F1A9FBE, 0x3FE863FF,0x5703E9B4,
+	0x400126E9,0x78D4FDF4, 0x3FE867D1,0xB7A3AE15,
+	0x400128F5,0xC28F5C29, 0x3FE86BA3,0xA37831ED,
+	0x40012B02,0x0C49BA5E, 0x3FE86F75,0x1A9D545D,
+	0x40012D0E,0x56041893, 0x3FE87346,0x1D2EEA8D,
+	0x40012F1A,0x9FBE76C9, 0x3FE87716,0xAB48BFB3,
+	0x40013126,0xE978D4FE, 0x3FE87AE6,0xC506950F,
+	0x40013333,0x33333333, 0x3FE87EB6,0x6A8421FF,
+	0x4001353F,0x7CED9168, 0x3FE88285,0x9BDD13F4,
+	0x4001374B,0xC6A7EF9E, 0x3FE88654,0x592D0E84,
+	0x40013958,0x10624DD3, 0x3FE88A22,0xA28FAB62,
+	0x40013B64,0x5A1CAC08, 0x3FE88DF0,0x78207A6C,
+	0x40013D70,0xA3D70A3D, 0x3FE891BD,0xD9FB01AF,
+	0x40013F7C,0xED916873, 0x3FE8958A,0xC83ABD69,
+	0x40014189,0x374BC6A8, 0x3FE89957,0x42FB2009,
+	0x40014395,0x810624DD, 0x3FE89D23,0x4A57923E,
+	0x400145A1,0xCAC08312, 0x3FE8A0EE,0xDE6B72F5,
+	0x400147AE,0x147AE148, 0x3FE8A4B9,0xFF521762,
+	0x400149BA,0x5E353F7D, 0x3FE8A884,0xAD26CAFA,
+	0x40014BC6,0xA7EF9DB2, 0x3FE8AC4E,0xE804CF86,
+	0x40014DD2,0xF1A9FBE7, 0x3FE8B018,0xB0075D20,
+	0x40014FDF,0x3B645A1D, 0x3FE8B3E2,0x0549A239,
+	0x400151EB,0x851EB852, 0x3FE8B7AA,0xE7E6C396,
+	0x400153F7,0xCED91687, 0x3FE8BB73,0x57F9DC66,
+	0x40015604,0x189374BC, 0x3FE8BF3B,0x559DFE34,
+	0x40015810,0x624DD2F2, 0x3FE8C302,0xE0EE30FB,
+	0x40015A1C,0xAC083127, 0x3FE8C6C9,0xFA05731A,
+	0x40015C28,0xF5C28F5C, 0x3FE8CA90,0xA0FEB96A,
+	0x40015E35,0x3F7CED91, 0x3FE8CE56,0xD5F4EF36,
+	0x40016041,0x89374BC7, 0x3FE8D21C,0x9902F647,
+	0x4001624D,0xD2F1A9FC, 0x3FE8D5E1,0xEA43A6E0,
+	0x4001645A,0x1CAC0831, 0x3FE8D9A6,0xC9D1CFCB,
+	0x40016666,0x66666666, 0x3FE8DD6B,0x37C8365B,
+	0x40016872,0xB020C49C, 0x3FE8E12F,0x34419670,
+	0x40016A7E,0xF9DB22D1, 0x3FE8E4F2,0xBF58A277,
+	0x40016C8B,0x43958106, 0x3FE8E8B5,0xD9280375,
+	0x40016E97,0x8D4FDF3B, 0x3FE8EC78,0x81CA590A,
+	0x400170A3,0xD70A3D71, 0x3FE8F03A,0xB95A3976,
+	0x400172B0,0x20C49BA6, 0x3FE8F3FC,0x7FF23194,
+	0x400174BC,0x6A7EF9DB, 0x3FE8F7BD,0xD5ACC4EF,
+	0x400176C8,0xB4395810, 0x3FE8FB7E,0xBAA46DB8,
+	0x400178D4,0xFDF3B646, 0x3FE8FF3F,0x2EF39CD4,
+	0x40017AE1,0x47AE147B, 0x3FE902FF,0x32B4B9D7,
+	0x40017CED,0x916872B0, 0x3FE906BE,0xC6022312,
+	0x40017EF9,0xDB22D0E5, 0x3FE90A7D,0xE8F62D91,
+	0x40018106,0x24DD2F1B, 0x3FE90E3C,0x9BAB2526,
+	0x40018312,0x6E978D50, 0x3FE911FA,0xDE3B4C5E,
+	0x4001851E,0xB851EB85, 0x3FE915B8,0xB0C0DC9A,
+	0x4001872B,0x020C49BA, 0x3FE91976,0x13560606,
+	0x40018937,0x4BC6A7F0, 0x3FE91D33,0x0614EFA2,
+	0x40018B43,0x95810625, 0x3FE920EF,0x8917B73F,
+	0x40018D4F,0xDF3B645A, 0x3FE924AB,0x9C78718F,
+	0x40018F5C,0x28F5C28F, 0x3FE92867,0x40512A23,
+	0x40019168,0x72B020C5, 0x3FE92C22,0x74BBE36E,
+	0x40019374,0xBC6A7EFA, 0x3FE92FDD,0x39D296CA,
+	0x40019581,0x0624DD2F, 0x3FE93397,0x8FAF347F,
+	0x4001978D,0x4FDF3B64, 0x3FE93751,0x766BA3C4,
+	0x40019999,0x9999999A, 0x3FE93B0A,0xEE21C2C9,
+	0x40019BA5,0xE353F7CF, 0x3FE93EC3,0xF6EB66AE,
+	0x40019DB2,0x2D0E5604, 0x3FE9427C,0x90E25B97,
+	0x40019FBE,0x76C8B439, 0x3FE94634,0xBC2064A7,
+	0x4001A1CA,0xC083126F, 0x3FE949EC,0x78BF3C0A,
+	0x4001A3D7,0x0A3D70A4, 0x3FE94DA3,0xC6D892ED,
+	0x4001A5E3,0x53F7CED9, 0x3FE9515A,0xA6861192,
+	0x4001A7EF,0x9DB22D0E, 0x3FE95511,0x17E1574A,
+	0x4001A9FB,0xE76C8B44, 0x3FE958C7,0x1B03FA80,
+	0x4001AC08,0x3126E979, 0x3FE95C7C,0xB00788B1,
+	0x4001AE14,0x7AE147AE, 0x3FE96031,0xD705867F,
+	0x4001B020,0xC49BA5E3, 0x3FE963E6,0x90176FAC,
+	0x4001B22D,0x0E560419, 0x3FE9679A,0xDB56B724,
+	0x4001B439,0x5810624E, 0x3FE96B4E,0xB8DCC6F5,
+	0x4001B645,0xA1CAC083, 0x3FE96F02,0x28C30063,
+	0x4001B851,0xEB851EB8, 0x3FE972B5,0x2B22BBE4,
+	0x4001BA5E,0x353F7CEE, 0x3FE97667,0xC0154924,
+	0x4001BC6A,0x7EF9DB23, 0x3FE97A19,0xE7B3EF06,
+	0x4001BE76,0xC8B43958, 0x3FE97DCB,0xA217EBB2,
+	0x4001C083,0x126E978D, 0x3FE9817C,0xEF5A748F,
+	0x4001C28F,0x5C28F5C3, 0x3FE9852D,0xCF94B64E,
+	0x4001C49B,0xA5E353F8, 0x3FE988DE,0x42DFD4E6,
+	0x4001C6A7,0xEF9DB22D, 0x3FE98C8E,0x4954EBA2,
+	0x4001C8B4,0x39581062, 0x3FE9903D,0xE30D0D1D,
+	0x4001CAC0,0x83126E98, 0x3FE993ED,0x1021434E,
+	0x4001CCCC,0xCCCCCCCD, 0x3FE9979B,0xD0AA8F7E,
+	0x4001CED9,0x16872B02, 0x3FE99B4A,0x24C1EA5C,
+	0x4001D0E5,0x60418937, 0x3FE99EF8,0x0C8043F8,
+	0x4001D2F1,0xA9FBE76D, 0x3FE9A2A5,0x87FE83CB,
+	0x4001D4FD,0xF3B645A2, 0x3FE9A652,0x975588B3,
+	0x4001D70A,0x3D70A3D7, 0x3FE9A9FF,0x3A9E2903,
+	0x4001D916,0x872B020C, 0x3FE9ADAB,0x71F1327E,
+	0x4001DB22,0xD0E56042, 0x3FE9B157,0x3D676A5E,
+	0x4001DD2F,0x1A9FBE77, 0x3FE9B502,0x9D198D57,
+	0x4001DF3B,0x645A1CAC, 0x3FE9B8AD,0x91204F9B,
+	0x4001E147,0xAE147AE1, 0x3FE9BC58,0x19945CE1,
+	0x4001E353,0xF7CED917, 0x3FE9C002,0x368E5865,
+	0x4001E560,0x4189374C, 0x3FE9C3AB,0xE826DCEB,
+	0x4001E76C,0x8B439581, 0x3FE9C755,0x2E767CC7,
+	0x4001E978,0xD4FDF3B6, 0x3FE9CAFE,0x0995C1DF,
+	0x4001EB85,0x1EB851EC, 0x3FE9CEA6,0x799D2DAF,
+	0x4001ED91,0x6872B021, 0x3FE9D24E,0x7EA5394B,
+	0x4001EF9D,0xB22D0E56, 0x3FE9D5F6,0x18C65565,
+	0x4001F1A9,0xFBE76C8B, 0x3FE9D99D,0x4818EA50,
+	0x4001F3B6,0x45A1CAC1, 0x3FE9DD44,0x0CB55808,
+	0x4001F5C2,0x8F5C28F6, 0x3FE9E0EA,0x66B3F62B,
+	0x4001F7CE,0xD916872B, 0x3FE9E490,0x562D1407,
+	0x4001F9DB,0x22D0E560, 0x3FE9E835,0xDB38F89D,
+	0x4001FBE7,0x6C8B4396, 0x3FE9EBDA,0xF5EFE2A0,
+	0x4001FDF3,0xB645A1CB, 0x3FE9EF7F,0xA66A0877,
+	0x40020000,0x00000000, 0x3FE9F323,0xECBF984C,
+	0x4002020C,0x49BA5E35, 0x3FE9F6C7,0xC908B804,
+	0x40020418,0x9374BC6A, 0x3FE9FA6B,0x3B5D854A,
+	0x40020624,0xDD2F1AA0, 0x3FE9FE0E,0x43D6158E,
+	0x40020831,0x26E978D5, 0x3FEA01B0,0xE28A760B,
+	0x40020A3D,0x70A3D70A, 0x3FEA0553,0x1792ABCA,
+	0x40020C49,0xBA5E353F, 0x3FEA08F4,0xE306B3A8,
+	0x40020E56,0x04189375, 0x3FEA0C96,0x44FE825A,
+	0x40021062,0x4DD2F1AA, 0x3FEA1037,0x3D920468,
+	0x4002126E,0x978D4FDF, 0x3FEA13D7,0xCCD91E3B,
+	0x4002147A,0xE147AE14, 0x3FEA1777,0xF2EBAC20,
+	0x40021687,0x2B020C4A, 0x3FEA1B17,0xAFE18246,
+	0x40021893,0x74BC6A7F, 0x3FEA1EB7,0x03D26CC1,
+	0x40021A9F,0xBE76C8B4, 0x3FEA2255,0xEED62F97,
+	0x40021CAC,0x083126E9, 0x3FEA25F4,0x710486BA,
+	0x40021EB8,0x51EB851F, 0x3FEA2992,0x8A752613,
+	0x400220C4,0x9BA5E354, 0x3FEA2D30,0x3B3FB97B,
+	0x400222D0,0xE5604189, 0x3FEA30CD,0x837BE4CD,
+	0x400224DD,0x2F1A9FBE, 0x3FEA346A,0x634143DF,
+	0x400226E9,0x78D4FDF4, 0x3FEA3806,0xDAA76A8A,
+	0x400228F5,0xC28F5C29, 0x3FEA3BA2,0xE9C5E4AA,
+	0x40022B02,0x0C49BA5E, 0x3FEA3F3E,0x90B43625,
+	0x40022D0E,0x56041893, 0x3FEA42D9,0xCF89DAF1,
+	0x40022F1A,0x9FBE76C9, 0x3FEA4674,0xA65E4711,
+	0x40023126,0xE978D4FE, 0x3FEA4A0F,0x1548E69B,
+	0x40023333,0x33333333, 0x3FEA4DA9,0x1C611DBE,
+	0x4002353F,0x7CED9168, 0x3FEA5142,0xBBBE48C4,
+	0x4002374B,0xC6A7EF9E, 0x3FEA54DB,0xF377BC18,
+	0x40023958,0x10624DD3, 0x3FEA5874,0xC3A4C43F,
+	0x40023B64,0x5A1CAC08, 0x3FEA5C0D,0x2C5CA5ED,
+	0x40023D70,0xA3D70A3D, 0x3FEA5FA5,0x2DB69DF9,
+	0x40023F7C,0xED916873, 0x3FEA633C,0xC7C9E16A,
+	0x40024189,0x374BC6A8, 0x3FEA66D3,0xFAAD9D74,
+	0x40024395,0x810624DD, 0x3FEA6A6A,0xC678F781,
+	0x400245A1,0xCAC08312, 0x3FEA6E01,0x2B430D31,
+	0x400247AE,0x147AE148, 0x3FEA7197,0x2922F462,
+	0x400249BA,0x5E353F7D, 0x3FEA752C,0xC02FBB28,
+	0x40024BC6,0xA7EF9DB2, 0x3FEA78C1,0xF08067E1,
+	0x40024DD2,0xF1A9FBE7, 0x3FEA7C56,0xBA2BF92D,
+	0x40024FDF,0x3B645A1D, 0x3FEA7FEB,0x1D4965F5,
+	0x400251EB,0x851EB852, 0x3FEA837F,0x19EF9D69,
+	0x400253F7,0xCED91687, 0x3FEA8712,0xB0358710,
+	0x40025604,0x189374BC, 0x3FEA8AA5,0xE03202C1,
+	0x40025810,0x624DD2F2, 0x3FEA8E38,0xA9FBE8A8,
+	0x40025A1C,0xAC083127, 0x3FEA91CB,0x0DAA094A,
+	0x40025C28,0xF5C28F5C, 0x3FEA955D,0x0B532D8B,
+	0x40025E35,0x3F7CED91, 0x3FEA98EE,0xA30E16B0,
+	0x40026041,0x89374BC7, 0x3FEA9C7F,0xD4F17E62,
+	0x4002624D,0xD2F1A9FC, 0x3FEAA010,0xA11416AD,
+	0x4002645A,0x1CAC0831, 0x3FEAA3A1,0x078C8A0D,
+	0x40026666,0x66666666, 0x3FEAA731,0x08717B69,
+	0x40026872,0xB020C49C, 0x3FEAAAC0,0xA3D9861D,
+	0x40026A7E,0xF9DB22D1, 0x3FEAAE4F,0xD9DB3DF4,
+	0x40026C8B,0x43958106, 0x3FEAB1DE,0xAA8D2F34,
+	0x40026E97,0x8D4FDF3B, 0x3FEAB56D,0x1605DEA1,
+	0x400270A3,0xD70A3D71, 0x3FEAB8FB,0x1C5BC97D,
+	0x400272B0,0x20C49BA6, 0x3FEABC88,0xBDA56586,
+	0x400274BC,0x6A7EF9DB, 0x3FEAC015,0xF9F92107,
+	0x400276C8,0xB4395810, 0x3FEAC3A2,0xD16D62D1,
+	0x400278D4,0xFDF3B646, 0x3FEAC72F,0x44188A44,
+	0x40027AE1,0x47AE147B, 0x3FEACABB,0x5210EF47,
+	0x40027CED,0x916872B0, 0x3FEACE46,0xFB6CE25C,
+	0x40027EF9,0xDB22D0E5, 0x3FEAD1D2,0x4042AC99,
+	0x40028106,0x24DD2F1B, 0x3FEAD55D,0x20A88FAE,
+	0x40028312,0x6E978D50, 0x3FEAD8E7,0x9CB4C5E3,
+	0x4002851E,0xB851EB85, 0x3FEADC71,0xB47D8224,
+	0x4002872B,0x020C49BA, 0x3FEADFFB,0x6818F000,
+	0x40028937,0x4BC6A7F0, 0x3FEAE384,0xB79D33AD,
+	0x40028B43,0x95810625, 0x3FEAE70D,0xA3206A06,
+	0x40028D4F,0xDF3B645A, 0x3FEAEA96,0x2AB8A897,
+	0x40028F5C,0x28F5C28F, 0x3FEAEE1E,0x4E7BFD9C,
+	0x40029168,0x72B020C5, 0x3FEAF1A6,0x0E807004,
+	0x40029374,0xBC6A7EFA, 0x3FEAF52D,0x6ADBFF71,
+	0x40029581,0x0624DD2F, 0x3FEAF8B4,0x63A4A444,
+	0x4002978D,0x4FDF3B64, 0x3FEAFC3A,0xF8F04F97,
+	0x40029999,0x9999999A, 0x3FEAFFC1,0x2AD4EB49,
+	0x40029BA5,0xE353F7CF, 0x3FEB0346,0xF96859F5,
+	0x40029DB2,0x2D0E5604, 0x3FEB06CC,0x64C07702,
+	0x40029FBE,0x76C8B439, 0x3FEB0A51,0x6CF316A0,
+	0x4002A1CA,0xC083126F, 0x3FEB0DD6,0x121605CC,
+	0x4002A3D7,0x0A3D70A4, 0x3FEB115A,0x543F0A50,
+	0x4002A5E3,0x53F7CED9, 0x3FEB14DE,0x3383E2CC,
+	0x4002A7EF,0x9DB22D0E, 0x3FEB1861,0xAFFA46B5,
+	0x4002A9FB,0xE76C8B44, 0x3FEB1BE4,0xC9B7E65E,
+	0x4002AC08,0x3126E979, 0x3FEB1F67,0x80D26AEE,
+	0x4002AE14,0x7AE147AE, 0x3FEB22E9,0xD55F7673,
+	0x4002B020,0xC49BA5E3, 0x3FEB266B,0xC774A3DB,
+	0x4002B22D,0x0E560419, 0x3FEB29ED,0x572786FC,
+	0x4002B439,0x5810624E, 0x3FEB2D6E,0x848DAC91,
+	0x4002B645,0xA1CAC083, 0x3FEB30EF,0x4FBC9A45,
+	0x4002B851,0xEB851EB8, 0x3FEB346F,0xB8C9CEB1,
+	0x4002BA5E,0x353F7CEE, 0x3FEB37EF,0xBFCAC162,
+	0x4002BC6A,0x7EF9DB23, 0x3FEB3B6F,0x64D4E2D7,
+	0x4002BE76,0xC8B43958, 0x3FEB3EEE,0xA7FD9C89,
+	0x4002C083,0x126E978D, 0x3FEB426D,0x895A50F0,
+	0x4002C28F,0x5C28F5C3, 0x3FEB45EC,0x09005B7F,
+	0x4002C49B,0xA5E353F8, 0x3FEB496A,0x270510AA,
+	0x4002C6A7,0xEF9DB22D, 0x3FEB4CE7,0xE37DBDEC,
+	0x4002C8B4,0x39581062, 0x3FEB5065,0x3E7FA9C9,
+	0x4002CAC0,0x83126E98, 0x3FEB53E2,0x382013CE,
+	0x4002CCCC,0xCCCCCCCD, 0x3FEB575E,0xD0743494,
+	0x4002CED9,0x16872B02, 0x3FEB5ADB,0x07913DC9,
+	0x4002D0E5,0x60418937, 0x3FEB5E56,0xDD8C5A2D,
+	0x4002D2F1,0xA9FBE76D, 0x3FEB61D2,0x527AAD98,
+	0x4002D4FD,0xF3B645A2, 0x3FEB654D,0x667154F8,
+	0x4002D70A,0x3D70A3D7, 0x3FEB68C8,0x1985665D,
+	0x4002D916,0x872B020C, 0x3FEB6C42,0x6BCBF0F5,
+	0x4002DB22,0xD0E56042, 0x3FEB6FBC,0x5D59FD13,
+	0x4002DD2F,0x1A9FBE77, 0x3FEB7335,0xEE448C2B,
+	0x4002DF3B,0x645A1CAC, 0x3FEB76AF,0x1EA098DE,
+	0x4002E147,0xAE147AE1, 0x3FEB7A27,0xEE8316F8,
+	0x4002E353,0xF7CED917, 0x3FEB7DA0,0x5E00F375,
+	0x4002E560,0x4189374C, 0x3FEB8118,0x6D2F147E,
+	0x4002E76C,0x8B439581, 0x3FEB8490,0x1C225977,
+	0x4002E978,0xD4FDF3B6, 0x3FEB8807,0x6AEF9AF9,
+	0x4002EB85,0x1EB851EC, 0x3FEB8B7E,0x59ABAAD9,
+	0x4002ED91,0x6872B021, 0x3FEB8EF4,0xE86B5424,
+	0x4002EF9D,0xB22D0E56, 0x3FEB926B,0x17435B2F,
+	0x4002F1A9,0xFBE76C8B, 0x3FEB95E0,0xE6487D8E,
+	0x4002F3B6,0x45A1CAC1, 0x3FEB9956,0x558F721E,
+	0x4002F5C2,0x8F5C28F6, 0x3FEB9CCB,0x652CE901,
+	0x4002F7CE,0xD916872B, 0x3FEBA040,0x15358BAA,
+	0x4002F9DB,0x22D0E560, 0x3FEBA3B4,0x65BDFCD9,
+	0x4002FBE7,0x6C8B4396, 0x3FEBA728,0x56DAD8A0,
+	0x4002FDF3,0xB645A1CB, 0x3FEBAA9B,0xE8A0B464,
+	0x40030000,0x00000000, 0x3FEBAE0F,0x1B241EE4,
+	0x4003020C,0x49BA5E35, 0x3FEBB181,0xEE79A039,
+	0x40030418,0x9374BC6A, 0x3FEBB4F4,0x62B5B9DA,
+	0x40030624,0xDD2F1AA0, 0x3FEBB866,0x77ECE69F,
+	0x40030831,0x26E978D5, 0x3FEBBBD8,0x2E339ABE,
+	0x40030A3D,0x70A3D70A, 0x3FEBBF49,0x859E43D9,
+	0x40030C49,0xBA5E353F, 0x3FEBC2BA,0x7E4148F7,
+	0x40030E56,0x04189375, 0x3FEBC62B,0x18310A90,
+	0x40031062,0x4DD2F1AA, 0x3FEBC99B,0x5381E281,
+	0x4003126E,0x978D4FDF, 0x3FEBCD0B,0x30482422,
+	0x4003147A,0xE147AE14, 0x3FEBD07A,0xAE981C39,
+	0x40031687,0x2B020C4A, 0x3FEBD3E9,0xCE861108,
+	0x40031893,0x74BC6A7F, 0x3FEBD758,0x90264243,
+	0x40031A9F,0xBE76C8B4, 0x3FEBDAC6,0xF38CE922,
+	0x40031CAC,0x083126E9, 0x3FEBDE34,0xF8CE385A,
+	0x40031EB8,0x51EB851F, 0x3FEBE1A2,0x9FFE5C21,
+	0x400320C4,0x9BA5E354, 0x3FEBE50F,0xE9317A31,
+	0x400322D0,0xE5604189, 0x3FEBE87C,0xD47BB1CF,
+	0x400324DD,0x2F1A9FBE, 0x3FEBEBE9,0x61F11BC8,
+	0x400326E9,0x78D4FDF4, 0x3FEBEF55,0x91A5CA78,
+	0x400328F5,0xC28F5C29, 0x3FEBF2C1,0x63ADC9C8,
+	0x40032B02,0x0C49BA5E, 0x3FEBF62C,0xD81D1F35,
+	0x40032D0E,0x56041893, 0x3FEBF997,0xEF07C9D3,
+	0x40032F1A,0x9FBE76C9, 0x3FEBFD02,0xA881C24F,
+	0x40033126,0xE978D4FE, 0x3FEC006D,0x049EFAEB,
+	0x40033333,0x33333333, 0x3FEC03D7,0x03735F8C,
+	0x4003353F,0x7CED9168, 0x3FEC0740,0xA512D5B8,
+	0x4003374B,0xC6A7EF9E, 0x3FEC0AA9,0xE9913C96,
+	0x40033958,0x10624DD3, 0x3FEC0E12,0xD1026CEF,
+	0x40033B64,0x5A1CAC08, 0x3FEC117B,0x5B7A393C,
+	0x40033D70,0xA3D70A3D, 0x3FEC14E3,0x890C6D9D,
+	0x40033F7C,0xED916873, 0x3FEC184B,0x59CCCFE1,
+	0x40034189,0x374BC6A8, 0x3FEC1BB2,0xCDCF1F86,
+	0x40034395,0x810624DD, 0x3FEC1F19,0xE52715BE,
+	0x400345A1,0xCAC08312, 0x3FEC2280,0x9FE86573,
+	0x400347AE,0x147AE148, 0x3FEC25E6,0xFE26BB46,
+	0x400349BA,0x5E353F7D, 0x3FEC294C,0xFFF5BD92,
+	0x40034BC6,0xA7EF9DB2, 0x3FEC2CB2,0xA5690C71,
+	0x40034DD2,0xF1A9FBE7, 0x3FEC3017,0xEE9441C0,
+	0x40034FDF,0x3B645A1D, 0x3FEC337C,0xDB8AF11D,
+	0x400351EB,0x851EB852, 0x3FEC36E1,0x6C60A7E9,
+	0x400353F7,0xCED91687, 0x3FEC3A45,0xA128ED53,
+	0x40035604,0x189374BC, 0x3FEC3DA9,0x79F74252,
+	0x40035810,0x624DD2F2, 0x3FEC410C,0xF6DF21AF,
+	0x40035A1C,0xAC083127, 0x3FEC4470,0x17F3FFFA,
+	0x40035C28,0xF5C28F5C, 0x3FEC47D2,0xDD494BA1,
+	0x40035E35,0x3F7CED91, 0x3FEC4B35,0x46F26CE0,
+	0x40036041,0x89374BC7, 0x3FEC4E97,0x5502C5D1,
+	0x4003624D,0xD2F1A9FC, 0x3FEC51F9,0x078DB263,
+	0x4003645A,0x1CAC0831, 0x3FEC555A,0x5EA68866,
+	0x40036666,0x66666666, 0x3FEC58BB,0x5A60978B,
+	0x40036872,0xB020C49C, 0x3FEC5C1B,0xFACF2964,
+	0x40036A7E,0xF9DB22D1, 0x3FEC5F7C,0x40058167,
+	0x40036C8B,0x43958106, 0x3FEC62DC,0x2A16DCF3,
+	0x40036E97,0x8D4FDF3B, 0x3FEC663B,0xB9167353,
+	0x400370A3,0xD70A3D71, 0x3FEC699A,0xED1775BE,
+	0x400372B0,0x20C49BA6, 0x3FEC6CF9,0xC62D0F58,
+	0x400374BC,0x6A7EF9DB, 0x3FEC7058,0x446A653A,
+	0x400376C8,0xB4395810, 0x3FEC73B6,0x67E29670,
+	0x400378D4,0xFDF3B646, 0x3FEC7714,0x30A8BC01,
+	0x40037AE1,0x47AE147B, 0x3FEC7A71,0x9ECFE8E6,
+	0x40037CED,0x916872B0, 0x3FEC7DCE,0xB26B2A1B,
+	0x40037EF9,0xDB22D0E5, 0x3FEC812B,0x6B8D8698,
+	0x40038106,0x24DD2F1B, 0x3FEC8487,0xCA49FF59,
+	0x40038312,0x6E978D50, 0x3FEC87E3,0xCEB38F57,
+	0x4003851E,0xB851EB85, 0x3FEC8B3F,0x78DD2B99,
+	0x4003872B,0x020C49BA, 0x3FEC8E9A,0xC8D9C32B,
+	0x40038937,0x4BC6A7F0, 0x3FEC91F5,0xBEBC3F27,
+	0x40038B43,0x95810625, 0x3FEC9550,0x5A9782AE,
+	0x40038D4F,0xDF3B645A, 0x3FEC98AA,0x9C7E6AF9,
+	0x40038F5C,0x28F5C28F, 0x3FEC9C04,0x8483CF51,
+	0x40039168,0x72B020C5, 0x3FEC9F5E,0x12BA8116,
+	0x40039374,0xBC6A7EFA, 0x3FECA2B7,0x47354BB9,
+	0x40039581,0x0624DD2F, 0x3FECA610,0x2206F4CC,
+	0x4003978D,0x4FDF3B64, 0x3FECA968,0xA3423BFD,
+	0x40039999,0x9999999A, 0x3FECACC0,0xCAF9DB19,
+	0x40039BA5,0xE353F7CF, 0x3FECB018,0x99408609,
+	0x40039DB2,0x2D0E5604, 0x3FECB370,0x0E28EAE2,
+	0x40039FBE,0x76C8B439, 0x3FECB6C7,0x29C5B1DB,
+	0x4003A1CA,0xC083126F, 0x3FECBA1D,0xEC297D57,
+	0x4003A3D7,0x0A3D70A4, 0x3FECBD74,0x5566E9DF,
+	0x4003A5E3,0x53F7CED9, 0x3FECC0CA,0x65908E2E,
+	0x4003A7EF,0x9DB22D0E, 0x3FECC420,0x1CB8FB30,
+	0x4003A9FB,0xE76C8B44, 0x3FECC775,0x7AF2BC01,
+	0x4003AC08,0x3126E979, 0x3FECCACA,0x805055F3,
+	0x4003AE14,0x7AE147AE, 0x3FECCE1F,0x2CE4488F,
+	0x4003B020,0xC49BA5E3, 0x3FECD173,0x80C10D99,
+	0x4003B22D,0x0E560419, 0x3FECD4C7,0x7BF91913,
+	0x4003B439,0x5810624E, 0x3FECD81B,0x1E9ED937,
+	0x4003B645,0xA1CAC083, 0x3FECDB6E,0x68C4B687,
+	0x4003B851,0xEB851EB8, 0x3FECDEC1,0x5A7D13C6,
+	0x4003BA5E,0x353F7CEE, 0x3FECE213,0xF3DA4DFF,
+	0x4003BC6A,0x7EF9DB23, 0x3FECE566,0x34EEBC7E,
+	0x4003BE76,0xC8B43958, 0x3FECE8B8,0x1DCCB0E2,
+	0x4003C083,0x126E978D, 0x3FECEC09,0xAE867713,
+	0x4003C28F,0x5C28F5C3, 0x3FECEF5A,0xE72E554A,
+	0x4003C49B,0xA5E353F8, 0x3FECF2AB,0xC7D68C0F,
+	0x4003C6A7,0xEF9DB22D, 0x3FECF5FC,0x50915640,
+	0x4003C8B4,0x39581062, 0x3FECF94C,0x8170E911,
+	0x4003CAC0,0x83126E98, 0x3FECFC9C,0x5A877411,
+	0x4003CCCC,0xCCCCCCCD, 0x3FECFFEB,0xDBE72125,
+	0x4003CED9,0x16872B02, 0x3FED033B,0x05A21493,
+	0x4003D0E5,0x60418937, 0x3FED0689,0xD7CA6D01,
+	0x4003D2F1,0xA9FBE76D, 0x3FED09D8,0x52724377,
+	0x4003D4FD,0xF3B645A2, 0x3FED0D26,0x75ABAB5E,
+	0x4003D70A,0x3D70A3D7, 0x3FED1074,0x4188B289,
+	0x4003D916,0x872B020C, 0x3FED13C1,0xB61B6134,
+	0x4003DB22,0xD0E56042, 0x3FED170E,0xD375BA07,
+	0x4003DD2F,0x1A9FBE77, 0x3FED1A5B,0x99A9BA12,
+	0x4003DF3B,0x645A1CAC, 0x3FED1DA8,0x08C958DC,
+	0x4003E147,0xAE147AE1, 0x3FED20F4,0x20E6885B,
+	0x4003E353,0xF7CED917, 0x3FED243F,0xE21334FA,
+	0x4003E560,0x4189374C, 0x3FED278B,0x4C61459A,
+	0x4003E76C,0x8B439581, 0x3FED2AD6,0x5FE29B95,
+	0x4003E978,0xD4FDF3B6, 0x3FED2E21,0x1CA912C3,
+	0x4003EB85,0x1EB851EC, 0x3FED316B,0x82C68177,
+	0x4003ED91,0x6872B021, 0x3FED34B5,0x924CB882,
+	0x4003EF9D,0xB22D0E56, 0x3FED37FF,0x4B4D833D,
+	0x4003F1A9,0xFBE76C8B, 0x3FED3B48,0xADDAA780,
+	0x4003F3B6,0x45A1CAC1, 0x3FED3E91,0xBA05E5AD,
+	0x4003F5C2,0x8F5C28F6, 0x3FED41DA,0x6FE0F8AC,
+	0x4003F7CE,0xD916872B, 0x3FED4522,0xCF7D95F2,
+	0x4003F9DB,0x22D0E560, 0x3FED486A,0xD8ED6D82,
+	0x4003FBE7,0x6C8B4396, 0x3FED4BB2,0x8C4229EF,
+	0x4003FDF3,0xB645A1CB, 0x3FED4EF9,0xE98D7058,
+	0x40040000,0x00000000, 0x3FED5240,0xF0E0E078,
+	0x4004020C,0x49BA5E35, 0x3FED5587,0xA24E149B,
+	0x40040418,0x9374BC6A, 0x3FED58CD,0xFDE6A1A9,
+	0x40040624,0xDD2F1AA0, 0x3FED5C14,0x03BC1724,
+	0x40040831,0x26E978D5, 0x3FED5F59,0xB3DFFF26,
+	0x40040A3D,0x70A3D70A, 0x3FED629F,0x0E63DE6F,
+	0x40040C49,0xBA5E353F, 0x3FED65E4,0x1359345C,
+	0x40040E56,0x04189375, 0x3FED6928,0xC2D17AF1,
+	0x40041062,0x4DD2F1AA, 0x3FED6C6D,0x1CDE26D2,
+	0x4004126E,0x978D4FDF, 0x3FED6FB1,0x2190A751,
+	0x4004147A,0xE147AE14, 0x3FED72F4,0xD0FA6667,
+	0x40041687,0x2B020C4A, 0x3FED7638,0x2B2CC8BB,
+	0x40041893,0x74BC6A7F, 0x3FED797B,0x30392D9E,
+	0x40041A9F,0xBE76C8B4, 0x3FED7CBD,0xE030EF17,
+	0x40041CAC,0x083126E9, 0x3FED8000,0x3B2561DC,
+	0x40041EB8,0x51EB851F, 0x3FED8342,0x4127D55D,
+	0x400420C4,0x9BA5E354, 0x3FED8683,0xF24993B8,
+	0x400422D0,0xE5604189, 0x3FED89C5,0x4E9BE1CD,
+	0x400424DD,0x2F1A9FBE, 0x3FED8D06,0x562FFF34,
+	0x400426E9,0x78D4FDF4, 0x3FED9047,0x09172642,
+	0x400428F5,0xC28F5C29, 0x3FED9387,0x67628C0B,
+	0x40042B02,0x0C49BA5E, 0x3FED96C7,0x71236067,
+	0x40042D0E,0x56041893, 0x3FED9A07,0x266ACDF0,
+	0x40042F1A,0x9FBE76C9, 0x3FED9D46,0x8749FA09,
+	0x40043126,0xE978D4FE, 0x3FEDA085,0x93D204D8,
+	0x40043333,0x33333333, 0x3FEDA3C4,0x4C140951,
+	0x4004353F,0x7CED9168, 0x3FEDA702,0xB0211D34,
+	0x4004374B,0xC6A7EF9E, 0x3FEDAA40,0xC00A5111,
+	0x40043958,0x10624DD3, 0x3FEDAD7E,0x7BE0B042,
+	0x40043B64,0x5A1CAC08, 0x3FEDB0BB,0xE3B540FB,
+	0x40043D70,0xA3D70A3D, 0x3FEDB3F8,0xF7990442,
+	0x40043F7C,0xED916873, 0x3FEDB735,0xB79CF5F6,
+	0x40044189,0x374BC6A8, 0x3FEDBA72,0x23D20CC8,
+	0x40044395,0x810624DD, 0x3FEDBDAE,0x3C493A4C,
+	0x400445A1,0xCAC08312, 0x3FEDC0EA,0x01136AF0,
+	0x400447AE,0x147AE148, 0x3FEDC425,0x72418602,
+	0x400449BA,0x5E353F7D, 0x3FEDC760,0x8FE46DAE,
+	0x40044BC6,0xA7EF9DB2, 0x3FEDCA9B,0x5A0CFF08,
+	0x40044DD2,0xF1A9FBE7, 0x3FEDCDD5,0xD0CC1205,
+	0x40044FDF,0x3B645A1D, 0x3FEDD10F,0xF4327988,
+	0x400451EB,0x851EB852, 0x3FEDD449,0xC4510354,
+	0x400453F7,0xCED91687, 0x3FEDD783,0x4138781F,
+	0x40045604,0x189374BC, 0x3FEDDABC,0x6AF99B8B,
+	0x40045810,0x624DD2F2, 0x3FEDDDF5,0x41A52C2A,
+	0x40045A1C,0xAC083127, 0x3FEDE12D,0xC54BE37B,
+	0x40045C28,0xF5C28F5C, 0x3FEDE465,0xF5FE75F7,
+	0x40045E35,0x3F7CED91, 0x3FEDE79D,0xD3CD9309,
+	0x40046041,0x89374BC7, 0x3FEDEAD5,0x5EC9E518,
+	0x4004624D,0xD2F1A9FC, 0x3FEDEE0C,0x9704117E,
+	0x4004645A,0x1CAC0831, 0x3FEDF143,0x7C8CB895,
+	0x40046666,0x66666666, 0x3FEDF47A,0x0F7475B7,
+	0x40046872,0xB020C49C, 0x3FEDF7B0,0x4FCBDF3A,
+	0x40046A7E,0xF9DB22D1, 0x3FEDFAE6,0x3DA38675,
+	0x40046C8B,0x43958106, 0x3FEDFE1B,0xD90BF7C8,
+	0x40046E97,0x8D4FDF3B, 0x3FEE0151,0x2215BA94,
+	0x400470A3,0xD70A3D71, 0x3FEE0486,0x18D15146,
+	0x400472B0,0x20C49BA6, 0x3FEE07BA,0xBD4F394F,
+	0x400474BC,0x6A7EF9DB, 0x3FEE0AEF,0x0F9FEB31,
+	0x400476C8,0xB4395810, 0x3FEE0E23,0x0FD3DA7A,
+	0x400478D4,0xFDF3B646, 0x3FEE1156,0xBDFB75CA,
+	0x40047AE1,0x47AE147B, 0x3FEE148A,0x1A2726CE,
+	0x40047CED,0x916872B0, 0x3FEE17BD,0x2467524A,
+	0x40047EF9,0xDB22D0E5, 0x3FEE1AEF,0xDCCC5817,
+	0x40048106,0x24DD2F1B, 0x3FEE1E22,0x43669329,
+	0x40048312,0x6E978D50, 0x3FEE2154,0x58465986,
+	0x4004851E,0xB851EB85, 0x3FEE2486,0x1B7BFC56,
+	0x4004872B,0x020C49BA, 0x3FEE27B7,0x8D17C7DC,
+	0x40048937,0x4BC6A7F0, 0x3FEE2AE8,0xAD2A037E,
+	0x40048B43,0x95810625, 0x3FEE2E19,0x7BC2F1BC,
+	0x40048D4F,0xDF3B645A, 0x3FEE3149,0xF8F2D041,
+	0x40048F5C,0x28F5C28F, 0x3FEE347A,0x24C9D7D9,
+	0x40049168,0x72B020C5, 0x3FEE37A9,0xFF583C7A,
+	0x40049374,0xBC6A7EFA, 0x3FEE3AD9,0x88AE2D3F,
+	0x40049581,0x0624DD2F, 0x3FEE3E08,0xC0DBD472,
+	0x4004978D,0x4FDF3B64, 0x3FEE4137,0xA7F1578A,
+	0x40049999,0x9999999A, 0x3FEE4466,0x3DFED72B,
+	0x40049BA5,0xE353F7CF, 0x3FEE4794,0x83146F2A,
+	0x40049DB2,0x2D0E5604, 0x3FEE4AC2,0x7742368F,
+	0x40049FBE,0x76C8B439, 0x3FEE4DF0,0x1A983F98,
+	0x4004A1CA,0xC083126F, 0x3FEE511D,0x6D2697B9,
+	0x4004A3D7,0x0A3D70A4, 0x3FEE544A,0x6EFD479D,
+	0x4004A5E3,0x53F7CED9, 0x3FEE5777,0x202C532A,
+	0x4004A7EF,0x9DB22D0E, 0x3FEE5AA3,0x80C3B985,
+	0x4004A9FB,0xE76C8B44, 0x3FEE5DCF,0x90D3750E,
+	0x4004AC08,0x3126E979, 0x3FEE60FB,0x506B7B65,
+	0x4004AE14,0x7AE147AE, 0x3FEE6426,0xBF9BBD6D,
+	0x4004B020,0xC49BA5E3, 0x3FEE6751,0xDE74274D,
+	0x4004B22D,0x0E560419, 0x3FEE6A7C,0xAD04A074,
+	0x4004B439,0x5810624E, 0x3FEE6DA7,0x2B5D0B91,
+	0x4004B645,0xA1CAC083, 0x3FEE70D1,0x598D46A5,
+	0x4004B851,0xEB851EB8, 0x3FEE73FB,0x37A52AF7,
+	0x4004BA5E,0x353F7CEE, 0x3FEE7724,0xC5B48D1F,
+	0x4004BC6A,0x7EF9DB23, 0x3FEE7A4E,0x03CB3CFF,
+	0x4004BE76,0xC8B43958, 0x3FEE7D76,0xF1F905CE,
+	0x4004C083,0x126E978D, 0x3FEE809F,0x904DAE14,
+	0x4004C28F,0x5C28F5C3, 0x3FEE83C7,0xDED8F7AF,
+	0x4004C49B,0xA5E353F8, 0x3FEE86EF,0xDDAA9FD1,
+	0x4004C6A7,0xEF9DB22D, 0x3FEE8A17,0x8CD25F06,
+	0x4004C8B4,0x39581062, 0x3FEE8D3E,0xEC5FE933,
+	0x4004CAC0,0x83126E98, 0x3FEE9065,0xFC62ED9C,
+	0x4004CCCC,0xCCCCCCCD, 0x3FEE938C,0xBCEB16DD,
+	0x4004CED9,0x16872B02, 0x3FEE96B3,0x2E080AF7,
+	0x4004D0E5,0x60418937, 0x3FEE99D9,0x4FC96B48,
+	0x4004D2F1,0xA9FBE76D, 0x3FEE9CFF,0x223ED497,
+	0x4004D4FD,0xF3B645A2, 0x3FEEA024,0xA577DF08,
+	0x4004D70A,0x3D70A3D7, 0x3FEEA349,0xD9841E2D,
+	0x4004D916,0x872B020C, 0x3FEEA66E,0xBE7320FC,
+	0x4004DB22,0xD0E56042, 0x3FEEA993,0x545471DB,
+	0x4004DD2F,0x1A9FBE77, 0x3FEEACB7,0x9B379693,
+	0x4004DF3B,0x645A1CAC, 0x3FEEAFDB,0x932C1064,
+	0x4004E147,0xAE147AE1, 0x3FEEB2FF,0x3C415BF9,
+	0x4004E353,0xF7CED917, 0x3FEEB622,0x9686F172,
+	0x4004E560,0x4189374C, 0x3FEEB945,0xA20C445D,
+	0x4004E76C,0x8B439581, 0x3FEEBC68,0x5EE0C3C2,
+	0x4004E978,0xD4FDF3B6, 0x3FEEBF8A,0xCD13DA1F,
+	0x4004EB85,0x1EB851EC, 0x3FEEC2AC,0xECB4ED6B,
+	0x4004ED91,0x6872B021, 0x3FEEC5CE,0xBDD35F13,
+	0x4004EF9D,0xB22D0E56, 0x3FEEC8F0,0x407E8C07,
+	0x4004F1A9,0xFBE76C8B, 0x3FEECC11,0x74C5CCB1,
+	0x4004F3B6,0x45A1CAC1, 0x3FEECF32,0x5AB874FE,
+	0x4004F5C2,0x8F5C28F6, 0x3FEED252,0xF265D457,
+	0x4004F7CE,0xD916872B, 0x3FEED573,0x3BDD35AC,
+	0x4004F9DB,0x22D0E560, 0x3FEED893,0x372DDF74,
+	0x4004FBE7,0x6C8B4396, 0x3FEEDBB2,0xE46713AA,
+	0x4004FDF3,0xB645A1CB, 0x3FEEDED2,0x43980FD0,
+	0x40050000,0x00000000, 0x3FEEE1F1,0x54D00CF6,
+	0x4005020C,0x49BA5E35, 0x3FEEE510,0x181E3FB7,
+	0x40050418,0x9374BC6A, 0x3FEEE82E,0x8D91D83A,
+	0x40050624,0xDD2F1AA0, 0x3FEEEB4C,0xB53A0239,
+	0x40050831,0x26E978D5, 0x3FEEEE6A,0x8F25E4FA,
+	0x40050A3D,0x70A3D70A, 0x3FEEF188,0x1B64A35A,
+	0x40050C49,0xBA5E353F, 0x3FEEF4A5,0x5A055BCB,
+	0x40050E56,0x04189375, 0x3FEEF7C2,0x4B172854,
+	0x40051062,0x4DD2F1AA, 0x3FEEFADE,0xEEA91E92,
+	0x4005126E,0x978D4FDF, 0x3FEEFDFB,0x44CA4FC1,
+	0x4005147A,0xE147AE14, 0x3FEF0117,0x4D89C8B3,
+	0x40051687,0x2B020C4A, 0x3FEF0433,0x08F691DD,
+	0x40051893,0x74BC6A7F, 0x3FEF074E,0x771FAF4D,
+	0x40051A9F,0xBE76C8B4, 0x3FEF0A69,0x981420B6,
+	0x40051CAC,0x083126E9, 0x3FEF0D84,0x6BE2E16B,
+	0x40051EB8,0x51EB851F, 0x3FEF109E,0xF29AE866,
+	0x400520C4,0x9BA5E354, 0x3FEF13B9,0x2C4B2842,
+	0x400522D0,0xE5604189, 0x3FEF16D3,0x19028F46,
+	0x400524DD,0x2F1A9FBE, 0x3FEF19EC,0xB8D0075F,
+	0x400526E9,0x78D4FDF4, 0x3FEF1D06,0x0BC27629,
+	0x400528F5,0xC28F5C29, 0x3FEF201F,0x11E8BCE5,
+	0x40052B02,0x0C49BA5E, 0x3FEF2337,0xCB51B88A,
+	0x40052D0E,0x56041893, 0x3FEF2650,0x380C41BA,
+	0x40052F1A,0x9FBE76C9, 0x3FEF2968,0x58272CCC,
+	0x40053126,0xE978D4FE, 0x3FEF2C80,0x2BB149C6,
+	0x40053333,0x33333333, 0x3FEF2F97,0xB2B96465,
+	0x4005353F,0x7CED9168, 0x3FEF32AE,0xED4E441E,
+	0x4005374B,0xC6A7EF9E, 0x3FEF35C5,0xDB7EAC1D,
+	0x40053958,0x10624DD3, 0x3FEF38DC,0x7D595B45,
+	0x40053B64,0x5A1CAC08, 0x3FEF3BF2,0xD2ED0C38,
+	0x40053D70,0xA3D70A3D, 0x3FEF3F08,0xDC487554,
+	0x40053F7C,0xED916873, 0x3FEF421E,0x997A48B7,
+	0x40054189,0x374BC6A8, 0x3FEF4534,0x0A91343C,
+	0x40054395,0x810624DD, 0x3FEF4849,0x2F9BE182,
+	0x400545A1,0xCAC08312, 0x3FEF4B5E,0x08A8F5EC,
+	0x400547AE,0x147AE148, 0x3FEF4E72,0x95C712A4,
+	0x400549BA,0x5E353F7D, 0x3FEF5186,0xD704D496,
+	0x40054BC6,0xA7EF9DB2, 0x3FEF549A,0xCC70D479,
+	0x40054DD2,0xF1A9FBE7, 0x3FEF57AE,0x7619A6D1,
+	0x40054FDF,0x3B645A1D, 0x3FEF5AC1,0xD40DDBEB,
+	0x400551EB,0x851EB852, 0x3FEF5DD4,0xE65BFFDF,
+	0x400553F7,0xCED91687, 0x3FEF60E7,0xAD129A99,
+	0x40055604,0x189374BC, 0x3FEF63FA,0x28402FD2,
+	0x40055810,0x624DD2F2, 0x3FEF670C,0x57F33F18,
+	0x40055A1C,0xAC083127, 0x3FEF6A1E,0x3C3A43C8,
+	0x40055C28,0xF5C28F5C, 0x3FEF6D2F,0xD523B51B,
+	0x40055E35,0x3F7CED91, 0x3FEF7041,0x22BE061B,
+	0x40056041,0x89374BC7, 0x3FEF7352,0x2517A5B0,
+	0x4005624D,0xD2F1A9FC, 0x3FEF7662,0xDC3EFE97,
+	0x4005645A,0x1CAC0831, 0x3FEF7973,0x4842776B,
+	0x40056666,0x66666666, 0x3FEF7C83,0x693072A6,
+	0x40056872,0xB020C49C, 0x3FEF7F93,0x3F174EA1,
+	0x40056A7E,0xF9DB22D1, 0x3FEF82A2,0xCA056590,
+	0x40056C8B,0x43958106, 0x3FEF85B2,0x0A090D90,
+	0x40056E97,0x8D4FDF3B, 0x3FEF88C0,0xFF30989E,
+	0x400570A3,0xD70A3D71, 0x3FEF8BCF,0xA98A549E,
+	0x400572B0,0x20C49BA6, 0x3FEF8EDE,0x09248B58,
+	0x400574BC,0x6A7EF9DB, 0x3FEF91EC,0x1E0D827F,
+	0x400576C8,0xB4395810, 0x3FEF94F9,0xE8537BAF,
+	0x400578D4,0xFDF3B646, 0x3FEF9807,0x6804B473,
+	0x40057AE1,0x47AE147B, 0x3FEF9B14,0x9D2F663B,
+	0x40057CED,0x916872B0, 0x3FEF9E21,0x87E1C66C,
+	0x40057EF9,0xDB22D0E5, 0x3FEFA12E,0x282A065B,
+	0x40058106,0x24DD2F1B, 0x3FEFA43A,0x7E16534D,
+	0x40058312,0x6E978D50, 0x3FEFA746,0x89B4D678,
+	0x4005851E,0xB851EB85, 0x3FEFAA52,0x4B13B50C,
+	0x4005872B,0x020C49BA, 0x3FEFAD5D,0xC241102C,
+	0x40058937,0x4BC6A7F0, 0x3FEFB068,0xEF4B04F4,
+	0x40058B43,0x95810625, 0x3FEFB373,0xD23FAC78,
+	0x40058D4F,0xDF3B645A, 0x3FEFB67E,0x6B2D1BC8,
+	0x40058F5C,0x28F5C28F, 0x3FEFB988,0xBA2163F0,
+	0x40059168,0x72B020C5, 0x3FEFBC92,0xBF2A91FD,
+	0x40059374,0xBC6A7EFA, 0x3FEFBF9C,0x7A56AEF6,
+	0x40059581,0x0624DD2F, 0x3FEFC2A5,0xEBB3BFE6,
+	0x4005978D,0x4FDF3B64, 0x3FEFC5AF,0x134FC5DC,
+	0x40059999,0x9999999A, 0x3FEFC8B7,0xF138BDEA,
+	0x40059BA5,0xE353F7CF, 0x3FEFCBC0,0x857CA125,
+	0x40059DB2,0x2D0E5604, 0x3FEFCEC8,0xD02964AB,
+	0x40059FBE,0x76C8B439, 0x3FEFD1D0,0xD14CF9A5,
+	0x4005A1CA,0xC083126F, 0x3FEFD4D8,0x88F54D43,
+	0x4005A3D7,0x0A3D70A4, 0x3FEFD7DF,0xF73048C1,
+	0x4005A5E3,0x53F7CED9, 0x3FEFDAE7,0x1C0BD168,
+	0x4005A7EF,0x9DB22D0E, 0x3FEFDDED,0xF795C891,
+	0x4005A9FB,0xE76C8B44, 0x3FEFE0F4,0x89DC0BA5,
+	0x4005AC08,0x3126E979, 0x3FEFE3FA,0xD2EC741B,
+	0x4005AE14,0x7AE147AE, 0x3FEFE700,0xD2D4D783,
+	0x4005B020,0xC49BA5E3, 0x3FEFEA06,0x89A3077C,
+	0x4005B22D,0x0E560419, 0x3FEFED0B,0xF764D1BF,
+	0x4005B439,0x5810624E, 0x3FEFF011,0x1C280019,
+	0x4005B645,0xA1CAC083, 0x3FEFF315,0xF7FA5873,
+	0x4005B851,0xEB851EB8, 0x3FEFF61A,0x8AE99CCE,
+	0x4005BA5E,0x353F7CEE, 0x3FEFF91E,0xD5038B4C,
+	0x4005BC6A,0x7EF9DB23, 0x3FEFFC22,0xD655DE23,
+	0x4005BE76,0xC8B43958, 0x3FEFFF26,0x8EEE4BB0,
+	0x4005C083,0x126E978D, 0x3FF00114,0xFF6D4337,
+	0x4005C28F,0x5C28F5C3, 0x3FF00296,0x93141E7C,
+	0x4005C49B,0xA5E353F8, 0x3FF00418,0x02728D08,
+	0x4005C6A7,0xEF9DB22D, 0x3FF00599,0x4D8F624B,
+	0x4005C8B4,0x39581062, 0x3FF0071A,0x74716FCC,
+	0x4005CAC0,0x83126E98, 0x3FF0089B,0x771F8524,
+	0x4005CCCC,0xCCCCCCCD, 0x3FF00A1C,0x55A06FFF,
+	0x4005CED9,0x16872B02, 0x3FF00B9D,0x0FFAFC21,
+	0x4005D0E5,0x60418937, 0x3FF00D1D,0xA635F361,
+	0x4005D2F1,0xA9FBE76D, 0x3FF00E9E,0x18581DB1,
+	0x4005D4FD,0xF3B645A2, 0x3FF0101E,0x66684116,
+	0x4005D70A,0x3D70A3D7, 0x3FF0119E,0x906D21AE,
+	0x4005D916,0x872B020C, 0x3FF0131E,0x966D81B1,
+	0x4005DB22,0xD0E56042, 0x3FF0149E,0x78702172,
+	0x4005DD2F,0x1A9FBE77, 0x3FF0161E,0x367BBF5A,
+	0x4005DF3B,0x645A1CAC, 0x3FF0179D,0xD09717F0,
+	0x4005E147,0xAE147AE1, 0x3FF0191D,0x46C8E5D6,
+	0x4005E353,0xF7CED917, 0x3FF01A9C,0x9917E1CC,
+	0x4005E560,0x4189374C, 0x3FF01C1B,0xC78AC2AA,
+	0x4005E76C,0x8B439581, 0x3FF01D9A,0xD2283D6B,
+	0x4005E978,0xD4FDF3B6, 0x3FF01F19,0xB8F70527,
+	0x4005EB85,0x1EB851EC, 0x3FF02098,0x7BFDCB15,
+	0x4005ED91,0x6872B021, 0x3FF02217,0x1B433E8B,
+	0x4005EF9D,0xB22D0E56, 0x3FF02395,0x96CE0CFF,
+	0x4005F1A9,0xFBE76C8B, 0x3FF02513,0xEEA4E20C,
+	0x4005F3B6,0x45A1CAC1, 0x3FF02692,0x22CE676C,
+	0x4005F5C2,0x8F5C28F6, 0x3FF02810,0x335144FB,
+	0x4005F7CE,0xD916872B, 0x3FF0298E,0x203420BB,
+	0x4005F9DB,0x22D0E560, 0x3FF02B0B,0xE97D9ED0,
+	0x4005FBE7,0x6C8B4396, 0x3FF02C89,0x8F346184,
+	0x4005FDF3,0xB645A1CB, 0x3FF02E07,0x115F0945,
+	0x40060000,0x00000000, 0x3FF02F84,0x700434A8,
+	0x4006020C,0x49BA5E35, 0x3FF03101,0xAB2A806A,
+	0x40060418,0x9374BC6A, 0x3FF0327E,0xC2D8876E,
+	0x40060624,0xDD2F1AA0, 0x3FF033FB,0xB714E2C1,
+	0x40060831,0x26E978D5, 0x3FF03578,0x87E62995,
+	0x40060A3D,0x70A3D70A, 0x3FF036F5,0x3552F149,
+	0x40060C49,0xBA5E353F, 0x3FF03871,0xBF61CD65,
+	0x40060E56,0x04189375, 0x3FF039EE,0x26194F9E,
+	0x40061062,0x4DD2F1AA, 0x3FF03B6A,0x698007D2,
+	0x4006126E,0x978D4FDF, 0x3FF03CE6,0x899C840C,
+	0x4006147A,0xE147AE14, 0x3FF03E62,0x86755083,
+	0x40061687,0x2B020C4A, 0x3FF03FDE,0x6010F7A0,
+	0x40061893,0x74BC6A7F, 0x3FF0415A,0x167601F5,
+	0x40061A9F,0xBE76C8B4, 0x3FF042D5,0xA9AAF645,
+	0x40061CAC,0x083126E9, 0x3FF04451,0x19B65984,
+	0x40061EB8,0x51EB851F, 0x3FF045CC,0x669EAED6,
+	0x400620C4,0x9BA5E354, 0x3FF04747,0x906A778D,
+	0x400622D0,0xE5604189, 0x3FF048C2,0x97203330,
+	0x400624DD,0x2F1A9FBE, 0x3FF04A3D,0x7AC65F77,
+	0x400626E9,0x78D4FDF4, 0x3FF04BB8,0x3B637850,
+	0x400628F5,0xC28F5C29, 0x3FF04D32,0xD8FDF7D6,
+	0x40062B02,0x0C49BA5E, 0x3FF04EAD,0x539C565E,
+	0x40062D0E,0x56041893, 0x3FF05027,0xAB450A72,
+	0x40062F1A,0x9FBE76C9, 0x3FF051A1,0xDFFE88CF,
+	0x40063126,0xE978D4FE, 0x3FF0531B,0xF1CF4468,
+	0x40063333,0x33333333, 0x3FF05495,0xE0BDAE6B,
+	0x4006353F,0x7CED9168, 0x3FF0560F,0xACD03639,
+	0x4006374B,0xC6A7EF9E, 0x3FF05789,0x560D496F,
+	0x40063958,0x10624DD3, 0x3FF05902,0xDC7B53E1,
+	0x40063B64,0x5A1CAC08, 0x3FF05A7C,0x4020BF9D,
+	0x40063D70,0xA3D70A3D, 0x3FF05BF5,0x8103F4EA,
+	0x40063F7C,0xED916873, 0x3FF05D6E,0x9F2B5A4F,
+	0x40064189,0x374BC6A8, 0x3FF05EE7,0x9A9D5486,
+	0x40064395,0x810624DD, 0x3FF06060,0x7360468E,
+	0x400645A1,0xCAC08312, 0x3FF061D9,0x297A919D,
+	0x400647AE,0x147AE148, 0x3FF06351,0xBCF2952A,
+	0x400649BA,0x5E353F7D, 0x3FF064CA,0x2DCEAEE7,
+	0x40064BC6,0xA7EF9DB2, 0x3FF06642,0x7C153AC7,
+	0x40064DD2,0xF1A9FBE7, 0x3FF067BA,0xA7CC92FD,
+	0x40064FDF,0x3B645A1D, 0x3FF06932,0xB0FB0FFB,
+	0x400651EB,0x851EB852, 0x3FF06AAA,0x97A70873,
+	0x400653F7,0xCED91687, 0x3FF06C22,0x5BD6D15A,
+	0x40065604,0x189374BC, 0x3FF06D99,0xFD90BDE6,
+	0x40065810,0x624DD2F2, 0x3FF06F11,0x7CDB1F91,
+	0x40065A1C,0xAC083127, 0x3FF07088,0xD9BC4616,
+	0x40065C28,0xF5C28F5C, 0x3FF07200,0x143A7F76,
+	0x40065E35,0x3F7CED91, 0x3FF07377,0x2C5C17F6,
+	0x40066041,0x89374BC7, 0x3FF074EE,0x22275A21,
+	0x4006624D,0xD2F1A9FC, 0x3FF07664,0xF5A28EC5,
+	0x4006645A,0x1CAC0831, 0x3FF077DB,0xA6D3FCF9,
+	0x40066666,0x66666666, 0x3FF07952,0x35C1EA1B,
+	0x40066872,0xB020C49C, 0x3FF07AC8,0xA27299D2,
+	0x40066A7E,0xF9DB22D1, 0x3FF07C3E,0xECEC4E08,
+	0x40066C8B,0x43958106, 0x3FF07DB5,0x153546F7,
+	0x40066E97,0x8D4FDF3B, 0x3FF07F2B,0x1B53C31E,
+	0x400670A3,0xD70A3D71, 0x3FF080A0,0xFF4DFF48,
+	0x400672B0,0x20C49BA6, 0x3FF08216,0xC12A368A,
+	0x400674BC,0x6A7EF9DB, 0x3FF0838C,0x60EEA245,
+	0x400676C8,0xB4395810, 0x3FF08501,0xDEA17A27,
+	0x400678D4,0xFDF3B646, 0x3FF08677,0x3A48F42A,
+	0x40067AE1,0x47AE147B, 0x3FF087EC,0x73EB4494,
+	0x40067CED,0x916872B0, 0x3FF08961,0x8B8E9DFA,
+	0x40067EF9,0xDB22D0E5, 0x3FF08AD6,0x81393141,
+	0x40068106,0x24DD2F1B, 0x3FF08C4B,0x54F12D9D,
+	0x40068312,0x6E978D50, 0x3FF08DC0,0x06BCC08E,
+	0x4006851E,0xB851EB85, 0x3FF08F34,0x96A215E9,
+	0x4006872B,0x020C49BA, 0x3FF090A9,0x04A757D3,
+	0x40068937,0x4BC6A7F0, 0x3FF0921D,0x50D2AEC2,
+	0x40068B43,0x95810625, 0x3FF09391,0x7B2A417C,
+	0x40068D4F,0xDF3B645A, 0x3FF09505,0x83B4351F,
+	0x40068F5C,0x28F5C28F, 0x3FF09679,0x6A76AD19,
+	0x40069168,0x72B020C5, 0x3FF097ED,0x2F77CB2C,
+	0x40069374,0xBC6A7EFA, 0x3FF09960,0xD2BDAF71,
+	0x40069581,0x0624DD2F, 0x3FF09AD4,0x544E7853,
+	0x4006978D,0x4FDF3B64, 0x3FF09C47,0xB4304297,
+	0x40069999,0x9999999A, 0x3FF09DBA,0xF2692955,
+	0x40069BA5,0xE353F7CF, 0x3FF09F2E,0x0EFF45FD,
+	0x40069DB2,0x2D0E5604, 0x3FF0A0A1,0x09F8B059,
+	0x40069FBE,0x76C8B439, 0x3FF0A213,0xE35B7E88,
+	0x4006A1CA,0xC083126F, 0x3FF0A386,0x9B2DC505,
+	0x4006A3D7,0x0A3D70A4, 0x3FF0A4F9,0x317596A2,
+	0x4006A5E3,0x53F7CED9, 0x3FF0A66B,0xA639048C,
+	0x4006A7EF,0x9DB22D0E, 0x3FF0A7DD,0xF97E1E4B,
+	0x4006A9FB,0xE76C8B44, 0x3FF0A950,0x2B4AF1C3,
+	0x4006AC08,0x3126E979, 0x3FF0AAC2,0x3BA58B32,
+	0x4006AE14,0x7AE147AE, 0x3FF0AC34,0x2A93F534,
+	0x4006B020,0xC49BA5E3, 0x3FF0ADA5,0xF81C38C2,
+	0x4006B22D,0x0E560419, 0x3FF0AF17,0xA4445D33,
+	0x4006B439,0x5810624E, 0x3FF0B089,0x2F12683B,
+	0x4006B645,0xA1CAC083, 0x3FF0B1FA,0x988C5DED,
+	0x4006B851,0xEB851EB8, 0x3FF0B36B,0xE0B840BD,
+	0x4006BA5E,0x353F7CEE, 0x3FF0B4DD,0x079C117E,
+	0x4006BC6A,0x7EF9DB23, 0x3FF0B64E,0x0D3DCF63,
+	0x4006BE76,0xC8B43958, 0x3FF0B7BE,0xF1A37801,
+	0x4006C083,0x126E978D, 0x3FF0B92F,0xB4D3074F,
+	0x4006C28F,0x5C28F5C3, 0x3FF0BAA0,0x56D277A7,
+	0x4006C49B,0xA5E353F8, 0x3FF0BC10,0xD7A7C1C3,
+	0x4006C6A7,0xEF9DB22D, 0x3FF0BD81,0x3758DCC4,
+	0x4006C8B4,0x39581062, 0x3FF0BEF1,0x75EBBE2E,
+	0x4006CAC0,0x83126E98, 0x3FF0C061,0x936659E8,
+	0x4006CCCC,0xCCCCCCCD, 0x3FF0C1D1,0x8FCEA241,
+	0x4006CED9,0x16872B02, 0x3FF0C341,0x6B2A87EB,
+	0x4006D0E5,0x60418937, 0x3FF0C4B1,0x257FFA02,
+	0x4006D2F1,0xA9FBE76D, 0x3FF0C620,0xBED4E606,
+	0x4006D4FD,0xF3B645A2, 0x3FF0C790,0x372F37DE,
+	0x4006D70A,0x3D70A3D7, 0x3FF0C8FF,0x8E94D9DD,
+	0x4006D916,0x872B020C, 0x3FF0CA6E,0xC50BB4BB,
+	0x4006DB22,0xD0E56042, 0x3FF0CBDD,0xDA99AF9C,
+	0x4006DD2F,0x1A9FBE77, 0x3FF0CD4C,0xCF44B00B,
+	0x4006DF3B,0x645A1CAC, 0x3FF0CEBB,0xA31299FF,
+	0x4006E147,0xAE147AE1, 0x3FF0D02A,0x56094FDB,
+	0x4006E353,0xF7CED917, 0x3FF0D198,0xE82EB26C,
+	0x4006E560,0x4189374C, 0x3FF0D307,0x5988A0EC,
+	0x4006E76C,0x8B439581, 0x3FF0D475,0xAA1CF900,
+	0x4006E978,0xD4FDF3B6, 0x3FF0D5E3,0xD9F196BD,
+	0x4006EB85,0x1EB851EC, 0x3FF0D751,0xE90C54A5,
+	0x4006ED91,0x6872B021, 0x3FF0D8BF,0xD7730BA6,
+	0x4006EF9D,0xB22D0E56, 0x3FF0DA2D,0xA52B931F,
+	0x4006F1A9,0xFBE76C8B, 0x3FF0DB9B,0x523BC0DF,
+	0x4006F3B6,0x45A1CAC1, 0x3FF0DD08,0xDEA96924,
+	0x4006F5C2,0x8F5C28F6, 0x3FF0DE76,0x4A7A5E9D,
+	0x4006F7CE,0xD916872B, 0x3FF0DFE3,0x95B47269,
+	0x4006F9DB,0x22D0E560, 0x3FF0E150,0xC05D741B,
+	0x4006FBE7,0x6C8B4396, 0x3FF0E2BD,0xCA7B31B7,
+	0x4006FDF3,0xB645A1CB, 0x3FF0E42A,0xB41377B3,
+	0x40070000,0x00000000, 0x3FF0E597,0x7D2C10F9,
+	0x4007020C,0x49BA5E35, 0x3FF0E704,0x25CAC6E9,
+	0x40070418,0x9374BC6A, 0x3FF0E870,0xADF56154,
+	0x40070624,0xDD2F1AA0, 0x3FF0E9DD,0x15B1A683,
+	0x40070831,0x26E978D5, 0x3FF0EB49,0x5D055B32,
+	0x40070A3D,0x70A3D70A, 0x3FF0ECB5,0x83F64295,
+	0x40070C49,0xBA5E353F, 0x3FF0EE21,0x8A8A1E56,
+	0x40070E56,0x04189375, 0x3FF0EF8D,0x70C6AE98,
+	0x40071062,0x4DD2F1AA, 0x3FF0F0F9,0x36B1B1F1,
+	0x4007126E,0x978D4FDF, 0x3FF0F264,0xDC50E575,
+	0x4007147A,0xE147AE14, 0x3FF0F3D0,0x61AA04AD,
+	0x40071687,0x2B020C4A, 0x3FF0F53B,0xC6C2C99E,
+	0x40071893,0x74BC6A7F, 0x3FF0F6A7,0x0BA0ECC4,
+	0x40071A9F,0xBE76C8B4, 0x3FF0F812,0x304A2517,
+	0x40071CAC,0x083126E9, 0x3FF0F97D,0x34C4280C,
+	0x40071EB8,0x51EB851F, 0x3FF0FAE8,0x1914A991,
+	0x400720C4,0x9BA5E354, 0x3FF0FC52,0xDD415C10,
+	0x400722D0,0xE5604189, 0x3FF0FDBD,0x814FF072,
+	0x400724DD,0x2F1A9FBE, 0x3FF0FF28,0x05461619,
+	0x400726E9,0x78D4FDF4, 0x3FF10092,0x69297AEB,
+	0x400728F5,0xC28F5C29, 0x3FF101FC,0xACFFCB45,
+	0x40072B02,0x0C49BA5E, 0x3FF10366,0xD0CEB208,
+	0x40072D0E,0x56041893, 0x3FF104D0,0xD49BD892,
+	0x40072F1A,0x9FBE76C9, 0x3FF1063A,0xB86CE6C3,
+	0x40073126,0xE978D4FE, 0x3FF107A4,0x7C4782F9,
+	0x40073333,0x33333333, 0x3FF1090E,0x20315212,
+	0x4007353F,0x7CED9168, 0x3FF10A77,0xA42FF772,
+	0x4007374B,0xC6A7EF9E, 0x3FF10BE1,0x084914FB,
+	0x40073958,0x10624DD3, 0x3FF10D4A,0x4C824B11,
+	0x40073B64,0x5A1CAC08, 0x3FF10EB3,0x70E1389F,
+	0x40073D70,0xA3D70A3D, 0x3FF1101C,0x756B7B10,
+	0x40073F7C,0xED916873, 0x3FF11185,0x5A26AE55,
+	0x40074189,0x374BC6A8, 0x3FF112EE,0x1F186CE1,
+	0x40074395,0x810624DD, 0x3FF11456,0xC4464FAF,
+	0x400745A1,0xCAC08312, 0x3FF115BF,0x49B5EE3E,
+	0x400747AE,0x147AE148, 0x3FF11727,0xAF6CDE95,
+	0x400749BA,0x5E353F7D, 0x3FF1188F,0xF570B53E,
+	0x40074BC6,0xA7EF9DB2, 0x3FF119F8,0x1BC7054E,
+	0x40074DD2,0xF1A9FBE7, 0x3FF11B60,0x22756060,
+	0x40074FDF,0x3B645A1D, 0x3FF11CC8,0x09815697,
+	0x400751EB,0x851EB852, 0x3FF11E2F,0xD0F0769F,
+	0x400753F7,0xCED91687, 0x3FF11F97,0x78C84DAE,
+	0x40075604,0x189374BC, 0x3FF120FF,0x010E6781,
+	0x40075810,0x624DD2F2, 0x3FF12266,0x69C84E65,
+	0x40075A1C,0xAC083127, 0x3FF123CD,0xB2FB8B2A,
+	0x40075C28,0xF5C28F5C, 0x3FF12534,0xDCADA532,
+	0x40075E35,0x3F7CED91, 0x3FF1269B,0xE6E42267,
+	0x40076041,0x89374BC7, 0x3FF12802,0xD1A48742,
+	0x4007624D,0xD2F1A9FC, 0x3FF12969,0x9CF456C5,
+	0x4007645A,0x1CAC0831, 0x3FF12AD0,0x48D91284,
+	0x40076666,0x66666666, 0x3FF12C36,0xD5583A9D,
+	0x40076872,0xB020C49C, 0x3FF12D9D,0x42774DBE,
+	0x40076A7E,0xF9DB22D1, 0x3FF12F03,0x903BC924,
+	0x40076C8B,0x43958106, 0x3FF13069,0xBEAB289B,
+	0x40076E97,0x8D4FDF3B, 0x3FF131CF,0xCDCAE67F,
+	0x400770A3,0xD70A3D71, 0x3FF13335,0xBDA07BBD,
+	0x400772B0,0x20C49BA6, 0x3FF1349B,0x8E315FD0,
+	0x400774BC,0x6A7EF9DB, 0x3FF13601,0x3F8308C7,
+	0x400776C8,0xB4395810, 0x3FF13766,0xD19AEB43,
+	0x400778D4,0xFDF3B646, 0x3FF138CC,0x447E7A78,
+	0x40077AE1,0x47AE147B, 0x3FF13A31,0x98332829,
+	0x40077CED,0x916872B0, 0x3FF13B96,0xCCBE64B0,
+	0x40077EF9,0xDB22D0E5, 0x3FF13CFB,0xE2259EFA,
+	0x40078106,0x24DD2F1B, 0x3FF13E60,0xD86E4488,
+	0x40078312,0x6E978D50, 0x3FF13FC5,0xAF9DC16F,
+	0x4007851E,0xB851EB85, 0x3FF1412A,0x67B9805B,
+	0x4007872B,0x020C49BA, 0x3FF1428F,0x00C6EA8D,
+	0x40078937,0x4BC6A7F0, 0x3FF143F3,0x7ACB67DD,
+	0x40078B43,0x95810625, 0x3FF14557,0xD5CC5EB8,
+	0x40078D4F,0xDF3B645A, 0x3FF146BC,0x11CF3424,
+	0x40078F5C,0x28F5C28F, 0x3FF14820,0x2ED94BBF,
+	0x40079168,0x72B020C5, 0x3FF14984,0x2CF007BE,
+	0x40079374,0xBC6A7EFA, 0x3FF14AE8,0x0C18C8F0,
+	0x40079581,0x0624DD2F, 0x3FF14C4B,0xCC58EEBB,
+	0x4007978D,0x4FDF3B64, 0x3FF14DAF,0x6DB5D722,
+	0x40079999,0x9999999A, 0x3FF14F12,0xF034DEC0,
+	0x40079BA5,0xE353F7CF, 0x3FF15076,0x53DB60CC,
+	0x40079DB2,0x2D0E5604, 0x3FF151D9,0x98AEB716,
+	0x40079FBE,0x76C8B439, 0x3FF1533C,0xBEB43A0D,
+	0x4007A1CA,0xC083126F, 0x3FF1549F,0xC5F140B9,
+	0x4007A3D7,0x0A3D70A4, 0x3FF15602,0xAE6B20C1,
+	0x4007A5E3,0x53F7CED9, 0x3FF15765,0x78272E68,
+	0x4007A7EF,0x9DB22D0E, 0x3FF158C8,0x232ABC8D,
+	0x4007A9FB,0xE76C8B44, 0x3FF15A2A,0xAF7B1CB3,
+	0x4007AC08,0x3126E979, 0x3FF15B8D,0x1D1D9EF3,
+	0x4007AE14,0x7AE147AE, 0x3FF15CEF,0x6C17920B,
+	0x4007B020,0xC49BA5E3, 0x3FF15E51,0x9C6E4358,
+	0x4007B22D,0x0E560419, 0x3FF15FB3,0xAE26FED6,
+	0x4007B439,0x5810624E, 0x3FF16115,0xA1470F20,
+	0x4007B645,0xA1CAC083, 0x3FF16277,0x75D3BD74,
+	0x4007B851,0xEB851EB8, 0x3FF163D9,0x2BD251B1,
+	0x4007BA5E,0x353F7CEE, 0x3FF1653A,0xC3481258,
+	0x4007BC6A,0x7EF9DB23, 0x3FF1669C,0x3C3A448C,
+	0x4007BE76,0xC8B43958, 0x3FF167FD,0x96AE2C12,
+	0x4007C083,0x126E978D, 0x3FF1695E,0xD2A90B55,
+	0x4007C28F,0x5C28F5C3, 0x3FF16ABF,0xF0302361,
+	0x4007C49B,0xA5E353F8, 0x3FF16C20,0xEF48B3E8,
+	0x4007C6A7,0xEF9DB22D, 0x3FF16D81,0xCFF7FB3E,
+	0x4007C8B4,0x39581062, 0x3FF16EE2,0x92433660,
+	0x4007CAC0,0x83126E98, 0x3FF17043,0x362FA0EF,
+	0x4007CCCC,0xCCCCCCCD, 0x3FF171A3,0xBBC27531,
+	0x4007CED9,0x16872B02, 0x3FF17304,0x2300EC13,
+	0x4007D0E5,0x60418937, 0x3FF17464,0x6BF03D2B,
+	0x4007D2F1,0xA9FBE76D, 0x3FF175C4,0x96959EB5,
+	0x4007D4FD,0xF3B645A2, 0x3FF17724,0xA2F64594,
+	0x4007D70A,0x3D70A3D7, 0x3FF17884,0x91176555,
+	0x4007D916,0x872B020C, 0x3FF179E4,0x60FE302E,
+	0x4007DB22,0xD0E56042, 0x3FF17B44,0x12AFD6FD,
+	0x4007DD2F,0x1A9FBE77, 0x3FF17CA3,0xA631894A,
+	0x4007DF3B,0x645A1CAC, 0x3FF17E03,0x1B887548,
+	0x4007E147,0xAE147AE1, 0x3FF17F62,0x72B9C7D5,
+	0x4007E353,0xF7CED917, 0x3FF180C1,0xABCAAC7B,
+	0x4007E560,0x4189374C, 0x3FF18220,0xC6C04D6C,
+	0x4007E76C,0x8B439581, 0x3FF1837F,0xC39FD38A,
+	0x4007E978,0xD4FDF3B6, 0x3FF184DE,0xA26E6661,
+	0x4007EB85,0x1EB851EC, 0x3FF1863D,0x63312C2C,
+	0x4007ED91,0x6872B021, 0x3FF1879C,0x05ED49D2,
+	0x4007EF9D,0xB22D0E56, 0x3FF188FA,0x8AA7E2E8,
+	0x4007F1A9,0xFBE76C8B, 0x3FF18A58,0xF16619B3,
+	0x4007F3B6,0x45A1CAC1, 0x3FF18BB7,0x3A2D0F25,
+	0x4007F5C2,0x8F5C28F6, 0x3FF18D15,0x6501E2DF,
+	0x4007F7CE,0xD916872B, 0x3FF18E73,0x71E9B333,
+	0x4007F9DB,0x22D0E560, 0x3FF18FD1,0x60E99D24,
+	0x4007FBE7,0x6C8B4396, 0x3FF1912F,0x3206BC63,
+	0x4007FDF3,0xB645A1CB, 0x3FF1928C,0xE5462B53,
+	0x40080000,0x00000000, 0x3FF193EA,0x7AAD030B,
+	0x4008020C,0x49BA5E35, 0x3FF19547,0xF2405B4F,
+	0x40080418,0x9374BC6A, 0x3FF196A5,0x4C054A9B,
+	0x40080624,0xDD2F1AA0, 0x3FF19802,0x8800E61A,
+	0x40080831,0x26E978D5, 0x3FF1995F,0xA63841AC,
+	0x40080A3D,0x70A3D70A, 0x3FF19ABC,0xA6B06FE2,
+	0x40080C49,0xBA5E353F, 0x3FF19C19,0x896E8206,
+	0x40080E56,0x04189375, 0x3FF19D76,0x4E778813,
+	0x40081062,0x4DD2F1AA, 0x3FF19ED2,0xF5D090B9,
+	0x4008126E,0x978D4FDF, 0x3FF1A02F,0x7F7EA960,
+	0x4008147A,0xE147AE14, 0x3FF1A18B,0xEB86DE23,
+	0x40081687,0x2B020C4A, 0x3FF1A2E8,0x39EE39D7,
+	0x40081893,0x74BC6A7F, 0x3FF1A444,0x6AB9C603,
+	0x40081A9F,0xBE76C8B4, 0x3FF1A5A0,0x7DEE8AE9,
+	0x40081CAC,0x083126E9, 0x3FF1A6FC,0x73918F81,
+	0x40081EB8,0x51EB851F, 0x3FF1A858,0x4BA7D97D,
+	0x400820C4,0x9BA5E354, 0x3FF1A9B4,0x06366D45,
+	0x400822D0,0xE5604189, 0x3FF1AB0F,0xA3424DFC,
+	0x400824DD,0x2F1A9FBE, 0x3FF1AC6B,0x22D07D7D,
+	0x400826E9,0x78D4FDF4, 0x3FF1ADC6,0x84E5FC5E,
+	0x400828F5,0xC28F5C29, 0x3FF1AF21,0xC987C9EE,
+	0x40082B02,0x0C49BA5E, 0x3FF1B07C,0xF0BAE438,
+	0x40082D0E,0x56041893, 0x3FF1B1D7,0xFA844801,
+	0x40082F1A,0x9FBE76C9, 0x3FF1B332,0xE6E8F0CC,
+	0x40083126,0xE978D4FE, 0x3FF1B48D,0xB5EDD8D4,
+	0x40083333,0x33333333, 0x3FF1B5E8,0x6797F915,
+	0x4008353F,0x7CED9168, 0x3FF1B742,0xFBEC4943,
+	0x4008374B,0xC6A7EF9E, 0x3FF1B89D,0x72EFBFD4,
+	0x40083958,0x10624DD3, 0x3FF1B9F7,0xCCA751F8,
+	0x40083B64,0x5A1CAC08, 0x3FF1BB52,0x0917F39F,
+	0x40083D70,0xA3D70A3D, 0x3FF1BCAC,0x28469777,
+	0x40083F7C,0xED916873, 0x3FF1BE06,0x2A382EEF,
+	0x40084189,0x374BC6A8, 0x3FF1BF60,0x0EF1AA32,
+	0x40084395,0x810624DD, 0x3FF1C0B9,0xD677F82D,
+	0x400845A1,0xCAC08312, 0x3FF1C213,0x80D0068C,
+	0x400847AE,0x147AE148, 0x3FF1C36D,0x0DFEC1BE,
+	0x400849BA,0x5E353F7D, 0x3FF1C4C6,0x7E0914F0,
+	0x40084BC6,0xA7EF9DB2, 0x3FF1C61F,0xD0F3EA13,
+	0x40084DD2,0xF1A9FBE7, 0x3FF1C779,0x06C429D9,
+	0x40084FDF,0x3B645A1D, 0x3FF1C8D2,0x1F7EBBB6,
+	0x400851EB,0x851EB852, 0x3FF1CA2B,0x1B2885E1,
+	0x400853F7,0xCED91687, 0x3FF1CB83,0xF9C66D55,
+	0x40085604,0x189374BC, 0x3FF1CCDC,0xBB5D55CF,
+	0x40085810,0x624DD2F2, 0x3FF1CE35,0x5FF221D3,
+	0x40085A1C,0xAC083127, 0x3FF1CF8D,0xE789B2A5,
+	0x40085C28,0xF5C28F5C, 0x3FF1D0E6,0x5228E852,
+	0x40085E35,0x3F7CED91, 0x3FF1D23E,0x9FD4A1A9,
+	0x40086041,0x89374BC7, 0x3FF1D396,0xD091BC42,
+	0x4008624D,0xD2F1A9FC, 0x3FF1D4EE,0xE4651479,
+	0x4008645A,0x1CAC0831, 0x3FF1D646,0xDB538570,
+	0x40086666,0x66666666, 0x3FF1D79E,0xB561E911,
+	0x40086872,0xB020C49C, 0x3FF1D8F6,0x7295180E,
+	0x40086A7E,0xF9DB22D1, 0x3FF1DA4E,0x12F1E9DF,
+	0x40086C8B,0x43958106, 0x3FF1DBA5,0x967D34C5,
+	0x40086E97,0x8D4FDF3B, 0x3FF1DCFC,0xFD3BCDCA,
+	0x400870A3,0xD70A3D71, 0x3FF1DE54,0x473288C1,
+	0x400872B0,0x20C49BA6, 0x3FF1DFAB,0x74663845,
+	0x400874BC,0x6A7EF9DB, 0x3FF1E102,0x84DBADBD,
+	0x400876C8,0xB4395810, 0x3FF1E259,0x7897B957,
+	0x400878D4,0xFDF3B646, 0x3FF1E3B0,0x4F9F2A0F,
+	0x40087AE1,0x47AE147B, 0x3FF1E507,0x09F6CDAA,
+	0x40087CED,0x916872B0, 0x3FF1E65D,0xA7A370B9,
+	0x40087EF9,0xDB22D0E5, 0x3FF1E7B4,0x28A9DE99,
+	0x40088106,0x24DD2F1B, 0x3FF1E90A,0x8D0EE173,
+	0x40088312,0x6E978D50, 0x3FF1EA60,0xD4D7423B,
+	0x4008851E,0xB851EB85, 0x3FF1EBB7,0x0007C8B5,
+	0x4008872B,0x020C49BA, 0x3FF1ED0D,0x0EA53B71,
+	0x40088937,0x4BC6A7F0, 0x3FF1EE63,0x00B45FCD,
+	0x40088B43,0x95810625, 0x3FF1EFB8,0xD639F9F3,
+	0x40088D4F,0xDF3B645A, 0x3FF1F10E,0x8F3ACCDF,
+	0x40088F5C,0x28F5C28F, 0x3FF1F264,0x2BBB9A5B,
+	0x40089168,0x72B020C5, 0x3FF1F3B9,0xABC12300,
+	0x40089374,0xBC6A7EFA, 0x3FF1F50F,0x0F502636,
+	0x40089581,0x0624DD2F, 0x3FF1F664,0x566D6236,
+	0x4008978D,0x4FDF3B64, 0x3FF1F7B9,0x811D9409,
+	0x40089999,0x9999999A, 0x3FF1F90E,0x8F65778C,
+	0x40089BA5,0xE353F7CF, 0x3FF1FA63,0x8149C768,
+	0x40089DB2,0x2D0E5604, 0x3FF1FBB8,0x56CF3D1D,
+	0x40089FBE,0x76C8B439, 0x3FF1FD0D,0x0FFA90FA,
+	0x4008A1CA,0xC083126F, 0x3FF1FE61,0xACD07A21,
+	0x4008A3D7,0x0A3D70A4, 0x3FF1FFB6,0x2D55AE88,
+	0x4008A5E3,0x53F7CED9, 0x3FF2010A,0x918EE2F7,
+	0x4008A7EF,0x9DB22D0E, 0x3FF2025E,0xD980CB0C,
+	0x4008A9FB,0xE76C8B44, 0x3FF203B3,0x05301937,
+	0x4008AC08,0x3126E979, 0x3FF20507,0x14A17EBC,
+	0x4008AE14,0x7AE147AE, 0x3FF2065B,0x07D9ABB5,
+	0x4008B020,0xC49BA5E3, 0x3FF207AE,0xDEDD4F13,
+	0x4008B22D,0x0E560419, 0x3FF20902,0x99B1169A,
+	0x4008B439,0x5810624E, 0x3FF20A56,0x3859AEE5,
+	0x4008B645,0xA1CAC083, 0x3FF20BA9,0xBADBC366,
+	0x4008B851,0xEB851EB8, 0x3FF20CFD,0x213BFE64,
+	0x4008BA5E,0x353F7CEE, 0x3FF20E50,0x6B7F0900,
+	0x4008BC6A,0x7EF9DB23, 0x3FF20FA3,0x99A98B30,
+	0x4008BE76,0xC8B43958, 0x3FF210F6,0xABC02BC4,
+	0x4008C083,0x126E978D, 0x3FF21249,0xA1C79063,
+	0x4008C28F,0x5C28F5C3, 0x3FF2139C,0x7BC45D8E,
+	0x4008C49B,0xA5E353F8, 0x3FF214EF,0x39BB369D,
+	0x4008C6A7,0xEF9DB22D, 0x3FF21641,0xDBB0BDC4,
+	0x4008C8B4,0x39581062, 0x3FF21794,0x61A9940F,
+	0x4008CAC0,0x83126E98, 0x3FF218E6,0xCBAA5966,
+	0x4008CCCC,0xCCCCCCCD, 0x3FF21A39,0x19B7AC89,
+	0x4008CED9,0x16872B02, 0x3FF21B8B,0x4BD62B16,
+	0x4008D0E5,0x60418937, 0x3FF21CDD,0x620A7185,
+	0x4008D2F1,0xA9FBE76D, 0x3FF21E2F,0x5C591B2A,
+	0x4008D4FD,0xF3B645A2, 0x3FF21F81,0x3AC6C235,
+	0x4008D70A,0x3D70A3D7, 0x3FF220D2,0xFD57FFB2,
+	0x4008D916,0x872B020C, 0x3FF22224,0xA4116B8B,
+	0x4008DB22,0xD0E56042, 0x3FF22376,0x2EF79C88,
+	0x4008DD2F,0x1A9FBE77, 0x3FF224C7,0x9E0F284B,
+	0x4008DF3B,0x645A1CAC, 0x3FF22618,0xF15CA357,
+	0x4008E147,0xAE147AE1, 0x3FF2276A,0x28E4A10F,
+	0x4008E353,0xF7CED917, 0x3FF228BB,0x44ABB3B1,
+	0x4008E560,0x4189374C, 0x3FF22A0C,0x44B66C5C,
+	0x4008E76C,0x8B439581, 0x3FF22B5D,0x29095B0E,
+	0x4008E978,0xD4FDF3B6, 0x3FF22CAD,0xF1A90EA6,
+	0x4008EB85,0x1EB851EC, 0x3FF22DFE,0x9E9A14E3,
+	0x4008ED91,0x6872B021, 0x3FF22F4F,0x2FE0FA63,
+	0x4008EF9D,0xB22D0E56, 0x3FF2309F,0xA5824AA6,
+	0x4008F1A9,0xFBE76C8B, 0x3FF231EF,0xFF82900E,
+	0x4008F3B6,0x45A1CAC1, 0x3FF23340,0x3DE653DF,
+	0x4008F5C2,0x8F5C28F6, 0x3FF23490,0x60B21E3E,
+	0x4008F7CE,0xD916872B, 0x3FF235E0,0x67EA7631,
+	0x4008F9DB,0x22D0E560, 0x3FF23730,0x5393E1A5,
+	0x4008FBE7,0x6C8B4396, 0x3FF23880,0x23B2E568,
+	0x4008FDF3,0xB645A1CB, 0x3FF239CF,0xD84C052A,
+	0x40090000,0x00000000, 0x3FF23B1F,0x7163C380,
+	0x4009020C,0x49BA5E35, 0x3FF23C6E,0xEEFEA1E5,
+	0x40090418,0x9374BC6A, 0x3FF23DBE,0x512120B7,
+	0x40090624,0xDD2F1AA0, 0x3FF23F0D,0x97CFBF3A,
+	0x40090831,0x26E978D5, 0x3FF2405C,0xC30EFB95,
+	0x40090A3D,0x70A3D70A, 0x3FF241AB,0xD2E352D7,
+	0x40090C49,0xBA5E353F, 0x3FF242FA,0xC75140F5,
+	0x40090E56,0x04189375, 0x3FF24449,0xA05D40CC,
+	0x40091062,0x4DD2F1AA, 0x3FF24598,0x5E0BCC1A,
+	0x4009126E,0x978D4FDF, 0x3FF246E7,0x00615B8A,
+	0x4009147A,0xE147AE14, 0x3FF24835,0x876266AD,
+	0x40091687,0x2B020C4A, 0x3FF24983,0xF31363FB,
+	0x40091893,0x74BC6A7F, 0x3FF24AD2,0x4378C8D5,
+	0x40091A9F,0xBE76C8B4, 0x3FF24C20,0x78970984,
+	0x40091CAC,0x083126E9, 0x3FF24D6E,0x9272993A,
+	0x40091EB8,0x51EB851F, 0x3FF24EBC,0x910FEA13,
+	0x400920C4,0x9BA5E354, 0x3FF2500A,0x74736D15,
+	0x400922D0,0xE5604189, 0x3FF25158,0x3CA1922E,
+	0x400924DD,0x2F1A9FBE, 0x3FF252A5,0xE99EC839,
+	0x400926E9,0x78D4FDF4, 0x3FF253F3,0x7B6F7CFA,
+	0x400928F5,0xC28F5C29, 0x3FF25540,0xF2181D20,
+	0x40092B02,0x0C49BA5E, 0x3FF2568E,0x4D9D1447,
+	0x40092D0E,0x56041893, 0x3FF257DB,0x8E02CCF5,
+	0x40092F1A,0x9FBE76C9, 0x3FF25928,0xB34DB09F,
+	0x40093126,0xE978D4FE, 0x3FF25A75,0xBD8227A1,
+	0x40093333,0x33333333, 0x3FF25BC2,0xACA4994A,
+	0x4009353F,0x7CED9168, 0x3FF25D0F,0x80B96BD2,
+	0x4009374B,0xC6A7EF9E, 0x3FF25E5C,0x39C50462,
+	0x40093958,0x10624DD3, 0x3FF25FA8,0xD7CBC70C,
+	0x40093B64,0x5A1CAC08, 0x3FF260F5,0x5AD216D6,
+	0x40093D70,0xA3D70A3D, 0x3FF26241,0xC2DC55B0,
+	0x40093F7C,0xED916873, 0x3FF2638E,0x0FEEE47C,
+	0x40094189,0x374BC6A8, 0x3FF264DA,0x420E2309,
+	0x40094395,0x810624DD, 0x3FF26626,0x593E7017,
+	0x400945A1,0xCAC08312, 0x3FF26772,0x55842956,
+	0x400947AE,0x147AE148, 0x3FF268BE,0x36E3AB65,
+	0x400949BA,0x5E353F7D, 0x3FF26A09,0xFD6151D6,
+	0x40094BC6,0xA7EF9DB2, 0x3FF26B55,0xA9017729,
+	0x40094DD2,0xF1A9FBE7, 0x3FF26CA1,0x39C874D1,
+	0x40094FDF,0x3B645A1D, 0x3FF26DEC,0xAFBAA335,
+	0x400951EB,0x851EB852, 0x3FF26F38,0x0ADC59A8,
+	0x400953F7,0xCED91687, 0x3FF27083,0x4B31EE76,
+	0x40095604,0x189374BC, 0x3FF271CE,0x70BFB6D9,
+	0x40095810,0x624DD2F2, 0x3FF27319,0x7B8A0702,
+	0x40095A1C,0xAC083127, 0x3FF27464,0x6B953210,
+	0x40095C28,0xF5C28F5C, 0x3FF275AF,0x40E58A1B,
+	0x40095E35,0x3F7CED91, 0x3FF276F9,0xFB7F602D,
+	0x40096041,0x89374BC7, 0x3FF27844,0x9B670444,
+	0x4009624D,0xD2F1A9FC, 0x3FF2798F,0x20A0C552,
+	0x4009645A,0x1CAC0831, 0x3FF27AD9,0x8B30F141,
+	0x40096666,0x66666666, 0x3FF27C23,0xDB1BD4EE,
+	0x40096872,0xB020C49C, 0x3FF27D6E,0x1065BC2C,
+	0x40096A7E,0xF9DB22D1, 0x3FF27EB8,0x2B12F1C5,
+	0x40096C8B,0x43958106, 0x3FF28002,0x2B27BF79,
+	0x40096E97,0x8D4FDF3B, 0x3FF2814C,0x10A86DFD,
+	0x400970A3,0xD70A3D71, 0x3FF28295,0xDB994502,
+	0x400972B0,0x20C49BA6, 0x3FF283DF,0x8BFE8B2A,
+	0x400974BC,0x6A7EF9DB, 0x3FF28529,0x21DC8613,
+	0x400976C8,0xB4395810, 0x3FF28672,0x9D377A52,
+	0x400978D4,0xFDF3B646, 0x3FF287BB,0xFE13AB76,
+	0x40097AE1,0x47AE147B, 0x3FF28905,0x44755C03,
+	0x40097CED,0x916872B0, 0x3FF28A4E,0x7060CD79,
+	0x40097EF9,0xDB22D0E5, 0x3FF28B97,0x81DA4051,
+	0x40098106,0x24DD2F1B, 0x3FF28CE0,0x78E5F3FE,
+	0x40098312,0x6E978D50, 0x3FF28E29,0x558826EA,
+	0x4009851E,0xB851EB85, 0x3FF28F72,0x17C5167F,
+	0x4009872B,0x020C49BA, 0x3FF290BA,0xBFA0FF1D,
+	0x40098937,0x4BC6A7F0, 0x3FF29203,0x4D201C21,
+	0x40098B43,0x95810625, 0x3FF2934B,0xC046A7E2,
+	0x40098D4F,0xDF3B645A, 0x3FF29494,0x1918DBB6,
+	0x40098F5C,0x28F5C28F, 0x3FF295DC,0x579AEFEB,
+	0x40099168,0x72B020C5, 0x3FF29724,0x7BD11BCF,
+	0x40099374,0xBC6A7EFA, 0x3FF2986C,0x85BF95A8,
+	0x40099581,0x0624DD2F, 0x3FF299B4,0x756A92BE,
+	0x4009978D,0x4FDF3B64, 0x3FF29AFC,0x4AD64754,
+	0x40099999,0x9999999A, 0x3FF29C44,0x0606E6AB,
+	0x40099BA5,0xE353F7CF, 0x3FF29D8B,0xA700A301,
+	0x40099DB2,0x2D0E5604, 0x3FF29ED3,0x2DC7AD93,
+	0x40099FBE,0x76C8B439, 0x3FF2A01A,0x9A60369E,
+	0x4009A1CA,0xC083126F, 0x3FF2A161,0xECCE6D5C,
+	0x4009A3D7,0x0A3D70A4, 0x3FF2A2A9,0x25168007,
+	0x4009A5E3,0x53F7CED9, 0x3FF2A3F0,0x433C9BD8,
+	0x4009A7EF,0x9DB22D0E, 0x3FF2A537,0x4744ED0A,
+	0x4009A9FB,0xE76C8B44, 0x3FF2A67E,0x31339ED5,
+	0x4009AC08,0x3126E979, 0x3FF2A7C5,0x010CDB74,
+	0x4009AE14,0x7AE147AE, 0x3FF2A90B,0xB6D4CC22,
+	0x4009B020,0xC49BA5E3, 0x3FF2AA52,0x528F991C,
+	0x4009B22D,0x0E560419, 0x3FF2AB98,0xD441699F,
+	0x4009B439,0x5810624E, 0x3FF2ACDF,0x3BEE63EA,
+	0x4009B645,0xA1CAC083, 0x3FF2AE25,0x899AAD3F,
+	0x4009B851,0xEB851EB8, 0x3FF2AF6B,0xBD4A69E3,
+	0x4009BA5E,0x353F7CEE, 0x3FF2B0B1,0xD701BD1E,
+	0x4009BC6A,0x7EF9DB23, 0x3FF2B1F7,0xD6C4C937,
+	0x4009BE76,0xC8B43958, 0x3FF2B33D,0xBC97AF7D,
+	0x4009C083,0x126E978D, 0x3FF2B483,0x887E9041,
+	0x4009C28F,0x5C28F5C3, 0x3FF2B5C9,0x3A7D8AD9,
+	0x4009C49B,0xA5E353F8, 0x3FF2B70E,0xD298BD9D,
+	0x4009C6A7,0xEF9DB22D, 0x3FF2B854,0x50D445EC,
+	0x4009C8B4,0x39581062, 0x3FF2B999,0xB5344029,
+	0x4009CAC0,0x83126E98, 0x3FF2BADE,0xFFBCC7BC,
+	0x4009CCCC,0xCCCCCCCD, 0x3FF2BC24,0x3071F713,
+	0x4009CED9,0x16872B02, 0x3FF2BD69,0x4757E7A1,
+	0x4009D0E5,0x60418937, 0x3FF2BEAE,0x4472B1E2,
+	0x4009D2F1,0xA9FBE76D, 0x3FF2BFF3,0x27C66D55,
+	0x4009D4FD,0xF3B645A2, 0x3FF2C137,0xF1573082,
+	0x4009D70A,0x3D70A3D7, 0x3FF2C27C,0xA12910F6,
+	0x4009D916,0x872B020C, 0x3FF2C3C1,0x37402349,
+	0x4009DB22,0xD0E56042, 0x3FF2C505,0xB3A07B18,
+	0x4009DD2F,0x1A9FBE77, 0x3FF2C64A,0x164E2B08,
+	0x4009DF3B,0x645A1CAC, 0x3FF2C78E,0x5F4D44C7,
+	0x4009E147,0xAE147AE1, 0x3FF2C8D2,0x8EA1D90D,
+	0x4009E353,0xF7CED917, 0x3FF2CA16,0xA44FF798,
+	0x4009E560,0x4189374C, 0x3FF2CB5A,0xA05BAF32,
+	0x4009E76C,0x8B439581, 0x3FF2CC9E,0x82C90DAD,
+	0x4009E978,0xD4FDF3B6, 0x3FF2CDE2,0x4B9C1FE6,
+	0x4009EB85,0x1EB851EC, 0x3FF2CF25,0xFAD8F1C4,
+	0x4009ED91,0x6872B021, 0x3FF2D069,0x90838E36,
+	0x4009EF9D,0xB22D0E56, 0x3FF2D1AD,0x0C9FFF3A,
+	0x4009F1A9,0xFBE76C8B, 0x3FF2D2F0,0x6F324DD6,
+	0x4009F3B6,0x45A1CAC1, 0x3FF2D433,0xB83E821D,
+	0x4009F5C2,0x8F5C28F6, 0x3FF2D576,0xE7C8A32D,
+	0x4009F7CE,0xD916872B, 0x3FF2D6B9,0xFDD4B72F,
+	0x4009F9DB,0x22D0E560, 0x3FF2D7FC,0xFA66C35A,
+	0x4009FBE7,0x6C8B4396, 0x3FF2D93F,0xDD82CBF2,
+	0x4009FDF3,0xB645A1CB, 0x3FF2DA82,0xA72CD446,
+	0x400A0000,0x00000000, 0x3FF2DBC5,0x5768DEB3,
+	0x400A020C,0x49BA5E35, 0x3FF2DD07,0xEE3AECA3,
+	0x400A0418,0x9374BC6A, 0x3FF2DE4A,0x6BA6FE90,
+	0x400A0624,0xDD2F1AA0, 0x3FF2DF8C,0xCFB11400,
+	0x400A0831,0x26E978D5, 0x3FF2E0CF,0x1A5D2B86,
+	0x400A0A3D,0x70A3D70A, 0x3FF2E211,0x4BAF42C8,
+	0x400A0C49,0xBA5E353F, 0x3FF2E353,0x63AB5677,
+	0x400A0E56,0x04189375, 0x3FF2E495,0x62556257,
+	0x400A1062,0x4DD2F1AA, 0x3FF2E5D7,0x47B16136,
+	0x400A126E,0x978D4FDF, 0x3FF2E719,0x13C34CF8,
+	0x400A147A,0xE147AE14, 0x3FF2E85A,0xC68F1E8D,
+	0x400A1687,0x2B020C4A, 0x3FF2E99C,0x6018CDF9,
+	0x400A1893,0x74BC6A7F, 0x3FF2EADD,0xE064524C,
+	0x400A1A9F,0xBE76C8B4, 0x3FF2EC1F,0x4775A1AB,
+	0x400A1CAC,0x083126E9, 0x3FF2ED60,0x9550B14A,
+	0x400A1EB8,0x51EB851F, 0x3FF2EEA1,0xC9F97573,
+	0x400A20C4,0x9BA5E354, 0x3FF2EFE2,0xE573E17A,
+	0x400A22D0,0xE5604189, 0x3FF2F123,0xE7C3E7CD,
+	0x400A24DD,0x2F1A9FBE, 0x3FF2F264,0xD0ED79E9,
+	0x400A26E9,0x78D4FDF4, 0x3FF2F3A5,0xA0F4885E,
+	0x400A28F5,0xC28F5C29, 0x3FF2F4E6,0x57DD02CE,
+	0x400A2B02,0x0C49BA5E, 0x3FF2F626,0xF5AAD7F0,
+	0x400A2D0E,0x56041893, 0x3FF2F767,0x7A61F590,
+	0x400A2F1A,0x9FBE76C9, 0x3FF2F8A7,0xE606488B,
+	0x400A3126,0xE978D4FE, 0x3FF2F9E8,0x389BBCD3,
+	0x400A3333,0x33333333, 0x3FF2FB28,0x72263D6F,
+	0x400A353F,0x7CED9168, 0x3FF2FC68,0x92A9B47C,
+	0x400A374B,0xC6A7EF9E, 0x3FF2FDA8,0x9A2A0B2B,
+	0x400A3958,0x10624DD3, 0x3FF2FEE8,0x88AB29C2,
+	0x400A3B64,0x5A1CAC08, 0x3FF30028,0x5E30F79C,
+	0x400A3D70,0xA3D70A3D, 0x3FF30168,0x1ABF5B2C,
+	0x400A3F7C,0xED916873, 0x3FF302A7,0xBE5A39FB,
+	0x400A4189,0x374BC6A8, 0x3FF303E7,0x490578A5,
+	0x400A4395,0x810624DD, 0x3FF30526,0xBAC4FAE3,
+	0x400A45A1,0xCAC08312, 0x3FF30666,0x139CA380,
+	0x400A47AE,0x147AE148, 0x3FF307A5,0x53905461,
+	0x400A49BA,0x5E353F7D, 0x3FF308E4,0x7AA3EE80,
+	0x400A4BC6,0xA7EF9DB2, 0x3FF30A23,0x88DB51F2,
+	0x400A4DD2,0xF1A9FBE7, 0x3FF30B62,0x7E3A5DE3,
+	0x400A4FDF,0x3B645A1D, 0x3FF30CA1,0x5AC4F099,
+	0x400A51EB,0x851EB852, 0x3FF30DE0,0x1E7EE76E,
+	0x400A53F7,0xCED91687, 0x3FF30F1E,0xC96C1EDB,
+	0x400A5604,0x189374BC, 0x3FF3105D,0x5B90726E,
+	0x400A5810,0x624DD2F2, 0x3FF3119B,0xD4EFBCD2,
+	0x400A5A1C,0xAC083127, 0x3FF312DA,0x358DD7CA,
+	0x400A5C28,0xF5C28F5C, 0x3FF31418,0x7D6E9C33,
+	0x400A5E35,0x3F7CED91, 0x3FF31556,0xAC95E204,
+	0x400A6041,0x89374BC7, 0x3FF31694,0xC3078053,
+	0x400A624D,0xD2F1A9FC, 0x3FF317D2,0xC0C74D4A,
+	0x400A645A,0x1CAC0831, 0x3FF31910,0xA5D91E35,
+	0x400A6666,0x66666666, 0x3FF31A4E,0x7240C777,
+	0x400A6872,0xB020C49C, 0x3FF31B8C,0x26021C92,
+	0x400A6A7E,0xF9DB22D1, 0x3FF31CC9,0xC120F021,
+	0x400A6C8B,0x43958106, 0x3FF31E07,0x43A113DE,
+	0x400A6E97,0x8D4FDF3B, 0x3FF31F44,0xAD8658A0,
+	0x400A70A3,0xD70A3D71, 0x3FF32081,0xFED48E58,
+	0x400A72B0,0x20C49BA6, 0x3FF321BF,0x378F8418,
+	0x400A74BC,0x6A7EF9DB, 0x3FF322FC,0x57BB080B,
+	0x400A76C8,0xB4395810, 0x3FF32439,0x5F5AE77F,
+	0x400A78D4,0xFDF3B646, 0x3FF32576,0x4E72EEDC,
+	0x400A7AE1,0x47AE147B, 0x3FF326B3,0x2506E9AA,
+	0x400A7CED,0x916872B0, 0x3FF327EF,0xE31AA290,
+	0x400A7EF9,0xDB22D0E5, 0x3FF3292C,0x88B1E352,
+	0x400A8106,0x24DD2F1B, 0x3FF32A69,0x15D074D7,
+	0x400A8312,0x6E978D50, 0x3FF32BA5,0x8A7A1F20,
+	0x400A851E,0xB851EB85, 0x3FF32CE1,0xE6B2A952,
+	0x400A872B,0x020C49BA, 0x3FF32E1E,0x2A7DD9B1,
+	0x400A8937,0x4BC6A7F0, 0x3FF32F5A,0x55DF75A1,
+	0x400A8B43,0x95810625, 0x3FF33096,0x68DB41A5,
+	0x400A8D4F,0xDF3B645A, 0x3FF331D2,0x63750162,
+	0x400A8F5C,0x28F5C28F, 0x3FF3330E,0x45B0779F,
+	0x400A9168,0x72B020C5, 0x3FF3344A,0x0F916645,
+	0x400A9374,0xBC6A7EFA, 0x3FF33585,0xC11B8E5A,
+	0x400A9581,0x0624DD2F, 0x3FF336C1,0x5A52B00B,
+	0x400A978D,0x4FDF3B64, 0x3FF337FC,0xDB3A8AA4,
+	0x400A9999,0x9999999A, 0x3FF33938,0x43D6DC96,
+	0x400A9BA5,0xE353F7CF, 0x3FF33A73,0x942B6372,
+	0x400A9DB2,0x2D0E5604, 0x3FF33BAE,0xCC3BDBEC,
+	0x400A9FBE,0x76C8B439, 0x3FF33CE9,0xEC0C01DE,
+	0x400AA1CA,0xC083126F, 0x3FF33E24,0xF39F9043,
+	0x400AA3D7,0x0A3D70A4, 0x3FF33F5F,0xE2FA413A,
+	0x400AA5E3,0x53F7CED9, 0x3FF3409A,0xBA1FCE06,
+	0x400AA7EF,0x9DB22D0E, 0x3FF341D5,0x7913EF10,
+	0x400AA9FB,0xE76C8B44, 0x3FF34310,0x1FDA5BE4,
+	0x400AAC08,0x3126E979, 0x3FF3444A,0xAE76CB32,
+	0x400AAE14,0x7AE147AE, 0x3FF34585,0x24ECF2D0,
+	0x400AB020,0xC49BA5E3, 0x3FF346BF,0x834087B9,
+	0x400AB22D,0x0E560419, 0x3FF347F9,0xC9753E10,
+	0x400AB439,0x5810624E, 0x3FF34933,0xF78EC918,
+	0x400AB645,0xA1CAC083, 0x3FF34A6E,0x0D90DB41,
+	0x400AB851,0xEB851EB8, 0x3FF34BA8,0x0B7F261C,
+	0x400ABA5E,0x353F7CEE, 0x3FF34CE1,0xF15D5A64,
+	0x400ABC6A,0x7EF9DB23, 0x3FF34E1B,0xBF2F27F8,
+	0x400ABE76,0xC8B43958, 0x3FF34F55,0x74F83DE1,
+	0x400AC083,0x126E978D, 0x3FF3508F,0x12BC4A4D,
+	0x400AC28F,0x5C28F5C3, 0x3FF351C8,0x987EFA95,
+	0x400AC49B,0xA5E353F8, 0x3FF35302,0x0643FB34,
+	0x400AC6A7,0xEF9DB22D, 0x3FF3543B,0x5C0EF7D4,
+	0x400AC8B4,0x39581062, 0x3FF35574,0x99E39B42,
+	0x400ACAC0,0x83126E98, 0x3FF356AD,0xBFC58F77,
+	0x400ACCCC,0xCCCCCCCD, 0x3FF357E6,0xCDB87D93,
+	0x400ACED9,0x16872B02, 0x3FF3591F,0xC3C00DE1,
+	0x400AD0E5,0x60418937, 0x3FF35A58,0xA1DFE7D3,
+	0x400AD2F1,0xA9FBE76D, 0x3FF35B91,0x681BB208,
+	0x400AD4FD,0xF3B645A2, 0x3FF35CCA,0x16771245,
+	0x400AD70A,0x3D70A3D7, 0x3FF35E02,0xACF5AD7D,
+	0x400AD916,0x872B020C, 0x3FF35F3B,0x2B9B27CB,
+	0x400ADB22,0xD0E56042, 0x3FF36073,0x926B2477,
+	0x400ADD2F,0x1A9FBE77, 0x3FF361AB,0xE16945F0,
+	0x400ADF3B,0x645A1CAC, 0x3FF362E4,0x18992DD3,
+	0x400AE147,0xAE147AE1, 0x3FF3641C,0x37FE7CEA,
+	0x400AE353,0xF7CED917, 0x3FF36554,0x3F9CD329,
+	0x400AE560,0x4189374C, 0x3FF3668C,0x2F77CFAD,
+	0x400AE76C,0x8B439581, 0x3FF367C4,0x079310C5,
+	0x400AE978,0xD4FDF3B6, 0x3FF368FB,0xC7F233E9,
+	0x400AEB85,0x1EB851EC, 0x3FF36A33,0x7098D5BE,
+	0x400AED91,0x6872B021, 0x3FF36B6B,0x018A9217,
+	0x400AEF9D,0xB22D0E56, 0x3FF36CA2,0x7ACB03F3,
+	0x400AF1A9,0xFBE76C8B, 0x3FF36DD9,0xDC5DC57F,
+	0x400AF3B6,0x45A1CAC1, 0x3FF36F11,0x26467017,
+	0x400AF5C2,0x8F5C28F6, 0x3FF37048,0x58889C43,
+	0x400AF7CE,0xD916872B, 0x3FF3717F,0x7327E1BA,
+	0x400AF9DB,0x22D0E560, 0x3FF372B6,0x7627D762,
+	0x400AFBE7,0x6C8B4396, 0x3FF373ED,0x618C1350,
+	0x400AFDF3,0xB645A1CB, 0x3FF37524,0x35582AC7,
+	0x400B0000,0x00000000, 0x3FF3765A,0xF18FB239,
+	0x400B020C,0x49BA5E35, 0x3FF37791,0x96363D49,
+	0x400B0418,0x9374BC6A, 0x3FF378C8,0x234F5EC8,
+	0x400B0624,0xDD2F1AA0, 0x3FF379FE,0x98DEA8B8,
+	0x400B0831,0x26E978D5, 0x3FF37B34,0xF6E7AC4C,
+	0x400B0A3D,0x70A3D70A, 0x3FF37C6B,0x3D6DF9E5,
+	0x400B0C49,0xBA5E353F, 0x3FF37DA1,0x6C752118,
+	0x400B0E56,0x04189375, 0x3FF37ED7,0x8400B0A8,
+	0x400B1062,0x4DD2F1AA, 0x3FF3800D,0x8414368B,
+	0x400B126E,0x978D4FDF, 0x3FF38143,0x6CB33FE7,
+	0x400B147A,0xE147AE14, 0x3FF38279,0x3DE15916,
+	0x400B1687,0x2B020C4A, 0x3FF383AE,0xF7A20DA2,
+	0x400B1893,0x74BC6A7F, 0x3FF384E4,0x99F8E847,
+	0x400B1A9F,0xBE76C8B4, 0x3FF3861A,0x24E972F4,
+	0x400B1CAC,0x083126E9, 0x3FF3874F,0x987736CC,
+	0x400B1EB8,0x51EB851F, 0x3FF38884,0xF4A5BC24,
+	0x400B20C4,0x9BA5E354, 0x3FF389BA,0x39788A82,
+	0x400B22D0,0xE5604189, 0x3FF38AEF,0x66F328A2,
+	0x400B24DD,0x2F1A9FBE, 0x3FF38C24,0x7D191C73,
+	0x400B26E9,0x78D4FDF4, 0x3FF38D59,0x7BEDEB19,
+	0x400B28F5,0xC28F5C29, 0x3FF38E8E,0x637518EA,
+	0x400B2B02,0x0C49BA5E, 0x3FF38FC3,0x33B22970,
+	0x400B2D0E,0x56041893, 0x3FF390F7,0xECA89F6D,
+	0x400B2F1A,0x9FBE76C9, 0x3FF3922C,0x8E5BFCD5,
+	0x400B3126,0xE978D4FE, 0x3FF39361,0x18CFC2D1,
+	0x400B3333,0x33333333, 0x3FF39495,0x8C0771C0,
+	0x400B353F,0x7CED9168, 0x3FF395C9,0xE8068938,
+	0x400B374B,0xC6A7EF9E, 0x3FF396FE,0x2CD08803,
+	0x400B3958,0x10624DD3, 0x3FF39832,0x5A68EC21,
+	0x400B3B64,0x5A1CAC08, 0x3FF39966,0x70D332C9,
+	0x400B3D70,0xA3D70A3D, 0x3FF39A9A,0x7012D868,
+	0x400B3F7C,0xED916873, 0x3FF39BCE,0x582B58A2,
+	0x400B4189,0x374BC6A8, 0x3FF39D02,0x29202E53,
+	0x400B4395,0x810624DD, 0x3FF39E35,0xE2F4D38C,
+	0x400B45A1,0xCAC08312, 0x3FF39F69,0x85ACC197,
+	0x400B47AE,0x147AE148, 0x3FF3A09D,0x114B70F5,
+	0x400B49BA,0x5E353F7D, 0x3FF3A1D0,0x85D45960,
+	0x400B4BC6,0xA7EF9DB2, 0x3FF3A303,0xE34AF1C9,
+	0x400B4DD2,0xF1A9FBE7, 0x3FF3A437,0x29B2B05A,
+	0x400B4FDF,0x3B645A1D, 0x3FF3A56A,0x590F0A76,
+	0x400B51EB,0x851EB852, 0x3FF3A69D,0x716374B6,
+	0x400B53F7,0xCED91687, 0x3FF3A7D0,0x72B362F1,
+	0x400B5604,0x189374BC, 0x3FF3A903,0x5D024832,
+	0x400B5810,0x624DD2F2, 0x3FF3AA36,0x305396C4,
+	0x400B5A1C,0xAC083127, 0x3FF3AB68,0xECAAC024,
+	0x400B5C28,0xF5C28F5C, 0x3FF3AC9B,0x920B3510,
+	0x400B5E35,0x3F7CED91, 0x3FF3ADCE,0x2078657B,
+	0x400B6041,0x89374BC7, 0x3FF3AF00,0x97F5C097,
+	0x400B624D,0xD2F1A9FC, 0x3FF3B032,0xF886B4CD,
+	0x400B645A,0x1CAC0831, 0x3FF3B165,0x422EAFC3,
+	0x400B6666,0x66666666, 0x3FF3B297,0x74F11E59,
+	0x400B6872,0xB020C49C, 0x3FF3B3C9,0x90D16CAC,
+	0x400B6A7E,0xF9DB22D1, 0x3FF3B4FB,0x95D30613,
+	0x400B6C8B,0x43958106, 0x3FF3B62D,0x83F95521,
+	0x400B6E97,0x8D4FDF3B, 0x3FF3B75F,0x5B47C3A7,
+	0x400B70A3,0xD70A3D71, 0x3FF3B891,0x1BC1BAB0,
+	0x400B72B0,0x20C49BA6, 0x3FF3B9C2,0xC56AA284,
+	0x400B74BC,0x6A7EF9DB, 0x3FF3BAF4,0x5845E2AA,
+	0x400B76C8,0xB4395810, 0x3FF3BC25,0xD456E1E2,
+	0x400B78D4,0xFDF3B646, 0x3FF3BD57,0x39A1062D,
+	0x400B7AE1,0x47AE147B, 0x3FF3BE88,0x8827B4C8,
+	0x400B7CED,0x916872B0, 0x3FF3BFB9,0xBFEE522C,
+	0x400B7EF9,0xDB22D0E5, 0x3FF3C0EA,0xE0F84213,
+	0x400B8106,0x24DD2F1B, 0x3FF3C21B,0xEB48E774,
+	0x400B8312,0x6E978D50, 0x3FF3C34C,0xDEE3A482,
+	0x400B851E,0xB851EB85, 0x3FF3C47D,0xBBCBDAB3,
+	0x400B872B,0x020C49BA, 0x3FF3C5AE,0x8204EAB8,
+	0x400B8937,0x4BC6A7F0, 0x3FF3C6DF,0x31923483,
+	0x400B8B43,0x95810625, 0x3FF3C80F,0xCA771744,
+	0x400B8D4F,0xDF3B645A, 0x3FF3C940,0x4CB6F16B,
+	0x400B8F5C,0x28F5C28F, 0x3FF3CA70,0xB85520AA,
+	0x400B9168,0x72B020C5, 0x3FF3CBA1,0x0D5501EF,
+	0x400B9374,0xBC6A7EFA, 0x3FF3CCD1,0x4BB9F16A,
+	0x400B9581,0x0624DD2F, 0x3FF3CE01,0x73874A8B,
+	0x400B978D,0x4FDF3B64, 0x3FF3CF31,0x84C06805,
+	0x400B9999,0x9999999A, 0x3FF3D061,0x7F68A3C8,
+	0x400B9BA5,0xE353F7CF, 0x3FF3D191,0x63835707,
+	0x400B9DB2,0x2D0E5604, 0x3FF3D2C1,0x3113DA37,
+	0x400B9FBE,0x76C8B439, 0x3FF3D3F0,0xE81D850D,
+	0x400BA1CA,0xC083126F, 0x3FF3D520,0x88A3AE80,
+	0x400BA3D7,0x0A3D70A4, 0x3FF3D650,0x12A9ACC9,
+	0x400BA5E3,0x53F7CED9, 0x3FF3D77F,0x8632D564,
+	0x400BA7EF,0x9DB22D0E, 0x3FF3D8AE,0xE3427D0E,
+	0x400BA9FB,0xE76C8B44, 0x3FF3D9DE,0x29DBF7C9,
+	0x400BAC08,0x3126E979, 0x3FF3DB0D,0x5A0298D6,
+	0x400BAE14,0x7AE147AE, 0x3FF3DC3C,0x73B9B2BC,
+	0x400BB020,0xC49BA5E3, 0x3FF3DD6B,0x77049744,
+	0x400BB22D,0x0E560419, 0x3FF3DE9A,0x63E6977C,
+	0x400BB439,0x5810624E, 0x3FF3DFC9,0x3A6303B3,
+	0x400BB645,0xA1CAC083, 0x3FF3E0F7,0xFA7D2B7E,
+	0x400BB851,0xEB851EB8, 0x3FF3E226,0xA4385DB6,
+	0x400BBA5E,0x353F7CEE, 0x3FF3E355,0x3797E878,
+	0x400BBC6A,0x7EF9DB23, 0x3FF3E483,0xB49F1923,
+	0x400BBE76,0xC8B43958, 0x3FF3E5B2,0x1B513C60,
+	0x400BC083,0x126E978D, 0x3FF3E6E0,0x6BB19E18,
+	0x400BC28F,0x5C28F5C3, 0x3FF3E80E,0xA5C3897E,
+	0x400BC49B,0xA5E353F8, 0x3FF3E93C,0xC98A4905,
+	0x400BC6A7,0xEF9DB22D, 0x3FF3EA6A,0xD7092669,
+	0x400BC8B4,0x39581062, 0x3FF3EB98,0xCE436AAB,
+	0x400BCAC0,0x83126E98, 0x3FF3ECC6,0xAF3C5E14,
+	0x400BCCCC,0xCCCCCCCD, 0x3FF3EDF4,0x79F7482F,
+	0x400BCED9,0x16872B02, 0x3FF3EF22,0x2E776FD2,
+	0x400BD0E5,0x60418937, 0x3FF3F04F,0xCCC01B16,
+	0x400BD2F1,0xA9FBE76D, 0x3FF3F17D,0x54D48F5E,
+	0x400BD4FD,0xF3B645A2, 0x3FF3F2AA,0xC6B81152,
+	0x400BD70A,0x3D70A3D7, 0x3FF3F3D8,0x226DE4E1,
+	0x400BD916,0x872B020C, 0x3FF3F505,0x67F94D44,
+	0x400BDB22,0xD0E56042, 0x3FF3F632,0x975D8CFB,
+	0x400BDD2F,0x1A9FBE77, 0x3FF3F75F,0xB09DE5CC,
+	0x400BDF3B,0x645A1CAC, 0x3FF3F88C,0xB3BD98C6,
+	0x400BE147,0xAE147AE1, 0x3FF3F9B9,0xA0BFE641,
+	0x400BE353,0xF7CED917, 0x3FF3FAE6,0x77A80DDF,
+	0x400BE560,0x4189374C, 0x3FF3FC13,0x38794E88,
+	0x400BE76C,0x8B439581, 0x3FF3FD3F,0xE336E66E,
+	0x400BE978,0xD4FDF3B6, 0x3FF3FE6C,0x77E4130D,
+	0x400BEB85,0x1EB851EC, 0x3FF3FF98,0xF684112B,
+	0x400BED91,0x6872B021, 0x3FF400C5,0x5F1A1CD5,
+	0x400BEF9D,0xB22D0E56, 0x3FF401F1,0xB1A97163,
+	0x400BF1A9,0xFBE76C8B, 0x3FF4031D,0xEE35497A,
+	0x400BF3B6,0x45A1CAC1, 0x3FF4044A,0x14C0DF05,
+	0x400BF5C2,0x8F5C28F6, 0x3FF40576,0x254F6B3B,
+	0x400BF7CE,0xD916872B, 0x3FF406A2,0x1FE4269F,
+	0x400BF9DB,0x22D0E560, 0x3FF407CE,0x048248FD,
+	0x400BFBE7,0x6C8B4396, 0x3FF408F9,0xD32D096E,
+	0x400BFDF3,0xB645A1CB, 0x3FF40A25,0x8BE79E55,
+	0x400C0000,0x00000000, 0x3FF40B51,0x2EB53D60,
+	0x400C020C,0x49BA5E35, 0x3FF40C7C,0xBB991B8A,
+	0x400C0418,0x9374BC6A, 0x3FF40DA8,0x32966D19,
+	0x400C0624,0xDD2F1AA0, 0x3FF40ED3,0x93B065A2,
+	0x400C0831,0x26E978D5, 0x3FF40FFE,0xDEEA3801,
+	0x400C0A3D,0x70A3D70A, 0x3FF4112A,0x14471662,
+	0x400C0C49,0xBA5E353F, 0x3FF41255,0x33CA323F,
+	0x400C0E56,0x04189375, 0x3FF41380,0x3D76BC5C,
+	0x400C1062,0x4DD2F1AA, 0x3FF414AB,0x314FE4CA,
+	0x400C126E,0x978D4FDF, 0x3FF415D6,0x0F58DAEB,
+	0x400C147A,0xE147AE14, 0x3FF41700,0xD794CD6B,
+	0x400C1687,0x2B020C4A, 0x3FF4182B,0x8A06EA47,
+	0x400C1893,0x74BC6A7F, 0x3FF41956,0x26B25EC5,
+	0x400C1A9F,0xBE76C8B4, 0x3FF41A80,0xAD9A577E,
+	0x400C1CAC,0x083126E9, 0x3FF41BAB,0x1EC20057,
+	0x400C1EB8,0x51EB851F, 0x3FF41CD5,0x7A2C8486,
+	0x400C20C4,0x9BA5E354, 0x3FF41DFF,0xBFDD0E8B,
+	0x400C22D0,0xE5604189, 0x3FF41F29,0xEFD6C83A,
+	0x400C24DD,0x2F1A9FBE, 0x3FF42054,0x0A1CDAB3,
+	0x400C26E9,0x78D4FDF4, 0x3FF4217E,0x0EB26E68,
+	0x400C28F5,0xC28F5C29, 0x3FF422A7,0xFD9AAB17,
+	0x400C2B02,0x0C49BA5E, 0x3FF423D1,0xD6D8B7D2,
+	0x400C2D0E,0x56041893, 0x3FF424FB,0x9A6FBAF7,
+	0x400C2F1A,0x9FBE76C9, 0x3FF42625,0x4862DA38,
+	0x400C3126,0xE978D4FE, 0x3FF4274E,0xE0B53A94,
+	0x400C3333,0x33333333, 0x3FF42878,0x636A005D,
+	0x400C353F,0x7CED9168, 0x3FF429A1,0xD0844F34,
+	0x400C374B,0xC6A7EF9E, 0x3FF42ACB,0x28074A0C,
+	0x400C3958,0x10624DD3, 0x3FF42BF4,0x69F6132A,
+	0x400C3B64,0x5A1CAC08, 0x3FF42D1D,0x9653CC21,
+	0x400C3D70,0xA3D70A3D, 0x3FF42E46,0xAD2395DB,
+	0x400C3F7C,0xED916873, 0x3FF42F6F,0xAE68908F,
+	0x400C4189,0x374BC6A8, 0x3FF43098,0x9A25DBC8,
+	0x400C4395,0x810624DD, 0x3FF431C1,0x705E9662,
+	0x400C45A1,0xCAC08312, 0x3FF432EA,0x3115DE8E,
+	0x400C47AE,0x147AE148, 0x3FF43412,0xDC4ED1CD,
+	0x400C49BA,0x5E353F7D, 0x3FF4353B,0x720C8CF3,
+	0x400C4BC6,0xA7EF9DB2, 0x3FF43663,0xF2522C28,
+	0x400C4DD2,0xF1A9FBE7, 0x3FF4378C,0x5D22CAE7,
+	0x400C4FDF,0x3B645A1D, 0x3FF438B4,0xB28183FF,
+	0x400C51EB,0x851EB852, 0x3FF439DC,0xF271718F,
+	0x400C53F7,0xCED91687, 0x3FF43B05,0x1CF5AD0E,
+	0x400C5604,0x189374BC, 0x3FF43C2D,0x32114F45,
+	0x400C5810,0x624DD2F2, 0x3FF43D55,0x31C77052,
+	0x400C5A1C,0xAC083127, 0x3FF43E7D,0x1C1B27A6,
+	0x400C5C28,0xF5C28F5C, 0x3FF43FA4,0xF10F8C06,
+	0x400C5E35,0x3F7CED91, 0x3FF440CC,0xB0A7B390,
+	0x400C6041,0x89374BC7, 0x3FF441F4,0x5AE6B3B1,
+	0x400C624D,0xD2F1A9FC, 0x3FF4431B,0xEFCFA12F,
+	0x400C645A,0x1CAC0831, 0x3FF44443,0x6F659025,
+	0x400C6666,0x66666666, 0x3FF4456A,0xD9AB9401,
+	0x400C6872,0xB020C49C, 0x3FF44692,0x2EA4BF8A,
+	0x400C6A7E,0xF9DB22D1, 0x3FF447B9,0x6E5424DA,
+	0x400C6C8B,0x43958106, 0x3FF448E0,0x98BCD563,
+	0x400C6E97,0x8D4FDF3B, 0x3FF44A07,0xADE1E1EC,
+	0x400C70A3,0xD70A3D71, 0x3FF44B2E,0xADC65A94,
+	0x400C72B0,0x20C49BA6, 0x3FF44C55,0x986D4ECE,
+	0x400C74BC,0x6A7EF9DB, 0x3FF44D7C,0x6DD9CD66,
+	0x400C76C8,0xB4395810, 0x3FF44EA3,0x2E0EE47F,
+	0x400C78D4,0xFDF3B646, 0x3FF44FC9,0xD90FA193,
+	0x400C7AE1,0x47AE147B, 0x3FF450F0,0x6EDF1172,
+	0x400C7CED,0x916872B0, 0x3FF45216,0xEF804045,
+	0x400C7EF9,0xDB22D0E5, 0x3FF4533D,0x5AF6398C,
+	0x400C8106,0x24DD2F1B, 0x3FF45463,0xB1440820,
+	0x400C8312,0x6E978D50, 0x3FF45589,0xF26CB630,
+	0x400C851E,0xB851EB85, 0x3FF456B0,0x1E734D46,
+	0x400C872B,0x020C49BA, 0x3FF457D6,0x355AD644,
+	0x400C8937,0x4BC6A7F0, 0x3FF458FC,0x37265963,
+	0x400C8B43,0x95810625, 0x3FF45A22,0x23D8DE35,
+	0x400C8D4F,0xDF3B645A, 0x3FF45B47,0xFB756BA8,
+	0x400C8F5C,0x28F5C28F, 0x3FF45C6D,0xBDFF07FF,
+	0x400C9168,0x72B020C5, 0x3FF45D93,0x6B78B8DC,
+	0x400C9374,0xBC6A7EFA, 0x3FF45EB9,0x03E58334,
+	0x400C9581,0x0624DD2F, 0x3FF45FDE,0x87486B5B,
+	0x400C978D,0x4FDF3B64, 0x3FF46103,0xF5A474FC,
+	0x400C9999,0x9999999A, 0x3FF46229,0x4EFCA31F,
+	0x400C9BA5,0xE353F7CF, 0x3FF4634E,0x9353F824,
+	0x400C9DB2,0x2D0E5604, 0x3FF46473,0xC2AD75C6,
+	0x400C9FBE,0x76C8B439, 0x3FF46598,0xDD0C1D1C,
+	0x400CA1CA,0xC083126F, 0x3FF466BD,0xE272EE97,
+	0x400CA3D7,0x0A3D70A4, 0x3FF467E2,0xD2E4EA02,
+	0x400CA5E3,0x53F7CED9, 0x3FF46907,0xAE650E85,
+	0x400CA7EF,0x9DB22D0E, 0x3FF46A2C,0x74F65AA4,
+	0x400CA9FB,0xE76C8B44, 0x3FF46B51,0x269BCC3D,
+	0x400CAC08,0x3126E979, 0x3FF46C75,0xC358608B,
+	0x400CAE14,0x7AE147AE, 0x3FF46D9A,0x4B2F1423,
+	0x400CB020,0xC49BA5E3, 0x3FF46EBE,0xBE22E2FA,
+	0x400CB22D,0x0E560419, 0x3FF46FE3,0x1C36C85E,
+	0x400CB439,0x5810624E, 0x3FF47107,0x656DBEFB,
+	0x400CB645,0xA1CAC083, 0x3FF4722B,0x99CAC0D9,
+	0x400CB851,0xEB851EB8, 0x3FF4734F,0xB950C75F,
+	0x400CBA5E,0x353F7CEE, 0x3FF47473,0xC402CB4F,
+	0x400CBC6A,0x7EF9DB23, 0x3FF47597,0xB9E3C4C9,
+	0x400CBE76,0xC8B43958, 0x3FF476BB,0x9AF6AB4A,
+	0x400CC083,0x126E978D, 0x3FF477DF,0x673E75AD,
+	0x400CC28F,0x5C28F5C3, 0x3FF47903,0x1EBE1A2D,
+	0x400CC49B,0xA5E353F8, 0x3FF47A26,0xC1788E60,
+	0x400CC6A7,0xEF9DB22D, 0x3FF47B4A,0x4F70C73A,
+	0x400CC8B4,0x39581062, 0x3FF47C6D,0xC8A9B910,
+	0x400CCAC0,0x83126E98, 0x3FF47D91,0x2D265796,
+	0x400CCCCC,0xCCCCCCCD, 0x3FF47EB4,0x7CE995D9,
+	0x400CCED9,0x16872B02, 0x3FF47FD7,0xB7F6664D,
+	0x400CD0E5,0x60418937, 0x3FF480FA,0xDE4FBABE,
+	0x400CD2F1,0xA9FBE76D, 0x3FF4821D,0xEFF8845E,
+	0x400CD4FD,0xF3B645A2, 0x3FF48340,0xECF3B3B7,
+	0x400CD70A,0x3D70A3D7, 0x3FF48463,0xD54438B9,
+	0x400CD916,0x872B020C, 0x3FF48586,0xA8ED02B1,
+	0x400CDB22,0xD0E56042, 0x3FF486A9,0x67F1004D,
+	0x400CDD2F,0x1A9FBE77, 0x3FF487CC,0x12531F99,
+	0x400CDF3B,0x645A1CAC, 0x3FF488EE,0xA8164E03,
+	0x400CE147,0xAE147AE1, 0x3FF48A11,0x293D785C,
+	0x400CE353,0xF7CED917, 0x3FF48B33,0x95CB8AD1,
+	0x400CE560,0x4189374C, 0x3FF48C55,0xEDC370F2,
+	0x400CE76C,0x8B439581, 0x3FF48D78,0x312815B2,
+	0x400CE978,0xD4FDF3B6, 0x3FF48E9A,0x5FFC6362,
+	0x400CEB85,0x1EB851EC, 0x3FF48FBC,0x7A4343B6,
+	0x400CED91,0x6872B021, 0x3FF490DE,0x7FFF9FC4,
+	0x400CEF9D,0xB22D0E56, 0x3FF49200,0x71346003,
+	0x400CF1A9,0xFBE76C8B, 0x3FF49322,0x4DE46C4C,
+	0x400CF3B6,0x45A1CAC1, 0x3FF49444,0x1612ABDB,
+	0x400CF5C2,0x8F5C28F6, 0x3FF49565,0xC9C2054C,
+	0x400CF7CE,0xD916872B, 0x3FF49687,0x68F55EA1,
+	0x400CF9DB,0x22D0E560, 0x3FF497A8,0xF3AF9D3C,
+	0x400CFBE7,0x6C8B4396, 0x3FF498CA,0x69F3A5E2,
+	0x400CFDF3,0xB645A1CB, 0x3FF499EB,0xCBC45CBD,
+	0x400D0000,0x00000000, 0x3FF49B0D,0x1924A557,
+	0x400D020C,0x49BA5E35, 0x3FF49C2E,0x5217629F,
+	0x400D0418,0x9374BC6A, 0x3FF49D4F,0x769F76EA,
+	0x400D0624,0xDD2F1AA0, 0x3FF49E70,0x86BFC3EC,
+	0x400D0831,0x26E978D5, 0x3FF49F91,0x827B2AC0,
+	0x400D0A3D,0x70A3D70A, 0x3FF4A0B2,0x69D48BE3,
+	0x400D0C49,0xBA5E353F, 0x3FF4A1D3,0x3CCEC739,
+	0x400D0E56,0x04189375, 0x3FF4A2F3,0xFB6CBC08,
+	0x400D1062,0x4DD2F1AA, 0x3FF4A414,0xA5B148FB,
+	0x400D126E,0x978D4FDF, 0x3FF4A535,0x3B9F4C22,
+	0x400D147A,0xE147AE14, 0x3FF4A655,0xBD39A2F3,
+	0x400D1687,0x2B020C4A, 0x3FF4A776,0x2A832A46,
+	0x400D1893,0x74BC6A7F, 0x3FF4A896,0x837EBE5C,
+	0x400D1A9F,0xBE76C8B4, 0x3FF4A9B6,0xC82F3AD8,
+	0x400D1CAC,0x083126E9, 0x3FF4AAD6,0xF8977AC5,
+	0x400D1EB8,0x51EB851F, 0x3FF4ABF7,0x14BA5893,
+	0x400D20C4,0x9BA5E354, 0x3FF4AD17,0x1C9AAE16,
+	0x400D22D0,0xE5604189, 0x3FF4AE37,0x103B548D,
+	0x400D24DD,0x2F1A9FBE, 0x3FF4AF56,0xEF9F2497,
+	0x400D26E9,0x78D4FDF4, 0x3FF4B076,0xBAC8F63F,
+	0x400D28F5,0xC28F5C29, 0x3FF4B196,0x71BBA0F2,
+	0x400D2B02,0x0C49BA5E, 0x3FF4B2B6,0x1479FB87,
+	0x400D2D0E,0x56041893, 0x3FF4B3D5,0xA306DC3A,
+	0x400D2F1A,0x9FBE76C9, 0x3FF4B4F5,0x1D6518B0,
+	0x400D3126,0xE978D4FE, 0x3FF4B614,0x839785F3,
+	0x400D3333,0x33333333, 0x3FF4B733,0xD5A0F876,
+	0x400D353F,0x7CED9168, 0x3FF4B853,0x13844413,
+	0x400D374B,0xC6A7EF9E, 0x3FF4B972,0x3D443C0C,
+	0x400D3958,0x10624DD3, 0x3FF4BA91,0x52E3B30B,
+	0x400D3B64,0x5A1CAC08, 0x3FF4BBB0,0x54657B20,
+	0x400D3D70,0xA3D70A3D, 0x3FF4BCCF,0x41CC65C8,
+	0x400D3F7C,0xED916873, 0x3FF4BDEE,0x1B1B43E4,
+	0x400D4189,0x374BC6A8, 0x3FF4BF0C,0xE054E5BF,
+	0x400D4395,0x810624DD, 0x3FF4C02B,0x917C1B0D,
+	0x400D45A1,0xCAC08312, 0x3FF4C14A,0x2E93B2EB,
+	0x400D47AE,0x147AE148, 0x3FF4C268,0xB79E7BE0,
+	0x400D49BA,0x5E353F7D, 0x3FF4C387,0x2C9F43D9,
+	0x400D4BC6,0xA7EF9DB2, 0x3FF4C4A5,0x8D98D82F,
+	0x400D4DD2,0xF1A9FBE7, 0x3FF4C5C3,0xDA8E05A6,
+	0x400D4FDF,0x3B645A1D, 0x3FF4C6E2,0x13819868,
+	0x400D51EB,0x851EB852, 0x3FF4C800,0x38765C0B,
+	0x400D53F7,0xCED91687, 0x3FF4C91E,0x496F1B90,
+	0x400D5604,0x189374BC, 0x3FF4CA3C,0x466EA15F,
+	0x400D5810,0x624DD2F2, 0x3FF4CB5A,0x2F77B74F,
+	0x400D5A1C,0xAC083127, 0x3FF4CC78,0x048D269D,
+	0x400D5C28,0xF5C28F5C, 0x3FF4CD95,0xC5B1B7F4,
+	0x400D5E35,0x3F7CED91, 0x3FF4CEB3,0x72E83368,
+	0x400D6041,0x89374BC7, 0x3FF4CFD1,0x0C336079,
+	0x400D624D,0xD2F1A9FC, 0x3FF4D0EE,0x91960612,
+	0x400D645A,0x1CAC0831, 0x3FF4D20C,0x0312EA88,
+	0x400D6666,0x66666666, 0x3FF4D329,0x60ACD39F,
+	0x400D6872,0xB020C49C, 0x3FF4D446,0xAA668683,
+	0x400D6A7E,0xF9DB22D1, 0x3FF4D563,0xE042C7CE,
+	0x400D6C8B,0x43958106, 0x3FF4D681,0x02445B84,
+	0x400D6E97,0x8D4FDF3B, 0x3FF4D79E,0x106E0518,
+	0x400D70A3,0xD70A3D71, 0x3FF4D8BB,0x0AC28769,
+	0x400D72B0,0x20C49BA6, 0x3FF4D9D7,0xF144A4BE,
+	0x400D74BC,0x6A7EF9DB, 0x3FF4DAF4,0xC3F71ED1,
+	0x400D76C8,0xB4395810, 0x3FF4DC11,0x82DCB6C5,
+	0x400D78D4,0xFDF3B646, 0x3FF4DD2E,0x2DF82D2A,
+	0x400D7AE1,0x47AE147B, 0x3FF4DE4A,0xC54C41FF,
+	0x400D7CED,0x916872B0, 0x3FF4DF67,0x48DBB4AF,
+	0x400D7EF9,0xDB22D0E5, 0x3FF4E083,0xB8A94413,
+	0x400D8106,0x24DD2F1B, 0x3FF4E1A0,0x14B7AE72,
+	0x400D8312,0x6E978D50, 0x3FF4E2BC,0x5D09B17E,
+	0x400D851E,0xB851EB85, 0x3FF4E3D8,0x91A20A5A,
+	0x400D872B,0x020C49BA, 0x3FF4E4F4,0xB2837598,
+	0x400D8937,0x4BC6A7F0, 0x3FF4E610,0xBFB0AF34,
+	0x400D8B43,0x95810625, 0x3FF4E72C,0xB92C729C,
+	0x400D8D4F,0xDF3B645A, 0x3FF4E848,0x9EF97AAB,
+	0x400D8F5C,0x28F5C28F, 0x3FF4E964,0x711A81AC,
+	0x400D9168,0x72B020C5, 0x3FF4EA80,0x2F924157,
+	0x400D9374,0xBC6A7EFA, 0x3FF4EB9B,0xDA6372D4,
+	0x400D9581,0x0624DD2F, 0x3FF4ECB7,0x7190CEBB,
+	0x400D978D,0x4FDF3B64, 0x3FF4EDD2,0xF51D0D12,
+	0x400D9999,0x9999999A, 0x3FF4EEEE,0x650AE550,
+	0x400D9BA5,0xE353F7CF, 0x3FF4F009,0xC15D0E59,
+	0x400D9DB2,0x2D0E5604, 0x3FF4F125,0x0A163E84,
+	0x400D9FBE,0x76C8B439, 0x3FF4F240,0x3F392B96,
+	0x400DA1CA,0xC083126F, 0x3FF4F35B,0x60C88AC6,
+	0x400DA3D7,0x0A3D70A4, 0x3FF4F476,0x6EC710B8,
+	0x400DA5E3,0x53F7CED9, 0x3FF4F591,0x69377183,
+	0x400DA7EF,0x9DB22D0E, 0x3FF4F6AC,0x501C60AF,
+	0x400DA9FB,0xE76C8B44, 0x3FF4F7C7,0x23789133,
+	0x400DAC08,0x3126E979, 0x3FF4F8E1,0xE34EB578,
+	0x400DAE14,0x7AE147AE, 0x3FF4F9FC,0x8FA17F57,
+	0x400DB020,0xC49BA5E3, 0x3FF4FB17,0x2873A01B,
+	0x400DB22D,0x0E560419, 0x3FF4FC31,0xADC7C882,
+	0x400DB439,0x5810624E, 0x3FF4FD4C,0x1FA0A8B8,
+	0x400DB645,0xA1CAC083, 0x3FF4FE66,0x7E00F05D,
+	0x400DB851,0xEB851EB8, 0x3FF4FF80,0xC8EB4E82,
+	0x400DBA5E,0x353F7CEE, 0x3FF5009B,0x006271AC,
+	0x400DBC6A,0x7EF9DB23, 0x3FF501B5,0x246907CE,
+	0x400DBE76,0xC8B43958, 0x3FF502CF,0x3501BE52,
+	0x400DC083,0x126E978D, 0x3FF503E9,0x322F4211,
+	0x400DC28F,0x5C28F5C3, 0x3FF50503,0x1BF43F58,
+	0x400DC49B,0xA5E353F8, 0x3FF5061C,0xF25361E6,
+	0x400DC6A7,0xEF9DB22D, 0x3FF50736,0xB54F54EE,
+	0x400DC8B4,0x39581062, 0x3FF50850,0x64EAC316,
+	0x400DCAC0,0x83126E98, 0x3FF5096A,0x01285676,
+	0x400DCCCC,0xCCCCCCCD, 0x3FF50A83,0x8A0AB89A,
+	0x400DCED9,0x16872B02, 0x3FF50B9C,0xFF949281,
+	0x400DD0E5,0x60418937, 0x3FF50CB6,0x61C88C9F,
+	0x400DD2F1,0xA9FBE76D, 0x3FF50DCF,0xB0A94EDB,
+	0x400DD4FD,0xF3B645A2, 0x3FF50EE8,0xEC398090,
+	0x400DD70A,0x3D70A3D7, 0x3FF51002,0x147BC88C,
+	0x400DD916,0x872B020C, 0x3FF5111B,0x2972CD13,
+	0x400DDB22,0xD0E56042, 0x3FF51234,0x2B2133DE,
+	0x400DDD2F,0x1A9FBE77, 0x3FF5134D,0x1989A217,
+	0x400DDF3B,0x645A1CAC, 0x3FF51465,0xF4AEBC5F,
+	0x400DE147,0xAE147AE1, 0x3FF5157E,0xBC9326CE,
+	0x400DE353,0xF7CED917, 0x3FF51697,0x713984ED,
+	0x400DE560,0x4189374C, 0x3FF517B0,0x12A479BC,
+	0x400DE76C,0x8B439581, 0x3FF518C8,0xA0D6A7B1,
+	0x400DE978,0xD4FDF3B6, 0x3FF519E1,0x1BD2B0B7,
+	0x400DEB85,0x1EB851EC, 0x3FF51AF9,0x839B362D,
+	0x400DED91,0x6872B021, 0x3FF51C11,0xD832D8E9,
+	0x400DEF9D,0xB22D0E56, 0x3FF51D2A,0x199C3938,
+	0x400DF1A9,0xFBE76C8B, 0x3FF51E42,0x47D9F6DC,
+	0x400DF3B6,0x45A1CAC1, 0x3FF51F5A,0x62EEB10C,
+	0x400DF5C2,0x8F5C28F6, 0x3FF52072,0x6ADD0678,
+	0x400DF7CE,0xD916872B, 0x3FF5218A,0x5FA79543,
+	0x400DF9DB,0x22D0E560, 0x3FF522A2,0x4150FB0A,
+	0x400DFBE7,0x6C8B4396, 0x3FF523BA,0x0FDBD4DF,
+	0x400DFDF3,0xB645A1CB, 0x3FF524D1,0xCB4ABF4B,
+	0x400E0000,0x00000000, 0x3FF525E9,0x73A0564F,
+	0x400E020C,0x49BA5E35, 0x3FF52701,0x08DF3562,
+	0x400E0418,0x9374BC6A, 0x3FF52818,0x8B09F772,
+	0x400E0624,0xDD2F1AA0, 0x3FF5292F,0xFA2336E8,
+	0x400E0831,0x26E978D5, 0x3FF52A47,0x562D8DA0,
+	0x400E0A3D,0x70A3D70A, 0x3FF52B5E,0x9F2B94F0,
+	0x400E0C49,0xBA5E353F, 0x3FF52C75,0xD51FE5A6,
+	0x400E0E56,0x04189375, 0x3FF52D8C,0xF80D1808,
+	0x400E1062,0x4DD2F1AA, 0x3FF52EA4,0x07F5C3D4,
+	0x400E126E,0x978D4FDF, 0x3FF52FBB,0x04DC8041,
+	0x400E147A,0xE147AE14, 0x3FF530D1,0xEEC3E3FD,
+	0x400E1687,0x2B020C4A, 0x3FF531E8,0xC5AE8531,
+	0x400E1893,0x74BC6A7F, 0x3FF532FF,0x899EF97C,
+	0x400E1A9F,0xBE76C8B4, 0x3FF53416,0x3A97D5F8,
+	0x400E1CAC,0x083126E9, 0x3FF5352C,0xD89BAF38,
+	0x400E1EB8,0x51EB851F, 0x3FF53643,0x63AD1947,
+	0x400E20C4,0x9BA5E354, 0x3FF53759,0xDBCEA7AA,
+	0x400E22D0,0xE5604189, 0x3FF53870,0x4102ED60,
+	0x400E24DD,0x2F1A9FBE, 0x3FF53986,0x934C7CE2,
+	0x400E26E9,0x78D4FDF4, 0x3FF53A9C,0xD2ADE821,
+	0x400E28F5,0xC28F5C29, 0x3FF53BB2,0xFF29C089,
+	0x400E2B02,0x0C49BA5E, 0x3FF53CC9,0x18C29701,
+	0x400E2D0E,0x56041893, 0x3FF53DDF,0x1F7AFBE9,
+	0x400E2F1A,0x9FBE76C9, 0x3FF53EF5,0x13557F1D,
+	0x400E3126,0xE978D4FE, 0x3FF5400A,0xF454AFEF,
+	0x400E3333,0x33333333, 0x3FF54120,0xC27B1D32,
+	0x400E353F,0x7CED9168, 0x3FF54236,0x7DCB552F,
+	0x400E374B,0xC6A7EF9E, 0x3FF5434C,0x2647E5AD,
+	0x400E3958,0x10624DD3, 0x3FF54461,0xBBF35BEC,
+	0x400E3B64,0x5A1CAC08, 0x3FF54577,0x3ED044A8,
+	0x400E3D70,0xA3D70A3D, 0x3FF5468C,0xAEE12C18,
+	0x400E3F7C,0xED916873, 0x3FF547A2,0x0C289DF1,
+	0x400E4189,0x374BC6A8, 0x3FF548B7,0x56A9255E,
+	0x400E4395,0x810624DD, 0x3FF549CC,0x8E654D0B,
+	0x400E45A1,0xCAC08312, 0x3FF54AE1,0xB35F9F1F,
+	0x400E47AE,0x147AE148, 0x3FF54BF6,0xC59AA53C,
+	0x400E49BA,0x5E353F7D, 0x3FF54D0B,0xC518E87F,
+	0x400E4BC6,0xA7EF9DB2, 0x3FF54E20,0xB1DCF184,
+	0x400E4DD2,0xF1A9FBE7, 0x3FF54F35,0x8BE94862,
+	0x400E4FDF,0x3B645A1D, 0x3FF5504A,0x534074AE,
+	0x400E51EB,0x851EB852, 0x3FF5515F,0x07E4FD76,
+	0x400E53F7,0xCED91687, 0x3FF55273,0xA9D9694A,
+	0x400E5604,0x189374BC, 0x3FF55388,0x39203E34,
+	0x400E5810,0x624DD2F2, 0x3FF5549C,0xB5BC01BB,
+	0x400E5A1C,0xAC083127, 0x3FF555B1,0x1FAF38E5,
+	0x400E5C28,0xF5C28F5C, 0x3FF556C5,0x76FC6834,
+	0x400E5E35,0x3F7CED91, 0x3FF557D9,0xBBA613A9,
+	0x400E6041,0x89374BC7, 0x3FF558ED,0xEDAEBEC1,
+	0x400E624D,0xD2F1A9FC, 0x3FF55A02,0x0D18EC77,
+	0x400E645A,0x1CAC0831, 0x3FF55B16,0x19E71F46,
+	0x400E6666,0x66666666, 0x3FF55C2A,0x141BD925,
+	0x400E6872,0xB020C49C, 0x3FF55D3D,0xFBB99B8C,
+	0x400E6A7E,0xF9DB22D1, 0x3FF55E51,0xD0C2E76C,
+	0x400E6C8B,0x43958106, 0x3FF55F65,0x933A3D3B,
+	0x400E6E97,0x8D4FDF3B, 0x3FF56079,0x43221CEA,
+	0x400E70A3,0xD70A3D71, 0x3FF5618C,0xE07D05EA,
+	0x400E72B0,0x20C49BA6, 0x3FF562A0,0x6B4D7728,
+	0x400E74BC,0x6A7EF9DB, 0x3FF563B3,0xE395EF16,
+	0x400E76C8,0xB4395810, 0x3FF564C7,0x4958EBA0,
+	0x400E78D4,0xFDF3B646, 0x3FF565DA,0x9C98EA34,
+	0x400E7AE1,0x47AE147B, 0x3FF566ED,0xDD5867BD,
+	0x400E7CED,0x916872B0, 0x3FF56801,0x0B99E0A9,
+	0x400E7EF9,0xDB22D0E5, 0x3FF56914,0x275FD0E3,
+	0x400E8106,0x24DD2F1B, 0x3FF56A27,0x30ACB3D9,
+	0x400E8312,0x6E978D50, 0x3FF56B3A,0x27830474,
+	0x400E851E,0xB851EB85, 0x3FF56C4D,0x0BE53D23,
+	0x400E872B,0x020C49BA, 0x3FF56D5F,0xDDD5D7D0,
+	0x400E8937,0x4BC6A7F0, 0x3FF56E72,0x9D574DEA,
+	0x400E8B43,0x95810625, 0x3FF56F85,0x4A6C185D,
+	0x400E8D4F,0xDF3B645A, 0x3FF57097,0xE516AF98,
+	0x400E8F5C,0x28F5C28F, 0x3FF571AA,0x6D598B89,
+	0x400E9168,0x72B020C5, 0x3FF572BC,0xE33723A2,
+	0x400E9374,0xBC6A7EFA, 0x3FF573CF,0x46B1EED2,
+	0x400E9581,0x0624DD2F, 0x3FF574E1,0x97CC638C,
+	0x400E978D,0x4FDF3B64, 0x3FF575F3,0xD688F7C4,
+	0x400E9999,0x9999999A, 0x3FF57706,0x02EA20EF,
+	0x400E9BA5,0xE353F7CF, 0x3FF57818,0x1CF25403,
+	0x400E9DB2,0x2D0E5604, 0x3FF5792A,0x24A4057A,
+	0x400E9FBE,0x76C8B439, 0x3FF57A3C,0x1A01A94D,
+	0x400EA1CA,0xC083126F, 0x3FF57B4D,0xFD0DB2FB,
+	0x400EA3D7,0x0A3D70A4, 0x3FF57C5F,0xCDCA9580,
+	0x400EA5E3,0x53F7CED9, 0x3FF57D71,0x8C3AC35D,
+	0x400EA7EF,0x9DB22D0E, 0x3FF57E83,0x3860AE97,
+	0x400EA9FB,0xE76C8B44, 0x3FF57F94,0xD23EC8B3,
+	0x400EAC08,0x3126E979, 0x3FF580A6,0x59D782BA,
+	0x400EAE14,0x7AE147AE, 0x3FF581B7,0xCF2D4D37,
+	0x400EB020,0xC49BA5E3, 0x3FF582C9,0x32429839,
+	0x400EB22D,0x0E560419, 0x3FF583DA,0x8319D351,
+	0x400EB439,0x5810624E, 0x3FF584EB,0xC1B56D92,
+	0x400EB645,0xA1CAC083, 0x3FF585FC,0xEE17D597,
+	0x400EB851,0xEB851EB8, 0x3FF5870E,0x0843797A,
+	0x400EBA5E,0x353F7CEE, 0x3FF5881F,0x103AC6DA,
+	0x400EBC6A,0x7EF9DB23, 0x3FF58930,0x06002AD9,
+	0x400EBE76,0xC8B43958, 0x3FF58A40,0xE996121F,
+	0x400EC083,0x126E978D, 0x3FF58B51,0xBAFEE8D6,
+	0x400EC28F,0x5C28F5C3, 0x3FF58C62,0x7A3D1AAD,
+	0x400EC49B,0xA5E353F8, 0x3FF58D73,0x275312D6,
+	0x400EC6A7,0xEF9DB22D, 0x3FF58E83,0xC2433C09,
+	0x400EC8B4,0x39581062, 0x3FF58F94,0x4B100082,
+	0x400ECAC0,0x83126E98, 0x3FF590A4,0xC1BBCA02,
+	0x400ECCCC,0xCCCCCCCD, 0x3FF591B5,0x264901CC,
+	0x400ECED9,0x16872B02, 0x3FF592C5,0x78BA10AC,
+	0x400ED0E5,0x60418937, 0x3FF593D5,0xB9115EF1,
+	0x400ED2F1,0xA9FBE76D, 0x3FF594E5,0xE751546F,
+	0x400ED4FD,0xF3B645A2, 0x3FF595F6,0x037C587F,
+	0x400ED70A,0x3D70A3D7, 0x3FF59706,0x0D94D200,
+	0x400ED916,0x872B020C, 0x3FF59816,0x059D2756,
+	0x400EDB22,0xD0E56042, 0x3FF59925,0xEB97BE6D,
+	0x400EDD2F,0x1A9FBE77, 0x3FF59A35,0xBF86FCB3,
+	0x400EDF3B,0x645A1CAC, 0x3FF59B45,0x816D471D,
+	0x400EE147,0xAE147AE1, 0x3FF59C55,0x314D0229,
+	0x400EE353,0xF7CED917, 0x3FF59D64,0xCF2891D8,
+	0x400EE560,0x4189374C, 0x3FF59E74,0x5B0259B2,
+	0x400EE76C,0x8B439581, 0x3FF59F83,0xD4DCBCC5,
+	0x400EE978,0xD4FDF3B6, 0x3FF5A093,0x3CBA1DA8,
+	0x400EEB85,0x1EB851EC, 0x3FF5A1A2,0x929CDE75,
+	0x400EED91,0x6872B021, 0x3FF5A2B1,0xD68760CF,
+	0x400EEF9D,0xB22D0E56, 0x3FF5A3C1,0x087C05DF,
+	0x400EF1A9,0xFBE76C8B, 0x3FF5A4D0,0x287D2E57,
+	0x400EF3B6,0x45A1CAC1, 0x3FF5A5DF,0x368D3A6D,
+	0x400EF5C2,0x8F5C28F6, 0x3FF5A6EE,0x32AE89E1,
+	0x400EF7CE,0xD916872B, 0x3FF5A7FD,0x1CE37BFA,
+	0x400EF9DB,0x22D0E560, 0x3FF5A90B,0xF52E6F84,
+	0x400EFBE7,0x6C8B4396, 0x3FF5AA1A,0xBB91C2D6,
+	0x400EFDF3,0xB645A1CB, 0x3FF5AB29,0x700FD3CC,
+	0x400F0000,0x00000000, 0x3FF5AC38,0x12AAFFCD,
+	0x400F020C,0x49BA5E35, 0x3FF5AD46,0xA365A3C5,
+	0x400F0418,0x9374BC6A, 0x3FF5AE55,0x22421C2A,
+	0x400F0624,0xDD2F1AA0, 0x3FF5AF63,0x8F42C4FA,
+	0x400F0831,0x26E978D5, 0x3FF5B071,0xEA69F9BA,
+	0x400F0A3D,0x70A3D70A, 0x3FF5B180,0x33BA1579,
+	0x400F0C49,0xBA5E353F, 0x3FF5B28E,0x6B3572CF,
+	0x400F0E56,0x04189375, 0x3FF5B39C,0x90DE6BDC,
+	0x400F1062,0x4DD2F1AA, 0x3FF5B4AA,0xA4B75A47,
+	0x400F126E,0x978D4FDF, 0x3FF5B5B8,0xA6C29745,
+	0x400F147A,0xE147AE14, 0x3FF5B6C6,0x97027B8E,
+	0x400F1687,0x2B020C4A, 0x3FF5B7D4,0x75795F6A,
+	0x400F1893,0x74BC6A7F, 0x3FF5B8E2,0x42299AA3,
+	0x400F1A9F,0xBE76C8B4, 0x3FF5B9EF,0xFD158492,
+	0x400F1CAC,0x083126E9, 0x3FF5BAFD,0xA63F7418,
+	0x400F1EB8,0x51EB851F, 0x3FF5BC0B,0x3DA9BFA0,
+	0x400F20C4,0x9BA5E354, 0x3FF5BD18,0xC356BD1D,
+	0x400F22D0,0xE5604189, 0x3FF5BE26,0x3748C20F,
+	0x400F24DD,0x2F1A9FBE, 0x3FF5BF33,0x9982237D,
+	0x400F26E9,0x78D4FDF4, 0x3FF5C040,0xEA0535FC,
+	0x400F28F5,0xC28F5C29, 0x3FF5C14E,0x28D44DA7,
+	0x400F2B02,0x0C49BA5E, 0x3FF5C25B,0x55F1BE26,
+	0x400F2D0E,0x56041893, 0x3FF5C368,0x715FDAAD,
+	0x400F2F1A,0x9FBE76C9, 0x3FF5C475,0x7B20F5F7,
+	0x400F3126,0xE978D4FE, 0x3FF5C582,0x7337624D,
+	0x400F3333,0x33333333, 0x3FF5C68F,0x59A57181,
+	0x400F353F,0x7CED9168, 0x3FF5C79C,0x2E6D74F2,
+	0x400F374B,0xC6A7EF9E, 0x3FF5C8A8,0xF191BD88,
+	0x400F3958,0x10624DD3, 0x3FF5C9B5,0xA3149BB7,
+	0x400F3B64,0x5A1CAC08, 0x3FF5CAC2,0x42F85F80,
+	0x400F3D70,0xA3D70A3D, 0x3FF5CBCE,0xD13F586D,
+	0x400F3F7C,0xED916873, 0x3FF5CCDB,0x4DEBD597,
+	0x400F4189,0x374BC6A8, 0x3FF5CDE7,0xB900259F,
+	0x400F4395,0x810624DD, 0x3FF5CEF4,0x127E96B4,
+	0x400F45A1,0xCAC08312, 0x3FF5D000,0x5A697691,
+	0x400F47AE,0x147AE148, 0x3FF5D10C,0x90C3127E,
+	0x400F49BA,0x5E353F7D, 0x3FF5D218,0xB58DB74C,
+	0x400F4BC6,0xA7EF9DB2, 0x3FF5D324,0xC8CBB15C,
+	0x400F4DD2,0xF1A9FBE7, 0x3FF5D430,0xCA7F4C9A,
+	0x400F4FDF,0x3B645A1D, 0x3FF5D53C,0xBAAAD47F,
+	0x400F51EB,0x851EB852, 0x3FF5D648,0x99509410,
+	0x400F53F7,0xCED91687, 0x3FF5D754,0x6672D5DE,
+	0x400F5604,0x189374BC, 0x3FF5D860,0x2213E40B,
+	0x400F5810,0x624DD2F2, 0x3FF5D96B,0xCC360841,
+	0x400F5A1C,0xAC083127, 0x3FF5DA77,0x64DB8BBB,
+	0x400F5C28,0xF5C28F5C, 0x3FF5DB82,0xEC06B73F,
+	0x400F5E35,0x3F7CED91, 0x3FF5DC8E,0x61B9D322,
+	0x400F6041,0x89374BC7, 0x3FF5DD99,0xC5F72747,
+	0x400F624D,0xD2F1A9FC, 0x3FF5DEA5,0x18C0FB1B,
+	0x400F645A,0x1CAC0831, 0x3FF5DFB0,0x5A19959C,
+	0x400F6666,0x66666666, 0x3FF5E0BB,0x8A033D57,
+	0x400F6872,0xB020C49C, 0x3FF5E1C6,0xA8803865,
+	0x400F6A7E,0xF9DB22D1, 0x3FF5E2D1,0xB592CC6C,
+	0x400F6C8B,0x43958106, 0x3FF5E3DC,0xB13D3EA3,
+	0x400F6E97,0x8D4FDF3B, 0x3FF5E4E7,0x9B81D3CD,
+	0x400F70A3,0xD70A3D71, 0x3FF5E5F2,0x7462D03E,
+	0x400F72B0,0x20C49BA6, 0x3FF5E6FD,0x3BE277D7,
+	0x400F74BC,0x6A7EF9DB, 0x3FF5E807,0xF2030E07,
+	0x400F76C8,0xB4395810, 0x3FF5E912,0x96C6D5CD,
+	0x400F78D4,0xFDF3B646, 0x3FF5EA1D,0x2A3011B8,
+	0x400F7AE1,0x47AE147B, 0x3FF5EB27,0xAC4103E3,
+	0x400F7CED,0x916872B0, 0x3FF5EC32,0x1CFBEDFB,
+	0x400F7EF9,0xDB22D0E5, 0x3FF5ED3C,0x7C63113B,
+	0x400F8106,0x24DD2F1B, 0x3FF5EE46,0xCA78AE6E,
+	0x400F8312,0x6E978D50, 0x3FF5EF51,0x073F05EF,
+	0x400F851E,0xB851EB85, 0x3FF5F05B,0x32B857A6,
+	0x400F872B,0x020C49BA, 0x3FF5F165,0x4CE6E30D,
+	0x400F8937,0x4BC6A7F0, 0x3FF5F26F,0x55CCE72F,
+	0x400F8B43,0x95810625, 0x3FF5F379,0x4D6CA2A4,
+	0x400F8D4F,0xDF3B645A, 0x3FF5F483,0x33C85397,
+	0x400F8F5C,0x28F5C28F, 0x3FF5F58D,0x08E237C0,
+	0x400F9168,0x72B020C5, 0x3FF5F696,0xCCBC8C6B,
+	0x400F9374,0xBC6A7EFA, 0x3FF5F7A0,0x7F598E70,
+	0x400F9581,0x0624DD2F, 0x3FF5F8AA,0x20BB7A3D,
+	0x400F978D,0x4FDF3B64, 0x3FF5F9B3,0xB0E48BCB,
+	0x400F9999,0x9999999A, 0x3FF5FABD,0x2FD6FEAA,
+	0x400F9BA5,0xE353F7CF, 0x3FF5FBC6,0x9D950DF4,
+	0x400F9DB2,0x2D0E5604, 0x3FF5FCCF,0xFA20F458,
+	0x400F9FBE,0x76C8B439, 0x3FF5FDD9,0x457CEC17,
+	0x400FA1CA,0xC083126F, 0x3FF5FEE2,0x7FAB2F02,
+	0x400FA3D7,0x0A3D70A4, 0x3FF5FFEB,0xA8ADF679,
+	0x400FA5E3,0x53F7CED9, 0x3FF600F4,0xC0877B70,
+	0x400FA7EF,0x9DB22D0E, 0x3FF601FD,0xC739F66E,
+	0x400FA9FB,0xE76C8B44, 0x3FF60306,0xBCC79F88,
+	0x400FAC08,0x3126E979, 0x3FF6040F,0xA132AE67,
+	0x400FAE14,0x7AE147AE, 0x3FF60518,0x747D5A46,
+	0x400FB020,0xC49BA5E3, 0x3FF60621,0x36A9D9F0,
+	0x400FB22D,0x0E560419, 0x3FF60729,0xE7BA63C6,
+	0x400FB439,0x5810624E, 0x3FF60832,0x87B12DB6,
+	0x400FB645,0xA1CAC083, 0x3FF6093B,0x16906D45,
+	0x400FB851,0xEB851EB8, 0x3FF60A43,0x945A5788,
+	0x400FBA5E,0x353F7CEE, 0x3FF60B4C,0x01112127,
+	0x400FBC6A,0x7EF9DB23, 0x3FF60C54,0x5CB6FE5D,
+	0x400FBE76,0xC8B43958, 0x3FF60D5C,0xA74E22F8,
+	0x400FC083,0x126E978D, 0x3FF60E64,0xE0D8C258,
+	0x400FC28F,0x5C28F5C3, 0x3FF60F6D,0x09590F71,
+	0x400FC49B,0xA5E353F8, 0x3FF61075,0x20D13CC8,
+	0x400FC6A7,0xEF9DB22D, 0x3FF6117D,0x27437C79,
+	0x400FC8B4,0x39581062, 0x3FF61285,0x1CB20030,
+	0x400FCAC0,0x83126E98, 0x3FF6138D,0x011EF92E,
+	0x400FCCCC,0xCCCCCCCD, 0x3FF61494,0xD48C9846,
+	0x400FCED9,0x16872B02, 0x3FF6159C,0x96FD0DE1,
+	0x400FD0E5,0x60418937, 0x3FF616A4,0x487289FA,
+	0x400FD2F1,0xA9FBE76D, 0x3FF617AB,0xE8EF3C22,
+	0x400FD4FD,0xF3B645A2, 0x3FF618B3,0x7875537A,
+	0x400FD70A,0x3D70A3D7, 0x3FF619BA,0xF706FEBA,
+	0x400FD916,0x872B020C, 0x3FF61AC2,0x64A66C2F,
+	0x400FDB22,0xD0E56042, 0x3FF61BC9,0xC155C9B9,
+	0x400FDD2F,0x1A9FBE77, 0x3FF61CD1,0x0D1744CB,
+	0x400FDF3B,0x645A1CAC, 0x3FF61DD8,0x47ED0A6E,
+	0x400FE147,0xAE147AE1, 0x3FF61EDF,0x71D94741,
+	0x400FE353,0xF7CED917, 0x3FF61FE6,0x8ADE2777,
+	0x400FE560,0x4189374C, 0x3FF620ED,0x92FDD6D4,
+	0x400FE76C,0x8B439581, 0x3FF621F4,0x8A3A80B7,
+	0x400FE978,0xD4FDF3B6, 0x3FF622FB,0x7096500F,
+	0x400FEB85,0x1EB851EC, 0x3FF62402,0x46136F65,
+	0x400FED91,0x6872B021, 0x3FF62509,0x0AB408D2,
+	0x400FEF9D,0xB22D0E56, 0x3FF6260F,0xBE7A4609,
+	0x400FF1A9,0xFBE76C8B, 0x3FF62716,0x61685050,
+	0x400FF3B6,0x45A1CAC1, 0x3FF6281C,0xF3805083,
+	0x400FF5C2,0x8F5C28F6, 0x3FF62923,0x74C46F13,
+	0x400FF7CE,0xD916872B, 0x3FF62A29,0xE536D408,
+	0x400FF9DB,0x22D0E560, 0x3FF62B30,0x44D9A701,
+	0x400FFBE7,0x6C8B4396, 0x3FF62C36,0x93AF0F30,
+	0x400FFDF3,0xB645A1CB, 0x3FF62D3C,0xD1B93360,
+	0x40100000,0x00000000, 0x3FF62E42,0xFEFA39EF,
+	};
+
+
+LOCAL_D const TUint32 SqrtTest[] =
+	{
+	0x3FE00000,0x00000000, 0x3FE6A09E,0x667F3BCD,
+	0x3FE051EB,0x851EB852, 0x3FE6DA42,0x17576971,
+	0x3FE0A3D7,0x0A3D70A4, 0x3FE71355,0xD04DE190,
+	0x3FE0F5C2,0x8F5C28F6, 0x3FE74BDD,0xB3926321,
+	0x3FE147AE,0x147AE148, 0x3FE783DD,0xB1A48E38,
+	0x3FE19999,0x9999999A, 0x3FE7BB59,0x8C88B4AD,
+	0x3FE1EB85,0x1EB851EC, 0x3FE7F254,0xDAB9CC3B,
+	0x3FE23D70,0xA3D70A3D, 0x3FE828D3,0x09DF0C49,
+	0x3FE28F5C,0x28F5C28F, 0x3FE85ED7,0x614B038C,
+	0x3FE2E147,0xAE147AE1, 0x3FE89465,0x04494BE3,
+	0x3FE33333,0x33333333, 0x3FE8C97E,0xF43F7248,
+	0x3FE3851E,0xB851EB85, 0x3FE8FE28,0x12A529ED,
+	0x3FE3D70A,0x3D70A3D7, 0x3FE93263,0x22D77275,
+	0x3FE428F5,0xC28F5C29, 0x3FE96632,0xCBC9F77F,
+	0x3FE47AE1,0x47AE147B, 0x3FE99999,0x9999999A,
+	0x3FE4CCCC,0xCCCCCCCD, 0x3FE9CC99,0xFF02C481,
+	0x3FE51EB8,0x51EB851F, 0x3FE9FF36,0x56BDF346,
+	0x3FE570A3,0xD70A3D71, 0x3FEA3170,0xE4C48745,
+	0x3FE5C28F,0x5C28F5C3, 0x3FEA634B,0xD77FE1A5,
+	0x3FE6147A,0xE147AE14, 0x3FEA94C9,0x48E4800E,
+	0x3FE66666,0x66666666, 0x3FEAC5EB,0x3F7AB2F8,
+	0x3FE6B851,0xEB851EB8, 0x3FEAF6B3,0xAF565E6F,
+	0x3FE70A3D,0x70A3D70A, 0x3FEB2724,0x7AFF148F,
+	0x3FE75C28,0xF5C28F5C, 0x3FEB573F,0x7449BA9F,
+	0x3FE7AE14,0x7AE147AE, 0x3FEB8706,0x5D24CEE3,
+	0x3FE80000,0x00000000, 0x3FEBB67A,0xE8584CAA,
+	0x3FE851EB,0x851EB852, 0x3FEBE59E,0xBA3A165A,
+	0x3FE8A3D7,0x0A3D70A4, 0x3FEC1473,0x6957B96B,
+	0x3FE8F5C2,0x8F5C28F6, 0x3FEC42FA,0x7F164E6C,
+	0x3FE947AE,0x147AE148, 0x3FEC7135,0x7849271A,
+	0x3FE99999,0x9999999A, 0x3FEC9F25,0xC5BFEDD9,
+	0x3FE9EB85,0x1EB851EC, 0x3FECCCCC,0xCCCCCCCD,
+	0x3FEA3D70,0xA3D70A3D, 0x3FECFA2B,0xE7C3269F,
+	0x3FEA8F5C,0x28F5C28F, 0x3FED2744,0x666F6040,
+	0x3FEAE147,0xAE147AE1, 0x3FED5417,0x8E8830D5,
+	0x3FEB3333,0x33333333, 0x3FED80A6,0x9C19E42A,
+	0x3FEB851E,0xB851EB85, 0x3FEDACF2,0xC1EBF386,
+	0x3FEBD70A,0x3D70A3D7, 0x3FEDD8FD,0x29E1516F,
+	0x3FEC28F5,0xC28F5C29, 0x3FEE04C6,0xF553BDD8,
+	0x3FEC7AE1,0x47AE147B, 0x3FEE3051,0x3D6A7202,
+	0x3FECCCCC,0xCCCCCCCD, 0x3FEE5B9D,0x136C6D96,
+	0x3FED1EB8,0x51EB851F, 0x3FEE86AB,0x810EA912,
+	0x3FED70A3,0xD70A3D71, 0x3FEEB17D,0x88BE6CF1,
+	0x3FEDC28F,0x5C28F5C3, 0x3FEEDC14,0x25E80867,
+	0x3FEE147A,0xE147AE14, 0x3FEF0670,0x4D3A1E6F,
+	0x3FEE6666,0x66666666, 0x3FEF3092,0xECE5BC35,
+	0x3FEEB851,0xEB851EB8, 0x3FEF5A7C,0xECDB684A,
+	0x3FEF0A3D,0x70A3D70A, 0x3FEF842F,0x2F055704,
+	0x3FEF5C28,0xF5C28F5C, 0x3FEFADAA,0x8F7EED52,
+	0x3FEFAE14,0x7AE147AE, 0x3FEFD6EF,0xE4C9B8A5,
+	0x3FF00000,0x00000000, 0x3FF00000,0x00000000,
+	0x3FF028F5,0xC28F5C29, 0x3FF0146D,0xD68287F3,
+	0x3FF051EB,0x851EB852, 0x3FF028C1,0xD959B062,
+	0x3FF07AE1,0x47AE147B, 0x3FF03CFC,0x69845AA9,
+	0x3FF0A3D7,0x0A3D70A4, 0x3FF0511D,0xE5A8265F,
+	0x3FF0CCCC,0xCCCCCCCD, 0x3FF06526,0xAA25A13B,
+	0x3FF0F5C2,0x8F5C28F6, 0x3FF07917,0x112B9A06,
+	0x3FF11EB8,0x51EB851F, 0x3FF08CEF,0x72C9A206,
+	0x3FF147AE,0x147AE148, 0x3FF0A0B0,0x2501C79A,
+	0x3FF170A3,0xD70A3D71, 0x3FF0B459,0x7BD9942C,
+	0x3FF19999,0x9999999A, 0x3FF0C7EB,0xC96A56F6,
+	0x3FF1C28F,0x5C28F5C3, 0x3FF0DB67,0x5DF0C580,
+	0x3FF1EB85,0x1EB851EC, 0x3FF0EECC,0x87DBFA55,
+	0x3FF2147A,0xE147AE14, 0x3FF1021B,0x93DBD9C4,
+	0x3FF23D70,0xA3D70A3D, 0x3FF11554,0xCCEEE448,
+	0x3FF26666,0x66666666, 0x3FF12878,0x7C6F7D7A,
+	0x3FF28F5C,0x28F5C28F, 0x3FF13B86,0xEA20AE5C,
+	0x3FF2B851,0xEB851EB8, 0x3FF14E80,0x5C3A692B,
+	0x3FF2E147,0xAE147AE1, 0x3FF16165,0x177554AE,
+	0x3FF30A3D,0x70A3D70A, 0x3FF17435,0x5F16249E,
+	0x3FF33333,0x33333333, 0x3FF186F1,0x74F88472,
+	0x3FF35C28,0xF5C28F5C, 0x3FF19999,0x9999999A,
+	0x3FF3851E,0xB851EB85, 0x3FF1AC2E,0x0C2221D3,
+	0x3FF3AE14,0x7AE147AE, 0x3FF1BEAF,0x0A703231,
+	0x3FF3D70A,0x3D70A3D7, 0x3FF1D11C,0xD1209B03,
+	0x3FF40000,0x00000000, 0x3FF1E377,0x9B97F4A8,
+	0x3FF428F5,0xC28F5C29, 0x3FF1F5BF,0xA40B592C,
+	0x3FF451EB,0x851EB852, 0x3FF207F5,0x2388CE40,
+	0x3FF47AE1,0x47AE147B, 0x3FF21A18,0x51FF630A,
+	0x3FF4A3D7,0x0A3D70A4, 0x3FF22C29,0x66470506,
+	0x3FF4CCCC,0xCCCCCCCD, 0x3FF23E28,0x96280F23,
+	0x3FF4F5C2,0x8F5C28F6, 0x3FF25016,0x166295F7,
+	0x3FF51EB8,0x51EB851F, 0x3FF261F2,0x1AB573F3,
+	0x3FF547AE,0x147AE148, 0x3FF273BC,0xD5E51828,
+	0x3FF570A3,0xD70A3D71, 0x3FF28576,0x79C21A32,
+	0x3FF59999,0x9999999A, 0x3FF2971F,0x372F95B6,
+	0x3FF5C28F,0x5C28F5C3, 0x3FF2A8B7,0x3E294FB5,
+	0x3FF5EB85,0x1EB851EC, 0x3FF2BA3E,0xBDC9A7E6,
+	0x3FF6147A,0xE147AE14, 0x3FF2CBB5,0xE44F5836,
+	0x3FF63D70,0xA3D70A3D, 0x3FF2DD1C,0xDF230457,
+	0x3FF66666,0x66666666, 0x3FF2EE73,0xDADC9B57,
+	0x3FF68F5C,0x28F5C28F, 0x3FF2FFBB,0x03488D00,
+	0x3FF6B851,0xEB851EB8, 0x3FF310F2,0x836CD4BA,
+	0x3FF6E147,0xAE147AE1, 0x3FF3221A,0x858DDB9D,
+	0x3FF70A3D,0x70A3D70A, 0x3FF33333,0x33333333,
+	0x3FF73333,0x33333333, 0x3FF3443C,0xB52C2A85,
+	0x3FF75C28,0xF5C28F5C, 0x3FF35537,0x33943EBD,
+	0x3FF7851E,0xB851EB85, 0x3FF36622,0xD5D768DE,
+	0x3FF7AE14,0x7AE147AE, 0x3FF376FF,0xC2B649C7,
+	0x3FF7D70A,0x3D70A3D7, 0x3FF387CE,0x204A35D2,
+	0x3FF80000,0x00000000, 0x3FF3988E,0x1409212E,
+	0x3FF828F5,0xC28F5C29, 0x3FF3A93F,0xC2C96E34,
+	0x3FF851EB,0x851EB852, 0x3FF3B9E3,0x50C59EAE,
+	0x3FF87AE1,0x47AE147B, 0x3FF3CA78,0xE19FE93C,
+	0x3FF8A3D7,0x0A3D70A4, 0x3FF3DB00,0x9865B3BD,
+	0x3FF8CCCC,0xCCCCCCCD, 0x3FF3EB7A,0x9792F3C6,
+	0x3FF8F5C2,0x8F5C28F6, 0x3FF3FBE7,0x01157608,
+	0x3FF91EB8,0x51EB851F, 0x3FF40C45,0xF6500D83,
+	0x3FF947AE,0x147AE148, 0x3FF41C97,0x981DAB71,
+	0x3FF970A3,0xD70A3D71, 0x3FF42CDC,0x06D4609E,
+	0x3FF99999,0x9999999A, 0x3FF43D13,0x6248490F,
+	0x3FF9C28F,0x5C28F5C3, 0x3FF44D3D,0xC9CE62A3,
+	0x3FF9EB85,0x1EB851EC, 0x3FF45D5B,0x5C3F4F6B,
+	0x3FFA147A,0xE147AE14, 0x3FF46D6C,0x37FA0475,
+	0x3FFA3D70,0xA3D70A3D, 0x3FF47D70,0x7AE6659A,
+	0x3FFA6666,0x66666666, 0x3FF48D68,0x4277CF0B,
+	0x3FFA8F5C,0x28F5C28F, 0x3FF49D53,0xABAF8D2C,
+	0x3FFAB851,0xEB851EB8, 0x3FF4AD32,0xD31F434E,
+	0x3FFAE147,0xAE147AE1, 0x3FF4BD05,0xD4EB41E9,
+	0x3FFB0A3D,0x70A3D70A, 0x3FF4CCCC,0xCCCCCCCD,
+	0x3FFB3333,0x33333333, 0x3FF4DC87,0xD61451DA,
+	0x3FFB5C28,0xF5C28F5C, 0x3FF4EC37,0x0BAB90C4,
+	0x3FFB851E,0xB851EB85, 0x3FF4FBDA,0x8817B44D,
+	0x3FFBAE14,0x7AE147AE, 0x3FF50B72,0x657B5D7E,
+	0x3FFBD70A,0x3D70A3D7, 0x3FF51AFE,0xBD98A145,
+	0x3FFC0000,0x00000000, 0x3FF52A7F,0xA9D2F8EA,
+	0x3FFC28F5,0xC28F5C29, 0x3FF539F5,0x433125C3,
+	0x3FFC51EB,0x851EB852, 0x3FF5495F,0xA25F0897,
+	0x3FFC7AE1,0x47AE147B, 0x3FF558BE,0xDFAF6CF9,
+	0x3FFCA3D7,0x0A3D70A4, 0x3FF56813,0x131DC91E,
+	0x3FFCCCCC,0xCCCCCCCD, 0x3FF5775C,0x544FF263,
+	0x3FFCF5C2,0x8F5C28F6, 0x3FF5869A,0xBA97C6F7,
+	0x3FFD1EB8,0x51EB851F, 0x3FF595CE,0x5CF4CCF2,
+	0x3FFD47AE,0x147AE148, 0x3FF5A4F7,0x5215C72B,
+	0x3FFD70A3,0xD70A3D71, 0x3FF5B415,0xB05A401C,
+	0x3FFD9999,0x9999999A, 0x3FF5C329,0x8DD40B25,
+	0x3FFDC28F,0x5C28F5C3, 0x3FF5D233,0x0048BC6E,
+	0x3FFDEB85,0x1EB851EC, 0x3FF5E132,0x1D3317B6,
+	0x3FFE147A,0xE147AE14, 0x3FF5F026,0xF9C47652,
+	0x3FFE3D70,0xA3D70A3D, 0x3FF5FF11,0xAAE624A0,
+	0x3FFE6666,0x66666666, 0x3FF60DF2,0x453AB723,
+	0x3FFE8F5C,0x28F5C28F, 0x3FF61CC8,0xDD1F5796,
+	0x3FFEB851,0xEB851EB8, 0x3FF62B95,0x86AD0A22,
+	0x3FFEE147,0xAE147AE1, 0x3FF63A58,0x55B9EAFB,
+	0x3FFF0A3D,0x70A3D70A, 0x3FF64911,0x5DDA6496,
+	0x3FFF3333,0x33333333, 0x3FF657C0,0xB2625EB4,
+	0x3FFF5C28,0xF5C28F5C, 0x3FF66666,0x66666666,
+	0x3FFF851E,0xB851EB85, 0x3FF67502,0x8CBCCF54,
+	0x3FFFAE14,0x7AE147AE, 0x3FF68395,0x37FECE62,
+	0x3FFFD70A,0x3D70A3D7, 0x3FF6921E,0x7A898DED,
+	0x40000000,0x00000000, 0x3FF6A09E,0x667F3BCD,
+	0x4000147A,0xE147AE14, 0x3FF6AF15,0x0DC81142,
+	0x400028F5,0xC28F5C29, 0x3FF6BD82,0x821354FF,
+	0x40003D70,0xA3D70A3D, 0x3FF6CBE6,0xD4D85770,
+	0x400051EB,0x851EB852, 0x3FF6DA42,0x17576971,
+	0x40006666,0x66666666, 0x3FF6E894,0x5A9ACD92,
+	0x40007AE1,0x47AE147B, 0x3FF6F6DD,0xAF77A413,
+	0x40008F5C,0x28F5C28F, 0x3FF7051E,0x268ED1B4,
+	0x4000A3D7,0x0A3D70A4, 0x3FF71355,0xD04DE190,
+	0x4000B851,0xEB851EB8, 0x3FF72184,0xBCEFE200,
+	0x4000CCCC,0xCCCCCCCD, 0x3FF72FAA,0xFC7E3CD7,
+	0x4000E147,0xAE147AE1, 0x3FF73DC8,0x9ED18AEA,
+	0x4000F5C2,0x8F5C28F6, 0x3FF74BDD,0xB3926321,
+	0x40010A3D,0x70A3D70A, 0x3FF759EA,0x4A3A251F,
+	0x40011EB8,0x51EB851F, 0x3FF767EE,0x7213BFA8,
+	0x40013333,0x33333333, 0x3FF775EA,0x3A3C72D2,
+	0x400147AE,0x147AE148, 0x3FF783DD,0xB1A48E38,
+	0x40015C28,0xF5C28F5C, 0x3FF791C8,0xE7102B26,
+	0x400170A3,0xD70A3D71, 0x3FF79FAB,0xE917E2F5,
+	0x4001851E,0xB851EB85, 0x3FF7AD86,0xC629819F,
+	0x40019999,0x9999999A, 0x3FF7BB59,0x8C88B4AD,
+	0x4001AE14,0x7AE147AE, 0x3FF7C924,0x4A4FB68C,
+	0x4001C28F,0x5C28F5C3, 0x3FF7D6E7,0x0D6FF66D,
+	0x4001D70A,0x3D70A3D7, 0x3FF7E4A1,0xE3B2BCBA,
+	0x4001EB85,0x1EB851EC, 0x3FF7F254,0xDAB9CC3B,
+	0x40020000,0x00000000, 0x3FF80000,0x00000000,
+	0x4002147A,0xE147AE14, 0x3FF80DA3,0x60D9E625,
+	0x400228F5,0xC28F5C29, 0x3FF81B3F,0x0A765780,
+	0x40023D70,0xA3D70A3D, 0x3FF828D3,0x09DF0C49,
+	0x400251EB,0x851EB852, 0x3FF8365F,0x6BF92DE2,
+	0x40026666,0x66666666, 0x3FF843E4,0x3D85E5B1,
+	0x40027AE1,0x47AE147B, 0x3FF85161,0x8B22E93E,
+	0x40028F5C,0x28F5C28F, 0x3FF85ED7,0x614B038C,
+	0x4002A3D7,0x0A3D70A4, 0x3FF86C45,0xCC569BD1,
+	0x4002B851,0xEB851EB8, 0x3FF879AC,0xD87C398E,
+	0x4002CCCC,0xCCCCCCCD, 0x3FF8870C,0x91D10623,
+	0x4002E147,0xAE147AE1, 0x3FF89465,0x04494BE3,
+	0x4002F5C2,0x8F5C28F6, 0x3FF8A1B6,0x3BB8F2C3,
+	0x40030A3D,0x70A3D70A, 0x3FF8AF00,0x43D3FAA3,
+	0x40031EB8,0x51EB851F, 0x3FF8BC43,0x282EF353,
+	0x40033333,0x33333333, 0x3FF8C97E,0xF43F7248,
+	0x400347AE,0x147AE148, 0x3FF8D6B3,0xB35C8629,
+	0x40035C28,0xF5C28F5C, 0x3FF8E3E1,0x70BF282E,
+	0x400370A3,0xD70A3D71, 0x3FF8F108,0x3782AB66,
+	0x4003851E,0xB851EB85, 0x3FF8FE28,0x12A529ED,
+	0x40039999,0x9999999A, 0x3FF90B41,0x0D07F01E,
+	0x4003AE14,0x7AE147AE, 0x3FF91853,0x316FE5D0,
+	0x4003C28F,0x5C28F5C3, 0x3FF9255E,0x8A85F5A4,
+	0x4003D70A,0x3D70A3D7, 0x3FF93263,0x22D77275,
+	0x4003EB85,0x1EB851EC, 0x3FF93F61,0x04D67AED,
+	0x40040000,0x00000000, 0x3FF94C58,0x3ADA5B53,
+	0x4004147A,0xE147AE14, 0x3FF95948,0xCF1FED8E,
+	0x400428F5,0xC28F5C29, 0x3FF96632,0xCBC9F77F,
+	0x40043D70,0xA3D70A3D, 0x3FF97316,0x3AE18797,
+	0x400451EB,0x851EB852, 0x3FF97FF3,0x26564FDE,
+	0x40046666,0x66666666, 0x3FF98CC9,0x97FEFF4C,
+	0x40047AE1,0x47AE147B, 0x3FF99999,0x9999999A,
+	0x40048F5C,0x28F5C28F, 0x3FF9A663,0x34CBCD7F,
+	0x4004A3D7,0x0A3D70A4, 0x3FF9B326,0x73234978,
+	0x4004B851,0xEB851EB8, 0x3FF9BFE3,0x5E160F05,
+	0x4004CCCC,0xCCCCCCCD, 0x3FF9CC99,0xFF02C481,
+	0x4004E147,0xAE147AE1, 0x3FF9D94A,0x5F31058A,
+	0x4004F5C2,0x8F5C28F6, 0x3FF9E5F4,0x87D1B20C,
+	0x40050A3D,0x70A3D70A, 0x3FF9F298,0x81FF3BE6,
+	0x40051EB8,0x51EB851F, 0x3FF9FF36,0x56BDF346,
+	0x40053333,0x33333333, 0x3FFA0BCE,0x0EFC51B3,
+	0x400547AE,0x147AE148, 0x3FFA185F,0xB39343D4,
+	0x40055C28,0xF5C28F5C, 0x3FFA24EB,0x4D4671F0,
+	0x400570A3,0xD70A3D71, 0x3FFA3170,0xE4C48745,
+	0x4005851E,0xB851EB85, 0x3FFA3DF0,0x82A77817,
+	0x40059999,0x9999999A, 0x3FFA4A6A,0x2F74C6AC,
+	0x4005AE14,0x7AE147AE, 0x3FFA56DD,0xF39DC709,
+	0x4005C28F,0x5C28F5C3, 0x3FFA634B,0xD77FE1A5,
+	0x4005D70A,0x3D70A3D7, 0x3FFA6FB3,0xE364D4F2,
+	0x4005EB85,0x1EB851EC, 0x3FFA7C16,0x1F82F5DD,
+	0x40060000,0x00000000, 0x3FFA8872,0x93FD6F34,
+	0x4006147A,0xE147AE14, 0x3FFA94C9,0x48E4800E,
+	0x400628F5,0xC28F5C29, 0x3FFAA11A,0x4635B928,
+	0x40063D70,0xA3D70A3D, 0x3FFAAD65,0x93DC3940,
+	0x400651EB,0x851EB852, 0x3FFAB9AB,0x39B0E884,
+	0x40066666,0x66666666, 0x3FFAC5EB,0x3F7AB2F8,
+	0x40067AE1,0x47AE147B, 0x3FFAD225,0xACEEC1FC,
+	0x40068F5C,0x28F5C28F, 0x3FFADE5A,0x89B0B4E2,
+	0x4006A3D7,0x0A3D70A4, 0x3FFAEA89,0xDD52D896,
+	0x4006B851,0xEB851EB8, 0x3FFAF6B3,0xAF565E6F,
+	0x4006CCCC,0xCCCCCCCD, 0x3FFB02D8,0x072B921B,
+	0x4006E147,0xAE147AE1, 0x3FFB0EF6,0xEC320EAD,
+	0x4006F5C2,0x8F5C28F6, 0x3FFB1B10,0x65B8F2E3,
+	0x40070A3D,0x70A3D70A, 0x3FFB2724,0x7AFF148F,
+	0x40071EB8,0x51EB851F, 0x3FFB3333,0x33333333,
+	0x40073333,0x33333333, 0x3FFB3F3C,0x957429DA,
+	0x400747AE,0x147AE148, 0x3FFB4B40,0xA8D12027,
+	0x40075C28,0xF5C28F5C, 0x3FFB573F,0x7449BA9F,
+	0x400770A3,0xD70A3D71, 0x3FFB6338,0xFECE4A3D,
+	0x4007851E,0xB851EB85, 0x3FFB6F2D,0x4F3FFB41,
+	0x40079999,0x9999999A, 0x3FFB7B1C,0x6C710352,
+	0x4007AE14,0x7AE147AE, 0x3FFB8706,0x5D24CEE3,
+	0x4007C28F,0x5C28F5C3, 0x3FFB92EB,0x28102DED,
+	0x4007D70A,0x3D70A3D7, 0x3FFB9ECA,0xD3D97FF8,
+	0x4007EB85,0x1EB851EC, 0x3FFBAAA5,0x6718DF80,
+	0x40080000,0x00000000, 0x3FFBB67A,0xE8584CAA,
+	0x4008147A,0xE147AE14, 0x3FFBC24B,0x5E13D75E,
+	0x400828F5,0xC28F5C29, 0x3FFBCE16,0xCEB9C8BA,
+	0x40083D70,0xA3D70A3D, 0x3FFBD9DD,0x40AACBE7,
+	0x400851EB,0x851EB852, 0x3FFBE59E,0xBA3A165A,
+	0x40086666,0x66666666, 0x3FFBF15B,0x41AD8F74,
+	0x40087AE1,0x47AE147B, 0x3FFBFD12,0xDD3DF78F,
+	0x40088F5C,0x28F5C28F, 0x3FFC08C5,0x93170E7B,
+	0x4008A3D7,0x0A3D70A4, 0x3FFC1473,0x6957B96B,
+	0x4008B851,0xEB851EB8, 0x3FFC201C,0x6612284A,
+	0x4008CCCC,0xCCCCCCCD, 0x3FFC2BC0,0x8F4BFA98,
+	0x4008E147,0xAE147AE1, 0x3FFC375F,0xEAFE63A8,
+	0x4008F5C2,0x8F5C28F6, 0x3FFC42FA,0x7F164E6C,
+	0x40090A3D,0x70A3D70A, 0x3FFC4E90,0x517480AD,
+	0x40091EB8,0x51EB851F, 0x3FFC5A21,0x67EDBDCD,
+	0x40093333,0x33333333, 0x3FFC65AD,0xC84AE903,
+	0x400947AE,0x147AE148, 0x3FFC7135,0x7849271A,
+	0x40095C28,0xF5C28F5C, 0x3FFC7CB8,0x7D99FFBA,
+	0x400970A3,0xD70A3D71, 0x3FFC8836,0xDDE37E36,
+	0x4009851E,0xB851EB85, 0x3FFC93B0,0x9EC051DA,
+	0x40099999,0x9999999A, 0x3FFC9F25,0xC5BFEDD9,
+	0x4009AE14,0x7AE147AE, 0x3FFCAA96,0x5866A8B2,
+	0x4009C28F,0x5C28F5C3, 0x3FFCB602,0x5C2DDB31,
+	0x4009D70A,0x3D70A3D7, 0x3FFCC169,0xD683FF02,
+	0x4009EB85,0x1EB851EC, 0x3FFCCCCC,0xCCCCCCCD,
+	0x400A0000,0x00000000, 0x3FFCD82B,0x446159F3,
+	0x400A147A,0xE147AE14, 0x3FFCE385,0x429035DB,
+	0x400A28F5,0xC28F5C29, 0x3FFCEEDA,0xCC9D86D5,
+	0x400A3D70,0xA3D70A3D, 0x3FFCFA2B,0xE7C3269F,
+	0x400A51EB,0x851EB852, 0x3FFD0578,0x9930BE82,
+	0x400A6666,0x66666666, 0x3FFD10C0,0xE60BE308,
+	0x400A7AE1,0x47AE147B, 0x3FFD1C04,0xD3702F5C,
+	0x400A8F5C,0x28F5C28F, 0x3FFD2744,0x666F6040,
+	0x400AA3D7,0x0A3D70A4, 0x3FFD327F,0xA4116EAB,
+	0x400AB851,0xEB851EB8, 0x3FFD3DB6,0x9154AA0E,
+	0x400ACCCC,0xCCCCCCCD, 0x3FFD48E9,0x332DD234,
+	0x400AE147,0xAE147AE1, 0x3FFD5417,0x8E8830D5,
+	0x400AF5C2,0x8F5C28F6, 0x3FFD5F41,0xA845B2CB,
+	0x400B0A3D,0x70A3D70A, 0x3FFD6A67,0x853F00F0,
+	0x400B1EB8,0x51EB851F, 0x3FFD7589,0x2A4398AC,
+	0x400B3333,0x33333333, 0x3FFD80A6,0x9C19E42A,
+	0x400B47AE,0x147AE148, 0x3FFD8BBF,0xDF7F5240,
+	0x400B5C28,0xF5C28F5C, 0x3FFD96D4,0xF9286E05,
+	0x400B70A3,0xD70A3D71, 0x3FFDA1E5,0xEDC0F614,
+	0x400B851E,0xB851EB85, 0x3FFDACF2,0xC1EBF386,
+	0x400B9999,0x9999999A, 0x3FFDB7FB,0x7A43D09D,
+	0x400BAE14,0x7AE147AE, 0x3FFDC300,0x1B5A6F21,
+	0x400BC28F,0x5C28F5C3, 0x3FFDCE00,0xA9B93E79,
+	0x400BD70A,0x3D70A3D7, 0x3FFDD8FD,0x29E1516F,
+	0x400BEB85,0x1EB851EC, 0x3FFDE3F5,0xA04B73C0,
+	0x400C0000,0x00000000, 0x3FFDEEEA,0x11683F49,
+	0x400C147A,0xE147AE14, 0x3FFDF9DA,0x81A0310C,
+	0x400C28F5,0xC28F5C29, 0x3FFE04C6,0xF553BDD8,
+	0x400C3D70,0xA3D70A3D, 0x3FFE0FAF,0x70DB66BB,
+	0x400C51EB,0x851EB852, 0x3FFE1A93,0xF887CD30,
+	0x400C6666,0x66666666, 0x3FFE2574,0x90A1C704,
+	0x400C7AE1,0x47AE147B, 0x3FFE3051,0x3D6A7202,
+	0x400C8F5C,0x28F5C28F, 0x3FFE3B2A,0x031B475E,
+	0x400CA3D7,0x0A3D70A4, 0x3FFE45FE,0xE5E62EDE,
+	0x400CB851,0xEB851EB8, 0x3FFE50CF,0xE9F591C8,
+	0x400CCCCC,0xCCCCCCCD, 0x3FFE5B9D,0x136C6D96,
+	0x400CE147,0xAE147AE1, 0x3FFE6666,0x66666666,
+	0x400CF5C2,0x8F5C28F6, 0x3FFE712B,0xE6F7D939,
+	0x400D0A3D,0x70A3D70A, 0x3FFE7BED,0x992DEDEF,
+	0x400D1EB8,0x51EB851F, 0x3FFE86AB,0x810EA912,
+	0x400D3333,0x33333333, 0x3FFE9165,0xA298FD64,
+	0x400D47AE,0x147AE148, 0x3FFE9C1C,0x01C4DD35,
+	0x400D5C28,0xF5C28F5C, 0x3FFEA6CE,0xA2834B85,
+	0x400D70A3,0xD70A3D71, 0x3FFEB17D,0x88BE6CF1,
+	0x400D851E,0xB851EB85, 0x3FFEBC28,0xB8599867,
+	0x400D9999,0x9999999A, 0x3FFEC6D0,0x353167A9,
+	0x400DAE14,0x7AE147AE, 0x3FFED174,0x031BC79C,
+	0x400DC28F,0x5C28F5C3, 0x3FFEDC14,0x25E80867,
+	0x400DD70A,0x3D70A3D7, 0x3FFEE6B0,0xA15EED56,
+	0x400DEB85,0x1EB851EC, 0x3FFEF149,0x7942BC9D,
+	0x400E0000,0x00000000, 0x3FFEFBDE,0xB14F4EDA,
+	0x400E147A,0xE147AE14, 0x3FFF0670,0x4D3A1E6F,
+	0x400E28F5,0xC28F5C29, 0x3FFF10FE,0x50B256B1,
+	0x400E3D70,0xA3D70A3D, 0x3FFF1B88,0xBF60E2DE,
+	0x400E51EB,0x851EB852, 0x3FFF260F,0x9CE87CEE,
+	0x400E6666,0x66666666, 0x3FFF3092,0xECE5BC35,
+	0x400E7AE1,0x47AE147B, 0x3FFF3B12,0xB2EF23D7,
+	0x400E8F5C,0x28F5C28F, 0x3FFF458E,0xF2953111,
+	0x400EA3D7,0x0A3D70A4, 0x3FFF5007,0xAF626957,
+	0x400EB851,0xEB851EB8, 0x3FFF5A7C,0xECDB684A,
+	0x400ECCCC,0xCCCCCCCD, 0x3FFF64EE,0xAE7EED81,
+	0x400EE147,0xAE147AE1, 0x3FFF6F5C,0xF7C5EA25,
+	0x400EF5C2,0x8F5C28F6, 0x3FFF79C7,0xCC238E74,
+	0x400F0A3D,0x70A3D70A, 0x3FFF842F,0x2F055704,
+	0x400F1EB8,0x51EB851F, 0x3FFF8E93,0x23D319F6,
+	0x400F3333,0x33333333, 0x3FFF98F3,0xADEF13F2,
+	0x400F47AE,0x147AE148, 0x3FFFA350,0xD0B5F505,
+	0x400F5C28,0xF5C28F5C, 0x3FFFADAA,0x8F7EED52,
+	0x400F70A3,0xD70A3D71, 0x3FFFB800,0xED9BB9A8,
+	0x400F851E,0xB851EB85, 0x3FFFC253,0xEE58AFEA,
+	0x400F9999,0x9999999A, 0x3FFFCCA3,0x94FCCB55,
+	0x400FAE14,0x7AE147AE, 0x3FFFD6EF,0xE4C9B8A5,
+	0x400FC28F,0x5C28F5C3, 0x3FFFE138,0xE0FBE215,
+	0x400FD70A,0x3D70A3D7, 0x3FFFEB7E,0x8CCA7B39,
+	0x400FEB85,0x1EB851EC, 0x3FFFF5C0,0xEB678CBF,
+	0x40100000,0x00000000, 0x40000000,0x00000000,
+	0x40100A3D,0x70A3D70A, 0x4000051D,0xE6DDD53F,
+	0x4010147A,0xE147AE14, 0x40000A3A,0x2BDEAC9B,
+	0x40101EB8,0x51EB851F, 0x40000F54,0xD0916DEE,
+	0x401028F5,0xC28F5C29, 0x4000146D,0xD68287F3,
+	0x40103333,0x33333333, 0x40001985,0x3F3BF5CA,
+	0x40103D70,0xA3D70A3D, 0x40001E9B,0x0C45445B,
+	0x401047AE,0x147AE148, 0x400023AF,0x3F2397B6,
+	0x401051EB,0x851EB852, 0x400028C1,0xD959B062,
+	0x40105C28,0xF5C28F5C, 0x40002DD2,0xDC67F097,
+	0x40106666,0x66666666, 0x400032E2,0x49CC6171,
+	0x401070A3,0xD70A3D71, 0x400037F0,0x2302B811,
+	0x40107AE1,0x47AE147B, 0x40003CFC,0x69845AA9,
+	0x4010851E,0xB851EB85, 0x40004207,0x1EC8658A,
+	0x40108F5C,0x28F5C28F, 0x40004710,0x4443B015,
+	0x40109999,0x9999999A, 0x40004C17,0xDB68D1A2,
+	0x4010A3D7,0x0A3D70A4, 0x4000511D,0xE5A8265F,
+	0x4010AE14,0x7AE147AE, 0x40005622,0x646FD41A,
+	0x4010B851,0xEB851EB8, 0x40005B25,0x592BCF05,
+	0x4010C28F,0x5C28F5C3, 0x40006026,0xC545DE65,
+	0x4010CCCC,0xCCCCCCCD, 0x40006526,0xAA25A13B,
+	0x4010D70A,0x3D70A3D7, 0x40006A25,0x093092DC,
+	0x4010E147,0xAE147AE1, 0x40006F21,0xE3CA0F7F,
+	0x4010EB85,0x1EB851EC, 0x4000741D,0x3B5358BE,
+	0x4010F5C2,0x8F5C28F6, 0x40007917,0x112B9A06,
+	0x40110000,0x00000000, 0x40007E0F,0x66AFED07,
+	0x40110A3D,0x70A3D70A, 0x40008306,0x3D3B5E08,
+	0x4011147A,0xE147AE14, 0x400087FB,0x9626F03C,
+	0x40111EB8,0x51EB851F, 0x40008CEF,0x72C9A206,
+	0x401128F5,0xC28F5C29, 0x400091E1,0xD4787132,
+	0x40113333,0x33333333, 0x400096D2,0xBC865F23,
+	0x40113D70,0xA3D70A3D, 0x40009BC2,0x2C4474F6,
+	0x401147AE,0x147AE148, 0x4000A0B0,0x2501C79A,
+	0x401151EB,0x851EB852, 0x4000A59C,0xA80B7BD9,
+	0x40115C28,0xF5C28F5C, 0x4000AA87,0xB6ACCA63,
+	0x40116666,0x66666666, 0x4000AF71,0x522F03BB,
+	0x401170A3,0xD70A3D71, 0x4000B459,0x7BD9942C,
+	0x40117AE1,0x47AE147B, 0x4000B940,0x34F207A5,
+	0x4011851E,0xB851EB85, 0x4000BE25,0x7EBC0D98,
+	0x40118F5C,0x28F5C28F, 0x4000C309,0x5A797CC3,
+	0x40119999,0x9999999A, 0x4000C7EB,0xC96A56F6,
+	0x4011A3D7,0x0A3D70A4, 0x4000CCCC,0xCCCCCCCD,
+	0x4011AE14,0x7AE147AE, 0x4000D1AC,0x65DD4162,
+	0x4011B851,0xEB851EB8, 0x4000D68A,0x95D64DF3,
+	0x4011C28F,0x5C28F5C3, 0x4000DB67,0x5DF0C580,
+	0x4011CCCC,0xCCCCCCCD, 0x4000E042,0xBF63B85D,
+	0x4011D70A,0x3D70A3D7, 0x4000E51C,0xBB6477C0,
+	0x4011E147,0xAE147AE1, 0x4000E9F5,0x53269942,
+	0x4011EB85,0x1EB851EC, 0x4000EECC,0x87DBFA55,
+	0x4011F5C2,0x8F5C28F6, 0x4000F3A2,0x5AB4C3B7,
+	0x40120000,0x00000000, 0x4000F876,0xCCDF6CD9,
+	0x40120A3D,0x70A3D70A, 0x4000FD49,0xDF88BF3C,
+	0x4012147A,0xE147AE14, 0x4001021B,0x93DBD9C4,
+	0x40121EB8,0x51EB851F, 0x400106EB,0xEB02340D,
+	0x401228F5,0xC28F5C29, 0x40010BBA,0xE623A1A6,
+	0x40123333,0x33333333, 0x40011088,0x86665555,
+	0x40123D70,0xA3D70A3D, 0x40011554,0xCCEEE448,
+	0x401247AE,0x147AE148, 0x40011A1F,0xBAE04943,
+	0x401251EB,0x851EB852, 0x40011EE9,0x515BE7C1,
+	0x40125C28,0xF5C28F5C, 0x400123B1,0x91818F15,
+	0x40126666,0x66666666, 0x40012878,0x7C6F7D7A,
+	0x401270A3,0xD70A3D71, 0x40012D3E,0x13426323,
+	0x40127AE1,0x47AE147B, 0x40013202,0x5715653E,
+	0x4012851E,0xB851EB85, 0x400136C5,0x490220F3,
+	0x40128F5C,0x28F5C28F, 0x40013B86,0xEA20AE5C,
+	0x40129999,0x9999999A, 0x40014047,0x3B87A370,
+	0x4012A3D7,0x0A3D70A4, 0x40014506,0x3E4C16EB,
+	0x4012AE14,0x7AE147AE, 0x400149C3,0xF381A332,
+	0x4012B851,0xEB851EB8, 0x40014E80,0x5C3A692B,
+	0x4012C28F,0x5C28F5C3, 0x4001533B,0x7987130E,
+	0x4012CCCC,0xCCCCCCCD, 0x400157F5,0x4C76D72F,
+	0x4012D70A,0x3D70A3D7, 0x40015CAD,0xD6177AC7,
+	0x4012E147,0xAE147AE1, 0x40016165,0x177554AE,
+	0x4012EB85,0x1EB851EC, 0x4001661B,0x119B5016,
+	0x4012F5C2,0x8F5C28F6, 0x40016ACF,0xC592EF36,
+	0x40130000,0x00000000, 0x40016F83,0x34644DF9,
+	0x40130A3D,0x70A3D70A, 0x40017435,0x5F16249E,
+	0x4013147A,0xE147AE14, 0x400178E6,0x46ADCA59,
+	0x40131EB8,0x51EB851F, 0x40017D95,0xEC2F37E6,
+	0x401328F5,0xC28F5C29, 0x40018244,0x509D0A1A,
+	0x40133333,0x33333333, 0x400186F1,0x74F88472,
+	0x40133D70,0xA3D70A3D, 0x40018B9D,0x5A419391,
+	0x401347AE,0x147AE148, 0x40019048,0x0176CFC3,
+	0x401351EB,0x851EB852, 0x400194F1,0x6B957F72,
+	0x40135C28,0xF5C28F5C, 0x40019999,0x9999999A,
+	0x40136666,0x66666666, 0x40019E40,0x8C7DC837,
+	0x401370A3,0xD70A3D71, 0x4001A2E6,0x453B6AAA,
+	0x40137AE1,0x47AE147B, 0x4001A78A,0xC4CA981B,
+	0x4013851E,0xB851EB85, 0x4001AC2E,0x0C2221D3,
+	0x40138F5C,0x28F5C28F, 0x4001B0D0,0x1C379595,
+	0x40139999,0x9999999A, 0x4001B570,0xF5FF3FED,
+	0x4013A3D7,0x0A3D70A4, 0x4001BA10,0x9A6C2E79,
+	0x4013AE14,0x7AE147AE, 0x4001BEAF,0x0A703231,
+	0x4013B851,0xEB851EB8, 0x4001C34C,0x46FBE1A9,
+	0x4013C28F,0x5C28F5C3, 0x4001C7E8,0x50FE9B49,
+	0x4013CCCC,0xCCCCCCCD, 0x4001CC83,0x29668782,
+	0x4013D70A,0x3D70A3D7, 0x4001D11C,0xD1209B03,
+	0x4013E147,0xAE147AE1, 0x4001D5B5,0x491898E2,
+	0x4013EB85,0x1EB851EC, 0x4001DA4C,0x923914C4,
+	0x4013F5C2,0x8F5C28F6, 0x4001DEE2,0xAD6B74FB,
+	0x40140000,0x00000000, 0x4001E377,0x9B97F4A8,
+	0x40140A3D,0x70A3D70A, 0x4001E80B,0x5DA5A5D0,
+	0x4014147A,0xE147AE14, 0x4001EC9D,0xF47A736F,
+	0x40141EB8,0x51EB851F, 0x4001F12F,0x60FB2388,
+	0x401428F5,0xC28F5C29, 0x4001F5BF,0xA40B592C,
+	0x40143333,0x33333333, 0x4001FA4E,0xBE8D9681,
+	0x40143D70,0xA3D70A3D, 0x4001FEDC,0xB1633EC2,
+	0x401447AE,0x147AE148, 0x40020369,0x7D6C983C,
+	0x401451EB,0x851EB852, 0x400207F5,0x2388CE40,
+	0x40145C28,0xF5C28F5C, 0x40020C7F,0xA495F31F,
+	0x40146666,0x66666666, 0x40021109,0x0171020F,
+	0x401470A3,0xD70A3D71, 0x40021591,0x3AF5E11D,
+	0x40147AE1,0x47AE147B, 0x40021A18,0x51FF630A,
+	0x4014851E,0xB851EB85, 0x40021E9E,0x47674937,
+	0x40148F5C,0x28F5C28F, 0x40022323,0x1C06457A,
+	0x40149999,0x9999999A, 0x400227A6,0xD0B3FBFB,
+	0x4014A3D7,0x0A3D70A4, 0x40022C29,0x66470506,
+	0x4014AE14,0x7AE147AE, 0x400230AA,0xDD94EEE1,
+	0x4014B851,0xEB851EB8, 0x4002352B,0x37723F94,
+	0x4014C28F,0x5C28F5C3, 0x400239AA,0x74B276B3,
+	0x4014CCCC,0xCCCCCCCD, 0x40023E28,0x96280F23,
+	0x4014D70A,0x3D70A3D7, 0x400242A5,0x9CA480DD,
+	0x4014E147,0xAE147AE1, 0x40024721,0x88F842A9,
+	0x4014EB85,0x1EB851EC, 0x40024B9C,0x5BF2CBD8,
+	0x4014F5C2,0x8F5C28F6, 0x40025016,0x166295F7,
+	0x40150000,0x00000000, 0x4002548E,0xB9151E85,
+	0x40150A3D,0x70A3D70A, 0x40025906,0x44D6E89F,
+	0x4015147A,0xE147AE14, 0x40025D7C,0xBA737EA7,
+	0x40151EB8,0x51EB851F, 0x400261F2,0x1AB573F3,
+	0x401528F5,0xC28F5C29, 0x40026666,0x66666666,
+	0x40153333,0x33333333, 0x40026AD9,0x9E4F0017,
+	0x40153D70,0xA3D70A3D, 0x40026F4B,0xC336F8EA,
+	0x401547AE,0x147AE148, 0x400273BC,0xD5E51828,
+	0x401551EB,0x851EB852, 0x4002782C,0xD71F3615,
+	0x40155C28,0xF5C28F5C, 0x40027C9B,0xC7AA3D82,
+	0x40156666,0x66666666, 0x40028109,0xA84A2D5B,
+	0x401570A3,0xD70A3D71, 0x40028576,0x79C21A32,
+	0x40157AE1,0x47AE147B, 0x400289E2,0x3CD42FC3,
+	0x4015851E,0xB851EB85, 0x40028E4C,0xF241B280,
+	0x40158F5C,0x28F5C28F, 0x400292B6,0x9ACB010B,
+	0x40159999,0x9999999A, 0x4002971F,0x372F95B6,
+	0x4015A3D7,0x0A3D70A4, 0x40029B86,0xC82E07FF,
+	0x4015AE14,0x7AE147AE, 0x40029FED,0x4E840E06,
+	0x4015B851,0xEB851EB8, 0x4002A452,0xCAEE7E03,
+	0x4015C28F,0x5C28F5C3, 0x4002A8B7,0x3E294FB5,
+	0x4015CCCC,0xCCCCCCCD, 0x4002AD1A,0xA8EF9DD1,
+	0x4015D70A,0x3D70A3D7, 0x4002B17D,0x0BFBA76F,
+	0x4015E147,0xAE147AE1, 0x4002B5DE,0x6806D170,
+	0x4015EB85,0x1EB851EC, 0x4002BA3E,0xBDC9A7E6,
+	0x4015F5C2,0x8F5C28F6, 0x4002BE9E,0x0DFBDF72,
+	0x40160000,0x00000000, 0x4002C2FC,0x595456A7,
+	0x40160A3D,0x70A3D70A, 0x4002C759,0xA0891765,
+	0x4016147A,0xE147AE14, 0x4002CBB5,0xE44F5836,
+	0x40161EB8,0x51EB851F, 0x4002D011,0x255B7D9E,
+	0x401628F5,0xC28F5C29, 0x4002D46B,0x64611B76,
+	0x40163333,0x33333333, 0x4002D8C4,0xA212F639,
+	0x40163D70,0xA3D70A3D, 0x4002DD1C,0xDF230457,
+	0x401647AE,0x147AE148, 0x4002E174,0x1C426F7A,
+	0x401651EB,0x851EB852, 0x4002E5CA,0x5A2195D8,
+	0x40165C28,0xF5C28F5C, 0x4002EA1F,0x99700B70,
+	0x40166666,0x66666666, 0x4002EE73,0xDADC9B57,
+	0x401670A3,0xD70A3D71, 0x4002F2C7,0x1F1548F4,
+	0x40167AE1,0x47AE147B, 0x4002F719,0x66C7513E,
+	0x4016851E,0xB851EB85, 0x4002FB6A,0xB29F2BFD,
+	0x40168F5C,0x28F5C28F, 0x4002FFBB,0x03488D00,
+	0x40169999,0x9999999A, 0x4003040A,0x596E6555,
+	0x4016A3D7,0x0A3D70A4, 0x40030858,0xB5BAE47C,
+	0x4016AE14,0x7AE147AE, 0x40030CA6,0x18D7799F,
+	0x4016B851,0xEB851EB8, 0x400310F2,0x836CD4BA,
+	0x4016C28F,0x5C28F5C3, 0x4003153D,0xF622E7D0,
+	0x4016CCCC,0xCCCCCCCD, 0x40031988,0x71A0E80E,
+	0x4016D70A,0x3D70A3D7, 0x40031DD1,0xF68D4EFC,
+	0x4016E147,0xAE147AE1, 0x4003221A,0x858DDB9D,
+	0x4016EB85,0x1EB851EC, 0x40032662,0x1F479396,
+	0x4016F5C2,0x8F5C28F6, 0x40032AA8,0xC45EC450,
+	0x40170000,0x00000000, 0x40032EEE,0x75770416,
+	0x40170A3D,0x70A3D70A, 0x40033333,0x33333333,
+	0x4017147A,0xE147AE14, 0x40033776,0xFE357D0C,
+	0x40171EB8,0x51EB851F, 0x40033BB9,0xD71F593B,
+	0x401728F5,0xC28F5C29, 0x40033FFB,0xBE918CA2,
+	0x40173333,0x33333333, 0x4003443C,0xB52C2A85,
+	0x40173D70,0xA3D70A3D, 0x4003487C,0xBB8E9595,
+	0x401747AE,0x147AE148, 0x40034CBB,0xD2578108,
+	0x401751EB,0x851EB852, 0x400350F9,0xFA24F1A0,
+	0x40175C28,0xF5C28F5C, 0x40035537,0x33943EBD,
+	0x40176666,0x66666666, 0x40035973,0x7F421360,
+	0x401770A3,0xD70A3D71, 0x40035DAE,0xDDCA6F3C,
+	0x40177AE1,0x47AE147B, 0x400361E9,0x4FC8A7B2,
+	0x4017851E,0xB851EB85, 0x40036622,0xD5D768DE,
+	0x40178F5C,0x28F5C28F, 0x40036A5B,0x7090B690,
+	0x40179999,0x9999999A, 0x40036E93,0x208DED54,
+	0x4017A3D7,0x0A3D70A4, 0x400372C9,0xE667C36B,
+	0x4017AE14,0x7AE147AE, 0x400376FF,0xC2B649C7,
+	0x4017B851,0xEB851EB8, 0x40037B34,0xB610ED09,
+	0x4017C28F,0x5C28F5C3, 0x40037F68,0xC10E7675,
+	0x4017CCCC,0xCCCCCCCD, 0x4003839B,0xE4450CE8,
+	0x4017D70A,0x3D70A3D7, 0x400387CE,0x204A35D2,
+	0x4017E147,0xAE147AE1, 0x40038BFF,0x75B2D623,
+	0x4017EB85,0x1EB851EC, 0x4003902F,0xE513333D,
+	0x4017F5C2,0x8F5C28F6, 0x4003945F,0x6EFEF3E5,
+	0x40180000,0x00000000, 0x4003988E,0x1409212E,
+	0x40180A3D,0x70A3D70A, 0x40039CBB,0xD4C42766,
+	0x4018147A,0xE147AE14, 0x4003A0E8,0xB1C1D6FE,
+	0x40181EB8,0x51EB851F, 0x4003A514,0xAB936573,
+	0x401828F5,0xC28F5C29, 0x4003A93F,0xC2C96E34,
+	0x40183333,0x33333333, 0x4003AD69,0xF7F3F385,
+	0x40183D70,0xA3D70A3D, 0x4003B193,0x4BA25F66,
+	0x401847AE,0x147AE148, 0x4003B5BB,0xBE63846E,
+	0x401851EB,0x851EB852, 0x4003B9E3,0x50C59EAE,
+	0x40185C28,0xF5C28F5C, 0x4003BE0A,0x03565490,
+	0x40186666,0x66666666, 0x4003C22F,0xD6A2B7B1,
+	0x401870A3,0xD70A3D71, 0x4003C654,0xCB3745BA,
+	0x40187AE1,0x47AE147B, 0x4003CA78,0xE19FE93C,
+	0x4018851E,0xB851EB85, 0x4003CE9C,0x1A67FA85,
+	0x40188F5C,0x28F5C28F, 0x4003D2BE,0x761A4077,
+	0x40189999,0x9999999A, 0x4003D6DF,0xF540F15E,
+	0x4018A3D7,0x0A3D70A4, 0x4003DB00,0x9865B3BD,
+	0x4018AE14,0x7AE147AE, 0x4003DF20,0x60119F23,
+	0x4018B851,0xEB851EB8, 0x4003E33F,0x4CCD3CFB,
+	0x4018C28F,0x5C28F5C3, 0x4003E75D,0x5F20895A,
+	0x4018CCCC,0xCCCCCCCD, 0x4003EB7A,0x9792F3C6,
+	0x4018D70A,0x3D70A3D7, 0x4003EF96,0xF6AB600B,
+	0x4018E147,0xAE147AE1, 0x4003F3B2,0x7CF026FA,
+	0x4018EB85,0x1EB851EC, 0x4003F7CD,0x2AE7173A,
+	0x4018F5C2,0x8F5C28F6, 0x4003FBE7,0x01157608,
+	0x40190000,0x00000000, 0x40040000,0x00000000,
+	0x40190A3D,0x70A3D70A, 0x40040418,0x282AE9E0,
+	0x4019147A,0xE147AE14, 0x4004082F,0x7A19E149,
+	0x40191EB8,0x51EB851F, 0x40040C45,0xF6500D83,
+	0x401928F5,0xC28F5C29, 0x4004105B,0x9D501039,
+	0x40193333,0x33333333, 0x40041470,0x6F9C063A,
+	0x40193D70,0xA3D70A3D, 0x40041884,0x6DB58834,
+	0x401947AE,0x147AE148, 0x40041C97,0x981DAB71,
+	0x401951EB,0x851EB852, 0x400420A9,0xEF550290,
+	0x40195C28,0xF5C28F5C, 0x400424BB,0x73DB9E40,
+	0x40196666,0x66666666, 0x400428CC,0x26310DF4,
+	0x401970A3,0xD70A3D71, 0x40042CDC,0x06D4609E,
+	0x40197AE1,0x47AE147B, 0x400430EB,0x1644255E,
+	0x4019851E,0xB851EB85, 0x400434F9,0x54FE6C3B,
+	0x40198F5C,0x28F5C28F, 0x40043906,0xC380C6D4,
+	0x40199999,0x9999999A, 0x40043D13,0x6248490F,
+	0x4019A3D7,0x0A3D70A4, 0x4004411F,0x31D189CC,
+	0x4019AE14,0x7AE147AE, 0x4004452A,0x3298A391,
+	0x4019B851,0xEB851EB8, 0x40044934,0x65193539,
+	0x4019C28F,0x5C28F5C3, 0x40044D3D,0xC9CE62A3,
+	0x4019CCCC,0xCCCCCCCD, 0x40045146,0x6132D554,
+	0x4019D70A,0x3D70A3D7, 0x4004554E,0x2BC0BD2C,
+	0x4019E147,0xAE147AE1, 0x40045955,0x29F1D108,
+	0x4019EB85,0x1EB851EC, 0x40045D5B,0x5C3F4F6B,
+	0x4019F5C2,0x8F5C28F6, 0x40046160,0xC321FF25,
+	0x401A0000,0x00000000, 0x40046565,0x5F122FF6,
+	0x401A0A3D,0x70A3D70A, 0x40046969,0x3087BB36,
+	0x401A147A,0xE147AE14, 0x40046D6C,0x37FA0475,
+	0x401A1EB8,0x51EB851F, 0x4004716E,0x75DFFA1C,
+	0x401A28F5,0xC28F5C29, 0x4004756F,0xEAB01610,
+	0x401A3333,0x33333333, 0x40047970,0x96E05E52,
+	0x401A3D70,0xA3D70A3D, 0x40047D70,0x7AE6659A,
+	0x401A47AE,0x147AE148, 0x4004816F,0x97374BF7,
+	0x401A51EB,0x851EB852, 0x4004856D,0xEC47BF6D,
+	0x401A5C28,0xF5C28F5C, 0x4004896B,0x7A8BFC8B,
+	0x401A6666,0x66666666, 0x40048D68,0x4277CF0B,
+	0x401A70A3,0xD70A3D71, 0x40049164,0x447E9266,
+	0x401A7AE1,0x47AE147B, 0x4004955F,0x81133271,
+	0x401A851E,0xB851EB85, 0x40049959,0xF8A82BEF,
+	0x401A8F5C,0x28F5C28F, 0x40049D53,0xABAF8D2C,
+	0x401A9999,0x9999999A, 0x4004A14C,0x9A9AF68E,
+	0x401AA3D7,0x0A3D70A4, 0x4004A544,0xC5DB9B2B,
+	0x401AAE14,0x7AE147AE, 0x4004A93C,0x2DE2415C,
+	0x401AB851,0xEB851EB8, 0x4004AD32,0xD31F434E,
+	0x401AC28F,0x5C28F5C3, 0x4004B128,0xB6028F96,
+	0x401ACCCC,0xCCCCCCCD, 0x4004B51D,0xD6FBA9BB,
+	0x401AD70A,0x3D70A3D7, 0x4004B912,0x3679AACC,
+	0x401AE147,0xAE147AE1, 0x4004BD05,0xD4EB41E9,
+	0x401AEB85,0x1EB851EC, 0x4004C0F8,0xB2BEB4D5,
+	0x401AF5C2,0x8F5C28F6, 0x4004C4EA,0xD061E07A,
+	0x401B0000,0x00000000, 0x4004C8DC,0x2E423980,
+	0x401B0A3D,0x70A3D70A, 0x4004CCCC,0xCCCCCCCD,
+	0x401B147A,0xE147AE14, 0x4004D0BC,0xAC6E4014,
+	0x401B1EB8,0x51EB851F, 0x4004D4AB,0xCD92D25C,
+	0x401B28F5,0xC28F5C29, 0x4004D89A,0x30A65C87,
+	0x401B3333,0x33333333, 0x4004DC87,0xD61451DA,
+	0x401B3D70,0xA3D70A3D, 0x4004E074,0xBE47C083,
+	0x401B47AE,0x147AE148, 0x4004E460,0xE9AB521D,
+	0x401B51EB,0x851EB852, 0x4004E84C,0x58A94C32,
+	0x401B5C28,0xF5C28F5C, 0x4004EC37,0x0BAB90C4,
+	0x401B6666,0x66666666, 0x4004F021,0x031B9ECA,
+	0x401B70A3,0xD70A3D71, 0x4004F40A,0x3F6292B3,
+	0x401B7AE1,0x47AE147B, 0x4004F7F2,0xC0E926E9,
+	0x401B851E,0xB851EB85, 0x4004FBDA,0x8817B44D,
+	0x401B8F5C,0x28F5C28F, 0x4004FFC1,0x955632B8,
+	0x401B9999,0x9999999A, 0x400503A7,0xE90C397B,
+	0x401BA3D7,0x0A3D70A4, 0x4005078D,0x83A0FFD7,
+	0x401BAE14,0x7AE147AE, 0x40050B72,0x657B5D7E,
+	0x401BB851,0xEB851EB8, 0x40050F56,0x8F01CB10,
+	0x401BC28F,0x5C28F5C3, 0x4005133A,0x009A6290,
+	0x401BCCCC,0xCCCCCCCD, 0x4005171C,0xBAAADFE2,
+	0x401BD70A,0x3D70A3D7, 0x40051AFE,0xBD98A145,
+	0x401BE147,0xAE147AE1, 0x40051EE0,0x09C8A7CA,
+	0x401BEB85,0x1EB851EC, 0x400522C0,0x9F9F97CC,
+	0x401BF5C2,0x8F5C28F6, 0x400526A0,0x7F81B966,
+	0x401C0000,0x00000000, 0x40052A7F,0xA9D2F8EA,
+	0x401C0A3D,0x70A3D70A, 0x40052E5E,0x1EF6E758,
+	0x401C147A,0xE147AE14, 0x4005323B,0xDF50BAD1,
+	0x401C1EB8,0x51EB851F, 0x40053618,0xEB434F0B,
+	0x401C28F5,0xC28F5C29, 0x400539F5,0x433125C3,
+	0x401C3333,0x33333333, 0x40053DD0,0xE77C6734,
+	0x401C3D70,0xA3D70A3D, 0x400541AB,0xD886E283,
+	0x401C47AE,0x147AE148, 0x40054586,0x16B20E33,
+	0x401C51EB,0x851EB852, 0x4005495F,0xA25F0897,
+	0x401C5C28,0xF5C28F5C, 0x40054D38,0x7BEE983C,
+	0x401C6666,0x66666666, 0x40055110,0xA3C12C5E,
+	0x401C70A3,0xD70A3D71, 0x400554E8,0x1A36DD53,
+	0x401C7AE1,0x47AE147B, 0x400558BE,0xDFAF6CF9,
+	0x401C851E,0xB851EB85, 0x40055C94,0xF48A4723,
+	0x401C8F5C,0x28F5C28F, 0x4005606A,0x59268203,
+	0x401C9999,0x9999999A, 0x4005643F,0x0DE2DE9A,
+	0x401CA3D7,0x0A3D70A4, 0x40056813,0x131DC91E,
+	0x401CAE14,0x7AE147AE, 0x40056BE6,0x69355968,
+	0x401CB851,0xEB851EB8, 0x40056FB9,0x10875359,
+	0x401CC28F,0x5C28F5C3, 0x4005738B,0x09712747,
+	0x401CCCCC,0xCCCCCCCD, 0x4005775C,0x544FF263,
+	0x401CD70A,0x3D70A3D7, 0x40057B2C,0xF1807F20,
+	0x401CE147,0xAE147AE1, 0x40057EFC,0xE15F459C,
+	0x401CEB85,0x1EB851EC, 0x400582CC,0x24486C03,
+	0x401CF5C2,0x8F5C28F6, 0x4005869A,0xBA97C6F7,
+	0x401D0000,0x00000000, 0x40058A68,0xA4A8D9F3,
+	0x401D0A3D,0x70A3D70A, 0x40058E35,0xE2D6D7B3,
+	0x401D147A,0xE147AE14, 0x40059202,0x757CA292,
+	0x401D1EB8,0x51EB851F, 0x400595CE,0x5CF4CCF2,
+	0x401D28F5,0xC28F5C29, 0x40059999,0x9999999A,
+	0x401D3333,0x33333333, 0x40059D64,0x2BC4FC1C,
+	0x401D3D70,0xA3D70A3D, 0x4005A12E,0x13D09934,
+	0x401D47AE,0x147AE148, 0x4005A4F7,0x5215C72B,
+	0x401D51EB,0x851EB852, 0x4005A8BF,0xE6ED8E2F,
+	0x401D5C28,0xF5C28F5C, 0x4005AC87,0xD2B0A8BF,
+	0x401D6666,0x66666666, 0x4005B04F,0x15B783FF,
+	0x401D70A3,0xD70A3D71, 0x4005B415,0xB05A401C,
+	0x401D7AE1,0x47AE147B, 0x4005B7DB,0xA2F0B0A8,
+	0x401D851E,0xB851EB85, 0x4005BBA0,0xEDD25CF8,
+	0x401D8F5C,0x28F5C28F, 0x4005BF65,0x9156807D,
+	0x401D9999,0x9999999A, 0x4005C329,0x8DD40B25,
+	0x401DA3D7,0x0A3D70A4, 0x4005C6EC,0xE3A1A1B5,
+	0x401DAE14,0x7AE147AE, 0x4005CAAF,0x93159E20,
+	0x401DB851,0xEB851EB8, 0x4005CE71,0x9C860FE7,
+	0x401DC28F,0x5C28F5C3, 0x4005D233,0x0048BC6E,
+	0x401DCCCC,0xCCCCCCCD, 0x4005D5F3,0xBEB31F59,
+	0x401DD70A,0x3D70A3D7, 0x4005D9B3,0xD81A6AE1,
+	0x401DE147,0xAE147AE1, 0x4005DD73,0x4CD38830,
+	0x401DEB85,0x1EB851EC, 0x4005E132,0x1D3317B6,
+	0x401DF5C2,0x8F5C28F6, 0x4005E4F0,0x498D717F,
+	0x401E0000,0x00000000, 0x4005E8AD,0xD236A58F,
+	0x401E0A3D,0x70A3D70A, 0x4005EC6A,0xB7827C31,
+	0x401E147A,0xE147AE14, 0x4005F026,0xF9C47652,
+	0x401E1EB8,0x51EB851F, 0x4005F3E2,0x994FCDD2,
+	0x401E28F5,0xC28F5C29, 0x4005F79D,0x967775DC,
+	0x401E3333,0x33333333, 0x4005FB57,0xF18E1B39,
+	0x401E3D70,0xA3D70A3D, 0x4005FF11,0xAAE624A0,
+	0x401E47AE,0x147AE148, 0x400602CA,0xC2D1B30F,
+	0x401E51EB,0x851EB852, 0x40060683,0x39A2A218,
+	0x401E5C28,0xF5C28F5C, 0x40060A3B,0x0FAA8838,
+	0x401E6666,0x66666666, 0x40060DF2,0x453AB723,
+	0x401E70A3,0xD70A3D71, 0x400611A8,0xDAA43C1C,
+	0x401E7AE1,0x47AE147B, 0x4006155E,0xD037E03D,
+	0x401E851E,0xB851EB85, 0x40061914,0x264628CF,
+	0x401E8F5C,0x28F5C28F, 0x40061CC8,0xDD1F5796,
+	0x401E9999,0x9999999A, 0x4006207C,0xF5136B20,
+	0x401EA3D7,0x0A3D70A4, 0x40062430,0x6E721F12,
+	0x401EAE14,0x7AE147AE, 0x400627E3,0x498AEC7C,
+	0x401EB851,0xEB851EB8, 0x40062B95,0x86AD0A22,
+	0x401EC28F,0x5C28F5C3, 0x40062F47,0x26276CCA,
+	0x401ECCCC,0xCCCCCCCD, 0x400632F8,0x2848C789,
+	0x401ED70A,0x3D70A3D7, 0x400636A8,0x8D5F8C11,
+	0x401EE147,0xAE147AE1, 0x40063A58,0x55B9EAFB,
+	0x401EEB85,0x1EB851EC, 0x40063E07,0x81A5D413,
+	0x401EF5C2,0x8F5C28F6, 0x400641B6,0x1170F6A5,
+	0x401F0000,0x00000000, 0x40064564,0x0568C1C3,
+	0x401F0A3D,0x70A3D70A, 0x40064911,0x5DDA6496,
+	0x401F147A,0xE147AE14, 0x40064CBE,0x1B12CEA2,
+	0x401F1EB8,0x51EB851F, 0x4006506A,0x3D5EB010,
+	0x401F28F5,0xC28F5C29, 0x40065415,0xC50A79FB,
+	0x401F3333,0x33333333, 0x400657C0,0xB2625EB4,
+	0x401F3D70,0xA3D70A3D, 0x40065B6B,0x05B2520D,
+	0x401F47AE,0x147AE148, 0x40065F14,0xBF4609A0,
+	0x401F51EB,0x851EB852, 0x400662BD,0xDF68FD14,
+	0x401F5C28,0xF5C28F5C, 0x40066666,0x66666666,
+	0x401F6666,0x66666666, 0x40066A0E,0x54894232,
+	0x401F70A3,0xD70A3D71, 0x40066DB5,0xAA1C4FF4,
+	0x401F7AE1,0x47AE147B, 0x4006715C,0x676A124F,
+	0x401F851E,0xB851EB85, 0x40067502,0x8CBCCF54,
+	0x401F8F5C,0x28F5C28F, 0x400678A8,0x1A5E90C8,
+	0x401F9999,0x9999999A, 0x40067C4D,0x10992464,
+	0x401FA3D7,0x0A3D70A4, 0x40067FF1,0x6FB61C1C,
+	0x401FAE14,0x7AE147AE, 0x40068395,0x37FECE62,
+	0x401FB851,0xEB851EB8, 0x40068738,0x69BC566A,
+	0x401FC28F,0x5C28F5C3, 0x40068ADB,0x0537946E,
+	0x401FCCCC,0xCCCCCCCD, 0x40068E7D,0x0AB92DEC,
+	0x401FD70A,0x3D70A3D7, 0x4006921E,0x7A898DED,
+	0x401FE147,0xAE147AE1, 0x400695BF,0x54F0E543,
+	0x401FEB85,0x1EB851EC, 0x4006995F,0x9A372AD0,
+	0x401FF5C2,0x8F5C28F6, 0x40069CFF,0x4AA41BBF,
+	};
+/*
+LOCAL_D const TUint32 ArctanTest[] =
+	{
+	0x00000000,0x00000000, 0x00000000,0x00000000,
+	0x3F847AE1,0x47AE147B, 0x3F847AB4,0x8B1EFB5D,
+	0x3F947AE1,0x47AE147B, 0x3F947A2E,0x5DAFFF07,
+	0x3F9EB851,0xEB851EB8, 0x3F9EB5F6,0x44234B83,
+	0x3FA47AE1,0x47AE147B, 0x3FA47816,0x23768D56,
+	0x3FA99999,0x9999999A, 0x3FA99425,0x97929F27,
+	0x3FAEB851,0xEB851EB8, 0x3FAEAEE7,0x34B5DD23,
+	0x3FB1EB85,0x1EB851EC, 0x3FB1E40C,0x8B780FDE,
+	0x3FB47AE1,0x47AE147B, 0x3FB46FBC,0xE9DFCC00,
+	0x3FB70A3D,0x70A3D70A, 0x3FB6FA64,0x46B1CB54,
+	0x3FB99999,0x9999999A, 0x3FB983E2,0x82E2CC4D,
+	0x3FBC28F5,0xC28F5C29, 0x3FBC0C17,0xD875967A,
+	0x3FBEB851,0xEB851EB8, 0x3FBE92E4,0xE371F679,
+	0x3FC0A3D7,0x0A3D70A4, 0x3FC08C15,0x5549DC84,
+	0x3FC1EB85,0x1EB851EC, 0x3FC1CDE5,0x53D5FE66,
+	0x3FC33333,0x33333333, 0x3FC30ED3,0x67D7CD04,
+	0x3FC47AE1,0x47AE147B, 0x3FC44ED0,0xCD36E62E,
+	0x3FC5C28F,0x5C28F5C3, 0x3FC58DCF,0x04F55E58,
+	0x3FC70A3D,0x70A3D70A, 0x3FC6CBBF,0xD8ACFF50,
+	0x3FC851EB,0x851EB852, 0x3FC80895,0x5DDAC693,
+	0x3FC99999,0x9999999A, 0x3FC94441,0xF8F7260C,
+	0x3FCAE147,0xAE147AE1, 0x3FCA7EB8,0x6059C7DA,
+	0x3FCC28F5,0xC28F5C29, 0x3FCBB7EB,0x9EE7D317,
+	0x3FCD70A3,0xD70A3D71, 0x3FCCEFCF,0x168BED03,
+	0x3FCEB851,0xEB851EB8, 0x3FCE2656,0x82776E76,
+	0x3FD00000,0x00000000, 0x3FCF5B75,0xF92C80DD,
+	0x3FD0A3D7,0x0A3D70A4, 0x3FD04790,0xF72887D4,
+	0x3FD147AE,0x147AE148, 0x3FD0E0A7,0x9A2559AF,
+	0x3FD1EB85,0x1EB851EC, 0x3FD178F9,0x7ED1F891,
+	0x3FD28F5C,0x28F5C28F, 0x3FD21081,0x6F1DAE81,
+	0x3FD33333,0x33333333, 0x3FD2A73A,0x661EAF06,
+	0x3FD3D70A,0x3D70A3D7, 0x3FD33D1F,0x9074C099,
+	0x3FD47AE1,0x47AE147B, 0x3FD3D22C,0x4C92395D,
+	0x3FD51EB8,0x51EB851F, 0x3FD4665C,0x2AEBEED4,
+	0x3FD5C28F,0x5C28F5C3, 0x3FD4F9AA,0xEE10CA82,
+	0x3FD66666,0x66666666, 0x3FD58C14,0x8AA9C5D6,
+	0x3FD70A3D,0x70A3D70A, 0x3FD61D95,0x27631EA9,
+	0x3FD7AE14,0x7AE147AE, 0x3FD6AE29,0x1CBFA274,
+	0x3FD851EB,0x851EB852, 0x3FD73DCC,0xF4D6FA15,
+	0x3FD8F5C2,0x8F5C28F6, 0x3FD7CC7D,0x6AFFE959,
+	0x3FD99999,0x9999999A, 0x3FD85A37,0x6B677DC0,
+	0x3FDA3D70,0xA3D70A3D, 0x3FD8E6F8,0x12962E4E,
+	0x3FDAE147,0xAE147AE1, 0x3FD972BC,0xACE3F311,
+	0x3FDB851E,0xB851EB85, 0x3FD9FD82,0xB5DC5E5F,
+	0x3FDC28F5,0xC28F5C29, 0x3FDA8747,0xD793C3DC,
+	0x3FDCCCCC,0xCCCCCCCD, 0x3FDB1009,0xE9EE79BC,
+	0x3FDD70A3,0xD70A3D71, 0x3FDB97C6,0xF1DB4032,
+	0x3FDE147A,0xE147AE14, 0x3FDC1E7D,0x2081D8E2,
+	0x3FDEB851,0xEB851EB8, 0x3FDCA42A,0xD266D56F,
+	0x3FDF5C28,0xF5C28F5C, 0x3FDD28CE,0x8E859FEF,
+	0x3FE00000,0x00000000, 0x3FDDAC67,0x0561BB4F,
+	0x3FE051EB,0x851EB852, 0x3FDE2EF3,0x101033DF,
+	0x3FE0A3D7,0x0A3D70A4, 0x3FDEB071,0xAF3A3191,
+	0x3FE0F5C2,0x8F5C28F6, 0x3FDF30E2,0x0A199675,
+	0x3FE147AE,0x147AE148, 0x3FDFB043,0x6D708C0A,
+	0x3FE19999,0x9999999A, 0x3FE0174A,0xA53E6CE4,
+	0x3FE1EB85,0x1EB851EC, 0x3FE055EB,0x9AF3EB4B,
+	0x3FE23D70,0xA3D70A3D, 0x3FE09404,0x7359DEEB,
+	0x3FE28F5C,0x28F5C28F, 0x3FE0D195,0x1A9393B7,
+	0x3FE2E147,0xAE147AE1, 0x3FE10E9D,0x8CDBAC48,
+	0x3FE33333,0x33333333, 0x3FE14B1D,0xD5F90CE1,
+	0x3FE3851E,0xB851EB85, 0x3FE18716,0x10B3DA41,
+	0x3FE3D70A,0x3D70A3D7, 0x3FE1C286,0x664AD8C9,
+	0x3FE428F5,0xC28F5C29, 0x3FE1FD6F,0x0DE97388,
+	0x3FE47AE1,0x47AE147B, 0x3FE237D0,0x4C1EAE02,
+	0x3FE4CCCC,0xCCCCCCCD, 0x3FE271AA,0x72553ED5,
+	0x3FE51EB8,0x51EB851F, 0x3FE2AAFD,0xDE4D0C9F,
+	0x3FF80000,0x00000000, 0x3FEF730B,0xD281F69B,
+	0x3FF828F5,0xC28F5C29, 0x3FEF8C22,0xEEB07043,
+	0x3FF851EB,0x851EB852, 0x3FEFA4FF,0x2D0F34B7,
+	0x3FF87AE1,0x47AE147B, 0x3FEFBDA1,0x3E3D8F55,
+	0x3FF8A3D7,0x0A3D70A4, 0x3FEFD609,0xD0B7BEFF,
+	0x3FF8CCCC,0xCCCCCCCD, 0x3FEFEE39,0x90DAD712,
+	0x3FF8F5C2,0x8F5C28F6, 0x3FF00318,0x947462A0,
+	0x3FF91EB8,0x51EB851F, 0x3FF00EF8,0xA0863CC4,
+	0x3FF947AE,0x147AE148, 0x3FF01ABD,0x3FAF16B2,
+	0x3FF970A3,0xD70A3D71, 0x3FF02666,0xC3F3E3E9,
+	0x3FF99999,0x9999999A, 0x3FF031F5,0x7E54ADBE,
+	0x3FF9C28F,0x5C28F5C3, 0x3FF03D69,0xBECEDE6D,
+	0x3FF9EB85,0x1EB851EC, 0x3FF048C3,0xD45F96F8,
+	0x3FFA147A,0xE147AE14, 0x3FF05404,0x0D060ED1,
+	0x3FFA3D70,0xA3D70A3D, 0x3FF05F2A,0xB5C5FC40,
+	0x3FFA6666,0x66666666, 0x3FF06A38,0x1AAA0497,
+	0x3FFA8F5C,0x28F5C28F, 0x3FF0752C,0x86C63350,
+	0x3FFAB851,0xEB851EB8, 0x3FF08008,0x443A7731,
+	0x3FFAE147,0xAE147AE1, 0x3FF08ACB,0x9C3524A3,
+	0x3FFB0A3D,0x70A3D70A, 0x3FF09576,0xD6F57C81,
+	0x3FFB3333,0x33333333, 0x3FF0A00A,0x3BCE369F,
+	0x3FFB5C28,0xF5C28F5C, 0x3FF0AA86,0x11280F54,
+	0x3FFB851E,0xB851EB85, 0x3FF0B4EA,0x9C845764,
+	0x3FFBAE14,0x7AE147AE, 0x3FF0BF38,0x227F85AD,
+	0x3FFBD70A,0x3D70A3D7, 0x3FF0C96E,0xE6D3CA01,
+	0x3FFC0000,0x00000000, 0x3FF0D38F,0x2C5BA09F,
+	0x3FFC28F5,0xC28F5C29, 0x3FF0DD99,0x351465C6,
+	0x3FFC51EB,0x851EB852, 0x3FF0E78D,0x4220E8EF,
+	0x3FFC7AE1,0x47AE147B, 0x3FF0F16B,0x93CBFF2A,
+	0x3FFCA3D7,0x0A3D70A4, 0x3FF0FB34,0x698B1438,
+	0x3FFCCCCC,0xCCCCCCCD, 0x3FF104E8,0x0200BA00,
+	0x3FFCF5C2,0x8F5C28F6, 0x3FF10E86,0x9AFF35F2,
+	0x3FFD1EB8,0x51EB851F, 0x3FF11810,0x718B0C06,
+	0x3FFD47AE,0x147AE148, 0x3FF12185,0xC1DD8701,
+	0x3FFD70A3,0xD70A3D71, 0x3FF12AE6,0xC7673DAB,
+	0x3FFD9999,0x9999999A, 0x3FF13433,0xBCD294B5,
+	0x3FFDC28F,0x5C28F5C3, 0x3FF13D6C,0xDC063D05,
+	0x3FFDEB85,0x1EB851EC, 0x3FF14692,0x5E27AE23,
+	0x3FFE147A,0xE147AE14, 0x3FF14FA4,0x7B9D9C95,
+	0x3FFE3D70,0xA3D70A3D, 0x3FF158A3,0x6C126BF2,
+	0x3FFE6666,0x66666666, 0x3FF1618F,0x66769C69,
+	0x3FFE8F5C,0x28F5C28F, 0x3FF16A68,0xA10333A9,
+	0x3FFEB851,0xEB851EB8, 0x3FF1732F,0x513C20E4,
+	0x3FFEE147,0xAE147AE1, 0x3FF17BE3,0xABF29BCE,
+	0x3FFF0A3D,0x70A3D70A, 0x3FF18485,0xE5477E85,
+	0x3FFF3333,0x33333333, 0x3FF18D16,0x30AD9A1A,
+	0x3FFF5C28,0xF5C28F5C, 0x3FF19594,0xC0EC05CA,
+	0x3FFF851E,0xB851EB85, 0x3FF19E01,0xC82068A8,
+	0x3FFFAE14,0x7AE147AE, 0x3FF1A65D,0x77C13DAE,
+	0x3FFFD70A,0x3D70A3D7, 0x3FF1AEA8,0x00A01226,
+	0x40000000,0x00000000, 0x3FF1B6E1,0x92EBBE44,
+	0x4000147A,0xE147AE14, 0x3FF1BF0A,0x5E3297F5,
+	0x400028F5,0xC28F5C29, 0x3FF1C722,0x91649FC2,
+	0x40003D70,0xA3D70A3D, 0x3FF1CF2A,0x5AD5A7C5,
+	0x400051EB,0x851EB852, 0x3FF1D721,0xE83F74A2,
+	0x40006666,0x66666666, 0x3FF1DF09,0x66C3D878,
+	0x40007AE1,0x47AE147B, 0x3FF1E6E1,0x02EEC7CB,
+	0x40008F5C,0x28F5C28F, 0x3FF1EEA8,0xE8B8684D,
+	0x4000A3D7,0x0A3D70A4, 0x3FF1F661,0x438719A2,
+	0x4000B851,0xEB851EB8, 0x3FF1FE0A,0x3E3177FA,
+	0x4000CCCC,0xCCCCCCCD, 0x3FF205A4,0x03005899,
+	0x4000E147,0xAE147AE1, 0x3FF20D2E,0xBBB0C03D,
+	0x4000F5C2,0x8F5C28F6, 0x3FF214AA,0x9175D36D,
+	0x40010A3D,0x70A3D70A, 0x3FF21C17,0xACFAC0AB,
+	0x40011EB8,0x51EB851F, 0x3FF22376,0x3664A496,
+	0x40013333,0x33333333, 0x3FF22AC6,0x555467F6,
+	0x400147AE,0x147AE148, 0x3FF23208,0x30E897BB,
+	0x40015C28,0xF5C28F5C, 0x3FF2393B,0xEFBF36F9,
+	0x400170A3,0xD70A3D71, 0x3FF24061,0xB7F78AE4,
+	0x4001851E,0xB851EB85, 0x3FF24779,0xAF33E0D0,
+	0x40019999,0x9999999A, 0x3FF24E83,0xFA9B4E48,
+	0x4001AE14,0x7AE147AE, 0x3FF25580,0xBEDB6B38,
+	0x4001C28F,0x5C28F5C3, 0x3FF25C70,0x202A063E,
+	0x4001D70A,0x3D70A3D7, 0x3FF26352,0x4246D324,
+	0x4001EB85,0x1EB851EC, 0x3FF26A27,0x487D139A,
+	0x40020000,0x00000000, 0x3FF270EF,0x55A53A25,
+	0x4002147A,0xE147AE14, 0x3FF277AA,0x8C26876B,
+	0x400228F5,0xC28F5C29, 0x3FF27E59,0x0DF8A1D2,
+	0x40023D70,0xA3D70A3D, 0x3FF284FA,0xFCA52783,
+	0x400251EB,0x851EB852, 0x3FF28B90,0x79493AE7,
+	0x40026666,0x66666666, 0x3FF29219,0xA49709A1,
+	0x40027AE1,0x47AE147B, 0x3FF29896,0x9ED74E17,
+	0x40028F5C,0x28F5C28F, 0x3FF29F07,0x87EACB94,
+	0x4002A3D7,0x0A3D70A4, 0x3FF2A56C,0x7F4BC517,
+	0x4002B851,0xEB851EB8, 0x3FF2ABC5,0xA40F6ED6,
+	0x4002CCCC,0xCCCCCCCD, 0x3FF2B213,0x14E75A87,
+	0x4002E147,0xAE147AE1, 0x3FF2B854,0xF022DE7D,
+	0x4002F5C2,0x8F5C28F6, 0x3FF2BE8B,0x53B077A8,
+	0x40030A3D,0x70A3D70A, 0x3FF2C4B6,0x5D1F2682,
+	0x40031EB8,0x51EB851F, 0x3FF2CAD6,0x299FC702,
+	0x40033333,0x33333333, 0x3FF2D0EA,0xD6066395,
+	0x400347AE,0x147AE148, 0x3FF2D6F4,0x7ECB833A,
+	0x40035C28,0xF5C28F5C, 0x3FF2DCF3,0x400D72C6,
+	0x400370A3,0xD70A3D71, 0x3FF2E2E7,0x35918965,
+	0x4003851E,0xB851EB85, 0x3FF2E8D0,0x7AC56862,
+	0x40039999,0x9999999A, 0x3FF2EEAF,0x2AC0364C,
+	0x4003AE14,0x7AE147AE, 0x3FF2F483,0x6043D57D,
+	0x4003C28F,0x5C28F5C3, 0x3FF2FA4D,0x35BE1618,
+	0x4003D70A,0x3D70A3D7, 0x3FF3000C,0xC549E391,
+	0x4003EB85,0x1EB851EC, 0x3FF305C2,0x28B06DC2,
+	0x40040000,0x00000000, 0x3FF30B6D,0x796A4DA8,
+	0x4004147A,0xE147AE14, 0x3FF3110E,0xD0A0A5D0,
+	0x400428F5,0xC28F5C29, 0x3FF316A6,0x472E3E7F,
+	0x40043D70,0xA3D70A3D, 0x3FF31C33,0xF5A09DB2,
+	0x400451EB,0x851EB852, 0x3FF321B7,0xF4391AF3,
+	0x40046666,0x66666666, 0x3FF32732,0x5AEDEF1D,
+	0x40047AE1,0x47AE147B, 0x3FF32CA3,0x416B401A,
+	0x40048F5C,0x28F5C28F, 0x3FF3320A,0xBF1428A7,
+	0x4004A3D7,0x0A3D70A4, 0x3FF33768,0xEB03BC31,
+	0x4004B851,0xEB851EB8, 0x3FF33CBD,0xDC0E06D0,
+	0x4004CCCC,0xCCCCCCCD, 0x3FF34209,0xA8C10980,
+	0x4004E147,0xAE147AE1, 0x3FF3474C,0x6765B28B,
+	0x4004F5C2,0x8F5C28F6, 0x3FF34C86,0x2E00D24E,
+	0x40050A3D,0x70A3D70A, 0x3FF351B7,0x12540C4D,
+	0x40051EB8,0x51EB851F, 0x3FF356DF,0x29DEC4B8,
+	0x40053333,0x33333333, 0x3FF35BFE,0x89DF0A64,
+	0x400547AE,0x147AE148, 0x3FF36115,0x47527D45,
+	0x40055C28,0xF5C28F5C, 0x3FF36623,0x76F73175,
+	0x400570A3,0xD70A3D71, 0x3FF36B29,0x2D4C8EE0,
+	0x4005851E,0xB851EB85, 0x3FF37026,0x7E942D93,
+	0x40059999,0x9999999A, 0x3FF3751B,0x7ED2AEC1,
+	0x4005AE14,0x7AE147AE, 0x3FF37A08,0x41D0928E,
+	0x4005C28F,0x5C28F5C3, 0x3FF37EEC,0xDB1B0AA9,
+	0x4005D70A,0x3D70A3D7, 0x3FF383C9,0x5E04C9B9,
+	0x4005EB85,0x1EB851EC, 0x3FF3889D,0xDDA6CFBC,
+	0x40060000,0x00000000, 0x3FF38D6A,0x6CE13353,
+	0x4006147A,0xE147AE14, 0x3FF3922F,0x1E5BE80C,
+	0x400628F5,0xC28F5C29, 0x3FF396EC,0x048781BA,
+	0x40063D70,0xA3D70A3D, 0x3FF39BA1,0x319DF4DD,
+	0x400651EB,0x851EB852, 0x3FF3A04E,0xB7A35432,
+	0x40066666,0x66666666, 0x3FF3A4F4,0xA8668B69,
+	0x40067AE1,0x47AE147B, 0x3FF3A993,0x15821717,
+	0x40068F5C,0x28F5C28F, 0x3FF3AE2A,0x105CB9E3,
+	0x4006A3D7,0x0A3D70A4, 0x3FF3B2B9,0xAA2A2F0B,
+	0x4006B851,0xEB851EB8, 0x3FF3B741,0xF3EBDA34,
+	0x4006CCCC,0xCCCCCCCD, 0x3FF3BBC2,0xFE7174A3,
+	0x4006E147,0xAE147AE1, 0x3FF3C03C,0xDA59B7E2,
+	0x4006F5C2,0x8F5C28F6, 0x3FF3C4AF,0x981305D8,
+	0x40070A3D,0x70A3D70A, 0x3FF3C91B,0x47DC0E63,
+	0x40071EB8,0x51EB851F, 0x3FF3CD7F,0xF9C4727D,
+	0x40073333,0x33333333, 0x3FF3D1DD,0xBDAD64F0,
+	0x400747AE,0x147AE148, 0x3FF3D634,0xA34A48B1,
+	0x40075C28,0xF5C28F5C, 0x3FF3DA84,0xBA214CD5,
+	0x400770A3,0xD70A3D71, 0x3FF3DECE,0x118C0645,
+	0x4007851E,0xB851EB85, 0x3FF3E310,0xB8B8071A,
+	0x40079999,0x9999999A, 0x3FF3E74C,0xBEA773CD,
+	0x4007AE14,0x7AE147AE, 0x3FF3EB82,0x32319624,
+	0x4007C28F,0x5C28F5C3, 0x3FF3EFB1,0x22036DFF,
+	0x4007D70A,0x3D70A3D7, 0x3FF3F3D9,0x9CA03FF5,
+	0x4007EB85,0x1EB851EC, 0x3FF3F7FB,0xB06221E3,
+	0x40080000,0x00000000, 0x3FF3FC17,0x6B7A8560,
+	0x4008147A,0xE147AE14, 0x3FF4002C,0xDBF2C02B,
+	0x400828F5,0xC28F5C29, 0x3FF4043C,0x0FAC9294,
+	0x40083D70,0xA3D70A3D, 0x3FF40845,0x1462ABEF,
+	0x400851EB,0x851EB852, 0x3FF40C47,0xF7A92D14,
+	0x40086666,0x66666666, 0x3FF41044,0xC6EE28EF,
+	0x40087AE1,0x47AE147B, 0x3FF4143B,0x8F7A2339,
+	0x40088F5C,0x28F5C28F, 0x3FF4182C,0x5E708D48,
+	0x4008A3D7,0x0A3D70A4, 0x3FF41C17,0x40D0411B,
+	0x4008B851,0xEB851EB8, 0x3FF41FFC,0x4373FA89,
+	0x4008CCCC,0xCCCCCCCD, 0x3FF423DB,0x7312CEBC,
+	0x4008E147,0xAE147AE1, 0x3FF427B4,0xDC40A1DF,
+	0x4008F5C2,0x8F5C28F6, 0x3FF42B88,0x8B6E9B1D,
+	0x40090A3D,0x70A3D70A, 0x3FF42F56,0x8CEB96F3,
+	0x40091EB8,0x51EB851F, 0x3FF4331E,0xECE497CD,
+	0x40093333,0x33333333, 0x3FF436E1,0xB765350D,
+	0x400947AE,0x147AE148, 0x3FF43A9E,0xF8580870,
+	0x40095C28,0xF5C28F5C, 0x3FF43E56,0xBB8719D9,
+	0x400970A3,0xD70A3D71, 0x3FF44209,0x0C9C4997,
+	0x4009851E,0xB851EB85, 0x3FF445B5,0xF721B91A,
+	0x40099999,0x9999999A, 0x3FF4495D,0x86823225,
+	0x4009AE14,0x7AE147AE, 0x3FF44CFF,0xC6098C8B,
+	0x4009C28F,0x5C28F5C3, 0x3FF4509C,0xC0E51269,
+	0x4009D70A,0x3D70A3D7, 0x3FF45434,0x8223E2FA,
+	0x4009EB85,0x1EB851EC, 0x3FF457C7,0x14B753F9,
+	0x400A0000,0x00000000, 0x3FF45B54,0x837351A0,
+	0x400A147A,0xE147AE14, 0x3FF45EDC,0xD90EBD46,
+	0x400A28F5,0xC28F5C29, 0x3FF46260,0x2023CAA2,
+	0x400A3D70,0xA3D70A3D, 0x3FF465DE,0x63305BBC,
+	0x400A51EB,0x851EB852, 0x3FF46957,0xAC965B89,
+	0x400A6666,0x66666666, 0x3FF46CCC,0x069C173F,
+	0x400A7AE1,0x47AE147B, 0x3FF4703B,0x7B6C9666,
+	0x400A8F5C,0x28F5C28F, 0x3FF473A6,0x1517F1A2,
+	0x400AA3D7,0x0A3D70A4, 0x3FF4770B,0xDD93A84C,
+	0x400AB851,0xEB851EB8, 0x3FF47A6C,0xDEBAF4C4,
+	0x400ACCCC,0xCCCCCCCD, 0x3FF47DC9,0x224F1FA8,
+	0x400AE147,0xAE147AE1, 0x3FF48120,0xB1F7D1C5,
+	0x400AF5C2,0x8F5C28F6, 0x3FF48473,0x974364F3,
+	0x400B0A3D,0x70A3D70A, 0x3FF487C1,0xDBA733C7,
+	0x400B1EB8,0x51EB851F, 0x3FF48B0B,0x887FE81E,
+	0x400B3333,0x33333333, 0x3FF48E50,0xA711C89D,
+	0x400B47AE,0x147AE148, 0x3FF49191,0x4089050A,
+	0x400B5C28,0xF5C28F5C, 0x3FF494CD,0x5DFA01A1,
+	0x400B70A3,0xD70A3D71, 0x3FF49805,0x0861A150,
+	0x400B851E,0xB851EB85, 0x3FF49B38,0x48A58EF0,
+	0x400B9999,0x9999999A, 0x3FF49E67,0x27948576,
+	0x400BAE14,0x7AE147AE, 0x3FF4A191,0xADE69723,
+	0x400BC28F,0x5C28F5C3, 0x3FF4A4B7,0xE43D73B8,
+	0x400BD70A,0x3D70A3D7, 0x3FF4A7D9,0xD324ADA9,
+	0x400BEB85,0x1EB851EC, 0x3FF4AAF7,0x8311FE65,
+	0x400C0000,0x00000000, 0x3FF4AE10,0xFC6589A5,
+	0x400C147A,0xE147AE14, 0x3FF4B126,0x476A1FCA,
+	0x400C28F5,0xC28F5C29, 0x3FF4B437,0x6C557F5A,
+	0x400C3D70,0xA3D70A3D, 0x3FF4B744,0x7348958C,
+	0x400C51EB,0x851EB852, 0x3FF4BA4D,0x644FBDF4,
+	0x400C6666,0x66666666, 0x3FF4BD52,0x47630152,
+	0x400C7AE1,0x47AE147B, 0x3FF4C053,0x2466537E,
+	0x400C8F5C,0x28F5C28F, 0x3FF4C350,0x0329D080,
+	0x400CA3D7,0x0A3D70A4, 0x3FF4C648,0xEB69F8CE,
+	0x400CB851,0xEB851EB8, 0x3FF4C93D,0xE4CFECBA,
+	0x400CCCCC,0xCCCCCCCD, 0x3FF4CC2E,0xF6F1A710,
+	0x400CE147,0xAE147AE1, 0x3FF4CF1C,0x295236E4,
+	0x400CF5C2,0x8F5C28F6, 0x3FF4D205,0x8361F89C,
+	0x400D0A3D,0x70A3D70A, 0x3FF4D4EB,0x0C7ECE2F,
+	0x400D1EB8,0x51EB851F, 0x3FF4D7CC,0xCBF456A3,
+	0x400D3333,0x33333333, 0x3FF4DAAA,0xC8FC24CC,
+	0x400D47AE,0x147AE148, 0x3FF4DD85,0x0ABDF549,
+	0x400D5C28,0xF5C28F5C, 0x3FF4E05B,0x984FE3C9,
+	0x400D70A3,0xD70A3D71, 0x3FF4E32E,0x78B69F9C,
+	0x400D851E,0xB851EB85, 0x3FF4E5FD,0xB2E59F85,
+	0x400D9999,0x9999999A, 0x3FF4E8C9,0x4DBF54E5,
+	0x400DAE14,0x7AE147AE, 0x3FF4EB91,0x50155E2D,
+	0x400DC28F,0x5C28F5C3, 0x3FF4EE55,0xC0A8B8AA,
+	0x400DD70A,0x3D70A3D7, 0x3FF4F116,0xA629F1A2,
+	0x400DEB85,0x1EB851EC, 0x3FF4F3D4,0x073956CA,
+	0x400E0000,0x00000000, 0x3FF4F68D,0xEA672617,
+	0x400E147A,0xE147AE14, 0x3FF4F944,0x5633BCEF,
+	0x400E28F5,0xC28F5C29, 0x3FF4FBF7,0x510FC6B2,
+	0x400E3D70,0xA3D70A3D, 0x3FF4FEA6,0xE15C6AAC,
+	0x400E51EB,0x851EB852, 0x3FF50153,0x0D6B7969,
+	0x400E6666,0x66666666, 0x3FF503FB,0xDB7F996E,
+	0x400E7AE1,0x47AE147B, 0x3FF506A1,0x51CC735C,
+	0x400E8F5C,0x28F5C28F, 0x3FF50943,0x7676DD80,
+	0x400EA3D7,0x0A3D70A4, 0x3FF50BE2,0x4F9506CB,
+	0x400EB851,0xEB851EB8, 0x3FF50E7D,0xE32EA13C,
+	0x400ECCCC,0xCCCCCCCD, 0x3FF51116,0x373D0BC2,
+	0x400EE147,0xAE147AE1, 0x3FF513AB,0x51AB7B85,
+	0x400EF5C2,0x8F5C28F6, 0x3FF5163D,0x385724AE,
+	0x400F0A3D,0x70A3D70A, 0x3FF518CB,0xF10F62A5,
+	0x400F1EB8,0x51EB851F, 0x3FF51B57,0x8195DFC6,
+	0x400F3333,0x33333333, 0x3FF51DDF,0xEF9EBC94,
+	0x400F47AE,0x147AE148, 0x3FF52065,0x40D0B66B,
+	0x400F5C28,0xF5C28F5C, 0x3FF522E7,0x7AC54DAA,
+	0x400F70A3,0xD70A3D71, 0x3FF52566,0xA308EB6C,
+	0x400F851E,0xB851EB85, 0x3FF527E2,0xBF1B06B3,
+	0x400F9999,0x9999999A, 0x3FF52A5B,0xD46E492A,
+	0x400FAE14,0x7AE147AE, 0x3FF52CD1,0xE868B35E,
+	0x400FC28F,0x5C28F5C3, 0x3FF52F45,0x0063C08A,
+	0x400FD70A,0x3D70A3D7, 0x3FF531B5,0x21AC89EA,
+	0x400FEB85,0x1EB851EC, 0x3FF53422,0x5183E999,
+	0x40100000,0x00000000, 0x3FF5368C,0x951E9CFD,
+	};
+
+LOCAL_D const TUint32 ArcsinTest[] =
+	{
+	0x00000000,0x00000000, 0x00000000,0x00000000,
+	0x3F747AE1,0x47AE147B, 0x3F747AE6,0xDF5A1444,
+	0x3F847AE1,0x47AE147B, 0x3F847AF7,0xA68F8EEF,
+	0x3F8EB851,0xEB851EB8, 0x3F8EB89D,0x6CD47A22,
+	0x3F947AE1,0x47AE147B, 0x3F947B3A,0xC64BE09A,
+	0x3F999999,0x9999999A, 0x3F999A48,0x696E25A4,
+	0x3F9EB851,0xEB851EB8, 0x3F9EB980,0x08422806,
+	0x3FA1EB85,0x1EB851EC, 0x3FA1EC75,0x06D2956A,
+	0x3FA47AE1,0x47AE147B, 0x3FA47C47,0x73AEBD59,
+	0x3FA70A3D,0x70A3D70A, 0x3FA70C3B,0x834BE3FC,
+	0x3FA99999,0x9999999A, 0x3FA99C55,0x70328659,
+	0x3FAC28F5,0xC28F5C29, 0x3FAC2C99,0x771C898D,
+	0x3FAEB851,0xEB851EB8, 0x3FAEBD0B,0xD734D8A7,
+	0x3FB0A3D7,0x0A3D70A4, 0x3FB0A6D8,0x692BB3BD,
+	0x3FB1EB85,0x1EB851EC, 0x3FB1EF46,0x56A8D28C,
+	0x3FB33333,0x33333333, 0x3FB337D1,0xD811B44C,
+	0x3FB47AE1,0x47AE147B, 0x3FB4807D,0x1320318C,
+	0x3FB5C28F,0x5C28F5C3, 0x3FB5C94A,0x2F6910FA,
+	0x3FB70A3D,0x70A3D70A, 0x3FB7123B,0x567D5638,
+	0x3FB851EB,0x851EB852, 0x3FB85B52,0xB40BE42D,
+	0x3FB99999,0x9999999A, 0x3FB9A492,0x76037884,
+	0x3FBAE147,0xAE147AE1, 0x3FBAEDFC,0xCCB50667,
+	0x3FBC28F5,0xC28F5C29, 0x3FBC3793,0xEAF67675,
+	0x3FBD70A3,0xD70A3D71, 0x3FBD815A,0x0645D212,
+	0x3FBEB851,0xEB851EB8, 0x3FBECB51,0x56ECE085,
+	0x3FC00000,0x00000000, 0x3FC00ABE,0x0C129E1E,
+	0x3FC0A3D7,0x0A3D70A4, 0x3FC0AFEE,0x441E736F,
+	0x3FC147AE,0x147AE148, 0x3FC1553A,0x745DB182,
+	0x3FC1EB85,0x1EB851EC, 0x3FC1FAA3,0xBF43AD3B,
+	0x3FC28F5C,0x28F5C28F, 0x3FC2A02B,0x49066C16,
+	0x3FC33333,0x33333333, 0x3FC345D2,0x37B20EB3,
+	0x3FC3D70A,0x3D70A3D7, 0x3FC3EB99,0xB33C8CA7,
+	0x3FC47AE1,0x47AE147B, 0x3FC49182,0xE599C592,
+	0x3FC51EB8,0x51EB851F, 0x3FC5378E,0xFACFEB5F,
+	0x3FC5C28F,0x5C28F5C3, 0x3FC5DDBF,0x210C49E2,
+	0x3FC66666,0x66666666, 0x3FC68414,0x88B8700C,
+	0x3FC70A3D,0x70A3D70A, 0x3FC72A90,0x648FBF25,
+	0x3FC7AE14,0x7AE147AE, 0x3FC7D133,0xE9B56483,
+	0x3FC851EB,0x851EB852, 0x3FC87800,0x4FCAC282,
+	0x3FC8F5C2,0x8F5C28F6, 0x3FC91EF6,0xD1064D8C,
+	0x3FC99999,0x9999999A, 0x3FC9C618,0xAA4AE23D,
+	0x3FCA3D70,0xA3D70A3D, 0x3FCA6D67,0x1B3F99C4,
+	0x3FCAE147,0xAE147AE1, 0x3FCB14E3,0x666821F8,
+	0x3FCB851E,0xB851EB85, 0x3FCBBC8E,0xD13D9EA5,
+	0x3FCC28F5,0xC28F5C29, 0x3FCC646A,0xA44819DA,
+	0x3FCCCCCC,0xCCCCCCCD, 0x3FCD0C78,0x2B38893C,
+	0x3FCD70A3,0xD70A3D71, 0x3FCDB4B8,0xB5036E9A,
+	0x3FCE147A,0xE147AE14, 0x3FCE5D2D,0x93FC1A2B,
+	0x3FCEB851,0xEB851EB8, 0x3FCF05D8,0x1DF0953F,
+	0x3FCF5C28,0xF5C28F5C, 0x3FCFAEB9,0xAC463C49,
+	0x3FD00000,0x00000000, 0x3FD02BE9,0xCE0B87CD,
+	0x3FD051EB,0x851EB852, 0x3FD08093,0xA727E129,
+	0x3FD0A3D7,0x0A3D70A4, 0x3FD0D55B,0x13E747AE,
+	0x3FD0F5C2,0x8F5C28F6, 0x3FD12A40,0xC8C16E57,
+	0x3FD147AE,0x147AE148, 0x3FD17F45,0x7C46DAAB,
+	0x3FD19999,0x9999999A, 0x3FD1D469,0xE731919C,
+	0x3FD1EB85,0x1EB851EC, 0x3FD229AE,0xC47638DD,
+	0x3FD23D70,0xA3D70A3D, 0x3FD27F14,0xD155B18A,
+	0x3FD28F5C,0x28F5C28F, 0x3FD2D49C,0xCD6F3133,
+	0x3FD2E147,0xAE147AE1, 0x3FD32A47,0x7AD2DE7F,
+	0x3FD33333,0x33333333, 0x3FD38015,0x9E14F6FF,
+	0x3FD3851E,0xB851EB85, 0x3FD3D607,0xFE6183DC,
+	0x3FD3D70A,0x3D70A3D7, 0x3FD42C1F,0x6590A37D,
+	0x3FD428F5,0xC28F5C29, 0x3FD4825C,0xA03B6E54,
+	0x3FD47AE1,0x47AE147B, 0x3FD4D8C0,0x7DD17D7D,
+	0x3FD4CCCC,0xCCCCCCCD, 0x3FD52F4B,0xD0AF1A0B,
+	0x3FD51EB8,0x51EB851F, 0x3FD585FF,0x6E341C3E,
+	0x3FD570A3,0xD70A3D71, 0x3FD5DCDC,0x2EDB8227,
+	0x3FD5C28F,0x5C28F5C3, 0x3FD633E2,0xEE53C5B9,
+	0x3FD6147A,0xE147AE14, 0x3FD68B14,0x8B97FA84,
+	0x3FD66666,0x66666666, 0x3FD6E271,0xE909BBE4,
+	0x3FD6B851,0xEB851EB8, 0x3FD739FB,0xEC8BF4B2,
+	0x3FD70A3D,0x70A3D70A, 0x3FD791B3,0x7F9E8A25,
+	0x3FD75C28,0xF5C28F5C, 0x3FD7E999,0x8F7AF3F6,
+	0x3FD7AE14,0x7AE147AE, 0x3FD841AF,0x0D31CC53,
+	0x3FD80000,0x00000000, 0x3FD899F4,0xEDC962D3,
+	0x3FD851EB,0x851EB852, 0x3FD8F26C,0x2A5D5E1D,
+	0x3FD8A3D7,0x0A3D70A4, 0x3FD94B15,0xC03F7890,
+	0x3FD8F5C2,0x8F5C28F6, 0x3FD9A3F2,0xB11964EC,
+	0x3FD947AE,0x147AE148, 0x3FD9FD04,0x030FE8A3,
+	0x3FD99999,0x9999999A, 0x3FDA564A,0xC0E73A34,
+	0x3FD9EB85,0x1EB851EC, 0x3FDAAFC7,0xFA28B2BE,
+	0x3FDA3D70,0xA3D70A3D, 0x3FDB097C,0xC349E2C6,
+	0x3FDA8F5C,0x28F5C28F, 0x3FDB636A,0x35D51B17,
+	0x3FDAE147,0xAE147AE1, 0x3FDBBD91,0x70937B7F,
+	0x3FDB3333,0x33333333, 0x3FDC17F3,0x97B89A42,
+	0x3FDB851E,0xB851EB85, 0x3FDC7291,0xD50FD81E,
+	0x3FDBD70A,0x3D70A3D7, 0x3FDCCD6D,0x582B75E4,
+	0x3FDC28F5,0xC28F5C29, 0x3FDD2887,0x569581CA,
+	0x3FDC7AE1,0x47AE147B, 0x3FDD83E1,0x0C02B412,
+	0x3FDCCCCC,0xCCCCCCCD, 0x3FDDDF7B,0xBA8753CD,
+	0x3FDD1EB8,0x51EB851F, 0x3FDE3B58,0xAACE3E1C,
+	0x3FDD70A3,0xD70A3D71, 0x3FDE9779,0x2C522BE1,
+	0x3FDDC28F,0x5C28F5C3, 0x3FDEF3DE,0x95995367,
+	0x3FDE147A,0xE147AE14, 0x3FDF508A,0x4473857E,
+	0x3FDE6666,0x66666666, 0x3FDFAD7D,0x9E3AE753,
+	0x3FDEB851,0xEB851EB8, 0x3FE0055D,0x080BB634,
+	0x3FDF0A3D,0x70A3D70A, 0x3FE03420,0x87A29B28,
+	0x3FDF5C28,0xF5C28F5C, 0x3FE0630A,0x0CAF011A,
+	0x3FDFAE14,0x7AE147AE, 0x3FE0921A,0x5A52E74D,
+	0x3FE00000,0x00000000, 0x3FE0C152,0x382D7366,
+	};
+*/
+LOCAL_D const TUint32 ArctanTest[] =
+	{
+	0x00000000,0x00000000, 0x00000000,0x00000000,
+	0x3F747AE1,0x47AE147B, 0x3F747AD6,0x186952B5,
+	0x3F847AE1,0x47AE147B, 0x3F847AB4,0x8B1EFB5D,
+	0x3F8EB851,0xEB851EB8, 0x3F8EB7BA,0xF2082977,
+	0x3F947AE1,0x47AE147B, 0x3F947A2E,0x5DAFFF07,
+	0x3F999999,0x9999999A, 0x3F99983C,0x34A774D2,
+	0x3F9EB851,0xEB851EB8, 0x3F9EB5F6,0x44234B83,
+	0x3FA1EB85,0x1EB851EC, 0x3FA1E9A5,0xEC6421B1,
+	0x3FA47AE1,0x47AE147B, 0x3FA47816,0x23768D56,
+	0x3FA70A3D,0x70A3D70A, 0x3FA70643,0x75EF93F7,
+	0x3FA99999,0x9999999A, 0x3FA99425,0x97929F27,
+	0x3FAC28F5,0xC28F5C29, 0x3FAC21B4,0x41E04F61,
+	0x3FAEB851,0xEB851EB8, 0x3FAEAEE7,0x34B5DD23,
+	0x3FB0A3D7,0x0A3D70A4, 0x3FB09DDB,0x1B75A262,
+	0x3FB1EB85,0x1EB851EC, 0x3FB1E40C,0x8B780FDE,
+	0x3FB33333,0x33333333, 0x3FB32A03,0xD5B3875B,
+	0x3FB47AE1,0x47AE147B, 0x3FB46FBC,0xE9DFCC00,
+	0x3FB5C28F,0x5C28F5C3, 0x3FB5B533,0xBC672F49,
+	0x3FB70A3D,0x70A3D70A, 0x3FB6FA64,0x46B1CB54,
+	0x3FB851EB,0x851EB852, 0x3FB83F4A,0x876FCEA2,
+	0x3FB99999,0x9999999A, 0x3FB983E2,0x82E2CC4D,
+	0x3FBAE147,0xAE147AE1, 0x3FBAC828,0x43260428,
+	0x3FBC28F5,0xC28F5C29, 0x3FBC0C17,0xD875967A,
+	0x3FBD70A3,0xD70A3D71, 0x3FBD4FAD,0x59749764,
+	0x3FBEB851,0xEB851EB8, 0x3FBE92E4,0xE371F679,
+	0x3FC00000,0x00000000, 0x3FBFD5BA,0x9AAC2F6E,
+	0x3FC0A3D7,0x0A3D70A4, 0x3FC08C15,0x5549DC84,
+	0x3FC147AE,0x147AE148, 0x3FC12D18,0xA3061410,
+	0x3FC1EB85,0x1EB851EC, 0x3FC1CDE5,0x53D5FE66,
+	0x3FC28F5C,0x28F5C28F, 0x3FC26E79,0x88FD8817,
+	0x3FC33333,0x33333333, 0x3FC30ED3,0x67D7CD04,
+	0x3FC3D70A,0x3D70A3D7, 0x3FC3AEF1,0x19F4E2B1,
+	0x3FC47AE1,0x47AE147B, 0x3FC44ED0,0xCD36E62E,
+	0x3FC51EB8,0x51EB851F, 0x3FC4EE70,0xB3EE49B0,
+	0x3FC5C28F,0x5C28F5C3, 0x3FC58DCF,0x04F55E58,
+	0x3FC66666,0x66666666, 0x3FC62CE9,0xFBCB16C0,
+	0x3FC70A3D,0x70A3D70A, 0x3FC6CBBF,0xD8ACFF50,
+	0x3FC7AE14,0x7AE147AE, 0x3FC76A4E,0xE0B0695E,
+	0x3FC851EB,0x851EB852, 0x3FC80895,0x5DDAC693,
+	0x3FC8F5C2,0x8F5C28F6, 0x3FC8A691,0x9F393230,
+	0x3FC99999,0x9999999A, 0x3FC94441,0xF8F7260C,
+	0x3FCA3D70,0xA3D70A3D, 0x3FC9E1A4,0xC4745962,
+	0x3FCAE147,0xAE147AE1, 0x3FCA7EB8,0x6059C7DA,
+	0x3FCB851E,0xB851EB85, 0x3FCB1B7B,0x30ADDF4B,
+	0x3FCC28F5,0xC28F5C29, 0x3FCBB7EB,0x9EE7D317,
+	0x3FCCCCCC,0xCCCCCCCD, 0x3FCC5408,0x1A021430,
+	0x3FCD70A3,0xD70A3D71, 0x3FCCEFCF,0x168BED03,
+	0x3FCE147A,0xE147AE14, 0x3FCD8B3F,0x0EBA40DA,
+	0x3FCEB851,0xEB851EB8, 0x3FCE2656,0x82776E76,
+	0x3FCF5C28,0xF5C28F5C, 0x3FCEC113,0xF77255BF,
+	0x3FD00000,0x00000000, 0x3FCF5B75,0xF92C80DD,
+	0x3FD051EB,0x851EB852, 0x3FCFF57B,0x19077106,
+	0x3FD0A3D7,0x0A3D70A4, 0x3FD04790,0xF72887D4,
+	0x3FD0F5C2,0x8F5C28F6, 0x3FD09434,0x8B27A260,
+	0x3FD147AE,0x147AE148, 0x3FD0E0A7,0x9A2559AF,
+	0x3FD19999,0x9999999A, 0x3FD12CE9,0x78CC4EC9,
+	0x3FD1EB85,0x1EB851EC, 0x3FD178F9,0x7ED1F891,
+	0x3FD23D70,0xA3D70A3D, 0x3FD1C4D7,0x06FABF59,
+	0x3FD28F5C,0x28F5C28F, 0x3FD21081,0x6F1DAE81,
+	0x3FD2E147,0xAE147AE1, 0x3FD25BF8,0x1827BD2A,
+	0x3FD33333,0x33333333, 0x3FD2A73A,0x661EAF06,
+	0x3FD3851E,0xB851EB85, 0x3FD2F247,0xC0238E5E,
+	0x3FD3D70A,0x3D70A3D7, 0x3FD33D1F,0x9074C099,
+	0x3FD428F5,0xC28F5C29, 0x3FD387C1,0x446FB673,
+	0x3FD47AE1,0x47AE147B, 0x3FD3D22C,0x4C92395D,
+	0x3FD4CCCC,0xCCCCCCCD, 0x3FD41C60,0x1C7B5755,
+	0x3FD51EB8,0x51EB851F, 0x3FD4665C,0x2AEBEED4,
+	0x3FD570A3,0xD70A3D71, 0x3FD4B01F,0xF1C6DC3C,
+	0x3FD5C28F,0x5C28F5C3, 0x3FD4F9AA,0xEE10CA82,
+	0x3FD6147A,0xE147AE14, 0x3FD542FC,0x9FEFA8A9,
+	0x3FD66666,0x66666666, 0x3FD58C14,0x8AA9C5D6,
+	0x3FD6B851,0xEB851EB8, 0x3FD5D4F2,0x34A495A3,
+	0x3FD70A3D,0x70A3D70A, 0x3FD61D95,0x27631EA9,
+	0x3FD75C28,0xF5C28F5C, 0x3FD665FC,0xEF8414F8,
+	0x3FD7AE14,0x7AE147AE, 0x3FD6AE29,0x1CBFA274,
+	0x3FD80000,0x00000000, 0x3FD6F619,0x41E4DEF1,
+	0x3FD851EB,0x851EB852, 0x3FD73DCC,0xF4D6FA15,
+	0x3FD8A3D7,0x0A3D70A4, 0x3FD78543,0xCE8A18F4,
+	0x3FD8F5C2,0x8F5C28F6, 0x3FD7CC7D,0x6AFFE959,
+	0x3FD947AE,0x147AE148, 0x3FD81379,0x6943ECDC,
+	0x3FD99999,0x9999999A, 0x3FD85A37,0x6B677DC0,
+	0x3FD9EB85,0x1EB851EC, 0x3FD8A0B7,0x167D8FAB,
+	0x3FDA3D70,0xA3D70A3D, 0x3FD8E6F8,0x12962E4E,
+	0x3FDA8F5C,0x28F5C28F, 0x3FD92CFA,0x0AB9BC1D,
+	0x3FDAE147,0xAE147AE1, 0x3FD972BC,0xACE3F311,
+	0x3FDB3333,0x33333333, 0x3FD9B83F,0xA9FEA9AF,
+	0x3FDB851E,0xB851EB85, 0x3FD9FD82,0xB5DC5E5F,
+	0x3FDBD70A,0x3D70A3D7, 0x3FDA4285,0x87328B23,
+	0x3FDC28F5,0xC28F5C29, 0x3FDA8747,0xD793C3DC,
+	0x3FDC7AE1,0x47AE147B, 0x3FDACBC9,0x6369A11D,
+	0x3FDCCCCC,0xCCCCCCCD, 0x3FDB1009,0xE9EE79BC,
+	0x3FDD1EB8,0x51EB851F, 0x3FDB5409,0x2D26ED16,
+	0x3FDD70A3,0xD70A3D71, 0x3FDB97C6,0xF1DB4032,
+	0x3FDDC28F,0x5C28F5C3, 0x3FDBDB42,0xFF908FB9,
+	0x3FDE147A,0xE147AE14, 0x3FDC1E7D,0x2081D8E2,
+	0x3FDE6666,0x66666666, 0x3FDC6175,0x2198DB3D,
+	0x3FDEB851,0xEB851EB8, 0x3FDCA42A,0xD266D56F,
+	0x3FDF0A3D,0x70A3D70A, 0x3FDCE69E,0x051D1ED4,
+	0x3FDF5C28,0xF5C28F5C, 0x3FDD28CE,0x8E859FEF,
+	0x3FDFAE14,0x7AE147AE, 0x3FDD6ABC,0x45FB2BAE,
+	0x3FE00000,0x00000000, 0x3FDDAC67,0x0561BB4F,
+	0x3FE028F5,0xC28F5C29, 0x3FDDEDCE,0xA91E8ED4,
+	0x3FE051EB,0x851EB852, 0x3FDE2EF3,0x101033DF,
+	0x3FE07AE1,0x47AE147B, 0x3FDE6FD4,0x1B8674C2,
+	0x3FE0A3D7,0x0A3D70A4, 0x3FDEB071,0xAF3A3191,
+	0x3FE0CCCC,0xCCCCCCCD, 0x3FDEF0CB,0xB14524F4,
+	0x3FE0F5C2,0x8F5C28F6, 0x3FDF30E2,0x0A199675,
+	0x3FE11EB8,0x51EB851F, 0x3FDF70B4,0xA479FBF9,
+	0x3FE147AE,0x147AE148, 0x3FDFB043,0x6D708C0A,
+	0x3FE170A3,0xD70A3D71, 0x3FDFEF8E,0x5446C29A,
+	0x3FE19999,0x9999999A, 0x3FE0174A,0xA53E6CE4,
+	0x3FE1C28F,0x5C28F5C3, 0x3FE036AC,0x21E09C1D,
+	0x3FE1EB85,0x1EB851EC, 0x3FE055EB,0x9AF3EB4B,
+	0x3FE2147A,0xE147AE14, 0x3FE07509,0x0C70CEC4,
+	0x3FE23D70,0xA3D70A3D, 0x3FE09404,0x7359DEEB,
+	0x3FE26666,0x66666666, 0x3FE0B2DD,0xCDB781E3,
+	0x3FE28F5C,0x28F5C28F, 0x3FE0D195,0x1A9393B7,
+	0x3FE2B851,0xEB851EB8, 0x3FE0F02A,0x59F50D7F,
+	0x3FE2E147,0xAE147AE1, 0x3FE10E9D,0x8CDBAC48,
+	0x3FE30A3D,0x70A3D70A, 0x3FE12CEE,0xB53B9841,
+	0x3FE33333,0x33333333, 0x3FE14B1D,0xD5F90CE1,
+	0x3FE35C28,0xF5C28F5C, 0x3FE1692A,0xF2E40288,
+	0x3FE3851E,0xB851EB85, 0x3FE18716,0x10B3DA41,
+	0x3FE3AE14,0x7AE147AE, 0x3FE1A4DF,0x35030C1F,
+	0x3FE3D70A,0x3D70A3D7, 0x3FE1C286,0x664AD8C9,
+	0x3FE40000,0x00000000, 0x3FE1E00B,0xABDEFEB4,
+	0x3FE428F5,0xC28F5C29, 0x3FE1FD6F,0x0DE97388,
+	0x3FE451EB,0x851EB852, 0x3FE21AB0,0x95662230,
+	0x3FE47AE1,0x47AE147B, 0x3FE237D0,0x4C1EAE02,
+	0x3FE4A3D7,0x0A3D70A4, 0x3FE254CE,0x3CA63B76,
+	0x3FE4CCCC,0xCCCCCCCD, 0x3FE271AA,0x72553ED5,
+	0x3FE4F5C2,0x8F5C28F6, 0x3FE28E64,0xF9455145,
+	0x3FE51EB8,0x51EB851F, 0x3FE2AAFD,0xDE4D0C9F,
+	0x3FE547AE,0x147AE148, 0x3FE2C775,0x2EFBEE61,
+	0x3FE570A3,0xD70A3D71, 0x3FE2E3CA,0xF996421E,
+	0x3FE59999,0x9999999A, 0x3FE2FFFF,0x4D1113C2,
+	0x3FE5C28F,0x5C28F5C3, 0x3FE31C12,0x390E29FA,
+	0x3FE5EB85,0x1EB851EC, 0x3FE33803,0xCDD8090A,
+	0x3FE6147A,0xE147AE14, 0x3FE353D4,0x1C5DFE67,
+	0x3FE63D70,0xA3D70A3D, 0x3FE36F83,0x36303552,
+	0x3FE66666,0x66666666, 0x3FE38B11,0x2D7BD4AD,
+	0x3FE68F5C,0x28F5C28F, 0x3FE3A67E,0x15072661,
+	0x3FE6B851,0xEB851EB8, 0x3FE3C1CA,0x002DC877,
+	0x3FE6E147,0xAE147AE1, 0x3FE3DCF5,0x02DCE82B,
+	0x3FE70A3D,0x70A3D70A, 0x3FE3F7FF,0x318F8723,
+	0x3FE73333,0x33333333, 0x3FE412E8,0xA14ACAFF,
+	0x3FE75C28,0xF5C28F5C, 0x3FE42DB1,0x679A576F,
+	0x3FE7851E,0xB851EB85, 0x3FE44859,0x9A8CB2EF,
+	0x3FE7AE14,0x7AE147AE, 0x3FE462E1,0x50AFB65F,
+	0x3FE7D70A,0x3D70A3D7, 0x3FE47D48,0xA10D0791,
+	0x3FE80000,0x00000000, 0x3FE4978F,0xA3269EE1,
+	0x3FE828F5,0xC28F5C29, 0x3FE4B1B6,0x6EF35814,
+	0x3FE851EB,0x851EB852, 0x3FE4CBBD,0x1CDB8E70,
+	0x3FE87AE1,0x47AE147B, 0x3FE4E5A3,0xC5B5C44A,
+	0x3FE8A3D7,0x0A3D70A4, 0x3FE4FF6A,0x82C35600,
+	0x3FE8CCCC,0xCCCCCCCD, 0x3FE51911,0x6DAD3886,
+	0x3FE8F5C2,0x8F5C28F6, 0x3FE53298,0xA080C38D,
+	0x3FE91EB8,0x51EB851F, 0x3FE54C00,0x35AC874B,
+	0x3FE947AE,0x147AE148, 0x3FE56548,0x47FD2E00,
+	0x3FE970A3,0xD70A3D71, 0x3FE57E70,0xF29A692E,
+	0x3FE99999,0x9999999A, 0x3FE5977A,0x5103EA93,
+	0x3FE9C28F,0x5C28F5C3, 0x3FE5B064,0x7F0E68E9,
+	0x3FE9EB85,0x1EB851EC, 0x3FE5C92F,0x98E0B072,
+	0x3FEA147A,0xE147AE14, 0x3FE5E1DB,0xBAF0BF3E,
+	0x3FEA3D70,0xA3D70A3D, 0x3FE5FA69,0x0200ED45,
+	0x3FEA6666,0x66666666, 0x3FE612D7,0x8B1D2038,
+	0x3FEA8F5C,0x28F5C28F, 0x3FE62B27,0x73980B11,
+	0x3FEAB851,0xEB851EB8, 0x3FE64358,0xD908795A,
+	0x3FEAE147,0xAE147AE1, 0x3FE65B6B,0xD946A61B,
+	0x3FEB0A3D,0x70A3D70A, 0x3FE67360,0x92699E72,
+	0x3FEB3333,0x33333333, 0x3FE68B37,0x22C4AFB4,
+	0x3FEB5C28,0xF5C28F5C, 0x3FE6A2EF,0xA8E4E126,
+	0x3FEB851E,0xB851EB85, 0x3FE6BA8A,0x438E7926,
+	0x3FEBAE14,0x7AE147AE, 0x3FE6D207,0x11BA8DBD,
+	0x3FEBD70A,0x3D70A3D7, 0x3FE6E966,0x3294A097,
+	0x3FEC0000,0x00000000, 0x3FE700A7,0xC5784634,
+	0x3FEC28F5,0xC28F5C29, 0x3FE717CB,0xE9EED853,
+	0x3FEC51EB,0x851EB852, 0x3FE72ED2,0xBFAD3382,
+	0x3FEC7AE1,0x47AE147B, 0x3FE745BC,0x66917FB0,
+	0x3FECA3D7,0x0A3D70A4, 0x3FE75C88,0xFEA103B5,
+	0x3FECCCCC,0xCCCCCCCD, 0x3FE77338,0xA80603BE,
+	0x3FECF5C2,0x8F5C28F6, 0x3FE789CB,0x830DAA79,
+	0x3FED1EB8,0x51EB851F, 0x3FE7A041,0xB025FCE9,
+	0x3FED47AE,0x147AE148, 0x3FE7B69B,0x4FDBD8D9,
+	0x3FED70A3,0xD70A3D71, 0x3FE7CCD8,0x82D8FDBE,
+	0x3FED9999,0x9999999A, 0x3FE7E2F9,0x69E21FFF,
+	0x3FEDC28F,0x5C28F5C3, 0x3FE7F8FE,0x25D5067B,
+	0x3FEDEB85,0x1EB851EC, 0x3FE80EE6,0xD7A6B236,
+	0x3FEE147A,0xE147AE14, 0x3FE824B3,0xA0619019,
+	0x3FEE3D70,0xA3D70A3D, 0x3FE83A64,0xA123B499,
+	0x3FEE6666,0x66666666, 0x3FE84FF9,0xFB1D212E,
+	0x3FEE8F5C,0x28F5C28F, 0x3FE86573,0xCF8E1386,
+	0x3FEEB851,0xEB851EB8, 0x3FE87AD2,0x3FC55E47,
+	0x3FEEE147,0xAE147AE1, 0x3FE89015,0x6D1ECB48,
+	0x3FEF0A3D,0x70A3D70A, 0x3FE8A53D,0x7901872A,
+	0x3FEF3333,0x33333333, 0x3FE8BA4A,0x84DE9622,
+	0x3FEF5C28,0xF5C28F5C, 0x3FE8CF3C,0xB22F51E5,
+	0x3FEF851E,0xB851EB85, 0x3FE8E414,0x2273F090,
+	0x3FEFAE14,0x7AE147AE, 0x3FE8F8D0,0xF7321467,
+	0x3FEFD70A,0x3D70A3D7, 0x3FE90D73,0x51F36458,
+	0x3FF00000,0x00000000, 0x3FE921FB,0x54442D18,
+	0x3FF0147A,0xE147AE14, 0x3FE93669,0x1FB20AC2,
+	0x3FF028F5,0xC28F5C29, 0x3FE94ABC,0xD5CA9ACF,
+	0x3FF03D70,0xA3D70A3D, 0x3FE95EF6,0x981A3654,
+	0x3FF051EB,0x851EB852, 0x3FE97316,0x882AB45A,
+	0x3FF06666,0x66666666, 0x3FE9871C,0xC7823436,
+	0x3FF07AE1,0x47AE147B, 0x3FE99B09,0x77A1EFC7,
+	0x3FF08F5C,0x28F5C28F, 0x3FE9AEDC,0xBA05156C,
+	0x3FF0A3D7,0x0A3D70A4, 0x3FE9C296,0xB01FA9A5,
+	0x3FF0B851,0xEB851EB8, 0x3FE9D637,0x7B5D702A,
+	0x3FF0CCCC,0xCCCCCCCD, 0x3FE9E9BF,0x3D20DC71,
+	0x3FF0E147,0xAE147AE1, 0x3FE9FD2E,0x16C2096D,
+	0x3FF0F5C2,0x8F5C28F6, 0x3FEA1084,0x298DB87B,
+	0x3FF10A3D,0x70A3D70A, 0x3FEA23C1,0x96C4574A,
+	0x3FF11EB8,0x51EB851F, 0x3FEA36E6,0x7F990CB6,
+	0x3FF13333,0x33333333, 0x3FEA49F3,0x0530CC61,
+	0x3FF147AE,0x147AE148, 0x3FEA5CE7,0x48A170FE,
+	0x3FF15C28,0xF5C28F5C, 0x3FEA6FC3,0x6AF0DD25,
+	0x3FF170A3,0xD70A3D71, 0x3FEA8287,0x8D142297,
+	0x3FF1851E,0xB851EB85, 0x3FEA9533,0xCFEEAFCE,
+	0x3FF19999,0x9999999A, 0x3FEAA7C8,0x545183CD,
+	0x3FF1AE14,0x7AE147AE, 0x3FEABA45,0x3AFA67F7,
+	0x3FF1C28F,0x5C28F5C3, 0x3FEACCAA,0xA4932FEE,
+	0x3FF1D70A,0x3D70A3D7, 0x3FEADEF8,0xB1B0FF43,
+	0x3FF1EB85,0x1EB851EC, 0x3FEAF12F,0x82D394F6,
+	0x3FF20000,0x00000000, 0x3FEB034F,0x38649C88,
+	0x3FF2147A,0xE147AE14, 0x3FEB1557,0xF2B704A8,
+	0x3FF228F5,0xC28F5C29, 0x3FEB2749,0xD2065B46,
+	0x3FF23D70,0xA3D70A3D, 0x3FEB3924,0xF6762EF7,
+	0x3FF251EB,0x851EB852, 0x3FEB4AE9,0x80117598,
+	0x3FF26666,0x66666666, 0x3FEB5C97,0x8EC9F805,
+	0x3FF27AE1,0x47AE147B, 0x3FEB6E2F,0x4277C2E2,
+	0x3FF28F5C,0x28F5C28F, 0x3FEB7FB0,0xBAD89C3A,
+	0x3FF2A3D7,0x0A3D70A4, 0x3FEB911C,0x178F7E06,
+	0x3FF2B851,0xEB851EB8, 0x3FEBA271,0x78241551,
+	0x3FF2CCCC,0xCCCCCCCD, 0x3FEBB3B0,0xFC024612,
+	0x3FF2E147,0xAE147AE1, 0x3FEBC4DA,0xC279B378,
+	0x3FF2F5C2,0x8F5C28F6, 0x3FEBD5EE,0xEABD4CB5,
+	0x3FF30A3D,0x70A3D70A, 0x3FEBE6ED,0x93E2DE0A,
+	0x3FF31EB8,0x51EB851F, 0x3FEBF7D6,0xDCE2A629,
+	0x3FF33333,0x33333333, 0x3FEC08AA,0xE496EFA6,
+	0x3FF347AE,0x147AE148, 0x3FEC1969,0xC9BBAE89,
+	0x3FF35C28,0xF5C28F5C, 0x3FEC2A13,0xAAEE21CF,
+	0x3FF370A3,0xD70A3D71, 0x3FEC3AA8,0xA6AC78D4,
+	0x3FF3851E,0xB851EB85, 0x3FEC4B28,0xDB557C83,
+	0x3FF39999,0x9999999A, 0x3FEC5B94,0x67283C49,
+	0x3FF3AE14,0x7AE147AE, 0x3FEC6BEB,0x6843BE9A,
+	0x3FF3C28F,0x5C28F5C3, 0x3FEC7C2D,0xFCA6B514,
+	0x3FF3D70A,0x3D70A3D7, 0x3FEC8C5C,0x422F340D,
+	0x3FF3EB85,0x1EB851EC, 0x3FEC9C76,0x569A6D90,
+	0x3FF40000,0x00000000, 0x3FECAC7C,0x57846F9E,
+	0x3FF4147A,0xE147AE14, 0x3FECBC6E,0x6267E5BD,
+	0x3FF428F5,0xC28F5C29, 0x3FECCC4C,0x949DDD9E,
+	0x3FF43D70,0xA3D70A3D, 0x3FECDC17,0x0B5D8EE8,
+	0x3FF451EB,0x851EB852, 0x3FECEBCD,0xE3BC25FE,
+	0x3FF46666,0x66666666, 0x3FECFB71,0x3AAC91BD,
+	0x3FF47AE1,0x47AE147B, 0x3FED0B01,0x2CFF5412,
+	0x3FF48F5C,0x28F5C28F, 0x3FED1A7D,0xD7625566,
+	0x3FF4A3D7,0x0A3D70A4, 0x3FED29E7,0x5660BAC1,
+	0x3FF4B851,0xEB851EB8, 0x3FED393D,0xC662BE9A,
+	0x3FF4CCCC,0xCCCCCCCD, 0x3FED4881,0x43AD8C44,
+	0x3FF4E147,0xAE147AE1, 0x3FED57B1,0xEA631DDB,
+	0x3FF4F5C2,0x8F5C28F6, 0x3FED66CF,0xD6821CBE,
+	0x3FF50A3D,0x70A3D70A, 0x3FED75DB,0x23E5C45D,
+	0x3FF51EB8,0x51EB851F, 0x3FED84D3,0xEE45C771,
+	0x3FF53333,0x33333333, 0x3FED93BA,0x5136377A,
+	0x3FF547AE,0x147AE148, 0x3FEDA28E,0x68276E77,
+	0x3FF55C28,0xF5C28F5C, 0x3FEDB150,0x4E65FACD,
+	0x3FF570A3,0xD70A3D71, 0x3FEDC000,0x1F1A8D4F,
+	0x3FF5851E,0xB851EB85, 0x3FEDCE9D,0xF549E952,
+	0x3FF59999,0x9999999A, 0x3FEDDD29,0xEBD4D6C8,
+	0x3FF5AE14,0x7AE147AE, 0x3FEDEBA4,0x1D78164E,
+	0x3FF5C28F,0x5C28F5C3, 0x3FEDFA0C,0xA4CC5721,
+	0x3FF5D70A,0x3D70A3D7, 0x3FEE0863,0x9C462EED,
+	0x3FF5EB85,0x1EB851EC, 0x3FEE16A9,0x1E36136F,
+	0x3FF60000,0x00000000, 0x3FEE24DD,0x44C855D1,
+	0x3FF6147A,0xE147AE14, 0x3FEE3300,0x2A051FBE,
+	0x3FF628F5,0xC28F5C29, 0x3FEE4111,0xE7D0721F,
+	0x3FF63D70,0xA3D70A3D, 0x3FEE4F12,0x97EA2570,
+	0x3FF651EB,0x851EB852, 0x3FEE5D02,0x53EDEBB1,
+	0x3FF66666,0x66666666, 0x3FEE6AE1,0x355353CF,
+	0x3FF67AE1,0x47AE147B, 0x3FEE78AF,0x556DCE94,
+	0x3FF68F5C,0x28F5C28F, 0x3FEE866C,0xCD6CB4F8,
+	0x3FF6A3D7,0x0A3D70A4, 0x3FEE9419,0xB65B4FE9,
+	0x3FF6B851,0xEB851EB8, 0x3FEEA1B6,0x2920E15D,
+	0x3FF6CCCC,0xCCCCCCCD, 0x3FEEAF42,0x3E80AEC0,
+	0x3FF6E147,0xAE147AE1, 0x3FEEBCBE,0x0F1A0C9F,
+	0x3FF6F5C2,0x8F5C28F6, 0x3FEECA29,0xB3686B95,
+	0x3FF70A3D,0x70A3D70A, 0x3FEED785,0x43C3666B,
+	0x3FF71EB8,0x51EB851F, 0x3FEEE4D0,0xD85ED15D,
+	0x3FF73333,0x33333333, 0x3FEEF20C,0x894ACA81,
+	0x3FF747AE,0x147AE148, 0x3FEEFF38,0x6E73CB49,
+	0x3FF75C28,0xF5C28F5C, 0x3FEF0C54,0x9FA2BB0B,
+	0x3FF770A3,0xD70A3D71, 0x3FEF1961,0x347D0299,
+	0x3FF7851E,0xB851EB85, 0x3FEF265E,0x4484A0CC,
+	0x3FF79999,0x9999999A, 0x3FEF334B,0xE718400A,
+	0x3FF7AE14,0x7AE147AE, 0x3FEF402A,0x33734CB8,
+	0x3FF7C28F,0x5C28F5C3, 0x3FEF4CF9,0x40AE0C93,
+	0x3FF7D70A,0x3D70A3D7, 0x3FEF59B9,0x25BDB6DF,
+	0x3FF7EB85,0x1EB851EC, 0x3FEF6669,0xF9748D76,
+	0x3FF80000,0x00000000, 0x3FEF730B,0xD281F69B,
+	0x3FF8147A,0xE147AE14, 0x3FEF7F9E,0xC77297A0,
+	0x3FF828F5,0xC28F5C29, 0x3FEF8C22,0xEEB07043,
+	0x3FF83D70,0xA3D70A3D, 0x3FEF9898,0x5E82F6C3,
+	0x3FF851EB,0x851EB852, 0x3FEFA4FF,0x2D0F34B7,
+	0x3FF86666,0x66666666, 0x3FEFB157,0x7057E47A,
+	0x3FF87AE1,0x47AE147B, 0x3FEFBDA1,0x3E3D8F55,
+	0x3FF88F5C,0x28F5C28F, 0x3FEFC9DC,0xAC7EAC33,
+	0x3FF8A3D7,0x0A3D70A4, 0x3FEFD609,0xD0B7BEFF,
+	0x3FF8B851,0xEB851EB8, 0x3FEFE228,0xC063788D,
+	0x3FF8CCCC,0xCCCCCCCD, 0x3FEFEE39,0x90DAD712,
+	0x3FF8E147,0xAE147AE1, 0x3FEFFA3C,0x57554724,
+	0x3FF8F5C2,0x8F5C28F6, 0x3FF00318,0x947462A0,
+	0x3FF90A3D,0x70A3D70A, 0x3FF0090C,0x0D44FFE6,
+	0x3FF91EB8,0x51EB851F, 0x3FF00EF8,0xA0863CC4,
+	0x3FF93333,0x33333333, 0x3FF014DE,0x58915640,
+	0x3FF947AE,0x147AE148, 0x3FF01ABD,0x3FAF16B2,
+	0x3FF95C28,0xF5C28F5C, 0x3FF02095,0x6017E7A5,
+	0x3FF970A3,0xD70A3D71, 0x3FF02666,0xC3F3E3E9,
+	0x3FF9851E,0xB851EB85, 0x3FF02C31,0x755AE9D6,
+	0x3FF99999,0x9999999A, 0x3FF031F5,0x7E54ADBE,
+	0x3FF9AE14,0x7AE147AE, 0x3FF037B2,0xE8D8CC86,
+	0x3FF9C28F,0x5C28F5C3, 0x3FF03D69,0xBECEDE6D,
+	0x3FF9D70A,0x3D70A3D7, 0x3FF0431A,0x0A0E89F5,
+	0x3FF9EB85,0x1EB851EC, 0x3FF048C3,0xD45F96F8,
+	0x3FFA0000,0x00000000, 0x3FF04E67,0x277A01D7,
+	0x3FFA147A,0xE147AE14, 0x3FF05404,0x0D060ED1,
+	0x3FFA28F5,0xC28F5C29, 0x3FF0599A,0x8E9C5D78,
+	0x3FFA3D70,0xA3D70A3D, 0x3FF05F2A,0xB5C5FC40,
+	0x3FFA51EB,0x851EB852, 0x3FF064B4,0x8BFC7C2C,
+	0x3FFA6666,0x66666666, 0x3FF06A38,0x1AAA0497,
+	0x3FFA7AE1,0x47AE147B, 0x3FF06FB5,0x6B296710,
+	0x3FFA8F5C,0x28F5C28F, 0x3FF0752C,0x86C63350,
+	0x3FFAA3D7,0x0A3D70A4, 0x3FF07A9D,0x76BCCB47,
+	0x3FFAB851,0xEB851EB8, 0x3FF08008,0x443A7731,
+	0x3FFACCCC,0xCCCCCCCD, 0x3FF0856C,0xF85D79D0,
+	0x3FFAE147,0xAE147AE1, 0x3FF08ACB,0x9C3524A3,
+	0x3FFAF5C2,0x8F5C28F6, 0x3FF09024,0x38C1EC36,
+	0x3FFB0A3D,0x70A3D70A, 0x3FF09576,0xD6F57C81,
+	0x3FFB1EB8,0x51EB851F, 0x3FF09AC3,0x7FB2CD4B,
+	0x3FFB3333,0x33333333, 0x3FF0A00A,0x3BCE369F,
+	0x3FFB47AE,0x147AE148, 0x3FF0A54B,0x140D8548,
+	0x3FFB5C28,0xF5C28F5C, 0x3FF0AA86,0x11280F54,
+	0x3FFB70A3,0xD70A3D71, 0x3FF0AFBB,0x3BC6C89F,
+	0x3FFB851E,0xB851EB85, 0x3FF0B4EA,0x9C845764,
+	0x3FFB9999,0x9999999A, 0x3FF0BA14,0x3BED28D4,
+	0x3FFBAE14,0x7AE147AE, 0x3FF0BF38,0x227F85AD,
+	0x3FFBC28F,0x5C28F5C3, 0x3FF0C456,0x58ABA6D7,
+	0x3FFBD70A,0x3D70A3D7, 0x3FF0C96E,0xE6D3CA01,
+	0x3FFBEB85,0x1EB851EC, 0x3FF0CE81,0xD54C463D,
+	0x3FFC0000,0x00000000, 0x3FF0D38F,0x2C5BA09F,
+	0x3FFC147A,0xE147AE14, 0x3FF0D896,0xF43AA0D5,
+	0x3FFC28F5,0xC28F5C29, 0x3FF0DD99,0x351465C6,
+	0x3FFC3D70,0xA3D70A3D, 0x3FF0E295,0xF7067A20,
+	0x3FFC51EB,0x851EB852, 0x3FF0E78D,0x4220E8EF,
+	0x3FFC6666,0x66666666, 0x3FF0EC7F,0x1E665227,
+	0x3FFC7AE1,0x47AE147B, 0x3FF0F16B,0x93CBFF2A,
+	0x3FFC8F5C,0x28F5C28F, 0x3FF0F652,0xAA39F748,
+	0x3FFCA3D7,0x0A3D70A4, 0x3FF0FB34,0x698B1438,
+	0x3FFCB851,0xEB851EB8, 0x3FF10010,0xD98D1687,
+	0x3FFCCCCC,0xCCCCCCCD, 0x3FF104E8,0x0200BA00,
+	0x3FFCE147,0xAE147AE1, 0x3FF109B9,0xEA99CA07,
+	0x3FFCF5C2,0x8F5C28F6, 0x3FF10E86,0x9AFF35F2,
+	0x3FFD0A3D,0x70A3D70A, 0x3FF1134E,0x1ACB2548,
+	0x3FFD1EB8,0x51EB851F, 0x3FF11810,0x718B0C06,
+	0x3FFD3333,0x33333333, 0x3FF11CCD,0xA6BFBECC,
+	0x3FFD47AE,0x147AE148, 0x3FF12185,0xC1DD8701,
+	0x3FFD5C28,0xF5C28F5C, 0x3FF12638,0xCA4C36E7,
+	0x3FFD70A3,0xD70A3D71, 0x3FF12AE6,0xC7673DAB,
+	0x3FFD851E,0xB851EB85, 0x3FF12F8F,0xC07DBB53,
+	0x3FFD9999,0x9999999A, 0x3FF13433,0xBCD294B5,
+	0x3FFDAE14,0x7AE147AE, 0x3FF138D2,0xC39C874C,
+	0x3FFDC28F,0x5C28F5C3, 0x3FF13D6C,0xDC063D05,
+	0x3FFDD70A,0x3D70A3D7, 0x3FF14202,0x0D2E5FFB,
+	0x3FFDEB85,0x1EB851EC, 0x3FF14692,0x5E27AE23,
+	0x3FFE0000,0x00000000, 0x3FF14B1D,0xD5F90CE1,
+	0x3FFE147A,0xE147AE14, 0x3FF14FA4,0x7B9D9C95,
+	0x3FFE28F5,0xC28F5C29, 0x3FF15426,0x5604CC0F,
+	0x3FFE3D70,0xA3D70A3D, 0x3FF158A3,0x6C126BF2,
+	0x3FFE51EB,0x851EB852, 0x3FF15D1B,0xC49EC202,
+	0x3FFE6666,0x66666666, 0x3FF1618F,0x66769C69,
+	0x3FFE7AE1,0x47AE147B, 0x3FF165FE,0x585B64DA,
+	0x3FFE8F5C,0x28F5C28F, 0x3FF16A68,0xA10333A9,
+	0x3FFEA3D7,0x0A3D70A4, 0x3FF16ECE,0x4718E2D3,
+	0x3FFEB851,0xEB851EB8, 0x3FF1732F,0x513C20E4,
+	0x3FFECCCC,0xCCCCCCCD, 0x3FF1778B,0xC60183D4,
+	0x3FFEE147,0xAE147AE1, 0x3FF17BE3,0xABF29BCE,
+	0x3FFEF5C2,0x8F5C28F6, 0x3FF18037,0x098E05DD,
+	0x3FFF0A3D,0x70A3D70A, 0x3FF18485,0xE5477E85,
+	0x3FFF1EB8,0x51EB851F, 0x3FF188D0,0x4587F449,
+	0x3FFF3333,0x33333333, 0x3FF18D16,0x30AD9A1A,
+	0x3FFF47AE,0x147AE148, 0x3FF19157,0xAD0BF9B0,
+	0x3FFF5C28,0xF5C28F5C, 0x3FF19594,0xC0EC05CA,
+	0x3FFF70A3,0xD70A3D71, 0x3FF199CD,0x728C2C5E,
+	0x3FFF851E,0xB851EB85, 0x3FF19E01,0xC82068A8,
+	0x3FFF9999,0x9999999A, 0x3FF1A231,0xC7D25530,
+	0x3FFFAE14,0x7AE147AE, 0x3FF1A65D,0x77C13DAE,
+	0x3FFFC28F,0x5C28F5C3, 0x3FF1AA84,0xDE0230DA,
+	0x3FFFD70A,0x3D70A3D7, 0x3FF1AEA8,0x00A01226,
+	0x3FFFEB85,0x1EB851EC, 0x3FF1B2C6,0xE59BAB62,
+	0x40000000,0x00000000, 0x3FF1B6E1,0x92EBBE44,
+	0x40000A3D,0x70A3D70A, 0x3FF1BAF8,0x0E7D15DE,
+	0x4000147A,0xE147AE14, 0x3FF1BF0A,0x5E3297F5,
+	0x40001EB8,0x51EB851F, 0x3FF1C318,0x87E5564B,
+	0x400028F5,0xC28F5C29, 0x3FF1C722,0x91649FC2,
+	0x40003333,0x33333333, 0x3FF1CB28,0x8076117A,
+	0x40003D70,0xA3D70A3D, 0x3FF1CF2A,0x5AD5A7C5,
+	0x400047AE,0x147AE148, 0x3FF1D328,0x2635CF0D,
+	0x400051EB,0x851EB852, 0x3FF1D721,0xE83F74A2,
+	0x40005C28,0xF5C28F5C, 0x3FF1DB17,0xA6921768,
+	0x40006666,0x66666666, 0x3FF1DF09,0x66C3D878,
+	0x400070A3,0xD70A3D71, 0x3FF1E2F7,0x2E618BA0,
+	0x40007AE1,0x47AE147B, 0x3FF1E6E1,0x02EEC7CB,
+	0x4000851E,0xB851EB85, 0x3FF1EAC6,0xE9E5F756,
+	0x40008F5C,0x28F5C28F, 0x3FF1EEA8,0xE8B8684D,
+	0x40009999,0x9999999A, 0x3FF1F287,0x04CE5C82,
+	0x4000A3D7,0x0A3D70A4, 0x3FF1F661,0x438719A2,
+	0x4000AE14,0x7AE147AE, 0x3FF1FA37,0xAA38F91A,
+	0x4000B851,0xEB851EB8, 0x3FF1FE0A,0x3E3177FA,
+	0x4000C28F,0x5C28F5C3, 0x3FF201D9,0x04B546AA,
+	0x4000CCCC,0xCCCCCCCD, 0x3FF205A4,0x03005899,
+	0x4000D70A,0x3D70A3D7, 0x3FF2096B,0x3E45F3C7,
+	0x4000E147,0xAE147AE1, 0x3FF20D2E,0xBBB0C03D,
+	0x4000EB85,0x1EB851EC, 0x3FF210EE,0x8062D76B,
+	0x4000F5C2,0x8F5C28F6, 0x3FF214AA,0x9175D36D,
+	0x40010000,0x00000000, 0x3FF21862,0xF3FADE36,
+	0x40010A3D,0x70A3D70A, 0x3FF21C17,0xACFAC0AB,
+	0x4001147A,0xE147AE14, 0x3FF21FC8,0xC175F197,
+	0x40011EB8,0x51EB851F, 0x3FF22376,0x3664A496,
+	0x400128F5,0xC28F5C29, 0x3FF22720,0x10B6D8DF,
+	0x40013333,0x33333333, 0x3FF22AC6,0x555467F6,
+	0x40013D70,0xA3D70A3D, 0x3FF22E69,0x091D144B,
+	0x400147AE,0x147AE148, 0x3FF23208,0x30E897BB,
+	0x400151EB,0x851EB852, 0x3FF235A3,0xD186B1FE,
+	0x40015C28,0xF5C28F5C, 0x3FF2393B,0xEFBF36F9,
+	0x40016666,0x66666666, 0x3FF23CD0,0x90521CFC,
+	0x400170A3,0xD70A3D71, 0x3FF24061,0xB7F78AE4,
+	0x40017AE1,0x47AE147B, 0x3FF243EF,0x6B5FE628,
+	0x4001851E,0xB851EB85, 0x3FF24779,0xAF33E0D0,
+	0x40018F5C,0x28F5C28F, 0x3FF24B00,0x8814874E,
+	0x40019999,0x9999999A, 0x3FF24E83,0xFA9B4E48,
+	0x4001A3D7,0x0A3D70A4, 0x3FF25204,0x0B5A2042,
+	0x4001AE14,0x7AE147AE, 0x3FF25580,0xBEDB6B38,
+	0x4001B851,0xEB851EB8, 0x3FF258FA,0x19A22E1C,
+	0x4001C28F,0x5C28F5C3, 0x3FF25C70,0x202A063E,
+	0x4001CCCC,0xCCCCCCCD, 0x3FF25FE2,0xD6E73C9E,
+	0x4001D70A,0x3D70A3D7, 0x3FF26352,0x4246D324,
+	0x4001E147,0xAE147AE1, 0x3FF266BE,0x66AE91C9,
+	0x4001EB85,0x1EB851EC, 0x3FF26A27,0x487D139A,
+	0x4001F5C2,0x8F5C28F6, 0x3FF26D8C,0xEC09D3B5,
+	0x40020000,0x00000000, 0x3FF270EF,0x55A53A25,
+	0x40020A3D,0x70A3D70A, 0x3FF2744E,0x8998A8AA,
+	0x4002147A,0xE147AE14, 0x3FF277AA,0x8C26876B,
+	0x40021EB8,0x51EB851F, 0x3FF27B03,0x618A5193,
+	0x400228F5,0xC28F5C29, 0x3FF27E59,0x0DF8A1D2,
+	0x40023333,0x33333333, 0x3FF281AB,0x959F3ED0,
+	0x40023D70,0xA3D70A3D, 0x3FF284FA,0xFCA52783,
+	0x400247AE,0x147AE148, 0x3FF28847,0x472A9F73,
+	0x400251EB,0x851EB852, 0x3FF28B90,0x79493AE7,
+	0x40025C28,0xF5C28F5C, 0x3FF28ED6,0x9713EAFA,
+	0x40026666,0x66666666, 0x3FF29219,0xA49709A1,
+	0x400270A3,0xD70A3D71, 0x3FF29559,0xA5D86590,
+	0x40027AE1,0x47AE147B, 0x3FF29896,0x9ED74E17,
+	0x4002851E,0xB851EB85, 0x3FF29BD0,0x938C9EDE,
+	0x40028F5C,0x28F5C28F, 0x3FF29F07,0x87EACB94,
+	0x40029999,0x9999999A, 0x3FF2A23B,0x7FDDEB84,
+	0x4002A3D7,0x0A3D70A4, 0x3FF2A56C,0x7F4BC517,
+	0x4002AE14,0x7AE147AE, 0x3FF2A89A,0x8A13D940,
+	0x4002B851,0xEB851EB8, 0x3FF2ABC5,0xA40F6ED6,
+	0x4002C28F,0x5C28F5C3, 0x3FF2AEED,0xD1119DD3,
+	0x4002CCCC,0xCCCCCCCD, 0x3FF2B213,0x14E75A87,
+	0x4002D70A,0x3D70A3D7, 0x3FF2B535,0x735780AF,
+	0x4002E147,0xAE147AE1, 0x3FF2B854,0xF022DE7D,
+	0x4002EB85,0x1EB851EC, 0x3FF2BB71,0x8F043F87,
+	0x4002F5C2,0x8F5C28F6, 0x3FF2BE8B,0x53B077A8,
+	0x40030000,0x00000000, 0x3FF2C1A2,0x41D66DC3,
+	0x40030A3D,0x70A3D70A, 0x3FF2C4B6,0x5D1F2682,
+	0x4003147A,0xE147AE14, 0x3FF2C7C7,0xA92DCEEE,
+	0x40031EB8,0x51EB851F, 0x3FF2CAD6,0x299FC702,
+	0x400328F5,0xC28F5C29, 0x3FF2CDE1,0xE20CAC27,
+	0x40033333,0x33333333, 0x3FF2D0EA,0xD6066395,
+	0x40033D70,0xA3D70A3D, 0x3FF2D3F1,0x091924AF,
+	0x400347AE,0x147AE148, 0x3FF2D6F4,0x7ECB833A,
+	0x400351EB,0x851EB852, 0x3FF2D9F5,0x3A9E7994,
+	0x40035C28,0xF5C28F5C, 0x3FF2DCF3,0x400D72C6,
+	0x40036666,0x66666666, 0x3FF2DFEE,0x928E5492,
+	0x400370A3,0xD70A3D71, 0x3FF2E2E7,0x35918965,
+	0x40037AE1,0x47AE147B, 0x3FF2E5DD,0x2C820A37,
+	0x4003851E,0xB851EB85, 0x3FF2E8D0,0x7AC56862,
+	0x40038F5C,0x28F5C28F, 0x3FF2EBC1,0x23BBD756,
+	0x40039999,0x9999999A, 0x3FF2EEAF,0x2AC0364C,
+	0x4003A3D7,0x0A3D70A4, 0x3FF2F19A,0x932819DA,
+	0x4003AE14,0x7AE147AE, 0x3FF2F483,0x6043D57D,
+	0x4003B851,0xEB851EB8, 0x3FF2F769,0x955E850A,
+	0x4003C28F,0x5C28F5C3, 0x3FF2FA4D,0x35BE1618,
+	0x4003CCCC,0xCCCCCCCD, 0x3FF2FD2E,0x44A35149,
+	0x4003D70A,0x3D70A3D7, 0x3FF3000C,0xC549E391,
+	0x4003E147,0xAE147AE1, 0x3FF302E8,0xBAE86760,
+	0x4003EB85,0x1EB851EC, 0x3FF305C2,0x28B06DC2,
+	0x4003F5C2,0x8F5C28F6, 0x3FF30899,0x11CE8769,
+	0x40040000,0x00000000, 0x3FF30B6D,0x796A4DA8,
+	0x40040A3D,0x70A3D70A, 0x3FF30E3F,0x62A66B5F,
+	0x4004147A,0xE147AE14, 0x3FF3110E,0xD0A0A5D0,
+	0x40041EB8,0x51EB851F, 0x3FF313DB,0xC671E56A,
+	0x400428F5,0xC28F5C29, 0x3FF316A6,0x472E3E7F,
+	0x40043333,0x33333333, 0x3FF3196E,0x55E4F9ED,
+	0x40043D70,0xA3D70A3D, 0x3FF31C33,0xF5A09DB2,
+	0x400447AE,0x147AE148, 0x3FF31EF7,0x2966F573,
+	0x400451EB,0x851EB852, 0x3FF321B7,0xF4391AF3,
+	0x40045C28,0xF5C28F5C, 0x3FF32476,0x59137E77,
+	0x40046666,0x66666666, 0x3FF32732,0x5AEDEF1D,
+	0x400470A3,0xD70A3D71, 0x3FF329EB,0xFCBBA323,
+	0x40047AE1,0x47AE147B, 0x3FF32CA3,0x416B401A,
+	0x4004851E,0xB851EB85, 0x3FF32F58,0x2BE6E311,
+	0x40048F5C,0x28F5C28F, 0x3FF3320A,0xBF1428A7,
+	0x40049999,0x9999999A, 0x3FF334BA,0xFDD43518,
+	0x4004A3D7,0x0A3D70A4, 0x3FF33768,0xEB03BC31,
+	0x4004AE14,0x7AE147AE, 0x3FF33A14,0x897B0939,
+	0x4004B851,0xEB851EB8, 0x3FF33CBD,0xDC0E06D0,
+	0x4004C28F,0x5C28F5C3, 0x3FF33F64,0xE58C46B4,
+	0x4004CCCC,0xCCCCCCCD, 0x3FF34209,0xA8C10980,
+	0x4004D70A,0x3D70A3D7, 0x3FF344AC,0x28734659,
+	0x4004E147,0xAE147AE1, 0x3FF3474C,0x6765B28B,
+	0x4004EB85,0x1EB851EC, 0x3FF349EA,0x6856C91E,
+	0x4004F5C2,0x8F5C28F6, 0x3FF34C86,0x2E00D24E,
+	0x40050000,0x00000000, 0x3FF34F1F,0xBB19EB09,
+	0x40050A3D,0x70A3D70A, 0x3FF351B7,0x12540C4D,
+	0x4005147A,0xE147AE14, 0x3FF3544C,0x365D127F,
+	0x40051EB8,0x51EB851F, 0x3FF356DF,0x29DEC4B8,
+	0x400528F5,0xC28F5C29, 0x3FF3596F,0xEF7EDBFB,
+	0x40053333,0x33333333, 0x3FF35BFE,0x89DF0A64,
+	0x40053D70,0xA3D70A3D, 0x3FF35E8A,0xFB9D0248,
+	0x400547AE,0x147AE148, 0x3FF36115,0x47527D45,
+	0x400551EB,0x851EB852, 0x3FF3639D,0x6F954344,
+	0x40055C28,0xF5C28F5C, 0x3FF36623,0x76F73175,
+	0x40056666,0x66666666, 0x3FF368A7,0x60064132,
+	0x400570A3,0xD70A3D71, 0x3FF36B29,0x2D4C8EE0,
+	0x40057AE1,0x47AE147B, 0x3FF36DA8,0xE15060B9,
+	0x4005851E,0xB851EB85, 0x3FF37026,0x7E942D93,
+	0x40058F5C,0x28F5C28F, 0x3FF372A2,0x0796A38D,
+	0x40059999,0x9999999A, 0x3FF3751B,0x7ED2AEC1,
+	0x4005A3D7,0x0A3D70A4, 0x3FF37792,0xE6BF7FD4,
+	0x4005AE14,0x7AE147AE, 0x3FF37A08,0x41D0928E,
+	0x4005B851,0xEB851EB8, 0x3FF37C7B,0x9275B456,
+	0x4005C28F,0x5C28F5C3, 0x3FF37EEC,0xDB1B0AA9,
+	0x4005CCCC,0xCCCCCCCD, 0x3FF3815C,0x1E291982,
+	0x4005D70A,0x3D70A3D7, 0x3FF383C9,0x5E04C9B9,
+	0x4005E147,0xAE147AE1, 0x3FF38634,0x9D0F6F50,
+	0x4005EB85,0x1EB851EC, 0x3FF3889D,0xDDA6CFBC,
+	0x4005F5C2,0x8F5C28F6, 0x3FF38B05,0x22252817,
+	0x40060000,0x00000000, 0x3FF38D6A,0x6CE13353,
+	0x40060A3D,0x70A3D70A, 0x3FF38FCD,0xC02E3054,
+	0x4006147A,0xE147AE14, 0x3FF3922F,0x1E5BE80C,
+	0x40061EB8,0x51EB851F, 0x3FF3948E,0x89B6B37D,
+	0x400628F5,0xC28F5C29, 0x3FF396EC,0x048781BA,
+	0x40063333,0x33333333, 0x3FF39947,0x9113DDDA,
+	0x40063D70,0xA3D70A3D, 0x3FF39BA1,0x319DF4DD,
+	0x400647AE,0x147AE148, 0x3FF39DF8,0xE8649B87,
+	0x400651EB,0x851EB852, 0x3FF3A04E,0xB7A35432,
+	0x40065C28,0xF5C28F5C, 0x3FF3A2A2,0xA1925490,
+	0x40066666,0x66666666, 0x3FF3A4F4,0xA8668B69,
+	0x400670A3,0xD70A3D71, 0x3FF3A744,0xCE51A646,
+	0x40067AE1,0x47AE147B, 0x3FF3A993,0x15821717,
+	0x4006851E,0xB851EB85, 0x3FF3ABDF,0x802319CC,
+	0x40068F5C,0x28F5C28F, 0x3FF3AE2A,0x105CB9E3,
+	0x40069999,0x9999999A, 0x3FF3B072,0xC853D7EF,
+	0x4006A3D7,0x0A3D70A4, 0x3FF3B2B9,0xAA2A2F0B,
+	0x4006AE14,0x7AE147AE, 0x3FF3B4FE,0xB7FE5A50,
+	0x4006B851,0xEB851EB8, 0x3FF3B741,0xF3EBDA34,
+	0x4006C28F,0x5C28F5C3, 0x3FF3B983,0x600B19E7,
+	0x4006CCCC,0xCCCCCCCD, 0x3FF3BBC2,0xFE7174A3,
+	0x4006D70A,0x3D70A3D7, 0x3FF3BE00,0xD1313AF0,
+	0x4006E147,0xAE147AE1, 0x3FF3C03C,0xDA59B7E2,
+	0x4006EB85,0x1EB851EC, 0x3FF3C277,0x1BF73649,
+	0x4006F5C2,0x8F5C28F6, 0x3FF3C4AF,0x981305D8,
+	0x40070000,0x00000000, 0x3FF3C6E6,0x50B38047,
+	0x40070A3D,0x70A3D70A, 0x3FF3C91B,0x47DC0E63,
+	0x4007147A,0xE147AE14, 0x3FF3CB4E,0x7F8D2D1A,
+	0x40071EB8,0x51EB851F, 0x3FF3CD7F,0xF9C4727D,
+	0x400728F5,0xC28F5C29, 0x3FF3CFAF,0xB87C92B4,
+	0x40073333,0x33333333, 0x3FF3D1DD,0xBDAD64F0,
+	0x40073D70,0xA3D70A3D, 0x3FF3D40A,0x0B4BE84E,
+	0x400747AE,0x147AE148, 0x3FF3D634,0xA34A48B1,
+	0x400751EB,0x851EB852, 0x3FF3D85D,0x8797E394,
+	0x40075C28,0xF5C28F5C, 0x3FF3DA84,0xBA214CD5,
+	0x40076666,0x66666666, 0x3FF3DCAA,0x3CD05374,
+	0x400770A3,0xD70A3D71, 0x3FF3DECE,0x118C0645,
+	0x40077AE1,0x47AE147B, 0x3FF3E0F0,0x3A38B8A5,
+	0x4007851E,0xB851EB85, 0x3FF3E310,0xB8B8071A,
+	0x40078F5C,0x28F5C28F, 0x3FF3E52F,0x8EE8DBF0,
+	0x40079999,0x9999999A, 0x3FF3E74C,0xBEA773CD,
+	0x4007A3D7,0x0A3D70A4, 0x3FF3E968,0x49CD6239,
+	0x4007AE14,0x7AE147AE, 0x3FF3EB82,0x32319624,
+	0x4007B851,0xEB851EB8, 0x3FF3ED9A,0x79A85E5C,
+	0x4007C28F,0x5C28F5C3, 0x3FF3EFB1,0x22036DFF,
+	0x4007CCCC,0xCCCCCCCD, 0x3FF3F1C6,0x2D11E0E2,
+	0x4007D70A,0x3D70A3D7, 0x3FF3F3D9,0x9CA03FF5,
+	0x4007E147,0xAE147AE1, 0x3FF3F5EB,0x72788596,
+	0x4007EB85,0x1EB851EC, 0x3FF3F7FB,0xB06221E3,
+	0x4007F5C2,0x8F5C28F6, 0x3FF3FA0A,0x5821FF02,
+	0x40080000,0x00000000, 0x3FF3FC17,0x6B7A8560,
+	0x40080A3D,0x70A3D70A, 0x3FF3FE22,0xEC2B9FE6,
+	0x4008147A,0xE147AE14, 0x3FF4002C,0xDBF2C02B,
+	0x40081EB8,0x51EB851F, 0x3FF40235,0x3C8AE29A,
+	0x400828F5,0xC28F5C29, 0x3FF4043C,0x0FAC9294,
+	0x40083333,0x33333333, 0x3FF40641,0x570DEE83,
+	0x40083D70,0xA3D70A3D, 0x3FF40845,0x1462ABEF,
+	0x400847AE,0x147AE148, 0x3FF40A47,0x495C1B85,
+	0x400851EB,0x851EB852, 0x3FF40C47,0xF7A92D14,
+	0x40085C28,0xF5C28F5C, 0x3FF40E47,0x20F6738D,
+	0x40086666,0x66666666, 0x3FF41044,0xC6EE28EF,
+	0x400870A3,0xD70A3D71, 0x3FF41240,0xEB383236,
+	0x40087AE1,0x47AE147B, 0x3FF4143B,0x8F7A2339,
+	0x4008851E,0xB851EB85, 0x3FF41634,0xB5574289,
+	0x40088F5C,0x28F5C28F, 0x3FF4182C,0x5E708D48,
+	0x40089999,0x9999999A, 0x3FF41A22,0x8C64BAEF,
+	0x4008A3D7,0x0A3D70A4, 0x3FF41C17,0x40D0411B,
+	0x4008AE14,0x7AE147AE, 0x3FF41E0A,0x7D4D5747,
+	0x4008B851,0xEB851EB8, 0x3FF41FFC,0x4373FA89,
+	0x4008C28F,0x5C28F5C3, 0x3FF421EC,0x94D9F140,
+	0x4008CCCC,0xCCCCCCCD, 0x3FF423DB,0x7312CEBC,
+	0x4008D70A,0x3D70A3D7, 0x3FF425C8,0xDFAFF6E8,
+	0x4008E147,0xAE147AE1, 0x3FF427B4,0xDC40A1DF,
+	0x4008EB85,0x1EB851EC, 0x3FF4299F,0x6A51DF87,
+	0x4008F5C2,0x8F5C28F6, 0x3FF42B88,0x8B6E9B1D,
+	0x40090000,0x00000000, 0x3FF42D70,0x411F9EC1,
+	0x40090A3D,0x70A3D70A, 0x3FF42F56,0x8CEB96F3,
+	0x4009147A,0xE147AE14, 0x3FF4313B,0x70571611,
+	0x40091EB8,0x51EB851F, 0x3FF4331E,0xECE497CD,
+	0x400928F5,0xC28F5C29, 0x3FF43501,0x04148498,
+	0x40093333,0x33333333, 0x3FF436E1,0xB765350D,
+	0x40093D70,0xA3D70A3D, 0x3FF438C1,0x0852F552,
+	0x400947AE,0x147AE148, 0x3FF43A9E,0xF8580870,
+	0x400951EB,0x851EB852, 0x3FF43C7B,0x88ECABAD,
+	0x40095C28,0xF5C28F5C, 0x3FF43E56,0xBB8719D9,
+	0x40096666,0x66666666, 0x3FF44030,0x919B8E94,
+	0x400970A3,0xD70A3D71, 0x3FF44209,0x0C9C4997,
+	0x40097AE1,0x47AE147B, 0x3FF443E0,0x2DF991E9,
+	0x4009851E,0xB851EB85, 0x3FF445B5,0xF721B91A,
+	0x40098F5C,0x28F5C28F, 0x3FF4478A,0x69811E74,
+	0x40099999,0x9999999A, 0x3FF4495D,0x86823225,
+	0x4009A3D7,0x0A3D70A4, 0x3FF44B2F,0x4F8D7863,
+	0x4009AE14,0x7AE147AE, 0x3FF44CFF,0xC6098C8B,
+	0x4009B851,0xEB851EB8, 0x3FF44ECE,0xEB5B243C,
+	0x4009C28F,0x5C28F5C3, 0x3FF4509C,0xC0E51269,
+	0x4009CCCC,0xCCCCCCCD, 0x3FF45269,0x48084A68,
+	0x4009D70A,0x3D70A3D7, 0x3FF45434,0x8223E2FA,
+	0x4009E147,0xAE147AE1, 0x3FF455FE,0x7095194D,
+	0x4009EB85,0x1EB851EC, 0x3FF457C7,0x14B753F9,
+	0x4009F5C2,0x8F5C28F6, 0x3FF4598E,0x6FE425FA,
+	0x400A0000,0x00000000, 0x3FF45B54,0x837351A0,
+	0x400A0A3D,0x70A3D70A, 0x3FF45D19,0x50BACB7B,
+	0x400A147A,0xE147AE14, 0x3FF45EDC,0xD90EBD46,
+	0x400A1EB8,0x51EB851F, 0x3FF4609F,0x1DC188C4,
+	0x400A28F5,0xC28F5C29, 0x3FF46260,0x2023CAA2,
+	0x400A3333,0x33333333, 0x3FF4641F,0xE1845D4B,
+	0x400A3D70,0xA3D70A3D, 0x3FF465DE,0x63305BBC,
+	0x400A47AE,0x147AE148, 0x3FF4679B,0xA6732450,
+	0x400A51EB,0x851EB852, 0x3FF46957,0xAC965B89,
+	0x400A5C28,0xF5C28F5C, 0x3FF46B12,0x76E1EED2,
+	0x400A6666,0x66666666, 0x3FF46CCC,0x069C173F,
+	0x400A70A3,0xD70A3D71, 0x3FF46E84,0x5D095C43,
+	0x400A7AE1,0x47AE147B, 0x3FF4703B,0x7B6C9666,
+	0x400A851E,0xB851EB85, 0x3FF471F1,0x6306F1F3,
+	0x400A8F5C,0x28F5C28F, 0x3FF473A6,0x1517F1A2,
+	0x400A9999,0x9999999A, 0x3FF47559,0x92DD7141,
+	0x400AA3D7,0x0A3D70A4, 0x3FF4770B,0xDD93A84C,
+	0x400AAE14,0x7AE147AE, 0x3FF478BC,0xF6752C91,
+	0x400AB851,0xEB851EB8, 0x3FF47A6C,0xDEBAF4C4,
+	0x400AC28F,0x5C28F5C3, 0x3FF47C1B,0x979C5B11,
+	0x400ACCCC,0xCCCCCCCD, 0x3FF47DC9,0x224F1FA8,
+	0x400AD70A,0x3D70A3D7, 0x3FF47F75,0x80076B48,
+	0x400AE147,0xAE147AE1, 0x3FF48120,0xB1F7D1C5,
+	0x400AEB85,0x1EB851EC, 0x3FF482CA,0xB9515482,
+	0x400AF5C2,0x8F5C28F6, 0x3FF48473,0x974364F3,
+	0x400B0000,0x00000000, 0x3FF4861B,0x4CFBE710,
+	0x400B0A3D,0x70A3D70A, 0x3FF487C1,0xDBA733C7,
+	0x400B147A,0xE147AE14, 0x3FF48967,0x44701B6B,
+	0x400B1EB8,0x51EB851F, 0x3FF48B0B,0x887FE81E,
+	0x400B28F5,0xC28F5C29, 0x3FF48CAE,0xA8FE6036,
+	0x400B3333,0x33333333, 0x3FF48E50,0xA711C89D,
+	0x400B3D70,0xA3D70A3D, 0x3FF48FF1,0x83DEE72D,
+	0x400B47AE,0x147AE148, 0x3FF49191,0x4089050A,
+	0x400B51EB,0x851EB852, 0x3FF4932F,0xDE31F0F7,
+	0x400B5C28,0xF5C28F5C, 0x3FF494CD,0x5DFA01A1,
+	0x400B6666,0x66666666, 0x3FF49669,0xC10017F1,
+	0x400B70A3,0xD70A3D71, 0x3FF49805,0x0861A150,
+	0x400B7AE1,0x47AE147B, 0x3FF4999F,0x353A99EA,
+	0x400B851E,0xB851EB85, 0x3FF49B38,0x48A58EF0,
+	0x400B8F5C,0x28F5C28F, 0x3FF49CD0,0x43BBA0D1,
+	0x400B9999,0x9999999A, 0x3FF49E67,0x27948576,
+	0x400BA3D7,0x0A3D70A4, 0x3FF49FFC,0xF5468A6D,
+	0x400BAE14,0x7AE147AE, 0x3FF4A191,0xADE69723,
+	0x400BB851,0xEB851EB8, 0x3FF4A325,0x52882F07,
+	0x400BC28F,0x5C28F5C3, 0x3FF4A4B7,0xE43D73B8,
+	0x400BCCCC,0xCCCCCCCD, 0x3FF4A649,0x64172723,
+	0x400BD70A,0x3D70A3D7, 0x3FF4A7D9,0xD324ADA9,
+	0x400BE147,0xAE147AE1, 0x3FF4A969,0x32741038,
+	0x400BEB85,0x1EB851EC, 0x3FF4AAF7,0x8311FE65,
+	0x400BF5C2,0x8F5C28F6, 0x3FF4AC84,0xC609D080,
+	0x400C0000,0x00000000, 0x3FF4AE10,0xFC6589A5,
+	0x400C0A3D,0x70A3D70A, 0x3FF4AF9C,0x272DD9CA,
+	0x400C147A,0xE147AE14, 0x3FF4B126,0x476A1FCA,
+	0x400C1EB8,0x51EB851F, 0x3FF4B2AF,0x5E206B6A,
+	0x400C28F5,0xC28F5C29, 0x3FF4B437,0x6C557F5A,
+	0x400C3333,0x33333333, 0x3FF4B5BE,0x730CD339,
+	0x400C3D70,0xA3D70A3D, 0x3FF4B744,0x7348958C,
+	0x400C47AE,0x147AE148, 0x3FF4B8C9,0x6E09ADB7,
+	0x400C51EB,0x851EB852, 0x3FF4BA4D,0x644FBDF4,
+	0x400C5C28,0xF5C28F5C, 0x3FF4BBD0,0x57192542,
+	0x400C6666,0x66666666, 0x3FF4BD52,0x47630152,
+	0x400C70A3,0xD70A3D71, 0x3FF4BED3,0x36293075,
+	0x400C7AE1,0x47AE147B, 0x3FF4C053,0x2466537E,
+	0x400C851E,0xB851EB85, 0x3FF4C1D2,0x1313CFAB,
+	0x400C8F5C,0x28F5C28F, 0x3FF4C350,0x0329D080,
+	0x400C9999,0x9999999A, 0x3FF4C4CC,0xF59F49A8,
+	0x400CA3D7,0x0A3D70A4, 0x3FF4C648,0xEB69F8CE,
+	0x400CAE14,0x7AE147AE, 0x3FF4C7C3,0xE57E6771,
+	0x400CB851,0xEB851EB8, 0x3FF4C93D,0xE4CFECBA,
+	0x400CC28F,0x5C28F5C3, 0x3FF4CAB6,0xEA50AF4C,
+	0x400CCCCC,0xCCCCCCCD, 0x3FF4CC2E,0xF6F1A710,
+	0x400CD70A,0x3D70A3D7, 0x3FF4CDA6,0x0BA29EFD,
+	0x400CE147,0xAE147AE1, 0x3FF4CF1C,0x295236E4,
+	0x400CEB85,0x1EB851EC, 0x3FF4D091,0x50EDE52D,
+	0x400CF5C2,0x8F5C28F6, 0x3FF4D205,0x8361F89C,
+	0x400D0000,0x00000000, 0x3FF4D378,0xC1999A0D,
+	0x400D0A3D,0x70A3D70A, 0x3FF4D4EB,0x0C7ECE2F,
+	0x400D147A,0xE147AE14, 0x3FF4D65C,0x64FA7739,
+	0x400D1EB8,0x51EB851F, 0x3FF4D7CC,0xCBF456A3,
+	0x400D28F5,0xC28F5C29, 0x3FF4D93C,0x42530ED3,
+	0x400D3333,0x33333333, 0x3FF4DAAA,0xC8FC24CC,
+	0x400D3D70,0xA3D70A3D, 0x3FF4DC18,0x60D401DE,
+	0x400D47AE,0x147AE148, 0x3FF4DD85,0x0ABDF549,
+	0x400D51EB,0x851EB852, 0x3FF4DEF0,0xC79C35E6,
+	0x400D5C28,0xF5C28F5C, 0x3FF4E05B,0x984FE3C9,
+	0x400D6666,0x66666666, 0x3FF4E1C5,0x7DB909E3,
+	0x400D70A3,0xD70A3D71, 0x3FF4E32E,0x78B69F9C,
+	0x400D7AE1,0x47AE147B, 0x3FF4E496,0x8A268A70,
+	0x400D851E,0xB851EB85, 0x3FF4E5FD,0xB2E59F85,
+	0x400D8F5C,0x28F5C28F, 0x3FF4E763,0xF3CFA543,
+	0x400D9999,0x9999999A, 0x3FF4E8C9,0x4DBF54E5,
+	0x400DA3D7,0x0A3D70A4, 0x3FF4EA2D,0xC18E5C04,
+	0x400DAE14,0x7AE147AE, 0x3FF4EB91,0x50155E2D,
+	0x400DB851,0xEB851EB8, 0x3FF4ECF3,0xFA2BF662,
+	0x400DC28F,0x5C28F5C3, 0x3FF4EE55,0xC0A8B8AA,
+	0x400DCCCC,0xCCCCCCCD, 0x3FF4EFB6,0xA461338E,
+	0x400DD70A,0x3D70A3D7, 0x3FF4F116,0xA629F1A2,
+	0x400DE147,0xAE147AE1, 0x3FF4F275,0xC6D67B00,
+	0x400DEB85,0x1EB851EC, 0x3FF4F3D4,0x073956CA,
+	0x400DF5C2,0x8F5C28F6, 0x3FF4F531,0x68240C9F,
+	0x400E0000,0x00000000, 0x3FF4F68D,0xEA672617,
+	0x400E0A3D,0x70A3D70A, 0x3FF4F7E9,0x8ED2303A,
+	0x400E147A,0xE147AE14, 0x3FF4F944,0x5633BCEF,
+	0x400E1EB8,0x51EB851F, 0x3FF4FA9E,0x4159646F,
+	0x400E28F5,0xC28F5C29, 0x3FF4FBF7,0x510FC6B2,
+	0x400E3333,0x33333333, 0x3FF4FD4F,0x86228CDD,
+	0x400E3D70,0xA3D70A3D, 0x3FF4FEA6,0xE15C6AAC,
+	0x400E47AE,0x147AE148, 0x3FF4FFFD,0x63871FD3,
+	0x400E51EB,0x851EB852, 0x3FF50153,0x0D6B7969,
+	0x400E5C28,0xF5C28F5C, 0x3FF502A7,0xDFD15348,
+	0x400E6666,0x66666666, 0x3FF503FB,0xDB7F996E,
+	0x400E70A3,0xD70A3D71, 0x3FF5054F,0x013C4957,
+	0x400E7AE1,0x47AE147B, 0x3FF506A1,0x51CC735C,
+	0x400E851E,0xB851EB85, 0x3FF507F2,0xCDF43C0C,
+	0x400E8F5C,0x28F5C28F, 0x3FF50943,0x7676DD80,
+	0x400E9999,0x9999999A, 0x3FF50A93,0x4C16A8B1,
+	0x400EA3D7,0x0A3D70A4, 0x3FF50BE2,0x4F9506CB,
+	0x400EAE14,0x7AE147AE, 0x3FF50D30,0x81B27A7A,
+	0x400EB851,0xEB851EB8, 0x3FF50E7D,0xE32EA13C,
+	0x400EC28F,0x5C28F5C3, 0x3FF50FCA,0x74C834AA,
+	0x400ECCCC,0xCCCCCCCD, 0x3FF51116,0x373D0BC2,
+	0x400ED70A,0x3D70A3D7, 0x3FF51261,0x2B4A1C2D,
+	0x400EE147,0xAE147AE1, 0x3FF513AB,0x51AB7B85,
+	0x400EEB85,0x1EB851EC, 0x3FF514F4,0xAB1C6099,
+	0x400EF5C2,0x8F5C28F6, 0x3FF5163D,0x385724AE,
+	0x400F0000,0x00000000, 0x3FF51784,0xFA1544BA,
+	0x400F0A3D,0x70A3D70A, 0x3FF518CB,0xF10F62A5,
+	0x400F147A,0xE147AE14, 0x3FF51A12,0x1DFD4681,
+	0x400F1EB8,0x51EB851F, 0x3FF51B57,0x8195DFC6,
+	0x400F28F5,0xC28F5C29, 0x3FF51C9C,0x1C8F4682,
+	0x400F3333,0x33333333, 0x3FF51DDF,0xEF9EBC94,
+	0x400F3D70,0xA3D70A3D, 0x3FF51F22,0xFB78AEDC,
+	0x400F47AE,0x147AE148, 0x3FF52065,0x40D0B66B,
+	0x400F51EB,0x851EB852, 0x3FF521A6,0xC05999B0,
+	0x400F5C28,0xF5C28F5C, 0x3FF522E7,0x7AC54DAA,
+	0x400F6666,0x66666666, 0x3FF52427,0x70C4F70D,
+	0x400F70A3,0xD70A3D71, 0x3FF52566,0xA308EB6C,
+	0x400F7AE1,0x47AE147B, 0x3FF526A5,0x1240B261,
+	0x400F851E,0xB851EB85, 0x3FF527E2,0xBF1B06B3,
+	0x400F8F5C,0x28F5C28F, 0x3FF5291F,0xAA45D775,
+	0x400F9999,0x9999999A, 0x3FF52A5B,0xD46E492A,
+	0x400FA3D7,0x0A3D70A4, 0x3FF52B97,0x3E40B6E3,
+	0x400FAE14,0x7AE147AE, 0x3FF52CD1,0xE868B35E,
+	0x400FB851,0xEB851EB8, 0x3FF52E0B,0xD3910A1E,
+	0x400FC28F,0x5C28F5C3, 0x3FF52F45,0x0063C08A,
+	0x400FCCCC,0xCCCCCCCD, 0x3FF5307D,0x6F8A16FF,
+	0x400FD70A,0x3D70A3D7, 0x3FF531B5,0x21AC89EA,
+	0x400FE147,0xAE147AE1, 0x3FF532EC,0x1772D2DC,
+	0x400FEB85,0x1EB851EC, 0x3FF53422,0x5183E999,
+	0x400FF5C2,0x8F5C28F6, 0x3FF53557,0xD086052E,
+	0x40100000,0x00000000, 0x3FF5368C,0x951E9CFD,
+	};
+
+LOCAL_D const TUint32 ArcsinTest[] =
+	{
+	0x00000000,0x00000000, 0x00000000,0x00000000,
+	0x3F50624D,0xD2F1A9FC, 0x3F50624E,0x00C1CB16,
+	0x3F60624D,0xD2F1A9FC, 0x3F60624E,0x8A323E9C,
+	0x3F689374,0xBC6A7EFA, 0x3F689377,0x26E4CFC8,
+	0x3F70624D,0xD2F1A9FC, 0x3F706250,0xAFF4FFE4,
+	0x3F747AE1,0x47AE147B, 0x3F747AE6,0xDF5A1444,
+	0x3F789374,0xBC6A7EFA, 0x3F78937E,0x665B741E,
+	0x3F7CAC08,0x3126E979, 0x3F7CAC17,0x89B3B93C,
+	0x3F80624D,0xD2F1A9FC, 0x3F806259,0x470F3852,
+	0x3F826E97,0x8D4FDF3B, 0x3F826EA7,0xDC2C2190,
+	0x3F847AE1,0x47AE147B, 0x3F847AF7,0xA68F8EEF,
+	0x3F86872B,0x020C49BA, 0x3F868748,0xC8992D73,
+	0x3F889374,0xBC6A7EFA, 0x3F88939B,0x64A974E9,
+	0x3F8A9FBE,0x76C8B439, 0x3F8A9FEF,0x9D21BC1F,
+	0x3F8CAC08,0x3126E979, 0x3F8CAC45,0x94644D43,
+	0x3F8EB851,0xEB851EB8, 0x3F8EB89D,0x6CD47A22,
+	0x3F90624D,0xD2F1A9FC, 0x3F90627B,0xA46B5841,
+	0x3F916872,0xB020C49C, 0x3F9168A9,0xA5684739,
+	0x3F926E97,0x8D4FDF3B, 0x3F926ED8,0xCA947B4B,
+	0x3F9374BC,0x6A7EF9DB, 0x3F937509,0x25241246,
+	0x3F947AE1,0x47AE147B, 0x3F947B3A,0xC64BE09A,
+	0x3F958106,0x24DD2F1B, 0x3F95816D,0xBF417B8B,
+	0x3F96872B,0x020C49BA, 0x3F9687A2,0x213B435B,
+	0x3F978D4F,0xDF3B645A, 0x3F978DD7,0xFD706D7E,
+	0x3F989374,0xBC6A7EFA, 0x3F98940F,0x65190EC9,
+	0x3F999999,0x9999999A, 0x3F999A48,0x696E25A4,
+	0x3F9A9FBE,0x76C8B439, 0x3F9AA083,0x1BA9A43C,
+	0x3F9BA5E3,0x53F7CED9, 0x3F9BA6BF,0x8D067AC2,
+	0x3F9CAC08,0x3126E979, 0x3F9CACFD,0xCEC0A195,
+	0x3F9DB22D,0x0E560419, 0x3F9DB33D,0xF2152385,
+	0x3F9EB851,0xEB851EB8, 0x3F9EB980,0x08422806,
+	0x3F9FBE76,0xC8B43958, 0x3F9FBFC4,0x2286FD78,
+	0x3FA0624D,0xD2F1A9FC, 0x3FA06305,0x291211AB,
+	0x3FA0E560,0x4189374C, 0x3FA0E629,0x542DAA42,
+	0x3FA16872,0xB020C49C, 0x3FA1694E,0x9B37C8C4,
+	0x3FA1EB85,0x1EB851EC, 0x3FA1EC75,0x06D2956A,
+	0x3FA26E97,0x8D4FDF3B, 0x3FA26F9C,0x9FA0E585,
+	0x3FA2F1A9,0xFBE76C8B, 0x3FA2F2C5,0x6E4640A5,
+	0x3FA374BC,0x6A7EF9DB, 0x3FA375EF,0x7B66E5B9,
+	0x3FA3F7CE,0xD916872B, 0x3FA3F91A,0xCFA7D03C,
+	0x3FA47AE1,0x47AE147B, 0x3FA47C47,0x73AEBD59,
+	0x3FA4FDF3,0xB645A1CB, 0x3FA4FF75,0x70223116,
+	0x3FA58106,0x24DD2F1B, 0x3FA582A4,0xCDA97B7C,
+	0x3FA60418,0x9374BC6A, 0x3FA605D5,0x94ECBDC6,
+	0x3FA6872B,0x020C49BA, 0x3FA68907,0xCE94EF8F,
+	0x3FA70A3D,0x70A3D70A, 0x3FA70C3B,0x834BE3FC,
+	0x3FA78D4F,0xDF3B645A, 0x3FA78F70,0xBBBC4EEF,
+	0x3FA81062,0x4DD2F1AA, 0x3FA812A7,0x8091CA38,
+	0x3FA89374,0xBC6A7EFA, 0x3FA895DF,0xDA78DAC7,
+	0x3FA91687,0x2B020C4A, 0x3FA91919,0xD21EF5E2,
+	0x3FA99999,0x9999999A, 0x3FA99C55,0x70328659,
+	0x3FAA1CAC,0x083126E9, 0x3FAA1F92,0xBD62F1C0,
+	0x3FAA9FBE,0x76C8B439, 0x3FAAA2D1,0xC2609DA6,
+	0x3FAB22D0,0xE5604189, 0x3FAB2612,0x87DCF4D2,
+	0x3FABA5E3,0x53F7CED9, 0x3FABA955,0x168A6C7B,
+	0x3FAC28F5,0xC28F5C29, 0x3FAC2C99,0x771C898D,
+	0x3FACAC08,0x3126E979, 0x3FACAFDF,0xB247E5E4,
+	0x3FAD2F1A,0x9FBE76C9, 0x3FAD3327,0xD0C2358D,
+	0x3FADB22D,0x0E560419, 0x3FADB671,0xDB424C0E,
+	0x3FAE353F,0x7CED9168, 0x3FAE39BD,0xDA8021AA,
+	0x3FAEB851,0xEB851EB8, 0x3FAEBD0B,0xD734D8A7,
+	0x3FAF3B64,0x5A1CAC08, 0x3FAF405B,0xDA1AC296,
+	0x3FAFBE76,0xC8B43958, 0x3FAFC3AD,0xEBED65A4,
+	0x3FB020C4,0x9BA5E354, 0x3FB02381,0x0AB4C0F0,
+	0x3FB0624D,0xD2F1A9FC, 0x3FB0652C,0x2FA68B47,
+	0x3FB0A3D7,0x0A3D70A4, 0x3FB0A6D8,0x692BB3BD,
+	0x3FB0E560,0x4189374C, 0x3FB0E885,0xBBA48126,
+	0x3FB126E9,0x78D4FDF4, 0x3FB12A34,0x2B71E1EA,
+	0x3FB16872,0xB020C49C, 0x3FB16BE3,0xBCF56EB9,
+	0x3FB1A9FB,0xE76C8B44, 0x3FB1AD94,0x74916D30,
+	0x3FB1EB85,0x1EB851EC, 0x3FB1EF46,0x56A8D28C,
+	0x3FB22D0E,0x56041893, 0x3FB230F9,0x679F465A,
+	0x3FB26E97,0x8D4FDF3B, 0x3FB272AD,0xABD92523,
+	0x3FB2B020,0xC49BA5E3, 0x3FB2B463,0x27BB8322,
+	0x3FB2F1A9,0xFBE76C8B, 0x3FB2F619,0xDFAC2EF4,
+	0x3FB33333,0x33333333, 0x3FB337D1,0xD811B44C,
+	0x3FB374BC,0x6A7EF9DB, 0x3FB3798B,0x15535EAC,
+	0x3FB3B645,0xA1CAC083, 0x3FB3BB45,0x9BD93C18,
+	0x3FB3F7CE,0xD916872B, 0x3FB3FD01,0x700C1FCD,
+	0x3FB43958,0x10624DD3, 0x3FB43EBE,0x9655A4FE,
+	0x3FB47AE1,0x47AE147B, 0x3FB4807D,0x1320318C,
+	0x3FB4BC6A,0x7EF9DB23, 0x3FB4C23C,0xEAD6F8C2,
+	0x3FB4FDF3,0xB645A1CB, 0x3FB503FE,0x21E5FE10,
+	0x3FB53F7C,0xED916873, 0x3FB545C0,0xBCBA17CF,
+	0x3FB58106,0x24DD2F1B, 0x3FB58784,0xBFC0F1FC,
+	0x3FB5C28F,0x5C28F5C3, 0x3FB5C94A,0x2F6910FA,
+	0x3FB60418,0x9374BC6A, 0x3FB60B11,0x1021D455,
+	0x3FB645A1,0xCAC08312, 0x3FB64CD9,0x665B798B,
+	0x3FB6872B,0x020C49BA, 0x3FB68EA3,0x36871EC7,
+	0x3FB6C8B4,0x39581062, 0x3FB6D06E,0x8516C5B3,
+	0x3FB70A3D,0x70A3D70A, 0x3FB7123B,0x567D5638,
+	0x3FB74BC6,0xA7EF9DB2, 0x3FB75409,0xAF2EA14F,
+	0x3FB78D4F,0xDF3B645A, 0x3FB795D9,0x939F63C8,
+	0x3FB7CED9,0x16872B02, 0x3FB7D7AB,0x08454918,
+	0x3FB81062,0x4DD2F1AA, 0x3FB8197E,0x1196EE2A,
+	0x3FB851EB,0x851EB852, 0x3FB85B52,0xB40BE42D,
+	0x3FB89374,0xBC6A7EFA, 0x3FB89D28,0xF41CB367,
+	0x3FB8D4FD,0xF3B645A2, 0x3FB8DF00,0xD642DE09,
+	0x3FB91687,0x2B020C4A, 0x3FB920DA,0x5EF8E302,
+	0x3FB95810,0x624DD2F2, 0x3FB962B5,0x92BA40D9,
+	0x3FB99999,0x9999999A, 0x3FB9A492,0x76037884,
+	0x3FB9DB22,0xD0E56042, 0x3FB9E671,0x0D521043,
+	0x3FBA1CAC,0x083126E9, 0x3FBA2851,0x5D24967A,
+	0x3FBA5E35,0x3F7CED91, 0x3FBA6A33,0x69FAA495,
+	0x3FBA9FBE,0x76C8B439, 0x3FBAAC17,0x3854E1DE,
+	0x3FBAE147,0xAE147AE1, 0x3FBAEDFC,0xCCB50667,
+	0x3FBB22D0,0xE5604189, 0x3FBB2FE4,0x2B9DDDEA,
+	0x3FBB645A,0x1CAC0831, 0x3FBB71CD,0x59934AAC,
+	0x3FBBA5E3,0x53F7CED9, 0x3FBBB3B8,0x5B1A4868,
+	0x3FBBE76C,0x8B439581, 0x3FBBF5A5,0x34B8EF36,
+	0x3FBC28F5,0xC28F5C29, 0x3FBC3793,0xEAF67675,
+	0x3FBC6A7E,0xF9DB22D1, 0x3FBC7984,0x825B37B8,
+	0x3FBCAC08,0x3126E979, 0x3FBCBB76,0xFF70B1B6,
+	0x3FBCED91,0x6872B021, 0x3FBCFD6B,0x66C18B3B,
+	0x3FBD2F1A,0x9FBE76C9, 0x3FBD3F61,0xBCD99615,
+	0x3FBD70A3,0xD70A3D71, 0x3FBD815A,0x0645D212,
+	0x3FBDB22D,0x0E560419, 0x3FBDC354,0x47946FEE,
+	0x3FBDF3B6,0x45A1CAC1, 0x3FBE0550,0x8554D451,
+	0x3FBE353F,0x7CED9168, 0x3FBE474E,0xC4179AC6,
+	0x3FBE76C8,0xB4395810, 0x3FBE894F,0x086E98BD,
+	0x3FBEB851,0xEB851EB8, 0x3FBECB51,0x56ECE085,
+	0x3FBEF9DB,0x22D0E560, 0x3FBF0D55,0xB426C44F,
+	0x3FBF3B64,0x5A1CAC08, 0x3FBF4F5C,0x24B1D931,
+	0x3FBF7CED,0x916872B0, 0x3FBF9164,0xAD24FA2C,
+	0x3FBFBE76,0xC8B43958, 0x3FBFD36F,0x52184B35,
+	0x3FC00000,0x00000000, 0x3FC00ABE,0x0C129E1E,
+	0x3FC020C4,0x9BA5E354, 0x3FC02BC5,0x81F3461D,
+	0x3FC04189,0x374BC6A8, 0x3FC04CCE,0x0CFC261F,
+	0x3FC0624D,0xD2F1A9FC, 0x3FC06DD7,0xAF7BF140,
+	0x3FC08312,0x6E978D50, 0x3FC08EE2,0x6BC206BA,
+	0x3FC0A3D7,0x0A3D70A4, 0x3FC0AFEE,0x441E736F,
+	0x3FC0C49B,0xA5E353F8, 0x3FC0D0FB,0x3AE1F374,
+	0x3FC0E560,0x4189374C, 0x3FC0F209,0x525DF3A1,
+	0x3FC10624,0xDD2F1AA0, 0x3FC11318,0x8CE4931C,
+	0x3FC126E9,0x78D4FDF4, 0x3FC13428,0xECC8A4EA,
+	0x3FC147AE,0x147AE148, 0x3FC1553A,0x745DB182,
+	0x3FC16872,0xB020C49C, 0x3FC1764D,0x25F7F85B,
+	0x3FC18937,0x4BC6A7F0, 0x3FC19761,0x03EC7181,
+	0x3FC1A9FB,0xE76C8B44, 0x3FC1B876,0x1090CF2B,
+	0x3FC1CAC0,0x83126E98, 0x3FC1D98C,0x4E3B7F50,
+	0x3FC1EB85,0x1EB851EC, 0x3FC1FAA3,0xBF43AD3B,
+	0x3FC20C49,0xBA5E353F, 0x3FC21BBC,0x66014327,
+	0x3FC22D0E,0x56041893, 0x3FC23CD6,0x44CCEBDB,
+	0x3FC24DD2,0xF1A9FBE7, 0x3FC25DF1,0x5E00143F,
+	0x3FC26E97,0x8D4FDF3B, 0x3FC27F0D,0xB3F4ECFB,
+	0x3FC28F5C,0x28F5C28F, 0x3FC2A02B,0x49066C16,
+	0x3FC2B020,0xC49BA5E3, 0x3FC2C14A,0x1F904E95,
+	0x3FC2D0E5,0x60418937, 0x3FC2E26A,0x39EF1A1A,
+	0x3FC2F1A9,0xFBE76C8B, 0x3FC3038B,0x9A801E86,
+	0x3FC3126E,0x978D4FDF, 0x3FC324AE,0x43A177A0,
+	0x3FC33333,0x33333333, 0x3FC345D2,0x37B20EB3,
+	0x3FC353F7,0xCED91687, 0x3FC366F7,0x79119C3B,
+	0x3FC374BC,0x6A7EF9DB, 0x3FC3881E,0x0A20A988,
+	0x3FC39581,0x0624DD2F, 0x3FC3A945,0xED40926B,
+	0x3FC3B645,0xA1CAC083, 0x3FC3CA6F,0x24D386DB,
+	0x3FC3D70A,0x3D70A3D7, 0x3FC3EB99,0xB33C8CA7,
+	0x3FC3F7CE,0xD916872B, 0x3FC40CC5,0x9ADF8122,
+	0x3FC41893,0x74BC6A7F, 0x3FC42DF2,0xDE211ACD,
+	0x3FC43958,0x10624DD3, 0x3FC44F21,0x7F66EB10,
+	0x3FC45A1C,0xAC083127, 0x3FC47051,0x81175FE6,
+	0x3FC47AE1,0x47AE147B, 0x3FC49182,0xE599C592,
+	0x3FC49BA5,0xE353F7CF, 0x3FC4B2B5,0xAF564857,
+	0x3FC4BC6A,0x7EF9DB23, 0x3FC4D3E9,0xE0B5F62A,
+	0x3FC4DD2F,0x1A9FBE77, 0x3FC4F51F,0x7C22C06F,
+	0x3FC4FDF3,0xB645A1CB, 0x3FC51656,0x84077DB1,
+	0x3FC51EB8,0x51EB851F, 0x3FC5378E,0xFACFEB5F,
+	0x3FC53F7C,0xED916873, 0x3FC558C8,0xE2E8AF86,
+	0x3FC56041,0x89374BC7, 0x3FC57A04,0x3EBF5A94,
+	0x3FC58106,0x24DD2F1B, 0x3FC59B41,0x10C26917,
+	0x3FC5A1CA,0xC083126F, 0x3FC5BC7F,0x5B61457F,
+	0x3FC5C28F,0x5C28F5C3, 0x3FC5DDBF,0x210C49E2,
+	0x3FC5E353,0xF7CED917, 0x3FC5FF00,0x6434C1C3,
+	0x3FC60418,0x9374BC6A, 0x3FC62043,0x274CEBD8,
+	0x3FC624DD,0x2F1A9FBE, 0x3FC64187,0x6CC7FBD5,
+	0x3FC645A1,0xCAC08312, 0x3FC662CD,0x371A1C37,
+	0x3FC66666,0x66666666, 0x3FC68414,0x88B8700C,
+	0x3FC6872B,0x020C49BA, 0x3FC6A55D,0x641914C8,
+	0x3FC6A7EF,0x9DB22D0E, 0x3FC6C6A7,0xCBB32413,
+	0x3FC6C8B4,0x39581062, 0x3FC6E7F3,0xC1FEB599,
+	0x3FC6E978,0xD4FDF3B6, 0x3FC70941,0x4974E0E2,
+	0x3FC70A3D,0x70A3D70A, 0x3FC72A90,0x648FBF25,
+	0x3FC72B02,0x0C49BA5E, 0x3FC74BE1,0x15CA6D21,
+	0x3FC74BC6,0xA7EF9DB2, 0x3FC76D33,0x5FA10CF4,
+	0x3FC76C8B,0x43958106, 0x3FC78E87,0x4490C7FD,
+	0x3FC78D4F,0xDF3B645A, 0x3FC7AFDC,0xC717D0B2,
+	0x3FC7AE14,0x7AE147AE, 0x3FC7D133,0xE9B56483,
+	0x3FC7CED9,0x16872B02, 0x3FC7F28C,0xAEE9CDBD,
+	0x3FC7EF9D,0xB22D0E56, 0x3FC813E7,0x19366568,
+	0x3FC81062,0x4DD2F1AA, 0x3FC83543,0x2B1D9534,
+	0x3FC83126,0xE978D4FE, 0x3FC856A0,0xE722D958,
+	0x3FC851EB,0x851EB852, 0x3FC87800,0x4FCAC282,
+	0x3FC872B0,0x20C49BA6, 0x3FC89961,0x679AF7BD,
+	0x3FC89374,0xBC6A7EFA, 0x3FC8BAC4,0x311A3863,
+	0x3FC8B439,0x5810624E, 0x3FC8DC28,0xAED05E0A,
+	0x3FC8D4FD,0xF3B645A2, 0x3FC8FD8E,0xE3465E76,
+	0x3FC8F5C2,0x8F5C28F6, 0x3FC91EF6,0xD1064D8C,
+	0x3FC91687,0x2B020C4A, 0x3FC94060,0x7A9B5F4A,
+	0x3FC9374B,0xC6A7EF9E, 0x3FC961CB,0xE291E9BC,
+	0x3FC95810,0x624DD2F2, 0x3FC98339,0x0B7766F7,
+	0x3FC978D4,0xFDF3B646, 0x3FC9A4A7,0xF7DA7718,
+	0x3FC99999,0x9999999A, 0x3FC9C618,0xAA4AE23D,
+	0x3FC9BA5E,0x353F7CEE, 0x3FC9E78B,0x25599A8C,
+	0x3FC9DB22,0xD0E56042, 0x3FCA08FF,0x6B98BE30,
+	0x3FC9FBE7,0x6C8B4396, 0x3FCA2A75,0x7F9B9963,
+	0x3FCA1CAC,0x083126E9, 0x3FCA4BED,0x63F6A86F,
+	0x3FCA3D70,0xA3D70A3D, 0x3FCA6D67,0x1B3F99C4,
+	0x3FCA5E35,0x3F7CED91, 0x3FCA8EE2,0xA80D4FF3,
+	0x3FCA7EF9,0xDB22D0E5, 0x3FCAB060,0x0CF7E3CA,
+	0x3FCA9FBE,0x76C8B439, 0x3FCAD1DF,0x4C98A65F,
+	0x3FCAC083,0x126E978D, 0x3FCAF360,0x698A2323,
+	0x3FCAE147,0xAE147AE1, 0x3FCB14E3,0x666821F8,
+	0x3FCB020C,0x49BA5E35, 0x3FCB3668,0x45CFA94C,
+	0x3FCB22D0,0xE5604189, 0x3FCB57EF,0x0A5F002C,
+	0x3FCB4395,0x810624DD, 0x3FCB7977,0xB6B5B067,
+	0x3FCB645A,0x1CAC0831, 0x3FCB9B02,0x4D7488AA,
+	0x3FCB851E,0xB851EB85, 0x3FCBBC8E,0xD13D9EA5,
+	0x3FCBA5E3,0x53F7CED9, 0x3FCBDE1D,0x44B4512A,
+	0x3FCBC6A7,0xEF9DB22D, 0x3FCBFFAD,0xAA7D4A58,
+	0x3FCBE76C,0x8B439581, 0x3FCC2140,0x053E81C0,
+	0x3FCC0831,0x26E978D5, 0x3FCC42D4,0x579F3E95,
+	0x3FCC28F5,0xC28F5C29, 0x3FCC646A,0xA44819DA,
+	0x3FCC49BA,0x5E353F7D, 0x3FCC8602,0xEDE3008D,
+	0x3FCC6A7E,0xF9DB22D1, 0x3FCCA79D,0x371B35E4,
+	0x3FCC8B43,0x95810625, 0x3FCCC939,0x829D557A,
+	0x3FCCAC08,0x3126E979, 0x3FCCEAD7,0xD317558E,
+	0x3FCCCCCC,0xCCCCCCCD, 0x3FCD0C78,0x2B38893C,
+	0x3FCCED91,0x6872B021, 0x3FCD2E1A,0x8DB1A2BB,
+	0x3FCD0E56,0x04189375, 0x3FCD4FBE,0xFD34B5A2,
+	0x3FCD2F1A,0x9FBE76C9, 0x3FCD7165,0x7C753923,
+	0x3FCD4FDF,0x3B645A1D, 0x3FCD930E,0x0E280A5D,
+	0x3FCD70A3,0xD70A3D71, 0x3FCDB4B8,0xB5036E9A,
+	0x3FCD9168,0x72B020C5, 0x3FCDD665,0x73BF15A5,
+	0x3FCDB22D,0x0E560419, 0x3FCDF814,0x4D141C12,
+	0x3FCDD2F1,0xA9FBE76D, 0x3FCE19C5,0x43BD0D92,
+	0x3FCDF3B6,0x45A1CAC1, 0x3FCE3B78,0x5A75E74C,
+	0x3FCE147A,0xE147AE14, 0x3FCE5D2D,0x93FC1A2B,
+	0x3FCE353F,0x7CED9168, 0x3FCE7EE4,0xF30E8D46,
+	0x3FCE5604,0x189374BC, 0x3FCEA09E,0x7A6DA030,
+	0x3FCE76C8,0xB4395810, 0x3FCEC25A,0x2CDB2D60,
+	0x3FCE978D,0x4FDF3B64, 0x3FCEE418,0x0D1A8C97,
+	0x3FCEB851,0xEB851EB8, 0x3FCF05D8,0x1DF0953F,
+	0x3FCED916,0x872B020C, 0x3FCF279A,0x6223A0DB,
+	0x3FCEF9DB,0x22D0E560, 0x3FCF495E,0xDC7B8D71,
+	0x3FCF1A9F,0xBE76C8B4, 0x3FCF6B25,0x8FC1BFFB,
+	0x3FCF3B64,0x5A1CAC08, 0x3FCF8CEE,0x7EC126D9,
+	0x3FCF5C28,0xF5C28F5C, 0x3FCFAEB9,0xAC463C49,
+	0x3FCF7CED,0x916872B0, 0x3FCFD087,0x1B1F08DD,
+	0x3FCF9DB2,0x2D0E5604, 0x3FCFF256,0xCE1B25FE,
+	0x3FCFBE76,0xC8B43958, 0x3FD00A14,0x6405E032,
+	0x3FCFDF3B,0x645A1CAC, 0x3FD01AFE,0x85E1CD4F,
+	0x3FD00000,0x00000000, 0x3FD02BE9,0xCE0B87CD,
+	0x3FD01062,0x4DD2F1AA, 0x3FD03CD6,0x3DEE0A95,
+	0x3FD020C4,0x9BA5E354, 0x3FD04DC3,0xD6F51F49,
+	0x3FD03126,0xE978D4FE, 0x3FD05EB2,0x9A8D5F8F,
+	0x3FD04189,0x374BC6A8, 0x3FD06FA2,0x8A243657,
+	0x3FD051EB,0x851EB852, 0x3FD08093,0xA727E129,
+	0x3FD0624D,0xD2F1A9FC, 0x3FD09185,0xF3077174,
+	0x3FD072B0,0x20C49BA6, 0x3FD0A279,0x6F32CDD9,
+	0x3FD08312,0x6E978D50, 0x3FD0B36E,0x1D1AB37E,
+	0x3FD09374,0xBC6A7EFA, 0x3FD0C463,0xFE30B761,
+	0x3FD0A3D7,0x0A3D70A4, 0x3FD0D55B,0x13E747AE,
+	0x3FD0B439,0x5810624E, 0x3FD0E653,0x5FB1AD12,
+	0x3FD0C49B,0xA5E353F8, 0x3FD0F74C,0xE3040C13,
+	0x3FD0D4FD,0xF3B645A2, 0x3FD10847,0x9F53666F,
+	0x3FD0E560,0x4189374C, 0x3FD11943,0x96159C73,
+	0x3FD0F5C2,0x8F5C28F6, 0x3FD12A40,0xC8C16E57,
+	0x3FD10624,0xDD2F1AA0, 0x3FD13B3F,0x38CE7DA4,
+	0x3FD11687,0x2B020C4A, 0x3FD14C3E,0xE7B54E92,
+	0x3FD126E9,0x78D4FDF4, 0x3FD15D3F,0xD6EF4967,
+	0x3FD1374B,0xC6A7EF9E, 0x3FD16E42,0x07F6BBE6,
+	0x3FD147AE,0x147AE148, 0x3FD17F45,0x7C46DAAB,
+	0x3FD15810,0x624DD2F2, 0x3FD1904A,0x355BC29E,
+	0x3FD16872,0xB020C49C, 0x3FD1A150,0x34B27A57,
+	0x3FD178D4,0xFDF3B646, 0x3FD1B257,0x7BC8F38F,
+	0x3FD18937,0x4BC6A7F0, 0x3FD1C360,0x0C1E0C8F,
+	0x3FD19999,0x9999999A, 0x3FD1D469,0xE731919C,
+	0x3FD1A9FB,0xE76C8B44, 0x3FD1E575,0x0E843E73,
+	0x3FD1BA5E,0x353F7CEE, 0x3FD1F681,0x8397BFB6,
+	0x3FD1CAC0,0x83126E98, 0x3FD2078F,0x47EEB468,
+	0x3FD1DB22,0xD0E56042, 0x3FD2189E,0x5D0CAF65,
+	0x3FD1EB85,0x1EB851EC, 0x3FD229AE,0xC47638DD,
+	0x3FD1FBE7,0x6C8B4396, 0x3FD23AC0,0x7FB0CFD1,
+	0x3FD20C49,0xBA5E353F, 0x3FD24BD3,0x9042EB95,
+	0x3FD21CAC,0x083126E9, 0x3FD25CE7,0xF7B3FD52,
+	0x3FD22D0E,0x56041893, 0x3FD26DFD,0xB78C7184,
+	0x3FD23D70,0xA3D70A3D, 0x3FD27F14,0xD155B18A,
+	0x3FD24DD2,0xF1A9FBE7, 0x3FD2902D,0x469A2525,
+	0x3FD25E35,0x3F7CED91, 0x3FD2A147,0x18E5340A,
+	0x3FD26E97,0x8D4FDF3B, 0x3FD2B262,0x49C3476A,
+	0x3FD27EF9,0xDB22D0E5, 0x3FD2C37E,0xDAC1CB83,
+	0x3FD28F5C,0x28F5C28F, 0x3FD2D49C,0xCD6F3133,
+	0x3FD29FBE,0x76C8B439, 0x3FD2E5BC,0x235AEF89,
+	0x3FD2B020,0xC49BA5E3, 0x3FD2F6DC,0xDE15855C,
+	0x3FD2C083,0x126E978D, 0x3FD307FE,0xFF307AE5,
+	0x3FD2D0E5,0x60418937, 0x3FD31922,0x883E6357,
+	0x3FD2E147,0xAE147AE1, 0x3FD32A47,0x7AD2DE7F,
+	0x3FD2F1A9,0xFBE76C8B, 0x3FD33B6D,0xD8829A63,
+	0x3FD3020C,0x49BA5E35, 0x3FD34C95,0xA2E354DF,
+	0x3FD3126E,0x978D4FDF, 0x3FD35DBE,0xDB8BDD54,
+	0x3FD322D0,0xE5604189, 0x3FD36EE9,0x84141643,
+	0x3FD33333,0x33333333, 0x3FD38015,0x9E14F6FF,
+	0x3FD34395,0x810624DD, 0x3FD39143,0x2B288D54,
+	0x3FD353F7,0xCED91687, 0x3FD3A272,0x2CE9FF38,
+	0x3FD3645A,0x1CAC0831, 0x3FD3B3A2,0xA4F58C7C,
+	0x3FD374BC,0x6A7EF9DB, 0x3FD3C4D4,0x94E8907D,
+	0x3FD3851E,0xB851EB85, 0x3FD3D607,0xFE6183DC,
+	0x3FD39581,0x0624DD2F, 0x3FD3E73C,0xE2FFFE36,
+	0x3FD3A5E3,0x53F7CED9, 0x3FD3F873,0x4464B7E1,
+	0x3FD3B645,0xA1CAC083, 0x3FD409AB,0x24318BA6,
+	0x3FD3C6A7,0xEF9DB22D, 0x3FD41AE4,0x84097887,
+	0x3FD3D70A,0x3D70A3D7, 0x3FD42C1F,0x6590A37D,
+	0x3FD3E76C,0x8B439581, 0x3FD43D5B,0xCA6C5942,
+	0x3FD3F7CE,0xD916872B, 0x3FD44E99,0xB4431018,
+	0x3FD40831,0x26E978D5, 0x3FD45FD9,0x24BC6995,
+	0x3FD41893,0x74BC6A7F, 0x3FD4711A,0x1D813470,
+	0x3FD428F5,0xC28F5C29, 0x3FD4825C,0xA03B6E54,
+	0x3FD43958,0x10624DD3, 0x3FD493A0,0xAE9645B3,
+	0x3FD449BA,0x5E353F7D, 0x3FD4A4E6,0x4A3E1B9F,
+	0x3FD45A1C,0xAC083127, 0x3FD4B62D,0x74E0859E,
+	0x3FD46A7E,0xF9DB22D1, 0x3FD4C776,0x302C4F8D,
+	0x3FD47AE1,0x47AE147B, 0x3FD4D8C0,0x7DD17D7D,
+	0x3FD48B43,0x95810625, 0x3FD4EA0C,0x5F814D93,
+	0x3FD49BA5,0xE353F7CF, 0x3FD4FB59,0xD6EE39F3,
+	0x3FD4AC08,0x3126E979, 0x3FD50CA8,0xE5CBFAA3,
+	0x3FD4BC6A,0x7EF9DB23, 0x3FD51DF9,0x8DCF8779,
+	0x3FD4CCCC,0xCCCCCCCD, 0x3FD52F4B,0xD0AF1A0B,
+	0x3FD4DD2F,0x1A9FBE77, 0x3FD5409F,0xB0222F9E,
+	0x3FD4ED91,0x6872B021, 0x3FD551F5,0x2DE18B1A,
+	0x3FD4FDF3,0xB645A1CB, 0x3FD5634C,0x4BA73707,
+	0x3FD50E56,0x04189375, 0x3FD574A5,0x0B2E8781,
+	0x3FD51EB8,0x51EB851F, 0x3FD585FF,0x6E341C3E,
+	0x3FD52F1A,0x9FBE76C9, 0x3FD5975B,0x7675E288,
+	0x3FD53F7C,0xED916873, 0x3FD5A8B9,0x25B31747,
+	0x3FD54FDF,0x3B645A1D, 0x3FD5BA18,0x7DAC4905,
+	0x3FD56041,0x89374BC7, 0x3FD5CB79,0x802359FD,
+	0x3FD570A3,0xD70A3D71, 0x3FD5DCDC,0x2EDB8227,
+	0x3FD58106,0x24DD2F1B, 0x3FD5EE40,0x8B99514C,
+	0x3FD59168,0x72B020C5, 0x3FD5FFA6,0x9822B118,
+	0x3FD5A1CA,0xC083126F, 0x3FD6110E,0x563EE737,
+	0x3FD5B22D,0x0E560419, 0x3FD62277,0xC7B6976D,
+	0x3FD5C28F,0x5C28F5C3, 0x3FD633E2,0xEE53C5B9,
+	0x3FD5D2F1,0xA9FBE76D, 0x3FD6454F,0xCBE1D876,
+	0x3FD5E353,0xF7CED917, 0x3FD656BE,0x622D9A83,
+	0x3FD5F3B6,0x45A1CAC1, 0x3FD6682E,0xB3053D6D,
+	0x3FD60418,0x9374BC6A, 0x3FD679A0,0xC0385B9B,
+	0x3FD6147A,0xE147AE14, 0x3FD68B14,0x8B97FA84,
+	0x3FD624DD,0x2F1A9FBE, 0x3FD69C8A,0x16F68CDE,
+	0x3FD6353F,0x7CED9168, 0x3FD6AE01,0x6427F4DB,
+	0x3FD645A1,0xCAC08312, 0x3FD6BF7A,0x75018666,
+	0x3FD65604,0x189374BC, 0x3FD6D0F5,0x4B5A095F,
+	0x3FD66666,0x66666666, 0x3FD6E271,0xE909BBE4,
+	0x3FD676C8,0xB4395810, 0x3FD6F3F0,0x4FEA5496,
+	0x3FD6872B,0x020C49BA, 0x3FD70570,0x81D704E5,
+	0x3FD6978D,0x4FDF3B64, 0x3FD716F2,0x80AC7B61,
+	0x3FD6A7EF,0x9DB22D0E, 0x3FD72876,0x4E48E60C,
+	0x3FD6B851,0xEB851EB8, 0x3FD739FB,0xEC8BF4B2,
+	0x3FD6C8B4,0x39581062, 0x3FD74B83,0x5D56DB44,
+	0x3FD6D916,0x872B020C, 0x3FD75D0C,0xA28C543A,
+	0x3FD6E978,0xD4FDF3B6, 0x3FD76E97,0xBE10A2F2,
+	0x3FD6F9DB,0x22D0E560, 0x3FD78024,0xB1C9961C,
+	0x3FD70A3D,0x70A3D70A, 0x3FD791B3,0x7F9E8A25,
+	0x3FD71A9F,0xBE76C8B4, 0x3FD7A344,0x29786BA4,
+	0x3FD72B02,0x0C49BA5E, 0x3FD7B4D6,0xB141B9D0,
+	0x3FD73B64,0x5A1CAC08, 0x3FD7C66B,0x18E688FA,
+	0x3FD74BC6,0xA7EF9DB2, 0x3FD7D801,0x62548508,
+	0x3FD75C28,0xF5C28F5C, 0x3FD7E999,0x8F7AF3F6,
+	0x3FD76C8B,0x43958106, 0x3FD7FB33,0xA24AB85B,
+	0x3FD77CED,0x916872B0, 0x3FD80CCF,0x9CB653F5,
+	0x3FD78D4F,0xDF3B645A, 0x3FD81E6D,0x80B1EA32,
+	0x3FD79DB2,0x2D0E5604, 0x3FD8300D,0x503342CB,
+	0x3FD7AE14,0x7AE147AE, 0x3FD841AF,0x0D31CC53,
+	0x3FD7BE76,0xC8B43958, 0x3FD85352,0xB9A69ED6,
+	0x3FD7CED9,0x16872B02, 0x3FD864F8,0x578C7E7A,
+	0x3FD7DF3B,0x645A1CAC, 0x3FD8769F,0xE8DFDE25,
+	0x3FD7EF9D,0xB22D0E56, 0x3FD88849,0x6F9EE222,
+	0x3FD80000,0x00000000, 0x3FD899F4,0xEDC962D3,
+	0x3FD81062,0x4DD2F1AA, 0x3FD8ABA2,0x6560EF64,
+	0x3FD820C4,0x9BA5E354, 0x3FD8BD51,0xD868D083,
+	0x3FD83126,0xE978D4FE, 0x3FD8CF03,0x48E60B19,
+	0x3FD84189,0x374BC6A8, 0x3FD8E0B6,0xB8DF6312,
+	0x3FD851EB,0x851EB852, 0x3FD8F26C,0x2A5D5E1D,
+	0x3FD8624D,0xD2F1A9FC, 0x3FD90423,0x9F6A467D,
+	0x3FD872B0,0x20C49BA6, 0x3FD915DD,0x1A122DD6,
+	0x3FD88312,0x6E978D50, 0x3FD92798,0x9C62F005,
+	0x3FD89374,0xBC6A7EFA, 0x3FD93956,0x286C35F7,
+	0x3FD8A3D7,0x0A3D70A4, 0x3FD94B15,0xC03F7890,
+	0x3FD8B439,0x5810624E, 0x3FD95CD7,0x65F00387,
+	0x3FD8C49B,0xA5E353F8, 0x3FD96E9B,0x1B92F859,
+	0x3FD8D4FD,0xF3B645A2, 0x3FD98060,0xE33F5132,
+	0x3FD8E560,0x4189374C, 0x3FD99228,0xBF0DE3E7,
+	0x3FD8F5C2,0x8F5C28F6, 0x3FD9A3F2,0xB11964EC,
+	0x3FD90624,0xDD2F1AA0, 0x3FD9B5BE,0xBB7E6A58,
+	0x3FD91687,0x2B020C4A, 0x3FD9C78C,0xE05B6EE7,
+	0x3FD926E9,0x78D4FDF4, 0x3FD9D95D,0x21D0D50A,
+	0x3FD9374B,0xC6A7EF9E, 0x3FD9EB2F,0x8200E9F0,
+	0x3FD947AE,0x147AE148, 0x3FD9FD04,0x030FE8A3,
+	0x3FD95810,0x624DD2F2, 0x3FDA0EDA,0xA723FD20,
+	0x3FD96872,0xB020C49C, 0x3FDA20B3,0x7065477A,
+	0x3FD978D4,0xFDF3B646, 0x3FDA328E,0x60FDDF04,
+	0x3FD98937,0x4BC6A7F0, 0x3FDA446B,0x7B19D579,
+	0x3FD99999,0x9999999A, 0x3FDA564A,0xC0E73A34,
+	0x3FD9A9FB,0xE76C8B44, 0x3FDA682C,0x34961D66,
+	0x3FD9BA5E,0x353F7CEE, 0x3FDA7A0F,0xD8589358,
+	0x3FD9CAC0,0x83126E98, 0x3FDA8BF5,0xAE62B7B0,
+	0x3FD9DB22,0xD0E56042, 0x3FDA9DDD,0xB8EAB0BA,
+	0x3FD9EB85,0x1EB851EC, 0x3FDAAFC7,0xFA28B2BE,
+	0x3FD9FBE7,0x6C8B4396, 0x3FDAC1B4,0x74570353,
+	0x3FDA0C49,0xBA5E353F, 0x3FDAD3A3,0x29B1FCC2,
+	0x3FDA1CAC,0x083126E9, 0x3FDAE594,0x1C781169,
+	0x3FDA2D0E,0x56041893, 0x3FDAF787,0x4EE9CF25,
+	0x3FDA3D70,0xA3D70A3D, 0x3FDB097C,0xC349E2C6,
+	0x3FDA4DD2,0xF1A9FBE7, 0x3FDB1B74,0x7BDD1B84,
+	0x3FDA5E35,0x3F7CED91, 0x3FDB2D6E,0x7AEA6E81,
+	0x3FDA6E97,0x8D4FDF3B, 0x3FDB3F6A,0xC2BAFA4F,
+	0x3FDA7EF9,0xDB22D0E5, 0x3FDB5169,0x559A0A79,
+	0x3FDA8F5C,0x28F5C28F, 0x3FDB636A,0x35D51B17,
+	0x3FDA9FBE,0x76C8B439, 0x3FDB756D,0x65BBDC6D,
+	0x3FDAB020,0xC49BA5E3, 0x3FDB8772,0xE7A03684,
+	0x3FDAC083,0x126E978D, 0x3FDB997A,0xBDD64CD8,
+	0x3FDAD0E5,0x60418937, 0x3FDBAB84,0xEAB48206,
+	0x3FDAE147,0xAE147AE1, 0x3FDBBD91,0x70937B7F,
+	0x3FDAF1A9,0xFBE76C8B, 0x3FDBCFA0,0x51CE254B,
+	0x3FDB020C,0x49BA5E35, 0x3FDBE1B1,0x90C1B5C7,
+	0x3FDB126E,0x978D4FDF, 0x3FDBF3C5,0x2FCDB179,
+	0x3FDB22D0,0xE5604189, 0x3FDC05DB,0x3153EEDD,
+	0x3FDB3333,0x33333333, 0x3FDC17F3,0x97B89A42,
+	0x3FDB4395,0x810624DD, 0x3FDC2A0E,0x656239AE,
+	0x3FDB53F7,0xCED91687, 0x3FDC3C2B,0x9CB9B0C8,
+	0x3FDB645A,0x1CAC0831, 0x3FDC4E4B,0x402A44C8,
+	0x3FDB74BC,0x6A7EF9DB, 0x3FDC606D,0x5221A074,
+	0x3FDB851E,0xB851EB85, 0x3FDC7291,0xD50FD81E,
+	0x3FDB9581,0x0624DD2F, 0x3FDC84B8,0xCB676DB1,
+	0x3FDBA5E3,0x53F7CED9, 0x3FDC96E2,0x379D54C1,
+	0x3FDBB645,0xA1CAC083, 0x3FDCA90E,0x1C28F6A5,
+	0x3FDBC6A7,0xEF9DB22D, 0x3FDCBB3C,0x7B843697,
+	0x3FDBD70A,0x3D70A3D7, 0x3FDCCD6D,0x582B75E4,
+	0x3FDBE76C,0x8B439581, 0x3FDCDFA0,0xB49D9818,
+	0x3FDBF7CE,0xD916872B, 0x3FDCF1D6,0x935C073C,
+	0x3FDC0831,0x26E978D5, 0x3FDD040E,0xF6EAB81C,
+	0x3FDC1893,0x74BC6A7F, 0x3FDD1649,0xE1D02E8E,
+	0x3FDC28F5,0xC28F5C29, 0x3FDD2887,0x569581CA,
+	0x3FDC3958,0x10624DD3, 0x3FDD3AC7,0x57C660C6,
+	0x3FDC49BA,0x5E353F7D, 0x3FDD4D09,0xE7F116A0,
+	0x3FDC5A1C,0xAC083127, 0x3FDD5F4F,0x09A68F0A,
+	0x3FDC6A7E,0xF9DB22D1, 0x3FDD7196,0xBF7A5AC0,
+	0x3FDC7AE1,0x47AE147B, 0x3FDD83E1,0x0C02B412,
+	0x3FDC8B43,0x95810625, 0x3FDD962D,0xF1D88366,
+	0x3FDC9BA5,0xE353F7CF, 0x3FDDA87D,0x739763D1,
+	0x3FDCAC08,0x3126E979, 0x3FDDBACF,0x93DDA7B4,
+	0x3FDCBC6A,0x7EF9DB23, 0x3FDDCD24,0x554C5D61,
+	0x3FDCCCCC,0xCCCCCCCD, 0x3FDDDF7B,0xBA8753CD,
+	0x3FDCDD2F,0x1A9FBE77, 0x3FDDF1D5,0xC6351F4B,
+	0x3FDCED91,0x6872B021, 0x3FDE0432,0x7AFF1E4E,
+	0x3FDCFDF3,0xB645A1CB, 0x3FDE1691,0xDB917E3A,
+	0x3FDD0E56,0x04189375, 0x3FDE28F3,0xEA9B4038,
+	0x3FDD1EB8,0x51EB851F, 0x3FDE3B58,0xAACE3E1C,
+	0x3FDD2F1A,0x9FBE76C9, 0x3FDE4DC0,0x1EDF2F50,
+	0x3FDD3F7C,0xED916873, 0x3FDE602A,0x4985ADC6,
+	0x3FDD4FDF,0x3B645A1D, 0x3FDE7297,0x2D7C3B02,
+	0x3FDD6041,0x89374BC7, 0x3FDE8506,0xCD80451E,
+	0x3FDD70A3,0xD70A3D71, 0x3FDE9779,0x2C522BE1,
+	0x3FDD8106,0x24DD2F1B, 0x3FDEA9EE,0x4CB545E5,
+	0x3FDD9168,0x72B020C5, 0x3FDEBC66,0x316FE5BB,
+	0x3FDDA1CA,0xC083126F, 0x3FDECEE0,0xDD4B5F29,
+	0x3FDDB22D,0x0E560419, 0x3FDEE15E,0x53140C65,
+	0x3FDDC28F,0x5C28F5C3, 0x3FDEF3DE,0x95995367,
+	0x3FDDD2F1,0xA9FBE76D, 0x3FDF0661,0xA7ADAB3F,
+	0x3FDDE353,0xF7CED917, 0x3FDF18E7,0x8C26A177,
+	0x3FDDF3B6,0x45A1CAC1, 0x3FDF2B70,0x45DCDF86,
+	0x3FDE0418,0x9374BC6A, 0x3FDF3DFB,0xD7AC3045,
+	0x3FDE147A,0xE147AE14, 0x3FDF508A,0x4473857E,
+	0x3FDE24DD,0x2F1A9FBE, 0x3FDF631B,0x8F14FD74,
+	0x3FDE353F,0x7CED9168, 0x3FDF75AF,0xBA75E889,
+	0x3FDE45A1,0xCAC08312, 0x3FDF8846,0xC97ECEE6,
+	0x3FDE5604,0x189374BC, 0x3FDF9AE0,0xBF1B7632,
+	0x3FDE6666,0x66666666, 0x3FDFAD7D,0x9E3AE753,
+	0x3FDE76C8,0xB4395810, 0x3FDFC01D,0x69CF7443,
+	0x3FDE872B,0x020C49BA, 0x3FDFD2C0,0x24CEBDE8,
+	0x3FDE978D,0x4FDF3B64, 0x3FDFE565,0xD231B9FC,
+	0x3FDEA7EF,0x9DB22D0E, 0x3FDFF80E,0x74F4B90A,
+	0x3FDEB851,0xEB851EB8, 0x3FE0055D,0x080BB634,
+	0x3FDEC8B4,0x39581062, 0x3FE00EB4,0x534E7628,
+	0x3FDED916,0x872B020C, 0x3FE0180D,0x1DC5DEFB,
+	0x3FDEE978,0xD4FDF3B6, 0x3FE02167,0x68F6ECDE,
+	0x3FDEF9DB,0x22D0E560, 0x3FE02AC3,0x366858B1,
+	0x3FDF0A3D,0x70A3D70A, 0x3FE03420,0x87A29B28,
+	0x3FDF1A9F,0xBE76C8B4, 0x3FE03D7F,0x5E2FEFF9,
+	0x3FDF2B02,0x0C49BA5E, 0x3FE046DF,0xBB9C5905,
+	0x3FDF3B64,0x5A1CAC08, 0x3FE05041,0xA175A199,
+	0x3FDF4BC6,0xA7EF9DB2, 0x3FE059A5,0x114B61AA,
+	0x3FDF5C28,0xF5C28F5C, 0x3FE0630A,0x0CAF011A,
+	0x3FDF6C8B,0x43958106, 0x3FE06C70,0x9533BB0B,
+	0x3FDF7CED,0x916872B0, 0x3FE075D8,0xAC6EA12F,
+	0x3FDF8D4F,0xDF3B645A, 0x3FE07F42,0x53F69F2A,
+	0x3FDF9DB2,0x2D0E5604, 0x3FE088AD,0x8D647DF6,
+	0x3FDFAE14,0x7AE147AE, 0x3FE0921A,0x5A52E74D,
+	0x3FDFBE76,0xC8B43958, 0x3FE09B88,0xBC5E691F,
+	0x3FDFCED9,0x16872B02, 0x3FE0A4F8,0xB525790F,
+	0x3FDFDF3B,0x645A1CAC, 0x3FE0AE6A,0x464877F6,
+	0x3FDFEF9D,0xB22D0E56, 0x3FE0B7DD,0x7169B56D,
+	0x3FE00000,0x00000000, 0x3FE0C152,0x382D7366,
+	0x3FE00831,0x26E978D5, 0x3FE0CAC8,0x9C39E9C3,
+	0x3FE01062,0x4DD2F1AA, 0x3FE0D440,0x9F374A01,
+	0x3FE01893,0x74BC6A7F, 0x3FE0DDBA,0x42CFC2DD,
+	0x3FE020C4,0x9BA5E354, 0x3FE0E735,0x88AF8411,
+	0x3FE028F5,0xC28F5C29, 0x3FE0F0B2,0x7284C20E,
+	0x3FE03126,0xE978D4FE, 0x3FE0FA31,0x01FFB9C4,
+	0x3FE03958,0x10624DD3, 0x3FE103B1,0x38D2B46F,
+	0x3FE04189,0x374BC6A8, 0x3FE10D33,0x18B20B76,
+	0x3FE049BA,0x5E353F7D, 0x3FE116B6,0xA3542C44,
+	0x3FE051EB,0x851EB852, 0x3FE1203B,0xDA719C39,
+	0x3FE05A1C,0xAC083127, 0x3FE129C2,0xBFC4FC99,
+	0x3FE0624D,0xD2F1A9FC, 0x3FE1334B,0x550B0E8D,
+	0x3FE06A7E,0xF9DB22D1, 0x3FE13CD5,0x9C02B724,
+	0x3FE072B0,0x20C49BA6, 0x3FE14661,0x966D0369,
+	0x3FE07AE1,0x47AE147B, 0x3FE14FEF,0x460D2C77,
+	0x3FE08312,0x6E978D50, 0x3FE1597E,0xACA89B9D,
+	0x3FE08B43,0x95810625, 0x3FE1630F,0xCC06EE90,
+	0x3FE09374,0xBC6A7EFA, 0x3FE16CA2,0xA5F1FB98,
+	0x3FE09BA5,0xE353F7CF, 0x3FE17637,0x3C35D5DB,
+	0x3FE0A3D7,0x0A3D70A4, 0x3FE17FCD,0x90A0D19F,
+	0x3FE0AC08,0x3126E979, 0x3FE18965,0xA50388A6,
+	0x3FE0B439,0x5810624E, 0x3FE192FF,0x7B30DE8A,
+	0x3FE0BC6A,0x7EF9DB23, 0x3FE19C9B,0x14FE0527,
+	0x3FE0C49B,0xA5E353F8, 0x3FE1A638,0x74428112,
+	0x3FE0CCCC,0xCCCCCCCD, 0x3FE1AFD7,0x9AD82E15,
+	0x3FE0D4FD,0xF3B645A2, 0x3FE1B978,0x8A9B43BC,
+	0x3FE0DD2F,0x1A9FBE77, 0x3FE1C31B,0x456A59EB,
+	0x3FE0E560,0x4189374C, 0x3FE1CCBF,0xCD266D7A,
+	0x3FE0ED91,0x6872B021, 0x3FE1D666,0x23B2E4E6,
+	0x3FE0F5C2,0x8F5C28F6, 0x3FE1E00E,0x4AF59504,
+	0x3FE0FDF3,0xB645A1CB, 0x3FE1E9B8,0x44D6C5C5,
+	0x3FE10624,0xDD2F1AA0, 0x3FE1F364,0x13413706,
+	0x3FE10E56,0x04189375, 0x3FE1FD11,0xB8222568,
+	0x3FE11687,0x2B020C4A, 0x3FE206C1,0x35694F36,
+	0x3FE11EB8,0x51EB851F, 0x3FE21072,0x8D08F957,
+	0x3FE126E9,0x78D4FDF4, 0x3FE21A25,0xC0F5F44E,
+	0x3FE12F1A,0x9FBE76C9, 0x3FE223DA,0xD327A144,
+	0x3FE1374B,0xC6A7EF9E, 0x3FE22D91,0xC597F71C,
+	0x3FE13F7C,0xED916873, 0x3FE2374A,0x9A43879E,
+	0x3FE147AE,0x147AE148, 0x3FE24105,0x5329849F,
+	0x3FE14FDF,0x3B645A1D, 0x3FE24AC1,0xF24BC545,
+	0x3FE15810,0x624DD2F2, 0x3FE25480,0x79AECB4F,
+	0x3FE16041,0x89374BC7, 0x3FE25E40,0xEB59C86E,
+	0x3FE16872,0xB020C49C, 0x3FE26803,0x4956A3AB,
+	0x3FE170A3,0xD70A3D71, 0x3FE271C7,0x95B1FED8,
+	0x3FE178D4,0xFDF3B646, 0x3FE27B8D,0xD27B3C12,
+	0x3FE18106,0x24DD2F1B, 0x3FE28556,0x01C48353,
+	0x3FE18937,0x4BC6A7F0, 0x3FE28F20,0x25A2C808,
+	0x3FE19168,0x72B020C5, 0x3FE298EC,0x402DCEC3,
+	0x3FE19999,0x9999999A, 0x3FE2A2BA,0x538032F0,
+	0x3FE1A1CA,0xC083126F, 0x3FE2AC8A,0x61B76CA2,
+	0x3FE1A9FB,0xE76C8B44, 0x3FE2B65C,0x6CF3D665,
+	0x3FE1B22D,0x0E560419, 0x3FE2C030,0x7758B327,
+	0x3FE1BA5E,0x353F7CEE, 0x3FE2CA06,0x830C342F,
+	0x3FE1C28F,0x5C28F5C3, 0x3FE2D3DE,0x92377F1C,
+	0x3FE1CAC0,0x83126E98, 0x3FE2DDB8,0xA706B400,
+	0x3FE1D2F1,0xA9FBE76D, 0x3FE2E794,0xC3A8F37F,
+	0x3FE1DB22,0xD0E56042, 0x3FE2F172,0xEA506507,
+	0x3FE1E353,0xF7CED917, 0x3FE2FB53,0x1D323D10,
+	0x3FE1EB85,0x1EB851EC, 0x3FE30535,0x5E86C374,
+	0x3FE1F3B6,0x45A1CAC1, 0x3FE30F19,0xB08959D2,
+	0x3FE1FBE7,0x6C8B4396, 0x3FE31900,0x15788205,
+	0x3FE20418,0x9374BC6A, 0x3FE322E8,0x8F95E4A8,
+	0x3FE20C49,0xBA5E353F, 0x3FE32CD3,0x212657B5,
+	0x3FE2147A,0xE147AE14, 0x3FE336BF,0xCC71E526,
+	0x3FE21CAC,0x083126E9, 0x3FE340AE,0x93C3D1B5,
+	0x3FE224DD,0x2F1A9FBE, 0x3FE34A9F,0x796AA3A7,
+	0x3FE22D0E,0x56041893, 0x3FE35492,0x7FB829AD,
+	0x3FE2353F,0x7CED9168, 0x3FE35E87,0xA90181D3,
+	0x3FE23D70,0xA3D70A3D, 0x3FE3687E,0xF79F2084,
+	0x3FE245A1,0xCAC08312, 0x3FE37278,0x6DECD7A5,
+	0x3FE24DD2,0xF1A9FBE7, 0x3FE37C74,0x0E49DDB7,
+	0x3FE25604,0x189374BC, 0x3FE38671,0xDB18D51C,
+	0x3FE25E35,0x3F7CED91, 0x3FE39071,0xD6BFD362,
+	0x3FE26666,0x66666666, 0x3FE39A74,0x03A868A8,
+	0x3FE26E97,0x8D4FDF3B, 0x3FE3A478,0x643FA71A,
+	0x3FE276C8,0xB4395810, 0x3FE3AE7E,0xFAF62A78,
+	0x3FE27EF9,0xDB22D0E5, 0x3FE3B887,0xCA401FBC,
+	0x3FE2872B,0x020C49BA, 0x3FE3C292,0xD4954CCF,
+	0x3FE28F5C,0x28F5C28F, 0x3FE3CCA0,0x1C711851,
+	0x3FE2978D,0x4FDF3B64, 0x3FE3D6AF,0xA452917E,
+	0x3FE29FBE,0x76C8B439, 0x3FE3E0C1,0x6EBC781F,
+	0x3FE2A7EF,0x9DB22D0E, 0x3FE3EAD5,0x7E35449C,
+	0x3FE2B020,0xC49BA5E3, 0x3FE3F4EB,0xD547301B,
+	0x3FE2B851,0xEB851EB8, 0x3FE3FF04,0x76803CB7,
+	0x3FE2C083,0x126E978D, 0x3FE4091F,0x64723DD4,
+	0x3FE2C8B4,0x39581062, 0x3FE4133C,0xA1B2E084,
+	0x3FE2D0E5,0x60418937, 0x3FE41D5C,0x30DBB404,
+	0x3FE2D916,0x872B020C, 0x3FE4277E,0x148A3254,
+	0x3FE2E147,0xAE147AE1, 0x3FE431A2,0x4F5FC8E4,
+	0x3FE2E978,0xD4FDF3B6, 0x3FE43BC8,0xE401E15B,
+	0x3FE2F1A9,0xFBE76C8B, 0x3FE445F1,0xD519EA76,
+	0x3FE2F9DB,0x22D0E560, 0x3FE4501D,0x25556101,
+	0x3FE3020C,0x49BA5E35, 0x3FE45A4A,0xD765D8E8,
+	0x3FE30A3D,0x70A3D70A, 0x3FE4647A,0xEE010664,
+	0x3FE3126E,0x978D4FDF, 0x3FE46EAD,0x6BE0C73D,
+	0x3FE31A9F,0xBE76C8B4, 0x3FE478E2,0x53C32C2F,
+	0x3FE322D0,0xE5604189, 0x3FE48319,0xA86A8260,
+	0x3FE32B02,0x0C49BA5E, 0x3FE48D53,0x6C9D5CFC,
+	0x3FE33333,0x33333333, 0x3FE4978F,0xA3269EE1,
+	0x3FE33B64,0x5A1CAC08, 0x3FE4A1CE,0x4ED5846E,
+	0x3FE34395,0x810624DD, 0x3FE4AC0F,0x727DAD70,
+	0x3FE34BC6,0xA7EF9DB2, 0x3FE4B653,0x10F72725,
+	0x3FE353F7,0xCED91687, 0x3FE4C099,0x2D1E7661,
+	0x3FE35C28,0xF5C28F5C, 0x3FE4CAE1,0xC9D4A1D2,
+	0x3FE3645A,0x1CAC0831, 0x3FE4D52C,0xE9FF3C59,
+	0x3FE36C8B,0x43958106, 0x3FE4DF7A,0x90886F8F,
+	0x3FE374BC,0x6A7EF9DB, 0x3FE4E9CA,0xC05F065D,
+	0x3FE37CED,0x916872B0, 0x3FE4F41D,0x7C7677B7,
+	0x3FE3851E,0xB851EB85, 0x3FE4FE72,0xC7C6F17A,
+	0x3FE38D4F,0xDF3B645A, 0x3FE508CA,0xA54D6367,
+	0x3FE39581,0x0624DD2F, 0x3FE51325,0x180B8A3C,
+	0x3FE39DB2,0x2D0E5604, 0x3FE51D82,0x2307FAF7,
+	0x3FE3A5E3,0x53F7CED9, 0x3FE527E1,0xC94E2E2C,
+	0x3FE3AE14,0x7AE147AE, 0x3FE53244,0x0DEE8B8E,
+	0x3FE3B645,0xA1CAC083, 0x3FE53CA8,0xF3FE758E,
+	0x3FE3BE76,0xC8B43958, 0x3FE54710,0x7E98551D,
+	0x3FE3C6A7,0xEF9DB22D, 0x3FE5517A,0xB0DBA59F,
+	0x3FE3CED9,0x16872B02, 0x3FE55BE7,0x8DED00F0,
+	0x3FE3D70A,0x3D70A3D7, 0x3FE56657,0x18F62B97,
+	0x3FE3DF3B,0x645A1CAC, 0x3FE570C9,0x55262123,
+	0x3FE3E76C,0x8B439581, 0x3FE57B3E,0x45B1209E,
+	0x3FE3EF9D,0xB22D0E56, 0x3FE585B5,0xEDD0B938,
+	0x3FE3F7CE,0xD916872B, 0x3FE59030,0x50C3D70B,
+	0x3FE40000,0x00000000, 0x3FE59AAD,0x71CED00F,
+	0x3FE40831,0x26E978D5, 0x3FE5A52D,0x543B712E,
+	0x3FE41062,0x4DD2F1AA, 0x3FE5AFAF,0xFB590B87,
+	0x3FE41893,0x74BC6A7F, 0x3FE5BA35,0x6A7C81DB,
+	0x3FE420C4,0x9BA5E354, 0x3FE5C4BD,0xA500561A,
+	0x3FE428F5,0xC28F5C29, 0x3FE5CF48,0xAE44B724,
+	0x3FE43126,0xE978D4FE, 0x3FE5D9D6,0x89AF8EB3,
+	0x3FE43958,0x10624DD3, 0x3FE5E467,0x3AAC8F68,
+	0x3FE44189,0x374BC6A8, 0x3FE5EEFA,0xC4AD4315,
+	0x3FE449BA,0x5E353F7D, 0x3FE5F991,0x2B291922,
+	0x3FE451EB,0x851EB852, 0x3FE6042A,0x719D752A,
+	0x3FE45A1C,0xAC083127, 0x3FE60EC6,0x9B8DBDC2,
+	0x3FE4624D,0xD2F1A9FC, 0x3FE61965,0xAC836B74,
+	0x3FE46A7E,0xF9DB22D1, 0x3FE62407,0xA80E17E3,
+	0x3FE472B0,0x20C49BA6, 0x3FE62EAC,0x91C38D21,
+	0x3FE47AE1,0x47AE147B, 0x3FE63954,0x6D3FD53B,
+	0x3FE48312,0x6E978D50, 0x3FE643FF,0x3E2549F0,
+	0x3FE48B43,0x95810625, 0x3FE64EAD,0x081CA49F,
+	0x3FE49374,0xBC6A7EFA, 0x3FE6595D,0xCED50E67,
+	0x3FE49BA5,0xE353F7CF, 0x3FE66411,0x9604307C,
+	0x3FE4A3D7,0x0A3D70A4, 0x3FE66EC8,0x616644AC,
+	0x3FE4AC08,0x3126E979, 0x3FE67982,0x34BE2623,
+	0x3FE4B439,0x5810624E, 0x3FE6843F,0x13D5625F,
+	0x3FE4BC6A,0x7EF9DB23, 0x3FE68EFF,0x027C4A59,
+	0x3FE4C49B,0xA5E353F8, 0x3FE699C2,0x048A03F0,
+	0x3FE4CCCC,0xCCCCCCCD, 0x3FE6A488,0x1DDC9B84,
+	0x3FE4D4FD,0xF3B645A2, 0x3FE6AF51,0x525915CE,
+	0x3FE4DD2F,0x1A9FBE77, 0x3FE6BA1D,0xA5EB81F9,
+	0x3FE4E560,0x4189374C, 0x3FE6C4ED,0x1C870BE7,
+	0x3FE4ED91,0x6872B021, 0x3FE6CFBF,0xBA260ECA,
+	0x3FE4F5C2,0x8F5C28F6, 0x3FE6DA95,0x82CA27E4,
+	0x3FE4FDF3,0xB645A1CB, 0x3FE6E56E,0x7A7C4996,
+	0x3FE50624,0xDD2F1AA0, 0x3FE6F04A,0xA54CCEA8,
+	0x3FE50E56,0x04189375, 0x3FE6FB2A,0x07538DD3,
+	0x3FE51687,0x2B020C4A, 0x3FE7060C,0xA4AFED8A,
+	0x3FE51EB8,0x51EB851F, 0x3FE710F2,0x8188F80D,
+	0x3FE526E9,0x78D4FDF4, 0x3FE71BDB,0xA20D6FBC,
+	0x3FE52F1A,0x9FBE76C9, 0x3FE726C8,0x0A73E3AC,
+	0x3FE5374B,0xC6A7EF9E, 0x3FE731B7,0xBEFAC489,
+	0x3FE53F7C,0xED916873, 0x3FE73CAA,0xC3E879B9,
+	0x3FE547AE,0x147AE148, 0x3FE747A1,0x1D8B76D0,
+	0x3FE54FDF,0x3B645A1D, 0x3FE7529A,0xD03A5143,
+	0x3FE55810,0x624DD2F2, 0x3FE75D97,0xE053D66E,
+	0x3FE56041,0x89374BC7, 0x3FE76898,0x523F21E6,
+	0x3FE56872,0xB020C49C, 0x3FE7739C,0x2A6BB415,
+	0x3FE570A3,0xD70A3D71, 0x3FE77EA3,0x6D518926,
+	0x3FE578D4,0xFDF3B646, 0x3FE789AE,0x1F713044,
+	0x3FE58106,0x24DD2F1B, 0x3FE794BC,0x4553E327,
+	0x3FE58937,0x4BC6A7F0, 0x3FE79FCD,0xE38B9DF4,
+	0x3FE59168,0x72B020C5, 0x3FE7AAE2,0xFEB33776,
+	0x3FE59999,0x9999999A, 0x3FE7B5FB,0x9B6E79A7,
+	0x3FE5A1CA,0xC083126F, 0x3FE7C117,0xBE6A3A94,
+	0x3FE5A9FB,0xE76C8B44, 0x3FE7CC37,0x6C5C7597,
+	0x3FE5B22D,0x0E560419, 0x3FE7D75A,0xAA0464ED,
+	0x3FE5BA5E,0x353F7CEE, 0x3FE7E281,0x7C2A9BA9,
+	0x3FE5C28F,0x5C28F5C3, 0x3FE7EDAB,0xE7A11FFE,
+	0x3FE5CAC0,0x83126E98, 0x3FE7F8D9,0xF14385F3,
+	0x3FE5D2F1,0xA9FBE76D, 0x3FE8040B,0x9DF70A6C,
+	0x3FE5DB22,0xD0E56042, 0x3FE80F40,0xF2AAAE9E,
+	0x3FE5E353,0xF7CED917, 0x3FE81A79,0xF45753DE,
+	0x3FE5EB85,0x1EB851EC, 0x3FE825B6,0xA7FFD7E1,
+	0x3FE5F3B6,0x45A1CAC1, 0x3FE830F7,0x12B1315B,
+	0x3FE5FBE7,0x6C8B4396, 0x3FE83C3B,0x39828D0A,
+	0x3FE60418,0x9374BC6A, 0x3FE84783,0x21956B28,
+	0x3FE60C49,0xBA5E353F, 0x3FE852CE,0xD015BD5A,
+	0x3FE6147A,0xE147AE14, 0x3FE85E1E,0x4A3A04F1,
+	0x3FE61CAC,0x083126E9, 0x3FE86971,0x954371BB,
+	0x3FE624DD,0x2F1A9FBE, 0x3FE874C8,0xB67E0131,
+	0x3FE62D0E,0x56041893, 0x3FE88023,0xB3409E26,
+	0x3FE6353F,0x7CED9168, 0x3FE88B82,0x90ED40E7,
+	0x3FE63D70,0xA3D70A3D, 0x3FE896E5,0x54F10FD7,
+	0x3FE645A1,0xCAC08312, 0x3FE8A24C,0x04C48085,
+	0x3FE64DD2,0xF1A9FBE7, 0x3FE8ADB6,0xA5EB7943,
+	0x3FE65604,0x189374BC, 0x3FE8B925,0x3DF57336,
+	0x3FE65E35,0x3F7CED91, 0x3FE8C497,0xD27D9CF4,
+	0x3FE66666,0x66666666, 0x3FE8D00E,0x692AFD95,
+	0x3FE66E97,0x8D4FDF3B, 0x3FE8DB89,0x07B09862,
+	0x3FE676C8,0xB4395810, 0x3FE8E707,0xB3CD90F6,
+	0x3FE67EF9,0xDB22D0E5, 0x3FE8F28A,0x734D4FFE,
+	0x3FE6872B,0x020C49BA, 0x3FE8FE11,0x4C07A87F,
+	0x3FE68F5C,0x28F5C28F, 0x3FE9099C,0x43E0FDAC,
+	0x3FE6978D,0x4FDF3B64, 0x3FE9152B,0x60CA6955,
+	0x3FE69FBE,0x76C8B439, 0x3FE920BE,0xA8C1E2EC,
+	0x3FE6A7EF,0x9DB22D0E, 0x3FE92C56,0x21D2671E,
+	0x3FE6B020,0xC49BA5E3, 0x3FE937F1,0xD2142015,
+	0x3FE6B851,0xEB851EB8, 0x3FE94391,0xBFAC8E4B,
+	0x3FE6C083,0x126E978D, 0x3FE94F35,0xF0CEB20B,
+	0x3FE6C8B4,0x39581062, 0x3FE95ADE,0x6BBB3591,
+	0x3FE6D0E5,0x60418937, 0x3FE9668B,0x36C097D6,
+	0x3FE6D916,0x872B020C, 0x3FE9723C,0x583B580B,
+	0x3FE6E147,0xAE147AE1, 0x3FE97DF1,0xD69621BC,
+	0x3FE6E978,0xD4FDF3B6, 0x3FE989AB,0xB849F9AC,
+	0x3FE6F1A9,0xFBE76C8B, 0x3FE9956A,0x03DE6B66,
+	0x3FE6F9DB,0x22D0E560, 0x3FE9A12C,0xBFE9B786,
+	0x3FE7020C,0x49BA5E35, 0x3FE9ACF3,0xF31102C5,
+	0x3FE70A3D,0x70A3D70A, 0x3FE9B8BF,0xA40885BD,
+	0x3FE7126E,0x978D4FDF, 0x3FE9C48F,0xD993BD7C,
+	0x3FE71A9F,0xBE76C8B4, 0x3FE9D064,0x9A859CDB,
+	0x3FE722D0,0xE5604189, 0x3FE9DC3D,0xEDC0BEA1,
+	0x3FE72B02,0x0C49BA5E, 0x3FE9E81B,0xDA379879,
+	0x3FE73333,0x33333333, 0x3FE9F3FE,0x66ECAEC0,
+	0x3FE73B64,0x5A1CAC08, 0x3FE9FFE5,0x9AF2C925,
+	0x3FE74395,0x810624DD, 0x3FEA0BD1,0x7D6D282F,
+	0x3FE74BC6,0xA7EF9DB2, 0x3FEA17C2,0x158FBB9F,
+	0x3FE753F7,0xCED91687, 0x3FEA23B7,0x6A9F59C1,
+	0x3FE75C28,0xF5C28F5C, 0x3FEA2FB1,0x83F1F79C,
+	0x3FE7645A,0x1CAC0831, 0x3FEA3BB0,0x68EEE221,
+	0x3FE76C8B,0x43958106, 0x3FEA47B4,0x210EF844,
+	0x3FE774BC,0x6A7EF9DB, 0x3FEA53BC,0xB3DCE615,
+	0x3FE77CED,0x916872B0, 0x3FEA5FCA,0x28F560D9,
+	0x3FE7851E,0xB851EB85, 0x3FEA6BDC,0x88076426,
+	0x3FE78D4F,0xDF3B645A, 0x3FEA77F3,0xD8D47006,
+	0x3FE79581,0x0624DD2F, 0x3FEA8410,0x2330C836,
+	0x3FE79DB2,0x2D0E5604, 0x3FEA9031,0x6F03B46A,
+	0x3FE7A5E3,0x53F7CED9, 0x3FEA9C57,0xC447C1B9,
+	0x3FE7AE14,0x7AE147AE, 0x3FEAA883,0x2B0B0525,
+	0x3FE7B645,0xA1CAC083, 0x3FEAB4B3,0xAB6F5F4F,
+	0x3FE7BE76,0xC8B43958, 0x3FEAC0E9,0x4DAAC152,
+	0x3FE7C6A7,0xEF9DB22D, 0x3FEACD24,0x1A0772D6,
+	0x3FE7CED9,0x16872B02, 0x3FEAD964,0x18E45962,
+	0x3FE7D70A,0x3D70A3D7, 0x3FEAE5A9,0x52B540E9,
+	0x3FE7DF3B,0x645A1CAC, 0x3FEAF1F3,0xD00325A3,
+	0x3FE7E76C,0x8B439581, 0x3FEAFE43,0x996C7F33,
+	0x3FE7EF9D,0xB22D0E56, 0x3FEB0A98,0xB7A58D2D,
+	0x3FE7F7CE,0xD916872B, 0x3FEB16F3,0x3378A4EC,
+	0x3FE80000,0x00000000, 0x3FEB2353,0x15C680DC,
+	0x3FE80831,0x26E978D5, 0x3FEB2FB8,0x6786912B,
+	0x3FE81062,0x4DD2F1AA, 0x3FEB3C23,0x31C74DF2,
+	0x3FE81893,0x74BC6A7F, 0x3FEB4893,0x7DAE8ADB,
+	0x3FE820C4,0x9BA5E354, 0x3FEB5509,0x5479CC55,
+	0x3FE828F5,0xC28F5C29, 0x3FEB6184,0xBF7E9E4C,
+	0x3FE83126,0xE978D4FE, 0x3FEB6E05,0xC82AEC86,
+	0x3FE83958,0x10624DD3, 0x3FEB7A8C,0x78055C9B,
+	0x3FE84189,0x374BC6A8, 0x3FEB8718,0xD8ADA99C,
+	0x3FE849BA,0x5E353F7D, 0x3FEB93AA,0xF3DD016B,
+	0x3FE851EB,0x851EB852, 0x3FEBA042,0xD36663DB,
+	0x3FE85A1C,0xAC083127, 0x3FEBACE0,0x81370390,
+	0x3FE8624D,0xD2F1A9FC, 0x3FEBB984,0x0756A8B8,
+	0x3FE86A7E,0xF9DB22D1, 0x3FEBC62D,0x6FE815A6,
+	0x3FE872B0,0x20C49BA6, 0x3FEBD2DC,0xC5296D51,
+	0x3FE87AE1,0x47AE147B, 0x3FEBDF92,0x11749BCD,
+	0x3FE88312,0x6E978D50, 0x3FEBEC4D,0x5F3FC0C3,
+	0x3FE88B43,0x95810625, 0x3FEBF90E,0xB91D9BFB,
+	0x3FE89374,0xBC6A7EFA, 0x3FEC05D6,0x29BDFBF9,
+	0x3FE89BA5,0xE353F7CF, 0x3FEC12A3,0xBBEE2EC8,
+	0x3FE8A3D7,0x0A3D70A4, 0x3FEC1F77,0x7A9974F2,
+	0x3FE8AC08,0x3126E979, 0x3FEC2C51,0x70C976C4,
+	0x3FE8B439,0x5810624E, 0x3FEC3931,0xA9A6BBD0,
+	0x3FE8BC6A,0x7EF9DB23, 0x3FEC4618,0x307924E2,
+	0x3FE8C49B,0xA5E353F8, 0x3FEC5305,0x10A86850,
+	0x3FE8CCCC,0xCCCCCCCD, 0x3FEC5FF8,0x55BC90CC,
+	0x3FE8D4FD,0xF3B645A2, 0x3FEC6CF2,0x0B5E7EC5,
+	0x3FE8DD2F,0x1A9FBE77, 0x3FEC79F2,0x3D586C5C,
+	0x3FE8E560,0x4189374C, 0x3FEC86F8,0xF796740A,
+	0x3FE8ED91,0x6872B021, 0x3FEC9406,0x462719FE,
+	0x3FE8F5C2,0x8F5C28F6, 0x3FECA11A,0x353BD84C,
+	0x3FE8FDF3,0xB645A1CB, 0x3FECAE34,0xD129ADFF,
+	0x3FE90624,0xDD2F1AA0, 0x3FECBB56,0x2669B114,
+	0x3FE90E56,0x04189375, 0x3FECC87E,0x4199A384,
+	0x3FE91687,0x2B020C4A, 0x3FECD5AD,0x2F7C8B65,
+	0x3FE91EB8,0x51EB851F, 0x3FECE2E2,0xFCFB4E35,
+	0x3FE926E9,0x78D4FDF4, 0x3FECF01F,0xB7254F6B,
+	0x3FE92F1A,0x9FBE76C9, 0x3FECFD63,0x6B31125D,
+	0x3FE9374B,0xC6A7EF9E, 0x3FED0AAE,0x267CDF99,
+	0x3FE93F7C,0xED916873, 0x3FED17FF,0xF68F6DBC,
+	0x3FE947AE,0x147AE148, 0x3FED2558,0xE9188DEC,
+	0x3FE94FDF,0x3B645A1D, 0x3FED32B9,0x0BF1DC00,
+	0x3FE95810,0x624DD2F2, 0x3FED4020,0x6D1F727F,
+	0x3FE96041,0x89374BC7, 0x3FED4D8F,0x1AD0A279,
+	0x3FE96872,0xB020C49C, 0x3FED5B05,0x2360AF70,
+	0x3FE970A3,0xD70A3D71, 0x3FED6882,0x95578F57,
+	0x3FE978D4,0xFDF3B646, 0x3FED7607,0x7F6AAECB,
+	0x3FE98106,0x24DD2F1B, 0x3FED8393,0xF07DB9A5,
+	0x3FE98937,0x4BC6A7F0, 0x3FED9127,0xF7A36800,
+	0x3FE99168,0x72B020C5, 0x3FED9EC3,0xA41E4FD7,
+	0x3FE99999,0x9999999A, 0x3FEDAC67,0x0561BB50,
+	0x3FE9A1CA,0xC083126F, 0x3FEDBA12,0x2B1283E7,
+	0x3FE9A9FB,0xE76C8B44, 0x3FEDC7C5,0x2507F286,
+	0x3FE9B22D,0x0E560419, 0x3FEDD580,0x034CA4C3,
+	0x3FE9BA5E,0x353F7CEE, 0x3FEDE342,0xD61F7756,
+	0x3FE9C28F,0x5C28F5C3, 0x3FEDF10D,0xADF475F8,
+	0x3FE9CAC0,0x83126E98, 0x3FEDFEE0,0x9B75D0D2,
+	0x3FE9D2F1,0xA9FBE76D, 0x3FEE0CBB,0xAF84D79A,
+	0x3FE9DB22,0xD0E56042, 0x3FEE1A9E,0xFB3AFA98,
+	0x3FE9E353,0xF7CED917, 0x3FEE288A,0x8FEAD1AD,
+	0x3FE9EB85,0x1EB851EC, 0x3FEE367E,0x7F212996,
+	0x3FE9F3B6,0x45A1CAC1, 0x3FEE447A,0xDAA61791,
+	0x3FE9FBE7,0x6C8B4396, 0x3FEE527F,0xB47E139A,
+	0x3FEA0418,0x9374BC6A, 0x3FEE608D,0x1EEB196B,
+	0x3FEA0C49,0xBA5E353F, 0x3FEE6EA3,0x2C6DD07B,
+	0x3FEA147A,0xE147AE14, 0x3FEE7CC1,0xEFC6BB1E,
+	0x3FEA1CAC,0x083126E9, 0x3FEE8AE9,0x7BF76D19,
+	0x3FEA24DD,0x2F1A9FBE, 0x3FEE9919,0xE443C9CC,
+	0x3FEA2D0E,0x56041893, 0x3FEEA753,0x3C334A37,
+	0x3FEA353F,0x7CED9168, 0x3FEEB595,0x97924B0F,
+	0x3FEA3D70,0xA3D70A3D, 0x3FEEC3E1,0x0A736331,
+	0x3FEA45A1,0xCAC08312, 0x3FEED235,0xA930C2A0,
+	0x3FEA4DD2,0xF1A9FBE7, 0x3FEEE093,0x886D9A62,
+	0x3FEA5604,0x189374BC, 0x3FEEEEFA,0xBD178D7E,
+	0x3FEA5E35,0x3F7CED91, 0x3FEEFD6B,0x5C682B5D,
+	0x3FEA6666,0x66666666, 0x3FEF0BE5,0x7BE673E1,
+	0x3FEA6E97,0x8D4FDF3B, 0x3FEF1A69,0x3168657F,
+	0x3FEA76C8,0xB4395810, 0x3FEF28F6,0x931495AB,
+	0x3FEA7EF9,0xDB22D0E5, 0x3FEF378D,0xB763D3E9,
+	0x3FEA872B,0x020C49BA, 0x3FEF462E,0xB522D7E2,
+	0x3FEA8F5C,0x28F5C28F, 0x3FEF54D9,0xA373FACC,
+	0x3FEA978D,0x4FDF3B64, 0x3FEF638E,0x99D0FC8C,
+	0x3FEA9FBE,0x76C8B439, 0x3FEF724D,0xB00CD4F5,
+	0x3FEAA7EF,0x9DB22D0E, 0x3FEF8116,0xFE55917F,
+	0x3FEAB020,0xC49BA5E3, 0x3FEF8FEA,0x9D363FF0,
+	0x3FEAB851,0xEB851EB8, 0x3FEF9EC8,0xA598E64F,
+	0x3FEAC083,0x126E978D, 0x3FEFADB1,0x30C888AA,
+	0x3FEAC8B4,0x39581062, 0x3FEFBCA4,0x58733D1A,
+	0x3FEAD0E5,0x60418937, 0x3FEFCBA2,0x36AC4E78,
+	0x3FEAD916,0x872B020C, 0x3FEFDAAA,0xE5EE6E5B,
+	0x3FEAE147,0xAE147AE1, 0x3FEFE9BE,0x811DF6CA,
+	0x3FEAE978,0xD4FDF3B6, 0x3FEFF8DD,0x238B3C40,
+	0x3FEAF1A9,0xFBE76C8B, 0x3FF00403,0x747A7845,
+	0x3FEAF9DB,0x22D0E560, 0x3FF00B9D,0xF6C54B8A,
+	0x3FEB020C,0x49BA5E35, 0x3FF0133E,0x26F785A8,
+	0x3FEB0A3D,0x70A3D70A, 0x3FF01AE4,0x139D8CE0,
+	0x3FEB126E,0x978D4FDF, 0x3FF0228F,0xCB801635,
+	0x3FEB1A9F,0xBE76C8B4, 0x3FF02A41,0x5DA585AB,
+	0x3FEB22D0,0xE5604189, 0x3FF031F8,0xD95358E8,
+	0x3FEB2B02,0x0C49BA5E, 0x3FF039B6,0x4E0F9C9B,
+	0x3FEB3333,0x33333333, 0x3FF04179,0xCBA26D0E,
+	0x3FEB3B64,0x5A1CAC08, 0x3FF04943,0x62178243,
+	0x3FEB4395,0x810624DD, 0x3FF05113,0x21BFC818,
+	0x3FEB4BC6,0xA7EF9DB2, 0x3FF058E9,0x1B3302D9,
+	0x3FEB53F7,0xCED91687, 0x3FF060C5,0x5F5180BA,
+	0x3FEB5C28,0xF5C28F5C, 0x3FF068A7,0xFF45D8BD,
+	0x3FEB645A,0x1CAC0831, 0x3FF07091,0x0C86B77A,
+	0x3FEB6C8B,0x43958106, 0x3FF07880,0x98D8BA59,
+	0x3FEB74BC,0x6A7EF9DB, 0x3FF08076,0xB65059D2,
+	0x3FEB7CED,0x916872B0, 0x3FF08873,0x7753E337,
+	0x3FEB851E,0xB851EB85, 0x3FF09076,0xEE9D82BB,
+	0x3FEB8D4F,0xDF3B645A, 0x3FF09881,0x2F3D5E3E,
+	0x3FEB9581,0x0624DD2F, 0x3FF0A092,0x4C9BC1A8,
+	0x3FEB9DB2,0x2D0E5604, 0x3FF0A8AA,0x5A7B5D67,
+	0x3FEBA5E3,0x53F7CED9, 0x3FF0B0C9,0x6CFB97E2,
+	0x3FEBAE14,0x7AE147AE, 0x3FF0B8EF,0x989AF2A0,
+	0x3FEBB645,0xA1CAC083, 0x3FF0C11C,0xF23983E3,
+	0x3FEBBE76,0xC8B43958, 0x3FF0C951,0x8F1B85AA,
+	0x3FEBC6A7,0xEF9DB22D, 0x3FF0D18D,0x84EBFADD,
+	0x3FEBCED9,0x16872B02, 0x3FF0D9D0,0xE9BF6BAF,
+	0x3FEBD70A,0x3D70A3D7, 0x3FF0E21B,0xD416BA16,
+	0x3FEBDF3B,0x645A1CAC, 0x3FF0EA6E,0x5AE20F71,
+	0x3FEBE76C,0x8B439581, 0x3FF0F2C8,0x9583E464,
+	0x3FEBEF9D,0xB22D0E56, 0x3FF0FB2A,0x9BD42415,
+	0x3FEBF7CE,0xD916872B, 0x3FF10394,0x86236BEE,
+	0x3FEC0000,0x00000000, 0x3FF10C06,0x6D3E6932,
+	0x3FEC0831,0x26E978D5, 0x3FF11480,0x6A7155A6,
+	0x3FEC1062,0x4DD2F1AA, 0x3FF11D02,0x978B94C1,
+	0x3FEC1893,0x74BC6A7F, 0x3FF1258D,0x0EE372CB,
+	0x3FEC20C4,0x9BA5E354, 0x3FF12E1F,0xEB5A0775,
+	0x3FEC28F5,0xC28F5C29, 0x3FF136BB,0x485F3D91,
+	0x3FEC3126,0xE978D4FE, 0x3FF13F5F,0x41F6019A,
+	0x3FEC3958,0x10624DD3, 0x3FF1480B,0xF4B898CD,
+	0x3FEC4189,0x374BC6A8, 0x3FF150C1,0x7DDD22D2,
+	0x3FEC49BA,0x5E353F7D, 0x3FF1597F,0xFB3A47D9,
+	0x3FEC51EB,0x851EB852, 0x3FF16247,0x8B4C155F,
+	0x3FEC5A1C,0xAC083127, 0x3FF16B18,0x4D390BD2,
+	0x3FEC624D,0xD2F1A9FC, 0x3FF173F2,0x60D75F64,
+	0x3FEC6A7E,0xF9DB22D1, 0x3FF17CD5,0xE6B26EA0,
+	0x3FEC72B0,0x20C49BA6, 0x3FF185C3,0x0010715C,
+	0x3FEC7AE1,0x47AE147B, 0x3FF18EB9,0xCEF862D9,
+	0x3FEC8312,0x6E978D50, 0x3FF197BA,0x76382A00,
+	0x3FEC8B43,0x95810625, 0x3FF1A0C5,0x196B02EE,
+	0x3FEC9374,0xBC6A7EFA, 0x3FF1A9D9,0xDD002D20,
+	0x3FEC9BA5,0xE353F7CF, 0x3FF1B2F8,0xE641E1BF,
+	0x3FECA3D7,0x0A3D70A4, 0x3FF1BC22,0x5B5C95DA,
+	0x3FECAC08,0x3126E979, 0x3FF1C556,0x63668C8A,
+	0x3FECB439,0x5810624E, 0x3FF1CE95,0x2667BD32,
+	0x3FECBC6A,0x7EF9DB23, 0x3FF1D7DE,0xCD621268,
+	0x3FECC49B,0xA5E353F8, 0x3FF1E133,0x825A064D,
+	0x3FECCCCC,0xCCCCCCCD, 0x3FF1EA93,0x705FA172,
+	0x3FECD4FD,0xF3B645A2, 0x3FF1F3FE,0xC397E1B5,
+	0x3FECDD2F,0x1A9FBE77, 0x3FF1FD75,0xA9468EE4,
+	0x3FECE560,0x4189374C, 0x3FF206F8,0x4FD88358,
+	0x3FECED91,0x6872B021, 0x3FF21086,0xE6EE6F18,
+	0x3FECF5C2,0x8F5C28F6, 0x3FF21A21,0x9F681C97,
+	0x3FECFDF3,0xB645A1CB, 0x3FF223C8,0xAB703E8F,
+	0x3FED0624,0xDD2F1AA0, 0x3FF22D7C,0x3E88CF08,
+	0x3FED0E56,0x04189375, 0x3FF2373C,0x8D980826,
+	0x3FED1687,0x2B020C4A, 0x3FF24109,0xCEF5FFFF,
+	0x3FED1EB8,0x51EB851F, 0x3FF24AE4,0x3A7AF149,
+	0x3FED26E9,0x78D4FDF4, 0x3FF254CC,0x098E3B91,
+	0x3FED2F1A,0x9FBE76C9, 0x3FF25EC1,0x7736264B,
+	0x3FED374B,0xC6A7EF9E, 0x3FF268C4,0xC02872FD,
+	0x3FED3F7C,0xED916873, 0x3FF272D6,0x22DBCB9F,
+	0x3FED47AE,0x147AE148, 0x3FF27CF5,0xDF9A1B5D,
+	0x3FED4FDF,0x3B645A1D, 0x3FF28724,0x3893E0EA,
+	0x3FED5810,0x624DD2F2, 0x3FF29161,0x71F48ACB,
+	0x3FED6041,0x89374BC7, 0x3FF29BAD,0xD1F7EF57,
+	0x3FED6872,0xB020C49C, 0x3FF2A609,0xA100F36A,
+	0x3FED70A3,0xD70A3D71, 0x3FF2B075,0x29B1748A,
+	0x3FED78D4,0xFDF3B646, 0x3FF2BAF0,0xB9038CBB,
+	0x3FED8106,0x24DD2F1B, 0x3FF2C57C,0x9E644835,
+	0x3FED8937,0x4BC6A7F0, 0x3FF2D019,0x2BCFE71F,
+	0x3FED9168,0x72B020C5, 0x3FF2DAC6,0xB5EFC7C3,
+	0x3FED9999,0x9999999A, 0x3FF2E585,0x943A1802,
+	0x3FEDA1CA,0xC083126F, 0x3FF2F056,0x21136F98,
+	0x3FEDA9FB,0xE76C8B44, 0x3FF2FB38,0xB9F277A0,
+	0x3FEDB22D,0x0E560419, 0x3FF3062D,0xBF85C717,
+	0x3FEDBA5E,0x353F7CEE, 0x3FF31135,0x95DC1FB8,
+	0x3FEDC28F,0x5C28F5C3, 0x3FF31C50,0xA48F3A76,
+	0x3FEDCAC0,0x83126E98, 0x3FF3277F,0x56F1575A,
+	0x3FEDD2F1,0xA9FBE76D, 0x3FF332C2,0x1C3DC95E,
+	0x3FEDDB22,0xD0E56042, 0x3FF33E19,0x67CCBC54,
+	0x3FEDE353,0xF7CED917, 0x3FF34985,0xB14A78F0,
+	0x3FEDEB85,0x1EB851EC, 0x3FF35507,0x74F271D1,
+	0x3FEDF3B6,0x45A1CAC1, 0x3FF3609F,0x33CE6BE0,
+	0x3FEDFBE7,0x6C8B4396, 0x3FF36C4D,0x73FA1CBD,
+	0x3FEE0418,0x9374BC6A, 0x3FF37812,0xC0EBA374,
+	0x3FEE0C49,0xBA5E353F, 0x3FF383EF,0xABC14A22,
+	0x3FEE147A,0xE147AE14, 0x3FF38FE4,0xCB950B11,
+	0x3FEE1CAC,0x083126E9, 0x3FF39BF2,0xBDD66144,
+	0x3FEE24DD,0x2F1A9FBE, 0x3FF3A81A,0x26AAFB55,
+	0x3FEE2D0E,0x56041893, 0x3FF3B45B,0xB156F898,
+	0x3FEE353F,0x7CED9168, 0x3FF3C0B8,0x10AD6BA6,
+	0x3FEE3D70,0xA3D70A3D, 0x3FF3CD2F,0xFF89F36A,
+	0x3FEE45A1,0xCAC08312, 0x3FF3D9C4,0x4154546E,
+	0x3FEE4DD2,0xF1A9FBE7, 0x3FF3E675,0xA28F1896,
+	0x3FEE5604,0x189374BC, 0x3FF3F344,0xF9725BBD,
+	0x3FEE5E35,0x3F7CED91, 0x3FF40033,0x2694109F,
+	0x3FEE6666,0x66666666, 0x3FF40D41,0x159F3409,
+	0x3FEE6E97,0x8D4FDF3B, 0x3FF41A6F,0xBE1B950E,
+	0x3FEE76C8,0xB4395810, 0x3FF427C0,0x24481188,
+	0x3FEE7EF9,0xDB22D0E5, 0x3FF43533,0x5A096758,
+	0x3FEE872B,0x020C49BA, 0x3FF442CA,0x7FF006A1,
+	0x3FEE8F5C,0x28F5C28F, 0x3FF45086,0xC657A96B,
+	0x3FEE978D,0x4FDF3B64, 0x3FF45E69,0x6EA3DC00,
+	0x3FEE9FBE,0x76C8B439, 0x3FF46C73,0xCC9D1A16,
+	0x3FEEA7EF,0x9DB22D0E, 0x3FF47AA7,0x47F2B272,
+	0x3FEEB020,0xC49BA5E3, 0x3FF48905,0x5DE64A33,
+	0x3FEEB851,0xEB851EB8, 0x3FF4978F,0xA3269EE1,
+	0x3FEEC083,0x126E978D, 0x3FF4A647,0xC5E011EA,
+	0x3FEEC8B4,0x39581062, 0x3FF4B52F,0x900AA16E,
+	0x3FEED0E5,0x60418937, 0x3FF4C448,0xE9FE4311,
+	0x3FEED916,0x872B020C, 0x3FF4D395,0xDD582B8A,
+	0x3FEEE147,0xAE147AE1, 0x3FF4E318,0x983D78B1,
+	0x3FEEE978,0xD4FDF3B6, 0x3FF4F2D3,0x710A08DC,
+	0x3FEEF1A9,0xFBE76C8B, 0x3FF502C8,0xEA7D247E,
+	0x3FEEF9DB,0x22D0E560, 0x3FF512FB,0xB8792022,
+	0x3FEF020C,0x49BA5E35, 0x3FF5236E,0xC56F7284,
+	0x3FEF0A3D,0x70A3D70A, 0x3FF53425,0x38981EC8,
+	0x3FEF126E,0x978D4FDF, 0x3FF54522,0x7D1A13CF,
+	0x3FEF1A9F,0xBE76C8B4, 0x3FF5566A,0x4A52A5E6,
+	0x3FEF22D0,0xE5604189, 0x3FF56800,0xAD751A8A,
+	0x3FEF2B02,0x0C49BA5E, 0x3FF579EA,0x14C91A41,
+	0x3FEF3333,0x33333333, 0x3FF58C2B,0x5CE0C3E5,
+	0x3FEF3B64,0x5A1CAC08, 0x3FF59EC9,0xE036730A,
+	0x3FEF4395,0x810624DD, 0x3FF5B1CB,0x89C1039F,
+	0x3FEF4BC6,0xA7EF9DB2, 0x3FF5C536,0xEB363A94,
+	0x3FEF53F7,0xCED91687, 0x3FF5D913,0x57E9F7E9,
+	0x3FEF5C28,0xF5C28F5C, 0x3FF5ED69,0x0583BE07,
+	0x3FEF645A,0x1CAC0831, 0x3FF60241,0x342B8535,
+	0x3FEF6C8B,0x43958106, 0x3FF617A6,0x605FB64A,
+	0x3FEF74BC,0x6A7EF9DB, 0x3FF62DA4,0x81747299,
+	0x3FEF7CED,0x916872B0, 0x3FF64449,0x58E74417,
+	0x3FEF851E,0xB851EB85, 0x3FF65BA4,0xD86C24C5,
+	0x3FEF8D4F,0xDF3B645A, 0x3FF673C9,0xA7343103,
+	0x3FEF9581,0x0624DD2F, 0x3FF68CCD,0xD2F76F29,
+	0x3FEF9DB2,0x2D0E5604, 0x3FF6A6CB,0xBFB70F7C,
+	0x3FEFA5E3,0x53F7CED9, 0x3FF6C1E3,0x73B93370,
+	0x3FEFAE14,0x7AE147AE, 0x3FF6DE3C,0x6F33D51D,
+	0x3FEFB645,0xA1CAC083, 0x3FF6FC08,0x5EFE9A01,
+	0x3FEFBE76,0xC8B43958, 0x3FF71B87,0x352143E2,
+	0x3FEFC6A7,0xEF9DB22D, 0x3FF73D0D,0xA7DF830D,
+	0x3FEFCED9,0x16872B02, 0x3FF76110,0x12AB625F,
+	0x3FEFD70A,0x3D70A3D7, 0x3FF78835,0xFD4104B3,
+	0x3FEFDF3B,0x645A1CAC, 0x3FF7B380,0x8CC4B16A,
+	0x3FEFE76C,0x8B439581, 0x3FF7E4A0,0xA9830084,
+	0x3FEFEF9D,0xB22D0E56, 0x3FF81EE2,0x80851D99,
+	0x3FEFF7CE,0xD916872B, 0x3FF86AC9,0xAD18F803,
+	0x3FF00000,0x00000000, 0x3FF921FB,0x54442D18,
+	};
+
+LOCAL_D const TUint32 PowerTest[] =
+	{
+	0x3FE00000,0x00000000, 0x3FB99999,0x9999999A, 0x3FEDDB68,0x0117AB12,
+	0x3FE00000,0x00000000, 0x3FC99999,0x9999999A, 0x3FEBDB8C,0xDADBE120,
+	0x3FE00000,0x00000000, 0x3FD33333,0x33333333, 0x3FE9FDF8,0xBCCE533E,
+	0x3FE00000,0x00000000, 0x3FD99999,0x9999999A, 0x3FE84060,0x03B2AE5C,
+	0x3FE00000,0x00000000, 0x3FE00000,0x00000000, 0x3FE6A09E,0x667F3BCD,
+	0x3FE00000,0x00000000, 0x3FE33333,0x33333333, 0x3FE51CB4,0x53B9536C,
+	0x3FE00000,0x00000000, 0x3FE66666,0x66666666, 0x3FE3B2C4,0x7BFF8329,
+	0x3FE00000,0x00000000, 0x3FE99999,0x9999999A, 0x3FE26111,0x86BAE674,
+	0x3FE00000,0x00000000, 0x3FECCCCC,0xCCCCCCCD, 0x3FE125FB,0xEE250664,
+	0x3FE00000,0x00000000, 0x3FF00000,0x00000000, 0x3FE00000,0x00000000,
+	0x3FE00000,0x00000000, 0x3FF19999,0x9999999A, 0x3FDDDB68,0x0117AB12,
+	0x3FE00000,0x00000000, 0x3FF33333,0x33333333, 0x3FDBDB8C,0xDADBE120,
+	0x3FE00000,0x00000000, 0x3FF4CCCC,0xCCCCCCCD, 0x3FD9FDF8,0xBCCE533D,
+	0x3FE00000,0x00000000, 0x3FF66666,0x66666666, 0x3FD84060,0x03B2AE5D,
+	0x3FE00000,0x00000000, 0x3FF80000,0x00000000, 0x3FD6A09E,0x667F3BCD,
+	0x3FE00000,0x00000000, 0x3FF99999,0x9999999A, 0x3FD51CB4,0x53B9536C,
+	0x3FE00000,0x00000000, 0x3FFB3333,0x33333333, 0x3FD3B2C4,0x7BFF8329,
+	0x3FE00000,0x00000000, 0x3FFCCCCC,0xCCCCCCCD, 0x3FD26111,0x86BAE674,
+	0x3FE00000,0x00000000, 0x3FFE6666,0x66666666, 0x3FD125FB,0xEE250664,
+	0x3FE00000,0x00000000, 0x40000000,0x00000000, 0x3FD00000,0x00000000,
+	0x3FE33333,0x33333333, 0x3FB99999,0x9999999A, 0x3FEE680A,0x48D16872,
+	0x3FE33333,0x33333333, 0x3FC99999,0x9999999A, 0x3FECE465,0x8B654324,
+	0x3FE33333,0x33333333, 0x3FD33333,0x33333333, 0x3FEB740E,0xC5D2AA1A,
+	0x3FE33333,0x33333333, 0x3FD99999,0x9999999A, 0x3FEA160F,0xDC35D2CB,
+	0x3FE33333,0x33333333, 0x3FE00000,0x00000000, 0x3FE8C97E,0xF43F7248,
+	0x3FE33333,0x33333333, 0x3FE33333,0x33333333, 0x3FE78D7D,0xD8F4883C,
+	0x3FE33333,0x33333333, 0x3FE66666,0x66666666, 0x3FE66139,0x66362A65,
+	0x3FE33333,0x33333333, 0x3FE99999,0x9999999A, 0x3FE543E8,0xFBAE1CEA,
+	0x3FE33333,0x33333333, 0x3FECCCCC,0xCCCCCCCD, 0x3FE434CD,0xF6C1F4C8,
+	0x3FE33333,0x33333333, 0x3FF00000,0x00000000, 0x3FE33333,0x33333333,
+	0x3FE33333,0x33333333, 0x3FF19999,0x9999999A, 0x3FE23E6C,0x92173EAA,
+	0x3FE33333,0x33333333, 0x3FF33333,0x33333333, 0x3FE155D6,0x86D65B7C,
+	0x3FE33333,0x33333333, 0x3FF4CCCC,0xCCCCCCCD, 0x3FE078D5,0xA9E4CC76,
+	0x3FE33333,0x33333333, 0x3FF66666,0x66666666, 0x3FDF4DAC,0xA1DA3027,
+	0x3FE33333,0x33333333, 0x3FF80000,0x00000000, 0x3FDDBE98,0x584C22BC,
+	0x3FE33333,0x33333333, 0x3FF99999,0x9999999A, 0x3FDC4363,0xD1257047,
+	0x3FE33333,0x33333333, 0x3FFB3333,0x33333333, 0x3FDADB11,0xADDA9946,
+	0x3FE33333,0x33333333, 0x3FFCCCCC,0xCCCCCCCD, 0x3FD984B1,0x2E0422B2,
+	0x3FE33333,0x33333333, 0x3FFE6666,0x66666666, 0x3FD83F5D,0x8E8258F0,
+	0x3FE33333,0x33333333, 0x40000000,0x00000000, 0x3FD70A3D,0x70A3D70A,
+	0x3FE66666,0x66666666, 0x3FB99999,0x9999999A, 0x3FEEE0F6,0x172E7679,
+	0x3FE66666,0x66666666, 0x3FC99999,0x9999999A, 0x3FEDCBFA,0xE8202D18,
+	0x3FE66666,0x66666666, 0x3FD33333,0x33333333, 0x3FECC0B4,0x3BA5C3D9,
+	0x3FE66666,0x66666666, 0x3FD99999,0x9999999A, 0x3FEBBECB,0x03CABB82,
+	0x3FE66666,0x66666666, 0x3FE00000,0x00000000, 0x3FEAC5EB,0x3F7AB2F8,
+	0x3FE66666,0x66666666, 0x3FE33333,0x33333333, 0x3FE9D5C3,0xDF24FB63,
+	0x3FE66666,0x66666666, 0x3FE66666,0x66666666, 0x3FE8EE06,0xAA5599B0,
+	0x3FE66666,0x66666666, 0x3FE99999,0x9999999A, 0x3FE80E68,0x263B1BFB,
+	0x3FE66666,0x66666666, 0x3FECCCCC,0xCCCCCCCD, 0x3FE7369F,0x7D10F686,
+	0x3FE66666,0x66666666, 0x3FF00000,0x00000000, 0x3FE66666,0x66666666,
+	0x3FE66666,0x66666666, 0x3FF19999,0x9999999A, 0x3FE59D79,0x103A1FBA,
+	0x3FE66666,0x66666666, 0x3FF33333,0x33333333, 0x3FE4DB96,0x08E352C4,
+	0x3FE66666,0x66666666, 0x3FF4CCCC,0xCCCCCCCD, 0x3FE4207E,0x29C0D5E5,
+	0x3FE66666,0x66666666, 0x3FF66666,0x66666666, 0x3FE36BF4,0x82A78341,
+	0x3FE66666,0x66666666, 0x3FF80000,0x00000000, 0x3FE2BDBE,0x460916E0,
+	0x3FE66666,0x66666666, 0x3FF99999,0x9999999A, 0x3FE215A2,0xB5CD165E,
+	0x3FE66666,0x66666666, 0x3FFB3333,0x33333333, 0x3FE1736B,0x10D5852E,
+	0x3FE66666,0x66666666, 0x3FFCCCCC,0xCCCCCCCD, 0x3FE0D6E2,0x81296062,
+	0x3FE66666,0x66666666, 0x3FFE6666,0x66666666, 0x3FE03FD6,0x0ABF12F7,
+	0x3FE66666,0x66666666, 0x40000000,0x00000000, 0x3FDF5C28,0xF5C28F5B,
+	0x3FE99999,0x9999999A, 0x3FB99999,0x9999999A, 0x3FEF4B39,0xA9528405,
+	0x3FE99999,0x9999999A, 0x3FC99999,0x9999999A, 0x3FEE9A70,0x8EC1794A,
+	0x3FE99999,0x9999999A, 0x3FD33333,0x33333333, 0x3FEDED8E,0x27210DB1,
+	0x3FE99999,0x9999999A, 0x3FD99999,0x9999999A, 0x3FED447C,0x6894B361,
+	0x3FE99999,0x9999999A, 0x3FE00000,0x00000000, 0x3FEC9F25,0xC5BFEDD9,
+	0x3FE99999,0x9999999A, 0x3FE33333,0x33333333, 0x3FEBFD75,0x2B06FDE0,
+	0x3FE99999,0x9999999A, 0x3FE66666,0x66666666, 0x3FEB5F55,0xFBDF12BA,
+	0x3FE99999,0x9999999A, 0x3FE99999,0x9999999A, 0x3FEAC4B4,0x102DA8F1,
+	0x3FE99999,0x9999999A, 0x3FECCCCC,0xCCCCCCCD, 0x3FEA2D7B,0xB1B6C0F1,
+	0x3FE99999,0x9999999A, 0x3FF00000,0x00000000, 0x3FE99999,0x9999999A,
+	0x3FE99999,0x9999999A, 0x3FF19999,0x9999999A, 0x3FE908FA,0xEDDB9CD1,
+	0x3FE99999,0x9999999A, 0x3FF33333,0x33333333, 0x3FE87B8D,0x3F012DD5,
+	0x3FE99999,0x9999999A, 0x3FF4CCCC,0xCCCCCCCD, 0x3FE7F13E,0x85B40AF4,
+	0x3FE99999,0x9999999A, 0x3FF66666,0x66666666, 0x3FE769FD,0x2076F5E8,
+	0x3FE99999,0x9999999A, 0x3FF80000,0x00000000, 0x3FE6E5B7,0xD16657E2,
+	0x3FE99999,0x9999999A, 0x3FF99999,0x9999999A, 0x3FE6645D,0xBC0597E7,
+	0x3FE99999,0x9999999A, 0x3FFB3333,0x33333333, 0x3FE5E5DE,0x6318DBC8,
+	0x3FE99999,0x9999999A, 0x3FFCCCCC,0xCCCCCCCD, 0x3FE56A29,0xA68AED8E,
+	0x3FE99999,0x9999999A, 0x3FFE6666,0x66666666, 0x3FE4F12F,0xC15F00C1,
+	0x3FE99999,0x9999999A, 0x40000000,0x00000000, 0x3FE47AE1,0x47AE147C,
+	0x3FECCCCC,0xCCCCCCCD, 0x3FB99999,0x9999999A, 0x3FEFAA24,0x4A98407A,
+	0x3FECCCCC,0xCCCCCCCD, 0x3FC99999,0x9999999A, 0x3FEF552E,0xF248B71D,
+	0x3FECCCCC,0xCCCCCCCD, 0x3FD33333,0x33333333, 0x3FEF011D,0x8CFC7493,
+	0x3FECCCCC,0xCCCCCCCD, 0x3FD99999,0x9999999A, 0x3FEEADED,0xB718E4D0,
+	0x3FECCCCC,0xCCCCCCCD, 0x3FE00000,0x00000000, 0x3FEE5B9D,0x136C6D96,
+	0x3FECCCCC,0xCCCCCCCD, 0x3FE33333,0x33333333, 0x3FEE0A29,0x4B1D3B9B,
+	0x3FECCCCC,0xCCCCCCCD, 0x3FE66666,0x66666666, 0x3FEDB990,0x0D983DD4,
+	0x3FECCCCC,0xCCCCCCCD, 0x3FE99999,0x9999999A, 0x3FED69CF,0x10804E69,
+	0x3FECCCCC,0xCCCCCCCD, 0x3FECCCCC,0xCCCCCCCD, 0x3FED1AE4,0x0F9D88D8,
+	0x3FECCCCC,0xCCCCCCCD, 0x3FF00000,0x00000000, 0x3FECCCCC,0xCCCCCCCD,
+	0x3FECCCCC,0xCCCCCCCD, 0x3FF19999,0x9999999A, 0x3FEC7F87,0x0FEF6D3A,
+	0x3FECCCCC,0xCCCCCCCD, 0x3FF33333,0x33333333, 0x3FEC3310,0xA6DB0B34,
+	0x3FECCCCC,0xCCCCCCCD, 0x3FF4CCCC,0xCCCCCCCD, 0x3FEBE767,0x65499C1E,
+	0x3FECCCCC,0xCCCCCCCD, 0x3FF66666,0x66666666, 0x3FEB9C89,0x24C99ABC,
+	0x3FECCCCC,0xCCCCCCCD, 0x3FF80000,0x00000000, 0x3FEB5273,0xC4AE62A1,
+	0x3FECCCCC,0xCCCCCCCD, 0x3FF99999,0x9999999A, 0x3FEB0925,0x2A00B5A6,
+	0x3FECCCCC,0xCCCCCCCD, 0x3FFB3333,0x33333333, 0x3FEAC09B,0x3F6F6AD9,
+	0x3FECCCCC,0xCCCCCCCD, 0x3FFCCCCC,0xCCCCCCCD, 0x3FEA78D3,0xF5404692,
+	0x3FECCCCC,0xCCCCCCCD, 0x3FFE6666,0x66666666, 0x3FEA31CD,0x4140FB29,
+	0x3FECCCCC,0xCCCCCCCD, 0x40000000,0x00000000, 0x3FE9EB85,0x1EB851EC,
+	0x3FF00000,0x00000000, 0x3FB99999,0x9999999A, 0x3FF00000,0x00000000,
+	0x3FF00000,0x00000000, 0x3FC99999,0x9999999A, 0x3FF00000,0x00000000,
+	0x3FF00000,0x00000000, 0x3FD33333,0x33333333, 0x3FF00000,0x00000000,
+	0x3FF00000,0x00000000, 0x3FD99999,0x9999999A, 0x3FF00000,0x00000000,
+	0x3FF00000,0x00000000, 0x3FE00000,0x00000000, 0x3FF00000,0x00000000,
+	0x3FF00000,0x00000000, 0x3FE33333,0x33333333, 0x3FF00000,0x00000000,
+	0x3FF00000,0x00000000, 0x3FE66666,0x66666666, 0x3FF00000,0x00000000,
+	0x3FF00000,0x00000000, 0x3FE99999,0x9999999A, 0x3FF00000,0x00000000,
+	0x3FF00000,0x00000000, 0x3FECCCCC,0xCCCCCCCD, 0x3FF00000,0x00000000,
+	0x3FF00000,0x00000000, 0x3FF00000,0x00000000, 0x3FF00000,0x00000000,
+	0x3FF00000,0x00000000, 0x3FF19999,0x9999999A, 0x3FF00000,0x00000000,
+	0x3FF00000,0x00000000, 0x3FF33333,0x33333333, 0x3FF00000,0x00000000,
+	0x3FF00000,0x00000000, 0x3FF4CCCC,0xCCCCCCCD, 0x3FF00000,0x00000000,
+	0x3FF00000,0x00000000, 0x3FF66666,0x66666666, 0x3FF00000,0x00000000,
+	0x3FF00000,0x00000000, 0x3FF80000,0x00000000, 0x3FF00000,0x00000000,
+	0x3FF00000,0x00000000, 0x3FF99999,0x9999999A, 0x3FF00000,0x00000000,
+	0x3FF00000,0x00000000, 0x3FFB3333,0x33333333, 0x3FF00000,0x00000000,
+	0x3FF00000,0x00000000, 0x3FFCCCCC,0xCCCCCCCD, 0x3FF00000,0x00000000,
+	0x3FF00000,0x00000000, 0x3FFE6666,0x66666666, 0x3FF00000,0x00000000,
+	0x3FF00000,0x00000000, 0x40000000,0x00000000, 0x3FF00000,0x00000000,
+	0x3FF19999,0x9999999A, 0x3FB99999,0x9999999A, 0x3FF02739,0xC65D58BF,
+	0x3FF19999,0x9999999A, 0x3FC99999,0x9999999A, 0x3FF04ED3,0xB7325783,
+	0x3FF19999,0x9999999A, 0x3FD33333,0x33333333, 0x3FF076CE,0xBE41BF7A,
+	0x3FF19999,0x9999999A, 0x3FD99999,0x9999999A, 0x3FF09F2B,0xC99051DD,
+	0x3FF19999,0x9999999A, 0x3FE00000,0x00000000, 0x3FF0C7EB,0xC96A56F6,
+	0x3FF19999,0x9999999A, 0x3FE33333,0x33333333, 0x3FF0F10F,0xB06934B0,
+	0x3FF19999,0x9999999A, 0x3FE66666,0x66666666, 0x3FF11A98,0x737912E1,
+	0x3FF19999,0x9999999A, 0x3FE99999,0x9999999A, 0x3FF14487,0x09DE8D69,
+	0x3FF19999,0x9999999A, 0x3FECCCCC,0xCCCCCCCD, 0x3FF16EDC,0x6D3C743C,
+	0x3FF19999,0x9999999A, 0x3FF00000,0x00000000, 0x3FF19999,0x9999999A,
+	0x3FF19999,0x9999999A, 0x3FF19999,0x9999999A, 0x3FF1C4BF,0x8D66AE6C,
+	0x3FF19999,0x9999999A, 0x3FF33333,0x33333333, 0x3FF1F04F,0x49842D11,
+	0x3FF19999,0x9999999A, 0x3FF4CCCC,0xCCCCCCCD, 0x3FF21C49,0xD14852A0,
+	0x3FF19999,0x9999999A, 0x3FF66666,0x66666666, 0x3FF248B0,0x2A8526DA,
+	0x3FF19999,0x9999999A, 0x3FF80000,0x00000000, 0x3FF27583,0x5D8E92DC,
+	0x3FF19999,0x9999999A, 0x3FF99999,0x9999999A, 0x3FF2A2C4,0x754086C2,
+	0x3FF19999,0x9999999A, 0x3FFB3333,0x33333333, 0x3FF2D074,0x7F052E5F,
+	0x3FF19999,0x9999999A, 0x3FFCCCCC,0xCCCCCCCD, 0x3FF2FE94,0x8ADB3527,
+	0x3FF19999,0x9999999A, 0x3FFE6666,0x66666666, 0x3FF32D25,0xAB5C1976,
+	0x3FF19999,0x9999999A, 0x40000000,0x00000000, 0x3FF35C28,0xF5C28F5D,
+	0x3FF33333,0x33333333, 0x3FB99999,0x9999999A, 0x3FF04B5D,0x24ED17A4,
+	0x3FF33333,0x33333333, 0x3FC99999,0x9999999A, 0x3FF0981D,0x45329B9F,
+	0x3FF33333,0x33333333, 0x3FD33333,0x33333333, 0x3FF0E646,0xE8DD42A0,
+	0x3FF33333,0x33333333, 0x3FD99999,0x9999999A, 0x3FF135E0,0xB6BD84CD,
+	0x3FF33333,0x33333333, 0x3FE00000,0x00000000, 0x3FF186F1,0x74F88472,
+	0x3FF33333,0x33333333, 0x3FE33333,0x33333333, 0x3FF1D980,0x099BA149,
+	0x3FF33333,0x33333333, 0x3FE66666,0x66666666, 0x3FF22D93,0x7B32C2D3,
+	0x3FF33333,0x33333333, 0x3FE99999,0x9999999A, 0x3FF28332,0xF16166A5,
+	0x3FF33333,0x33333333, 0x3FECCCCC,0xCCCCCCCD, 0x3FF2DA65,0xB57E7F98,
+	0x3FF33333,0x33333333, 0x3FF00000,0x00000000, 0x3FF33333,0x33333333,
+	0x3FF33333,0x33333333, 0x3FF19999,0x9999999A, 0x3FF38DA2,0xF91C82C4,
+	0x3FF33333,0x33333333, 0x3FF33333,0x33333333, 0x3FF3E9BC,0xB96FEDF1,
+	0x3FF33333,0x33333333, 0x3FF4CCCC,0xCCCCCCCD, 0x3FF44788,0x4AA31CC0,
+	0x3FF33333,0x33333333, 0x3FF66666,0x66666666, 0x3FF4A70D,0xA8169F5C,
+	0x3FF33333,0x33333333, 0x3FF80000,0x00000000, 0x3FF50854,0xF2C3D222,
+	0x3FF33333,0x33333333, 0x3FF99999,0x9999999A, 0x3FF56B66,0x71EDF4BE,
+	0x3FF33333,0x33333333, 0x3FFB3333,0x33333333, 0x3FF5D04A,0x93D68363,
+	0x3FF33333,0x33333333, 0x3FFCCCCC,0xCCCCCCCD, 0x3FF63709,0xEE74E192,
+	0x3FF33333,0x33333333, 0x3FFE6666,0x66666666, 0x3FF69FAD,0x403165E9,
+	0x3FF33333,0x33333333, 0x40000000,0x00000000, 0x3FF70A3D,0x70A3D70A,
+	0x3FF4CCCC,0xCCCCCCCD, 0x3FB99999,0x9999999A, 0x3FF06CE2,0xF530F836,
+	0x3FF4CCCC,0xCCCCCCCD, 0x3FC99999,0x9999999A, 0x3FF0DCAA,0xEEE362D8,
+	0x3FF4CCCC,0xCCCCCCCD, 0x3FD33333,0x33333333, 0x3FF14F6B,0xA004E4FF,
+	0x3FF4CCCC,0xCCCCCCCD, 0x3FD99999,0x9999999A, 0x3FF1C539,0x4192551C,
+	0x3FF4CCCC,0xCCCCCCCD, 0x3FE00000,0x00000000, 0x3FF23E28,0x96280F23,
+	0x3FF4CCCC,0xCCCCCCCD, 0x3FE33333,0x33333333, 0x3FF2BA4E,0xEDAA8975,
+	0x3FF4CCCC,0xCCCCCCCD, 0x3FE66666,0x66666666, 0x3FF339C2,0x2907CFA9,
+	0x3FF4CCCC,0xCCCCCCCD, 0x3FE99999,0x9999999A, 0x3FF3BC98,0xBE128C8C,
+	0x3FF4CCCC,0xCCCCCCCD, 0x3FECCCCC,0xCCCCCCCD, 0x3FF442E9,0xBB77515D,
+	0x3FF4CCCC,0xCCCCCCCD, 0x3FF00000,0x00000000, 0x3FF4CCCC,0xCCCCCCCD,
+	0x3FF4CCCC,0xCCCCCCCD, 0x3FF19999,0x9999999A, 0x3FF55A5A,0x3EBFA913,
+	0x3FF4CCCC,0xCCCCCCCD, 0x3FF33333,0x33333333, 0x3FF5EBAB,0x035ACD4C,
+	0x3FF4CCCC,0xCCCCCCCD, 0x3FF4CCCC,0xCCCCCCCD, 0x3FF680D8,0xB66CC34C,
+	0x3FF4CCCC,0xCCCCCCCD, 0x3FF66666,0x66666666, 0x3FF719FD,0xA20B083F,
+	0x3FF4CCCC,0xCCCCCCCD, 0x3FF80000,0x00000000, 0x3FF7B734,0xC33413AD,
+	0x3FF4CCCC,0xCCCCCCCD, 0x3FF99999,0x9999999A, 0x3FF85899,0xCE90E5E5,
+	0x3FF4CCCC,0xCCCCCCCD, 0x3FFB3333,0x33333333, 0x3FF8FE49,0x3556F45B,
+	0x3FF4CCCC,0xCCCCCCCD, 0x3FFCCCCC,0xCCCCCCCD, 0x3FF9A860,0x2A4B5050,
+	0x3FF4CCCC,0xCCCCCCCD, 0x3FFE6666,0x66666666, 0x3FFA56FC,0xA6E7E9C6,
+	0x3FF4CCCC,0xCCCCCCCD, 0x40000000,0x00000000, 0x3FFB0A3D,0x70A3D70B,
+	0x3FF66666,0x66666666, 0x3FB99999,0x9999999A, 0x3FF08C29,0xF332A311,
+	0x3FF66666,0x66666666, 0x3FC99999,0x9999999A, 0x3FF11D1F,0xC4F3391C,
+	0x3FF66666,0x66666666, 0x3FD33333,0x33333333, 0x3FF1B30B,0x79B06DED,
+	0x3FF66666,0x66666666, 0x3FD99999,0x9999999A, 0x3FF24E18,0x85EDDFB2,
+	0x3FF66666,0x66666666, 0x3FE00000,0x00000000, 0x3FF2EE73,0xDADC9B57,
+	0x3FF66666,0x66666666, 0x3FE33333,0x33333333, 0x3FF3944B,0xF361F023,
+	0x3FF66666,0x66666666, 0x3FE66666,0x66666666, 0x3FF43FD0,0xE190613D,
+	0x3FF66666,0x66666666, 0x3FE99999,0x9999999A, 0x3FF4F134,0x5C969CC0,
+	0x3FF66666,0x66666666, 0x3FECCCCC,0xCCCCCCCD, 0x3FF5A8A9,0xCF288250,
+	0x3FF66666,0x66666666, 0x3FF00000,0x00000000, 0x3FF66666,0x66666666,
+	0x3FF66666,0x66666666, 0x3FF19999,0x9999999A, 0x3FF72AA1,0x2146E44B,
+	0x3FF66666,0x66666666, 0x3FF33333,0x33333333, 0x3FF7F592,0xE087B65A,
+	0x3FF66666,0x66666666, 0x3FF4CCCC,0xCCCCCCCD, 0x3FF8C776,0x772A337F,
+	0x3FF66666,0x66666666, 0x3FF66666,0x66666666, 0x3FF9A088,0xBB80392C,
+	0x3FF66666,0x66666666, 0x3FF80000,0x00000000, 0x3FFA8108,0x98CE7313,
+	0x3FF66666,0x66666666, 0x3FF99999,0x9999999A, 0x3FFB6937,0x21891CFE,
+	0x3FF66666,0x66666666, 0x3FFB3333,0x33333333, 0x3FFC5957,0xA2308822,
+	0x3FF66666,0x66666666, 0x3FFCCCCC,0xCCCCCCCD, 0x3FFD51AF,0xB4D2DB73,
+	0x3FF66666,0x66666666, 0x3FFE6666,0x66666666, 0x3FFE5287,0x5538B66E,
+	0x3FF66666,0x66666666, 0x40000000,0x00000000, 0x3FFF5C28,0xF5C28F5B,
+	0x3FF80000,0x00000000, 0x3FB99999,0x9999999A, 0x3FF0A97D,0xCE72A0CB,
+	0x3FF80000,0x00000000, 0x3FC99999,0x9999999A, 0x3FF159FF,0x126BAB41,
+	0x3FF80000,0x00000000, 0x3FD33333,0x33333333, 0x3FF211CE,0x179A0012,
+	0x3FF80000,0x00000000, 0x3FD99999,0x9999999A, 0x3FF2D138,0x3CB414F9,
+	0x3FF80000,0x00000000, 0x3FE00000,0x00000000, 0x3FF3988E,0x1409212E,
+	0x3FF80000,0x00000000, 0x3FE33333,0x33333333, 0x3FF46823,0x856B4748,
+	0x3FF80000,0x00000000, 0x3FE66666,0x66666666, 0x3FF5404F,0xF1810326,
+	0x3FF80000,0x00000000, 0x3FE99999,0x9999999A, 0x3FF6216E,0x568CB9A7,
+	0x3FF80000,0x00000000, 0x3FECCCCC,0xCCCCCCCD, 0x3FF70BDD,0x76B9E56F,
+	0x3FF80000,0x00000000, 0x3FF00000,0x00000000, 0x3FF80000,0x00000000,
+	0x3FF80000,0x00000000, 0x3FF19999,0x9999999A, 0x3FF8FE3C,0xB5ABF131,
+	0x3FF80000,0x00000000, 0x3FF33333,0x33333333, 0x3FFA06FE,0x9BA180E2,
+	0x3FF80000,0x00000000, 0x3FF4CCCC,0xCCCCCCCD, 0x3FFB1AB5,0x2367001B,
+	0x3FF80000,0x00000000, 0x3FF66666,0x66666666, 0x3FFC39D4,0x5B0E1F75,
+	0x3FF80000,0x00000000, 0x3FF80000,0x00000000, 0x3FFD64D5,0x1E0DB1C6,
+	0x3FF80000,0x00000000, 0x3FF99999,0x9999999A, 0x3FFE9C35,0x4820EAED,
+	0x3FF80000,0x00000000, 0x3FFB3333,0x33333333, 0x3FFFE077,0xEA4184BA,
+	0x3FF80000,0x00000000, 0x3FFCCCCC,0xCCCCCCCD, 0x40009912,0xC0E98B3D,
+	0x3FF80000,0x00000000, 0x3FFE6666,0x66666666, 0x400148E6,0x190B6C13,
+	0x3FF80000,0x00000000, 0x40000000,0x00000000, 0x40020000,0x00000000,
+	0x3FF99999,0x9999999A, 0x3FB99999,0x9999999A, 0x3FF0C51B,0xFB8F97C0,
+	0x3FF99999,0x9999999A, 0x3FC99999,0x9999999A, 0x3FF193B4,0x3862CFF2,
+	0x3FF99999,0x9999999A, 0x3FD33333,0x33333333, 0x3FF26C3D,0x90F409BD,
+	0x3FF99999,0x9999999A, 0x3FD99999,0x9999999A, 0x3FF34F32,0x7F4C0704,
+	0x3FF99999,0x9999999A, 0x3FE00000,0x00000000, 0x3FF43D13,0x6248490F,
+	0x3FF99999,0x9999999A, 0x3FE33333,0x33333333, 0x3FF53666,0xC636DAD3,
+	0x3FF99999,0x9999999A, 0x3FE66666,0x66666666, 0x3FF63BB9,0xB0F09863,
+	0x3FF99999,0x9999999A, 0x3FE99999,0x9999999A, 0x3FF74D9F,0xF19CFF00,
+	0x3FF99999,0x9999999A, 0x3FECCCCC,0xCCCCCCCD, 0x3FF86CB4,0x744CA3A5,
+	0x3FF99999,0x9999999A, 0x3FF00000,0x00000000, 0x3FF99999,0x9999999A,
+	0x3FF99999,0x9999999A, 0x3FF19999,0x9999999A, 0x3FFAD4F9,0x927F5935,
+	0x3FF99999,0x9999999A, 0x3FF33333,0x33333333, 0x3FFC1F86,0xC09E1983,
+	0x3FF99999,0x9999999A, 0x3FF4CCCC,0xCCCCCCCD, 0x3FFD79FC,0x1B200F96,
+	0x3FF99999,0x9999999A, 0x3FF66666,0x66666666, 0x3FFEE51D,0x9879A4D4,
+	0x3FF99999,0x9999999A, 0x3FF80000,0x00000000, 0x400030DC,0x4EA03A73,
+	0x3FF99999,0x9999999A, 0x3FF99999,0x9999999A, 0x4000F852,0x382BE243,
+	0x3FF99999,0x9999999A, 0x3FFB3333,0x33333333, 0x4001C961,0x5A5A1382,
+	0x3FF99999,0x9999999A, 0x3FFCCCCC,0xCCCCCCCD, 0x4002A47F,0xF47D98CD,
+	0x3FF99999,0x9999999A, 0x3FFE6666,0x66666666, 0x40038A29,0xF6A3B61E,
+	0x3FF99999,0x9999999A, 0x40000000,0x00000000, 0x40047AE1,0x47AE147C,
+	0x3FFB3333,0x33333333, 0x3FB99999,0x9999999A, 0x3FF0DF37,0x1594856C,
+	0x3FFB3333,0x33333333, 0x3FC99999,0x9999999A, 0x3FF1CA98,0x3B603B59,
+	0x3FFB3333,0x33333333, 0x3FD33333,0x33333333, 0x3FF2C2CD,0x258622DA,
+	0x3FFB3333,0x33333333, 0x3FD99999,0x9999999A, 0x3FF3C888,0xC7B024F9,
+	0x3FFB3333,0x33333333, 0x3FE00000,0x00000000, 0x3FF4DC87,0xD61451DA,
+	0x3FFB3333,0x33333333, 0x3FE33333,0x33333333, 0x3FF5FF91,0x4D82151C,
+	0x3FFB3333,0x33333333, 0x3FE66666,0x66666666, 0x3FF73277,0x02D976B8,
+	0x3FFB3333,0x33333333, 0x3FE99999,0x9999999A, 0x3FF87616,0x3A53D7DB,
+	0x3FFB3333,0x33333333, 0x3FECCCCC,0xCCCCCCCD, 0x3FF9CB58,0x470B3E61,
+	0x3FFB3333,0x33333333, 0x3FF00000,0x00000000, 0x3FFB3333,0x33333333,
+	0x3FFB3333,0x33333333, 0x3FF19999,0x9999999A, 0x3FFCAEAA,0x717C7C6B,
+	0x3FFB3333,0x33333333, 0x3FF33333,0x33333333, 0x3FFE3ECF,0x98239818,
+	0x3FFB3333,0x33333333, 0x3FF4CCCC,0xCCCCCCCD, 0x3FFFE4C3,0x2630D4D8,
+	0x3FFB3333,0x33333333, 0x3FF66666,0x66666666, 0x4000D0DA,0xA9BC1F6D,
+	0x3FFB3333,0x33333333, 0x3FF80000,0x00000000, 0x4001BB73,0x75F7ABF9,
+	0x3FFB3333,0x33333333, 0x3FF99999,0x9999999A, 0x4002B2D5,0x1B7B5EBE,
+	0x3FFB3333,0x33333333, 0x3FFB3333,0x33333333, 0x4003B7B1,0xF59F3E83,
+	0x3FFB3333,0x33333333, 0x3FFCCCCC,0xCCCCCCCD, 0x4004CAC6,0x17FA777A,
+	0x3FFB3333,0x33333333, 0x3FFE6666,0x66666666, 0x4005ECD7,0xD5FCC1D2,
+	0x3FFB3333,0x33333333, 0x40000000,0x00000000, 0x40071EB8,0x51EB851E,
+	0x3FFCCCCC,0xCCCCCCCD, 0x3FB99999,0x9999999A, 0x3FF0F7F9,0x4BC9DC5D,
+	0x3FFCCCCC,0xCCCCCCCD, 0x3FC99999,0x9999999A, 0x3FF1FEF5,0xC7C3F980,
+	0x3FFCCCCC,0xCCCCCCCD, 0x3FD33333,0x33333333, 0x3FF315DE,0x1F0EFA98,
+	0x3FFCCCCC,0xCCCCCCCD, 0x3FD99999,0x9999999A, 0x3FF43DA9,0x12C67FF1,
+	0x3FFCCCCC,0xCCCCCCCD, 0x3FE00000,0x00000000, 0x3FF5775C,0x544FF263,
+	0x3FFCCCCC,0xCCCCCCCD, 0x3FE33333,0x33333333, 0x3FF6C40D,0x6CE0B896,
+	0x3FFCCCCC,0xCCCCCCCD, 0x3FE66666,0x66666666, 0x3FF824E2,0xB308AB84,
+	0x3FFCCCCC,0xCCCCCCCD, 0x3FE99999,0x9999999A, 0x3FF99B14,0x4F1A0622,
+	0x3FFCCCCC,0xCCCCCCCD, 0x3FECCCCC,0xCCCCCCCD, 0x3FFB27ED,0x4F5532F1,
+	0x3FFCCCCC,0xCCCCCCCD, 0x3FF00000,0x00000000, 0x3FFCCCCC,0xCCCCCCCD,
+	0x3FFCCCCC,0xCCCCCCCD, 0x3FF19999,0x9999999A, 0x3FFE8B27,0x2204F30F,
+	0x3FFCCCCC,0xCCCCCCCD, 0x3FF33333,0x33333333, 0x40003243,0x9A30608D,
+	0x3FFCCCCC,0xCCCCCCCD, 0x3FF4CCCC,0xCCCCCCCD, 0x40012D47,0xE8C0AE56,
+	0x3FFCCCCC,0xCCCCCCCD, 0x3FF66666,0x66666666, 0x4002377E,0x90E5D98C,
+	0x3FFCCCCC,0xCCCCCCCD, 0x3FF80000,0x00000000, 0x400351D3,0x18AE5A26,
+	0x3FFCCCCC,0xCCCCCCCD, 0x3FF99999,0x9999999A, 0x40047D3F,0x4863D954,
+	0x3FFCCCCC,0xCCCCCCCD, 0x3FFB3333,0x33333333, 0x4005BACC,0x0787CD91,
+	0x3FFCCCCC,0xCCCCCCCD, 0x3FFCCCCC,0xCCCCCCCD, 0x40070B92,0x47310585,
+	0x3FFCCCCC,0xCCCCCCCD, 0x3FFE6666,0x66666666, 0x400870BB,0xFA997AA5,
+	0x3FFCCCCC,0xCCCCCCCD, 0x40000000,0x00000000, 0x4009EB85,0x1EB851EC,
+	0x3FFE6666,0x66666666, 0x3FB99999,0x9999999A, 0x3FF10F86,0x2A137171,
+	0x3FFE6666,0x66666666, 0x3FC99999,0x9999999A, 0x3FF2310C,0x295D36BA,
+	0x3FFE6666,0x66666666, 0x3FD33333,0x33333333, 0x3FF365C3,0x71F6871C,
+	0x3FFE6666,0x66666666, 0x3FD99999,0x9999999A, 0x3FF4AEF1,0xB7985489,
+	0x3FFE6666,0x66666666, 0x3FE00000,0x00000000, 0x3FF60DF2,0x453AB723,
+	0x3FFE6666,0x66666666, 0x3FE33333,0x33333333, 0x3FF78437,0x6B7BB651,
+	0x3FFE6666,0x66666666, 0x3FE66666,0x66666666, 0x3FF9134C,0x074FFF15,
+	0x3FFE6666,0x66666666, 0x3FE99999,0x9999999A, 0x3FFABCD5,0x2299B78C,
+	0x3FFE6666,0x66666666, 0x3FECCCCC,0xCCCCCCCD, 0x3FFC8293,0xB05CF233,
+	0x3FFE6666,0x66666666, 0x3FF00000,0x00000000, 0x3FFE6666,0x66666666,
+	0x3FFE6666,0x66666666, 0x3FF19999,0x9999999A, 0x40003525,0xDB2C122C,
+	0x3FFE6666,0x66666666, 0x3FF33333,0x33333333, 0x40014831,0xF4188D97,
+	0x3FFE6666,0x66666666, 0x3FF4CCCC,0xCCCCCCCD, 0x40026D79,0xAC43CD27,
+	0x3FFE6666,0x66666666, 0x3FF66666,0x66666666, 0x4003A632,0x6E6A504E,
+	0x3FFE6666,0x66666666, 0x3FF80000,0x00000000, 0x4004F3A6,0x282AFAC8,
+	0x3FFE6666,0x66666666, 0x3FF99999,0x9999999A, 0x40065734,0xA61BED33,
+	0x3FFE6666,0x66666666, 0x3FFB3333,0x33333333, 0x4007D255,0x06F26587,
+	0x3FFE6666,0x66666666, 0x3FFCCCCC,0xCCCCCCCD, 0x40096697,0x47453B2B,
+	0x3FFE6666,0x66666666, 0x3FFE6666,0x66666666, 0x400B15A5,0xE78B7FAF,
+	0x3FFE6666,0x66666666, 0x40000000,0x00000000, 0x400CE147,0xAE147AE1,
+	0x40000000,0x00000000, 0x3FB99999,0x9999999A, 0x3FF125FB,0xEE250664,
+	0x40000000,0x00000000, 0x3FC99999,0x9999999A, 0x3FF26111,0x86BAE675,
+	0x40000000,0x00000000, 0x3FD33333,0x33333333, 0x3FF3B2C4,0x7BFF8329,
+	0x40000000,0x00000000, 0x3FD99999,0x9999999A, 0x3FF51CB4,0x53B9536C,
+	0x40000000,0x00000000, 0x3FE00000,0x00000000, 0x3FF6A09E,0x667F3BCD,
+	0x40000000,0x00000000, 0x3FE33333,0x33333333, 0x3FF84060,0x03B2AE5C,
+	0x40000000,0x00000000, 0x3FE66666,0x66666666, 0x3FF9FDF8,0xBCCE533D,
+	0x40000000,0x00000000, 0x3FE99999,0x9999999A, 0x3FFBDB8C,0xDADBE120,
+	0x40000000,0x00000000, 0x3FECCCCC,0xCCCCCCCD, 0x3FFDDB68,0x0117AB12,
+	0x40000000,0x00000000, 0x3FF00000,0x00000000, 0x40000000,0x00000000,
+	0x40000000,0x00000000, 0x3FF19999,0x9999999A, 0x400125FB,0xEE250664,
+	0x40000000,0x00000000, 0x3FF33333,0x33333333, 0x40026111,0x86BAE674,
+	0x40000000,0x00000000, 0x3FF4CCCC,0xCCCCCCCD, 0x4003B2C4,0x7BFF8329,
+	0x40000000,0x00000000, 0x3FF66666,0x66666666, 0x40051CB4,0x53B9536C,
+	0x40000000,0x00000000, 0x3FF80000,0x00000000, 0x4006A09E,0x667F3BCD,
+	0x40000000,0x00000000, 0x3FF99999,0x9999999A, 0x40084060,0x03B2AE5D,
+	0x40000000,0x00000000, 0x3FFB3333,0x33333333, 0x4009FDF8,0xBCCE533D,
+	0x40000000,0x00000000, 0x3FFCCCCC,0xCCCCCCCD, 0x400BDB8C,0xDADBE120,
+	0x40000000,0x00000000, 0x3FFE6666,0x66666666, 0x400DDB68,0x0117AB12,
+	0x40000000,0x00000000, 0x40000000,0x00000000, 0x40100000,0x00000000,
+	0x4000CCCC,0xCCCCCCCD, 0x3FB99999,0x9999999A, 0x3FF13B74,0x8AD64EF9,
+	0x4000CCCC,0xCCCCCCCD, 0x3FC99999,0x9999999A, 0x3FF28F34,0x95D8362F,
+	0x4000CCCC,0xCCCCCCCD, 0x3FD33333,0x33333333, 0x3FF3FD1F,0x206741C0,
+	0x4000CCCC,0xCCCCCCCD, 0x3FD99999,0x9999999A, 0x3FF58738,0x0DC9C62C,
+	0x4000CCCC,0xCCCCCCCD, 0x3FE00000,0x00000000, 0x3FF72FAA,0xFC7E3CD7,
+	0x4000CCCC,0xCCCCCCCD, 0x3FE33333,0x33333333, 0x3FF8F8CE,0x55928B79,
+	0x4000CCCC,0xCCCCCCCD, 0x3FE66666,0x66666666, 0x3FFAE526,0x984F9BA5,
+	0x4000CCCC,0xCCCCCCCD, 0x3FE99999,0x9999999A, 0x3FFCF769,0xE6DEB5B4,
+	0x4000CCCC,0xCCCCCCCD, 0x3FECCCCC,0xCCCCCCCD, 0x3FFF3283,0xD8E9ADA4,
+	0x4000CCCC,0xCCCCCCCD, 0x3FF00000,0x00000000, 0x4000CCCC,0xCCCCCCCD,
+	0x4000CCCC,0xCCCCCCCD, 0x3FF19999,0x9999999A, 0x40021807,0x2B61061F,
+	0x4000CCCC,0xCCCCCCCD, 0x3FF33333,0x33333333, 0x40037CC4,0x03BC9F4B,
+	0x4000CCCC,0xCCCCCCCD, 0x3FF4CCCC,0xCCCCCCCD, 0x4004FCFA,0x486C6B71,
+	0x4000CCCC,0xCCCCCCCD, 0x3FF66666,0x66666666, 0x40069AC7,0xA813DCE1,
+	0x4000CCCC,0xCCCCCCCD, 0x3FF80000,0x00000000, 0x40085873,0x891E2648,
+	0x4000CCCC,0xCCCCCCCD, 0x3FF99999,0x9999999A, 0x400A3872,0x404045A7,
+	0x4000CCCC,0xCCCCCCCD, 0x3FFB3333,0x33333333, 0x400C3D68,0x865396A0,
+	0x4000CCCC,0xCCCCCCCD, 0x3FFCCCCC,0xCCCCCCCD, 0x400E6A2F,0x3269D863,
+	0x4000CCCC,0xCCCCCCCD, 0x3FFE6666,0x66666666, 0x401060EB,0x9EADE18F,
+	0x4000CCCC,0xCCCCCCCD, 0x40000000,0x00000000, 0x4011A3D7,0x0A3D70A4,
+	0x40019999,0x9999999A, 0x3FB99999,0x9999999A, 0x3FF15006,0x70251A91,
+	0x40019999,0x9999999A, 0x3FC99999,0x9999999A, 0x3FF2BB9D,0xEEB2E2AB,
+	0x40019999,0x9999999A, 0x3FD33333,0x33333333, 0x3FF44509,0x6CEF8B45,
+	0x40019999,0x9999999A, 0x3FD99999,0x9999999A, 0x3FF5EEBB,0x5AD4FDD3,
+	0x40019999,0x9999999A, 0x3FE00000,0x00000000, 0x3FF7BB59,0x8C88B4AD,
+	0x40019999,0x9999999A, 0x3FE33333,0x33333333, 0x3FF9ADC1,0x71A7FBB0,
+	0x40019999,0x9999999A, 0x3FE66666,0x66666666, 0x3FFBC90C,0xA51F2482,
+	0x40019999,0x9999999A, 0x3FE99999,0x9999999A, 0x3FFE1095,0xDCCF3801,
+	0x40019999,0x9999999A, 0x3FECCCCC,0xCCCCCCCD, 0x400043FF,0x206F1DDB,
+	0x40019999,0x9999999A, 0x3FF00000,0x00000000, 0x40019999,0x9999999A,
+	0x40019999,0x9999999A, 0x3FF19999,0x9999999A, 0x40030B3A,0x4828D06D,
+	0x40019999,0x9999999A, 0x3FF33333,0x33333333, 0x40049B2D,0xB9C4C623,
+	0x40019999,0x9999999A, 0x3FF4CCCC,0xCCCCCCCD, 0x40064BF0,0xC4A11933,
+	0x40019999,0x9999999A, 0x3FF66666,0x66666666, 0x40082034,0x7D83E402,
+	0x40019999,0x9999999A, 0x3FF80000,0x00000000, 0x400A1AE2,0x80FCC6BF,
+	0x40019999,0x9999999A, 0x3FF99999,0x9999999A, 0x400C3F21,0x969F2E77,
+	0x40019999,0x9999999A, 0x3FFB3333,0x33333333, 0x400E905A,0xB5A241C3,
+	0x40019999,0x9999999A, 0x3FFCCCCC,0xCCCCCCCD, 0x4010891F,0x3971F867,
+	0x40019999,0x9999999A, 0x3FFE6666,0x66666666, 0x4011E465,0x707A3A71,
+	0x40019999,0x9999999A, 0x40000000,0x00000000, 0x40135C28,0xF5C28F5D,
+	0x40026666,0x66666666, 0x3FB99999,0x9999999A, 0x3FF163C5,0x27826636,
+	0x40026666,0x66666666, 0x3FC99999,0x9999999A, 0x3FF2E671,0x153B6431,
+	0x40026666,0x66666666, 0x3FD33333,0x33333333, 0x3FF48AB2,0xE63E8C13,
+	0x40026666,0x66666666, 0x3FD99999,0x9999999A, 0x3FF65375,0x660748F3,
+	0x40026666,0x66666666, 0x3FE00000,0x00000000, 0x3FF843E4,0x3D85E5B1,
+	0x40026666,0x66666666, 0x3FE33333,0x33333333, 0x3FFA5F71,0x95706502,
+	0x40026666,0x66666666, 0x3FE66666,0x66666666, 0x3FFCA9DC,0x35DA278C,
+	0x40026666,0x66666666, 0x3FE99999,0x9999999A, 0x3FFF2736,0x2DF3FAE5,
+	0x40026666,0x66666666, 0x3FECCCCC,0xCCCCCCCD, 0x4000EDF6,0x07E40FD6,
+	0x40026666,0x66666666, 0x3FF00000,0x00000000, 0x40026666,0x66666666,
+	0x40026666,0x66666666, 0x3FF19999,0x9999999A, 0x4003FF89,0x20A2C258,
+	0x40026666,0x66666666, 0x3FF33333,0x33333333, 0x4005BC35,0x3ED1199E,
+	0x40026666,0x66666666, 0x3FF4CCCC,0xCCCCCCCD, 0x40079F80,0xEF2E5449,
+	0x40026666,0x66666666, 0x3FF66666,0x66666666, 0x4009ACC7,0x0221FA49,
+	0x40026666,0x66666666, 0x3FF80000,0x00000000, 0x400BE7AC,0xE059FB58,
+	0x40026666,0x66666666, 0x3FF99999,0x9999999A, 0x400E5429,0x05747429,
+	0x40026666,0x66666666, 0x3FFB3333,0x33333333, 0x40107B45,0x055D7057,
+	0x40026666,0x66666666, 0x3FFCCCCC,0xCCCCCCCD, 0x4011E9BF,0x273916AA,
+	0x40026666,0x66666666, 0x3FFE6666,0x66666666, 0x4013780E,0x22ACABCF,
+	0x40026666,0x66666666, 0x40000000,0x00000000, 0x401528F5,0xC28F5C28,
+	0x40033333,0x33333333, 0x3FB99999,0x9999999A, 0x3FF176C1,0xCF6D3EFB,
+	0x40033333,0x33333333, 0x3FC99999,0x9999999A, 0x3FF30FCD,0x4CA757E3,
+	0x40033333,0x33333333, 0x3FD33333,0x33333333, 0x3FF4CE45,0x914222EB,
+	0x40033333,0x33333333, 0x3FD99999,0x9999999A, 0x3FF6B597,0x31476830,
+	0x40033333,0x33333333, 0x3FE00000,0x00000000, 0x3FF8C97E,0xF43F7248,
+	0x40033333,0x33333333, 0x3FE33333,0x33333333, 0x3FFB0E11,0x2BB0384F,
+	0x40033333,0x33333333, 0x3FE66666,0x66666666, 0x3FFD87C1,0xB57B46E9,
+	0x40033333,0x33333333, 0x3FE99999,0x9999999A, 0x40001DB6,0x5CEA006A,
+	0x40033333,0x33333333, 0x3FECCCCC,0xCCCCCCCD, 0x40019730,0x1AFC1026,
+	0x40033333,0x33333333, 0x3FF00000,0x00000000, 0x40033333,0x33333333,
+	0x40033333,0x33333333, 0x3FF19999,0x9999999A, 0x4004F4E8,0x92831861,
+	0x40033333,0x33333333, 0x3FF33333,0x33333333, 0x4006DFC3,0x28C8CFDD,
+	0x40033333,0x33333333, 0x3FF4CCCC,0xCCCCCCCD, 0x4008F786,0xAE4F5D1A,
+	0x40033333,0x33333333, 0x3FF66666,0x66666666, 0x400B404F,0x07EF49D2,
+	0x40033333,0x33333333, 0x3FF80000,0x00000000, 0x400DBE98,0x584C22BC,
+	0x40033333,0x33333333, 0x3FF99999,0x9999999A, 0x40103BA3,0xE70354FC,
+	0x40033333,0x33333333, 0x3FFB3333,0x33333333, 0x4011B7DA,0xA016C425,
+	0x40033333,0x33333333, 0x3FFCCCCC,0xCCCCCCCD, 0x401356DA,0xD5E59A18,
+	0x40033333,0x33333333, 0x3FFE6666,0x66666666, 0x40151BD3,0x5394E02D,
+	0x40033333,0x33333333, 0x40000000,0x00000000, 0x40170A3D,0x70A3D70A,
+	0x40040000,0x00000000, 0x3FB99999,0x9999999A, 0x3FF1890B,0x7E41B4EE,
+	0x40040000,0x00000000, 0x3FC99999,0x9999999A, 0x3FF337CE,0x41260734,
+	0x40040000,0x00000000, 0x3FD33333,0x33333333, 0x3FF50FE6,0xC94A6E58,
+	0x40040000,0x00000000, 0x3FD99999,0x9999999A, 0x3FF7154C,0x7F1D0529,
+	0x40040000,0x00000000, 0x3FE00000,0x00000000, 0x3FF94C58,0x3ADA5B53,
+	0x40040000,0x00000000, 0x3FE33333,0x33333333, 0x3FFBB9CD,0x9E1DB235,
+	0x40040000,0x00000000, 0x3FE66666,0x66666666, 0x3FFE62E5,0x531FD7EB,
+	0x40040000,0x00000000, 0x3FE99999,0x9999999A, 0x4000A6AC,0x23D76B44,
+	0x40040000,0x00000000, 0x3FECCCCC,0xCCCCCCCD, 0x40023FB5,0xFE030C24,
+	0x40040000,0x00000000, 0x3FF00000,0x00000000, 0x40040000,0x00000000,
+	0x40040000,0x00000000, 0x3FF19999,0x9999999A, 0x4005EB4E,0x5DD2222A,
+	0x40040000,0x00000000, 0x3FF33333,0x33333333, 0x400805C1,0xD16F8900,
+	0x40040000,0x00000000, 0x3FF4CCCC,0xCCCCCCCD, 0x400A53E0,0x7B9D09EE,
+	0x40040000,0x00000000, 0x3FF66666,0x66666666, 0x400CDA9F,0x9EE44672,
+	0x40040000,0x00000000, 0x3FF80000,0x00000000, 0x400F9F6E,0x4990F227,
+	0x40040000,0x00000000, 0x3FF99999,0x9999999A, 0x40115420,0x82D28F62,
+	0x40040000,0x00000000, 0x3FFB3333,0x33333333, 0x4012FDCF,0x53F3E6F3,
+	0x40040000,0x00000000, 0x3FFCCCCC,0xCCCCCCCD, 0x4014D057,0x2CCD4615,
+	0x40040000,0x00000000, 0x3FFE6666,0x66666666, 0x4016CFA3,0x7D83CF2C,
+	0x40040000,0x00000000, 0x40000000,0x00000000, 0x40190000,0x00000000,
+	0x4004CCCC,0xCCCCCCCD, 0x3FB99999,0x9999999A, 0x3FF19AAF,0x91FD21C3,
+	0x4004CCCC,0xCCCCCCCD, 0x3FC99999,0x9999999A, 0x3FF35E8C,0x917ABF3E,
+	0x4004CCCC,0xCCCCCCCD, 0x3FD33333,0x33333333, 0x3FF54FB7,0xEE6769A6,
+	0x4004CCCC,0xCCCCCCCD, 0x3FD99999,0x9999999A, 0x3FF772BC,0x9203DF8A,
+	0x4004CCCC,0xCCCCCCCD, 0x3FE00000,0x00000000, 0x3FF9CC99,0xFF02C481,
+	0x4004CCCC,0xCCCCCCCD, 0x3FE33333,0x33333333, 0x3FFC62D0,0x02641DE5,
+	0x4004CCCC,0xCCCCCCCD, 0x3FE66666,0x66666666, 0x3FFF3B6B,0x906510FF,
+	0x4004CCCC,0xCCCCCCCD, 0x3FE99999,0x9999999A, 0x40012E8A,0x75CD2337,
+	0x4004CCCC,0xCCCCCCCD, 0x3FECCCCC,0xCCCCCCCD, 0x4002E78F,0x9BA7CF4C,
+	0x4004CCCC,0xCCCCCCCD, 0x3FF00000,0x00000000, 0x4004CCCC,0xCCCCCCCD,
+	0x4004CCCC,0xCCCCCCCD, 0x3FF19999,0x9999999A, 0x4006E2B1,0x0A95DF18,
+	0x4004CCCC,0xCCCCCCCD, 0x3FF33333,0x33333333, 0x40092E1D,0x2385F89E,
+	0x4004CCCC,0xCCCCCCCD, 0x3FF4CCCC,0xCCCCCCCD, 0x400BB46F,0x1C533C8C,
+	0x4004CCCC,0xCCCCCCCD, 0x3FF66666,0x66666666, 0x400E7B8E,0xBDD1D5CD,
+	0x4004CCCC,0xCCCCCCCD, 0x3FF80000,0x00000000, 0x4010C4FD,0xB28E9954,
+	0x4004CCCC,0xCCCCCCCD, 0x3FF99999,0x9999999A, 0x4012736D,0x9B2779D6,
+	0x4004CCCC,0xCCCCCCCD, 0x3FFB3333,0x33333333, 0x40144D05,0xEAA817D9,
+	0x4004CCCC,0xCCCCCCCD, 0x3FFCCCCC,0xCCCCCCCD, 0x4016561A,0x65F1142E,
+	0x4004CCCC,0xCCCCCCCD, 0x3FFE6666,0x66666666, 0x4018936D,0xE3F3C0AF,
+	0x4004CCCC,0xCCCCCCCD, 0x40000000,0x00000000, 0x401B0A3D,0x70A3D70B,
+	0x40059999,0x9999999A, 0x3FB99999,0x9999999A, 0x3FF1ABB9,0xF1383BA5,
+	0x40059999,0x9999999A, 0x3FC99999,0x9999999A, 0x3FF3841E,0x3F8C7922,
+	0x40059999,0x9999999A, 0x3FD33333,0x33333333, 0x3FF58DD6,0xF4A4CB92,
+	0x40059999,0x9999999A, 0x3FD99999,0x9999999A, 0x3FF7CE0A,0xCA3F5CCA,
+	0x40059999,0x9999999A, 0x3FE00000,0x00000000, 0x3FFA4A6A,0x2F74C6AC,
+	0x40059999,0x9999999A, 0x3FE33333,0x33333333, 0x3FFD093D,0xAA104DB7,
+	0x40059999,0x9999999A, 0x3FE66666,0x66666666, 0x400008BA,0xDC2A8E4A,
+	0x40059999,0x9999999A, 0x3FE99999,0x9999999A, 0x4001B55E,0x2DAAA893,
+	0x40059999,0x9999999A, 0x3FECCCCC,0xCCCCCCCD, 0x40038EC4,0x3B186A68,
+	0x40059999,0x9999999A, 0x3FF00000,0x00000000, 0x40059999,0x9999999A,
+	0x40059999,0x9999999A, 0x3FF19999,0x9999999A, 0x4007DB07,0xD2725086,
+	0x40059999,0x9999999A, 0x3FF33333,0x33333333, 0x400A58C2,0x6F6409EE,
+	0x40059999,0x9999999A, 0x3FF4CCCC,0xCCCCCCCD, 0x400D1915,0x63DE7939,
+	0x40059999,0x9999999A, 0x3FF66666,0x66666666, 0x4010117A,0x7BB791D5,
+	0x40059999,0x9999999A, 0x3FF80000,0x00000000, 0x4011BF07,0xACD5394E,
+	0x40059999,0x9999999A, 0x3FF99999,0x9999999A, 0x40139970,0x05FE3476,
+	0x40059999,0x9999999A, 0x3FFB3333,0x33333333, 0x4015A562,0xA939734B,
+	0x40059999,0x9999999A, 0x3FFCCCCC,0xCCCCCCCD, 0x4017E80B,0xF0D996C7,
+	0x40059999,0x9999999A, 0x3FFE6666,0x66666666, 0x401A6722,0x82FA8FA5,
+	0x40059999,0x9999999A, 0x40000000,0x00000000, 0x401D28F5,0xC28F5C2A,
+	0x40066666,0x66666666, 0x3FB99999,0x9999999A, 0x3FF1BC35,0x40858445,
+	0x40066666,0x66666666, 0x3FC99999,0x9999999A, 0x3FF3A897,0x0D39372F,
+	0x40066666,0x66666666, 0x3FD33333,0x33333333, 0x3FF5CA5E,0xDAA2EED7,
+	0x40066666,0x66666666, 0x3FD99999,0x9999999A, 0x3FF82757,0x290F9E39,
+	0x40066666,0x66666666, 0x3FE00000,0x00000000, 0x3FFAC5EB,0x3F7AB2F8,
+	0x40066666,0x66666666, 0x3FE33333,0x33333333, 0x3FFDAD38,0x9B2E99A9,
+	0x40066666,0x66666666, 0x3FE66666,0x66666666, 0x40007291,0x21BC7841,
+	0x40066666,0x66666666, 0x3FE99999,0x9999999A, 0x40023B33,0x1AF8EAE0,
+	0x40066666,0x66666666, 0x3FECCCCC,0xCCCCCCCD, 0x4004355A,0x92C39EEA,
+	0x40066666,0x66666666, 0x3FF00000,0x00000000, 0x40066666,0x66666666,
+	0x40066666,0x66666666, 0x3FF19999,0x9999999A, 0x4008D44A,0x8D87B92D,
+	0x40066666,0x66666666, 0x3FF33333,0x33333333, 0x400B85A0,0x45B68074,
+	0x40066666,0x66666666, 0x3FF4CCCC,0xCCCCCCCD, 0x400E81B7,0xFEE41B2D,
+	0x40066666,0x66666666, 0x3FF66666,0x66666666, 0x4010E856,0x9CBE21F4,
+	0x40066666,0x66666666, 0x3FF80000,0x00000000, 0x4012BDBE,0x460916E0,
+	0x40066666,0x66666666, 0x3FF99999,0x9999999A, 0x4014C60E,0x063A385D,
+	0x40066666,0x66666666, 0x3FFB3333,0x33333333, 0x401706CB,0x2F3B0EC2,
+	0x40066666,0x66666666, 0x3FFCCCCC,0xCCCCCCCD, 0x40198614,0x58F615A0,
+	0x40066666,0x66666666, 0x3FFE6666,0x66666666, 0x401C4AB2,0x00AB7812,
+	0x40066666,0x66666666, 0x40000000,0x00000000, 0x401F5C28,0xF5C28F5B,
+	0x40073333,0x33333333, 0x3FB99999,0x9999999A, 0x3FF1CC2B,0x0E9CE1D1,
+	0x40073333,0x33333333, 0x3FC99999,0x9999999A, 0x3FF3CC08,0xC975DEF2,
+	0x40073333,0x33333333, 0x3FD33333,0x33333333, 0x3FF60568,0x0C821D96,
+	0x40073333,0x33333333, 0x3FD99999,0x9999999A, 0x3FF87EBE,0xBE8E0293,
+	0x40073333,0x33333333, 0x3FE00000,0x00000000, 0x3FFB3F3C,0x957429DA,
+	0x40073333,0x33333333, 0x3FE33333,0x33333333, 0x3FFE4EDF,0xF6124554,
+	0x40073333,0x33333333, 0x3FE66666,0x66666666, 0x4000DB46,0x964E7456,
+	0x40073333,0x33333333, 0x3FE99999,0x9999999A, 0x4002C014,0x20629D76,
+	0x40073333,0x33333333, 0x3FECCCCC,0xCCCCCCCD, 0x4004DB58,0xD85BB2AF,
+	0x40073333,0x33333333, 0x3FF00000,0x00000000, 0x40073333,0x33333333,
+	0x40073333,0x33333333, 0x3FF19999,0x9999999A, 0x4009CE71,0xA1FD143C,
+	0x40073333,0x33333333, 0x3FF33333,0x33333333, 0x400CB4A6,0x57515012,
+	0x40073333,0x33333333, 0x3FF4CCCC,0xCCCCCCCD, 0x400FEE3D,0x45564480,
+	0x40073333,0x33333333, 0x3FF66666,0x66666666, 0x4011C24A,0x4A26F510,
+	0x40073333,0x33333333, 0x3FF80000,0x00000000, 0x4013C10B,0xEC5A9E58,
+	0x40073333,0x33333333, 0x3FF99999,0x9999999A, 0x4015F92F,0x2C007244,
+	0x40073333,0x33333333, 0x3FFB3333,0x33333333, 0x40187126,0x59F1C24A,
+	0x40073333,0x33333333, 0x3FFCCCCC,0xCCCCCCCD, 0x401B301D,0x2EF56451,
+	0x40073333,0x33333333, 0x3FFE6666,0x66666666, 0x401E3E0D,0xA01E8FE4,
+	0x40073333,0x33333333, 0x40000000,0x00000000, 0x4020D1EB,0x851EB852,
+	0x40080000,0x00000000, 0x3FB99999,0x9999999A, 0x3FF1DBA3,0xF92C888B,
+	0x40080000,0x00000000, 0x3FC99999,0x9999999A, 0x3FF3EE83,0x90D43956,
+	0x40080000,0x00000000, 0x3FD33333,0x33333333, 0x3FF63F08,0xB6F382AE,
+	0x40080000,0x00000000, 0x3FD99999,0x9999999A, 0x3FF8D45C,0x06468A88,
+	0x40080000,0x00000000, 0x3FE00000,0x00000000, 0x3FFBB67A,0xE8584CAA,
+	0x40080000,0x00000000, 0x3FE33333,0x33333333, 0x3FFEEE50,0x4BC32424,
+	0x40080000,0x00000000, 0x3FE66666,0x66666666, 0x400142E8,0x1C889914,
+	0x40080000,0x00000000, 0x3FE99999,0x9999999A, 0x4003440B,0x4DC59A8E,
+	0x40080000,0x00000000, 0x3FECCCCC,0xCCCCCCCD, 0x400580C4,0xCE962CAA,
+	0x40080000,0x00000000, 0x3FF00000,0x00000000, 0x40080000,0x00000000,
+	0x40080000,0x00000000, 0x3FF19999,0x9999999A, 0x400AC975,0xF5C2CCD2,
+	0x40080000,0x00000000, 0x3FF33333,0x33333333, 0x400DE5C5,0x593E5600,
+	0x40080000,0x00000000, 0x3FF4CCCC,0xCCCCCCCD, 0x4010AF46,0x8936A203,
+	0x40080000,0x00000000, 0x3FF66666,0x66666666, 0x40129F45,0x04B4E7E5,
+	0x40080000,0x00000000, 0x3FF80000,0x00000000, 0x4014C8DC,0x2E423980,
+	0x40080000,0x00000000, 0x3FF99999,0x9999999A, 0x401732BC,0x38D25B1C,
+	0x40080000,0x00000000, 0x3FFB3333,0x33333333, 0x4019E45C,0x2ACCE59E,
+	0x40080000,0x00000000, 0x3FFCCCCC,0xCCCCCCCD, 0x401CE610,0xF4A867D4,
+	0x40080000,0x00000000, 0x3FFE6666,0x66666666, 0x40202093,0x9AF0A17F,
+	0x40080000,0x00000000, 0x40000000,0x00000000, 0x40220000,0x00000000,
+	0x4008CCCC,0xCCCCCCCD, 0x3FB99999,0x9999999A, 0x3FF1EAA7,0xCBBC4617,
+	0x4008CCCC,0xCCCCCCCD, 0x3FC99999,0x9999999A, 0x3FF41016,0x03D70F0F,
+	0x4008CCCC,0xCCCCCCCD, 0x3FD33333,0x33333333, 0x3FF67755,0x0D6A9D87,
+	0x4008CCCC,0xCCCCCCCD, 0x3FD99999,0x9999999A, 0x3FF92847,0x35BF9E55,
+	0x4008CCCC,0xCCCCCCCD, 0x3FE00000,0x00000000, 0x3FFC2BC0,0x8F4BFA98,
+	0x4008CCCC,0xCCCCCCCD, 0x3FE33333,0x33333333, 0x3FFF8BA3,0xE7D0E1B4,
+	0x4008CCCC,0xCCCCCCCD, 0x3FE66666,0x66666666, 0x4001A981,0x9B4CF265,
+	0x4008CCCC,0xCCCCCCCD, 0x3FE99999,0x9999999A, 0x4003C721,0xF6A03D4D,
+	0x4008CCCC,0xCCCCCCCD, 0x3FECCCCC,0xCCCCCCCD, 0x400625A3,0xD10AE026,
+	0x4008CCCC,0xCCCCCCCD, 0x3FF00000,0x00000000, 0x4008CCCC,0xCCCCCCCD,
+	0x4008CCCC,0xCCCCCCCD, 0x3FF19999,0x9999999A, 0x400BC550,0xE2309FD8,
+	0x4008CCCC,0xCCCCCCCD, 0x3FF33333,0x33333333, 0x400F18EE,0xEC5A2424,
+	0x4008CCCC,0xCCCCCCCD, 0x3FF4CCCC,0xCCCCCCCD, 0x40116948,0x50CC3A16,
+	0x4008CCCC,0xCCCCCCCD, 0x3FF66666,0x66666666, 0x40137F37,0x300E1AB4,
+	0x4008CCCC,0xCCCCCCCD, 0x3FF80000,0x00000000, 0x4015D51B,0xA241489C,
+	0x4008CCCC,0xCCCCCCCD, 0x3FF99999,0x9999999A, 0x4018729F,0x06DB7BB9,
+	0x4008CCCC,0xCCCCCCCD, 0x3FFB3333,0x33333333, 0x401B6055,0xB0B74484,
+	0x4008CCCC,0xCCCCCCCD, 0x3FFCCCCC,0xCCCCCCCD, 0x401EA7DB,0x0B11F89D,
+	0x4008CCCC,0xCCCCCCCD, 0x3FFE6666,0x66666666, 0x402129F8,0x8ECED41D,
+	0x4008CCCC,0xCCCCCCCD, 0x40000000,0x00000000, 0x40233851,0xEB851EB9,
+	0x40099999,0x9999999A, 0x3FB99999,0x9999999A, 0x3FF1F93D,0x99C0166A,
+	0x40099999,0x9999999A, 0x3FC99999,0x9999999A, 0x3FF430CD,0x74F6D478,
+	0x40099999,0x9999999A, 0x3FD33333,0x33333333, 0x3FF6AE5F,0x85C6E38F,
+	0x40099999,0x9999999A, 0x3FD99999,0x9999999A, 0x3FF97A96,0x7F7524B3,
+	0x40099999,0x9999999A, 0x3FE00000,0x00000000, 0x3FFC9F25,0xC5BFEDD9,
+	0x40099999,0x9999999A, 0x3FE33333,0x33333333, 0x40001379,0x87DD704C,
+	0x40099999,0x9999999A, 0x3FE66666,0x66666666, 0x40020F1E,0x18683DCB,
+	0x40099999,0x9999999A, 0x3FE99999,0x9999999A, 0x40044960,0xC576B376,
+	0x40099999,0x9999999A, 0x3FECCCCC,0xCCCCCCCD, 0x4006C9FA,0xDE81511F,
+	0x40099999,0x9999999A, 0x3FF00000,0x00000000, 0x40099999,0x9999999A,
+	0x40099999,0x9999999A, 0x3FF19999,0x9999999A, 0x400CC1FC,0x29335711,
+	0x40099999,0x9999999A, 0x3FF33333,0x33333333, 0x4010270A,0xC3F8A9FA,
+	0x40099999,0x9999999A, 0x3FF4CCCC,0xCCCCCCCD, 0x40122519,0x37D24FA7,
+	0x40099999,0x9999999A, 0x3FF66666,0x66666666, 0x40146211,0xFF90EA29,
+	0x40099999,0x9999999A, 0x3FF80000,0x00000000, 0x4016E5B7,0xD16657E2,
+	0x40099999,0x9999999A, 0x3FF99999,0x9999999A, 0x4019B8C2,0x72FBE6E1,
+	0x40099999,0x9999999A, 0x3FFB3333,0x33333333, 0x401CE4FC,0xF3D9FC78,
+	0x40099999,0x9999999A, 0x3FFCCCCC,0xCCCCCCCD, 0x40203AB3,0xD12BC2C5,
+	0x40099999,0x9999999A, 0x3FFE6666,0x66666666, 0x40223B2F,0x18677418,
+	0x40099999,0x9999999A, 0x40000000,0x00000000, 0x40247AE1,0x47AE147C,
+	0x400A6666,0x66666666, 0x3FB99999,0x9999999A, 0x3FF2076B,0xD4BA49A9,
+	0x400A6666,0x66666666, 0x3FC99999,0x9999999A, 0x3FF450B6,0x0FD40104,
+	0x400A6666,0x66666666, 0x3FD33333,0x33333333, 0x3FF6E439,0x0B50EBDB,
+	0x400A6666,0x66666666, 0x3FD99999,0x9999999A, 0x3FF9CB5E,0x4C47F2BB,
+	0x400A6666,0x66666666, 0x3FE00000,0x00000000, 0x3FFD10C0,0xE60BE308,
+	0x400A6666,0x66666666, 0x3FE33333,0x33333333, 0x4000602A,0x1CD635C3,
+	0x400A6666,0x66666666, 0x3FE66666,0x66666666, 0x400273C7,0xCFB01256,
+	0x400A6666,0x66666666, 0x3FE99999,0x9999999A, 0x4004CACF,0xCCAE1CF8,
+	0x400A6666,0x66666666, 0x3FECCCCC,0xCCCCCCCD, 0x40076DCE,0xA1EC6C50,
+	0x400A6666,0x66666666, 0x3FF00000,0x00000000, 0x400A6666,0x66666666,
+	0x400A6666,0x66666666, 0x3FF19999,0x9999999A, 0x400DBF71,0xEBCCF98A,
+	0x400A6666,0x66666666, 0x3FF33333,0x33333333, 0x4010C296,0x33754DA3,
+	0x400A6666,0x66666666, 0x3FF4CCCC,0xCCCCCCCD, 0x4012E2AF,0x0FBC5C2E,
+	0x400A6666,0x66666666, 0x3FF66666,0x66666666, 0x401547C7,0x6554F50C,
+	0x400A6666,0x66666666, 0x3FF80000,0x00000000, 0x4017FA9F,0x243034E6,
+	0x400A6666,0x66666666, 0x3FF99999,0x9999999A, 0x401B0512,0x492E3F1B,
+	0x400A6666,0x66666666, 0x3FFB3333,0x33333333, 0x401E723C,0xE37C1E40,
+	0x400A6666,0x66666666, 0x3FFCCCCC,0xCCCCCCCD, 0x40212751,0xD5A93E4C,
+	0x400A6666,0x66666666, 0x3FFE6666,0x66666666, 0x40235430,0xDF2FD95B,
+	0x400A6666,0x66666666, 0x40000000,0x00000000, 0x4025C7AE,0x147AE147,
+	0x400B3333,0x33333333, 0x3FB99999,0x9999999A, 0x3FF21538,0x5F1F360F,
+	0x400B3333,0x33333333, 0x3FC99999,0x9999999A, 0x3FF46FDA,0xFAC687A0,
+	0x400B3333,0x33333333, 0x3FD33333,0x33333333, 0x3FF718F1,0x2A86ECD2,
+	0x400B3333,0x33333333, 0x3FD99999,0x9999999A, 0x3FFA1AB1,0x6CFCD6A5,
+	0x400B3333,0x33333333, 0x3FE00000,0x00000000, 0x3FFD80A6,0x9C19E42A,
+	0x400B3333,0x33333333, 0x3FE33333,0x33333333, 0x4000ABEE,0x1DFB479A,
+	0x400B3333,0x33333333, 0x3FE66666,0x66666666, 0x4002D788,0x4720CE8E,
+	0x400B3333,0x33333333, 0x3FE99999,0x9999999A, 0x40054B76,0x9543B6CA,
+	0x400B3333,0x33333333, 0x3FECCCCC,0xCCCCCCCD, 0x40081123,0x7A48BB2E,
+	0x400B3333,0x33333333, 0x3FF00000,0x00000000, 0x400B3333,0x33333333,
+	0x400B3333,0x33333333, 0x3FF19999,0x9999999A, 0x400EBDAC,0xA1B50F1A,
+	0x400B3333,0x33333333, 0x3FF33333,0x33333333, 0x40115F13,0xBB8F267A,
+	0x400B3333,0x33333333, 0x3FF4CCCC,0xCCCCCCCD, 0x4013A200,0x30F2AFB3,
+	0x400B3333,0x33333333, 0x3FF66666,0x66666666, 0x4016304A,0x030A1CD8,
+	0x400B3333,0x33333333, 0x3FF80000,0x00000000, 0x401913C0,0xD17C6856,
+	0x400B3333,0x33333333, 0x3FF99999,0x9999999A, 0x401C577B,0x32F7F9BA,
+	0x400B3333,0x33333333, 0x3FFB3333,0x33333333, 0x40200400,0xA2DBE2C5,
+	0x400B3333,0x33333333, 0x3FFCCCCC,0xCCCCCCCD, 0x402219BE,0x65465B5E,
+	0x400B3333,0x33333333, 0x3FFE6666,0x66666666, 0x402474F7,0xC18A9F19,
+	0x400B3333,0x33333333, 0x40000000,0x00000000, 0x40271EB8,0x51EB851E,
+	0x400C0000,0x00000000, 0x3FB99999,0x9999999A, 0x3FF222A8,0x9C88C4EE,
+	0x400C0000,0x00000000, 0x3FC99999,0x9999999A, 0x3FF48E46,0x73BDDD91,
+	0x400C0000,0x00000000, 0x3FD33333,0x33333333, 0x3FF74C96,0x36EA3144,
+	0x400C0000,0x00000000, 0x3FD99999,0x9999999A, 0x3FFA68A1,0x45174C0A,
+	0x400C0000,0x00000000, 0x3FE00000,0x00000000, 0x3FFDEEEA,0x11683F49,
+	0x400C0000,0x00000000, 0x3FE33333,0x33333333, 0x4000F6CF,0x3B36A26E,
+	0x400C0000,0x00000000, 0x3FE66666,0x66666666, 0x40033A68,0x60729FC1,
+	0x400C0000,0x00000000, 0x3FE99999,0x9999999A, 0x4005CB5C,0x2BB3B2CE,
+	0x400C0000,0x00000000, 0x3FECCCCC,0xCCCCCCCD, 0x4008B3FD,0x8187E15C,
+	0x400C0000,0x00000000, 0x3FF00000,0x00000000, 0x400C0000,0x00000000,
+	0x400C0000,0x00000000, 0x3FF19999,0x9999999A, 0x400FBCA7,0x11EF58A2,
+	0x400C0000,0x00000000, 0x3FF33333,0x33333333, 0x4011FC7D,0xA54621DF,
+	0x400C0000,0x00000000, 0x3FF4CCCC,0xCCCCCCCD, 0x40146303,0x700CEB1C,
+	0x400C0000,0x00000000, 0x3FF66666,0x66666666, 0x40171B8D,0x1C746288,
+	0x400C0000,0x00000000, 0x3FF80000,0x00000000, 0x401A310C,0xCF3B3760,
+	0x400C0000,0x00000000, 0x3FF99999,0x9999999A, 0x401DAFEA,0xA79F9C41,
+	0x400C0000,0x00000000, 0x3FFB3333,0x33333333, 0x4020D31B,0x54644BC9,
+	0x400C0000,0x00000000, 0x3FFCCCCC,0xCCCCCCCD, 0x402311F0,0xA63D3C75,
+	0x400C0000,0x00000000, 0x3FFE6666,0x66666666, 0x40259D7D,0xD156E530,
+	0x400C0000,0x00000000, 0x40000000,0x00000000, 0x40288000,0x00000000,
+	0x400CCCCC,0xCCCCCCCD, 0x3FB99999,0x9999999A, 0x3FF22FC1,0x7FAC725E,
+	0x400CCCCC,0xCCCCCCCD, 0x3FC99999,0x9999999A, 0x3FF4AC01,0xE936328F,
+	0x400CCCCC,0xCCCCCCCD, 0x3FD33333,0x33333333, 0x3FF77F35,0x6BC53136,
+	0x400CCCCC,0xCCCCCCCD, 0x3FD99999,0x9999999A, 0x3FFAB53D,0xF01DC613,
+	0x400CCCCC,0xCCCCCCCD, 0x3FE00000,0x00000000, 0x3FFE5B9D,0x136C6D96,
+	0x400CCCCC,0xCCCCCCCD, 0x3FE33333,0x33333333, 0x400140D6,0x7B4C125D,
+	0x400CCCCC,0xCCCCCCCD, 0x3FE66666,0x66666666, 0x40039C70,0x68878E2B,
+	0x400CCCCC,0xCCCCCCCD, 0x3FE99999,0x9999999A, 0x40064A87,0x2B54952B,
+	0x400CCCCC,0xCCCCCCCD, 0x3FECCCCC,0xCCCCCCCD, 0x40095660,0x92ACBC5E,
+	0x400CCCCC,0xCCCCCCCD, 0x3FF00000,0x00000000, 0x400CCCCC,0xCCCCCCCD,
+	0x400CCCCC,0xCCCCCCCD, 0x3FF19999,0x9999999A, 0x40105E2E,0x261B33BC,
+	0x400CCCCC,0xCCCCCCCD, 0x3FF33333,0x33333333, 0x40129ACE,0x85172D81,
+	0x400CCCCC,0xCCCCCCCD, 0x3FF4CCCC,0xCCCCCCCD, 0x401525B0,0x14317918,
+	0x400CCCCC,0xCCCCCCCD, 0x3FF66666,0x66666666, 0x40180984,0x8B4DFF10,
+	0x400CCCCC,0xCCCCCCCD, 0x3FF80000,0x00000000, 0x401B5273,0xC4AE62A1,
+	0x400CCCCC,0xCCCCCCCD, 0x3FF99999,0x9999999A, 0x401F0E4E,0xDDEF5442,
+	0x400CCCCC,0xCCCCCCCD, 0x3FFB3333,0x33333333, 0x4021A665,0x2AE0665A,
+	0x400CCCCC,0xCCCCCCCD, 0x3FFCCCCC,0xCCCCCCCD, 0x40240FE0,0x0D65B973,
+	0x400CCCCC,0xCCCCCCCD, 0x3FFE6666,0x66666666, 0x4026CDBD,0x50CEA987,
+	0x400CCCCC,0xCCCCCCCD, 0x40000000,0x00000000, 0x4029EB85,0x1EB851EC,
+	0x400D9999,0x9999999A, 0x3FB99999,0x9999999A, 0x3FF23C87,0x9670A28C,
+	0x400D9999,0x9999999A, 0x3FC99999,0x9999999A, 0x3FF4C916,0x0FE2BAB0,
+	0x400D9999,0x9999999A, 0x3FD33333,0x33333333, 0x3FF7B0DB,0x08B44BE4,
+	0x400D9999,0x9999999A, 0x3FD99999,0x9999999A, 0x3FFB0096,0x62245F0A,
+	0x400D9999,0x9999999A, 0x3FE00000,0x00000000, 0x3FFEC6D0,0x353167A9,
+	0x400D9999,0x9999999A, 0x3FE33333,0x33333333, 0x40018A0C,0x4BBE2B80,
+	0x400D9999,0x9999999A, 0x3FE66666,0x66666666, 0x4003FDA8,0x250364F3,
+	0x400D9999,0x9999999A, 0x3FE99999,0x9999999A, 0x4006C8FD,0xC86019A3,
+	0x400D9999,0x9999999A, 0x3FECCCCC,0xCCCCCCCD, 0x4009F850,0x4F358183,
+	0x400D9999,0x9999999A, 0x3FF00000,0x00000000, 0x400D9999,0x9999999A,
+	0x400D9999,0x9999999A, 0x3FF19999,0x9999999A, 0x4010DE63,0xD18E965B,
+	0x400D9999,0x9999999A, 0x3FF33333,0x33333333, 0x40133A01,0x35181FE3,
+	0x400D9999,0x9999999A, 0x3FF4CCCC,0xCCCCCCCD, 0x4015E9FD,0xCE739300,
+	0x400D9999,0x9999999A, 0x3FF66666,0x66666666, 0x4018FA24,0xB461A4B6,
+	0x400D9999,0x9999999A, 0x3FF80000,0x00000000, 0x401C77E6,0xFE00E649,
+	0x400D9999,0x9999999A, 0x3FF99999,0x9999999A, 0x4020394B,0x5FA981D8,
+	0x400D9999,0x9999999A, 0x3FFB3333,0x33333333, 0x40227DD5,0x223CBD61,
+	0x400D9999,0x9999999A, 0x3FFCCCCC,0xCCCCCCCD, 0x40251384,0x5958E484,
+	0x400D9999,0x9999999A, 0x3FFE6666,0x66666666, 0x402805B0,0xAFAB17CC,
+	0x400D9999,0x9999999A, 0x40000000,0x00000000, 0x402B6147,0xAE147AE2,
+	0x400E6666,0x66666666, 0x3FB99999,0x9999999A, 0x3FF248FF,0x146D0FF9,
+	0x400E6666,0x66666666, 0x3FC99999,0x9999999A, 0x3FF4E58A,0xF58FD4AE,
+	0x400E6666,0x66666666, 0x3FD33333,0x33333333, 0x3FF7E192,0x6A96DE76,
+	0x400E6666,0x66666666, 0x3FD99999,0x9999999A, 0x3FFB4AB8,0x8453A384,
+	0x400E6666,0x66666666, 0x3FE00000,0x00000000, 0x3FFF3092,0xECE5BC35,
+	0x400E6666,0x66666666, 0x3FE33333,0x33333333, 0x4001D278,0x8ED1B766,
+	0x400E6666,0x66666666, 0x3FE66666,0x66666666, 0x40045E16,0xE050948C,
+	0x400E6666,0x66666666, 0x3FE99999,0x9999999A, 0x400746C5,0xD8D91AA8,
+	0x400E6666,0x66666666, 0x3FECCCCC,0xCCCCCCCD, 0x400A99D0,0x23EC5FA7,
+	0x400E6666,0x66666666, 0x3FF00000,0x00000000, 0x400E6666,0x66666666,
+	0x400E6666,0x66666666, 0x3FF19999,0x9999999A, 0x40115EF2,0x53679BF9,
+	0x400E6666,0x66666666, 0x3FF33333,0x33333333, 0x4013DA10,0xCFAF0A0B,
+	0x400E6666,0x66666666, 0x3FF4CCCC,0xCCCCCCCD, 0x4016AFE4,0xB20F5357,
+	0x400E6666,0x66666666, 0x3FF66666,0x66666666, 0x4019ED62,0x7DB5DB55,
+	0x400E6666,0x66666666, 0x3FF80000,0x00000000, 0x401DA158,0x610D72CC,
+	0x400E6666,0x66666666, 0x3FF99999,0x9999999A, 0x4020EE58,0xEE1407D4,
+	0x400E6666,0x66666666, 0x3FFB3333,0x33333333, 0x40235962,0x884C8D1E,
+	0x400E6666,0x66666666, 0x3FFCCCCC,0xCCCCCCCD, 0x40261CD5,0x8E0172EC,
+	0x400E6666,0x66666666, 0x3FFE6666,0x66666666, 0x40294552,0x8886F477,
+	0x400E6666,0x66666666, 0x40000000,0x00000000, 0x402CE147,0xAE147AE1,
+	0x400F3333,0x33333333, 0x3FB99999,0x9999999A, 0x3FF2552B,0xDC147B86,
+	0x400F3333,0x33333333, 0x3FC99999,0x9999999A, 0x3FF50168,0x11A8AA50,
+	0x400F3333,0x33333333, 0x3FD33333,0x33333333, 0x3FF81166,0x217179F7,
+	0x400F3333,0x33333333, 0x3FD99999,0x9999999A, 0x3FFB93B1,0x4E01D9CA,
+	0x400F3333,0x33333333, 0x3FE00000,0x00000000, 0x3FFF98F3,0xADEF13F2,
+	0x400F3333,0x33333333, 0x3FE33333,0x33333333, 0x40021A22,0xA7F3B4DB,
+	0x400F3333,0x33333333, 0x3FE66666,0x66666666, 0x4004BDC3,0x744A1677,
+	0x400F3333,0x33333333, 0x3FE99999,0x9999999A, 0x4007C3E4,0xDC763839,
+	0x400F3333,0x33333333, 0x3FECCCCC,0xCCCCCCCD, 0x400B3AE3,0x4D333AF7,
+	0x400F3333,0x33333333, 0x3FF00000,0x00000000, 0x400F3333,0x33333333,
+	0x400F3333,0x33333333, 0x3FF19999,0x9999999A, 0x4011DFD7,0x902D920A,
+	0x400F3333,0x33333333, 0x3FF33333,0x33333333, 0x40147AF8,0xAAD13FA7,
+	0x400F3333,0x33333333, 0x3FF4CCCC,0xCCCCCCCD, 0x4017775D,0x2D683D51,
+	0x400F3333,0x33333333, 0x3FF66666,0x66666666, 0x401AE333,0x45A83457,
+	0x400F3333,0x33333333, 0x3FF80000,0x00000000, 0x401ECEBA,0x632F803F,
+	0x400F3333,0x33333333, 0x3FF99999,0x9999999A, 0x4021A648,0x308D9D23,
+	0x400F3333,0x33333333, 0x3FFB3333,0x33333333, 0x40243904,0xF7C83C4D,
+	0x400F3333,0x33333333, 0x3FFCCCCC,0xCCCCCCCD, 0x40272BCB,0xF08CDD37,
+	0x400F3333,0x33333333, 0x3FFE6666,0x66666666, 0x402A8C9D,0x9E78597C,
+	0x400F3333,0x33333333, 0x40000000,0x00000000, 0x402E6B85,0x1EB851EB,
+	0x40100000,0x00000000, 0x3FB99999,0x9999999A, 0x3FF26111,0x86BAE675,
+	0x40100000,0x00000000, 0x3FC99999,0x9999999A, 0x3FF51CB4,0x53B9536C,
+	0x40100000,0x00000000, 0x3FD33333,0x33333333, 0x3FF84060,0x03B2AE5C,
+	0x40100000,0x00000000, 0x3FD99999,0x9999999A, 0x3FFBDB8C,0xDADBE120,
+	0x40100000,0x00000000, 0x3FE00000,0x00000000, 0x40000000,0x00000000,
+	0x40100000,0x00000000, 0x3FE33333,0x33333333, 0x40026111,0x86BAE674,
+	0x40100000,0x00000000, 0x3FE66666,0x66666666, 0x40051CB4,0x53B9536C,
+	0x40100000,0x00000000, 0x3FE99999,0x9999999A, 0x40084060,0x03B2AE5D,
+	0x40100000,0x00000000, 0x3FECCCCC,0xCCCCCCCD, 0x400BDB8C,0xDADBE120,
+	0x40100000,0x00000000, 0x3FF00000,0x00000000, 0x40100000,0x00000000,
+	0x40100000,0x00000000, 0x3FF19999,0x9999999A, 0x40126111,0x86BAE675,
+	0x40100000,0x00000000, 0x3FF33333,0x33333333, 0x40151CB4,0x53B9536C,
+	0x40100000,0x00000000, 0x3FF4CCCC,0xCCCCCCCD, 0x40184060,0x03B2AE5D,
+	0x40100000,0x00000000, 0x3FF66666,0x66666666, 0x401BDB8C,0xDADBE11F,
+	0x40100000,0x00000000, 0x3FF80000,0x00000000, 0x40200000,0x00000000,
+	0x40100000,0x00000000, 0x3FF99999,0x9999999A, 0x40226111,0x86BAE675,
+	0x40100000,0x00000000, 0x3FFB3333,0x33333333, 0x40251CB4,0x53B9536C,
+	0x40100000,0x00000000, 0x3FFCCCCC,0xCCCCCCCD, 0x40284060,0x03B2AE5D,
+	0x40100000,0x00000000, 0x3FFE6666,0x66666666, 0x402BDB8C,0xDADBE11F,
+	0x40100000,0x00000000, 0x40000000,0x00000000, 0x40300000,0x00000000,
+	};
+
+LOCAL_D const TUint32 PowerTest2[] =
+	{
+	0x40000000,0x00000000, 2, 0x40100000,0x00000000,
+	0x40000000,0x00000000, 3, 0x40200000,0x00000000,
+	0x40000000,0x00000000, 4, 0x40300000,0x00000000,
+	0x40000000,0x00000000, 5, 0x40400000,0x00000000,
+	0x40000000,0x00000000, 6, 0x40500000,0x00000000,
+	0x40000000,0x00000000, 7, 0x40600000,0x00000000,
+	0x40000000,0x00000000, 8, 0x40700000,0x00000000,
+	0x40000000,0x00000000, 9, 0x40800000,0x00000000,
+	0x40000000,0x00000000, 10, 0x40900000,0x00000000,
+	0x40000000,0x00000000, 11, 0x40A00000,0x00000000,
+	0x40000000,0x00000000, 12, 0x40B00000,0x00000000,
+	0x40000000,0x00000000, 13, 0x40C00000,0x00000000,
+	0x40000000,0x00000000, 14, 0x40D00000,0x00000000,
+	0x40000000,0x00000000, 15, 0x40E00000,0x00000000,
+	0x40000000,0x00000000, 16, 0x40F00000,0x00000000,
+	0x40000000,0x00000000, 17, 0x41000000,0x00000000,
+	0x40000000,0x00000000, 18, 0x41100000,0x00000000,
+	0x40000000,0x00000000, 19, 0x41200000,0x00000000,
+	0x40000000,0x00000000, 20, 0x41300000,0x00000000,
+	0x40000000,0x00000000, 21, 0x41400000,0x00000000,
+	0x40000000,0x00000000, 22, 0x41500000,0x00000000,
+	0x40000000,0x00000000, 23, 0x41600000,0x00000000,
+	0x40000000,0x00000000, 24, 0x41700000,0x00000000,
+	0x40000000,0x00000000, 25, 0x41800000,0x00000000,
+	0x40000000,0x00000000, 26, 0x41900000,0x00000000,
+	0x40000000,0x00000000, 27, 0x41A00000,0x00000000,
+	0x40000000,0x00000000, 28, 0x41B00000,0x00000000,
+	0x40000000,0x00000000, 29, 0x41C00000,0x00000000,
+	0x40000000,0x00000000, 30, 0x41D00000,0x00000000,
+	0x40000000,0x00000000, 31, 0x41E00000,0x00000000,
+	0x40000000,0x00000000, 32, 0x41F00000,0x00000000,
+	0x40000000,0x00000000, 33, 0x42000000,0x00000000,
+	0x40000000,0x00000000, 34, 0x42100000,0x00000000,
+	0x40000000,0x00000000, 35, 0x42200000,0x00000000,
+	0x40000000,0x00000000, 36, 0x42300000,0x00000000,
+	0x40000000,0x00000000, 37, 0x42400000,0x00000000,
+	0x40000000,0x00000000, 38, 0x42500000,0x00000000,
+	0x40000000,0x00000000, 39, 0x42600000,0x00000000,
+	0x40000000,0x00000000, 40, 0x42700000,0x00000000,
+	0x40000000,0x00000000, 41, 0x42800000,0x00000000,
+	0x40000000,0x00000000, 42, 0x42900000,0x00000000,
+	0x40000000,0x00000000, 43, 0x42A00000,0x00000000,
+	0x40000000,0x00000000, 44, 0x42B00000,0x00000000,
+	0x40000000,0x00000000, 45, 0x42C00000,0x00000000,
+	0x40000000,0x00000000, 46, 0x42D00000,0x00000000,
+	0x40000000,0x00000000, 47, 0x42E00000,0x00000000,
+	0x40000000,0x00000000, 48, 0x42F00000,0x00000000,
+	0x40000000,0x00000000, 49, 0x43000000,0x00000000,
+	0x40000000,0x00000000, 50, 0x43100000,0x00000000,
+	0x40000000,0x00000000, 51, 0x43200000,0x00000000,
+	0x40000000,0x00000000, 52, 0x43300000,0x00000000,
+	0x40000000,0x00000000, 53, 0x43400000,0x00000000,
+	0x40000000,0x00000000, 54, 0x43500000,0x00000000,
+	0x40000000,0x00000000, 55, 0x43600000,0x00000000,
+	0x40000000,0x00000000, 56, 0x43700000,0x00000000,
+	0x40000000,0x00000000, 57, 0x43800000,0x00000000,
+	0x40000000,0x00000000, 58, 0x43900000,0x00000000,
+	0x40000000,0x00000000, 59, 0x43A00000,0x00000000,
+	0x40000000,0x00000000, 60, 0x43B00000,0x00000000,
+	0x40000000,0x00000000, 61, 0x43C00000,0x00000000,
+	0x40000000,0x00000000, 62, 0x43D00000,0x00000000,
+	0x40000000,0x00000000, 63, 0x43E00000,0x00000000,
+	0x40000000,0x00000000, 64, 0x43F00000,0x00000000,
+	0x40000000,0x00000000, 65, 0x44000000,0x00000000,
+	0x40000000,0x00000000, 66, 0x44100000,0x00000000,
+	0x40000000,0x00000000, 67, 0x44200000,0x00000000,
+	0x40000000,0x00000000, 68, 0x44300000,0x00000000,
+	0x40000000,0x00000000, 69, 0x44400000,0x00000000,
+	0x40000000,0x00000000, 70, 0x44500000,0x00000000,
+	0x40000000,0x00000000, 71, 0x44600000,0x00000000,
+	0x40000000,0x00000000, 72, 0x44700000,0x00000000,
+	0x40000000,0x00000000, 73, 0x44800000,0x00000000,
+	0x40000000,0x00000000, 74, 0x44900000,0x00000000,
+	0x40000000,0x00000000, 75, 0x44A00000,0x00000000,
+	0x40000000,0x00000000, 76, 0x44B00000,0x00000000,
+	0x40000000,0x00000000, 77, 0x44C00000,0x00000000,
+	0x40000000,0x00000000, 78, 0x44D00000,0x00000000,
+	0x40000000,0x00000000, 79, 0x44E00000,0x00000000,
+	0x40000000,0x00000000, 80, 0x44F00000,0x00000000,
+	0x40000000,0x00000000, 81, 0x45000000,0x00000000,
+	0x40000000,0x00000000, 82, 0x45100000,0x00000000,
+	0x40000000,0x00000000, 83, 0x45200000,0x00000000,
+	0x40000000,0x00000000, 84, 0x45300000,0x00000000,
+	0x40000000,0x00000000, 85, 0x45400000,0x00000000,
+	0x40000000,0x00000000, 86, 0x45500000,0x00000000,
+	0x40000000,0x00000000, 87, 0x45600000,0x00000000,
+	0x40000000,0x00000000, 88, 0x45700000,0x00000000,
+	0x40000000,0x00000000, 89, 0x45800000,0x00000000,
+	0x40000000,0x00000000, 90, 0x45900000,0x00000000,
+	0x40000000,0x00000000, 91, 0x45A00000,0x00000000,
+	0x40000000,0x00000000, 92, 0x45B00000,0x00000000,
+	0x40000000,0x00000000, 93, 0x45C00000,0x00000000,
+	0x40000000,0x00000000, 94, 0x45D00000,0x00000000,
+	0x40000000,0x00000000, 95, 0x45E00000,0x00000000,
+	0x40000000,0x00000000, 96, 0x45F00000,0x00000000,
+	0x40000000,0x00000000, 97, 0x46000000,0x00000000,
+	0x40000000,0x00000000, 98, 0x46100000,0x00000000,
+	0x40000000,0x00000000, 99, 0x46200000,0x00000000,
+	0x40000000,0x00000000, 100, 0x46300000,0x00000000,
+	0x40000000,0x00000000, 101, 0x46400000,0x00000000,
+	0x40000000,0x00000000, 102, 0x46500000,0x00000000,
+	0x40000000,0x00000000, 103, 0x46600000,0x00000000,
+	0x40000000,0x00000000, 104, 0x46700000,0x00000000,
+	0x40000000,0x00000000, 105, 0x46800000,0x00000000,
+	0x40000000,0x00000000, 106, 0x46900000,0x00000000,
+	0x40000000,0x00000000, 107, 0x46A00000,0x00000000,
+	0x40000000,0x00000000, 108, 0x46B00000,0x00000000,
+	0x40000000,0x00000000, 109, 0x46C00000,0x00000000,
+	0x40000000,0x00000000, 110, 0x46D00000,0x00000000,
+	0x40000000,0x00000000, 111, 0x46E00000,0x00000000,
+	0x40000000,0x00000000, 112, 0x46F00000,0x00000000,
+	0x40000000,0x00000000, 113, 0x47000000,0x00000000,
+	0x40000000,0x00000000, 114, 0x47100000,0x00000000,
+	0x40000000,0x00000000, 115, 0x47200000,0x00000000,
+	0x40000000,0x00000000, 116, 0x47300000,0x00000000,
+	0x40000000,0x00000000, 117, 0x47400000,0x00000000,
+	0x40000000,0x00000000, 118, 0x47500000,0x00000000,
+	0x40000000,0x00000000, 119, 0x47600000,0x00000000,
+	0x40000000,0x00000000, 120, 0x47700000,0x00000000,
+	0x40000000,0x00000000, 121, 0x47800000,0x00000000,
+	0x40000000,0x00000000, 122, 0x47900000,0x00000000,
+	0x40000000,0x00000000, 123, 0x47A00000,0x00000000,
+	0x40000000,0x00000000, 124, 0x47B00000,0x00000000,
+	0x40000000,0x00000000, 125, 0x47C00000,0x00000000,
+	0x40000000,0x00000000, 126, 0x47D00000,0x00000000,
+	0x40000000,0x00000000, 127, 0x47E00000,0x00000000,
+	0x40000000,0x00000000, 128, 0x47F00000,0x00000000,
+	0x40000000,0x00000000, 129, 0x48000000,0x00000000,
+	0x40000000,0x00000000, 130, 0x48100000,0x00000000,
+	0x40000000,0x00000000, 131, 0x48200000,0x00000000,
+	0x40000000,0x00000000, 132, 0x48300000,0x00000000,
+	0x40000000,0x00000000, 133, 0x48400000,0x00000000,
+	0x40000000,0x00000000, 134, 0x48500000,0x00000000,
+	0x40000000,0x00000000, 135, 0x48600000,0x00000000,
+	0x40000000,0x00000000, 136, 0x48700000,0x00000000,
+	0x40000000,0x00000000, 137, 0x48800000,0x00000000,
+	0x40000000,0x00000000, 138, 0x48900000,0x00000000,
+	0x40000000,0x00000000, 139, 0x48A00000,0x00000000,
+	0x40000000,0x00000000, 140, 0x48B00000,0x00000000,
+	0x40000000,0x00000000, 141, 0x48C00000,0x00000000,
+	0x40000000,0x00000000, 142, 0x48D00000,0x00000000,
+	0x40000000,0x00000000, 143, 0x48E00000,0x00000000,
+	0x40000000,0x00000000, 144, 0x48F00000,0x00000000,
+	0x40000000,0x00000000, 145, 0x49000000,0x00000000,
+	0x40000000,0x00000000, 146, 0x49100000,0x00000000,
+	0x40000000,0x00000000, 147, 0x49200000,0x00000000,
+	0x40000000,0x00000000, 148, 0x49300000,0x00000000,
+	0x40000000,0x00000000, 149, 0x49400000,0x00000000,
+	0x40000000,0x00000000, 150, 0x49500000,0x00000000,
+	0x40000000,0x00000000, 151, 0x49600000,0x00000000,
+	0x40000000,0x00000000, 152, 0x49700000,0x00000000,
+	0x40000000,0x00000000, 153, 0x49800000,0x00000000,
+	0x40000000,0x00000000, 154, 0x49900000,0x00000000,
+	0x40000000,0x00000000, 155, 0x49A00000,0x00000000,
+	0x40000000,0x00000000, 156, 0x49B00000,0x00000000,
+	0x40000000,0x00000000, 157, 0x49C00000,0x00000000,
+	0x40000000,0x00000000, 158, 0x49D00000,0x00000000,
+	0x40000000,0x00000000, 159, 0x49E00000,0x00000000,
+	0x40000000,0x00000000, 160, 0x49F00000,0x00000000,
+	0x40000000,0x00000000, 161, 0x4A000000,0x00000000,
+	0x40000000,0x00000000, 162, 0x4A100000,0x00000000,
+	0x40000000,0x00000000, 163, 0x4A200000,0x00000000,
+	0x40000000,0x00000000, 164, 0x4A300000,0x00000000,
+	0x40000000,0x00000000, 165, 0x4A400000,0x00000000,
+	0x40000000,0x00000000, 166, 0x4A500000,0x00000000,
+	0x40000000,0x00000000, 167, 0x4A600000,0x00000000,
+	0x40000000,0x00000000, 168, 0x4A700000,0x00000000,
+	0x40000000,0x00000000, 169, 0x4A800000,0x00000000,
+	0x40000000,0x00000000, 170, 0x4A900000,0x00000000,
+	0x40000000,0x00000000, 171, 0x4AA00000,0x00000000,
+	0x40000000,0x00000000, 172, 0x4AB00000,0x00000000,
+	0x40000000,0x00000000, 173, 0x4AC00000,0x00000000,
+	0x40000000,0x00000000, 174, 0x4AD00000,0x00000000,
+	0x40000000,0x00000000, 175, 0x4AE00000,0x00000000,
+	0x40000000,0x00000000, 176, 0x4AF00000,0x00000000,
+	0x40000000,0x00000000, 177, 0x4B000000,0x00000000,
+	0x40000000,0x00000000, 178, 0x4B100000,0x00000000,
+	0x40000000,0x00000000, 179, 0x4B200000,0x00000000,
+	0x40000000,0x00000000, 180, 0x4B300000,0x00000000,
+	0x40000000,0x00000000, 181, 0x4B400000,0x00000000,
+	0x40000000,0x00000000, 182, 0x4B500000,0x00000000,
+	0x40000000,0x00000000, 183, 0x4B600000,0x00000000,
+	0x40000000,0x00000000, 184, 0x4B700000,0x00000000,
+	0x40000000,0x00000000, 185, 0x4B800000,0x00000000,
+	0x40000000,0x00000000, 186, 0x4B900000,0x00000000,
+	0x40000000,0x00000000, 187, 0x4BA00000,0x00000000,
+	0x40000000,0x00000000, 188, 0x4BB00000,0x00000000,
+	0x40000000,0x00000000, 189, 0x4BC00000,0x00000000,
+	0x40000000,0x00000000, 190, 0x4BD00000,0x00000000,
+	0x40000000,0x00000000, 191, 0x4BE00000,0x00000000,
+	0x40000000,0x00000000, 192, 0x4BF00000,0x00000000,
+	0x40000000,0x00000000, 193, 0x4C000000,0x00000000,
+	0x40000000,0x00000000, 194, 0x4C100000,0x00000000,
+	0x40000000,0x00000000, 195, 0x4C200000,0x00000000,
+	0x40000000,0x00000000, 196, 0x4C300000,0x00000000,
+	0x40000000,0x00000000, 197, 0x4C400000,0x00000000,
+	0x40000000,0x00000000, 198, 0x4C500000,0x00000000,
+	0x40000000,0x00000000, 199, 0x4C600000,0x00000000,
+	0x40000000,0x00000000, 200, 0x4C700000,0x00000000,
+	0x40000000,0x00000000, 201, 0x4C800000,0x00000000,
+	0x40000000,0x00000000, 202, 0x4C900000,0x00000000,
+	0x40000000,0x00000000, 203, 0x4CA00000,0x00000000,
+	0x40000000,0x00000000, 204, 0x4CB00000,0x00000000,
+	0x40000000,0x00000000, 205, 0x4CC00000,0x00000000,
+	0x40000000,0x00000000, 206, 0x4CD00000,0x00000000,
+	0x40000000,0x00000000, 207, 0x4CE00000,0x00000000,
+	0x40000000,0x00000000, 208, 0x4CF00000,0x00000000,
+	0x40000000,0x00000000, 209, 0x4D000000,0x00000000,
+	0x40000000,0x00000000, 210, 0x4D100000,0x00000000,
+	0x40000000,0x00000000, 211, 0x4D200000,0x00000000,
+	0x40000000,0x00000000, 212, 0x4D300000,0x00000000,
+	0x40000000,0x00000000, 213, 0x4D400000,0x00000000,
+	0x40000000,0x00000000, 214, 0x4D500000,0x00000000,
+	0x40000000,0x00000000, 215, 0x4D600000,0x00000000,
+	0x40000000,0x00000000, 216, 0x4D700000,0x00000000,
+	0x40000000,0x00000000, 217, 0x4D800000,0x00000000,
+	0x40000000,0x00000000, 218, 0x4D900000,0x00000000,
+	0x40000000,0x00000000, 219, 0x4DA00000,0x00000000,
+	0x40000000,0x00000000, 220, 0x4DB00000,0x00000000,
+	0x40000000,0x00000000, 221, 0x4DC00000,0x00000000,
+	0x40000000,0x00000000, 222, 0x4DD00000,0x00000000,
+	0x40000000,0x00000000, 223, 0x4DE00000,0x00000000,
+	0x40000000,0x00000000, 224, 0x4DF00000,0x00000000,
+	0x40000000,0x00000000, 225, 0x4E000000,0x00000000,
+	0x40000000,0x00000000, 226, 0x4E100000,0x00000000,
+	0x40000000,0x00000000, 227, 0x4E200000,0x00000000,
+	0x40000000,0x00000000, 228, 0x4E300000,0x00000000,
+	0x40000000,0x00000000, 229, 0x4E400000,0x00000000,
+	0x40000000,0x00000000, 230, 0x4E500000,0x00000000,
+	0x40000000,0x00000000, 231, 0x4E600000,0x00000000,
+	0x40000000,0x00000000, 232, 0x4E700000,0x00000000,
+	0x40000000,0x00000000, 233, 0x4E800000,0x00000000,
+	0x40000000,0x00000000, 234, 0x4E900000,0x00000000,
+	0x40000000,0x00000000, 235, 0x4EA00000,0x00000000,
+	0x40000000,0x00000000, 236, 0x4EB00000,0x00000000,
+	0x40000000,0x00000000, 237, 0x4EC00000,0x00000000,
+	0x40000000,0x00000000, 238, 0x4ED00000,0x00000000,
+	0x40000000,0x00000000, 239, 0x4EE00000,0x00000000,
+	0x40000000,0x00000000, 240, 0x4EF00000,0x00000000,
+	0x40000000,0x00000000, 241, 0x4F000000,0x00000000,
+	0x40000000,0x00000000, 242, 0x4F100000,0x00000000,
+	0x40000000,0x00000000, 243, 0x4F200000,0x00000000,
+	0x40000000,0x00000000, 244, 0x4F300000,0x00000000,
+	0x40000000,0x00000000, 245, 0x4F400000,0x00000000,
+	0x40000000,0x00000000, 246, 0x4F500000,0x00000000,
+	0x40000000,0x00000000, 247, 0x4F600000,0x00000000,
+	0x40000000,0x00000000, 248, 0x4F700000,0x00000000,
+	0x40000000,0x00000000, 249, 0x4F800000,0x00000000,
+	0x40000000,0x00000000, 250, 0x4F900000,0x00000000,
+	0x40000000,0x00000000, 251, 0x4FA00000,0x00000000,
+	0x40000000,0x00000000, 252, 0x4FB00000,0x00000000,
+	0x40000000,0x00000000, 253, 0x4FC00000,0x00000000,
+	0x40000000,0x00000000, 254, 0x4FD00000,0x00000000,
+	0x40000000,0x00000000, 255, 0x4FE00000,0x00000000,
+	0x40000000,0x00000000, 256, 0x4FF00000,0x00000000,
+	0x40000000,0x00000000, 257, 0x50000000,0x00000000,
+	0x40000000,0x00000000, 258, 0x50100000,0x00000000,
+	0x40000000,0x00000000, 259, 0x50200000,0x00000000,
+	0x40000000,0x00000000, 260, 0x50300000,0x00000000,
+	0x40000000,0x00000000, 261, 0x50400000,0x00000000,
+	0x40000000,0x00000000, 262, 0x50500000,0x00000000,
+	0x40000000,0x00000000, 263, 0x50600000,0x00000000,
+	0x40000000,0x00000000, 264, 0x50700000,0x00000000,
+	0x40000000,0x00000000, 265, 0x50800000,0x00000000,
+	0x40000000,0x00000000, 266, 0x50900000,0x00000000,
+	0x40000000,0x00000000, 267, 0x50A00000,0x00000000,
+	0x40000000,0x00000000, 268, 0x50B00000,0x00000000,
+	0x40000000,0x00000000, 269, 0x50C00000,0x00000000,
+	0x40000000,0x00000000, 270, 0x50D00000,0x00000000,
+	0x40000000,0x00000000, 271, 0x50E00000,0x00000000,
+	0x40000000,0x00000000, 272, 0x50F00000,0x00000000,
+	0x40000000,0x00000000, 273, 0x51000000,0x00000000,
+	0x40000000,0x00000000, 274, 0x51100000,0x00000000,
+	0x40000000,0x00000000, 275, 0x51200000,0x00000000,
+	0x40000000,0x00000000, 276, 0x51300000,0x00000000,
+	0x40000000,0x00000000, 277, 0x51400000,0x00000000,
+	0x40000000,0x00000000, 278, 0x51500000,0x00000000,
+	0x40000000,0x00000000, 279, 0x51600000,0x00000000,
+	0x40000000,0x00000000, 280, 0x51700000,0x00000000,
+	0x40000000,0x00000000, 281, 0x51800000,0x00000000,
+	0x40000000,0x00000000, 282, 0x51900000,0x00000000,
+	0x40000000,0x00000000, 283, 0x51A00000,0x00000000,
+	0x40000000,0x00000000, 284, 0x51B00000,0x00000000,
+	0x40000000,0x00000000, 285, 0x51C00000,0x00000000,
+	0x40000000,0x00000000, 286, 0x51D00000,0x00000000,
+	0x40000000,0x00000000, 287, 0x51E00000,0x00000000,
+	0x40000000,0x00000000, 288, 0x51F00000,0x00000000,
+	0x40000000,0x00000000, 289, 0x52000000,0x00000000,
+	0x40000000,0x00000000, 290, 0x52100000,0x00000000,
+	0x40000000,0x00000000, 291, 0x52200000,0x00000000,
+	0x40000000,0x00000000, 292, 0x52300000,0x00000000,
+	0x40000000,0x00000000, 293, 0x52400000,0x00000000,
+	0x40000000,0x00000000, 294, 0x52500000,0x00000000,
+	0x40000000,0x00000000, 295, 0x52600000,0x00000000,
+	0x40000000,0x00000000, 296, 0x52700000,0x00000000,
+	0x40000000,0x00000000, 297, 0x52800000,0x00000000,
+	0x40000000,0x00000000, 298, 0x52900000,0x00000000,
+	0x40000000,0x00000000, 299, 0x52A00000,0x00000000,
+	0x40000000,0x00000000, 300, 0x52B00000,0x00000000,
+	0x40080000,0x00000000, 2, 0x40220000,0x00000000,
+	0x40080000,0x00000000, 3, 0x403B0000,0x00000000,
+	0x40080000,0x00000000, 4, 0x40544000,0x00000000,
+	0x40080000,0x00000000, 5, 0x406E6000,0x00000000,
+	0x40080000,0x00000000, 6, 0x4086C800,0x00000000,
+	0x40080000,0x00000000, 7, 0x40A11600,0x00000000,
+	0x40080000,0x00000000, 8, 0x40B9A100,0x00000000,
+	0x40080000,0x00000000, 9, 0x40D338C0,0x00000000,
+	0x40080000,0x00000000, 10, 0x40ECD520,0x00000000,
+	0x40080000,0x00000000, 11, 0x41059FD8,0x00000000,
+	0x40080000,0x00000000, 12, 0x412037E2,0x00000000,
+	0x40080000,0x00000000, 13, 0x413853D3,0x00000000,
+	0x40080000,0x00000000, 14, 0x41523EDE,0x40000000,
+	0x40080000,0x00000000, 15, 0x416B5E4D,0x60000000,
+	0x40080000,0x00000000, 16, 0x418486BA,0x08000000,
+	0x40080000,0x00000000, 17, 0x419ECA17,0x0C000000,
+	0x40080000,0x00000000, 18, 0x41B71791,0x49000000,
+	0x40080000,0x00000000, 19, 0x41D151AC,0xF6C00000,
+	0x40080000,0x00000000, 20, 0x41E9FA83,0x72200000,
+	0x40080000,0x00000000, 21, 0x42037BE2,0x95980000,
+	0x40080000,0x00000000, 22, 0x421D39D3,0xE0640000,
+	0x40080000,0x00000000, 23, 0x4235EB5E,0xE84B0000,
+	0x40080000,0x00000000, 24, 0x42507087,0x2E384000,
+	0x40080000,0x00000000, 25, 0x4268A8CA,0xC5546000,
+	0x40080000,0x00000000, 26, 0x42827E98,0x13FF4800,
+	0x40080000,0x00000000, 27, 0x429BBDE4,0x1DFEEC00,
+	0x40080000,0x00000000, 28, 0x42B4CE6B,0x167F3100,
+	0x40080000,0x00000000, 29, 0x42CF35A0,0xA1BEC980,
+	0x40080000,0x00000000, 30, 0x42E76838,0x794F1720,
+	0x40080000,0x00000000, 31, 0x43018E2A,0x5AFB5158,
+	0x40080000,0x00000000, 32, 0x431A553F,0x8878FA04,
+	0x40080000,0x00000000, 33, 0x4333BFEF,0xA65ABB83,
+	0x40080000,0x00000000, 34, 0x434D9FE7,0x79881944,
+	0x40080000,0x00000000, 35, 0x436637ED,0x9B2612F3,
+	0x40080000,0x00000000, 36, 0x4380A9F2,0x345C8E37,
+	0x40080000,0x00000000, 37, 0x4398FEEB,0x4E8AD552,
+	0x40080000,0x00000000, 38, 0x43B2BF30,0x7AE81FFD,
+	0x40080000,0x00000000, 39, 0x43CC1EC8,0xB85C2FFC,
+	0x40080000,0x00000000, 40, 0x43E51716,0x8A4523FD,
+	0x40080000,0x00000000, 41, 0x43FFA2A1,0xCF67B5FC,
+	0x40080000,0x00000000, 42, 0x4417B9F9,0x5B8DC87D,
+	0x40080000,0x00000000, 43, 0x4431CB7B,0x04AA565D,
+	0x40080000,0x00000000, 44, 0x444AB138,0x86FF818C,
+	0x40080000,0x00000000, 45, 0x446404EA,0x653FA129,
+	0x40080000,0x00000000, 46, 0x447E075F,0x97DF71BE,
+	0x40080000,0x00000000, 47, 0x44968587,0xB1E7954E,
+	0x40080000,0x00000000, 48, 0x44B0E425,0xC56DAFFB,
+	0x40080000,0x00000000, 49, 0x44C95638,0xA82487F8,
+	0x40080000,0x00000000, 50, 0x44E300AA,0x7E1B65FA,
+	0x40080000,0x00000000, 51, 0x44FC80FF,0xBD2918F7,
+	0x40080000,0x00000000, 52, 0x451560BF,0xCDDED2B9,
+	0x40080000,0x00000000, 53, 0x4530088F,0xDA671E0B,
+	0x40080000,0x00000000, 54, 0x45480CD7,0xC79AAD11,
+	0x40080000,0x00000000, 55, 0x456209A1,0xD5B401CC,
+	0x40080000,0x00000000, 56, 0x457B0E72,0xC08E02B3,
+	0x40080000,0x00000000, 57, 0x45944AD6,0x106A8206,
+	0x40080000,0x00000000, 58, 0x45AE7041,0x189FC309,
+	0x40080000,0x00000000, 59, 0x45C6D430,0xD277D247,
+	0x40080000,0x00000000, 60, 0x45E11F24,0x9DD9DDB5,
+	0x40080000,0x00000000, 61, 0x45F9AEB6,0xECC6CC8F,
+	0x40080000,0x00000000, 62, 0x46134309,0x3195196C,
+	0x40080000,0x00000000, 63, 0x462CE48D,0xCA5FA621,
+	0x40080000,0x00000000, 64, 0x4645AB6A,0x57C7BC99,
+	0x40080000,0x00000000, 65, 0x4660408F,0xC1D5CD73,
+	0x40080000,0x00000000, 66, 0x467860D7,0xA2C0B42C,
+	0x40080000,0x00000000, 67, 0x469248A1,0xBA108721,
+	0x40080000,0x00000000, 68, 0x46AB6CF2,0x9718CAB2,
+	0x40080000,0x00000000, 69, 0x46C491B5,0xF1529805,
+	0x40080000,0x00000000, 70, 0x46DEDA90,0xE9FBE408,
+	0x40080000,0x00000000, 71, 0x46F723EC,0xAF7CEB06,
+	0x40080000,0x00000000, 72, 0x47115AF1,0x839DB044,
+	0x40080000,0x00000000, 73, 0x472A086A,0x456C8867,
+	0x40080000,0x00000000, 74, 0x4743864F,0xB411664D,
+	0x40080000,0x00000000, 75, 0x475D4977,0x8E1A1974,
+	0x40080000,0x00000000, 76, 0x4775F719,0xAA939317,
+	0x40080000,0x00000000, 77, 0x47907953,0x3FEEAE51,
+	0x40080000,0x00000000, 78, 0x47A8B5FC,0xDFE60579,
+	0x40080000,0x00000000, 79, 0x47C2887D,0xA7EC841B,
+	0x40080000,0x00000000, 80, 0x47DBCCBC,0x7BE2C629,
+	0x40080000,0x00000000, 81, 0x47F4D98D,0x5CEA149F,
+	0x40080000,0x00000000, 82, 0x480F4654,0x0B5F1EEE,
+	0x40080000,0x00000000, 83, 0x482774BF,0x08875732,
+	0x40080000,0x00000000, 84, 0x4841978F,0x46658166,
+	0x40080000,0x00000000, 85, 0x485A6356,0xE9984219,
+	0x40080000,0x00000000, 86, 0x4873CA81,0x2F323192,
+	0x40080000,0x00000000, 87, 0x488DAFC1,0xC6CB4A5C,
+	0x40080000,0x00000000, 88, 0x48A643D1,0x551877C5,
+	0x40080000,0x00000000, 89, 0x48C0B2DC,0xFFD259D4,
+	0x40080000,0x00000000, 90, 0x48D90C4B,0x7FBB86BD,
+	0x40080000,0x00000000, 91, 0x48F2C938,0x9FCCA50E,
+	0x40080000,0x00000000, 92, 0x490C2DD4,0xEFB2F795,
+	0x40080000,0x00000000, 93, 0x4925225F,0xB3C639B0,
+	0x40080000,0x00000000, 94, 0x493FB38F,0x8DA95688,
+	0x40080000,0x00000000, 95, 0x4957C6AB,0xAA3F00E6,
+	0x40080000,0x00000000, 96, 0x4971D500,0xBFAF40AC,
+	0x40080000,0x00000000, 97, 0x498ABF81,0x1F86E102,
+	0x40080000,0x00000000, 98, 0x49A40FA0,0xD7A528C2,
+	0x40080000,0x00000000, 99, 0x49BE1771,0x4377BD23,
+	0x40080000,0x00000000, 100, 0x49D69194,0xF299CDDA,
+	0x40080000,0x00000000, 101, 0x49F0ED2F,0xB5F35A64,
+	0x40080000,0x00000000, 102, 0x4A0963C7,0x90ED0795,
+	0x40080000,0x00000000, 103, 0x4A230AD5,0xACB1C5B0,
+	0x40080000,0x00000000, 104, 0x4A3C9040,0x830AA888,
+	0x40080000,0x00000000, 105, 0x4A556C30,0x6247FE66,
+	0x40080000,0x00000000, 106, 0x4A701124,0x49B5FECD,
+	0x40080000,0x00000000, 107, 0x4A8819B6,0x6E90FE33,
+	0x40080000,0x00000000, 108, 0x4AA21348,0xD2ECBEA6,
+	0x40080000,0x00000000, 109, 0x4ABB1CED,0x3C631DF9,
+	0x40080000,0x00000000, 110, 0x4AD455B1,0xED4A567B,
+	0x40080000,0x00000000, 111, 0x4AEE808A,0xE3EF81B8,
+	0x40080000,0x00000000, 112, 0x4B06E068,0x2AF3A14A,
+	0x40080000,0x00000000, 113, 0x4B21284E,0x2036B8F8,
+	0x40080000,0x00000000, 114, 0x4B39BC75,0x30521573,
+	0x40080000,0x00000000, 115, 0x4B534D57,0xE43D9017,
+	0x40080000,0x00000000, 116, 0x4B6CF403,0xD65C5822,
+	0x40080000,0x00000000, 117, 0x4B85B702,0xE0C54219,
+	0x40080000,0x00000000, 118, 0x4BA04942,0x2893F193,
+	0x40080000,0x00000000, 119, 0x4BB86DE3,0x3CDDEA5D,
+	0x40080000,0x00000000, 120, 0x4BD2526A,0x6DA66FC5,
+	0x40080000,0x00000000, 121, 0x4BEB7B9F,0xA479A7A8,
+	0x40080000,0x00000000, 122, 0x4C049CB7,0xBB5B3DBE,
+	0x40080000,0x00000000, 123, 0x4C1EEB13,0x9908DC9D,
+	0x40080000,0x00000000, 124, 0x4C37304E,0xB2C6A576,
+	0x40080000,0x00000000, 125, 0x4C51643B,0x0614FC18,
+	0x40080000,0x00000000, 126, 0x4C6A1658,0x891F7A25,
+	0x40080000,0x00000000, 127, 0x4C8390C2,0x66D79B9B,
+	0x40080000,0x00000000, 128, 0x4C9D5923,0x9A436969,
+	0x40080000,0x00000000, 129, 0x4CB602DA,0xB3B28F0F,
+	0x40080000,0x00000000, 130, 0x4CD08224,0x06C5EB4B,
+	0x40080000,0x00000000, 131, 0x4CE8C336,0x0A28E0F1,
+	0x40080000,0x00000000, 132, 0x4D029268,0x879EA8B5,
+	0x40080000,0x00000000, 133, 0x4D1BDB9C,0xCB6DFD0F,
+	0x40080000,0x00000000, 134, 0x4D34E4B5,0x98927DCB,
+	0x40080000,0x00000000, 135, 0x4D4F5710,0x64DBBCB1,
+	0x40080000,0x00000000, 136, 0x4D67814C,0x4BA4CD85,
+	0x40080000,0x00000000, 137, 0x4D81A0F9,0x38BB9A23,
+	0x40080000,0x00000000, 138, 0x4D9A7175,0xD5196735,
+	0x40080000,0x00000000, 139, 0x4DB3D518,0x5FD30D68,
+	0x40080000,0x00000000, 140, 0x4DCDBFA4,0x8FBC941C,
+	0x40080000,0x00000000, 141, 0x4DE64FBB,0x6BCD6F15,
+	0x40080000,0x00000000, 142, 0x4E00BBCC,0x90DA1350,
+	0x40080000,0x00000000, 143, 0x4E1919B2,0xD9471CF7,
+	0x40080000,0x00000000, 144, 0x4E32D346,0x22F555BA,
+	0x40080000,0x00000000, 145, 0x4E4C3CE9,0x34700096,
+	0x40080000,0x00000000, 146, 0x4E652DAE,0xE7540071,
+	0x40080000,0x00000000, 147, 0x4E7FC486,0x5AFE00A9,
+	0x40080000,0x00000000, 148, 0x4E97D364,0xC43E807F,
+	0x40080000,0x00000000, 149, 0x4EB1DE8B,0x932EE05F,
+	0x40080000,0x00000000, 150, 0x4ECACDD1,0x5CC6508F,
+	0x40080000,0x00000000, 151, 0x4EE41A5D,0x0594BC6B,
+	0x40080000,0x00000000, 152, 0x4EFE278B,0x885F1AA1,
+	0x40080000,0x00000000, 153, 0x4F169DA8,0xA64753F8,
+	0x40080000,0x00000000, 154, 0x4F30F63E,0x7CB57EFA,
+	0x40080000,0x00000000, 155, 0x4F49715D,0xBB103E77,
+	0x40080000,0x00000000, 156, 0x4F631506,0x4C4C2EDA,
+	0x40080000,0x00000000, 157, 0x4F7C9F89,0x72724646,
+	0x40080000,0x00000000, 158, 0x4F9577A7,0x15D5B4B5,
+	0x40080000,0x00000000, 159, 0x4FB019BD,0x50604788,
+	0x40080000,0x00000000, 160, 0x4FC8269B,0xF8906B4B,
+	0x40080000,0x00000000, 161, 0x4FE21CF4,0xFA6C5079,
+	0x40080000,0x00000000, 162, 0x4FFB2B6F,0x77A278B5,
+	0x40080000,0x00000000, 163, 0x50146093,0x99B9DA88,
+	0x40080000,0x00000000, 164, 0x502E90DD,0x6696C7CB,
+	0x40080000,0x00000000, 165, 0x5046ECA6,0x0CF115D9,
+	0x40080000,0x00000000, 166, 0x5061317C,0x89B4D062,
+	0x40080000,0x00000000, 167, 0x5079CA3A,0xCE8F3894,
+	0x40080000,0x00000000, 168, 0x509357AC,0x1AEB6A6F,
+	0x40080000,0x00000000, 169, 0x50AD0382,0x28611FA6,
+	0x40080000,0x00000000, 170, 0x50C5C2A1,0x9E48D7BD,
+	0x40080000,0x00000000, 171, 0x50E051F9,0x36B6A1CD,
+	0x40080000,0x00000000, 172, 0x50F87AF5,0xD211F2B4,
+	0x40080000,0x00000000, 173, 0x51125C38,0x5D8D7607,
+	0x40080000,0x00000000, 174, 0x512B8A54,0x8C54310B,
+	0x40080000,0x00000000, 175, 0x5144A7BF,0x693F24C8,
+	0x40080000,0x00000000, 176, 0x515EFB9F,0x1DDEB72C,
+	0x40080000,0x00000000, 177, 0x51773CB7,0x56670961,
+	0x40080000,0x00000000, 178, 0x51916D89,0x80CD4709,
+	0x40080000,0x00000000, 179, 0x51AA244E,0x4133EA8D,
+	0x40080000,0x00000000, 180, 0x51C39B3A,0xB0E6EFEA,
+	0x40080000,0x00000000, 181, 0x51DD68D8,0x095A67DF,
+	0x40080000,0x00000000, 182, 0x51F60EA2,0x0703CDE7,
+	0x40080000,0x00000000, 183, 0x52108AF9,0x8542DA6D,
+	0x40080000,0x00000000, 184, 0x5228D076,0x47E447A4,
+	0x40080000,0x00000000, 185, 0x52429C58,0xB5EB35BB,
+	0x40080000,0x00000000, 186, 0x525BEA85,0x10E0D098,
+	0x40080000,0x00000000, 187, 0x5274EFE3,0xCCA89C72,
+	0x40080000,0x00000000, 188, 0x528F67D5,0xB2FCEAAB,
+	0x40080000,0x00000000, 189, 0x52A78DE0,0x463DB001,
+	0x40080000,0x00000000, 190, 0x52C1AA68,0x34AE4400,
+	0x40080000,0x00000000, 191, 0x52DA7F9C,0x4F056601,
+	0x40080000,0x00000000, 192, 0x52F3DFB5,0x3B440C81,
+	0x40080000,0x00000000, 193, 0x530DCF8F,0xD8E612C1,
+	0x40080000,0x00000000, 194, 0x53265BAB,0xE2AC8E11,
+	0x40080000,0x00000000, 195, 0x5340C4C0,0xEA016A8C,
+	0x40080000,0x00000000, 196, 0x53592721,0x5F021FD3,
+	0x40080000,0x00000000, 197, 0x5372DD59,0x074197DE,
+	0x40080000,0x00000000, 198, 0x538C4C05,0x8AE263CD,
+	0x40080000,0x00000000, 199, 0x53A53904,0x2829CADA,
+	0x40080000,0x00000000, 200, 0x53BFD586,0x3C3EB047,
+	0x40080000,0x00000000, 201, 0x53D7E024,0xAD2F0435,
+	0x40080000,0x00000000, 202, 0x53F1E81B,0x81E34328,
+	0x40080000,0x00000000, 203, 0x540ADC29,0x42D4E4BC,
+	0x40080000,0x00000000, 204, 0x5424251E,0xF21FAB8D,
+	0x40080000,0x00000000, 205, 0x543E37AE,0x6B2F8153,
+	0x40080000,0x00000000, 206, 0x5456A9C2,0xD063A0FE,
+	0x40080000,0x00000000, 207, 0x5470FF52,0x1C4AB8BF,
+	0x40080000,0x00000000, 208, 0x54897EFB,0x2A70151E,
+	0x40080000,0x00000000, 209, 0x54A31F3C,0x5FD40FD7,
+	0x40080000,0x00000000, 210, 0x54BCAEDA,0x8FBE17C2,
+	0x40080000,0x00000000, 211, 0x54D58323,0xEBCE91D1,
+	0x40080000,0x00000000, 212, 0x54F0225A,0xF0DAED5D,
+	0x40080000,0x00000000, 213, 0x55083388,0x6948640C,
+	0x40080000,0x00000000, 214, 0x552226A6,0x4EF64B09,
+	0x40080000,0x00000000, 215, 0x553B39F9,0x7671708D,
+	0x40080000,0x00000000, 216, 0x55546B7B,0x18D5146A,
+	0x40080000,0x00000000, 217, 0x556EA138,0xA53F9E9F,
+	0x40080000,0x00000000, 218, 0x5586F8EA,0x7BEFB6F7,
+	0x40080000,0x00000000, 219, 0x55A13AAF,0xDCF3C939,
+	0x40080000,0x00000000, 220, 0x55B9D807,0xCB6DADD6,
+	0x40080000,0x00000000, 221, 0x55D36205,0xD8924260,
+	0x40080000,0x00000000, 222, 0x55ED1308,0xC4DB6391,
+	0x40080000,0x00000000, 223, 0x5605CE46,0x93A48AAC,
+	0x40080000,0x00000000, 224, 0x56205AB4,0xEEBB6801,
+	0x40080000,0x00000000, 225, 0x5638880F,0x66191C02,
+	0x40080000,0x00000000, 226, 0x5652660B,0x8C92D501,
+	0x40080000,0x00000000, 227, 0x566B9911,0x52DC3F82,
+	0x40080000,0x00000000, 228, 0x5684B2CC,0xFE252FA2,
+	0x40080000,0x00000000, 229, 0x569F0C33,0x7D37C772,
+	0x40080000,0x00000000, 230, 0x56B74926,0x9DE9D596,
+	0x40080000,0x00000000, 231, 0x56D176DC,0xF66F6030,
+	0x40080000,0x00000000, 232, 0x56EA324B,0x71A71049,
+	0x40080000,0x00000000, 233, 0x5703A5B8,0x953D4C36,
+	0x40080000,0x00000000, 234, 0x571D7894,0xDFDBF252,
+	0x40080000,0x00000000, 235, 0x57361A6F,0xA7E4F5BD,
+	0x40080000,0x00000000, 236, 0x575093D3,0xBDEBB84E,
+	0x40080000,0x00000000, 237, 0x5768DDBD,0x9CE19475,
+	0x40080000,0x00000000, 238, 0x5782A64E,0x35A92F58,
+	0x40080000,0x00000000, 239, 0x579BF975,0x507DC704,
+	0x40080000,0x00000000, 240, 0x57B4FB17,0xFC5E5543,
+	0x40080000,0x00000000, 241, 0x57CF78A3,0xFA8D7FE4,
+	0x40080000,0x00000000, 242, 0x57E79A7A,0xFBEA1FEB,
+	0x40080000,0x00000000, 243, 0x5801B3DC,0x3CEF97F0,
+	0x40080000,0x00000000, 244, 0x581A8DCA,0x5B6763E8,
+	0x40080000,0x00000000, 245, 0x5833EA57,0xC48D8AEE,
+	0x40080000,0x00000000, 246, 0x584DDF83,0xA6D45065,
+	0x40080000,0x00000000, 247, 0x586667A2,0xBD1F3C4C,
+	0x40080000,0x00000000, 248, 0x5880CDBA,0x0DD76D39,
+	0x40080000,0x00000000, 249, 0x58993497,0x14C323D6,
+	0x40080000,0x00000000, 250, 0x58B2E771,0x4F925AE0,
+	0x40080000,0x00000000, 251, 0x58CC5B29,0xF75B8850,
+	0x40080000,0x00000000, 252, 0x58E5445F,0x7984A63C,
+	0x40080000,0x00000000, 253, 0x58FFE68F,0x3646F95A,
+	0x40080000,0x00000000, 254, 0x5917ECEB,0x68B53B04,
+	0x40080000,0x00000000, 255, 0x5931F1B0,0x8E87EC43,
+	0x40080000,0x00000000, 256, 0x594AEA88,0xD5CBE264,
+	0x40080000,0x00000000, 257, 0x59642FE6,0xA058E9CB,
+	0x40080000,0x00000000, 258, 0x597E47D9,0xF0855EB1,
+	0x40080000,0x00000000, 259, 0x5996B5E3,0x74640705,
+	0x40080000,0x00000000, 260, 0x59B1086A,0x974B0543,
+	0x40080000,0x00000000, 261, 0x59C98C9F,0xE2F087E5,
+	0x40080000,0x00000000, 262, 0x59E32977,0xEA3465EC,
+	0x40080000,0x00000000, 263, 0x59FCBE33,0xDF4E98E2,
+	0x40080000,0x00000000, 264, 0x5A158EA6,0xE77AF2A9,
+	0x40080000,0x00000000, 265, 0x5A302AFD,0x2D9C35FF,
+	0x40080000,0x00000000, 266, 0x5A48407B,0xC46A50FE,
+	0x40080000,0x00000000, 267, 0x5A62305C,0xD34FBCBF,
+	0x40080000,0x00000000, 268, 0x5A7B488B,0x3CF79B1E,
+	0x40080000,0x00000000, 269, 0x5A947668,0x6DB9B457,
+	0x40080000,0x00000000, 270, 0x5AAEB19C,0xA4968E82,
+	0x40080000,0x00000000, 271, 0x5AC70535,0x7B70EAE2,
+	0x40080000,0x00000000, 272, 0x5AE143E8,0x1C94B029,
+	0x40080000,0x00000000, 273, 0x5AF9E5DC,0x2ADF083E,
+	0x40080000,0x00000000, 274, 0x5B136C65,0x2027462E,
+	0x40080000,0x00000000, 275, 0x5B2D2297,0xB03AE945,
+	0x40080000,0x00000000, 276, 0x5B45D9F1,0xC42C2EF4,
+	0x40080000,0x00000000, 277, 0x5B606375,0x53212337,
+	0x40080000,0x00000000, 278, 0x5B78952F,0xFCB1B4D3,
+	0x40080000,0x00000000, 279, 0x5B926FE3,0xFD85479E,
+	0x40080000,0x00000000, 280, 0x5BABA7D5,0xFC47EB6D,
+	0x40080000,0x00000000, 281, 0x5BC4BDE0,0x7D35F092,
+	0x40080000,0x00000000, 282, 0x5BDF1CD0,0xBBD0E8DB,
+	0x40080000,0x00000000, 283, 0x5BF7559C,0x8CDCAEA4,
+	0x40080000,0x00000000, 284, 0x5C118035,0x69A582FB,
+	0x40080000,0x00000000, 285, 0x5C2A4050,0x1E784478,
+	0x40080000,0x00000000, 286, 0x5C43B03C,0x16DA335A,
+	0x40080000,0x00000000, 287, 0x5C5D885A,0x22474D07,
+	0x40080000,0x00000000, 288, 0x5C762643,0x99B579C6,
+	0x40080000,0x00000000, 289, 0x5C909CB2,0xB3481B54,
+	0x40080000,0x00000000, 290, 0x5CA8EB0C,0x0CEC28FE,
+	0x40080000,0x00000000, 291, 0x5CC2B049,0x09B11EBF,
+	0x40080000,0x00000000, 292, 0x5CDC086D,0x8E89AE1E,
+	0x40080000,0x00000000, 293, 0x5CF50652,0x2AE74297,
+	0x40080000,0x00000000, 294, 0x5D0F897B,0x405AE3E2,
+	0x40080000,0x00000000, 295, 0x5D27A71C,0x70442AE9,
+	0x40080000,0x00000000, 296, 0x5D41BD55,0x5433202F,
+	0x40080000,0x00000000, 297, 0x5D5A9BFF,0xFE4CB047,
+	0x40080000,0x00000000, 298, 0x5D73F4FF,0xFEB98435,
+	0x40080000,0x00000000, 299, 0x5D8DEF7F,0xFE16464F,
+	0x40080000,0x00000000, 300, 0x5DA6739F,0xFE90B4BB,
+	0x40100000,0x00000000, 2, 0x40300000,0x00000000,
+	0x40100000,0x00000000, 3, 0x40500000,0x00000000,
+	0x40100000,0x00000000, 4, 0x40700000,0x00000000,
+	0x40100000,0x00000000, 5, 0x40900000,0x00000000,
+	0x40100000,0x00000000, 6, 0x40B00000,0x00000000,
+	0x40100000,0x00000000, 7, 0x40D00000,0x00000000,
+	0x40100000,0x00000000, 8, 0x40F00000,0x00000000,
+	0x40100000,0x00000000, 9, 0x41100000,0x00000000,
+	0x40100000,0x00000000, 10, 0x41300000,0x00000000,
+	0x40100000,0x00000000, 11, 0x41500000,0x00000000,
+	0x40100000,0x00000000, 12, 0x41700000,0x00000000,
+	0x40100000,0x00000000, 13, 0x41900000,0x00000000,
+	0x40100000,0x00000000, 14, 0x41B00000,0x00000000,
+	0x40100000,0x00000000, 15, 0x41D00000,0x00000000,
+	0x40100000,0x00000000, 16, 0x41F00000,0x00000000,
+	0x40100000,0x00000000, 17, 0x42100000,0x00000000,
+	0x40100000,0x00000000, 18, 0x42300000,0x00000000,
+	0x40100000,0x00000000, 19, 0x42500000,0x00000000,
+	0x40100000,0x00000000, 20, 0x42700000,0x00000000,
+	0x40100000,0x00000000, 21, 0x42900000,0x00000000,
+	0x40100000,0x00000000, 22, 0x42B00000,0x00000000,
+	0x40100000,0x00000000, 23, 0x42D00000,0x00000000,
+	0x40100000,0x00000000, 24, 0x42F00000,0x00000000,
+	0x40100000,0x00000000, 25, 0x43100000,0x00000000,
+	0x40100000,0x00000000, 26, 0x43300000,0x00000000,
+	0x40100000,0x00000000, 27, 0x43500000,0x00000000,
+	0x40100000,0x00000000, 28, 0x43700000,0x00000000,
+	0x40100000,0x00000000, 29, 0x43900000,0x00000000,
+	0x40100000,0x00000000, 30, 0x43B00000,0x00000000,
+	0x40100000,0x00000000, 31, 0x43D00000,0x00000000,
+	0x40100000,0x00000000, 32, 0x43F00000,0x00000000,
+	0x40100000,0x00000000, 33, 0x44100000,0x00000000,
+	0x40100000,0x00000000, 34, 0x44300000,0x00000000,
+	0x40100000,0x00000000, 35, 0x44500000,0x00000000,
+	0x40100000,0x00000000, 36, 0x44700000,0x00000000,
+	0x40100000,0x00000000, 37, 0x44900000,0x00000000,
+	0x40100000,0x00000000, 38, 0x44B00000,0x00000000,
+	0x40100000,0x00000000, 39, 0x44D00000,0x00000000,
+	0x40100000,0x00000000, 40, 0x44F00000,0x00000000,
+	0x40100000,0x00000000, 41, 0x45100000,0x00000000,
+	0x40100000,0x00000000, 42, 0x45300000,0x00000000,
+	0x40100000,0x00000000, 43, 0x45500000,0x00000000,
+	0x40100000,0x00000000, 44, 0x45700000,0x00000000,
+	0x40100000,0x00000000, 45, 0x45900000,0x00000000,
+	0x40100000,0x00000000, 46, 0x45B00000,0x00000000,
+	0x40100000,0x00000000, 47, 0x45D00000,0x00000000,
+	0x40100000,0x00000000, 48, 0x45F00000,0x00000000,
+	0x40100000,0x00000000, 49, 0x46100000,0x00000000,
+	0x40100000,0x00000000, 50, 0x46300000,0x00000000,
+	0x40100000,0x00000000, 51, 0x46500000,0x00000000,
+	0x40100000,0x00000000, 52, 0x46700000,0x00000000,
+	0x40100000,0x00000000, 53, 0x46900000,0x00000000,
+	0x40100000,0x00000000, 54, 0x46B00000,0x00000000,
+	0x40100000,0x00000000, 55, 0x46D00000,0x00000000,
+	0x40100000,0x00000000, 56, 0x46F00000,0x00000000,
+	0x40100000,0x00000000, 57, 0x47100000,0x00000000,
+	0x40100000,0x00000000, 58, 0x47300000,0x00000000,
+	0x40100000,0x00000000, 59, 0x47500000,0x00000000,
+	0x40100000,0x00000000, 60, 0x47700000,0x00000000,
+	0x40100000,0x00000000, 61, 0x47900000,0x00000000,
+	0x40100000,0x00000000, 62, 0x47B00000,0x00000000,
+	0x40100000,0x00000000, 63, 0x47D00000,0x00000000,
+	0x40100000,0x00000000, 64, 0x47F00000,0x00000000,
+	0x40100000,0x00000000, 65, 0x48100000,0x00000000,
+	0x40100000,0x00000000, 66, 0x48300000,0x00000000,
+	0x40100000,0x00000000, 67, 0x48500000,0x00000000,
+	0x40100000,0x00000000, 68, 0x48700000,0x00000000,
+	0x40100000,0x00000000, 69, 0x48900000,0x00000000,
+	0x40100000,0x00000000, 70, 0x48B00000,0x00000000,
+	0x40100000,0x00000000, 71, 0x48D00000,0x00000000,
+	0x40100000,0x00000000, 72, 0x48F00000,0x00000000,
+	0x40100000,0x00000000, 73, 0x49100000,0x00000000,
+	0x40100000,0x00000000, 74, 0x49300000,0x00000000,
+	0x40100000,0x00000000, 75, 0x49500000,0x00000000,
+	0x40100000,0x00000000, 76, 0x49700000,0x00000000,
+	0x40100000,0x00000000, 77, 0x49900000,0x00000000,
+	0x40100000,0x00000000, 78, 0x49B00000,0x00000000,
+	0x40100000,0x00000000, 79, 0x49D00000,0x00000000,
+	0x40100000,0x00000000, 80, 0x49F00000,0x00000000,
+	0x40100000,0x00000000, 81, 0x4A100000,0x00000000,
+	0x40100000,0x00000000, 82, 0x4A300000,0x00000000,
+	0x40100000,0x00000000, 83, 0x4A500000,0x00000000,
+	0x40100000,0x00000000, 84, 0x4A700000,0x00000000,
+	0x40100000,0x00000000, 85, 0x4A900000,0x00000000,
+	0x40100000,0x00000000, 86, 0x4AB00000,0x00000000,
+	0x40100000,0x00000000, 87, 0x4AD00000,0x00000000,
+	0x40100000,0x00000000, 88, 0x4AF00000,0x00000000,
+	0x40100000,0x00000000, 89, 0x4B100000,0x00000000,
+	0x40100000,0x00000000, 90, 0x4B300000,0x00000000,
+	0x40100000,0x00000000, 91, 0x4B500000,0x00000000,
+	0x40100000,0x00000000, 92, 0x4B700000,0x00000000,
+	0x40100000,0x00000000, 93, 0x4B900000,0x00000000,
+	0x40100000,0x00000000, 94, 0x4BB00000,0x00000000,
+	0x40100000,0x00000000, 95, 0x4BD00000,0x00000000,
+	0x40100000,0x00000000, 96, 0x4BF00000,0x00000000,
+	0x40100000,0x00000000, 97, 0x4C100000,0x00000000,
+	0x40100000,0x00000000, 98, 0x4C300000,0x00000000,
+	0x40100000,0x00000000, 99, 0x4C500000,0x00000000,
+	0x40100000,0x00000000, 100, 0x4C700000,0x00000000,
+	0x40100000,0x00000000, 101, 0x4C900000,0x00000000,
+	0x40100000,0x00000000, 102, 0x4CB00000,0x00000000,
+	0x40100000,0x00000000, 103, 0x4CD00000,0x00000000,
+	0x40100000,0x00000000, 104, 0x4CF00000,0x00000000,
+	0x40100000,0x00000000, 105, 0x4D100000,0x00000000,
+	0x40100000,0x00000000, 106, 0x4D300000,0x00000000,
+	0x40100000,0x00000000, 107, 0x4D500000,0x00000000,
+	0x40100000,0x00000000, 108, 0x4D700000,0x00000000,
+	0x40100000,0x00000000, 109, 0x4D900000,0x00000000,
+	0x40100000,0x00000000, 110, 0x4DB00000,0x00000000,
+	0x40100000,0x00000000, 111, 0x4DD00000,0x00000000,
+	0x40100000,0x00000000, 112, 0x4DF00000,0x00000000,
+	0x40100000,0x00000000, 113, 0x4E100000,0x00000000,
+	0x40100000,0x00000000, 114, 0x4E300000,0x00000000,
+	0x40100000,0x00000000, 115, 0x4E500000,0x00000000,
+	0x40100000,0x00000000, 116, 0x4E700000,0x00000000,
+	0x40100000,0x00000000, 117, 0x4E900000,0x00000000,
+	0x40100000,0x00000000, 118, 0x4EB00000,0x00000000,
+	0x40100000,0x00000000, 119, 0x4ED00000,0x00000000,
+	0x40100000,0x00000000, 120, 0x4EF00000,0x00000000,
+	0x40100000,0x00000000, 121, 0x4F100000,0x00000000,
+	0x40100000,0x00000000, 122, 0x4F300000,0x00000000,
+	0x40100000,0x00000000, 123, 0x4F500000,0x00000000,
+	0x40100000,0x00000000, 124, 0x4F700000,0x00000000,
+	0x40100000,0x00000000, 125, 0x4F900000,0x00000000,
+	0x40100000,0x00000000, 126, 0x4FB00000,0x00000000,
+	0x40100000,0x00000000, 127, 0x4FD00000,0x00000000,
+	0x40100000,0x00000000, 128, 0x4FF00000,0x00000000,
+	0x40100000,0x00000000, 129, 0x50100000,0x00000000,
+	0x40100000,0x00000000, 130, 0x50300000,0x00000000,
+	0x40100000,0x00000000, 131, 0x50500000,0x00000000,
+	0x40100000,0x00000000, 132, 0x50700000,0x00000000,
+	0x40100000,0x00000000, 133, 0x50900000,0x00000000,
+	0x40100000,0x00000000, 134, 0x50B00000,0x00000000,
+	0x40100000,0x00000000, 135, 0x50D00000,0x00000000,
+	0x40100000,0x00000000, 136, 0x50F00000,0x00000000,
+	0x40100000,0x00000000, 137, 0x51100000,0x00000000,
+	0x40100000,0x00000000, 138, 0x51300000,0x00000000,
+	0x40100000,0x00000000, 139, 0x51500000,0x00000000,
+	0x40100000,0x00000000, 140, 0x51700000,0x00000000,
+	0x40100000,0x00000000, 141, 0x51900000,0x00000000,
+	0x40100000,0x00000000, 142, 0x51B00000,0x00000000,
+	0x40100000,0x00000000, 143, 0x51D00000,0x00000000,
+	0x40100000,0x00000000, 144, 0x51F00000,0x00000000,
+	0x40100000,0x00000000, 145, 0x52100000,0x00000000,
+	0x40100000,0x00000000, 146, 0x52300000,0x00000000,
+	0x40100000,0x00000000, 147, 0x52500000,0x00000000,
+	0x40100000,0x00000000, 148, 0x52700000,0x00000000,
+	0x40100000,0x00000000, 149, 0x52900000,0x00000000,
+	0x40100000,0x00000000, 150, 0x52B00000,0x00000000,
+	0x40100000,0x00000000, 151, 0x52D00000,0x00000000,
+	0x40100000,0x00000000, 152, 0x52F00000,0x00000000,
+	0x40100000,0x00000000, 153, 0x53100000,0x00000000,
+	0x40100000,0x00000000, 154, 0x53300000,0x00000000,
+	0x40100000,0x00000000, 155, 0x53500000,0x00000000,
+	0x40100000,0x00000000, 156, 0x53700000,0x00000000,
+	0x40100000,0x00000000, 157, 0x53900000,0x00000000,
+	0x40100000,0x00000000, 158, 0x53B00000,0x00000000,
+	0x40100000,0x00000000, 159, 0x53D00000,0x00000000,
+	0x40100000,0x00000000, 160, 0x53F00000,0x00000000,
+	0x40100000,0x00000000, 161, 0x54100000,0x00000000,
+	0x40100000,0x00000000, 162, 0x54300000,0x00000000,
+	0x40100000,0x00000000, 163, 0x54500000,0x00000000,
+	0x40100000,0x00000000, 164, 0x54700000,0x00000000,
+	0x40100000,0x00000000, 165, 0x54900000,0x00000000,
+	0x40100000,0x00000000, 166, 0x54B00000,0x00000000,
+	0x40100000,0x00000000, 167, 0x54D00000,0x00000000,
+	0x40100000,0x00000000, 168, 0x54F00000,0x00000000,
+	0x40100000,0x00000000, 169, 0x55100000,0x00000000,
+	0x40100000,0x00000000, 170, 0x55300000,0x00000000,
+	0x40100000,0x00000000, 171, 0x55500000,0x00000000,
+	0x40100000,0x00000000, 172, 0x55700000,0x00000000,
+	0x40100000,0x00000000, 173, 0x55900000,0x00000000,
+	0x40100000,0x00000000, 174, 0x55B00000,0x00000000,
+	0x40100000,0x00000000, 175, 0x55D00000,0x00000000,
+	0x40100000,0x00000000, 176, 0x55F00000,0x00000000,
+	0x40100000,0x00000000, 177, 0x56100000,0x00000000,
+	0x40100000,0x00000000, 178, 0x56300000,0x00000000,
+	0x40100000,0x00000000, 179, 0x56500000,0x00000000,
+	0x40100000,0x00000000, 180, 0x56700000,0x00000000,
+	0x40100000,0x00000000, 181, 0x56900000,0x00000000,
+	0x40100000,0x00000000, 182, 0x56B00000,0x00000000,
+	0x40100000,0x00000000, 183, 0x56D00000,0x00000000,
+	0x40100000,0x00000000, 184, 0x56F00000,0x00000000,
+	0x40100000,0x00000000, 185, 0x57100000,0x00000000,
+	0x40100000,0x00000000, 186, 0x57300000,0x00000000,
+	0x40100000,0x00000000, 187, 0x57500000,0x00000000,
+	0x40100000,0x00000000, 188, 0x57700000,0x00000000,
+	0x40100000,0x00000000, 189, 0x57900000,0x00000000,
+	0x40100000,0x00000000, 190, 0x57B00000,0x00000000,
+	0x40100000,0x00000000, 191, 0x57D00000,0x00000000,
+	0x40100000,0x00000000, 192, 0x57F00000,0x00000000,
+	0x40100000,0x00000000, 193, 0x58100000,0x00000000,
+	0x40100000,0x00000000, 194, 0x58300000,0x00000000,
+	0x40100000,0x00000000, 195, 0x58500000,0x00000000,
+	0x40100000,0x00000000, 196, 0x58700000,0x00000000,
+	0x40100000,0x00000000, 197, 0x58900000,0x00000000,
+	0x40100000,0x00000000, 198, 0x58B00000,0x00000000,
+	0x40100000,0x00000000, 199, 0x58D00000,0x00000000,
+	0x40100000,0x00000000, 200, 0x58F00000,0x00000000,
+	0x40100000,0x00000000, 201, 0x59100000,0x00000000,
+	0x40100000,0x00000000, 202, 0x59300000,0x00000000,
+	0x40100000,0x00000000, 203, 0x59500000,0x00000000,
+	0x40100000,0x00000000, 204, 0x59700000,0x00000000,
+	0x40100000,0x00000000, 205, 0x59900000,0x00000000,
+	0x40100000,0x00000000, 206, 0x59B00000,0x00000000,
+	0x40100000,0x00000000, 207, 0x59D00000,0x00000000,
+	0x40100000,0x00000000, 208, 0x59F00000,0x00000000,
+	0x40100000,0x00000000, 209, 0x5A100000,0x00000000,
+	0x40100000,0x00000000, 210, 0x5A300000,0x00000000,
+	0x40100000,0x00000000, 211, 0x5A500000,0x00000000,
+	0x40100000,0x00000000, 212, 0x5A700000,0x00000000,
+	0x40100000,0x00000000, 213, 0x5A900000,0x00000000,
+	0x40100000,0x00000000, 214, 0x5AB00000,0x00000000,
+	0x40100000,0x00000000, 215, 0x5AD00000,0x00000000,
+	0x40100000,0x00000000, 216, 0x5AF00000,0x00000000,
+	0x40100000,0x00000000, 217, 0x5B100000,0x00000000,
+	0x40100000,0x00000000, 218, 0x5B300000,0x00000000,
+	0x40100000,0x00000000, 219, 0x5B500000,0x00000000,
+	0x40100000,0x00000000, 220, 0x5B700000,0x00000000,
+	0x40100000,0x00000000, 221, 0x5B900000,0x00000000,
+	0x40100000,0x00000000, 222, 0x5BB00000,0x00000000,
+	0x40100000,0x00000000, 223, 0x5BD00000,0x00000000,
+	0x40100000,0x00000000, 224, 0x5BF00000,0x00000000,
+	0x40100000,0x00000000, 225, 0x5C100000,0x00000000,
+	0x40100000,0x00000000, 226, 0x5C300000,0x00000000,
+	0x40100000,0x00000000, 227, 0x5C500000,0x00000000,
+	0x40100000,0x00000000, 228, 0x5C700000,0x00000000,
+	0x40100000,0x00000000, 229, 0x5C900000,0x00000000,
+	0x40100000,0x00000000, 230, 0x5CB00000,0x00000000,
+	0x40100000,0x00000000, 231, 0x5CD00000,0x00000000,
+	0x40100000,0x00000000, 232, 0x5CF00000,0x00000000,
+	0x40100000,0x00000000, 233, 0x5D100000,0x00000000,
+	0x40100000,0x00000000, 234, 0x5D300000,0x00000000,
+	0x40100000,0x00000000, 235, 0x5D500000,0x00000000,
+	0x40100000,0x00000000, 236, 0x5D700000,0x00000000,
+	0x40100000,0x00000000, 237, 0x5D900000,0x00000000,
+	0x40100000,0x00000000, 238, 0x5DB00000,0x00000000,
+	0x40100000,0x00000000, 239, 0x5DD00000,0x00000000,
+	0x40100000,0x00000000, 240, 0x5DF00000,0x00000000,
+	0x40100000,0x00000000, 241, 0x5E100000,0x00000000,
+	0x40100000,0x00000000, 242, 0x5E300000,0x00000000,
+	0x40100000,0x00000000, 243, 0x5E500000,0x00000000,
+	0x40100000,0x00000000, 244, 0x5E700000,0x00000000,
+	0x40100000,0x00000000, 245, 0x5E900000,0x00000000,
+	0x40100000,0x00000000, 246, 0x5EB00000,0x00000000,
+	0x40100000,0x00000000, 247, 0x5ED00000,0x00000000,
+	0x40100000,0x00000000, 248, 0x5EF00000,0x00000000,
+	0x40100000,0x00000000, 249, 0x5F100000,0x00000000,
+	0x40100000,0x00000000, 250, 0x5F300000,0x00000000,
+	0x40100000,0x00000000, 251, 0x5F500000,0x00000000,
+	0x40100000,0x00000000, 252, 0x5F700000,0x00000000,
+	0x40100000,0x00000000, 253, 0x5F900000,0x00000000,
+	0x40100000,0x00000000, 254, 0x5FB00000,0x00000000,
+	0x40100000,0x00000000, 255, 0x5FD00000,0x00000000,
+	0x40100000,0x00000000, 256, 0x5FF00000,0x00000000,
+	0x40100000,0x00000000, 257, 0x60100000,0x00000000,
+	0x40100000,0x00000000, 258, 0x60300000,0x00000000,
+	0x40100000,0x00000000, 259, 0x60500000,0x00000000,
+	0x40100000,0x00000000, 260, 0x60700000,0x00000000,
+	0x40100000,0x00000000, 261, 0x60900000,0x00000000,
+	0x40100000,0x00000000, 262, 0x60B00000,0x00000000,
+	0x40100000,0x00000000, 263, 0x60D00000,0x00000000,
+	0x40100000,0x00000000, 264, 0x60F00000,0x00000000,
+	0x40100000,0x00000000, 265, 0x61100000,0x00000000,
+	0x40100000,0x00000000, 266, 0x61300000,0x00000000,
+	0x40100000,0x00000000, 267, 0x61500000,0x00000000,
+	0x40100000,0x00000000, 268, 0x61700000,0x00000000,
+	0x40100000,0x00000000, 269, 0x61900000,0x00000000,
+	0x40100000,0x00000000, 270, 0x61B00000,0x00000000,
+	0x40100000,0x00000000, 271, 0x61D00000,0x00000000,
+	0x40100000,0x00000000, 272, 0x61F00000,0x00000000,
+	0x40100000,0x00000000, 273, 0x62100000,0x00000000,
+	0x40100000,0x00000000, 274, 0x62300000,0x00000000,
+	0x40100000,0x00000000, 275, 0x62500000,0x00000000,
+	0x40100000,0x00000000, 276, 0x62700000,0x00000000,
+	0x40100000,0x00000000, 277, 0x62900000,0x00000000,
+	0x40100000,0x00000000, 278, 0x62B00000,0x00000000,
+	0x40100000,0x00000000, 279, 0x62D00000,0x00000000,
+	0x40100000,0x00000000, 280, 0x62F00000,0x00000000,
+	0x40100000,0x00000000, 281, 0x63100000,0x00000000,
+	0x40100000,0x00000000, 282, 0x63300000,0x00000000,
+	0x40100000,0x00000000, 283, 0x63500000,0x00000000,
+	0x40100000,0x00000000, 284, 0x63700000,0x00000000,
+	0x40100000,0x00000000, 285, 0x63900000,0x00000000,
+	0x40100000,0x00000000, 286, 0x63B00000,0x00000000,
+	0x40100000,0x00000000, 287, 0x63D00000,0x00000000,
+	0x40100000,0x00000000, 288, 0x63F00000,0x00000000,
+	0x40100000,0x00000000, 289, 0x64100000,0x00000000,
+	0x40100000,0x00000000, 290, 0x64300000,0x00000000,
+	0x40100000,0x00000000, 291, 0x64500000,0x00000000,
+	0x40100000,0x00000000, 292, 0x64700000,0x00000000,
+	0x40100000,0x00000000, 293, 0x64900000,0x00000000,
+	0x40100000,0x00000000, 294, 0x64B00000,0x00000000,
+	0x40100000,0x00000000, 295, 0x64D00000,0x00000000,
+	0x40100000,0x00000000, 296, 0x64F00000,0x00000000,
+	0x40100000,0x00000000, 297, 0x65100000,0x00000000,
+	0x40100000,0x00000000, 298, 0x65300000,0x00000000,
+	0x40100000,0x00000000, 299, 0x65500000,0x00000000,
+	0x40100000,0x00000000, 300, 0x65700000,0x00000000,
+	0x40140000,0x00000000, 2, 0x40390000,0x00000000,
+	0x40140000,0x00000000, 3, 0x405F4000,0x00000000,
+	0x40140000,0x00000000, 4, 0x40838800,0x00000000,
+	0x40140000,0x00000000, 5, 0x40A86A00,0x00000000,
+	0x40140000,0x00000000, 6, 0x40CE8480,0x00000000,
+	0x40140000,0x00000000, 7, 0x40F312D0,0x00000000,
+	0x40140000,0x00000000, 8, 0x4117D784,0x00000000,
+	0x40140000,0x00000000, 9, 0x413DCD65,0x00000000,
+	0x40140000,0x00000000, 10, 0x4162A05F,0x20000000,
+	0x40140000,0x00000000, 11, 0x41874876,0xE8000000,
+	0x40140000,0x00000000, 12, 0x41AD1A94,0xA2000000,
+	0x40140000,0x00000000, 13, 0x41D2309C,0xE5400000,
+	0x40140000,0x00000000, 14, 0x41F6BCC4,0x1E900000,
+	0x40140000,0x00000000, 15, 0x421C6BF5,0x26340000,
+	0x40140000,0x00000000, 16, 0x4241C379,0x37E08000,
+	0x40140000,0x00000000, 17, 0x42663457,0x85D8A000,
+	0x40140000,0x00000000, 18, 0x428BC16D,0x674EC800,
+	0x40140000,0x00000000, 19, 0x42B158E4,0x60913D00,
+	0x40140000,0x00000000, 20, 0x42D5AF1D,0x78B58C40,
+	0x40140000,0x00000000, 21, 0x42FB1AE4,0xD6E2EF50,
+	0x40140000,0x00000000, 22, 0x4320F0CF,0x064DD592,
+	0x40140000,0x00000000, 23, 0x43452D02,0xC7E14AF6,
+	0x40140000,0x00000000, 24, 0x436A7843,0x79D99DB4,
+	0x40140000,0x00000000, 25, 0x43908B2A,0x2C280291,
+	0x40140000,0x00000000, 26, 0x43B4ADF4,0xB7320335,
+	0x40140000,0x00000000, 27, 0x43D9D971,0xE4FE8402,
+	0x40140000,0x00000000, 28, 0x440027E7,0x2F1F1281,
+	0x40140000,0x00000000, 29, 0x442431E0,0xFAE6D721,
+	0x40140000,0x00000000, 30, 0x44493E59,0x39A08CEA,
+	0x40140000,0x00000000, 31, 0x446F8DEF,0x8808B024,
+	0x40140000,0x00000000, 32, 0x4493B8B5,0xB5056E17,
+	0x40140000,0x00000000, 33, 0x44B8A6E3,0x2246C99C,
+	0x40140000,0x00000000, 34, 0x44DED09B,0xEAD87C03,
+	0x40140000,0x00000000, 35, 0x45034261,0x72C74D82,
+	0x40140000,0x00000000, 36, 0x452812F9,0xCF7920E3,
+	0x40140000,0x00000000, 37, 0x454E17B8,0x4357691B,
+	0x40140000,0x00000000, 38, 0x4572CED3,0x2A16A1B1,
+	0x40140000,0x00000000, 39, 0x45978287,0xF49C4A1D,
+	0x40140000,0x00000000, 40, 0x45BD6329,0xF1C35CA5,
+	0x40140000,0x00000000, 41, 0x45E25DFA,0x371A19E7,
+	0x40140000,0x00000000, 42, 0x4606F578,0xC4E0A061,
+	0x40140000,0x00000000, 43, 0x462CB2D6,0xF618C879,
+	0x40140000,0x00000000, 44, 0x4651EFC6,0x59CF7D4C,
+	0x40140000,0x00000000, 45, 0x46766BB7,0xF0435C9E,
+	0x40140000,0x00000000, 46, 0x469C06A5,0xEC5433C6,
+	0x40140000,0x00000000, 47, 0x46C18427,0xB3B4A05C,
+	0x40140000,0x00000000, 48, 0x46E5E531,0xA0A1C873,
+	0x40140000,0x00000000, 49, 0x470B5E7E,0x08CA3A8F,
+	0x40140000,0x00000000, 50, 0x47311B0E,0xC57E649A,
+	0x40140000,0x00000000, 51, 0x475561D2,0x76DDFDC0,
+	0x40140000,0x00000000, 52, 0x477ABA47,0x14957D30,
+	0x40140000,0x00000000, 53, 0x47A0B46C,0x6CDD6E3E,
+	0x40140000,0x00000000, 54, 0x47C4E187,0x8814C9CE,
+	0x40140000,0x00000000, 55, 0x47EA19E9,0x6A19FC41,
+	0x40140000,0x00000000, 56, 0x48105031,0xE2503DA9,
+	0x40140000,0x00000000, 57, 0x4834643E,0x5AE44D13,
+	0x40140000,0x00000000, 58, 0x48597D4D,0xF19D6057,
+	0x40140000,0x00000000, 59, 0x487FDCA1,0x6E04B86D,
+	0x40140000,0x00000000, 60, 0x48A3E9E4,0xE4C2F344,
+	0x40140000,0x00000000, 61, 0x48C8E45E,0x1DF3B015,
+	0x40140000,0x00000000, 62, 0x48EF1D75,0xA5709C1B,
+	0x40140000,0x00000000, 63, 0x49137269,0x87666191,
+	0x40140000,0x00000000, 64, 0x49384F03,0xE93FF9F5,
+	0x40140000,0x00000000, 65, 0x495E62C4,0xE38FF872,
+	0x40140000,0x00000000, 66, 0x4982FDBB,0x0E39FB47,
+	0x40140000,0x00000000, 67, 0x49A7BD29,0xD1C87A19,
+	0x40140000,0x00000000, 68, 0x49CDAC74,0x463A989F,
+	0x40140000,0x00000000, 69, 0x49F28BC8,0xABE49F64,
+	0x40140000,0x00000000, 70, 0x4A172EBA,0xD6DDC73D,
+	0x40140000,0x00000000, 71, 0x4A3CFA69,0x8C95390C,
+	0x40140000,0x00000000, 72, 0x4A621C81,0xF7DD43A7,
+	0x40140000,0x00000000, 73, 0x4A86A3A2,0x75D49491,
+	0x40140000,0x00000000, 74, 0x4AAC4C8B,0x1349B9B5,
+	0x40140000,0x00000000, 75, 0x4AD1AFD6,0xEC0E1411,
+	0x40140000,0x00000000, 76, 0x4AF61BCC,0xA7119916,
+	0x40140000,0x00000000, 77, 0x4B1BA2BF,0xD0D5FF5B,
+	0x40140000,0x00000000, 78, 0x4B4145B7,0xE285BF99,
+	0x40140000,0x00000000, 79, 0x4B659725,0xDB272F7F,
+	0x40140000,0x00000000, 80, 0x4B8AFCEF,0x51F0FB5F,
+	0x40140000,0x00000000, 81, 0x4BB0DE15,0x93369D1B,
+	0x40140000,0x00000000, 82, 0x4BD5159A,0xF8044462,
+	0x40140000,0x00000000, 83, 0x4BFA5B01,0xB605557B,
+	0x40140000,0x00000000, 84, 0x4C2078E1,0x11C3556D,
+	0x40140000,0x00000000, 85, 0x4C449719,0x56342AC8,
+	0x40140000,0x00000000, 86, 0x4C69BCDF,0xABC1357A,
+	0x40140000,0x00000000, 87, 0x4C90160B,0xCB58C16C,
+	0x40140000,0x00000000, 88, 0x4CB41B8E,0xBE2EF1C7,
+	0x40140000,0x00000000, 89, 0x4CD92272,0x6DBAAE39,
+	0x40140000,0x00000000, 90, 0x4CFF6B0F,0x092959C7,
+	0x40140000,0x00000000, 91, 0x4D23A2E9,0x65B9D81D,
+	0x40140000,0x00000000, 92, 0x4D488BA3,0xBF284E24,
+	0x40140000,0x00000000, 93, 0x4D6EAE8C,0xAEF261AD,
+	0x40140000,0x00000000, 94, 0x4D932D17,0xED577D0C,
+	0x40140000,0x00000000, 95, 0x4DB7F85D,0xE8AD5C4F,
+	0x40140000,0x00000000, 96, 0x4DDDF675,0x62D8B363,
+	0x40140000,0x00000000, 97, 0x4E02BA09,0x5DC7701E,
+	0x40140000,0x00000000, 98, 0x4E27688B,0xB5394C25,
+	0x40140000,0x00000000, 99, 0x4E4D42AE,0xA2879F2E,
+	0x40140000,0x00000000, 100, 0x4E7249AD,0x2594C37D,
+	0x40140000,0x00000000, 101, 0x4E96DC18,0x6EF9F45C,
+	0x40140000,0x00000000, 102, 0x4EBC931E,0x8AB87173,
+	0x40140000,0x00000000, 103, 0x4EE1DBF3,0x16B346E8,
+	0x40140000,0x00000000, 104, 0x4F0652EF,0xDC6018A2,
+	0x40140000,0x00000000, 105, 0x4F2BE7AB,0xD3781ECA,
+	0x40140000,0x00000000, 106, 0x4F5170CB,0x642B133F,
+	0x40140000,0x00000000, 107, 0x4F75CCFE,0x3D35D80E,
+	0x40140000,0x00000000, 108, 0x4F9B403D,0xCC834E12,
+	0x40140000,0x00000000, 109, 0x4FC10826,0x9FD210CB,
+	0x40140000,0x00000000, 110, 0x4FE54A30,0x47C694FE,
+	0x40140000,0x00000000, 111, 0x500A9CBC,0x59B83A3D,
+	0x40140000,0x00000000, 112, 0x5030A1F5,0xB8132466,
+	0x40140000,0x00000000, 113, 0x5054CA73,0x2617ED80,
+	0x40140000,0x00000000, 114, 0x5079FD0F,0xEF9DE8E0,
+	0x40140000,0x00000000, 115, 0x50A03E29,0xF5C2B18C,
+	0x40140000,0x00000000, 116, 0x50C44DB4,0x73335DEF,
+	0x40140000,0x00000000, 117, 0x50E96121,0x9000356B,
+	0x40140000,0x00000000, 118, 0x510FB969,0xF40042C5,
+	0x40140000,0x00000000, 119, 0x5133D3E2,0x388029BB,
+	0x40140000,0x00000000, 120, 0x5158C8DA,0xC6A0342A,
+	0x40140000,0x00000000, 121, 0x517EFB11,0x78484135,
+	0x40140000,0x00000000, 122, 0x51A35CEA,0xEB2D28C1,
+	0x40140000,0x00000000, 123, 0x51C83425,0xA5F872F1,
+	0x40140000,0x00000000, 124, 0x51EE412F,0x0F768FAD,
+	0x40140000,0x00000000, 125, 0x5212E8BD,0x69AA19CC,
+	0x40140000,0x00000000, 126, 0x5237A2EC,0xC414A03F,
+	0x40140000,0x00000000, 127, 0x525D8BA7,0xF519C84F,
+	0x40140000,0x00000000, 128, 0x52827748,0xF9301D32,
+	0x40140000,0x00000000, 129, 0x52A7151B,0x377C247E,
+	0x40140000,0x00000000, 130, 0x52CCDA62,0x055B2D9E,
+	0x40140000,0x00000000, 131, 0x52F2087D,0x4358FC82,
+	0x40140000,0x00000000, 132, 0x53168A9C,0x942F3BA3,
+	0x40140000,0x00000000, 133, 0x533C2D43,0xB93B0A8C,
+	0x40140000,0x00000000, 134, 0x53619C4A,0x53C4E697,
+	0x40140000,0x00000000, 135, 0x5386035C,0xE8B6203D,
+	0x40140000,0x00000000, 136, 0x53AB8434,0x22E3A84D,
+	0x40140000,0x00000000, 137, 0x53D132A0,0x95CE4930,
+	0x40140000,0x00000000, 138, 0x53F57F48,0xBB41DB7C,
+	0x40140000,0x00000000, 139, 0x541ADF1A,0xEA12525B,
+	0x40140000,0x00000000, 140, 0x5440CB70,0xD24B7379,
+	0x40140000,0x00000000, 141, 0x5464FE4D,0x06DE5057,
+	0x40140000,0x00000000, 142, 0x548A3DE0,0x4895E46D,
+	0x40140000,0x00000000, 143, 0x54B066AC,0x2D5DAEC4,
+	0x40140000,0x00000000, 144, 0x54D48057,0x38B51A75,
+	0x40140000,0x00000000, 145, 0x54F9A06D,0x06E26112,
+	0x40140000,0x00000000, 146, 0x55200444,0x244D7CAB,
+	0x40140000,0x00000000, 147, 0x55440555,0x2D60DBD6,
+	0x40140000,0x00000000, 148, 0x556906AA,0x78B912CC,
+	0x40140000,0x00000000, 149, 0x558F4855,0x16E7577F,
+	0x40140000,0x00000000, 150, 0x55B38D35,0x2E5096AF,
+	0x40140000,0x00000000, 151, 0x55D87082,0x79E4BC5B,
+	0x40140000,0x00000000, 152, 0x55FE8CA3,0x185DEB72,
+	0x40140000,0x00000000, 153, 0x562317E5,0xEF3AB327,
+	0x40140000,0x00000000, 154, 0x5647DDDF,0x6B095FF1,
+	0x40140000,0x00000000, 155, 0x566DD557,0x45CBB7ED,
+	0x40140000,0x00000000, 156, 0x5692A556,0x8B9F52F4,
+	0x40140000,0x00000000, 157, 0x56B74EAC,0x2E8727B1,
+	0x40140000,0x00000000, 158, 0x56DD2257,0x3A28F19D,
+	0x40140000,0x00000000, 159, 0x57023576,0x84599702,
+	0x40140000,0x00000000, 160, 0x5726C2D4,0x256FFCC3,
+	0x40140000,0x00000000, 161, 0x574C7389,0x2ECBFBF4,
+	0x40140000,0x00000000, 162, 0x5771C835,0xBD3F7D78,
+	0x40140000,0x00000000, 163, 0x57963A43,0x2C8F5CD6,
+	0x40140000,0x00000000, 164, 0x57BBC8D3,0xF7B3340C,
+	0x40140000,0x00000000, 165, 0x57E15D84,0x7AD00087,
+	0x40140000,0x00000000, 166, 0x5805B4E5,0x998400A9,
+	0x40140000,0x00000000, 167, 0x582B221E,0xFFE500D4,
+	0x40140000,0x00000000, 168, 0x5850F553,0x5FEF2084,
+	0x40140000,0x00000000, 169, 0x587532A8,0x37EAE8A5,
+	0x40140000,0x00000000, 170, 0x589A7F52,0x45E5A2CF,
+	0x40140000,0x00000000, 171, 0x58C08F93,0x6BAF85C1,
+	0x40140000,0x00000000, 172, 0x58E4B378,0x469B6732,
+	0x40140000,0x00000000, 173, 0x5909E056,0x584240FE,
+	0x40140000,0x00000000, 174, 0x59302C35,0xF729689F,
+	0x40140000,0x00000000, 175, 0x59543743,0x74F3C2C6,
+	0x40140000,0x00000000, 176, 0x59794514,0x5230B378,
+	0x40140000,0x00000000, 177, 0x599F9659,0x66BCE056,
+	0x40140000,0x00000000, 178, 0x59C3BDF7,0xE0360C36,
+	0x40140000,0x00000000, 179, 0x59E8AD75,0xD8438F43,
+	0x40140000,0x00000000, 180, 0x5A0ED8D3,0x4E547314,
+	0x40140000,0x00000000, 181, 0x5A334784,0x10F4C7EC,
+	0x40140000,0x00000000, 182, 0x5A581965,0x1531F9E8,
+	0x40140000,0x00000000, 183, 0x5A7E1FBE,0x5A7E7861,
+	0x40140000,0x00000000, 184, 0x5AA2D3D6,0xF88F0B3D,
+	0x40140000,0x00000000, 185, 0x5AC788CC,0xB6B2CE0C,
+	0x40140000,0x00000000, 186, 0x5AED6AFF,0xE45F818F,
+	0x40140000,0x00000000, 187, 0x5B1262DF,0xEEBBB0F9,
+	0x40140000,0x00000000, 188, 0x5B36FB97,0xEA6A9D38,
+	0x40140000,0x00000000, 189, 0x5B5CBA7D,0xE5054486,
+	0x40140000,0x00000000, 190, 0x5B81F48E,0xAF234AD4,
+	0x40140000,0x00000000, 191, 0x5BA671B2,0x5AEC1D89,
+	0x40140000,0x00000000, 192, 0x5BCC0E1E,0xF1A724EB,
+	0x40140000,0x00000000, 193, 0x5BF188D3,0x57087713,
+	0x40140000,0x00000000, 194, 0x5C15EB08,0x2CCA94D7,
+	0x40140000,0x00000000, 195, 0x5C3B65CA,0x37FD3A0D,
+	0x40140000,0x00000000, 196, 0x5C611F9E,0x62FE4448,
+	0x40140000,0x00000000, 197, 0x5C856785,0xFBBDD55A,
+	0x40140000,0x00000000, 198, 0x5CAAC167,0x7AAD4AB1,
+	0x40140000,0x00000000, 199, 0x5CD0B8E0,0xACAC4EAF,
+	0x40140000,0x00000000, 200, 0x5CF4E718,0xD7D7625A,
+	0x40140000,0x00000000, 201, 0x5D1A20DF,0x0DCD3AF1,
+	0x40140000,0x00000000, 202, 0x5D40548B,0x68A044D6,
+	0x40140000,0x00000000, 203, 0x5D6469AE,0x42C8560C,
+	0x40140000,0x00000000, 204, 0x5D898419,0xD37A6B8F,
+	0x40140000,0x00000000, 205, 0x5DAFE520,0x48590673,
+	0x40140000,0x00000000, 206, 0x5DD3EF34,0x2D37A408,
+	0x40140000,0x00000000, 207, 0x5DF8EB01,0x38858D0A,
+	0x40140000,0x00000000, 208, 0x5E1F25C1,0x86A6F04C,
+	0x40140000,0x00000000, 209, 0x5E437798,0xF4285630,
+	0x40140000,0x00000000, 210, 0x5E68557F,0x31326BBB,
+	0x40140000,0x00000000, 211, 0x5E8E6ADE,0xFD7F06AA,
+	0x40140000,0x00000000, 212, 0x5EB302CB,0x5E6F642A,
+	0x40140000,0x00000000, 213, 0x5ED7C37E,0x360B3D35,
+	0x40140000,0x00000000, 214, 0x5EFDB45D,0xC38E0C82,
+	0x40140000,0x00000000, 215, 0x5F2290BA,0x9A38C7D1,
+	0x40140000,0x00000000, 216, 0x5F4734E9,0x40C6F9C6,
+	0x40140000,0x00000000, 217, 0x5F6D0223,0x90F8B837,
+	0x40140000,0x00000000, 218, 0x5F922156,0x3A9B7323,
+	0x40140000,0x00000000, 219, 0x5FB6A9AB,0xC9424FEB,
+	0x40140000,0x00000000, 220, 0x5FDC5416,0xBB92E3E6,
+	0x40140000,0x00000000, 221, 0x6001B48E,0x353BCE70,
+	0x40140000,0x00000000, 222, 0x602621B1,0xC28AC20C,
+	0x40140000,0x00000000, 223, 0x604BAA1E,0x332D728F,
+	0x40140000,0x00000000, 224, 0x60714A52,0xDFFC6799,
+	0x40140000,0x00000000, 225, 0x60959CE7,0x97FB817F,
+	0x40140000,0x00000000, 226, 0x60BB0421,0x7DFA61DF,
+	0x40140000,0x00000000, 227, 0x60E0E294,0xEEBC7D2C,
+	0x40140000,0x00000000, 228, 0x61051B3A,0x2A6B9C76,
+	0x40140000,0x00000000, 229, 0x612A6208,0xB5068394,
+	0x40140000,0x00000000, 230, 0x61507D45,0x7124123D,
+	0x40140000,0x00000000, 231, 0x61749C96,0xCD6D16CC,
+	0x40140000,0x00000000, 232, 0x6199C3BC,0x80C85C7F,
+	0x40140000,0x00000000, 233, 0x61C01A55,0xD07D39CF,
+	0x40140000,0x00000000, 234, 0x61E420EB,0x449C8843,
+	0x40140000,0x00000000, 235, 0x62092926,0x15C3AA54,
+	0x40140000,0x00000000, 236, 0x622F736F,0x9B3494E9,
+	0x40140000,0x00000000, 237, 0x6253A825,0xC100DD11,
+	0x40140000,0x00000000, 238, 0x6278922F,0x31411456,
+	0x40140000,0x00000000, 239, 0x629EB6BA,0xFD91596B,
+	0x40140000,0x00000000, 240, 0x62C33234,0xDE7AD7E3,
+	0x40140000,0x00000000, 241, 0x62E7FEC2,0x16198DDC,
+	0x40140000,0x00000000, 242, 0x630DFE72,0x9B9FF153,
+	0x40140000,0x00000000, 243, 0x6332BF07,0xA143F6D4,
+	0x40140000,0x00000000, 244, 0x63576EC9,0x8994F489,
+	0x40140000,0x00000000, 245, 0x637D4A7B,0xEBFA31AB,
+	0x40140000,0x00000000, 246, 0x63A24E8D,0x737C5F0B,
+	0x40140000,0x00000000, 247, 0x63C6E230,0xD05B76CD,
+	0x40140000,0x00000000, 248, 0x63EC9ABD,0x04725481,
+	0x40140000,0x00000000, 249, 0x6411E0B6,0x22C774D0,
+	0x40140000,0x00000000, 250, 0x643658E3,0xAB795204,
+	0x40140000,0x00000000, 251, 0x645BEF1C,0x9657A686,
+	0x40140000,0x00000000, 252, 0x64817571,0xDDF6C814,
+	0x40140000,0x00000000, 253, 0x64A5D2CE,0x55747A18,
+	0x40140000,0x00000000, 254, 0x64CB4781,0xEAD1989E,
+	0x40140000,0x00000000, 255, 0x64F10CB1,0x32C2FF63,
+	0x40140000,0x00000000, 256, 0x65154FDD,0x7F73BF3C,
+	0x40140000,0x00000000, 257, 0x653AA3D4,0xDF50AF0B,
+	0x40140000,0x00000000, 258, 0x6560A665,0x0B926D67,
+	0x40140000,0x00000000, 259, 0x6584CFFE,0x4E7708C0,
+	0x40140000,0x00000000, 260, 0x65AA03FD,0xE214CAF1,
+	0x40140000,0x00000000, 261, 0x65D0427E,0xAD4CFED6,
+	0x40140000,0x00000000, 262, 0x65F4531E,0x58A03E8C,
+	0x40140000,0x00000000, 263, 0x661967E5,0xEEC84E2F,
+	0x40140000,0x00000000, 264, 0x663FC1DF,0x6A7A61BB,
+	0x40140000,0x00000000, 265, 0x6663D92B,0xA28C7D15,
+	0x40140000,0x00000000, 266, 0x6688CF76,0x8B2F9C5A,
+	0x40140000,0x00000000, 267, 0x66AF0354,0x2DFB8370,
+	0x40140000,0x00000000, 268, 0x66D36214,0x9CBD3226,
+	0x40140000,0x00000000, 269, 0x66F83A99,0xC3EC7EB0,
+	0x40140000,0x00000000, 270, 0x671E4940,0x34E79E5C,
+	0x40140000,0x00000000, 271, 0x6742EDC8,0x2110C2F9,
+	0x40140000,0x00000000, 272, 0x6767A93A,0x2954F3B8,
+	0x40140000,0x00000000, 273, 0x678D9388,0xB3AA30A5,
+	0x40140000,0x00000000, 274, 0x67B27C35,0x704A5E67,
+	0x40140000,0x00000000, 275, 0x67D71B42,0xCC5CF601,
+	0x40140000,0x00000000, 276, 0x67FCE213,0x7F743382,
+	0x40140000,0x00000000, 277, 0x68220D4C,0x2FA8A031,
+	0x40140000,0x00000000, 278, 0x6846909F,0x3B92C83D,
+	0x40140000,0x00000000, 279, 0x686C34C7,0x0A777A4D,
+	0x40140000,0x00000000, 280, 0x6891A0FC,0x668AAC70,
+	0x40140000,0x00000000, 281, 0x68B6093B,0x802D578C,
+	0x40140000,0x00000000, 282, 0x68DB8B8A,0x6038AD6F,
+	0x40140000,0x00000000, 283, 0x69013736,0x7C236C65,
+	0x40140000,0x00000000, 284, 0x69258504,0x1B2C477F,
+	0x40140000,0x00000000, 285, 0x694AE645,0x21F7595E,
+	0x40140000,0x00000000, 286, 0x6970CFEB,0x353A97DB,
+	0x40140000,0x00000000, 287, 0x699503E6,0x02893DD2,
+	0x40140000,0x00000000, 288, 0x69BA44DF,0x832B8D46,
+	0x40140000,0x00000000, 289, 0x69E06B0B,0xB1FB384C,
+	0x40140000,0x00000000, 290, 0x6A0485CE,0x9E7A065F,
+	0x40140000,0x00000000, 291, 0x6A29A742,0x461887F6,
+	0x40140000,0x00000000, 292, 0x6A500889,0x6BCF54FA,
+	0x40140000,0x00000000, 293, 0x6A740AAB,0xC6C32A38,
+	0x40140000,0x00000000, 294, 0x6A990D56,0xB873F4C7,
+	0x40140000,0x00000000, 295, 0x6ABF50AC,0x6690F1F8,
+	0x40140000,0x00000000, 296, 0x6AE3926B,0xC01A973B,
+	0x40140000,0x00000000, 297, 0x6B087706,0xB0213D0A,
+	0x40140000,0x00000000, 298, 0x6B2E94C8,0x5C298C4C,
+	0x40140000,0x00000000, 299, 0x6B531CFD,0x3999F7B0,
+	0x40140000,0x00000000, 300, 0x6B77E43C,0x8800759C,
+	0x40180000,0x00000000, 2, 0x40420000,0x00000000,
+	0x40180000,0x00000000, 3, 0x406B0000,0x00000000,
+	0x40180000,0x00000000, 4, 0x40944000,0x00000000,
+	0x40180000,0x00000000, 5, 0x40BE6000,0x00000000,
+	0x40180000,0x00000000, 6, 0x40E6C800,0x00000000,
+	0x40180000,0x00000000, 7, 0x41111600,0x00000000,
+	0x40180000,0x00000000, 8, 0x4139A100,0x00000000,
+	0x40180000,0x00000000, 9, 0x416338C0,0x00000000,
+	0x40180000,0x00000000, 10, 0x418CD520,0x00000000,
+	0x40180000,0x00000000, 11, 0x41B59FD8,0x00000000,
+	0x40180000,0x00000000, 12, 0x41E037E2,0x00000000,
+	0x40180000,0x00000000, 13, 0x420853D3,0x00000000,
+	0x40180000,0x00000000, 14, 0x42323EDE,0x40000000,
+	0x40180000,0x00000000, 15, 0x425B5E4D,0x60000000,
+	0x40180000,0x00000000, 16, 0x428486BA,0x08000000,
+	0x40180000,0x00000000, 17, 0x42AECA17,0x0C000000,
+	0x40180000,0x00000000, 18, 0x42D71791,0x49000000,
+	0x40180000,0x00000000, 19, 0x430151AC,0xF6C00000,
+	0x40180000,0x00000000, 20, 0x4329FA83,0x72200000,
+	0x40180000,0x00000000, 21, 0x43537BE2,0x95980000,
+	0x40180000,0x00000000, 22, 0x437D39D3,0xE0640000,
+	0x40180000,0x00000000, 23, 0x43A5EB5E,0xE84B0000,
+	0x40180000,0x00000000, 24, 0x43D07087,0x2E384000,
+	0x40180000,0x00000000, 25, 0x43F8A8CA,0xC5546000,
+	0x40180000,0x00000000, 26, 0x44227E98,0x13FF4800,
+	0x40180000,0x00000000, 27, 0x444BBDE4,0x1DFEEC00,
+	0x40180000,0x00000000, 28, 0x4474CE6B,0x167F3100,
+	0x40180000,0x00000000, 29, 0x449F35A0,0xA1BEC980,
+	0x40180000,0x00000000, 30, 0x44C76838,0x794F1720,
+	0x40180000,0x00000000, 31, 0x44F18E2A,0x5AFB5158,
+	0x40180000,0x00000000, 32, 0x451A553F,0x8878FA04,
+	0x40180000,0x00000000, 33, 0x4543BFEF,0xA65ABB83,
+	0x40180000,0x00000000, 34, 0x456D9FE7,0x79881944,
+	0x40180000,0x00000000, 35, 0x459637ED,0x9B2612F3,
+	0x40180000,0x00000000, 36, 0x45C0A9F2,0x345C8E37,
+	0x40180000,0x00000000, 37, 0x45E8FEEB,0x4E8AD552,
+	0x40180000,0x00000000, 38, 0x4612BF30,0x7AE81FFD,
+	0x40180000,0x00000000, 39, 0x463C1EC8,0xB85C2FFC,
+	0x40180000,0x00000000, 40, 0x46651716,0x8A4523FD,
+	0x40180000,0x00000000, 41, 0x468FA2A1,0xCF67B5FC,
+	0x40180000,0x00000000, 42, 0x46B7B9F9,0x5B8DC87D,
+	0x40180000,0x00000000, 43, 0x46E1CB7B,0x04AA565D,
+	0x40180000,0x00000000, 44, 0x470AB138,0x86FF818C,
+	0x40180000,0x00000000, 45, 0x473404EA,0x653FA129,
+	0x40180000,0x00000000, 46, 0x475E075F,0x97DF71BE,
+	0x40180000,0x00000000, 47, 0x47868587,0xB1E7954E,
+	0x40180000,0x00000000, 48, 0x47B0E425,0xC56DAFFB,
+	0x40180000,0x00000000, 49, 0x47D95638,0xA82487F8,
+	0x40180000,0x00000000, 50, 0x480300AA,0x7E1B65FA,
+	0x40180000,0x00000000, 51, 0x482C80FF,0xBD2918F7,
+	0x40180000,0x00000000, 52, 0x485560BF,0xCDDED2B9,
+	0x40180000,0x00000000, 53, 0x4880088F,0xDA671E0B,
+	0x40180000,0x00000000, 54, 0x48A80CD7,0xC79AAD11,
+	0x40180000,0x00000000, 55, 0x48D209A1,0xD5B401CC,
+	0x40180000,0x00000000, 56, 0x48FB0E72,0xC08E02B3,
+	0x40180000,0x00000000, 57, 0x49244AD6,0x106A8206,
+	0x40180000,0x00000000, 58, 0x494E7041,0x189FC309,
+	0x40180000,0x00000000, 59, 0x4976D430,0xD277D247,
+	0x40180000,0x00000000, 60, 0x49A11F24,0x9DD9DDB5,
+	0x40180000,0x00000000, 61, 0x49C9AEB6,0xECC6CC8F,
+	0x40180000,0x00000000, 62, 0x49F34309,0x3195196C,
+	0x40180000,0x00000000, 63, 0x4A1CE48D,0xCA5FA621,
+	0x40180000,0x00000000, 64, 0x4A45AB6A,0x57C7BC99,
+	0x40180000,0x00000000, 65, 0x4A70408F,0xC1D5CD73,
+	0x40180000,0x00000000, 66, 0x4A9860D7,0xA2C0B42C,
+	0x40180000,0x00000000, 67, 0x4AC248A1,0xBA108721,
+	0x40180000,0x00000000, 68, 0x4AEB6CF2,0x9718CAB2,
+	0x40180000,0x00000000, 69, 0x4B1491B5,0xF1529805,
+	0x40180000,0x00000000, 70, 0x4B3EDA90,0xE9FBE408,
+	0x40180000,0x00000000, 71, 0x4B6723EC,0xAF7CEB06,
+	0x40180000,0x00000000, 72, 0x4B915AF1,0x839DB044,
+	0x40180000,0x00000000, 73, 0x4BBA086A,0x456C8867,
+	0x40180000,0x00000000, 74, 0x4BE3864F,0xB411664D,
+	0x40180000,0x00000000, 75, 0x4C0D4977,0x8E1A1974,
+	0x40180000,0x00000000, 76, 0x4C35F719,0xAA939317,
+	0x40180000,0x00000000, 77, 0x4C607953,0x3FEEAE51,
+	0x40180000,0x00000000, 78, 0x4C88B5FC,0xDFE60579,
+	0x40180000,0x00000000, 79, 0x4CB2887D,0xA7EC841B,
+	0x40180000,0x00000000, 80, 0x4CDBCCBC,0x7BE2C629,
+	0x40180000,0x00000000, 81, 0x4D04D98D,0x5CEA149F,
+	0x40180000,0x00000000, 82, 0x4D2F4654,0x0B5F1EEE,
+	0x40180000,0x00000000, 83, 0x4D5774BF,0x08875732,
+	0x40180000,0x00000000, 84, 0x4D81978F,0x46658166,
+	0x40180000,0x00000000, 85, 0x4DAA6356,0xE9984219,
+	0x40180000,0x00000000, 86, 0x4DD3CA81,0x2F323192,
+	0x40180000,0x00000000, 87, 0x4DFDAFC1,0xC6CB4A5C,
+	0x40180000,0x00000000, 88, 0x4E2643D1,0x551877C5,
+	0x40180000,0x00000000, 89, 0x4E50B2DC,0xFFD259D4,
+	0x40180000,0x00000000, 90, 0x4E790C4B,0x7FBB86BD,
+	0x40180000,0x00000000, 91, 0x4EA2C938,0x9FCCA50E,
+	0x40180000,0x00000000, 92, 0x4ECC2DD4,0xEFB2F795,
+	0x40180000,0x00000000, 93, 0x4EF5225F,0xB3C639B0,
+	0x40180000,0x00000000, 94, 0x4F1FB38F,0x8DA95688,
+	0x40180000,0x00000000, 95, 0x4F47C6AB,0xAA3F00E6,
+	0x40180000,0x00000000, 96, 0x4F71D500,0xBFAF40AC,
+	0x40180000,0x00000000, 97, 0x4F9ABF81,0x1F86E102,
+	0x40180000,0x00000000, 98, 0x4FC40FA0,0xD7A528C2,
+	0x40180000,0x00000000, 99, 0x4FEE1771,0x4377BD23,
+	0x40180000,0x00000000, 100, 0x50169194,0xF299CDDA,
+	0x40180000,0x00000000, 101, 0x5040ED2F,0xB5F35A64,
+	0x40180000,0x00000000, 102, 0x506963C7,0x90ED0795,
+	0x40180000,0x00000000, 103, 0x50930AD5,0xACB1C5B0,
+	0x40180000,0x00000000, 104, 0x50BC9040,0x830AA888,
+	0x40180000,0x00000000, 105, 0x50E56C30,0x6247FE66,
+	0x40180000,0x00000000, 106, 0x51101124,0x49B5FECD,
+	0x40180000,0x00000000, 107, 0x513819B6,0x6E90FE33,
+	0x40180000,0x00000000, 108, 0x51621348,0xD2ECBEA6,
+	0x40180000,0x00000000, 109, 0x518B1CED,0x3C631DF9,
+	0x40180000,0x00000000, 110, 0x51B455B1,0xED4A567B,
+	0x40180000,0x00000000, 111, 0x51DE808A,0xE3EF81B8,
+	0x40180000,0x00000000, 112, 0x5206E068,0x2AF3A14A,
+	0x40180000,0x00000000, 113, 0x5231284E,0x2036B8F8,
+	0x40180000,0x00000000, 114, 0x5259BC75,0x30521573,
+	0x40180000,0x00000000, 115, 0x52834D57,0xE43D9017,
+	0x40180000,0x00000000, 116, 0x52ACF403,0xD65C5822,
+	0x40180000,0x00000000, 117, 0x52D5B702,0xE0C54219,
+	0x40180000,0x00000000, 118, 0x53004942,0x2893F193,
+	0x40180000,0x00000000, 119, 0x53286DE3,0x3CDDEA5D,
+	0x40180000,0x00000000, 120, 0x5352526A,0x6DA66FC5,
+	0x40180000,0x00000000, 121, 0x537B7B9F,0xA479A7A8,
+	0x40180000,0x00000000, 122, 0x53A49CB7,0xBB5B3DBE,
+	0x40180000,0x00000000, 123, 0x53CEEB13,0x9908DC9D,
+	0x40180000,0x00000000, 124, 0x53F7304E,0xB2C6A576,
+	0x40180000,0x00000000, 125, 0x5421643B,0x0614FC18,
+	0x40180000,0x00000000, 126, 0x544A1658,0x891F7A25,
+	0x40180000,0x00000000, 127, 0x547390C2,0x66D79B9B,
+	0x40180000,0x00000000, 128, 0x549D5923,0x9A436969,
+	0x40180000,0x00000000, 129, 0x54C602DA,0xB3B28F0F,
+	0x40180000,0x00000000, 130, 0x54F08224,0x06C5EB4B,
+	0x40180000,0x00000000, 131, 0x5518C336,0x0A28E0F1,
+	0x40180000,0x00000000, 132, 0x55429268,0x879EA8B5,
+	0x40180000,0x00000000, 133, 0x556BDB9C,0xCB6DFD0F,
+	0x40180000,0x00000000, 134, 0x5594E4B5,0x98927DCB,
+	0x40180000,0x00000000, 135, 0x55BF5710,0x64DBBCB1,
+	0x40180000,0x00000000, 136, 0x55E7814C,0x4BA4CD85,
+	0x40180000,0x00000000, 137, 0x5611A0F9,0x38BB9A23,
+	0x40180000,0x00000000, 138, 0x563A7175,0xD5196735,
+	0x40180000,0x00000000, 139, 0x5663D518,0x5FD30D68,
+	0x40180000,0x00000000, 140, 0x568DBFA4,0x8FBC941C,
+	0x40180000,0x00000000, 141, 0x56B64FBB,0x6BCD6F15,
+	0x40180000,0x00000000, 142, 0x56E0BBCC,0x90DA1350,
+	0x40180000,0x00000000, 143, 0x570919B2,0xD9471CF7,
+	0x40180000,0x00000000, 144, 0x5732D346,0x22F555BA,
+	0x40180000,0x00000000, 145, 0x575C3CE9,0x34700096,
+	0x40180000,0x00000000, 146, 0x57852DAE,0xE7540071,
+	0x40180000,0x00000000, 147, 0x57AFC486,0x5AFE00A9,
+	0x40180000,0x00000000, 148, 0x57D7D364,0xC43E807F,
+	0x40180000,0x00000000, 149, 0x5801DE8B,0x932EE05F,
+	0x40180000,0x00000000, 150, 0x582ACDD1,0x5CC6508F,
+	0x40180000,0x00000000, 151, 0x58541A5D,0x0594BC6B,
+	0x40180000,0x00000000, 152, 0x587E278B,0x885F1AA1,
+	0x40180000,0x00000000, 153, 0x58A69DA8,0xA64753F8,
+	0x40180000,0x00000000, 154, 0x58D0F63E,0x7CB57EFA,
+	0x40180000,0x00000000, 155, 0x58F9715D,0xBB103E77,
+	0x40180000,0x00000000, 156, 0x59231506,0x4C4C2EDA,
+	0x40180000,0x00000000, 157, 0x594C9F89,0x72724646,
+	0x40180000,0x00000000, 158, 0x597577A7,0x15D5B4B5,
+	0x40180000,0x00000000, 159, 0x59A019BD,0x50604788,
+	0x40180000,0x00000000, 160, 0x59C8269B,0xF8906B4B,
+	0x40180000,0x00000000, 161, 0x59F21CF4,0xFA6C5079,
+	0x40180000,0x00000000, 162, 0x5A1B2B6F,0x77A278B5,
+	0x40180000,0x00000000, 163, 0x5A446093,0x99B9DA88,
+	0x40180000,0x00000000, 164, 0x5A6E90DD,0x6696C7CB,
+	0x40180000,0x00000000, 165, 0x5A96ECA6,0x0CF115D9,
+	0x40180000,0x00000000, 166, 0x5AC1317C,0x89B4D062,
+	0x40180000,0x00000000, 167, 0x5AE9CA3A,0xCE8F3894,
+	0x40180000,0x00000000, 168, 0x5B1357AC,0x1AEB6A6F,
+	0x40180000,0x00000000, 169, 0x5B3D0382,0x28611FA6,
+	0x40180000,0x00000000, 170, 0x5B65C2A1,0x9E48D7BD,
+	0x40180000,0x00000000, 171, 0x5B9051F9,0x36B6A1CD,
+	0x40180000,0x00000000, 172, 0x5BB87AF5,0xD211F2B4,
+	0x40180000,0x00000000, 173, 0x5BE25C38,0x5D8D7607,
+	0x40180000,0x00000000, 174, 0x5C0B8A54,0x8C54310B,
+	0x40180000,0x00000000, 175, 0x5C34A7BF,0x693F24C8,
+	0x40180000,0x00000000, 176, 0x5C5EFB9F,0x1DDEB72C,
+	0x40180000,0x00000000, 177, 0x5C873CB7,0x56670961,
+	0x40180000,0x00000000, 178, 0x5CB16D89,0x80CD4709,
+	0x40180000,0x00000000, 179, 0x5CDA244E,0x4133EA8D,
+	0x40180000,0x00000000, 180, 0x5D039B3A,0xB0E6EFEA,
+	0x40180000,0x00000000, 181, 0x5D2D68D8,0x095A67DF,
+	0x40180000,0x00000000, 182, 0x5D560EA2,0x0703CDE7,
+	0x40180000,0x00000000, 183, 0x5D808AF9,0x8542DA6D,
+	0x40180000,0x00000000, 184, 0x5DA8D076,0x47E447A4,
+	0x40180000,0x00000000, 185, 0x5DD29C58,0xB5EB35BB,
+	0x40180000,0x00000000, 186, 0x5DFBEA85,0x10E0D098,
+	0x40180000,0x00000000, 187, 0x5E24EFE3,0xCCA89C72,
+	0x40180000,0x00000000, 188, 0x5E4F67D5,0xB2FCEAAB,
+	0x40180000,0x00000000, 189, 0x5E778DE0,0x463DB001,
+	0x40180000,0x00000000, 190, 0x5EA1AA68,0x34AE4400,
+	0x40180000,0x00000000, 191, 0x5ECA7F9C,0x4F056601,
+	0x40180000,0x00000000, 192, 0x5EF3DFB5,0x3B440C81,
+	0x40180000,0x00000000, 193, 0x5F1DCF8F,0xD8E612C1,
+	0x40180000,0x00000000, 194, 0x5F465BAB,0xE2AC8E11,
+	0x40180000,0x00000000, 195, 0x5F70C4C0,0xEA016A8C,
+	0x40180000,0x00000000, 196, 0x5F992721,0x5F021FD3,
+	0x40180000,0x00000000, 197, 0x5FC2DD59,0x074197DE,
+	0x40180000,0x00000000, 198, 0x5FEC4C05,0x8AE263CD,
+	0x40180000,0x00000000, 199, 0x60153904,0x2829CADA,
+	0x40180000,0x00000000, 200, 0x603FD586,0x3C3EB047,
+	0x40180000,0x00000000, 201, 0x6067E024,0xAD2F0435,
+	0x40180000,0x00000000, 202, 0x6091E81B,0x81E34328,
+	0x40180000,0x00000000, 203, 0x60BADC29,0x42D4E4BC,
+	0x40180000,0x00000000, 204, 0x60E4251E,0xF21FAB8D,
+	0x40180000,0x00000000, 205, 0x610E37AE,0x6B2F8153,
+	0x40180000,0x00000000, 206, 0x6136A9C2,0xD063A0FE,
+	0x40180000,0x00000000, 207, 0x6160FF52,0x1C4AB8BF,
+	0x40180000,0x00000000, 208, 0x61897EFB,0x2A70151E,
+	0x40180000,0x00000000, 209, 0x61B31F3C,0x5FD40FD7,
+	0x40180000,0x00000000, 210, 0x61DCAEDA,0x8FBE17C2,
+	0x40180000,0x00000000, 211, 0x62058323,0xEBCE91D1,
+	0x40180000,0x00000000, 212, 0x6230225A,0xF0DAED5D,
+	0x40180000,0x00000000, 213, 0x62583388,0x6948640C,
+	0x40180000,0x00000000, 214, 0x628226A6,0x4EF64B09,
+	0x40180000,0x00000000, 215, 0x62AB39F9,0x7671708D,
+	0x40180000,0x00000000, 216, 0x62D46B7B,0x18D5146A,
+	0x40180000,0x00000000, 217, 0x62FEA138,0xA53F9E9F,
+	0x40180000,0x00000000, 218, 0x6326F8EA,0x7BEFB6F7,
+	0x40180000,0x00000000, 219, 0x63513AAF,0xDCF3C939,
+	0x40180000,0x00000000, 220, 0x6379D807,0xCB6DADD6,
+	0x40180000,0x00000000, 221, 0x63A36205,0xD8924260,
+	0x40180000,0x00000000, 222, 0x63CD1308,0xC4DB6391,
+	0x40180000,0x00000000, 223, 0x63F5CE46,0x93A48AAC,
+	0x40180000,0x00000000, 224, 0x64205AB4,0xEEBB6801,
+	0x40180000,0x00000000, 225, 0x6448880F,0x66191C02,
+	0x40180000,0x00000000, 226, 0x6472660B,0x8C92D501,
+	0x40180000,0x00000000, 227, 0x649B9911,0x52DC3F82,
+	0x40180000,0x00000000, 228, 0x64C4B2CC,0xFE252FA2,
+	0x40180000,0x00000000, 229, 0x64EF0C33,0x7D37C772,
+	0x40180000,0x00000000, 230, 0x65174926,0x9DE9D596,
+	0x40180000,0x00000000, 231, 0x654176DC,0xF66F6030,
+	0x40180000,0x00000000, 232, 0x656A324B,0x71A71049,
+	0x40180000,0x00000000, 233, 0x6593A5B8,0x953D4C36,
+	0x40180000,0x00000000, 234, 0x65BD7894,0xDFDBF252,
+	0x40180000,0x00000000, 235, 0x65E61A6F,0xA7E4F5BD,
+	0x40180000,0x00000000, 236, 0x661093D3,0xBDEBB84E,
+	0x40180000,0x00000000, 237, 0x6638DDBD,0x9CE19475,
+	0x40180000,0x00000000, 238, 0x6662A64E,0x35A92F58,
+	0x40180000,0x00000000, 239, 0x668BF975,0x507DC704,
+	0x40180000,0x00000000, 240, 0x66B4FB17,0xFC5E5543,
+	0x40180000,0x00000000, 241, 0x66DF78A3,0xFA8D7FE4,
+	0x40180000,0x00000000, 242, 0x67079A7A,0xFBEA1FEB,
+	0x40180000,0x00000000, 243, 0x6731B3DC,0x3CEF97F0,
+	0x40180000,0x00000000, 244, 0x675A8DCA,0x5B6763E8,
+	0x40180000,0x00000000, 245, 0x6783EA57,0xC48D8AEE,
+	0x40180000,0x00000000, 246, 0x67ADDF83,0xA6D45065,
+	0x40180000,0x00000000, 247, 0x67D667A2,0xBD1F3C4C,
+	0x40180000,0x00000000, 248, 0x6800CDBA,0x0DD76D39,
+	0x40180000,0x00000000, 249, 0x68293497,0x14C323D6,
+	0x40180000,0x00000000, 250, 0x6852E771,0x4F925AE0,
+	0x40180000,0x00000000, 251, 0x687C5B29,0xF75B8850,
+	0x40180000,0x00000000, 252, 0x68A5445F,0x7984A63C,
+	0x40180000,0x00000000, 253, 0x68CFE68F,0x3646F95A,
+	0x40180000,0x00000000, 254, 0x68F7ECEB,0x68B53B04,
+	0x40180000,0x00000000, 255, 0x6921F1B0,0x8E87EC43,
+	0x40180000,0x00000000, 256, 0x694AEA88,0xD5CBE264,
+	0x40180000,0x00000000, 257, 0x69742FE6,0xA058E9CB,
+	0x40180000,0x00000000, 258, 0x699E47D9,0xF0855EB1,
+	0x40180000,0x00000000, 259, 0x69C6B5E3,0x74640705,
+	0x40180000,0x00000000, 260, 0x69F1086A,0x974B0543,
+	0x40180000,0x00000000, 261, 0x6A198C9F,0xE2F087E5,
+	0x40180000,0x00000000, 262, 0x6A432977,0xEA3465EC,
+	0x40180000,0x00000000, 263, 0x6A6CBE33,0xDF4E98E2,
+	0x40180000,0x00000000, 264, 0x6A958EA6,0xE77AF2A9,
+	0x40180000,0x00000000, 265, 0x6AC02AFD,0x2D9C35FF,
+	0x40180000,0x00000000, 266, 0x6AE8407B,0xC46A50FE,
+	0x40180000,0x00000000, 267, 0x6B12305C,0xD34FBCBF,
+	0x40180000,0x00000000, 268, 0x6B3B488B,0x3CF79B1E,
+	0x40180000,0x00000000, 269, 0x6B647668,0x6DB9B457,
+	0x40180000,0x00000000, 270, 0x6B8EB19C,0xA4968E82,
+	0x40180000,0x00000000, 271, 0x6BB70535,0x7B70EAE2,
+	0x40180000,0x00000000, 272, 0x6BE143E8,0x1C94B029,
+	0x40180000,0x00000000, 273, 0x6C09E5DC,0x2ADF083E,
+	0x40180000,0x00000000, 274, 0x6C336C65,0x2027462E,
+	0x40180000,0x00000000, 275, 0x6C5D2297,0xB03AE945,
+	0x40180000,0x00000000, 276, 0x6C85D9F1,0xC42C2EF4,
+	0x40180000,0x00000000, 277, 0x6CB06375,0x53212337,
+	0x40180000,0x00000000, 278, 0x6CD8952F,0xFCB1B4D3,
+	0x40180000,0x00000000, 279, 0x6D026FE3,0xFD85479E,
+	0x40180000,0x00000000, 280, 0x6D2BA7D5,0xFC47EB6D,
+	0x40180000,0x00000000, 281, 0x6D54BDE0,0x7D35F092,
+	0x40180000,0x00000000, 282, 0x6D7F1CD0,0xBBD0E8DB,
+	0x40180000,0x00000000, 283, 0x6DA7559C,0x8CDCAEA4,
+	0x40180000,0x00000000, 284, 0x6DD18035,0x69A582FB,
+	0x40180000,0x00000000, 285, 0x6DFA4050,0x1E784478,
+	0x40180000,0x00000000, 286, 0x6E23B03C,0x16DA335A,
+	0x40180000,0x00000000, 287, 0x6E4D885A,0x22474D07,
+	0x40180000,0x00000000, 288, 0x6E762643,0x99B579C6,
+	0x40180000,0x00000000, 289, 0x6EA09CB2,0xB3481B54,
+	0x40180000,0x00000000, 290, 0x6EC8EB0C,0x0CEC28FE,
+	0x40180000,0x00000000, 291, 0x6EF2B049,0x09B11EBF,
+	0x40180000,0x00000000, 292, 0x6F1C086D,0x8E89AE1E,
+	0x40180000,0x00000000, 293, 0x6F450652,0x2AE74297,
+	0x40180000,0x00000000, 294, 0x6F6F897B,0x405AE3E2,
+	0x40180000,0x00000000, 295, 0x6F97A71C,0x70442AE9,
+	0x40180000,0x00000000, 296, 0x6FC1BD55,0x5433202F,
+	0x40180000,0x00000000, 297, 0x6FEA9BFF,0xFE4CB047,
+	0x40180000,0x00000000, 298, 0x7013F4FF,0xFEB98435,
+	0x40180000,0x00000000, 299, 0x703DEF7F,0xFE16464F,
+	0x40180000,0x00000000, 300, 0x7066739F,0xFE90B4BB,
+	0x401C0000,0x00000000, 2, 0x40488000,0x00000000,
+	0x401C0000,0x00000000, 3, 0x40757000,0x00000000,
+	0x401C0000,0x00000000, 4, 0x40A2C200,0x00000000,
+	0x401C0000,0x00000000, 5, 0x40D069C0,0x00000000,
+	0x401C0000,0x00000000, 6, 0x40FCB910,0x00000000,
+	0x401C0000,0x00000000, 7, 0x412921EE,0x00000000,
+	0x401C0000,0x00000000, 8, 0x4155FDB0,0x40000000,
+	0x401C0000,0x00000000, 9, 0x41833DFA,0x38000000,
+	0x401C0000,0x00000000, 10, 0x41B0D63A,0xF1000000,
+	0x401C0000,0x00000000, 11, 0x41DD76E7,0x25C00000,
+	0x401C0000,0x00000000, 12, 0x4209C80A,0x41080000,
+	0x401C0000,0x00000000, 13, 0x42368F08,0xF8E70000,
+	0x401C0000,0x00000000, 14, 0x4263BD27,0xD9CA2000,
+	0x401C0000,0x00000000, 15, 0x42914582,0xDE90DC00,
+	0x401C0000,0x00000000, 16, 0x42BE39A5,0x057D8100,
+	0x401C0000,0x00000000, 17, 0x42EA7270,0x64CDD0E0,
+	0x401C0000,0x00000000, 18, 0x43172422,0x583416C4,
+	0x401C0000,0x00000000, 19, 0x43443F9E,0x0D2D93EC,
+	0x401C0000,0x00000000, 20, 0x4371B7AA,0x4B87E16E,
+	0x401C0000,0x00000000, 21, 0x439F016A,0x042DCA81,
+	0x401C0000,0x00000000, 22, 0x43CB213C,0xC3A81131,
+	0x401C0000,0x00000000, 23, 0x43F7BD15,0x2B330F0A,
+	0x401C0000,0x00000000, 24, 0x4424C572,0x85CCAD29,
+	0x401C0000,0x00000000, 25, 0x44522CC4,0x35131784,
+	0x401C0000,0x00000000, 26, 0x447FCE57,0x5CE16927,
+	0x401C0000,0x00000000, 27, 0x44ABD48C,0x71453C02,
+	0x401C0000,0x00000000, 28, 0x44D859FA,0xE31C9482,
+	0x401C0000,0x00000000, 29, 0x45054EBB,0x86B901F2,
+	0x401C0000,0x00000000, 30, 0x4532A4E4,0x15E1E1B3,
+	0x401C0000,0x00000000, 31, 0x45605047,0x9325A57D,
+	0x401C0000,0x00000000, 32, 0x458C8C7D,0x4181E19B,
+	0x401C0000,0x00000000, 33, 0x45B8FAED,0x9951A567,
+	0x401C0000,0x00000000, 34, 0x45E5DB8F,0xE62770BA,
+	0x401C0000,0x00000000, 35, 0x4613201D,0xE96282A3,
+	0x401C0000,0x00000000, 36, 0x4640BC1A,0x2C36324F,
+	0x401C0000,0x00000000, 37, 0x466D492D,0xCD5ED80A,
+	0x401C0000,0x00000000, 38, 0x4699A008,0x13B2FD09,
+	0x401C0000,0x00000000, 39, 0x46C66C07,0x113C9D68,
+	0x401C0000,0x00000000, 40, 0x46F39E86,0x2F1509BB,
+	0x401C0000,0x00000000, 41, 0x47212AB5,0x69326883,
+	0x401C0000,0x00000000, 42, 0x474E0ABD,0x781836E6,
+	0x401C0000,0x00000000, 43, 0x477A4965,0xC9153009,
+	0x401C0000,0x00000000, 44, 0x47A70039,0x0FF28A08,
+	0x401C0000,0x00000000, 45, 0x47D42031,0xEDF438C7,
+	0x401C0000,0x00000000, 46, 0x48019C2B,0xB035B1AE,
+	0x401C0000,0x00000000, 47, 0x482ED14C,0x745DF6F1,
+	0x401C0000,0x00000000, 48, 0x485AF722,0xE5D23813,
+	0x401C0000,0x00000000, 49, 0x4887983E,0x8917F110,
+	0x401C0000,0x00000000, 50, 0x48B4A536,0xB7F4F2EE,
+	0x401C0000,0x00000000, 51, 0x48E2108F,0xE0F65490,
+	0x401C0000,0x00000000, 52, 0x490F9CFB,0xC9AF13FD,
+	0x401C0000,0x00000000, 53, 0x493BA95C,0x5079317D,
+	0x401C0000,0x00000000, 54, 0x49683430,0xC66A0B4D,
+	0x401C0000,0x00000000, 55, 0x49952DAA,0xAD9CC9E4,
+	0x401C0000,0x00000000, 56, 0x49C287F5,0x57E930A7,
+	0x401C0000,0x00000000, 57, 0x49F036F6,0xACEC0A92,
+	0x401C0000,0x00000000, 58, 0x4A1C602F,0xAE9D1280,
+	0x401C0000,0x00000000, 59, 0x4A48D429,0xB8C97030,
+	0x401C0000,0x00000000, 60, 0x4A75B9A4,0x81B0422A,
+	0x401C0000,0x00000000, 61, 0x4AA3026F,0xF17A39E5,
+	0x401C0000,0x00000000, 62, 0x4AD0A221,0xF34AF2A8,
+	0x401C0000,0x00000000, 63, 0x4AFD1BBB,0x69C328A6,
+	0x401C0000,0x00000000, 64, 0x4B297843,0xFC8AC392,
+	0x401C0000,0x00000000, 65, 0x4B56493B,0x7CF96B1F,
+	0x401C0000,0x00000000, 66, 0x4B838014,0x0D5A3DBC,
+	0x401C0000,0x00000000, 67, 0x4BB11011,0x8BAEF604,
+	0x401C0000,0x00000000, 68, 0x4BDDDC1E,0xB4722E87,
+	0x401C0000,0x00000000, 69, 0x4C0A209A,0xDDE3E8B6,
+	0x401C0000,0x00000000, 70, 0x4C36DC87,0x82276B9F,
+	0x401C0000,0x00000000, 71, 0x4C6400F6,0x91E27E2C,
+	0x401C0000,0x00000000, 72, 0x4C9180D7,0xBFA62E66,
+	0x401C0000,0x00000000, 73, 0x4CBEA179,0x8F62D133,
+	0x401C0000,0x00000000, 74, 0x4CEACD4A,0x5D76770C,
+	0x401C0000,0x00000000, 75, 0x4D1773A1,0x11C7A82B,
+	0x401C0000,0x00000000, 76, 0x4D44852C,0xEF8EB325,
+	0x401C0000,0x00000000, 77, 0x4D71F487,0x519CDCC1,
+	0x401C0000,0x00000000, 78, 0x4D9F6BEC,0xCED28251,
+	0x401C0000,0x00000000, 79, 0x4DCB7E6F,0x34F83207,
+	0x401C0000,0x00000000, 80, 0x4DF80EA1,0x4E592BC6,
+	0x401C0000,0x00000000, 81, 0x4E250CCD,0x248E064D,
+	0x401C0000,0x00000000, 82, 0x4E526B33,0x7FFC4584,
+	0x401C0000,0x00000000, 83, 0x4E801DCD,0x0FFCBCD3,
+	0x401C0000,0x00000000, 84, 0x4EAC3426,0xDBFA4A72,
+	0x401C0000,0x00000000, 85, 0x4ED8ADA2,0x007B0124,
+	0x401C0000,0x00000000, 86, 0x4F0597ED,0xC06BA0FF,
+	0x401C0000,0x00000000, 87, 0x4F32E4F0,0x085E2CDF,
+	0x401C0000,0x00000000, 88, 0x4F608852,0x07526743,
+	0x401C0000,0x00000000, 89, 0x4F8CEE8F,0x8CD034B6,
+	0x401C0000,0x00000000, 90, 0x4FB950BD,0x9B362E1F,
+	0x401C0000,0x00000000, 91, 0x4FE626A5,0xE7CF685B,
+	0x401C0000,0x00000000, 92, 0x501361D1,0x2AD57B50,
+	0x401C0000,0x00000000, 93, 0x5040F597,0x057ACBE6,
+	0x401C0000,0x00000000, 94, 0x506DADC8,0x4996E4D2,
+	0x401C0000,0x00000000, 95, 0x5099F80F,0x40640838,
+	0x401C0000,0x00000000, 96, 0x50C6B90D,0x58578731,
+	0x401C0000,0x00000000, 97, 0x50F3E1EB,0xAD4C964B,
+	0x401C0000,0x00000000, 98, 0x512165AE,0x37A30381,
+	0x401C0000,0x00000000, 99, 0x514E71F0,0xE15D4623,
+	0x401C0000,0x00000000, 100, 0x517AA3B2,0xC5319D5E,
+	0x401C0000,0x00000000, 101, 0x51A74F3C,0x6C8B69B3,
+	0x401C0000,0x00000000, 102, 0x51D46554,0xDEF9FC7C,
+	0x401C0000,0x00000000, 103, 0x5201D8AA,0x431ABCED,
+	0x401C0000,0x00000000, 104, 0x522F3B29,0xF56ECA9E,
+	0x401C0000,0x00000000, 105, 0x525B53C4,0xB6C0F14A,
+	0x401C0000,0x00000000, 106, 0x5287E94C,0x1FE8D321,
+	0x401C0000,0x00000000, 107, 0x52B4EC22,0x9BEBB8BD,
+	0x401C0000,0x00000000, 108, 0x52E24E9E,0x486E41A5,
+	0x401C0000,0x00000000, 109, 0x531004CA,0x7F607971,
+	0x401C0000,0x00000000, 110, 0x533C0862,0x5EE8D485,
+	0x401C0000,0x00000000, 111, 0x53688756,0x130BB9F5,
+	0x401C0000,0x00000000, 112, 0x5395766B,0x50AA42B6,
+	0x401C0000,0x00000000, 113, 0x53C2C79D,0xE694FA5F,
+	0x401C0000,0x00000000, 114, 0x53F06EAA,0x29C25B13,
+	0x401C0000,0x00000000, 115, 0x541CC1A9,0xC9141F62,
+	0x401C0000,0x00000000, 116, 0x54492974,0x8FF19B76,
+	0x401C0000,0x00000000, 117, 0x54760445,0xFDF36807,
+	0x401C0000,0x00000000, 118, 0x54A343BD,0x3E34FB06,
+	0x401C0000,0x00000000, 119, 0x54D0DB45,0x966E5BA5,
+	0x401C0000,0x00000000, 120, 0x54FD7FB9,0xC7412061,
+	0x401C0000,0x00000000, 121, 0x5529CFC2,0x8E58FC55,
+	0x401C0000,0x00000000, 122, 0x555695CA,0x3C8DDCCA,
+	0x401C0000,0x00000000, 123, 0x5583C310,0xF4FC2131,
+	0x401C0000,0x00000000, 124, 0x55B14AAE,0xD65C9D0B,
+	0x401C0000,0x00000000, 125, 0x55DE42B1,0xF72212D3,
+	0x401C0000,0x00000000, 126, 0x560A7A5B,0xB83DD079,
+	0x401C0000,0x00000000, 127, 0x56372B10,0x4136166A,
+	0x401C0000,0x00000000, 128, 0x566445AE,0x390F539D,
+	0x401C0000,0x00000000, 129, 0x5691BCF8,0x71ED6929,
+	0x401C0000,0x00000000, 130, 0x56BF0AB2,0xC75F7808,
+	0x401C0000,0x00000000, 131, 0x56EB295C,0x6E738907,
+	0x401C0000,0x00000000, 132, 0x5717C430,0xE0A517E6,
+	0x401C0000,0x00000000, 133, 0x5744CBAA,0xC49074E9,
+	0x401C0000,0x00000000, 134, 0x57723235,0x6BFE664C,
+	0x401C0000,0x00000000, 135, 0x579FD7DD,0x7CFD3305,
+	0x401C0000,0x00000000, 136, 0x57CBDCE1,0xCD5D8CA4,
+	0x401C0000,0x00000000, 137, 0x57F86145,0x93B1DB10,
+	0x401C0000,0x00000000, 138, 0x5825551C,0xE13B9FAE,
+	0x401C0000,0x00000000, 139, 0x5852AA79,0x45142BB8,
+	0x401C0000,0x00000000, 140, 0x5880552A,0x1C71A641,
+	0x401C0000,0x00000000, 141, 0x58AC9509,0xB1C6E2F2,
+	0x401C0000,0x00000000, 142, 0x58D90268,0x7B8E0694,
+	0x401C0000,0x00000000, 143, 0x5905E21B,0x6C1C45C1,
+	0x401C0000,0x00000000, 144, 0x593325D7,0xFE98BD09,
+	0x401C0000,0x00000000, 145, 0x5960C11C,0xFEC5A568,
+	0x401C0000,0x00000000, 146, 0x598D51F2,0xBDD9E176,
+	0x401C0000,0x00000000, 147, 0x59B9A7B4,0x661EA547,
+	0x401C0000,0x00000000, 148, 0x59E672BD,0xD95AD09E,
+	0x401C0000,0x00000000, 149, 0x5A13A466,0x1E2F768A,
+	0x401C0000,0x00000000, 150, 0x5A412FD9,0x5A6987B9,
+	0x401C0000,0x00000000, 151, 0x5A6E13BC,0x5E38AD84,
+	0x401C0000,0x00000000, 152, 0x5A9A5144,0xD27197D4,
+	0x401C0000,0x00000000, 153, 0x5AC7071C,0x382364D9,
+	0x401C0000,0x00000000, 154, 0x5AF42638,0xB11EF83E,
+	0x401C0000,0x00000000, 155, 0x5B21A171,0x9AFB1936,
+	0x401C0000,0x00000000, 156, 0x5B4EDA86,0xCF376C1F,
+	0x401C0000,0x00000000, 157, 0x5B7AFF35,0xF5507E9B,
+	0x401C0000,0x00000000, 158, 0x5BA79F4F,0x36A66EC8,
+	0x401C0000,0x00000000, 159, 0x5BD4AB65,0x4FD1A0EF,
+	0x401C0000,0x00000000, 160, 0x5C0215F8,0xA5D76CD1,
+	0x401C0000,0x00000000, 161, 0x5C2FA673,0x2238FE6D,
+	0x401C0000,0x00000000, 162, 0x5C5BB1A4,0xBDF1DEA0,
+	0x401C0000,0x00000000, 163, 0x5C883B70,0x2633A2CC,
+	0x401C0000,0x00000000, 164, 0x5CB53402,0x216D2E72,
+	0x401C0000,0x00000000, 165, 0x5CE28D81,0xDD3F88A4,
+	0x401C0000,0x00000000, 166, 0x5D103BD1,0xA1979790,
+	0x401C0000,0x00000000, 167, 0x5D3C68AE,0xDAC9493B,
+	0x401C0000,0x00000000, 168, 0x5D68DB98,0xFF702014,
+	0x401C0000,0x00000000, 169, 0x5D95C025,0xDF821C11,
+	0x401C0000,0x00000000, 170, 0x5DC30821,0x2391D88F,
+	0x401C0000,0x00000000, 171, 0x5DF0A71C,0xFF1F9D7D,
+	0x401C0000,0x00000000, 172, 0x5E1D2472,0xBE77539B,
+	0x401C0000,0x00000000, 173, 0x5E497FE4,0x66A86928,
+	0x401C0000,0x00000000, 174, 0x5E764FE7,0xD9D35C03,
+	0x401C0000,0x00000000, 175, 0x5EA385EA,0xDE98F082,
+	0x401C0000,0x00000000, 176, 0x5ED1152D,0x82C5D272,
+	0x401C0000,0x00000000, 177, 0x5EFDE50F,0xA4DA3048,
+	0x401C0000,0x00000000, 178, 0x5F2A286D,0xB03EEA3F,
+	0x401C0000,0x00000000, 179, 0x5F56E35F,0xFA370CF7,
+	0x401C0000,0x00000000, 180, 0x5F8406F3,0xFAF02B58,
+	0x401C0000,0x00000000, 181, 0x5FB18615,0x7B9225ED,
+	0x401C0000,0x00000000, 182, 0x5FDEAAA5,0x983FC25F,
+	0x401C0000,0x00000000, 183, 0x600AD550,0xE537CA13,
+	0x401C0000,0x00000000, 184, 0x60377AA6,0xC890D0D1,
+	0x401C0000,0x00000000, 185, 0x60648B51,0xEF7EB6B7,
+	0x401C0000,0x00000000, 186, 0x6091F9E7,0xB18EDFE0,
+	0x401C0000,0x00000000, 187, 0x60BF7555,0x76BA07C8,
+	0x401C0000,0x00000000, 188, 0x60EB86AA,0xC7E2C6CF,
+	0x401C0000,0x00000000, 189, 0x611815D5,0x6EE66DF5,
+	0x401C0000,0x00000000, 190, 0x6145131A,0xC109A036,
+	0x401C0000,0x00000000, 191, 0x617270B7,0x68E86C2F,
+	0x401C0000,0x00000000, 192, 0x61A022A0,0x7BCB5EA9,
+	0x401C0000,0x00000000, 193, 0x61CC3C98,0xD8A3E5A9,
+	0x401C0000,0x00000000, 194, 0x61F8B505,0xBD8F68F4,
+	0x401C0000,0x00000000, 195, 0x62259E65,0x05DD7BD5,
+	0x401C0000,0x00000000, 196, 0x6252EA98,0x6521CC5A,
+	0x401C0000,0x00000000, 197, 0x62808D45,0x587D92CF,
+	0x401C0000,0x00000000, 198, 0x62ACF739,0x5ADBC0EA,
+	0x401C0000,0x00000000, 199, 0x62D95852,0x2F8048CD,
+	0x401C0000,0x00000000, 200, 0x63062D47,0xE9903FB4,
+	0x401C0000,0x00000000, 201, 0x6333679E,0xEC5E37BD,
+	0x401C0000,0x00000000, 202, 0x6360FAAB,0x0ED270C5,
+	0x401C0000,0x00000000, 203, 0x638DB6AB,0x59F0455A,
+	0x401C0000,0x00000000, 204, 0x63B9FFD5,0xEEB23CAE,
+	0x401C0000,0x00000000, 205, 0x63E6BFDB,0x30DBF519,
+	0x401C0000,0x00000000, 206, 0x6413E7DF,0xCAC07675,
+	0x401C0000,0x00000000, 207, 0x64416AE3,0xD16867A7,
+	0x401C0000,0x00000000, 208, 0x646E7B0E,0xAE76B564,
+	0x401C0000,0x00000000, 209, 0x649AABAC,0xD8A7DEB7,
+	0x401C0000,0x00000000, 210, 0x64C75637,0x3D92E2E0,
+	0x401C0000,0x00000000, 211, 0x64F46B70,0x55E08684,
+	0x401C0000,0x00000000, 212, 0x6521DE02,0x4B2475B4,
+	0x401C0000,0x00000000, 213, 0x654F4484,0x037FCDFB,
+	0x401C0000,0x00000000, 214, 0x657B5BF3,0x830FD43B,
+	0x401C0000,0x00000000, 215, 0x65A7F075,0x12ADD9B4,
+	0x401C0000,0x00000000, 216, 0x65D4F266,0x70581E7E,
+	0x401C0000,0x00000000, 217, 0x66025419,0xA24D1AAE,
+	0x401C0000,0x00000000, 218, 0x66300996,0x6E037758,
+	0x401C0000,0x00000000, 219, 0x665C10C7,0x408610DA,
+	0x401C0000,0x00000000, 220, 0x66888EAE,0x58754EBF,
+	0x401C0000,0x00000000, 221, 0x66B57CD8,0x8D66A4E7,
+	0x401C0000,0x00000000, 222, 0x66E2CD3D,0x7BB9D04A,
+	0x401C0000,0x00000000, 223, 0x67107395,0xCC429641,
+	0x401C0000,0x00000000, 224, 0x673CCA46,0x257486F2,
+	0x401C0000,0x00000000, 225, 0x676930FD,0x60C5F613,
+	0x401C0000,0x00000000, 226, 0x67960ADD,0xB4AD3751,
+	0x401C0000,0x00000000, 227, 0x67C34981,0xFE179067,
+	0x401C0000,0x00000000, 228, 0x67F0E051,0xBE549E5A,
+	0x401C0000,0x00000000, 229, 0x681D888F,0x0D14151D,
+	0x401C0000,0x00000000, 230, 0x6849D77D,0x2B71927A,
+	0x401C0000,0x00000000, 231, 0x68769C8D,0x8603602B,
+	0x401C0000,0x00000000, 232, 0x68A3C8FB,0xD542F425,
+	0x401C0000,0x00000000, 233, 0x68D14FDC,0x5A9A95A1,
+	0x401C0000,0x00000000, 234, 0x68FE4BC1,0x9E8E85D9,
+	0x401C0000,0x00000000, 235, 0x692A8249,0x6ABCB51E,
+	0x401C0000,0x00000000, 236, 0x69573200,0x3D651E7A,
+	0x401C0000,0x00000000, 237, 0x69844BC0,0x35B87AAB,
+	0x401C0000,0x00000000, 238, 0x69B1C248,0x2F016B56,
+	0x401C0000,0x00000000, 239, 0x69DF13FE,0x52427BD6,
+	0x401C0000,0x00000000, 240, 0x6A0B317E,0x87FA2C5B,
+	0x401C0000,0x00000000, 241, 0x6A37CB4E,0xB6FAE6D0,
+	0x401C0000,0x00000000, 242, 0x6A64D1E4,0xE01B89F6,
+	0x401C0000,0x00000000, 243, 0x6A9237A8,0x441818B7,
+	0x401C0000,0x00000000, 244, 0x6ABFE166,0x772A2B40,
+	0x401C0000,0x00000000, 245, 0x6AEBE539,0xA844E5D8,
+	0x401C0000,0x00000000, 246, 0x6B186892,0x733C491D,
+	0x401C0000,0x00000000, 247, 0x6B455B80,0x24D4BFF9,
+	0x401C0000,0x00000000, 248, 0x6B72B010,0x203A27FA,
+	0x401C0000,0x00000000, 249, 0x6BA05A0E,0x1C32E2FB,
+	0x401C0000,0x00000000, 250, 0x6BCC9D98,0xB1590D37,
+	0x401C0000,0x00000000, 251, 0x6BF909E5,0x9B2DEB90,
+	0x401C0000,0x00000000, 252, 0x6C25E8A8,0xE7C82E1E,
+	0x401C0000,0x00000000, 253, 0x6C532B93,0xCACF285A,
+	0x401C0000,0x00000000, 254, 0x6C80C621,0x5175434F,
+	0x401C0000,0x00000000, 255, 0x6CAD5ABA,0x4E8D35CB,
+	0x401C0000,0x00000000, 256, 0x6CD9AF63,0x04BB8F11,
+	0x401C0000,0x00000000, 257, 0x6D067976,0xA4241D2F,
+	0x401C0000,0x00000000, 258, 0x6D33AA47,0xCF9F9989,
+	0x401C0000,0x00000000, 259, 0x6D6134FE,0xD5ABA658,
+	0x401C0000,0x00000000, 260, 0x6D8E1CBD,0xF5EC631A,
+	0x401C0000,0x00000000, 261, 0x6DBA5926,0x372ED6B7,
+	0x401C0000,0x00000000, 262, 0x6DE70E01,0x7048FBE0,
+	0x401C0000,0x00000000, 263, 0x6E142C41,0x423FDC64,
+	0x401C0000,0x00000000, 264, 0x6E41A6B9,0x19F7E0D7,
+	0x401C0000,0x00000000, 265, 0x6E6EE3C3,0xED71C979,
+	0x401C0000,0x00000000, 266, 0x6E9B074B,0x6FC3904A,
+	0x401C0000,0x00000000, 267, 0x6EC7A662,0x01CB1E41,
+	0x401C0000,0x00000000, 268, 0x6EF4B195,0xC191BA79,
+	0x401C0000,0x00000000, 269, 0x6F221B63,0x095F832A,
+	0x401C0000,0x00000000, 270, 0x6F4FAFED,0x50672589,
+	0x401C0000,0x00000000, 271, 0x6F7BB9EF,0xA65A40D8,
+	0x401C0000,0x00000000, 272, 0x6FA842B1,0xB18EF8BD,
+	0x401C0000,0x00000000, 273, 0x6FD53A5B,0x7B5D19A5,
+	0x401C0000,0x00000000, 274, 0x70029310,0x0BF17670,
+	0x401C0000,0x00000000, 275, 0x703040AE,0x0A7347A2,
+	0x401C0000,0x00000000, 276, 0x705C7130,0x9249BD5C,
+	0x401C0000,0x00000000, 277, 0x7088E30A,0x800085B1,
+	0x401C0000,0x00000000, 278, 0x70B5C6A9,0x300074FB,
+	0x401C0000,0x00000000, 279, 0x70E30DD4,0x0A00665B,
+	0x401C0000,0x00000000, 280, 0x7110AC19,0x88C05990,
+	0x401C0000,0x00000000, 281, 0x713D2D2C,0xAF509CBC,
+	0x401C0000,0x00000000, 282, 0x71698787,0x19668924,
+	0x401C0000,0x00000000, 283, 0x71965696,0x3639B800,
+	0x401C0000,0x00000000, 284, 0x71C38BC3,0x6F728100,
+	0x401C0000,0x00000000, 285, 0x71F11A4B,0x018430E0,
+	0x401C0000,0x00000000, 286, 0x721DEE03,0x42A75588,
+	0x401C0000,0x00000000, 287, 0x724A3042,0xDA526AD7,
+	0x401C0000,0x00000000, 288, 0x7276EA3A,0x7F081D7C,
+	0x401C0000,0x00000000, 289, 0x72A40CF3,0x2F2719CC,
+	0x401C0000,0x00000000, 290, 0x72D18B54,0xC9423693,
+	0x401C0000,0x00000000, 291, 0x72FEB3D4,0x6033DF81,
+	0x401C0000,0x00000000, 292, 0x732ADD59,0xD42D6391,
+	0x401C0000,0x00000000, 293, 0x735781AE,0x99A7B71F,
+	0x401C0000,0x00000000, 294, 0x73849178,0xC672C03B,
+	0x401C0000,0x00000000, 295, 0x73B1FF49,0xADA46834,
+	0x401C0000,0x00000000, 296, 0x73DF7EC0,0xEFDFB65A,
+	0x401C0000,0x00000000, 297, 0x740B8EE8,0xD1E3BF8F,
+	0x401C0000,0x00000000, 298, 0x74381D0B,0xB7A7479D,
+	0x401C0000,0x00000000, 299, 0x7465196A,0x40B25EA9,
+	0x401C0000,0x00000000, 300, 0x7492763C,0xF89C12D4,
+	0x40200000,0x00000000, 2, 0x40500000,0x00000000,
+	0x40200000,0x00000000, 3, 0x40800000,0x00000000,
+	0x40200000,0x00000000, 4, 0x40B00000,0x00000000,
+	0x40200000,0x00000000, 5, 0x40E00000,0x00000000,
+	0x40200000,0x00000000, 6, 0x41100000,0x00000000,
+	0x40200000,0x00000000, 7, 0x41400000,0x00000000,
+	0x40200000,0x00000000, 8, 0x41700000,0x00000000,
+	0x40200000,0x00000000, 9, 0x41A00000,0x00000000,
+	0x40200000,0x00000000, 10, 0x41D00000,0x00000000,
+	0x40200000,0x00000000, 11, 0x42000000,0x00000000,
+	0x40200000,0x00000000, 12, 0x42300000,0x00000000,
+	0x40200000,0x00000000, 13, 0x42600000,0x00000000,
+	0x40200000,0x00000000, 14, 0x42900000,0x00000000,
+	0x40200000,0x00000000, 15, 0x42C00000,0x00000000,
+	0x40200000,0x00000000, 16, 0x42F00000,0x00000000,
+	0x40200000,0x00000000, 17, 0x43200000,0x00000000,
+	0x40200000,0x00000000, 18, 0x43500000,0x00000000,
+	0x40200000,0x00000000, 19, 0x43800000,0x00000000,
+	0x40200000,0x00000000, 20, 0x43B00000,0x00000000,
+	0x40200000,0x00000000, 21, 0x43E00000,0x00000000,
+	0x40200000,0x00000000, 22, 0x44100000,0x00000000,
+	0x40200000,0x00000000, 23, 0x44400000,0x00000000,
+	0x40200000,0x00000000, 24, 0x44700000,0x00000000,
+	0x40200000,0x00000000, 25, 0x44A00000,0x00000000,
+	0x40200000,0x00000000, 26, 0x44D00000,0x00000000,
+	0x40200000,0x00000000, 27, 0x45000000,0x00000000,
+	0x40200000,0x00000000, 28, 0x45300000,0x00000000,
+	0x40200000,0x00000000, 29, 0x45600000,0x00000000,
+	0x40200000,0x00000000, 30, 0x45900000,0x00000000,
+	0x40200000,0x00000000, 31, 0x45C00000,0x00000000,
+	0x40200000,0x00000000, 32, 0x45F00000,0x00000000,
+	0x40200000,0x00000000, 33, 0x46200000,0x00000000,
+	0x40200000,0x00000000, 34, 0x46500000,0x00000000,
+	0x40200000,0x00000000, 35, 0x46800000,0x00000000,
+	0x40200000,0x00000000, 36, 0x46B00000,0x00000000,
+	0x40200000,0x00000000, 37, 0x46E00000,0x00000000,
+	0x40200000,0x00000000, 38, 0x47100000,0x00000000,
+	0x40200000,0x00000000, 39, 0x47400000,0x00000000,
+	0x40200000,0x00000000, 40, 0x47700000,0x00000000,
+	0x40200000,0x00000000, 41, 0x47A00000,0x00000000,
+	0x40200000,0x00000000, 42, 0x47D00000,0x00000000,
+	0x40200000,0x00000000, 43, 0x48000000,0x00000000,
+	0x40200000,0x00000000, 44, 0x48300000,0x00000000,
+	0x40200000,0x00000000, 45, 0x48600000,0x00000000,
+	0x40200000,0x00000000, 46, 0x48900000,0x00000000,
+	0x40200000,0x00000000, 47, 0x48C00000,0x00000000,
+	0x40200000,0x00000000, 48, 0x48F00000,0x00000000,
+	0x40200000,0x00000000, 49, 0x49200000,0x00000000,
+	0x40200000,0x00000000, 50, 0x49500000,0x00000000,
+	0x40200000,0x00000000, 51, 0x49800000,0x00000000,
+	0x40200000,0x00000000, 52, 0x49B00000,0x00000000,
+	0x40200000,0x00000000, 53, 0x49E00000,0x00000000,
+	0x40200000,0x00000000, 54, 0x4A100000,0x00000000,
+	0x40200000,0x00000000, 55, 0x4A400000,0x00000000,
+	0x40200000,0x00000000, 56, 0x4A700000,0x00000000,
+	0x40200000,0x00000000, 57, 0x4AA00000,0x00000000,
+	0x40200000,0x00000000, 58, 0x4AD00000,0x00000000,
+	0x40200000,0x00000000, 59, 0x4B000000,0x00000000,
+	0x40200000,0x00000000, 60, 0x4B300000,0x00000000,
+	0x40200000,0x00000000, 61, 0x4B600000,0x00000000,
+	0x40200000,0x00000000, 62, 0x4B900000,0x00000000,
+	0x40200000,0x00000000, 63, 0x4BC00000,0x00000000,
+	0x40200000,0x00000000, 64, 0x4BF00000,0x00000000,
+	0x40200000,0x00000000, 65, 0x4C200000,0x00000000,
+	0x40200000,0x00000000, 66, 0x4C500000,0x00000000,
+	0x40200000,0x00000000, 67, 0x4C800000,0x00000000,
+	0x40200000,0x00000000, 68, 0x4CB00000,0x00000000,
+	0x40200000,0x00000000, 69, 0x4CE00000,0x00000000,
+	0x40200000,0x00000000, 70, 0x4D100000,0x00000000,
+	0x40200000,0x00000000, 71, 0x4D400000,0x00000000,
+	0x40200000,0x00000000, 72, 0x4D700000,0x00000000,
+	0x40200000,0x00000000, 73, 0x4DA00000,0x00000000,
+	0x40200000,0x00000000, 74, 0x4DD00000,0x00000000,
+	0x40200000,0x00000000, 75, 0x4E000000,0x00000000,
+	0x40200000,0x00000000, 76, 0x4E300000,0x00000000,
+	0x40200000,0x00000000, 77, 0x4E600000,0x00000000,
+	0x40200000,0x00000000, 78, 0x4E900000,0x00000000,
+	0x40200000,0x00000000, 79, 0x4EC00000,0x00000000,
+	0x40200000,0x00000000, 80, 0x4EF00000,0x00000000,
+	0x40200000,0x00000000, 81, 0x4F200000,0x00000000,
+	0x40200000,0x00000000, 82, 0x4F500000,0x00000000,
+	0x40200000,0x00000000, 83, 0x4F800000,0x00000000,
+	0x40200000,0x00000000, 84, 0x4FB00000,0x00000000,
+	0x40200000,0x00000000, 85, 0x4FE00000,0x00000000,
+	0x40200000,0x00000000, 86, 0x50100000,0x00000000,
+	0x40200000,0x00000000, 87, 0x50400000,0x00000000,
+	0x40200000,0x00000000, 88, 0x50700000,0x00000000,
+	0x40200000,0x00000000, 89, 0x50A00000,0x00000000,
+	0x40200000,0x00000000, 90, 0x50D00000,0x00000000,
+	0x40200000,0x00000000, 91, 0x51000000,0x00000000,
+	0x40200000,0x00000000, 92, 0x51300000,0x00000000,
+	0x40200000,0x00000000, 93, 0x51600000,0x00000000,
+	0x40200000,0x00000000, 94, 0x51900000,0x00000000,
+	0x40200000,0x00000000, 95, 0x51C00000,0x00000000,
+	0x40200000,0x00000000, 96, 0x51F00000,0x00000000,
+	0x40200000,0x00000000, 97, 0x52200000,0x00000000,
+	0x40200000,0x00000000, 98, 0x52500000,0x00000000,
+	0x40200000,0x00000000, 99, 0x52800000,0x00000000,
+	0x40200000,0x00000000, 100, 0x52B00000,0x00000000,
+	0x40200000,0x00000000, 101, 0x52E00000,0x00000000,
+	0x40200000,0x00000000, 102, 0x53100000,0x00000000,
+	0x40200000,0x00000000, 103, 0x53400000,0x00000000,
+	0x40200000,0x00000000, 104, 0x53700000,0x00000000,
+	0x40200000,0x00000000, 105, 0x53A00000,0x00000000,
+	0x40200000,0x00000000, 106, 0x53D00000,0x00000000,
+	0x40200000,0x00000000, 107, 0x54000000,0x00000000,
+	0x40200000,0x00000000, 108, 0x54300000,0x00000000,
+	0x40200000,0x00000000, 109, 0x54600000,0x00000000,
+	0x40200000,0x00000000, 110, 0x54900000,0x00000000,
+	0x40200000,0x00000000, 111, 0x54C00000,0x00000000,
+	0x40200000,0x00000000, 112, 0x54F00000,0x00000000,
+	0x40200000,0x00000000, 113, 0x55200000,0x00000000,
+	0x40200000,0x00000000, 114, 0x55500000,0x00000000,
+	0x40200000,0x00000000, 115, 0x55800000,0x00000000,
+	0x40200000,0x00000000, 116, 0x55B00000,0x00000000,
+	0x40200000,0x00000000, 117, 0x55E00000,0x00000000,
+	0x40200000,0x00000000, 118, 0x56100000,0x00000000,
+	0x40200000,0x00000000, 119, 0x56400000,0x00000000,
+	0x40200000,0x00000000, 120, 0x56700000,0x00000000,
+	0x40200000,0x00000000, 121, 0x56A00000,0x00000000,
+	0x40200000,0x00000000, 122, 0x56D00000,0x00000000,
+	0x40200000,0x00000000, 123, 0x57000000,0x00000000,
+	0x40200000,0x00000000, 124, 0x57300000,0x00000000,
+	0x40200000,0x00000000, 125, 0x57600000,0x00000000,
+	0x40200000,0x00000000, 126, 0x57900000,0x00000000,
+	0x40200000,0x00000000, 127, 0x57C00000,0x00000000,
+	0x40200000,0x00000000, 128, 0x57F00000,0x00000000,
+	0x40200000,0x00000000, 129, 0x58200000,0x00000000,
+	0x40200000,0x00000000, 130, 0x58500000,0x00000000,
+	0x40200000,0x00000000, 131, 0x58800000,0x00000000,
+	0x40200000,0x00000000, 132, 0x58B00000,0x00000000,
+	0x40200000,0x00000000, 133, 0x58E00000,0x00000000,
+	0x40200000,0x00000000, 134, 0x59100000,0x00000000,
+	0x40200000,0x00000000, 135, 0x59400000,0x00000000,
+	0x40200000,0x00000000, 136, 0x59700000,0x00000000,
+	0x40200000,0x00000000, 137, 0x59A00000,0x00000000,
+	0x40200000,0x00000000, 138, 0x59D00000,0x00000000,
+	0x40200000,0x00000000, 139, 0x5A000000,0x00000000,
+	0x40200000,0x00000000, 140, 0x5A300000,0x00000000,
+	0x40200000,0x00000000, 141, 0x5A600000,0x00000000,
+	0x40200000,0x00000000, 142, 0x5A900000,0x00000000,
+	0x40200000,0x00000000, 143, 0x5AC00000,0x00000000,
+	0x40200000,0x00000000, 144, 0x5AF00000,0x00000000,
+	0x40200000,0x00000000, 145, 0x5B200000,0x00000000,
+	0x40200000,0x00000000, 146, 0x5B500000,0x00000000,
+	0x40200000,0x00000000, 147, 0x5B800000,0x00000000,
+	0x40200000,0x00000000, 148, 0x5BB00000,0x00000000,
+	0x40200000,0x00000000, 149, 0x5BE00000,0x00000000,
+	0x40200000,0x00000000, 150, 0x5C100000,0x00000000,
+	0x40200000,0x00000000, 151, 0x5C400000,0x00000000,
+	0x40200000,0x00000000, 152, 0x5C700000,0x00000000,
+	0x40200000,0x00000000, 153, 0x5CA00000,0x00000000,
+	0x40200000,0x00000000, 154, 0x5CD00000,0x00000000,
+	0x40200000,0x00000000, 155, 0x5D000000,0x00000000,
+	0x40200000,0x00000000, 156, 0x5D300000,0x00000000,
+	0x40200000,0x00000000, 157, 0x5D600000,0x00000000,
+	0x40200000,0x00000000, 158, 0x5D900000,0x00000000,
+	0x40200000,0x00000000, 159, 0x5DC00000,0x00000000,
+	0x40200000,0x00000000, 160, 0x5DF00000,0x00000000,
+	0x40200000,0x00000000, 161, 0x5E200000,0x00000000,
+	0x40200000,0x00000000, 162, 0x5E500000,0x00000000,
+	0x40200000,0x00000000, 163, 0x5E800000,0x00000000,
+	0x40200000,0x00000000, 164, 0x5EB00000,0x00000000,
+	0x40200000,0x00000000, 165, 0x5EE00000,0x00000000,
+	0x40200000,0x00000000, 166, 0x5F100000,0x00000000,
+	0x40200000,0x00000000, 167, 0x5F400000,0x00000000,
+	0x40200000,0x00000000, 168, 0x5F700000,0x00000000,
+	0x40200000,0x00000000, 169, 0x5FA00000,0x00000000,
+	0x40200000,0x00000000, 170, 0x5FD00000,0x00000000,
+	0x40200000,0x00000000, 171, 0x60000000,0x00000000,
+	0x40200000,0x00000000, 172, 0x60300000,0x00000000,
+	0x40200000,0x00000000, 173, 0x60600000,0x00000000,
+	0x40200000,0x00000000, 174, 0x60900000,0x00000000,
+	0x40200000,0x00000000, 175, 0x60C00000,0x00000000,
+	0x40200000,0x00000000, 176, 0x60F00000,0x00000000,
+	0x40200000,0x00000000, 177, 0x61200000,0x00000000,
+	0x40200000,0x00000000, 178, 0x61500000,0x00000000,
+	0x40200000,0x00000000, 179, 0x61800000,0x00000000,
+	0x40200000,0x00000000, 180, 0x61B00000,0x00000000,
+	0x40200000,0x00000000, 181, 0x61E00000,0x00000000,
+	0x40200000,0x00000000, 182, 0x62100000,0x00000000,
+	0x40200000,0x00000000, 183, 0x62400000,0x00000000,
+	0x40200000,0x00000000, 184, 0x62700000,0x00000000,
+	0x40200000,0x00000000, 185, 0x62A00000,0x00000000,
+	0x40200000,0x00000000, 186, 0x62D00000,0x00000000,
+	0x40200000,0x00000000, 187, 0x63000000,0x00000000,
+	0x40200000,0x00000000, 188, 0x63300000,0x00000000,
+	0x40200000,0x00000000, 189, 0x63600000,0x00000000,
+	0x40200000,0x00000000, 190, 0x63900000,0x00000000,
+	0x40200000,0x00000000, 191, 0x63C00000,0x00000000,
+	0x40200000,0x00000000, 192, 0x63F00000,0x00000000,
+	0x40200000,0x00000000, 193, 0x64200000,0x00000000,
+	0x40200000,0x00000000, 194, 0x64500000,0x00000000,
+	0x40200000,0x00000000, 195, 0x64800000,0x00000000,
+	0x40200000,0x00000000, 196, 0x64B00000,0x00000000,
+	0x40200000,0x00000000, 197, 0x64E00000,0x00000000,
+	0x40200000,0x00000000, 198, 0x65100000,0x00000000,
+	0x40200000,0x00000000, 199, 0x65400000,0x00000000,
+	0x40200000,0x00000000, 200, 0x65700000,0x00000000,
+	0x40200000,0x00000000, 201, 0x65A00000,0x00000000,
+	0x40200000,0x00000000, 202, 0x65D00000,0x00000000,
+	0x40200000,0x00000000, 203, 0x66000000,0x00000000,
+	0x40200000,0x00000000, 204, 0x66300000,0x00000000,
+	0x40200000,0x00000000, 205, 0x66600000,0x00000000,
+	0x40200000,0x00000000, 206, 0x66900000,0x00000000,
+	0x40200000,0x00000000, 207, 0x66C00000,0x00000000,
+	0x40200000,0x00000000, 208, 0x66F00000,0x00000000,
+	0x40200000,0x00000000, 209, 0x67200000,0x00000000,
+	0x40200000,0x00000000, 210, 0x67500000,0x00000000,
+	0x40200000,0x00000000, 211, 0x67800000,0x00000000,
+	0x40200000,0x00000000, 212, 0x67B00000,0x00000000,
+	0x40200000,0x00000000, 213, 0x67E00000,0x00000000,
+	0x40200000,0x00000000, 214, 0x68100000,0x00000000,
+	0x40200000,0x00000000, 215, 0x68400000,0x00000000,
+	0x40200000,0x00000000, 216, 0x68700000,0x00000000,
+	0x40200000,0x00000000, 217, 0x68A00000,0x00000000,
+	0x40200000,0x00000000, 218, 0x68D00000,0x00000000,
+	0x40200000,0x00000000, 219, 0x69000000,0x00000000,
+	0x40200000,0x00000000, 220, 0x69300000,0x00000000,
+	0x40200000,0x00000000, 221, 0x69600000,0x00000000,
+	0x40200000,0x00000000, 222, 0x69900000,0x00000000,
+	0x40200000,0x00000000, 223, 0x69C00000,0x00000000,
+	0x40200000,0x00000000, 224, 0x69F00000,0x00000000,
+	0x40200000,0x00000000, 225, 0x6A200000,0x00000000,
+	0x40200000,0x00000000, 226, 0x6A500000,0x00000000,
+	0x40200000,0x00000000, 227, 0x6A800000,0x00000000,
+	0x40200000,0x00000000, 228, 0x6AB00000,0x00000000,
+	0x40200000,0x00000000, 229, 0x6AE00000,0x00000000,
+	0x40200000,0x00000000, 230, 0x6B100000,0x00000000,
+	0x40200000,0x00000000, 231, 0x6B400000,0x00000000,
+	0x40200000,0x00000000, 232, 0x6B700000,0x00000000,
+	0x40200000,0x00000000, 233, 0x6BA00000,0x00000000,
+	0x40200000,0x00000000, 234, 0x6BD00000,0x00000000,
+	0x40200000,0x00000000, 235, 0x6C000000,0x00000000,
+	0x40200000,0x00000000, 236, 0x6C300000,0x00000000,
+	0x40200000,0x00000000, 237, 0x6C600000,0x00000000,
+	0x40200000,0x00000000, 238, 0x6C900000,0x00000000,
+	0x40200000,0x00000000, 239, 0x6CC00000,0x00000000,
+	0x40200000,0x00000000, 240, 0x6CF00000,0x00000000,
+	0x40200000,0x00000000, 241, 0x6D200000,0x00000000,
+	0x40200000,0x00000000, 242, 0x6D500000,0x00000000,
+	0x40200000,0x00000000, 243, 0x6D800000,0x00000000,
+	0x40200000,0x00000000, 244, 0x6DB00000,0x00000000,
+	0x40200000,0x00000000, 245, 0x6DE00000,0x00000000,
+	0x40200000,0x00000000, 246, 0x6E100000,0x00000000,
+	0x40200000,0x00000000, 247, 0x6E400000,0x00000000,
+	0x40200000,0x00000000, 248, 0x6E700000,0x00000000,
+	0x40200000,0x00000000, 249, 0x6EA00000,0x00000000,
+	0x40200000,0x00000000, 250, 0x6ED00000,0x00000000,
+	0x40200000,0x00000000, 251, 0x6F000000,0x00000000,
+	0x40200000,0x00000000, 252, 0x6F300000,0x00000000,
+	0x40200000,0x00000000, 253, 0x6F600000,0x00000000,
+	0x40200000,0x00000000, 254, 0x6F900000,0x00000000,
+	0x40200000,0x00000000, 255, 0x6FC00000,0x00000000,
+	0x40200000,0x00000000, 256, 0x6FF00000,0x00000000,
+	0x40200000,0x00000000, 257, 0x70200000,0x00000000,
+	0x40200000,0x00000000, 258, 0x70500000,0x00000000,
+	0x40200000,0x00000000, 259, 0x70800000,0x00000000,
+	0x40200000,0x00000000, 260, 0x70B00000,0x00000000,
+	0x40200000,0x00000000, 261, 0x70E00000,0x00000000,
+	0x40200000,0x00000000, 262, 0x71100000,0x00000000,
+	0x40200000,0x00000000, 263, 0x71400000,0x00000000,
+	0x40200000,0x00000000, 264, 0x71700000,0x00000000,
+	0x40200000,0x00000000, 265, 0x71A00000,0x00000000,
+	0x40200000,0x00000000, 266, 0x71D00000,0x00000000,
+	0x40200000,0x00000000, 267, 0x72000000,0x00000000,
+	0x40200000,0x00000000, 268, 0x72300000,0x00000000,
+	0x40200000,0x00000000, 269, 0x72600000,0x00000000,
+	0x40200000,0x00000000, 270, 0x72900000,0x00000000,
+	0x40200000,0x00000000, 271, 0x72C00000,0x00000000,
+	0x40200000,0x00000000, 272, 0x72F00000,0x00000000,
+	0x40200000,0x00000000, 273, 0x73200000,0x00000000,
+	0x40200000,0x00000000, 274, 0x73500000,0x00000000,
+	0x40200000,0x00000000, 275, 0x73800000,0x00000000,
+	0x40200000,0x00000000, 276, 0x73B00000,0x00000000,
+	0x40200000,0x00000000, 277, 0x73E00000,0x00000000,
+	0x40200000,0x00000000, 278, 0x74100000,0x00000000,
+	0x40200000,0x00000000, 279, 0x74400000,0x00000000,
+	0x40200000,0x00000000, 280, 0x74700000,0x00000000,
+	0x40200000,0x00000000, 281, 0x74A00000,0x00000000,
+	0x40200000,0x00000000, 282, 0x74D00000,0x00000000,
+	0x40200000,0x00000000, 283, 0x75000000,0x00000000,
+	0x40200000,0x00000000, 284, 0x75300000,0x00000000,
+	0x40200000,0x00000000, 285, 0x75600000,0x00000000,
+	0x40200000,0x00000000, 286, 0x75900000,0x00000000,
+	0x40200000,0x00000000, 287, 0x75C00000,0x00000000,
+	0x40200000,0x00000000, 288, 0x75F00000,0x00000000,
+	0x40200000,0x00000000, 289, 0x76200000,0x00000000,
+	0x40200000,0x00000000, 290, 0x76500000,0x00000000,
+	0x40200000,0x00000000, 291, 0x76800000,0x00000000,
+	0x40200000,0x00000000, 292, 0x76B00000,0x00000000,
+	0x40200000,0x00000000, 293, 0x76E00000,0x00000000,
+	0x40200000,0x00000000, 294, 0x77100000,0x00000000,
+	0x40200000,0x00000000, 295, 0x77400000,0x00000000,
+	0x40200000,0x00000000, 296, 0x77700000,0x00000000,
+	0x40200000,0x00000000, 297, 0x77A00000,0x00000000,
+	0x40200000,0x00000000, 298, 0x77D00000,0x00000000,
+	0x40200000,0x00000000, 299, 0x78000000,0x00000000,
+	0x40200000,0x00000000, 300, 0x78300000,0x00000000,
+	0x40220000,0x00000000, 2, 0x40544000,0x00000000,
+	0x40220000,0x00000000, 3, 0x4086C800,0x00000000,
+	0x40220000,0x00000000, 4, 0x40B9A100,0x00000000,
+	0x40220000,0x00000000, 5, 0x40ECD520,0x00000000,
+	0x40220000,0x00000000, 6, 0x412037E2,0x00000000,
+	0x40220000,0x00000000, 7, 0x41523EDE,0x40000000,
+	0x40220000,0x00000000, 8, 0x418486BA,0x08000000,
+	0x40220000,0x00000000, 9, 0x41B71791,0x49000000,
+	0x40220000,0x00000000, 10, 0x41E9FA83,0x72200000,
+	0x40220000,0x00000000, 11, 0x421D39D3,0xE0640000,
+	0x40220000,0x00000000, 12, 0x42507087,0x2E384000,
+	0x40220000,0x00000000, 13, 0x42827E98,0x13FF4800,
+	0x40220000,0x00000000, 14, 0x42B4CE6B,0x167F3100,
+	0x40220000,0x00000000, 15, 0x42E76838,0x794F1720,
+	0x40220000,0x00000000, 16, 0x431A553F,0x8878FA04,
+	0x40220000,0x00000000, 17, 0x434D9FE7,0x79881944,
+	0x40220000,0x00000000, 18, 0x4380A9F2,0x345C8E37,
+	0x40220000,0x00000000, 19, 0x43B2BF30,0x7AE81FFD,
+	0x40220000,0x00000000, 20, 0x43E51716,0x8A4523FD,
+	0x40220000,0x00000000, 21, 0x4417B9F9,0x5B8DC87D,
+	0x40220000,0x00000000, 22, 0x444AB138,0x86FF818C,
+	0x40220000,0x00000000, 23, 0x447E075F,0x97DF71BE,
+	0x40220000,0x00000000, 24, 0x44B0E425,0xC56DAFFB,
+	0x40220000,0x00000000, 25, 0x44E300AA,0x7E1B65FA,
+	0x40220000,0x00000000, 26, 0x451560BF,0xCDDED2B9,
+	0x40220000,0x00000000, 27, 0x45480CD7,0xC79AAD11,
+	0x40220000,0x00000000, 28, 0x457B0E72,0xC08E02B3,
+	0x40220000,0x00000000, 29, 0x45AE7041,0x189FC309,
+	0x40220000,0x00000000, 30, 0x45E11F24,0x9DD9DDB5,
+	0x40220000,0x00000000, 31, 0x46134309,0x3195196C,
+	0x40220000,0x00000000, 32, 0x4645AB6A,0x57C7BC99,
+	0x40220000,0x00000000, 33, 0x467860D7,0xA2C0B42C,
+	0x40220000,0x00000000, 34, 0x46AB6CF2,0x9718CAB2,
+	0x40220000,0x00000000, 35, 0x46DEDA90,0xE9FBE408,
+	0x40220000,0x00000000, 36, 0x47115AF1,0x839DB044,
+	0x40220000,0x00000000, 37, 0x4743864F,0xB411664D,
+	0x40220000,0x00000000, 38, 0x4775F719,0xAA939317,
+	0x40220000,0x00000000, 39, 0x47A8B5FC,0xDFE60579,
+	0x40220000,0x00000000, 40, 0x47DBCCBC,0x7BE2C629,
+	0x40220000,0x00000000, 41, 0x480F4654,0x0B5F1EEE,
+	0x40220000,0x00000000, 42, 0x4841978F,0x46658166,
+	0x40220000,0x00000000, 43, 0x4873CA81,0x2F323192,
+	0x40220000,0x00000000, 44, 0x48A643D1,0x551877C5,
+	0x40220000,0x00000000, 45, 0x48D90C4B,0x7FBB86BD,
+	0x40220000,0x00000000, 46, 0x490C2DD4,0xEFB2F795,
+	0x40220000,0x00000000, 47, 0x493FB38F,0x8DA95688,
+	0x40220000,0x00000000, 48, 0x4971D500,0xBFAF40AC,
+	0x40220000,0x00000000, 49, 0x49A40FA0,0xD7A528C2,
+	0x40220000,0x00000000, 50, 0x49D69194,0xF299CDDA,
+	0x40220000,0x00000000, 51, 0x4A0963C7,0x90ED0795,
+	0x40220000,0x00000000, 52, 0x4A3C9040,0x830AA888,
+	0x40220000,0x00000000, 53, 0x4A701124,0x49B5FECD,
+	0x40220000,0x00000000, 54, 0x4AA21348,0xD2ECBEA6,
+	0x40220000,0x00000000, 55, 0x4AD455B1,0xED4A567B,
+	0x40220000,0x00000000, 56, 0x4B06E068,0x2AF3A14A,
+	0x40220000,0x00000000, 57, 0x4B39BC75,0x30521573,
+	0x40220000,0x00000000, 58, 0x4B6CF403,0xD65C5822,
+	0x40220000,0x00000000, 59, 0x4BA04942,0x2893F193,
+	0x40220000,0x00000000, 60, 0x4BD2526A,0x6DA66FC5,
+	0x40220000,0x00000000, 61, 0x4C049CB7,0xBB5B3DBE,
+	0x40220000,0x00000000, 62, 0x4C37304E,0xB2C6A576,
+	0x40220000,0x00000000, 63, 0x4C6A1658,0x891F7A25,
+	0x40220000,0x00000000, 64, 0x4C9D5923,0x9A436969,
+	0x40220000,0x00000000, 65, 0x4CD08224,0x06C5EB4B,
+	0x40220000,0x00000000, 66, 0x4D029268,0x879EA8B5,
+	0x40220000,0x00000000, 67, 0x4D34E4B5,0x98927DCB,
+	0x40220000,0x00000000, 68, 0x4D67814C,0x4BA4CD85,
+	0x40220000,0x00000000, 69, 0x4D9A7175,0xD5196735,
+	0x40220000,0x00000000, 70, 0x4DCDBFA4,0x8FBC941C,
+	0x40220000,0x00000000, 71, 0x4E00BBCC,0x90DA1350,
+	0x40220000,0x00000000, 72, 0x4E32D346,0x22F555BA,
+	0x40220000,0x00000000, 73, 0x4E652DAE,0xE7540071,
+	0x40220000,0x00000000, 74, 0x4E97D364,0xC43E807F,
+	0x40220000,0x00000000, 75, 0x4ECACDD1,0x5CC6508F,
+	0x40220000,0x00000000, 76, 0x4EFE278B,0x885F1AA1,
+	0x40220000,0x00000000, 77, 0x4F30F63E,0x7CB57EFA,
+	0x40220000,0x00000000, 78, 0x4F631506,0x4C4C2EDA,
+	0x40220000,0x00000000, 79, 0x4F9577A7,0x15D5B4B5,
+	0x40220000,0x00000000, 80, 0x4FC8269B,0xF8906B4B,
+	0x40220000,0x00000000, 81, 0x4FFB2B6F,0x77A278B5,
+	0x40220000,0x00000000, 82, 0x502E90DD,0x6696C7CB,
+	0x40220000,0x00000000, 83, 0x5061317C,0x89B4D062,
+	0x40220000,0x00000000, 84, 0x509357AC,0x1AEB6A6F,
+	0x40220000,0x00000000, 85, 0x50C5C2A1,0x9E48D7BD,
+	0x40220000,0x00000000, 86, 0x50F87AF5,0xD211F2B4,
+	0x40220000,0x00000000, 87, 0x512B8A54,0x8C54310B,
+	0x40220000,0x00000000, 88, 0x515EFB9F,0x1DDEB72C,
+	0x40220000,0x00000000, 89, 0x51916D89,0x80CD4709,
+	0x40220000,0x00000000, 90, 0x51C39B3A,0xB0E6EFEA,
+	0x40220000,0x00000000, 91, 0x51F60EA2,0x0703CDE7,
+	0x40220000,0x00000000, 92, 0x5228D076,0x47E447A4,
+	0x40220000,0x00000000, 93, 0x525BEA85,0x10E0D098,
+	0x40220000,0x00000000, 94, 0x528F67D5,0xB2FCEAAB,
+	0x40220000,0x00000000, 95, 0x52C1AA68,0x34AE4400,
+	0x40220000,0x00000000, 96, 0x52F3DFB5,0x3B440C81,
+	0x40220000,0x00000000, 97, 0x53265BAB,0xE2AC8E11,
+	0x40220000,0x00000000, 98, 0x53592721,0x5F021FD3,
+	0x40220000,0x00000000, 99, 0x538C4C05,0x8AE263CD,
+	0x40220000,0x00000000, 100, 0x53BFD586,0x3C3EB047,
+	0x40220000,0x00000000, 101, 0x53F1E81B,0x81E34328,
+	0x40220000,0x00000000, 102, 0x5424251E,0xF21FAB8D,
+	0x40220000,0x00000000, 103, 0x5456A9C2,0xD063A0FE,
+	0x40220000,0x00000000, 104, 0x54897EFB,0x2A70151E,
+	0x40220000,0x00000000, 105, 0x54BCAEDA,0x8FBE17C2,
+	0x40220000,0x00000000, 106, 0x54F0225A,0xF0DAED5D,
+	0x40220000,0x00000000, 107, 0x552226A6,0x4EF64B09,
+	0x40220000,0x00000000, 108, 0x55546B7B,0x18D5146A,
+	0x40220000,0x00000000, 109, 0x5586F8EA,0x7BEFB6F7,
+	0x40220000,0x00000000, 110, 0x55B9D807,0xCB6DADD6,
+	0x40220000,0x00000000, 111, 0x55ED1308,0xC4DB6391,
+	0x40220000,0x00000000, 112, 0x56205AB4,0xEEBB6801,
+	0x40220000,0x00000000, 113, 0x5652660B,0x8C92D501,
+	0x40220000,0x00000000, 114, 0x5684B2CC,0xFE252FA2,
+	0x40220000,0x00000000, 115, 0x56B74926,0x9DE9D596,
+	0x40220000,0x00000000, 116, 0x56EA324B,0x71A71049,
+	0x40220000,0x00000000, 117, 0x571D7894,0xDFDBF252,
+	0x40220000,0x00000000, 118, 0x575093D3,0xBDEBB84E,
+	0x40220000,0x00000000, 119, 0x5782A64E,0x35A92F58,
+	0x40220000,0x00000000, 120, 0x57B4FB17,0xFC5E5543,
+	0x40220000,0x00000000, 121, 0x57E79A7A,0xFBEA1FEB,
+	0x40220000,0x00000000, 122, 0x581A8DCA,0x5B6763E8,
+	0x40220000,0x00000000, 123, 0x584DDF83,0xA6D45065,
+	0x40220000,0x00000000, 124, 0x5880CDBA,0x0DD76D39,
+	0x40220000,0x00000000, 125, 0x58B2E771,0x4F925AE0,
+	0x40220000,0x00000000, 126, 0x58E5445F,0x7984A63C,
+	0x40220000,0x00000000, 127, 0x5917ECEB,0x68B53B04,
+	0x40220000,0x00000000, 128, 0x594AEA88,0xD5CBE264,
+	0x40220000,0x00000000, 129, 0x597E47D9,0xF0855EB1,
+	0x40220000,0x00000000, 130, 0x59B1086A,0x974B0543,
+	0x40220000,0x00000000, 131, 0x59E32977,0xEA3465EC,
+	0x40220000,0x00000000, 132, 0x5A158EA6,0xE77AF2A9,
+	0x40220000,0x00000000, 133, 0x5A48407B,0xC46A50FE,
+	0x40220000,0x00000000, 134, 0x5A7B488B,0x3CF79B1E,
+	0x40220000,0x00000000, 135, 0x5AAEB19C,0xA4968E82,
+	0x40220000,0x00000000, 136, 0x5AE143E8,0x1C94B029,
+	0x40220000,0x00000000, 137, 0x5B136C65,0x2027462E,
+	0x40220000,0x00000000, 138, 0x5B45D9F1,0xC42C2EF4,
+	0x40220000,0x00000000, 139, 0x5B78952F,0xFCB1B4D3,
+	0x40220000,0x00000000, 140, 0x5BABA7D5,0xFC47EB6D,
+	0x40220000,0x00000000, 141, 0x5BDF1CD0,0xBBD0E8DB,
+	0x40220000,0x00000000, 142, 0x5C118035,0x69A582FB,
+	0x40220000,0x00000000, 143, 0x5C43B03C,0x16DA335A,
+	0x40220000,0x00000000, 144, 0x5C762643,0x99B579C6,
+	0x40220000,0x00000000, 145, 0x5CA8EB0C,0x0CEC28FE,
+	0x40220000,0x00000000, 146, 0x5CDC086D,0x8E89AE1E,
+	0x40220000,0x00000000, 147, 0x5D0F897B,0x405AE3E2,
+	0x40220000,0x00000000, 148, 0x5D41BD55,0x5433202F,
+	0x40220000,0x00000000, 149, 0x5D73F4FF,0xFEB98435,
+	0x40220000,0x00000000, 150, 0x5DA6739F,0xFE90B4BB,
+	0x40220000,0x00000000, 151, 0x5DD94213,0xFE62CB53,
+	0x40220000,0x00000000, 152, 0x5E0C6A56,0x7E2F24BD,
+	0x40220000,0x00000000, 153, 0x5E3FF7A1,0x4DF50955,
+	0x40220000,0x00000000, 154, 0x5E71FB4A,0xBBD9D540,
+	0x40220000,0x00000000, 155, 0x5EA43AB4,0x13550FE8,
+	0x40220000,0x00000000, 156, 0x5ED6C20A,0x95BFB1E5,
+	0x40220000,0x00000000, 157, 0x5F099A4B,0xE877A821,
+	0x40220000,0x00000000, 158, 0x5F3CCD95,0x65869D25,
+	0x40220000,0x00000000, 159, 0x5F7033A4,0x091BB865,
+	0x40220000,0x00000000, 160, 0x5FA23A18,0x8A3F2F72,
+	0x40220000,0x00000000, 161, 0x5FD4815B,0x9B871560,
+	0x40220000,0x00000000, 162, 0x60071187,0x0EF7F80C,
+	0x40220000,0x00000000, 163, 0x6039F3B7,0xF0D6F70D,
+	0x40220000,0x00000000, 164, 0x606D322E,0xEEF1D5EF,
+	0x40220000,0x00000000, 165, 0x60A06C3A,0x66680856,
+	0x40220000,0x00000000, 166, 0x60D279C1,0xB3350961,
+	0x40220000,0x00000000, 167, 0x6104C8F9,0xE99BAA8D,
+	0x40220000,0x00000000, 168, 0x61376219,0x26CF1FDF,
+	0x40220000,0x00000000, 169, 0x616A4E5C,0x4BA903DB,
+	0x40220000,0x00000000, 170, 0x619D9827,0xD51E2456,
+	0x40220000,0x00000000, 171, 0x61D0A596,0x67E0F471,
+	0x40220000,0x00000000, 172, 0x6202BA49,0x34DD12FF,
+	0x40220000,0x00000000, 173, 0x62351192,0x5B78B55F,
+	0x40220000,0x00000000, 174, 0x6267B3C4,0xA6E7CC0A,
+	0x40220000,0x00000000, 175, 0x629AAA3D,0x3BC4C58C,
+	0x40220000,0x00000000, 176, 0x62CDFF84,0xE33D5E3D,
+	0x40220000,0x00000000, 177, 0x6300DFBA,0xBFD28502,
+	0x40220000,0x00000000, 178, 0x6332FBB2,0x17CCD5A3,
+	0x40220000,0x00000000, 179, 0x63655B28,0x5AC67057,
+	0x40220000,0x00000000, 180, 0x6398068D,0x661F3E62,
+	0x40220000,0x00000000, 181, 0x63CB075F,0x12E3262E,
+	0x40220000,0x00000000, 182, 0x63FE684A,0xF53F8AF4,
+	0x40220000,0x00000000, 183, 0x64311AAA,0x29F3BE29,
+	0x40220000,0x00000000, 184, 0x64633DFF,0x6F3235EE,
+	0x40220000,0x00000000, 185, 0x6495A5BF,0x5D187CAC,
+	0x40220000,0x00000000, 186, 0x64C85A77,0x48BB8C42,
+	0x40220000,0x00000000, 187, 0x64FB65C6,0x31D2FDCA,
+	0x40220000,0x00000000, 188, 0x652ED27E,0xF80D5D83,
+	0x40220000,0x00000000, 189, 0x65615667,0x6B87849A,
+	0x40220000,0x00000000, 190, 0x65938134,0x58F8752D,
+	0x40220000,0x00000000, 191, 0x65C5F15A,0xE41783D3,
+	0x40220000,0x00000000, 192, 0x65F8AF86,0x409A744D,
+	0x40220000,0x00000000, 193, 0x662BC577,0x08ADC2D6,
+	0x40220000,0x00000000, 194, 0x665F3E25,0xE9C37B31,
+	0x40220000,0x00000000, 195, 0x669192F5,0x537DF54C,
+	0x40220000,0x00000000, 196, 0x66C3C553,0xFDEDB3F5,
+	0x40220000,0x00000000, 197, 0x66F63DFE,0x7DAB6A74,
+	0x40220000,0x00000000, 198, 0x672905BE,0x4D60D7C2,
+	0x40220000,0x00000000, 199, 0x675C2676,0x170CF2BB,
+	0x40220000,0x00000000, 200, 0x678FAB44,0xD9EE9112,
+	0x40220000,0x00000000, 201, 0x67C1D056,0xBA96319A,
+	0x40220000,0x00000000, 202, 0x67F40A61,0x91E8F7CD,
+	0x40220000,0x00000000, 203, 0x68268BAD,0xC42616C7,
+	0x40220000,0x00000000, 204, 0x68595D23,0x7CAAD9A0,
+	0x40220000,0x00000000, 205, 0x688C88C7,0xEC4034D4,
+	0x40220000,0x00000000, 206, 0x68C00CF0,0x74E41DB7,
+	0x40220000,0x00000000, 207, 0x68F20E8E,0x8380A16E,
+	0x40220000,0x00000000, 208, 0x69245060,0x53F0B59C,
+	0x40220000,0x00000000, 209, 0x6956DA6C,0x5E6ECC4F,
+	0x40220000,0x00000000, 210, 0x6989B5B9,0xEA3CA5D9,
+	0x40220000,0x00000000, 211, 0x69BCEC71,0x27843A94,
+	0x40220000,0x00000000, 212, 0x69F044FF,0xA63A60F3,
+	0x40220000,0x00000000, 213, 0x6A224D9F,0x9B01AD12,
+	0x40220000,0x00000000, 214, 0x6A549753,0x8E61E2B4,
+	0x40220000,0x00000000, 215, 0x6A872A3E,0x002E1F0B,
+	0x40220000,0x00000000, 216, 0x6ABA0F85,0xC033E2EC,
+	0x40220000,0x00000000, 217, 0x6AED5176,0x783A5F49,
+	0x40220000,0x00000000, 218, 0x6B207DD2,0xA3A0D599,
+	0x40220000,0x00000000, 219, 0x6B528D8C,0xF814F04D,
+	0x40220000,0x00000000, 220, 0x6B84DF3E,0x97178E56,
+	0x40220000,0x00000000, 221, 0x6BB77B26,0x69FA8021,
+	0x40220000,0x00000000, 222, 0x6BEA6A8B,0x3739D025,
+	0x40220000,0x00000000, 223, 0x6C1DB7DC,0x9E210A2A,
+	0x40220000,0x00000000, 224, 0x6C50B76C,0x18F295B7,
+	0x40220000,0x00000000, 225, 0x6C82CE59,0x9C10E86E,
+	0x40220000,0x00000000, 226, 0x6CB52824,0xCF93057C,
+	0x40220000,0x00000000, 227, 0x6CE7CD29,0x6985662C,
+	0x40220000,0x00000000, 228, 0x6D1AC6CE,0x96B612F1,
+	0x40220000,0x00000000, 229, 0x6D4E1FA8,0x698CD54F,
+	0x40220000,0x00000000, 230, 0x6D80F1CE,0xBB5F37FD,
+	0x40220000,0x00000000, 231, 0x6DB31008,0x92CB1EFC,
+	0x40220000,0x00000000, 232, 0x6DE57209,0xA52482DC,
+	0x40220000,0x00000000, 233, 0x6E18204A,0xD9C91337,
+	0x40220000,0x00000000, 234, 0x6E4B2454,0x3502359E,
+	0x40220000,0x00000000, 235, 0x6E7E88DE,0xBBA27C52,
+	0x40220000,0x00000000, 236, 0x6EB12CFD,0x498B65EE,
+	0x40220000,0x00000000, 237, 0x6EE3529C,0xF2BCD2AC,
+	0x40220000,0x00000000, 238, 0x6F15BCF0,0x91146D01,
+	0x40220000,0x00000000, 239, 0x6F48748E,0xA336FAA1,
+	0x40220000,0x00000000, 240, 0x6F7B8320,0x779DD9F5,
+	0x40220000,0x00000000, 241, 0x6FAEF384,0x86919534,
+	0x40220000,0x00000000, 242, 0x6FE168FA,0x8BB1E3ED,
+	0x40220000,0x00000000, 243, 0x70139619,0xDD28206B,
+	0x40220000,0x00000000, 244, 0x704608DD,0x18CD2478,
+	0x40220000,0x00000000, 245, 0x7078C9F8,0xBBE6C907,
+	0x40220000,0x00000000, 246, 0x70ABE337,0xD363A228,
+	0x40220000,0x00000000, 247, 0x70DF5F9E,0xCDD0166D,
+	0x40220000,0x00000000, 248, 0x7111A5C9,0x53C50C9E,
+	0x40220000,0x00000000, 249, 0x7143DA82,0x7E3DAE31,
+	0x40220000,0x00000000, 250, 0x717655D2,0xCE0563F7,
+	0x40220000,0x00000000, 251, 0x71A9208D,0x27C61076,
+	0x40220000,0x00000000, 252, 0x71DC449E,0xCCBED285,
+	0x40220000,0x00000000, 253, 0x720FCD32,0xA656ACD6,
+	0x40220000,0x00000000, 254, 0x7241E36C,0x7D90C138,
+	0x40220000,0x00000000, 255, 0x72741FDA,0x0D42D95F,
+	0x40220000,0x00000000, 256, 0x72A6A3D5,0x4EEB348B,
+	0x40220000,0x00000000, 257, 0x72D9784F,0xF8C89B1D,
+	0x40220000,0x00000000, 258, 0x730CA759,0xF7E1AE80,
+	0x40220000,0x00000000, 259, 0x73401E22,0x9B6EF228,
+	0x40220000,0x00000000, 260, 0x737221E6,0xEEDCD06D,
+	0x40220000,0x00000000, 261, 0x73A46623,0xCCB86A7B,
+	0x40220000,0x00000000, 262, 0x73D6F2E8,0x464F77CA,
+	0x40220000,0x00000000, 263, 0x7409D145,0x4F1966C3,
+	0x40220000,0x00000000, 264, 0x743D0B6D,0xF8FC939C,
+	0x40220000,0x00000000, 265, 0x7470566D,0xDC0E1308,
+	0x40220000,0x00000000, 266, 0x74A2613B,0x978FD569,
+	0x40220000,0x00000000, 267, 0x74D4AD63,0x0A81D016,
+	0x40220000,0x00000000, 268, 0x7507430F,0x6BD20A18,
+	0x40220000,0x00000000, 269, 0x753A2B71,0x594C4B5B,
+	0x40220000,0x00000000, 270, 0x756D70DF,0x8475D4C7,
+	0x40220000,0x00000000, 271, 0x75A08F7D,0xBA8247B0,
+	0x40220000,0x00000000, 272, 0x75D2A16D,0x71D290A6,
+	0x40220000,0x00000000, 273, 0x7604F59B,0x200CE2BA,
+	0x40220000,0x00000000, 274, 0x7637944E,0x840E7F12,
+	0x40220000,0x00000000, 275, 0x766A86D8,0x54904EF4,
+	0x40220000,0x00000000, 276, 0x769DD7B3,0x5F2258D3,
+	0x40220000,0x00000000, 277, 0x76D0C954,0xE58351F6,
+	0x40220000,0x00000000, 278, 0x7702E27F,0x8233BC35,
+	0x40220000,0x00000000, 279, 0x77353ECF,0x727A33BC,
+	0x40220000,0x00000000, 280, 0x7767E6A9,0x60C97A33,
+	0x40220000,0x00000000, 281, 0x779AE37E,0x8CE2A97A,
+	0x40220000,0x00000000, 282, 0x77CE3FEE,0x5E7EFEA9,
+	0x40220000,0x00000000, 283, 0x780103F6,0x15276F3F,
+	0x40220000,0x00000000, 284, 0x78332474,0xD7CC5D27,
+	0x40220000,0x00000000, 285, 0x78658903,0x72C5E8CC,
+	0x40220000,0x00000000, 286, 0x78983A23,0xE11EA5E5,
+	0x40220000,0x00000000, 287, 0x78CB4168,0x5D427AA2,
+	0x40220000,0x00000000, 288, 0x78FEA995,0x68EAC9F6,
+	0x40220000,0x00000000, 289, 0x79313F64,0x0B04119A,
+	0x40220000,0x00000000, 290, 0x79636750,0x8C6493CE,
+	0x40220000,0x00000000, 291, 0x7995D43A,0x9DF12648,
+	0x40220000,0x00000000, 292, 0x79C88EC1,0xF1AF4B10,
+	0x40220000,0x00000000, 293, 0x79FBA09A,0x2FE53473,
+	0x40220000,0x00000000, 294, 0x7A2F14AD,0x75E1DB01,
+	0x40220000,0x00000000, 295, 0x7A617BA1,0x924F0B30,
+	0x40220000,0x00000000, 296, 0x7A93AB15,0xC498EC97,
+	0x40220000,0x00000000, 297, 0x7AC62078,0x7D2C0A29,
+	0x40220000,0x00000000, 298, 0x7AF8E487,0x8CD18B6F,
+	0x40220000,0x00000000, 299, 0x7B2C0118,0x7E6BBCDC,
+	0x40220000,0x00000000, 300, 0x7B5F813B,0x8E393478,
+	0x40240000,0x00000000, 2, 0x40590000,0x00000000,
+	0x40240000,0x00000000, 3, 0x408F4000,0x00000000,
+	0x40240000,0x00000000, 4, 0x40C38800,0x00000000,
+	0x40240000,0x00000000, 5, 0x40F86A00,0x00000000,
+	0x40240000,0x00000000, 6, 0x412E8480,0x00000000,
+	0x40240000,0x00000000, 7, 0x416312D0,0x00000000,
+	0x40240000,0x00000000, 8, 0x4197D784,0x00000000,
+	0x40240000,0x00000000, 9, 0x41CDCD65,0x00000000,
+	0x40240000,0x00000000, 10, 0x4202A05F,0x20000000,
+	0x40240000,0x00000000, 11, 0x42374876,0xE8000000,
+	0x40240000,0x00000000, 12, 0x426D1A94,0xA2000000,
+	0x40240000,0x00000000, 13, 0x42A2309C,0xE5400000,
+	0x40240000,0x00000000, 14, 0x42D6BCC4,0x1E900000,
+	0x40240000,0x00000000, 15, 0x430C6BF5,0x26340000,
+	0x40240000,0x00000000, 16, 0x4341C379,0x37E08000,
+	0x40240000,0x00000000, 17, 0x43763457,0x85D8A000,
+	0x40240000,0x00000000, 18, 0x43ABC16D,0x674EC800,
+	0x40240000,0x00000000, 19, 0x43E158E4,0x60913D00,
+	0x40240000,0x00000000, 20, 0x4415AF1D,0x78B58C40,
+	0x40240000,0x00000000, 21, 0x444B1AE4,0xD6E2EF50,
+	0x40240000,0x00000000, 22, 0x4480F0CF,0x064DD592,
+	0x40240000,0x00000000, 23, 0x44B52D02,0xC7E14AF6,
+	0x40240000,0x00000000, 24, 0x44EA7843,0x79D99DB4,
+	0x40240000,0x00000000, 25, 0x45208B2A,0x2C280291,
+	0x40240000,0x00000000, 26, 0x4554ADF4,0xB7320335,
+	0x40240000,0x00000000, 27, 0x4589D971,0xE4FE8402,
+	0x40240000,0x00000000, 28, 0x45C027E7,0x2F1F1281,
+	0x40240000,0x00000000, 29, 0x45F431E0,0xFAE6D721,
+	0x40240000,0x00000000, 30, 0x46293E59,0x39A08CEA,
+	0x40240000,0x00000000, 31, 0x465F8DEF,0x8808B024,
+	0x40240000,0x00000000, 32, 0x4693B8B5,0xB5056E17,
+	0x40240000,0x00000000, 33, 0x46C8A6E3,0x2246C99C,
+	0x40240000,0x00000000, 34, 0x46FED09B,0xEAD87C03,
+	0x40240000,0x00000000, 35, 0x47334261,0x72C74D82,
+	0x40240000,0x00000000, 36, 0x476812F9,0xCF7920E3,
+	0x40240000,0x00000000, 37, 0x479E17B8,0x4357691B,
+	0x40240000,0x00000000, 38, 0x47D2CED3,0x2A16A1B1,
+	0x40240000,0x00000000, 39, 0x48078287,0xF49C4A1D,
+	0x40240000,0x00000000, 40, 0x483D6329,0xF1C35CA5,
+	0x40240000,0x00000000, 41, 0x48725DFA,0x371A19E7,
+	0x40240000,0x00000000, 42, 0x48A6F578,0xC4E0A061,
+	0x40240000,0x00000000, 43, 0x48DCB2D6,0xF618C879,
+	0x40240000,0x00000000, 44, 0x4911EFC6,0x59CF7D4C,
+	0x40240000,0x00000000, 45, 0x49466BB7,0xF0435C9E,
+	0x40240000,0x00000000, 46, 0x497C06A5,0xEC5433C6,
+	0x40240000,0x00000000, 47, 0x49B18427,0xB3B4A05C,
+	0x40240000,0x00000000, 48, 0x49E5E531,0xA0A1C873,
+	0x40240000,0x00000000, 49, 0x4A1B5E7E,0x08CA3A8F,
+	0x40240000,0x00000000, 50, 0x4A511B0E,0xC57E649A,
+	0x40240000,0x00000000, 51, 0x4A8561D2,0x76DDFDC0,
+	0x40240000,0x00000000, 52, 0x4ABABA47,0x14957D30,
+	0x40240000,0x00000000, 53, 0x4AF0B46C,0x6CDD6E3E,
+	0x40240000,0x00000000, 54, 0x4B24E187,0x8814C9CE,
+	0x40240000,0x00000000, 55, 0x4B5A19E9,0x6A19FC41,
+	0x40240000,0x00000000, 56, 0x4B905031,0xE2503DA9,
+	0x40240000,0x00000000, 57, 0x4BC4643E,0x5AE44D13,
+	0x40240000,0x00000000, 58, 0x4BF97D4D,0xF19D6057,
+	0x40240000,0x00000000, 59, 0x4C2FDCA1,0x6E04B86D,
+	0x40240000,0x00000000, 60, 0x4C63E9E4,0xE4C2F344,
+	0x40240000,0x00000000, 61, 0x4C98E45E,0x1DF3B015,
+	0x40240000,0x00000000, 62, 0x4CCF1D75,0xA5709C1B,
+	0x40240000,0x00000000, 63, 0x4D037269,0x87666191,
+	0x40240000,0x00000000, 64, 0x4D384F03,0xE93FF9F5,
+	0x40240000,0x00000000, 65, 0x4D6E62C4,0xE38FF872,
+	0x40240000,0x00000000, 66, 0x4DA2FDBB,0x0E39FB47,
+	0x40240000,0x00000000, 67, 0x4DD7BD29,0xD1C87A19,
+	0x40240000,0x00000000, 68, 0x4E0DAC74,0x463A989F,
+	0x40240000,0x00000000, 69, 0x4E428BC8,0xABE49F64,
+	0x40240000,0x00000000, 70, 0x4E772EBA,0xD6DDC73D,
+	0x40240000,0x00000000, 71, 0x4EACFA69,0x8C95390C,
+	0x40240000,0x00000000, 72, 0x4EE21C81,0xF7DD43A7,
+	0x40240000,0x00000000, 73, 0x4F16A3A2,0x75D49491,
+	0x40240000,0x00000000, 74, 0x4F4C4C8B,0x1349B9B5,
+	0x40240000,0x00000000, 75, 0x4F81AFD6,0xEC0E1411,
+	0x40240000,0x00000000, 76, 0x4FB61BCC,0xA7119916,
+	0x40240000,0x00000000, 77, 0x4FEBA2BF,0xD0D5FF5B,
+	0x40240000,0x00000000, 78, 0x502145B7,0xE285BF99,
+	0x40240000,0x00000000, 79, 0x50559725,0xDB272F7F,
+	0x40240000,0x00000000, 80, 0x508AFCEF,0x51F0FB5F,
+	0x40240000,0x00000000, 81, 0x50C0DE15,0x93369D1B,
+	0x40240000,0x00000000, 82, 0x50F5159A,0xF8044462,
+	0x40240000,0x00000000, 83, 0x512A5B01,0xB605557B,
+	0x40240000,0x00000000, 84, 0x516078E1,0x11C3556D,
+	0x40240000,0x00000000, 85, 0x51949719,0x56342AC8,
+	0x40240000,0x00000000, 86, 0x51C9BCDF,0xABC1357A,
+	0x40240000,0x00000000, 87, 0x5200160B,0xCB58C16C,
+	0x40240000,0x00000000, 88, 0x52341B8E,0xBE2EF1C7,
+	0x40240000,0x00000000, 89, 0x52692272,0x6DBAAE39,
+	0x40240000,0x00000000, 90, 0x529F6B0F,0x092959C7,
+	0x40240000,0x00000000, 91, 0x52D3A2E9,0x65B9D81D,
+	0x40240000,0x00000000, 92, 0x53088BA3,0xBF284E24,
+	0x40240000,0x00000000, 93, 0x533EAE8C,0xAEF261AD,
+	0x40240000,0x00000000, 94, 0x53732D17,0xED577D0C,
+	0x40240000,0x00000000, 95, 0x53A7F85D,0xE8AD5C4F,
+	0x40240000,0x00000000, 96, 0x53DDF675,0x62D8B363,
+	0x40240000,0x00000000, 97, 0x5412BA09,0x5DC7701E,
+	0x40240000,0x00000000, 98, 0x5447688B,0xB5394C25,
+	0x40240000,0x00000000, 99, 0x547D42AE,0xA2879F2E,
+	0x40240000,0x00000000, 100, 0x54B249AD,0x2594C37D,
+	0x40240000,0x00000000, 101, 0x54E6DC18,0x6EF9F45C,
+	0x40240000,0x00000000, 102, 0x551C931E,0x8AB87173,
+	0x40240000,0x00000000, 103, 0x5551DBF3,0x16B346E8,
+	0x40240000,0x00000000, 104, 0x558652EF,0xDC6018A2,
+	0x40240000,0x00000000, 105, 0x55BBE7AB,0xD3781ECA,
+	0x40240000,0x00000000, 106, 0x55F170CB,0x642B133F,
+	0x40240000,0x00000000, 107, 0x5625CCFE,0x3D35D80E,
+	0x40240000,0x00000000, 108, 0x565B403D,0xCC834E12,
+	0x40240000,0x00000000, 109, 0x56910826,0x9FD210CB,
+	0x40240000,0x00000000, 110, 0x56C54A30,0x47C694FE,
+	0x40240000,0x00000000, 111, 0x56FA9CBC,0x59B83A3D,
+	0x40240000,0x00000000, 112, 0x5730A1F5,0xB8132466,
+	0x40240000,0x00000000, 113, 0x5764CA73,0x2617ED80,
+	0x40240000,0x00000000, 114, 0x5799FD0F,0xEF9DE8E0,
+	0x40240000,0x00000000, 115, 0x57D03E29,0xF5C2B18C,
+	0x40240000,0x00000000, 116, 0x58044DB4,0x73335DEF,
+	0x40240000,0x00000000, 117, 0x58396121,0x9000356B,
+	0x40240000,0x00000000, 118, 0x586FB969,0xF40042C5,
+	0x40240000,0x00000000, 119, 0x58A3D3E2,0x388029BB,
+	0x40240000,0x00000000, 120, 0x58D8C8DA,0xC6A0342A,
+	0x40240000,0x00000000, 121, 0x590EFB11,0x78484135,
+	0x40240000,0x00000000, 122, 0x59435CEA,0xEB2D28C1,
+	0x40240000,0x00000000, 123, 0x59783425,0xA5F872F1,
+	0x40240000,0x00000000, 124, 0x59AE412F,0x0F768FAD,
+	0x40240000,0x00000000, 125, 0x59E2E8BD,0x69AA19CC,
+	0x40240000,0x00000000, 126, 0x5A17A2EC,0xC414A03F,
+	0x40240000,0x00000000, 127, 0x5A4D8BA7,0xF519C84F,
+	0x40240000,0x00000000, 128, 0x5A827748,0xF9301D32,
+	0x40240000,0x00000000, 129, 0x5AB7151B,0x377C247E,
+	0x40240000,0x00000000, 130, 0x5AECDA62,0x055B2D9E,
+	0x40240000,0x00000000, 131, 0x5B22087D,0x4358FC82,
+	0x40240000,0x00000000, 132, 0x5B568A9C,0x942F3BA3,
+	0x40240000,0x00000000, 133, 0x5B8C2D43,0xB93B0A8C,
+	0x40240000,0x00000000, 134, 0x5BC19C4A,0x53C4E697,
+	0x40240000,0x00000000, 135, 0x5BF6035C,0xE8B6203D,
+	0x40240000,0x00000000, 136, 0x5C2B8434,0x22E3A84D,
+	0x40240000,0x00000000, 137, 0x5C6132A0,0x95CE4930,
+	0x40240000,0x00000000, 138, 0x5C957F48,0xBB41DB7C,
+	0x40240000,0x00000000, 139, 0x5CCADF1A,0xEA12525B,
+	0x40240000,0x00000000, 140, 0x5D00CB70,0xD24B7379,
+	0x40240000,0x00000000, 141, 0x5D34FE4D,0x06DE5057,
+	0x40240000,0x00000000, 142, 0x5D6A3DE0,0x4895E46D,
+	0x40240000,0x00000000, 143, 0x5DA066AC,0x2D5DAEC4,
+	0x40240000,0x00000000, 144, 0x5DD48057,0x38B51A75,
+	0x40240000,0x00000000, 145, 0x5E09A06D,0x06E26112,
+	0x40240000,0x00000000, 146, 0x5E400444,0x244D7CAB,
+	0x40240000,0x00000000, 147, 0x5E740555,0x2D60DBD6,
+	0x40240000,0x00000000, 148, 0x5EA906AA,0x78B912CC,
+	0x40240000,0x00000000, 149, 0x5EDF4855,0x16E7577F,
+	0x40240000,0x00000000, 150, 0x5F138D35,0x2E5096AF,
+	0x40240000,0x00000000, 151, 0x5F487082,0x79E4BC5B,
+	0x40240000,0x00000000, 152, 0x5F7E8CA3,0x185DEB72,
+	0x40240000,0x00000000, 153, 0x5FB317E5,0xEF3AB327,
+	0x40240000,0x00000000, 154, 0x5FE7DDDF,0x6B095FF1,
+	0x40240000,0x00000000, 155, 0x601DD557,0x45CBB7ED,
+	0x40240000,0x00000000, 156, 0x6052A556,0x8B9F52F4,
+	0x40240000,0x00000000, 157, 0x60874EAC,0x2E8727B1,
+	0x40240000,0x00000000, 158, 0x60BD2257,0x3A28F19D,
+	0x40240000,0x00000000, 159, 0x60F23576,0x84599702,
+	0x40240000,0x00000000, 160, 0x6126C2D4,0x256FFCC3,
+	0x40240000,0x00000000, 161, 0x615C7389,0x2ECBFBF4,
+	0x40240000,0x00000000, 162, 0x6191C835,0xBD3F7D78,
+	0x40240000,0x00000000, 163, 0x61C63A43,0x2C8F5CD6,
+	0x40240000,0x00000000, 164, 0x61FBC8D3,0xF7B3340C,
+	0x40240000,0x00000000, 165, 0x62315D84,0x7AD00087,
+	0x40240000,0x00000000, 166, 0x6265B4E5,0x998400A9,
+	0x40240000,0x00000000, 167, 0x629B221E,0xFFE500D4,
+	0x40240000,0x00000000, 168, 0x62D0F553,0x5FEF2084,
+	0x40240000,0x00000000, 169, 0x630532A8,0x37EAE8A5,
+	0x40240000,0x00000000, 170, 0x633A7F52,0x45E5A2CF,
+	0x40240000,0x00000000, 171, 0x63708F93,0x6BAF85C1,
+	0x40240000,0x00000000, 172, 0x63A4B378,0x469B6732,
+	0x40240000,0x00000000, 173, 0x63D9E056,0x584240FE,
+	0x40240000,0x00000000, 174, 0x64102C35,0xF729689F,
+	0x40240000,0x00000000, 175, 0x64443743,0x74F3C2C6,
+	0x40240000,0x00000000, 176, 0x64794514,0x5230B378,
+	0x40240000,0x00000000, 177, 0x64AF9659,0x66BCE056,
+	0x40240000,0x00000000, 178, 0x64E3BDF7,0xE0360C36,
+	0x40240000,0x00000000, 179, 0x6518AD75,0xD8438F43,
+	0x40240000,0x00000000, 180, 0x654ED8D3,0x4E547314,
+	0x40240000,0x00000000, 181, 0x65834784,0x10F4C7EC,
+	0x40240000,0x00000000, 182, 0x65B81965,0x1531F9E8,
+	0x40240000,0x00000000, 183, 0x65EE1FBE,0x5A7E7861,
+	0x40240000,0x00000000, 184, 0x6622D3D6,0xF88F0B3D,
+	0x40240000,0x00000000, 185, 0x665788CC,0xB6B2CE0C,
+	0x40240000,0x00000000, 186, 0x668D6AFF,0xE45F818F,
+	0x40240000,0x00000000, 187, 0x66C262DF,0xEEBBB0F9,
+	0x40240000,0x00000000, 188, 0x66F6FB97,0xEA6A9D38,
+	0x40240000,0x00000000, 189, 0x672CBA7D,0xE5054486,
+	0x40240000,0x00000000, 190, 0x6761F48E,0xAF234AD4,
+	0x40240000,0x00000000, 191, 0x679671B2,0x5AEC1D89,
+	0x40240000,0x00000000, 192, 0x67CC0E1E,0xF1A724EB,
+	0x40240000,0x00000000, 193, 0x680188D3,0x57087713,
+	0x40240000,0x00000000, 194, 0x6835EB08,0x2CCA94D7,
+	0x40240000,0x00000000, 195, 0x686B65CA,0x37FD3A0D,
+	0x40240000,0x00000000, 196, 0x68A11F9E,0x62FE4448,
+	0x40240000,0x00000000, 197, 0x68D56785,0xFBBDD55A,
+	0x40240000,0x00000000, 198, 0x690AC167,0x7AAD4AB1,
+	0x40240000,0x00000000, 199, 0x6940B8E0,0xACAC4EAF,
+	0x40240000,0x00000000, 200, 0x6974E718,0xD7D7625A,
+	0x40240000,0x00000000, 201, 0x69AA20DF,0x0DCD3AF1,
+	0x40240000,0x00000000, 202, 0x69E0548B,0x68A044D6,
+	0x40240000,0x00000000, 203, 0x6A1469AE,0x42C8560C,
+	0x40240000,0x00000000, 204, 0x6A498419,0xD37A6B8F,
+	0x40240000,0x00000000, 205, 0x6A7FE520,0x48590673,
+	0x40240000,0x00000000, 206, 0x6AB3EF34,0x2D37A408,
+	0x40240000,0x00000000, 207, 0x6AE8EB01,0x38858D0A,
+	0x40240000,0x00000000, 208, 0x6B1F25C1,0x86A6F04C,
+	0x40240000,0x00000000, 209, 0x6B537798,0xF4285630,
+	0x40240000,0x00000000, 210, 0x6B88557F,0x31326BBB,
+	0x40240000,0x00000000, 211, 0x6BBE6ADE,0xFD7F06AA,
+	0x40240000,0x00000000, 212, 0x6BF302CB,0x5E6F642A,
+	0x40240000,0x00000000, 213, 0x6C27C37E,0x360B3D35,
+	0x40240000,0x00000000, 214, 0x6C5DB45D,0xC38E0C82,
+	0x40240000,0x00000000, 215, 0x6C9290BA,0x9A38C7D1,
+	0x40240000,0x00000000, 216, 0x6CC734E9,0x40C6F9C6,
+	0x40240000,0x00000000, 217, 0x6CFD0223,0x90F8B837,
+	0x40240000,0x00000000, 218, 0x6D322156,0x3A9B7323,
+	0x40240000,0x00000000, 219, 0x6D66A9AB,0xC9424FEB,
+	0x40240000,0x00000000, 220, 0x6D9C5416,0xBB92E3E6,
+	0x40240000,0x00000000, 221, 0x6DD1B48E,0x353BCE70,
+	0x40240000,0x00000000, 222, 0x6E0621B1,0xC28AC20C,
+	0x40240000,0x00000000, 223, 0x6E3BAA1E,0x332D728F,
+	0x40240000,0x00000000, 224, 0x6E714A52,0xDFFC6799,
+	0x40240000,0x00000000, 225, 0x6EA59CE7,0x97FB817F,
+	0x40240000,0x00000000, 226, 0x6EDB0421,0x7DFA61DF,
+	0x40240000,0x00000000, 227, 0x6F10E294,0xEEBC7D2C,
+	0x40240000,0x00000000, 228, 0x6F451B3A,0x2A6B9C76,
+	0x40240000,0x00000000, 229, 0x6F7A6208,0xB5068394,
+	0x40240000,0x00000000, 230, 0x6FB07D45,0x7124123D,
+	0x40240000,0x00000000, 231, 0x6FE49C96,0xCD6D16CC,
+	0x40240000,0x00000000, 232, 0x7019C3BC,0x80C85C7F,
+	0x40240000,0x00000000, 233, 0x70501A55,0xD07D39CF,
+	0x40240000,0x00000000, 234, 0x708420EB,0x449C8843,
+	0x40240000,0x00000000, 235, 0x70B92926,0x15C3AA54,
+	0x40240000,0x00000000, 236, 0x70EF736F,0x9B3494E9,
+	0x40240000,0x00000000, 237, 0x7123A825,0xC100DD11,
+	0x40240000,0x00000000, 238, 0x7158922F,0x31411456,
+	0x40240000,0x00000000, 239, 0x718EB6BA,0xFD91596B,
+	0x40240000,0x00000000, 240, 0x71C33234,0xDE7AD7E3,
+	0x40240000,0x00000000, 241, 0x71F7FEC2,0x16198DDC,
+	0x40240000,0x00000000, 242, 0x722DFE72,0x9B9FF153,
+	0x40240000,0x00000000, 243, 0x7262BF07,0xA143F6D4,
+	0x40240000,0x00000000, 244, 0x72976EC9,0x8994F489,
+	0x40240000,0x00000000, 245, 0x72CD4A7B,0xEBFA31AB,
+	0x40240000,0x00000000, 246, 0x73024E8D,0x737C5F0B,
+	0x40240000,0x00000000, 247, 0x7336E230,0xD05B76CD,
+	0x40240000,0x00000000, 248, 0x736C9ABD,0x04725481,
+	0x40240000,0x00000000, 249, 0x73A1E0B6,0x22C774D0,
+	0x40240000,0x00000000, 250, 0x73D658E3,0xAB795204,
+	0x40240000,0x00000000, 251, 0x740BEF1C,0x9657A686,
+	0x40240000,0x00000000, 252, 0x74417571,0xDDF6C814,
+	0x40240000,0x00000000, 253, 0x7475D2CE,0x55747A18,
+	0x40240000,0x00000000, 254, 0x74AB4781,0xEAD1989E,
+	0x40240000,0x00000000, 255, 0x74E10CB1,0x32C2FF63,
+	0x40240000,0x00000000, 256, 0x75154FDD,0x7F73BF3C,
+	0x40240000,0x00000000, 257, 0x754AA3D4,0xDF50AF0B,
+	0x40240000,0x00000000, 258, 0x7580A665,0x0B926D67,
+	0x40240000,0x00000000, 259, 0x75B4CFFE,0x4E7708C0,
+	0x40240000,0x00000000, 260, 0x75EA03FD,0xE214CAF1,
+	0x40240000,0x00000000, 261, 0x7620427E,0xAD4CFED6,
+	0x40240000,0x00000000, 262, 0x7654531E,0x58A03E8C,
+	0x40240000,0x00000000, 263, 0x768967E5,0xEEC84E2F,
+	0x40240000,0x00000000, 264, 0x76BFC1DF,0x6A7A61BB,
+	0x40240000,0x00000000, 265, 0x76F3D92B,0xA28C7D15,
+	0x40240000,0x00000000, 266, 0x7728CF76,0x8B2F9C5A,
+	0x40240000,0x00000000, 267, 0x775F0354,0x2DFB8370,
+	0x40240000,0x00000000, 268, 0x77936214,0x9CBD3226,
+	0x40240000,0x00000000, 269, 0x77C83A99,0xC3EC7EB0,
+	0x40240000,0x00000000, 270, 0x77FE4940,0x34E79E5C,
+	0x40240000,0x00000000, 271, 0x7832EDC8,0x2110C2F9,
+	0x40240000,0x00000000, 272, 0x7867A93A,0x2954F3B8,
+	0x40240000,0x00000000, 273, 0x789D9388,0xB3AA30A5,
+	0x40240000,0x00000000, 274, 0x78D27C35,0x704A5E67,
+	0x40240000,0x00000000, 275, 0x79071B42,0xCC5CF601,
+	0x40240000,0x00000000, 276, 0x793CE213,0x7F743382,
+	0x40240000,0x00000000, 277, 0x79720D4C,0x2FA8A031,
+	0x40240000,0x00000000, 278, 0x79A6909F,0x3B92C83D,
+	0x40240000,0x00000000, 279, 0x79DC34C7,0x0A777A4D,
+	0x40240000,0x00000000, 280, 0x7A11A0FC,0x668AAC70,
+	0x40240000,0x00000000, 281, 0x7A46093B,0x802D578C,
+	0x40240000,0x00000000, 282, 0x7A7B8B8A,0x6038AD6F,
+	0x40240000,0x00000000, 283, 0x7AB13736,0x7C236C65,
+	0x40240000,0x00000000, 284, 0x7AE58504,0x1B2C477F,
+	0x40240000,0x00000000, 285, 0x7B1AE645,0x21F7595E,
+	0x40240000,0x00000000, 286, 0x7B50CFEB,0x353A97DB,
+	0x40240000,0x00000000, 287, 0x7B8503E6,0x02893DD2,
+	0x40240000,0x00000000, 288, 0x7BBA44DF,0x832B8D46,
+	0x40240000,0x00000000, 289, 0x7BF06B0B,0xB1FB384C,
+	0x40240000,0x00000000, 290, 0x7C2485CE,0x9E7A065F,
+	0x40240000,0x00000000, 291, 0x7C59A742,0x461887F6,
+	0x40240000,0x00000000, 292, 0x7C900889,0x6BCF54FA,
+	0x40240000,0x00000000, 293, 0x7CC40AAB,0xC6C32A38,
+	0x40240000,0x00000000, 294, 0x7CF90D56,0xB873F4C7,
+	0x40240000,0x00000000, 295, 0x7D2F50AC,0x6690F1F8,
+	0x40240000,0x00000000, 296, 0x7D63926B,0xC01A973B,
+	0x40240000,0x00000000, 297, 0x7D987706,0xB0213D0A,
+	0x40240000,0x00000000, 298, 0x7DCE94C8,0x5C298C4C,
+	0x40240000,0x00000000, 299, 0x7E031CFD,0x3999F7B0,
+	0x40240000,0x00000000, 300, 0x7E37E43C,0x8800759C,
+	};
+
+LOCAL_D const TUint32 PowerTest3[] =
+	{
+	0x40000000,0x00000000, 2, 0x4016A09E,0x667F3BCD,
+	0x40000000,0x00000000, 3, 0x4026A09E,0x667F3BCD,
+	0x40000000,0x00000000, 4, 0x4036A09E,0x667F3BCD,
+	0x40000000,0x00000000, 5, 0x4046A09E,0x667F3BCD,
+	0x40000000,0x00000000, 6, 0x4056A09E,0x667F3BCD,
+	0x40000000,0x00000000, 7, 0x4066A09E,0x667F3BCD,
+	0x40000000,0x00000000, 8, 0x4076A09E,0x667F3BCD,
+	0x40000000,0x00000000, 9, 0x4086A09E,0x667F3BCD,
+	0x40000000,0x00000000, 10, 0x4096A09E,0x667F3BCD,
+	0x40000000,0x00000000, 11, 0x40A6A09E,0x667F3BCD,
+	0x40000000,0x00000000, 12, 0x40B6A09E,0x667F3BCD,
+	0x40000000,0x00000000, 13, 0x40C6A09E,0x667F3BCD,
+	0x40000000,0x00000000, 14, 0x40D6A09E,0x667F3BCD,
+	0x40000000,0x00000000, 15, 0x40E6A09E,0x667F3BCD,
+	0x40000000,0x00000000, 16, 0x40F6A09E,0x667F3BCD,
+	0x40000000,0x00000000, 17, 0x4106A09E,0x667F3BCD,
+	0x40000000,0x00000000, 18, 0x4116A09E,0x667F3BCD,
+	0x40000000,0x00000000, 19, 0x4126A09E,0x667F3BCD,
+	0x40000000,0x00000000, 20, 0x4136A09E,0x667F3BCD,
+	0x40000000,0x00000000, 21, 0x4146A09E,0x667F3BCD,
+	0x40000000,0x00000000, 22, 0x4156A09E,0x667F3BCD,
+	0x40000000,0x00000000, 23, 0x4166A09E,0x667F3BCD,
+	0x40000000,0x00000000, 24, 0x4176A09E,0x667F3BCD,
+	0x40000000,0x00000000, 25, 0x4186A09E,0x667F3BCD,
+	0x40000000,0x00000000, 26, 0x4196A09E,0x667F3BCD,
+	0x40000000,0x00000000, 27, 0x41A6A09E,0x667F3BCD,
+	0x40000000,0x00000000, 28, 0x41B6A09E,0x667F3BCD,
+	0x40000000,0x00000000, 29, 0x41C6A09E,0x667F3BCD,
+	0x40000000,0x00000000, 30, 0x41D6A09E,0x667F3BCD,
+	0x40000000,0x00000000, 31, 0x41E6A09E,0x667F3BCD,
+	0x40000000,0x00000000, 32, 0x41F6A09E,0x667F3BCD,
+	0x40000000,0x00000000, 33, 0x4206A09E,0x667F3BCD,
+	0x40000000,0x00000000, 34, 0x4216A09E,0x667F3BCD,
+	0x40000000,0x00000000, 35, 0x4226A09E,0x667F3BCD,
+	0x40000000,0x00000000, 36, 0x4236A09E,0x667F3BCD,
+	0x40000000,0x00000000, 37, 0x4246A09E,0x667F3BCD,
+	0x40000000,0x00000000, 38, 0x4256A09E,0x667F3BCD,
+	0x40000000,0x00000000, 39, 0x4266A09E,0x667F3BCD,
+	0x40000000,0x00000000, 40, 0x4276A09E,0x667F3BCD,
+	0x40000000,0x00000000, 41, 0x4286A09E,0x667F3BCD,
+	0x40000000,0x00000000, 42, 0x4296A09E,0x667F3BCD,
+	0x40000000,0x00000000, 43, 0x42A6A09E,0x667F3BCD,
+	0x40000000,0x00000000, 44, 0x42B6A09E,0x667F3BCD,
+	0x40000000,0x00000000, 45, 0x42C6A09E,0x667F3BCD,
+	0x40000000,0x00000000, 46, 0x42D6A09E,0x667F3BCD,
+	0x40000000,0x00000000, 47, 0x42E6A09E,0x667F3BCD,
+	0x40000000,0x00000000, 48, 0x42F6A09E,0x667F3BCD,
+	0x40000000,0x00000000, 49, 0x4306A09E,0x667F3BCD,
+	0x40000000,0x00000000, 50, 0x4316A09E,0x667F3BCD,
+	0x40000000,0x00000000, 51, 0x4326A09E,0x667F3BCD,
+	0x40000000,0x00000000, 52, 0x4336A09E,0x667F3BCD,
+	0x40000000,0x00000000, 53, 0x4346A09E,0x667F3BCD,
+	0x40000000,0x00000000, 54, 0x4356A09E,0x667F3BCD,
+	0x40000000,0x00000000, 55, 0x4366A09E,0x667F3BCD,
+	0x40000000,0x00000000, 56, 0x4376A09E,0x667F3BCD,
+	0x40000000,0x00000000, 57, 0x4386A09E,0x667F3BCD,
+	0x40000000,0x00000000, 58, 0x4396A09E,0x667F3BCD,
+	0x40000000,0x00000000, 59, 0x43A6A09E,0x667F3BCD,
+	0x40000000,0x00000000, 60, 0x43B6A09E,0x667F3BCD,
+	0x40000000,0x00000000, 61, 0x43C6A09E,0x667F3BCD,
+	0x40000000,0x00000000, 62, 0x43D6A09E,0x667F3BCD,
+	0x40000000,0x00000000, 63, 0x43E6A09E,0x667F3BCD,
+	0x40000000,0x00000000, 64, 0x43F6A09E,0x667F3BCD,
+	0x40000000,0x00000000, 65, 0x4406A09E,0x667F3BCD,
+	0x40000000,0x00000000, 66, 0x4416A09E,0x667F3BCD,
+	0x40000000,0x00000000, 67, 0x4426A09E,0x667F3BCD,
+	0x40000000,0x00000000, 68, 0x4436A09E,0x667F3BCD,
+	0x40000000,0x00000000, 69, 0x4446A09E,0x667F3BCD,
+	0x40000000,0x00000000, 70, 0x4456A09E,0x667F3BCD,
+	0x40000000,0x00000000, 71, 0x4466A09E,0x667F3BCD,
+	0x40000000,0x00000000, 72, 0x4476A09E,0x667F3BCD,
+	0x40000000,0x00000000, 73, 0x4486A09E,0x667F3BCD,
+	0x40000000,0x00000000, 74, 0x4496A09E,0x667F3BCD,
+	0x40000000,0x00000000, 75, 0x44A6A09E,0x667F3BCD,
+	0x40000000,0x00000000, 76, 0x44B6A09E,0x667F3BCD,
+	0x40000000,0x00000000, 77, 0x44C6A09E,0x667F3BCD,
+	0x40000000,0x00000000, 78, 0x44D6A09E,0x667F3BCD,
+	0x40000000,0x00000000, 79, 0x44E6A09E,0x667F3BCD,
+	0x40000000,0x00000000, 80, 0x44F6A09E,0x667F3BCD,
+	0x40000000,0x00000000, 81, 0x4506A09E,0x667F3BCD,
+	0x40000000,0x00000000, 82, 0x4516A09E,0x667F3BCD,
+	0x40000000,0x00000000, 83, 0x4526A09E,0x667F3BCD,
+	0x40000000,0x00000000, 84, 0x4536A09E,0x667F3BCD,
+	0x40000000,0x00000000, 85, 0x4546A09E,0x667F3BCD,
+	0x40000000,0x00000000, 86, 0x4556A09E,0x667F3BCD,
+	0x40000000,0x00000000, 87, 0x4566A09E,0x667F3BCD,
+	0x40000000,0x00000000, 88, 0x4576A09E,0x667F3BCD,
+	0x40000000,0x00000000, 89, 0x4586A09E,0x667F3BCD,
+	0x40000000,0x00000000, 90, 0x4596A09E,0x667F3BCD,
+	0x40000000,0x00000000, 91, 0x45A6A09E,0x667F3BCD,
+	0x40000000,0x00000000, 92, 0x45B6A09E,0x667F3BCD,
+	0x40000000,0x00000000, 93, 0x45C6A09E,0x667F3BCD,
+	0x40000000,0x00000000, 94, 0x45D6A09E,0x667F3BCD,
+	0x40000000,0x00000000, 95, 0x45E6A09E,0x667F3BCD,
+	0x40000000,0x00000000, 96, 0x45F6A09E,0x667F3BCD,
+	0x40000000,0x00000000, 97, 0x4606A09E,0x667F3BCD,
+	0x40000000,0x00000000, 98, 0x4616A09E,0x667F3BCD,
+	0x40000000,0x00000000, 99, 0x4626A09E,0x667F3BCD,
+	0x40000000,0x00000000, 100, 0x4636A09E,0x667F3BCD,
+	0x40000000,0x00000000, 101, 0x4646A09E,0x667F3BCD,
+	0x40000000,0x00000000, 102, 0x4656A09E,0x667F3BCD,
+	0x40000000,0x00000000, 103, 0x4666A09E,0x667F3BCD,
+	0x40000000,0x00000000, 104, 0x4676A09E,0x667F3BCD,
+	0x40000000,0x00000000, 105, 0x4686A09E,0x667F3BCD,
+	0x40000000,0x00000000, 106, 0x4696A09E,0x667F3BCD,
+	0x40000000,0x00000000, 107, 0x46A6A09E,0x667F3BCD,
+	0x40000000,0x00000000, 108, 0x46B6A09E,0x667F3BCD,
+	0x40000000,0x00000000, 109, 0x46C6A09E,0x667F3BCD,
+	0x40000000,0x00000000, 110, 0x46D6A09E,0x667F3BCD,
+	0x40000000,0x00000000, 111, 0x46E6A09E,0x667F3BCD,
+	0x40000000,0x00000000, 112, 0x46F6A09E,0x667F3BCD,
+	0x40000000,0x00000000, 113, 0x4706A09E,0x667F3BCD,
+	0x40000000,0x00000000, 114, 0x4716A09E,0x667F3BCD,
+	0x40000000,0x00000000, 115, 0x4726A09E,0x667F3BCD,
+	0x40000000,0x00000000, 116, 0x4736A09E,0x667F3BCD,
+	0x40000000,0x00000000, 117, 0x4746A09E,0x667F3BCD,
+	0x40000000,0x00000000, 118, 0x4756A09E,0x667F3BCD,
+	0x40000000,0x00000000, 119, 0x4766A09E,0x667F3BCD,
+	0x40000000,0x00000000, 120, 0x4776A09E,0x667F3BCD,
+	0x40000000,0x00000000, 121, 0x4786A09E,0x667F3BCD,
+	0x40000000,0x00000000, 122, 0x4796A09E,0x667F3BCD,
+	0x40000000,0x00000000, 123, 0x47A6A09E,0x667F3BCD,
+	0x40000000,0x00000000, 124, 0x47B6A09E,0x667F3BCD,
+	0x40000000,0x00000000, 125, 0x47C6A09E,0x667F3BCD,
+	0x40000000,0x00000000, 126, 0x47D6A09E,0x667F3BCD,
+	0x40000000,0x00000000, 127, 0x47E6A09E,0x667F3BCD,
+	0x40000000,0x00000000, 128, 0x47F6A09E,0x667F3BCD,
+	0x40000000,0x00000000, 129, 0x4806A09E,0x667F3BCD,
+	0x40000000,0x00000000, 130, 0x4816A09E,0x667F3BCD,
+	0x40000000,0x00000000, 131, 0x4826A09E,0x667F3BCD,
+	0x40000000,0x00000000, 132, 0x4836A09E,0x667F3BCD,
+	0x40000000,0x00000000, 133, 0x4846A09E,0x667F3BCD,
+	0x40000000,0x00000000, 134, 0x4856A09E,0x667F3BCD,
+	0x40000000,0x00000000, 135, 0x4866A09E,0x667F3BCD,
+	0x40000000,0x00000000, 136, 0x4876A09E,0x667F3BCD,
+	0x40000000,0x00000000, 137, 0x4886A09E,0x667F3BCD,
+	0x40000000,0x00000000, 138, 0x4896A09E,0x667F3BCD,
+	0x40000000,0x00000000, 139, 0x48A6A09E,0x667F3BCD,
+	0x40000000,0x00000000, 140, 0x48B6A09E,0x667F3BCD,
+	0x40000000,0x00000000, 141, 0x48C6A09E,0x667F3BCD,
+	0x40000000,0x00000000, 142, 0x48D6A09E,0x667F3BCD,
+	0x40000000,0x00000000, 143, 0x48E6A09E,0x667F3BCD,
+	0x40000000,0x00000000, 144, 0x48F6A09E,0x667F3BCD,
+	0x40000000,0x00000000, 145, 0x4906A09E,0x667F3BCD,
+	0x40000000,0x00000000, 146, 0x4916A09E,0x667F3BCD,
+	0x40000000,0x00000000, 147, 0x4926A09E,0x667F3BCD,
+	0x40000000,0x00000000, 148, 0x4936A09E,0x667F3BCD,
+	0x40000000,0x00000000, 149, 0x4946A09E,0x667F3BCD,
+	0x40000000,0x00000000, 150, 0x4956A09E,0x667F3BCD,
+	0x40000000,0x00000000, 151, 0x4966A09E,0x667F3BCD,
+	0x40000000,0x00000000, 152, 0x4976A09E,0x667F3BCD,
+	0x40000000,0x00000000, 153, 0x4986A09E,0x667F3BCD,
+	0x40000000,0x00000000, 154, 0x4996A09E,0x667F3BCD,
+	0x40000000,0x00000000, 155, 0x49A6A09E,0x667F3BCD,
+	0x40000000,0x00000000, 156, 0x49B6A09E,0x667F3BCD,
+	0x40000000,0x00000000, 157, 0x49C6A09E,0x667F3BCD,
+	0x40000000,0x00000000, 158, 0x49D6A09E,0x667F3BCD,
+	0x40000000,0x00000000, 159, 0x49E6A09E,0x667F3BCD,
+	0x40000000,0x00000000, 160, 0x49F6A09E,0x667F3BCD,
+	0x40000000,0x00000000, 161, 0x4A06A09E,0x667F3BCD,
+	0x40000000,0x00000000, 162, 0x4A16A09E,0x667F3BCD,
+	0x40000000,0x00000000, 163, 0x4A26A09E,0x667F3BCD,
+	0x40000000,0x00000000, 164, 0x4A36A09E,0x667F3BCD,
+	0x40000000,0x00000000, 165, 0x4A46A09E,0x667F3BCD,
+	0x40000000,0x00000000, 166, 0x4A56A09E,0x667F3BCD,
+	0x40000000,0x00000000, 167, 0x4A66A09E,0x667F3BCD,
+	0x40000000,0x00000000, 168, 0x4A76A09E,0x667F3BCD,
+	0x40000000,0x00000000, 169, 0x4A86A09E,0x667F3BCD,
+	0x40000000,0x00000000, 170, 0x4A96A09E,0x667F3BCD,
+	0x40000000,0x00000000, 171, 0x4AA6A09E,0x667F3BCD,
+	0x40000000,0x00000000, 172, 0x4AB6A09E,0x667F3BCD,
+	0x40000000,0x00000000, 173, 0x4AC6A09E,0x667F3BCD,
+	0x40000000,0x00000000, 174, 0x4AD6A09E,0x667F3BCD,
+	0x40000000,0x00000000, 175, 0x4AE6A09E,0x667F3BCD,
+	0x40000000,0x00000000, 176, 0x4AF6A09E,0x667F3BCD,
+	0x40000000,0x00000000, 177, 0x4B06A09E,0x667F3BCD,
+	0x40000000,0x00000000, 178, 0x4B16A09E,0x667F3BCD,
+	0x40000000,0x00000000, 179, 0x4B26A09E,0x667F3BCD,
+	0x40000000,0x00000000, 180, 0x4B36A09E,0x667F3BCD,
+	0x40000000,0x00000000, 181, 0x4B46A09E,0x667F3BCD,
+	0x40000000,0x00000000, 182, 0x4B56A09E,0x667F3BCD,
+	0x40000000,0x00000000, 183, 0x4B66A09E,0x667F3BCD,
+	0x40000000,0x00000000, 184, 0x4B76A09E,0x667F3BCD,
+	0x40000000,0x00000000, 185, 0x4B86A09E,0x667F3BCD,
+	0x40000000,0x00000000, 186, 0x4B96A09E,0x667F3BCD,
+	0x40000000,0x00000000, 187, 0x4BA6A09E,0x667F3BCD,
+	0x40000000,0x00000000, 188, 0x4BB6A09E,0x667F3BCD,
+	0x40000000,0x00000000, 189, 0x4BC6A09E,0x667F3BCD,
+	0x40000000,0x00000000, 190, 0x4BD6A09E,0x667F3BCD,
+	0x40000000,0x00000000, 191, 0x4BE6A09E,0x667F3BCD,
+	0x40000000,0x00000000, 192, 0x4BF6A09E,0x667F3BCD,
+	0x40000000,0x00000000, 193, 0x4C06A09E,0x667F3BCD,
+	0x40000000,0x00000000, 194, 0x4C16A09E,0x667F3BCD,
+	0x40000000,0x00000000, 195, 0x4C26A09E,0x667F3BCD,
+	0x40000000,0x00000000, 196, 0x4C36A09E,0x667F3BCD,
+	0x40000000,0x00000000, 197, 0x4C46A09E,0x667F3BCD,
+	0x40000000,0x00000000, 198, 0x4C56A09E,0x667F3BCD,
+	0x40000000,0x00000000, 199, 0x4C66A09E,0x667F3BCD,
+	0x40000000,0x00000000, 200, 0x4C76A09E,0x667F3BCD,
+	0x40000000,0x00000000, 201, 0x4C86A09E,0x667F3BCD,
+	0x40000000,0x00000000, 202, 0x4C96A09E,0x667F3BCD,
+	0x40000000,0x00000000, 203, 0x4CA6A09E,0x667F3BCD,
+	0x40000000,0x00000000, 204, 0x4CB6A09E,0x667F3BCD,
+	0x40000000,0x00000000, 205, 0x4CC6A09E,0x667F3BCD,
+	0x40000000,0x00000000, 206, 0x4CD6A09E,0x667F3BCD,
+	0x40000000,0x00000000, 207, 0x4CE6A09E,0x667F3BCD,
+	0x40000000,0x00000000, 208, 0x4CF6A09E,0x667F3BCD,
+	0x40000000,0x00000000, 209, 0x4D06A09E,0x667F3BCD,
+	0x40000000,0x00000000, 210, 0x4D16A09E,0x667F3BCD,
+	0x40000000,0x00000000, 211, 0x4D26A09E,0x667F3BCD,
+	0x40000000,0x00000000, 212, 0x4D36A09E,0x667F3BCD,
+	0x40000000,0x00000000, 213, 0x4D46A09E,0x667F3BCD,
+	0x40000000,0x00000000, 214, 0x4D56A09E,0x667F3BCD,
+	0x40000000,0x00000000, 215, 0x4D66A09E,0x667F3BCD,
+	0x40000000,0x00000000, 216, 0x4D76A09E,0x667F3BCD,
+	0x40000000,0x00000000, 217, 0x4D86A09E,0x667F3BCD,
+	0x40000000,0x00000000, 218, 0x4D96A09E,0x667F3BCD,
+	0x40000000,0x00000000, 219, 0x4DA6A09E,0x667F3BCD,
+	0x40000000,0x00000000, 220, 0x4DB6A09E,0x667F3BCD,
+	0x40000000,0x00000000, 221, 0x4DC6A09E,0x667F3BCD,
+	0x40000000,0x00000000, 222, 0x4DD6A09E,0x667F3BCD,
+	0x40000000,0x00000000, 223, 0x4DE6A09E,0x667F3BCD,
+	0x40000000,0x00000000, 224, 0x4DF6A09E,0x667F3BCD,
+	0x40000000,0x00000000, 225, 0x4E06A09E,0x667F3BCD,
+	0x40000000,0x00000000, 226, 0x4E16A09E,0x667F3BCD,
+	0x40000000,0x00000000, 227, 0x4E26A09E,0x667F3BCD,
+	0x40000000,0x00000000, 228, 0x4E36A09E,0x667F3BCD,
+	0x40000000,0x00000000, 229, 0x4E46A09E,0x667F3BCD,
+	0x40000000,0x00000000, 230, 0x4E56A09E,0x667F3BCD,
+	0x40000000,0x00000000, 231, 0x4E66A09E,0x667F3BCD,
+	0x40000000,0x00000000, 232, 0x4E76A09E,0x667F3BCD,
+	0x40000000,0x00000000, 233, 0x4E86A09E,0x667F3BCD,
+	0x40000000,0x00000000, 234, 0x4E96A09E,0x667F3BCD,
+	0x40000000,0x00000000, 235, 0x4EA6A09E,0x667F3BCD,
+	0x40000000,0x00000000, 236, 0x4EB6A09E,0x667F3BCD,
+	0x40000000,0x00000000, 237, 0x4EC6A09E,0x667F3BCD,
+	0x40000000,0x00000000, 238, 0x4ED6A09E,0x667F3BCD,
+	0x40000000,0x00000000, 239, 0x4EE6A09E,0x667F3BCD,
+	0x40000000,0x00000000, 240, 0x4EF6A09E,0x667F3BCD,
+	0x40000000,0x00000000, 241, 0x4F06A09E,0x667F3BCD,
+	0x40000000,0x00000000, 242, 0x4F16A09E,0x667F3BCD,
+	0x40000000,0x00000000, 243, 0x4F26A09E,0x667F3BCD,
+	0x40000000,0x00000000, 244, 0x4F36A09E,0x667F3BCD,
+	0x40000000,0x00000000, 245, 0x4F46A09E,0x667F3BCD,
+	0x40000000,0x00000000, 246, 0x4F56A09E,0x667F3BCD,
+	0x40000000,0x00000000, 247, 0x4F66A09E,0x667F3BCD,
+	0x40000000,0x00000000, 248, 0x4F76A09E,0x667F3BCD,
+	0x40000000,0x00000000, 249, 0x4F86A09E,0x667F3BCD,
+	0x40000000,0x00000000, 250, 0x4F96A09E,0x667F3BCD,
+	0x40000000,0x00000000, 251, 0x4FA6A09E,0x667F3BCD,
+	0x40000000,0x00000000, 252, 0x4FB6A09E,0x667F3BCD,
+	0x40000000,0x00000000, 253, 0x4FC6A09E,0x667F3BCD,
+	0x40000000,0x00000000, 254, 0x4FD6A09E,0x667F3BCD,
+	0x40000000,0x00000000, 255, 0x4FE6A09E,0x667F3BCD,
+	0x40000000,0x00000000, 256, 0x4FF6A09E,0x667F3BCD,
+	0x40000000,0x00000000, 257, 0x5006A09E,0x667F3BCD,
+	0x40000000,0x00000000, 258, 0x5016A09E,0x667F3BCD,
+	0x40000000,0x00000000, 259, 0x5026A09E,0x667F3BCD,
+	0x40000000,0x00000000, 260, 0x5036A09E,0x667F3BCD,
+	0x40000000,0x00000000, 261, 0x5046A09E,0x667F3BCD,
+	0x40000000,0x00000000, 262, 0x5056A09E,0x667F3BCD,
+	0x40000000,0x00000000, 263, 0x5066A09E,0x667F3BCD,
+	0x40000000,0x00000000, 264, 0x5076A09E,0x667F3BCD,
+	0x40000000,0x00000000, 265, 0x5086A09E,0x667F3BCD,
+	0x40000000,0x00000000, 266, 0x5096A09E,0x667F3BCD,
+	0x40000000,0x00000000, 267, 0x50A6A09E,0x667F3BCD,
+	0x40000000,0x00000000, 268, 0x50B6A09E,0x667F3BCD,
+	0x40000000,0x00000000, 269, 0x50C6A09E,0x667F3BCD,
+	0x40000000,0x00000000, 270, 0x50D6A09E,0x667F3BCD,
+	0x40000000,0x00000000, 271, 0x50E6A09E,0x667F3BCD,
+	0x40000000,0x00000000, 272, 0x50F6A09E,0x667F3BCD,
+	0x40000000,0x00000000, 273, 0x5106A09E,0x667F3BCD,
+	0x40000000,0x00000000, 274, 0x5116A09E,0x667F3BCD,
+	0x40000000,0x00000000, 275, 0x5126A09E,0x667F3BCD,
+	0x40000000,0x00000000, 276, 0x5136A09E,0x667F3BCD,
+	0x40000000,0x00000000, 277, 0x5146A09E,0x667F3BCD,
+	0x40000000,0x00000000, 278, 0x5156A09E,0x667F3BCD,
+	0x40000000,0x00000000, 279, 0x5166A09E,0x667F3BCD,
+	0x40000000,0x00000000, 280, 0x5176A09E,0x667F3BCD,
+	0x40000000,0x00000000, 281, 0x5186A09E,0x667F3BCD,
+	0x40000000,0x00000000, 282, 0x5196A09E,0x667F3BCD,
+	0x40000000,0x00000000, 283, 0x51A6A09E,0x667F3BCD,
+	0x40000000,0x00000000, 284, 0x51B6A09E,0x667F3BCD,
+	0x40000000,0x00000000, 285, 0x51C6A09E,0x667F3BCD,
+	0x40000000,0x00000000, 286, 0x51D6A09E,0x667F3BCD,
+	0x40000000,0x00000000, 287, 0x51E6A09E,0x667F3BCD,
+	0x40000000,0x00000000, 288, 0x51F6A09E,0x667F3BCD,
+	0x40000000,0x00000000, 289, 0x5206A09E,0x667F3BCD,
+	0x40000000,0x00000000, 290, 0x5216A09E,0x667F3BCD,
+	0x40000000,0x00000000, 291, 0x5226A09E,0x667F3BCD,
+	0x40000000,0x00000000, 292, 0x5236A09E,0x667F3BCD,
+	0x40000000,0x00000000, 293, 0x5246A09E,0x667F3BCD,
+	0x40000000,0x00000000, 294, 0x5256A09E,0x667F3BCD,
+	0x40000000,0x00000000, 295, 0x5266A09E,0x667F3BCD,
+	0x40000000,0x00000000, 296, 0x5276A09E,0x667F3BCD,
+	0x40000000,0x00000000, 297, 0x5286A09E,0x667F3BCD,
+	0x40000000,0x00000000, 298, 0x5296A09E,0x667F3BCD,
+	0x40000000,0x00000000, 299, 0x52A6A09E,0x667F3BCD,
+	0x40000000,0x00000000, 300, 0x52B6A09E,0x667F3BCD,
+	0x40080000,0x00000000, 2, 0x402F2D4A,0x45635640,
+	0x40080000,0x00000000, 3, 0x404761F7,0xB40A80B0,
+	0x40080000,0x00000000, 4, 0x40618979,0xC707E084,
+	0x40080000,0x00000000, 5, 0x407A4E36,0xAA8BD0C6,
+	0x40080000,0x00000000, 6, 0x4093BAA8,0xFFE8DC94,
+	0x40080000,0x00000000, 7, 0x40AD97FD,0x7FDD4ADF,
+	0x40080000,0x00000000, 8, 0x40C631FE,0x1FE5F827,
+	0x40080000,0x00000000, 9, 0x40E0A57E,0x97EC7A1D,
+	0x40080000,0x00000000, 10, 0x40F8F83D,0xE3E2B72C,
+	0x40080000,0x00000000, 11, 0x4112BA2E,0x6AEA0961,
+	0x40080000,0x00000000, 12, 0x412C1745,0xA05F0E11,
+	0x40080000,0x00000000, 13, 0x41451174,0x38474A8D,
+	0x40080000,0x00000000, 14, 0x415F9A2E,0x546AEFD3,
+	0x40080000,0x00000000, 15, 0x4177B3A2,0xBF5033DF,
+	0x40080000,0x00000000, 16, 0x4191C6BA,0x0F7C26E7,
+	0x40080000,0x00000000, 17, 0x41AAAA17,0x173A3A5A,
+	0x40080000,0x00000000, 18, 0x41C3FF91,0x516BABC4,
+	0x40080000,0x00000000, 19, 0x41DDFF59,0xFA2181A6,
+	0x40080000,0x00000000, 20, 0x41F67F83,0x7B99213C,
+	0x40080000,0x00000000, 21, 0x4210DFA2,0x9CB2D8ED,
+	0x40080000,0x00000000, 22, 0x42294F73,0xEB0C4564,
+	0x40080000,0x00000000, 23, 0x4242FB96,0xF049340B,
+	0x40080000,0x00000000, 24, 0x425C7962,0x686DCE10,
+	0x40080000,0x00000000, 25, 0x42755B09,0xCE525A8C,
+	0x40080000,0x00000000, 26, 0x42900447,0x5ABDC3E9,
+	0x40080000,0x00000000, 27, 0x42A8066B,0x081CA5DE,
+	0x40080000,0x00000000, 28, 0x42C204D0,0x46157C66,
+	0x40080000,0x00000000, 29, 0x42DB0738,0x69203A99,
+	0x40080000,0x00000000, 30, 0x42F4456A,0x4ED82BF3,
+	0x40080000,0x00000000, 31, 0x430E681F,0x764441ED,
+	0x40080000,0x00000000, 32, 0x4326CE17,0x98B33171,
+	0x40080000,0x00000000, 33, 0x43411A91,0xB2866515,
+	0x40080000,0x00000000, 34, 0x4359A7DA,0x8BC997A0,
+	0x40080000,0x00000000, 35, 0x43733DE3,0xE8D731B8,
+	0x40080000,0x00000000, 36, 0x438CDCD5,0xDD42CA94,
+	0x40080000,0x00000000, 37, 0x43A5A5A0,0x65F217EF,
+	0x40080000,0x00000000, 38, 0x43C03C38,0x4C7591F3,
+	0x40080000,0x00000000, 39, 0x43D85A54,0x72B05AED,
+	0x40080000,0x00000000, 40, 0x43F243BF,0x56044431,
+	0x40080000,0x00000000, 41, 0x440B659F,0x0106664A,
+	0x40080000,0x00000000, 42, 0x44248C37,0x40C4CCB8,
+	0x40080000,0x00000000, 43, 0x443ED252,0xE1273313,
+	0x40080000,0x00000000, 44, 0x44571DBE,0x28DD664E,
+	0x40080000,0x00000000, 45, 0x4471564E,0x9EA60CBB,
+	0x40080000,0x00000000, 46, 0x448A0175,0xEDF91318,
+	0x40080000,0x00000000, 47, 0x44A38118,0x727ACE52,
+	0x40080000,0x00000000, 48, 0x44BD41A4,0xABB8357B,
+	0x40080000,0x00000000, 49, 0x44D5F13B,0x80CA281D,
+	0x40080000,0x00000000, 50, 0x44F074EC,0xA0979E15,
+	0x40080000,0x00000000, 51, 0x4508AF62,0xF0E36D20,
+	0x40080000,0x00000000, 52, 0x4522838A,0x34AA91D8,
+	0x40080000,0x00000000, 53, 0x453BC54F,0x4EFFDAC4,
+	0x40080000,0x00000000, 54, 0x4554D3FB,0x7B3FE413,
+	0x40080000,0x00000000, 55, 0x456F3DF9,0x38DFD61D,
+	0x40080000,0x00000000, 56, 0x45876E7A,0xEAA7E095,
+	0x40080000,0x00000000, 57, 0x45A192DC,0x2FFDE870,
+	0x40080000,0x00000000, 58, 0x45BA5C4A,0x47FCDCA8,
+	0x40080000,0x00000000, 59, 0x45D3C537,0xB5FDA57E,
+	0x40080000,0x00000000, 60, 0x45EDA7D3,0x90FC783D,
+	0x40080000,0x00000000, 61, 0x46063DDE,0xACBD5A2E,
+	0x40080000,0x00000000, 62, 0x4620AE67,0x018E03A2,
+	0x40080000,0x00000000, 63, 0x4639059A,0x82550574,
+	0x40080000,0x00000000, 64, 0x4652C433,0xE1BFC417,
+	0x40080000,0x00000000, 65, 0x466C264D,0xD29FA622,
+	0x40080000,0x00000000, 66, 0x46851CBA,0x5DF7BC9A,
+	0x40080000,0x00000000, 67, 0x469FAB17,0x8CF39AE6,
+	0x40080000,0x00000000, 68, 0x46B7C051,0xA9B6B42D,
+	0x40080000,0x00000000, 69, 0x46D1D03D,0x3F490722,
+	0x40080000,0x00000000, 70, 0x46EAB85B,0xDEED8AB2,
+	0x40080000,0x00000000, 71, 0x47040A44,0xE7322806,
+	0x40080000,0x00000000, 72, 0x471E0F67,0x5ACB3C09,
+	0x40080000,0x00000000, 73, 0x47368B8D,0x84186D06,
+	0x40080000,0x00000000, 74, 0x4750E8AA,0x231251C5,
+	0x40080000,0x00000000, 75, 0x47695CFF,0x349B7AA7,
+	0x40080000,0x00000000, 76, 0x478305BF,0x67749BFD,
+	0x40080000,0x00000000, 77, 0x479C889F,0x1B2EE9FC,
+	0x40080000,0x00000000, 78, 0x47B56677,0x54632F7D,
+	0x40080000,0x00000000, 79, 0x47D00CD9,0x7F4A639E,
+	0x40080000,0x00000000, 80, 0x47E81346,0x3EEF956D,
+	0x40080000,0x00000000, 81, 0x48020E74,0xAF33B012,
+	0x40080000,0x00000000, 82, 0x481B15AF,0x06CD881A,
+	0x40080000,0x00000000, 83, 0x48345043,0x451A2614,
+	0x40080000,0x00000000, 84, 0x484E7864,0xE7A7391E,
+	0x40080000,0x00000000, 85, 0x4866DA4B,0xADBD6AD6,
+	0x40080000,0x00000000, 86, 0x488123B8,0xC24E1021,
+	0x40080000,0x00000000, 87, 0x4899B595,0x23751831,
+	0x40080000,0x00000000, 88, 0x48B3482F,0xDA97D225,
+	0x40080000,0x00000000, 89, 0x48CCEC47,0xC7E3BB37,
+	0x40080000,0x00000000, 90, 0x48E5B135,0xD5EACC69,
+	0x40080000,0x00000000, 91, 0x490044E8,0x6070194F,
+	0x40080000,0x00000000, 92, 0x4918675C,0x90A825F7,
+	0x40080000,0x00000000, 93, 0x49324D85,0x6C7E1C79,
+	0x40080000,0x00000000, 94, 0x494B7448,0x22BD2AB5,
+	0x40080000,0x00000000, 95, 0x49649736,0x1A0DE008,
+	0x40080000,0x00000000, 96, 0x497EE2D1,0x2714D00C,
+	0x40080000,0x00000000, 97, 0x49972A1C,0xDD4F9C09,
+	0x40080000,0x00000000, 98, 0x49B15F95,0xA5FBB507,
+	0x40080000,0x00000000, 99, 0x49CA0F60,0x78F98F8A,
+	0x40080000,0x00000000, 100, 0x49E38B88,0x5ABB2BA8,
+	0x40080000,0x00000000, 101, 0x49FD514C,0x8818C17B,
+	0x40080000,0x00000000, 102, 0x4A15FCF9,0x6612911D,
+	0x40080000,0x00000000, 103, 0x4A307DBB,0x0C8DECD5,
+	0x40080000,0x00000000, 104, 0x4A48BC98,0x92D4E340,
+	0x40080000,0x00000000, 105, 0x4A628D72,0x6E1FAA70,
+	0x40080000,0x00000000, 106, 0x4A7BD42B,0xA52F7FA8,
+	0x40080000,0x00000000, 107, 0x4A94DF20,0xBBE39FBE,
+	0x40080000,0x00000000, 108, 0x4AAF4EB1,0x19D56F9D,
+	0x40080000,0x00000000, 109, 0x4AC77B04,0xD36013B6,
+	0x40080000,0x00000000, 110, 0x4AE19C43,0x9E880EC8,
+	0x40080000,0x00000000, 111, 0x4AFA6A65,0x6DCC162D,
+	0x40080000,0x00000000, 112, 0x4B13CFCC,0x125910A1,
+	0x40080000,0x00000000, 113, 0x4B2DB7B2,0x1B8598F2,
+	0x40080000,0x00000000, 114, 0x4B4649C5,0x94A432B6,
+	0x40080000,0x00000000, 115, 0x4B60B754,0x2F7B2608,
+	0x40080000,0x00000000, 116, 0x4B7912FE,0x4738B90C,
+	0x40080000,0x00000000, 117, 0x4B92CE3E,0xB56A8AC9,
+	0x40080000,0x00000000, 118, 0x4BAC355E,0x101FD02E,
+	0x40080000,0x00000000, 119, 0x4BC52806,0x8C17DC22,
+	0x40080000,0x00000000, 120, 0x4BDFBC09,0xD223CA34,
+	0x40080000,0x00000000, 121, 0x4BF7CD07,0x5D9AD7A7,
+	0x40080000,0x00000000, 122, 0x4C11D9C5,0x863421BD,
+	0x40080000,0x00000000, 123, 0x4C2AC6A8,0x494E329C,
+	0x40080000,0x00000000, 124, 0x4C4414FE,0x36FAA5F5,
+	0x40080000,0x00000000, 125, 0x4C5E1F7D,0x5277F8EF,
+	0x40080000,0x00000000, 126, 0x4C76979D,0xFDD9FAB3,
+	0x40080000,0x00000000, 127, 0x4C90F1B6,0x7E637C06,
+	0x40080000,0x00000000, 128, 0x4CA96A91,0xBD953A0A,
+	0x40080000,0x00000000, 129, 0x4CC30FED,0x4E2FEB87,
+	0x40080000,0x00000000, 130, 0x4CDC97E3,0xF547E14B,
+	0x40080000,0x00000000, 131, 0x4CF571EA,0xF7F5E8F8,
+	0x40080000,0x00000000, 132, 0x4D101570,0x39F86EBA,
+	0x40080000,0x00000000, 133, 0x4D282028,0x56F4A617,
+	0x40080000,0x00000000, 134, 0x4D42181E,0x41377C91,
+	0x40080000,0x00000000, 135, 0x4D5B242D,0x61D33ADA,
+	0x40080000,0x00000000, 136, 0x4D745B22,0x095E6C24,
+	0x40080000,0x00000000, 137, 0x4D8E88B3,0x0E0DA235,
+	0x40080000,0x00000000, 138, 0x4DA6E686,0x4A8A39A8,
+	0x40080000,0x00000000, 139, 0x4DC12CE4,0xB7E7AB3E,
+	0x40080000,0x00000000, 140, 0x4DD9C357,0x13DB80DD,
+	0x40080000,0x00000000, 141, 0x4DF35281,0x4EE4A0A6,
+	0x40080000,0x00000000, 142, 0x4E0CFBC1,0xF656F0F9,
+	0x40080000,0x00000000, 143, 0x4E25BCD1,0x78C134BA,
+	0x40080000,0x00000000, 144, 0x4E404D9D,0x1A90E78C,
+	0x40080000,0x00000000, 145, 0x4E58746B,0xA7D95B52,
+	0x40080000,0x00000000, 146, 0x4E725750,0xBDE3047D,
+	0x40080000,0x00000000, 147, 0x4E8B82F9,0x1CD486BC,
+	0x40080000,0x00000000, 148, 0x4EA4A23A,0xD59F650D,
+	0x40080000,0x00000000, 149, 0x4EBEF358,0x406F1793,
+	0x40080000,0x00000000, 150, 0x4ED73682,0x305351AF,
+	0x40080000,0x00000000, 151, 0x4EF168E1,0xA43E7D43,
+	0x40080000,0x00000000, 152, 0x4F0A1D52,0x765DBBE4,
+	0x40080000,0x00000000, 153, 0x4F2395FD,0xD8C64CEB,
+	0x40080000,0x00000000, 154, 0x4F3D60FC,0xC5297361,
+	0x40080000,0x00000000, 155, 0x4F5608BD,0x93DF1689,
+	0x40080000,0x00000000, 156, 0x4F70868E,0x2EE750E7,
+	0x40080000,0x00000000, 157, 0x4F88C9D5,0x465AF95A,
+	0x40080000,0x00000000, 158, 0x4FA2975F,0xF4C43B03,
+	0x40080000,0x00000000, 159, 0x4FBBE30F,0xEF265885,
+	0x40080000,0x00000000, 160, 0x4FD4EA4B,0xF35CC264,
+	0x40080000,0x00000000, 161, 0x4FEF5F71,0xED0B2396,
+	0x40080000,0x00000000, 162, 0x50078795,0x71C85AB0,
+	0x40080000,0x00000000, 163, 0x5021A5B0,0x15564404,
+	0x40080000,0x00000000, 164, 0x503A7888,0x20016606,
+	0x40080000,0x00000000, 165, 0x5053DA66,0x18010C85,
+	0x40080000,0x00000000, 166, 0x506DC799,0x240192C7,
+	0x40080000,0x00000000, 167, 0x508655B2,0xDB012E15,
+	0x40080000,0x00000000, 168, 0x50A0C046,0x2440E290,
+	0x40080000,0x00000000, 169, 0x50B92069,0x366153D8,
+	0x40080000,0x00000000, 170, 0x50D2D84E,0xE8C8FEE2,
+	0x40080000,0x00000000, 171, 0x50EC4476,0x5D2D7E53,
+	0x40080000,0x00000000, 172, 0x51053358,0xC5E21EBE,
+	0x40080000,0x00000000, 173, 0x511FCD05,0x28D32E1D,
+	0x40080000,0x00000000, 174, 0x5137D9C3,0xDE9E6296,
+	0x40080000,0x00000000, 175, 0x5151E352,0xE6F6C9F1,
+	0x40080000,0x00000000, 176, 0x516AD4FC,0x5A722EE9,
+	0x40080000,0x00000000, 177, 0x51841FBD,0x43D5A32F,
+	0x40080000,0x00000000, 178, 0x519E2F9B,0xE5C074C6,
+	0x40080000,0x00000000, 179, 0x51B6A3B4,0xEC505794,
+	0x40080000,0x00000000, 180, 0x51D0FAC7,0xB13C41AF,
+	0x40080000,0x00000000, 181, 0x51E9782B,0x89DA6287,
+	0x40080000,0x00000000, 182, 0x52031A20,0xA763C9E5,
+	0x40080000,0x00000000, 183, 0x521CA730,0xFB15AED8,
+	0x40080000,0x00000000, 184, 0x52357D64,0xBC504322,
+	0x40080000,0x00000000, 185, 0x52501E0B,0x8D3C3259,
+	0x40080000,0x00000000, 186, 0x52682D11,0x53DA4B86,
+	0x40080000,0x00000000, 187, 0x528221CC,0xFEE3B8A5,
+	0x40080000,0x00000000, 188, 0x529B32B3,0x7E5594F7,
+	0x40080000,0x00000000, 189, 0x52B46606,0x9EC02FB9,
+	0x40080000,0x00000000, 190, 0x52CE9909,0xEE204796,
+	0x40080000,0x00000000, 191, 0x52E6F2C7,0x729835B0,
+	0x40080000,0x00000000, 192, 0x53013615,0x95F22844,
+	0x40080000,0x00000000, 193, 0x5319D120,0x60EB3C66,
+	0x40080000,0x00000000, 194, 0x53335CD8,0x48B06D4D,
+	0x40080000,0x00000000, 195, 0x534D0B44,0x6D08A3F3,
+	0x40080000,0x00000000, 196, 0x5365C873,0x51C67AF6,
+	0x40080000,0x00000000, 197, 0x53805656,0x7D54DC39,
+	0x40080000,0x00000000, 198, 0x53988181,0xBBFF4A55,
+	0x40080000,0x00000000, 199, 0x53B26121,0x4CFF77C0,
+	0x40080000,0x00000000, 200, 0x53CB91B1,0xF37F33A0,
+	0x40080000,0x00000000, 201, 0x53E4AD45,0x769F66B8,
+	0x40080000,0x00000000, 202, 0x53FF03E8,0x31EF1A14,
+	0x40080000,0x00000000, 203, 0x541742EE,0x2573538F,
+	0x40080000,0x00000000, 204, 0x54317232,0x9C167EAB,
+	0x40080000,0x00000000, 205, 0x544A2B4B,0xEA21BE01,
+	0x40080000,0x00000000, 206, 0x5463A078,0xEF994E80,
+	0x40080000,0x00000000, 207, 0x547D70B5,0x6765F5C1,
+	0x40080000,0x00000000, 208, 0x54961488,0x0D8C7851,
+	0x40080000,0x00000000, 209, 0x54B08F66,0x0A295A3C,
+	0x40080000,0x00000000, 210, 0x54C8D719,0x0F3E075B,
+	0x40080000,0x00000000, 211, 0x54E2A152,0xCB6E8584,
+	0x40080000,0x00000000, 212, 0x54FBF1FC,0x3125C846,
+	0x40080000,0x00000000, 213, 0x5514F57D,0x24DC5634,
+	0x40080000,0x00000000, 214, 0x552F703B,0xB74A814F,
+	0x40080000,0x00000000, 215, 0x5547942C,0xC977E0FB,
+	0x40080000,0x00000000, 216, 0x5561AF21,0x9719E8BC,
+	0x40080000,0x00000000, 217, 0x557A86B2,0x62A6DD1A,
+	0x40080000,0x00000000, 218, 0x5593E505,0xC9FD25D4,
+	0x40080000,0x00000000, 219, 0x55ADD788,0xAEFBB8BE,
+	0x40080000,0x00000000, 220, 0x55C661A6,0x833CCA8E,
+	0x40080000,0x00000000, 221, 0x55E0C93C,0xE26D97EB,
+	0x40080000,0x00000000, 222, 0x55F92DDB,0x53A463E0,
+	0x40080000,0x00000000, 223, 0x5612E264,0x7EBB4AE8,
+	0x40080000,0x00000000, 224, 0x562C5396,0xBE18F05C,
+	0x40080000,0x00000000, 225, 0x56453EB1,0x0E92B445,
+	0x40080000,0x00000000, 226, 0x565FDE09,0x95DC0E68,
+	0x40080000,0x00000000, 227, 0x5677E687,0x30650ACE,
+	0x40080000,0x00000000, 228, 0x5691ECE5,0x644BC81A,
+	0x40080000,0x00000000, 229, 0x56AAE358,0x1671AC27,
+	0x40080000,0x00000000, 230, 0x56C42A82,0x10D5411E,
+	0x40080000,0x00000000, 231, 0x56DE3FC3,0x193FE1AC,
+	0x40080000,0x00000000, 232, 0x56F6AFD2,0x52EFE941,
+	0x40080000,0x00000000, 233, 0x571103DD,0xBE33EEF1,
+	0x40080000,0x00000000, 234, 0x572985CC,0x9D4DE669,
+	0x40080000,0x00000000, 235, 0x57432459,0x75FA6CCF,
+	0x40080000,0x00000000, 236, 0x575CB686,0x30F7A337,
+	0x40080000,0x00000000, 237, 0x577588E4,0xA4B9BA69,
+	0x40080000,0x00000000, 238, 0x579026AB,0x7B8B4BCF,
+	0x40080000,0x00000000, 239, 0x57A83A01,0x3950F1B6,
+	0x40080000,0x00000000, 240, 0x57C22B80,0xEAFCB549,
+	0x40080000,0x00000000, 241, 0x57DB4141,0x607B0FED,
+	0x40080000,0x00000000, 242, 0x57F470F1,0x085C4BF2,
+	0x40080000,0x00000000, 243, 0x580EA969,0x8C8A71EA,
+	0x40080000,0x00000000, 244, 0x5826FF0F,0x2967D570,
+	0x40080000,0x00000000, 245, 0x58413F4B,0x5F0DE014,
+	0x40080000,0x00000000, 246, 0x5859DEF1,0x0E94D01E,
+	0x40080000,0x00000000, 247, 0x58736734,0xCAEF9C16,
+	0x40080000,0x00000000, 248, 0x588D1ACF,0x30676A21,
+	0x40080000,0x00000000, 249, 0x58A5D41B,0x644D8F99,
+	0x40080000,0x00000000, 250, 0x58C05F14,0x8B3A2BB3,
+	0x40080000,0x00000000, 251, 0x58D88E9E,0xD0D7418C,
+	0x40080000,0x00000000, 252, 0x58F26AF7,0x1CA17129,
+	0x40080000,0x00000000, 253, 0x590BA072,0xAAF229BE,
+	0x40080000,0x00000000, 254, 0x5924B856,0x00359F4E,
+	0x40080000,0x00000000, 255, 0x593F1481,0x00506EF6,
+	0x40080000,0x00000000, 256, 0x59574F60,0xC03C5338,
+	0x40080000,0x00000000, 257, 0x59717B88,0x902D3E6A,
+	0x40080000,0x00000000, 258, 0x598A394C,0xD843DD9F,
+	0x40080000,0x00000000, 259, 0x59A3AAF9,0xA232E637,
+	0x40080000,0x00000000, 260, 0x59BD8076,0x734C5953,
+	0x40080000,0x00000000, 261, 0x59D62058,0xD67942FE,
+	0x40080000,0x00000000, 262, 0x59F09842,0xA0DAF23F,
+	0x40080000,0x00000000, 263, 0x5A08E463,0xF1486B5E,
+	0x40080000,0x00000000, 264, 0x5A22AB4A,0xF4F65087,
+	0x40080000,0x00000000, 265, 0x5A3C00F0,0x6F7178CA,
+	0x40080000,0x00000000, 266, 0x5A5500B4,0x53951A97,
+	0x40080000,0x00000000, 267, 0x5A6F810E,0x7D5FA7E3,
+	0x40080000,0x00000000, 268, 0x5A87A0CA,0xDE07BDEA,
+	0x40080000,0x00000000, 269, 0x5AA1B898,0x2685CE70,
+	0x40080000,0x00000000, 270, 0x5ABA94E4,0x39C8B5A8,
+	0x40080000,0x00000000, 271, 0x5AD3EFAB,0x2B56883E,
+	0x40080000,0x00000000, 272, 0x5AEDE780,0xC101CC5D,
+	0x40080000,0x00000000, 273, 0x5B066DA0,0x90C15945,
+	0x40080000,0x00000000, 274, 0x5B20D238,0x6C9102F4,
+	0x40080000,0x00000000, 275, 0x5B393B54,0xA2D9846E,
+	0x40080000,0x00000000, 276, 0x5B52EC7F,0x7A232353,
+	0x40080000,0x00000000, 277, 0x5B6C62BF,0x3734B4FC,
+	0x40080000,0x00000000, 278, 0x5B854A0F,0x696787BD,
+	0x40080000,0x00000000, 279, 0x5B9FEF17,0x1E1B4B9B,
+	0x40080000,0x00000000, 280, 0x5BB7F351,0x569478B4,
+	0x40080000,0x00000000, 281, 0x5BD1F67D,0x00EF5A87,
+	0x40080000,0x00000000, 282, 0x5BEAF1BB,0x816707CB,
+	0x40080000,0x00000000, 283, 0x5C04354C,0xA10D45D8,
+	0x40080000,0x00000000, 284, 0x5C1E4FF2,0xF193E8C4,
+	0x40080000,0x00000000, 285, 0x5C36BBF6,0x352EEE93,
+	0x40080000,0x00000000, 286, 0x5C510CF8,0xA7E332EE,
+	0x40080000,0x00000000, 287, 0x5C699374,0xFBD4CC66,
+	0x40080000,0x00000000, 288, 0x5C832E97,0xBCDF994C,
+	0x40080000,0x00000000, 289, 0x5C9CC5E3,0x9B4F65F2,
+	0x40080000,0x00000000, 290, 0x5CB5946A,0xB47B8C76,
+	0x40080000,0x00000000, 291, 0x5CD02F50,0x075CA958,
+	0x40080000,0x00000000, 292, 0x5CE846F8,0x0B0AFE05,
+	0x40080000,0x00000000, 293, 0x5D02353A,0x08483E83,
+	0x40080000,0x00000000, 294, 0x5D1B4FD7,0x0C6C5DC5,
+	0x40080000,0x00000000, 295, 0x5D347BE1,0x49514654,
+	0x40080000,0x00000000, 296, 0x5D4EB9D1,0xEDF9E97E,
+	0x40080000,0x00000000, 297, 0x5D670B5D,0x727B6F1E,
+	0x40080000,0x00000000, 298, 0x5D814886,0x15DC9357,
+	0x40080000,0x00000000, 299, 0x5D99ECC9,0x20CADD02,
+	0x40080000,0x00000000, 300, 0x5DB37196,0xD89825C2,
+	0x40100000,0x00000000, 2, 0x40400000,0x00000000,
+	0x40100000,0x00000000, 3, 0x40600000,0x00000000,
+	0x40100000,0x00000000, 4, 0x40800000,0x00000000,
+	0x40100000,0x00000000, 5, 0x40A00000,0x00000000,
+	0x40100000,0x00000000, 6, 0x40C00000,0x00000000,
+	0x40100000,0x00000000, 7, 0x40E00000,0x00000000,
+	0x40100000,0x00000000, 8, 0x41000000,0x00000000,
+	0x40100000,0x00000000, 9, 0x41200000,0x00000000,
+	0x40100000,0x00000000, 10, 0x41400000,0x00000000,
+	0x40100000,0x00000000, 11, 0x41600000,0x00000000,
+	0x40100000,0x00000000, 12, 0x41800000,0x00000000,
+	0x40100000,0x00000000, 13, 0x41A00000,0x00000000,
+	0x40100000,0x00000000, 14, 0x41C00000,0x00000000,
+	0x40100000,0x00000000, 15, 0x41E00000,0x00000000,
+	0x40100000,0x00000000, 16, 0x42000000,0x00000000,
+	0x40100000,0x00000000, 17, 0x42200000,0x00000000,
+	0x40100000,0x00000000, 18, 0x42400000,0x00000000,
+	0x40100000,0x00000000, 19, 0x42600000,0x00000000,
+	0x40100000,0x00000000, 20, 0x42800000,0x00000000,
+	0x40100000,0x00000000, 21, 0x42A00000,0x00000000,
+	0x40100000,0x00000000, 22, 0x42C00000,0x00000000,
+	0x40100000,0x00000000, 23, 0x42E00000,0x00000000,
+	0x40100000,0x00000000, 24, 0x43000000,0x00000000,
+	0x40100000,0x00000000, 25, 0x43200000,0x00000000,
+	0x40100000,0x00000000, 26, 0x43400000,0x00000000,
+	0x40100000,0x00000000, 27, 0x43600000,0x00000000,
+	0x40100000,0x00000000, 28, 0x43800000,0x00000000,
+	0x40100000,0x00000000, 29, 0x43A00000,0x00000000,
+	0x40100000,0x00000000, 30, 0x43C00000,0x00000000,
+	0x40100000,0x00000000, 31, 0x43E00000,0x00000000,
+	0x40100000,0x00000000, 32, 0x44000000,0x00000000,
+	0x40100000,0x00000000, 33, 0x44200000,0x00000000,
+	0x40100000,0x00000000, 34, 0x44400000,0x00000000,
+	0x40100000,0x00000000, 35, 0x44600000,0x00000000,
+	0x40100000,0x00000000, 36, 0x44800000,0x00000000,
+	0x40100000,0x00000000, 37, 0x44A00000,0x00000000,
+	0x40100000,0x00000000, 38, 0x44C00000,0x00000000,
+	0x40100000,0x00000000, 39, 0x44E00000,0x00000000,
+	0x40100000,0x00000000, 40, 0x45000000,0x00000000,
+	0x40100000,0x00000000, 41, 0x45200000,0x00000000,
+	0x40100000,0x00000000, 42, 0x45400000,0x00000000,
+	0x40100000,0x00000000, 43, 0x45600000,0x00000000,
+	0x40100000,0x00000000, 44, 0x45800000,0x00000000,
+	0x40100000,0x00000000, 45, 0x45A00000,0x00000000,
+	0x40100000,0x00000000, 46, 0x45C00000,0x00000000,
+	0x40100000,0x00000000, 47, 0x45E00000,0x00000000,
+	0x40100000,0x00000000, 48, 0x46000000,0x00000000,
+	0x40100000,0x00000000, 49, 0x46200000,0x00000000,
+	0x40100000,0x00000000, 50, 0x46400000,0x00000000,
+	0x40100000,0x00000000, 51, 0x46600000,0x00000000,
+	0x40100000,0x00000000, 52, 0x46800000,0x00000000,
+	0x40100000,0x00000000, 53, 0x46A00000,0x00000000,
+	0x40100000,0x00000000, 54, 0x46C00000,0x00000000,
+	0x40100000,0x00000000, 55, 0x46E00000,0x00000000,
+	0x40100000,0x00000000, 56, 0x47000000,0x00000000,
+	0x40100000,0x00000000, 57, 0x47200000,0x00000000,
+	0x40100000,0x00000000, 58, 0x47400000,0x00000000,
+	0x40100000,0x00000000, 59, 0x47600000,0x00000000,
+	0x40100000,0x00000000, 60, 0x47800000,0x00000000,
+	0x40100000,0x00000000, 61, 0x47A00000,0x00000000,
+	0x40100000,0x00000000, 62, 0x47C00000,0x00000000,
+	0x40100000,0x00000000, 63, 0x47E00000,0x00000000,
+	0x40100000,0x00000000, 64, 0x48000000,0x00000000,
+	0x40100000,0x00000000, 65, 0x48200000,0x00000000,
+	0x40100000,0x00000000, 66, 0x48400000,0x00000000,
+	0x40100000,0x00000000, 67, 0x48600000,0x00000000,
+	0x40100000,0x00000000, 68, 0x48800000,0x00000000,
+	0x40100000,0x00000000, 69, 0x48A00000,0x00000000,
+	0x40100000,0x00000000, 70, 0x48C00000,0x00000000,
+	0x40100000,0x00000000, 71, 0x48E00000,0x00000000,
+	0x40100000,0x00000000, 72, 0x49000000,0x00000000,
+	0x40100000,0x00000000, 73, 0x49200000,0x00000000,
+	0x40100000,0x00000000, 74, 0x49400000,0x00000000,
+	0x40100000,0x00000000, 75, 0x49600000,0x00000000,
+	0x40100000,0x00000000, 76, 0x49800000,0x00000000,
+	0x40100000,0x00000000, 77, 0x49A00000,0x00000000,
+	0x40100000,0x00000000, 78, 0x49C00000,0x00000000,
+	0x40100000,0x00000000, 79, 0x49E00000,0x00000000,
+	0x40100000,0x00000000, 80, 0x4A000000,0x00000000,
+	0x40100000,0x00000000, 81, 0x4A200000,0x00000000,
+	0x40100000,0x00000000, 82, 0x4A400000,0x00000000,
+	0x40100000,0x00000000, 83, 0x4A600000,0x00000000,
+	0x40100000,0x00000000, 84, 0x4A800000,0x00000000,
+	0x40100000,0x00000000, 85, 0x4AA00000,0x00000000,
+	0x40100000,0x00000000, 86, 0x4AC00000,0x00000000,
+	0x40100000,0x00000000, 87, 0x4AE00000,0x00000000,
+	0x40100000,0x00000000, 88, 0x4B000000,0x00000000,
+	0x40100000,0x00000000, 89, 0x4B200000,0x00000000,
+	0x40100000,0x00000000, 90, 0x4B400000,0x00000000,
+	0x40100000,0x00000000, 91, 0x4B600000,0x00000000,
+	0x40100000,0x00000000, 92, 0x4B800000,0x00000000,
+	0x40100000,0x00000000, 93, 0x4BA00000,0x00000000,
+	0x40100000,0x00000000, 94, 0x4BC00000,0x00000000,
+	0x40100000,0x00000000, 95, 0x4BE00000,0x00000000,
+	0x40100000,0x00000000, 96, 0x4C000000,0x00000000,
+	0x40100000,0x00000000, 97, 0x4C200000,0x00000000,
+	0x40100000,0x00000000, 98, 0x4C400000,0x00000000,
+	0x40100000,0x00000000, 99, 0x4C600000,0x00000000,
+	0x40100000,0x00000000, 100, 0x4C800000,0x00000000,
+	0x40100000,0x00000000, 101, 0x4CA00000,0x00000000,
+	0x40100000,0x00000000, 102, 0x4CC00000,0x00000000,
+	0x40100000,0x00000000, 103, 0x4CE00000,0x00000000,
+	0x40100000,0x00000000, 104, 0x4D000000,0x00000000,
+	0x40100000,0x00000000, 105, 0x4D200000,0x00000000,
+	0x40100000,0x00000000, 106, 0x4D400000,0x00000000,
+	0x40100000,0x00000000, 107, 0x4D600000,0x00000000,
+	0x40100000,0x00000000, 108, 0x4D800000,0x00000000,
+	0x40100000,0x00000000, 109, 0x4DA00000,0x00000000,
+	0x40100000,0x00000000, 110, 0x4DC00000,0x00000000,
+	0x40100000,0x00000000, 111, 0x4DE00000,0x00000000,
+	0x40100000,0x00000000, 112, 0x4E000000,0x00000000,
+	0x40100000,0x00000000, 113, 0x4E200000,0x00000000,
+	0x40100000,0x00000000, 114, 0x4E400000,0x00000000,
+	0x40100000,0x00000000, 115, 0x4E600000,0x00000000,
+	0x40100000,0x00000000, 116, 0x4E800000,0x00000000,
+	0x40100000,0x00000000, 117, 0x4EA00000,0x00000000,
+	0x40100000,0x00000000, 118, 0x4EC00000,0x00000000,
+	0x40100000,0x00000000, 119, 0x4EE00000,0x00000000,
+	0x40100000,0x00000000, 120, 0x4F000000,0x00000000,
+	0x40100000,0x00000000, 121, 0x4F200000,0x00000000,
+	0x40100000,0x00000000, 122, 0x4F400000,0x00000000,
+	0x40100000,0x00000000, 123, 0x4F600000,0x00000000,
+	0x40100000,0x00000000, 124, 0x4F800000,0x00000000,
+	0x40100000,0x00000000, 125, 0x4FA00000,0x00000000,
+	0x40100000,0x00000000, 126, 0x4FC00000,0x00000000,
+	0x40100000,0x00000000, 127, 0x4FE00000,0x00000000,
+	0x40100000,0x00000000, 128, 0x50000000,0x00000000,
+	0x40100000,0x00000000, 129, 0x50200000,0x00000000,
+	0x40100000,0x00000000, 130, 0x50400000,0x00000000,
+	0x40100000,0x00000000, 131, 0x50600000,0x00000000,
+	0x40100000,0x00000000, 132, 0x50800000,0x00000000,
+	0x40100000,0x00000000, 133, 0x50A00000,0x00000000,
+	0x40100000,0x00000000, 134, 0x50C00000,0x00000000,
+	0x40100000,0x00000000, 135, 0x50E00000,0x00000000,
+	0x40100000,0x00000000, 136, 0x51000000,0x00000000,
+	0x40100000,0x00000000, 137, 0x51200000,0x00000000,
+	0x40100000,0x00000000, 138, 0x51400000,0x00000000,
+	0x40100000,0x00000000, 139, 0x51600000,0x00000000,
+	0x40100000,0x00000000, 140, 0x51800000,0x00000000,
+	0x40100000,0x00000000, 141, 0x51A00000,0x00000000,
+	0x40100000,0x00000000, 142, 0x51C00000,0x00000000,
+	0x40100000,0x00000000, 143, 0x51E00000,0x00000000,
+	0x40100000,0x00000000, 144, 0x52000000,0x00000000,
+	0x40100000,0x00000000, 145, 0x52200000,0x00000000,
+	0x40100000,0x00000000, 146, 0x52400000,0x00000000,
+	0x40100000,0x00000000, 147, 0x52600000,0x00000000,
+	0x40100000,0x00000000, 148, 0x52800000,0x00000000,
+	0x40100000,0x00000000, 149, 0x52A00000,0x00000000,
+	0x40100000,0x00000000, 150, 0x52C00000,0x00000000,
+	0x40100000,0x00000000, 151, 0x52E00000,0x00000000,
+	0x40100000,0x00000000, 152, 0x53000000,0x00000000,
+	0x40100000,0x00000000, 153, 0x53200000,0x00000000,
+	0x40100000,0x00000000, 154, 0x53400000,0x00000000,
+	0x40100000,0x00000000, 155, 0x53600000,0x00000000,
+	0x40100000,0x00000000, 156, 0x53800000,0x00000000,
+	0x40100000,0x00000000, 157, 0x53A00000,0x00000000,
+	0x40100000,0x00000000, 158, 0x53C00000,0x00000000,
+	0x40100000,0x00000000, 159, 0x53E00000,0x00000000,
+	0x40100000,0x00000000, 160, 0x54000000,0x00000000,
+	0x40100000,0x00000000, 161, 0x54200000,0x00000000,
+	0x40100000,0x00000000, 162, 0x54400000,0x00000000,
+	0x40100000,0x00000000, 163, 0x54600000,0x00000000,
+	0x40100000,0x00000000, 164, 0x54800000,0x00000000,
+	0x40100000,0x00000000, 165, 0x54A00000,0x00000000,
+	0x40100000,0x00000000, 166, 0x54C00000,0x00000000,
+	0x40100000,0x00000000, 167, 0x54E00000,0x00000000,
+	0x40100000,0x00000000, 168, 0x55000000,0x00000000,
+	0x40100000,0x00000000, 169, 0x55200000,0x00000000,
+	0x40100000,0x00000000, 170, 0x55400000,0x00000000,
+	0x40100000,0x00000000, 171, 0x55600000,0x00000000,
+	0x40100000,0x00000000, 172, 0x55800000,0x00000000,
+	0x40100000,0x00000000, 173, 0x55A00000,0x00000000,
+	0x40100000,0x00000000, 174, 0x55C00000,0x00000000,
+	0x40100000,0x00000000, 175, 0x55E00000,0x00000000,
+	0x40100000,0x00000000, 176, 0x56000000,0x00000000,
+	0x40100000,0x00000000, 177, 0x56200000,0x00000000,
+	0x40100000,0x00000000, 178, 0x56400000,0x00000000,
+	0x40100000,0x00000000, 179, 0x56600000,0x00000000,
+	0x40100000,0x00000000, 180, 0x56800000,0x00000000,
+	0x40100000,0x00000000, 181, 0x56A00000,0x00000000,
+	0x40100000,0x00000000, 182, 0x56C00000,0x00000000,
+	0x40100000,0x00000000, 183, 0x56E00000,0x00000000,
+	0x40100000,0x00000000, 184, 0x57000000,0x00000000,
+	0x40100000,0x00000000, 185, 0x57200000,0x00000000,
+	0x40100000,0x00000000, 186, 0x57400000,0x00000000,
+	0x40100000,0x00000000, 187, 0x57600000,0x00000000,
+	0x40100000,0x00000000, 188, 0x57800000,0x00000000,
+	0x40100000,0x00000000, 189, 0x57A00000,0x00000000,
+	0x40100000,0x00000000, 190, 0x57C00000,0x00000000,
+	0x40100000,0x00000000, 191, 0x57E00000,0x00000000,
+	0x40100000,0x00000000, 192, 0x58000000,0x00000000,
+	0x40100000,0x00000000, 193, 0x58200000,0x00000000,
+	0x40100000,0x00000000, 194, 0x58400000,0x00000000,
+	0x40100000,0x00000000, 195, 0x58600000,0x00000000,
+	0x40100000,0x00000000, 196, 0x58800000,0x00000000,
+	0x40100000,0x00000000, 197, 0x58A00000,0x00000000,
+	0x40100000,0x00000000, 198, 0x58C00000,0x00000000,
+	0x40100000,0x00000000, 199, 0x58E00000,0x00000000,
+	0x40100000,0x00000000, 200, 0x59000000,0x00000000,
+	0x40100000,0x00000000, 201, 0x59200000,0x00000000,
+	0x40100000,0x00000000, 202, 0x59400000,0x00000000,
+	0x40100000,0x00000000, 203, 0x59600000,0x00000000,
+	0x40100000,0x00000000, 204, 0x59800000,0x00000000,
+	0x40100000,0x00000000, 205, 0x59A00000,0x00000000,
+	0x40100000,0x00000000, 206, 0x59C00000,0x00000000,
+	0x40100000,0x00000000, 207, 0x59E00000,0x00000000,
+	0x40100000,0x00000000, 208, 0x5A000000,0x00000000,
+	0x40100000,0x00000000, 209, 0x5A200000,0x00000000,
+	0x40100000,0x00000000, 210, 0x5A400000,0x00000000,
+	0x40100000,0x00000000, 211, 0x5A600000,0x00000000,
+	0x40100000,0x00000000, 212, 0x5A800000,0x00000000,
+	0x40100000,0x00000000, 213, 0x5AA00000,0x00000000,
+	0x40100000,0x00000000, 214, 0x5AC00000,0x00000000,
+	0x40100000,0x00000000, 215, 0x5AE00000,0x00000000,
+	0x40100000,0x00000000, 216, 0x5B000000,0x00000000,
+	0x40100000,0x00000000, 217, 0x5B200000,0x00000000,
+	0x40100000,0x00000000, 218, 0x5B400000,0x00000000,
+	0x40100000,0x00000000, 219, 0x5B600000,0x00000000,
+	0x40100000,0x00000000, 220, 0x5B800000,0x00000000,
+	0x40100000,0x00000000, 221, 0x5BA00000,0x00000000,
+	0x40100000,0x00000000, 222, 0x5BC00000,0x00000000,
+	0x40100000,0x00000000, 223, 0x5BE00000,0x00000000,
+	0x40100000,0x00000000, 224, 0x5C000000,0x00000000,
+	0x40100000,0x00000000, 225, 0x5C200000,0x00000000,
+	0x40100000,0x00000000, 226, 0x5C400000,0x00000000,
+	0x40100000,0x00000000, 227, 0x5C600000,0x00000000,
+	0x40100000,0x00000000, 228, 0x5C800000,0x00000000,
+	0x40100000,0x00000000, 229, 0x5CA00000,0x00000000,
+	0x40100000,0x00000000, 230, 0x5CC00000,0x00000000,
+	0x40100000,0x00000000, 231, 0x5CE00000,0x00000000,
+	0x40100000,0x00000000, 232, 0x5D000000,0x00000000,
+	0x40100000,0x00000000, 233, 0x5D200000,0x00000000,
+	0x40100000,0x00000000, 234, 0x5D400000,0x00000000,
+	0x40100000,0x00000000, 235, 0x5D600000,0x00000000,
+	0x40100000,0x00000000, 236, 0x5D800000,0x00000000,
+	0x40100000,0x00000000, 237, 0x5DA00000,0x00000000,
+	0x40100000,0x00000000, 238, 0x5DC00000,0x00000000,
+	0x40100000,0x00000000, 239, 0x5DE00000,0x00000000,
+	0x40100000,0x00000000, 240, 0x5E000000,0x00000000,
+	0x40100000,0x00000000, 241, 0x5E200000,0x00000000,
+	0x40100000,0x00000000, 242, 0x5E400000,0x00000000,
+	0x40100000,0x00000000, 243, 0x5E600000,0x00000000,
+	0x40100000,0x00000000, 244, 0x5E800000,0x00000000,
+	0x40100000,0x00000000, 245, 0x5EA00000,0x00000000,
+	0x40100000,0x00000000, 246, 0x5EC00000,0x00000000,
+	0x40100000,0x00000000, 247, 0x5EE00000,0x00000000,
+	0x40100000,0x00000000, 248, 0x5F000000,0x00000000,
+	0x40100000,0x00000000, 249, 0x5F200000,0x00000000,
+	0x40100000,0x00000000, 250, 0x5F400000,0x00000000,
+	0x40100000,0x00000000, 251, 0x5F600000,0x00000000,
+	0x40100000,0x00000000, 252, 0x5F800000,0x00000000,
+	0x40100000,0x00000000, 253, 0x5FA00000,0x00000000,
+	0x40100000,0x00000000, 254, 0x5FC00000,0x00000000,
+	0x40100000,0x00000000, 255, 0x5FE00000,0x00000000,
+	0x40100000,0x00000000, 256, 0x60000000,0x00000000,
+	0x40100000,0x00000000, 257, 0x60200000,0x00000000,
+	0x40100000,0x00000000, 258, 0x60400000,0x00000000,
+	0x40100000,0x00000000, 259, 0x60600000,0x00000000,
+	0x40100000,0x00000000, 260, 0x60800000,0x00000000,
+	0x40100000,0x00000000, 261, 0x60A00000,0x00000000,
+	0x40100000,0x00000000, 262, 0x60C00000,0x00000000,
+	0x40100000,0x00000000, 263, 0x60E00000,0x00000000,
+	0x40100000,0x00000000, 264, 0x61000000,0x00000000,
+	0x40100000,0x00000000, 265, 0x61200000,0x00000000,
+	0x40100000,0x00000000, 266, 0x61400000,0x00000000,
+	0x40100000,0x00000000, 267, 0x61600000,0x00000000,
+	0x40100000,0x00000000, 268, 0x61800000,0x00000000,
+	0x40100000,0x00000000, 269, 0x61A00000,0x00000000,
+	0x40100000,0x00000000, 270, 0x61C00000,0x00000000,
+	0x40100000,0x00000000, 271, 0x61E00000,0x00000000,
+	0x40100000,0x00000000, 272, 0x62000000,0x00000000,
+	0x40100000,0x00000000, 273, 0x62200000,0x00000000,
+	0x40100000,0x00000000, 274, 0x62400000,0x00000000,
+	0x40100000,0x00000000, 275, 0x62600000,0x00000000,
+	0x40100000,0x00000000, 276, 0x62800000,0x00000000,
+	0x40100000,0x00000000, 277, 0x62A00000,0x00000000,
+	0x40100000,0x00000000, 278, 0x62C00000,0x00000000,
+	0x40100000,0x00000000, 279, 0x62E00000,0x00000000,
+	0x40100000,0x00000000, 280, 0x63000000,0x00000000,
+	0x40100000,0x00000000, 281, 0x63200000,0x00000000,
+	0x40100000,0x00000000, 282, 0x63400000,0x00000000,
+	0x40100000,0x00000000, 283, 0x63600000,0x00000000,
+	0x40100000,0x00000000, 284, 0x63800000,0x00000000,
+	0x40100000,0x00000000, 285, 0x63A00000,0x00000000,
+	0x40100000,0x00000000, 286, 0x63C00000,0x00000000,
+	0x40100000,0x00000000, 287, 0x63E00000,0x00000000,
+	0x40100000,0x00000000, 288, 0x64000000,0x00000000,
+	0x40100000,0x00000000, 289, 0x64200000,0x00000000,
+	0x40100000,0x00000000, 290, 0x64400000,0x00000000,
+	0x40100000,0x00000000, 291, 0x64600000,0x00000000,
+	0x40100000,0x00000000, 292, 0x64800000,0x00000000,
+	0x40100000,0x00000000, 293, 0x64A00000,0x00000000,
+	0x40100000,0x00000000, 294, 0x64C00000,0x00000000,
+	0x40100000,0x00000000, 295, 0x64E00000,0x00000000,
+	0x40100000,0x00000000, 296, 0x65000000,0x00000000,
+	0x40100000,0x00000000, 297, 0x65200000,0x00000000,
+	0x40100000,0x00000000, 298, 0x65400000,0x00000000,
+	0x40100000,0x00000000, 299, 0x65600000,0x00000000,
+	0x40100000,0x00000000, 300, 0x65800000,0x00000000,
+	0x40140000,0x00000000, 2, 0x404BF36A,0xE31D6E46,
+	0x40140000,0x00000000, 3, 0x40717822,0xCDF264EC,
+	0x40140000,0x00000000, 4, 0x4095D62B,0x816EFE27,
+	0x40140000,0x00000000, 5, 0x40BB4BB6,0x61CABDB0,
+	0x40140000,0x00000000, 6, 0x40E10F51,0xFD1EB68E,
+	0x40140000,0x00000000, 7, 0x41055326,0x7C666432,
+	0x40140000,0x00000000, 8, 0x412AA7F0,0x1B7FFD3E,
+	0x40140000,0x00000000, 9, 0x4150A8F6,0x112FFE47,
+	0x40140000,0x00000000, 10, 0x4174D333,0x957BFDD9,
+	0x40140000,0x00000000, 11, 0x419A0800,0x7ADAFD4F,
+	0x40140000,0x00000000, 12, 0x41C04500,0x4CC8DE51,
+	0x40140000,0x00000000, 13, 0x41E45640,0x5FFB15E6,
+	0x40140000,0x00000000, 14, 0x42096BD0,0x77F9DB5F,
+	0x40140000,0x00000000, 15, 0x422FC6C4,0x95F85237,
+	0x40140000,0x00000000, 16, 0x4253DC3A,0xDDBB3362,
+	0x40140000,0x00000000, 17, 0x4278D349,0x952A003B,
+	0x40140000,0x00000000, 18, 0x429F081B,0xFA74804A,
+	0x40140000,0x00000000, 19, 0x42C36511,0x7C88D02E,
+	0x40140000,0x00000000, 20, 0x42E83E55,0xDBAB0439,
+	0x40140000,0x00000000, 21, 0x430E4DEB,0x5295C548,
+	0x40140000,0x00000000, 22, 0x4332F0B3,0x139D9B4D,
+	0x40140000,0x00000000, 23, 0x4357ACDF,0xD8850220,
+	0x40140000,0x00000000, 24, 0x437D9817,0xCEA642A8,
+	0x40140000,0x00000000, 25, 0x43A27F0E,0xE127E9A9,
+	0x40140000,0x00000000, 26, 0x43C71ED2,0x9971E413,
+	0x40140000,0x00000000, 27, 0x43ECE687,0x3FCE5D18,
+	0x40140000,0x00000000, 28, 0x44121014,0x87E0FA2F,
+	0x40140000,0x00000000, 29, 0x44369419,0xA9D938BB,
+	0x40140000,0x00000000, 30, 0x445C3920,0x144F86EA,
+	0x40140000,0x00000000, 31, 0x4481A3B4,0x0CB1B452,
+	0x40140000,0x00000000, 32, 0x44A60CA1,0x0FDE2166,
+	0x40140000,0x00000000, 33, 0x44CB8FC9,0x53D5A9C0,
+	0x40140000,0x00000000, 34, 0x44F139DD,0xD4658A18,
+	0x40140000,0x00000000, 35, 0x45158855,0x497EEC9E,
+	0x40140000,0x00000000, 36, 0x453AEA6A,0x9BDEA7C6,
+	0x40140000,0x00000000, 37, 0x4560D282,0xA16B28DC,
+	0x40140000,0x00000000, 38, 0x45850723,0x49C5F312,
+	0x40140000,0x00000000, 39, 0x45AA48EC,0x1C376FD7,
+	0x40140000,0x00000000, 40, 0x45D06D93,0x91A2A5E6,
+	0x40140000,0x00000000, 41, 0x45F488F8,0x760B4F60,
+	0x40140000,0x00000000, 42, 0x4619AB36,0x938E2338,
+	0x40140000,0x00000000, 43, 0x46400B02,0x1C38D603,
+	0x40140000,0x00000000, 44, 0x46640DC2,0xA3470B84,
+	0x40140000,0x00000000, 45, 0x46891133,0x4C18CE65,
+	0x40140000,0x00000000, 46, 0x46AF5580,0x1F1F01FE,
+	0x40140000,0x00000000, 47, 0x46D39570,0x1373613F,
+	0x40140000,0x00000000, 48, 0x46F87ACC,0x1850398E,
+	0x40140000,0x00000000, 49, 0x471E997F,0x1E6447F2,
+	0x40140000,0x00000000, 50, 0x47431FEF,0x72FEACF7,
+	0x40140000,0x00000000, 51, 0x4767E7EB,0x4FBE5835,
+	0x40140000,0x00000000, 52, 0x478DE1E6,0x23ADEE42,
+	0x40140000,0x00000000, 53, 0x47B2AD2F,0xD64CB4E9,
+	0x40140000,0x00000000, 54, 0x47D7587B,0xCBDFE224,
+	0x40140000,0x00000000, 55, 0x47FD2E9A,0xBED7DAAD,
+	0x40140000,0x00000000, 56, 0x48223D20,0xB746E8AC,
+	0x40140000,0x00000000, 57, 0x4846CC68,0xE518A2D7,
+	0x40140000,0x00000000, 58, 0x486C7F83,0x1E5ECB8D,
+	0x40140000,0x00000000, 59, 0x4891CFB1,0xF2FB3F38,
+	0x40140000,0x00000000, 60, 0x48B6439E,0x6FBA0F06,
+	0x40140000,0x00000000, 61, 0x48DBD486,0x0BA892C7,
+	0x40140000,0x00000000, 62, 0x490164D3,0xC7495BBD,
+	0x40140000,0x00000000, 63, 0x4925BE08,0xB91BB2AC,
+	0x40140000,0x00000000, 64, 0x494B2D8A,0xE7629F57,
+	0x40140000,0x00000000, 65, 0x4970FC76,0xD09DA396,
+	0x40140000,0x00000000, 66, 0x49953B94,0x84C50C7C,
+	0x40140000,0x00000000, 67, 0x49BA8A79,0xA5F64F9B,
+	0x40140000,0x00000000, 68, 0x49E0968C,0x07B9F1C1,
+	0x40140000,0x00000000, 69, 0x4A04BC2F,0x09A86E31,
+	0x40140000,0x00000000, 70, 0x4A29EB3A,0xCC1289BD,
+	0x40140000,0x00000000, 71, 0x4A503304,0xBF8B9616,
+	0x40140000,0x00000000, 72, 0x4A743FC5,0xEF6E7B9C,
+	0x40140000,0x00000000, 73, 0x4A994FB7,0x6B4A1A83,
+	0x40140000,0x00000000, 74, 0x4ABFA3A5,0x461CA123,
+	0x40140000,0x00000000, 75, 0x4AE3C647,0x4BD1E4B6,
+	0x40140000,0x00000000, 76, 0x4B08B7D9,0x1EC65DE3,
+	0x40140000,0x00000000, 77, 0x4B2EE5CF,0x6677F55C,
+	0x40140000,0x00000000, 78, 0x4B534FA1,0xA00AF95A,
+	0x40140000,0x00000000, 79, 0x4B78238A,0x080DB7B0,
+	0x40140000,0x00000000, 80, 0x4B9E2C6C,0x8A11259C,
+	0x40140000,0x00000000, 81, 0x4BC2DBC3,0xD64AB782,
+	0x40140000,0x00000000, 82, 0x4BE792B4,0xCBDD6562,
+	0x40140000,0x00000000, 83, 0x4C0D7761,0xFED4BEBB,
+	0x40140000,0x00000000, 84, 0x4C326A9D,0x3F44F735,
+	0x40140000,0x00000000, 85, 0x4C570544,0x8F163502,
+	0x40140000,0x00000000, 86, 0x4C7CC695,0xB2DBC242,
+	0x40140000,0x00000000, 87, 0x4CA1FC1D,0x8FC95969,
+	0x40140000,0x00000000, 88, 0x4CC67B24,0xF3BBAFC4,
+	0x40140000,0x00000000, 89, 0x4CEC19EE,0x30AA9BB5,
+	0x40140000,0x00000000, 90, 0x4D119034,0xDE6AA151,
+	0x40140000,0x00000000, 91, 0x4D35F442,0x160549A5,
+	0x40140000,0x00000000, 92, 0x4D5B7152,0x9B869C0E,
+	0x40140000,0x00000000, 93, 0x4D8126D3,0xA1342189,
+	0x40140000,0x00000000, 94, 0x4DA57088,0x898129EB,
+	0x40140000,0x00000000, 95, 0x4DCACCAA,0xABE17466,
+	0x40140000,0x00000000, 96, 0x4DF0BFEA,0xAB6CE8C0,
+	0x40140000,0x00000000, 97, 0x4E14EFE5,0x564822F0,
+	0x40140000,0x00000000, 98, 0x4E3A2BDE,0xABDA2BAC,
+	0x40140000,0x00000000, 99, 0x4E605B6B,0x2B685B4B,
+	0x40140000,0x00000000, 100, 0x4E847245,0xF642721E,
+	0x40140000,0x00000000, 101, 0x4EA98ED7,0x73D30EA6,
+	0x40140000,0x00000000, 102, 0x4ECFF28D,0x50C7D24F,
+	0x40140000,0x00000000, 103, 0x4EF3F798,0x527CE371,
+	0x40140000,0x00000000, 104, 0x4F18F57E,0x671C1C4E,
+	0x40140000,0x00000000, 105, 0x4F3F32DE,0x00E32361,
+	0x40140000,0x00000000, 106, 0x4F637FCA,0xC08DF61D,
+	0x40140000,0x00000000, 107, 0x4F885FBD,0x70B173A4,
+	0x40140000,0x00000000, 108, 0x4FAE77AC,0xCCDDD08D,
+	0x40140000,0x00000000, 109, 0x4FD30ACC,0x000AA258,
+	0x40140000,0x00000000, 110, 0x4FF7CD7F,0x000D4AEE,
+	0x40140000,0x00000000, 111, 0x501DC0DE,0xC0109DAA,
+	0x40140000,0x00000000, 112, 0x5042988B,0x380A628A,
+	0x40140000,0x00000000, 113, 0x50673EAE,0x060CFB2C,
+	0x40140000,0x00000000, 114, 0x508D0E59,0x879039F8,
+	0x40140000,0x00000000, 115, 0x50B228F7,0xF4BA243B,
+	0x40140000,0x00000000, 116, 0x50D6B335,0xF1E8AD49,
+	0x40140000,0x00000000, 117, 0x50FC6003,0x6E62D89C,
+	0x40140000,0x00000000, 118, 0x5121BC02,0x24FDC761,
+	0x40140000,0x00000000, 119, 0x51462B02,0xAE3D393A,
+	0x40140000,0x00000000, 120, 0x516BB5C3,0x59CC8788,
+	0x40140000,0x00000000, 121, 0x5191519A,0x181FD4B5,
+	0x40140000,0x00000000, 122, 0x51B5A600,0x9E27C9E2,
+	0x40140000,0x00000000, 123, 0x51DB0F80,0xC5B1BC5B,
+	0x40140000,0x00000000, 124, 0x5200E9B0,0x7B8F15B9,
+	0x40140000,0x00000000, 125, 0x5225241C,0x9A72DB27,
+	0x40140000,0x00000000, 126, 0x524A6D23,0xC10F91F1,
+	0x40140000,0x00000000, 127, 0x52708436,0x58A9BB37,
+	0x40140000,0x00000000, 128, 0x5294A543,0xEED42A04,
+	0x40140000,0x00000000, 129, 0x52B9CE94,0xEA893485,
+	0x40140000,0x00000000, 130, 0x52E0211D,0x1295C0D3,
+	0x40140000,0x00000000, 131, 0x53042964,0x573B3108,
+	0x40140000,0x00000000, 132, 0x532933BD,0x6D09FD4A,
+	0x40140000,0x00000000, 133, 0x534F80AC,0xC84C7C9D,
+	0x40140000,0x00000000, 134, 0x5373B06B,0xFD2FCDE2,
+	0x40140000,0x00000000, 135, 0x53989C86,0xFC7BC15A,
+	0x40140000,0x00000000, 136, 0x53BEC3A8,0xBB9AB1B1,
+	0x40140000,0x00000000, 137, 0x53E33A49,0x7540AF0F,
+	0x40140000,0x00000000, 138, 0x540808DB,0xD290DAD2,
+	0x40140000,0x00000000, 139, 0x542E0B12,0xC7351187,
+	0x40140000,0x00000000, 140, 0x5452C6EB,0xBC812AF4,
+	0x40140000,0x00000000, 141, 0x547778A6,0xABA175B1,
+	0x40140000,0x00000000, 142, 0x549D56D0,0x5689D31E,
+	0x40140000,0x00000000, 143, 0x54C25642,0x361623F3,
+	0x40140000,0x00000000, 144, 0x54E6EBD2,0xC39BACEF,
+	0x40140000,0x00000000, 145, 0x550CA6C7,0x7482982B,
+	0x40140000,0x00000000, 146, 0x5531E83C,0xA8D19F1B,
+	0x40140000,0x00000000, 147, 0x5556624B,0xD30606E2,
+	0x40140000,0x00000000, 148, 0x557BFADE,0xC7C7889A,
+	0x40140000,0x00000000, 149, 0x55A17CCB,0x3CDCB560,
+	0x40140000,0x00000000, 150, 0x55C5DBFE,0x0C13E2B8,
+	0x40140000,0x00000000, 151, 0x55EB52FD,0x8F18DB66,
+	0x40140000,0x00000000, 152, 0x561113DE,0x796F8920,
+	0x40140000,0x00000000, 153, 0x563558D6,0x17CB6B68,
+	0x40140000,0x00000000, 154, 0x565AAF0B,0x9DBE4642,
+	0x40140000,0x00000000, 155, 0x5680AD67,0x4296EBE9,
+	0x40140000,0x00000000, 156, 0x56A4D8C1,0x133CA6E3,
+	0x40140000,0x00000000, 157, 0x56CA0EF1,0x580BD09C,
+	0x40140000,0x00000000, 158, 0x56F04956,0xD7076262,
+	0x40140000,0x00000000, 159, 0x57145BAC,0x8CC93AFA,
+	0x40140000,0x00000000, 160, 0x57397297,0xAFFB89B9,
+	0x40140000,0x00000000, 161, 0x575FCF3D,0x9BFA6C27,
+	0x40140000,0x00000000, 162, 0x5783E186,0x817C8398,
+	0x40140000,0x00000000, 163, 0x57A8D9E8,0x21DBA47E,
+	0x40140000,0x00000000, 164, 0x57CF1062,0x2A528D9E,
+	0x40140000,0x00000000, 165, 0x57F36A3D,0x5A739883,
+	0x40140000,0x00000000, 166, 0x581844CC,0xB1107EA3,
+	0x40140000,0x00000000, 167, 0x583E55FF,0xDD549E4C,
+	0x40140000,0x00000000, 168, 0x5862F5BF,0xEA54E2F0,
+	0x40140000,0x00000000, 169, 0x5887B32F,0xE4EA1BAC,
+	0x40140000,0x00000000, 170, 0x58AD9FFB,0xDE24A296,
+	0x40140000,0x00000000, 171, 0x58D283FD,0x6AD6E59E,
+	0x40140000,0x00000000, 172, 0x58F724FC,0xC58C9F06,
+	0x40140000,0x00000000, 173, 0x591CEE3B,0xF6EFC6C7,
+	0x40140000,0x00000000, 174, 0x594214E5,0x7A55DC3C,
+	0x40140000,0x00000000, 175, 0x59669A1E,0xD8EB534B,
+	0x40140000,0x00000000, 176, 0x598C40A6,0x8F26281E,
+	0x40140000,0x00000000, 177, 0x59B1A868,0x1977D913,
+	0x40140000,0x00000000, 178, 0x59D61282,0x1FD5CF58,
+	0x40140000,0x00000000, 179, 0x59FB9722,0xA7CB432E,
+	0x40140000,0x00000000, 180, 0x5A213E75,0xA8DF09FC,
+	0x40140000,0x00000000, 181, 0x5A458E13,0x1316CC7C,
+	0x40140000,0x00000000, 182, 0x5A6AF197,0xD7DC7F9A,
+	0x40140000,0x00000000, 183, 0x5A90D6FE,0xE6E9CFC1,
+	0x40140000,0x00000000, 184, 0x5AB50CBE,0xA0A443B1,
+	0x40140000,0x00000000, 185, 0x5ADA4FEE,0x48CD549D,
+	0x40140000,0x00000000, 186, 0x5B0071F4,0xED8054E2,
+	0x40140000,0x00000000, 187, 0x5B248E72,0x28E06A1B,
+	0x40140000,0x00000000, 188, 0x5B49B20E,0xB31884A1,
+	0x40140000,0x00000000, 189, 0x5B700F49,0x2FEF52E5,
+	0x40140000,0x00000000, 190, 0x5B94131B,0x7BEB279E,
+	0x40140000,0x00000000, 191, 0x5BB917E2,0x5AE5F185,
+	0x40140000,0x00000000, 192, 0x5BDF5DDA,0xF19F6DE7,
+	0x40140000,0x00000000, 193, 0x5C039AA8,0xD703A4B0,
+	0x40140000,0x00000000, 194, 0x5C288153,0x0CC48DDC,
+	0x40140000,0x00000000, 195, 0x5C4EA1A7,0xCFF5B153,
+	0x40140000,0x00000000, 196, 0x5C732508,0xE1F98ED4,
+	0x40140000,0x00000000, 197, 0x5C97EE4B,0x1A77F289,
+	0x40140000,0x00000000, 198, 0x5CBDE9DD,0xE115EF2B,
+	0x40140000,0x00000000, 199, 0x5CE2B22A,0xACADB57B,
+	0x40140000,0x00000000, 200, 0x5D075EB5,0x57D922DA,
+	0x40140000,0x00000000, 201, 0x5D2D3662,0xADCF6B90,
+	0x40140000,0x00000000, 202, 0x5D5241FD,0xACA1A33A,
+	0x40140000,0x00000000, 203, 0x5D76D27D,0x17CA0C09,
+	0x40140000,0x00000000, 204, 0x5D9C871C,0x5DBC8F0B,
+	0x40140000,0x00000000, 205, 0x5DC1D471,0xBA95D967,
+	0x40140000,0x00000000, 206, 0x5DE6498E,0x293B4FC1,
+	0x40140000,0x00000000, 207, 0x5E0BDBF1,0xB38A23B1,
+	0x40140000,0x00000000, 208, 0x5E316977,0x1036564E,
+	0x40140000,0x00000000, 209, 0x5E55C3D4,0xD443EBE2,
+	0x40140000,0x00000000, 210, 0x5E7B34CA,0x0954E6DB,
+	0x40140000,0x00000000, 211, 0x5EA100FE,0x45D51049,
+	0x40140000,0x00000000, 212, 0x5EC5413D,0xD74A545B,
+	0x40140000,0x00000000, 213, 0x5EEA918D,0x4D1CE971,
+	0x40140000,0x00000000, 214, 0x5F109AF8,0x503211E7,
+	0x40140000,0x00000000, 215, 0x5F34C1B6,0x643E9661,
+	0x40140000,0x00000000, 216, 0x5F59F223,0xFD4E3BF9,
+	0x40140000,0x00000000, 217, 0x5F803756,0x7E50E57C,
+	0x40140000,0x00000000, 218, 0x5FA4452C,0x1DE51EDA,
+	0x40140000,0x00000000, 219, 0x5FC95677,0x255E6691,
+	0x40140000,0x00000000, 220, 0x5FEFAC14,0xEEB60035,
+	0x40140000,0x00000000, 221, 0x6013CB8D,0x1531C021,
+	0x40140000,0x00000000, 222, 0x6038BE70,0x5A7E302A,
+	0x40140000,0x00000000, 223, 0x605EEE0C,0x711DBC34,
+	0x40140000,0x00000000, 224, 0x608354C7,0xC6B295A0,
+	0x40140000,0x00000000, 225, 0x60A829F9,0xB85F3B09,
+	0x40140000,0x00000000, 226, 0x60CE3478,0x267709CB,
+	0x40140000,0x00000000, 227, 0x60F2E0CB,0x180A661F,
+	0x40140000,0x00000000, 228, 0x611798FD,0xDE0CFFA6,
+	0x40140000,0x00000000, 229, 0x613D7F3D,0x55903F90,
+	0x40140000,0x00000000, 230, 0x61626F86,0x557A27BA,
+	0x40140000,0x00000000, 231, 0x61870B67,0xEAD8B1A9,
+	0x40140000,0x00000000, 232, 0x61ACCE41,0xE58EDE13,
+	0x40140000,0x00000000, 233, 0x61D200E9,0x2F794ACC,
+	0x40140000,0x00000000, 234, 0x61F68123,0x7B579D7F,
+	0x40140000,0x00000000, 235, 0x621C216C,0x5A2D84DE,
+	0x40140000,0x00000000, 236, 0x624194E3,0xB85C730B,
+	0x40140000,0x00000000, 237, 0x6265FA1C,0xA6738FCE,
+	0x40140000,0x00000000, 238, 0x628B78A3,0xD01073C1,
+	0x40140000,0x00000000, 239, 0x62B12B66,0x620A4859,
+	0x40140000,0x00000000, 240, 0x62D5763F,0xFA8CDA6F,
+	0x40140000,0x00000000, 241, 0x62FAD3CF,0xF930110A,
+	0x40140000,0x00000000, 242, 0x6320C461,0xFBBE0AA7,
+	0x40140000,0x00000000, 243, 0x6344F57A,0x7AAD8D50,
+	0x40140000,0x00000000, 244, 0x636A32D9,0x1958F0A4,
+	0x40140000,0x00000000, 245, 0x63905FC7,0xAFD79667,
+	0x40140000,0x00000000, 246, 0x63B477B9,0x9BCD7C00,
+	0x40140000,0x00000000, 247, 0x63D995A8,0x02C0DB00,
+	0x40140000,0x00000000, 248, 0x63FFFB12,0x037111C0,
+	0x40140000,0x00000000, 249, 0x6423FCEB,0x4226AB18,
+	0x40140000,0x00000000, 250, 0x6448FC26,0x12B055DE,
+	0x40140000,0x00000000, 251, 0x646F3B2F,0x975C6B56,
+	0x40140000,0x00000000, 252, 0x649384FD,0xBE99C316,
+	0x40140000,0x00000000, 253, 0x64B8663D,0x2E4033DB,
+	0x40140000,0x00000000, 254, 0x64DE7FCC,0x79D040D2,
+	0x40140000,0x00000000, 255, 0x65030FDF,0xCC222883,
+	0x40140000,0x00000000, 256, 0x6527D3D7,0xBF2AB2A4,
+	0x40140000,0x00000000, 257, 0x654DC8CD,0xAEF55F4D,
+	0x40140000,0x00000000, 258, 0x65729D80,0x8D595B90,
+	0x40140000,0x00000000, 259, 0x659744E0,0xB0AFB274,
+	0x40140000,0x00000000, 260, 0x65BD1618,0xDCDB9F11,
+	0x40140000,0x00000000, 261, 0x65E22DCF,0x8A09436B,
+	0x40140000,0x00000000, 262, 0x6606B943,0x6C8B9445,
+	0x40140000,0x00000000, 263, 0x662C6794,0x47AE7957,
+	0x40140000,0x00000000, 264, 0x6651C0BC,0xACCD0BD6,
+	0x40140000,0x00000000, 265, 0x667630EB,0xD8004ECC,
+	0x40140000,0x00000000, 266, 0x669BBD26,0xCE00627F,
+	0x40140000,0x00000000, 267, 0x66C15638,0x40C03D8F,
+	0x40140000,0x00000000, 268, 0x66E5ABC6,0x50F04CF3,
+	0x40140000,0x00000000, 269, 0x670B16B7,0xE52C6030,
+	0x40140000,0x00000000, 270, 0x6730EE32,0xEF3BBC1E,
+	0x40140000,0x00000000, 271, 0x675529BF,0xAB0AAB25,
+	0x40140000,0x00000000, 272, 0x677A742F,0x95CD55EF,
+	0x40140000,0x00000000, 273, 0x67A0889D,0xBDA055B5,
+	0x40140000,0x00000000, 274, 0x67C4AAC5,0x2D086B22,
+	0x40140000,0x00000000, 275, 0x67E9D576,0x784A85EB,
+	0x40140000,0x00000000, 276, 0x6810256A,0x0B2E93B3,
+	0x40140000,0x00000000, 277, 0x68342EC4,0x8DFA38A0,
+	0x40140000,0x00000000, 278, 0x68593A75,0xB178C6C8,
+	0x40140000,0x00000000, 279, 0x687F8913,0x1DD6F879,
+	0x40140000,0x00000000, 280, 0x68A3B5AB,0xF2A65B4C,
+	0x40140000,0x00000000, 281, 0x68C8A316,0xEF4FF21F,
+	0x40140000,0x00000000, 282, 0x68EECBDC,0xAB23EEA7,
+	0x40140000,0x00000000, 283, 0x69133F69,0xEAF67528,
+	0x40140000,0x00000000, 284, 0x69380F44,0x65B41272,
+	0x40140000,0x00000000, 285, 0x695E1315,0x7F21170F,
+	0x40140000,0x00000000, 286, 0x6982CBED,0x6F74AE69,
+	0x40140000,0x00000000, 287, 0x69A77EE8,0xCB51DA04,
+	0x40140000,0x00000000, 288, 0x69CD5EA2,0xFE265084,
+	0x40140000,0x00000000, 289, 0x69F25B25,0xDED7F253,
+	0x40140000,0x00000000, 290, 0x6A16F1EF,0x568DEEE7,
+	0x40140000,0x00000000, 291, 0x6A3CAE6B,0x2C316AA1,
+	0x40140000,0x00000000, 292, 0x6A61ED02,0xFB9EE2A5,
+	0x40140000,0x00000000, 293, 0x6A866843,0xBA869B4E,
+	0x40140000,0x00000000, 294, 0x6AAC0254,0xA9284222,
+	0x40140000,0x00000000, 295, 0x6AD18174,0xE9B92955,
+	0x40140000,0x00000000, 296, 0x6AF5E1D2,0x242773AA,
+	0x40140000,0x00000000, 297, 0x6B1B5A46,0xAD315095,
+	0x40140000,0x00000000, 298, 0x6B41186C,0x2C3ED25D,
+	0x40140000,0x00000000, 299, 0x6B655E87,0x374E86F4,
+	0x40140000,0x00000000, 300, 0x6B8AB629,0x052228B1,
+	0x40180000,0x00000000, 2, 0x40560B9F,0xD68A4554,
+	0x40180000,0x00000000, 3, 0x408088B7,0xE0E7B3FF,
+	0x40180000,0x00000000, 4, 0x40A8CD13,0xD15B8DFF,
+	0x40180000,0x00000000, 5, 0x40D299CE,0xDD04AA7F,
+	0x40180000,0x00000000, 6, 0x40FBE6B6,0x4B86FFBF,
+	0x40180000,0x00000000, 7, 0x4124ED08,0xB8A53FCF,
+	0x40180000,0x00000000, 8, 0x414F638D,0x14F7DFB7,
+	0x40180000,0x00000000, 9, 0x41778AA9,0xCFB9E7C9,
+	0x40180000,0x00000000, 10, 0x41A1A7FF,0x5BCB6DD7,
+	0x40180000,0x00000000, 11, 0x41CA7BFF,0x09B124C2,
+	0x40180000,0x00000000, 12, 0x41F3DCFF,0x4744DB92,
+	0x40180000,0x00000000, 13, 0x421DCB7E,0xEAE7495A,
+	0x40180000,0x00000000, 14, 0x4246589F,0x302D7704,
+	0x40180000,0x00000000, 15, 0x4270C277,0x64221943,
+	0x40180000,0x00000000, 16, 0x429923B3,0x163325E4,
+	0x40180000,0x00000000, 17, 0x42C2DAC6,0x50A65C6B,
+	0x40180000,0x00000000, 18, 0x42EC4829,0x78F98AA1,
+	0x40180000,0x00000000, 19, 0x4315361F,0x1ABB27F9,
+	0x40180000,0x00000000, 20, 0x433FD12E,0xA818BBF5,
+	0x40180000,0x00000000, 21, 0x4367DCE2,0xFE128CF8,
+	0x40180000,0x00000000, 22, 0x4391E5AA,0x3E8DE9BA,
+	0x40180000,0x00000000, 23, 0x43BAD87F,0x5DD4DE97,
+	0x40180000,0x00000000, 24, 0x43E4225F,0x865FA6F1,
+	0x40180000,0x00000000, 25, 0x440E338F,0x498F7A69,
+	0x40180000,0x00000000, 26, 0x4436A6AB,0x772B9BCF,
+	0x40180000,0x00000000, 27, 0x4460FD00,0x9960B4DB,
+	0x40180000,0x00000000, 28, 0x44897B80,0xE6110F49,
+	0x40180000,0x00000000, 29, 0x44B31CA0,0xAC8CCB77,
+	0x40180000,0x00000000, 30, 0x44DCAAF1,0x02D33132,
+	0x40180000,0x00000000, 31, 0x45058034,0xC21E64E5,
+	0x40180000,0x00000000, 32, 0x45302027,0x9196CBAC,
+	0x40180000,0x00000000, 33, 0x4558303B,0x5A623182,
+	0x40180000,0x00000000, 34, 0x4582242C,0x83C9A522,
+	0x40180000,0x00000000, 35, 0x45AB3642,0xC5AE77B2,
+	0x40180000,0x00000000, 36, 0x45D468B2,0x1442D9C6,
+	0x40180000,0x00000000, 37, 0x45FE9D0B,0x1E6446A9,
+	0x40180000,0x00000000, 38, 0x4626F5C8,0x56CB34FF,
+	0x40180000,0x00000000, 39, 0x46513856,0x411867BF,
+	0x40180000,0x00000000, 40, 0x4679D481,0x61A49B9E,
+	0x40180000,0x00000000, 41, 0x46A35F61,0x093B74B7,
+	0x40180000,0x00000000, 42, 0x46CD0F11,0x8DD92F12,
+	0x40180000,0x00000000, 43, 0x46F5CB4D,0x2A62E34E,
+	0x40180000,0x00000000, 44, 0x47205879,0xDFCA2A7A,
+	0x40180000,0x00000000, 45, 0x474884B6,0xCFAF3FB7,
+	0x40180000,0x00000000, 46, 0x47726389,0x1BC36FCA,
+	0x40180000,0x00000000, 47, 0x479B954D,0xA9A527AE,
+	0x40180000,0x00000000, 48, 0x47C4AFFA,0x3F3BDDC3,
+	0x40180000,0x00000000, 49, 0x47EF07F7,0x5ED9CCA4,
+	0x40180000,0x00000000, 50, 0x481745F9,0x8723597B,
+	0x40180000,0x00000000, 51, 0x4841747B,0x255A831C,
+	0x40180000,0x00000000, 52, 0x486A2EB8,0xB807C4AA,
+	0x40180000,0x00000000, 53, 0x4893A30A,0x8A05D380,
+	0x40180000,0x00000000, 54, 0x48BD748F,0xCF08BD40,
+	0x40180000,0x00000000, 55, 0x48E6176B,0xDB468DF0,
+	0x40180000,0x00000000, 56, 0x49109190,0xE474EA74,
+	0x40180000,0x00000000, 57, 0x4938DA59,0x56AF5FAE,
+	0x40180000,0x00000000, 58, 0x4962A3C3,0x010387C2,
+	0x40180000,0x00000000, 59, 0x498BF5A4,0x81854BA3,
+	0x40180000,0x00000000, 60, 0x49B4F83B,0x6123F8BB,
+	0x40180000,0x00000000, 61, 0x49DF7459,0x11B5F518,
+	0x40180000,0x00000000, 62, 0x4A079742,0xCD4877D2,
+	0x40180000,0x00000000, 63, 0x4A31B172,0x19F659DD,
+	0x40180000,0x00000000, 64, 0x4A5A8A2B,0x26F186CC,
+	0x40180000,0x00000000, 65, 0x4A83E7A0,0x5D352519,
+	0x40180000,0x00000000, 66, 0x4AADDB70,0x8BCFB7A6,
+	0x40180000,0x00000000, 67, 0x4AD66494,0x68DBC9BC,
+	0x40180000,0x00000000, 68, 0x4B00CB6F,0x4EA4D74D,
+	0x40180000,0x00000000, 69, 0x4B293126,0xF5F742F4,
+	0x40180000,0x00000000, 70, 0x4B52E4DD,0x38797237,
+	0x40180000,0x00000000, 71, 0x4B7C574B,0xD4B62B52,
+	0x40180000,0x00000000, 72, 0x4BA54178,0xDF88A07E,
+	0x40180000,0x00000000, 73, 0x4BCFE235,0x4F4CF0BD,
+	0x40180000,0x00000000, 74, 0x4BF7E9A7,0xFB79B48D,
+	0x40180000,0x00000000, 75, 0x4C21EF3D,0xFC9B476A,
+	0x40180000,0x00000000, 76, 0x4C4AE6DC,0xFAE8EB1F,
+	0x40180000,0x00000000, 77, 0x4C742D25,0xBC2EB057,
+	0x40180000,0x00000000, 78, 0x4C9E43B8,0x9A460883,
+	0x40180000,0x00000000, 79, 0x4CC6B2CA,0x73B48662,
+	0x40180000,0x00000000, 80, 0x4CF10617,0xD6C764CA,
+	0x40180000,0x00000000, 81, 0x4D198923,0xC22B172F,
+	0x40180000,0x00000000, 82, 0x4D4326DA,0xD1A05163,
+	0x40180000,0x00000000, 83, 0x4D6CBA48,0x3A707A14,
+	0x40180000,0x00000000, 84, 0x4D958BB6,0x2BD45B8F,
+	0x40180000,0x00000000, 85, 0x4DC028C8,0xA0DF44AB,
+	0x40180000,0x00000000, 86, 0x4DE83D2C,0xF14EE701,
+	0x40180000,0x00000000, 87, 0x4E122DE1,0xB4FB2D41,
+	0x40180000,0x00000000, 88, 0x4E3B44D2,0x8F78C3E1,
+	0x40180000,0x00000000, 89, 0x4E64739D,0xEB9A92E9,
+	0x40180000,0x00000000, 90, 0x4E8EAD6C,0xE167DC5D,
+	0x40180000,0x00000000, 91, 0x4EB70211,0xA90DE546,
+	0x40180000,0x00000000, 92, 0x4EE1418D,0x3ECA6BF5,
+	0x40180000,0x00000000, 93, 0x4F09E253,0xDE2FA1EF,
+	0x40180000,0x00000000, 94, 0x4F3369BE,0xE6A3B973,
+	0x40180000,0x00000000, 95, 0x4F5D1E9E,0x59F5962D,
+	0x40180000,0x00000000, 96, 0x4F85D6F6,0xC37830A2,
+	0x40180000,0x00000000, 97, 0x4FB06139,0x129A2479,
+	0x40180000,0x00000000, 98, 0x4FD891D5,0x9BE736B6,
+	0x40180000,0x00000000, 99, 0x50026D60,0x34ED6908,
+	0x40180000,0x00000000, 100, 0x502BA410,0x4F641D8C,
+	0x40180000,0x00000000, 101, 0x5054BB0C,0x3B8B1629,
+	0x40180000,0x00000000, 102, 0x507F1892,0x5950A13E,
+	0x40180000,0x00000000, 103, 0x50A7526D,0xC2FC78EF,
+	0x40180000,0x00000000, 104, 0x50D17DD2,0x523D5AB3,
+	0x40180000,0x00000000, 105, 0x50FA3CBB,0x7B5C080C,
+	0x40180000,0x00000000, 106, 0x5123AD8C,0x9C850609,
+	0x40180000,0x00000000, 107, 0x514D8452,0xEAC7890E,
+	0x40180000,0x00000000, 108, 0x5176233E,0x3015A6CA,
+	0x40180000,0x00000000, 109, 0x51A09A6E,0xA4103D18,
+	0x40180000,0x00000000, 110, 0x51C8E7A5,0xF6185BA4,
+	0x40180000,0x00000000, 111, 0x51F2ADBC,0x789244BB,
+	0x40180000,0x00000000, 112, 0x521C049A,0xB4DB6718,
+	0x40180000,0x00000000, 113, 0x52450374,0x07A48D52,
+	0x40180000,0x00000000, 114, 0x526F852E,0x0B76D3FB,
+	0x40180000,0x00000000, 115, 0x5297A3E2,0x88991EFC,
+	0x40180000,0x00000000, 116, 0x52C1BAE9,0xE672D73D,
+	0x40180000,0x00000000, 117, 0x52EA985E,0xD9AC42DC,
+	0x40180000,0x00000000, 118, 0x5313F247,0x23413225,
+	0x40180000,0x00000000, 119, 0x533DEB6A,0xB4E1CB37,
+	0x40180000,0x00000000, 120, 0x53667090,0x07A9586A,
+	0x40180000,0x00000000, 121, 0x5390D46C,0x05BF024F,
+	0x40180000,0x00000000, 122, 0x53B93EA2,0x089E8377,
+	0x40180000,0x00000000, 123, 0x53E2EEF9,0x8676E299,
+	0x40180000,0x00000000, 124, 0x540C6676,0x49B253E6,
+	0x40180000,0x00000000, 125, 0x54354CD8,0xB745BEEC,
+	0x40180000,0x00000000, 126, 0x545FF345,0x12E89E62,
+	0x40180000,0x00000000, 127, 0x5487F673,0xCE2E76CA,
+	0x40180000,0x00000000, 128, 0x54B1F8D6,0xDAA2D917,
+	0x40180000,0x00000000, 129, 0x54DAF542,0x47F445A3,
+	0x40180000,0x00000000, 130, 0x550437F1,0xB5F7343A,
+	0x40180000,0x00000000, 131, 0x552E53EA,0x90F2CE57,
+	0x40180000,0x00000000, 132, 0x5556BEEF,0xECB61AC1,
+	0x40180000,0x00000000, 133, 0x55810F33,0xF1889411,
+	0x40180000,0x00000000, 134, 0x55A996CD,0xEA4CDE1A,
+	0x40180000,0x00000000, 135, 0x55D3311A,0x6FB9A693,
+	0x40180000,0x00000000, 136, 0x55FCC9A7,0xA79679DD,
+	0x40180000,0x00000000, 137, 0x5625973D,0xBDB0DB66,
+	0x40180000,0x00000000, 138, 0x5650316E,0x4E44A48C,
+	0x40180000,0x00000000, 139, 0x56784A25,0x7566F6D2,
+	0x40180000,0x00000000, 140, 0x56A2379C,0x180D391E,
+	0x40180000,0x00000000, 141, 0x56CB536A,0x2413D5AD,
+	0x40180000,0x00000000, 142, 0x56F47E8F,0x9B0EE041,
+	0x40180000,0x00000000, 143, 0x571EBDD7,0x68965062,
+	0x40180000,0x00000000, 144, 0x57470E61,0x8E70BC4A,
+	0x40180000,0x00000000, 145, 0x57714AC9,0x2AD48D37,
+	0x40180000,0x00000000, 146, 0x5799F02D,0xC03ED3D3,
+	0x40180000,0x00000000, 147, 0x57C37422,0x502F1EDE,
+	0x40180000,0x00000000, 148, 0x57ED2E33,0x7846AE4D,
+	0x40180000,0x00000000, 149, 0x5815E2A6,0x9A3502BA,
+	0x40180000,0x00000000, 150, 0x584069FC,0xF3A7C20B,
+	0x40180000,0x00000000, 151, 0x58689EFB,0x6D7BA311,
+	0x40180000,0x00000000, 152, 0x5892773C,0x921CBA4D,
+	0x40180000,0x00000000, 153, 0x58BBB2DA,0xDB2B1773,
+	0x40180000,0x00000000, 154, 0x58E4C624,0x24605196,
+	0x40180000,0x00000000, 155, 0x590F2936,0x36907A62,
+	0x40180000,0x00000000, 156, 0x59375EE8,0xA8EC5BC9,
+	0x40180000,0x00000000, 157, 0x5961872E,0x7EB144D7,
+	0x40180000,0x00000000, 158, 0x598A4AC5,0xBE09E742,
+	0x40180000,0x00000000, 159, 0x59B3B814,0x4E876D72,
+	0x40180000,0x00000000, 160, 0x59DD941E,0x75CB242B,
+	0x40180000,0x00000000, 161, 0x5A062F16,0xD8585B20,
+	0x40180000,0x00000000, 162, 0x5A30A351,0x22424458,
+	0x40180000,0x00000000, 163, 0x5A58F4F9,0xB3636684,
+	0x40180000,0x00000000, 164, 0x5A82B7BB,0x468A8CE3,
+	0x40180000,0x00000000, 165, 0x5AAC1398,0xE9CFD355,
+	0x40180000,0x00000000, 166, 0x5AD50EB2,0xAF5BDE7F,
+	0x40180000,0x00000000, 167, 0x5AFF960C,0x0709CDBF,
+	0x40180000,0x00000000, 168, 0x5B27B089,0x05475A4F,
+	0x40180000,0x00000000, 169, 0x5B51C466,0xC3F583BC,
+	0x40180000,0x00000000, 170, 0x5B7AA69A,0x25F04599,
+	0x40180000,0x00000000, 171, 0x5BA3FCF3,0x9C743433,
+	0x40180000,0x00000000, 172, 0x5BCDFB6D,0x6AAE4E4C,
+	0x40180000,0x00000000, 173, 0x5BF67C92,0x1002BAB9,
+	0x40180000,0x00000000, 174, 0x5C20DD6D,0x8C020C0B,
+	0x40180000,0x00000000, 175, 0x5C494C24,0x52031211,
+	0x40180000,0x00000000, 176, 0x5C72F91B,0x3D824D8C,
+	0x40180000,0x00000000, 177, 0x5C9C75A8,0xDC437453,
+	0x40180000,0x00000000, 178, 0x5CC5583E,0xA532973E,
+	0x40180000,0x00000000, 179, 0x5CF0022E,0xFBE5F16E,
+	0x40180000,0x00000000, 180, 0x5D180346,0x79D8EA26,
+	0x40180000,0x00000000, 181, 0x5D420274,0xDB62AF9C,
+	0x40180000,0x00000000, 182, 0x5D6B03AF,0x4914076A,
+	0x40180000,0x00000000, 183, 0x5D9442C3,0x76CF0590,
+	0x40180000,0x00000000, 184, 0x5DBE6425,0x32368858,
+	0x40180000,0x00000000, 185, 0x5DE6CB1B,0xE5A8E642,
+	0x40180000,0x00000000, 186, 0x5E111854,0xEC3EACB1,
+	0x40180000,0x00000000, 187, 0x5E39A47F,0x625E030A,
+	0x40180000,0x00000000, 188, 0x5E633B5F,0x89C68247,
+	0x40180000,0x00000000, 189, 0x5E8CD90F,0x4EA9C36B,
+	0x40180000,0x00000000, 190, 0x5EB5A2CB,0x7AFF5290,
+	0x40180000,0x00000000, 191, 0x5EE03A18,0x9C3F7DEC,
+	0x40180000,0x00000000, 192, 0x5F085724,0xEA5F3CE2,
+	0x40180000,0x00000000, 193, 0x5F32415B,0xAFC76DAA,
+	0x40180000,0x00000000, 194, 0x5F5B6209,0x87AB247F,
+	0x40180000,0x00000000, 195, 0x5F848987,0x25C05B5F,
+	0x40180000,0x00000000, 196, 0x5FAECE4A,0xB8A0890F,
+	0x40180000,0x00000000, 197, 0x5FD71AB8,0x0A7866CB,
+	0x40180000,0x00000000, 198, 0x6001540A,0x07DA4D18,
+	0x40180000,0x00000000, 199, 0x6029FE0F,0x0BC773A4,
+	0x40180000,0x00000000, 200, 0x60537E8B,0x48D596BB,
+	0x40180000,0x00000000, 201, 0x607D3DD0,0xED406219,
+	0x40180000,0x00000000, 202, 0x60A5EE5C,0xB1F04993,
+	0x40180000,0x00000000, 203, 0x60D072C5,0x8574372E,
+	0x40180000,0x00000000, 204, 0x60F8AC28,0x482E52C5,
+	0x40180000,0x00000000, 205, 0x6122811E,0x3622BE14,
+	0x40180000,0x00000000, 206, 0x614BC1AD,0x51341D1E,
+	0x40180000,0x00000000, 207, 0x6174D141,0xFCE715D6,
+	0x40180000,0x00000000, 208, 0x619F39E2,0xFB5AA0C1,
+	0x40180000,0x00000000, 209, 0x61C76B6A,0x3C83F891,
+	0x40180000,0x00000000, 210, 0x61F1908F,0xAD62FA6D,
+	0x40180000,0x00000000, 211, 0x621A58D7,0x841477A3,
+	0x40180000,0x00000000, 212, 0x6243C2A1,0xA30F59BA,
+	0x40180000,0x00000000, 213, 0x626DA3F2,0x74970698,
+	0x40180000,0x00000000, 214, 0x62963AF5,0xD77144F2,
+	0x40180000,0x00000000, 215, 0x62C0AC38,0x6194F3B5,
+	0x40180000,0x00000000, 216, 0x62E90254,0x925F6D90,
+	0x40180000,0x00000000, 217, 0x6312C1BF,0x6DC7922C,
+	0x40180000,0x00000000, 218, 0x633C229F,0x24AB5B42,
+	0x40180000,0x00000000, 219, 0x636519F7,0x5B808471,
+	0x40180000,0x00000000, 220, 0x638FA6F3,0x0940C6AA,
+	0x40180000,0x00000000, 221, 0x63B7BD36,0x46F09500,
+	0x40180000,0x00000000, 222, 0x63E1CDE8,0xB5346FC0,
+	0x40180000,0x00000000, 223, 0x640AB4DD,0x0FCEA79F,
+	0x40180000,0x00000000, 224, 0x643407A5,0xCBDAFDB8,
+	0x40180000,0x00000000, 225, 0x645E0B78,0xB1C87C93,
+	0x40180000,0x00000000, 226, 0x6486889A,0x85565D6F,
+	0x40180000,0x00000000, 227, 0x64B0E673,0xE400C613,
+	0x40180000,0x00000000, 228, 0x64D959AD,0xD601291C,
+	0x40180000,0x00000000, 229, 0x65030342,0x6080DED5,
+	0x40180000,0x00000000, 230, 0x652C84E3,0x90C14E40,
+	0x40180000,0x00000000, 231, 0x655563AA,0xAC90FAB0,
+	0x40180000,0x00000000, 232, 0x65800AC0,0x016CBC04,
+	0x40180000,0x00000000, 233, 0x65A81020,0x02231A06,
+	0x40180000,0x00000000, 234, 0x65D20C18,0x019A5384,
+	0x40180000,0x00000000, 235, 0x65FB1224,0x02677D47,
+	0x40180000,0x00000000, 236, 0x66244D9B,0x01CD9DF5,
+	0x40180000,0x00000000, 237, 0x664E7468,0x82B46CF0,
+	0x40180000,0x00000000, 238, 0x6676D74E,0x620751B4,
+	0x40180000,0x00000000, 239, 0x66A1217A,0xC9857D47,
+	0x40180000,0x00000000, 240, 0x66C9B238,0x2E483BEA,
+	0x40180000,0x00000000, 241, 0x66F345AA,0x22B62CF0,
+	0x40180000,0x00000000, 242, 0x671CE87F,0x34114367,
+	0x40180000,0x00000000, 243, 0x6745AE5F,0x670CF28E,
+	0x40180000,0x00000000, 244, 0x677042C7,0x8D49B5EA,
+	0x40180000,0x00000000, 245, 0x6798642B,0x53EE90DF,
+	0x40180000,0x00000000, 246, 0x67C24B20,0x7EF2ECA7,
+	0x40180000,0x00000000, 247, 0x67EB70B0,0xBE6C62FB,
+	0x40180000,0x00000000, 248, 0x68149484,0x8ED14A3C,
+	0x40180000,0x00000000, 249, 0x683EDEC6,0xD639EF5B,
+	0x40180000,0x00000000, 250, 0x68672715,0x20AB7384,
+	0x40180000,0x00000000, 251, 0x68915D4F,0xD88096A3,
+	0x40180000,0x00000000, 252, 0x68BA0BF7,0xC4C0E1F4,
+	0x40180000,0x00000000, 253, 0x68E388F9,0xD390A977,
+	0x40180000,0x00000000, 254, 0x690D4D76,0xBD58FE33,
+	0x40180000,0x00000000, 255, 0x6935FA19,0x0E02BEA6,
+	0x40180000,0x00000000, 256, 0x69607B92,0xCA820EFD,
+	0x40180000,0x00000000, 257, 0x6988B95C,0x2FC3167B,
+	0x40180000,0x00000000, 258, 0x69B28B05,0x23D250DC,
+	0x40180000,0x00000000, 259, 0x69DBD087,0xB5BB794A,
+	0x40180000,0x00000000, 260, 0x6A04DC65,0xC84C9AF8,
+	0x40180000,0x00000000, 261, 0x6A2F4A98,0xAC72E874,
+	0x40180000,0x00000000, 262, 0x6A5777F2,0x81562E57,
+	0x40180000,0x00000000, 263, 0x6A8199F5,0xE100A2C1,
+	0x40180000,0x00000000, 264, 0x6AAA66F0,0xD180F422,
+	0x40180000,0x00000000, 265, 0x6AD3CD34,0x9D20B719,
+	0x40180000,0x00000000, 266, 0x6AFDB3CE,0xEBB112A6,
+	0x40180000,0x00000000, 267, 0x6B2646DB,0x30C4CDFC,
+	0x40180000,0x00000000, 268, 0x6B50B524,0x64939A7D,
+	0x40180000,0x00000000, 269, 0x6B790FB6,0x96DD67BC,
+	0x40180000,0x00000000, 270, 0x6BA2CBC8,0xF1260DCD,
+	0x40180000,0x00000000, 271, 0x6BCC31AD,0x69B914B3,
+	0x40180000,0x00000000, 272, 0x6BF52542,0x0F4ACF86,
+	0x40180000,0x00000000, 273, 0x6C1FB7E3,0x16F0374A,
+	0x40180000,0x00000000, 274, 0x6C47C9EA,0x51342977,
+	0x40180000,0x00000000, 275, 0x6C71D76F,0xBCE71F19,
+	0x40180000,0x00000000, 276, 0x6C9AC327,0x9B5AAEA6,
+	0x40180000,0x00000000, 277, 0x6CC4125D,0xB48402FD,
+	0x40180000,0x00000000, 278, 0x6CEE1B8C,0x8EC6047B,
+	0x40180000,0x00000000, 279, 0x6D1694A9,0x6B14835C,
+	0x40180000,0x00000000, 280, 0x6D40EF7F,0x104F6285,
+	0x40180000,0x00000000, 281, 0x6D69673E,0x987713C8,
+	0x40180000,0x00000000, 282, 0x6D930D6E,0xF2594ED6,
+	0x40180000,0x00000000, 283, 0x6DBC9426,0x6B85F641,
+	0x40180000,0x00000000, 284, 0x6DE56F1C,0xD0A478B1,
+	0x40180000,0x00000000, 285, 0x6E101355,0x9C7B5A84,
+	0x40180000,0x00000000, 286, 0x6E381D00,0x6AB907C7,
+	0x40180000,0x00000000, 287, 0x6E6215C0,0x500AC5D5,
+	0x40180000,0x00000000, 288, 0x6E8B20A0,0x781028BF,
+	0x40180000,0x00000000, 289, 0x6EB45878,0x5A0C1E90,
+	0x40180000,0x00000000, 290, 0x6EDE84B4,0x87122DD7,
+	0x40180000,0x00000000, 291, 0x6F06E387,0x654DA262,
+	0x40180000,0x00000000, 292, 0x6F312AA5,0x8BFA39C9,
+	0x40180000,0x00000000, 293, 0x6F59BFF8,0x51F756AE,
+	0x40180000,0x00000000, 294, 0x6F834FFA,0x3D798102,
+	0x40180000,0x00000000, 295, 0x6FACF7F7,0x5C364183,
+	0x40180000,0x00000000, 296, 0x6FD5B9F9,0x8528B123,
+	0x40180000,0x00000000, 297, 0x70004B7B,0x23DE84DA,
+	0x40180000,0x00000000, 298, 0x70287138,0xB5CDC747,
+	0x40180000,0x00000000, 299, 0x705254EA,0x885A5575,
+	0x40180000,0x00000000, 300, 0x707B7F5F,0xCC878030,
+	0x401C0000,0x00000000, 2, 0x40603489,0xBE058693,
+	0x401C0000,0x00000000, 3, 0x408C5BF1,0x0C89AB81,
+	0x401C0000,0x00000000, 4, 0x40B8D072,0xEAF87611,
+	0x401C0000,0x00000000, 5, 0x40E5B664,0x8D99674F,
+	0x401C0000,0x00000000, 6, 0x4112FF97,0xFBE63A65,
+	0x401C0000,0x00000000, 7, 0x41409FA4,0xFC697318,
+	0x401C0000,0x00000000, 8, 0x416D1760,0xB9B8896B,
+	0x401C0000,0x00000000, 9, 0x41997474,0xA281783D,
+	0x401C0000,0x00000000, 10, 0x41C645E6,0x0E314936,
+	0x401C0000,0x00000000, 11, 0x41F37D29,0x4C6B200F,
+	0x401C0000,0x00000000, 12, 0x42210D84,0x22DDBC0D,
+	0x401C0000,0x00000000, 13, 0x424DD7A7,0x3D040917,
+	0x401C0000,0x00000000, 14, 0x427A1CB2,0x556387F4,
+	0x401C0000,0x00000000, 15, 0x42A6D91C,0x0AB716F6,
+	0x401C0000,0x00000000, 16, 0x42D3FDF8,0x89603417,
+	0x401C0000,0x00000000, 17, 0x43017E39,0x78342D94,
+	0x401C0000,0x00000000, 18, 0x432E9CE4,0x925B4FC3,
+	0x401C0000,0x00000000, 19, 0x435AC948,0x000FE5CB,
+	0x401C0000,0x00000000, 20, 0x4387701F,0x000DE911,
+	0x401C0000,0x00000000, 21, 0x43B4821B,0x200C2BEF,
+	0x401C0000,0x00000000, 22, 0x43E1F1D7,0xBC0AA671,
+	0x401C0000,0x00000000, 23, 0x440F6739,0x8912A346,
+	0x401C0000,0x00000000, 24, 0x443B7A52,0x57F04EDD,
+	0x401C0000,0x00000000, 25, 0x44680B08,0x0CF24502,
+	0x401C0000,0x00000000, 26, 0x449509A7,0x0B53FC62,
+	0x401C0000,0x00000000, 27, 0x44C26872,0x29E97CD5,
+	0x401C0000,0x00000000, 28, 0x44F01B63,0xE4AC4D3B,
+	0x401C0000,0x00000000, 29, 0x451C2FEE,0xD02D8727,
+	0x401C0000,0x00000000, 30, 0x4548A9F0,0xF627D642,
+	0x401C0000,0x00000000, 31, 0x457594B2,0xD762DB7A,
+	0x401C0000,0x00000000, 32, 0x45A2E21C,0x7C76800A,
+	0x401C0000,0x00000000, 33, 0x45D085D8,0xECE7B009,
+	0x401C0000,0x00000000, 34, 0x45FCEA3B,0x9E957410,
+	0x401C0000,0x00000000, 35, 0x46294CF4,0x2AC2C58E,
+	0x401C0000,0x00000000, 36, 0x46562355,0xA56A6CDC,
+	0x401C0000,0x00000000, 37, 0x46835EEA,0xF0BD1F41,
+	0x401C0000,0x00000000, 38, 0x46B0F30D,0x92A57B59,
+	0x401C0000,0x00000000, 39, 0x46DDA957,0xC0A197DB,
+	0x401C0000,0x00000000, 40, 0x4709F42C,0xC88D64E0,
+	0x401C0000,0x00000000, 41, 0x4736B5A7,0x2F7BB844,
+	0x401C0000,0x00000000, 42, 0x4763DEF2,0x498C413B,
+	0x401C0000,0x00000000, 43, 0x47916314,0x005AB914,
+	0x401C0000,0x00000000, 44, 0x47BE6D63,0x009EC3E3,
+	0x401C0000,0x00000000, 45, 0x47EA9FB6,0xA08AEB66,
+	0x401C0000,0x00000000, 46, 0x48174BBF,0xCC798DFA,
+	0x401C0000,0x00000000, 47, 0x48446247,0xD2EA5C3A,
+	0x401C0000,0x00000000, 48, 0x4871D5FE,0xD88D10B3,
+	0x401C0000,0x00000000, 49, 0x489F367D,0xFAF6DD39,
+	0x401C0000,0x00000000, 50, 0x48CB4FAE,0x3B980192,
+	0x401C0000,0x00000000, 51, 0x48F7E5B8,0x74250160,
+	0x401C0000,0x00000000, 52, 0x4924E901,0x65A06134,
+	0x401C0000,0x00000000, 53, 0x49524BE1,0x38EC550D,
+	0x401C0000,0x00000000, 54, 0x49800265,0x11CECA6C,
+	0x401C0000,0x00000000, 55, 0x49AC0430,0xDF29E23D,
+	0x401C0000,0x00000000, 56, 0x49D883AA,0xC344A5F5,
+	0x401C0000,0x00000000, 57, 0x4A057335,0x6ADC1136,
+	0x401C0000,0x00000000, 58, 0x4A32C4CE,0xBD808F10,
+	0x401C0000,0x00000000, 59, 0x4A606C34,0xE5D07D2E,
+	0x401C0000,0x00000000, 60, 0x4A8CBD5C,0x922CDB10,
+	0x401C0000,0x00000000, 61, 0x4AB925B0,0xFFE73FAE,
+	0x401C0000,0x00000000, 62, 0x4AE600FA,0xDFEA57B8,
+	0x401C0000,0x00000000, 63, 0x4B1340DB,0x83ED0CC1,
+	0x401C0000,0x00000000, 64, 0x4B40D8C0,0x136F6B29,
+	0x401C0000,0x00000000, 65, 0x4B6D7B50,0x2202FB88,
+	0x401C0000,0x00000000, 66, 0x4B99CBE6,0x1DC29C17,
+	0x401C0000,0x00000000, 67, 0x4BC69269,0x5A0A4894,
+	0x401C0000,0x00000000, 68, 0x4BF3C01C,0x2EC8FF81,
+	0x401C0000,0x00000000, 69, 0x4C214818,0xA8EFDF91,
+	0x401C0000,0x00000000, 70, 0x4C4E3E2B,0x27A3C73E,
+	0x401C0000,0x00000000, 71, 0x4C7A7665,0xC2AF4E56,
+	0x401C0000,0x00000000, 72, 0x4CA72799,0x0A59648C,
+	0x401C0000,0x00000000, 73, 0x4CD442A5,0xE90E37FA,
+	0x401C0000,0x00000000, 74, 0x4D01BA51,0x2BEC70FB,
+	0x401C0000,0x00000000, 75, 0x4D2F060E,0x0CDDC5B7,
+	0x401C0000,0x00000000, 76, 0x4D5B254C,0x4B420D00,
+	0x401C0000,0x00000000, 77, 0x4D87C0A2,0xC1D9CB60,
+	0x401C0000,0x00000000, 78, 0x4DB4C88E,0x699E91F4,
+	0x401C0000,0x00000000, 79, 0x4DE22F7C,0x9C6ABFB6,
+	0x401C0000,0x00000000, 80, 0x4E0FD31A,0x11BACF7E,
+	0x401C0000,0x00000000, 81, 0x4E3BD8B6,0xCF83758E,
+	0x401C0000,0x00000000, 82, 0x4E685D9F,0xF59306DC,
+	0x401C0000,0x00000000, 83, 0x4E9551EB,0xF6E0A601,
+	0x401C0000,0x00000000, 84, 0x4EC2A7AE,0x78049141,
+	0x401C0000,0x00000000, 85, 0x4EF052B8,0xA903FF19,
+	0x401C0000,0x00000000, 86, 0x4F1C90C3,0x27C6FE6B,
+	0x401C0000,0x00000000, 87, 0x4F48FEAA,0xC2CE1E9E,
+	0x401C0000,0x00000000, 88, 0x4F75DED5,0x6A745ACA,
+	0x401C0000,0x00000000, 89, 0x4FA322FA,0xBD25CF71,
+	0x401C0000,0x00000000, 90, 0x4FD0BE9B,0x65811583,
+	0x401C0000,0x00000000, 91, 0x4FFD4D8F,0xF1A1E5A5,
+	0x401C0000,0x00000000, 92, 0x5029A3DD,0xF36DA8F0,
+	0x401C0000,0x00000000, 93, 0x50566F62,0x34FFF3D2,
+	0x401C0000,0x00000000, 94, 0x5083A175,0xEE5FF558,
+	0x401C0000,0x00000000, 95, 0x50B12D47,0x3093F6AD,
+	0x401C0000,0x00000000, 96, 0x50DE0F3C,0x9502EFAE,
+	0x401C0000,0x00000000, 97, 0x510A4D55,0x026291B9,
+	0x401C0000,0x00000000, 98, 0x513703AA,0x62163F82,
+	0x401C0000,0x00000000, 99, 0x51642335,0x15D37791,
+	0x401C0000,0x00000000, 100, 0x51919ECE,0x7319089F,
+	0x401C0000,0x00000000, 101, 0x51BED5E9,0x496BCF17,
+	0x401C0000,0x00000000, 102, 0x51EAFB2C,0x203E5534,
+	0x401C0000,0x00000000, 103, 0x52179BC6,0x9C368A8D,
+	0x401C0000,0x00000000, 104, 0x5244A84D,0xC8AFB93C,
+	0x401C0000,0x00000000, 105, 0x52721344,0x0F99C214,
+	0x401C0000,0x00000000, 106, 0x529FA1B7,0x1B4D13A3,
+	0x401C0000,0x00000000, 107, 0x52CBAD80,0x37E3712F,
+	0x401C0000,0x00000000, 108, 0x52F837D0,0x30E70309,
+	0x401C0000,0x00000000, 109, 0x532530D6,0x2ACA22A8,
+	0x401C0000,0x00000000, 110, 0x53528ABB,0x6570DE53,
+	0x401C0000,0x00000000, 111, 0x53803963,0xF8C2C289,
+	0x401C0000,0x00000000, 112, 0x53AC646E,0xF354D46F,
+	0x401C0000,0x00000000, 113, 0x53D8D7E1,0x14EA39E1,
+	0x401C0000,0x00000000, 114, 0x5405BCE4,0xF24CF2A5,
+	0x401C0000,0x00000000, 115, 0x54330548,0x54035450,
+	0x401C0000,0x00000000, 116, 0x5460A49F,0x4982E9C6,
+	0x401C0000,0x00000000, 117, 0x548D2016,0xC0A5191B,
+	0x401C0000,0x00000000, 118, 0x54B97C13,0xE89075F8,
+	0x401C0000,0x00000000, 119, 0x54E64C91,0x6B7E6739,
+	0x401C0000,0x00000000, 120, 0x551382FF,0x3E0E9A52,
+	0x401C0000,0x00000000, 121, 0x5541129F,0x564CC707,
+	0x401C0000,0x00000000, 122, 0x556DE096,0xD7065C4D,
+	0x401C0000,0x00000000, 123, 0x559A2483,0xFC2590C3,
+	0x401C0000,0x00000000, 124, 0x55C6DFF3,0x7CA0DEAB,
+	0x401C0000,0x00000000, 125, 0x55F403F5,0x0D0CC2D6,
+	0x401C0000,0x00000000, 126, 0x56218376,0x6B6B2A7B,
+	0x401C0000,0x00000000, 127, 0x564EA60F,0x3BFB8A57,
+	0x401C0000,0x00000000, 128, 0x567AD14D,0x547C190C,
+	0x401C0000,0x00000000, 129, 0x56A77723,0xA9EC95EB,
+	0x401C0000,0x00000000, 130, 0x56D4883F,0x34AF032D,
+	0x401C0000,0x00000000, 131, 0x5701F737,0x4E1922C8,
+	0x401C0000,0x00000000, 132, 0x572F70A0,0xC8ABFCDD,
+	0x401C0000,0x00000000, 133, 0x575B828C,0xAF967D42,
+	0x401C0000,0x00000000, 134, 0x5788123B,0x19A3AD99,
+	0x401C0000,0x00000000, 135, 0x57B50FF3,0xB66F37E6,
+	0x401C0000,0x00000000, 136, 0x57E26DF5,0x3FA150E9,
+	0x401C0000,0x00000000, 137, 0x58102036,0x97AD26CC,
+	0x401C0000,0x00000000, 138, 0x583C385F,0x896F03E5,
+	0x401C0000,0x00000000, 139, 0x5868B153,0x98412369,
+	0x401C0000,0x00000000, 140, 0x58959B29,0x2538FEFC,
+	0x401C0000,0x00000000, 141, 0x58C2E7C4,0x0091DF1C,
+	0x401C0000,0x00000000, 142, 0x58F08ACB,0x807FA339,
+	0x401C0000,0x00000000, 143, 0x591CF2E4,0x20DF5DA3,
+	0x401C0000,0x00000000, 144, 0x59495487,0x9CC371EF,
+	0x401C0000,0x00000000, 145, 0x597629F6,0xA92B03B1,
+	0x401C0000,0x00000000, 146, 0x59A364B7,0xD405A33B,
+	0x401C0000,0x00000000, 147, 0x59D0F820,0xD984EED4,
+	0x401C0000,0x00000000, 148, 0x59FDB239,0x7CA8A1F2,
+	0x401C0000,0x00000000, 149, 0x5A29FBF2,0x4D138DB4,
+	0x401C0000,0x00000000, 150, 0x5A56BC74,0x03711BFD,
+	0x401C0000,0x00000000, 151, 0x5A83E4E5,0x8302F87E,
+	0x401C0000,0x00000000, 152, 0x5AB16848,0xD2A2996E,
+	0x401C0000,0x00000000, 153, 0x5ADE767F,0x709C8C80,
+	0x401C0000,0x00000000, 154, 0x5B0AA7AF,0x8288FAF0,
+	0x401C0000,0x00000000, 155, 0x5B3752B9,0x9237DB92,
+	0x401C0000,0x00000000, 156, 0x5B646862,0x5FF0E020,
+	0x401C0000,0x00000000, 157, 0x5B91DB56,0x13F2C41C,
+	0x401C0000,0x00000000, 158, 0x5BBF3FD6,0xA2E8D731,
+	0x401C0000,0x00000000, 159, 0x5BEB57DB,0xCE8BBC4B,
+	0x401C0000,0x00000000, 160, 0x5C17ECE0,0x54BA44C2,
+	0x401C0000,0x00000000, 161, 0x5C44EF44,0x4A22FC29,
+	0x401C0000,0x00000000, 162, 0x5C72515B,0xC0DE9CA4,
+	0x401C0000,0x00000000, 163, 0x5CA00730,0x48C2C910,
+	0x401C0000,0x00000000, 164, 0x5CCC0C94,0x7F54DFDB,
+	0x401C0000,0x00000000, 165, 0x5CF88B01,0xEF6A43E0,
+	0x401C0000,0x00000000, 166, 0x5D2579A1,0xB17CFB64,
+	0x401C0000,0x00000000, 167, 0x5D52CA6D,0x7B4D5BF8,
+	0x401C0000,0x00000000, 168, 0x5D80711F,0xCBE3B079,
+	0x401C0000,0x00000000, 169, 0x5DACC5F7,0xA4CE74D3,
+	0x401C0000,0x00000000, 170, 0x5DD92D38,0xB034A639,
+	0x401C0000,0x00000000, 171, 0x5E060791,0x9A2E1172,
+	0x401C0000,0x00000000, 172, 0x5E33469F,0x66E84F43,
+	0x401C0000,0x00000000, 173, 0x5E60DDCB,0x7A0B455B,
+	0x401C0000,0x00000000, 174, 0x5E8D8424,0x1593B95F,
+	0x401C0000,0x00000000, 175, 0x5EB9D39F,0x92E14233,
+	0x401C0000,0x00000000, 176, 0x5EE6992B,0xA08519ED,
+	0x401C0000,0x00000000, 177, 0x5F13C606,0x2C7476AF,
+	0x401C0000,0x00000000, 178, 0x5F414D45,0x66E5E7D9,
+	0x401C0000,0x00000000, 179, 0x5F6E4739,0x741255BC,
+	0x401C0000,0x00000000, 180, 0x5F9A7E52,0x45900B05,
+	0x401C0000,0x00000000, 181, 0x5FC72E87,0xFCDE09A4,
+	0x401C0000,0x00000000, 182, 0x5FF448B6,0xFD424870,
+	0x401C0000,0x00000000, 183, 0x6021BFA0,0x1D99FF62,
+	0x401C0000,0x00000000, 184, 0x604F0F58,0x33CD7EEB,
+	0x401C0000,0x00000000, 185, 0x607B2D6D,0x2D53CF0E,
+	0x401C0000,0x00000000, 186, 0x60A7C7BF,0x87A9552C,
+	0x401C0000,0x00000000, 187, 0x60D4CEC7,0x96B42A86,
+	0x401C0000,0x00000000, 188, 0x610234EE,0xA3DDA536,
+	0x401C0000,0x00000000, 189, 0x612FDCA1,0x9EC3E11E,
+	0x401C0000,0x00000000, 190, 0x615BE10D,0x6AEB64FA,
+	0x401C0000,0x00000000, 191, 0x618864EB,0xBD8DF85B,
+	0x401C0000,0x00000000, 192, 0x61B5584E,0x45DC3950,
+	0x401C0000,0x00000000, 193, 0x61E2AD44,0x7D20B226,
+	0x401C0000,0x00000000, 194, 0x6210579B,0xED7C9BE1,
+	0x401C0000,0x00000000, 195, 0x623C9950,0xDF9A10CA,
+	0x401C0000,0x00000000, 196, 0x62690626,0xC3A6CEB0,
+	0x401C0000,0x00000000, 197, 0x6295E561,0xEB31F4DA,
+	0x401C0000,0x00000000, 198, 0x62C328B5,0xADCBB63F,
+	0x401C0000,0x00000000, 199, 0x62F0C39E,0xF8123F77,
+	0x401C0000,0x00000000, 200, 0x631D5656,0x321FEF10,
+	0x401C0000,0x00000000, 201, 0x6349AB8B,0x6BDBF12E,
+	0x401C0000,0x00000000, 202, 0x63767619,0xFE607309,
+	0x401C0000,0x00000000, 203, 0x63A3A756,0xBE9464A8,
+	0x401C0000,0x00000000, 204, 0x63D1326B,0xE6C1D813,
+	0x401C0000,0x00000000, 205, 0x63FE183C,0xD3D33A21,
+	0x401C0000,0x00000000, 206, 0x642A5535,0x3958D2DC,
+	0x401C0000,0x00000000, 207, 0x64570A8E,0x922DB881,
+	0x401C0000,0x00000000, 208, 0x6484293C,0xBFE80171,
+	0x401C0000,0x00000000, 209, 0x64B1A415,0x27EB0143,
+	0x401C0000,0x00000000, 210, 0x64DEDF25,0x05DB4235,
+	0x401C0000,0x00000000, 211, 0x650B0340,0x651FD9EE,
+	0x401C0000,0x00000000, 212, 0x6537A2D8,0x587BDEB0,
+	0x401C0000,0x00000000, 213, 0x6564AE7D,0x4D6C62DA,
+	0x401C0000,0x00000000, 214, 0x659218AD,0xA3BED67F,
+	0x401C0000,0x00000000, 215, 0x65BFAB2F,0xDE8DF75E,
+	0x401C0000,0x00000000, 216, 0x65EBB5C9,0xE2BC3873,
+	0x401C0000,0x00000000, 217, 0x66183F10,0xA664B164,
+	0x401C0000,0x00000000, 218, 0x6645372E,0x91981B38,
+	0x401C0000,0x00000000, 219, 0x66729048,0xBF6517D1,
+	0x401C0000,0x00000000, 220, 0x66A03E3F,0xA77874D7,
+	0x401C0000,0x00000000, 221, 0x66CC6CEF,0x6512CC78,
+	0x401C0000,0x00000000, 222, 0x66F8DF51,0x787072E9,
+	0x401C0000,0x00000000, 223, 0x6725C367,0x4962648C,
+	0x401C0000,0x00000000, 224, 0x67530AFA,0x603617FA,
+	0x401C0000,0x00000000, 225, 0x6780A99B,0x142F54FB,
+	0x401C0000,0x00000000, 226, 0x67AD28CF,0x6352D4B7,
+	0x401C0000,0x00000000, 227, 0x67D983B5,0x76E87A20,
+	0x401C0000,0x00000000, 228, 0x6806533E,0xC80B6ADC,
+	0x401C0000,0x00000000, 229, 0x683388D6,0xEF09FD81,
+	0x401C0000,0x00000000, 230, 0x686117BC,0x1128BDD1,
+	0x401C0000,0x00000000, 231, 0x688DE989,0x1E074C2D,
+	0x401C0000,0x00000000, 232, 0x68BA2C57,0xFA4662A7,
+	0x401C0000,0x00000000, 233, 0x68E6E6CC,0xFAFD9652,
+	0x401C0000,0x00000000, 234, 0x691409F3,0x5B9DE388,
+	0x401C0000,0x00000000, 235, 0x694188B4,0xF02A2717,
+	0x401C0000,0x00000000, 236, 0x696EAF3C,0xA449C468,
+	0x401C0000,0x00000000, 237, 0x699AD955,0x0FC08BDB,
+	0x401C0000,0x00000000, 238, 0x69C77E2A,0x6DC87A60,
+	0x401C0000,0x00000000, 239, 0x69F48E65,0x200F6B14,
+	0x401C0000,0x00000000, 240, 0x6A21FC98,0x7C0D7DB1,
+	0x401C0000,0x00000000, 241, 0x6A4F7A0A,0xD9179BF7,
+	0x401C0000,0x00000000, 242, 0x6A7B8AC9,0x7DF4A878,
+	0x401C0000,0x00000000, 243, 0x6AA81970,0x4E361369,
+	0x401C0000,0x00000000, 244, 0x6AD51642,0x446F50FC,
+	0x401C0000,0x00000000, 245, 0x6B027379,0xFBE166DC,
+	0x401C0000,0x00000000, 246, 0x6B30250A,0xBC653A01,
+	0x401C0000,0x00000000, 247, 0x6B5C40D2,0xC9B12581,
+	0x401C0000,0x00000000, 248, 0x6B88B8B8,0x707B00D1,
+	0x401C0000,0x00000000, 249, 0x6BB5A1A1,0x626BA0B7,
+	0x401C0000,0x00000000, 250, 0x6BE2ED6D,0x361E2CA0,
+	0x401C0000,0x00000000, 251, 0x6C108FBF,0x8F5A670C,
+	0x401C0000,0x00000000, 252, 0x6C3CFB8F,0x3ADE3455,
+	0x401C0000,0x00000000, 253, 0x6C695C1D,0x53826DCA,
+	0x401C0000,0x00000000, 254, 0x6C963099,0xA9122011,
+	0x401C0000,0x00000000, 255, 0x6CC36A86,0x73EFDC0F,
+	0x401C0000,0x00000000, 256, 0x6CF0FD35,0xA571E08D,
+	0x401C0000,0x00000000, 257, 0x6D1DBB1D,0xE18748F7,
+	0x401C0000,0x00000000, 258, 0x6D4A03BA,0x25565FD8,
+	0x401C0000,0x00000000, 259, 0x6D76C342,0xE0AB93DD,
+	0x401C0000,0x00000000, 260, 0x6DA3EADA,0x84962161,
+	0x401C0000,0x00000000, 261, 0x6DD16D7F,0x34035D35,
+	0x401C0000,0x00000000, 262, 0x6DFE7F9E,0x9B05E31D,
+	0x401C0000,0x00000000, 263, 0x6E2AAFAA,0xC7A526BA,
+	0x401C0000,0x00000000, 264, 0x6E5759B5,0x6EB081E2,
+	0x401C0000,0x00000000, 265, 0x6E846E7E,0xC0DA71A6,
+	0x401C0000,0x00000000, 266, 0x6EB1E0AE,0xE8BF2371,
+	0x401C0000,0x00000000, 267, 0x6EDF4932,0x174E7E06,
+	0x401C0000,0x00000000, 268, 0x6F0B600B,0xD464AE45,
+	0x401C0000,0x00000000, 269, 0x6F37F40A,0x59D8187D,
+	0x401C0000,0x00000000, 270, 0x6F64F589,0x0E9D156D,
+	0x401C0000,0x00000000, 271, 0x6F9256D7,0xECC972C0,
+	0x401C0000,0x00000000, 272, 0x6FC00BFC,0xEF304468,
+	0x401C0000,0x00000000, 273, 0x6FEC14FA,0xA29477B5,
+	0x401C0000,0x00000000, 274, 0x7018925B,0x4E41E8BF,
+	0x401C0000,0x00000000, 275, 0x7045800F,0xE479ABA7,
+	0x401C0000,0x00000000, 276, 0x7072D00D,0xE7EA7632,
+	0x401C0000,0x00000000, 277, 0x70A0760C,0x2AED276C,
+	0x401C0000,0x00000000, 278, 0x70CCCE95,0x4B1F04FD,
+	0x401C0000,0x00000000, 279, 0x70F934C2,0xA1BB245D,
+	0x401C0000,0x00000000, 280, 0x71260E2A,0x4D83BFD1,
+	0x401C0000,0x00000000, 281, 0x71534C65,0x03D347D7,
+	0x401C0000,0x00000000, 282, 0x7180E2D8,0x6358DEDC,
+	0x401C0000,0x00000000, 283, 0x71AD8CFA,0xADDB8601,
+	0x401C0000,0x00000000, 284, 0x71D9DB5B,0x58201541,
+	0x401C0000,0x00000000, 285, 0x72069FEF,0xED1C1299,
+	0x401C0000,0x00000000, 286, 0x7233CBF1,0xEF789046,
+	0x401C0000,0x00000000, 287, 0x72615273,0xB1897E3D,
+	0x401C0000,0x00000000, 288, 0x728E504A,0x76B09CEB,
+	0x401C0000,0x00000000, 289, 0x72BA8641,0x27DA894E,
+	0x401C0000,0x00000000, 290, 0x72E73579,0x02DF3824,
+	0x401C0000,0x00000000, 291, 0x73144EC9,0xE2835120,
+	0x401C0000,0x00000000, 292, 0x7341C4F0,0xA632E6FC,
+	0x401C0000,0x00000000, 293, 0x736F18A5,0x22D91438,
+	0x401C0000,0x00000000, 294, 0x739B3590,0x7E7DF1B1,
+	0x401C0000,0x00000000, 295, 0x73C7CEDE,0x6EAE337B,
+	0x401C0000,0x00000000, 296, 0x73F4D502,0xA0D86D0C,
+	0x401C0000,0x00000000, 297, 0x74223A62,0x4CBD5F6A,
+	0x401C0000,0x00000000, 298, 0x744FE62C,0x064B66FA,
+	0x401C0000,0x00000000, 299, 0x747BE966,0x8581FA1B,
+	0x401C0000,0x00000000, 300, 0x74A86C39,0xB4D1BAD7,
+	0x40200000,0x00000000, 2, 0x4066A09E,0x667F3BCD,
+	0x40200000,0x00000000, 3, 0x4096A09E,0x667F3BCD,
+	0x40200000,0x00000000, 4, 0x40C6A09E,0x667F3BCD,
+	0x40200000,0x00000000, 5, 0x40F6A09E,0x667F3BCD,
+	0x40200000,0x00000000, 6, 0x4126A09E,0x667F3BCD,
+	0x40200000,0x00000000, 7, 0x4156A09E,0x667F3BCD,
+	0x40200000,0x00000000, 8, 0x4186A09E,0x667F3BCD,
+	0x40200000,0x00000000, 9, 0x41B6A09E,0x667F3BCD,
+	0x40200000,0x00000000, 10, 0x41E6A09E,0x667F3BCD,
+	0x40200000,0x00000000, 11, 0x4216A09E,0x667F3BCD,
+	0x40200000,0x00000000, 12, 0x4246A09E,0x667F3BCD,
+	0x40200000,0x00000000, 13, 0x4276A09E,0x667F3BCD,
+	0x40200000,0x00000000, 14, 0x42A6A09E,0x667F3BCD,
+	0x40200000,0x00000000, 15, 0x42D6A09E,0x667F3BCD,
+	0x40200000,0x00000000, 16, 0x4306A09E,0x667F3BCD,
+	0x40200000,0x00000000, 17, 0x4336A09E,0x667F3BCD,
+	0x40200000,0x00000000, 18, 0x4366A09E,0x667F3BCD,
+	0x40200000,0x00000000, 19, 0x4396A09E,0x667F3BCD,
+	0x40200000,0x00000000, 20, 0x43C6A09E,0x667F3BCD,
+	0x40200000,0x00000000, 21, 0x43F6A09E,0x667F3BCD,
+	0x40200000,0x00000000, 22, 0x4426A09E,0x667F3BCD,
+	0x40200000,0x00000000, 23, 0x4456A09E,0x667F3BCD,
+	0x40200000,0x00000000, 24, 0x4486A09E,0x667F3BCD,
+	0x40200000,0x00000000, 25, 0x44B6A09E,0x667F3BCD,
+	0x40200000,0x00000000, 26, 0x44E6A09E,0x667F3BCD,
+	0x40200000,0x00000000, 27, 0x4516A09E,0x667F3BCD,
+	0x40200000,0x00000000, 28, 0x4546A09E,0x667F3BCD,
+	0x40200000,0x00000000, 29, 0x4576A09E,0x667F3BCD,
+	0x40200000,0x00000000, 30, 0x45A6A09E,0x667F3BCD,
+	0x40200000,0x00000000, 31, 0x45D6A09E,0x667F3BCD,
+	0x40200000,0x00000000, 32, 0x4606A09E,0x667F3BCD,
+	0x40200000,0x00000000, 33, 0x4636A09E,0x667F3BCD,
+	0x40200000,0x00000000, 34, 0x4666A09E,0x667F3BCD,
+	0x40200000,0x00000000, 35, 0x4696A09E,0x667F3BCD,
+	0x40200000,0x00000000, 36, 0x46C6A09E,0x667F3BCD,
+	0x40200000,0x00000000, 37, 0x46F6A09E,0x667F3BCD,
+	0x40200000,0x00000000, 38, 0x4726A09E,0x667F3BCD,
+	0x40200000,0x00000000, 39, 0x4756A09E,0x667F3BCD,
+	0x40200000,0x00000000, 40, 0x4786A09E,0x667F3BCD,
+	0x40200000,0x00000000, 41, 0x47B6A09E,0x667F3BCD,
+	0x40200000,0x00000000, 42, 0x47E6A09E,0x667F3BCD,
+	0x40200000,0x00000000, 43, 0x4816A09E,0x667F3BCD,
+	0x40200000,0x00000000, 44, 0x4846A09E,0x667F3BCD,
+	0x40200000,0x00000000, 45, 0x4876A09E,0x667F3BCD,
+	0x40200000,0x00000000, 46, 0x48A6A09E,0x667F3BCD,
+	0x40200000,0x00000000, 47, 0x48D6A09E,0x667F3BCD,
+	0x40200000,0x00000000, 48, 0x4906A09E,0x667F3BCD,
+	0x40200000,0x00000000, 49, 0x4936A09E,0x667F3BCD,
+	0x40200000,0x00000000, 50, 0x4966A09E,0x667F3BCD,
+	0x40200000,0x00000000, 51, 0x4996A09E,0x667F3BCD,
+	0x40200000,0x00000000, 52, 0x49C6A09E,0x667F3BCD,
+	0x40200000,0x00000000, 53, 0x49F6A09E,0x667F3BCD,
+	0x40200000,0x00000000, 54, 0x4A26A09E,0x667F3BCD,
+	0x40200000,0x00000000, 55, 0x4A56A09E,0x667F3BCD,
+	0x40200000,0x00000000, 56, 0x4A86A09E,0x667F3BCD,
+	0x40200000,0x00000000, 57, 0x4AB6A09E,0x667F3BCD,
+	0x40200000,0x00000000, 58, 0x4AE6A09E,0x667F3BCD,
+	0x40200000,0x00000000, 59, 0x4B16A09E,0x667F3BCD,
+	0x40200000,0x00000000, 60, 0x4B46A09E,0x667F3BCD,
+	0x40200000,0x00000000, 61, 0x4B76A09E,0x667F3BCD,
+	0x40200000,0x00000000, 62, 0x4BA6A09E,0x667F3BCD,
+	0x40200000,0x00000000, 63, 0x4BD6A09E,0x667F3BCD,
+	0x40200000,0x00000000, 64, 0x4C06A09E,0x667F3BCD,
+	0x40200000,0x00000000, 65, 0x4C36A09E,0x667F3BCD,
+	0x40200000,0x00000000, 66, 0x4C66A09E,0x667F3BCD,
+	0x40200000,0x00000000, 67, 0x4C96A09E,0x667F3BCD,
+	0x40200000,0x00000000, 68, 0x4CC6A09E,0x667F3BCD,
+	0x40200000,0x00000000, 69, 0x4CF6A09E,0x667F3BCD,
+	0x40200000,0x00000000, 70, 0x4D26A09E,0x667F3BCD,
+	0x40200000,0x00000000, 71, 0x4D56A09E,0x667F3BCD,
+	0x40200000,0x00000000, 72, 0x4D86A09E,0x667F3BCD,
+	0x40200000,0x00000000, 73, 0x4DB6A09E,0x667F3BCD,
+	0x40200000,0x00000000, 74, 0x4DE6A09E,0x667F3BCD,
+	0x40200000,0x00000000, 75, 0x4E16A09E,0x667F3BCD,
+	0x40200000,0x00000000, 76, 0x4E46A09E,0x667F3BCD,
+	0x40200000,0x00000000, 77, 0x4E76A09E,0x667F3BCD,
+	0x40200000,0x00000000, 78, 0x4EA6A09E,0x667F3BCD,
+	0x40200000,0x00000000, 79, 0x4ED6A09E,0x667F3BCD,
+	0x40200000,0x00000000, 80, 0x4F06A09E,0x667F3BCD,
+	0x40200000,0x00000000, 81, 0x4F36A09E,0x667F3BCD,
+	0x40200000,0x00000000, 82, 0x4F66A09E,0x667F3BCD,
+	0x40200000,0x00000000, 83, 0x4F96A09E,0x667F3BCD,
+	0x40200000,0x00000000, 84, 0x4FC6A09E,0x667F3BCD,
+	0x40200000,0x00000000, 85, 0x4FF6A09E,0x667F3BCD,
+	0x40200000,0x00000000, 86, 0x5026A09E,0x667F3BCD,
+	0x40200000,0x00000000, 87, 0x5056A09E,0x667F3BCD,
+	0x40200000,0x00000000, 88, 0x5086A09E,0x667F3BCD,
+	0x40200000,0x00000000, 89, 0x50B6A09E,0x667F3BCD,
+	0x40200000,0x00000000, 90, 0x50E6A09E,0x667F3BCD,
+	0x40200000,0x00000000, 91, 0x5116A09E,0x667F3BCD,
+	0x40200000,0x00000000, 92, 0x5146A09E,0x667F3BCD,
+	0x40200000,0x00000000, 93, 0x5176A09E,0x667F3BCD,
+	0x40200000,0x00000000, 94, 0x51A6A09E,0x667F3BCD,
+	0x40200000,0x00000000, 95, 0x51D6A09E,0x667F3BCD,
+	0x40200000,0x00000000, 96, 0x5206A09E,0x667F3BCD,
+	0x40200000,0x00000000, 97, 0x5236A09E,0x667F3BCD,
+	0x40200000,0x00000000, 98, 0x5266A09E,0x667F3BCD,
+	0x40200000,0x00000000, 99, 0x5296A09E,0x667F3BCD,
+	0x40200000,0x00000000, 100, 0x52C6A09E,0x667F3BCD,
+	0x40200000,0x00000000, 101, 0x52F6A09E,0x667F3BCD,
+	0x40200000,0x00000000, 102, 0x5326A09E,0x667F3BCD,
+	0x40200000,0x00000000, 103, 0x5356A09E,0x667F3BCD,
+	0x40200000,0x00000000, 104, 0x5386A09E,0x667F3BCD,
+	0x40200000,0x00000000, 105, 0x53B6A09E,0x667F3BCD,
+	0x40200000,0x00000000, 106, 0x53E6A09E,0x667F3BCD,
+	0x40200000,0x00000000, 107, 0x5416A09E,0x667F3BCD,
+	0x40200000,0x00000000, 108, 0x5446A09E,0x667F3BCD,
+	0x40200000,0x00000000, 109, 0x5476A09E,0x667F3BCD,
+	0x40200000,0x00000000, 110, 0x54A6A09E,0x667F3BCD,
+	0x40200000,0x00000000, 111, 0x54D6A09E,0x667F3BCD,
+	0x40200000,0x00000000, 112, 0x5506A09E,0x667F3BCD,
+	0x40200000,0x00000000, 113, 0x5536A09E,0x667F3BCD,
+	0x40200000,0x00000000, 114, 0x5566A09E,0x667F3BCD,
+	0x40200000,0x00000000, 115, 0x5596A09E,0x667F3BCD,
+	0x40200000,0x00000000, 116, 0x55C6A09E,0x667F3BCD,
+	0x40200000,0x00000000, 117, 0x55F6A09E,0x667F3BCD,
+	0x40200000,0x00000000, 118, 0x5626A09E,0x667F3BCD,
+	0x40200000,0x00000000, 119, 0x5656A09E,0x667F3BCD,
+	0x40200000,0x00000000, 120, 0x5686A09E,0x667F3BCD,
+	0x40200000,0x00000000, 121, 0x56B6A09E,0x667F3BCD,
+	0x40200000,0x00000000, 122, 0x56E6A09E,0x667F3BCD,
+	0x40200000,0x00000000, 123, 0x5716A09E,0x667F3BCD,
+	0x40200000,0x00000000, 124, 0x5746A09E,0x667F3BCD,
+	0x40200000,0x00000000, 125, 0x5776A09E,0x667F3BCD,
+	0x40200000,0x00000000, 126, 0x57A6A09E,0x667F3BCD,
+	0x40200000,0x00000000, 127, 0x57D6A09E,0x667F3BCD,
+	0x40200000,0x00000000, 128, 0x5806A09E,0x667F3BCD,
+	0x40200000,0x00000000, 129, 0x5836A09E,0x667F3BCD,
+	0x40200000,0x00000000, 130, 0x5866A09E,0x667F3BCD,
+	0x40200000,0x00000000, 131, 0x5896A09E,0x667F3BCD,
+	0x40200000,0x00000000, 132, 0x58C6A09E,0x667F3BCD,
+	0x40200000,0x00000000, 133, 0x58F6A09E,0x667F3BCD,
+	0x40200000,0x00000000, 134, 0x5926A09E,0x667F3BCD,
+	0x40200000,0x00000000, 135, 0x5956A09E,0x667F3BCD,
+	0x40200000,0x00000000, 136, 0x5986A09E,0x667F3BCD,
+	0x40200000,0x00000000, 137, 0x59B6A09E,0x667F3BCD,
+	0x40200000,0x00000000, 138, 0x59E6A09E,0x667F3BCD,
+	0x40200000,0x00000000, 139, 0x5A16A09E,0x667F3BCD,
+	0x40200000,0x00000000, 140, 0x5A46A09E,0x667F3BCD,
+	0x40200000,0x00000000, 141, 0x5A76A09E,0x667F3BCD,
+	0x40200000,0x00000000, 142, 0x5AA6A09E,0x667F3BCD,
+	0x40200000,0x00000000, 143, 0x5AD6A09E,0x667F3BCD,
+	0x40200000,0x00000000, 144, 0x5B06A09E,0x667F3BCD,
+	0x40200000,0x00000000, 145, 0x5B36A09E,0x667F3BCD,
+	0x40200000,0x00000000, 146, 0x5B66A09E,0x667F3BCD,
+	0x40200000,0x00000000, 147, 0x5B96A09E,0x667F3BCD,
+	0x40200000,0x00000000, 148, 0x5BC6A09E,0x667F3BCD,
+	0x40200000,0x00000000, 149, 0x5BF6A09E,0x667F3BCD,
+	0x40200000,0x00000000, 150, 0x5C26A09E,0x667F3BCD,
+	0x40200000,0x00000000, 151, 0x5C56A09E,0x667F3BCD,
+	0x40200000,0x00000000, 152, 0x5C86A09E,0x667F3BCD,
+	0x40200000,0x00000000, 153, 0x5CB6A09E,0x667F3BCD,
+	0x40200000,0x00000000, 154, 0x5CE6A09E,0x667F3BCD,
+	0x40200000,0x00000000, 155, 0x5D16A09E,0x667F3BCD,
+	0x40200000,0x00000000, 156, 0x5D46A09E,0x667F3BCD,
+	0x40200000,0x00000000, 157, 0x5D76A09E,0x667F3BCD,
+	0x40200000,0x00000000, 158, 0x5DA6A09E,0x667F3BCD,
+	0x40200000,0x00000000, 159, 0x5DD6A09E,0x667F3BCD,
+	0x40200000,0x00000000, 160, 0x5E06A09E,0x667F3BCD,
+	0x40200000,0x00000000, 161, 0x5E36A09E,0x667F3BCD,
+	0x40200000,0x00000000, 162, 0x5E66A09E,0x667F3BCD,
+	0x40200000,0x00000000, 163, 0x5E96A09E,0x667F3BCD,
+	0x40200000,0x00000000, 164, 0x5EC6A09E,0x667F3BCD,
+	0x40200000,0x00000000, 165, 0x5EF6A09E,0x667F3BCD,
+	0x40200000,0x00000000, 166, 0x5F26A09E,0x667F3BCD,
+	0x40200000,0x00000000, 167, 0x5F56A09E,0x667F3BCD,
+	0x40200000,0x00000000, 168, 0x5F86A09E,0x667F3BCD,
+	0x40200000,0x00000000, 169, 0x5FB6A09E,0x667F3BCD,
+	0x40200000,0x00000000, 170, 0x5FE6A09E,0x667F3BCD,
+	0x40200000,0x00000000, 171, 0x6016A09E,0x667F3BCD,
+	0x40200000,0x00000000, 172, 0x6046A09E,0x667F3BCD,
+	0x40200000,0x00000000, 173, 0x6076A09E,0x667F3BCD,
+	0x40200000,0x00000000, 174, 0x60A6A09E,0x667F3BCD,
+	0x40200000,0x00000000, 175, 0x60D6A09E,0x667F3BCD,
+	0x40200000,0x00000000, 176, 0x6106A09E,0x667F3BCD,
+	0x40200000,0x00000000, 177, 0x6136A09E,0x667F3BCD,
+	0x40200000,0x00000000, 178, 0x6166A09E,0x667F3BCD,
+	0x40200000,0x00000000, 179, 0x6196A09E,0x667F3BCD,
+	0x40200000,0x00000000, 180, 0x61C6A09E,0x667F3BCD,
+	0x40200000,0x00000000, 181, 0x61F6A09E,0x667F3BCD,
+	0x40200000,0x00000000, 182, 0x6226A09E,0x667F3BCD,
+	0x40200000,0x00000000, 183, 0x6256A09E,0x667F3BCD,
+	0x40200000,0x00000000, 184, 0x6286A09E,0x667F3BCD,
+	0x40200000,0x00000000, 185, 0x62B6A09E,0x667F3BCD,
+	0x40200000,0x00000000, 186, 0x62E6A09E,0x667F3BCD,
+	0x40200000,0x00000000, 187, 0x6316A09E,0x667F3BCD,
+	0x40200000,0x00000000, 188, 0x6346A09E,0x667F3BCD,
+	0x40200000,0x00000000, 189, 0x6376A09E,0x667F3BCD,
+	0x40200000,0x00000000, 190, 0x63A6A09E,0x667F3BCD,
+	0x40200000,0x00000000, 191, 0x63D6A09E,0x667F3BCD,
+	0x40200000,0x00000000, 192, 0x6406A09E,0x667F3BCD,
+	0x40200000,0x00000000, 193, 0x6436A09E,0x667F3BCD,
+	0x40200000,0x00000000, 194, 0x6466A09E,0x667F3BCD,
+	0x40200000,0x00000000, 195, 0x6496A09E,0x667F3BCD,
+	0x40200000,0x00000000, 196, 0x64C6A09E,0x667F3BCD,
+	0x40200000,0x00000000, 197, 0x64F6A09E,0x667F3BCD,
+	0x40200000,0x00000000, 198, 0x6526A09E,0x667F3BCD,
+	0x40200000,0x00000000, 199, 0x6556A09E,0x667F3BCD,
+	0x40200000,0x00000000, 200, 0x6586A09E,0x667F3BCD,
+	0x40200000,0x00000000, 201, 0x65B6A09E,0x667F3BCD,
+	0x40200000,0x00000000, 202, 0x65E6A09E,0x667F3BCD,
+	0x40200000,0x00000000, 203, 0x6616A09E,0x667F3BCD,
+	0x40200000,0x00000000, 204, 0x6646A09E,0x667F3BCD,
+	0x40200000,0x00000000, 205, 0x6676A09E,0x667F3BCD,
+	0x40200000,0x00000000, 206, 0x66A6A09E,0x667F3BCD,
+	0x40200000,0x00000000, 207, 0x66D6A09E,0x667F3BCD,
+	0x40200000,0x00000000, 208, 0x6706A09E,0x667F3BCD,
+	0x40200000,0x00000000, 209, 0x6736A09E,0x667F3BCD,
+	0x40200000,0x00000000, 210, 0x6766A09E,0x667F3BCD,
+	0x40200000,0x00000000, 211, 0x6796A09E,0x667F3BCD,
+	0x40200000,0x00000000, 212, 0x67C6A09E,0x667F3BCD,
+	0x40200000,0x00000000, 213, 0x67F6A09E,0x667F3BCD,
+	0x40200000,0x00000000, 214, 0x6826A09E,0x667F3BCD,
+	0x40200000,0x00000000, 215, 0x6856A09E,0x667F3BCD,
+	0x40200000,0x00000000, 216, 0x6886A09E,0x667F3BCD,
+	0x40200000,0x00000000, 217, 0x68B6A09E,0x667F3BCD,
+	0x40200000,0x00000000, 218, 0x68E6A09E,0x667F3BCD,
+	0x40200000,0x00000000, 219, 0x6916A09E,0x667F3BCD,
+	0x40200000,0x00000000, 220, 0x6946A09E,0x667F3BCD,
+	0x40200000,0x00000000, 221, 0x6976A09E,0x667F3BCD,
+	0x40200000,0x00000000, 222, 0x69A6A09E,0x667F3BCD,
+	0x40200000,0x00000000, 223, 0x69D6A09E,0x667F3BCD,
+	0x40200000,0x00000000, 224, 0x6A06A09E,0x667F3BCD,
+	0x40200000,0x00000000, 225, 0x6A36A09E,0x667F3BCD,
+	0x40200000,0x00000000, 226, 0x6A66A09E,0x667F3BCD,
+	0x40200000,0x00000000, 227, 0x6A96A09E,0x667F3BCD,
+	0x40200000,0x00000000, 228, 0x6AC6A09E,0x667F3BCD,
+	0x40200000,0x00000000, 229, 0x6AF6A09E,0x667F3BCD,
+	0x40200000,0x00000000, 230, 0x6B26A09E,0x667F3BCD,
+	0x40200000,0x00000000, 231, 0x6B56A09E,0x667F3BCD,
+	0x40200000,0x00000000, 232, 0x6B86A09E,0x667F3BCD,
+	0x40200000,0x00000000, 233, 0x6BB6A09E,0x667F3BCD,
+	0x40200000,0x00000000, 234, 0x6BE6A09E,0x667F3BCD,
+	0x40200000,0x00000000, 235, 0x6C16A09E,0x667F3BCD,
+	0x40200000,0x00000000, 236, 0x6C46A09E,0x667F3BCD,
+	0x40200000,0x00000000, 237, 0x6C76A09E,0x667F3BCD,
+	0x40200000,0x00000000, 238, 0x6CA6A09E,0x667F3BCD,
+	0x40200000,0x00000000, 239, 0x6CD6A09E,0x667F3BCD,
+	0x40200000,0x00000000, 240, 0x6D06A09E,0x667F3BCD,
+	0x40200000,0x00000000, 241, 0x6D36A09E,0x667F3BCD,
+	0x40200000,0x00000000, 242, 0x6D66A09E,0x667F3BCD,
+	0x40200000,0x00000000, 243, 0x6D96A09E,0x667F3BCD,
+	0x40200000,0x00000000, 244, 0x6DC6A09E,0x667F3BCD,
+	0x40200000,0x00000000, 245, 0x6DF6A09E,0x667F3BCD,
+	0x40200000,0x00000000, 246, 0x6E26A09E,0x667F3BCD,
+	0x40200000,0x00000000, 247, 0x6E56A09E,0x667F3BCD,
+	0x40200000,0x00000000, 248, 0x6E86A09E,0x667F3BCD,
+	0x40200000,0x00000000, 249, 0x6EB6A09E,0x667F3BCD,
+	0x40200000,0x00000000, 250, 0x6EE6A09E,0x667F3BCD,
+	0x40200000,0x00000000, 251, 0x6F16A09E,0x667F3BCD,
+	0x40200000,0x00000000, 252, 0x6F46A09E,0x667F3BCD,
+	0x40200000,0x00000000, 253, 0x6F76A09E,0x667F3BCD,
+	0x40200000,0x00000000, 254, 0x6FA6A09E,0x667F3BCD,
+	0x40200000,0x00000000, 255, 0x6FD6A09E,0x667F3BCD,
+	0x40200000,0x00000000, 256, 0x7006A09E,0x667F3BCD,
+	0x40200000,0x00000000, 257, 0x7036A09E,0x667F3BCD,
+	0x40200000,0x00000000, 258, 0x7066A09E,0x667F3BCD,
+	0x40200000,0x00000000, 259, 0x7096A09E,0x667F3BCD,
+	0x40200000,0x00000000, 260, 0x70C6A09E,0x667F3BCD,
+	0x40200000,0x00000000, 261, 0x70F6A09E,0x667F3BCD,
+	0x40200000,0x00000000, 262, 0x7126A09E,0x667F3BCD,
+	0x40200000,0x00000000, 263, 0x7156A09E,0x667F3BCD,
+	0x40200000,0x00000000, 264, 0x7186A09E,0x667F3BCD,
+	0x40200000,0x00000000, 265, 0x71B6A09E,0x667F3BCD,
+	0x40200000,0x00000000, 266, 0x71E6A09E,0x667F3BCD,
+	0x40200000,0x00000000, 267, 0x7216A09E,0x667F3BCD,
+	0x40200000,0x00000000, 268, 0x7246A09E,0x667F3BCD,
+	0x40200000,0x00000000, 269, 0x7276A09E,0x667F3BCD,
+	0x40200000,0x00000000, 270, 0x72A6A09E,0x667F3BCD,
+	0x40200000,0x00000000, 271, 0x72D6A09E,0x667F3BCD,
+	0x40200000,0x00000000, 272, 0x7306A09E,0x667F3BCD,
+	0x40200000,0x00000000, 273, 0x7336A09E,0x667F3BCD,
+	0x40200000,0x00000000, 274, 0x7366A09E,0x667F3BCD,
+	0x40200000,0x00000000, 275, 0x7396A09E,0x667F3BCD,
+	0x40200000,0x00000000, 276, 0x73C6A09E,0x667F3BCD,
+	0x40200000,0x00000000, 277, 0x73F6A09E,0x667F3BCD,
+	0x40200000,0x00000000, 278, 0x7426A09E,0x667F3BCD,
+	0x40200000,0x00000000, 279, 0x7456A09E,0x667F3BCD,
+	0x40200000,0x00000000, 280, 0x7486A09E,0x667F3BCD,
+	0x40200000,0x00000000, 281, 0x74B6A09E,0x667F3BCD,
+	0x40200000,0x00000000, 282, 0x74E6A09E,0x667F3BCD,
+	0x40200000,0x00000000, 283, 0x7516A09E,0x667F3BCD,
+	0x40200000,0x00000000, 284, 0x7546A09E,0x667F3BCD,
+	0x40200000,0x00000000, 285, 0x7576A09E,0x667F3BCD,
+	0x40200000,0x00000000, 286, 0x75A6A09E,0x667F3BCD,
+	0x40200000,0x00000000, 287, 0x75D6A09E,0x667F3BCD,
+	0x40200000,0x00000000, 288, 0x7606A09E,0x667F3BCD,
+	0x40200000,0x00000000, 289, 0x7636A09E,0x667F3BCD,
+	0x40200000,0x00000000, 290, 0x7666A09E,0x667F3BCD,
+	0x40200000,0x00000000, 291, 0x7696A09E,0x667F3BCD,
+	0x40200000,0x00000000, 292, 0x76C6A09E,0x667F3BCD,
+	0x40200000,0x00000000, 293, 0x76F6A09E,0x667F3BCD,
+	0x40200000,0x00000000, 294, 0x7726A09E,0x667F3BCD,
+	0x40200000,0x00000000, 295, 0x7756A09E,0x667F3BCD,
+	0x40200000,0x00000000, 296, 0x7786A09E,0x667F3BCD,
+	0x40200000,0x00000000, 297, 0x77B6A09E,0x667F3BCD,
+	0x40200000,0x00000000, 298, 0x77E6A09E,0x667F3BCD,
+	0x40200000,0x00000000, 299, 0x7816A09E,0x667F3BCD,
+	0x40200000,0x00000000, 300, 0x7846A09E,0x667F3BCD,
+	0x40220000,0x00000000, 2, 0x406E6000,0x00000000,
+	0x40220000,0x00000000, 3, 0x40A11600,0x00000000,
+	0x40220000,0x00000000, 4, 0x40D338C0,0x00000000,
+	0x40220000,0x00000000, 5, 0x41059FD8,0x00000000,
+	0x40220000,0x00000000, 6, 0x413853D3,0x00000000,
+	0x40220000,0x00000000, 7, 0x416B5E4D,0x60000000,
+	0x40220000,0x00000000, 8, 0x419ECA17,0x0C000000,
+	0x40220000,0x00000000, 9, 0x41D151AC,0xF6C00000,
+	0x40220000,0x00000000, 10, 0x42037BE2,0x95980000,
+	0x40220000,0x00000000, 11, 0x4235EB5E,0xE84B0000,
+	0x40220000,0x00000000, 12, 0x4268A8CA,0xC5546000,
+	0x40220000,0x00000000, 13, 0x429BBDE4,0x1DFEEC00,
+	0x40220000,0x00000000, 14, 0x42CF35A0,0xA1BEC980,
+	0x40220000,0x00000000, 15, 0x43018E2A,0x5AFB5158,
+	0x40220000,0x00000000, 16, 0x4333BFEF,0xA65ABB83,
+	0x40220000,0x00000000, 17, 0x436637ED,0x9B2612F3,
+	0x40220000,0x00000000, 18, 0x4398FEEB,0x4E8AD552,
+	0x40220000,0x00000000, 19, 0x43CC1EC8,0xB85C2FFC,
+	0x40220000,0x00000000, 20, 0x43FFA2A1,0xCF67B5FC,
+	0x40220000,0x00000000, 21, 0x4431CB7B,0x04AA565D,
+	0x40220000,0x00000000, 22, 0x446404EA,0x653FA129,
+	0x40220000,0x00000000, 23, 0x44968587,0xB1E7954E,
+	0x40220000,0x00000000, 24, 0x44C95638,0xA82487F8,
+	0x40220000,0x00000000, 25, 0x44FC80FF,0xBD2918F7,
+	0x40220000,0x00000000, 26, 0x4530088F,0xDA671E0B,
+	0x40220000,0x00000000, 27, 0x456209A1,0xD5B401CC,
+	0x40220000,0x00000000, 28, 0x45944AD6,0x106A8206,
+	0x40220000,0x00000000, 29, 0x45C6D430,0xD277D247,
+	0x40220000,0x00000000, 30, 0x45F9AEB6,0xECC6CC8F,
+	0x40220000,0x00000000, 31, 0x462CE48D,0xCA5FA621,
+	0x40220000,0x00000000, 32, 0x4660408F,0xC1D5CD73,
+	0x40220000,0x00000000, 33, 0x469248A1,0xBA108721,
+	0x40220000,0x00000000, 34, 0x46C491B5,0xF1529805,
+	0x40220000,0x00000000, 35, 0x46F723EC,0xAF7CEB06,
+	0x40220000,0x00000000, 36, 0x472A086A,0x456C8867,
+	0x40220000,0x00000000, 37, 0x475D4977,0x8E1A1974,
+	0x40220000,0x00000000, 38, 0x47907953,0x3FEEAE51,
+	0x40220000,0x00000000, 39, 0x47C2887D,0xA7EC841B,
+	0x40220000,0x00000000, 40, 0x47F4D98D,0x5CEA149F,
+	0x40220000,0x00000000, 41, 0x482774BF,0x08875732,
+	0x40220000,0x00000000, 42, 0x485A6356,0xE9984219,
+	0x40220000,0x00000000, 43, 0x488DAFC1,0xC6CB4A5C,
+	0x40220000,0x00000000, 44, 0x48C0B2DC,0xFFD259D4,
+	0x40220000,0x00000000, 45, 0x48F2C938,0x9FCCA50E,
+	0x40220000,0x00000000, 46, 0x4925225F,0xB3C639B0,
+	0x40220000,0x00000000, 47, 0x4957C6AB,0xAA3F00E6,
+	0x40220000,0x00000000, 48, 0x498ABF81,0x1F86E102,
+	0x40220000,0x00000000, 49, 0x49BE1771,0x4377BD23,
+	0x40220000,0x00000000, 50, 0x49F0ED2F,0xB5F35A64,
+	0x40220000,0x00000000, 51, 0x4A230AD5,0xACB1C5B0,
+	0x40220000,0x00000000, 52, 0x4A556C30,0x6247FE66,
+	0x40220000,0x00000000, 53, 0x4A8819B6,0x6E90FE33,
+	0x40220000,0x00000000, 54, 0x4ABB1CED,0x3C631DF9,
+	0x40220000,0x00000000, 55, 0x4AEE808A,0xE3EF81B8,
+	0x40220000,0x00000000, 56, 0x4B21284E,0x2036B8F8,
+	0x40220000,0x00000000, 57, 0x4B534D57,0xE43D9017,
+	0x40220000,0x00000000, 58, 0x4B85B702,0xE0C54219,
+	0x40220000,0x00000000, 59, 0x4BB86DE3,0x3CDDEA5D,
+	0x40220000,0x00000000, 60, 0x4BEB7B9F,0xA479A7A8,
+	0x40220000,0x00000000, 61, 0x4C1EEB13,0x9908DC9D,
+	0x40220000,0x00000000, 62, 0x4C51643B,0x0614FC18,
+	0x40220000,0x00000000, 63, 0x4C8390C2,0x66D79B9B,
+	0x40220000,0x00000000, 64, 0x4CB602DA,0xB3B28F0F,
+	0x40220000,0x00000000, 65, 0x4CE8C336,0x0A28E0F1,
+	0x40220000,0x00000000, 66, 0x4D1BDB9C,0xCB6DFD0F,
+	0x40220000,0x00000000, 67, 0x4D4F5710,0x64DBBCB1,
+	0x40220000,0x00000000, 68, 0x4D81A0F9,0x38BB9A23,
+	0x40220000,0x00000000, 69, 0x4DB3D518,0x5FD30D68,
+	0x40220000,0x00000000, 70, 0x4DE64FBB,0x6BCD6F15,
+	0x40220000,0x00000000, 71, 0x4E1919B2,0xD9471CF7,
+	0x40220000,0x00000000, 72, 0x4E4C3CE9,0x34700096,
+	0x40220000,0x00000000, 73, 0x4E7FC486,0x5AFE00A9,
+	0x40220000,0x00000000, 74, 0x4EB1DE8B,0x932EE05F,
+	0x40220000,0x00000000, 75, 0x4EE41A5D,0x0594BC6B,
+	0x40220000,0x00000000, 76, 0x4F169DA8,0xA64753F8,
+	0x40220000,0x00000000, 77, 0x4F49715D,0xBB103E77,
+	0x40220000,0x00000000, 78, 0x4F7C9F89,0x72724646,
+	0x40220000,0x00000000, 79, 0x4FB019BD,0x50604788,
+	0x40220000,0x00000000, 80, 0x4FE21CF4,0xFA6C5079,
+	0x40220000,0x00000000, 81, 0x50146093,0x99B9DA88,
+	0x40220000,0x00000000, 82, 0x5046ECA6,0x0CF115D9,
+	0x40220000,0x00000000, 83, 0x5079CA3A,0xCE8F3894,
+	0x40220000,0x00000000, 84, 0x50AD0382,0x28611FA6,
+	0x40220000,0x00000000, 85, 0x50E051F9,0x36B6A1CD,
+	0x40220000,0x00000000, 86, 0x51125C38,0x5D8D7607,
+	0x40220000,0x00000000, 87, 0x5144A7BF,0x693F24C8,
+	0x40220000,0x00000000, 88, 0x51773CB7,0x56670961,
+	0x40220000,0x00000000, 89, 0x51AA244E,0x4133EA8D,
+	0x40220000,0x00000000, 90, 0x51DD68D8,0x095A67DF,
+	0x40220000,0x00000000, 91, 0x52108AF9,0x8542DA6D,
+	0x40220000,0x00000000, 92, 0x52429C58,0xB5EB35BB,
+	0x40220000,0x00000000, 93, 0x5274EFE3,0xCCA89C72,
+	0x40220000,0x00000000, 94, 0x52A78DE0,0x463DB001,
+	0x40220000,0x00000000, 95, 0x52DA7F9C,0x4F056601,
+	0x40220000,0x00000000, 96, 0x530DCF8F,0xD8E612C1,
+	0x40220000,0x00000000, 97, 0x5340C4C0,0xEA016A8C,
+	0x40220000,0x00000000, 98, 0x5372DD59,0x074197DE,
+	0x40220000,0x00000000, 99, 0x53A53904,0x2829CADA,
+	0x40220000,0x00000000, 100, 0x53D7E024,0xAD2F0435,
+	0x40220000,0x00000000, 101, 0x540ADC29,0x42D4E4BC,
+	0x40220000,0x00000000, 102, 0x543E37AE,0x6B2F8153,
+	0x40220000,0x00000000, 103, 0x5470FF52,0x1C4AB8BF,
+	0x40220000,0x00000000, 104, 0x54A31F3C,0x5FD40FD7,
+	0x40220000,0x00000000, 105, 0x54D58323,0xEBCE91D1,
+	0x40220000,0x00000000, 106, 0x55083388,0x6948640C,
+	0x40220000,0x00000000, 107, 0x553B39F9,0x7671708D,
+	0x40220000,0x00000000, 108, 0x556EA138,0xA53F9E9F,
+	0x40220000,0x00000000, 109, 0x55A13AAF,0xDCF3C939,
+	0x40220000,0x00000000, 110, 0x55D36205,0xD8924260,
+	0x40220000,0x00000000, 111, 0x5605CE46,0x93A48AAC,
+	0x40220000,0x00000000, 112, 0x5638880F,0x66191C02,
+	0x40220000,0x00000000, 113, 0x566B9911,0x52DC3F82,
+	0x40220000,0x00000000, 114, 0x569F0C33,0x7D37C772,
+	0x40220000,0x00000000, 115, 0x56D176DC,0xF66F6030,
+	0x40220000,0x00000000, 116, 0x5703A5B8,0x953D4C36,
+	0x40220000,0x00000000, 117, 0x57361A6F,0xA7E4F5BD,
+	0x40220000,0x00000000, 118, 0x5768DDBD,0x9CE19475,
+	0x40220000,0x00000000, 119, 0x579BF975,0x507DC704,
+	0x40220000,0x00000000, 120, 0x57CF78A3,0xFA8D7FE4,
+	0x40220000,0x00000000, 121, 0x5801B3DC,0x3CEF97F0,
+	0x40220000,0x00000000, 122, 0x5833EA57,0xC48D8AEE,
+	0x40220000,0x00000000, 123, 0x586667A2,0xBD1F3C4C,
+	0x40220000,0x00000000, 124, 0x58993497,0x14C323D6,
+	0x40220000,0x00000000, 125, 0x58CC5B29,0xF75B8850,
+	0x40220000,0x00000000, 126, 0x58FFE68F,0x3646F95A,
+	0x40220000,0x00000000, 127, 0x5931F1B0,0x8E87EC43,
+	0x40220000,0x00000000, 128, 0x59642FE6,0xA058E9CB,
+	0x40220000,0x00000000, 129, 0x5996B5E3,0x74640705,
+	0x40220000,0x00000000, 130, 0x59C98C9F,0xE2F087E5,
+	0x40220000,0x00000000, 131, 0x59FCBE33,0xDF4E98E2,
+	0x40220000,0x00000000, 132, 0x5A302AFD,0x2D9C35FF,
+	0x40220000,0x00000000, 133, 0x5A62305C,0xD34FBCBF,
+	0x40220000,0x00000000, 134, 0x5A947668,0x6DB9B457,
+	0x40220000,0x00000000, 135, 0x5AC70535,0x7B70EAE2,
+	0x40220000,0x00000000, 136, 0x5AF9E5DC,0x2ADF083E,
+	0x40220000,0x00000000, 137, 0x5B2D2297,0xB03AE945,
+	0x40220000,0x00000000, 138, 0x5B606375,0x53212337,
+	0x40220000,0x00000000, 139, 0x5B926FE3,0xFD85479E,
+	0x40220000,0x00000000, 140, 0x5BC4BDE0,0x7D35F092,
+	0x40220000,0x00000000, 141, 0x5BF7559C,0x8CDCAEA4,
+	0x40220000,0x00000000, 142, 0x5C2A4050,0x1E784478,
+	0x40220000,0x00000000, 143, 0x5C5D885A,0x22474D07,
+	0x40220000,0x00000000, 144, 0x5C909CB2,0xB3481B54,
+	0x40220000,0x00000000, 145, 0x5CC2B049,0x09B11EBF,
+	0x40220000,0x00000000, 146, 0x5CF50652,0x2AE74297,
+	0x40220000,0x00000000, 147, 0x5D27A71C,0x70442AE9,
+	0x40220000,0x00000000, 148, 0x5D5A9BFF,0xFE4CB047,
+	0x40220000,0x00000000, 149, 0x5D8DEF7F,0xFE16464F,
+	0x40220000,0x00000000, 150, 0x5DC0D6B7,0xFEEC878D,
+	0x40220000,0x00000000, 151, 0x5DF2F18E,0xFECA187E,
+	0x40220000,0x00000000, 152, 0x5E254FC0,0xDEA35B8E,
+	0x40220000,0x00000000, 153, 0x5E57F9B8,0xFA77C700,
+	0x40220000,0x00000000, 154, 0x5E8AF8F0,0x19C6BFE0,
+	0x40220000,0x00000000, 155, 0x5EBE580E,0x1CFF97DC,
+	0x40220000,0x00000000, 156, 0x5EF11187,0xF04FC56C,
+	0x40220000,0x00000000, 157, 0x5F2333B8,0xEE59BE19,
+	0x40220000,0x00000000, 158, 0x5F559A30,0x0C24F5DC,
+	0x40220000,0x00000000, 159, 0x5F884D76,0x0DA99498,
+	0x40220000,0x00000000, 160, 0x5FBB5724,0xCF5EC72B,
+	0x40220000,0x00000000, 161, 0x5FEEC209,0x694AA010,
+	0x40220000,0x00000000, 162, 0x60214D25,0x4B39FA09,
+	0x40220000,0x00000000, 163, 0x605376C9,0xF4A1394A,
+	0x40220000,0x00000000, 164, 0x6085E5A3,0x33356073,
+	0x40220000,0x00000000, 165, 0x60B8A257,0x999C0C82,
+	0x40220000,0x00000000, 166, 0x60EBB6A2,0x8CCF8E12,
+	0x40220000,0x00000000, 167, 0x611F2D76,0xDE697FD4,
+	0x40220000,0x00000000, 168, 0x61518992,0xDD1B57E7,
+	0x40220000,0x00000000, 169, 0x6183BAC5,0x38BEC2E4,
+	0x40220000,0x00000000, 170, 0x61B6321D,0xDFD69B41,
+	0x40220000,0x00000000, 171, 0x61E8F861,0x9BD16EA9,
+	0x40220000,0x00000000, 172, 0x621C176D,0xCF4B9C7E,
+	0x40220000,0x00000000, 173, 0x624F9A5B,0x8935100E,
+	0x40220000,0x00000000, 174, 0x6281C6D3,0x7D2DD908,
+	0x40220000,0x00000000, 175, 0x62B3FFAD,0xECD39429,
+	0x40220000,0x00000000, 176, 0x62E67FA3,0xAA6E06AE,
+	0x40220000,0x00000000, 177, 0x63194F98,0x1FBBC784,
+	0x40220000,0x00000000, 178, 0x634C798B,0x23B34074,
+	0x40220000,0x00000000, 179, 0x6380045E,0x4414D441,
+	0x40220000,0x00000000, 180, 0x63B204EA,0x0C976EC9,
+	0x40220000,0x00000000, 181, 0x63E44587,0x4E2A5CA3,
+	0x40220000,0x00000000, 182, 0x6416CE38,0x37EFA837,
+	0x40220000,0x00000000, 183, 0x6449A7FF,0x3EED9D3E,
+	0x40220000,0x00000000, 184, 0x647CDCFF,0x26CB50E5,
+	0x40220000,0x00000000, 185, 0x64B03C4F,0x85D25D81,
+	0x40220000,0x00000000, 186, 0x64E243D9,0x768CA931,
+	0x40220000,0x00000000, 187, 0x65148C54,0xA55E3E57,
+	0x40220000,0x00000000, 188, 0x65471DDF,0x3A0A0622,
+	0x40220000,0x00000000, 189, 0x657A019B,0x214B46E7,
+	0x40220000,0x00000000, 190, 0x65AD41CE,0x8574AFC3,
+	0x40220000,0x00000000, 191, 0x65E07504,0x2B11A2DE,
+	0x40220000,0x00000000, 192, 0x661283A4,0xB073D73A,
+	0x40220000,0x00000000, 193, 0x6644D419,0x46825221,
+	0x40220000,0x00000000, 194, 0x66776E9C,0x6F529C65,
+	0x40220000,0x00000000, 195, 0x66AA5C6F,0xFD3CEFF2,
+	0x40220000,0x00000000, 196, 0x66DDA7FD,0xFCE48DF0,
+	0x40220000,0x00000000, 197, 0x6710AE7E,0xDE408FD7,
+	0x40220000,0x00000000, 198, 0x6742C44E,0xBA08A1D2,
+	0x40220000,0x00000000, 199, 0x67751CD8,0x9149B60C,
+	0x40220000,0x00000000, 200, 0x67A7C073,0xA372ECCD,
+	0x40220000,0x00000000, 201, 0x67DAB882,0x17E14A67,
+	0x40220000,0x00000000, 202, 0x680E0F92,0x5ADD73B4,
+	0x40220000,0x00000000, 203, 0x6840E8C2,0x531C9115,
+	0x40220000,0x00000000, 204, 0x687305DA,0x9D802338,
+	0x40220000,0x00000000, 205, 0x68A56695,0xF130279F,
+	0x40220000,0x00000000, 206, 0x68D81368,0xAF562C93,
+	0x40220000,0x00000000, 207, 0x690B15D5,0xC540F225,
+	0x40220000,0x00000000, 208, 0x693E7890,0x7DE9106A,
+	0x40220000,0x00000000, 209, 0x697123D1,0x46D3193B,
+	0x40220000,0x00000000, 210, 0x69A3484B,0x6FAD7C63,
+	0x40220000,0x00000000, 211, 0x69D5B154,0xDDA32BEF,
+	0x40220000,0x00000000, 212, 0x6A08677F,0x7957916D,
+	0x40220000,0x00000000, 213, 0x6A3B746F,0x6882839B,
+	0x40220000,0x00000000, 214, 0x6A6EE2FD,0x5592D40E,
+	0x40220000,0x00000000, 215, 0x6AA15FAE,0x80229748,
+	0x40220000,0x00000000, 216, 0x6AD38BA4,0x5026EA31,
+	0x40220000,0x00000000, 217, 0x6B05FD18,0xDA2BC777,
+	0x40220000,0x00000000, 218, 0x6B38BCBB,0xF5714066,
+	0x40220000,0x00000000, 219, 0x6B6BD453,0x741F6873,
+	0x40220000,0x00000000, 220, 0x6B9F4EDD,0xE2A35581,
+	0x40220000,0x00000000, 221, 0x6BD19C5C,0xCF7BE019,
+	0x40220000,0x00000000, 222, 0x6C03CFE8,0x696B5C1C,
+	0x40220000,0x00000000, 223, 0x6C3649E5,0x7698C79F,
+	0x40220000,0x00000000, 224, 0x6C691322,0x256BE093,
+	0x40220000,0x00000000, 225, 0x6C9C3586,0x6A195CA5,
+	0x40220000,0x00000000, 226, 0x6CCFBC37,0x375C883A,
+	0x40220000,0x00000000, 227, 0x6D01D9DF,0x0F240CA1,
+	0x40220000,0x00000000, 228, 0x6D34151A,0xF1088E35,
+	0x40220000,0x00000000, 229, 0x6D6697BE,0x4F299FFB,
+	0x40220000,0x00000000, 230, 0x6D996AB6,0x190ED3FB,
+	0x40220000,0x00000000, 231, 0x6DCC980C,0xDC30AE7A,
+	0x40220000,0x00000000, 232, 0x6E001587,0x3BDB6225,
+	0x40220000,0x00000000, 233, 0x6E321838,0x2356CE69,
+	0x40220000,0x00000000, 234, 0x6E645B3F,0x27C1A836,
+	0x40220000,0x00000000, 235, 0x6E96E6A7,0x0CB9DD3D,
+	0x40220000,0x00000000, 236, 0x6EC9C37B,0xEE5118E5,
+	0x40220000,0x00000000, 237, 0x6EFCFBEB,0x6C1B3C02,
+	0x40220000,0x00000000, 238, 0x6F304DB4,0x6CCF51C1,
+	0x40220000,0x00000000, 239, 0x6F62576A,0xFA693BF9,
+	0x40220000,0x00000000, 240, 0x6F94A258,0x59B66378,
+	0x40220000,0x00000000, 241, 0x6FC736A3,0x64ED2FE7,
+	0x40220000,0x00000000, 242, 0x6FFA1D77,0xD18AD5E4,
+	0x40220000,0x00000000, 243, 0x702D6126,0xCBBC30A0,
+	0x40220000,0x00000000, 244, 0x706086A5,0xD299DB5A,
+	0x40220000,0x00000000, 245, 0x7092977A,0x8CED16C6,
+	0x40220000,0x00000000, 246, 0x70C4EA69,0xDE8AB99E,
+	0x40220000,0x00000000, 247, 0x70F787B7,0x1A5C10D2,
+	0x40220000,0x00000000, 248, 0x712A78AD,0xFDA792EC,
+	0x40220000,0x00000000, 249, 0x715DC7C3,0xBD5C854A,
+	0x40220000,0x00000000, 250, 0x7190C05E,0x1A840AFA,
+	0x40220000,0x00000000, 251, 0x71C2D869,0xDDD48C59,
+	0x40220000,0x00000000, 252, 0x71F53377,0x198F1DE4,
+	0x40220000,0x00000000, 253, 0x7227D9E5,0xFCC101A0,
+	0x40220000,0x00000000, 254, 0x725AD522,0xBC5921D4,
+	0x40220000,0x00000000, 255, 0x728E2FC7,0x13E4460F,
+	0x40220000,0x00000000, 256, 0x72C0FADF,0xFB306768,
+	0x40220000,0x00000000, 257, 0x72F31A3B,0xFA967455,
+	0x40220000,0x00000000, 258, 0x73257D83,0x79E942E0,
+	0x40220000,0x00000000, 259, 0x73582D33,0xE9266B3C,
+	0x40220000,0x00000000, 260, 0x738B32DA,0x664B38A4,
+	0x40220000,0x00000000, 261, 0x73BE9935,0xB3149FB8,
+	0x40220000,0x00000000, 262, 0x73F1362E,0x34BB99D8,
+	0x40220000,0x00000000, 263, 0x74235CF3,0xFB530D12,
+	0x40220000,0x00000000, 264, 0x7455C892,0x7ABD6EB5,
+	0x40220000,0x00000000, 265, 0x748881A4,0xCA151C8B,
+	0x40220000,0x00000000, 266, 0x74BB91D9,0x6357C01D,
+	0x40220000,0x00000000, 267, 0x74EF0414,0x8FC2B820,
+	0x40220000,0x00000000, 268, 0x7521724B,0x90DD8792,
+	0x40220000,0x00000000, 269, 0x7553A095,0x02F93885,
+	0x40220000,0x00000000, 270, 0x758614A7,0xA3585F95,
+	0x40220000,0x00000000, 271, 0x75B8D73C,0x97C36B88,
+	0x40220000,0x00000000, 272, 0x75EBF224,0x2ABBD8F9,
+	0x40220000,0x00000000, 273, 0x761F7068,0xB0135418,
+	0x40220000,0x00000000, 274, 0x7651AF3A,0xE30ADF4D,
+	0x40220000,0x00000000, 275, 0x7683E522,0x3F6C3B37,
+	0x40220000,0x00000000, 276, 0x76B661C6,0x8759C29E,
+	0x40220000,0x00000000, 277, 0x76E92DFF,0x5844FAF2,
+	0x40220000,0x00000000, 278, 0x771C53BF,0x434D9A50,
+	0x40220000,0x00000000, 279, 0x774FDE37,0x2BB74D9A,
+	0x40220000,0x00000000, 280, 0x7781ECFF,0x08971BA7,
+	0x40220000,0x00000000, 281, 0x77B42A9E,0xE9A9FF1B,
+	0x40220000,0x00000000, 282, 0x77E6AFF2,0xC6DF3EFF,
+	0x40220000,0x00000000, 283, 0x781985F1,0x1FBB26DF,
+	0x40220000,0x00000000, 284, 0x784CB6AF,0x43B28BBA,
+	0x40220000,0x00000000, 285, 0x788026C2,0x96146E99,
+	0x40220000,0x00000000, 286, 0x78B22B9A,0xE8D6FC6C,
+	0x40220000,0x00000000, 287, 0x78E4710E,0x45F1DBF9,
+	0x40220000,0x00000000, 288, 0x7916FF30,0x0EB01779,
+	0x40220000,0x00000000, 289, 0x7949DF16,0x10861A68,
+	0x40220000,0x00000000, 290, 0x797D1AF8,0xD296DDB5,
+	0x40220000,0x00000000, 291, 0x79B05F2B,0xF674DCB6,
+	0x40220000,0x00000000, 292, 0x79E26B11,0x7543784C,
+	0x40220000,0x00000000, 293, 0x7A14B873,0xA3EBE756,
+	0x40220000,0x00000000, 294, 0x7A474F82,0x18696441,
+	0x40220000,0x00000000, 295, 0x7A7A3972,0x5B7690C9,
+	0x40220000,0x00000000, 296, 0x7AAD80A0,0xA6E562E2,
+	0x40220000,0x00000000, 297, 0x7AE0985A,0x5DE1079F,
+	0x40220000,0x00000000, 298, 0x7B12AB65,0xA99D2893,
+	0x40220000,0x00000000, 299, 0x7B4500D2,0x5ED0CDA5,
+	0x40220000,0x00000000, 300, 0x7B77A0EC,0xAAAAE75A,
+	0x40240000,0x00000000, 2, 0x4073C3A4,0xEDFA9759,
+	0x40240000,0x00000000, 3, 0x40A8B48E,0x29793D2F,
+	0x40240000,0x00000000, 4, 0x40DEE1B1,0xB3D78C7A,
+	0x40240000,0x00000000, 5, 0x41134D0F,0x1066B7CC,
+	0x40240000,0x00000000, 6, 0x41482052,0xD48065C0,
+	0x40240000,0x00000000, 7, 0x417E2867,0x89A07F2F,
+	0x40240000,0x00000000, 8, 0x41B2D940,0xB6044F7E,
+	0x40240000,0x00000000, 9, 0x41E78F90,0xE385635D,
+	0x40240000,0x00000000, 10, 0x421D7375,0x1C66BC34,
+	0x40240000,0x00000000, 11, 0x42526829,0x31C035A1,
+	0x40240000,0x00000000, 12, 0x42870233,0x7E304309,
+	0x40240000,0x00000000, 13, 0x42BCC2C0,0x5DBC53CB,
+	0x40240000,0x00000000, 14, 0x42F1F9B8,0x3A95B45F,
+	0x40240000,0x00000000, 15, 0x43267826,0x493B2177,
+	0x40240000,0x00000000, 16, 0x435C162F,0xDB89E9D4,
+	0x40240000,0x00000000, 17, 0x43918DDD,0xE9363225,
+	0x40240000,0x00000000, 18, 0x43C5F155,0x6383BEAE,
+	0x40240000,0x00000000, 19, 0x43FB6DAA,0xBC64AE59,
+	0x40240000,0x00000000, 20, 0x4431248A,0xB5BEECF8,
+	0x40240000,0x00000000, 21, 0x44656DAD,0x632EA836,
+	0x40240000,0x00000000, 22, 0x449AC918,0xBBFA5243,
+	0x40240000,0x00000000, 23, 0x44D0BDAF,0x757C736A,
+	0x40240000,0x00000000, 24, 0x4504ED1B,0x52DB9045,
+	0x40240000,0x00000000, 25, 0x453A2862,0x27927456,
+	0x40240000,0x00000000, 26, 0x4570593D,0x58BB88B6,
+	0x40240000,0x00000000, 27, 0x45A46F8C,0xAEEA6AE3,
+	0x40240000,0x00000000, 28, 0x45D98B6F,0xDAA5059C,
+	0x40240000,0x00000000, 29, 0x460FEE4B,0xD14E4703,
+	0x40240000,0x00000000, 30, 0x4643F4EF,0x62D0EC62,
+	0x40240000,0x00000000, 31, 0x4678F22B,0x3B85277A,
+	0x40240000,0x00000000, 32, 0x46AF2EB6,0x0A667159,
+	0x40240000,0x00000000, 33, 0x46E37D31,0xC68006D7,
+	0x40240000,0x00000000, 34, 0x47185C7E,0x3820088D,
+	0x40240000,0x00000000, 35, 0x474E739D,0xC6280AB0,
+	0x40240000,0x00000000, 36, 0x47830842,0x9BD906AE,
+	0x40240000,0x00000000, 37, 0x47B7CA53,0x42CF485A,
+	0x40240000,0x00000000, 38, 0x47EDBCE8,0x13831A70,
+	0x40240000,0x00000000, 39, 0x48229611,0x0C31F086,
+	0x40240000,0x00000000, 40, 0x48573B95,0x4F3E6CA8,
+	0x40240000,0x00000000, 41, 0x488D0A7A,0xA30E07D2,
+	0x40240000,0x00000000, 42, 0x48C2268C,0xA5E8C4E3,
+	0x40240000,0x00000000, 43, 0x48F6B02F,0xCF62F61C,
+	0x40240000,0x00000000, 44, 0x492C5C3B,0xC33BB3A3,
+	0x40240000,0x00000000, 45, 0x4961B9A5,0x5A055046,
+	0x40240000,0x00000000, 46, 0x4996280E,0xB086A457,
+	0x40240000,0x00000000, 47, 0x49CBB212,0x5CA84D6D,
+	0x40240000,0x00000000, 48, 0x4A014F4B,0x79E93064,
+	0x40240000,0x00000000, 49, 0x4A35A31E,0x58637C7D,
+	0x40240000,0x00000000, 50, 0x4A6B0BE5,0xEE7C5B9C,
+	0x40240000,0x00000000, 51, 0x4AA0E76F,0xB50DB942,
+	0x40240000,0x00000000, 52, 0x4AD5214B,0xA2512792,
+	0x40240000,0x00000000, 53, 0x4B0A699E,0x8AE57177,
+	0x40240000,0x00000000, 54, 0x4B408203,0x16CF66EA,
+	0x40240000,0x00000000, 55, 0x4B74A283,0xDC8340A5,
+	0x40240000,0x00000000, 56, 0x4BA9CB24,0xD3A410CE,
+	0x40240000,0x00000000, 57, 0x4BE01EF7,0x04468A81,
+	0x40240000,0x00000000, 58, 0x4C1426B4,0xC5582D21,
+	0x40240000,0x00000000, 59, 0x4C493061,0xF6AE3869,
+	0x40240000,0x00000000, 60, 0x4C7F7C7A,0x7459C683,
+	0x40240000,0x00000000, 61, 0x4CB3ADCC,0x88B81C12,
+	0x40240000,0x00000000, 62, 0x4CE8993F,0xAAE62317,
+	0x40240000,0x00000000, 63, 0x4D1EBF8F,0x959FABDC,
+	0x40240000,0x00000000, 64, 0x4D5337B9,0xBD83CB6A,
+	0x40240000,0x00000000, 65, 0x4D8805A8,0x2CE4BE44,
+	0x40240000,0x00000000, 66, 0x4DBE0712,0x381DEDD5,
+	0x40240000,0x00000000, 67, 0x4DF2C46B,0x6312B4A5,
+	0x40240000,0x00000000, 68, 0x4E277586,0x3BD761CF,
+	0x40240000,0x00000000, 69, 0x4E5D52E7,0xCACD3A42,
+	0x40240000,0x00000000, 70, 0x4E9253D0,0xDEC04469,
+	0x40240000,0x00000000, 71, 0x4EC6E8C5,0x16705584,
+	0x40240000,0x00000000, 72, 0x4EFCA2F6,0x5C0C6AE5,
+	0x40240000,0x00000000, 73, 0x4F31E5D9,0xF987C2CF,
+	0x40240000,0x00000000, 74, 0x4F665F50,0x77E9B383,
+	0x40240000,0x00000000, 75, 0x4F9BF724,0x95E42063,
+	0x40240000,0x00000000, 76, 0x4FD17A76,0xDDAE943E,
+	0x40240000,0x00000000, 77, 0x5005D914,0x951A394E,
+	0x40240000,0x00000000, 78, 0x503B4F59,0xBA60C7A1,
+	0x40240000,0x00000000, 79, 0x50711198,0x147C7CC5,
+	0x40240000,0x00000000, 80, 0x50A555FE,0x199B9BF6,
+	0x40240000,0x00000000, 81, 0x50DAAB7D,0xA00282F3,
+	0x40240000,0x00000000, 82, 0x5110AB2E,0x840191D8,
+	0x40240000,0x00000000, 83, 0x5144D5FA,0x2501F64E,
+	0x40240000,0x00000000, 84, 0x517A0B78,0xAE4273E1,
+	0x40240000,0x00000000, 85, 0x51B0472B,0x6CE9886D,
+	0x40240000,0x00000000, 86, 0x51E458F6,0x4823EA88,
+	0x40240000,0x00000000, 87, 0x52196F33,0xDA2CE52A,
+	0x40240000,0x00000000, 88, 0x524FCB00,0xD0B81E75,
+	0x40240000,0x00000000, 89, 0x5283DEE0,0x82731309,
+	0x40240000,0x00000000, 90, 0x52B8D698,0xA30FD7CB,
+	0x40240000,0x00000000, 91, 0x52EF0C3E,0xCBD3CDBE,
+	0x40240000,0x00000000, 92, 0x532367A7,0x3F646097,
+	0x40240000,0x00000000, 93, 0x53584191,0x0F3D78BC,
+	0x40240000,0x00000000, 94, 0x538E51F5,0x530CD6EC,
+	0x40240000,0x00000000, 95, 0x53C2F339,0x53E80653,
+	0x40240000,0x00000000, 96, 0x53F7B007,0xA8E207E8,
+	0x40240000,0x00000000, 97, 0x542D9C09,0x931A89E2,
+	0x40240000,0x00000000, 98, 0x54628185,0xFBF0962D,
+	0x40240000,0x00000000, 99, 0x549721E7,0x7AECBBB9,
+	0x40240000,0x00000000, 100, 0x54CCEA61,0x59A7EAA7,
+	0x40240000,0x00000000, 101, 0x5502127C,0xD808F2A8,
+	0x40240000,0x00000000, 102, 0x5536971C,0x0E0B2F52,
+	0x40240000,0x00000000, 103, 0x556C3CE3,0x118DFB27,
+	0x40240000,0x00000000, 104, 0x55A1A60D,0xEAF8BCF8,
+	0x40240000,0x00000000, 105, 0x55D60F91,0x65B6EC36,
+	0x40240000,0x00000000, 106, 0x560B9375,0xBF24A744,
+	0x40240000,0x00000000, 107, 0x56413C29,0x9776E88A,
+	0x40240000,0x00000000, 108, 0x56758B33,0xFD54A2AD,
+	0x40240000,0x00000000, 109, 0x56AAEE00,0xFCA9CB58,
+	0x40240000,0x00000000, 110, 0x56E0D4C0,0x9DEA1F17,
+	0x40240000,0x00000000, 111, 0x571509F0,0xC564A6DD,
+	0x40240000,0x00000000, 112, 0x574A4C6C,0xF6BDD094,
+	0x40240000,0x00000000, 113, 0x57806FC4,0x1A36A25D,
+	0x40240000,0x00000000, 114, 0x57B48BB5,0x20C44AF4,
+	0x40240000,0x00000000, 115, 0x57E9AEA2,0x68F55DB1,
+	0x40240000,0x00000000, 116, 0x58200D25,0x81995A8E,
+	0x40240000,0x00000000, 117, 0x5854106E,0xE1FFB132,
+	0x40240000,0x00000000, 118, 0x5889148A,0x9A7F9D7F,
+	0x40240000,0x00000000, 119, 0x58BF59AD,0x411F84DE,
+	0x40240000,0x00000000, 120, 0x58F3980C,0x48B3B30B,
+	0x40240000,0x00000000, 121, 0x59287E0F,0x5AE09FCE,
+	0x40240000,0x00000000, 122, 0x595E9D93,0x3198C7C1,
+	0x40240000,0x00000000, 123, 0x5993227B,0xFEFF7CD9,
+	0x40240000,0x00000000, 124, 0x59C7EB1A,0xFEBF5C0F,
+	0x40240000,0x00000000, 125, 0x59FDE5E1,0xBE6F3313,
+	0x40240000,0x00000000, 126, 0x5A32AFAD,0x17057FEC,
+	0x40240000,0x00000000, 127, 0x5A675B98,0x5CC6DFE6,
+	0x40240000,0x00000000, 128, 0x5A9D327E,0x73F897E0,
+	0x40240000,0x00000000, 129, 0x5AD23F8F,0x087B5EEC,
+	0x40240000,0x00000000, 130, 0x5B06CF72,0xCA9A36A7,
+	0x40240000,0x00000000, 131, 0x5B3C834F,0x7D40C451,
+	0x40240000,0x00000000, 132, 0x5B71D211,0xAE487AB3,
+	0x40240000,0x00000000, 133, 0x5BA64696,0x19DA995F,
+	0x40240000,0x00000000, 134, 0x5BDBD83B,0xA0513FB7,
+	0x40240000,0x00000000, 135, 0x5C116725,0x4432C7D2,
+	0x40240000,0x00000000, 136, 0x5C45C0EE,0x953F79C7,
+	0x40240000,0x00000000, 137, 0x5C7B312A,0x3A8F5839,
+	0x40240000,0x00000000, 138, 0x5CB0FEBA,0x64999723,
+	0x40240000,0x00000000, 139, 0x5CE53E68,0xFDBFFCEC,
+	0x40240000,0x00000000, 140, 0x5D1A8E03,0x3D2FFC27,
+	0x40240000,0x00000000, 141, 0x5D5098C2,0x063DFD99,
+	0x40240000,0x00000000, 142, 0x5D84BEF2,0x87CD7CFF,
+	0x40240000,0x00000000, 143, 0x5DB9EEAF,0x29C0DC3E,
+	0x40240000,0x00000000, 144, 0x5DF0352D,0x7A1889A7,
+	0x40240000,0x00000000, 145, 0x5E244278,0xD89EAC11,
+	0x40240000,0x00000000, 146, 0x5E595317,0x0EC65715,
+	0x40240000,0x00000000, 147, 0x5E8FA7DC,0xD277ECDA,
+	0x40240000,0x00000000, 148, 0x5EC3C8EA,0x038AF408,
+	0x40240000,0x00000000, 149, 0x5EF8BB24,0x846DB10A,
+	0x40240000,0x00000000, 150, 0x5F2EE9ED,0xA5891D4D,
+	0x40240000,0x00000000, 151, 0x5F635234,0x8775B250,
+	0x40240000,0x00000000, 152, 0x5F9826C1,0xA9531EE4,
+	0x40240000,0x00000000, 153, 0x5FCE3072,0x13A7E69D,
+	0x40240000,0x00000000, 154, 0x6002DE47,0x4C48F022,
+	0x40240000,0x00000000, 155, 0x603795D9,0x1F5B2C2B,
+	0x40240000,0x00000000, 156, 0x606D7B4F,0x6731F736,
+	0x40240000,0x00000000, 157, 0x60A26D11,0xA07F3A81,
+	0x40240000,0x00000000, 158, 0x60D70856,0x089F0922,
+	0x40240000,0x00000000, 159, 0x610CCA6B,0x8AC6CB6A,
+	0x40240000,0x00000000, 160, 0x6141FE83,0x36BC3F22,
+	0x40240000,0x00000000, 161, 0x61767E24,0x046B4EEB,
+	0x40240000,0x00000000, 162, 0x61AC1DAD,0x058622A6,
+	0x40240000,0x00000000, 163, 0x61E1928C,0x2373D5A8,
+	0x40240000,0x00000000, 164, 0x6215F72F,0x2C50CB12,
+	0x40240000,0x00000000, 165, 0x624B74FA,0xF764FDD6,
+	0x40240000,0x00000000, 166, 0x6281291C,0xDA9F1EA6,
+	0x40240000,0x00000000, 167, 0x62B57364,0x1146E64F,
+	0x40240000,0x00000000, 168, 0x62EAD03D,0x15989FE3,
+	0x40240000,0x00000000, 169, 0x6320C226,0x2D7F63EE,
+	0x40240000,0x00000000, 170, 0x6354F2AF,0xB8DF3CE9,
+	0x40240000,0x00000000, 171, 0x638A2F5B,0xA7170C24,
+	0x40240000,0x00000000, 172, 0x63C05D99,0x486E6796,
+	0x40240000,0x00000000, 173, 0x63F474FF,0x9A8A017C,
+	0x40240000,0x00000000, 174, 0x6429923F,0x812C81DB,
+	0x40240000,0x00000000, 175, 0x645FF6CF,0x6177A251,
+	0x40240000,0x00000000, 176, 0x6493FA41,0x9CEAC573,
+	0x40240000,0x00000000, 177, 0x64C8F8D2,0x042576D0,
+	0x40240000,0x00000000, 178, 0x64FF3706,0x852ED484,
+	0x40240000,0x00000000, 179, 0x65338264,0x133D44D2,
+	0x40240000,0x00000000, 180, 0x656862FD,0x180C9607,
+	0x40240000,0x00000000, 181, 0x659E7BBC,0x5E0FBB88,
+	0x40240000,0x00000000, 182, 0x65D30D55,0xBAC9D535,
+	0x40240000,0x00000000, 183, 0x6607D0AB,0x297C4A83,
+	0x40240000,0x00000000, 184, 0x663DC4D5,0xF3DB5D23,
+	0x40240000,0x00000000, 185, 0x66729B05,0xB8691A36,
+	0x40240000,0x00000000, 186, 0x66A741C7,0x268360C4,
+	0x40240000,0x00000000, 187, 0x66DD1238,0xF02438F4,
+	0x40240000,0x00000000, 188, 0x67122B63,0x9616A399,
+	0x40240000,0x00000000, 189, 0x6746B63C,0x7B9C4C7F,
+	0x40240000,0x00000000, 190, 0x677C63CB,0x9A835F9F,
+	0x40240000,0x00000000, 191, 0x67B1BE5F,0x40921BC3,
+	0x40240000,0x00000000, 192, 0x67E62DF7,0x10B6A2B4,
+	0x40240000,0x00000000, 193, 0x681BB974,0xD4E44B61,
+	0x40240000,0x00000000, 194, 0x685153E9,0x050EAF1D,
+	0x40240000,0x00000000, 195, 0x6885A8E3,0x46525AE4,
+	0x40240000,0x00000000, 196, 0x68BB131C,0x17E6F19D,
+	0x40240000,0x00000000, 197, 0x68F0EBF1,0x8EF05702,
+	0x40240000,0x00000000, 198, 0x692526ED,0xF2AC6CC2,
+	0x40240000,0x00000000, 199, 0x695A70A9,0x6F5787F3,
+	0x40240000,0x00000000, 200, 0x69908669,0xE596B4F8,
+	0x40240000,0x00000000, 201, 0x69C4A804,0x5EFC6236,
+	0x40240000,0x00000000, 202, 0x69F9D205,0x76BB7AC3,
+	0x40240000,0x00000000, 203, 0x6A302343,0x6A352CBA,
+	0x40240000,0x00000000, 204, 0x6A642C14,0x44C277E9,
+	0x40240000,0x00000000, 205, 0x6A993719,0x55F315E3,
+	0x40240000,0x00000000, 206, 0x6ACF84DF,0xAB6FDB5B,
+	0x40240000,0x00000000, 207, 0x6B03B30B,0xCB25E919,
+	0x40240000,0x00000000, 208, 0x6B389FCE,0xBDEF635F,
+	0x40240000,0x00000000, 209, 0x6B6EC7C2,0x6D6B3C37,
+	0x40240000,0x00000000, 210, 0x6BA33CD9,0x846305A3,
+	0x40240000,0x00000000, 211, 0x6BD80C0F,0xE57BC70B,
+	0x40240000,0x00000000, 212, 0x6C0E0F13,0xDEDAB8CE,
+	0x40240000,0x00000000, 213, 0x6C42C96C,0x6B48B381,
+	0x40240000,0x00000000, 214, 0x6C777BC7,0x861AE061,
+	0x40240000,0x00000000, 215, 0x6CAD5AB9,0x67A19879,
+	0x40240000,0x00000000, 216, 0x6CE258B3,0xE0C4FF4C,
+	0x40240000,0x00000000, 217, 0x6D16EEE0,0xD8F63F1F,
+	0x40240000,0x00000000, 218, 0x6D4CAA99,0x0F33CEE6,
+	0x40240000,0x00000000, 219, 0x6D81EA9F,0xA9806150,
+	0x40240000,0x00000000, 220, 0x6DB66547,0x93E079A4,
+	0x40240000,0x00000000, 221, 0x6DEBFE99,0x78D8980D,
+	0x40240000,0x00000000, 222, 0x6E217F1F,0xEB875F08,
+	0x40240000,0x00000000, 223, 0x6E55DEE7,0xE66936CA,
+	0x40240000,0x00000000, 224, 0x6E8B56A1,0xE003847D,
+	0x40240000,0x00000000, 225, 0x6EC11625,0x2C0232CE,
+	0x40240000,0x00000000, 226, 0x6EF55BAE,0x7702BF81,
+	0x40240000,0x00000000, 227, 0x6F2AB29A,0x14C36F62,
+	0x40240000,0x00000000, 228, 0x6F60AFA0,0x4CFA259D,
+	0x40240000,0x00000000, 229, 0x6F94DB88,0x6038AF04,
+	0x40240000,0x00000000, 230, 0x6FCA126A,0x7846DAC5,
+	0x40240000,0x00000000, 231, 0x70004B82,0x8B2C48BB,
+	0x40240000,0x00000000, 232, 0x70345E63,0x2DF75AEA,
+	0x40240000,0x00000000, 233, 0x706975FB,0xF97531A5,
+	0x40240000,0x00000000, 234, 0x709FD37A,0xF7D27E0E,
+	0x40240000,0x00000000, 235, 0x70D3E42C,0xDAE38EC9,
+	0x40240000,0x00000000, 236, 0x7108DD38,0x119C727B,
+	0x40240000,0x00000000, 237, 0x713F1486,0x16038F1A,
+	0x40240000,0x00000000, 238, 0x71736CD3,0xCDC23970,
+	0x40240000,0x00000000, 239, 0x71A84808,0xC132C7CC,
+	0x40240000,0x00000000, 240, 0x71DE5A0A,0xF17F79BF,
+	0x40240000,0x00000000, 241, 0x7212F846,0xD6EFAC17,
+	0x40240000,0x00000000, 242, 0x7247B658,0x8CAB971D,
+	0x40240000,0x00000000, 243, 0x727DA3EE,0xAFD67CE5,
+	0x40240000,0x00000000, 244, 0x72B28675,0x2DE60E0F,
+	0x40240000,0x00000000, 245, 0x72E72812,0x795F9193,
+	0x40240000,0x00000000, 246, 0x731CF217,0x17B775F7,
+	0x40240000,0x00000000, 247, 0x7352174E,0x6ED2A9BB,
+	0x40240000,0x00000000, 248, 0x73869D22,0x0A875429,
+	0x40240000,0x00000000, 249, 0x73BC446A,0x8D292933,
+	0x40240000,0x00000000, 250, 0x73F1AAC2,0x9839B9C0,
+	0x40240000,0x00000000, 251, 0x74261573,0x3E482830,
+	0x40240000,0x00000000, 252, 0x745B9AD0,0x0DDA323C,
+	0x40240000,0x00000000, 253, 0x749140C2,0x08A85F66,
+	0x40240000,0x00000000, 254, 0x74C590F2,0x8AD2773F,
+	0x40240000,0x00000000, 255, 0x74FAF52F,0x2D87150F,
+	0x40240000,0x00000000, 256, 0x7530D93D,0x7C746D29,
+	0x40240000,0x00000000, 257, 0x75650F8C,0xDB918874,
+	0x40240000,0x00000000, 258, 0x759A5370,0x1275EA91,
+	0x40240000,0x00000000, 259, 0x75D07426,0x0B89B29A,
+	0x40240000,0x00000000, 260, 0x7604912F,0x8E6C1F41,
+	0x40240000,0x00000000, 261, 0x7639B57B,0x72072711,
+	0x40240000,0x00000000, 262, 0x7670116D,0x2744786B,
+	0x40240000,0x00000000, 263, 0x76A415C8,0x71159685,
+	0x40240000,0x00000000, 264, 0x76D91B3A,0x8D5AFC27,
+	0x40240000,0x00000000, 265, 0x770F6209,0x30B1BB30,
+	0x40240000,0x00000000, 266, 0x77439D45,0xBE6F14FE,
+	0x40240000,0x00000000, 267, 0x77788497,0x2E0ADA3E,
+	0x40240000,0x00000000, 268, 0x77AEA5BC,0xF98D90CD,
+	0x40240000,0x00000000, 269, 0x77E32796,0x1BF87A80,
+	0x40240000,0x00000000, 270, 0x7817F17B,0xA2F69920,
+	0x40240000,0x00000000, 271, 0x784DEDDA,0x8BB43F68,
+	0x40240000,0x00000000, 272, 0x7882B4A8,0x9750A7A1,
+	0x40240000,0x00000000, 273, 0x78B761D2,0xBD24D18A,
+	0x40240000,0x00000000, 274, 0x78ED3A47,0x6C6E05EC,
+	0x40240000,0x00000000, 275, 0x7922446C,0xA3C4C3B4,
+	0x40240000,0x00000000, 276, 0x7956D587,0xCCB5F4A0,
+	0x40240000,0x00000000, 277, 0x798C8AE9,0xBFE371C8,
+	0x40240000,0x00000000, 278, 0x79C1D6D2,0x17EE271D,
+	0x40240000,0x00000000, 279, 0x79F64C86,0x9DE9B0E5,
+	0x40240000,0x00000000, 280, 0x7A2BDFA8,0x45641D1E,
+	0x40240000,0x00000000, 281, 0x7A616BC9,0x2B5E9233,
+	0x40240000,0x00000000, 282, 0x7A95C6BB,0x763636BF,
+	0x40240000,0x00000000, 283, 0x7ACB386A,0x53C3C46F,
+	0x40240000,0x00000000, 284, 0x7B010342,0x745A5AC5,
+	0x40240000,0x00000000, 285, 0x7B354413,0x1170F177,
+	0x40240000,0x00000000, 286, 0x7B6A9517,0xD5CD2DD4,
+	0x40240000,0x00000000, 287, 0x7BA09D2E,0xE5A03CA5,
+	0x40240000,0x00000000, 288, 0x7BD4C47A,0x9F084BCE,
+	0x40240000,0x00000000, 289, 0x7C09F599,0x46CA5EC1,
+	0x40240000,0x00000000, 290, 0x7C40397F,0xCC3E7B39,
+	0x40240000,0x00000000, 291, 0x7C7447DF,0xBF4E1A07,
+	0x40240000,0x00000000, 292, 0x7CA959D7,0xAF21A089,
+	0x40240000,0x00000000, 293, 0x7CDFB04D,0x9AEA08AB,
+	0x40240000,0x00000000, 294, 0x7D13CE30,0x80D2456B,
+	0x40240000,0x00000000, 295, 0x7D48C1BC,0xA106D6C6,
+	0x40240000,0x00000000, 296, 0x7D7EF22B,0xC9488C77,
+	0x40240000,0x00000000, 297, 0x7DB3575B,0x5DCD57CA,
+	0x40240000,0x00000000, 298, 0x7DE82D32,0x3540ADBD,
+	0x40240000,0x00000000, 299, 0x7E1E387E,0xC290D92C,
+	0x40240000,0x00000000, 300, 0x7E52E34F,0x399A87BC,
+	};
+
+LOCAL_D const TUint32 Power10TestNegative[] =
+	{
+	0x3FB99999,0x9999999A,
+	0x3F847AE1,0x47AE147B,
+	0x3F50624D,0xD2F1A9FC,
+	0x3F1A36E2,0xEB1C432D,
+	0x3EE4F8B5,0x88E368F1,
+	0x3EB0C6F7,0xA0B5ED8D,
+	0x3E7AD7F2,0x9ABCAF48,
+	0x3E45798E,0xE2308C3A,
+	0x3E112E0B,0xE826D695,
+	0x3DDB7CDF,0xD9D7BDBB,
+	0x3DA5FD7F,0xE1796495,
+	0x3D719799,0x812DEA11,
+	0x3D3C25C2,0x68497682,
+	0x3D06849B,0x86A12B9B,
+	0x3CD203AF,0x9EE75616,
+	0x3C9CD2B2,0x97D889BC,
+	0x3C670EF5,0x4646D497,
+	0x3C32725D,0xD1D243AC,
+	0x3BFD83C9,0x4FB6D2AC,
+	0x3BC79CA1,0x0C924223,
+	0x3B92E3B4,0x0A0E9B4F,
+	0x3B5E3920,0x10175EE6,
+	0x3B282DB3,0x4012B251,
+	0x3AF357C2,0x99A88EA7,
+	0x3ABEF2D0,0xF5DA7DD9,
+	0x3A88C240,0xC4AECB14,
+	0x3A53CE9A,0x36F23C10,
+	0x3A1FB0F6,0xBE506019,
+	0x39E95A5E,0xFEA6B347,
+	0x39B4484B,0xFEEBC2A0,
+	0x398039D6,0x65896880,
+	0x3949F623,0xD5A8A733,
+	0x3914C4E9,0x77BA1F5C,
+	0x38E09D87,0x92FB4C49,
+	0x38AA95A5,0xB7F87A0F,
+	0x38754484,0x932D2E72,
+	0x3841039D,0x428A8B8F,
+	0x380B38FB,0x9DAA78E4,
+	0x37D5C72F,0xB1552D83,
+	0x37A16C26,0x2777579C,
+	0x376BE03D,0x0BF225C7,
+	0x37364CFD,0xA3281E39,
+	0x3701D731,0x4F534B61,
+	0x36CC8B82,0x18854567,
+	0x3696D601,0xAD376AB9,
+	0x366244CE,0x242C5561,
+	0x362D3AE3,0x6D13BBCE,
+	0x35F7624F,0x8A762FD8,
+	0x35C2B50C,0x6EC4F313,
+	0x358DEE7A,0x4AD4B81F,
+	0x3557F1FB,0x6F10934C,
+	0x352327FC,0x58DA0F70,
+	0x34EEA660,0x8E29B24D,
+	0x34B8851A,0x0B548EA4,
+	0x34839DAE,0x6F76D883,
+	0x344F62B0,0xB257C0D2,
+	0x34191BC0,0x8EAC9A41,
+	0x33E41633,0xA556E1CE,
+	0x33B011C2,0xEAABE7D8,
+	0x3379B604,0xAAACA626,
+	0x3344919D,0x5556EB52,
+	0x3310747D,0xDDDF22A8,
+	0x32DA53FC,0x9631D10D,
+	0x32A50FFD,0x44F4A73D,
+	0x3270D997,0x6A5D5297,
+	0x323AF5BF,0x109550F2,
+	0x32059165,0xA6DDDA5B,
+	0x31D1411E,0x1F17E1E3,
+	0x319B9B63,0x64F30304,
+	0x316615E9,0x1D8F359D,
+	0x3131AB20,0xE472914A,
+	0x30FC4501,0x6D841BAA,
+	0x30C69D9A,0xBE034955,
+	0x309217AE,0xFE690777,
+	0x305CF2B1,0x970E7258,
+	0x3027288E,0x1271F513,
+	0x2FF286D8,0x0EC190DC,
+	0x2FBDA48C,0xE468E7C7,
+	0x2F87B6D7,0x1D20B96C,
+	0x2F52F8AC,0x174D6123,
+	0x2F1E5AAC,0xF2156838,
+	0x2EE8488A,0x5B445360,
+	0x2EB36D3B,0x7C36A91A,
+	0x2E7F152B,0xF9F10E90,
+	0x2E48DDBC,0xC7F40BA6,
+	0x2E13E497,0x065CD61F,
+	0x2DDFD424,0xD6FAF031,
+	0x2DA97683,0xDF2F268D,
+	0x2D745ECF,0xE5BF520B,
+	0x2D404BD9,0x84990E6F,
+	0x2D0A12F5,0xA0F4E3E5,
+	0x2CD4DBF7,0xB3F71CB7,
+	0x2CA0AFF9,0x5CC5B092,
+	0x2C6AB328,0x946F80EA,
+	0x2C355C20,0x76BF9A55,
+	0x2C011680,0x5EFFAEAA,
+	0x2BCB5733,0xCB32B111,
+	0x2B95DF5C,0xA28EF40D,
+	0x2B617F7D,0x4ED8C33E,
+	0x2B2BFF2E,0xE48E0530,
+	0x2AF665BF,0x1D3E6A8D,
+	0x2AC1EAFF,0x4A98553D,
+	0x2A8CAB32,0x10F3BB95,
+	0x2A56EF5B,0x40C2FC77,
+	0x2A225915,0xCD68C9F9,
+	0x29ED5B56,0x1574765B,
+	0x29B77C44,0xDDF6C516,
+	0x2982C9D0,0xB1923745,
+	0x294E0FB4,0x4F50586E,
+	0x29180C90,0x3F7379F2,
+	0x28E33D40,0x32C2C7F5,
+	0x28AEC866,0xB79E0CBA,
+	0x2878A052,0x2C7E7095,
+	0x2843B374,0xF06526DE,
+	0x280F8587,0xE7083E30,
+	0x27D9379F,0xEC069826,
+	0x27A42C7F,0xF0054685,
+	0x27702399,0x8CD10537,
+	0x2739D28F,0x47B4D525,
+	0x2704A872,0x9FC3DDB7,
+	0x26D086C2,0x19697E2C,
+	0x269A7136,0x8F0F3047,
+	0x2665275E,0xD8D8F36C,
+	0x2630EC4B,0xE0AD8F89,
+	0x25FB13AC,0x9AAF4C0F,
+	0x25C5A956,0xE225D672,
+	0x25915445,0x81B7DEC2,
+	0x255BBA08,0xCF8C979D,
+	0x25262E6D,0x72D6DFB0,
+	0x24F1BEBD,0xF578B2F4,
+	0x24BC6463,0x225AB7EC,
+	0x2486B6B5,0xB5155FF0,
+	0x24522BC4,0x90DDE65A,
+	0x241D12D4,0x1AFCA3C3,
+	0x23E74243,0x48CA1C9C,
+	0x23B29B69,0x070816E3,
+	0x237DC574,0xD80CF16B,
+	0x2347D12A,0x4670C123,
+	0x23130DBB,0x6B8D674F,
+	0x22DE7C5F,0x127BD87E,
+	0x22A8637F,0x41FCAD32,
+	0x227382CC,0x34CA2428,
+	0x223F37AD,0x21436D0C,
+	0x2208F957,0x4DCF8A70,
+	0x21D3FAAC,0x3E3FA1F3,
+	0x219FF779,0xFD329CB9,
+	0x216992C7,0xFDC216FA,
+	0x2134756C,0xCB01ABFB,
+	0x21005DF0,0xA267BCC9,
+	0x20CA2FE7,0x6A3F9475,
+	0x2094F31F,0x8832DD2A,
+	0x2060C27F,0xA028B0EF,
+	0x202AD0CC,0x33744E4B,
+	0x1FF573D6,0x8F903EA2,
+	0x1FC12978,0x72D9CBB5,
+	0x1F8B758D,0x848FAC55,
+	0x1F55F7A4,0x6A0C89DD,
+	0x1F2192E9,0xEE706E4B,
+	0x1EEC1E43,0x171A4A11,
+	0x1EB67E9C,0x127B6E74,
+	0x1E81FEE3,0x41FC585D,
+	0x1E4CCB05,0x36608D61,
+	0x1E1708D0,0xF84D3DE7,
+	0x1DE26D73,0xF9D764B9,
+	0x1DAD7BEC,0xC2F23AC2,
+	0x1D779657,0x025B6235,
+	0x1D42DEAC,0x01E2B4F7,
+	0x1D0E3113,0x363787F2,
+	0x1CD82742,0x91C6065B,
+	0x1CA3529B,0xA7D19EAF,
+	0x1C6EEA92,0xA61C3118,
+	0x1C38BBA8,0x84E35A7A,
+	0x1C03C953,0x9D82AEC8,
+	0x1BCFA885,0xC8D117A6,
+	0x1B99539E,0x3A40DFB8,
+	0x1B6442E4,0xFB671960,
+	0x1B303583,0xFC527AB3,
+	0x1AF9EF39,0x93B72AB8,
+	0x1AC4BF61,0x42F8EEFA,
+	0x1A90991A,0x9BFA58C8,
+	0x1A5A8E90,0xF9908E0D,
+	0x1A253EDA,0x614071A4,
+	0x19F0FF15,0x1A99F483,
+	0x19BB31BB,0x5DC320D2,
+	0x1985C162,0xB168E70E,
+	0x19516782,0x27871F3E,
+	0x191BD8D0,0x3F3E9864,
+	0x18E6470C,0xFF6546B6,
+	0x18B1D270,0xCC51055F,
+	0x187C83E7,0xAD4E6EFE,
+	0x1846CFEC,0x8AA52598,
+	0x18123FF0,0x6EEA847A,
+	0x17DD331A,0x4B10D3F6,
+	0x17A75C15,0x08DA432B,
+	0x1772B010,0xD3E1CF56,
+	0x173DE681,0x5302E556,
+	0x1707EB9A,0xA8CF1DDE,
+	0x16D322E2,0x20A5B17E,
+	0x169E9E36,0x9AA2B597,
+	0x16687E92,0x154EF7AC,
+	0x16339874,0xDDD8C623,
+	0x15FF5A54,0x9627A36C,
+	0x15C91510,0x781FB5F0,
+	0x159410D9,0xF9B2F7F3,
+	0x15600D7B,0x2E28C65C,
+	0x1529AF2B,0x7D0E0A2D,
+	0x14F48C22,0xCA71A1BD,
+	0x14C0701B,0xD527B498,
+	0x148A4CF9,0x550C5426,
+	0x14550A61,0x10D6A9B8,
+	0x1420D51A,0x73DEEE2D,
+	0x13EAEE90,0xB964B047,
+	0x13B58BA6,0xFAB6F36C,
+	0x13813C85,0x955F2923,
+	0x134B9408,0xEEFEA839,
+	0x13161007,0x25988694,
+	0x12E1A66C,0x1E139EDD,
+	0x12AC3D79,0xC9B8FE2E,
+	0x12769794,0xA160CB58,
+	0x124212DD,0x4DE70913,
+	0x120CEAFB,0xAFD80E85,
+	0x11D72262,0xF3133ED1,
+	0x11A281E8,0xC275CBDA,
+	0x116D9CA7,0x9D89462A,
+	0x1137B086,0x17A104EE,
+	0x1102F39E,0x794D9D8B,
+	0x10CE5297,0x287C2F45,
+	0x10984212,0x86C9BF6B,
+	0x1063680E,0xD23AFF89,
+	0x102F0CE4,0x839198DB,
+	0x0FF8D71D,0x360E13E2,
+	0x0FC3DF4A,0x91A4DCB5,
+	0x0F8FCBAA,0x82A16121,
+	0x0F596FBB,0x9BB44DB4,
+	0x0F245962,0xE2F6A490,
+	0x0EF04782,0x4F2BB6DA,
+	0x0EBA0C03,0xB1DF8AF6,
+	0x0E84D669,0x5B193BF8,
+	0x0E50AB87,0x7C142FFA,
+	0x0E1AAC0B,0xF9B9E65C,
+	0x0DE5566F,0xFAFB1EB0,
+	0x0DB111F3,0x2F2F4BC0,
+	0x0D7B4FEB,0x7EB212CD,
+	0x0D45D989,0x32280F0A,
+	0x0D117AD4,0x28200C08,
+	0x0CDBF7B9,0xD9CCE00D,
+	0x0CA65FC7,0xE170B33E,
+	0x0C71E639,0x8126F5CB,
+	0x0C3CA38F,0x350B22DF,
+	0x0C06E93F,0x5DA2824C,
+	0x0BD25432,0xB14ECEA3,
+	0x0B9D5384,0x4EE47DD1,
+	0x0B677603,0x725064A8,
+	0x0B32C4CF,0x8EA6B6EC,
+	0x0AFE07B2,0x7DD78B14,
+	0x0AC80628,0x64AC6F43,
+	0x0A933820,0x5089F29C,
+	0x0A5EC033,0xB40FEA93,
+	0x0A2899C2,0xF6732210,
+	0x09F3AE35,0x91F5B4D9,
+	0x09BF7D22,0x8322BAF5,
+	0x098930E8,0x68E89591,
+	0x09542720,0x53ED4474,
+	0x09201F4D,0x0FF10390,
+	0x08E9CBAE,0x7FE805B3,
+	0x08B4A2F1,0xFFECD15C,
+	0x0880825B,0x3323DAB0,
+	0x084A6A2B,0x85062AB3,
+	0x081521BC,0x6A6B555C,
+	0x07E0E7C9,0xEEBC444A,
+	0x07AB0C76,0x4AC6D3A9,
+	0x0775A391,0xD56BDC87,
+	0x07414FA7,0xDDEFE3A0,
+	0x070BB2A6,0x2FE638FF,
+	0x06D62884,0xF31E93FF,
+	0x06A1BA03,0xF5B21000,
+	0x066C5CD3,0x22B67FFF,
+	0x0636B0A8,0xE891FFFF,
+	0x060226ED,0x86DB3333,
+	0x05CD0B15,0xA491EB84,
+	0x05973C11,0x5074BC6A,
+	0x05629674,0x405D6388,
+	0x052DBD86,0xCD6238D9,
+	0x04F7CAD2,0x3DE82D7B,
+	0x04C308A8,0x31868AC9,
+	0x048E7440,0x4F3DAADB,
+	0x04585D00,0x3F6488AF,
+	0x04237D99,0xCC506D59,
+	0x03EF2F5C,0x7A1A488E,
+	0x03B8F2B0,0x61AEA072,
+	0x0383F559,0xE7BEE6C1,
+	0x034FEEF6,0x3F97D79C,
+	0x03198BF8,0x32DFDFB0,
+	0x02E46FF9,0xC24CB2F3,
+	0x02B05994,0x9B708F29,
+	0x027A28ED,0xC580E50E,
+	0x0244ED8B,0x04671DA5,
+	0x0210BE08,0xD0527E1D,
+	0x01DAC9A7,0xB3B7302F,
+	0x01A56E1F,0xC2F8F359,
+	0x017124E6,0x3593F5E1,
+	0x013B6E3D,0x22865634,
+	0x0105F1CA,0x820511C3,
+	0x00D18E3B,0x9B374169,
+	0x009C16C5,0xC5253575,
+	0x0066789E,0x3750F791,
+	0x0031FA18,0x2C40C60D,
+	0x000730D6,0x7819E8D2,
+	0x0000B815,0x7268FDAF,
+	0x00001268,0x8B70E62B,
+	0x000001D7,0x4124E3D1,
+	0x0000002F,0x201D49FB,
+	0x00000004,0xB6695433,
+	0x00000000,0x78A42205,
+	0x00000000,0x0C1069CD,
+	0x00000000,0x0134D761,
+	0x00000000,0x001EE257,
+	0x00000000,0x000316A2,
+	0x00000000,0x00004F10,
+	0x00000000,0x000007E8,
+	0x00000000,0x000000CA,
+	0x00000000,0x00000014,
+	0x00000000,0x00000002
+	};
+
+LOCAL_D const TUint32 Power10TestPositive[] =
+	{
+	0x3FF00000,0x00000000,
+	0x40240000,0x00000000,
+	0x40590000,0x00000000,
+	0x408F4000,0x00000000,
+	0x40C38800,0x00000000,
+	0x40F86A00,0x00000000,
+	0x412E8480,0x00000000,
+	0x416312D0,0x00000000,
+	0x4197D784,0x00000000,
+	0x41CDCD65,0x00000000,
+	0x4202A05F,0x20000000,
+	0x42374876,0xE8000000,
+	0x426D1A94,0xA2000000,
+	0x42A2309C,0xE5400000,
+	0x42D6BCC4,0x1E900000,
+	0x430C6BF5,0x26340000,
+	0x4341C379,0x37E08000,
+	0x43763457,0x85D8A000,
+	0x43ABC16D,0x674EC800,
+	0x43E158E4,0x60913D00,
+	0x4415AF1D,0x78B58C40,
+	0x444B1AE4,0xD6E2EF50,
+	0x4480F0CF,0x064DD592,
+	0x44B52D02,0xC7E14AF6,
+	0x44EA7843,0x79D99DB4,
+	0x45208B2A,0x2C280291,
+	0x4554ADF4,0xB7320335,
+	0x4589D971,0xE4FE8402,
+	0x45C027E7,0x2F1F1281,
+	0x45F431E0,0xFAE6D721,
+	0x46293E59,0x39A08CEA,
+	0x465F8DEF,0x8808B024,
+	0x4693B8B5,0xB5056E17,
+	0x46C8A6E3,0x2246C99C,
+	0x46FED09B,0xEAD87C03,
+	0x47334261,0x72C74D82,
+	0x476812F9,0xCF7920E3,
+	0x479E17B8,0x4357691B,
+	0x47D2CED3,0x2A16A1B1,
+	0x48078287,0xF49C4A1D,
+	0x483D6329,0xF1C35CA5,
+	0x48725DFA,0x371A19E7,
+	0x48A6F578,0xC4E0A061,
+	0x48DCB2D6,0xF618C879,
+	0x4911EFC6,0x59CF7D4C,
+	0x49466BB7,0xF0435C9E,
+	0x497C06A5,0xEC5433C6,
+	0x49B18427,0xB3B4A05C,
+	0x49E5E531,0xA0A1C873,
+	0x4A1B5E7E,0x08CA3A8F,
+	0x4A511B0E,0xC57E649A,
+	0x4A8561D2,0x76DDFDC0,
+	0x4ABABA47,0x14957D30,
+	0x4AF0B46C,0x6CDD6E3E,
+	0x4B24E187,0x8814C9CE,
+	0x4B5A19E9,0x6A19FC41,
+	0x4B905031,0xE2503DA9,
+	0x4BC4643E,0x5AE44D13,
+	0x4BF97D4D,0xF19D6057,
+	0x4C2FDCA1,0x6E04B86D,
+	0x4C63E9E4,0xE4C2F344,
+	0x4C98E45E,0x1DF3B015,
+	0x4CCF1D75,0xA5709C1B,
+	0x4D037269,0x87666191,
+	0x4D384F03,0xE93FF9F5,
+	0x4D6E62C4,0xE38FF872,
+	0x4DA2FDBB,0x0E39FB47,
+	0x4DD7BD29,0xD1C87A19,
+	0x4E0DAC74,0x463A989F,
+	0x4E428BC8,0xABE49F64,
+	0x4E772EBA,0xD6DDC73D,
+	0x4EACFA69,0x8C95390C,
+	0x4EE21C81,0xF7DD43A7,
+	0x4F16A3A2,0x75D49491,
+	0x4F4C4C8B,0x1349B9B5,
+	0x4F81AFD6,0xEC0E1411,
+	0x4FB61BCC,0xA7119916,
+	0x4FEBA2BF,0xD0D5FF5B,
+	0x502145B7,0xE285BF99,
+	0x50559725,0xDB272F7F,
+	0x508AFCEF,0x51F0FB5F,
+	0x50C0DE15,0x93369D1B,
+	0x50F5159A,0xF8044462,
+	0x512A5B01,0xB605557B,
+	0x516078E1,0x11C3556D,
+	0x51949719,0x56342AC8,
+	0x51C9BCDF,0xABC1357A,
+	0x5200160B,0xCB58C16C,
+	0x52341B8E,0xBE2EF1C7,
+	0x52692272,0x6DBAAE39,
+	0x529F6B0F,0x092959C7,
+	0x52D3A2E9,0x65B9D81D,
+	0x53088BA3,0xBF284E24,
+	0x533EAE8C,0xAEF261AD,
+	0x53732D17,0xED577D0C,
+	0x53A7F85D,0xE8AD5C4F,
+	0x53DDF675,0x62D8B363,
+	0x5412BA09,0x5DC7701E,
+	0x5447688B,0xB5394C25,
+	0x547D42AE,0xA2879F2E,
+	0x54B249AD,0x2594C37D,
+	0x54E6DC18,0x6EF9F45C,
+	0x551C931E,0x8AB87173,
+	0x5551DBF3,0x16B346E8,
+	0x558652EF,0xDC6018A2,
+	0x55BBE7AB,0xD3781ECA,
+	0x55F170CB,0x642B133F,
+	0x5625CCFE,0x3D35D80E,
+	0x565B403D,0xCC834E12,
+	0x56910826,0x9FD210CB,
+	0x56C54A30,0x47C694FE,
+	0x56FA9CBC,0x59B83A3D,
+	0x5730A1F5,0xB8132466,
+	0x5764CA73,0x2617ED80,
+	0x5799FD0F,0xEF9DE8E0,
+	0x57D03E29,0xF5C2B18C,
+	0x58044DB4,0x73335DEF,
+	0x58396121,0x9000356B,
+	0x586FB969,0xF40042C5,
+	0x58A3D3E2,0x388029BB,
+	0x58D8C8DA,0xC6A0342A,
+	0x590EFB11,0x78484135,
+	0x59435CEA,0xEB2D28C1,
+	0x59783425,0xA5F872F1,
+	0x59AE412F,0x0F768FAD,
+	0x59E2E8BD,0x69AA19CC,
+	0x5A17A2EC,0xC414A03F,
+	0x5A4D8BA7,0xF519C84F,
+	0x5A827748,0xF9301D32,
+	0x5AB7151B,0x377C247E,
+	0x5AECDA62,0x055B2D9E,
+	0x5B22087D,0x4358FC82,
+	0x5B568A9C,0x942F3BA3,
+	0x5B8C2D43,0xB93B0A8C,
+	0x5BC19C4A,0x53C4E697,
+	0x5BF6035C,0xE8B6203D,
+	0x5C2B8434,0x22E3A84D,
+	0x5C6132A0,0x95CE4930,
+	0x5C957F48,0xBB41DB7C,
+	0x5CCADF1A,0xEA12525B,
+	0x5D00CB70,0xD24B7379,
+	0x5D34FE4D,0x06DE5057,
+	0x5D6A3DE0,0x4895E46D,
+	0x5DA066AC,0x2D5DAEC4,
+	0x5DD48057,0x38B51A75,
+	0x5E09A06D,0x06E26112,
+	0x5E400444,0x244D7CAB,
+	0x5E740555,0x2D60DBD6,
+	0x5EA906AA,0x78B912CC,
+	0x5EDF4855,0x16E7577F,
+	0x5F138D35,0x2E5096AF,
+	0x5F487082,0x79E4BC5B,
+	0x5F7E8CA3,0x185DEB72,
+	0x5FB317E5,0xEF3AB327,
+	0x5FE7DDDF,0x6B095FF1,
+	0x601DD557,0x45CBB7ED,
+	0x6052A556,0x8B9F52F4,
+	0x60874EAC,0x2E8727B1,
+	0x60BD2257,0x3A28F19D,
+	0x60F23576,0x84599702,
+	0x6126C2D4,0x256FFCC3,
+	0x615C7389,0x2ECBFBF4,
+	0x6191C835,0xBD3F7D78,
+	0x61C63A43,0x2C8F5CD6,
+	0x61FBC8D3,0xF7B3340C,
+	0x62315D84,0x7AD00087,
+	0x6265B4E5,0x998400A9,
+	0x629B221E,0xFFE500D4,
+	0x62D0F553,0x5FEF2084,
+	0x630532A8,0x37EAE8A5,
+	0x633A7F52,0x45E5A2CF,
+	0x63708F93,0x6BAF85C1,
+	0x63A4B378,0x469B6732,
+	0x63D9E056,0x584240FE,
+	0x64102C35,0xF729689F,
+	0x64443743,0x74F3C2C6,
+	0x64794514,0x5230B378,
+	0x64AF9659,0x66BCE056,
+	0x64E3BDF7,0xE0360C36,
+	0x6518AD75,0xD8438F43,
+	0x654ED8D3,0x4E547314,
+	0x65834784,0x10F4C7EC,
+	0x65B81965,0x1531F9E8,
+	0x65EE1FBE,0x5A7E7861,
+	0x6622D3D6,0xF88F0B3D,
+	0x665788CC,0xB6B2CE0C,
+	0x668D6AFF,0xE45F818F,
+	0x66C262DF,0xEEBBB0F9,
+	0x66F6FB97,0xEA6A9D38,
+	0x672CBA7D,0xE5054486,
+	0x6761F48E,0xAF234AD4,
+	0x679671B2,0x5AEC1D89,
+	0x67CC0E1E,0xF1A724EB,
+	0x680188D3,0x57087713,
+	0x6835EB08,0x2CCA94D7,
+	0x686B65CA,0x37FD3A0D,
+	0x68A11F9E,0x62FE4448,
+	0x68D56785,0xFBBDD55A,
+	0x690AC167,0x7AAD4AB1,
+	0x6940B8E0,0xACAC4EAF,
+	0x6974E718,0xD7D7625A,
+	0x69AA20DF,0x0DCD3AF1,
+	0x69E0548B,0x68A044D6,
+	0x6A1469AE,0x42C8560C,
+	0x6A498419,0xD37A6B8F,
+	0x6A7FE520,0x48590673,
+	0x6AB3EF34,0x2D37A408,
+	0x6AE8EB01,0x38858D0A,
+	0x6B1F25C1,0x86A6F04C,
+	0x6B537798,0xF4285630,
+	0x6B88557F,0x31326BBB,
+	0x6BBE6ADE,0xFD7F06AA,
+	0x6BF302CB,0x5E6F642A,
+	0x6C27C37E,0x360B3D35,
+	0x6C5DB45D,0xC38E0C82,
+	0x6C9290BA,0x9A38C7D1,
+	0x6CC734E9,0x40C6F9C6,
+	0x6CFD0223,0x90F8B837,
+	0x6D322156,0x3A9B7323,
+	0x6D66A9AB,0xC9424FEB,
+	0x6D9C5416,0xBB92E3E6,
+	0x6DD1B48E,0x353BCE70,
+	0x6E0621B1,0xC28AC20C,
+	0x6E3BAA1E,0x332D728F,
+	0x6E714A52,0xDFFC6799,
+	0x6EA59CE7,0x97FB817F,
+	0x6EDB0421,0x7DFA61DF,
+	0x6F10E294,0xEEBC7D2C,
+	0x6F451B3A,0x2A6B9C76,
+	0x6F7A6208,0xB5068394,
+	0x6FB07D45,0x7124123D,
+	0x6FE49C96,0xCD6D16CC,
+	0x7019C3BC,0x80C85C7F,
+	0x70501A55,0xD07D39CF,
+	0x708420EB,0x449C8843,
+	0x70B92926,0x15C3AA54,
+	0x70EF736F,0x9B3494E9,
+	0x7123A825,0xC100DD11,
+	0x7158922F,0x31411456,
+	0x718EB6BA,0xFD91596B,
+	0x71C33234,0xDE7AD7E3,
+	0x71F7FEC2,0x16198DDC,
+	0x722DFE72,0x9B9FF153,
+	0x7262BF07,0xA143F6D4,
+	0x72976EC9,0x8994F489,
+	0x72CD4A7B,0xEBFA31AB,
+	0x73024E8D,0x737C5F0B,
+	0x7336E230,0xD05B76CD,
+	0x736C9ABD,0x04725481,
+	0x73A1E0B6,0x22C774D0,
+	0x73D658E3,0xAB795204,
+	0x740BEF1C,0x9657A686,
+	0x74417571,0xDDF6C814,
+	0x7475D2CE,0x55747A18,
+	0x74AB4781,0xEAD1989E,
+	0x74E10CB1,0x32C2FF63,
+	0x75154FDD,0x7F73BF3C,
+	0x754AA3D4,0xDF50AF0B,
+	0x7580A665,0x0B926D67,
+	0x75B4CFFE,0x4E7708C0,
+	0x75EA03FD,0xE214CAF1,
+	0x7620427E,0xAD4CFED6,
+	0x7654531E,0x58A03E8C,
+	0x768967E5,0xEEC84E2F,
+	0x76BFC1DF,0x6A7A61BB,
+	0x76F3D92B,0xA28C7D15,
+	0x7728CF76,0x8B2F9C5A,
+	0x775F0354,0x2DFB8370,
+	0x77936214,0x9CBD3226,
+	0x77C83A99,0xC3EC7EB0,
+	0x77FE4940,0x34E79E5C,
+	0x7832EDC8,0x2110C2F9,
+	0x7867A93A,0x2954F3B8,
+	0x789D9388,0xB3AA30A5,
+	0x78D27C35,0x704A5E67,
+	0x79071B42,0xCC5CF601,
+	0x793CE213,0x7F743382,
+	0x79720D4C,0x2FA8A031,
+	0x79A6909F,0x3B92C83D,
+	0x79DC34C7,0x0A777A4D,
+	0x7A11A0FC,0x668AAC70,
+	0x7A46093B,0x802D578C,
+	0x7A7B8B8A,0x6038AD6F,
+	0x7AB13736,0x7C236C65,
+	0x7AE58504,0x1B2C477F,
+	0x7B1AE645,0x21F7595E,
+	0x7B50CFEB,0x353A97DB,
+	0x7B8503E6,0x02893DD2,
+	0x7BBA44DF,0x832B8D46,
+	0x7BF06B0B,0xB1FB384C,
+	0x7C2485CE,0x9E7A065F,
+	0x7C59A742,0x461887F6,
+	0x7C900889,0x6BCF54FA,
+	0x7CC40AAB,0xC6C32A38,
+	0x7CF90D56,0xB873F4C7,
+	0x7D2F50AC,0x6690F1F8,
+	0x7D63926B,0xC01A973B,
+	0x7D987706,0xB0213D0A,
+	0x7DCE94C8,0x5C298C4C,
+	0x7E031CFD,0x3999F7B0,
+	0x7E37E43C,0x8800759C,
+	0x7E6DDD4B,0xAA009303,
+	0x7EA2AA4F,0x4A405BE2,
+	0x7ED754E3,0x1CD072DA,
+	0x7F0D2A1B,0xE4048F90,
+	0x7F423A51,0x6E82D9BA,
+	0x7F76C8E5,0xCA239029,
+	0x7FAC7B1F,0x3CAC7433,
+	0x7FE1CCF3,0x85EBC8A0
+	};
+
+
+LOCAL_C TReal IEEERemainder(TReal a1, TReal a2)
+//
+// Implement the IEEE remainder operation as per IEEE 754.  Since fmod()
+// doesn't do the correct thing for infinity in the divisor, we have
+// to patch up the return values in some of those cases.  Then we have
+// to adjust the domain of the results to be -|d/2| <= rem <= |d/2|.
+//
+// Copied from the Javasoft Win32 implementation
+	{
+	if (!Math::IsFinite(a2))
+		{
+		if (Math::IsNaN(a2))
+			return a2;
+		if (Math::IsFinite(a1))
+			return a1;
+		}
+	TReal q;
+	Math::Mod(q,a1,a2);
+
+	TReal d=a2;
+	if (d<0)
+		d=-d;
+	if (q < 0) 
+		{
+		if (-q > d / 2)
+			q += d;
+		} 
+	else 
+		{
+		if (q > d / 2)
+			q -= d;
+		}
+	return q;
+	}
+
+LOCAL_C TReal GetTestValue(TUint32*& aValue)
+	{
+	TReal x;
+	TUint32* p=(TUint32*)&x;
+#ifdef __DOUBLE_WORDS_SWAPPED__
+	p[0]=*aValue++;
+	p[1]=*aValue++;
+#else
+	p[1]=*aValue++;
+	p[0]=*aValue++;
+#endif
+	return x;
+	}
+
+LOCAL_C TBool CompareExact(TReal aValue, TUint32*& anExpected)
+	{
+	TReal x=aValue;
+	TUint32* p=(TUint32*)&x;
+	TUint32 hi;
+	TUint32 lo;
+	TUint32 xhi;
+	TUint32 xlo;
+#ifdef __DOUBLE_WORDS_SWAPPED__
+	hi=p[0];
+	lo=p[1];
+#else
+	hi=p[1];
+	lo=p[0];
+#endif
+	xhi=*anExpected++;
+	xlo=*anExpected++;
+	if (hi==xhi && lo==xlo)
+		return ETrue;
+	test.Printf(_L("Expected %08x %08x, Actual %08x %08x\n"),xhi,xlo,hi,lo);
+	return EFalse;
+	}
+
+LOCAL_C void TestIEEERem()
+	{
+	TInt n=sizeof(IEEERemainderTestVectors)/(6*sizeof(TUint32));
+	test.Printf(_L("%d tests\n"),n);
+
+	TUint32* pV=IEEERemainderTestVectors;
+	TInt i;
+	for (i=0; i<n; i++)
+		{
+		TReal x,y,z;
+		x=GetTestValue(pV);
+		y=GetTestValue(pV);
+		z=IEEERemainder(x,y);
+
+		TBool ok=CompareExact(z,pV);
+		if (!ok)
+			{
+			pV-=6;
+			TUint32 ddhi=*pV++;
+			TUint32 ddlo=*pV++;
+			TUint32 dvhi=*pV++;
+			TUint32 dvlo=*pV++;
+			test.Printf(_L("Test %d failed\nDividend=%08x %08x\nDivisor =%08x %08x\n"),i,ddhi,ddlo,dvhi,dvlo);
+			test(0);
+			}
+		}
+	}
+
+const TReal KLn2=0.69314718055994531;
+
+LOCAL_C TReal Accuracy(TReal expected, TReal obtained)
+	{
+	TReal err=obtained-expected;
+	if (err==0.0)
+		return 53.0;
+	if (expected==0.0)
+		return 52.0;
+	err/=expected;
+	Math::Ln(err,Abs(err));
+	return -err/KLn2;
+	}
+
+LOCAL_C void Get(TReal& r, const TUint32 *p)
+	{
+	TInt *pR=(TInt*)&r;
+#ifdef __DOUBLE_WORDS_SWAPPED__
+	pR[0]=p[0];
+	pR[1]=p[1];
+#else
+	pR[0]=p[1];
+	pR[1]=p[0];
+#endif
+	}
+
+LOCAL_C TInt TestSine()
+	{
+	TInt n=sizeof(SineTest)/sizeof(TUint32);
+	n>>=2;
+	TReal input,obtained,expected;
+	TReal acc;
+	TReal minacc=99;
+	TInt i;
+	const TUint32 *p=SineTest;
+	for (i=0; i<n; i++)
+		{
+		Get(input,p);
+		Get(expected,p+2);
+		p+=4;
+		Math::Sin(obtained,input);
+		acc=Accuracy(expected,obtained);
+		//test.Printf(_L("IN: %15g OUT: %15g EXP: %15g ACC:%15g\n"), input, obtained, expected, acc);
+		if (acc<minacc)
+			{
+			minacc=acc;
+			}
+		}
+	return TInt(minacc);
+	}
+
+LOCAL_C TInt TestCosine()
+	{
+	TInt n=sizeof(CosineTest)/sizeof(TUint32);
+	n>>=2;
+	TReal input,obtained,expected;
+	TReal acc;
+	TReal minacc=99;
+	TInt i;
+	const TUint32 *p=CosineTest;
+	for (i=0; i<n; i++)
+		{
+		Get(input,p);
+		Get(expected,p+2);
+		p+=4;
+		Math::Cos(obtained,input);
+		acc=Accuracy(expected,obtained);
+		//test.Printf(_L("IN: %15g OUT: %15g EXP: %15g ACC:%15g\n"), input, obtained, expected, acc);
+		if (acc<minacc)
+			{
+			minacc=acc;
+			}
+		}
+	return TInt(minacc);
+	}
+
+LOCAL_C TInt TestTangent()
+	{
+	TInt n=sizeof(TanTest)/sizeof(TUint32);
+	n>>=2;
+	TReal input,obtained,expected;
+	TReal acc;
+	TReal minacc=99;
+	TInt i;
+	const TUint32 *p=TanTest;
+	for (i=0; i<n; i++)
+		{
+		Get(input,p);
+		Get(expected,p+2);
+		p+=4;
+		Math::Tan(obtained,input);
+		acc=Accuracy(expected,obtained);
+		//test.Printf(_L("IN: %15g OUT: %16g EXP: %16g ACC:%15g\n"), input, obtained, expected, acc);
+		if (acc<minacc)
+			{
+			minacc=acc;
+			}
+		}
+	return TInt(minacc);
+	}
+
+LOCAL_C TInt TestExp()
+	{
+	TInt n=sizeof(ExpTest)/sizeof(TUint32);
+	n>>=2;
+	TReal input,obtained,expected;
+	TReal acc;
+	TReal minacc=99;
+	TInt i;
+	const TUint32 *p=ExpTest;
+	for (i=0; i<n; i++)
+		{
+		Get(input,p);
+		Get(expected,p+2);
+		p+=4;
+		Math::Exp(obtained,input);
+		acc=Accuracy(expected,obtained);
+		//test.Printf(_L("IN: %15g OUT: %15g EXP: %15g ACC:%15g\n"), input, obtained, expected, acc);
+		if (acc<minacc)
+			{
+			minacc=acc;
+			}
+		}
+	return TInt(minacc);
+	}
+
+LOCAL_C TInt TestLn()
+	{
+	TInt n=sizeof(LnTest)/sizeof(TUint32);
+	n>>=2;
+	TReal input,obtained,expected;
+	TReal acc;
+	TReal minacc=99;
+	TInt i;
+	const TUint32 *p=LnTest;
+	for (i=0; i<n; i++)
+		{
+		Get(input,p);
+		Get(expected,p+2);
+		p+=4;
+		Math::Ln(obtained,input);
+		acc=Accuracy(expected,obtained);
+		//test.Printf(_L("IN: %15g OUT: %15g EXP: %15g ACC:%15g\n"), input, obtained, expected, acc);
+		if (acc<minacc)
+			{
+			minacc=acc;
+			}
+		}
+	return TInt(minacc);
+	}
+
+LOCAL_C TInt TestSqrt()
+	{
+	TInt n=sizeof(SqrtTest)/sizeof(TUint32);
+	n>>=2;
+	TReal input,obtained,expected;
+	TReal acc;
+	TReal minacc=99;
+	TInt i;
+	const TUint32 *p=SqrtTest;
+	for (i=0; i<n; i++)
+		{
+		Get(input,p);
+		Get(expected,p+2);
+		p+=4;
+		Math::Sqrt(obtained,input);
+		acc=Accuracy(expected,obtained);
+		//test.Printf(_L("IN: %15g OUT: %15g EXP: %15g ACC:%15g\n"), input, obtained, expected, acc);
+		if (acc<minacc)
+			{
+			minacc=acc;
+			}
+		}
+	return TInt(minacc);
+	}
+
+LOCAL_C TInt TestArctan()
+	{
+	TInt n=sizeof(ArctanTest)/sizeof(TUint32);
+	n>>=2;
+	TReal input,obtained,expected;
+	TReal acc;
+	TReal minacc=99;
+	TInt i;
+	const TUint32 *p=ArctanTest;
+	for (i=0; i<n; i++)
+		{
+		Get(input,p);
+		Get(expected,p+2);
+		p+=4;
+		Math::ATan(obtained,input);
+		acc=Accuracy(expected,obtained);
+		//test.Printf(_L("IN: %15g OUT: %15g EXP: %15g ACC:%15g\n"), input, obtained, expected, acc);
+		if (acc<minacc)
+			{
+			minacc=acc;
+			}
+		}
+	return TInt(minacc);
+	}
+
+LOCAL_C TInt TestArcsin()
+	{
+	TInt n=sizeof(ArcsinTest)/sizeof(TUint32);
+	n>>=2;
+	TReal input,obtained,expected;
+	TReal acc;
+	TReal minacc=99;
+	TInt i;
+	const TUint32 *p=ArcsinTest;
+	for (i=0; i<n; i++)
+		{
+		Get(input,p);
+		Get(expected,p+2);
+		p+=4;
+		Math::ASin(obtained,input);
+		acc=Accuracy(expected,obtained);
+		//test.Printf(_L("IN: %15g OUT: %15g EXP: %15g ACC:%15g\n"), input, obtained, expected, acc);
+		if (acc<minacc)
+			{
+			minacc=acc;
+			}
+		}
+	return TInt(minacc);
+	}
+
+LOCAL_C TInt TestPowers()
+	{
+	TInt n=sizeof(PowerTest)/sizeof(TUint32);
+	n/=6;
+	TReal base,power,obtained,expected;
+	TReal acc;
+	TReal minacc=99;
+	TInt i;
+	const TUint32 *p=PowerTest;
+	for (i=0; i<n; i++)
+		{
+		Get(base,p);
+		Get(power,p+2);
+		Get(expected,p+4);
+		p+=6;
+		Math::Pow(obtained,base,power);
+		acc=Accuracy(expected,obtained);
+		//test.Printf(_L("BASE: %15g POWER: %15g OUT: %15g EXP: %15g ACC:%15g\n"), base, power, obtained, expected, acc);
+		if (acc<minacc)
+			{
+			minacc=acc;
+			}
+		}
+	return TInt(minacc);
+	}
+
+LOCAL_C TInt TestPowers2()
+	{
+	TInt n=sizeof(PowerTest2)/sizeof(TUint32);
+	n/=5;
+	TReal base,power,obtained,expected;
+	TReal acc;
+	TReal minacc=99;
+	TInt i;
+	const TUint32 *p=PowerTest2;
+	for (i=0; i<n; i++)
+		{
+		Get(base,p);
+		power=TReal(p[2]);
+		Get(expected,p+3);
+		p+=5;
+		Math::Pow(obtained,base,power);
+		acc=Accuracy(expected,obtained);
+		//test.Printf(_L("BASE: %15g POWER: %15g OUT: %15g EXP: %15g ACC:%15g\n"), base, power, obtained, expected, acc);
+		if (acc<minacc)
+			{
+			minacc=acc;
+			}
+		}
+	return TInt(minacc);
+	}
+
+LOCAL_C TInt TestPowers3()
+	{
+	TInt n=sizeof(PowerTest3)/sizeof(TUint32);
+	n/=5;
+	TReal base,power,obtained,expected;
+	TReal acc;
+	TReal minacc=99;
+	TInt i;
+	const TUint32 *p=PowerTest3;
+	for (i=0; i<n; i++)
+		{
+		Get(base,p);
+		power=TReal(p[2])+0.5;
+		Get(expected,p+3);
+		p+=5;
+		Math::Pow(obtained,base,power);
+		acc=Accuracy(expected,obtained);
+		//test.Printf(_L("BASE: %15g POWER: %15g OUT: %15g EXP: %15g ACC:%15g\n"), base, power, obtained, expected, acc);
+		if (acc<minacc)
+			{
+			minacc=acc;
+			}
+		}
+	return TInt(minacc);
+	}
+
+LOCAL_C TInt TestPowersOf10()
+	{
+	TInt n=sizeof(Power10TestPositive)/sizeof(TUint32);
+	n>>=1;
+	TReal obtained,expected;
+	TReal acc;
+	TReal minacc=99;
+	TInt input;
+	const TUint32 *p=Power10TestPositive;
+	for (input=0; input<n; input++)
+		{
+		Get(expected,p);
+		p+=2;
+		Math::Pow10(obtained,input);
+		acc=Accuracy(expected,obtained);
+		//test.Printf(_L("IN: %d OUT: %15g EXP: %15g ACC:%15g\n"), input, obtained, expected, acc);
+		if (acc<minacc)
+			{
+			minacc=acc;
+			}
+		}
+	n=sizeof(Power10TestNegative)/sizeof(TUint32);
+	n>>=1;
+	p=Power10TestNegative;
+	for (input=-1; input>=(-n); input--)
+		{
+		Get(expected,p);
+		p+=2;
+		Math::Pow10(obtained,input);
+		acc=Accuracy(expected,obtained);
+		//test.Printf(_L("IN: %d OUT: %15g EXP: %15g ACC:%15g\n"), input, obtained, expected, acc);
+		if (acc<minacc)
+			{
+			minacc=acc;
+			}
+		}
+	return TInt(minacc);
+	}
+
+GLDEF_C TInt E32Main()
+    {
+
+	test.Title();
+
+	test.Start(_L("IEEE Remainder"));
+	TestIEEERem();
+
+	test.Next(_L("Sine"));
+	TInt sinacc=TestSine();
+	test.Printf(_L("Sin   accuracy %d bits\n"),sinacc);
+	test(sinacc>=52);
+
+	test.Next(_L("Cosine"));
+	TInt cosacc=TestCosine();
+	test.Printf(_L("Cos   accuracy %d bits\n"),cosacc);
+	test(cosacc>=52);
+
+	test.Next(_L("Tangent"));
+	TInt tanacc=TestTangent();
+	test.Printf(_L("Tan   accuracy %d bits\n"),tanacc);
+	test(tanacc>=52);
+
+	test.Next(_L("Exponential"));
+	TInt expacc=TestExp();
+	test.Printf(_L("Exp   accuracy %d bits\n"),expacc);
+	test(expacc>=52);
+
+	test.Next(_L("Logarithm"));
+	TInt lnacc=TestLn();
+	test.Printf(_L("Ln    accuracy %d bits\n"),lnacc);
+	test(lnacc>=52);
+
+	test.Next(_L("Square root"));
+	TInt sqrtacc=TestSqrt();
+	test.Printf(_L("Sqrt  accuracy %d bits\n"),sqrtacc);
+	test(sqrtacc>=52);
+
+	test.Next(_L("Arctangent"));
+	TInt atnacc=TestArctan();
+	test.Printf(_L("ATan  accuracy %d bits\n"),atnacc);
+	test(atnacc>=52);
+
+	test.Next(_L("Arcsine"));
+	TInt asnacc=TestArcsin();
+	test.Printf(_L("ASin  accuracy %d bits\n"),asnacc);
+	test(asnacc>=52);
+
+	test.Next(_L("Powers 1"));
+	TInt pow1acc=TestPowers();
+	test.Printf(_L("Pow   accuracy %d bits\n"),pow1acc);
+	test(pow1acc>=52);
+
+	test.Next(_L("Powers 2"));
+	TInt pow2acc=TestPowers2();
+	test.Printf(_L("Pow   accuracy %d bits\n"),pow2acc);
+	test(pow2acc>=52);
+
+	test.Next(_L("Powers 3"));
+	TInt pow3acc=TestPowers3();
+	test.Printf(_L("Pow   accuracy %d bits\n"),pow3acc);
+	test(pow3acc>=52);
+
+	test.Next(_L("Powers of 10"));
+	TInt pow10acc=TestPowersOf10();
+	test.Printf(_L("Pow10 accuracy %d bits\n"),pow3acc);
+	test(pow10acc>=52);
+
+	test.End();
+
+	return(KErrNone);
+    }
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32test/math/t_vals.h	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,83 @@
+// Copyright (c) 1997-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32test\math\t_vals.h
+// 
+//
+
+#include <e32std.h>
+
+class TInt32x
+	{
+public:
+	TInt32x(TInt32 aInt) {iInt=aInt;}
+public:
+	TInt32 iInt;
+	};
+
+#if defined  (__DOUBLE_WORDS_SWAPPED__)
+#define TINT64(a,b) MAKE_TINT64(b,a)
+#else	// for WINS and X86 (little-endian doubles) 
+#define TINT64(a,b) MAKE_TINT64(a,b)
+#endif
+
+const TInt64 minTReal32in64 = TINT64(0x38100000,0x0);
+const TInt64 maxTReal32in64 = TINT64(0x47efffff,0xe0000000);
+const TInt64 sqrtMaxTReal64 = TINT64(0x5fefffff,0xffd9c605);
+const TInt64 sqrtMinTReal64 = TINT64(0x20000000,0x0);
+const TInt64 negZeroTReal64 = TINT64(0x80000000,0x0);
+const TInt64 posInfTReal64 = TINT64(0x7ff00000,0x0);
+const TInt64 negInfTReal64 = TINT64(0xfff00000,0x0);
+const TInt64 NaNTReal64 = TINT64(0x7fffffff,0xffffffff);
+const TInt64 K1EMinus322 = TINT64(0x00000000, 0x00000014);
+const TInt64 K1EMinus313 = TINT64(0x00000004, 0xB6695433);
+const TInt64 K5EMinus324 = TINT64(0x00000000, 0x00000001);
+const TInt64 K4EMinus320 = TINT64(0x00000000, 0x00001FA0);
+const TInt64 K1EMinus310 = TINT64(0x00001268, 0x8B70E62B);
+const TInt64 K1EMinus323 = TINT64(0x00000000, 0x00000002);
+const TInt64 K1Point2EMinus320 = TINT64(0x00000000, 0x0000097D);
+const TInt64 K5EMinus321 = TINT64(0x00000000, 0x000003F4);
+const TInt64 K2EMinus321 = TINT64(0x00000000, 0x00000195);
+const TInt64 K1Point234EMinus316 = TINT64(0x000000000, 0x017D1C36);
+const TInt64 K1EMinus324 = TINT64(0x000000000, 0x00000000);
+
+const TInt32x sqrtMaxTReal32 = TInt32x(0x5f7ffffd);
+const TInt32x sqrtMinTReal32 = TInt32x(0x20000000);
+const TInt32x negZeroTReal32 = TInt32x(0x80000000);
+const TReal64 KMinTReal32in64 = *(TReal64*)&minTReal32in64;
+const TReal64 KMaxTReal32in64 = *(TReal64*)&maxTReal32in64;
+const TReal64 KSqrtMaxTReal64 = *(TReal64*)&sqrtMaxTReal64;
+const TReal64 KSqrtMinTReal64 = *(TReal64*)&sqrtMinTReal64;
+const TReal64 KNegZeroTReal64 = *(TReal64*)&negZeroTReal64;
+const TReal64 KPosInfTReal64 = *(TReal64*)&posInfTReal64;
+const TReal64 KNegInfTReal64 = *(TReal64*)&negInfTReal64;
+const TReal64 KNaNTReal64 = *(TReal64*)&NaNTReal64;
+const TReal32 KSqrtMaxTReal32 = *(TReal32*)&sqrtMaxTReal32;
+const TReal32 KSqrtMinTReal32 = *(TReal32*)&sqrtMinTReal32;
+const TReal32 KNegZeroTReal32 = *(TReal32*)&negZeroTReal32;
+const TReal KMinTReal32inTReal = TReal(KMinTReal32in64);
+const TReal KMaxTReal32inTReal = TReal(KMaxTReal32in64);
+const TReal KNegZeroTReal = TReal(KNegZeroTReal64);
+const TReal64 K1EMinus322Real64 = *(TReal64*)&K1EMinus322;
+const TReal64 K1EMinus313Real64 = *(TReal64*)&K1EMinus313;
+const TReal64 K5EMinus324Real64 = *(TReal64*)&K5EMinus324;
+const TReal64 K4EMinus320Real64 = *(TReal64*)&K4EMinus320;
+const TReal64 K1EMinus310Real64 = *(TReal64*)&K1EMinus310;
+const TReal64 K1EMinus323Real64 = *(TReal64*)&K1EMinus323;
+const TReal64 K1Point2EMinus320Real64 = *(TReal64*)&K1Point2EMinus320;
+const TReal64 K5EMinus321Real64 = *(TReal64*)&K5EMinus321;
+const TReal64 K2EMinus321Real64 = *(TReal64*)&K2EMinus321;
+const TReal64 K1Point234EMinus316Real64 = *(TReal64*)&K1Point234EMinus316;
+const TReal64 K1EMinus324Real64 = *(TReal64*)&K1EMinus324;
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32test/misc/prbs.h	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,34 @@
+// Copyright (c) 1997-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32test\misc\prbs.h
+// 
+//
+
+#ifndef __PRBS_H__
+#define __PRBS_H__
+#include <e32cmn.h>
+
+LOCAL_C TUint Random(TUint* aSeed)
+	{
+	TUint x = aSeed[0];
+	TUint r3 = x >> 1;
+	r3 |= (aSeed[1] << 31);
+	aSeed[1] = x & 1;
+	r3 ^= (x << 12);
+	x = r3 ^ (r3 >> 20);
+	aSeed[0] = x;
+	return x;
+	}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32test/system/t_ctrap.cpp	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,1592 @@
+// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32test\system\t_ctrap.cpp
+// Overview:
+// Test the CCleanup, CTrapCleanup and TAutoClose classes
+// API Information:
+// CCleanup, CTrapCleanup, TAutoClose
+// Details:
+// - Test cleanup stack reallocation during cleanup.
+// - Test cleanup stack modifications during the cleanup operation  
+// will cause a panic.
+// - Test single-level cleanup of cells, objects, items and a mix: 
+// Create a CCleanup object, call a combination of methods, verify 
+// the results are as expected and verify the heap has not been 
+// corrupted.
+// - Test multi-level cleanup of cells, objects, items and a mix: 
+// Create a CCleanup object, call a combination of methods, verify 
+// the results are as expected and verify the heap has not been 
+// corrupted.
+// - Test a variety of special case cleanup tasks. Verify that the 
+// results are as expected.
+// - Test CTrapCleanup cleanup of objects that either exit normally
+// or leave. Also test the cleanup of multiple objects that leave.
+// Verify results are as expected.
+// - Test TAutoClose: create a TAutoClose object, verify that it is 
+// closed when it goes out of scope, push it on the cleanup stack,
+// verify cleanup results are as expected.
+// - Test that the Cleanup stack can go re-entrant.
+// - Ensure that the stack is properly balanced with and without
+// leaving.
+// Platforms/Drives/Compatibility:
+// All.
+// Assumptions/Requirement/Pre-requisites:
+// Failures and causes:
+// Base Port information:
+// 
+//
+
+#define __E32TEST_EXTENSION__
+
+#include <e32test.h>
+#include <e32panic.h>
+#include <e32debug.h>
+
+
+const TInt KInitialCount=2;
+const TInt KInitialCountAll=3;
+const TInt KLeaveValue=0x12345678;
+const TInt KMaxAlloc=6;	
+
+static const TInt KHeapSize = 0x2000;
+
+enum TWhat {EPop,EPopAndDestroy,EMulti,ENull};
+
+class CTest : public CBase
+	{
+public:
+	void ConstructL();
+private:
+	TInt iData;
+	};
+	
+class CTest2: public CBase 
+	{
+public:
+	~CTest2();
+	};
+
+class CTest3: public CBase 
+	{
+public:
+	~CTest3();
+	};
+
+class RItem
+	{
+public:
+	RItem() : iOpen(EFalse) {}
+	void Open() {iOpen=ETrue;}
+	void Close() {iOpen=EFalse;}
+	operator TCleanupItem() {return TCleanupItem(Cleanup,this);}
+	TBool IsOpen() const {return(iOpen);}
+private:
+	static void Cleanup(TAny* aPtr);
+private:
+	TBool iOpen;
+	};
+
+LOCAL_D RTest test(_L("T_CTRAP"));
+LOCAL_D TAny* gP1;
+LOCAL_D CBufFlat* gP2;
+
+
+LOCAL_C void ReallocateStackL()
+	{
+	TInt n = 0;
+	for(TInt i = 0; i < KMaxAlloc; ++i)
+		{
+		HBufC *p1 = HBufC::NewLC(4);   //Stack re-allocation will be performed due to the additional objects pushed
+									   //into the cleanup stack
+		n = p1->Length();			   //include this line to avoid warnigs for unused "p1" variable
+		}
+	test.Printf(_L("ReallocateStackL(): PopAndDestroy KMaxAlloc pointers\n"));
+	CleanupStack::PopAndDestroy(KMaxAlloc);
+	}
+
+CTest2::~CTest2()
+	{
+	TInt err = KErrNoMemory;
+	
+	test.Printf(_L("~CTest2(): call ReallocateStackL()\n"));
+	
+	TRAP(err, ReallocateStackL() );
+	}
+
+CTest3::~CTest3()
+	{
+	RDebug::Printf("~CTest3(): Modify Cleanup stack by pushing items");
+	
+	TInt n = 0;
+	for(TInt i = 0; i < KMaxAlloc; ++i)
+		{
+		HBufC *p1 = HBufC::NewLC(4);   //Stack re-allocation will be performed due to the additional objects pushed
+									   //into the cleanup stack
+		n = p1->Length();			   //include this line to avoid warnigs for unused "p1" variable
+		}
+	}
+
+#ifndef __TOOLS2__
+LOCAL_C void ModifyStack()
+	{
+	CTest3* ptr6 = new(ELeave)CTest3;
+	CleanupStack::PushL(ptr6);
+
+	RDebug::Printf("ModifyStack(): PopAndDestroy ptr6");
+	CleanupStack::PopAndDestroy();
+	}
+
+LOCAL_C TInt PanicStackModifiedFn(TAny* aNopFn)
+	{
+	__UHEAP_MARK;
+	CTrapCleanup* cleanup = CTrapCleanup::New();
+
+	aNopFn = NULL;		//avoid warnings for unused "aNopFn" variable
+
+	TInt err = KErrNoMemory;
+
+	RDebug::Printf("PanicStackModifiedFn(): call TRAP(err, ModifyStack())");
+
+	if(NULL != cleanup)
+		{
+		TRAP(err, ModifyStack());
+		delete cleanup;
+		}
+	__UHEAP_MARKEND;
+	return err;	
+	}
+
+LOCAL_C void PushAndCleanupL()
+	{
+	CTest2* ptr1 = new(ELeave)CTest2;
+	CleanupStack::PushL(ptr1);
+	
+	CTest2* ptr2 = new(ELeave)CTest2;
+	CleanupStack::PushL(ptr2);
+	
+	CTest2* ptr3 = new(ELeave)CTest2;
+	CleanupStack::PushL(ptr3);
+
+	test.Printf(_L("PushAndCleanupL(): PopAndDestroy ptr3, ptr2 and ptr1\n"));
+	CleanupStack::PopAndDestroy(3);
+
+	CTest2* ptr4 = new(ELeave)CTest2;
+	CleanupStack::PushL(ptr4);
+	
+	CTest2* ptr5 = new(ELeave)CTest2;
+	CleanupStack::PushL(ptr5);
+
+	test.Printf(_L("PushAndCleanupL(): PopAndDestroy ptr5 and ptr4\n"));
+	CleanupStack::PopAndDestroy();
+	CleanupStack::PopAndDestroy();
+	}
+
+LOCAL_C void testDestructorStackReallocation()
+	{
+	__UHEAP_MARK;
+	CTrapCleanup* cleanup = CTrapCleanup::New();
+	
+	TInt err = KErrNoMemory;
+	
+	if(NULL != cleanup)
+		{
+		TRAP(err, PushAndCleanupL());
+		delete cleanup;
+		}
+	__UHEAP_MARKEND;
+
+	test_KErrNone(err);
+
+	test.Printf(_L("Verify cleanup stack modification during cleanup operation causes EClnStackModified panic\n"));
+	
+	//
+	//To verify the above case a new thread is created which does modify the cleanup stack during cleanup.
+	//The exit reason is then checked for the appropriate value(EClnStackModified)
+	//
+
+	RThread panicThread;
+
+	TInt r = panicThread.Create(_L("Panic EClnStackModified Thread"), PanicStackModifiedFn, KDefaultStackSize, KHeapSize, KHeapSize, NULL);
+
+	test_KErrNone(r);
+
+	TRequestStatus panicThreadStatus;
+	panicThread.Logon(panicThreadStatus);
+
+	//don't want just in time debugging as we trap panics
+	TBool justInTime=User::JustInTime(); 
+	User::SetJustInTime(EFalse); 
+
+	panicThread.Resume();
+
+	User::WaitForRequest(panicThreadStatus);
+
+	test_Equal(EExitPanic, panicThread.ExitType());
+	test_Equal(EClnStackModified, panicThread.ExitReason());
+
+	User::SetJustInTime(justInTime);
+
+	CLOSE_AND_WAIT(panicThread);
+	}
+#endif
+
+LOCAL_C void createMultiL()
+//
+// Create an object on the cleanup list and leave
+//
+	{
+
+	CBufFlat* pT=CBufFlat::NewL(8);
+	User::LeaveIfNull(pT);
+	CleanupStack::PushL(pT);
+	__UHEAP_CHECK(3);
+	User::Leave(KLeaveValue+1);
+	}
+
+LOCAL_C void createL(TWhat aWhat,TBool aLeave)
+//
+// Create objects and then either leave or return.
+// Optionally pop them again.
+//
+	{
+
+	gP1=User::AllocL(0x10);
+    test.Printf(_L("createL 1"));
+	CleanupStack::PushL(gP1);
+    test.Printf(_L("createL 2"));
+	__UHEAP_CHECK(1);
+    test.Printf(_L("createL 3"));
+	gP2=CBufFlat::NewL(8);
+    test.Printf(_L("createL 4"));
+	User::LeaveIfNull(gP2);
+    test.Printf(_L("createL 5"));
+	CleanupStack::PushL(gP2);
+    test.Printf(_L("createL 6"));
+	__UHEAP_CHECK(2);
+    test.Printf(_L("createL 7"));
+	if (aWhat==EPop)
+		{
+		test.Printf(_L("createL 8"));
+		CleanupStack::Pop();
+		test.Printf(_L("createL 9"));
+		CleanupStack::Pop(1);
+		test.Printf(_L("createL 10"));
+		}
+	if (aWhat==EPopAndDestroy)
+		{
+		test.Printf(_L("createL 11"));
+		CleanupStack::PopAndDestroy();
+		test.Printf(_L("createL 12"));
+		CleanupStack::PopAndDestroy(1);
+		test.Printf(_L("createL 13"));
+		}
+	if (aWhat==EMulti)
+		{
+		test.Printf(_L("createL 14"));
+		TRAPD(r,createMultiL())
+		test.Printf(_L("createL 15"));
+		test(r==(KLeaveValue+1));
+		test.Printf(_L("createL 16"));
+		__UHEAP_CHECK(2);
+		test.Printf(_L("createL 17"));
+		}
+	if (aLeave)
+		{
+		test.Printf(_L("createL 18"));
+		User::Leave(KLeaveValue);
+		}
+    test.Printf(_L("createL 19"));
+	}
+
+LOCAL_C void createAllL(TBool aLeave)
+//
+// Call all functions which autmatically put objects on the cleanup list.
+//
+	{
+
+	__UHEAP_CHECK(KInitialCountAll);
+	TLex* pL=new(ELeave) TLex; // ::new, 1 cell
+	CleanupStack::PushL(pL);								// Push
+	__UHEAP_CHECK(KInitialCountAll+1);
+	CTest* pT=new(ELeave) CTest; // CBase::new, 1 cell
+	CleanupStack::PushL(pT);								// Push
+	__UHEAP_CHECK(KInitialCountAll+2);
+	pT->ConstructL(); // 1 more cell						// Push
+	__UHEAP_CHECK(KInitialCountAll+3);
+	User::AllocLC(0x10); // Test RHeap::AllocLC as well		// Push
+	__UHEAP_CHECK(KInitialCountAll+4);
+	_L("Hello").AllocLC(); // Test HBufC::NewLC() as well	// Push
+	__UHEAP_CHECK(KInitialCountAll+5);
+	HBufC* pH=HBufC::NewMaxLC(8);							// Push
+	test(pH->Length()==8);
+	__UHEAP_CHECK(KInitialCountAll+6);
+	if (aLeave)
+		User::Leave(KLeaveValue);
+	// new behavior for TCleanupTrapHander requires Pushes to the
+	// cleanup stack to be balanced by Pops
+	CleanupStack::PopAndDestroy(6);
+	}
+
+LOCAL_C void testSingleLevelCellsCleanup()
+//
+// Test single level cells cleanup
+//
+	{
+
+	test.Start(_L("Creating"));
+//
+	__UHEAP_MARK;
+	CCleanup* pC=CCleanup::New();
+	test(pC!=NULL);
+//
+	__UHEAP_MARK;
+//
+	test.Next(_L("PopAll when empty"));
+	pC->NextLevel();
+	pC->PopAll();
+	pC->NextLevel();
+	pC->PopAndDestroyAll();
+	__UHEAP_CHECK(0);
+//
+	test.Next(_L("Push and pop"));
+	TAny* p=User::Alloc(0x10);
+	test(p!=NULL);
+	__UHEAP_CHECK(1);
+	pC->NextLevel();
+	pC->PushL(p);
+	pC->Pop();
+	__UHEAP_CHECK(1);
+	User::Free(p);
+	__UHEAP_CHECK(0);
+	pC->PopAll();
+	__UHEAP_CHECK(0);
+//
+	test.Next(_L("Push and pop N"));
+	TAny* p1=User::Alloc(0x10);
+	test(p1!=NULL);
+	__UHEAP_CHECK(1);
+	TAny* p2=User::Alloc(0x10);
+	test(p2!=NULL);
+	__UHEAP_CHECK(2);
+	pC->NextLevel();
+	pC->PushL(p1);
+	pC->PushL(p2);
+	pC->Pop(2);
+	__UHEAP_CHECK(2);
+	User::Free(p1);
+	User::Free(p2);
+	__UHEAP_CHECK(0);
+	pC->PopAll();
+	__UHEAP_CHECK(0);
+//
+	test.Next(_L("Push and pop all"));
+	p1=User::Alloc(0x10);
+	test(p1!=NULL);
+	__UHEAP_CHECK(1);
+	p2=User::Alloc(0x10);
+	test(p2!=NULL);
+	__UHEAP_CHECK(2);
+	TAny* p3=User::Alloc(0x10);
+	test(p3!=NULL);
+	__UHEAP_CHECK(3);
+	pC->NextLevel();
+	pC->PushL(p1);
+	pC->PushL(p2);
+	pC->PushL(p3);
+	pC->PopAll();
+	__UHEAP_CHECK(3);
+	User::Free(p1);
+	User::Free(p2);
+	User::Free(p3);
+	__UHEAP_CHECK(0);
+//
+	test.Next(_L("Push and pop and destroy"));
+	p=User::Alloc(0x10);
+	test(p!=NULL);
+	__UHEAP_CHECK(1);
+	pC->NextLevel();
+	pC->PushL(p);
+	pC->PopAndDestroy();
+	__UHEAP_CHECK(0);
+	pC->PopAll();
+//
+	test.Next(_L("Push and pop and destroy N"));
+	p1=User::Alloc(0x10);
+	test(p1!=NULL);
+	__UHEAP_CHECK(1);
+	p2=User::Alloc(0x10);
+	test(p2!=NULL);
+	__UHEAP_CHECK(2);
+	pC->NextLevel();
+	pC->PushL(p1);
+	pC->PushL(p2);
+	pC->PopAndDestroy(2);
+	__UHEAP_CHECK(0);
+	pC->PopAll();
+	__UHEAP_CHECK(0);
+//
+	test.Next(_L("Push and pop and destroy all"));
+	p1=User::Alloc(0x10);
+	test(p1!=NULL);
+	__UHEAP_CHECK(1);
+	p2=User::Alloc(0x10);
+	test(p2!=NULL);
+	__UHEAP_CHECK(2);
+	p3=User::Alloc(0x10);
+	test(p3!=NULL);
+	__UHEAP_CHECK(3);
+	pC->NextLevel();
+	pC->PushL(p1);
+	pC->PushL(p2);
+	pC->PushL(p3);
+	pC->PopAndDestroyAll();
+	__UHEAP_CHECK(0);
+//
+	__UHEAP_MARKEND;
+//
+	delete pC;
+	__UHEAP_MARKEND;
+//
+	test.End();
+	}
+
+LOCAL_C void testSingleLevelObjCleanup()
+//
+// Test single level object cleanup
+//
+	{
+
+	test.Start(_L("Creating"));
+//
+	__UHEAP_MARK;
+	CCleanup* pC=CCleanup::New();
+	test(pC!=NULL);
+//
+	__UHEAP_MARK;
+//
+	test.Next(_L("Push and pop"));
+	CBufFlat* p=CBufFlat::NewL(8);
+	test(p!=NULL);
+	__UHEAP_CHECK(1);
+	pC->NextLevel();
+	pC->PushL(p);
+	pC->Pop();
+	__UHEAP_CHECK(1);
+	User::Free(p);
+	__UHEAP_CHECK(0);
+	pC->PopAll();
+	__UHEAP_CHECK(0);
+//
+	test.Next(_L("Push and pop N"));
+	CBufFlat* p1=CBufFlat::NewL(8);
+	test(p1!=NULL);
+	__UHEAP_CHECK(1);
+	CBufFlat* p2=CBufFlat::NewL(8);
+	test(p2!=NULL);
+	__UHEAP_CHECK(2);
+	pC->NextLevel();
+	pC->PushL(p1);
+	pC->PushL(p2);
+	pC->Pop(2);
+	__UHEAP_CHECK(2);
+	User::Free(p1);
+	User::Free(p2);
+	__UHEAP_CHECK(0);
+	pC->PopAll();
+	__UHEAP_CHECK(0);
+//
+	test.Next(_L("Push and pop all"));
+	p1=CBufFlat::NewL(8);
+	test(p1!=NULL);
+	__UHEAP_CHECK(1);
+	p2=CBufFlat::NewL(8);
+	test(p2!=NULL);
+	__UHEAP_CHECK(2);
+	CBufFlat* p3=CBufFlat::NewL(8);
+	test(p3!=NULL);
+	__UHEAP_CHECK(3);
+	pC->NextLevel();
+	pC->PushL(p1);
+	pC->PushL(p2);
+	pC->PushL(p3);
+	pC->PopAll();
+	__UHEAP_CHECK(3);
+	User::Free(p1);
+	User::Free(p2);
+	User::Free(p3);
+	__UHEAP_CHECK(0);
+//
+	test.Next(_L("Push and pop and destroy"));
+	p=CBufFlat::NewL(8);
+	test(p!=NULL);
+	__UHEAP_CHECK(1);
+	pC->NextLevel();
+	pC->PushL(p);
+	pC->PopAndDestroy();
+	__UHEAP_CHECK(0);
+	pC->PopAll();
+//
+	test.Next(_L("Push and pop and destroy N"));
+	p1=CBufFlat::NewL(8);
+	test(p1!=NULL);
+	__UHEAP_CHECK(1);
+	p2=CBufFlat::NewL(8);
+	test(p2!=NULL);
+	__UHEAP_CHECK(2);
+	pC->NextLevel();
+	pC->PushL(p1);
+	pC->PushL(p2);
+	pC->PopAndDestroy(2);
+	__UHEAP_CHECK(0);
+	pC->PopAll();
+	__UHEAP_CHECK(0);
+//
+	test.Next(_L("Push and pop and destroy all"));
+	p1=CBufFlat::NewL(8);
+	test(p1!=NULL);
+	__UHEAP_CHECK(1);
+	p2=CBufFlat::NewL(8);
+	test(p2!=NULL);
+	__UHEAP_CHECK(2);
+	p3=CBufFlat::NewL(8);
+	test(p3!=NULL);
+	__UHEAP_CHECK(3);
+	pC->NextLevel();
+	pC->PushL(p1);
+	pC->PushL(p2);
+	pC->PushL(p3);
+	pC->PopAndDestroyAll();
+	__UHEAP_CHECK(0);
+//
+	__UHEAP_MARKEND;
+//
+	delete pC;
+	__UHEAP_MARKEND;
+//
+	test.End();
+	}
+
+LOCAL_C void testSingleLevelItemCleanup()
+//
+// Test single level object cleanup
+//
+	{
+
+	test.Start(_L("Creating"));
+//
+	__UHEAP_MARK;
+	CCleanup* pC=CCleanup::New();
+	test(pC!=NULL);
+//
+	__UHEAP_MARK;
+//
+	test.Next(_L("Push and pop"));
+	RItem r;
+	r.Open();
+	test(r.IsOpen());
+	pC->NextLevel();
+	pC->PushL(r);
+	pC->Pop();
+	test(r.IsOpen());
+	r.Close();
+	test(!r.IsOpen());
+	pC->PopAll();
+//
+	test.Next(_L("Push and pop N"));
+	RItem r1;
+	r1.Open();
+	RItem r2;
+	r2.Open();
+	pC->NextLevel();
+	pC->PushL(r1);
+	pC->PushL(r2);
+	pC->Pop(2);
+	test(r1.IsOpen());
+	test(r2.IsOpen());
+	r1.Close();
+	r2.Close();
+	pC->PopAll();
+//
+	test.Next(_L("Push and pop all"));
+	r1.Open();
+	r2.Open();
+	RItem r3;
+	r3.Open();
+	pC->NextLevel();
+	pC->PushL(r1);
+	pC->PushL(r2);
+	pC->PushL(r3);
+	pC->PopAll();
+	test(r1.IsOpen());
+	test(r2.IsOpen());
+	test(r3.IsOpen());
+	r1.Close();
+	r2.Close();
+	r3.Close();
+//
+	test.Next(_L("Push and pop and destroy"));
+	r.Open();
+	pC->NextLevel();
+	pC->PushL(r);
+	pC->PopAndDestroy();
+	test(!r.IsOpen());
+	pC->PopAll();
+//
+	test.Next(_L("Push and pop and destroy N"));
+	r1.Open();
+	r2.Open();
+	pC->NextLevel();
+	pC->PushL(r1);
+	pC->PushL(r2);
+	pC->PopAndDestroy(2);
+	test(!r1.IsOpen());
+	test(!r2.IsOpen());
+	pC->PopAll();
+//
+	test.Next(_L("Push and pop and destroy all"));
+	r1.Open();
+	r2.Open();
+	r3.Open();
+	pC->NextLevel();
+	pC->PushL(r1);
+	pC->PushL(r2);
+	pC->PushL(r3);
+	pC->PopAndDestroyAll();
+	test(!r1.IsOpen());
+	test(!r2.IsOpen());
+	test(!r3.IsOpen());
+//
+	__UHEAP_MARKEND;
+//
+	delete pC;
+	__UHEAP_MARKEND;
+//
+	test.End();
+	}
+
+LOCAL_C void testSingleLevelMixCleanup()
+//
+// Test single level mixed cleanup
+//
+	{
+
+	test.Start(_L("Creating"));
+//
+	__UHEAP_MARK;
+	CCleanup* pC=CCleanup::New();
+	test(pC!=NULL);
+//
+	__UHEAP_MARK;
+//
+	test.Next(_L("PushO PushC PushI and pop N"));
+	CBufFlat* p1=CBufFlat::NewL(8);
+	test(p1!=NULL);
+	__UHEAP_CHECK(1);
+	TAny* p2=User::Alloc(0x10);
+	test(p2!=NULL);
+	__UHEAP_CHECK(2);
+	RItem r;
+	r.Open();
+	pC->NextLevel();
+	pC->PushL(p1);
+	pC->PushL(p2);
+	pC->PushL(r);
+	pC->Pop(3);
+	__UHEAP_CHECK(2);
+	test(r.IsOpen());
+	User::Free(p1);
+	User::Free(p2);
+	r.Close();
+	__UHEAP_CHECK(0);
+	pC->PopAll();
+	__UHEAP_CHECK(0);
+//
+	test.Next(_L("PushO PushI PushC PushO and pop all"));
+	p1=CBufFlat::NewL(8);
+	test(p1!=NULL);
+	__UHEAP_CHECK(1);
+	r.Open();
+	p2=User::Alloc(0x10);
+	test(p2!=NULL);
+	__UHEAP_CHECK(2);
+	CBufFlat* p3=CBufFlat::NewL(8);
+	test(p3!=NULL);
+	__UHEAP_CHECK(3);
+	pC->NextLevel();
+	pC->PushL(p1);
+	pC->PushL(r);
+	pC->PushL(p2);
+	pC->PushL(p3);
+	pC->PopAll();
+	__UHEAP_CHECK(3);
+	test(r.IsOpen());
+	User::Free(p1);
+	User::Free(p2);
+	User::Free(p3);
+	r.Close();
+	__UHEAP_CHECK(0);
+//
+	test.Next(_L("PushO PushC PushI and pop and destroy N"));
+	p1=CBufFlat::NewL(8);
+	test(p1!=NULL);
+	__UHEAP_CHECK(1);
+	p2=User::Alloc(0x10);
+	test(p2!=NULL);
+	__UHEAP_CHECK(2);
+	r.Open();
+	pC->NextLevel();
+	pC->PushL(p1);
+	pC->PushL(p2);
+	pC->PushL(r);
+	pC->PopAndDestroy(3);
+	test(!r.IsOpen());
+	__UHEAP_CHECK(0);
+	pC->PopAll();
+	__UHEAP_CHECK(0);
+//
+	test.Next(_L("PushO PushI PushC PushO and pop and destroy all"));
+	p1=CBufFlat::NewL(8);
+	test(p1!=NULL);
+	__UHEAP_CHECK(1);
+	r.Open();
+	p2=User::Alloc(0x10);
+	test(p2!=NULL);
+	__UHEAP_CHECK(2);
+	p3=CBufFlat::NewL(8);
+	test(p3!=NULL);
+	__UHEAP_CHECK(3);
+	pC->NextLevel();
+	pC->PushL(p1);
+	pC->PushL(r);
+	pC->PushL(p2);
+	pC->PushL(p3);
+	pC->PopAndDestroyAll();
+	test(!r.IsOpen());
+	__UHEAP_CHECK(0);
+//
+	__UHEAP_MARKEND;
+//
+	delete pC;
+	__UHEAP_MARKEND;
+//
+	test.End();
+	}
+
+LOCAL_C void testMultiLevelCellsCleanup()
+//
+// Test multi level cells cleanup
+//
+	{
+
+	test.Start(_L("Creating"));
+//
+	__UHEAP_MARK;
+	CCleanup* pC=CCleanup::New();
+	test(pC!=NULL);
+//
+	__UHEAP_MARK;
+//
+	test.Next(_L("Nest push push nest push popall popall"));
+	TAny* p1=User::Alloc(0x10);
+	test(p1!=NULL);
+	__UHEAP_CHECK(1);
+	TAny* p2=User::Alloc(0x10);
+	test(p2!=NULL);
+	__UHEAP_CHECK(2);
+	TAny* p3=User::Alloc(0x10);
+	test(p3!=NULL);
+	__UHEAP_CHECK(3);
+	pC->NextLevel();
+	pC->PushL(p1);
+	pC->PushL(p2);
+	pC->NextLevel();
+	pC->PushL(p3);
+	pC->PopAll();
+	__UHEAP_CHECK(3);
+	pC->PopAll();
+	__UHEAP_CHECK(3);
+	User::Free(p1);
+	User::Free(p2);
+	User::Free(p3);
+	__UHEAP_CHECK(0);
+//
+	test.Next(_L("Nest push push nest push popallD popallD"));
+	p1=User::Alloc(0x10);
+	test(p1!=NULL);
+	__UHEAP_CHECK(1);
+	p2=User::Alloc(0x10);
+	test(p2!=NULL);
+	__UHEAP_CHECK(2);
+	p3=User::Alloc(0x10);
+	test(p3!=NULL);
+	__UHEAP_CHECK(3);
+	pC->NextLevel();
+	pC->PushL(p1);
+	pC->PushL(p2);
+	pC->NextLevel();
+	pC->PushL(p3);
+	pC->PopAndDestroyAll();
+	__UHEAP_CHECK(2);
+	pC->PopAndDestroyAll();
+	__UHEAP_CHECK(0);
+//
+	__UHEAP_MARKEND;
+//
+	delete pC;
+	__UHEAP_MARKEND;
+//
+	test.End();
+	}
+
+LOCAL_C void testMultiLevelObjCleanup()
+//
+// Test multi level object cleanup
+//
+	{
+
+	test.Start(_L("Creating"));
+//
+	__UHEAP_MARK;
+	CCleanup* pC=CCleanup::New();
+	test(pC!=NULL);
+//
+	__UHEAP_MARK;
+//
+	test.Next(_L("Nest push push nest push popall popall"));
+	CBufFlat* p1=CBufFlat::NewL(8);
+	test(p1!=NULL);
+	__UHEAP_CHECK(1);
+	CBufFlat* p2=CBufFlat::NewL(8);
+	test(p2!=NULL);
+	__UHEAP_CHECK(2);
+	CBufFlat* p3=CBufFlat::NewL(8);
+	test(p3!=NULL);
+	__UHEAP_CHECK(3);
+	pC->NextLevel();
+	pC->PushL(p1);
+	pC->PushL(p2);
+	pC->NextLevel();
+	pC->PushL(p3);
+	pC->PopAll();
+	__UHEAP_CHECK(3);
+	pC->PopAll();
+	__UHEAP_CHECK(3);
+	User::Free(p1);
+	User::Free(p2);
+	User::Free(p3);
+	__UHEAP_CHECK(0);
+//
+	test.Next(_L("Nest push push nest push popallD popallD"));
+	p1=CBufFlat::NewL(8);
+	test(p1!=NULL);
+	__UHEAP_CHECK(1);
+	p2=CBufFlat::NewL(8);
+	test(p2!=NULL);
+	__UHEAP_CHECK(2);
+	p3=CBufFlat::NewL(8);
+	test(p3!=NULL);
+	__UHEAP_CHECK(3);
+	pC->NextLevel();
+	pC->PushL(p1);
+	pC->PushL(p2);
+	pC->NextLevel();
+	pC->PushL(p3);
+	pC->PopAndDestroyAll();
+	__UHEAP_CHECK(2);
+	pC->PopAndDestroyAll();
+	__UHEAP_CHECK(0);
+//
+	__UHEAP_MARKEND;
+//
+	delete pC;
+	__UHEAP_MARKEND;
+//
+	test.End();
+	}
+
+LOCAL_C void testMultiLevelItemCleanup()
+//
+// Test multi level item cleanup
+//
+	{
+
+	test.Start(_L("Creating"));
+//
+	__UHEAP_MARK;
+	CCleanup* pC=CCleanup::New();
+	test(pC!=NULL);
+//
+	__UHEAP_MARK;
+//
+	test.Next(_L("Nest push push nest push popall popall"));
+	RItem r1;
+	r1.Open();
+	RItem r2;
+	r2.Open();
+	RItem r3;
+	r3.Open();
+	pC->NextLevel();
+	pC->PushL(r1);
+	pC->PushL(r2);
+	pC->NextLevel();
+	pC->PushL(r3);
+	pC->PopAll();
+	test(r1.IsOpen());
+	test(r2.IsOpen());
+	test(r3.IsOpen());
+	pC->PopAll();
+	test(r1.IsOpen());
+	test(r2.IsOpen());
+	test(r3.IsOpen());
+	r1.Close();
+	r2.Close();
+	r3.Close();
+//
+	test.Next(_L("Nest push push nest push popallD popallD"));
+	r1.Open();
+	r2.Open();
+	r3.Open();
+	pC->NextLevel();
+	pC->PushL(r1);
+	pC->PushL(r2);
+	pC->NextLevel();
+	pC->PushL(r3);
+	pC->PopAndDestroyAll();
+	test(r1.IsOpen());
+	test(r2.IsOpen());
+	test(!r3.IsOpen());
+	pC->PopAndDestroyAll();
+	test(!r1.IsOpen());
+	test(!r2.IsOpen());
+	test(!r3.IsOpen());
+//
+	__UHEAP_MARKEND;
+//
+	delete pC;
+	__UHEAP_MARKEND;
+//
+	test.End();
+	}
+
+LOCAL_C void testMultiLevelMixCleanup()
+//
+// Test multi level mixed cleanup
+//
+	{
+
+	test.Start(_L("Creating"));
+//
+	__UHEAP_MARK;
+	CCleanup* pC=CCleanup::New();
+	test(pC!=NULL);
+//
+	__UHEAP_MARK;
+//
+	test.Next(_L("Nest pushO pushC nest pushI popall popall"));
+	CBufFlat* p1=CBufFlat::NewL(8);
+	test(p1!=NULL);
+	__UHEAP_CHECK(1);
+	TAny* p2=User::Alloc(0x10);
+	test(p2!=NULL);
+	__UHEAP_CHECK(2);
+	RItem r3;
+	r3.Open();
+	pC->NextLevel();
+	pC->PushL(p1);
+	pC->PushL(p2);
+	pC->NextLevel();
+	pC->PushL(r3);
+	pC->PopAll();
+	__UHEAP_CHECK(2);
+	test(r3.IsOpen());
+	pC->PopAll();
+	__UHEAP_CHECK(2);
+	test(r3.IsOpen());
+	User::Free(p1);
+	User::Free(p2);
+	r3.Close();
+	__UHEAP_CHECK(0);
+//
+	test.Next(_L("Nest pushO pushC nest pushI popallD popallD"));
+	p1=CBufFlat::NewL(8);
+	test(p1!=NULL);
+	__UHEAP_CHECK(1);
+	p2=User::Alloc(0x10);
+	test(p2!=NULL);
+	__UHEAP_CHECK(2);
+	r3.Open();
+	pC->NextLevel();
+	pC->PushL(p1);
+	pC->PushL(p2);
+	pC->NextLevel();
+	pC->PushL(r3);
+	pC->PopAndDestroyAll();
+	__UHEAP_CHECK(2);
+	test(!r3.IsOpen());
+	pC->PopAndDestroyAll();
+	test(!r3.IsOpen());
+	__UHEAP_CHECK(0);
+//
+	__UHEAP_MARKEND;
+//
+	delete pC;
+	__UHEAP_MARKEND;
+//
+	test.End();
+	}
+
+LOCAL_C void testSpecialCaseCleanup()
+//
+// Test special case cleanup
+//
+	{
+
+	test.Start(_L("Creating"));
+//
+	__UHEAP_MARK;
+	CCleanup* pC=CCleanup::New();
+	test(pC!=NULL);
+	__UHEAP_CHECK(KInitialCount);
+//
+	test.Next(_L("Nest push push push fail"));
+	CBufFlat* p1=CBufFlat::NewL(8);
+	test(p1!=NULL);
+	__UHEAP_CHECK(KInitialCount+1);
+	CBufFlat* p2=CBufFlat::NewL(8);
+	test(p2!=NULL);
+	__UHEAP_CHECK(KInitialCount+2);
+	CBufFlat* p3=CBufFlat::NewL(8);
+	test(p3!=NULL);
+	__UHEAP_CHECK(KInitialCount+3);
+	CBufFlat* p4=CBufFlat::NewL(8);
+	test(p4!=NULL);
+	__UHEAP_CHECK(KInitialCount+4);
+	CBufFlat* p5=CBufFlat::NewL(8);
+	test(p5!=NULL);
+	__UHEAP_CHECK(KInitialCount+5);
+	CBufFlat* p6=CBufFlat::NewL(8);
+	test(p6!=NULL);
+	__UHEAP_CHECK(KInitialCount+6);
+	pC->NextLevel();
+	pC->PushL(p1);
+	pC->PushL(p2);
+	pC->PushL(p3);
+	pC->PushL(p4);
+	pC->PushL(p5);
+//
+// The granularity is 4 so this should try and grow the array
+// since room is always made for a free slot. We set the allocator
+// to fail so that we can test that the free slot is re-established
+// when we do the cleanup. This test only works in debug mode.
+//
+	__UHEAP_FAILNEXT(1);
+	TRAPD(r,pC->PushL(p6));
+#if defined(_DEBUG)
+	test(r==KErrNoMemory);
+#endif
+	__UHEAP_CHECK(KInitialCount+6);
+	pC->PopAndDestroyAll();
+	__UHEAP_CHECK(KInitialCount);
+//
+	test.Next(_L("Nest push push push push popallD"));
+	p1=CBufFlat::NewL(8);
+	test(p1!=NULL);
+	__UHEAP_CHECK(KInitialCount+1);
+	p2=CBufFlat::NewL(8);
+	test(p2!=NULL);
+	__UHEAP_CHECK(KInitialCount+2);
+	p3=CBufFlat::NewL(8);
+	test(p3!=NULL);
+	__UHEAP_CHECK(KInitialCount+3);
+	p4=CBufFlat::NewL(8);
+	test(p4!=NULL);
+	__UHEAP_CHECK(KInitialCount+4);
+	pC->NextLevel();
+	pC->PushL(p1);
+	pC->NextLevel();
+	pC->PushL(p2);
+	pC->PushL(p3);
+	pC->PushL(p4);
+	pC->PopAndDestroyAll();
+	__UHEAP_CHECK(KInitialCount+1);
+	pC->PopAndDestroyAll();
+	__UHEAP_CHECK(KInitialCount);
+//
+	test.Next(_L("Destroy cleanup object"));
+//
+	p1=CBufFlat::NewL(8);
+	test(p1!=NULL);
+	__UHEAP_CHECK(KInitialCount+1);
+	p2=CBufFlat::NewL(8);
+	test(p2!=NULL);
+	__UHEAP_CHECK(KInitialCount+2);
+	p3=CBufFlat::NewL(8);
+	test(p3!=NULL);
+	__UHEAP_CHECK(KInitialCount+3);
+	p4=CBufFlat::NewL(8);
+	test(p4!=NULL);
+	__UHEAP_CHECK(KInitialCount+4);
+	pC->NextLevel();
+	pC->PushL(p1);
+	pC->NextLevel();
+	pC->PushL(p2);
+	pC->PushL(p3);
+	pC->PushL(p4);
+	delete pC;
+	__UHEAP_CHECK(0);
+//
+	__UHEAP_MARKEND;
+//
+	test.End();
+	}
+
+LOCAL_C void testUnTrap()
+//
+// Test cleanup with normal exits
+//
+	{
+
+	test.Start(_L("Creating"));
+//
+	__UHEAP_MARK;
+	CTrapCleanup* pT=CTrapCleanup::New();
+	test(pT!=NULL);
+	__UHEAP_CHECK(KInitialCountAll);
+//
+	__UHEAP_MARK;
+//
+	test.Next(_L("PushC PushO EPop cleanup empty"));
+	TRAPD(r,createL(EPop,EFalse))
+	test.Next(_L("PushC PushO EPop cleanup empty 1"));
+	test(r==KErrNone);
+	test.Next(_L("PushC PushO EPop cleanup empty 2"));
+	__UHEAP_CHECK(2);
+	test.Next(_L("PushC PushO EPop cleanup empty 3"));
+	User::Free(gP1);
+	test.Next(_L("PushC PushO EPop cleanup empty 4"));
+	delete gP2;
+	test.Next(_L("PushC PushO EPop cleanup empty 5"));
+	__UHEAP_CHECK(0);
+//
+	test.Next(_L("PushC PushO EPopAndDestroy cleanup empty"));
+	TRAP(r,createL(EPopAndDestroy,EFalse))
+	test(r==KErrNone);
+	__UHEAP_CHECK(0);
+//
+/*
+// Change of behavior for TCleanupTrapHandler means that the current
+// cleanup stack must be empty when UnTrap is called. IE. calls to
+// Push should be balanced with a Pop within the same function.
+	test.Next(_L("PushC PushO ENull cleanup 2 objects"));
+	TRAP(r,createL(ENull,EFalse))
+	test(r==KErrNone);
+	__UHEAP_CHECK(0);
+*/
+	__UHEAP_MARKEND;
+//
+	test.Next(_L("Test all LC functions"));
+	TRAP(r,createAllL(EFalse))
+	test(r==KErrNone);
+	__UHEAP_CHECK(KInitialCountAll);
+//
+	delete pT;
+	__UHEAP_MARKEND;
+//
+	test.End();
+	}
+
+LOCAL_C void testLeave()
+//
+// Test cleanup with leave exits
+//
+	{
+
+	test.Start(_L("Creating"));
+//
+	__UHEAP_MARK;
+	CTrapCleanup* pT=CTrapCleanup::New();
+	test(pT!=NULL);
+	__UHEAP_CHECK(KInitialCountAll);
+//
+	__UHEAP_MARK;
+//
+	test.Next(_L("PushC PushO EPop cleanup empty and leave"));
+	TRAPD(r,createL(EPop,ETrue))
+	test(r==KLeaveValue);
+	__UHEAP_CHECK(2);
+	User::Free(gP1);
+	delete gP2;
+	__UHEAP_CHECK(0);
+//
+	test.Next(_L("PushC PushO EPopAndDestroy cleanup empty and leave"));
+	TRAP(r,createL(EPopAndDestroy,ETrue))
+	test(r==KLeaveValue);
+	__UHEAP_CHECK(0);
+//
+	test.Next(_L("PushC PushO ENull cleanup 2 objects and leave"));
+	TRAP(r,createL(ENull,ETrue))
+	test(r==KLeaveValue);
+	__UHEAP_CHECK(0);
+	__UHEAP_MARKEND;
+//
+	test.Next(_L("Test all LC functions and leave"));
+	TRAP(r,createAllL(ETrue))
+	test(r==KLeaveValue);
+	__UHEAP_CHECK(KInitialCountAll);
+//
+	delete pT;
+	__UHEAP_MARKEND;
+//
+	test.End();
+	}
+
+LOCAL_C void testMultiLeave()
+//
+// Test cleanup with multiple leave exits
+//
+	{
+
+	test.Start(_L("Creating"));
+//
+	__UHEAP_MARK;
+	CTrapCleanup* pT=CTrapCleanup::New();
+	test(pT!=NULL);
+//
+	__UHEAP_MARK;
+//
+	test.Next(_L("PushC PushO nest PushO cleanup leave leave"));
+	TRAPD(r,createL(EMulti,ETrue))
+	test(r==KLeaveValue);
+	__UHEAP_CHECK(0);
+	__UHEAP_MARKEND;
+//
+	delete pT;
+	__UHEAP_MARKEND;
+//
+	test.End();
+	}
+
+LOCAL_C void addNullItemL()
+	{
+	CleanupStack::PushL((TAny*)0);
+	}
+
+LOCAL_C void addCellL()
+	{
+	User::AllocLC(4);
+	}
+
+LOCAL_C void useCleanupStackL()
+	{
+	addNullItemL();
+	addCellL();
+	CleanupStack::PopAndDestroy();
+	CleanupStack::Pop();
+	}
+
+LOCAL_C void reentrantCleanup(TAny*)
+//
+// A cleanup operation which uses a trap harness and the cleanup stack
+//
+	{
+	TRAPD(ignore,useCleanupStackL())
+	}
+
+LOCAL_C void addReentrantItemL()
+	{
+	CleanupStack::PushL(TCleanupItem(reentrantCleanup));
+	}
+
+LOCAL_C void addItemsL(TInt aCount)
+//
+// add number of reentrant items to make stack fail
+//
+	{
+	while (--aCount>=0)
+		addReentrantItemL();
+#if !defined(_DEBUG)
+	User::Leave(KErrNoMemory);	// heap failure not available
+#endif
+	}
+
+const TInt KInitialStackSize=8;	// from UC_CLN.CPP
+const TInt KGrowItems=KInitialStackSize-3;
+
+LOCAL_C void testReentrancyL()
+//
+// Test the Cleanup stack can go re-entrant
+//
+	{
+
+	test.Next(_L("PopAndDestroy()"));
+	__UHEAP_MARK;
+	addNullItemL();
+	addCellL();
+	addReentrantItemL();
+	CleanupStack::PopAndDestroy(2);
+	CleanupStack::Pop();
+	__UHEAP_MARKEND;
+//
+	test.Next(_L("cleanup after a leave"));
+	addNullItemL();
+	TRAPD(r,addReentrantItemL();User::Leave(KLeaveValue);)
+	test(r==KLeaveValue);
+	CleanupStack::Pop();
+//
+	test.Next(_L("cleanup after stack failure"));
+	// Ensuring stack reallocate fails by placing following cell
+	TInt* forceAlloc=(TInt*)User::AllocL(4);
+	for (TInt i=0;i<KGrowItems;++i)
+		addNullItemL();
+	__UHEAP_SETFAIL(RHeap::EDeterministic,1);	// fail everything 
+	TRAP(r,addItemsL(1);)	// will leave as stack full and cannot grow
+	test(r==KErrNoMemory);
+	__UHEAP_RESET;
+	CleanupStack::Pop(KGrowItems);
+//
+	test.Next(_L("multiple re-entrancy & stack failure"));
+	__UHEAP_SETFAIL(RHeap::EDeterministic,1);	// fail everything
+	TRAP(r,addItemsL(KGrowItems+1););
+	test(r==KErrNoMemory);
+	__UHEAP_RESET;
+	User::Free(forceAlloc);
+	}
+
+LOCAL_C void testReentrancy()
+//
+// Test the Cleanup stack can go re-entrant
+//
+	{
+
+	test.Start(_L("Creating"));
+//
+	__UHEAP_MARK;
+	CTrapCleanup* pT=CTrapCleanup::New();
+	test(pT!=NULL);
+//
+	TRAPD(r,testReentrancyL());
+	test(r==KErrNone);
+//
+	delete pT;
+	__UHEAP_MARKEND;
+//
+	test.End();
+	}
+
+#ifndef __TOOLS2__
+LOCAL_C void testAutoCloseL()
+//
+// A leaving function for testAutoClose()
+//
+	{
+	test.Next(_L("Create a TAutoClose object"));
+	TAutoClose<RTimer> tim;
+	tim.iObj.CreateLocal();
+	test.Next(_L("Push it on the cleanup stack"));
+	tim.PushL();
+	test.Next(_L("Leave before object goes out of scope"));
+	User::Leave(KErrGeneral);
+	tim.Pop();
+	}
+
+LOCAL_C void testAutoClose()
+//
+// Test the TAutoClose class
+//
+	{
+
+	// Kill the granules
+	RTimer s[20];
+	TInt i;
+	for (i=0; i<20; i++)
+		s[i].CreateLocal();
+	for (i=0; i<20; i++)
+		s[i].Close();
+
+	__KHEAP_MARK;
+	test.Start(_L("Make a TAutoClose object"));
+		{
+		TAutoClose<RTimer> tim;
+		tim.iObj.CreateLocal();
+
+		test.Next(_L("Let it fall out of scope"));
+		}
+	test.Next(_L("Check the object has closed"));
+	__KHEAP_CHECK(0);
+
+	TRAPD(r, testAutoCloseL());
+	test.Next(_L("Check object has been closed and cleaned up after leave"));
+	__KHEAP_MARKEND;
+	test.End();
+	}
+#endif // __TOOLS2__
+
+void CTest::ConstructL()
+//
+// Allocate a cell with CBase::new
+//
+	{
+
+	TLex* pL=new(ELeave) TLex;
+	CleanupStack::PushL(pL);
+	}
+
+void RItem::Cleanup(TAny* aPtr)
+//
+// Invoke the Close member on the RItem at aPtr
+//
+	{							
+
+	((RItem*)aPtr)->Close();
+	}
+
+LOCAL_C TInt getStackPointer()
+	{
+	static TUint8 there;
+	TUint8 here;
+	return &here-&there;
+	}
+LOCAL_C void sheLeavesMe(TBool sheLeavesMeNot)
+	{
+	if (!sheLeavesMeNot)
+		User::Leave(KErrBadName);	// Montague
+	}
+
+LOCAL_C void testStackBalance()
+//
+// Ensure that we get the stack properly balanced
+//
+	{
+
+	TInt i;
+	TInt r=KErrNone;
+	test.Start(_L("Stack balance without leaving"));
+	TInt before=getStackPointer();
+	for (i=0; i<20;i++)
+		TRAP(r,sheLeavesMe(ETrue));
+	TInt after=getStackPointer();
+	test(r==KErrNone);
+	test(before==after);
+
+//
+	test.Next(_L("Stack balance after Leave"));
+	before=getStackPointer();
+	for (i=0; i<20;i++)
+		TRAP(r,sheLeavesMe(EFalse));
+	after=getStackPointer();
+	test(r==KErrBadName);
+	test(before==after);
+//
+	test.End();
+	}
+
+void Inc(TAny* aPtr)
+	{
+	++(*(TInt*)aPtr);
+	}
+
+void testTrapIgnore()
+	{
+	test.Start(_L("Create cleanup"));
+	CCleanup* pC=CCleanup::New();
+	test(pC!=NULL);
+	TInt count = 0;
+
+	test.Next(_L("TRAP_IGNORE with no leave"));
+	TRAP_IGNORE(
+		CleanupStack::PushL(TCleanupItem(Inc,&count));
+		CleanupStack::Pop();
+		);
+	test(count==0);
+
+	test.Next(_L("TRAP_IGNORE with leave"));
+	TRAP_IGNORE(
+		CleanupStack::PushL(TCleanupItem(Inc,&count));
+		User::Leave(KErrGeneral);
+		);
+	test(count==1);
+
+	delete pC;
+	test.End();
+	}
+
+GLDEF_C TInt E32Main()
+    {
+	test.Title();
+	
+	test.Start(_L("Test destructor causing stack reallocation"));
+#ifndef __TOOLS2__
+	testDestructorStackReallocation();	
+#endif // __TOOLS2__
+
+	test.Next(_L("CCleanup single level tests just alloc cells"));
+	testSingleLevelCellsCleanup();
+
+	test.Next(_L("CCleanup single level tests just objects"));
+	testSingleLevelObjCleanup();
+
+	test.Next(_L("CCleanup single level tests just items"));
+	testSingleLevelItemCleanup();
+
+	test.Next(_L("CCleanup single level tests mixed"));
+	testSingleLevelMixCleanup();
+
+	test.Next(_L("CCleanup multi level tests just alloc cells"));
+	testMultiLevelCellsCleanup();
+
+	test.Next(_L("CCleanup multi level tests just objects"));
+	testMultiLevelObjCleanup();
+
+	test.Next(_L("CCleanup multi level tests just items"));
+	testMultiLevelItemCleanup();
+
+	test.Next(_L("CCleanup multi level tests mixed"));
+	testMultiLevelMixCleanup();
+
+	test.Next(_L("CCleanup special case test"));
+	testSpecialCaseCleanup();
+
+	test.Next(_L("Install trap handler"));
+	CTrapCleanup* pT=CTrapCleanup::New();
+	test(pT!=NULL);
+
+	test.Next(_L("Untrap handling tests"));
+	testUnTrap();
+
+	test.Next(_L("Leave handling tests"));
+	testLeave();
+
+	test.Next(_L("Multi level leave handling tests"));
+	testMultiLeave();
+
+#ifndef __TOOLS2__
+	test.Next(_L("Test TAutoClose"));
+	testAutoClose();
+#endif // __TOOLS2__
+
+	test.Next(_L("Test Re-entrancy of cleanup stack"));
+	testReentrancy();
+
+	test.Next(_L("Test stack safety of TRAP and Leave"));
+#ifdef _DEBUG
+	testStackBalance();
+#endif
+
+	test.Next(_L("Test TRAP_IGNORE"));
+	testTrapIgnore();
+
+	test.End();
+	return(0);
+    }
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/e32test/system/t_trap.cpp	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,726 @@
+// Copyright (c) 1994-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32test\system\t_trap.cpp
+// Overview:
+// Test TRAP, Leave and Assert
+// API Information:
+// TRAP, User::Leave, __ASSERT_DEBUG_NO_LEAVE, __ASSERT_ALWAYS_NO_LEAVE
+// Details:
+// - Test TRAP macro works as expected.
+// - Test User::Leave works as expected including leave from
+// within nested calls.
+// - Verify that a leave without a TRAP causes the thread to panic.
+// - Create a thread that asserts and verify the exit type and other
+// results are as expected.
+// Platforms/Drives/Compatibility:
+// All.
+// Assumptions/Requirement/Pre-requisites:
+// Failures and causes:
+// Base Port information:
+// 
+//
+
+#include <e32test.h>
+#include <e32panic.h>
+
+const TInt KLeaveVal=1111;
+const TInt KUnLeaveVal=2222;
+const TInt KRecursiveUnLeaveVal=3333;
+const TInt KRecursiveSingleLeaveVal=4444;
+const TInt KMaxDepth=20;
+
+//#define __TEST_BREAKPOINT_IN_TRAP__
+
+LOCAL_D RTest test(_L("T_TRAP"));
+
+
+LOCAL_C TInt UnLeaveFunction(void)
+	{
+
+	return(KUnLeaveVal);
+	}
+
+LOCAL_C TInt LeaveFunction(void)
+	{
+
+	User::Leave(KLeaveVal);
+	return(0);
+	}
+
+LOCAL_C TInt RecursiveUnLeave(TInt level)
+	{
+
+	if (level==0)
+		return(KRecursiveUnLeaveVal);
+	else
+		return(RecursiveUnLeave(--level));
+	}
+
+LOCAL_C TInt RecursiveSingleLeave(TInt level)
+	{
+
+	if (level==0)
+		User::Leave(KRecursiveSingleLeaveVal);
+	else
+		RecursiveSingleLeave(--level);
+	return(0);
+	}
+
+LOCAL_C TInt RecursiveMultiLeave1(TInt level)
+	{
+
+	TInt ret=0;
+	TRAP(ret,{if (level==0)	User::Leave(level);	else ret=RecursiveMultiLeave1(level-1);	test(EFalse);})
+	test(ret==level);
+	User::Leave(level+1);
+	return(0);
+	}
+
+LOCAL_C TInt RecursiveMultiLeave2(TInt level)
+	{
+
+	if (level==0)
+		return(1);
+	TInt ret=0;
+	TRAP(ret,ret=RecursiveMultiLeave2(level-1))
+	test(ret==level);
+	User::Leave(level+1);
+	return(0);
+	}
+	
+LOCAL_C TInt doTrap(TInt aVal)
+//
+// Nest trap function.
+//
+	{
+
+	if (aVal)
+		{
+		TInt j=(-1);
+		TRAP(j,j=doTrap(aVal-1))
+		test(j==aVal);
+		}
+	return(aVal+1);
+	}
+
+#ifdef __TEST_BREAKPOINT_IN_TRAP__
+void bkpt()
+	{
+	__BREAKPOINT();
+	}
+#endif
+
+LOCAL_C void doLeave(TInt aLevel,TInt aVal)
+//
+// Nest trap with leave function.
+//
+	{
+
+	if (aLevel)
+		doLeave(aLevel-1,aVal);
+	else
+		User::Leave(aVal);
+	}
+
+LOCAL_C void testTrap()
+//
+// Test trap functions O.K.
+//
+	{
+
+	test.Start(_L("Trap level 1"));
+//
+	TInt i=2;
+	TRAP(i,i=1);
+	test(i==1);
+#ifdef __TEST_BREAKPOINT_IN_TRAP__
+	TRAP(i,bkpt());
+	TRAP(i,TRAP(i,bkpt()));
+#endif
+//
+	test.Next(_L("Trap level n"));
+	for (i=1;i<KMaxDepth;i++)
+		test(doTrap(i)==(i+1));
+//
+	test.End();
+	}
+
+LOCAL_C void testLeave()
+//
+// Test leave functions O.K.
+//
+	{
+
+	test.Start(_L("Leave level 1"));
+//
+	TInt i=0;
+	TRAP(i,User::Leave(2))
+	test(i==2);
+//
+	test.Next(_L("Leave level 2"));
+	i=0;
+	TRAP(i,TRAP(i,User::Leave(3)))
+	test(i==3);
+//
+#ifdef __TEST_BREAKPOINT_IN_TRAP__
+	TRAP(i,TRAP(i,User::Leave(33)); bkpt())
+	test(i==33);
+#endif
+//
+	test.Next(_L("Leave from nested calls"));
+	for (i=1;i<KMaxDepth;i++)
+		{
+		TInt j=(-1);
+		TRAP(j,doLeave(i,i))
+		test(j==i);
+		}
+//
+	test.End();
+	}
+
+LOCAL_C void testMH(void)
+	{
+
+	TInt ret=0;
+	TRAP(ret,ret=UnLeaveFunction())
+	test(ret==KUnLeaveVal);
+	TRAP(ret,LeaveFunction())
+	test(ret==KLeaveVal);
+	TInt i=0;
+	for(;i<=KMaxDepth;i++)
+		{
+		TRAP(ret,ret=RecursiveUnLeave(i))
+		test(ret==KRecursiveUnLeaveVal);
+		}
+	for(i=0;i<=KMaxDepth;i++)
+		{
+		TRAP(ret,ret=RecursiveSingleLeave(i))
+		test(ret==KRecursiveSingleLeaveVal);
+		}
+	for(i=0;i<=KMaxDepth;i++)
+		{
+		TRAP(ret,ret=RecursiveMultiLeave1(i))
+		test(ret==i+1);
+		}
+	for(i=0;i<=KMaxDepth;i++)
+		{
+		TRAP(ret,ret=RecursiveMultiLeave2(i))
+		test(ret==i+1);
+		}
+	}
+
+TInt LeaveNoTrapThread(TAny*)
+	{
+	User::Leave(KErrGeneral);
+	return KErrNone;
+	}
+
+#ifndef __TOOLS2__
+void TestLeaveNoTrap()
+	{
+	RThread thread;
+	TInt r=thread.Create(_L("Leave without Trap thread"),LeaveNoTrapThread,0x1000,&User::Allocator(),NULL);
+	test(r==KErrNone);
+	TRequestStatus stat;
+	thread.Logon(stat);
+	test(stat==KRequestPending);
+	TBool justInTime=User::JustInTime();
+	User::SetJustInTime(EFalse);
+	thread.Resume();
+	User::WaitForRequest(stat);
+	User::SetJustInTime(justInTime);
+	test(thread.ExitType()==EExitPanic);
+	test(thread.ExitReason()==EUserLeaveWithoutTrap);
+	test(thread.ExitCategory()==_L("USER"));
+	CLOSE_AND_WAIT(thread);
+	}
+
+enum TAssertTest
+	{
+	EAssertTest_Debug = 1,
+	EAssertTest_Leave = 2,
+	EAssertTest_Ret = 4,
+	};
+
+TInt AssertThread(TAny* a)
+	{
+	TInt f = (TInt)a;
+	TInt r = f | EAssertTest_Ret;
+	if (f & EAssertTest_Leave)
+		{
+		if (f & EAssertTest_Debug)
+			{
+			__ASSERT_DEBUG_NO_LEAVE(User::Leave(r));
+			}
+		else
+			{
+			__ASSERT_ALWAYS_NO_LEAVE(User::Leave(r));
+			}
+		}
+	else
+		{
+		if (f & EAssertTest_Debug)
+			{
+			__ASSERT_DEBUG_NO_LEAVE(RThread().Terminate(r));
+			}
+		else
+			{
+			__ASSERT_ALWAYS_NO_LEAVE(RThread().Terminate(r));
+			}
+		}
+	return r;
+	}
+
+TInt _AssertThread(TAny* a)
+	{
+	TInt s=0;
+	TRAP_IGNORE(s=AssertThread(a));
+	return s;
+	}
+
+void TestAssert(TInt aTest)
+	{
+	test.Printf(_L("Assert %d\n"), aTest);
+	RThread t;
+	TInt r = t.Create(_L("assert"), &_AssertThread, 0x1000, NULL, (TAny*)aTest);
+	test(r==KErrNone);
+	TRequestStatus s;
+	t.Logon(s);
+	test(s==KRequestPending);
+	TBool jit = User::JustInTime();
+	User::SetJustInTime(EFalse);
+	t.Resume();
+	User::WaitForRequest(s);
+	User::SetJustInTime(jit);
+	TInt exitType = t.ExitType();
+	TInt exitReason = t.ExitReason();
+	const TDesC& exitCat = t.ExitCategory();
+	CLOSE_AND_WAIT(t);
+	test.Printf(_L("Exit %d,%d,%S\n"), exitType, exitReason, &exitCat);
+	if (aTest & EAssertTest_Leave)
+		{
+		if (aTest & EAssertTest_Debug)
+			{
+#ifdef _DEBUG
+			test(exitType == EExitPanic);
+			test(exitReason == EUnexpectedLeave);
+#else
+			test(exitType == EExitKill);
+			test(exitReason == KErrNone);
+#endif
+			}
+		else
+			{
+			test(exitType == EExitPanic);
+			test(exitReason == EUnexpectedLeave);
+			}
+		}
+	else
+		{
+		test(exitType == EExitTerminate);
+		test(exitReason == (aTest | EAssertTest_Ret));
+		}
+	}
+
+/*============== server for testing exceptions in TRAP implementation ====================*/
+
+#include <e32base.h>
+
+#include "../mmu/mmudetect.h"
+
+const TInt KHeapSize=0x2000;
+
+_LIT(KServerName,"Display");
+
+class CMySession : public CSession2
+	{
+public:
+	CMySession();
+	virtual void ServiceL(const RMessage2& aMessage);
+	};
+
+class CMyServer : public CServer2
+	{
+public:
+	enum {ERead,EStop};
+public:
+	CMyServer(TInt aPriority);
+	static CMyServer* New(TInt aPriority);
+	virtual CSession2* NewSessionL(const TVersion& aVersion, const RMessage2& aMessage) const;//Overloading
+	};
+
+class RDisplay : public RSessionBase
+	{
+public:
+	TInt Open();
+	void Read(TRequestStatus& aStatus);
+	TInt Stop();
+	};
+
+LOCAL_D RTest testSvr(_L("T_TRAP Server"));
+LOCAL_D RSemaphore client;
+LOCAL_D RSemaphore server;
+LOCAL_D RDisplay display;
+LOCAL_D const RMessage2* message;
+
+// Constructor
+//
+// 
+CMySession::CMySession()
+	{}
+
+CMyServer* CMyServer::New(TInt aPriority)
+//
+// Create a new CMyServer.
+//
+	{
+	return new CMyServer(aPriority);
+	}
+
+CMyServer::CMyServer(TInt aPriority)
+//
+// Constructor.
+//
+	: CServer2(aPriority)
+	{}
+
+CSession2* CMyServer::NewSessionL(const TVersion& /*aVersion*/, const RMessage2&) const
+//
+// Create a new client for this server.
+//
+	{
+	return(new(ELeave) CMySession());
+	}
+
+void CMySession::ServiceL(const RMessage2& aMessage)
+//
+// Handle messages for this server.
+//
+	{
+	TInt r=KErrNone;
+	switch (aMessage.Function())
+		{
+	case CMyServer::ERead:
+		testSvr.Printf(_L("read message received\n"));
+		if (HaveVirtMem())
+			{
+			message = &aMessage;
+			}
+		client.Signal();
+		server.Wait();
+		break;
+	case CMyServer::EStop:
+		testSvr.Printf(_L("stop message received\n"));
+		CActiveScheduler::Stop();
+		break;
+	default:
+		r=KErrNotSupported;
+		}
+	aMessage.Complete(r);
+	}
+
+TInt RDisplay::Open()
+//
+// Open the server.
+//
+	{
+	return(CreateSession(KServerName,TVersion(),1));
+	}
+
+void RDisplay::Read(TRequestStatus& aStatus)
+//
+// Get session to test CSession2::ReadL.
+//
+	{
+	TBuf<0x10>* bad = (TBuf<0x10> *)(0x30000000);
+	SendReceive(CMyServer::ERead, TIpcArgs(bad), aStatus);
+	}
+
+TInt RDisplay::Stop()
+//
+// Stop the server.
+//
+	{
+	return SendReceive(CMyServer::EStop, TIpcArgs());
+	}
+
+LOCAL_C TInt serverThreadEntryPoint(TAny*)
+//
+// The entry point for the server thread.
+//
+	{
+	testSvr.Title();
+	testSvr.Start(_L("Create CActiveScheduler"));
+	CActiveScheduler* pR=new CActiveScheduler;
+	testSvr(pR!=NULL);
+	CActiveScheduler::Install(pR);
+//
+	testSvr.Next(_L("Create CMyServer"));
+	CMyServer* pS=CMyServer::New(0);
+	testSvr(pS!=NULL);
+//
+	testSvr.Next(_L("Start CMyServer"));
+	TInt r=pS->Start(KServerName);
+	testSvr(r==KErrNone);
+//
+	testSvr.Next(_L("Signal to client that we have started"));
+	client.Signal();
+//
+	testSvr.Next(_L("Start CActiveScheduler"));
+	CActiveScheduler::Start();
+//
+	testSvr.Next(_L("Exit server"));
+	delete pS;
+	testSvr.Close();
+	return(KErrNone);
+	}
+
+void CreateServer()
+	{
+	test.Next(_L("Creating client semaphore"));
+	TInt r=client.CreateLocal(0);
+	test(r==KErrNone);
+//
+	test.Next(_L("Creating server semaphore"));
+	r=server.CreateLocal(0);
+	test(r==KErrNone);
+//
+	test.Next(_L("Creating server thread"));
+	RThread server;
+	r=server.Create(_L("Server"),serverThreadEntryPoint,KDefaultStackSize,KHeapSize,KHeapSize,NULL);
+	test(r==KErrNone);
+	server.SetPriority(EPriorityMore);
+//
+	test.Next(_L("Resume server thread"));
+	server.Resume();
+	test(ETrue);
+//
+	test.Next(_L("Wait for server to start"));
+	client.Wait();
+//
+	test.Next(_L("Connect to server"));
+	r=display.Open();
+	test(r==KErrNone);
+	}
+
+void StopServer()
+	{
+	test.Next(_L("Stop server"));
+	TInt r=display.Stop();
+	test(r==KErrNone);
+//
+	test.Next(_L("Close connection"));
+	display.Close();
+//
+	test.Next(_L("Close all"));
+	server.Close();
+	client.Close();
+    }
+
+/*============== end of server for testing exceptions in TRAP implementation ====================*/
+
+#undef TRAP_INSTRUMENTATION_START
+#undef TRAP_INSTRUMENTATION_NOLEAVE
+#undef TRAP_INSTRUMENTATION_LEAVE
+#define TRAP_INSTRUMENTATION_START			++TrapStart;
+#define TRAP_INSTRUMENTATION_NOLEAVE		++TrapNoLeave; TestExcInInstrumentation();
+#define TRAP_INSTRUMENTATION_LEAVE(aReason) TrapLeave=aReason;
+
+TInt TrapStart = 0;
+TInt TrapNoLeave = 0;
+TInt TrapLeave = 123;
+
+//
+// This is mostly for the benefit of WINS, where Win32 exceptions
+// have a nasty habit of interacting badly with C++ exceptions
+//
+
+void TestExcInInstrumentation()
+	{
+	TRequestStatus status;
+	display.Read(status);
+	test(status.Int() == KRequestPending);
+
+	client.Wait();
+
+	TBuf<0x100> buf;
+	if (message)
+		test(message->Read(0,buf) == KErrBadDescriptor);
+
+	server.Signal();
+
+	User::WaitForRequest(status);
+	test(status.Int() == KErrNone);
+	}
+
+void TestTrapInstrumentation()
+	{
+	CreateServer();
+
+	test.Start(_L("TRAPD No Leave"));
+	TRAPD(r,User::LeaveIfError(0));
+	test(TrapStart==1);
+	test(TrapLeave==123);
+	test(r==0);
+	test(TrapNoLeave==1);
+
+	test.Next(_L("TRAP No Leave"));
+	TRAP(r,User::LeaveIfError(0));
+	test(TrapStart==2);
+	test(TrapLeave==123);
+	test(r==0);
+	test(TrapNoLeave==2);
+
+	test.Next(_L("TRAP_IGNORE No Leave"));
+	TRAP_IGNORE(User::LeaveIfError(0));
+	test(TrapStart==3);
+	test(TrapLeave==123);
+	test(TrapNoLeave==3);
+
+	test.Next(_L("TRAPD Leave"));
+	TRAPD(r2,User::LeaveIfError(-999));
+	test(TrapStart==4);
+	test(TrapLeave==-999);
+	test(r2==TrapLeave);
+	test(TrapNoLeave==3);
+
+	test.Next(_L("TRAP Leave"));
+	TRAP(r2,User::LeaveIfError(-666));
+	test(TrapStart==5);
+	test(TrapLeave==-666);
+	test(r2==TrapLeave);
+	test(TrapNoLeave==3);
+
+	test.Next(_L("TRAP_IGNORE Leave"));
+	TRAP_IGNORE(User::LeaveIfError(-333));
+	test(TrapStart==6);
+	test(TrapLeave==-333);
+	test(TrapNoLeave==3);
+
+	test.Next(_L("Leave"));
+	test.End();
+
+	StopServer();
+	}
+#endif // __TOOLS2__
+
+#undef TRAP_INSTRUMENTATION_START
+#undef TRAP_INSTRUMENTATION_NOLEAVE
+#undef TRAP_INSTRUMENTATION_LEAVE
+#define TRAP_INSTRUMENTATION_START
+#define TRAP_INSTRUMENTATION_NOLEAVE
+#define TRAP_INSTRUMENTATION_LEAVE(aReason)
+
+#ifdef __WINS__
+TUint32* Stack;
+volatile TInt* volatile Q;
+const TInt A[] = {17,19,23,29,31,37,41,43,47,53};
+
+void ExceptionHandler(TExcType)
+	{
+	TUint32* sp = Stack;
+	for (; *sp!=0xfacefeed; --sp) {}
+	*sp = (TUint32)(Q++);
+	}
+
+__NAKED__ TInt GetNext()
+	{
+	_asm mov Stack, esp
+	_asm mov eax, 0facefeedh
+	_asm mov eax, [eax]
+	_asm ret
+	}
+
+void testExceptionsInTrap()
+	{
+	TInt ix = 0;
+	TInt r;
+	User::SetExceptionHandler(&ExceptionHandler, 0xffffffff);
+	Q = (volatile TInt* volatile)A;
+	r = GetNext();
+	test(r==A[ix++]);
+	TInt i;
+	TRAP(i,r=GetNext());
+	test(i==0);
+	test(r==A[ix++]);
+	TRAP(i,TRAP(i,r=GetNext()));
+	test(i==0);
+	test(r==A[ix++]);
+	TRAP(i, TRAP(i,User::Leave(271));r=GetNext(); );
+	test(i==271);
+	test(r==A[ix++]);
+	TRAP(i, TRAP(i, TRAP(i,User::Leave(487));r=GetNext(); ); );
+	test(i==487);
+	test(r==A[ix++]);
+	TInt s=-1;
+	TRAP(i, TRAP(i, TRAP(i, TRAP(i,User::Leave(999));r=GetNext(); ); s=GetNext(); ); );
+	test(i==999);
+	test(r==A[ix++]);
+	test(s==A[ix++]);
+	TInt j=-1, k=-1, l=-1;
+	TRAP(l,										\
+		TRAP(k,									\
+			TRAP(j,								\
+				TRAP(i,User::Leave(9991));		\
+				r=GetNext();					\
+				);								\
+			User::Leave(9992);					\
+			);									\
+		s=GetNext();							\
+		);
+	test(i==9991);
+	test(j==0);
+	test(k==9992);
+	test(l==0);
+	test(r==A[ix++]);
+	test(s==A[ix++]);
+	}
+#endif
+
+GLDEF_C TInt E32Main()
+    {
+	test.Title();
+//
+	test.Start(_L("Trap"));
+	testTrap();
+//
+	test.Next(_L("Leave"));
+	testLeave();
+//
+	test.Next(_L("Assorted"));
+	testMH();
+//
+#ifndef __TOOLS2__
+	test.Next(_L("Leave without Trap"));
+	TestLeaveNoTrap();
+//
+	test.Next(_L("Assertions"));
+	TestAssert(0);
+	TestAssert(EAssertTest_Debug);
+	TestAssert(EAssertTest_Leave);
+	TestAssert(EAssertTest_Leave | EAssertTest_Debug);
+
+#ifdef __LEAVE_EQUALS_THROW__
+	test.Next(_L("Trap instrumentation"));
+	TestTrapInstrumentation();
+#endif
+#endif // __TOOLS2__
+
+#ifdef __WINS__
+	testExceptionsInTrap();
+#endif
+
+	test.End();
+	return(0);
+    }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/f32/inc/f32file.h	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,3096 @@
+// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+/**
+ @file
+ @publishedAll
+ @released
+*/
+
+#if !defined(__F32FILE_H__)
+#define __F32FILE_H__
+
+#if !defined(__E32BASE_H__)
+#include <e32base.h>
+#endif
+
+#if !defined(__E32SVR_H__)
+#include <e32svr.h>
+#endif
+
+#include <e32ldr.h>
+
+
+/**
+@publishedAll
+@released
+
+The session default drive.
+*/
+const TInt KDefaultDrive=KMaxTInt;
+
+
+
+
+/**
+@publishedAll
+@released
+
+Indicates a drive letter which is not in use. 
+
+This is useful when scanning a drive list to find which drives are available.
+*/
+const TInt KDriveAbsent=0x00;
+
+
+
+
+/**
+@publishedAll
+@released
+
+The default value for the number of message slots passed to RFs::Connect().
+
+@see RFs::Connect
+*/
+const TInt KFileServerDefaultMessageSlots=-1;
+
+
+
+
+/**
+@publishedAll
+@released
+
+The size of the array of TEntry items contained in a TEntryArray object.
+
+@see TEntryArray
+@see TEntry
+*/
+const TInt KEntryArraySize=(0x200*sizeof(TText));
+
+
+
+
+/**
+@publishedAll
+@released
+
+The character used to separate directories in the path name.
+*/
+const TInt KPathDelimiter='\\';
+
+
+
+
+/**
+@publishedAll
+@released
+
+The character used to separate the drive letter from the path.
+*/
+const TInt KDriveDelimiter=':';
+
+
+
+
+/**
+@publishedAll
+@released
+
+The character used to separate the filename from the extension.
+*/
+const TInt KExtDelimiter='.';
+
+
+
+
+/**
+@publishedAll
+@released
+
+The maximum number of available drives.
+*/
+const TInt KMaxDrives=26;
+
+
+/**
+@publishedAll
+@released
+
+The maximum number of available proxy drives.
+*/
+const TInt KMaxProxyDrives=KMaxDrives-KMaxLocalDrives;
+
+
+/**
+@publishedAll
+@released
+
+Defines a modifiable buffer descriptor to contain a drive list.
+
+The descriptor has maximum length KMaxDrives, sufficient to contain
+all possible drive letters.
+
+@see RFs::DriveList
+@see KMaxDrives
+*/
+typedef TBuf8<KMaxDrives> TDriveList;
+
+
+
+/**
+@publishedAll
+@released
+
+The maximum length of a drivename.
+
+Sufficient for a drive letter and colon.
+*/
+const TInt KMaxDriveName=0x02;
+
+
+
+
+/**
+@publishedAll
+@released
+
+Defines a modifiable buffer descriptor to contain a drive name.
+
+A drive name comprises a drive letter (A through Z) and a colon.
+KMaxDriveName (2 bytes) is sufficient for a drive letter and colon.
+
+@see TDriveUnit::Name
+@see KMaxDriveName
+*/
+typedef TBuf<KMaxDriveName> TDriveName;
+
+
+
+
+/**
+@publishedAll
+@released
+
+The maximum length of a file system name or file system sub type name.
+32 characters is sufficient for a file system or sub type name.
+*/
+const TInt KMaxFSNameLength=0x0020;
+
+
+
+
+/**
+@publishedAll
+@released
+
+Defines a modifiable buffer descriptor to contain a file system or file system sub type name.
+
+@see KMaxFSNameLength
+*/
+typedef TBuf<KMaxFSNameLength> TFSName;
+
+
+
+
+/**
+@publishedAll
+@released
+
+File/directory attribute: any file without the hidden or system attribute.
+*/
+const TUint KEntryAttNormal=0x0000;
+
+
+
+
+/**
+@publishedAll
+@released
+
+File/directory attribute: read-only file or directory.
+*/
+const TUint KEntryAttReadOnly=0x0001;
+
+
+
+
+/**
+@publishedAll
+@released
+
+File/directory attribute: hidden file or directory.
+*/
+const TUint KEntryAttHidden=0x0002;
+
+
+
+
+/**
+@publishedAll
+@released
+
+File/directory attribute: system file.
+*/
+const TUint KEntryAttSystem=0x0004;
+
+
+
+
+/**
+@publishedAll
+@released
+
+File/directory attribute: volume name directory.
+*/
+const TUint KEntryAttVolume=0x0008;
+
+
+
+
+/**
+@publishedAll
+@released
+
+File/directory attribute: a directory without the hidden or system attribute.
+*/
+const TUint KEntryAttDir=0x0010;
+
+
+
+
+/**
+@publishedAll
+@released
+
+File/directory attribute: an archive file.
+*/
+const TUint KEntryAttArchive=0x0020;
+
+
+
+
+/**
+@publishedAll
+@released
+
+File/directory attribute: ROM eXecute In Place file
+*/
+const TUint KEntryAttXIP=0x0080;
+
+
+
+
+/**
+@publishedAll
+@released
+
+This file attribute bit is set if the file exists only on a remote file 
+system and is not locally cached.
+
+Due to the potential high-latency of remote file systems, applications 
+(or users of applications) may make use of this bit to modify their 
+behaviour when working with remote files.
+
+This is a read-only attribute, so any attempt to set this attribute will
+will be ignored.
+*/
+const TUint KEntryAttRemote=0x0100;
+
+
+
+
+/**
+@publishedAll
+@released
+
+The range of entry attributes reserved for file-system specific meanings.
+File systems may assign meaning to these bits, but their definition will
+not be supported nor maintained by Symbian.
+
+All other file attribute bits are reserved for use by Symbian.
+
+The following table summarises the assignment of attribute bits:
+
+	 0 - KEntryAttReadOnly
+	 1 - KEntryAttHidden
+	 2 - KEntryAttSystem
+	 3 - KEntryAttVolume
+	
+	 4 - KEntryAttDir
+	 6 - KEntryAttArchive
+	 7 - KEntryAttXIP
+
+	 8 - KEntryAttRemote
+	 9 - Reserved
+	10 - Reserved
+	11 - Reserved
+	
+	12 - Reserved
+	13 - Reserved
+	14 - Reserved
+	15 - Reserved
+	
+	16 - File System Specific
+	17 - File System Specific
+	18 - File System Specific
+	19 - File System Specific
+	
+	20 - File System Specific
+	22 - File System Specific
+	22 - File System Specific
+	23 - File System Specific
+	
+	24 - Reserved
+	25 - Reserved
+	26 - Reserved
+	27 - KEntryAttMatchExclude
+	
+	28 - KEntryAttAllowUid
+	29 - Reserved
+	30 - KEntryAttMatchExclusive
+	31 - Reserved
+*/
+const TUint KEntryAttMaskFileSystemSpecific=0x00FF0000;
+
+
+
+
+/**
+@publishedAll
+@released
+
+Bit mask for matching file and directory entries.
+
+This mask ensures that directories and hidden and
+system files are matched.
+
+(Note that KEntryAttNormal matches all entry types except directories, hidden
+and system entries).
+
+@see RFs::GetDir
+*/
+const TUint KEntryAttMatchMask=(KEntryAttHidden|KEntryAttSystem|KEntryAttDir);
+
+
+
+
+
+/**
+@publishedAll
+@released
+
+Bit mask for matching file and directory entries.
+
+This is used when all entry types, including hidden and system files,
+but excluding the volume entry are to be matched.
+
+@see RFs::GetDir
+*/
+const TUint KEntryAttMaskSupported=0x3f;
+
+
+
+
+/**
+@publishedAll
+@released
+
+Bit mask for matching file and directory entries.
+
+This is used for exclusive matching. When OR'ed with one or more file attribute
+constants, for example, KEntryAttNormal, it ensures that only the files with
+those attributes are matched.
+When OR’ed with KEntryAttDir, directories only (not hidden or system) are matched.
+
+@see KEntryAttDir
+@see KEntryAttNormal
+@see RFs::GetDir
+*/
+const TUint KEntryAttMatchExclusive=0x40000000;
+
+
+
+
+/**
+@publishedAll
+@released
+
+Bit mask for feature manager file entries.
+
+It is used in order to identify each ROM feature set data file 
+uniquely in the mount order of ROM sections.
+
+*/
+const TUint KEntryAttUnique=0x01000000;
+
+
+
+
+/**
+@publishedAll
+@released
+
+Bit mask for matching file and directory entries.
+
+It is used to exclude files or directories with certain attributes from
+directory listings. This bitmask has the opposite effect
+to KEntryAttMatchExclusive. For example:
+
+@code
+KEntryAttMatchExclude|KEntryAttReadOnly
+@endcode
+
+excludes all read only entries from the directory listing.
+
+@code
+KEntryAttMatchExclusive|KEntryAttReadOnly
+@endcode
+lists only read only entries.
+
+@see KEntryAttMatchExclusive
+@see RFs::GetDir
+*/
+const TUint KEntryAttMatchExclude=0x08000000;
+
+
+
+
+/**
+@publishedAll
+@released
+
+Bit mask for matching file and directory entries.
+
+Bit mask flag used when UID information should be included in the directory
+entry listing.
+
+@see RFs::GetDir
+*/
+const TUint KEntryAttAllowUid=0x10000000;
+
+
+
+
+/**
+@publishedPartner
+@released
+
+Bit mask used when evaluating whether or not a session gets notified of a 
+debug event.
+
+@see DebugNotifySessions
+*/
+const TUint KDebugNotifyMask=0xFF000000; // Reserved for debug notification
+
+/**
+   
+*/
+const TUint KMaxMapsPerCall = 0x8;
+
+
+
+
+/** 
+@publishedPartner 
+@released 
+
+The default blocksize value.
+
+This value is returned when you query the blocksize for a media type that does not 
+support the concept of 'block' (e.g. NOR flash media).
+
+@see TVolumeIOParamInfo 
+*/
+const TUint KDefaultVolumeBlockSize = 512;
+
+
+
+
+enum TNotifyType
+/**
+@publishedAll
+@released
+
+A set of change notification flags.
+
+These flags indicate the kind of change that should result in notification.
+
+This is useful for programs that maintain displays of file lists that
+must be dynamically updated.
+
+@see RFs::NotifyChange
+@see RFs
+@see RFile
+@see RRawDisk
+*/
+	{
+	/**
+	Any change, including mounting and unmounting drives.
+	*/
+	ENotifyAll=0x01,
+	
+	
+	/**
+	Addition or deletion of a directory entry, or changing or formatting a disk.
+	*/
+	ENotifyEntry=0x02,
+	
+	
+	/**
+	Change resulting from file requests:
+	RFile::Create(), RFile::Replace(), RFile::Rename(), RFs::Delete(),
+	RFs::Replace(), and RFs::Rename().
+	*/
+	ENotifyFile=0x04,
+	
+	
+	/**
+	Change resulting from directory requests:
+	RFs::MkDir(), RFs::RmDir(), and RFs::Rename().
+	*/
+	ENotifyDir=0x08,
+	
+	
+	/**
+	Change resulting from: RFs::SetEntry(), RFile::Set(), RFile::SetAtt(),
+	RFile::SetModified() and RFile::SetSize() requests.
+	*/
+	ENotifyAttributes=0x10,
+	
+	
+	/**
+	Change resulting from the RFile::Write() request.
+	*/
+	ENotifyWrite=0x20,
+	
+	
+	/**
+	Change resulting from the RRawDisk::Write() request.
+	*/
+	ENotifyDisk=0x40
+	};
+
+enum TNotifyDismountMode
+/**
+@publishedAll
+@released
+
+Notification modes for safe media removal notification API
+
+@see RFs::NotifyDismount
+*/
+	{
+	/**
+	Used by a client to register for notification of pending dismount.
+		- This is the default behaviour for RFs::NotifyDismount
+	*/
+	EFsDismountRegisterClient=0x01,
+	
+	/**
+	Used to notify clients of a pending dismount.
+	*/
+	EFsDismountNotifyClients=0x02,
+	
+	/**
+	Used to forcibly dismount the file system without notifying clients.
+	*/
+	EFsDismountForceDismount=0x03,
+	};
+
+
+enum TFileCacheFlags
+/**
+@publishedPartner
+@released
+
+Flags used to enable file server drive-specific caching 
+*/
+	{
+	/**
+	Enable read caching - if file explicitly opened in EFileReadBuffered mode
+	*/
+	EFileCacheReadEnabled = 0x01,
+
+	/**
+	Enable read caching for all files, regardless of file open mode
+	*/
+	EFileCacheReadOn = 0x02,
+
+	/**
+	Enable read-ahead caching - if file explicitly opened in EFileReadAheadOn mode
+	*/
+	EFileCacheReadAheadEnabled = 0x04,	
+
+	/**
+	Enable read-ahead caching, regardless of file open mode
+	*/
+	EFileCacheReadAheadOn = 0x08,	
+
+	/**
+	Enable write caching, if file explicitly opened in EFileWriteBuffered mode
+	*/
+	EFileCacheWriteEnabled = 0x10,	
+
+	/**
+	Enable write caching for all files, regardless of file open mode
+	*/
+	EFileCacheWriteOn = 0x20,	
+	};
+
+
+enum TStartupConfigurationCmd
+/**
+@publishedPartner
+@released
+
+Command used to set file server configuration at startup.
+
+@see RFs::SetStartupConfiguration()
+*/
+    {
+    /**
+    Set loader thread priority
+    */
+    ELoaderPriority,
+
+    /**
+    Set TDrive flags. Value should be ETrue or EFalse
+    */
+    ESetRugged,
+    /**
+    Command upper boundary
+    */
+    EMaxStartupConfigurationCmd
+    };
+
+/**
+@publishedPartner
+@released
+
+Commands to query specific volume information.
+
+@see TVolumeIOParamInfo
+*/
+enum TQueryVolumeInfoExtCmd
+	{
+	/**
+    Queries the sub type of the file system mounted on a specified volume.
+    For example, FAT12, FAT16 or FAT32.
+    */
+    EFileSystemSubType,
+	
+    /**
+    Queries the I/O parameters of a specificed volume.
+    This includes the block size, the cluster size and the recommended read and write sizes for the media.    
+    */
+    EIOParamInfo,
+
+    /** 
+    This command determines whether the volume is synchronous or asynchronous.
+    A boolean value is returned within the buffer defined as TPckgBuf<TBool>. 
+    ETrue for Synchronous and EFalse for Asynchronous.
+    */
+    EIsDriveSync,
+
+    /**
+    Query if the given drive is finalised. See RFs::FinaliseDrive() 
+    Not all file systems may support this query.
+    A boolean value is returned within the buffer defined as TPckgBuf<TBool>. 
+    ETrue value means that the drive is finalised
+    */
+    EIsDriveFinalised,
+	};
+
+/**
+@publishedAll
+@released
+
+Volume IO parameter information.
+
+This class is used to return IO parameter information for a specified volume.
+
+The volume parameter information holds recommended buffer sizes for the creation of efficient buffers for
+reading and writing.
+
+@see RFs::VolumeIOParam()
+*/
+class TVolumeIOParamInfo
+	{
+public:
+	/**
+	The size of a block in bytes.
+	
+	Reads and writes that are aligned on block boundaries are up to twice as fast as when 
+	mis-aligned.	
+	
+	Read and write operations on certain underlying media is done in blocks.
+	A write operation that modifies only part of a block is less efficient, in general, than
+	one that modifies an entire block. Data throughput degrades linearly for reads and writes in smaller
+	sized units. 
+	*/
+	TInt iBlockSize;
+	/**
+	The size in bytes of a single disk cluster.
+	
+	Read and write operations that are aligned on cluster boundaries are more efficient.
+	
+	The file system organises and allocates the file data on the disk in clusters where each cluster is
+	one or more blocks. Files that are not zero length occupy at least one cluster of the disk, 
+	so large numbers of very small files use up more disk space than expected. 
+	*/
+	TInt iClusterSize;
+	/**
+	The recommended buffer size for optimised reading performance. 
+	
+	The given buffer size is based on sensible benchmark testing results produced by the mobile device vendor.
+	The buffer size is then added to the estart.txt file
+	
+	The figure is included in the estart.txt file along with the drive number and the variable name. 
+	The example below shows the required format:
+
+	[DriveC]
+	RecReadBufSize 8192
+
+	When no value is provided, value KErrNotSupported is returned.
+	*/
+	TInt iRecReadBufSize;
+	/**
+	The recommended buffer size for optimised writing performance. 
+	
+	The given buffer size is based on sensible benchmark testing results produced by the mobile device vendor.
+	The buffer size is then added to the estart.txt file
+	
+	The figure is included in the estart.txt file along with the drive number and the variable name. 
+	The example below shows the required format:
+
+	[DriveC]
+	RecWriteBufSize 16384
+	
+	When no value is provided, value KErrNotSupported is returned.
+	*/
+	TInt iRecWriteBufSize;
+
+private:
+	/*
+	Reserved space for future use
+	*/
+	TInt iReserved[4];
+	};
+
+enum TDriveNumber
+/**
+@publishedAll
+@released
+
+The drive number enumeration.
+*/
+	{
+	EDriveA,   EDriveB,   EDriveC,   EDriveD,   EDriveE,
+	EDriveF,   EDriveG,   EDriveH,   EDriveI,   EDriveJ,
+	EDriveK,   EDriveL,   EDriveM,   EDriveN,   EDriveO, 
+	EDriveP,   EDriveQ,   EDriveR,   EDriveS,   EDriveT,
+	EDriveU,   EDriveV,   EDriveW,   EDriveX,   EDriveY,
+	EDriveZ
+	};
+
+
+
+
+enum TEntryKey
+/**
+@publishedAll
+@released
+
+Flags indicating the order in which directory entries are to be sorted.
+
+@see RFs::GetDir
+@see CDirScan::SetScanDataL
+@see CDir::Sort
+*/
+	{
+	/**
+	The default; no sorting takes place
+	*/
+	ESortNone=0,
+
+
+	/**
+	Sort according to alphabetic order of file and directory name.
+
+    This setting is mutually exclusive with ESortByExt, ESortBySize,
+    ESortByDate and ESortByUid.
+	*/
+	ESortByName,
+	
+	
+	/**
+	Sort according to alphabetic order of file extension.
+	
+	Files without an extension take precedence over files with an extension.
+	For files with the same extension or without an extension, the default is
+	to sort by name.
+
+    This setting is mutually exclusive with ESortByName, ESortBySize,
+    ESortByDate and ESortByUid.
+	*/
+	ESortByExt,
+	
+	
+	/**
+	Sort according to file size.
+
+    This setting is mutually exclusive with ESortByName, ESortByExt,
+    ESortByDate and ESortByUid.
+	*/
+	ESortBySize,
+	
+	
+	/**
+	Sort according to files' last modified time and date.
+	
+	By default, most recent last.
+
+    This setting is mutually exclusive with ESortByName, ESortByExt,
+    ESortBySize and ESortByUid.
+	*/
+	ESortByDate,
+	
+	
+	/**
+	Sort according to file UID.
+ 
+    This setting is mutually exclusive with ESortByName, ESortByExt,
+    ESortBySize and ESortByDate.
+	*/
+	ESortByUid,
+	
+	
+	/**
+	Qualifies the sort order; if set, directories are listed in the order in
+	which they occur. 
+	
+	This is the default.
+
+    This flag is mutually exclusive with EDirsFirst and EDirslast.
+	*/
+	EDirsAnyOrder=0,
+	
+	
+	/**
+	Qualifies the sort order; if set, directories come before files in sort order.
+
+    This flag is mutually exclusive with EDirsAnyOrder and EDirsLast.
+	*/
+	EDirsFirst=0x100,
+	
+	
+	/**
+	Qualifies the sort order; if set, files come before directories in sort order.
+ 
+    This flag is mutually exclusive with EDirsAnyOrder and EDirsFirst.
+	*/
+	EDirsLast=0x200,
+	
+	
+	/**
+	Qualifies the sort order; files are sorted in ascending order, i.e. from A to Z.
+	This is the default behaviour.
+
+    This flag is mutually exclusive with EDescending and EDirDescending.
+	*/
+	EAscending=0,
+	
+	
+	/**
+	Qualifies the sort order; files are sorted in descending order, i.e. from Z to A.
+    
+    This flag is mutually exclusive with EAscending and EDirDescending.
+	*/
+	EDescending=0x400,
+	
+	
+	/**
+	Qualifies the sort order; directories are sorted in descending order, i.e. from Z to A.
+    
+    This flag shall be used in combination with either EDirsFirst or EDirsLast.
+    This flag is mutually exclusive with EAscending and EDescending.
+	*/
+	EDirDescending=0x800
+	};
+
+
+
+
+enum TFileMode
+/**
+@publishedAll
+@released
+
+Access and share modes available when opening a file.
+
+The access mode indicates whether the file is opened just for reading or
+for writing.
+
+The share mode indicates whether other RFile objects can access the
+open file, and whether this access is read only.
+
+Use EFileShareReadersOrWriters if a client does not care whether the file has
+been previously opened for ReadOnly or Read/Write access.
+
+If EFileShareReadersOrWriters is not used, then a client needs to cooperate with 
+other clients in order to open the file with the correct share mode, either
+EFileShareReadersOnly or EFileShareAny, depending on the share mode used when
+the file was originally opened.
+
+To open a file for reading and writing with read and write shared access, 
+use:
+
+@code
+_LIT(KFilename, "filename.ext");
+RFile file;
+file.Open(theFs, KFilename, EFileShareAny|EFileWrite);
+@endcode
+
+If another instance of RFile tries to open this file in EFileShareExclusive
+or EFileShareReadersOnly mode, access is denied. However, it can be opened
+in EFileShareAny mode or EFileShareReadersOrWriters mode.
+
+If a file is opened with EFileShareReadersOrWriters, and the file is opened for
+sharing by another client, then the file share mode is promoted to the new share 
+mode. When the file handle is closed then the share mode is demoted back to 
+EFileShareReadersOrWriters.
+
+@code
+
+Table of FileShare promotion rules
+----------------------------------
+
+Client A					Client B							Resultant Share Mode 
+--------					--------							--------------------
+ReadersOnly					ReadersOnly						ReadersOnly
+ReadersOnly					ReadersOrWriters|EFileRead			ReadersOnly
+ReadersOnly					ReadersOrWriters|EFileWrite		INCOMPATIBLE
+ReadersOnly					Any								INCOMPATIBLE
+
+ReadersOrWriters|EFileRead	ReadersOnly						ReadersOnly
+ReadersOrWriters|EFileRead	ReadersOrWriters|EFileRead		ReadersOrWriters
+ReadersOrWriters|EFileRead	ReadersOrWriters|EFileWrite		ReadersOrWriters
+ReadersOrWriters|EFileRead	Any								Any
+
+ReadersOrWriters|EFileWrite	ReadersOnly						INCOMPATIBLE
+ReadersOrWriters|EFileWrite	ReadersOrWriters|EFileRead			ReadersOrWriters
+ReadersOrWriters|EFileWrite	ReadersOrWriters|EFileWrite		ReadersOrWriters
+ReadersOrWriters|EFileWrite	Any								Any
+
+Any							ReadersOnly						INCOMPATIBLE
+Any							ReadersOrWriters|EFileRead			Any
+Any							ReadersOrWriters|EFileWrite		Any
+Any							Any								Any
+@endcode
+
+Use the following guidance notes for selecting FileShare mode with shared RFile objects:
+
+EFileShareAny
+- Use this mode to request both read and write access when another client needs
+to write to the file and respective client access to the file is coordinated.
+- To open a file for non-exclusive write, use EFileShareAny | EFileWrite. 
+- It is recommended that either EFileShareAny or EFileShareAny | EFileRead are
+not used. These combinations will block users attempting to use the 
+EFileShareReadersOnly mode even if all the EFileShareAny handles do not have
+the EFileWrite bit set as the EFileRead and EFileWrite bits have no affect on 
+sharing. Use either EFileShareReadersOnly or EFileShareReadersOrWriters.
+
+EFileShareReadersOrWriters 
+- Use this mode when it does not matter if another file writes to the file and
+file access can not be coordinated as other clients are unknown.
+- To open a file for shared read access whilst permitting writers, use 
+EFileShareReadersOrWriters | EFileRead.
+
+- For write access with unrestricted share mode, 
+EFileShareReadersOrWriters | EFileWrite may be used however 
+EFilesShareAny | EFileWrite is preferred.
+
+EFileShareReadersOnly
+- Use this mode to get read access to the file and deny write access for any 
+other handles on this file. 
+- To open a file for shared read access whilst disallowing writers use 
+EFileShareReadersOnly.
+
+
+Files may be opened in text or binary mode. Native Symbian OS application 
+files are nearly all binary, (so they will usually be opened in binary mode).
+However, they can be opened in text mode (to support testing, and to make them
+compatible with text formats on remote systems).
+Symbian OS native text format uses CR-LF (ASCII 0x0d, 0x0a) to denote the end of
+a line. When reading, however, any combination of CR, LF, LF-CR or CR-LF is
+recognised as the end of a line. Where a remote file system uses a different
+format, it is the responsibility of the installable file system to present
+an interface for text files which conforms with this format.
+
+The share mode may be OR’ed with either EFileStream or EFileStreamText.
+
+Additionally, it may be OR’ed with either EFileRead or EFileWrite.
+*/
+	{
+	/**
+	Exclusive access for the program opening the file.
+	
+	No other program can access the file until it is closed.
+    If another program is already accessing the file in any share mode, then
+    an attempt to open it with an EFileShareExclusive will fail.
+	*/
+	EFileShareExclusive,
+
+
+	/**
+	Read-only sharing.
+	
+	This means that the file may only be accessed for reading.
+    A file cannot be opened using a share mode of EFileShareReadersOnly with
+    an EFileWrite flag.
+	*/
+	EFileShareReadersOnly,
+
+
+	/**
+	Shared access for reading and writing.
+	
+	This means that other programs may share access to the file for reading
+	and writing with the program which opened the file.
+
+	When using this mode, the program is expecting another program to be able
+	to write to the file, so is not compatible with EFileShareReadersOnly.
+	*/
+	EFileShareAny,
+
+
+	/**
+	Shared access for reading and writing.
+	
+	This means that other programs may share access to the file for reading
+	and writing with the program which opened the file.  
+	
+	When using this mode, the program does not care if another program has
+	the file open for read or write access.
+	*/
+	EFileShareReadersOrWriters,
+
+
+	/**
+	For files to be opened in binary mode.
+	*/
+	EFileStream=0,
+
+
+	/**
+	For files to be opened in text mode.
+	*/
+	EFileStreamText=0x100,
+
+
+	/**
+	The file may be read from but not written to.
+	*/
+	EFileRead=0,
+
+
+	/**
+	The file may be read from and written to
+	
+	Cannot be combined with a share mode of EFileShareReadersOnly.
+	*/
+	EFileWrite=0x200,
+
+	/**
+	Specifies that an asynchronous read request should not be completed 
+	until all requested data becomes available.
+	
+	Cannot be combined with the EFileShareExclusive or EFileShareReadersOnly
+	share modes as this will prohibit a writer from updating the file.
+	*/
+	EFileReadAsyncAll=0x400,
+
+	/**
+	Enables write buffering
+	*/
+	EFileWriteBuffered	=0x00000800,
+
+	/**
+	Disables write buffering
+	*/
+	EFileWriteDirectIO	=0x00001000,
+
+	/**
+	Enables read buffering
+	*/
+	EFileReadBuffered	=0x00002000,
+
+	/**
+	Disables read buffering
+	*/
+	EFileReadDirectIO	=0x00004000,
+
+	/**
+	Enables read ahead. 
+	*/
+	EFileReadAheadOn	=0x00008000,
+
+	/**
+	Disables read ahead.
+	*/
+	EFileReadAheadOff	=0x00010000,
+
+	/**
+	Enable delete on close
+	*/
+	EDeleteOnClose		=0x00020000
+	};
+
+
+
+
+/**
+@publishedAll
+@released
+
+Bit mask provided for retrieving a file's share mode.
+
+@see TFileMode
+*/
+const TUint KFileShareMask=0xff;
+
+
+
+
+enum TFormatMode 
+/**
+@publishedAll
+@released
+
+The format method.
+*/
+	{
+	/**
+	Indicates a high density floppy disk to be formatted.
+	*/
+	EHighDensity,
+    
+    
+    /**
+    Indicates a standard floppy disk to be formatted.
+	*/
+	ELowDensity,
+
+
+	/**
+	Performs a full format, erasing existing content and resetting the FAT
+	and root directory.
+	
+	This is the default, and can be ORed with bit EHighDensity or ELowDensity.
+	*/
+	EFullFormat=0,
+
+
+    /**
+    Does the minimum required to format the device, only resetting the FAT
+    and root directory.
+    
+    This is the default, and can be ORed with bit EHighDensity or ELowDensity.
+	*/
+	EQuickFormat=0x100,
+	
+	
+	/**
+	Indicates a custom formatting mode.
+	*/
+	ESpecialFormat=0x200,
+
+	/**
+	Forced erase of locked media
+	*/
+	EForceErase=0x400
+	};
+
+
+
+
+enum TSeek
+/**
+@publishedAll
+@released
+
+Flags indicating the destination of a seek operation.
+
+File locations are specified as a 32-bit signed integer,
+allowing offsets of ?GB from the origin of the seek.
+
+@see RFile::Seek
+*/
+	{
+	/**
+	This can only be used for file systems with execute-in-place facilities,
+	such as the ROM file system: the offset specifies the absolute address of
+	the data.
+	*/
+	ESeekAddress,
+
+
+	/**
+	Destination is the start of file.
+	*/
+	ESeekStart,
+
+
+	/**
+	Destination is the current position in file.
+	*/
+	ESeekCurrent,
+
+
+	/**
+	Destination is the end of file.
+	*/
+	ESeekEnd
+	};
+
+/**
+
+*/
+class TBlockMapEntry : public TBlockMapEntryBase
+	{
+public:
+	IMPORT_C TBlockMapEntry();
+	IMPORT_C void SetNumberOfBlocks( TUint aNumberOfBlocks );
+	IMPORT_C void SetStartBlock( TUint aStartBlock );
+	};
+
+/**
+   
+*/
+typedef TBuf8<KMaxMapsPerCall*sizeof(TBlockMapEntry)> TBlockArrayDes;
+
+struct SBlockMapInfo : public SBlockMapInfoBase
+	{
+	TBlockArrayDes iMap;
+	};
+
+/**
+
+*/
+enum TBlockMapUsage
+	{
+	/* */
+	EBlockMapUsagePaging,
+	/* */
+	ETestDebug
+	};
+
+class TEntry
+/**
+@publishedAll
+@released
+
+Encapsulates an entry in a directory, which can be another (nested) directory,
+a file or a volume label.
+
+Each directory entry has a name which is relative to its owning directory
+and a type, which is indicated by its unique identifier (UID).
+
+An entry can be interrogated for the following properties:
+
+1. the kind of entry: stored in the entry UIDs, stored in iType
+
+2. the entry attributes, stored in iAtt
+
+3. the size of entry
+
+4. the time the entry was last modified.
+
+@see RDir
+@see RFs::Entry
+@see RFs::SetEntry
+@see CfileBase::CurrentEntry
+*/
+	{
+public:
+	IMPORT_C TEntry();
+	IMPORT_C TEntry(const TEntry& aEntry);
+	IMPORT_C TEntry& operator=(const TEntry& aEntry);
+	IMPORT_C TBool IsReadOnly() const;
+	IMPORT_C TBool IsHidden() const;
+	IMPORT_C TBool IsSystem() const;
+	IMPORT_C TBool IsDir() const;
+	IMPORT_C TBool IsArchive() const;
+	inline const TUid& operator[](TInt anIndex) const;
+	inline TBool IsUidPresent(TUid aUid) const;
+	inline TBool IsTypeValid() const;
+	inline TUid MostDerivedUid() const;
+public:
+    /**
+    The individual bits within this byte indicate which attributes
+    have been set.
+
+    @see KEntryAttNormal
+	@see KEntryAttReadOnly
+	@see KEntryAttHidden
+    @see KEntryAttSystem
+    */
+	TUint iAtt;
+
+
+    /**
+    The size of the file in bytes.
+    For files larger that 2G it must be cast to TUint in order to avoid looking like negative signed.
+    */
+	TInt iSize;
+	
+	
+	/**
+	The local time of last modification.
+	*/
+	TTime iModified;
+	
+	
+	/**
+	The file's UIDtype
+	*/
+	TUidType iType;
+	
+	
+	/**
+	The name of the file relative to the owning directory,
+	with a maximum of KMaxFileName characters.
+	
+	@see KMaxFileName
+	*/
+	TBufC<KMaxFileName> iName;
+	
+private:	
+	/**
+	Reserved for future expansion
+	*/
+	TUint32 iReserved[2];
+	};
+
+
+
+
+class RDir;
+class TEntryArray
+/**
+@publishedAll
+@released
+
+Array of directory entries.
+
+It contains the results of a call to RDir::Read(): it will contain all
+the TEntry items in the directory. Thus, a directory can be read in
+a single call, minimising client/server communication overheads.
+
+@see TEntry
+@see RDir::Read
+*/
+	{
+public:
+	IMPORT_C TEntryArray();
+	IMPORT_C TInt Count() const;
+	IMPORT_C const TEntry& operator[](TInt anIndex) const;
+private:
+	TInt iCount;
+	TInt iIndex;
+	const TEntry* iPos;
+	TBuf8<KEntryArraySize> iBuf;
+	friend class RDir;
+	friend class RFs;
+	friend class TRawEntryArray;
+	};
+
+
+
+
+class TDriveInfo
+/**
+@publishedAll
+@released
+
+Contains drive information.
+
+@see RFs::Drive
+*/
+	{
+public:
+    /**
+    The type of media mounted on the drive.
+    */
+	TMediaType iType;
+ 
+ 
+    /**
+    Indicates whether the drive supports a battery, and if so, its state.
+    */
+    TBatteryState iBattery;
+ 
+ 
+    /**
+    The drive attributes.
+    
+    @see KDriveAttLocal
+    @see KDriveAttRom
+    @see KDriveAttRedirected
+    @see KDriveAttSubsted
+    @see KDriveAttInternal
+    @see KDriveAttRemovable
+    */
+	TUint iDriveAtt;
+ 
+ 
+    /**
+    The attributes of the media mounted on the drive.
+    
+    @see KMediaAttVariableSize
+    @see KMediaAttDualDensity
+    @see KMediaAttFormattable
+    @see KMediaAttWriteProtected
+    @see KMediaAttLockable
+    @see KMediaAttLocked
+    */
+	TUint iMediaAtt;
+private:	
+	/**
+	Reserved for future expansion
+	*/
+	TUint32 iReserved;	
+	};
+
+
+
+
+class TVolumeInfo
+/**
+@publishedAll
+@released
+
+Contains information about a volume mounted on a drive. Use RFs::Drive() if only 
+the drive information is required. 
+
+If a drive supports removable media it may contain different volumes over time.
+
+Volume information is made up of information concerning the drive on which it is mounted, 
+which can also be accessed through RFs::Drive(), and the volume information, this is made 
+up of the size of the volume, the free space, its unique identifying number and a name.
+
+TVolumeInfo is initialised by RFs::Volume().
+
+@see RFs::Volume()
+@see RFs::Drive()
+*/
+	{
+public:
+	IMPORT_C TVolumeInfo();
+	
+	/**
+	Information about the drive on which the volume is mounted.
+	
+	@see TDriveInfo
+	*/
+	TDriveInfo iDrive;
+
+
+	/**
+	The volume’s unique identifying number.
+	*/
+	TUint iUniqueID;
+
+
+	/**
+	The maximum size of the volume in bytes. The current amount of memory
+	in use plus the amount of free memory.
+	*/
+	TInt64 iSize;
+
+
+	/**
+	The amount of free space on the volume in bytes.
+	*/
+	TInt64 iFree;
+
+
+	/**
+	Name of the volume, with a maximum of KMaxFileName characters.
+	
+	This field is optional.
+
+    @see KMaxFileName
+	*/
+	TBufC<KMaxFileName> iName;
+	
+	/** 
+	Flags which define the default file-caching behaviour for this volume
+
+	@see TFileCacheFlags
+	*/
+	TFileCacheFlags iFileCacheFlags;
+    
+    /**
+    @prototype
+    @internalTechnology
+    Internal flag, used in the case of non-blocking getting volume information. 
+    @see RFs::Volume(TVolumeInfo& aVol,TInt aDrive, TRequestStatus& aStat)
+
+    If this flag is set, it means that the volume information will be obtained
+    asynchronously. More specific, on return iFree will reflect the _current_ amount of free space on volume at the moment of 
+    RFs::Volume() call, not the exact final value. This is because in this case getting volume information will be asynchronous, 
+    and the client will not be suspended until the mount finish calculating free space. At present appicable to FAT32 file system only.
+    */
+    TUint8 iVolSizeAsync : 1;
+
+private:	
+	/**
+	Reserved for future expansion
+	*/
+    TUint8  i8Reserved1;	
+    TUint16 i16Reserved1;	
+    TUint32 i32Reserved1;	
+    TUint32 i32Reserved2;	
+	};
+
+
+
+
+class TDriveUnit
+/**
+@publishedAll
+@released
+
+Drive numbers and letters.
+
+A drive may be represented by either an integer between zero and twenty five
+inclusive, or by a buffer descriptor containing a character between "A" and "Z"
+inclusive, followed by a colon.
+This class encapsulates both representations.
+An instance of this class is constructed specifying either the drive number
+or the drive letter and may be converted between the two representations.
+*/
+	{
+public:
+	inline TDriveUnit() {};
+	IMPORT_C TDriveUnit(TInt aDrive);
+	IMPORT_C TDriveUnit(const TDesC& aDrive);
+	IMPORT_C TDriveUnit& operator=(TInt aDrive);
+	IMPORT_C TDriveUnit& operator=(const TDesC& aDrive);
+	inline operator TInt() const;
+	IMPORT_C TDriveName Name() const;
+private:
+	TInt iDrive;
+	};
+
+
+
+
+class RFs;
+//
+class TParseBase
+/**
+@publishedAll
+@released
+
+Base class for file name parsing.
+
+You first need to set up the path to be parsed using either a TParse, TParsePtr
+or TParsePtrC object.
+
+The interrogation and extraction functions in this class allow you to test
+whether a component has been specified in the pathname, and if so,
+to extract it. If a component is not present in the pathname,
+the extraction function returns an empty string.
+
+This class also allows directories to be added to, and popped from the path.
+
+Notes:
+
+1. the filename modification functions cannot be used by the TParsePtrC class.
+
+2. navigation using .. and . is not supported.
+
+@see TParse
+@see TParsePtr
+@see TParsePtrC
+*/
+	{
+private:
+	struct SField {TUint8 pos;TUint8 len;TUint8 present;TUint8 filler;};
+	enum TField {EDrive,EPath,EName,EExt,EMaxFields};
+	enum TWild {EWildName=0x01,EWildExt=0x02,EWildEither=0x04,EIsRoot=0x08,EWildIsKMatchOne=0x10,EWildIsKMatchAny=0x20};
+public:
+	IMPORT_C TParseBase();
+	IMPORT_C TInt PopDir();
+	IMPORT_C TInt AddDir(const TDesC& aName);
+	IMPORT_C const TDesC& FullName() const;
+	IMPORT_C TPtrC Drive() const;
+	IMPORT_C TPtrC Path() const;
+	IMPORT_C TPtrC DriveAndPath() const;
+	IMPORT_C TPtrC Name() const;
+	IMPORT_C TPtrC Ext() const;
+	IMPORT_C TPtrC NameAndExt() const;
+	IMPORT_C TBool DrivePresent() const;
+	IMPORT_C TBool PathPresent() const;
+	IMPORT_C TBool NamePresent() const;
+	IMPORT_C TBool ExtPresent() const;
+	IMPORT_C TBool NameOrExtPresent() const;
+	IMPORT_C TBool IsRoot() const;
+	IMPORT_C TBool IsWild() const;
+	IMPORT_C TBool IsKMatchOne() const;
+	IMPORT_C TBool IsKMatchAny() const;
+	IMPORT_C TBool IsNameWild() const;
+	IMPORT_C TBool IsExtWild() const;
+protected:
+	virtual TDes& NameBuf() = 0;                // Reference to derived class descriptor containing the filename.
+	virtual const TDesC& NameBufC() const = 0;  // const reference to derived class descriptor containing the filename.
+	TInt Set(const TDesC* aName,const TDesC* aRelated,const TDesC* aDefault,TBool allowWild);
+private:
+	TInt ParseDrive(TLex& aName,TBool& aDone);
+	TInt ParsePath(TLex& aName,TBool& aDone);
+	TInt ParseName(TLex& aName,TBool& aDone);
+	TInt ParseExt(TLex& aName,TBool& aDone);
+protected:
+	TInt16 iMod;        // Non-zero indicates File name modification functionality is enabled.
+private:
+	TInt16 iWild;
+	SField iField[EMaxFields];
+	};
+
+
+
+
+class TParsePtr : public TParseBase
+/**
+@publishedAll
+@released
+
+Parses filenames using less space on the stack than TParse.
+
+Stores a reference to a filename, unlike TParse, which uses
+a 512 byte TFileName object as an internal buffer to store
+a copy of the filename.
+The filename's components (drive, path, etc.) can be retrieved using
+the functions provided by the base class, TParseBase.
+This class should be used in preference to TParse when minimising stack
+usage is a priority.
+
+@see TParse
+@see TFileName
+*/
+	{
+public:
+	IMPORT_C TParsePtr(TDes& aName);
+protected:
+	IMPORT_C TDes& NameBuf();
+	IMPORT_C const TDesC& NameBufC() const;
+private:
+	TPtr iNameBuf;
+	};
+
+
+
+
+class TParsePtrC : public TParseBase
+/**
+@publishedAll
+@released
+
+Parses, but cannot modify, filenames using less space on the stack than TParse.
+
+Stores a reference to a filename, unlike TParse, which uses
+a 512 byte TFileName object as an internal buffer to store
+a copy of the filename.
+The filename's components (drive, path, etc.) can be retrieved using
+the functions provided by the base class, TParseBase. 
+Note that because the filename cannot be modified through this class,
+the base class functions PopDir() and AddDir() cannot be called, because
+a panic will be raised.
+
+@see TParse
+@see TFileName
+*/
+	{
+public:
+	IMPORT_C TParsePtrC(const TDesC& aName);
+protected:
+	IMPORT_C TDes& NameBuf();
+	IMPORT_C const TDesC& NameBufC() const;
+private:
+	TPtrC iNameBuf;
+	};
+
+
+
+
+class TParse : public TParseBase
+/**
+@publishedAll
+@released
+
+Parses filenames.
+
+The class uses the full filename structure supported by Symbian OS.
+
+TParse works by using the Set() function to set up the filename to be parsed.
+Then, various getter functions defined in the base class, TParseBase, such as:
+FullName(), Drive(), Path(), DriveAndPath(), Name(), Ext() and NameAndExt()
+may be used to retrieve path components.
+
+There are a number of restrictions to valid path components, which are
+described in guide documentation.
+*/
+	{
+public:
+	IMPORT_C TParse();
+	IMPORT_C TInt Set(const TDesC& aName,const TDesC* aRelated,const TDesC* aDefault);
+	IMPORT_C TInt SetNoWild(const TDesC& aName,const TDesC* aRelated,const TDesC* aDefault);
+protected:
+	IMPORT_C TDes& NameBuf();
+	IMPORT_C const TDesC& NameBufC() const;
+private:
+	TFileName iNameBuf;
+	};
+	
+	
+	
+
+class CDir : public CBase
+/**
+@publishedAll
+@released
+
+Array of directory entries that has been read into memory from the file system.
+
+It can be read and sorted by user programs, but cannot be created by them. 
+*/
+	{
+public:
+	IMPORT_C virtual ~CDir();
+	IMPORT_C TInt Count() const;
+	IMPORT_C const TEntry& operator[](TInt anIndex) const;
+	IMPORT_C TInt Sort(TUint aEntrySortKey);
+protected:
+	IMPORT_C CDir();
+	IMPORT_C static CDir* NewL();
+	IMPORT_C void AddL(const TEntry& anEntry);
+	IMPORT_C void ExtractL(TBool aRemove,CDir*& aDir);
+	IMPORT_C void Compress();
+protected:
+	CArrayPakFlat<TEntry>* iArray;
+	friend class RFs;
+	friend class TOpenFileScan;
+	};
+	
+	
+#if defined SYMBIAN_PRIVATE_EFSRV
+	#define EFSRV_EXPORT_C
+	#define EFSRV_IMPORT_C 
+#else
+	#define EFSRV_EXPORT_C EXPORT_C
+	#define EFSRV_IMPORT_C IMPORT_C
+#endif
+	
+
+class RFs : public RSessionBase
+/**
+@publishedAll
+@released
+
+A handle to a file server session.
+
+A program or thread may have arbitrarily many sessions open simultaneously.
+
+Use this class for all file system manipulation, including:
+
+1. adding, removing, moving and renaming files and directories
+
+2. inspecting and changing file attributes and directory entry details.
+   These include the time and date when the file or directory was last
+   written to, its size and various attribute flags such as read-only,
+   hidden, archive or system.                                     
+
+3. finding a file’s real name; if the file system on which it is stored
+   has to "mangle" the name into a shorter format
+
+4. getting directory listings
+
+5. maintaining a default path; unlike some other systems, there is a single
+   system default path, rather than one for each drive: the default path
+   consists of a drive and a path specification.
+
+6. performing context-sensitive parses using TParse objects, and
+   the session path
+
+7. obtaining information on drives and volumes
+
+8. formatting and labelling volumes
+
+9. obtaining a list of valid drives
+
+10. emulating the DOS subst command, which allows any directory to appear
+    as if it were a separate drive
+
+11. requesting notification of when significant change occurs.
+    This can be used for programs which maintain file lists, but must
+    update those lists when change occurs.
+
+12. finding the version number of the file server
+
+13. resource counting to ensure that all resources are closed when
+    the session terminates.
+
+This class is not intended for user derivation.
+
+The following restrictions apply when a path is specified:
+
+1. its total length must not exceed 256 characters
+
+2. wildcards cannot be used in the drive or in any directory name,
+   although they may be allowed in the filename and extension.
+
+3. double backslashes are not allowed in the path. 
+
+4. the following characters must not be included anywhere in the path: < > " / |
+
+5. a colon may only be included between the drive and path
+
+6. no directory name or filename plus extension may consist solely
+   of space characters, or of a single or double dot.
+
+7. spaces between the drive, if specified, and the first directory in
+   the path are illegal, although there may be spaces between other
+   path components, for instance between directories.
+*/
+	{
+public:
+	EFSRV_IMPORT_C TInt Connect(TInt aMessageSlots=KFileServerDefaultMessageSlots);
+	EFSRV_IMPORT_C TVersion Version() const;
+	EFSRV_IMPORT_C TInt AddFileSystem(const TDesC& aFileName) const;
+	EFSRV_IMPORT_C TInt MountFileSystem(const TDesC& aFileSystemName,TInt aDrive) const;
+	EFSRV_IMPORT_C TInt MountFileSystem(const TDesC& aFileSystemName,TInt aDrive, TBool aIsSync) const;
+	EFSRV_IMPORT_C TInt MountFileSystemAndScan(const TDesC& aFileSystemName,TInt aDrive,TBool& aIsMountSuccess) const;
+	EFSRV_IMPORT_C TInt MountFileSystem(const TDesC& aFileSystemName,const TDesC& aExtensionName,TInt aDrive);
+	EFSRV_IMPORT_C TInt MountFileSystem(const TDesC& aFileSystemName,const TDesC& aExtensionName,TInt aDrive, TBool aIsSync);
+	EFSRV_IMPORT_C TInt MountFileSystemAndScan(const TDesC& aFileSystemName,const TDesC& aExtensionName,TInt aDrive,TBool& aIsMountSuccess) const;
+	EFSRV_IMPORT_C TInt DismountFileSystem(const TDesC& aFileSystemName,TInt aDrive) const;
+	EFSRV_IMPORT_C TInt RemoveFileSystem(const TDesC& aFileSystemName) const;
+	EFSRV_IMPORT_C TInt FileSystemName(TDes& aName,TInt aDrive) const;
+	EFSRV_IMPORT_C TInt AddExtension(const TDesC& aFileName);
+	EFSRV_IMPORT_C TInt MountExtension(const TDesC& aExtensionName,TInt aDrive);
+	EFSRV_IMPORT_C TInt DismountExtension(const TDesC& aExtensionName,TInt aDrive);
+	EFSRV_IMPORT_C TInt RemoveExtension(const TDesC& aExtensionName);
+	EFSRV_IMPORT_C TInt ExtensionName(TDes& aExtensionName,TInt aDrive,TInt aPos);
+	EFSRV_IMPORT_C TInt RemountDrive(TInt aDrive,const TDesC8* aMountInfo=NULL,TUint aFlags=0);
+	EFSRV_IMPORT_C void NotifyChange(TNotifyType aType,TRequestStatus& aStat);
+	EFSRV_IMPORT_C void NotifyChange(TNotifyType aType,TRequestStatus& aStat,const TDesC& aPathName);
+	EFSRV_IMPORT_C void NotifyChangeCancel();
+	EFSRV_IMPORT_C void NotifyChangeCancel(TRequestStatus& aStat);
+	EFSRV_IMPORT_C void NotifyDiskSpace(TInt64 aThreshold,TInt aDrive,TRequestStatus& aStat);
+	EFSRV_IMPORT_C void NotifyDiskSpaceCancel(TRequestStatus& aStat);
+	EFSRV_IMPORT_C void NotifyDiskSpaceCancel();
+	EFSRV_IMPORT_C TInt DriveList(TDriveList& aList) const;
+	EFSRV_IMPORT_C TInt DriveList(TDriveList& aList, TUint aFlags) const;
+	EFSRV_IMPORT_C TInt Drive(TDriveInfo& anInfo,TInt aDrive=KDefaultDrive) const;
+    EFSRV_IMPORT_C TInt Volume(TVolumeInfo& aVol,TInt aDrive=KDefaultDrive) const;
+    EFSRV_IMPORT_C void Volume(TVolumeInfo& aVol,TInt aDrive, TRequestStatus& aStat) const;
+	EFSRV_IMPORT_C TInt SetVolumeLabel(const TDesC& aName,TInt aDrive=KDefaultDrive);
+	EFSRV_IMPORT_C TInt Subst(TDes& aPath,TInt aDrive=KDefaultDrive) const;
+	EFSRV_IMPORT_C TInt SetSubst(const TDesC& aPath,TInt aDrive=KDefaultDrive);
+	EFSRV_IMPORT_C TInt RealName(const TDesC& aName,TDes& aResult) const;
+    EFSRV_IMPORT_C TInt GetMediaSerialNumber(TMediaSerialNumber& aSerialNum, TInt aDrive);
+	EFSRV_IMPORT_C TInt SessionPath(TDes& aPath) const;
+	EFSRV_IMPORT_C TInt SetSessionPath(const TDesC& aPath);
+	EFSRV_IMPORT_C TInt Parse(const TDesC& aName,TParse& aParse) const;
+	EFSRV_IMPORT_C TInt Parse(const TDesC& aName,const TDesC& aRelated,TParse& aParse) const;
+	EFSRV_IMPORT_C TInt MkDir(const TDesC& aPath);
+	EFSRV_IMPORT_C TInt MkDirAll(const TDesC& aPath);
+	EFSRV_IMPORT_C TInt RmDir(const TDesC& aPath);
+	EFSRV_IMPORT_C TInt GetDir(const TDesC& aName,TUint anEntryAttMask,TUint anEntrySortKey,CDir*& anEntryList) const;
+	EFSRV_IMPORT_C TInt GetDir(const TDesC& aName,TUint anEntryAttMask,TUint anEntrySortKey,CDir*& anEntryList,CDir*& aDirList) const;
+	EFSRV_IMPORT_C TInt GetDir(const TDesC& aName,const TUidType& anEntryUid,TUint anEntrySortKey,CDir*& aFileList) const;
+	EFSRV_IMPORT_C TInt Delete(const TDesC& aName);
+	EFSRV_IMPORT_C TInt Rename(const TDesC& anOldName,const TDesC& aNewName);
+	EFSRV_IMPORT_C TInt Replace(const TDesC& anOldName,const TDesC& aNewName);
+	EFSRV_IMPORT_C TInt Att(const TDesC& aName,TUint& aAttValue) const;
+	EFSRV_IMPORT_C TInt SetAtt(const TDesC& aName,TUint aSetAttMask,TUint aClearAttMask);
+	EFSRV_IMPORT_C TInt Modified(const TDesC& aName,TTime& aTime) const;
+	EFSRV_IMPORT_C TInt SetModified(const TDesC& aName,const TTime& aTime);
+	EFSRV_IMPORT_C TInt Entry(const TDesC& aName,TEntry& anEntry) const;
+	EFSRV_IMPORT_C TInt SetEntry(const TDesC& aName,const TTime& aTime,TUint aSetAttMask,TUint aClearAttMask);
+	EFSRV_IMPORT_C TInt ReadFileSection(const TDesC& aName,TInt aPos,TDes8& aDes,TInt aLength) const;
+	EFSRV_IMPORT_C static TBool IsValidDrive(TInt aDrive);
+	EFSRV_IMPORT_C static TInt CharToDrive(TChar aChar,TInt& aDrive);
+	EFSRV_IMPORT_C static TInt DriveToChar(TInt aDrive,TChar& aChar);
+	EFSRV_IMPORT_C static TBool IsRomAddress(TAny* aAny);
+	EFSRV_IMPORT_C static TDriveNumber GetSystemDrive();
+	EFSRV_IMPORT_C static TChar GetSystemDriveChar();
+	EFSRV_IMPORT_C TInt SetSystemDrive(TDriveNumber aSystemDrive);
+	EFSRV_IMPORT_C void ResourceCountMarkStart() const;
+	EFSRV_IMPORT_C void ResourceCountMarkEnd() const;
+	EFSRV_IMPORT_C TInt ResourceCount() const;
+	EFSRV_IMPORT_C TInt IsFileOpen(const TDesC& aFile,TBool& anAnswer) const;
+	EFSRV_IMPORT_C TInt CheckDisk(const TDesC& aDrive) const;
+	EFSRV_IMPORT_C TInt ScanDrive(const TDesC& aDrive) const;
+	EFSRV_IMPORT_C TInt GetShortName(const TDesC& aLongName,TDes& aShortName) const;
+	EFSRV_IMPORT_C TInt GetLongName(const TDesC& aShortName,TDes& aLongName) const;
+	EFSRV_IMPORT_C TBool GetNotifyUser();
+	EFSRV_IMPORT_C void SetNotifyUser(TBool aValue);
+	EFSRV_IMPORT_C TUint8* IsFileInRom(const TDesC& aFileName) const;
+	EFSRV_IMPORT_C TBool IsValidName(const TDesC& anEntryName) const;
+	EFSRV_IMPORT_C TBool IsValidName(const TDesC& aFileName,TText& aBadChar) const;
+	EFSRV_IMPORT_C TInt GetDriveName(TInt aDrive,TDes& aDriveName) const;
+	EFSRV_IMPORT_C TInt SetDriveName(TInt aDrive,const TDesC& aDriveName);
+	EFSRV_IMPORT_C TInt LoaderHeapFunction(TInt aFunction, TAny *aArg1=NULL, TAny *aArg2=NULL);
+	EFSRV_IMPORT_C TInt SetErrorCondition(TInt anError,TInt aCount=0);
+	EFSRV_IMPORT_C TInt SetDebugRegister(TInt aVal);
+	EFSRV_IMPORT_C TInt SetAllocFailure(TInt aAllocNum);
+	EFSRV_IMPORT_C void DebugNotify(TInt aDrive,TUint aNotifyType,TRequestStatus& aStat);
+	EFSRV_IMPORT_C TInt ControlIo(TInt aDrive,TInt aCommand);
+	EFSRV_IMPORT_C TInt ControlIo(TInt aDrive,TInt aCommand,TDes8& aParam1);
+	EFSRV_IMPORT_C TInt ControlIo(TInt aDrive,TInt aCommand,TDes8& aParam1,TDes8& aParam2);
+	EFSRV_IMPORT_C TInt ControlIo(TInt aDrive,TInt aCommand,TAny* aParam1,TAny* aParam2);
+	EFSRV_IMPORT_C TInt LockDrive(TInt aDrv, const TMediaPassword &aOld, const TMediaPassword &aNew, TBool aStr);
+	EFSRV_IMPORT_C TInt UnlockDrive(TInt aDrv, const TMediaPassword &Pswd, TBool aStr);
+	EFSRV_IMPORT_C TInt ClearPassword(TInt aDrv, const TMediaPassword &aPswd);
+	EFSRV_IMPORT_C TInt ErasePassword(TInt aDrv);
+	EFSRV_IMPORT_C TInt SetSessionToPrivate(TInt aDrive);
+	EFSRV_IMPORT_C TInt PrivatePath(TDes& aPath);
+	EFSRV_IMPORT_C TInt CreatePrivatePath(TInt aDrive);	
+	EFSRV_IMPORT_C void StartupInitComplete(TRequestStatus& aStat);
+	EFSRV_IMPORT_C TInt SetLocalDriveMapping(const TDesC8& aMapping);
+
+	EFSRV_IMPORT_C TInt FinaliseDrives();
+    
+    /** specifies drive finalisation modes */
+    enum TFinaliseDrvMode
+        {
+        EFinal_RW,      ///< after successful finalisation the drive remains writable and will become "not finalised" after the first write operation.
+        EFinal_RO,      ///< after successful finalisation the drive becomes read-only
+        EForceUnfinalise///< @internalComponent  mark the drive as "not finalised" can result in KErrAbort if the dive is in inconsistent state.
+        };
+
+    EFSRV_IMPORT_C TInt FinaliseDrive(TInt aDriveNo, TFinaliseDrvMode aMode) const;
+
+	EFSRV_IMPORT_C TInt SwapFileSystem(const TDesC& aOldFileSystemName,const TDesC& aNewFileSystemName,TInt aDrive) const;
+	EFSRV_IMPORT_C TInt ReserveDriveSpace(TInt aDriveNo, TInt aSpace);
+	EFSRV_IMPORT_C TInt GetReserveAccess(TInt aDriveNo);
+	EFSRV_IMPORT_C TInt ReleaseReserveAccess(TInt aDriveNo);
+
+	EFSRV_IMPORT_C TInt AddPlugin(const TDesC& aFileName) const;
+	EFSRV_IMPORT_C TInt RemovePlugin(const TDesC& aPluginName) const;
+	EFSRV_IMPORT_C TInt PluginName(TDes& aPluginName,TInt aDrive,TInt aPos);
+
+	EFSRV_IMPORT_C TInt MountPlugin(const TDesC& aPluginName) const;
+	EFSRV_IMPORT_C TInt MountPlugin(const TDesC& aPluginName,TInt aDrive) const;
+	EFSRV_IMPORT_C TInt MountPlugin(const TDesC& aPluginName,TInt aDrive, TInt aPos) const;
+	
+	EFSRV_IMPORT_C TInt DismountPlugin(const TDesC& aPluginName) const;
+	EFSRV_IMPORT_C TInt DismountPlugin(const TDesC& aPluginName,TInt aDrive) const;
+	EFSRV_IMPORT_C TInt DismountPlugin(const TDesC& aPluginName,TInt aDrive,TInt aPos) const;
+
+	EFSRV_IMPORT_C void NotifyDismount(TInt aDrive, TRequestStatus& aStat, TNotifyDismountMode aMode=EFsDismountRegisterClient) const;
+	EFSRV_IMPORT_C void NotifyDismountCancel(TRequestStatus& aStat) const;
+	EFSRV_IMPORT_C void NotifyDismountCancel() const;
+	EFSRV_IMPORT_C TInt AllowDismount(TInt aDrive) const;
+    EFSRV_IMPORT_C TInt SetStartupConfiguration(TInt aCommand,TAny* aParam1,TAny* aParam2) const;
+	EFSRV_IMPORT_C TInt AddCompositeMount(const TDesC& aFileSystemName,TInt aLocalDriveToMount,TInt aCompositeDrive, TBool aSync) const;
+	EFSRV_IMPORT_C TInt SetNotifyChange(TBool aNotifyChange);
+	EFSRV_IMPORT_C TInt QueryVolumeInfoExt(TInt aDrive, TQueryVolumeInfoExtCmd aCommand, TDes8& aInfo) const;
+	EFSRV_IMPORT_C TInt VolumeIOParam(TInt aDriveNo, TVolumeIOParamInfo& aParamInfo) const;
+	EFSRV_IMPORT_C TInt FileSystemSubType(TInt aDriveNo, TDes& aName) const;
+	EFSRV_IMPORT_C TInt InitialisePropertiesFile(const TPtrC8& aPtr) const;
+	
+	IMPORT_C TInt AddProxyDrive(const TDesC& aFileName);
+	IMPORT_C TInt RemoveProxyDrive(const TDesC& aDriveName);
+	
+	template <class T0,class T1> inline TInt MountProxyDrive(const TUint aDrive, const TDesC& aName, T0 a0, T1 a1)
+		{ return(DoMountProxyDrive(TIpcArgs(aDrive, &aName, a0, a1))); };
+	IMPORT_C TInt DismountProxyDrive(const TUint aDrive);
+	
+	TInt Unclamp(const RFileClamp& aHandle);
+	EFSRV_IMPORT_C void Close();
+protected:
+	TInt SendReceive(TInt aFunction,const TIpcArgs& aArgs) const;
+
+private:
+	void GetDirL(const TDesC& aMatchName,TUint anEntryAttMask,TUint anEntrySortKey,CDir*& anEntryList,CDir*& aDirList,RDir& aDir) const;
+	void GetDirL(const TDesC& aMatchName,TUint anEntryAttMask,TUint anEntrySortKey,CDir*& anEntryList,RDir& aDir) const;
+	void GetDirL(const TDesC& aMatchName,const TUidType& aUidType,TUint anEntrySortKey,CDir*& anEntryList,RDir& aDir) const;
+	void DoGetDirL(TUint anEntrySortKey,CDir*& anEntryList,RDir& aDir) const;
+	TInt GetOpenFileList(TInt& aSessionNum,TInt& aLocalPos,TThreadId& aThreadId,TEntryArray& anArray) const;
+	
+	IMPORT_C TInt DoMountProxyDrive(const TIpcArgs& ipcArgs);
+	
+	friend class TOpenFileScan;
+	friend class RFsPlugin;
+	};
+
+
+
+
+
+
+
+/**
+@publishedAll
+@released
+
+Creates and opens a file, and performs all operations on a single open file.
+
+These include:
+
+- reading from and writing to the file
+
+- seeking to a position within the file
+
+- locking and unlocking within the file
+
+- setting file attributes
+
+Before using any of these services, a connection to a file server session must
+have been made, and the file must be open.
+
+Opening Files:
+
+-  use Open() to open an existing file for reading or writing; an error is
+   returned if it does not already exist.
+   To open an existing file for reading only, use Open() with an access mode of
+   EFileRead, and a share mode of EFileShareReadersOnly.
+
+-  use Create() to create and open a new file for writing; an error is returned
+   if it already exists.
+
+-  use Replace() to open a file for writing, replacing any existing file of
+   the same name if one exists, or creating a new file if one does not exist.
+   Note that if a file exists, its length is reset to zero.
+
+-  use Temp() to create and open a temporary file with a unique name,
+   for writing and reading.
+
+When opening a file, you must specify the file server session to use for
+operations with that file. If you do not close the file explicitly, it is
+closed when the server session associated with it is closed.
+
+Reading and Writing:
+
+There are several variants of both Read() and Write().
+The basic Read(TDes8& aDes) and Write(const TDesC8& aDes) are supplemented
+by variants allowing the descriptor length to be overridden, or the seek
+position of the first byte to be specified, or asynchronous completion,
+or any combination.
+
+Reading transfers data from a file to a descriptor, and writing transfers
+data from a descriptor to a file. In all cases, the file data is treated
+as binary and byte descriptors are used (TDes8, TDesC8).
+
+@see TDes8
+@see TDesC8
+*/
+class RFile : public RSubSessionBase
+	{
+public:
+	EFSRV_IMPORT_C TInt Open(RFs& aFs,const TDesC& aName,TUint aFileMode);
+	EFSRV_IMPORT_C void Close();
+	EFSRV_IMPORT_C TInt Create(RFs& aFs,const TDesC& aName,TUint aFileMode);
+	EFSRV_IMPORT_C TInt Replace(RFs& aFs,const TDesC& aName,TUint aFileMode);
+	EFSRV_IMPORT_C TInt Temp(RFs& aFs,const TDesC& aPath,TFileName& aName,TUint aFileMode);
+	EFSRV_IMPORT_C TInt Read(TDes8& aDes) const;
+	EFSRV_IMPORT_C void Read(TDes8& aDes,TRequestStatus& aStatus) const;
+	EFSRV_IMPORT_C TInt Read(TDes8& aDes,TInt aLength) const;
+	EFSRV_IMPORT_C void Read(TDes8& aDes,TInt aLength,TRequestStatus& aStatus) const;
+	EFSRV_IMPORT_C TInt Read(TInt aPos,TDes8& aDes) const;
+	EFSRV_IMPORT_C void Read(TInt aPos,TDes8& aDes,TRequestStatus& aStatus) const;
+	EFSRV_IMPORT_C TInt Read(TInt aPos,TDes8& aDes,TInt aLength) const;
+	EFSRV_IMPORT_C void Read(TInt aPos,TDes8& aDes,TInt aLength,TRequestStatus& aStatus) const;
+	EFSRV_IMPORT_C void ReadCancel(TRequestStatus& aStatus) const;
+	EFSRV_IMPORT_C void ReadCancel() const;
+	EFSRV_IMPORT_C TInt Write(const TDesC8& aDes);
+	EFSRV_IMPORT_C void Write(const TDesC8& aDes,TRequestStatus& aStatus);
+	EFSRV_IMPORT_C TInt Write(const TDesC8& aDes,TInt aLength);
+	EFSRV_IMPORT_C void Write(const TDesC8& aDes,TInt aLength,TRequestStatus& aStatus);
+	EFSRV_IMPORT_C TInt Write(TInt aPos,const TDesC8& aDes);
+	EFSRV_IMPORT_C void Write(TInt aPos,const TDesC8& aDes,TRequestStatus& aStatus);
+	EFSRV_IMPORT_C TInt Write(TInt aPos,const TDesC8& aDes,TInt aLength);
+	EFSRV_IMPORT_C void Write(TInt aPos,const TDesC8& aDes,TInt aLength,TRequestStatus& aStatus);
+	EFSRV_IMPORT_C TInt Lock(TInt aPos,TInt aLength) const;
+	EFSRV_IMPORT_C TInt UnLock(TInt aPos,TInt aLength) const;
+	EFSRV_IMPORT_C TInt Seek(TSeek aMode,TInt& aPos) const;
+	EFSRV_IMPORT_C TInt Flush();
+	EFSRV_IMPORT_C void Flush(TRequestStatus& aStatus);
+	EFSRV_IMPORT_C TInt Size(TInt& aSize) const;
+	EFSRV_IMPORT_C TInt SetSize(TInt aSize);
+	EFSRV_IMPORT_C TInt Att(TUint& aAttValue) const;
+	EFSRV_IMPORT_C TInt SetAtt(TUint aSetAttMask,TUint aClearAttMask);
+	EFSRV_IMPORT_C TInt Modified(TTime& aTime) const;
+	EFSRV_IMPORT_C TInt SetModified(const TTime& aTime);
+	EFSRV_IMPORT_C TInt Set(const TTime& aTime,TUint aSetAttMask,TUint aClearAttMask);
+	EFSRV_IMPORT_C TInt ChangeMode(TFileMode aNewMode);
+	EFSRV_IMPORT_C TInt Rename(const TDesC& aNewName);
+	EFSRV_IMPORT_C TInt Drive(TInt &aDriveNumber, TDriveInfo &aDriveInfo) const;
+	EFSRV_IMPORT_C TInt Adopt(RFs& aFs, TInt aHandle);
+	EFSRV_IMPORT_C TInt AdoptFromClient(const RMessage2& aMsg, TInt aFsHandleIndex, TInt aFileHandleIndex);
+	EFSRV_IMPORT_C TInt AdoptFromServer(TInt aFsHandle, TInt aFileHandle);
+	EFSRV_IMPORT_C TInt AdoptFromCreator(TInt aFsIndex, TInt aFileHandleIndex);
+	EFSRV_IMPORT_C TInt Name(TDes& aName) const;
+	EFSRV_IMPORT_C TInt TransferToServer(TIpcArgs& aIpcArgs, TInt aFsHandleIndex, TInt aFileHandleIndex) const;
+	EFSRV_IMPORT_C TInt TransferToClient(const RMessage2& aMsg, TInt aFileHandleIndex) const;
+	EFSRV_IMPORT_C TInt TransferToProcess(RProcess& aProcess, TInt aFsHandleIndex, TInt aFileHandleIndex) const;
+	EFSRV_IMPORT_C TInt Duplicate(const RFile& aFile, TOwnerType aType=EOwnerProcess);
+	EFSRV_IMPORT_C TInt FullName(TDes& aName) const;
+	EFSRV_IMPORT_C TInt BlockMap(SBlockMapInfo& aInfo, TInt64& aStartPos, TInt64 aEndPos=-1, TInt aBlockMapusage=EBlockMapUsagePaging) const;
+	TInt Clamp(RFileClamp& aHandle);
+
+protected:
+	// RSubSessionBase overrides
+	TInt CreateSubSession(const RSessionBase& aSession,TInt aFunction,const TIpcArgs& aArgs);
+	void CloseSubSession(TInt aFunction);
+	TInt SendReceive(TInt aFunction,const TIpcArgs& aArgs) const;
+
+	TInt DuplicateHandle(TInt& aSubSessionHandle) const;
+
+	friend class RFilePlugin;
+	};
+
+
+
+class RDir : public RSubSessionBase
+/**
+@publishedAll
+@released
+
+Reads the entries contained in a directory.
+
+You must first open the directory, specifying an attribute mask which is used
+by Read() calls to filter the entry types required. Then, use one of
+the Read() functions to read the filtered entries. When the operation
+is complete, the directory should be closed using Close()
+
+There are two types of Read(): one works with a single entry at a time,
+requiring programs to iterate through the entries explicitly.
+The other works with an entire TEntryArray, allowing multiple entries to be
+read in one call.
+As well as making application program logic somewhat simpler, this type
+uses fewer calls to the server, and is more efficient.
+
+Each type of Read() can be performed either synchronously or asynchronously.
+
+It may be more convenient to use RFs::GetDir() than the Read() calls supported
+by this class.
+RFs::GetDir() has the advantage that it allows a directory’s entries to be
+sorted in various ways.
+However, it does not provide asynchronous as well as synchronous variants
+and does not allow entries to be read individually.
+
+@see RFs
+*/
+	{
+public:
+	EFSRV_IMPORT_C TInt Open(RFs& aFs,const TDesC& aMatchName,const TUidType& aUidType);
+	EFSRV_IMPORT_C TInt Open(RFs& aFs,const TDesC& aMatchName,TUint anAttMask);
+	EFSRV_IMPORT_C void Close();
+	EFSRV_IMPORT_C TInt Read(TEntryArray& anArray) const;
+	EFSRV_IMPORT_C void Read(TEntryArray& anArray,TRequestStatus& aStatus) const;
+	EFSRV_IMPORT_C TInt Read(TEntry& anEntry) const;
+	EFSRV_IMPORT_C void Read(TPckg<TEntry>& anEntry,TRequestStatus& aStatus) const;
+
+private:
+	// RSubSessionBase overrides
+	TInt SendReceive(TInt aFunction,const TIpcArgs& aArgs) const;
+
+	friend class RDirPlugin;
+	};
+
+
+class RFormat : public RSubSessionBase
+/**
+@publishedAll
+@released
+
+Formats a device, one step at a time. 
+
+RFormat must first be opened on a device before formatting each
+track using Next().
+
+There is also an asynchronous version of Next() which, if encapsulated into
+a suitable active object, can be used to implement a
+user-interruptible formatting process.
+*/
+	{
+public:
+	IMPORT_C TInt Open(RFs& aFs,const TDesC& aName,TUint aFormatMode,TInt& aCount);
+	IMPORT_C TInt Open(RFs& aFs,const TDesC& aName,TUint aFormatMode,TInt& aCount,const TDesC8& anInfo);
+	IMPORT_C void Close();
+	IMPORT_C TInt Next(TInt& aStep);
+	IMPORT_C void Next(TPckgBuf<TInt>& aStep,TRequestStatus& aStatus);
+	};
+
+
+
+
+class RRawDisk : public RSubSessionBase
+/**
+@publishedAll
+@released
+
+Enables direct disk access.
+
+No other resources can access the disk while direct access to it is in effect.
+
+This class is not intended for user derivation.
+*/
+	{
+public:
+	IMPORT_C TInt Open(RFs& aFs,TInt aDrive);
+	IMPORT_C void Close();
+	IMPORT_C TInt Read(TInt64 aPos,TDes8& aDes);
+	IMPORT_C TInt Write(TInt64 aPos,TDesC8& aDes);
+	IMPORT_C TInt Caps(TDes8& aCaps);
+private:
+	TInt iDrive;
+	};
+
+
+
+
+class CDirStack;
+NONSHARABLE_CLASS(CDirScan) : public CBase
+/**
+@publishedAll
+@released
+
+Scans a directory structure.
+
+The scan moves from directory to directory through the hierarchy, returning
+a list of the entries contained in each. The order in which the directories
+are scanned is determined by a sort key which is specified when setting up
+the scan. The base directory to be scanned and the entry types of interest
+must also be specified before performing the scan.
+
+This class is not intended for user derivation
+*/
+    {
+public:
+    /**
+    Defines the scan direction.
+    */
+	enum TScanDirection
+		{
+		/**
+		Scan upwards from the lowest level directory in the hierarchy to
+		the top level directory.
+		*/
+		EScanUpTree,
+		
+		/**
+		Scan downwards from the top level directory in the hierarchy to
+		the bottom level directory.
+		*/
+		EScanDownTree
+		};
+public:
+	IMPORT_C static CDirScan* NewL(RFs& aFs);
+	IMPORT_C static CDirScan* NewLC(RFs& aFs);
+	IMPORT_C ~CDirScan();
+	IMPORT_C void SetScanDataL(const TDesC& aMatchName,TUint anEntryAttMask,TUint anEntrySortMask,TScanDirection aScanDir=EScanDownTree);
+	IMPORT_C void NextL(CDir*& aDirEntries);
+	IMPORT_C TPtrC AbbreviatedPath();
+	IMPORT_C TPtrC FullPath();
+protected:
+	CDirScan(RFs& aFs);
+private:
+	inline RFs& Fs();
+	void UpdateAbbreviatedPath();
+	void ScanUpTreeL(CDir*& aDirEntries);
+	void ScanDownTreeL(CDir*& aDirEntries);
+	void GetDirEntriesL(CDir*& aDirEntries);
+private:
+	RFs* const iFs;
+	TParse iFullPath;
+	TPtrC iAbbreviatedPath;
+	TInt iAbbreviatedPathPos;
+	TUint iEntryAttMask;
+	TUint iEntrySortMask;
+	TBool iScanning;
+	TScanDirection iScanDir;
+	CDirStack* iStack;
+	};
+
+
+
+
+enum TFileManError
+/**
+@publishedAll
+@released
+
+A list of CFileMan error codes.
+
+@see CFileMan
+*/
+	{
+	/**
+	No additional error information is available, either because
+	the latest CFileMan operation did not return an error, or if it did,
+	the error was not one for which additional information is available.
+	*/
+	ENoExtraInformation,
+
+
+	/**
+	A leave occurred while setting up the initial scan.
+	
+	This indicates that the operation did not begin.
+	
+	@see CDirScan.
+    */
+	EInitializationFailed,
+
+
+	/**
+	A leave occurred while scanning the next directory in the course of a file
+	management function.
+	
+	This indicates that the operation did begin.
+	
+	@see CDirScan.
+	*/
+	EScanNextDirectoryFailed,
+
+
+	/**
+	Error occurred when attempting to open the source file for a file copy
+	or move.
+	*/
+	ESrcOpenFailed,
+
+
+	/**
+	Error occurred while attempting to create, or, if overwriting is in effect,
+	replace the target file for a file copy or move.
+	*/
+	ETrgOpenFailed,
+
+
+	/**
+	The operation completed without processing any files because no matching
+	files were found.
+	*/
+	ENoFilesProcessed
+	};
+
+
+
+
+class MFileManObserver
+/**
+@publishedAll
+@released
+
+Provides notification of the progress of synchronous or asynchronous
+file management operations.
+
+It should be inherited by classes which implement this protocol.
+
+The enquiry functions provided by CFileBase and CFileMan may be used by
+the observer to display information about the progress of the operation
+such as error messages, the names of the target and destination files,
+and the number of bytes transferred during a copy operation.
+Notification may take place before or after an entry has been processed,
+or during a file copy or move.
+Each notification function returns a value which can be used to enable
+the user to control the progress of the operation, for example to cancel
+a long-running multiple file copy.
+To use this class, pass a pointer to an instance of the class to
+the CFileMan constructor, or use SetObserver(), defined in CFileBase.
+*/
+	{
+public:
+    /**
+    Control for the current CFileMan operation.
+    */
+	enum TControl
+		{
+		/**
+		Proceed with the current or the next entry.
+		*/
+		EContinue,
+
+
+		/**
+		Retry processing the previous entry.
+		*/
+		ERetry,
+
+
+		/**
+		Abort operation, causes function to return KErrCancel.
+		*/
+		EAbort,
+		
+
+		/**
+		Cancel processing the current entry.
+		*/
+		ECancel
+		};
+public:
+	IMPORT_C virtual TControl NotifyFileManStarted();
+	IMPORT_C virtual TControl NotifyFileManOperation();
+	IMPORT_C virtual TControl NotifyFileManEnded();
+	};
+
+
+
+
+class CFileBase : public CBase
+/**
+@publishedAll
+@released
+
+Abstract base class for file management.
+
+It provides functions to set an observer for the derived class
+CFileMan, and to get information about the entry being processed.
+
+@see CFileMan
+*/
+	{
+public:
+	IMPORT_C void SetObserver(MFileManObserver* anObserver);
+public:
+	IMPORT_C const TEntry& CurrentEntry();
+	IMPORT_C TPtrC AbbreviatedPath();
+	IMPORT_C TPtrC FullPath();
+	IMPORT_C TInt GetLastError();
+	IMPORT_C TFileManError GetMoreInfoAboutError();
+protected:
+	IMPORT_C CFileBase(RFs& anFs);
+	IMPORT_C void ConstructL();
+	IMPORT_C ~CFileBase();
+	IMPORT_C void RunL();
+	IMPORT_C void RunInSeparateThreadL(TThreadFunction aThreadFunction);
+// virtual
+    /**
+    Called from RunL to perform tidy up after an operation.
+    
+    @see CFileMan
+    @see CFileBase::RunL
+    */
+	virtual void CompleteOperationL() {};
+	
+//pure virtual
+	/**
+	Called from RunL to perform the requested operation.
+	
+	@see CFileMan
+	@see CFileBase::RunL
+	*/
+	virtual void DoOperationL() = 0;
+protected:
+	RFs iFs;
+	RFs iFsOld;
+	RThread iFManThread;
+	RSemaphore iSynchronizer;
+	CDirScan* iScanner;
+	CDir* iDirList;
+	TInt iCurrentEntry;
+	TUint iMatchEntry;
+	TUint iSwitches;
+	TParse iSrcFile;
+	MFileManObserver* iObserver;
+	TInt iLastError;
+	TFileManError iErrorInfo;
+	TRequestStatus* iStatus;
+	HBufC* iSessionPath;
+	TInt iNumberOfFilesProcessed;
+
+
+
+
+friend void DoFManBaseOperationL(TAny* aPtr);
+friend TInt FManBaseThreadFunction(TAny* aPtr);
+	};
+
+
+
+
+NONSHARABLE_CLASS(CFileMan) : public CFileBase
+/**
+@publishedAll
+@released
+
+Offers file management services which accept the use of wildcards;
+synchronous and asynchronous.
+
+It also provides enquiry functions, which, like those provided by
+the base class CFileBase, may be used by an observer class object
+to provide the user with information about the progress of the operation.
+
+All of the file management functions provided by this class accept the use of
+wildcards, and may operate either synchronously or asynchronously.
+When CFileMan is operating asynchronously, the operation takes place in
+a separate thread from the calling code.
+
+A file notification observer (an instance of a class deriving
+from MFileManObserver) may optionally be used by CFileMan when operating
+synchronously or asynchronously. If provided, the appropriate notification
+function is called before or after each entry has been processed,
+or during a file copy or move.
+This notification can be used to provide information about the state of
+the operation, such as the number of bytes transferred during a
+large-scale file copy. It can also be used to allow the user to cancel,
+retry or continue processing an entry, or to abort the whole operation.
+If such notification is required, specify an object deriving from
+MFileManObserver class in the constructor, or call SetObserver(),
+defined in the base class, CFileBase.
+
+All of the file manipulation functions except Rename() may operate recursively,
+and all can operate non-recursively. When operating recursively,
+these functions will act on all matching files located throughout
+the source directory’s hierarchy. When operating non-recursively,
+these functions act upon files contained in the single top level source
+directory only. Recursion is set or unset using the switch parameter to
+these functions.
+
+This class is not intended for user derivation.
+
+@see MFileManObserver
+*/
+	{
+public:
+    /**
+    An enumeration that identifies CFileMan tasks. This enumeration is used
+    by CurrentAction() to identify which task currently being carried out.
+
+	@see CFileMan::CurrentAction
+    */
+	enum TAction
+		{
+		/**
+		Inactive
+		*/
+		ENone,
+
+
+		/**
+		Setting attributes
+		*/
+		EAttribs,
+		
+		
+		/**
+		Copying files
+		*/
+		ECopy,
+		
+		
+		/**
+		Deleting files
+		*/
+		EDelete,
+		
+		
+		/**
+		Moving files
+		*/
+		EMove,
+		
+		
+		/**
+		Renaming files
+		*/
+		ERename,
+		
+		
+		/**
+		Deleting a directory and all contents
+		*/
+		ERmDir,
+		
+		
+		/**
+		Renaming component to VFAT short name (guaranteed to be unique)
+		*/
+		ERenameInvalidEntry,
+
+		/**
+		Copying file from open file handle
+		*/
+		ECopyFromHandle,
+		};
+		
+		
+	/**
+	Overwriting and recursion switch.
+	
+	Used in CFileMan functions to set whether operations are applied to
+	the specified directory and all directories below it, or
+	the specified directory only. 
+	*/	
+	enum TSwitch
+		{
+		/**
+		Any files in the destination directory that have the same name as
+		the source files in a rename, move or copy operation, will
+		be overwritten.
+		*/
+		EOverWrite=1,
+		
+		
+		/**
+		Recursive operation.
+		*/
+		ERecurse=2
+		};
+public:
+	IMPORT_C static CFileMan* NewL(RFs& aFs);
+	IMPORT_C static CFileMan* NewL(RFs& aFs,MFileManObserver* anObserver);
+	~CFileMan();
+	IMPORT_C TAction CurrentAction();
+	IMPORT_C void GetCurrentTarget(TFileName& aFile);
+	IMPORT_C void GetCurrentSource(TFileName& aFile);
+	IMPORT_C TInt BytesTransferredByCopyStep();
+public:
+	IMPORT_C TInt Attribs(const TDesC& aName,TUint aSetMask,TUint aClearMask,const TTime& aTime,TUint aSwitch=0);
+	IMPORT_C TInt Attribs(const TDesC& aName,TUint aSetMask,TUint aClearMask,const TTime& aTime,TUint aSwitch,TRequestStatus& aStatus);
+	IMPORT_C TInt Copy(const TDesC& anOld,const TDesC& aNew,TUint aSwitch=EOverWrite);
+	IMPORT_C TInt Copy(const TDesC& anOld,const TDesC& aNew,TUint aSwitch,TRequestStatus& aStatus);
+	IMPORT_C TInt Delete(const TDesC& aName,TUint aSwitch=0);
+	IMPORT_C TInt Delete(const TDesC& aName,TUint aSwitch,TRequestStatus& aStatus);
+	IMPORT_C TInt Move(const TDesC& anOld,const TDesC& aNew,TUint aSwitch=EOverWrite);
+	IMPORT_C TInt Move(const TDesC& anOld,const TDesC& aNew,TUint aSwitch,TRequestStatus& aStatus);
+	IMPORT_C TInt Rename(const TDesC& anOld,const TDesC& aNew,TUint aSwitch=EOverWrite);
+	IMPORT_C TInt Rename(const TDesC& anOld,const TDesC& aNew,TUint aSwitch,TRequestStatus& aStatus);
+	IMPORT_C TInt RmDir(const TDesC& aDirName);
+	IMPORT_C TInt RmDir(const TDesC& aDirName,TRequestStatus& aStatus);
+	IMPORT_C TInt Copy(const RFile& anOld,const TDesC& aNew,TUint aSwitches=EOverWrite);
+	IMPORT_C TInt Copy(const RFile& anOld,const TDesC& aNew,TUint aSwitches,TRequestStatus& aStatus);
+protected:
+	CFileMan(RFs& aFs);
+	TInt RenameInvalidEntry(const TDesC& anOld,const TDesC& aNew,TUint aSwitch=EOverWrite);
+private:
+	/**
+	This is an internal enumeration for CFileMan implementation. 
+	THis enumeration is mapped into TAction when user wants to identify the current
+	task of CFileMan by CurrentAction().
+
+	@see CFileMan::TAction
+	@see CFileMan::CurrentAction
+    */	
+	enum TInternalAction
+		{
+		/**
+		Internal indicator for None operation.
+		This is mapped to CFileMan::ENone.
+		*/
+		EInternalNone,
+		
+		/**
+		Internal indicator for Attribs() operation.
+		This is mapped to CFileMan::EAttribs.
+		*/
+		EInternalAttribs,
+		
+		/**
+		Internal indicator for Copy() operation.
+		This is mapped to CFileMan::ECopy.
+		*/
+		EInternalCopy,
+		
+		/**
+		Internal indicator for Delete() operation.
+		This is mapped to CFileMan::EDelete.
+		*/
+		EInternalDelete,
+		
+		/**
+		Internal indicator for Move() operation on different drives.
+		This is mapped to CFileMan::Move.
+		*/
+		EInternalCopyForMove,
+		
+		/**
+		Internal indicator for Move() operation on the same drive.
+		This is mapped to CFileMan::Rename.
+		Note for compatibility reasons, it is not mapped to CFileMan::Move.
+		*/
+		EInternalRenameForMove,
+		
+		/**
+		Internal indicator for Rename() operation.
+		This is mapped to CFileMan::ERename.
+		*/
+		EInternalRename,
+		
+		/**
+		Internal indicator for RmDir() operation.
+		This is mapped to CFileMan::ERmDir.
+		*/
+		EInternalRmDir,
+		
+		/**
+		Internal indicator for RenameInvalidEntry() operation.
+		This is mapped to CFileMan::ERenameInvalidEntry.
+		*/
+		EInternalRenameInvalidEntry,
+		
+		/**
+		Internal indicator for CopyFromHandle() operation.
+		This is mapped to CFileMan::ECopyFromHandle.
+		*/
+		EInternalCopyFromHandle,
+		};
+
+	void CompleteOperationL();
+	void DoOperationL();
+	void CheckForDirectory();
+	void SetFlags(TBool aOverWrite,TBool aRecurse,TBool aScanDirection,TBool aMoveRename);
+	void GetSrcAndTrg(TParse& aSrcName,TFileName& aTrgName);
+	void DoSynchronize(TInt aRetVal);
+	TInt CheckRenameAllowed(const TDesC& aSrcName,const TDesC& aTrgName);
+	TInt SetupMoveOnSameDrive(TUint aSwitches, TBool& aComplete);
+	TInt SetupMoveAcrossDrives(TUint aSwitches);
+	TInt SetupTargetDirectory(TBool aOverWrite, TBool& aComplete);
+	TBool SrcTrgDrivesIdentical();
+	TBool SetupDirectoryForMove();
+private:
+	void DoAttribsL();
+	void DoCopyOrMoveL();
+	void DoDeleteL();
+	void DoRenameL();
+	void DoRmDirL();
+	void DoCopyFromHandleL();
+	TInt DoCopy(const RFile& aSrcFile, RFile& aDstFile, TInt& aRet);
+private:
+	TParse iTrgFile;
+	TInternalAction iAction;
+	TUint iSetMask;
+	TUint iClearMask;
+	TTime iTime;
+	TInt iBytesTransferred;
+	RFile iSrcFileHandle;
+	TBool iMovingContents;
+	TEntry iTmpEntry;
+	TParse iTmpParse;
+	TFileName iTmpName1;
+	TFileName iTmpName2;
+
+friend void RenameInvalidEntryL(RFs& aFs,TParse& aSrcFile);
+	};
+
+
+
+
+class TFindFile
+/**
+@publishedAll
+@released
+
+Searches for files and directories.
+
+Each function has a variant which searches for multiple files/directories,
+using one or more wildcard characters in the filename.
+If an initial search is successful, further searches can be carried out
+using Find() or FindWild().
+You can also retrieve the fully qualified file specification,
+and manipulate and interrogate it using the TParse class (or related classes).
+
+Note that when specifying the path of a directory to search, the path should
+always end with a backslash character.When trailing backslash is not present 
+then it is considered as file. And path will be taken till last backslash.
+The client must have appropriate capabilities for the directory to be searched. 
+For example without ALL FILES Capability, it is not possible to successfully 
+find any files under \sys\bin directory.
+
+By default if the file is not found in the current drive the rest of the drives,
+excluding the remote ones, will be searched. Using function SetFindMask it is 
+possible to specify a combination of drive attributes(aMask) that the drives to 
+be searched must match.  
+ 
+*/
+	{
+public:
+	IMPORT_C TFindFile(RFs& aFs);
+	IMPORT_C TInt FindByPath(const TDesC& aFileName,const TDesC* aPathList);
+	IMPORT_C TInt FindByDir(const TDesC& aFileName,const TDesC& aDirPath);
+	IMPORT_C TInt Find();
+	IMPORT_C TInt FindWildByPath(const TDesC& aFileName,const TDesC* aPathList,CDir*& aDirList);
+	IMPORT_C TInt FindWildByDir(const TDesC& aFileName,const TDesC& aDirPath,CDir*& aDir);
+	IMPORT_C TInt FindWild(CDir*& aDirList);
+	IMPORT_C TInt SetFindMask(TUint aMask);
+	inline const TDesC& File() const;
+private:
+	TInt DoFind();
+	TInt DoFindByPath(const TDesC& aFileName,const TDesC* aPathList);
+	TInt DoFindByDir(const TDesC& aFileName,const TDesC& aDir);
+	TInt DoFindInDir();
+	TInt DoFindNextInPath();
+	TInt DoFindNextInDriveList();
+private:
+	RFs* const iFs;
+	TParse iFile;
+	TInt iPathPos;
+	TInt iCurrentDrive;
+	TInt iMode;
+	const TDesC* iPath;
+	TDriveList iDrvList;
+	CDir** iDir;
+	TUint32 iMatchMask;	
+	};
+
+
+
+
+/**
+@publishedAll
+@released
+
+Contains a list of entries for the files which were opened in
+a file server session.
+
+@see CDir
+*/
+typedef CDir CFileList;
+
+
+
+
+class TOpenFileScan
+/**
+@publishedAll
+@released
+
+Scans open files to get a list of the entries for all files which are currently
+open in a particular file server session.
+
+NextL() creates a list of the files opened by the session.
+The ID of the thread which opened the files listed may be obtained by calling ThreadId().
+If multiple sessions are in use, repeatedly calling NextL() will return a list
+of open files in each session.
+*/
+	{
+public:
+	IMPORT_C TOpenFileScan(RFs& aFs);
+	IMPORT_C void NextL(CFileList*& aFileList);
+	IMPORT_C TThreadId ThreadId() const;
+private:
+	RFs* iFs;
+	TThreadId iThreadId;
+	TInt iScanPos;
+	TInt iEntryListPos;
+	};
+
+
+
+
+class TFileText
+/**
+@publishedAll
+@released
+
+Reads and writes single lines of text to or from a Unicode file.
+*/
+	{
+public:
+    /**
+    @internalComponent
+    */
+	enum TFileState
+		{
+		EStartOfFile,
+		ENormal,
+		EReverse
+		};
+public:
+	IMPORT_C TFileText();
+	IMPORT_C void Set(RFile& aFile);
+	IMPORT_C TInt Read(TDes& aDes);
+	IMPORT_C TInt Write(const TDesC& aDes);
+	IMPORT_C TInt Seek(TSeek aMode);
+private:
+	void NextRecord();
+	TInt CheckForTerminator(TBool& anAnswer);
+	TInt FillBuffer();
+private:
+	const TText* iNext;
+	const TText* iEnd;
+	TFileState iState;
+	RFile iFile;
+	TBuf8<0x100> iReadBuf; 
+	};
+
+
+
+
+/**
+@publishedAll
+@released
+*/
+IMPORT_C TBool FileNamesIdentical(const TDesC& aFileName1,const TDesC& aFileName2);
+
+
+
+/**
+Local drive mapping list - passed as argument to RFs::SetLocalDriveMapping().
+
+@publishedPartner
+@released
+*/
+class TLocalDriveMappingInfo
+	{
+public:
+	enum TDrvMapOperation {EWriteMappingsAndSet=0,EWriteMappingsNoSet=1,ESwapIntMappingAndSet=2};	
+public:
+	TInt iDriveMapping[KMaxLocalDrives];
+	TDrvMapOperation iOperation;
+    };
+typedef TPckgBuf<TLocalDriveMappingInfo> TLocalDriveMappingInfoBuf;
+
+/**
+Client side plugin API.
+
+@publishedPartner
+@released
+*/
+class RPlugin : public RSubSessionBase
+	{
+public:
+	IMPORT_C TInt Open(RFs& aFs, TInt aPos);
+	IMPORT_C void Close();
+protected:
+	IMPORT_C void DoRequest(TInt aReqNo,TRequestStatus& aStatus) const;
+	IMPORT_C void DoRequest(TInt aReqNo,TRequestStatus& aStatus,TDes8& a1) const;
+	IMPORT_C void DoRequest(TInt aReqNo,TRequestStatus& aStatus,TDes8& a1,TDes8& a2) const;
+	IMPORT_C TInt DoControl(TInt aFunction) const;
+	IMPORT_C TInt DoControl(TInt aFunction,TDes8& a1) const;
+	IMPORT_C TInt DoControl(TInt aFunction,TDes8& a1,TDes8& a2) const;
+	IMPORT_C void DoCancel(TUint aReqMask) const;
+	};
+
+/**
+@publishedPartner
+@released
+
+Specifies that a plugin should determine for itself which drives it attaches to.
+
+@see RFs::MountPlugin
+@see RFs::DismountPlugin
+*/
+const TInt KPluginAutoAttach = 0x19;
+
+/**
+@publishedPartner
+@released
+
+Specifies that a plugin should mount on drive Z.
+
+@see RFs::MountPlugin
+@see RFs::DismountPlugin
+*/
+const TInt KPluginMountDriveZ = 0x1A;
+
+
+/**
+@publishedPartner
+@released
+
+Specifies that a plugin should be mounted on all drives.
+
+@see RFs::MountPlugin
+@see RFs::DismountPlugin
+*/
+const TInt KPluginSupportAllDrives = 0x3FFFFFF; //All 26 bits (each corrosponding to a drive) are set to one.
+
+/**
+@publishedPartner
+@released
+
+Used to determine if a plugin is of version 2, meaning it can support drive Z.
+
+*/
+const TInt KPluginVersionTwo = 0x4000000; //bit 27 is set to one.
+
+/**
+@publishedPartner
+@released
+
+Specifies that a plugin should determine its own position in the plugin stack.
+
+@see RFs::MountPlugin
+@see RFs::DismountPlugin
+*/
+const TInt KPluginAutoLocate = 0xC8;
+
+/**
+@publishedAll
+@released
+
+The UID of the File Server process
+*/
+const TInt KFileServerUidValue = 0x100039e3;
+
+enum TSessionFlags
+/**
+@internalTechnology
+
+A set of session specific configuration flags.
+*/
+	{
+	/**
+	Notify the user or write failures
+	*/
+	EFsSessionNotifyUser	= KBit0,
+	
+	/**
+	Notify clients registered for change notification
+	*/
+	EFsSessionNotifyChange	= KBit1,
+
+	/**	
+	Enables all session flags
+	*/
+	EFsSessionFlagsAll		= KSet32,
+	};
+
+/**
+@internalTechnology
+*/
+struct SBlockMapArgs
+	{
+	TInt64 iStartPos;
+	TInt64 iEndPos;
+	};
+	
+	
+/**
+@internalTechnology
+
+Validates the mask used to match drive attributes.
+
+@see RFs::DriveList
+@see TFindFile::SetFindMask
+*/	
+TInt ValidateMatchMask( TUint aMask);
+
+
+	
+
+#include "f32file.inl"
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/f32/inc/f32file.inl	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,151 @@
+// Copyright (c) 1996-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// f32\inc\f32file.inl
+// 
+//
+
+
+
+
+// Class TEntry
+inline const TUid& TEntry::operator[](TInt anIndex) const
+/**
+Gets any one of the file's three UIDs.
+
+@param anIndex Identifies the UID required. This can be zero, one or 
+               two. Specifiying any other value raises a panic.
+
+@return On return, contains the requested UID.
+
+@see TUidType
+*/
+    {return(iType[anIndex]);}
+
+
+
+
+inline TBool TEntry::IsUidPresent(TUid aUid) const
+/**
+Tests whether the specified UID matches any of the UIDs in the UID type.
+
+@param aUid The UID to be checked.
+
+@return True if the specified UID is present, false otherwise.
+
+@see TUidType::IsPresent
+@see TUidType
+*/
+    {return(iType.IsPresent(aUid));}
+
+
+
+
+inline TBool TEntry::IsTypeValid() const
+/**
+Test whether the file has a valid UID.
+
+@return True if the entry has a valid UID, false otherwise. 
+
+@see TUidType::IsValid  
+@see TUidType
+*/
+    {return(iType.IsValid());}
+
+
+
+
+inline TUid TEntry::MostDerivedUid() const
+/**
+Gets the most derived (i.e. the most specific) UID.
+
+@return The entry's most derived UID.
+
+@see TUidType::MostDerived
+@see TUidType
+*/
+    {return(iType.MostDerived());}
+
+
+
+
+//	Returns the entire size of the TEntry...
+inline TInt EntrySize(const TEntry& anEntry)
+	{return(sizeof(TUint)+sizeof(TInt)+sizeof(TTime)+sizeof(TInt)+sizeof(TUidType)+anEntry.iName.Size());}
+
+
+
+
+// Class TFindFile
+inline const TDesC& TFindFile::File() const
+/**
+Gets the full file specification of a file which was found by a successful 
+call to any of the search variants that do not accept wildcards.
+
+The file specification includes drive, path and filename.
+
+Notes:
+
+1. When called after a successful search using wildcards the only valid 
+   components of the retrieved file specification are drive letter and 
+   directory.
+   
+@return The full path and filename.
+*/
+	{return iFile.FullName();}
+
+
+
+// Class CDirScan
+inline RFs& CDirScan::Fs()
+	{return(*iFs);}
+
+
+
+
+// Class TDriveUnit
+inline TDriveUnit::operator TInt() const
+/**
+Converts the drive unit to an integer value.
+*/
+	{return(iDrive);}
+
+
+
+
+inline TInt ValidateMatchMask( TUint aMask)
+/**
+Validates the mask used to match drive attributes.
+*/
+	{
+	const TUint matchedFlags= aMask & KDriveAttMatchedFlags;  //KDriveAttMatchedFlags = 0xFFF
+	const TUint matchedAtt = aMask & KDriveAttMatchedAtt;	 //KDriveAttMatchedAtt = 0x0FFF0000
+	
+	switch(matchedAtt)
+		{
+		case KDriveAttExclude:
+			return matchedFlags==0?KErrArgument:KErrNone;
+		case KDriveAttExclusive :
+			return matchedFlags==0?KErrArgument:KErrNone;
+		case KDriveAttExclude | KDriveAttExclusive:
+			return matchedFlags==0?KErrArgument:KErrNone;
+		case KDriveAttAll:
+			return matchedFlags==0?KErrNone:KErrArgument;
+		case 0:
+			return KErrNone;
+		default:
+			return KErrArgument;										
+		}
+	}	
+
+inline void RFs::Close(){}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/f32/sfsrv/cl_cli.cpp	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,1339 @@
+// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// f32\sfsrv\cl_cli.cpp
+// 
+//
+
+#include <f32file.h>
+#include <e32debug.h>
+
+#include "cl_std.h"
+
+#ifdef _WIN32
+#include <cstdio>
+#include <io.h>
+#include <sys/stat.h>
+#include <string>
+#else
+#include <time.h>
+#include <sys/stat.h>
+#include <unistd.h>
+#include <errno.h>
+#include <stdio.h>
+
+#include <stdlib.h>
+#endif
+
+// ***
+// Map a Posix error to a Symbian error code
+//
+TInt mapErrSwitch(TInt aErr)
+	{
+	switch (aErr)
+		{
+	case ENOENT:
+		return KErrNotFound;
+	case EACCES:
+	case EPIPE:
+	case EROFS:
+		return KErrAccessDenied;
+	case EINVAL:
+	case EISDIR:
+	case ENOTDIR:
+		return KErrArgument;
+	case ENOTEMPTY:
+	case EBUSY:
+		return KErrInUse;
+	case EEXIST:
+		return KErrAlreadyExists;
+	case EBADF:
+		return KErrBadHandle;
+	case ENOMEM:
+		return KErrNoMemory;
+	case EFBIG:
+		return KErrTooBig;
+	default:
+		return -aErr;
+		}
+	return aErr;
+	}
+
+// ***
+// Map a Posix error to a Symbian error code
+//
+TInt mapErr(TInt aErr)
+	{
+	TInt symErr = mapErrSwitch(aErr);
+
+#ifdef _DEBUG_LOGGING
+	if (aErr != KErrNone)
+		RDebug::Print(_L("DEBUG: mapErr> %d => %d\n"), aErr, symErr);
+#endif
+	return symErr;
+	}
+
+#ifdef _WIN32
+const char KNativeSlashChar = '\\';
+#else
+const char KNativeSlashChar = '/';
+#endif
+
+// ***
+// Is the character a Symbian path separator?
+//
+TBool IsPathSep(TChar aChar)
+	{
+	return aChar == TChar('\\');
+	}
+
+// ***
+// Perform posix filename conversions
+//
+const char* PosixFilename(const TDesC &aIn, TDes8& aOut)
+	{
+	aOut.Zero();
+	for(TInt pos = 0; pos < aIn.Length(); pos++)
+		{
+		TChar c(aIn[pos]);
+
+		// Magic for using epocroot
+		if (pos == 0 && aIn.Length() >= 7 && IsPathSep(aIn[0]) && aIn.Mid(1, 6).CompareF(_L("epoc32")) == 0)
+			{
+			char* epocroot = getenv("EPOCROOT");
+			if (epocroot)
+				{
+				aOut.Append(TPtrC8(reinterpret_cast<const TUint8*>(epocroot), strlen(epocroot)));
+
+				// If the last character of EPOCROOT is not a slash then we have to add one
+				if (aOut[aOut.Length() - 1] != KNativeSlashChar)
+					aOut.Append(KNativeSlashChar);
+
+				continue;
+				}
+			}
+
+#ifndef _WIN32
+		// Drive letters ignored - go back home!
+		if (pos == 0 && aIn[1] == ':' && IsPathSep(aIn[2]))
+			{
+			char* home = getenv("HOME");
+			if (home)
+				aOut.Append(TPtrC8(reinterpret_cast<const TUint8*>(home), strlen(home)));
+			pos++;
+			continue;
+			}
+
+		// Convert backslashes to forward slashes
+		if (c == '\\')
+			{
+			aOut.Append('/');
+			continue;
+			}
+
+		// Lower case everything
+		c = c.GetLowerCase();
+#endif
+		aOut.Append(c);
+		}
+
+	const char* ret = reinterpret_cast<const char*>(aOut.PtrZ());
+#ifdef _DEBUG_LOGGING
+    RDebug::Printf("DEBUG: PosixFilename> %s\n", ret);
+#endif
+	return ret;
+	}
+TBuf8<0x200> gFilenameBuf;
+const char* PosixFilename(const TDesC &aIn)
+	{
+	// Return the result
+	return PosixFilename(aIn, gFilenameBuf);
+	}
+
+EXPORT_C TBool RFs::IsValidDrive(TInt aDrive)
+/**
+Tests whether the specified drive number is valid.
+
+A valid drive number is any number between 0 and (KMaxDrives-1) inclusive,
+or the specific value KDefaultDrive (implying the session default drive).
+
+@param aDrive The drive number.
+			
+@return True if the drive is valid; false if not.				
+
+@see TDriveNumber 				
+*/
+	{
+	return((aDrive>=0 && aDrive<KMaxDrives) || aDrive==KDefaultDrive);
+	}
+
+EXPORT_C TInt RFs::CharToDrive(TChar aChar,TInt& aDrive)
+/**
+Maps a drive character to a drive number.
+
+The drive character must be in the range A to Z or a to z. For example, drive A (or a)
+corresponds to zero, drive B (or b) corresponds to 1 etc. For the drive number
+enumeration, see TDriveNumber.
+
+@param aChar  The drive character.
+@param aDrive On return, contains the drive number.
+
+@return KErrNone, if successful;
+        KErrArgument, if the drive character is not in the range A to Z or a to z.
+        
+@see TDriveNumber        
+*/
+	{
+
+	aChar.UpperCase();
+	if (aChar>='A' && aChar<='Z')
+		{
+		aDrive=(TInt)aChar-'A';
+		return(KErrNone);
+		}
+	return(KErrArgument);
+	}
+
+EXPORT_C TInt RFs::DriveToChar(TInt aDrive,TChar& aChar)
+/**
+Maps a drive number to the corresponding character.
+
+The drive number must be in the range 0 to (KMaxDrives-1). For example, drive
+number zero (EDriveA) corresponds to drive A, one (EDriveB)
+corresponds to drive B. For the drive number enumeration, see TDriveNumber.
+
+The drive number can also be KDefaultDrive, implying the default drive. In this
+case the current drive is taken and converted.
+
+@param aDrive The drive number.
+@param aChar  On return, contains the drive character.
+
+@return KErrNone, if successful;
+        KErrArgument, if the drive number is invalid;
+        otherwise one of the other system-wide error codes.
+*/
+	{
+
+	if (aDrive==KDefaultDrive)
+		{
+
+#ifdef _WIN32
+		RFs fs;
+		TFileName path;
+		TInt r=fs.Connect();
+		if (r!=KErrNone)
+			return(r);
+		r=fs.SessionPath(path);
+		fs.Close();
+		if (r!=KErrNone)
+			return(r);
+
+		aChar=path[0];
+		return(KErrNone);
+
+#else
+
+		aChar='C';
+
+		return KErrNone;
+
+#endif
+		}
+	if (!IsValidDrive(aDrive))
+		return(KErrArgument);
+	aChar=aDrive+'A';
+	return(KErrNone);
+	}
+
+/** 
+Obtain the system drive number.
+ 
+The System Drive is a defined drive on the device which is:
+ - Read/Writeable
+ - Internal: Always available and not removable from the device
+ - Non-Volatile (e.g. Flash memory, battery-backed RAM)
+ - Only Accessible via Rfs (e.g. not available via USB mass storage)
+     
+The System drive is utilised as:
+ - Storage for Persistent settings from system and application software
+ - Storage for Localisation resources
+ - A Default Drive for user data
+ - A Target Drive for Software installations
+
+It the system drive is not set previously (see RFs::SetSystemDrive) EDriveC is returned by default.
+ 
+@see RFs::GetSystemDriveChar
+@see RFs::SetSystemDrive   
+@see TDriveNumber
+@return TDriveNumber contains the drive number of the system drive.
+ */
+EXPORT_C TDriveNumber RFs::GetSystemDrive()
+	{
+	return EDriveC;
+	}
+
+/**
+This is a wrapper around GetSystemDrive() function. It returns the character corresponding to the system drive.
+
+@parameter aDriveChar On return, contains the system drive character
+@return KErrNone if successful, otherwise one of the other system-wide error codes
+@see RFs::GetSystemDrive
+*/
+EXPORT_C TChar RFs::GetSystemDriveChar()
+	{
+	return 'A' + GetSystemDrive();
+	}
+
+EXPORT_C TInt RFs::Connect(TInt)
+/**
+Connects a client to the file server.
+
+To end the file server session, use Close().
+
+@param aMessageSlots The number of message slots required. The default value of
+				     KFileServerDefaultMessageSlots indicates that message
+				     slots will be acquired dynamically from the system
+				     wide pool. Override this value with a fixed number, if
+				     a fixed number of slots are to be allocated to the session.
+				     If overriding, note that the number of message slots
+				     represents the number of operations, such as reads
+				     and writes, that can be outstanding at once;
+				     always remember to provide a spare slot for
+				     the cancel operation.
+
+@return KErrNone, if successful, otherwise one of the other system-wide
+        error codes.
+*/
+	{
+	return KErrNone;
+	}
+
+EXPORT_C TInt RFs::Drive(TDriveInfo& anInfo, TInt aDrive) const
+/**
+Gets information about a drive and the medium mounted on it.
+
+Note that Volume() can also be used to give information about the drive and
+the volume mounted on it. These two functions are separate because, while
+the characteristics of a drive cannot change, those of a
+volume can, by mounting different media, reformatting etc.
+			 
+@param anInfo On return, contains information describing the drive
+			  and the medium mounted on it. The value of TDriveInfo::iType
+			  shows whether the drive contains media.
+@param aDrive The drive for which information is requested.
+              Specify KDefaultDrive for the session default drive.
+			  Specify a drive in the range EDriveA to EDriveZ for drives
+			  A to Z respectively.
+
+@return       KErrNone, if successful, otherwise one of the other
+              system-wide error codes.
+			 
+@see RFs::Volume
+*/
+	{
+	if (aDrive != EDriveC && aDrive != KDefaultDrive)
+		return KErrBadName;
+	
+	anInfo.iType = EMediaHardDisk;
+	anInfo.iBattery = EBatNotSupported;
+	anInfo.iDriveAtt = KDriveAttLocal|KDriveAttInternal;
+	anInfo.iMediaAtt = 0;
+	
+	return KErrNone;
+	}
+
+EXPORT_C TInt RFs::SessionPath(TDes& aPath) const
+/**
+Gets the session path.
+
+When a client connects to the file server, its session path is initialised to
+the system default path. The session path of an existing client can only be
+changed by this function.
+
+@param aPath On return, contains the session path, including a trailing
+             backslash.
+
+@return KErrNone if successful, otherwise one of the other
+        system-wide error codes.
+*/
+	{
+
+#ifdef _DEBUG_LOGGING
+
+    RDebug::Print(_L("DEBUG: SessionPath\n"), &aPath);
+
+#endif
+
+
+	TBuf8<KMaxFileName + 1> copy;
+	copy.Copy(aPath.Left(KMaxFileName));
+
+	// As the system for the current work directory
+	const char* path = reinterpret_cast<const char*>(copy.PtrZ());
+	if (getcwd(const_cast<char*>(path), copy.MaxLength() - 1) == NULL)
+		return mapErr(errno);
+	
+	// Get the length of the data
+	TInt len = strlen(path);	
+	copy.SetLength(len);
+
+	// We need one extra character of space for the backslash on the end
+	if (len == KMaxFileName)
+		return KErrOverflow;
+
+	// Make sure we use backslash rather than forward 
+	while(len--)
+		{
+		if (copy[len] == '/')
+			copy[len] = '\\';
+		}
+	
+	// Copy the data and append a back slash, as Symbian expects it
+	aPath.Copy(copy);
+	aPath.Append(TChar('\\'));
+	
+	return KErrNone;
+	}
+
+EXPORT_C TInt RFs::SetSessionPath(const TDesC& aPath)
+/**
+Sets the session path for the current file server client.
+
+When the client first connects to the file server, its session path
+is initialised to the system default path.
+
+Note that the session path is text-only. It does not cause any locking.
+Thus, although the path must be syntactically correct, its components
+do not need to be valid at the time the path is set, and any component may be
+deleted, removed or unmounted while the path is set.
+
+On TOOLS2 this function modifies the session path for ALL RFs sessions.
+
+@param aPath The new session path. Consists of a drive and path. Normally, a
+             drive should be specified, but if not, the drive specified in
+             the existing session path is preserved. If a file is specified,
+             then the function fails and returns an error code. Therefore,
+             the final component in the path must have a trailing backslash
+             to indicate that it is a directory. All components of the
+             path must be syntactically correct, for example, wildcard
+             characters and double backslashes are not allowed in any
+             part of it.
+
+@return KErrNone if successful, otherwise one of the other
+        system-wide error codes.
+
+@capability Dependent If aPath is /Sys then AllFiles capability is required.
+@capability Dependent If aPath begins with /Private and does not match this process' SID
+					  then AllFiles capability is required.
+
+*/
+	{
+
+#ifdef _DEBUG_LOGGING
+
+    RDebug::Print(_L("DEBUG: SetSessionPath> path=%S\n"), &aPath);
+
+#endif
+
+
+	const char* name = PosixFilename(aPath);
+	if (chdir(name) != 0)
+		return mapErr(errno);
+	return KErrNone;
+	}
+
+/**
+Makes a directory.
+
+It should be a sub-directory of an existing	directory and its name should be
+unique within its parent directory, otherwise the function returns error code KErrAlreadyExists.
+				
+Note that if a filename is specified in the argument, it is	ignored.
+Therefore, there should be a trailing backslash after the final
+directory name in the argument to indicate that it is a directory, not a filename. 
+
+For example, following code will create directory "C:\\DIR1\\"
+   
+@code
+fs.MkDir(_L("C:\\DIR1\\"));
+@endcode
+
+The last line in the following example will result in KErrAlreadyExists because "DIR2" doesn't have a trailing backslash, 
+therefore is considered as a file name and discarded. Directory "C:\\DIR1\\" has already been created.
+
+@code
+fs.MkDir(_L("C:\\DIR1\\"));     // shall create DIR1 in the root directory
+fs.MkDir(_L("C:\\DIR1\\DIR2")); // No trailing backslash, fails with KErrAlreadyExists
+@endcode
+
+This example will always fail because "DIR1" doesn't have a trailing backslash and discarded while the root
+directory always exists. 
+
+@code
+fs.MkDir(_L("C:\\DIR1"));  // No trailing backslash, will always fail with KErrAlreadyExists
+@endcode
+
+Note, the following case
+
+@code
+fs.MkDir(_L("C:\\example.txt\\"));	// would normally create a directory "c:\\example.txt\\" with KErrNone
+@endcode
+ 
+But if there is a file named "example.txt", which exists at the same location, KErrAccessDenied is returned.    
+
+Note also that because this method can return an error code (eg. because
+the disk is full) before checking whether the path already exists, it
+is not appropriate to use it just to work out whether a path exists or not.
+
+See MkDirAll(), which may also create intermediate directories.
+
+@param aPath The name of the new directory. Any path components which are
+             not specified here will be taken from the session path.
+
+@return KErrNone if successful, otherwise one of the other
+        system-wide error codes. Even if another error code is returned,
+		(for example, if the disk is full) it is still possible that the 
+		path may already exist.
+
+@capability Dependent If aPath is /Sys then Tcb capability is required.
+@capability Dependent If aPath begins with /Private and does not match this process' SID
+					  then AllFiles capability is required.
+@capability Dependent If aPath is /Resource then Tcb capability is required.
+        
+@see RFs::MkDirAll       
+*/
+EXPORT_C TInt RFs::MkDir(const TDesC& aPath)
+	{
+#ifdef _DEBUG_LOGGING
+
+    RDebug::Print(_L("DEBUG: MkDir> path=%S\n"), &aPath);
+
+#endif
+
+
+
+	// Skip the file on the end
+	TInt len = aPath.Length();
+	while(len > 0 && !IsPathSep(aPath[len-1]))
+		len--;
+	TPtrC path(aPath.Left(len));
+
+	// Check if it exists already
+	TUint att;
+	if (RFs::Att(path, att) == KErrNone)
+		{
+		if (att&KEntryAttDir)
+			return KErrAlreadyExists;
+		else
+			// A file exists with the same name
+			return KErrAccessDenied;
+		}
+	const char* name = PosixFilename(path);
+
+#ifdef _WIN32
+	if (mkdir(name) != 0)
+#else
+	if (mkdir(name, S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH) != 0)
+#endif
+		return mapErr(errno);
+	return KErrNone;
+	}
+
+/**
+Makes one or more directories.
+
+Any valid path component specified in aPath which does not already exist is
+created as a directory.
+ 
+Note that if a filename is specified in the argument, it is	ignored.
+Therefore, there should be a trailing backslash after the final
+directory name in the argument to indicate that it is a directory, not a
+filename.
+
+See also notes on RFs::MkDir() about trailing backslashes in directory names.
+
+Note also that because this method can return an error code (eg. because
+the disk is full) before checking whether the path already exists, it
+is not appropriate to use it just to work out whether a path exists or not.
+		
+See MkDir(), which creates only a single new directory.
+
+@param aPath The path name specifiying the directory or directories to
+             create. If the function completes successfully, this path
+             identifies a valid	directory. Any path components which are not
+             specified here are taken from the session path.
+
+@return KErrNone if successful, otherwise one of the other
+        system-wide error codes. Even if another error code is returned,
+		(for example, if the disk is full) it is still possible that the 
+		path may already exist. 
+
+
+@capability Dependent If aPath is /Sys then Tcb capability is required.
+@capability Dependent If aPath begins with /Private and does not match this process' SID
+					  then AllFiles capability is required.
+@capability Dependent If aPath is /Resource then Tcb capability is required.
+
+@see RFs::MkDir
+*/
+EXPORT_C TInt RFs::MkDirAll(const TDesC& aPath)
+	{
+#ifdef _DEBUG_LOGGING
+	RDebug::Print(_L("DEBUG: MkDirAll> path=%S\n"), &aPath);
+#endif
+	
+	// Skip the file on the end
+	TInt len = aPath.Length();
+	while(len > 0 && !IsPathSep(aPath[len-1]))
+		len--;
+	TPtrC path(aPath.Left(len));
+
+	// Check if it exists already
+	TUint att;
+	if (RFs::Att(path, att) == KErrNone)
+		{
+		if (att&KEntryAttDir)
+			return KErrAlreadyExists;
+		else
+			// A file exists with the same name
+			return KErrAccessDenied;
+		}
+
+	// Skip drive letter
+	TInt start = 1;
+	if (len >= 3 && path[1] == TChar(':') && IsPathSep(path[2]))
+		{
+		start = 3;
+		}
+
+	for (TInt pos = start; pos < len; pos++)
+		{
+		if (IsPathSep(path[pos]))
+			{
+			TPtrC parent(path.Ptr(), pos + 1);
+			
+			TUint att;
+			TInt err = RFs::Att(parent, att);
+			if (err == KErrNotFound)
+				{
+				TInt err = RFs::MkDir(parent);
+#ifdef _DEBUG_LOGGING
+				RDebug::Print(_L("DEBUG: MkDirAll> parent=%S err=%d\n"), &parent, err);
+#endif
+				if (err != KErrNone)
+					return err;
+				}
+			else if (!(att & KEntryAttDir))
+				{
+				// Path element is not a directory
+				return KErrAccessDenied;
+				}
+			}
+		}
+	return KErrNone;
+	}
+
+EXPORT_C TInt RFs::RmDir(const TDesC& aPath)
+/**
+Removes a directory.
+
+The directory must be empty and cannot be the root directory. 
+
+Note that if a filename is specified in the argument, it is
+ignored. 
+
+For example, following code will result in directory "C:\\SRC\\" being removed as long as 
+it is empty, the existance of "ENTRY" will not be checked:
+
+@code
+fs.RmDir(_L("C:\\SRC\\ENTRY"));
+@endcode
+
+Similarly, following code will try to remove "C:\\SRC\\" instead of "C:\\SRC\DIR\\":
+@code
+fs.RmDir(_L("C:\\SRC\\DIR"));
+@endcode
+
+Therefore, there should be a trailing backslash after the final
+directory name in the argument to indicate that it is a directory, not a
+filename.
+
+See class CFileMan for information on deleting a
+non-empty directory and all of its contents.
+				
+@param aPath The path name of the directory to be removed. Any path	components
+             which are not specified here are taken from the session path. Only
+             the lowest-level directory identified is removed.
+
+@return KErrNone, if successful;
+        KErrInUse, if trying to remove a non-empty directory or root directory;
+        otherwise, one of the other system-wide error codes.
+              
+@capability Dependent If aPath is /Sys then Tcb capability is required.
+@capability Dependent If aPath begins with /Private and does not match this process' SID
+					  then AllFiles capability is required.
+@capability Dependent If aPath is /Resource then Tcb capability is required.
+
+@see CFileMan
+*/
+	{
+
+#ifdef _DEBUG_LOGGING
+
+    RDebug::Print(_L("DEBUG: RmDir> path=%S\n"), &aPath);
+
+#endif
+
+
+	// Skip the file on the end
+	TInt len = aPath.Length();
+	while(len > 0 && !IsPathSep(aPath[len-1]))
+		len--;
+	TPtrC path(aPath.Left(len));
+
+	// Return error on an attempt to delete root!
+	if (len == 0 || (len <= 2 && IsPathSep(path[0])) || (len >= 3 && len < 5 && path[1] == TChar(':') && IsPathSep(path[2])))
+		return KErrInUse;
+
+	// Return an error if the directory doesn't exist or isn't a directory
+	TUint att;
+	if (RFs::Att(path, att) != KErrNone || !(att&KEntryAttDir))
+		return KErrNotFound;
+
+	const char* name = PosixFilename(path);
+	if (rmdir(name) != 0)
+		return mapErr(errno);
+	return KErrNone;
+	}
+
+EXPORT_C TInt RFs::Parse(const TDesC& aName, TParse& aParse) const
+/**
+Parses a filename specification.
+
+Parsing is done with wildcard resolution, using the session path as
+the default. You can then use TParse's getter functions to extract individual
+components of the resulting name. All the path components that are included
+in aName are put into the resulting	filename. Any components that are still
+missing are taken from the session path.
+
+Specifying:
+
+@code
+TParse fp;
+@endcode
+@code
+fs.Parse(name,fp);
+@endcode
+
+is equivalent to 
+
+@code
+TParse fp;
+@endcode
+@code
+fp.Set(name,NULL,&fs.SessionPath());
+@endcode
+
+Note that the function does not check for illegal characters, or for
+illegal path components in either of the paths specified.
+
+@param aName  The file name to be parsed, using the session path to provide
+              the missing components.
+@param aParse A TParse objct that provides functions for
+              extracting individual components of the resulting file name.
+
+@return KErrNone if successful, otherwise one of the other
+        system-wide error codes.
+*/
+	{
+	TFileName session_path;
+	TInt r = SessionPath(session_path);
+	if (r==KErrNone)
+		r = aParse.Set(aName, NULL, &session_path);
+	return r;
+	}
+
+EXPORT_C TInt RFs::Parse(const TDesC& aName,const TDesC& aRelated,TParse& aParse) const
+/**
+Parses a filename specification, specifying related file path components.
+
+Parsing is done with wildcard resolution, using the session path as
+the default. You can then use TParse's getter functions to extract individual
+components of the resulting name. All the path components that are included
+in aName are put into the resulting	filename. Any missing components are taken
+from the optional aRelated argument, which has the next order of precedence.
+Finally, any components that are still missing are taken from the session path.
+
+Specifying:
+
+@code
+TParse fp;
+@endcode
+@code
+fs.Parse(name,related,fp);
+@endcode
+
+is equivalent to 
+
+@code
+TParse fp;
+@endcode
+@code
+fp.Set(name,related,&fs.SessionPath());
+@endcode
+
+Note that the function does not check for illegal characters, or for
+illegal path components in any of the paths specified.
+
+@param aName    The file name to be parsed, using the session path and the
+                related path to provide the missing components.
+@param aRelated The related file specification.
+@param aParse   A TParse objct that provides functions for
+                extracting individual components of the resulting file name.
+
+@return KErrNone if successful, otherwise one of the other
+        system-wide error codes.
+*/
+	{
+	TFileName session_path;
+	TInt r = SessionPath(session_path);
+	if (r==KErrNone)
+		r = aParse.Set(aName, &aRelated, &session_path);
+	return r;
+	}
+
+EXPORT_C TInt RFs::Delete(const TDesC& aName)
+/**
+Deletes a single file.
+
+Wildcards are not allowed in either the	file name or the extension,
+otherwise an error is returned.
+
+Note that the file must be closed and must not be read-only.
+Hidden files can be deleted but system files cannot.
+
+See class CFileMan for information on deleting multiple files.
+		  
+@param aName The name of the file to be deleted. Any path components which
+             are not specified here will be taken from the session path.
+
+@return KErrNone if successful, otherwise one of the other
+        system-wide error codes.
+
+@capability Dependent If aName is /Sys then Tcb capability is required.
+@capability Dependent If aName begins with /Private and does not match this process' SID
+					  then AllFiles capability is required.
+@capability Dependent If aName is /Resource then Tcb capability is required.
+        
+@see CFileMan        
+*/
+	{
+
+#ifdef _DEBUG_LOGGING
+
+    RDebug::Print(_L("DEBUG: Delete> name=%S\n"), &aName);
+
+#endif
+
+
+
+	TUint att;
+
+	TInt err = Att(aName, att);
+
+	if (err != KErrNone)
+
+		return err;
+
+
+
+	// Don't allow deletion of directories
+
+	if (att & KEntryAttDir)
+
+		return KErrAccessDenied;
+
+
+	const char* name = PosixFilename(aName);
+	if (remove(name) != 0)
+		return mapErr(errno);
+	return KErrNone;
+	}
+
+EXPORT_C TInt RFs::Rename(const TDesC& anOldName, const TDesC& aNewName)
+/**
+Renames a single file or directory.
+
+It can also be used to move a file or directory by specifying different
+destination and source directories.	If so, the destination and source
+directories must be on the same drive. If a	directory is moved, then
+the directory structure beneath it is also	moved.
+
+If a directory specified by aNewName is different from one specified
+by anOldName, then the file or directory is	moved to the new directory.
+The file or directory cannot be moved to another device by this means,
+either explicitly (by another drive	specified in the name) or implicitly
+(because the directory has been mapped to another device with SetSubst().
+
+The function fails and returns an error code in the following
+circumstances:
+
+1. If either the old or new name includes wildcards.
+
+2. If a file or directory with the new name already exists in
+   the target directory. Overwriting is not permitted.
+
+3. If file anOldName does not exist, or is open.
+
+Read-only, system and hidden files may be renamed. The renamed
+file's attributes are preserved.
+
+Note that when this function is operating on directories, a	trailing backslash
+is not required after the final directory name in either anOldName or aNewName.
+
+See class CFileMan for information on renaming multiple files.
+		  				
+@param anOldName File or directory to be renamed. Any path components which are
+                 not specified here will be taken from the session path.
+@param aNewName  Path specifying the new name for the file or directory and/or
+				 its new parent directory. All directories specified in this path
+				 must exist.
+				 Any path components which are not specified here will be taken
+				 from the session path.
+
+@return KErrNone if successful, otherwise one of the other
+        system-wide error codes.
+
+@capability Dependent If either anOldName or aNewName is /Sys then Tcb capability is required.
+@capability Dependent If either anOldName or aNewName begins with /Private and does not match
+					  this process' SID then AllFiles capability is required.
+@capability Dependent If either anOldName or aNewName is /Resource then Tcb capability is required.
+        
+@see CFileMan        
+*/
+	{
+#ifdef _DEBUG_LOGGING
+
+    RDebug::Print(_L("DEBUG: Rename> old=%S new=%S\n"), &anOldName, &aNewName);
+
+#endif
+
+
+
+	// Lose path separator on the end
+	TInt len = anOldName.Length();
+	while(len > 0 && IsPathSep(anOldName[len-1]))
+		len--;
+
+	TBuf8<KMaxFileName + 1> copyold;
+	const char* oldname = PosixFilename(anOldName, copyold);
+
+
+	// If new file exists already - return an error
+
+	TUint newAtt;
+
+	if (Att(aNewName, newAtt)== KErrNone)
+
+		return KErrAlreadyExists;
+
+
+	// Lose path separator on the end
+	len = aNewName.Length();
+	while(len > 0 && IsPathSep(aNewName[len-1]))
+		len--;
+
+	TBuf8<KMaxFileName + 1> copynew;
+	const char* newname = PosixFilename(aNewName, copynew);
+
+	if (rename(oldname, newname) != 0)
+		return mapErr(errno);
+	return KErrNone;
+	}
+
+EXPORT_C TInt RFs::Replace(const TDesC& anOldName, const TDesC& aNewName)
+/**
+Replaces a single file with another.
+
+This function does not support the use of wildcards. Unlike Rename(), it only
+applies to files.
+
+This function operates as follows:
+
+1. if the aNewName file does not exist, it is created.
+
+2. anOldName's contents, attributes and the date and time of its last
+   modification are copied to file aNewName, overwriting any existing contents
+   and attribute details.
+
+3. anOldName is deleted.
+				 
+anOldName may be hidden, read-only or a system file. However,
+neither anOldName, nor, if it exists, aNewName, can be open;
+aNewName must not be read-only.
+Both files must be on the same drive.
+
+@param anOldName The file to be replaced. Must exist and must be closed. It is
+                 deleted by this function.
+@param aNewName  The file to replace anOldName. Does not need to exist, but if
+                 it does exist, it must be closed. If it exists, its name
+                 remains unchanged but its contents, attributes and the date
+                 and time of its last modification are replaced by those
+                 of anOldName.
+                 If it does not exist, it will be created and is assigned
+                 the contents and attributes of anOldName. Must not be followed
+                 by a trailing backslash.
+
+@return KErrNone, if successful;
+        KErrAccessDenied, if an attempt is made to replace a directory;
+        otherwise one of the other system-wide error codes. 
+
+@capability Dependent If either anOldName or aNewName is /Sys then Tcb capability is required.
+@capability Dependent If either anOldName or aNewName begins with /Private and does not match
+					  this process' SID then AllFiles capability is required.
+@capability Dependent If either anOldName or aNewName is /Resource then Tcb capability is required.
+
+*/
+	{
+#ifdef _DEBUG_LOGGING
+
+    RDebug::Print(_L("DEBUG: Replace> old=%S new=%S\n"), &anOldName, &aNewName);
+
+#endif
+
+
+
+	TInt err = RFs::Delete(aNewName);
+	if (err<KErrNone && err!=KErrNotFound)
+		return err;
+	return RFs::Rename(anOldName, aNewName);
+	}
+
+EXPORT_C TInt RFs::Att(const TDesC& aName, TUint& aAttValue) const
+/**
+Gets a file's attributes.
+
+@param aName The filename. Any path components which are not specified here
+             will be taken from the session path.
+@param aVal  On return, the individual bits within the byte indicate which
+             attributes have been set. For more information see KEntryAttNormal
+	         and the other file/directory attributes.
+
+@return KErrNone if successful, otherwise one of the other
+        system-wide error codes.
+
+@capability Dependent If aName contains /sys/ then AllFiles capability is required.
+@capability Dependent If aName contains /Private/ and does not match
+					  this process' SID then AllFiles capability is required.
+        
+@see KEntryAttNormal
+*/
+	{
+#ifdef _DEBUG_LOGGING
+	RDebug::Print(_L("DEBUG: Att> aName=%S\n"), &aName);
+#endif
+	
+	TBuf<KMaxFileName + 1> copy;
+	copy.Copy(aName.Left(KMaxFileName));
+
+	// Get rid of trailing backslash or forward slash
+	if (copy.Length() > 0 && IsPathSep(copy[copy.Length() - 1]))
+		copy.SetLength(copy.Length() - 1);
+	
+	// It seems you can't retrieve the attributes of root
+	if (copy.Length() == 0 || (copy.Length() == 2 && copy[1] == ':'))
+		return KErrBadName;
+
+	const char* name = PosixFilename(copy);
+	
+	struct stat sb;
+	if(stat(name, &sb) != 0)
+		return mapErr(errno);
+	
+	aAttValue = 0;
+    if (S_ISREG(sb.st_mode))
+    	aAttValue = KEntryAttNormal;
+    else if(S_ISDIR(sb.st_mode))
+    	aAttValue |= KEntryAttDir;
+
+	// Bit Value Specifier File          Directory
+	// 0   1     x         executable    can search directory
+	// 1   2     w         write access  can modify (delete/add files)
+	// 2   4     r         read access   read access
+
+	// Test readonly flag - no write access
+    if (!(sb.st_mode & 0222))
+    	aAttValue |= KEntryAttReadOnly;
+    
+    return KErrNone;
+	}
+
+EXPORT_C TInt RFs::SetAtt(const TDesC& aName, TUint aSetAttMask, TUint aClearAttMask)
+/**
+Sets or clears the attributes of a single file or directory.
+
+The function uses two bitmasks. The first bitmask specifies the	attributes
+to be set; the second specifies the attributes to be cleared.
+
+An attempt to set or clear the KEntryAttDir, KEntryAttVolume or KEntryAttRemote
+attributes have no effect.
+
+@param aName          File or directory name. Any path components which are not
+                      specified here will be taken from the session path. Must
+                      not include wildcard characters. The file must be closed.
+@param aSetAttMask    Bitmask indicating the attributes to be set.
+@param aClearAttMask  Bitmask indicating the attributes to be cleared. For more
+				      information, see KEntryAttNormal and the other file or
+				      directory attributes.
+
+@return KErrNone if successful, otherwise one of the other
+        system-wide error codes.
+
+@panic FSCLIENT 21 if any attribute appears in both bitmasks.
+
+
+@capability Dependent If aName is /Sys then Tcb capability is required.
+@capability Dependent If aName begins with /Private and does not match
+					  this process' SID then AllFiles capability is required.
+@capability Dependent If aName is /Resource then Tcb capability is required.
+	
+@see RFs::SetEntry
+
+*/
+	{
+
+#ifdef _DEBUG_LOGGING
+
+	RDebug::Print(_L("DEBUG: SetAtt> aName=%S set=%x clear=%x\n"), &aName, aSetAttMask, aClearAttMask);
+
+#endif
+
+
+	const char* name = PosixFilename(aName);
+	struct stat sb;
+	if(stat(name, &sb) != 0)
+		return mapErr(errno);
+	
+	// Clear readonly flag - write access
+    if (aClearAttMask&KEntryAttReadOnly)
+	    sb.st_mode |= 0222;
+
+    // Set readonly flag - no write access
+    if (aSetAttMask&KEntryAttReadOnly)
+    	sb.st_mode &= ~0222;
+    
+	return mapErr(chmod(name, sb.st_mode));
+	}
+
+EXPORT_C TInt RFs::Modified(const TDesC& aName,TTime& aTime) const
+/**
+Gets the last modification date and time of a file or a directory,
+in UTC.
+
+If there has been no modification, the function gets the date and
+time of the file or directory's creation.
+
+@param aName File or directory name.
+@param aTime On return, contains the date and time of the file or
+             directory's last modification in universal time.
+
+@return KErrNone if successful, otherwise one of the other
+        system-wide error codes.
+
+@capability Dependent If aName contains /sys/ then AllFiles capability is required.
+@capability Dependent If aName contains /Private/ and does not match
+					  this process' SID then AllFiles capability is required.
+
+*/
+	{
+
+	TEntry e;
+	TInt r=Entry(aName,e);
+	if (r==KErrNone)
+		aTime=e.iModified;
+	return(r);
+	}
+
+TInt ReadUid(const char* aName,TEntry& anEntry)
+//
+// Read the entry uid if present
+//
+	{
+    FILE* hFile = fopen(aName, "rb");
+    if (!hFile)
+    	return KErrGeneral;
+    
+	//  First check to see if the first sixteen bytes form a valid UID
+	TBuf8<sizeof(TCheckedUid)> checkedUidBuf;
+	checkedUidBuf.SetLength(sizeof(TCheckedUid));
+	TInt ret = fread(&checkedUidBuf[0], sizeof(TCheckedUid), 1, hFile);
+	fclose(hFile);
+	if (ret != 1)
+		return KErrCorrupt;
+	
+	TCheckedUid checkedUid(checkedUidBuf);
+	if(checkedUid.UidType()!=TUidType(TUid::Null(),TUid::Null(),TUid::Null()))
+		anEntry.iType=checkedUid.UidType();
+
+	return KErrNone;
+	}
+
+EXPORT_C TInt RFs::Entry(const TDesC& aName, TEntry& anEntry) const
+/**
+Gets the entry details for a file or directory.
+
+This information includes UID information.
+
+@param aName   Name of file or directory.
+@param anEntry On return, contains the entry details for the file or directory. TEntry::iModified contains UTC date and time.
+
+@return KErrNone if successful, otherwise one of the other
+        system-wide error codes.
+
+@capability Dependent If aName contains "\\Sys\\" and includes an additional file or directory then AllFiles capability 
+					  is required. For example, the paths "c:\\sys" and "c:\\sys\\" will always be readable, whereas
+					  the path "c:\\sys\\abc\\" will only be readable with AllFiles capability.
+
+@capability Dependent If aName contains \\Private\\ and includes an additional file, or a directory which does not match
+					  this process' SID, then AllFiles capability is required. For example, the paths "c:\\private" and 
+					  "c:\\private\\" will always be readable, whereas the path "c:\\private\\<n>\\" will only be 
+					  readable with AllFiles capability or if <n> matches the process' SID.
+*/
+	{
+
+#ifdef _DEBUG_LOGGING
+
+	RDebug::Print(_L("DEBUG: Entry> aName=%S\n"), &aName);
+
+#endif
+
+
+	TInt err = RFs::Att(aName, anEntry.iAtt);
+	if (err < KErrNone)
+		return err;
+
+	struct stat sb;
+	TBuf<KMaxFileName + 1> copy;
+	copy.Copy(aName.Left(KMaxFileName));
+
+	// Get rid of trailing backslash 
+	if (copy.Length() > 0 && IsPathSep(copy[copy.Length() - 1]))
+		copy.SetLength(copy.Length() - 1);
+
+	const char* name = PosixFilename(copy);
+	if(stat(name, &sb) < 0)
+		return KErrNotFound;
+	
+
+	// On Symbian directories have zero size
+	anEntry.iSize = (anEntry.iAtt&KEntryAttDir) ? 0 : sb.st_size;
+
+    anEntry.iType = TUidType(TUid::Null(), TUid::Null(), TUid::Null());
+    ReadUid(name, anEntry);
+    
+	struct tm *tm = gmtime(&sb.st_mtime);
+	anEntry.iModified = TDateTime(1900 + tm->tm_year, TMonth(tm->tm_mon), tm->tm_mday - 1, tm->tm_hour, tm->tm_min, tm->tm_sec, 0);
+
+	// Just return the name
+	TInt start = aName.LocateReverse('\\');
+	if (start > 0)
+		{
+		if (anEntry.iAtt&KEntryAttDir)
+			{
+			anEntry.iName = aName.Left(start);
+			start = anEntry.iName.LocateReverse('\\');
+			if (start > 0)
+				anEntry.iName = anEntry.iName.Mid(start + 1);
+			}
+		else
+			anEntry.iName = aName.Mid(start + 1);
+		}
+	else
+		anEntry.iName = aName;
+	
+    return KErrNone;
+	}
+
+EXPORT_C TInt RFs::SetEntry(const TDesC& aName,const TTime& aTime,TUint aSetAttMask,TUint aClearAttMask)
+/**
+Sets both the attributes and the last modified date and time for a file or directory.
+
+The function uses two bitmasks. The first bitmask determines
+which attributes should be set. The second bitmask determines which should be cleared.
+
+An attempt to set or clear the KEntryAttDir, KEntryAttVolume or KEntryAttRemote
+attributes have no effect.
+			 
+@param aName          File or directory name.
+@param aTime	      New date and time. UTC date and time should be used.
+@param aSetAttMask    Bitmask indicating which attributes are to be set.
+@param aClearAttMask  Bitmask indicating which attributes are cleared. For more
+                      information, see KEntryAttNormal, and the other file
+                      or directory attributes.
+
+@return KErrNone, if successful;
+        KErrInUse, if the file is open;
+        otherwise one of the other system-wide error codes.
+
+@panic FSCLIENT 21 if any attribute appears in both bitmasks.        
+
+@capability Dependent If aName is /Sys then Tcb capability is required.
+@capability Dependent If aName begins with /Private and does not match
+					  this process' SID then AllFiles capability is required.
+@capability Dependent If aName is /Resource then Tcb capability is required.
+
+@see KEntryAttNormal
+@see KEntryAttDir
+@see KEntryAttVolume
+*/
+	{
+	// No way to set modified date
+	return SetAtt(aName, aSetAttMask, aClearAttMask);
+	}
+
+TInt gBlockSize = 4096;
+TInt gClusterSize = 4096;
+EXPORT_C TInt RFs::VolumeIOParam(TInt aDriveNo, TVolumeIOParamInfo& aParamInfo) const
+/**
+This function queries a set of I/O parameters on the specified volume, this includes the block size of underlying media,
+cluster size of the mounted file system and the recommended read/write buffer sizes. 
+
+The volume information is retuned through aParamInfo. Even if VolumeIOParam() returns successful, errors 
+can effect the return value of each field within aParamInfo.
+
+@param aDrive A drive number, specifies which volume to query.
+@param aParamInfo A TVolumeIOParamInfo containing the volume parameters.
+
+@return KErrNone if successful; otherwise, another system wide error code is returned.
+*/
+	{
+	aParamInfo.iBlockSize = gBlockSize;
+	aParamInfo.iClusterSize = gClusterSize;
+	aParamInfo.iRecReadBufSize = 4096;
+	aParamInfo.iRecWriteBufSize = 4096;
+	return KErrNone;
+	}
+
+EXPORT_C TInt RFs::SetErrorCondition(TInt anError, TInt aCount)
+	{
+	return KErrNotSupported;
+	}
+
+void Panic(TClientPanic aPanic)
+//
+// Panic the current client with a file server client side panic.
+//
+	{
+
+	User::Panic(_L("FSCLIENT panic"),aPanic);
+	}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/f32/sfsrv/cl_drive.cpp	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,127 @@
+// Copyright (c) 1996-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// f32\sfsrv\cl_drive.cpp
+// 
+//
+
+#include "cl_std.h"
+
+
+
+
+EXPORT_C TDriveUnit::TDriveUnit(TInt aDrive)
+/**
+Constructor taking a drive number.
+
+@param aDrive The drive number.
+
+@panic FSCLIENT 0 if aDrive is greater than or equal to KMaxDrives or less than 0.
+
+@see KMaxDrives
+*/
+	{
+	__ASSERT_ALWAYS((aDrive>=0 && aDrive<KMaxDrives),Panic(EDriveUnitBadDrive));
+	iDrive=aDrive;
+	}
+
+
+
+
+EXPORT_C TDriveUnit::TDriveUnit(const TDesC& aDriveText)
+/**
+Constructor taking a drive letter.
+
+@param aDriveText A descriptor containing text whose first character is
+                  the drive letter. Can be upper or lower case. Trailing text
+                  is ignored.
+                  
+@panic FSCLIENT 1 if the drive letter is invalid, i.e. does not correspond
+       to a drive number.
+       
+@see RFs::CharToDrive
+*/
+	{
+	__ASSERT_ALWAYS(RFs::CharToDrive(aDriveText[0],iDrive)==0,Panic(EDriveUnitBadDriveText));
+	}
+
+
+
+
+EXPORT_C TDriveUnit& TDriveUnit::operator=(TInt aDrive)
+/**
+Assigns the drive number to the drive unit
+
+@param aDrive The new drive number.
+
+@return A reference to this drive unit. 
+
+@panic FSCLIENT 0 if aDrive is greater than or equal to KMaxDrives.
+
+@see KMaxDrives
+*/
+	{
+	__ASSERT_ALWAYS(aDrive<KMaxDrives,Panic(EDriveUnitBadDrive));
+	iDrive=aDrive;
+	return *this;
+	}
+
+
+
+
+EXPORT_C TDriveUnit& TDriveUnit::operator=(const TDesC& aDriveText)
+/**
+Assigns a drive letter to the drive unit.
+
+The letter must be between A and Z or a panic is raised. Any trailing
+text within the descriptor is ignored.
+
+@param aDriveText Descriptor containing text whose first character is
+                  the drive letter. It can be upper or lower case.
+                  
+@return A reference to this drive unit. 
+
+@panic FSCLIENT 1 if the drive letter is invalid, i.e. does not correspond
+       to a drive number.
+       
+@see RFs::CharToDrive                  
+*/
+	{
+	__ASSERT_ALWAYS(RFs::CharToDrive(aDriveText[0],iDrive)==0,Panic(EDriveUnitBadDriveText));
+	return *this;
+	}
+
+
+
+
+EXPORT_C TDriveName TDriveUnit::Name() const
+/**
+Gets the drive unit as text.
+
+The drive letter is returned with a trailing colon.
+
+@return The drive letter and a trailing colon.
+
+@panic FSCLIENT 0 if RFs::DriveToChar() returned an error.
+*/
+	{
+	TChar driveLetter;
+	TInt r = RFs::DriveToChar(iDrive,driveLetter);
+	__ASSERT_ALWAYS(r == KErrNone, Panic(EDriveUnitBadDrive));
+	TDriveName driveName;
+	driveName.SetLength(2);
+	driveName[0]=(TText)driveLetter;
+	driveName[1]=KDriveDelimiter;
+	return driveName;
+	}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/f32/sfsrv/cl_entry.cpp	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,223 @@
+// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// f32\sfsrv\cl_entry.cpp
+// 
+//
+
+#include "cl_std.h"
+
+
+/**
+Default constructor.
+*/
+EXPORT_C TVolumeInfo::TVolumeInfo()
+	{
+    Mem::FillZ(this, sizeof(TVolumeInfo)); //-- zero-fill itself
+    new(&iName)TBufC<KMaxFileName>;        //-- initialise broken descriptor 
+    }
+
+
+
+
+EXPORT_C TBool TEntry::IsReadOnly() const
+/**
+Tests whether the file or directory is read-only.
+
+@return ETrue if entry is read-only, EFalse if not.
+
+@see KEntryAttReadOnly
+*/
+	{
+	return(iAtt&KEntryAttReadOnly);
+	}
+
+
+
+
+EXPORT_C TBool TEntry::IsHidden() const
+/**
+Tests whether the file or directory is hidden.
+
+@return ETrue if entry is hidden, EFalse if not.
+
+@see KEntryAttHidden
+*/
+	{
+
+	return(iAtt&KEntryAttHidden);
+	}
+
+
+
+
+EXPORT_C TBool TEntry::IsSystem() const
+/**
+Tests whether the file or directory has the system attribute set.
+
+@return ETrue if entry is a system entry, EFalse if not.
+
+@see KEntryAttSystem
+*/
+	{
+
+	return(iAtt&KEntryAttSystem);
+	}
+
+
+
+
+EXPORT_C TBool TEntry::IsDir() const
+/**
+Tests whether the entry is a directory.
+
+@return ETrue if entry indicates a directory, EFalse if not.
+
+@see KEntryAttDir
+*/
+	{
+
+	return(iAtt&KEntryAttDir);
+	}
+
+
+
+
+EXPORT_C TBool TEntry::IsArchive() const
+/**
+Tests whether the file is an archive file.
+
+@return ETrue if file is archive, EFalse if not.
+
+@see KEntryAttArchive
+*/
+	{
+
+	return(iAtt&KEntryAttArchive);
+	}
+
+
+
+
+EXPORT_C TEntryArray::TEntryArray()
+	: iCount(0)
+/**
+Default constructor.
+
+Initialises its count of contained TEntry objects to zero.
+*/
+	{}
+
+
+
+
+EXPORT_C TInt TEntryArray::Count() const
+/**
+Gets the number of entries in the array.
+
+@return The number of entries in the array.
+*/
+	{
+
+	if (iCount==KCountNeeded)
+		{
+		const TEntry* pE=(const TEntry*)iBuf.Ptr();
+		const TEntry* pEnd=PtrAdd(pE,iBuf.Length());
+		TInt c=0;
+		while (pE<pEnd)
+			{
+			c++;
+			pE=PtrAdd(pE,Align4(EntrySize(*pE)));
+			}
+		TEntryArray& me=(TEntryArray& )(*this);
+		me.iCount=c;
+		me.iIndex=0;
+		me.iPos=(const TEntry*)iBuf.Ptr();
+		}
+	return(iCount);
+	}
+
+
+
+
+EXPORT_C const TEntry& TEntryArray::operator[](TInt anIndex) const
+/**
+Gets the directory entry at the specified index.
+
+@param anIndex Index of the entry within the array.
+               This value is relative to zero.
+               
+@return On return contains the entry at the specified index.
+
+@panic FSCLIENT 22 if anIndex is greater than or equal to the number
+       of elements in the array.
+*/
+	{
+
+	__ASSERT_ALWAYS(anIndex<Count(),Panic(EEntryArrayBadIndex));
+	const TEntry* pE=iPos;
+	TInt ix=iIndex;
+	if (anIndex<ix)
+		{
+		ix=0;
+		pE=(const TEntry*)iBuf.Ptr();
+		}
+	while (ix<anIndex)
+		{
+		pE=PtrAdd(pE,Align4(EntrySize(*pE)));
+		ix++;
+		}
+	TEntryArray& me=(TEntryArray& )(*this);
+	me.iIndex=ix;
+	me.iPos=pE;
+	return(*pE);
+	}
+
+
+
+
+EXPORT_C TEntry::TEntry()
+/**
+Default constructor.
+*/
+	{}
+
+
+
+
+EXPORT_C TEntry::TEntry(const TEntry& aEntry)
+/**
+Copy constructor.
+
+@param aEntry The TEntry object to be copied.
+*/
+	{
+	Mem::Copy(this,&aEntry,EntrySize(aEntry));
+	}
+
+
+
+
+EXPORT_C TEntry& TEntry::operator=(const TEntry& aEntry)
+/**
+Assignment operator.
+
+@param aEntry The TEntry object to be copied to this TEntry object.
+
+@return A reference to this TEntry object.
+*/
+	{
+	if(this!=&aEntry)
+		Mem::Copy(this,&aEntry,EntrySize(aEntry));
+	return(*this);
+	}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/f32/sfsrv/cl_file.cpp	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,1114 @@
+// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// f32\sfsrv\cl_file.cpp
+// 
+//
+
+#include <f32file.h>
+#include <e32math.h>
+
+#include <cstdio>
+#include <errno.h>
+#include <sys/stat.h>
+#include <unistd.h>
+
+class TFileInfo
+	{
+public:
+	FILE* iHandle;
+	TFileName iName;
+	TUint iMode;
+	};
+
+#define GETFILEHANDLE(A,B) TFileInfo* A; memcpy(&A, B, 4);
+#define FILEHANDLE(A) GETFILEHANDLE(A,this);
+	
+extern TInt mapErr(TInt);
+extern const char* PosixFilename(const TDesC &aIn);
+extern const char* PosixFilename(const TDesC &aIn, TDes8& aOut);
+
+/**
+Make a duplicate of the passed file handle in the same thread.
+
+By default, any thread in the process can use the duplicated handle to access the 
+file. However, specifying EOwnerThread as the second parameter to this function, 
+means that only the creating thread can use the handle.
+
+@param	aFile	The file handle to duplicate
+@param	aType	An enumeration whose enumerators define the ownership of this 
+				handle. If not explicitly specified, EOwnerProcess is taken
+				as default.
+
+@return	one of the other system-wide error codes.
+*/
+EXPORT_C TInt RFile::Duplicate(const RFile& aFile, TOwnerType aType)
+	{
+	GETFILEHANDLE(h,&aFile);
+	TFileName name(h->iName);
+	RFs fs;  // This doesn't actually get used in the Open function
+	TUint mode = h->iMode;
+
+	// Get the file position
+	TInt pos = ftell(h->iHandle);
+	if (pos < 0)
+		return mapErr(errno);
+
+	// Open the file
+	TInt err = Open(fs, name, mode);
+	if (err != KErrNone)
+		return err;
+
+	// Set the file position
+	return Seek(ESeekStart, pos); 
+	}
+
+EXPORT_C TInt RFile::Name(TDes &aName) const
+/**
+Gets the final part of a filename
+
+This is used to retrieve the name and extension of a file that has been 
+passed from one process to another using the RFile::AdoptXXX() methods.
+
+@param	aName	On return, contains the name of the file, including the name and 
+				extension but excluding the drive letter and path.
+
+@return KErrNone if successful, otherwise one of the other
+        system-wide error codes.
+
+*/
+	{
+    FILEHANDLE(h);
+    TParsePtrC ptr(h->iName);
+    aName = ptr.NameAndExt();
+    return KErrNone;
+	}
+
+
+EXPORT_C TInt RFile::FullName(TDes& aName) const
+/**
+Gets the full filename
+
+This is used to retrieve the full filename, including drive and path,
+of a file that has been passed from one process to another using the 
+RFile::AdoptXXX() methods.
+
+@param	aName	On return, contains the full name of the file, including drive and path.
+
+@return KErrNone if successful, otherwise one of the other
+        system-wide error codes.
+
+*/
+	{
+    FILEHANDLE(h);
+    aName = h->iName;
+    return KErrNone;
+	}
+
+
+
+/*
+"r" 	Open a text file for reading
+"r+" 	Open a text file for read/write
+
+"rb" 	Open a binary file for reading
+"rb+" 	Open a binary file for read/write
+
+"w" 	Create a text file for writing
+"w+" 	Create a text file for read/write
+
+"wb" 	Create a binary file for writing
+"wb+" 	Create a binary file for read/write
+
+"a" 	Append to a text file
+"ab" 	Append to a binary file
+*/
+void GetFileMode(TDes8& aBuf, TUint aFileMode, TBool aOpen)
+	{
+	if (aOpen)
+		{
+		if (aFileMode & EFileWrite)
+			// Open a binary file for read/write
+			aBuf = _L8("rb+");
+		else
+			// Open a binary file for reading
+			aBuf = _L8("rb");
+		}
+	else
+		// Create a binary file for read/write 
+		aBuf = _L8("wb+");
+	}
+
+TInt DoOpen(RFile* aFile, const TDesC &aName, TUint aFileMode, TBool aOpen)
+    {
+	const char* name = PosixFilename(aName);
+   
+	TFileInfo* info = new TFileInfo;
+	if (!info)
+		return KErrNoMemory;
+	
+	TBuf8<4> mode;
+	GetFileMode(mode, aFileMode, aOpen);
+	info->iHandle = fopen(name, reinterpret_cast<const char*>(mode.PtrZ()));
+    
+#ifdef _DEBUG_LOGGING
+    RDebug::Print(_L("DEBUG: DoOpen> file=%S id=%x\n"), &aName, info->iHandle);
+#endif
+    
+    if (!info->iHandle)
+    	{
+    	delete info;
+    	return mapErr(errno);
+    	}
+
+	// Symbian expects file pos at the begining
+	if (aOpen && aFileMode|EFileWrite)
+		{
+		if (fseek(info->iHandle, 0, SEEK_SET) != 0)
+			{
+			fclose(info->iHandle);
+			delete info;
+	    	return mapErr(errno);
+			}
+		}
+
+    info->iName = aName;
+    info->iMode = aFileMode;
+    memcpy(aFile, &info, 4);
+    return KErrNone;
+    }
+
+EXPORT_C TInt RFile::Open(RFs& aFs, const TDesC& aName, TUint aFileMode)
+/**
+Opens an existing file for reading or writing.
+
+If the file does not already exist, an error is returned.
+
+Notes:
+
+1. To close the file, use Close()
+
+2. Attempting to open a file with the read-only attribute using the EFileWrite
+   access mode results in an error.
+
+3. Attempting to open a file which is greater than or equal to 2GByte (2,147,483,648 bytes)
+   will fail with KErrTooBig
+
+4. After a file has been opened, the current write position is set to the start
+   of the file.
+   If necessary, use RFile::Seek() to move to a different position within
+   the file.
+
+@param aFs   The file server session.
+@param aName The name of the file. Any path components (i.e. drive letter
+             or directory), which are not specified, are taken from
+             the session path.
+@param aMode The mode in which the file is opened. See TFileMode.
+
+@return KErrNone if successful, otherwise one of the other system-wide
+        error codes.
+        
+@see TFileMode
+
+@capability Dependent If the path for aName is /Sys and aMode is neither
+					  EFileShareReadersOnly nor EFileRead then Tcb capability is required.
+@capability Dependent If the path for aName is /Sys and aMode is either
+					  EFileShareReadersOnly or EFileRead then Allfiles capability is required.
+@capability Dependent If the path for aName begins with /Private and does not match this process'
+					  SID then AllFiles capability is required.
+@capability Dependent If the path for aName begins with /Resource and aMode is neither
+ 					  EFileShareReadersOrWriters|EFileRead nor EFileShareReadersOnly 
+ 					  nor EFileRead then Tcb capability is required.
+
+*/
+    {
+#ifdef _DEBUG_LOGGING
+	RDebug::Print(_L("DEBUG: RFile::Open> name=%S mode=%x\n"), &aName, aFileMode);
+#endif
+	
+    return DoOpen(this, aName, aFileMode, ETrue);
+    }
+
+EXPORT_C void RFile::Close()
+/**
+Closes the file.
+
+Any open files are closed when the file server session is closed.
+
+Close() is guaranteed to return, and provides no indication whether
+it completed successfully or not. When closing a file you have written to,
+you should ensure that data is committed to the file by invoking RFile::Flush()
+before closing. If Flush() completes successfully, Close() is essentially a
+no-operation.
+*/
+    {
+    FILEHANDLE(h);
+    if (h)
+    	{
+    	fflush(h->iHandle);
+    	fclose(h->iHandle);
+    	delete h;
+
+		// Make sure the handle is null
+        memset(this, 0, 4);
+    	}
+    }
+
+EXPORT_C TInt RFile::Create(RFs& aFs, const TDesC& aName, TUint aFileMode)
+/**
+Creates and opens a new file for writing.
+
+If the file already exists, an error is returned.
+
+If the resulting path does not exist, then the operation cannot proceed and
+the function returns an error code.
+
+Notes:
+
+1. To close the file, use Close()
+
+2. It automatically sets the file's archive attribute.
+
+@param aFs   The file server session.
+@param aName The name of the file. Any path components (i.e. drive letter
+             or directory), which are not specified, are taken from
+             the session path.
+@param aMode The mode in which the file is opened. The access mode is
+             automatically set to EFileWrite. See TFileMode.
+
+@return KErrNone if successful, otherwise one of the other system-wide
+        error codes.
+        
+@see TFileMode
+
+@capability Dependent If the path in aName starts with /Sys then capability Tcb is required
+@capability Dependent If the path in aName starts with /Resource then capability Tcb is required
+@capability Dependent If the path in aName starts with /Private and does not match this process'
+					  SID then AllFiles capability is required.
+
+*/
+    {
+#ifdef _DEBUG_LOGGING
+    RDebug::Print(_L("DEBUG: RFile::Create> name=%S mode=%x\n"), &aName, aFileMode);
+#endif
+    
+    TUint att;
+    if (aFs.Att(aName, att) == KErrNone)
+    	return KErrAlreadyExists;
+    return DoOpen(this, aName, aFileMode|EFileWrite, EFalse);
+    }
+
+EXPORT_C TInt RFile::Replace(RFs& aFs, const TDesC& aName, TUint aFileMode)
+/**
+Opens a file for writing, replacing the content of any existing file of the
+same name if it exists, or creating a new file if it does not exist.
+
+If the resulting path exists, then:
+
+- the length of an existing file with the same filename is re-set to zero 
+
+- a new file is created, if no existing file with the same filename can be found.
+
+If the resulting path does not exist, then the operation cannot proceed and
+the function returns an error code.
+
+Notes:
+
+- To close the file, use Close(), defined in the base class RFsBase.
+
+- It automatically sets the file's archive attribute.
+
+@param aFs   The file server session.
+@param aName The name of the file. Any path components (i.e. drive letter
+             or directory), which are not specified, are taken from
+             the session path.
+@param aMode The mode in which the file is opened. The access mode is
+             automatically set to EFileWrite. See TFileMode.
+
+@return KErrNone if successful, otherwise one of the other system-wide
+        error codes.
+        
+@see TFileMode
+
+@capability Dependent If the path in aName starts with /Sys then capability Tcb is required
+@capability Dependent If the path in aName starts with /Resource then capability Tcb is required
+@capability Dependent If the path in aName starts with /Private and does not match this process'
+					  SID then AllFiles capability is required.
+
+*/
+    {
+#ifdef _DEBUG_LOGGING
+    RDebug::Print(_L("DEBUG: RFile::Replace> name=%S mode=%x\n"), &aName, aFileMode);
+#endif
+    
+    return DoOpen(this, aName, aFileMode|EFileWrite, EFalse);
+    }
+
+EXPORT_C TInt RFile::Temp(RFs& aFs, const TDesC& aPath, TFileName& aName, TUint aFileMode)
+/**
+Creates and opens a temporary file with a unique name for writing and reading.
+
+Notes:
+
+1. To close the file, use Close()
+
+@param aFs   The file server session.
+@param aPath The directory in which the file is created.
+@param aName On return, contains the full path and file name of the file.
+             The filename is guaranteed to be unique within the directory
+             specified by aPath.
+@param aMode The mode in which the file is opened. The access mode is
+             automatically set to EFileWrite. See TFileMode.
+
+@return KErrNone if successful, otherwise one of the other system-wide
+        error codes.
+        
+@see TFileMode
+
+@capability Dependent If aPath starts with /Sys then capability Tcb is required
+@capability Dependent If aPath starts with /Resource then capability Tcb is required
+@capability Dependent If aPath starts with /Private and does not match this process'
+					  SID then AllFiles capability is required.
+*/
+	{
+	// Check for a valid path
+	if (aPath.Length() > 0 && aPath[aPath.Length() - 1] != '\\')
+		return KErrBadName;
+
+	// Create a temporary file name
+	TFileName name;
+	while(1)
+		{
+		name.Format(_L("%Ssymport%d.tmp"), &aPath, Math::Random());	
+
+		TUint att;
+		TInt err = aFs.Att(name, att);
+		if (err == KErrNotFound)
+			break;
+		else if (err != KErrNone)
+			return err;
+		}
+		
+	TInt err = Create(aFs, name, aFileMode);
+	if (err == KErrNone)
+		{
+		aName = name;
+		return KErrNone;
+		}
+	// The path couldn't be found
+	else if (err == KErrNotFound)
+		return KErrBadName;
+
+	return err;
+	}
+
+EXPORT_C TInt RFile::Read(TDes8& aDes) const
+/**
+Reads from the file at the current position.
+
+This is a synchronous function.
+
+Note that when an attempt is made to read beyond the end of the file,
+no error is returned. 
+The descriptor's length is set to the number of bytes read into 
+it. Therefore, when reading through a file,the end of file has been reached 
+when the descriptor length, as returned by TDesC8::Length(), is zero.
+
+@param aDes Descriptor into which binary data is read. Any existing contents 
+            are overwritten. On return, its length is set to the number of
+            bytes read.
+@return KErrNone if successful, otherwise one of the other system-wide error 
+        codes.
+
+@see TDesC8::Length
+*/
+	{
+	return Read(aDes, aDes.MaxLength());
+	}
+
+EXPORT_C TInt RFile::Read(TDes8& aDes, TInt aLength) const
+/**
+Reads the specified number of bytes of binary data from the file at the current position.
+
+This is a synchronous function.
+
+Note that when an attempt is made to read beyond the end of the file,
+no error is returned. 
+The descriptor's length is set to the number of bytes read into 
+it. Therefore, when reading through a file,the end of file has been reached 
+when the descriptor length, as returned by TDesC8::Length(), is zero.
+Assuming aLength is less than the maximum length of the descriptor, the only circumstances 
+in which Read() can return fewer bytes than requested, is when the end of 
+file is reached or if an error occurs.
+
+@param aDes    Descriptor into which binary data is read. Any existing
+               contents are overwritten. On return, its length is set to
+               the number of bytes read.
+            
+@param aLength The number of bytes to be read from the file into the descriptor. 
+               If an attempt is made to read more bytes than the descriptor's 
+               maximum length, the function returns KErrOverflow.
+               This value must not be negative, otherwise the function
+               returns KErrArgument.
+               
+@return KErrNone if successful, otherwise one of the other system-wide error
+        codes.
+*/
+	{
+
+#ifdef _DEBUG_LOGGING
+
+    RDebug::Print(_L("DEBUG: Read1> length=%d\n"), aLength);
+
+#endif
+
+
+    FILEHANDLE(h);
+    if (aLength > aDes.MaxLength())
+    	return KErrOverflow;
+
+	// If the file has been written then you have set the position for a read to succeed
+	fseek(h->iHandle, 0, SEEK_CUR);
+
+    size_t len = fread(const_cast<TUint8*>(aDes.Ptr()), 1, aLength, h->iHandle);
+	TInt err = ferror(h->iHandle);
+	if (err != 0)
+		return mapErr(err);
+	aDes.SetLength(len);
+		
+    return KErrNone;
+	}
+
+EXPORT_C TInt RFile::Read(TInt aPos, TDes8& aDes) const
+/**
+Reads from the file at the specified offset within the file
+
+This is a synchronous function.
+
+Note that when an attempt is made to read beyond the end of the file,
+no error is returned. 
+The descriptor's length is set to the number of bytes read into it.
+Therefore, when reading through a file, the end of file has been reached 
+when the descriptor length, as returned by TDesC8::Length(), is zero.
+
+@param aPos Position of first byte to be read.  This is an offset from
+            the start of the file. If no position is specified, reading
+            begins at the current file position. 
+            If aPos is beyond the end of the file, the function returns
+            a zero length descriptor.
+            
+@param aDes The descriptor into which binary data is read. Any existing content
+            is overwritten. On return, its length is set to the number of
+            bytes read.
+            
+@return KErrNone if successful, otherwise one of the other system-wide error 
+        codes.
+
+@panic FSCLIENT 19 if aPos is negative.        
+*/
+	{
+    return Read(aPos, aDes, aDes.MaxLength());
+	}
+
+EXPORT_C TInt RFile::Read(TInt aPos, TDes8& aDes, TInt aLength) const
+/**
+Reads the specified number of bytes of binary data from the file at a specified 
+offset within the file.
+
+This is a synchronous function.
+
+Note that when an attempt is made to read beyond the end of the file,
+no error is returned. 
+The descriptor's length is set to the number of bytes read into it.
+Therefore, when reading through a file, the end of file has been reached 
+when the descriptor length, as returned by TDesC8::Length(), is zero.
+Assuming aLength is less than the maximum length of the descriptor, the only
+circumstances in which Read() can return fewer bytes than requested is when
+the end of file is reached or if an error has occurred.
+
+@param aPos    Position of first byte to be read. This is an offset from
+               the start of the file. If no position is specified, 
+               reading begins at the current file position.
+               If aPos is beyond the end of the file, the function returns
+               a zero length descriptor.
+               
+@param aDes    The descriptor into which binary data is read. Any existing
+               contents are overwritten. On return, its length is set to
+               the number of bytes read.
+@param aLength The number of bytes to read from the file into the descriptor. 
+               If an attempt is made to read more bytes than the descriptor's
+               maximum length, then the function updates aStatus parameter with KErrOverflow.
+               It must not be negative otherwise the function updates aStatus with KErrArgument.
+               
+@return KErrNone if successful, otherwise one of the other system-wide
+        error codes.
+
+@panic FSCLIENT 19 if aPos is negative.        
+*/
+	{
+#ifdef _DEBUG_LOGGING
+
+    RDebug::Print(_L("DEBUG: Read2> length=%d\n"), aLength);
+
+#endif
+
+
+
+	FILEHANDLE(h);
+    if (aLength > aDes.MaxLength())
+    	return KErrOverflow;
+
+	// Check pos doesn't go past the end of the file
+	TInt size;
+	TInt err = Size(size);
+	if (err != KErrNone)
+		return err;
+	aPos = Min(size, aPos);
+
+    if (fseek(h->iHandle, aPos, SEEK_SET) == 0)
+    	{
+    	size_t len = fread(const_cast<TUint8*>(aDes.Ptr()), 1, aLength, h->iHandle);
+    	if (len == 0 && ferror(h->iHandle) != 0)
+    		return mapErr(ferror(h->iHandle));
+        aDes.SetLength(len);
+        return KErrNone;
+    	}
+    return mapErr(errno);
+	}
+
+EXPORT_C TInt RFile::Write(const TDesC8& aDes)
+/**
+Writes to the file at the current offset within the file.
+
+This is a synchronous function.
+
+NB Attempting to extend the file to 2 GByte or greater will fail with KErrTooBig
+
+@param aDes The descriptor from which binary data is written.
+            The function writes the entire contents of aDes to the file.
+
+@return KErrNone if successful, otherwise one of the other system-wide error 
+        codes.
+*/
+	{
+    return Write(aDes, aDes.Length());
+	}
+
+EXPORT_C TInt RFile::Write(const TDesC8& aDes, TInt aLength)
+/**
+Writes a portion of a descriptor to the file at the current offset within
+the file.
+
+This is a synchronous function.
+
+NB Attempting to extend the file to 2 GByte or greater will fail with KErrTooBig
+
+@param aDes    The descriptor from which binary data is written.
+@param aLength The number of bytes to be written from the descriptor.
+               This must not be greater than the length of the descriptor.
+               It must not be negative.
+
+@return KErrNone if successful; KErrArgument if aLength is negative;
+		otherwise one of the other system-wide error codes.
+        
+@panic FSCLIENT 27 in debug mode, if aLength is greater than the length
+       of the descriptor aDes.  
+*/
+    {
+#ifdef _DEBUG_LOGGING
+
+    RDebug::Print(_L("DEBUG: Write1> length=%d\n"), aLength);
+
+#endif
+
+
+
+    FILEHANDLE(h);
+    if (aLength < 0)
+    	return KErrArgument;
+
+
+	// Trying to write to a file that hasn't been opened for write?
+
+	if (!(h->iMode&EFileWrite))
+
+		return KErrAccessDenied;
+
+
+	// If the file has been read then you have set the position for a write to succeed
+	fseek(h->iHandle, 0, SEEK_CUR);
+
+    size_t sz = fwrite(aDes.Ptr(), 1, aLength, h->iHandle);
+	if (sz != (TUint)aLength)
+		return mapErr(ferror(h->iHandle));
+    return KErrNone;
+    }
+
+EXPORT_C TInt RFile::Write(TInt aPos, const TDesC8& aDes)
+/**
+Writes to the file at the specified offset within the file
+
+This is a synchronous function.
+
+NB Attempting to extend the file to 2 GByte or greater will fail with KErrTooBig
+
+@param aPos The offset from the start of the file at which the first
+            byte is written. 
+            If a position beyond the end of the file is specified, then
+            the write operation begins at the end of the file.
+            If the position has been locked, then the write fails.
+            
+@param aDes The descriptor from which binary data is written. The function writes 
+            the entire contents of aDes to the file.
+            
+@return KErrNone if successful, otherwise one of the other system-wide error
+        codes.
+
+@panic FSCLIENT 19 if aPos is negative.                       
+*/
+	{
+    return Write(aPos, aDes, aDes.Length());
+	}
+
+EXPORT_C TInt RFile::Write(TInt aPos, const TDesC8& aDes, TInt aLength)
+/**
+Writes the specified number of bytes to the file at the specified offset within the file.
+
+This is a synchronous function.
+
+NB Attempting to extend the file to 2 GByte or greater will fail with KErrTooBig
+
+@param aPos    The offset from the start of the file at which the first
+               byte is written. 
+               If a position beyond the end of the file is specified, then
+               the write operation begins at the end of the file.
+               If the position has been locked, then the write fails.
+                             
+@param aDes    The descriptor from which binary data is written.
+@param aLength The number of bytes to be written from aDes .
+			   It must not be negative.
+
+@return KErrNone if successful; KErrArgument if aLength is negative;
+		otherwise one of the other system-wide error codes.
+        
+@panic FSCLIENT 19 if aPos is negative.                       
+*/
+    {
+#ifdef _DEBUG_LOGGING
+
+    RDebug::Print(_L("DEBUG: Write2> length=%d\n"), aLength);
+
+#endif
+
+
+
+    FILEHANDLE(h);
+    if (aLength < 0)
+    	return KErrArgument;
+
+
+	// Trying to write to a file that hasn't been opened for write?
+
+	if (!(h->iMode&EFileWrite))
+
+		return KErrAccessDenied;
+
+
+	// Check pos doesn't go past the end of the file
+	TInt size;
+	TInt err = Size(size);
+	if (err != KErrNone)
+		return err;
+	aPos = Min(size, aPos);
+
+    if (fseek(h->iHandle, aPos, SEEK_SET) == 0)
+    	{
+    	size_t sz = fwrite(aDes.Ptr(), 1, aLength, h->iHandle);
+    	if (sz != (TUint)aDes.Length())
+    		return mapErr(ferror(h->iHandle));
+    	return KErrNone;
+    	}
+    return mapErr(errno);
+	}
+
+EXPORT_C TInt RFile::Seek(TSeek aMode, TInt& aPos) const
+/**
+Sets the the current file position.
+
+The function can also be used to get the current file 
+position without changing it. The file position is the position at which
+reading and writing takes place. The start of the file is position zero.
+
+To retrieve the current file position without changing it, specify ESeekCurrent 
+for the seek mode, and zero for the offset.
+
+If the seek mode is ESeekStart, then:
+
+1. the function does not modify the aPos argument,
+
+2. the function returns an error if the offset specified is negative.
+
+If the seek mode is ESeekAddress, an error is returned if:
+
+1. the file is not in ROM, 
+
+2. the offset specified is greater than the size of the file.
+
+@param aMode Seek mode. Controls the destination of the seek operation.
+@param aPos  Offset from location specified in aMode. Can be negative.
+             On return contains the new file position.
+             If the seek mode is either ESeekCurrent or ESeekEnd and the offset
+             specifies a position before the start of the file 
+             or beyond the end of the file, then on return, aPos is set to
+             the new file position (either the start or the end of the file).
+             If the seek mode is ESeekAddress, aPos returns the address of
+             the byte at the specified offset within the file.
+
+@return KErrNone if successful, otherwise one of the other system-wide error 
+        codes.
+*/
+	{
+	FILEHANDLE(h);
+	
+	// Get file size
+	TInt size;
+	TInt ret = Size(size);
+	if (ret != KErrNone)
+		return ret;
+
+	switch(aMode)
+		{
+		case ESeekStart:
+			{			
+			// Make sure you don't seek past the end
+			ret = fseek(h->iHandle, Min(aPos, size), SEEK_SET);
+			break;
+			}
+		case ESeekCurrent:
+			{
+			// Get file position
+			if ((ret = ftell(h->iHandle)) >= 0)
+				{
+				TInt current = ret;
+				ret = 0;
+
+				// Try and move the file position
+				// fseek will move past the end of the file but RFile doesn't allow this
+				// fseek thinks it's invalid to move before the start, RFile allows this and sets file pos to zero
+				TInt request = Max(0, Min(current + aPos, size));
+				if ((ret = fseek(h->iHandle, request, SEEK_SET)) == 0)
+					aPos = request;
+				}
+			break;
+			}
+		case ESeekEnd:
+			{
+			// Try and move the file position
+			// fseek will move past the end of the file but RFile doesn't allow this
+			TInt request = Max(0, Min(size + aPos, size));
+			if ((ret = fseek(h->iHandle, request, SEEK_SET)) == 0)
+				aPos = request;
+			break;
+			}
+		default: // Applies to ESeekAddress
+			return KErrNotSupported;
+		}
+	if (ret)
+		return mapErr(errno);
+	return KErrNone;
+	}
+
+EXPORT_C TInt RFile::Flush()
+/**
+Commits data to the storage device and flushes internal buffers without closing 
+the file.
+
+Although RFile::Close() also flushes internal buffers, it is often useful 
+to call Flush() before a file is closed. This is because Close() returns no 
+error information, so there is no way of telling whether the final data was 
+written to the file successfully or not. Once data has been flushed, Close() 
+is effectively a no-operation.
+
+@return KErrNone if successful, otherwise one of the other system-wide error 
+        codes.
+*/
+    {
+    FILEHANDLE(h);
+
+	// Flush messes with the file pointer!
+    TInt oldpos = ftell(h->iHandle);
+	if (oldpos < 0)
+		return mapErr(errno);
+    if (fflush(h->iHandle) != 0)
+    	return mapErr(errno);
+    if (fseek(h->iHandle, oldpos, SEEK_SET) != 0)
+		return mapErr(errno);
+
+	return KErrNone;
+    }
+
+EXPORT_C TInt RFile::Size(TInt& aSize) const
+/**
+Gets the current file size.
+
+@param aSize On return, the size of the file in bytes.
+
+@return KErrNone if successful, otherwise one of the other system-wide error 
+        codes.
+*/
+	{
+    FILEHANDLE(h);
+    
+	// Have to flush data before changing size - flush messes with the file pointer!
+    TInt oldpos = ftell(h->iHandle);
+	if (oldpos < 0)
+		return mapErr(errno);
+    if (fflush(h->iHandle) != 0)
+    	return mapErr(errno);
+    if (fseek(h->iHandle, oldpos, SEEK_SET) != 0)
+    	return mapErr(errno);
+	
+    struct stat sb;
+    if (fstat(fileno(h->iHandle), &sb) == 0)
+    	{
+    	aSize = sb.st_size;
+    	return KErrNone;
+    	}
+
+    return mapErr(errno);
+	}
+
+EXPORT_C TInt RFile::SetSize(TInt aSize)
+/**
+Sets the file size.
+
+If the size of the file is reduced, data may be lost from 
+the end of the file.
+
+Note:
+
+1. The current file position remains unchanged unless SetSize() reduces the size 
+   of the file in such a way that the current file position is now beyond
+   the end of the file. In this case, the current file position is set to
+   the end of file. 
+
+2. If the file was not opened for writing, an error is returned.
+
+@param aSize The new size of the file, in bytes. This value must not be negative, otherwise the function raises a panic.
+
+@return KErrNone if successful, otherwise one of the other system-wide error 
+        codes.
+
+@panic FSCLIENT 20 If aSize is negative.
+
+*/
+	{
+	FILEHANDLE(h);
+
+
+	// Trying to set size on a file that hasn't been opened for write?
+
+	if (!(h->iMode&EFileWrite))
+
+		return KErrAccessDenied;
+
+
+    // fflush messes with the file position!
+    TInt oldpos = ftell(h->iHandle);
+	if (oldpos < 0)
+		return mapErr(errno);
+    if (fflush(h->iHandle) != 0)
+    	return mapErr(errno);
+    if (fseek(h->iHandle, oldpos, SEEK_SET) != 0)
+    	return mapErr(errno);
+    
+	// Now change the file size
+	if (ftruncate(fileno(h->iHandle), aSize) != 0)
+		return mapErr(errno);
+	return KErrNone;
+	}
+
+EXPORT_C TInt RFile::Att(TUint& aVal) const
+/**
+Gets the file's attributes.
+
+@param aVal A bitmask which, on return, contains the file’s attributes.
+            For more information, see KEntryAttNormal and the other
+            file/directory attributes.    
+
+@return KErrNone if successful, otherwise one of the other system-wide error 
+        codes.
+        
+@see KEntryAttNormal        
+*/
+	{
+	FILEHANDLE(h);
+	RFs fs;
+	return fs.Att(h->iName, aVal);
+	}
+
+EXPORT_C TInt RFile::SetAtt(TUint aSetAttMask,TUint aClearAttMask)
+/**
+Sets or clears file attributes using two bitmasks.
+
+The first mask controls which attributes are set.
+The second controls which attributes are cleared.
+
+Notes:
+
+1. The file must have been opened for writing, or an error is returned.
+
+2. A panic is raised if any attribute is specified in both bitmasks.
+
+3. An attempt to set or clear the KEntryAttDir, KEntryAttVolume or KEntryAttRemote
+   attributes have no effect.
+
+4. The new attribute values take effect when the file is flushed or closed (which 
+   implies a flush).
+
+@param aSetAttMask   A bitmask indicating the file attributes to be set
+@param aClearAttMask A bitmask indicating the attributes to be cleared. For 
+                     more information see KEntryAttNormal, and the other
+                     file/directory attributes.
+                     
+@return KErrNone if successful, otherwise one of the other system-wide error 
+        codes.
+        
+@panic FSCLIENT 21 if the same attribute bit is set in both bitmasks.
+*/
+	{
+	FILEHANDLE(h);
+	RFs fs;
+	return fs.SetAtt(h->iName, aSetAttMask, aClearAttMask);
+	}
+
+EXPORT_C TInt RFile::Modified(TTime& aTime) const
+/**
+Gets local date and time the file was last modified, in universal time.
+
+@param aTime On return, contains the date and time the file was last modified in UTC.
+
+@return KErrNone if successful, otherwise one of the other system-wide error 
+        codes.
+*/
+	{
+	FILEHANDLE(h);
+	RFs fs;
+	TEntry entry;
+	TInt err = fs.Entry(h->iName, entry);
+	if (err < KErrNone)
+		return err;
+	aTime = entry.iModified;
+	return KErrNone;
+	}
+
+EXPORT_C TInt RFile::ChangeMode(TFileMode aNewMode)
+/**
+Switches an open file's access mode between EFileShareExclusive and EFileShareReadersOnly.
+
+This allows or disallows read-only access without having to close and re-open the file.
+
+@param aNewMode The new access mode.
+
+@return KErrNone, if successful;
+        KErrArgument, if aNewMode has any value other than the two specified;
+        KErrAccessDenied, if:
+        a) the function is called when the current file share
+        mode is EFileShareAny;
+        b) the file has multiple readers, and an attempt is made
+        to change the share mode to EFileShareExclusive; 
+        c) the file has been opened for writing in EFileShareExclusive mode, and an 
+        attempt is made to change the access mode to EFileShareReadersOnly.
+
+@capability Dependent If the path starts with /Resource then capability DiskAdmin is required
+
+*/
+	{
+	// Pretend it worked!
+	return KErrNone;
+	}
+
+EXPORT_C TInt RFile::Drive(TInt &aDriveNumber, TDriveInfo &aDriveInfo) const
+/**
+Gets information about the drive on which this file resides.
+ 
+@param aDriveNumber On return, the drive number.
+
+@param aDriveInfo   On return, contains information describing the drive
+                    and the medium mounted on it. The value of TDriveInfo::iType
+                    shows whether the drive contains media.
+
+@return       KErrNone, if successful, otherwise one of the other
+              system-wide error codes
+              
+@see RFs::Drive
+*/
+	{
+	aDriveNumber = EDriveC;
+	aDriveInfo.iType = EMediaHardDisk;
+	aDriveInfo.iBattery = EBatNotSupported;
+	aDriveInfo.iDriveAtt = KDriveAttLocal|KDriveAttInternal;
+	aDriveInfo.iMediaAtt = 0;
+	return KErrNone;
+	}
+
+EXPORT_C TInt RFile::Rename(const TDesC& aNewName)
+/**
+Renames a file.
+
+If aNewName specifies a different directory to the one in which 
+the file is currently located, then the file is moved.
+
+@param aNewName The new file name and/or directory path. No part may contain 
+                wildcard characters or an error is returned.
+                
+@return KErrNone if successful, otherwise one of the other system-wide error 
+        codes.
+*/
+	{
+	FILEHANDLE(h);
+	TFileName name(h->iName);
+	
+	// Need the file to be opened for write
+	if (!(h->iMode & EFileWrite))
+		return KErrAccessDenied;
+
+	TBuf8<KMaxFileName + 1> copyOld;
+	const char* oldName = PosixFilename(name, copyOld);
+	
+	TBuf8<KMaxFileName + 1> copyNew;
+	const char* newName = PosixFilename(aNewName, copyNew);
+	
+	// Remember the file position
+	TInt pos = 0;
+	TInt err = Seek(ESeekCurrent, pos);
+	if (err != KErrNone)
+		return err;
+
+	// Close the file
+	Close();
+	
+	// Rename the file
+	if (rename(oldName, newName) != 0)
+		return mapErr(errno);
+	
+	// Open the file again
+	RFs fs;
+	err = Open(fs, aNewName, EFileWrite);
+	if (err != KErrNone)
+		return err;
+
+	// Reposition the file pointer
+	return Seek(ESeekStart, pos);
+	}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/f32/sfsrv/cl_find.cpp	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,93 @@
+// Copyright (c) 1996-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// f32\sfsrv\cl_find.cpp
+// 
+//
+
+#include "cl_std.h"
+
+EXPORT_C TFindFile::TFindFile(RFs& aFs)
+	: iFs(&aFs), iPathPos(0), iCurrentDrive(0), iMode(-1), iMatchMask(0)
+/**
+Constructor taking a file server session.
+
+@param aFs File server session.
+*/
+	{
+	
+	iFile.Set(_L(""),NULL,NULL);
+	}
+
+TInt TFindFile::DoFindByPath(const TDesC& aFileName,const TDesC* aPath)
+//
+// Look for a file in each directory in the path
+// Make initial check for aFileName in the current directory
+//
+	{
+	TUint att;
+	
+#ifdef _DEBUG_LOGGING
+	RDebug::Print(_L("DEBUG: FindByPath> aFileName=%S id=%x\n"), &aFileName);
+#endif
+	
+	// At the moment this is just looking for an exact match for the file
+	// or does the file exist in the current directory
+	iFile.Set(aFileName, NULL, NULL);
+	if (iFs->Att(iFile.FullName(), att) == KErrNone)
+		return KErrNone;
+	
+	iFile.Set(iFile.NameAndExt(), NULL, NULL);
+	return iFs->Att(iFile.FullName(), att);
+	}
+
+EXPORT_C TInt TFindFile::FindByPath(const TDesC& aFileName,const TDesC* aPath)
+/**
+Searches for a file/directory in one or more directories in the path.
+
+The search ends when the file/directory is found, or when every directory
+specified in the path list has been unsuccessfully searched.
+
+Notes:
+	
+1. For the equivalent search using wildcards, use FindWildByPath().
+
+2. After a file has been found, use TFindFile::File() to get the fully qualified path of the file. To
+   search for the next occurrence, use TFindFile::Find().
+
+@param aFileName The filename to search for. If this specifies a directory as well
+                 as a filename, then that directory is searched first.
+@param aPath     A list of directories to be searched. Paths in this list must
+                 be separated by a semicolon character, but a semicolon is not
+                 required after the	final path. The directories are searched in
+                 the order in which they occur in the list. If a path in
+                 the list contains a drive letter, that drive alone is searched.
+                 If a path contains no drive letter, the function searches for
+                 the file in that directory on every available drive in turn,
+                 beginning with drive Y:, in descending alphabetical order
+                 and ending with drive Z:.When path is empty then session path 
+                 will be used for the search.
+
+@return KErrNone, if the filename was found;
+        KErrNotFound, if the filename was not found.
+        KErrArgument, if the filename is empty. 
+
+@see TFindFile::FindWildByPath
+@see TFindFile::File
+@see TFindFile::Find
+*/
+	{
+
+	iDir=NULL;
+	return(DoFindByPath(aFileName,aPath));
+	}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/f32/sfsrv/cl_ftext.cpp	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,327 @@
+// Copyright (c) 1996-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// f32\sfsrv\cl_ftext.cpp
+// 
+//
+
+#include "cl_std.h"
+
+
+
+
+EXPORT_C TFileText::TFileText()
+/**
+Default constructor.
+*/
+	{}
+
+
+
+
+EXPORT_C void TFileText::Set(RFile& aFile)
+/**
+Sets the Unicode file to be read from, or written to.
+
+This function must be called before 
+Read(), Write() or Seek() can be used.
+
+@param aFile The file to be used. Must be open.
+
+@see TFileText::Read
+@see TFileText::Write
+@see TFileText::Seek
+*/
+	{
+
+	iFile=aFile;
+	iReadBuf.Zero();
+	iNext=(TText*)iReadBuf.Ptr();
+	iEnd=iNext;
+	TInt pos = 0;
+	iFile.Seek(ESeekCurrent,pos);
+ 	if (pos == 0)
+ 		iState = EStartOfFile;
+ 	else
+ 		iState = ENormal;
+	}
+
+
+
+
+EXPORT_C TInt TFileText::Read(TDes& aDes)
+/**
+Reads single line text record from a Unicode file into the specified descriptor.
+
+The read operation begins at the current file position, and ends when
+a line delimiter character is read.
+
+If the maximum length of the descriptor is insufficient to hold the record, 
+the function returns KErrTooBig and the descriptor is filled to its maximum 
+length.
+
+If Read() is called when the current position is the end of the file (that 
+is, after the last line delimiter in the file), KErrEof is returned, and the 
+length of the buffer is set to zero.
+
+@param aDes On return, contains the single record read from the file. Any 
+            previous contents are overwritten.
+
+@return KErrNone if successful, otherwise one of the other system-wide error 
+        codes.
+*/
+	{
+
+	TText* pD=(TText*)aDes.Ptr();
+	TInt len=aDes.MaxLength();
+	TInt newLen=0;
+	while (newLen<len)
+		{
+		if (iNext>=iEnd)
+			{
+			TInt r=FillBuffer();
+			if (r!=KErrNone && r!=KErrEof)
+				return(r);
+			if (r==KErrEof)
+				{
+				aDes.SetLength(newLen);
+				return(newLen ? KErrNone : KErrEof);
+				}
+			continue;
+			}
+		TBool terminate=newLen;
+		TInt r=CheckForTerminator(terminate);
+		if (r!=KErrNone || terminate)
+			{
+			aDes.SetLength(newLen);
+			return(r);
+			}
+		*pD++=(*iNext++);
+		newLen++;
+		}
+	aDes.SetLength(newLen);
+	TBool terminate=newLen;
+	TInt r=CheckForTerminator(terminate);
+	if (r!=KErrNone || terminate)
+		return(r);
+	NextRecord();
+	return(KErrTooBig);
+	}
+
+void TFileText::NextRecord()
+//
+// Move to the start of the next record
+//
+	{
+
+	FOREVER
+		{
+		TBool terminate=EFalse;
+		TInt r=CheckForTerminator(terminate);
+		if (r!=KErrNone || terminate)
+			return;
+		iNext++;
+		}
+	}
+
+static void SwapWords(TText* aStart,TInt aCount)
+ 	{
+ 	TUint8* p = (TUint8*)aStart;
+ 	while (aCount-- > 0)
+ 		{
+ 		TUint8 temp = *p;
+ 		*p = p[1];
+ 		p[1] = temp;
+ 		p += 2;
+   		}
+   	}
+
+TInt TFileText::FillBuffer()
+//
+// Read the new data from the file
+//
+	{
+	
+	TInt r=iFile.Read(iReadBuf);
+	if (r!=KErrNone)
+		return(r);
+	if (iReadBuf.Length()==0)
+		return(KErrEof);
+	iNext=(const TText*)iReadBuf.Ptr();
+	iEnd=iNext+iReadBuf.Length()/sizeof(TText);
+	 
+ 	// Use any leading byte order marker to determine endianness.
+ 	if (iState == EStartOfFile)
+ 		{
+ 		iState = ENormal;
+
+ 		// Ignore an ordinary byte order marker.
+ 		if (*iNext == 0xFEFF)
+ 			iNext++;
+
+ 		// Set the endianness state to 'reverse' if a reversed byte order marker is found.
+ 		else if (*iNext == 0xFFFE)
+ 			{
+ 			iNext++;
+ 			iState = EReverse;
+ 			}
+ 
+ 		if (iNext == iEnd)
+ 			return KErrEof;
+ 		}
+ 
+ 	if (iState == EReverse)
+		SwapWords((TText*)iNext,(iEnd - iNext));
+
+	return(KErrNone);
+	}
+
+TInt TFileText::CheckForTerminator(TBool& anAnswer)
+//
+// Return ETrue if the next char is a record terminator: PARAGRAPH SEPARATOR (U+2029), LINE SEPARATOR (U+2028),
+// CR-LF (U+000D, U+000A), or LF (U+000A)
+//
+	{
+
+	if (iNext>=iEnd)
+		{
+		TInt r=FillBuffer();
+		if (r!=KErrNone)
+			{
+			if (r==KErrEof && anAnswer)
+				return(KErrNone);
+			return(r);
+			}
+		}
+
+	anAnswer=EFalse;
+	const TText* oldNext=iNext;
+	TInt oldBufferLength=iReadBuf.Length();
+	TText c=(*iNext);
+	TBool peek=EFalse;
+
+	// Check for unambiguous paragraph or line separator.
+ 	if (c == 0x2029 || c == 0x2028)
+ 		{
+ 		iNext++;
+ 		anAnswer = ETrue;
+		return KErrNone;
+ 		}
+ 
+ 	// Check for CR-LF or LF.
+ 	if (c == 0x000D)
+		{
+		iNext++;
+		if (iNext<iEnd)
+			c=(*iNext);
+		else
+			{
+			peek=ETrue;
+			TInt r=FillBuffer();
+			if (r!=KErrNone && r!=KErrEof)
+				return(r);
+			if (r==KErrNone)
+				c=(*iNext);
+			}
+		}
+
+	if (c == 0x000A)
+		{
+		iNext++;
+		anAnswer=ETrue;
+		return(KErrNone);
+		}
+
+	iNext=oldNext;
+	if (!peek)
+		return(KErrNone);
+
+	TInt pos=(-1)*(oldBufferLength+iReadBuf.Length());
+	TInt r=iFile.Seek(ESeekCurrent,pos);
+	if (r==KErrNone)
+		r=FillBuffer();
+	if (r!=KErrNone)
+		return(r);
+	iNext=oldNext;
+	return(KErrNone);
+	}
+
+
+
+
+EXPORT_C TInt TFileText::Write(const TDesC& aDes)
+/**
+Writes the contents of a descriptor to the end of a Unicode file.
+
+A line delimiter is appended to the descriptor, and the current file position
+is set to the new end of file.
+
+If the descriptor contains one or more paragraph delimiters, Read() will treat 
+the contents of the descriptor as more than one record.
+
+@param aDes The descriptor content to be appended to the file.
+
+@return KErrNone if successful, otherwise one of the other system-wide error 
+        codes.
+        
+@see TFileText::Read
+*/
+	{
+
+	TInt r=Seek(ESeekEnd);
+	if (r!=KErrNone)
+		return(r);
+	TPtrC8 writeBuf((const TUint8*)aDes.Ptr(),aDes.Size());
+	r=iFile.Write(writeBuf);
+	if (r!=KErrNone)
+		return(r);
+ 	TText lf = 0x000A;
+ 	TPtrC8 lf8((const TUint8*)&lf,sizeof(TText));
+ 	r=iFile.Write(lf8);
+	return(r);
+	}
+
+
+
+
+EXPORT_C TInt TFileText::Seek(TSeek aMode)
+/**
+Seeks to start or end of file.
+
+It is only necessary to call this function before 
+using Read() because Write() always seeks to the end of the file
+before writing.
+
+@param aMode ESeekStart to seek to the start of the file;
+             ESeekEnd to seek to the end.
+             
+@return KErrNone if successful, otherwise one of the other system-wide error 
+        codes.
+
+@panic FSCLIENT 5 if aMode is neither ESeekStart nor ESeekEnd.
+
+@see TFileText::Read
+@see TFileText::Write
+*/
+	{
+
+	__ASSERT_ALWAYS(aMode==ESeekStart || aMode==ESeekEnd,Panic(EFTextIllegalSeekMode));
+	TInt pos=0;
+	TInt ret=iFile.Seek(aMode,pos);
+ 	if (ret == 0 && aMode == ESeekStart)
+ 		iState = EStartOfFile;
+	iNext = (TText*)iReadBuf.Ptr();
+ 	iEnd = iNext;
+	return ret;
+	}
+	
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/f32/sfsrv/cl_parse.cpp	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,849 @@
+// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// f32\sfsrv\cl_parse.cpp
+// 
+//
+
+#include "cl_std.h"
+
+const TInt KLexComponents=4;
+const TInt KLexNames=3;
+
+
+
+
+EXPORT_C TParseBase::TParseBase()
+	: iWild(0)
+/**
+Default constructor.
+*/
+	{
+
+	Mem::FillZ(&iField[0],sizeof(iField));
+	}
+
+
+
+
+TInt TParseBase::ParseDrive(TLex& aName,TBool& aDone)
+//
+// Parse the drive name.
+//
+	{
+
+	TPtrC d=aName.RemainderFromMark();
+	if (d.Length()<2 || d[1]!=KDriveDelimiter)
+		return(KErrNone);	//must be Drive delimeter and longer that tow to be valid drive
+	TCharF c=d[0];
+	if (!c.IsAlpha())		//must be alphaber letter 
+		return(KErrBadName);
+	if (!aDone)
+		{
+		if(iMod)
+			NameBuf()+=d.Left(2);
+		aDone=ETrue;
+		}
+	aName.SkipAndMark(2);
+	return(KErrNone);
+	}
+
+TInt TParseBase::ParsePath(TLex& aName,TBool& aDone)
+//
+// Parse the path.
+//
+	{
+
+	TPtrC d=aName.RemainderFromMark();
+	if (d.Length() && d[0]!=KPathDelimiter)
+		return(KErrNone); // Require first char of path to be a '\'
+	TInt n=d.LocateReverse(KPathDelimiter)+1;
+	if (n && !aDone)
+		{
+		if(iMod)
+			{
+			if (NameBuf().Length()+n>KMaxFileName)
+				return(KErrBadName);
+			NameBuf()+=d.Left(n);
+			}
+		aDone=ETrue;
+		}
+	aName.SkipAndMark(n);
+	return(KErrNone);
+	}
+
+LOCAL_C TBool IsSpace(const TDesC& aDes)
+//
+// Returns ETrue if aDes only contains spaces or is zero length
+//
+	{
+
+	TInt len=aDes.Length();
+	for (TInt i=0;i<len;i++)
+		{
+		TChar txt=aDes[i];
+		if (!txt.IsSpace())
+			return(EFalse);
+		}
+	return(ETrue);
+	}
+
+TInt TParseBase::ParseName(TLex& aName,TBool& aDone)
+//
+// Parse the name.
+//
+	{
+
+	TPtrC d=aName.RemainderFromMark();
+	if (d.Locate(KPathDelimiter)!=KErrNotFound)
+		return(KErrBadName); // Illegal name - filenames cannot contain a '\'
+	TInt n=d.LocateReverse(KExtDelimiter);
+	if (n==KErrNotFound)
+		{
+		n=d.Length();
+		if (IsSpace(d.Left(n)))
+			return(KErrNone);
+		}
+	TPtrC v=d.Left(n);
+	if (n && !aDone)
+		{
+		if (v.Locate(KMatchOne)!=KErrNotFound)	//	Found ? in the name
+			iWild|=(EWildName|EWildEither|EWildIsKMatchOne);		
+		if (v.Locate(KMatchAny)!=KErrNotFound)	//	Found * in the name
+			iWild|=(EWildName|EWildEither|EWildIsKMatchAny);		
+		if(iMod)
+			{
+			if (NameBuf().Length()+n>KMaxFileName)	
+				return(KErrBadName);
+			NameBuf()+=v;
+			if (n==d.Length())
+				NameBuf().TrimRight();
+			}
+		aDone=ETrue;
+		}
+	aName.SkipAndMark(n);
+	return(KErrNone);
+	}
+
+TInt TParseBase::ParseExt(TLex& aName,TBool& aDone)
+//
+// Parse the extension.
+//
+	{
+
+	TPtrC d=aName.RemainderFromMark();
+	if (d.Length() && !IsSpace(d) && !aDone)
+		{
+		if (d.Locate(KMatchOne)!=KErrNotFound || d.Locate(KMatchAny)!=KErrNotFound)
+			iWild|=(EWildExt|EWildEither);
+		if(iMod)
+			{
+			if (NameBuf().Length()+d.Length()>KMaxFileName)
+				return(KErrBadName);
+			NameBuf()+=d;
+			NameBuf().TrimRight();
+			}
+		else
+			aName.SkipAndMark(d.Length());
+		aDone=ETrue;
+		}
+	return(KErrNone);
+	}
+
+TInt TParseBase::Set(const TDesC* aName,const TDesC* aRelated,const TDesC* aDefault,TBool allowWild)
+//
+// Parse a name. Optionally allow wild cards.
+//
+	{
+
+	TInt (TParseBase::*parse[KLexComponents])(TLex& aName,TBool& aDone);
+	parse[0]=&TParseBase::ParseDrive;
+	parse[1]=&TParseBase::ParsePath;
+	parse[2]=&TParseBase::ParseName;
+	parse[3]=&TParseBase::ParseExt;
+	
+	iWild=0;
+
+	Mem::FillZ(&iField[0],sizeof(iField));
+	
+	TLex name(*aName);
+	TLex def;
+	TLex rel;
+	TInt lexnames;
+	if(iMod)
+		{
+		if (aRelated)
+			rel=(*aRelated);
+		if (aDefault)
+			def=(*aDefault);
+		NameBuf().Zero();
+		lexnames = KLexNames;
+		}
+	else
+		{
+		lexnames = 1;
+		}
+	
+	TLex* lex[KLexNames];
+	lex[0]=(&name);
+	lex[1]=(&rel);
+	lex[2]=(&def);
+	
+	name.Mark();
+	rel.Mark();
+	def.Mark();
+	
+	TInt r;
+	TInt pos=0;
+	
+	for (TInt i=0;i<KLexComponents;i++)
+		{
+		TBool done=EFalse;
+		for (TInt j=0;j<lexnames;j++)
+			{
+			if ((r=(this->*parse[i])(*lex[j],done))<KErrNone)
+				return(r);
+			if (j==0 && done)
+				iField[i].present=ETrue;
+			}
+		TInt len;
+		if(iMod)
+			len=NameBuf().Length()-pos;
+		else
+			len=name.MarkedOffset()-pos;
+		iField[i].len=(TUint8)len;
+		iField[i].pos=(TUint8)pos;
+		pos+=len;
+		}
+	if (!allowWild && iWild)
+		return(KErrBadName);
+	if (iField[EPath].len==1)
+		iWild|=EIsRoot;
+	return(KErrNone);
+	}
+
+
+
+
+EXPORT_C TInt TParseBase::PopDir()
+/**
+Removes the last directory from the path in the fully parsed specification.
+ 
+This function may be used to navigate up one level in a directory hierarchy.
+An error is returned if the specified directory is the root.
+
+@return KErrNone if successful, otherwise one of the other system-wide error 
+        codes.
+*/
+	{
+
+	if (IsRoot())
+		return(KErrGeneral);
+	TInt len;
+	if (iField[EName].pos==0 && NameBuf().Length()==256)
+		len=256;
+	else
+		len=iField[EName].pos;
+	TPtrC p(NameBuf().Ptr(),len-1);
+	TInt pos=p.LocateReverse(KPathDelimiter)+1;
+	len-=pos;
+	NameBuf().Delete(pos,len);
+	iField[EName].pos=(TUint8)(iField[EName].pos-len);
+	iField[EExt].pos=(TUint8)(iField[EExt].pos-len);
+	iField[EPath].len=(TUint8)(iField[EPath].len-len);
+	if (iField[EPath].len==1)
+		iWild|=EIsRoot;
+	return(KErrNone);
+	}
+
+
+
+
+EXPORT_C TInt TParseBase::AddDir(const TDesC& aName)
+/**
+Adds a single directory onto the end of the path in
+the fully parsed specification. 
+
+The directory is inserted between the final directory, and the filename, if 
+there is one.
+
+@param aName The directory to be added. It must not start with a \\ otherwise 
+             the function does not recognise it as a valid directory name
+             and an error is returned.
+             The directory name must not end with a \\ since the function 
+             adds this automatically. It must not exceed the maximum
+             filename length, KMaxFileName characters, otherwise  an error
+             is returned.
+
+@return KErrNone if successful, otherwise another of the system-wide error 
+        codes.   
+@see KMaxFileName
+*/
+	{
+
+	if (aName.Length()==0)
+		return(KErrNone);
+	TInt len=aName.Length()+1;
+	if ((len+NameBuf().Length())>NameBuf().MaxLength())
+		return(KErrGeneral);
+	TInt pos=aName.Locate(KPathDelimiter);
+	if (pos!=KErrNotFound)
+		return(KErrBadName);
+	TFileName n=aName;
+	n.Append(KPathDelimiter);
+	NameBuf().Insert(iField[EName].pos,n);
+	iField[EPath].len=(TUint8)(iField[EPath].len+len);
+	iField[EName].pos=(TUint8)(iField[EName].pos+len);
+	iField[EExt].pos=(TUint8)(len+iField[EExt].pos);
+	if (IsRoot())
+		iWild&=~EIsRoot;
+	return(KErrNone);
+	}
+
+
+
+
+EXPORT_C const TDesC& TParseBase::FullName() const
+/**
+Gets the complete file specification.
+
+This is in the form:
+
+drive-letter: \\path\\filename.extension
+
+@return The fully parsed file specification.
+*/
+	{
+
+	return(NameBufC());
+	}
+
+
+
+
+EXPORT_C TPtrC TParseBase::Drive() const
+/**
+Gets the drive letter.
+
+The drive letter is in the form:
+
+drive-letter:
+
+Note that the drive letter is folded.
+
+@return The drive letter and colon.
+*/
+	{
+
+	const SField& f=iField[EDrive];
+	return(NameBufC().Mid(f.pos,f.len));
+	}
+
+
+
+
+EXPORT_C TPtrC TParseBase::Path() const
+/**
+Gets the path.
+
+The path is in the form:
+
+\\path\\
+
+@return The path. It always begins and ends in a backslash.
+*/
+	{
+
+	const SField& f=iField[EPath];
+	return(NameBufC().Mid(f.pos,f.len));
+	}
+
+
+
+
+EXPORT_C TPtrC TParseBase::DriveAndPath() const
+/**
+Gets the drive letter and path.
+
+This is in the form
+
+drive-letter:\\path\\
+
+Note that the drive letter is folded
+
+@return The drive and path.
+*/
+	{
+
+	const SField& f=iField[EDrive];
+	return(NameBufC().Mid(f.pos,f.len+iField[EPath].len));
+	}
+
+
+
+
+EXPORT_C TPtrC TParseBase::Name() const
+/**
+Gets the filename.
+
+This is in the form
+
+filename
+
+@return The filename.
+*/
+	{
+
+	const SField& f=iField[EName];
+	return(NameBufC().Mid(f.pos,f.len));
+	}
+
+
+
+
+EXPORT_C TPtrC TParseBase::Ext() const
+/**
+Gets the extension.
+
+This is in the form:
+
+.extension
+
+@return The extension and preceding dot.
+*/
+	{
+
+	const SField& f=iField[EExt];
+	return(NameBufC().Mid(f.pos,f.len));
+	}
+
+
+
+
+EXPORT_C TPtrC TParseBase::NameAndExt() const
+/**
+Gets the filename and extension.
+
+This is in the form:
+
+filename.ext
+
+@return The filename and extension.
+*/
+	{
+
+	const SField& f=iField[EName];
+	return(NameBufC().Mid(f.pos,f.len+iField[EExt].len));
+	}
+
+
+
+
+EXPORT_C TBool TParseBase::DrivePresent() const
+/**
+Tests whether a drive is present.
+
+Note that this function refers to a component 
+in the aName argument specified in calls to TParse::Set(), TParse::SetNoWild() 
+or RFs::Parse(), not to the resulting fully parsed file specification.
+
+@return True if a drive present, false if not.
+
+@see TParse
+@see RFs
+*/
+	{
+
+	return(iField[EDrive].present);
+	}
+
+
+
+
+EXPORT_C TBool TParseBase::PathPresent() const
+/**
+Tests whether a path is present.
+
+Note that this function refers to a component 
+in the aName argument specified in calls to TParse::Set(), TParse::SetNoWild() 
+or RFs::Parse(), not to the resulting fully parsed file specification.
+
+@return True if a path present, false if not.
+
+@see TParse
+@see RFs
+*/
+	{
+
+	return(iField[EPath].present);
+	}
+
+
+
+
+EXPORT_C TBool TParseBase::NamePresent() const
+/**
+Tests whether a file name is present.
+
+Note that this function refers to a component 
+in the aName argument specified in calls to TParse::Set(), TParse::SetNoWild() 
+or RFs::Parse(), not to the resulting fully parsed file specification.
+
+This function returns true even if the filename specified in aName contains 
+only wildcards. It only returns false if nothing is specified.
+
+@return True if a name present, false if not.
+*/
+	{
+
+	return(iField[EName].present);
+	}
+
+
+
+
+EXPORT_C TBool TParseBase::ExtPresent() const
+/**
+Tests whether an extension is present.
+
+Note that this function refers to a component
+in the aName argument specified in calls to TParse::Set(), TParse::SetNoWild() 
+or RFs::Parse(), not to the resulting fully parsed file specification.
+
+This function returns true even if the extension contains only wildcards. 
+It only returns false if nothing is specified.
+
+@return True if an extension present, false if not.
+*/
+	{
+
+	return(iField[EExt].present);
+	}
+
+
+
+
+EXPORT_C TBool TParseBase::NameOrExtPresent() const
+/**
+Tests whether a filename or an extension are present.
+
+Note that this function refers to a component in the aName argument
+specified in calls to TParse::Set(), TParse::SetNoWild() or RFs::Parse(), not
+to the resulting fully parsed file specification.
+
+This function returns true even if the filename or extension specified in 
+aName contain only wildcards. It only returns false if nothing is specified.
+
+@return True if either a name or an extension or both are present,
+        otherwise false.
+*/
+	{
+
+	return(iField[EName].present || iField[EExt].present);
+	}
+
+
+
+
+
+EXPORT_C TBool TParseBase::IsRoot() const
+/**
+Tests whether the path in the fully parsed specification is the root directory.
+
+@return True if path is root, false if not.
+*/
+	{
+
+	return(iWild&EIsRoot);
+	}
+
+
+
+
+EXPORT_C TBool TParseBase::IsWild() const
+/**
+Tests whether the filename or the extension in the fully parsed specification 
+contains one or more wildcard characters.
+
+@return True if wildcards are present, false if not.
+*/
+	{
+
+	return(iWild&EWildEither);	
+	}
+
+
+
+
+EXPORT_C TBool TParseBase::IsKMatchOne() const
+/**
+Tests whether the name or the extension contains a question mark wildcard.
+
+@return True if either the name or extension has a ? wild card,
+        false otherwise.
+*/
+	{
+
+	return(iWild&EWildIsKMatchOne);	
+	}
+
+
+
+
+EXPORT_C TBool TParseBase::IsKMatchAny() const
+/**
+Tests whether the name or the extension contains asterisk wildcards.
+
+@return True if either the name or extension has a * wild card,
+        false otherwise.
+*/
+	{
+
+	return(iWild&EWildIsKMatchAny);	
+	}
+
+
+
+
+EXPORT_C TBool TParseBase::IsNameWild() const
+/**
+Tests whether the filename in the fully parsed specification contains one or 
+more wildcard characters.
+
+@return True if the filename contains wildcard characters, false if not.
+*/
+	{
+
+	return(iWild&EWildName);
+	}
+
+
+
+
+EXPORT_C TBool TParseBase::IsExtWild() const
+/**
+Tests whether the extension in the fully parsed specification contains one 
+or more wildcard characters.
+
+@return True if the extension contains wildcard characters, false if not.
+*/
+	{
+
+	return(iWild&EWildExt);
+	}
+
+
+
+
+EXPORT_C TParse::TParse()
+/**
+Default constructor.
+*/
+	{
+	iMod=1;
+	}
+
+
+
+
+EXPORT_C TInt TParse::Set(const TDesC& aName,const TDesC* aRelated,const TDesC* aDefault)
+/**
+Parses a file specification, allowing wildcards in the filename and extension.
+
+This function sets up the TParse object so that it can be used to provide 
+useful information.
+
+@param aName    The file specification to be parsed.
+@param aRelated The related file specification. This is optional,
+                set to NULL to  omit.
+@param aDefault The default file specification. This is optional,
+                set to NULL to omit.
+                
+@return KErrNone, if successful, otherwise one of the other system-wide error
+        codes.
+*/
+	{
+
+	return(TParseBase::Set(&aName,aRelated,aDefault,ETrue));
+	}
+
+
+
+
+EXPORT_C TInt TParse::SetNoWild(const TDesC& aName,const TDesC* aRelated,const TDesC* aDefault)
+/**
+Parses a file specification; disallows wildcards in any part of the file name 
+or extension.
+
+If you need to specify wildcards use Set(). Otherwise, this 
+function behaves in the same way as Set().
+
+@param aName    The file specification to be parsed.
+@param aRelated The related file specification. This is optional,
+                set to NULL to omit.
+@param aDefault The default file specification. This is optional,
+                set to NULL to omit.
+                
+@return KErrNone, if successful, otherwise one of the other system-wide error 
+        codes.
+
+@see TParse::Set
+*/
+	{
+
+	return(TParseBase::Set(&aName,aRelated,aDefault,EFalse));
+	}
+
+
+
+
+EXPORT_C TDes& TParse::NameBuf()
+/**
+Gets a reference to the descriptor containing the file specification passed to
+the constructor of this object. 
+
+@return A reference to the descriptor containing the filename.
+*/
+	{
+
+	return(iNameBuf);
+	}
+
+
+
+
+EXPORT_C const TDesC& TParse::NameBufC() const
+/**
+Gets a const reference to the descriptor containing the file specification
+passed to the constructor of this object. 
+
+@return A const reference to the descriptor containing the file specification.
+*/
+	{
+
+	return(iNameBuf);
+	}
+
+
+
+
+EXPORT_C TParsePtr::TParsePtr(TDes& aName)
+	: iNameBuf((TText*)aName.Ptr(),aName.Length(),aName.MaxLength())
+/**
+Constructor taking a reference to a filename.
+
+The specified filename is parsed and if this fails, a panic is raised.
+
+@param aName Reference to the filename to be parsed. On return contains
+             the fully parsed path specification. If a filename and extension
+             are specified, they may both contain wildcards.
+             The maximum length is KMaxFileName characters.
+             
+@panic FSCLIENT 24 if the the specified name fails to parse.
+             
+@see KMaxFileName
+*/
+	{
+	iMod=1;
+	TInt r=TParseBase::Set(&aName,NULL,NULL,ETrue);
+	__ASSERT_ALWAYS(r==KErrNone,Panic(EParsePtrBadDescriptor0));
+	}
+
+
+
+
+EXPORT_C TDes& TParsePtr::NameBuf()
+/**
+Gets a reference to the descriptor containing the filename passed to
+the constructor of this object. 
+
+@return A reference to the descriptor containing the filename.
+*/
+	{
+
+	return(iNameBuf);
+	}
+
+
+
+
+EXPORT_C const TDesC& TParsePtr::NameBufC() const
+/**
+Gets a const reference to the descriptor containing the filename passed to
+the constructor of this object. 
+
+@return A const reference to the descriptor containing the filename.
+*/
+	{
+
+	return(iNameBuf);
+	}
+
+
+
+
+EXPORT_C TParsePtrC::TParsePtrC(const TDesC& aName)
+/**
+Constructor taking a constant reference to a filename.
+
+The filename is parsed and if this fails, a panic is raised.
+Note that the filename cannot be modified using this class.
+
+@param aName Constant reference to the filename to be parsed.
+             On return contains the fully parsed filename.
+             If a file and extension are specified, they may both
+             contain wildcards.
+             The maximum length is KMaxFileName characters.
+             
+@panic FSCLIENT 24 if the the specified name fails to parse.
+
+@see KMaxFileName
+*/
+	{
+	iMod=0;
+	iNameBuf.Set(aName);
+	TInt r = TParseBase::Set(&aName,NULL,NULL,ETrue);
+	__ASSERT_ALWAYS(r==KErrNone,Panic(EParsePtrBadDescriptor0));
+	}
+
+
+
+
+EXPORT_C TDes& TParsePtrC::NameBuf()
+/**
+Gets a reference to the descriptor containing the filename passed to
+the constructor of this object. 
+
+@return A reference to the descriptor containing the filename.
+*/
+	{
+
+	Panic(EParsePtrCAccessError);
+	return(*(TDes*)&iNameBuf);
+	}
+
+
+
+
+EXPORT_C const TDesC& TParsePtrC::NameBufC() const
+/**
+Gets a const reference to the descriptor containing the filename passed to
+the constructor of this object. 
+
+@return A const reference to the descriptor containing the filename.
+*/
+	{
+
+	return(iNameBuf);
+	}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/f32/sfsrv/cl_std.h	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,75 @@
+// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// f32\sfsrv\cl_std.h
+// 
+//
+
+#ifndef __TOOLS2__
+#include <common.h>		
+#include <message.h>
+#endif
+#include <f32file.h>
+#ifndef __TOOLS2__
+#include <f32ver.h>
+#include <e32svr.h>
+#include <F32plugin.h>
+#else
+const TInt KCountNeeded=KMinTInt;
+#endif
+
+enum TClientPanic
+	{
+	EDriveUnitBadDrive,
+	EDriveUnitBadDriveText,
+	EFindFileIllegalMode,
+	EBadUidIndex,
+	ERawDiskCannotClose,
+	EFTextIllegalSeekMode,
+	ENotImplemented,
+	EFManNotActive,
+	EFManActive,
+	EFManNoActionSet,
+	EFManUnknownAction,
+	EFManCurrentEntryInvalid,
+	EFManBadValueFromObserver,
+	EFManBadNames,
+	EFManRecursiveRename,
+	EDirListError,
+	EAddDirBadName,
+	ELockLengthZero,
+	EUnlockLengthZero,
+	EPosNegative,
+	ESizeNegative,
+	EAttributesIllegal,
+	EEntryArrayBadIndex,
+	ECDirBadSortType,
+	EParsePtrBadDescriptor0,
+	EParsePtrBadDescriptor1,
+	EParsePtrCAccessError,
+	EBadLength,
+	EDefaultPathCalled,
+	ESetDefaultPathCalled,
+	EFindFileIllegalAttribute,
+	};
+//
+enum TClientFault
+	{
+	ENotifyChangeCancel,
+	ESessionClose,
+	ESubSessionClose
+	};
+//
+GLREF_C void Panic(TClientPanic aPanic);
+GLREF_C void Fault(TClientFault aFault);
+//
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/flm/export.pl	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,73 @@
+#!/usr/bin/perl
+
+# Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "Symbian Foundation License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+use strict;
+use warnings;
+use Getopt::Long;
+use File::Spec::Functions;
+use Pod::Usage;
+use File::Copy;
+
+# Version of the script - just use the date
+$main::VERSION = '13-Oct-08';
+
+# Get command line arguments
+my ( $version, $help, $verbose );
+GetOptions("verbose|v" => \$verbose, "version|ver" => \$version, "help|h" => \$help) or pod2usage(2);
+
+# Handle help and version
+pod2usage({ verbose => 1, exitval => 0}) if $help;
+version() if $version;
+
+# Check we can find the build system
+die "SBS_HOME environment variable not defined" if !$ENV{SBS_HOME};
+die "Can't find SBS in $ENV{SBS_HOME}" if !-d $ENV{SBS_HOME};
+
+# Now do the work
+doCopy('x86tool.flm', catfile($ENV{SBS_HOME}, 'lib', 'flm', 'tools', 'x86tool.flm'));
+doCopy('x86tool.xml', catfile($ENV{SBS_HOME}, 'lib', 'flm', 'x86tool.xml'));
+
+# Copy files
+sub doCopy
+	{
+	my ( $src, $dst ) = @_;
+	print "Copying $src to $dst\n" if $verbose;
+	unlink $dst;
+	copy($src, $dst) or die "Failed to copy $src to $dst: $!";
+	}
+
+# New getopt::long provides this - but old version doesn't?
+sub version
+	{
+	print sprintf("$0: $main::VERSION\n$^X: %vd\nos: $^O", $^V);
+	exit;
+	}
+
+=head1 NAME
+
+export.pl - Copies FLM files to the right place
+
+=head1 SYNOPSIS
+
+export.pl [-help] [-version] [-verbose]
+
+ Options:
+   -help      brief help message
+   -version   version of the script
+   -verbose   print what the scripts does
+
+=cut
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/flm/x86tool.flm	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,158 @@
+# Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "Symbian Foundation License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# FLM to build x86 exes, libs and dlls
+#
+
+include $(FLMHOME)/flmtools.mk
+include $(FLMHOME)/metaflm.mk
+
+CREATABLEPATHS:=
+CLEANTARGETS:=
+
+# Handle Window/Linux differences
+ifeq ($(OSTYPE),cygwin)
+  DOTDLL:=.dll
+  WIN32:=1
+  GCOVDIR:=$(if $(CODE_COVERAGE),$(EPOCROOT)/epoc32/gcc_mingw/libgcc/mingw32/3.4.5/)
+else
+  DOTDLL:=.so
+endif
+
+# Product include files are different for S60
+ifdef S60_BUILD
+  PRODUCT_INCLUDE:=$(EPOCROOT)/epoc32/include/oem/bldvariant.hrh
+else
+  PRODUCT_INCLUDE:=$(EPOCROOT)/epoc32/include/variant/Symbian_OS.hrh
+endif
+
+# Define macros we need
+CXXDEFS:=$(foreach def,$(MACROS),-D$(def)) -D__SYMBIAN32__ -D__GCC32__ -D__EPOC32__ -D__X86__ -D_UNICODE -D__SUPPORT_CPP_EXCEPTIONS__ -D__TOOLS2__ -D'__PRODUCT_INCLUDE__="$(PRODUCT_INCLUDE)"'
+ifeq ($(CFG_PATH),deb)
+  CXXDEFS+= -D_DEBUG
+endif
+
+# Setup the command line options for the compiler
+OPTIMISE:=-fdefer-pop -fmerge-constants -fthread-jumps -floop-optimize -fif-conversion -fif-conversion2 -fguess-branch-probability -fcprop-registers -fforce-mem -foptimize-sibling-calls -fstrength-reduce -fcse-follow-jumps -fcse-skip-blocks -frerun-cse-after-loop -frerun-loop-opt -fgcse -fgcse-lm -fgcse-sm -fgcse-las -fdelete-null-pointer-checks -fexpensive-optimizations -fregmove -fschedule-insns -fschedule-insns2 -fsched-interblock -fsched-spec -fcaller-saves -fpeephole2 -freorder-blocks -freorder-functions -fstrict-aliasing -funit-at-a-time -falign-functions -falign-jumps -falign-loops -falign-labels -fcrossjumping
+
+PREINC=$(EPOCROOT)/epoc32/include/x86tool/x86tool.h
+ifeq ($(CFG_PATH),deb)
+  CXXOPT:=-fshort-wchar -x c++ -O0 -g3 -Wall -c -fmessage-length=0 -include $(PREINC)
+else
+  CXXOPT:=-fshort-wchar -x c++ -Wall -c -fmessage-length=0 -include $(PREINC) $(if $(CODE_COVERAGE),-O0,$(OPTIMISE))
+endif
+
+# Allow specification of additional build include file
+ifdef BUILDINC
+  CXXOPT+= -include $(BUILDINC)
+endif
+
+# Extra options needed for cia files
+ASMOPT:=-fomit-frame-pointer -masm=intel
+
+# Linker options for DLL
+ifndef DLL_WIN_LINKER_OPTS
+  DLL_WIN_LINKER_OPTS:=$(if $(CODE_COVERAGE),-lgcov) -Wl,-export-all-symbols -Wl,--enable-auto-import
+endif
+ifndef DLL_LIN_LINKER_OPTS
+  DLL_LIN_LINKER_OPTS:=$(if $(CODE_COVERAGE),-lgcov) -Wl,-export-all-symbols -ldl
+endif
+
+# Source files to scan for in a directory
+# Note that CPP and cpp will match on the same files - so a sort is necessary on wildcard results
+SOURCE_EXT:=CPP cpp c cia
+
+# Source code assumed to be all cpp/cia files in supplied directories
+SOURCE_FILES:=$(foreach dir,$(SOURCE_DIRS),$(sort $(foreach ext,$(SOURCE_EXT),$(wildcard $(EXTENSION_ROOT)/$(dir)/*.$(ext))))) \
+  $(foreach src,$(SOURCE),$(EXTENSION_ROOT)/$(if $(SOURCE_FOLDER),$(SOURCE_FOLDER)/)$(src))
+
+# Include folders
+CXXINC:=$(foreach inc,$(INCLUDES) $(SOURCE_DIRS),-I$(EXTENSION_ROOT)/$(inc)) \
+  $(foreach inc,$(SYS_INCLUDES),-I$(EPOCROOT)/$(inc)) -I$(EXTENSION_ROOT)
+
+# Add standard include paths?
+ifndef NO_STD_INCLUDE
+  CXXINC+= -I$(EPOCROOT)/epoc32/include/x86tool -I$(EPOCROOT)/epoc32/include
+  ifdef S60_BUILD
+    CXXINC+= -I$(EPOCROOT)/epoc32/include/oem
+  endif
+endif
+
+# Generate target folder names
+TARGET_DIR:=$(EPOCROOT)/epoc32/release/tools2$(TOOLPLATFORMDIR)/$(CFG_PATH)/
+OUTPUTPATH:=$(EPOCROOT)/epoc32/build/x86tools/$(CFG_PATH)/$(TARGET_NAME)/
+
+# Target names differ depending on what we're building
+ifeq ($(TARGET_TYPE),lib)
+  TARGET_FULLNAME:=$(TARGET_DIR)lib$(TARGET_NAME)$(if $(findstring .,$(TARGET_NAME)),,.a)
+endif
+ifeq ($(TARGET_TYPE),exe)
+  TARGET_FULLNAME:=$(TARGET_DIR)$(TARGET_NAME)$(if $(findstring .,$(TARGET_NAME)),,$(DOTEXE))
+  LIBS+=symexestub
+endif
+ifeq ($(TARGET_TYPE),dll)
+  TARGET_FULLNAME:=$(TARGET_DIR)lib$(TARGET_NAME)$(if $(findstring .,$(TARGET_NAME)),,$(DOTDLL))
+endif
+
+# Object files are the same name as the source files with a .o extension
+OBJECTFILES:=$(foreach src,$(SOURCE_FILES),$(OUTPUTPATH)$(subst $(EPOCROOT),,$(src)).o)
+
+# Remember what we're going to create for later
+CLEANTARGETS:=$(TARGET_FULLNAME) $(OBJECTFILES)
+RELEASEABLES:=$(TARGET_FULLNAME)
+CREATABLEPATHS:=$(dir $(OBJECTFILES))
+
+# Standard targets
+$(ALLTARGET):: $(RELEASEABLES)
+TARGET:: $(RELEASEABLES)
+
+# ***
+# x86targets
+# 
+define x86targets
+  # Compile
+  $(OBJECTFILES) : $(PREINC) $(SOURCE_FILES)
+		$(call startrule,compile) \
+		$(CXX) $(CXXDEFS) $(CXXINC) -I$(EPOCROOT)$$(subst $(OUTPUTPATH),,$$(dir $$@)) $(CXXOPT) $$(if $$(findstring .cia,$$@),$(ASMOPT),$(if $(CODE_COVERAGE),-fprofile-arcs -ftest-coverage)) $(COMPILE_OPTIONS) -o$$@ $(EPOCROOT)$$(subst $(OUTPUTPATH),,$$(basename $$@)) \
+		$(call endrule,compile)
+
+  # Link
+  $(TARGET_FULLNAME) : $(OBJECTFILES) $(foreach lib,$(LIBS),$(TARGET_DIR)lib$(lib).a) $(foreach lib,$(SHARED_LIBS),$(TARGET_DIR)lib$(lib)$(DOTDLL))
+  ifeq ($(TARGET_TYPE),lib)
+		$(call startrule,linklib) \
+		$(AR) -r $$@ $(OBJECTFILES) \
+		$(call endrule,linklib)
+  endif
+  ifeq ($(TARGET_TYPE),exe)
+		$(call startrule,linkexe) \
+		$(CXX) -L$(TARGET_DIR) $(if $(GCOVDIR),-L$(GCOVDIR)) -o$$@ $(OBJECTFILES) $(foreach lib,$(LIBS) $(SHARED_LIBS),-l$(lib)) $(if $(CODE_COVERAGE),-lgcov) $(if $(WIN32),-Wl$(CHAR_COMMA)--enable-auto-import,-ldl) \
+		$(call endrule,linkexe)
+  endif
+  ifeq ($(TARGET_TYPE),dll)
+		$(call startrule,linkdll) \
+		$(CXX) -L$(TARGET_DIR) $(if $(GCOVDIR),-L$(GCOVDIR)) -shared -o$$@ $(OBJECTFILES) $(foreach lib,$(LIBS) $(SHARED_LIBS), -l$(lib)) $(if $(WIN32),$(DLL_WIN_LINKER_OPTS),$(DLL_LIN_LINKER_OPTS)) \
+		$(call endrule,linkdll)
+  endif
+endef
+
+# Generate the rules
+$(eval $(x86targets))
+
+# Create folders we need
+$(call makepath,$(CREATABLEPATHS))
+
+# Cleanup after ourselves
+$(eval $(call GenerateStandardCleanTarget,$(CLEANTARGETS),$(CREATABLEPATHS)))
+
+# Tell SBS what we're building
+$(eval $(call whatmacro,$(RELEASEABLES),WHATTOOLS2))
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/flm/x86tool.xml	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<build xmlns="http://symbian.com/xml/build"
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xsi:schemaLocation="http://symbian.com/xml/build http://symbian.com/xml/build/2_0.xsd">
+
+	<interface name="tools.x86tool" extends="Symbian.UserFLM" flm="tools/x86tool.flm">
+		<param name="TARGET_NAME" /> 
+		<param name="TARGET_TYPE" /> 
+		<param name="MACROS" default="" /> 
+		<param name="INCLUDES" default="" /> 
+		<param name="SOURCE_DIRS" default="" /> 
+		<param name="SOURCE_FOLDER" default="" /> 
+		<param name="SOURCE" default="" /> 
+		<param name="NO_STD_INCLUDE" default="" /> 
+		<param name="LIBS" default="" />
+		<param name="SHARED_LIBS" default="" />
+		<param name="CODE_COVERAGE" default="" />
+		<param name="COMPILE_OPTIONS" default="" />
+		<param name="S60_BUILD" default="" />
+		<param name="BUILDINC" default="" />
+		<param name="DLL_WIN_LINKER_OPTS" default="" />
+		<param name="DLL_LIN_LINKER_OPTS" default="" />
+	</interface>
+
+</build>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/group/bld.inf	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,112 @@
+// Copyright (c) 1997-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+PRJ_PLATFORMS
+TOOLS2
+
+PRJ_EXPORTS
+
+../inc/x86tool.h		/epoc32/include/x86tool/x86tool.h
+../f32/inc/f32file.h		/epoc32/include/x86tool/f32file.h
+../f32/inc/f32file.inl		/epoc32/include/x86tool/f32file.inl
+
+../e32/include/cpudefs.h /epoc32/include/x86tool/cpudefs.h
+../e32/include/d32locd.h /epoc32/include/x86tool/d32locd.h
+../e32/include/d32locd.inl /epoc32/include/x86tool/d32locd.inl
+../e32/include/e32base.h /epoc32/include/x86tool/e32base.h
+../e32/include/e32base.inl /epoc32/include/x86tool/e32base.inl
+../e32/include/e32btrace.h /epoc32/include/x86tool/e32btrace.h
+../e32/include/e32cmn.h /epoc32/include/x86tool/e32cmn.h
+../e32/include/e32cmn.inl /epoc32/include/x86tool/e32cmn.inl
+../e32/include/e32const.h /epoc32/include/x86tool/e32const.h
+../e32/include/e32def.h /epoc32/include/x86tool/e32def.h
+../e32/include/e32kpan.h /epoc32/include/x86tool/e32kpan.h
+../e32/include/e32lang.h /epoc32/include/x86tool/e32lang.h
+../e32/include/e32ldr.h /epoc32/include/x86tool/e32ldr.h
+../e32/include/e32math.h /epoc32/include/x86tool/e32math.h
+../e32/include/e32panic.h /epoc32/include/x86tool/e32panic.h
+../e32/include/e32rom.h /epoc32/include/x86tool/e32rom.h
+../e32/include/e32std.h /epoc32/include/x86tool/e32std.h
+../e32/include/e32std.inl /epoc32/include/x86tool/e32std.inl
+../e32/include/e32ver.h /epoc32/include/x86tool/e32ver.h
+../e32/include/partitions.h /epoc32/include/x86tool/partitions.h
+../e32/include/u32exec.h /epoc32/include/x86tool/u32exec.h
+../e32/include/u32hal.h /epoc32/include/x86tool/u32hal.h
+../e32/include/u32std.h /epoc32/include/x86tool/u32std.h
+../e32/include/e32shbufcmn.h /epoc32/include/x86tool/e32shbufcmn.h
+../e32/include/e32shbuf_priv.h /epoc32/include/x86tool/e32shbuf_priv.h
+../e32/include/collate.h /epoc32/include/x86tool/collate.h
+../e32/include/e32base_private.h /epoc32/include/x86tool/e32base_private.h 
+../e32/include/e32capability.h /epoc32/include/x86tool/e32capability.h
+../e32/include/e32cmn_private.h  /epoc32/include/x86tool/e32cmn_private.h  
+../e32/include/e32cons.h  /epoc32/include/x86tool/e32cons.h  
+../e32/include/e32const_private.h  /epoc32/include/x86tool/e32const_private.h  
+../e32/include/e32debug.h  /epoc32/include/x86tool/e32debug.h  
+../e32/include/e32def_private.h  /epoc32/include/x86tool/e32def_private.h  
+../e32/include/e32des16.h  /epoc32/include/x86tool/e32des16.h  
+../e32/include/e32des16_private.h  /epoc32/include/x86tool/e32des16_private.h  
+../e32/include/e32des8.h  /epoc32/include/x86tool/e32des8.h  
+../e32/include/e32des8_private.h  /epoc32/include/x86tool/e32des8_private.h  
+../e32/include/e32err.h  /epoc32/include/x86tool/e32err.h  
+../e32/include/e32event.h  /epoc32/include/x86tool/e32event.h  
+../e32/include/e32event_private.h  /epoc32/include/x86tool/e32event_private.h  
+../e32/include/e32hal.h  /epoc32/include/x86tool/e32hal.h  
+../e32/include/e32hashtab.h  /epoc32/include/x86tool/e32hashtab.h  
+../e32/include/e32huffman.h  /epoc32/include/x86tool/e32huffman.h  
+../e32/include/e32keys.h  /epoc32/include/x86tool/e32keys.h  
+../e32/include/e32ktran.h  /epoc32/include/x86tool/e32ktran.h  
+../e32/include/e32lmsg.h  /epoc32/include/x86tool/e32lmsg.h  
+../e32/include/e32math.inl  /epoc32/include/x86tool/e32math.inl  
+../e32/include/e32notif.h  /epoc32/include/x86tool/e32notif.h  
+../e32/include/e32power.h  /epoc32/include/x86tool/e32power.h  
+../e32/include/e32property.h  /epoc32/include/x86tool/e32property.h  
+../e32/include/e32std_private.h  /epoc32/include/x86tool/e32std_private.h  
+../e32/include/e32svr.h  /epoc32/include/x86tool/e32svr.h  
+../e32/include/e32test.h  /epoc32/include/x86tool/e32test.h  
+../e32/include/u32property.h  /epoc32/include/x86tool/u32property.h  
+../e32/include/unicode.h  /epoc32/include/x86tool/unicode.h  
+../e32/include/videodriver.h  /epoc32/include/x86tool/videodriver.h  
+
+// Export the symport dll import library
+// This is only needed for the old build system to avoid a build order dependency with anything using the symport dll
+libsymport.a /epoc32/release/tools2/deb/libsymport.a
+libsymport.a /epoc32/release/tools2/rel/libsymport.a
+
+#include "../symuser/bld.inf"
+#include "../symfile/bld.inf"
+#include "../symutil/group/bld.inf"
+
+PRJ_EXTENSIONS
+
+#ifdef TOOLS2
+// Build DLL version of the port - contains both symuser and symfile
+start extension tools/x86tool
+
+	option TARGET_NAME symport
+	option TARGET_TYPE dll
+
+	option MACROS __MINIMUM_MACHINE_CODE__ __CPU_HAS_CP15_THREAD_ID_REG __USERSIDE_THREAD_DATA__
+	option INCLUDES ../e32/include ../bafl/inc ../charconv/framework/inc ../f32/inc ../symuser
+
+	option SOURCE_DIRS ../e32/common ../e32/euser ../e32/euser/cbase ../e32/euser/epoc/x86 ../e32/euser/maths ../e32/euser/unicode \
+		../bafl/src ../charconv/framework/src/charconv \
+		../f32/sfsrv
+		
+	option SOURCE_FOLDER ../symuser
+	option SOURCE symuser.cpp exec.cpp new.cpp loader.cpp x86hlp.cia \
+		../group/ver.cpp
+	option COMPILE_OPTIONS -Wno-return-type
+end
+#endif
Binary file symport/group/how to build Symport.doc has changed
Binary file symport/group/how to use symport.doc has changed
Binary file symport/group/libsymport.a has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/group/release.txt	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,20 @@
+NOTESRC_RELEASER
+Nokia Corporation
+
+NOTESRC_RELEASE_REASON
+PDT tool
+
+NOTESRC_GENERAL_COMMENTS
+N/A
+
+NOTESRC_KNOWN_DEVIATIONS
+N/A
+
+NOTESRC_BUGS_FIXED
+N/A
+
+NOTESRC_BUGS_REMAINING
+N/A
+
+NOTESRC_OTHER_CHANGES
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/group/symport.mrp	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,21 @@
+component		dev_hostenv_cpptoolsplat_symport
+
+source			/src/tools/dev/hostenv/cpptoolsplat/symport
+binary			/src/tools/dev/hostenv/cpptoolsplat/symport/group all
+exports			/src/tools/dev/hostenv/cpptoolsplat/symport/group
+
+notes_source	/src/tools/dev/hostenv/cpptoolsplat/symport/group/release.txt
+
+ipr T
+ipr D /src/tools/dev/hostenv/cpptoolsplat/symport/bafl
+ipr T /src/tools/dev/hostenv/cpptoolsplat/symport/bldtest
+ipr E /src/tools/dev/hostenv/cpptoolsplat/symport/charconv
+ipr D /src/tools/dev/hostenv/cpptoolsplat/symport/e32
+ipr D /src/tools/dev/hostenv/cpptoolsplat/symport/f32/inc
+ipr A /src/tools/dev/hostenv/cpptoolsplat/symport/f32/sfsrv
+ipr T /src/tools/dev/hostenv/cpptoolsplat/symport/flm
+ipr T /src/tools/dev/hostenv/cpptoolsplat/symport/group
+ipr T /src/tools/dev/hostenv/cpptoolsplat/symport/inc
+ipr T /src/tools/dev/hostenv/cpptoolsplat/symport/symfile
+ipr D /src/tools/dev/hostenv/cpptoolsplat/symport/symuser
+ipr T /src/tools/dev/hostenv/cpptoolsplat/symport/symutil
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/group/test.pl	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,298 @@
+#!/usr/bin/perl
+
+# Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "Symbian Foundation License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+use strict;
+use Test::Harness;
+use Getopt::Long qw(:config auto_version auto_help);
+use File::Spec::Functions;
+use Cwd;
+
+$Test::Harness::Verbose = 1;
+
+# Version of the script - just use the date
+$main::VERSION = '17-Oct-08';
+
+# a list of all the tests.
+my @all = ( 
+'../bldtest/test.pl',
+'../symuser/test.pl',
+'../symfile/test.pl'
+);
+
+my ( $verbose, $ignore, $coverage );
+GetOptions("verbose" => \$verbose, "ignore" => \$ignore, "coverage" => \$coverage) or pod2usage(2);
+
+# Get OS version
+my $win32 = 1 if $^O =~ /MSWin32/;
+print "Running on Win32\n" if $win32 && $verbose;
+print "Running on Linux\n" if !$win32 && $verbose;
+
+# Clear coverage stats and rebuild the code with coverage enabled
+if ($coverage)
+	{
+	clearCoverageStats();
+	setCoverage(1);
+	}
+
+# Run all the tests
+my $fail;
+eval { runtests(@all); };
+$fail = $@ if $@;
+
+# Show coverage stats and rebuild the code with coverage disabled
+if ($coverage)
+	{
+	showCoverageStats();
+	setCoverage(0);
+	clearCoverageStats();
+	}
+die $fail if $fail;
+
+# Show coverage stats
+sub showCoverageStats
+	{
+	my %hits;
+
+	my $loc = cwd();
+	print "Calculating converage stats...\n";
+
+	# Find all the GCDA files
+	my @dirs = "$ENV{EPOCROOT}epoc32/build";
+	foreach my $dir ( @dirs )
+		{
+		opendir DIR, $dir or die "Failed on $dir: $!";
+		foreach my $child ( readdir DIR )
+			{
+			next if $child =~ /^\./;
+			
+		 	push @{ $hits{$dir} }, "$child" if $child =~ /\.gcda$/;
+			push @dirs, "$dir/$child" if -d "$dir/$child";
+			}
+		closedir DIR;
+		}
+
+	# Collect the stats
+	my %result;
+	foreach my $dir ( keys %hits )
+		{
+		chdir($dir) or die "Failed: $!";
+		my $cmd = $win32 ? "$ENV{EPOCROOT}epoc32/gcc_mingw/bin/gcov.exe @{ $hits{$dir} }" : "gcov @{ $hits{$dir} }";
+		print "Executing: $cmd\n";
+		open CMD, "$cmd|" or die "Failed: $!";
+		while(my $line = <CMD>)
+			{
+			if ($line =~ /Lines executed:(\d+.\d+)% of (\d+)/)
+				{
+				my ($total, $coverage) = ( $2, int(($2 / 100) * $1));
+				my $oldline = $line;
+				$line = <CMD>;
+
+				# Filter by filename symport/<component>
+				if ($line =~ m[symport/([^/]+)/])
+					{
+					print "\t$oldline";
+					my $comp = $1;
+	
+					$result{$comp}{total} = $result{$comp}{total} ? $result{$comp}{total} + $total : $total;
+					$result{$comp}{coverage} = $result{$comp}{coverage} ? $result{$comp}{coverage} + $coverage : $coverage;
+					}
+				else
+					{
+					print STDERR "Unknown: Line $. - $line" if $verbose;
+					}
+				}
+			}
+		close CMD;
+		}
+
+	# Print a summary of the stats
+	print "\nTEST COVERAGE RESULTS\n";
+	foreach ( keys %result )
+		{
+		my $percent = ($result{$_}{coverage}/$result{$_}{total})*100;
+		print "$_: $result{$_}{coverage}/$result{$_}{total} (${percent}%)\n";
+		}
+	chdir($loc);
+	}
+
+# Make sure all GCDA files are deleted
+sub clearCoverageStats
+	{
+	print "Clearing converage stats...\n" if $verbose;
+
+	my @dirs = "$ENV{EPOCROOT}epoc32/build";
+	foreach my $dir ( @dirs )
+		{
+		opendir DIR, $dir or die "Failed on $dir: $!";
+		foreach my $child ( readdir DIR )
+			{
+			next if $child =~ /^\./;
+			
+			if ($child =~ /\.gcda$/)
+				{
+				print "Deleting: $dir/$child\n" if $verbose;
+			 	unlink "$dir/$child";
+				}
+			push @dirs, "$dir/$child" if -d "$dir/$child";
+			}
+		closedir DIR;
+		}
+	}
+
+# Enables/Disables code coverage
+sub setCoverage
+	{
+	my $enable = shift;
+	
+	if ($verbose) { print $enable ? "Enabling code coverage...\n" : "Disabling code coverage...\n"; }
+	my $makefile = catfile($ENV{EPOCROOT}, 'epoc32', 'tools', 'makefile_templates', 'tools', 'x86tool.mk');
+	die "Can't find makefile $makefile" if !-e $makefile;
+	
+	# Read the makefile
+	my @lines;
+	open IN, $makefile or die "Failed to open $makefile: $!";
+	while(<IN>)
+		{
+		if (/CODE_COVERAGE:=/)
+			{
+			push @lines, $enable ? "CODE_COVERAGE:=1\n" : "CODE_COVERAGE:=\n";
+			next;
+			}
+		push @lines, $_;
+		}
+	close IN;
+
+	# Write out the makefile with the change
+	open OUT, ">$makefile" or die "Failed to open $makefile for writing: $!";
+	print OUT @lines;
+	close OUT;
+
+	# Now do the same for the new build system
+	my $xml = catfile($ENV{SBS_HOME}, 'lib', 'flm', 'x86tool.xml');
+	die "Can't find xml $xml" if !-e $xml;
+	
+	# Read the makefile
+	@lines = ();
+	open IN, $xml or die "Failed to open $xml: $!";
+	while(<IN>)
+		{
+		if (/(\s*<param name=\"CODE_COVERAGE\" default=\")\d?(\" \/>)/)
+			{
+			push @lines, sprintf("$1%s$2\n", $enable ? '1' : '');
+			next;
+			}
+		push @lines, $_;
+		}
+	close IN;
+
+	# Write out the makefile with the change
+	open OUT, ">$xml" or die "Failed to open $xml for writing: $!";
+	print OUT @lines;
+	close OUT;
+
+	doClean();
+	doBuild();
+	}
+
+# ***
+# Get the version of the build system
+# *
+sub getBuildVersion
+	{
+	# First of all see if SBSv2 is installed
+	my $sbs_ver = 1;
+	open SBS, 'sbs -v 2>&1|' or die "Failed to execute command: $!";
+	while(<SBS>)
+		{
+		if (/^sbs version/)
+			{
+			$sbs_ver = 2;
+			last;
+			}
+		}
+	close SBS;
+	
+	# Override the result using environment variable
+	$sbs_ver = 1 if $ENV{SBS_VERSION} && $ENV{SBS_VERSION} == 1;
+	return $sbs_ver;
+	}
+
+# ***
+# Cleans the code
+# *
+sub doClean
+	{
+	print "Cleaning code...\n" if $verbose;
+	my $sbs_ver = getBuildVersion();
+	my $redir = $verbose?'':' >nul 2>&1';
+
+	if ($sbs_ver == 1)
+		{
+		# Use the old build system
+		system("bldmake bldfiles$redir");
+		system("abld makefile$redir");
+		system("abld clean$redir");
+		}
+	else
+		{
+		# Use the new build system
+		system("sbs -c tools2 CLEAN$redir");
+		system("sbs -c winscw CLEAN$redir");
+		}
+	}
+
+# ***
+# Builds the code
+# *
+sub doBuild
+	{
+	print "Building code...\n" if $verbose;
+	my $sbs_ver = getBuildVersion();
+	my $redir = $verbose?'':' >nul 2>&1';
+
+	# Now build the test code - assumes current working directory is correct!
+	print "Using SBSv$sbs_ver\n" if $verbose;
+	if ($sbs_ver == 1)
+		{
+
+		# Use the old build system
+		system("bldmake bldfiles$redir");
+		system("abld build$redir");
+		}
+	else
+		{
+		# Use the new build system
+		system("sbs -c tools2$redir");
+		system("sbs -c winscw$redir");
+		}
+	}
+
+=head1 NAME
+
+test.pl - A script for running other tests
+
+=head1 SYNOPSIS
+
+test.pl [-help] [-version] [-verbose] [-coverage]
+
+ Options:
+   -help      brief help message
+   -version   version of the script
+   -verbose   print what the scripts does
+   -coverage  gather code coverage stats (rebuilds everything twice)
+
+=cut
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/group/ver.cpp	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,21 @@
+// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+#include <e32cmn.h>
+
+EXPORT_C TVersion SymPortVersion()
+	{
+	return TVersion(1, 0, 0);
+	}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/inc/x86tool.h	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,112 @@
+// Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// This is the preinclude file for SYMPORT
+// 
+//
+
+/**
+ @file
+ @publishedAll
+ @released
+*/
+
+// compiler and STLport things first 
+#define _STLP_THREADS
+#define _STLP_DESIGNATED_DLL
+
+// Pick up relevant macros under __GCC32__, since __GCC32__ is not a valid macro for TOOLS2
+
+#define __NO_CLASS_CONSTS__
+#define __NORETURN__  __attribute__ ((noreturn))
+
+#ifdef __GCCV3__
+#define __NORETURN_TERMINATOR()
+#else
+#define __NORETURN_TERMINATOR()		abort()
+#endif
+
+#define IMPORT_C
+#define IMPORT_D
+#ifdef _WIN32
+#define EXPORT_C __declspec(dllexport)
+#define EXPORT_D __declspec(dllexport)
+#else
+#define EXPORT_C 
+#define EXPORT_D
+#endif
+
+#define NONSHARABLE_CLASS(x) class x
+#define NONSHARABLE_STRUCT(x) struct x
+
+#ifndef __TOOLS2__
+#define __NO_THROW
+#else
+#include <new>
+#ifndef _WIN32
+#include <exception>
+#endif
+#define __NO_THROW throw(std::bad_alloc)
+#endif
+
+typedef long long Int64;
+typedef unsigned long long Uint64;
+#define	I64LIT(x)	x##LL
+#define	UI64LIT(x)	x##ULL
+#define TEMPLATE_SPECIALIZATION template<>
+#define __TText_defined
+#ifdef __TOOLS2__
+#ifndef _WIN32
+#include <stddef.h>  // Linux definition of wchar_t
+#endif
+#endif
+
+typedef wchar_t __TText;
+
+// Symbian things next ///////////////////////////////////////////////////////
+
+#ifdef __PRODUCT_INCLUDE__
+#include __PRODUCT_INCLUDE__
+#endif
+
+// Do not use inline new in e32cmn.h
+#define __PLACEMENT_NEW_INLINE
+#define __PLACEMENT_VEC_NEW_INLINE
+// avoid e32tools/filesystem/include/mingw.inl nonsense
+#ifdef _WIN32
+#define _MINGW_INL
+#endif
+
+// Varargs
+typedef __builtin_va_list va_list;
+#define va_start(v, l) __builtin_va_start(v, l)
+#define va_arg(v, l) __builtin_va_arg(v, l)
+#define va_end(v) __builtin_va_end(v)
+#define VA_LIST va_list
+#define _VA_LIST_DEFINED //To deal with stdarg.h
+#define __VA_LIST_defined //To deal with e32def.h
+#define VA_START(ap,pn) va_start(ap, pn)
+#define VA_ARG(ap,type) va_arg(ap,type)
+#define VA_END(ap)      va_end(ap)
+
+#ifdef __TOOLS2__
+#ifndef _WIN32
+	#define asm(EXPR) __asm(".intel_syntax noprefix\n\t" EXPR)
+#else
+	#define asm __asm
+#endif
+#endif
+
+
+// the end of the pre-include
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/symfile/bld.inf	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,59 @@
+// Copyright (c) 1997-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+PRJ_PLATFORMS
+WINSCW TOOLS2
+
+PRJ_EXTENSIONS
+
+#ifdef TOOLS2
+start extension tools/x86tool
+
+	option TARGET_NAME symfile
+	option TARGET_TYPE lib
+
+	option SOURCE_DIRS ../f32/sfsrv
+	option INCLUDES ../e32/include ../f32/inc
+
+//	option MACROS _DEBUG_LOGGING
+end
+#endif
+
+PRJ_TESTMMPFILES
+
+#ifdef WINSCW
+t_symfile
+#endif
+
+PRJ_TESTEXTENSIONS
+
+#ifdef TOOLS2
+start extension tools/x86tool
+
+	option TARGET_NAME t_symfile
+	option TARGET_TYPE exe
+	option SOURCE test.cpp
+	option LIBS symfile symuser
+end
+
+start extension tools/x86tool
+
+	option TARGET_NAME t_symfile_dll
+	option TARGET_TYPE exe
+	option SOURCE test.cpp
+	option SHARED_LIBS symport
+	option MACROS USING_SYMPORT_DLL
+end
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/symfile/t_symfile.mmp	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,21 @@
+// Copyright (c) 1997-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+TARGET		t_symfile.exe
+TARGETTYPE	exe
+SOURCEPATH	.
+SOURCE		test.cpp
+LIBRARY		EUSER.LIB EFSRV.LIB
+SYSTEMINCLUDE	\EPOC32\INCLUDE
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/symfile/test.cpp	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,2676 @@
+// Copyright (c) 1997-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+#ifdef __TOOLS2__
+#include <sys/stat.h>
+#include <stdlib.h>
+#ifdef linux
+#include <string.h>
+#endif
+#endif
+
+#include <e32test.h>
+#include <f32file.h>
+
+RTest test(_L("SymFile RFs Tests"));
+
+void testAtt()
+	{
+	// Connect to the file system
+	RFs fs;
+	test(fs.Connect() == KErrNone);
+	
+	_LIT(KTestDir1, "c:\\symport_test_rfs1\\");
+	_LIT(KTestFile, "c:\\symport_test_rfs1\\test.txt");
+	
+	// Test with root
+	TUint att;
+	test(fs.Att(_L("C:\\"), att) == KErrBadName);
+	test(fs.Att(_L("\\"), att) == KErrBadName);
+
+	// Make sure the directory doesn't exist
+	TInt err = fs.Delete(KTestFile);
+	test(err == KErrNone || err == KErrNotFound || err == KErrPathNotFound);
+	err = fs.RmDir(KTestDir1);
+	test(err == KErrNone || err == KErrNotFound);
+
+	// Check it fails
+	test(fs.Att(KTestDir1, att) == KErrNotFound);
+
+	// See if it works for directories
+	test(fs.MkDir(KTestDir1) == KErrNone);
+	test(fs.Att(KTestDir1, att) == KErrNone && att&KEntryAttDir);
+
+	// See if it works for normal files
+	test(fs.Att(KTestFile, att) == KErrNotFound);
+	RFile file;
+	test(file.Create(fs, KTestFile, EFileShareAny|EFileWrite) == KErrNone);
+	test(file.Write(_L8("test")) == KErrNone);
+	file.Close();
+	test(fs.Att(KTestFile, att) == KErrNone);
+	test(!(att&KEntryAttDir));
+
+	// Check readonly flag
+	test(!(att&KEntryAttReadOnly));
+	test(fs.SetAtt(KTestFile, KEntryAttReadOnly, 0) == KErrNone);
+	test(fs.Att(KTestFile, att) == KErrNone && att&KEntryAttReadOnly);
+	
+	// Clear the flag
+	test(fs.SetAtt(KTestFile, 0, KEntryAttReadOnly) == KErrNone);
+	test(fs.Att(KTestFile, att) == KErrNone);
+	test(!(att&KEntryAttReadOnly));
+
+	// Delete the file and make sure it goes away
+	test(fs.RmDir(KTestDir1) == KErrInUse);
+	test(fs.Delete(KTestFile) == KErrNone);
+	test(fs.Att(KTestFile, att) == KErrNotFound);
+	
+	// Delete directory and make sure it really went away
+	test(fs.RmDir(KTestDir1) == KErrNone);
+	test(fs.Att(KTestDir1, att) == KErrNotFound);
+
+	fs.Close();
+	}
+
+void testSetAtt()
+	{
+	// Connect to the file system
+	RFs fs;
+	test(fs.Connect() == KErrNone);
+	
+	// Make sure the file doesn't exist
+	_LIT(KTestFile, "c:\\symport_test_rfs2_test.txt");
+	fs.SetAtt(KTestFile, 0, KEntryAttReadOnly);
+	fs.Delete(KTestFile);
+
+	// File doesn't exist
+	test(fs.SetAtt(KTestFile, KEntryAttReadOnly, 0) == KErrNotFound);
+	
+	// Create a file
+	RFile file;
+	test(file.Create(fs, KTestFile, EFileShareAny|EFileWrite) == KErrNone);
+	test(file.Write(_L8("test")) == KErrNone);
+	file.Close();
+
+	// Set readonly flag
+	TUint att;
+	test(fs.Att(KTestFile, att) == KErrNone);
+	test(!(att&KEntryAttReadOnly));
+	test(fs.SetAtt(KTestFile, KEntryAttReadOnly, 0) == KErrNone);
+	test(fs.Att(KTestFile, att) == KErrNone && att&KEntryAttReadOnly);
+
+	// Clear readonly flag
+	test(fs.SetAtt(KTestFile, 0, KEntryAttReadOnly) == KErrNone);
+	test(fs.Att(KTestFile, att) == KErrNone);
+	test(!(att&KEntryAttReadOnly));
+	
+	test(fs.Delete(KTestFile) == KErrNone);
+	fs.Close();
+	}
+
+void testModified()
+	{
+	// Connect to the file system
+	RFs fs;
+	test(fs.Connect() == KErrNone);
+	
+	// Make sure the file doesn't exist
+	_LIT(KTestFile, "c:\\symport_test_rfs2a_test.txt");
+	fs.Delete(KTestFile);
+
+	// Get time now
+	TTime start;
+	start.UniversalTime();
+	
+	// File doesn't exist
+	TTime time1;
+	test(fs.Modified(KTestFile, time1) == KErrNotFound);
+	User::After(1000000);
+	
+	// Create a file
+	RFile file;
+	test(file.Create(fs, KTestFile, EFileShareAny|EFileWrite) == KErrNone);
+	test(file.Write(_L8("test")) == KErrNone);
+	file.Close();
+
+	// Get modified time
+	test(fs.Modified(KTestFile, time1) == KErrNone && time1 > start);
+	User::After(1000000);
+
+	// Edit the file
+	test(file.Open(fs, KTestFile, EFileShareAny|EFileWrite) == KErrNone);
+	test(file.Write(_L8("test")) == KErrNone);
+	file.Close();
+	
+	// Get modified time
+	TTime time2;
+	test(fs.Modified(KTestFile, time2) == KErrNone && time2 > time1);
+	
+	test(fs.Delete(KTestFile) == KErrNone);
+	fs.Close();
+	}
+
+void testMkDirAll()
+	{
+	RFs fs;
+	test(fs.Connect() == KErrNone);
+	
+	_LIT(KTestFile, "c:\\symport_test_rfs3_parent\\symport_test_rfs3_child");
+	fs.Delete(KTestFile);
+	
+	// Make sure the directories don't exist already
+	_LIT(KTestDirParent1, "c:\\symport_test_rfs3_parent\\");
+	_LIT(KTestDir1, "c:\\symport_test_rfs3_parent\\symport_test_rfs3_child\\");
+	fs.RmDir(KTestDir1);
+	fs.RmDir(KTestDirParent1);
+	
+	// Check it can handle drive letter
+	test(fs.MkDirAll(KTestDir1) == KErrNone);
+	test(fs.MkDirAll(KTestDir1) == KErrAlreadyExists);
+	TUint att;
+	test(fs.Att(KTestDir1, att) == KErrNone && att&KEntryAttDir);	
+
+	// Delete the folder for the next test
+	test(fs.RmDir(KTestDir1) == KErrNone && fs.RmDir(KTestDirParent1) == KErrNone);
+	TInt err = fs.Att(KTestDir1, att);
+	test(err == KErrNotFound || err == KErrPathNotFound);	
+		
+	// Check it fails if file is encountered
+	test(fs.MkDir(KTestDirParent1) == KErrNone);
+	RFile file;
+	test(file.Create(fs, KTestFile, EFileShareAny|EFileWrite) == KErrNone);
+	test(file.Write(_L8("test")) == KErrNone);
+	file.Close();
+	test(fs.MkDirAll(KTestDir1) == KErrAccessDenied);
+	
+	// Check for failure on itermediate file
+	_LIT(KTestDir3, "c:\\symport_test_rfs3_parent\\symport_test_rfs3_child\\wibble\\");
+	test(fs.MkDirAll(KTestDir3) == KErrAccessDenied);
+
+	test(fs.Delete(KTestFile) == KErrNone);
+	test(fs.RmDir(KTestDirParent1) == KErrNone);
+	
+	fs.Close();
+	}
+
+void testMkDir()
+	{
+	RFs fs;
+	test(fs.Connect() == KErrNone);
+
+	_LIT(KTestDir1, "c:\\symport_test_rfs5\\");
+	_LIT(KTestFile, "c:\\symport_test_rfs5");
+	_LIT(KTestDir1Sub, "c:\\symport_test_rfs5\\sub\\");
+
+	// Make sure the test stuff doesn't exist already
+	fs.RmDir(KTestDir1Sub);
+	fs.Delete(KTestFile);
+	fs.RmDir(KTestDir1);
+	
+	// Check the directory can be created
+	TUint att;
+	test(fs.MkDir(KTestDir1) == KErrNone);
+	test(fs.MkDir(KTestDir1) == KErrAlreadyExists);
+	test(fs.Att(KTestDir1, att) == KErrNone);	
+	test(fs.MkDir(KTestDir1Sub) == KErrNone);
+	test(fs.MkDir(KTestDir1Sub) == KErrAlreadyExists);
+	test(fs.RmDir(KTestDir1Sub) == KErrNone);
+	test(fs.RmDir(KTestDir1) == KErrNone);
+	test(fs.Att(KTestDir1, att) == KErrNotFound);	
+
+	// Check file error
+	RFile file;
+	test(file.Create(fs, KTestFile, EFileShareAny|EFileWrite) == KErrNone);
+	test(file.Write(_L8("test")) == KErrNone);
+	file.Close();
+	
+	test(fs.MkDir(KTestDir1) == KErrAccessDenied);
+	test(fs.Delete(KTestFile) == KErrNone);
+		
+	fs.Close();
+	}
+
+void testRmDir()
+	{
+	RFs fs;
+	test(fs.Connect() == KErrNone);
+
+	// Make sure the test stuff isn't there
+	_LIT(KTestDir1, "c:\\symport_test_rfs6\\");
+	_LIT(KTestFile, "c:\\symport_test_rfs6\\testfile");
+	_LIT(KTestDir3, "c:\\symport_test_rfs6\\testfile\\");
+	fs.Delete(KTestFile);
+	fs.RmDir(KTestDir1);
+	
+	// Create the directory and make sure you can delete it
+	TUint att;
+	test(fs.MkDir(KTestDir1) == KErrNone);
+	test(fs.Att(KTestDir1, att) == KErrNone && att|KEntryAttDir);	
+	test(fs.RmDir(KTestDir1) == KErrNone);
+	test(fs.RmDir(KTestDir1) == KErrNotFound);
+	test(fs.Att(KTestDir1, att) == KErrNotFound);	
+	
+	test(fs.MkDir(KTestDir1) == KErrNone);
+	test(fs.Att(KTestDir1, att) == KErrNone && att|KEntryAttDir);	
+
+	RFile file;
+	test(file.Create(fs, KTestFile, EFileShareAny|EFileWrite) == KErrNone);
+	test(file.Write(_L8("test")) == KErrNone);
+	file.Close();
+
+	// Check you can't delete a file or a none empty directory
+	TInt err = fs.RmDir(KTestDir3);
+	test(err == KErrNotFound || err == KErrPathNotFound);
+	test(fs.RmDir(KTestDir1) == KErrInUse);
+	test(fs.Delete(KTestFile) == KErrNone);
+	test(fs.RmDir(KTestDir1) == KErrNone);
+
+	// KErrInUse when removing a root directory
+	test(fs.RmDir(_L("c:\\")) == KErrInUse);
+	
+	fs.Close();
+	}
+
+void testParse()
+	{
+	RFs fs;
+	test(fs.Connect() == KErrNone);
+
+	_LIT(KTestFile, "c:\\symport_test_rfs7.txt");
+	fs.Delete(KTestFile);
+	
+	// Parse file spec
+	TParse parse;
+	test(fs.Parse(KTestFile, parse) == KErrNone);
+	
+	// See if we can create the  file
+	RFile file;
+	test(file.Create(fs, parse.FullName(), EFileShareAny|EFileWrite) == KErrNone);
+	test(file.Write(_L8("test")) == KErrNone);
+	file.Close();
+	test(fs.Delete(parse.FullName()) == KErrNone);
+	
+	fs.Close();
+	}
+
+void testSessionPath()
+	{
+	RFs fs;
+	test(fs.Connect() == KErrNone);
+
+	// Check we get a session path
+	TFileName name;
+	test(fs.SessionPath(name) == KErrNone);
+	test(name.Length() > 0);
+	
+	// Check there's a backslash on the end and no forward slashes
+	test(name[name.Length() - 1] == TChar('\\'));
+	test(name.Locate(TChar('/')) == KErrNotFound);
+	
+	fs.Close();
+	}
+
+void testSetSessionPath()
+	{
+	RFs fs;
+	test(fs.Connect() == KErrNone);
+
+	_LIT(KTestDir1, "c:\\symport_test_rfs8\\");
+	_LIT(KTestFile1, "c:\\symport_test_rfs8\\test");
+	_LIT(KTestFilename1, "test");
+	fs.Delete(KTestFile1);
+	fs.RmDir(KTestDir1);
+	
+	// Check we get a session path
+	TFileName name;
+	test(fs.SessionPath(name) == KErrNone);
+	test(name.Length() > 0);
+
+	// Check we can set it
+	fs.SetSessionPath(KTestDir1);
+	test(fs.MkDir(KTestDir1) == KErrNone);
+	test(fs.SetSessionPath(KTestDir1) == KErrNone);
+	
+	// See if we can create a file in the session path
+	RFile file;
+	test(file.Create(fs, KTestFilename1, EFileShareAny|EFileWrite) == KErrNone);
+	test(file.Write(_L8("test")) == KErrNone);
+	file.Close();
+	
+	// Check the file is there
+	TUint att;
+	test(fs.Att(KTestFile1, att) == KErrNone);
+	test(fs.Delete(KTestFilename1) == KErrNone);
+	
+	// Reset session path!
+	test(fs.SetSessionPath(name) == KErrNone);
+	test(fs.RmDir(KTestDir1) == KErrNone);
+	
+	fs.Close();
+	}
+
+void testDelete()
+	{
+	RFs fs;
+	test(fs.Connect() == KErrNone);
+
+	_LIT(KTestDir, "c:\\symport_test_rfs9\\");
+	_LIT(KTestFile, "c:\\symport_test_rfs9");
+	fs.Delete(KTestFile);
+	fs.RmDir(KTestDir);
+	
+	// Error if the file doesn't exist
+	test(fs.Delete(KTestFile) == KErrNotFound);
+
+	// Create the file
+	RFile file;
+	test(file.Create(fs, KTestFile, EFileShareAny|EFileWrite) == KErrNone);
+	test(file.Write(_L8("test")) == KErrNone);
+
+
+
+// On Linux it seems it's perfectly correct to "delete" an open file
+
+// Removing an open file is sometimes recommended to hide the names of temporary files that may be prone to attack!
+
+	TInt err = 0;
+#ifndef linux
+
+	// Should be locked
+
+	err = fs.Delete(KTestFile);
+	test(err == KErrInUse || err == KErrAccessDenied);
+#endif
+
+	file.Close();
+
+	// Check success
+	test(fs.Delete(KTestFile) == KErrNone);
+	test(fs.Delete(KTestFile) == KErrNotFound);
+
+	// Check you can't delete a directory
+	test(fs.MkDir(KTestDir) == KErrNone);
+	test(fs.Delete(KTestFile) == KErrAccessDenied);
+	
+	err = fs.Delete(KTestDir);
+	test(err == KErrBadName || err == KErrAccessDenied);
+	test(fs.RmDir(KTestDir) == KErrNone);
+	
+	fs.Close();
+	}
+
+// This is only valid for TOOLS2
+#ifdef __TOOLS2__
+extern TInt gBlockSize;
+extern TInt gClusterSize;
+void testVolumeIOParam()
+	{
+	RFs fs;
+	test(fs.Connect() == KErrNone);
+	
+	// We rely on this error code being returned - preventing STORE cleverness?
+	TVolumeIOParamInfo param;
+	param.iBlockSize = 0;
+	param.iClusterSize = 0;
+	param.iRecReadBufSize = 0;
+	param.iRecWriteBufSize = 0;
+
+	test(fs.VolumeIOParam(EDriveC, param) == KErrNone);
+	
+	test(param.iBlockSize == 4096);
+	test(param.iClusterSize == 4096);
+	test(param.iRecReadBufSize == 4096);
+	test(param.iRecWriteBufSize == 4096);
+
+	gBlockSize = 8096;
+	gClusterSize = 8096;
+
+	test(fs.VolumeIOParam(EDriveC, param) == KErrNone);
+
+	test(param.iBlockSize == 8096);
+	test(param.iClusterSize == 8096);
+	test(param.iRecReadBufSize == 4096);
+	test(param.iRecWriteBufSize == 4096);
+
+	fs.Close();
+	}
+#endif
+
+void testEntry()
+	{
+	RFs fs;
+	test(fs.Connect() == KErrNone);
+	
+	_LIT(KTestFile, "c:\\symport_test_rfs10");
+	_LIT(KTestDir, "c:\\symport_test_rfs10_dir\\");
+	fs.Delete(KTestFile);
+	fs.RmDir(KTestDir);
+	
+	// Check error when file doesn't exist
+	TEntry entry;
+	test(fs.Entry(KTestFile, entry) == KErrNotFound);
+
+	// Create test data
+	TUidType testUid(TUid::Uid(0x1), TUid::Uid(0x2), TUid::Uid(0x3));
+	TCheckedUid checkedUid(testUid);
+	TPckg<TCheckedUid> checkedUidBuf(checkedUid);
+	
+	// Create the file
+	RFile file;
+	test(file.Create(fs, KTestFile, EFileShareAny|EFileWrite) == KErrNone);
+	test(file.Write(checkedUidBuf) == KErrNone);
+	file.Close();
+		
+	// Get file details
+	User::After(1000000);
+	test(fs.Entry(KTestFile, entry) == KErrNone);
+	
+	// Check the data looks right
+	test(entry.iSize == checkedUidBuf.Length());
+	test(entry.iType == testUid);
+	test(entry.iName == KTestFile().Mid(3)); // No path
+	test(!(entry.iAtt&KEntryAttDir));
+	
+	TTimeIntervalSeconds sec;
+	TTime now; now.UniversalTime();
+	test(now.SecondsFrom(entry.iModified, sec) == KErrNone);
+	test(sec.Int() >= 1);
+	
+	_LIT8(KTestText, "Some junk that is not a uid");
+	User::After(2000000);
+
+	test(file.Replace(fs, KTestFile, EFileShareAny|EFileWrite) == KErrNone);
+	test(file.Write(KTestText) == KErrNone);
+	file.Close();
+
+	// Get file details
+	test(fs.Entry(KTestFile, entry) == KErrNone);
+	
+	// Check the data looks right
+	test(entry.iSize == KTestText().Length());
+	test(entry.iType == TUidType(TUid::Uid(0), TUid::Uid(0), TUid::Uid(0)));
+	test(entry.iName == KTestFile().Mid(3)); // No path
+	
+	test(now.SecondsFrom(entry.iModified, sec) == KErrNone);
+	test(sec.Int() <= -1);
+	
+	// Test it works for directories
+	test(fs.Entry(KTestDir, entry) == KErrNotFound);
+	test(fs.MkDir(KTestDir) == KErrNone);
+	test(fs.Entry(KTestDir, entry) == KErrNone);
+	test(entry.iSize == 0);
+	test(entry.iType == TUidType(TUid::Null(), TUid::Null(), TUid::Null()));
+	test(entry.iName == KTestDir().Mid(3, KTestDir().Length() - 4)); // Lose path and end slash
+	test(entry.iAtt&KEntryAttDir);
+	
+	test(fs.Delete(KTestFile) == KErrNone);
+	test(fs.RmDir(KTestDir) == KErrNone);
+	fs.Close();
+	}
+
+void testSetEntry()
+	{
+	// Connect to the file system
+	RFs fs;
+	test(fs.Connect() == KErrNone);
+	
+	TTime start;
+	start.UniversalTime();
+	
+	// Make sure the file doesn't exist
+	_LIT(KTestFile, "c:\\symport_test_rfs2b_test.txt");
+	fs.SetEntry(KTestFile, start, 0, KEntryAttReadOnly);
+	fs.Delete(KTestFile);
+
+	// File doesn't exist
+	test(fs.SetEntry(KTestFile, start, KEntryAttReadOnly, 0) == KErrNotFound);
+	
+	// Create a file
+	RFile file;
+	test(file.Create(fs, KTestFile, EFileShareAny|EFileWrite) == KErrNone);
+	test(file.Write(_L8("test")) == KErrNone);
+	file.Close();
+
+	// Set readonly flag
+	TUint att;
+	test(fs.Att(KTestFile, att) == KErrNone && !(att&KEntryAttReadOnly));
+	test(fs.SetEntry(KTestFile, start, KEntryAttReadOnly, 0) == KErrNone);
+	test(fs.Att(KTestFile, att) == KErrNone && att&KEntryAttReadOnly);
+
+	// Clear readonly flag
+	test(fs.SetEntry(KTestFile, start, 0, KEntryAttReadOnly) == KErrNone);
+	test(fs.Att(KTestFile, att) == KErrNone && !(att&KEntryAttReadOnly));
+	
+	test(fs.Delete(KTestFile) == KErrNone);
+	fs.Close();
+	}
+
+// Only relevant to TOOLS2
+#ifdef __TOOLS2__
+void testSetErrorCondition()
+	{
+	RFs fs;
+	test(fs.Connect() == KErrNone);
+	test(fs.SetErrorCondition(KErrGeneral, 1) == KErrNotSupported);
+	fs.Close();	
+	}
+#endif
+
+void testCharToDrive()
+	{
+	RFs fs;
+	test(fs.Connect() == KErrNone);
+	
+	TInt drive;
+	
+	// Test invalid
+	test(fs.CharToDrive(TChar('$'), drive) == KErrArgument);
+	
+	// Test valid - upper and lower case
+	test(fs.CharToDrive(TChar('a'), drive) == KErrNone && drive == EDriveA);
+	test(fs.CharToDrive(TChar('A'), drive) == KErrNone && drive == EDriveA);
+	test(fs.CharToDrive(TChar('z'), drive) == KErrNone && drive == EDriveZ);
+	test(fs.CharToDrive(TChar('Z'), drive) == KErrNone && drive == EDriveZ);
+	
+	fs.Close();	
+	}
+
+void testDriveToChar()
+	{
+	RFs fs;
+	test(fs.Connect() == KErrNone);
+	
+	TChar dChar;
+	
+	// Test invalid
+	test(fs.DriveToChar(99, dChar) == KErrArgument);
+	
+	// Ask for default drive
+	test(fs.DriveToChar(KDefaultDrive, dChar) == KErrNone);
+
+	test(TUint(dChar) >= TUint(TChar('A')));
+
+	test(TUint(dChar) <= TUint(TChar('Z')));
+
+	// Check valid
+	test(fs.DriveToChar(EDriveA, dChar) == KErrNone && dChar == TChar('A'));
+	test(fs.DriveToChar(EDriveZ, dChar) == KErrNone && dChar == TChar('Z'));
+	
+	fs.Close();	
+	}
+
+void testIsValidDrive()
+	{
+	RFs fs;
+	test(fs.Connect() == KErrNone);
+	
+	// Invalid
+	test(!fs.IsValidDrive(99));
+	test(!fs.IsValidDrive(-99));
+	
+	// Valid
+	test(fs.IsValidDrive(KDefaultDrive));
+	test(fs.IsValidDrive(EDriveA));
+	test(fs.IsValidDrive(EDriveZ));
+	
+	fs.Close();	
+	}
+
+void testDrive()
+	{
+	RFs fs;
+	test(fs.Connect() == KErrNone);
+	
+	// Test invalid drive
+	TDriveInfo drive;
+	test(fs.Drive(drive, 99) == KErrBadName);
+	
+#ifdef __TOOLS2__
+	// Test valid drives
+	test(fs.Drive(drive, EDriveC) == KErrNone);
+	test(drive.iType == EMediaHardDisk && drive.iBattery == EBatNotSupported && drive.iDriveAtt&KDriveAttLocal|KDriveAttInternal && drive.iMediaAtt == 0);
+	test(fs.Drive(drive, KDefaultDrive) == KErrNone);
+	test(drive.iType == EMediaHardDisk && drive.iBattery == EBatNotSupported && drive.iDriveAtt&KDriveAttLocal|KDriveAttInternal && drive.iMediaAtt == 0);
+#endif
+	
+	fs.Close();	
+	}
+
+void testGetSystemDrive()
+	{
+	RFs fs;
+	test(fs.Connect() == KErrNone);
+	test(fs.GetSystemDrive() == EDriveC);
+	test(fs.GetSystemDriveChar() == TChar('C'));
+	fs.Close();
+	}
+
+void testReplace()
+	{
+	RFs fs;
+	test(fs.Connect() == KErrNone);
+
+	_LIT(KTestFile1, "c:\\symport_test_rfs11a");
+	_LIT(KTestFile2, "c:\\symport_test_rfs11b");
+	
+	fs.Delete(KTestFile1);
+	fs.Delete(KTestFile2);
+	
+	// Error when file doesn't exist
+	test(fs.Replace(KTestFile1, KTestFile2) == KErrNotFound);
+	
+	RFile file;
+	test(file.Create(fs, KTestFile1, EFileShareAny|EFileWrite) == KErrNone);
+	test(file.Write(_L8("test")) == KErrNone);
+	file.Close();
+
+	// Test success
+	test(fs.Replace(KTestFile1, KTestFile2) == KErrNone);
+	
+	TUint att;
+	test(fs.Att(KTestFile1, att) == KErrNotFound);
+	test(fs.Att(KTestFile2, att) == KErrNone);
+	test(fs.Replace(KTestFile2, KTestFile1) == KErrNone);
+	test(fs.Att(KTestFile1, att) == KErrNone);
+	test(fs.Att(KTestFile2, att) == KErrNotFound);
+
+	// Test when both files exist
+	test(file.Create(fs, KTestFile2, EFileShareAny|EFileWrite) == KErrNone);
+	test(file.Write(_L8("test")) == KErrNone);
+	file.Close();
+	
+	test(fs.Att(KTestFile1, att) == KErrNone);
+	test(fs.Att(KTestFile2, att) == KErrNone);
+	test(fs.Replace(KTestFile1, KTestFile2) == KErrNone);
+	test(fs.Att(KTestFile1, att) == KErrNotFound);
+	test(fs.Att(KTestFile2, att) == KErrNone);
+
+	test(fs.Replace(KTestFile2, KTestFile1) == KErrNone);
+	test(fs.Att(KTestFile1, att) == KErrNone);
+	test(fs.Att(KTestFile2, att) == KErrNotFound);
+
+	test(fs.Delete(KTestFile1) == KErrNone);
+	fs.Close();
+	}
+
+void testRename()
+	{
+	RFs fs;
+	test(fs.Connect() == KErrNone);
+	
+	_LIT(KTestFile1, "c:\\symport_test_rfs12a");
+	_LIT(KTestFile2, "c:\\symport_test_rfs12b");
+
+	_LIT(KTestDir1, "c:\\symport_test_rfs12a\\");
+	_LIT(KTestDir2, "c:\\symport_test_rfs12b\\");
+
+	fs.Delete(KTestFile1);
+	fs.Delete(KTestFile2);
+	fs.RmDir(KTestDir1);
+	fs.RmDir(KTestDir2);
+	
+	// Error when source doesn't exist
+	test(fs.Rename(KTestFile1, KTestFile2) == KErrNotFound);
+	
+	// Error when destination does exist
+	RFile file;
+	test(file.Create(fs, KTestFile1, EFileShareAny|EFileWrite) == KErrNone);
+	test(file.Write(_L8("test")) == KErrNone);
+	file.Close();
+
+	test(file.Create(fs, KTestFile2, EFileShareAny|EFileWrite) == KErrNone);
+	test(file.Write(_L8("test")) == KErrNone);
+	file.Close();
+
+	test(fs.Rename(KTestFile1, KTestFile2) == KErrAlreadyExists);
+	test(fs.Delete(KTestFile2) == KErrNone);
+	
+	// Test Success
+	test(fs.SetAtt(KTestFile1, 0, KEntryAttReadOnly) == KErrNone);
+	test(fs.Rename(KTestFile1, KTestFile2) == KErrNone);
+
+	TUint att;
+	test(fs.Att(KTestFile1, att) == KErrNotFound);
+	test(fs.Att(KTestFile2, att) == KErrNone);
+	test(fs.Rename(KTestFile2, KTestFile1) == KErrNone);
+	test(fs.Att(KTestFile1, att) == KErrNone);
+	test(fs.Att(KTestFile2, att) == KErrNotFound);
+
+	test(fs.Delete(KTestFile1) == KErrNone);
+		
+	fs.Close();	
+	}
+
+TPtrC test_string=_L("Y:\\");
+LOCAL_C void TestTParse1()
+//
+// Test all TParse methods
+//
+	{
+	TBuf<16> relatedFiles(_L(".CCC"));
+	TBuf<16> defaultPath(_L("C:\\"));
+	TParse parser;
+	TInt r=parser.Set(_L("\\WWW\\XXX\\YYY\\ZZZ\\AAA"),&relatedFiles,&defaultPath);
+	test(r==KErrNone);
+	test(parser.FullName()==_L("C:\\WWW\\XXX\\YYY\\ZZZ\\AAA.CCC"));
+	test(parser.Drive()==_L("C:"));
+	test(parser.Path()==_L("\\WWW\\XXX\\YYY\\ZZZ\\"));
+	test(parser.DriveAndPath()==_L("C:\\WWW\\XXX\\YYY\\ZZZ\\"));
+	test(parser.Name()==_L("AAA"));
+	test(parser.Ext()==_L(".CCC"));
+	test(parser.NameAndExt()==_L("AAA.CCC"));
+	test(parser.DrivePresent()==EFalse);
+	test(parser.PathPresent());
+	test(parser.NamePresent());
+	test(parser.ExtPresent()==EFalse);
+	test(parser.NameOrExtPresent());
+	test(parser.IsRoot()==EFalse);
+	test(parser.IsWild()==EFalse);
+	test(parser.IsNameWild()==EFalse);
+	test(parser.IsExtWild()==EFalse);
+	r=parser.SetNoWild(_L("\\WWW\\XXX\\YYY\\ZZZ\\AAA.EXT"),&relatedFiles,&defaultPath);
+	test(r==KErrNone);
+	test(parser.PopDir()==KErrNone);
+	test(parser.AddDir(_L("BBB"))==KErrNone);
+	}
+
+LOCAL_C void TestTParse2()
+//
+// Test multiple PopDirs
+//
+	{
+
+	TParse parser;
+	TInt r=parser.Set(_L("\\WWW\\XXX\\YYY\\ZZZ\\"),NULL,NULL);
+//	TParsePtrC parser(_L("\\WWW\\XXX\\YYY\\ZZZ\\"));
+	test(r==KErrNone);
+	r=parser.PopDir();
+	test(r==KErrNone);
+	test(parser.Path()==_L("\\WWW\\XXX\\YYY\\"));
+	r=parser.PopDir();
+	test(r==KErrNone);
+	test(parser.Path()==_L("\\WWW\\XXX\\"));
+	r=parser.PopDir();
+	test(r==KErrNone);
+	test(parser.Path()==_L("\\WWW\\"));
+	r=parser.PopDir();
+	test(r==KErrNone);
+	test(parser.Path()==_L("\\"));
+	r=parser.PopDir();
+	test(r==KErrGeneral);
+//
+	test(parser.Set(_L("C:\\Documents\\.TXT"),NULL,NULL)==KErrNone);
+	test(parser.PopDir()==KErrNone);
+	test(parser.FullName()==_L("C:\\.TXT"));
+	}
+
+LOCAL_C void TestTParse3()
+//
+// Test conflicting drive letters
+//
+	{
+
+	TParse parser;
+    TPtrC one=_L("\\ONE\\");
+    TPtrC null=_L("\\");
+    TPtrC x=_L("X:");
+    TPtrC x2=_L("X:\\");
+    TPtrC z=_L("Z:");
+	TInt r=parser.Set(_L("Z:\\Hello"),&one,&null);
+	test(r==KErrNone);
+	test(parser.FullName()==_L("Z:\\Hello"));
+    TPtrC sht=_L("*.SHT");
+    r=parser.Set(_L("Z:"),&sht,&x);
+	test(r==KErrNone);
+	test(parser.FullName()==_L("Z:*.SHT"));
+	r=parser.Set(_L("Hello"),&z,&x2);
+	test(r==KErrNone);
+	test(parser.FullName()==_L("Z:\\Hello"));
+	r=parser.Set(_L("W:\\Hello"),&z,&x2);
+	test(r==KErrNone);
+	test(parser.FullName()==_L("W:\\Hello"));
+    TPtrC abcdefg=_L("abcdefg");
+    TPtrC onetwo=_L("X:\\ONE\\TWO\\.CCC");
+	r=parser.Set(_L("W:"),&abcdefg,&onetwo);
+	test(r==KErrNone);
+	test(parser.FullName()==_L("W:\\ONE\\TWO\\abcdefg.CCC"));
+    TPtrC y=_L("Y:");
+    TPtrC xhello=_L("X:\\HELLO\\");
+    r=parser.Set(_L("World"),&y,&xhello);
+	test(r==KErrNone);
+	test(parser.FullName()==_L("Y:\\HELLO\\World"));
+    TPtrC xhelloext=_L("X:\\HELLO\\.EXT");
+    r=parser.Set(_L("World"),&y,&xhelloext);
+	test(r==KErrNone);
+	test(parser.FullName()==_L("Y:\\HELLO\\World.EXT"));
+	}
+
+LOCAL_C void TestTParse4()
+//
+// Conflicting relative path drives and names
+//
+	{
+
+	TParse parser;
+    TPtrC xone=_L("X:\\ONE\\");
+    TPtrC y=_L("Y:\\");
+	TInt r=parser.Set(_L("Z:\\Hello"),&xone,&y);
+	test(r==KErrNone);
+	test(parser.FullName()==_L("Z:\\Hello"));
+    TPtrC zone=_L("Z:\\ONE\\");
+    TPtrC xnew=_L("X:\\NEW\\");
+    r=parser.Set(_L("\\Hello"),&zone,&xnew);
+	test(r==KErrNone);
+	test(parser.FullName()==_L("Z:\\Hello"));
+    TPtrC aone=_L("A:\\ONE\\");
+    TPtrC anew=_L("A:\\NEW\\");
+    r=parser.Set(_L("A:Hello"),&aone,&anew);
+	test(r==KErrNone);
+	test(parser.FullName()==_L("A:\\ONE\\Hello"));
+    TPtrC a=_L("A:\\");
+    r=parser.Set(_L("Hello"),&a,&xnew);
+	test(r==KErrNone);
+	test(parser.FullName()==_L("A:\\Hello"));
+	r=parser.Set(_L("Hello"),&aone,&xnew);
+	test(r==KErrNone);
+	test(parser.FullName()==_L("A:\\ONE\\Hello"));
+	}
+
+
+LOCAL_C void TestTParse5()
+//
+// Test illegal paths
+//
+	{
+
+	TParse parser;
+	TInt r=parser.Set(_L("FOO\\"),NULL,NULL);
+	test(r==KErrBadName);
+	r=parser.Set(_L("C:\\FOO\\\\"),NULL,NULL);
+	test(r==KErrNone);
+	}
+
+LOCAL_C void TestTParse6()
+//
+// Test AddDir
+//
+	{
+
+	TParse parser;
+	test(parser.Set(_L("C:\\"),NULL,NULL)==KErrNone);
+	test(parser.IsRoot());
+	test(parser.FullName()==_L("C:\\"));
+	test(parser.AddDir(_L("HELLO"))==KErrNone);
+	test(parser.IsRoot()==EFalse);
+	test(parser.FullName()==_L("C:\\HELLO\\"));
+	test(parser.AddDir(_L("BYEBYE"))==KErrNone);
+	test(parser.IsRoot()==EFalse);
+	test(parser.FullName()==_L("C:\\HELLO\\BYEBYE\\"));
+	test(parser.PopDir()==KErrNone);
+	test(parser.IsRoot()==EFalse);
+	test(parser.FullName()==_L("C:\\HELLO\\"));
+	test(parser.PopDir()==KErrNone);
+	test(parser.IsRoot());
+	test(parser.FullName()==_L("C:\\"));
+//
+	test(parser.AddDir(_L(""))==KErrNone);
+	test(parser.IsRoot());
+	test(parser.FullName()==_L("C:\\"));
+	test(parser.AddDir(_L("HELLO"))==KErrNone);
+	test(parser.IsRoot()==EFalse);
+	test(parser.FullName()==_L("C:\\HELLO\\"));
+	test(parser.AddDir(_L(""))==KErrNone);
+	test(parser.IsRoot()==EFalse);
+	test(parser.FullName()==_L("C:\\HELLO\\"));
+//
+	test(parser.Set(_L("C:\\Documents\\.TXT"),NULL,NULL)==KErrNone);
+	test(parser.AddDir(_L("Documents"))==KErrNone);
+	test(parser.FullName()==_L("C:\\Documents\\Documents\\.TXT"));
+	}
+
+LOCAL_C void TestTParse7()
+//
+// Test TParsePtr
+//
+	{
+
+	TBuf<128> nameBuf=_L("C:\\WWW\\XXX\\YYY\\ZZZ\\AAA.CCC");
+	TParsePtr parser(nameBuf);
+
+	test(parser.FullName()==_L("C:\\WWW\\XXX\\YYY\\ZZZ\\AAA.CCC"));
+	test(parser.Drive()==_L("C:"));
+	test(parser.Path()==_L("\\WWW\\XXX\\YYY\\ZZZ\\"));
+	test(parser.DriveAndPath()==_L("C:\\WWW\\XXX\\YYY\\ZZZ\\"));
+	test(parser.Name()==_L("AAA"));
+	test(parser.Ext()==_L(".CCC"));
+	test(parser.NameAndExt()==_L("AAA.CCC"));
+	test(parser.DrivePresent());
+	test(parser.PathPresent());
+	test(parser.NamePresent());
+	test(parser.ExtPresent());
+	test(parser.NameOrExtPresent());
+	test(parser.IsRoot()==EFalse);
+	test(parser.IsWild()==EFalse);
+	test(parser.IsNameWild()==EFalse);
+	test(parser.IsExtWild()==EFalse);
+	
+	test(parser.AddDir(_L("HELLO"))==KErrNone);
+	test(parser.Path()==_L("\\WWW\\XXX\\YYY\\ZZZ\\HELLO\\"));
+
+	TBuf<16> shortName=_L("1234567812345678");
+	TParsePtr parser2(shortName);
+	test(parser2.FullName()==_L("1234567812345678"));
+	test(parser2.Path()==_L(""));
+	test(parser2.DriveAndPath()==_L(""));
+	test(parser2.Ext()==_L(""));
+	test(parser2.Name()==_L("1234567812345678"));
+	test(parser2.AddDir(_L("TOOBIG"))==KErrGeneral);
+	}
+
+LOCAL_C void TestTParse8()
+//
+// Test TParsePtrC
+//
+	{
+	
+	TBuf<128> nameBuf=_L("C:\\WWW\\XXX\\YYY\\ZZZ\\AAA.CCC");
+	TParsePtrC parser(nameBuf);
+
+	test(parser.FullName()==_L("C:\\WWW\\XXX\\YYY\\ZZZ\\AAA.CCC"));
+	test(parser.Drive()==_L("C:"));
+	test(parser.Path()==_L("\\WWW\\XXX\\YYY\\ZZZ\\"));
+	test(parser.DriveAndPath()==_L("C:\\WWW\\XXX\\YYY\\ZZZ\\"));
+	test(parser.Name()==_L("AAA"));
+	test(parser.Ext()==_L(".CCC"));
+	test(parser.NameAndExt()==_L("AAA.CCC"));
+	test(parser.DrivePresent());
+	test(parser.PathPresent());
+	test(parser.NamePresent());
+	test(parser.ExtPresent());
+	test(parser.NameOrExtPresent());
+	test(parser.IsRoot()==EFalse);
+	test(parser.IsWild()==EFalse);
+	test(parser.IsNameWild()==EFalse);
+	test(parser.IsExtWild()==EFalse);
+	}
+
+LOCAL_C void TestTParse9()
+//
+// Test names with leading spaces
+//
+	{
+
+	TParse parser;
+	TBuf<16> nameBuf=_L("   name.txt");
+	TBuf<16> pathBuf=_L("\\PATH\\");
+	
+	TInt r=parser.Set(pathBuf,NULL,&nameBuf);
+	test(r==KErrNone);
+	test(parser.FullName()==_L("\\PATH\\   name.txt"));
+	r=parser.Set(_L(""),&nameBuf,&pathBuf);
+	test(r==KErrNone);
+	test(parser.FullName()==_L("\\PATH\\   name.txt"));
+	r=parser.Set(_L("   name.txt"),NULL,&pathBuf);
+	test(r==KErrNone);
+	test(parser.FullName()==_L("\\PATH\\   name.txt"));
+	r=parser.Set(nameBuf,&pathBuf,NULL);
+	test(r==KErrNone);
+	test(parser.FullName()==_L("\\PATH\\   name.txt"));
+	
+	TBuf<16> badPath=_L("   \\PATH\\");
+	r=parser.Set(_L("C:\\"),NULL,&badPath);
+	test(r==KErrBadName);
+	r=parser.Set(_L("C:\\"),&badPath,NULL);
+	test(r==KErrBadName);
+
+	TBuf<16> spacePath=_L("\\  PATH\\");
+	r=parser.Set(_L("C:"),&nameBuf,&spacePath);
+	test(r==KErrNone);
+	test(parser.FullName()==_L("C:\\  PATH\\   name.txt"));
+
+	TBuf<32> spacename=_L("\\  name   .   txt  ");
+	r=parser.Set(_L("C:"),&spacename,NULL);
+	test(r==KErrNone);
+	test(parser.FullName()==_L("C:\\  name   .   txt"));
+
+// Illegal (?) values
+
+	TBuf<16> pureSpace=_L("     ");
+	r=parser.Set(_L("C:\\NAME\\"),NULL,&pureSpace);
+	test(r==KErrNone);
+	test(parser.FullName()==_L("C:\\NAME\\")); // Trims right off name
+	r=parser.Set(_L("C:\\NAME\\   "),NULL,NULL);
+	test(r==KErrNone);
+	test(parser.FullName()==_L("C:\\NAME\\"));
+
+	TBuf<16> spacePlusExt=_L("    .   ext  ");
+	r=parser.Set(_L("C:\\NAME\\"),NULL,&spacePlusExt);
+	test(r==KErrNone);
+	test(parser.FullName()==_L("C:\\NAME\\    .   ext")); // Trims right off ext
+	r=parser.Set(_L("C:\\NAME\\    .   ext   "),NULL,NULL);
+	test(r==KErrNone);
+	test(parser.FullName()==_L("C:\\NAME\\    .   ext"));
+
+	TBuf<32> pathSpace=_L("\\asdf\\zxcv\\   \\asdf\\");
+	r=parser.Set(_L("C:"),NULL,&pathSpace);
+	test(r==KErrNone);
+	test(parser.FullName()==_L("C:\\asdf\\zxcv\\   \\asdf\\")); // Leaves spaces in path
+	r=parser.Set(_L("C:\\NAME\\ \\alt.sdf"),NULL,NULL);
+	test(r==KErrNone);
+	test(parser.FullName()==_L("C:\\NAME\\ \\alt.sdf"));
+
+
+	TBuf<32> zeroPath=_L("\\asdf\\wqer\\\\asdf\\");
+	r=parser.Set(_L("NAME.TXT"),NULL,&zeroPath);
+	test(r==KErrNone);
+	test(parser.FullName()==_L("\\asdf\\wqer\\\\asdf\\NAME.TXT")); // Leaves zerolength path
+	r=parser.Set(_L("C:\\NAME\\\\alt.sdf"),NULL,NULL);
+	test(r==KErrNone);
+	test(parser.FullName()==_L("C:\\NAME\\\\alt.sdf"));
+	}
+
+LOCAL_C void TestTParse10()
+//
+// Test a very long path
+//
+	{
+
+	TBuf<16> pathPart=_L("\\2345678");
+	TBuf<512> testPath;
+
+	for(TInt i=0;i<63;i++)
+		testPath+=pathPart;
+
+	RFs fs;
+	TInt r=fs.Connect();
+	test(r==KErrNone);
+	TParse parse;
+	r=fs.Parse(testPath,parse);
+	test(r==KErrBadName);
+	fs.Close();
+
+	TFileName longFileName;
+	longFileName.SetLength(254);
+//	Mem::Fill((TUint8*)longFileName.Ptr(),254,'A');
+	Mem::Fill((TUint8*)longFileName.Ptr(),254*sizeof(TText),'A');
+	longFileName[0]='\\';
+	longFileName[253]='\\';
+	r=parse.Set(longFileName,&test_string,NULL);
+	test(r==KErrNone);
+	r=parse.PopDir();
+	test(r==KErrNone);
+
+	longFileName[123]='\\';
+	r=parse.Set(longFileName,&test_string,NULL);
+	test(r==KErrNone);
+	r=parse.PopDir();
+	test(r==KErrNone);
+	TPtrC startPath((TText*)longFileName.Ptr(),124);
+	test(parse.Path()==startPath);
+
+	TPtrC endPath((TText*)longFileName.Ptr()+124,252-124+1);
+	r=parse.AddDir(endPath);
+	test(r==KErrNone);
+	test(parse.Path()==longFileName);
+	}
+
+LOCAL_C void testTFileTextApi()
+//
+// Test TFileText class methods
+//
+	{
+
+	TPtrC record[5];
+	record[0].Set(_L("First record"));
+	record[1].Set(_L("Second record"));
+	record[2].Set(_L("Third record"));
+	record[3].Set(_L("Fourth record"));
+	record[4].Set(_L("Fifth record"));
+	
+	RFs fs;
+	test(fs.Connect() == KErrNone);
+	
+	RFile f;
+	TInt r=f.Replace(fs,_L("TEXTFILE.TXT"),0);
+	test(r==KErrNone);
+	TFileText textFile;
+	textFile.Set(f);
+	TInt i=0;
+	for (i=0;i<5;i++)
+		{
+		r=textFile.Write(record[i]);
+		test(r==KErrNone);
+		}
+	r=textFile.Seek(ESeekStart);
+	test(r==KErrNone);
+	TBuf<16> recBuf;
+	for(i=0;i<5;i++)
+		{
+		r=textFile.Read(recBuf);
+		test(r==KErrNone);
+		test(recBuf==record[i]);
+		}
+	r=textFile.Read(recBuf);
+	test(r==KErrEof);
+	test(recBuf.Length()==0);
+	f.Close();
+
+	test.Next(_L("Test dosfile terminator"));
+	TPtrC8 trecord[7];
+	TPtrC tTextrecord[7];
+	tTextrecord[0].Set(_L("First record\r\n"));
+	tTextrecord[1].Set(_L("Second record\r\n"));
+	tTextrecord[2].Set(_L("Third record\r\n"));
+	tTextrecord[3].Set(_L("Fourth record\r\n"));
+	tTextrecord[4].Set(_L("Fifth record\r\n"));
+	tTextrecord[5].Set(_L("Sixth record\n\r"));
+	tTextrecord[6].Set(_L("Seventh record\n"));
+	trecord[0].Set((TUint8*)tTextrecord[0].Ptr(),tTextrecord[0].Length()*sizeof(TText));
+	trecord[1].Set((TUint8*)tTextrecord[1].Ptr(),tTextrecord[1].Length()*sizeof(TText));
+	trecord[2].Set((TUint8*)tTextrecord[2].Ptr(),tTextrecord[2].Length()*sizeof(TText));
+	trecord[3].Set((TUint8*)tTextrecord[3].Ptr(),tTextrecord[3].Length()*sizeof(TText));
+	trecord[4].Set((TUint8*)tTextrecord[4].Ptr(),tTextrecord[4].Length()*sizeof(TText));
+	trecord[5].Set((TUint8*)tTextrecord[5].Ptr(),tTextrecord[5].Length()*sizeof(TText));
+	trecord[6].Set((TUint8*)tTextrecord[6].Ptr(),tTextrecord[6].Length()*sizeof(TText));
+	r=f.Replace(fs,_L("TEXTFILE.TXT"),0);
+	test(r==KErrNone);
+	for(i=0;i<7;i++)
+		{
+		TBuf8<256> buf;
+		buf.Copy(trecord[i]);
+		r=f.Write(buf);
+		test(r==KErrNone);
+		}
+	textFile.Set(f);
+	textFile.Seek(ESeekStart);
+	for(i=0;i<5;i++)
+		{
+		r=textFile.Read(recBuf);
+		test(r==KErrNone);
+		test(recBuf==record[i]);
+		}
+	r=textFile.Read(recBuf);
+	test(r==KErrNone);
+	test(recBuf==_L("Sixth record"));
+	r=textFile.Read(recBuf);
+	test(r==KErrNone);
+	test(recBuf==_L("\rSeventh record"));
+	r=textFile.Read(recBuf);
+	test(r==KErrEof);
+	test(recBuf.Length()==0);
+	f.Close();
+
+	test.Next(_L("Test read with bufferSize == dataSize"));
+	r=f.Replace(fs,_L("TEXTFILE.TXT"),0);
+	test(r==KErrNone);
+	record[0].Set(_L("1234567890123456"));
+//	trecord[0].Set(_L8("1234567890123456\r\n"));
+//	trecord[1].Set(_L8("1234567890123456\n"));
+
+	TPtrC tmpTextrecord;
+	tmpTextrecord.Set(_L("1234567890123456\r\n"));
+	trecord[0].Set((TUint8*)tmpTextrecord.Ptr(),tmpTextrecord.Length()*sizeof(TText));
+
+	tmpTextrecord.Set(_L("1234567890123456\n"));
+	trecord[1].Set((TUint8*)tmpTextrecord.Ptr(),tmpTextrecord.Length()*sizeof(TText));
+
+	for (i=0;i<2;i++)
+		{
+		r=f.Write(trecord[i]);
+		test(r==KErrNone);
+		}
+	textFile.Set(f);
+	textFile.Seek(ESeekStart);
+	for(i=0;i<2;i++)
+		{
+		r=textFile.Read(recBuf);
+		test(r==KErrNone);
+		test(recBuf==record[0]);
+		}
+	r=textFile.Read(recBuf);
+	test(r==KErrEof);
+	test(recBuf.Length()==0);
+	f.Close();
+
+	test.Next(_L("Read into a buffer < recordSize"));
+	TBuf<8> smallBuf;
+	r=f.Open(fs,_L("TEXTFILE.txt"),0);
+	test(r==KErrNone);
+	textFile.Set(f);
+	for(i=0;i<2;i++)
+		{
+		r=textFile.Read(smallBuf);
+		test(r==KErrTooBig);
+		test(smallBuf==_L("12345678"));
+		}
+	f.Close();
+
+	test.Next(_L("Nasty cases: 1) split over buffer boundary"));
+	r=f.Replace(fs,_L("TEXTFILE.txt"),0);
+	test(r==KErrNone);
+	HBufC* largeRecord=HBufC::NewL(600);
+	largeRecord->Des().SetLength(250);
+	largeRecord->Des().Fill('A');
+	largeRecord->Des()[249]='\n';
+	TPtrC8 bufPtr;
+	bufPtr.Set((TUint8*)largeRecord->Ptr(),largeRecord->Size()); // Size() returns length in bytes
+	r=f.Write(bufPtr);
+	test(r==KErrNone);
+	TBuf<16> boundaryBuf=_L("12345\r\n");
+	bufPtr.Set((TUint8*)boundaryBuf.Ptr(),boundaryBuf.Size());
+	r=f.Write(bufPtr);
+	test(r==KErrNone);
+	r=f.Write(trecord[0]);
+	test(r==KErrNone);
+
+	textFile.Set(f);
+	textFile.Seek(ESeekStart);
+	r=textFile.Read(recBuf);
+	test(r==KErrTooBig);
+	test(recBuf==_L("AAAAAAAAAAAAAAAA"));
+	r=textFile.Read(recBuf);
+	test(r==KErrNone);
+	test(recBuf==_L("12345"));
+	r=textFile.Read(recBuf);
+	test(r==KErrNone);
+	test(recBuf==record[0]);
+	f.Close();
+
+	test.Next(_L("Nasty cases: 2) on buffer boundary"));
+	r=f.Replace(fs,_L("TEXTFILE.txt"),0);
+	test(r==KErrNone);
+	largeRecord->Des().SetLength(250);
+	largeRecord->Des().Fill('A');
+	largeRecord->Des()[249]='\n';
+	bufPtr.Set((TUint8*)largeRecord->Ptr(),largeRecord->Size());
+	r=f.Write(bufPtr);
+	test(r==KErrNone);
+	boundaryBuf=_L("12345\rxyz\n");
+	bufPtr.Set((TUint8*)boundaryBuf.Ptr(),boundaryBuf.Size());
+	r=f.Write(bufPtr);
+	test(r==KErrNone);
+	r=f.Write(trecord[0]);
+	test(r==KErrNone);
+
+	textFile.Set(f);
+	textFile.Seek(ESeekStart);
+	r=textFile.Read(recBuf);
+	test(r==KErrTooBig);
+	test(recBuf==_L("AAAAAAAAAAAAAAAA"));
+	r=textFile.Read(recBuf);
+	test(r==KErrNone);
+	test(recBuf==_L("12345\rxyz"));
+	r=textFile.Read(recBuf);
+	test(r==KErrNone);
+	test(recBuf==record[0]);
+	f.Close();
+
+	test.Next(_L("Nasty cases: 3) record size > buffer size"));
+	r=f.Replace(fs,_L("TEXTFILE.txt"),0);
+	test(r==KErrNone);
+	largeRecord->Des().SetLength(600);
+	largeRecord->Des().Fill('Z');
+	largeRecord->Des()[511]='\r';
+	largeRecord->Des()[599]='\n';
+	bufPtr.Set((TUint8*)largeRecord->Ptr(),largeRecord->Size());
+	r=f.Write(bufPtr);
+	test(r==KErrNone);
+	boundaryBuf=_L("12345\rxyz\n");
+	bufPtr.Set((TUint8*)boundaryBuf.Ptr(),boundaryBuf.Size());
+	r=f.Write(bufPtr);
+	test(r==KErrNone);
+	r=f.Write(trecord[0]);
+	test(r==KErrNone);
+
+	textFile.Set(f);
+	textFile.Seek(ESeekStart);
+	r=textFile.Read(recBuf);
+	test(r==KErrTooBig);
+	test(recBuf==_L("ZZZZZZZZZZZZZZZZ"));
+	r=textFile.Read(recBuf);
+	test(r==KErrNone);
+	test(recBuf==_L("12345\rxyz"));
+	r=textFile.Read(recBuf);
+	test(r==KErrNone);
+	test(recBuf==record[0]);
+	
+	TBuf<601> bigBuf;
+	TPtrC largePtr((TText*)largeRecord->Ptr(),(largeRecord->Length()-1));
+	textFile.Seek(ESeekStart);
+	r=textFile.Read(bigBuf);
+	test(r==KErrNone);
+	test(bigBuf==largePtr);
+	r=textFile.Read(recBuf);
+	test(r==KErrNone);
+	test(recBuf==_L("12345\rxyz"));
+	r=textFile.Read(recBuf);
+	test(r==KErrNone);
+	test(recBuf==record[0]);
+	f.Close();
+
+	User::Free(largeRecord);
+	test(fs.Delete(_L("TEXTFILE.txt")) == KErrNone);
+	fs.Close();
+	}
+
+LOCAL_C void testTFileTextEndRecord()
+//
+// Test terminating record
+//
+	{
+	RFs fs;
+	test(fs.Connect() == KErrNone);
+
+	RFile f;
+	TInt r=f.Replace(fs,_L("TextFile"),0);
+	test(r==KErrNone);
+	TPtrC8 bufPtr;
+	TBuf<16>boundaryBuf=_L("Record1\n");
+	bufPtr.Set((TUint8*)boundaryBuf.Ptr(),boundaryBuf.Size());	
+	r=f.Write(bufPtr);
+	test(r==KErrNone);
+	boundaryBuf=_L("Record2\n");
+	bufPtr.Set((TUint8*)boundaryBuf.Ptr(),boundaryBuf.Size());	
+	r=f.Write(bufPtr);
+	test(r==KErrNone);
+	boundaryBuf=_L("Record3\n");
+	bufPtr.Set((TUint8*)boundaryBuf.Ptr(),boundaryBuf.Size());	
+	r=f.Write(bufPtr);
+	test(r==KErrNone);
+	
+	TFileText fText;
+	fText.Set(f);
+	r=fText.Seek(ESeekStart);
+	test(r==KErrNone);
+	TBuf<32> recBuf;
+	r=fText.Read(recBuf);
+	test(r==KErrNone);
+	test(recBuf.MatchF(_L("record1"))!=KErrNotFound);
+	r=fText.Read(recBuf);
+	test(r==KErrNone);
+	test(recBuf.MatchF(_L("record2"))!=KErrNotFound);
+	r=fText.Read(recBuf);
+	test(r==KErrNone);
+	test(recBuf.MatchF(_L("record3"))!=KErrNotFound);
+	r=fText.Read(recBuf);
+	test(r==KErrEof);
+	test(recBuf.Length()==0);
+	f.Close();
+
+	TBuf<0x100> bigBuf(0x100);
+	bigBuf.Fill('A');
+	r=f.Replace(fs,_L("TextFile"),0);
+	test(r==KErrNone);
+	
+    bufPtr.Set((TUint8*)bigBuf.Ptr(),bigBuf.Size());	
+	r=f.Write(bufPtr);
+	test(r==KErrNone);
+
+	fText.Set(f);
+	r=fText.Seek(ESeekStart);
+	test(r==KErrNone);
+	bigBuf.SetLength(0);
+	r=fText.Read(bigBuf);
+//	test.Printf(_L("fText.Read returns %d\n"),r);
+	test(r==KErrNone);
+//	test.Printf(_L("BigBuf.Length()==%d\n"),bigBuf.Length());
+	test(bigBuf.Length()==0x100);
+	r=fText.Read(bigBuf);
+	test(r==KErrEof);
+	test(bigBuf.Length()==0);
+	f.Close();
+	
+	test(fs.Delete(_L("TextFile")) == KErrNone);
+	fs.Close();
+	}
+
+void testRFileOpen()
+	{
+	_LIT(KTestFile, "c:\\symport_test_rfile_open");
+	_LIT8(KTestText, "abcdefghijklmnopqrstuvwxyz");
+	
+	RFs fs;
+	test(fs.Connect() == KErrNone);
+
+	fs.SetAtt(KTestFile, 0, KEntryAttReadOnly);
+	fs.Delete(KTestFile);
+	
+	// File doesn't exist
+	RFile file;
+	test(file.Open(fs, KTestFile, 0) == KErrNotFound);
+	
+	// Create the file
+	test(file.Create(fs, KTestFile, 0) == KErrNone);
+	test(file.Write(KTestText) == KErrNone);
+
+	// Should be okay to close a file twice
+	file.Close();
+	file.Close();
+	
+	// Open the file for reading
+	TBuf8<26> buf;
+	test(file.Open(fs, KTestFile, EFileShareAny) == KErrNone);
+	test(file.Read(buf) == KErrNone && buf == KTestText);
+
+	// Check you can't write to it
+	test(file.Write(KTestText) == KErrAccessDenied);
+	
+	// Check another file can be opened at the same time
+	RFile file2;
+	test(file2.Open(fs, KTestFile, EFileShareAny) == KErrNone);	
+	test(file2.Read(buf) == KErrNone && buf == KTestText);
+	file2.Close();
+	test(file2.Open(fs, KTestFile, EFileShareAny|EFileWrite) == KErrNone);	
+	file2.Close();
+	file.Close();
+	
+	// Open the file for writing
+	test(file.Open(fs, KTestFile, EFileShareAny|EFileWrite) == KErrNone);
+	test(file.Read(buf) == KErrNone && buf == KTestText);
+	
+	// Check you can write to it
+	test(file.Write(KTestText) == KErrNone);
+	
+	// Check another file can be opened at the same time	
+	test(file2.Open(fs, KTestFile, EFileShareAny|EFileRead) == KErrNone);
+	file2.Close();
+	test(file2.Open(fs, KTestFile, EFileShareAny|EFileWrite) == KErrNone);	
+	file2.Close();
+
+	// Read back what we just wrote
+	file.Close();
+	test(file.Open(fs, KTestFile, 0) == KErrNone);
+	test(file.Read(buf) == KErrNone && buf == KTestText);
+	test(file.Read(buf) == KErrNone && buf == KTestText);
+	file.Close();
+	
+	// Check error on read only file
+	test(fs.SetAtt(KTestFile, KEntryAttReadOnly, 0) == KErrNone);
+	test(file.Open(fs, KTestFile, EFileWrite) == KErrAccessDenied);
+	test(fs.SetAtt(KTestFile, 0, KEntryAttReadOnly) == KErrNone);	
+	test(file.Open(fs, KTestFile, EFileWrite) == KErrNone);
+	file.Close();
+
+	test(fs.Delete(KTestFile) == KErrNone);
+	fs.Close();
+	}
+
+void testRFileCreate()
+	{
+	_LIT(KTestFile, "c:\\symport_test_rfile_create");
+	_LIT8(KTestText, "abcdefghijklmnopqrstuvwxyz");
+	
+	RFs fs;
+	test(fs.Connect() == KErrNone);
+	fs.Delete(KTestFile);
+	
+	// Create should work when file doesn't exist
+	RFile file;
+	test(file.Create(fs, KTestFile, 0) == KErrNone);
+	test(file.Write(KTestText) == KErrNone);
+	file.Close();
+	
+	// Create should fail when file does exist
+	test(file.Create(fs, KTestFile, 0) == KErrAlreadyExists);
+	test(fs.Delete(KTestFile) == KErrNone);
+	
+	// Check you can read from the file
+	test(file.Create(fs, KTestFile, 0) == KErrNone);
+	test(file.Write(KTestText) == KErrNone);
+	TInt pos = 0;
+	test(file.Seek(ESeekStart, pos) == KErrNone);
+	TBuf8<26> buf;
+	test(file.Read(buf) == KErrNone && buf == KTestText);
+	test(file.Write(KTestText) == KErrNone);
+	pos = 26;
+	test(file.Seek(ESeekStart, pos) == KErrNone);
+	test(file.Read(buf) == KErrNone && buf == KTestText);
+	file.Close();
+
+	// Check error on read only file
+	test(fs.SetAtt(KTestFile, KEntryAttReadOnly, 0) == KErrNone);
+	test(file.Replace(fs, KTestFile, EFileWrite) == KErrAccessDenied);
+	test(fs.SetAtt(KTestFile, 0, KEntryAttReadOnly) == KErrNone);	
+	test(file.Replace(fs, KTestFile, EFileWrite) == KErrNone);
+	file.Close();
+
+	fs.Delete(KTestFile);
+	fs.Close();
+	}
+
+void testRFileReplace()
+	{
+	_LIT(KTestFile, "c:\\symport_test_rfile_replace");
+	_LIT8(KTestText, "abcdefghijklmnopqrstuvwxyz");
+	
+	RFs fs;
+	test(fs.Connect() == KErrNone);
+	fs.Delete(KTestFile);
+	
+	// Reaplce should work when file doesn't exist
+	RFile file;
+	test(file.Replace(fs, KTestFile, 0) == KErrNone);
+	test(file.Write(KTestText) == KErrNone);
+	file.Close();
+	
+	// Replace should also work when file does exist
+	test(file.Replace(fs, KTestFile, 0) == KErrNone);
+	test(file.Write(KTestText) == KErrNone);
+	
+	// Check you can read from the file
+	TInt pos = 0;
+	test(file.Seek(ESeekStart, pos) == KErrNone);
+	TBuf8<26> buf;
+	test(file.Read(buf) == KErrNone && buf == KTestText);
+	test(file.Write(KTestText) == KErrNone);
+	pos = 26;
+	test(file.Seek(ESeekStart, pos) == KErrNone);
+	test(file.Read(buf) == KErrNone && buf == KTestText);
+	file.Close();
+
+	fs.Delete(KTestFile);
+	fs.Close();
+	}
+
+void testRFileTemp()
+	{
+	_LIT(KTestDir, "c:\\symport_test_rfile_temp\\");
+	_LIT8(KTestText, "abcdefghijklmnopqrstuvwxyz");
+	
+	RFs fs;
+	test(fs.Connect() == KErrNone);
+	fs.MkDir(KTestDir);
+
+	TFileName f1;
+	RFile file;
+	
+	// Use invalid path
+	test(file.Temp(fs, _L("invalid"), f1, 0) == KErrBadName);
+	test(file.Temp(fs, _L("invalid\\"), f1, 0) == KErrBadName);
+	
+	// Try to use a file for the path
+	test(file.Replace(fs, _L("invalid"), 0) == KErrNone);
+	file.Close();
+	test(file.Temp(fs, _L("invalid"), f1, 0) == KErrBadName);
+	test(fs.Delete(_L("invalid")) == KErrNone);
+	
+	test(file.Temp(fs, KTestDir, f1, 0) == KErrNone);
+	test(file.Write(KTestText) == KErrNone);
+	file.Close();
+	
+	// Check it works a second time
+	TFileName f2;
+	test(file.Temp(fs, KTestDir, f2, 0) == KErrNone);
+	
+	// Check you can read from the file
+	test(file.Write(KTestText) == KErrNone);
+	TInt pos = 0;
+	test(file.Seek(ESeekStart, pos) == KErrNone);
+	TBuf8<26> buf;
+	test(file.Read(buf) == KErrNone && buf == KTestText);
+	test(file.Write(KTestText) == KErrNone);
+	pos = 26;
+	test(file.Seek(ESeekStart, pos) == KErrNone);
+	test(file.Read(buf) == KErrNone && buf == KTestText);
+	file.Close();
+
+	test(fs.Delete(f1) == KErrNone);
+	test(fs.Delete(f2) == KErrNone);
+
+	// See if you can create a temp on root
+	test(file.Temp(fs, _L("C:\\"), f1, 0) == KErrNone);
+	file.Close();
+	test(fs.Delete(f1) == KErrNone);
+
+	// See if empty path is okay
+	test(file.Temp(fs, KNullDesC, f1, 0) == KErrNone);
+	file.Close();
+	test(fs.Delete(f1) == KErrNone);
+
+	fs.RmDir(KTestDir);
+	fs.Close();
+	}
+
+void testRFileRead()
+	{
+	_LIT(KTestFile, "c:\\symport_test_rfile_read");
+	_LIT8(KTestText, "abcdefghijklmnopqrstuvwxyz");
+	
+	RFs fs;
+	test(fs.Connect() == KErrNone);
+
+	// Create a test file
+	RFile file;
+	test(file.Replace(fs, KTestFile, EFileWrite) == KErrNone);
+	test(file.Write(KTestText) == KErrNone);
+	file.Close();
+	
+	TBuf8<13> buf;
+	test(file.Open(fs, KTestFile, 0) == KErrNone);
+
+	// File position at the start
+	TInt pos = 0;
+	test(file.Seek(ESeekCurrent, pos) == KErrNone);
+	test(pos == 0);
+	
+	test(file.Read(buf) == KErrNone);
+	test(buf.Length() == 13 && buf == KTestText().Left(13));
+	
+	// Check file position is updated
+	pos = 0;
+	test(file.Seek(ESeekCurrent, pos) == KErrNone);
+	test(pos == 13);
+	
+	test(file.Read(buf) == KErrNone);
+	test(buf.Length() == 13 && buf == KTestText().Right(13));
+	test(file.Read(buf) == KErrNone);
+	test(buf.Length() == 0);
+	
+	pos = 13;
+	test(file.Seek(ESeekStart, pos) == KErrNone);
+	test(file.Read(buf) == KErrNone);
+	test(buf.Length() == 13 && buf == KTestText().Right(13));
+	test(file.Read(buf) == KErrNone);
+	test(buf.Length() == 0);
+
+	// Move back to the start
+	pos = 0;
+	test(file.Seek(ESeekStart, pos) == KErrNone);
+	
+	test(file.Read(buf, 6) == KErrNone);
+	test(buf.Length() == 6 && buf == KTestText().Left(6));
+	pos = 20;
+	test(file.Seek(ESeekStart, pos) == KErrNone);
+	test(file.Read(buf, 6) == KErrNone);
+	test(buf.Length() == 6 && buf == KTestText().Right(6));
+	test(file.Read(buf, 1) == KErrNone);
+	test(buf.Length() == 0);
+
+	test(file.Read(0, buf) == KErrNone);
+	test(buf.Length() == 13 && buf == KTestText().Left(13));
+	test(file.Read(13, buf) == KErrNone);
+	test(buf.Length() == 13 && buf == KTestText().Right(13));
+	test(file.Read(23, buf) == KErrNone);
+	test(buf.Length() == 3 && buf == KTestText().Right(3));
+	test(file.Read(27, buf) == KErrNone);
+	test(buf.Length() == 0);
+
+	test(file.Read(0, buf, 6) == KErrNone);
+	test(buf.Length() == 6 && buf == KTestText().Left(6));
+	test(file.Read(20, buf, 6) == KErrNone);
+	test(buf.Length() == 6 && buf == KTestText().Right(6));
+	test(file.Read(23, buf, 6) == KErrNone);
+	test(buf.Length() == 3 && buf == KTestText().Right(3));
+	test(file.Read(27, buf, 6) == KErrNone);
+	test(buf.Length() == 0);
+
+	file.Close();
+	
+	test(fs.Delete(KTestFile) == KErrNone);
+	fs.Close();
+	}
+
+void testRFileWrite()
+	{
+	_LIT(KTestFile, "c:\\symport_test_rfile_write");
+	_LIT8(KTestText, "abcdefghijklm");
+	
+	RFs fs;
+	test(fs.Connect() == KErrNone);
+	
+	TBuf8<26> buf;
+	RFile file;
+	test(file.Replace(fs, KTestFile, 0) == KErrNone);
+	test(file.Read(buf) == KErrNone && buf.Length() == 0);
+
+	// File position at the start
+	TInt pos = 0;
+	test(file.Seek(ESeekCurrent, pos) == KErrNone);
+	test(pos == 0);
+
+	test(file.Write(KTestText) == KErrNone); //13
+
+	// Check position updated
+	pos = 0;
+	test(file.Seek(ESeekCurrent, pos) == KErrNone);
+	test(pos == 13);
+
+	test(file.Read(0, buf) == KErrNone && buf == KTestText);
+	test(file.Write(KTestText) == KErrNone); //26
+	test(file.Read(0, buf) == KErrNone && buf.Length() == 26 && buf.Left(13) == KTestText  && buf.Right(13) == KTestText);
+	file.Close();
+
+	// Test read after write
+	test(file.Open(fs, KTestFile, EFileWrite) == KErrNone);
+	test(file.Write(KTestText) == KErrNone);
+	test(file.Read(buf) == KErrNone);
+	test(buf.Length() == 13);
+	file.Close();
+
+	// Test write after read
+	test(file.Open(fs, KTestFile, EFileWrite) == KErrNone);
+	test(file.Read(buf) == KErrNone && buf.Length() == 26);
+	test(file.Write(KTestText) == KErrNone);
+	test(file.Read(26, buf) == KErrNone && buf.Length() == 13);
+	file.Close();
+	
+	test(file.Replace(fs, KTestFile, 0) == KErrNone);
+	test(file.Read(buf) == KErrNone && buf.Length() == 0);
+	test(file.Write(KTestText, 6) == KErrNone); //6
+	test(file.Read(0, buf) == KErrNone && buf == KTestText().Left(6));
+	test(file.Write(KTestText, 6) == KErrNone); //12
+	test(file.Read(0, buf) == KErrNone && buf.Length() == 12 && buf.Left(6) == KTestText().Left(6)  && buf.Right(6) == KTestText().Left(6));
+	file.Close();
+	
+	// Test read after write
+	test(file.Open(fs, KTestFile, EFileWrite) == KErrNone);
+	test(file.Write(KTestText, 6) == KErrNone); //6
+	test(file.Read(buf) == KErrNone && buf.Length() == 6);
+	file.Close();
+
+	// Test write after read
+	test(file.Open(fs, KTestFile, EFileWrite) == KErrNone);
+	test(file.Read(buf) == KErrNone && buf.Length() == 12);
+	test(file.Write(KTestText, 6) == KErrNone);
+	test(file.Read(12, buf) == KErrNone && buf.Length() == 6);
+	file.Close();
+
+	test(file.Replace(fs, KTestFile, 0) == KErrNone);
+	test(file.Read(buf) == KErrNone && buf.Length() == 0);
+	test(file.Write(3, KTestText) == KErrNone); //0+13=13
+	test(file.Read(0, buf) == KErrNone);
+	test(buf.Length() == 13);
+	test(buf == KTestText);
+	test(file.Write(7, KTestText) == KErrNone); //7+13=20
+	test(file.Read(0, buf) == KErrNone && buf.Length() == 20 && buf.Mid(7,13) == KTestText());
+	file.Close();
+
+	// Test read after write
+	test(file.Open(fs, KTestFile, EFileWrite) == KErrNone);
+	test(file.Write(0, KTestText) == KErrNone); //13
+	test(file.Read(buf) == KErrNone && buf.Length() == 7);
+	file.Close();
+
+	// Test write after read
+	test(file.Open(fs, KTestFile, EFileWrite) == KErrNone);
+	test(file.Read(buf) == KErrNone && buf.Length() == 20);
+	test(file.Write(10, KTestText) == KErrNone); //10+13=23
+	test(file.Read(0, buf) == KErrNone && buf.Length() == 23);
+	file.Close();
+
+	test(file.Replace(fs, KTestFile, 0) == KErrNone);
+	test(file.Read(buf) == KErrNone && buf.Length() == 0);
+	test(file.Write(3, KTestText, 10) == KErrNone); //0+10=10
+	test(file.Read(0, buf) == KErrNone);
+	test(buf.Length() == 10 && buf == KTestText().Left(10));
+	test(file.Write(0, KTestText, 3) == KErrNone); //10
+	test(file.Read(0, buf) == KErrNone );
+	test(buf.Length() == 10);
+	test(buf.Left(3) == KTestText().Left(3));
+	file.Close();
+
+	// Test read after write
+	test(file.Open(fs, KTestFile, EFileWrite) == KErrNone);
+	test(file.Write(0, KTestText, 3) == KErrNone); //3
+	test(file.Read(buf) == KErrNone);
+	test(buf.Length() == 7);
+	file.Close();
+
+	// Test write after read
+	test(file.Open(fs, KTestFile, EFileWrite) == KErrNone);
+	test(file.Read(buf) == KErrNone && buf.Length() == 10);
+	test(file.Write(13, KTestText, 6) == KErrNone); //10+6=16
+	test(file.Read(0, buf) == KErrNone && buf.Length() == 16);
+	file.Close();
+	
+	test(fs.Delete(KTestFile) == KErrNone);
+	fs.Close();
+	}
+
+void testRFileSeek()
+	{
+	_LIT(KTestFile, "c:\\symport_test_rfile_seek");
+	_LIT8(KTestText, "abcdefghijklmnopqrstuvwxyz");
+	
+	RFs fs;
+	test(fs.Connect() == KErrNone);
+	
+	// Create the file
+	RFile file;
+	test(file.Replace(fs, KTestFile, EFileWrite) == KErrNone);
+	test(file.Write(KTestText) == KErrNone);
+	
+	// ESeekAddress is invalid
+	TInt pos = 0;
+	test(file.Seek(ESeekAddress, pos) == KErrNotSupported);
+	
+	// Error on negative offset
+	pos = -999;
+	test(file.Seek(ESeekStart, pos) == KErrArgument);
+	
+	// Test you can get the file position
+	pos = 12;
+	test(file.Seek(ESeekStart, pos) == KErrNone);
+	test(pos == 12);
+	TBuf8<26> buf;
+	test(file.Read(buf, 1) == KErrNone);
+	test(buf == _L8("m")); //13
+
+	pos = 0;
+	test(file.Seek(ESeekCurrent, pos) == KErrNone);
+	test(pos == 13);
+	
+	// Move to the end of the file
+	pos = 30;
+	test(file.Seek(ESeekStart, pos) == KErrNone);
+	test(pos == 30);
+	test(file.Size(pos) == KErrNone);
+	test(pos == 26);
+	
+	// Move back from the end
+	pos = -1;
+	test(file.Seek(ESeekEnd, pos) == KErrNone);
+	test(pos == 25);
+	test(file.Read(buf) == KErrNone);
+	test(buf == _L8("z"));
+
+	// Move past the end
+	pos = 10;
+	test(file.Seek(ESeekEnd, pos) == KErrNone);
+	test(pos == 26);
+	test(file.Read(buf) == KErrNone);
+	test(buf.Length() == 0);
+	
+	// Move before the start
+	pos = -30;
+	test(file.Seek(ESeekEnd, pos) == KErrNone);
+	test(pos == 0);
+	test(file.Read(buf) == KErrNone);
+	test(buf.Length() == 26);
+	
+	// Check seek to current
+	pos = 13;
+	test(file.Seek(ESeekStart, pos) == KErrNone);
+	test(file.Read(buf, 1) == KErrNone); //14
+	test(buf == _L8("n"));
+	pos = -13;
+	test(file.Seek(ESeekCurrent, pos) == KErrNone);
+	test(pos == 1);
+	test(file.Read(buf, 1) == KErrNone); //2
+	test(buf == _L8("b"));
+
+	// Before the start
+	pos = -10;
+	test(file.Seek(ESeekCurrent, pos) == KErrNone);
+	test(pos == 0);
+	test(file.Read(buf, 1) == KErrNone); //1
+	test(buf == _L8("a"));
+
+	// After the end
+	pos = 26;
+	test(file.Seek(ESeekCurrent, pos) == KErrNone);
+	test(pos == 26);
+	test(file.Read(buf, 1) == KErrNone);
+	test(buf.Length() == 0);
+	
+	// Check current pos
+	pos = 0;
+	test(file.Seek(ESeekCurrent, pos) == KErrNone);
+	test(pos == 26);
+
+	// And check you can go back
+	pos = -1;
+	test(file.Seek(ESeekCurrent, pos) == KErrNone);
+	test(file.Read(buf, 1) == KErrNone);
+	test(buf == _L8("z"));
+	
+	file.Close();
+	test(fs.Delete(KTestFile) == KErrNone);
+	fs.Close();
+	}
+
+void testRFileFlush()
+	{
+	_LIT(KTestFile, "c:\\symport_test_rfile_flush");
+	_LIT8(KTestText, "abcdefghijklmnopqrstuvwxyz");
+	
+	RFs fs;
+	test(fs.Connect() == KErrNone);
+	fs.Delete(KTestFile);
+	
+	// Create the file
+	RFile file;
+	test(file.Replace(fs, KTestFile, EFileWrite) == KErrNone);
+
+	// Check file pos
+	TInt pos = 0;
+	test(file.Seek(ESeekCurrent, pos) == KErrNone);
+	test(pos == 0);
+
+	test(file.Write(KTestText) == KErrNone);
+	
+	// Check file pos
+	pos = 0;
+	test(file.Seek(ESeekCurrent, pos) == KErrNone);
+	test(pos == 26);
+
+	test(file.Flush() == KErrNone);
+
+	// Check file pos hasn't changed
+	pos = 0;
+	test(file.Seek(ESeekCurrent, pos) == KErrNone);
+	test(pos == 26);
+
+	file.Close();
+	
+	test(fs.Delete(KTestFile) == KErrNone);
+	fs.Close();
+	}
+
+void testRFileSize()
+	{
+	_LIT(KTestFile, "c:\\symport_test_rfile_flush");
+	_LIT8(KTestText, "abcdefghijklmnopqrstuvwxyz");
+	
+	RFs fs;
+	test(fs.Connect() == KErrNone);
+	fs.Delete(KTestFile);
+	
+	// Create the file
+	RFile file;
+	test(file.Replace(fs, KTestFile, EFileWrite) == KErrNone);
+
+	TInt size = 0;
+	test(file.Size(size) == KErrNone);
+	test(size == 0);
+	
+	// Check file pos
+	TInt pos = 0;
+	test(file.Seek(ESeekCurrent, pos) == KErrNone);
+	test(pos == 0);
+
+	test(file.Write(KTestText) == KErrNone);
+	
+	size = 0;
+	test(file.Size(size) == KErrNone);
+	test(size == 26);
+
+	// Check file pos
+	pos = 0;
+	test(file.Seek(ESeekCurrent, pos) == KErrNone);
+	test(pos == 26);
+
+	file.Close();
+	
+	test(fs.Delete(KTestFile) == KErrNone);
+	fs.Close();
+	}
+
+void testRFileSetSize()
+	{
+	_LIT(KTestFile, "c:\\symport_test_rfile_flush");
+	_LIT8(KTestText, "abcdefghijklmnopqrstuvwxyz");
+	
+	RFs fs;
+	test(fs.Connect() == KErrNone);
+	fs.Delete(KTestFile);
+	
+	// Create the file
+	RFile file;
+	test(file.Replace(fs, KTestFile, EFileWrite) == KErrNone);
+	
+	// Check file pos
+	TInt pos = 0;
+	test(file.Seek(ESeekCurrent, pos) == KErrNone);
+	test(pos == 0);
+
+	test(file.Write(KTestText) == KErrNone); //26
+
+	// Set the size to bigger
+	test(file.SetSize(30) == KErrNone);
+
+	// Check file pos is unchanged
+	pos = 0;
+	test(file.Seek(ESeekCurrent, pos) == KErrNone);
+	test(pos == 26);
+
+	// Set the size to smaller
+	test(file.SetSize(20) == KErrNone);
+
+	// Check file pos is at the end
+	pos = 0;
+	test(file.Seek(ESeekCurrent, pos) == KErrNone);
+	test(pos == 20);
+
+	file.Close();
+
+	// Open for reading	
+	test(file.Open(fs, KTestFile, 0) == KErrNone);
+
+	// Shouldn't be allowed to set the size
+	test(file.SetSize(10) == KErrAccessDenied);
+	
+	file.Close();
+	
+	test(fs.Delete(KTestFile) == KErrNone);
+	fs.Close();
+	}
+
+void testRFileAtt()
+	{
+	// Connect to the file system
+	RFs fs;
+	test(fs.Connect() == KErrNone);
+	
+	_LIT(KTestFile, "c:\\symport_test_rile_att.txt");	
+
+	// See if it works for normal files
+	TUint att;
+	RFile file;
+	test(file.Replace(fs, KTestFile, EFileShareAny|EFileWrite) == KErrNone);
+	
+	// Check file pos is at the start
+	TInt pos = 0;
+	test(file.Seek(ESeekCurrent, pos) == KErrNone);
+	test(pos == 0);
+
+	test(file.Write(_L8("test")) == KErrNone);
+	test(file.Att(att) == KErrNone);
+	test(!(att&KEntryAttDir));
+
+	// Check file pos is correct
+	pos = 0;
+	test(file.Seek(ESeekCurrent, pos) == KErrNone);
+	test(pos == 4);
+
+	// Check readonly flag
+	test(!(att&KEntryAttReadOnly));
+	test(file.SetAtt(KEntryAttReadOnly, 0) == KErrNone);
+	test(file.Att(att) == KErrNone && att&KEntryAttReadOnly);
+	
+	// Clear the flag
+	test(file.SetAtt(0, KEntryAttReadOnly) == KErrNone);
+	test(file.Att(att) == KErrNone);
+	test(!(att&KEntryAttReadOnly));
+	file.Close();
+	
+	// Delete the file
+	test(fs.Delete(KTestFile) == KErrNone);	
+	fs.Close();
+	}
+
+void testRFileModified()
+	{
+	// Connect to the file system
+	RFs fs;
+	test(fs.Connect() == KErrNone);
+	
+	_LIT(KTestFile, "c:\\symport_test_rile_modified.txt");	
+
+	// See if it works for normal files
+	RFile file;
+	test(file.Replace(fs, KTestFile, EFileShareAny|EFileWrite) == KErrNone);
+	
+	// Check file pos is at the start
+	TInt pos = 0;
+	test(file.Seek(ESeekCurrent, pos) == KErrNone);
+	test(pos == 0);
+
+	test(file.Write(_L8("test")) == KErrNone);
+	test(file.Flush() == KErrNone);
+
+	TTime then;
+	test(file.Modified(then) == KErrNone);
+	User::After(2000000);
+	
+	// Check file pos is correct
+	pos = 0;
+	test(file.Seek(ESeekCurrent, pos) == KErrNone);
+	test(pos == 4);
+	
+	file.Close();
+	
+	test(file.Open(fs, KTestFile, EFileWrite) == KErrNone);
+	test(file.Write(_L8("test")) == KErrNone);
+	test(file.Flush() == KErrNone);
+	
+	TTime now;
+	test(file.Modified(now) == KErrNone);
+
+	TTimeIntervalSeconds sec;
+	test(now.SecondsFrom(then, sec) == KErrNone);
+	test(sec.Int() >= 1);
+	
+	file.Close();
+	
+	// Delete the file
+	test(fs.Delete(KTestFile) == KErrNone);	
+	fs.Close();
+	}
+
+void testRFileDrive()
+	{
+	// Connect to the file system
+	RFs fs;
+	test(fs.Connect() == KErrNone);
+	
+	_LIT(KTestFile, "c:\\symport_test_rile_drive.txt");	
+
+	// See if it works for normal files
+	RFile file;
+	test(file.Replace(fs, KTestFile, EFileShareAny|EFileWrite) == KErrNone);
+	
+	TInt drive;
+	TDriveInfo info;
+	
+	test(file.Drive(drive, info) == KErrNone);
+	test(drive == EDriveC);
+	
+#ifdef __TOOLS2__
+	test(info.iType == EMediaHardDisk);
+	test(info.iBattery == EBatNotSupported);
+	test(info.iDriveAtt&(KDriveAttLocal|KDriveAttInternal));
+	test(info.iMediaAtt == 0);
+#endif
+
+	file.Close();
+	
+	// Delete the file
+	test(fs.Delete(KTestFile) == KErrNone);	
+	file.Close();
+	fs.Close();
+	}
+
+void testRFileRename()
+	{
+	// Connect to the file system
+	RFs fs;
+	test(fs.Connect() == KErrNone);
+	
+	_LIT(KTestFile1, "c:\\symport_test_rile_rename_a.txt");	
+	_LIT(KTestFile2, "c:\\symport_test_rile_rename_b.txt");	
+	fs.Delete(KTestFile1);
+	fs.Delete(KTestFile2);
+	
+	// See if it works for normal files
+	RFile file;
+	test(file.Replace(fs, KTestFile1, EFileShareExclusive|EFileWrite) == KErrNone);
+	
+	// Check file pos is correct
+	TInt pos = 0;
+	test(file.Seek(ESeekCurrent, pos) == KErrNone);
+	test(pos == 0);
+	test(file.Write(_L8("test")) == KErrNone);
+	pos = 0;
+	test(file.Seek(ESeekCurrent, pos) == KErrNone);
+	test(pos == 4);
+
+	test(file.Rename(KTestFile2) == KErrNone);
+	
+	// Check file pos is correct
+	pos = 0;
+	test(file.Seek(ESeekCurrent, pos) == KErrNone);
+	test(pos == 4);
+	test(file.Write(_L8("test")) == KErrNone);
+	file.Close();
+
+	test(file.Open(fs, KTestFile2, EFileShareExclusive) == KErrNone);
+
+	// Check file pos is correct
+	pos = 0;
+	test(file.Seek(ESeekCurrent, pos) == KErrNone);
+	test(pos == 0);
+	TBuf8<16> buf;
+	test(file.Read(buf) == KErrNone);
+	test(buf.Length() == 8);
+	pos = 0;
+	test(file.Seek(ESeekCurrent, pos) == KErrNone);
+	test(pos == 8);
+
+	// Should fail because not opened for write
+	test(file.Rename(KTestFile1) == KErrAccessDenied);
+
+	// Check file pos is correct
+	pos = 0;
+	test(file.Seek(ESeekCurrent, pos) == KErrNone);
+	test(pos == 8);
+
+	// Check you can't write to the file
+	test(file.Write(_L8("test")) == KErrAccessDenied);
+	file.Close();
+	
+	// Recreate the first file
+	test(file.Replace(fs, KTestFile1, EFileShareExclusive|EFileWrite) == KErrNone);
+	file.Close();
+	
+	// Check error if renaming to existing file
+	test(file.Open(fs, KTestFile2, EFileShareExclusive) == KErrNone);	
+	test(file.Rename(KTestFile1) == KErrAccessDenied);
+	file.Close();
+	
+	// Cleanup
+	test(fs.Delete(KTestFile1) == KErrNone);
+	test(fs.Delete(KTestFile2) == KErrNone);
+	fs.Close();
+	}
+
+void testRFileDuplicate()
+	{
+	// Connect to the file system
+	RFs fs;
+	test(fs.Connect() == KErrNone);
+	
+	_LIT(KTestFile1, "c:\\symport_test_rile_duplicate.txt");	
+
+	RFile file1;
+	test(file1.Replace(fs, KTestFile1, EFileWrite) == KErrNone);
+	test(file1.Write(_L8("Test")) == KErrNone);
+	test(file1.Flush() == KErrNone);
+	
+	// Test you can duplicate the handle and read from it
+	RFile file2;
+	test(file2.Duplicate(file1) == KErrNone);
+	
+	// File position should match
+	TInt pos = 0;
+	test(file2.Seek(ESeekCurrent, pos) == KErrNone);
+	test(pos == 4);
+	
+	// Move back to the start
+	pos = 0;
+	test(file2.Seek(ESeekStart, pos) == KErrNone);
+	test(pos == 0);
+	
+	// Check you can read from the file
+	TBuf8<8> buf;
+	test(file2.Read(buf) == KErrNone);
+	test(buf.Length() == 4);
+
+	// Check you can write to the file
+	test(file2.Write(_L8("Test")) == KErrNone);
+
+	file1.Close();
+	file2.Close();
+	
+	// Now open readonly
+	test(file1.Open(fs, KTestFile1, 0) == KErrNone);
+	pos = 4;
+	test(file1.Seek(ESeekStart, pos) == KErrNone);
+	test(pos == 4);
+	
+	// Test you can duplicate the handle and read from it
+	test(file2.Duplicate(file1) == KErrNone);
+	
+	// File position should match
+	pos = 0;
+	test(file2.Seek(ESeekCurrent, pos) == KErrNone);
+	test(pos == 4);
+	
+	// Move back to the start
+	pos = 0;
+	test(file2.Seek(ESeekStart, pos) == KErrNone);
+	test(pos == 0);
+	
+	// Check you can read from the file
+	test(file2.Read(buf) == KErrNone);
+	test(buf.Length() == 8);
+
+	// Check you can't write to the file
+	test(file2.Write(_L8("Test")) == KErrAccessDenied);
+
+	file1.Close();
+	file2.Close();
+	
+	test(fs.Delete(KTestFile1) == KErrNone);
+	fs.Close();
+	}
+
+void testRFileName()
+	{
+	// Connect to the file system
+	RFs fs;
+	test(fs.Connect() == KErrNone);
+	
+	_LIT(KTestFile1, "C:\\symport_test_rile_filename.txt");	
+
+	RFile file1;
+	test(file1.Replace(fs, KTestFile1, 0) == KErrNone);
+
+	TFileName name;
+	test(file1.Name(name) == KErrNone);
+	test(name == KTestFile1().Mid(3));
+	test(file1.FullName(name) == KErrNone);
+	test(name == KTestFile1);
+	file1.Close();
+	
+	test(fs.Delete(KTestFile1) == KErrNone);
+	fs.Close();
+	}
+
+void testRFs()
+	{	
+	test.Start(_L("Att"));
+	testAtt();
+	
+	test.Next(_L("SetAtt"));
+	testSetAtt();
+
+	test.Next(_L("Modified"));
+	testModified();
+
+	test.Next(_L("MkDir"));
+	testMkDir();
+
+	test.Next(_L("MkDirAll"));
+	testMkDirAll();
+	
+	test.Next(_L("RmDir"));
+	testRmDir();
+	
+	test.Next(_L("Parse"));
+	testParse();
+	
+	test.Next(_L("SessionPath"));
+	testSessionPath();
+	
+	test.Next(_L("SetSessionPath"));
+	testSetSessionPath();
+	
+	test.Next(_L("Delete"));
+	testDelete();
+	
+	test.Next(_L("VolumeIOParam"));
+#ifdef __TOOLS2__
+	testVolumeIOParam();
+#endif
+	
+	test.Next(_L("Entry"));
+	testEntry();
+
+	test.Next(_L("SetEntry"));
+	testSetEntry();
+	
+	test.Next(_L("SetErrorCondition"));
+#ifdef __TOOLS2__
+	testSetErrorCondition();
+#endif
+	
+	test.Next(_L("CharToDrive"));
+	testCharToDrive();
+
+	test.Next(_L("DriveToChar"));
+	testDriveToChar();
+
+	test.Next(_L("IsValidDrive"));
+	testIsValidDrive();
+
+	test.Next(_L("Drive"));
+	testDrive();
+
+	test.Next(_L("GetSystemDrive"));
+	testGetSystemDrive();
+
+	test.Next(_L("Replace"));
+	testReplace();
+
+	test.Next(_L("Rename"));
+	testRename();
+
+	test.End();
+	}
+
+void testTParse()
+	{
+	test.Start(_L("Test all TParse methods"));
+	TestTParse1();
+
+	test.Next(_L("Test multiple PopDirs"));
+	TestTParse2();
+	
+	test.Next(_L("Test conflicting default drive letters"));
+	TestTParse3();
+
+	test.Next(_L("Test conflicting relative drive letters"));
+	TestTParse4();
+	
+	test.Next(_L("Test errors returned by illegal paths"));
+	TestTParse5();
+	
+	test.Next(_L("Test AddDir"));
+	TestTParse6();
+	
+	test.Next(_L("Test TParsePtr"));
+	TestTParse7();
+	
+	test.Next(_L("Test TParsePtrC"));
+	TestTParse8();
+
+	test.Next(_L("Test names with leading spaces"));
+	TestTParse9();
+	
+	test.Next(_L("Test a Path > 256 chars"));
+	TestTParse10();
+	
+	test.End();
+	}
+
+void testTFileText()
+	{
+	test.Start(_L("Test file text"));
+	testTFileTextApi();
+	
+	test.Next(_L("Test FileText last record has no terminator"));
+	testTFileTextEndRecord();
+
+	test.End();
+	}
+
+void testRFile()
+	{
+	test.Start(_L("Open"));
+	testRFileOpen();
+	
+	test.Next(_L("Create"));
+	testRFileCreate();
+	
+	test.Next(_L("Replace"));
+	testRFileReplace();
+	
+	test.Next(_L("Temp"));
+	testRFileTemp();
+	
+	test.Next(_L("Read"));	
+	testRFileRead();
+	
+	test.Next(_L("Write"));
+	testRFileWrite();
+	
+	test.Next(_L("Seek"));
+	testRFileSeek();
+	
+	test.Next(_L("Flush"));
+	testRFileFlush();
+	
+	test.Next(_L("Size"));
+	testRFileSize();
+	
+	test.Next(_L("SetSize"));
+	testRFileSetSize();
+	
+	test.Next(_L("Att"));
+	testRFileAtt();
+	
+	test.Next(_L("Modified"));
+	testRFileModified();
+	
+	test.Next(_L("Drive"));
+	testRFileDrive();
+	
+	test.Next(_L("Rename"));
+	testRFileRename();
+	
+	test.Next(_L("Duplicate"));
+	testRFileDuplicate();
+	
+	test.Next(_L("Name"));
+	testRFileName();
+	
+	test.End();
+	}
+
+// This following isn't relevant to WINSCW
+#ifdef __TOOLS2__
+void testSpecialFilenameProcessing()
+	{
+	// Connect to the file system
+	RFs fs;
+	test(fs.Connect() == KErrNone);
+
+	fs.RmDir(_L("c:\\testMisc\\epoc32\\test1\\"));
+	fs.RmDir(_L("c:\\testMisc\\epoc32\\test2\\"));
+	fs.RmDir(_L("c:\\testMisc\\epoc32\\"));
+	fs.RmDir(_L("c:\\testMisc\\"));
+
+	TUint att;
+	_LIT(KCDriveTest1, "c:\\testMisc\\epoc32\\test1\\");
+	test(fs.MkDirAll(KCDriveTest1) == KErrNone);
+	test(fs.Att(KCDriveTest1, att) == KErrNone);
+	
+	struct stat sb;
+#ifdef _WIN32
+	test(stat("c:\\testMisc\\epoc32\\test1", &sb) == 0);
+#else
+	// Get home
+	char* env = getenv("HOME");
+	test(env != NULL);
+	char home[0x100];
+	strcpy(home, env);
+	
+	// Check it's replaced c: with HOME
+	char testpath[0x100];
+	strcpy(testpath, home);
+	strcat(testpath, "/testmisc/epoc32/test1");
+	test(stat(testpath, &sb) == 0);
+#endif
+		
+#ifdef _WIN32
+	static char *env = "EPOCROOT=\\";
+	test(putenv(env) == 0);
+#else
+	test(setenv("EPOCROOT", home, 1) == 0);
+#endif
+	
+	_LIT(KEpocRootTest, "\\epoc32\\winscw\\c\\testMisc\\test1\\");
+	test(fs.MkDirAll(KEpocRootTest) == KErrNone);
+	test(fs.Att(KEpocRootTest, att) == KErrNone);
+
+#ifdef _WIN32
+	test(stat("\\epoc32\\winscw\\c\\testMisc\\test1", &sb) == 0);
+#else
+	// Check it's replaced \epoc32 with $(EPOCROOT)epoc32
+	strcpy(testpath, home);
+	strcat(testpath, "/epoc32/winscw/c/testmisc/test1");
+	test(stat(testpath, &sb) == 0);
+#endif
+
+	test(fs.RmDir(KEpocRootTest) == KErrNone);
+	test(fs.RmDir(_L("\\epoc32\\winscw\\c\\testMisc\\")) == KErrNone);
+	
+	// Now set EPOCROOT to something a bit more complicated
+#ifdef _WIN32
+	env = "EPOCROOT=c:\\testMisc";
+	test(putenv(env) == 0);
+#else
+	strcpy(testpath, home);
+	strcat(testpath, "/testmisc/");
+	test(setenv("EPOCROOT", testpath, 1) == 0);
+#endif
+
+	_LIT(KCDriveTest2, "\\epoc32\\test2\\");
+	test(fs.MkDirAll(KCDriveTest2) == KErrNone);
+	test(fs.Att(_L("\\epoc32\\test1\\"),att) == KErrNone);
+	test(fs.Att(_L("\\epoc32\\test2\\"),att) == KErrNone);
+
+#ifdef _WIN32
+	test(stat("c:\\testMisc\\epoc32\\test2", &sb) == 0);
+#else
+	strcpy(testpath, home);
+	strcat(testpath, "/testmisc/epoc32/test2");
+	test(stat(testpath, &sb) == 0);
+#endif
+
+#ifdef _WIN32
+	env = "EPOCROOT=\\";
+	test(putenv(env) == 0);
+#else
+	test(setenv("EPOCROOT", home, 1) == 0);
+#endif
+	
+	test(fs.RmDir(_L("c:\\testMisc\\epoc32\\test1\\")) == KErrNone);
+	test(fs.RmDir(_L("c:\\testMisc\\epoc32\\test2\\")) == KErrNone);
+	test(fs.RmDir(_L("c:\\testMisc\\epoc32\\")) == KErrNone);
+	test(fs.RmDir(_L("c:\\testMisc\\")) == KErrNone);
+	
+	fs.Close();
+	}
+
+#ifdef USING_SYMPORT_DLL
+IMPORT_C TVersion SymPortVersion();
+void testVersion()
+	{
+	TVersion ver(SymPortVersion());
+	test(ver.iMajor >= 1);
+
+	TPtrC name(ver.Name());
+	test.Printf(_L("Symport Version: %S\n"), &name);
+	}
+#endif
+#endif
+
+void doMainL()
+	{
+	test.Start(_L("RFs"));
+	testRFs();
+	
+	test.Next(_L("TParse"));
+	testTParse();
+
+	test.Next(_L("TFileText"));
+	testTFileText();
+	
+	test.Next(_L("RFile"));
+	testRFile();
+
+	test.Next(_L("Misc"));
+#ifdef __TOOLS2__
+	testSpecialFilenameProcessing();
+#ifdef USING_SYMPORT_DLL
+	testVersion();
+#endif
+#endif
+
+	test.End();	
+	}
+int E32Main()
+	{
+	__UHEAP_MARK;
+	CTrapCleanup* theCleanup = CTrapCleanup::New();
+	TRAPD(ret, doMainL());
+	test(ret == KErrNone);
+	test.Close();
+	delete theCleanup;
+	__UHEAP_MARKEND;
+	return ret;
+	}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/symfile/test.pl	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,199 @@
+#!/usr/bin/perl
+
+# Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "Symbian Foundation License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+use strict;
+use warnings;
+use Test;
+use Getopt::Long qw(:config auto_version auto_help);
+use File::Spec::Functions;
+use File::Basename;
+
+# The following are the tests to run
+BEGIN { plan tests => 6 }
+
+# Make sure we're in the correct folder
+chdir('../symfile') or die "Failed to set folder: $!";
+
+# Version of the script - just use the date
+$main::VERSION = '02-Oct-08';
+
+# Get command line arguments
+print "\n";
+my ( $verbose, $skip );
+GetOptions("verbose" => \$verbose, "skip" => \$skip) or pod2usage(2);
+
+# Get OS version
+my $win32 = 1 if $^O =~ /MSWin32/;
+print "Running on Win32\n" if $win32 && $verbose;
+print "Running on Linux\n" if !$win32 && $verbose;
+
+# Build the code
+doBuild() if (!$skip);
+
+# Run the tests
+doTest('deb', 't_symfile');
+doTest('rel', 't_symfile');
+doTest('deb', 't_symfile_dll');
+doTest('rel', 't_symfile_dll');
+
+# Run tests in emulator to check compatibility
+if ($win32)
+	{
+	doEmuTest(catfile($ENV{EPOCROOT}, 'epoc32', 'release', 'winscw', 'udeb', 't_symfile.exe'));
+	doEmuTest(catfile($ENV{EPOCROOT}, 'epoc32', 'release', 'winscw', 'urel', 't_symfile.exe'));
+	}
+else
+	{
+	# No emulator on Linux
+	ok(1);
+	ok(1);
+	}
+
+# ***
+# Runs test code
+#
+sub doTest
+	{
+	my ( $variant, $name ) = @_;
+
+	my $test;
+	if ($win32)
+		{
+		$test = catfile($ENV{EPOCROOT}, 'epoc32', 'release', 'tools2', $variant, "$name.exe");
+		}
+	else
+		{
+		# Have to set library path for Linux
+		$ENV{LD_LIBRARY_PATH} =~ s[/epoc32[^:]+:/][];
+		$ENV{LD_LIBRARY_PATH} = "$ENV{EPOCROOT}epoc32/release/tools2/linux-i386/$variant:$ENV{LD_LIBRARY_PATH}";
+		$test = catfile($ENV{EPOCROOT}, 'epoc32', 'release', 'tools2', 'linux-i386', $variant, $name);
+		}
+
+	die "Can't find test exe: $test" if !-e $test;
+	print "Running test: $test\n" if $verbose;
+
+	my $pass;
+	open TEST, "$test|" or die "Failed to start test $test: $!";
+	while(my $line = <TEST>)
+		{
+		next unless $line =~ /RTEST: /;
+		print "\t$line" if $verbose;
+		$pass = 1 if $line =~ /^RTEST: SUCCESS/ or $line =~ /TEST Successfully Completed/;
+		}
+
+	close TEST;
+	print "FAIL: $test\n" if (!$pass);
+	ok($pass);
+	}
+
+# ***
+# Runs emulator test code
+#
+sub doEmuTest
+	{
+	my $test = shift;
+	die "Can't find test exe: $test" if !-e $test;
+	print "Running emulator test: $test\n" if $verbose;
+	my $vis = $verbose ? 'textshell' : 'NoGui';
+
+	# Make sure the log file doesn't exist
+	my $logfile = catfile($ENV{TEMP}, 'epocwind.out');
+	unlink $logfile;
+
+	# Start the emulator	
+	die "Failed to Launch emulator for $test: $!" if system("$test -D$vis --") != 0;
+
+	# Check the log file
+	my $pass;
+	open LOG, $logfile, or die "Failed open log file $logfile: $!";
+	while(my $line = <LOG>)
+		{
+		next unless $line =~ /RTEST: /;
+
+		$line =~ s/^.*\t//;
+		chomp $line;
+
+		# Next line contains the test description
+		my $nextline = <LOG>;
+		$nextline =~ s/^.*\t//;
+		$line .= $nextline;
+
+		print "\t$line" if $verbose;
+		$pass = 1 if $line =~ /^RTEST: SUCCESS/ or $line =~ /TEST Successfully Completed/;
+		}
+	close LOG;
+	print "FAIL: $test\n" if (!$pass);
+	ok($pass);
+	}
+
+# ***
+# Builds the test code
+# *
+sub doBuild
+	{
+	# First of all see if SBSv2 is installed
+	my $sbs_ver = 1;
+	open SBS, 'sbs -v 2>&1|' or die "Failed to execute command: $!";
+	while(<SBS>)
+		{
+		if (/^sbs version/)
+			{
+			$sbs_ver = 2;
+			last;
+			}
+		}
+	close SBS;
+	
+	# Override the result using environment variable
+	$sbs_ver = 1 if $ENV{SBS_VERSION} && $ENV{SBS_VERSION} == 1;
+	my $redir = $verbose?'':' >nul 2>&1';
+
+	# Now build the test code - assumes current working directory is correct!
+	print "Building test code using SBSv$sbs_ver\n";
+	if ($sbs_ver == 1)
+		{
+		# Use the old build system
+		system("bldmake bldfiles$redir");
+		system("abld test makefile$redir");
+		system("abld test clean$redir");
+		system("abld test build$redir");
+		}
+	else
+		{
+		# Use the new build system
+		system("sbs -c tools2.test CLEAN$redir");
+		system("sbs -c tools2.test$redir");
+		system("sbs -c winscw.test CLEAN$redir");
+		system("sbs -c winscw.test$redir");
+		}
+	}
+
+=head1 NAME
+
+test.pl - A script for running tests
+
+=head1 SYNOPSIS
+
+test.pl [-help] [-version] [-verbose] [-skip]
+
+ Options:
+   -help      brief help message
+   -version   version of the script
+   -verbose   print what the scripts does
+   -skip      skip building the code
+
+=cut
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/symuser/bld.inf	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,275 @@
+// Copyright (c) 1997-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+PRJ_PLATFORMS
+TOOLS2
+
+PRJ_EXTENSIONS
+
+#ifdef TOOLS2
+start extension tools/x86tool
+
+	option TARGET_NAME symuser
+	option TARGET_TYPE lib
+
+	option MACROS __MINIMUM_MACHINE_CODE__ __CPU_HAS_CP15_THREAD_ID_REG __USERSIDE_THREAD_DATA__
+	option INCLUDES ../e32/include ../bafl/inc ../charconv/framework/inc
+
+	option SOURCE_DIRS ../e32/common ../e32/euser ../e32/euser/cbase ../e32/euser/epoc/x86 ../e32/euser/maths ../e32/euser/unicode \
+		../bafl/src ../charconv/framework/src/charconv
+
+	option SOURCE_FOLDER .
+	option SOURCE symuser.cpp exec.cpp new.cpp loader.cpp x86hlp.cia
+	option COMPILE_OPTIONS -Wno-return-type
+end
+
+start extension tools/x86tool
+
+	option TARGET_NAME symexestub
+	option TARGET_TYPE lib
+	option SOURCE exestub.cpp
+
+	option INCLUDES ../e32/include
+end
+#endif
+
+PRJ_TESTEXPORTS
+
+../e32test/buffer/UnicodeData.txt    z:/test/unicodedata.txt
+
+PRJ_TESTEXTENSIONS
+
+#ifdef TOOLS2
+start extension tools/x86tool
+	option TARGET_NAME t_bflat
+	option TARGET_TYPE exe
+	option SOURCE ../e32test/buffer/t_bflat.cpp
+	option LIBS symuser
+end
+
+start extension tools/x86tool
+	option TARGET_NAME t_bseg
+	option TARGET_TYPE exe
+	option SOURCE ../e32test/buffer/t_bseg.cpp
+	option LIBS symuser
+end
+
+start extension tools/x86tool
+	option TARGET_NAME t_buf
+	option TARGET_TYPE exe
+	option SOURCE ../e32test/buffer/t_buf.cpp
+	option LIBS symuser
+end
+
+start extension tools/x86tool
+	option TARGET_NAME t_rbuf
+	option TARGET_TYPE exe
+	option SOURCE ../e32test/buffer/t_rbuf.cpp
+	option LIBS symuser
+end
+
+start extension tools/x86tool
+	option TARGET_NAME t_char
+	option TARGET_TYPE exe
+	option SOURCE ../e32test/buffer/t_char.cpp
+	option LIBS symuser
+end
+
+start extension tools/x86tool
+	option TARGET_NAME t_circ
+	option TARGET_TYPE exe
+	option SOURCE ../e32test/buffer/t_circ.cpp
+	option LIBS symuser
+end
+
+start extension tools/x86tool
+	option TARGET_NAME t_collate
+	option TARGET_TYPE exe
+	option SOURCE ../e32test/buffer/t_collate.cpp
+	option LIBS symuser
+end
+
+start extension tools/x86tool
+	option TARGET_NAME t_des
+	option TARGET_TYPE exe
+	option SOURCE ../e32test/buffer/t_des.cpp
+	option LIBS symuser
+end
+
+start extension tools/x86tool
+	option TARGET_NAME t_farray
+	option TARGET_TYPE exe
+	option SOURCE ../e32test/buffer/t_farray.cpp
+	option LIBS symuser
+end
+
+start extension tools/x86tool
+	option TARGET_NAME t_func
+	option TARGET_TYPE exe
+	option SOURCE ../e32test/buffer/t_func.cpp
+	option LIBS symuser
+end
+
+start extension tools/x86tool
+	option TARGET_NAME t_graph
+	option TARGET_TYPE exe
+	option SOURCE ../e32test/buffer/t_graph.cpp
+	option LIBS symuser
+end
+
+start extension tools/x86tool
+	option TARGET_NAME t_key
+	option TARGET_TYPE exe
+	option SOURCE ../e32test/buffer/t_key.cpp
+	option LIBS symuser
+end
+
+start extension tools/x86tool
+	option TARGET_NAME t_lex
+	option TARGET_TYPE exe
+	option SOURCE ../e32test/buffer/t_lex.cpp
+	option LIBS symuser
+end
+
+start extension tools/x86tool
+	option TARGET_NAME t_match
+	option TARGET_TYPE exe
+	option INCLUDES ../e32/euser/unicode
+	option SOURCE ../e32test/buffer/t_match.cpp
+	option LIBS symuser symfile
+end
+
+start extension tools/x86tool
+	option TARGET_NAME t_parray
+	option TARGET_TYPE exe
+	option SOURCE ../e32test/buffer/t_parray.cpp
+	option LIBS symuser
+end
+
+start extension tools/x86tool
+	option TARGET_NAME t_que
+	option TARGET_TYPE exe
+	option SOURCE ../e32test/buffer/t_que.cpp
+	option LIBS symuser
+end
+
+start extension tools/x86tool
+	option TARGET_NAME t_readar
+	option TARGET_TYPE exe
+	option SOURCE ../e32test/buffer/t_readar.cpp
+	option LIBS symuser
+end
+
+start extension tools/x86tool
+	option TARGET_NAME t_regn
+	option TARGET_TYPE exe
+	option SOURCE ../e32test/buffer/t_regn.cpp
+	option LIBS symuser
+end
+
+start extension tools/x86tool
+	option TARGET_NAME t_sque
+	option TARGET_TYPE exe
+	option SOURCE ../e32test/buffer/t_sque.cpp
+	option LIBS symuser
+end
+
+start extension tools/x86tool
+	option TARGET_NAME t_varray
+	option TARGET_TYPE exe
+	option SOURCE ../e32test/buffer/t_varray.cpp
+	option LIBS symuser
+end
+
+start extension tools/x86tool
+	option TARGET_NAME t_versio
+	option TARGET_TYPE exe
+	option SOURCE ../e32test/buffer/t_versio.cpp
+	option LIBS symuser
+end
+
+start extension tools/x86tool
+	option TARGET_NAME t_hashtab
+	option TARGET_TYPE exe
+	option SOURCE ../e32test/buffer/t_hashtab.cpp
+	option LIBS symuser
+end
+
+start extension tools/x86tool
+	option TARGET_NAME T_FoldPerf
+	option TARGET_TYPE exe
+	option SOURCE ../e32test/buffer/T_FoldPerf.cpp
+	option LIBS symuser
+end
+
+start extension tools/x86tool
+	option TARGET_NAME t_huff
+	option TARGET_TYPE exe
+	option SOURCE ../e32test/buffer/t_huff.cpp
+	option LIBS symuser
+end
+
+start extension tools/x86tool
+	option TARGET_NAME t_float
+	option TARGET_TYPE exe
+	option SOURCE ../e32test/math/t_float.cpp ../e32test/math/t_float1.cpp ../e32test/math/t_float2.cpp ../e32test/math/t_float3.cpp ../e32test/math/t_fltcl.cpp
+	option LIBS symuser
+end
+
+start extension tools/x86tool
+	option TARGET_NAME t_i64
+	option TARGET_TYPE exe
+	option SOURCE ../e32test/math/t_i64.cpp
+	option LIBS symuser
+end
+
+start extension tools/x86tool
+	option TARGET_NAME t_i64_2
+	option TARGET_TYPE exe
+	option SOURCE ../e32test/math/t_i64_2.cpp ../e32test/math/largeint.cpp
+	option LIBS symuser
+end
+
+
+start extension tools/x86tool
+	option TARGET_NAME t_math
+	option TARGET_TYPE exe
+	option SOURCE ../e32test/math/t_math.cpp
+	option LIBS symuser
+end
+
+
+start extension tools/x86tool
+	option TARGET_NAME t_math2
+	option TARGET_TYPE exe
+	option SOURCE ../e32test/math/t_math2.cpp
+	option LIBS symuser
+end
+
+start extension tools/x86tool
+	option TARGET_NAME t_trap
+	option TARGET_TYPE exe
+	option SOURCE ../e32test/system/t_trap.cpp
+	option LIBS symuser
+end
+
+start extension tools/x86tool
+	option TARGET_NAME t_ctrap
+	option TARGET_TYPE exe
+	option SOURCE ../e32test/system/t_ctrap.cpp
+	option LIBS symuser
+end
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/symuser/exec.cpp	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,151 @@
+// Copyright (c) 1999-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <time.h>
+#include <string.h>
+
+#ifndef _WIN32
+#include <unistd.h>
+#else
+#include <windows.h>
+#endif
+
+#include "e32base.h"
+
+extern int gArgc;
+extern char **gArgv;
+
+// The exec class implements low level functionality needed by the TOOLS2 port
+// These are normally kernel executive calls
+class Exec
+	{
+	static TInt TimeNow(TInt64&, TInt&);
+	static TInt TimeNowSecure(TInt64&, TInt&);
+	static void DebugPrint(TAny* aPtr, TInt);
+	static TUint32 MathRandom();
+	static void ProcessCommandLine(TInt, TDes8&);
+	static TInt ProcessCommandLineLength(TInt);
+	static TUint TickCount();
+	static TUint32 NTickCount();
+	static void After(TInt, TRequestStatus&);
+	static void AfterHighRes(TInt, TRequestStatus&);
+	};
+
+// ***
+// after
+//
+
+void Exec::After(TInt aInterval, TRequestStatus&)
+	{
+#ifdef _WIN32
+	Sleep(aInterval/1000);
+#else
+	sleep(aInterval/1000000);
+#endif
+	}
+
+void Exec::AfterHighRes(TInt aInterval, TRequestStatus&)
+	{
+#ifdef _WIN32
+	Sleep(aInterval/1000);
+#else
+	sleep(aInterval/1000000);
+#endif
+	}
+
+// ***
+// tick
+//
+TUint Exec::TickCount()
+	{
+	return (TUint)clock();
+	}
+
+TUint32 Exec::NTickCount()
+	{
+	return (TUint32)clock();
+	}
+
+// ***
+// command line
+//
+void Exec::ProcessCommandLine(TInt, TDes8& aCmd)
+	{
+	TPtr16 aCommand16((TUint16*)aCmd.Ptr(),aCmd.MaxLength()>>1);
+	for(TInt i = 1; i < gArgc; i++)
+		{
+		if (i > 0)
+			aCommand16.Append(' ');
+
+		for(TUint s = 0; s < strlen(gArgv[i]); s++)
+			{
+			aCommand16.Append(gArgv[i][s]);
+			}
+		}
+	aCmd.SetLength(aCommand16.Length()<<1);
+	}
+
+TInt Exec::ProcessCommandLineLength(TInt)
+	{
+	TInt len = 0;
+	for(TInt i = 1; i < gArgc; i++)
+		{
+		if (i > 0)
+			len++;
+		len += strlen(gArgv[i]);
+		}
+	return len;
+	}
+
+// ***
+// debug
+//
+void Exec::DebugPrint(TAny* aPtr, TInt)
+	{
+	TPtr8* p = (TPtr8*)aPtr;
+	for(TInt i = 0; i < p->Length(); i++)
+		putchar((*p)[i]);
+
+	}
+
+// ***
+// rand
+//
+TUint32 Exec::MathRandom()
+	{
+	return rand();
+	}
+
+// ***
+// time
+//
+TInt Exec::TimeNow(TInt64& aUniversalTime, TInt& aUniversalTimeOffset)
+	{
+	aUniversalTimeOffset = 0;
+
+	time_t t = time(NULL);
+    struct tm *tm = gmtime(&t);
+    TTime tt = TDateTime(1900 + tm->tm_year, TMonth(tm->tm_mon), tm->tm_mday - 1, tm->tm_hour, tm->tm_min, tm->tm_sec, 0);
+    aUniversalTime = tt.Int64();
+
+    return KErrNone;
+	}
+
+TInt Exec::TimeNowSecure(TInt64& aUniversalTime, TInt& aUniversalTimeOffset)
+	{
+	return Exec::TimeNow(aUniversalTime, aUniversalTimeOffset);
+	}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/symuser/exec_enum.h	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,303 @@
+// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+/**
+ @file
+ @internalComponent
+*/
+
+
+enum TFastExecDispatch
+	{
+	EFastExecWaitForAnyRequest = 0,
+	EFastExecHeap = 1,
+	EFastExecHeapSwitch = 2,
+	EFastExecPushTrapFrame = 3,
+	EFastExecPopTrapFrame = 4,
+	EFastExecActiveScheduler = 5,
+	EFastExecSetActiveScheduler = 6,
+	EFastExecLockPeriod = 7,
+	EFastExecTrapHandler = 8,
+	EFastExecSetTrapHandler = 9,
+	EFastExecLockedInc = 10,
+	EFastExecLockedDec = 11,
+	EFastExecDebugMask = 12,
+	EFastExecDebugMaskIndex = 13,
+	EFastExecSetDebugMask = 14,
+	EFastExecFastCounter = 15,
+	EFastExecNTickCount = 16,
+	EFastExecLockRamDrive = 17,
+	EFastExecUnlockRamDrive = 18,
+	EFastExecRomHeaderAddress = 19,
+	EFastExecRomRootDirectoryAddress = 20,
+	EFastExecSafeInc = 21,
+	EFastExecSafeDec = 22,
+	EFastExecSetReentryPoint = 23,
+	EFastExecKernelConfigFlags = 24,
+	EFastExecUTCOffset = 25,
+	EFastExecGetGlobalUserData = 26,
+	EFastExecCheckFilter = 27,
+	};
+
+enum TExecDispatch
+	{
+	EExecObjectNext = 0,
+	EExecChunkBase = 1,
+	EExecChunkSize = 2,
+	EExecChunkMaxSize = 3,
+	EExecHandleAttributes = 4,
+	EExecTickCount = 5,
+	EExecLogicalDeviceGetCaps = 6,
+	EExecLogicalDeviceQueryVersionSupported = 7,
+	EExecLogicalDeviceIsAvailable = 8,
+	EExecLocaleExports = 9,
+	EExecChannelRequest = 10,
+	EExecMathRandom = 11,
+	EExecIMBRange = 12,
+	EExecResetMachine = 13,
+	EExecLibraryLookup = 14,
+	EExecLibraryFileName = 15,
+	EExecExecuteInSupervisorMode = 16,
+	EExecMutexWait = 17,
+	EExecMutexSignal = 18,
+	EExecProcessId = 19,
+	EExecDllFileName = 20,
+	EExecProcessResume = 21,
+	EExecProcessFileName = 22,
+	EExecProcessCommandLine = 23,
+	EExecProcessExitType = 24,
+	EExecProcessExitReason = 25,
+	EExecProcessExitCategory = 26,
+	EExecProcessPriority = 27,
+	EExecProcessSetPriority = 28,
+	EExecProcessFlags = 29,
+	EExecProcessSetFlags = 30,
+	EExecSemaphoreWait = 31,
+	EExecSemaphoreSignal1 = 32,
+	EExecSemaphoreSignalN = 33,
+	EExecServerReceive = 34,
+	EExecServerCancel = 35,
+	EExecSetSessionPtr = 36,
+	EExecSessionSend = 37,
+	EExecThreadId = 38,
+	EExecSessionShare = 39,
+	EExecThreadResume = 40,
+	EExecThreadSuspend = 41,
+	EExecThreadPriority = 42,
+	EExecThreadSetPriority = 43,
+	EExecThreadProcessPriority = 44,
+	EExecThreadSetProcessPriority = 45,
+	EExecThreadFlags = 46,
+	EExecThreadSetFlags = 47,
+	EExecThreadRequestCount = 48,
+	EExecThreadExitType = 49,
+	EExecThreadExitReason = 50,
+	EExecThreadExitCategory = 51,
+	EExecTimerCancel = 52,
+	EExecTimerAfter = 53,
+	EExecTimerAt = 54,
+	EExecTimerLock = 55,
+	EExecChangeNotifierLogon = 56,
+	EExecChangeNotifierLogoff = 57,
+	EExecRequestSignal = 58,
+	EExecHandleName = 59,
+	EExecHandleFullName = 60,
+	EExecHandleInfo = 61,
+	EExecHandleCount = 62,
+	EExecAfter = 63,
+	EExecAt = 64,
+	EExecMessageComplete = 65,
+	EExecMessageCompleteWithHandle = 66,
+	EExecTimeNow = 67,
+	EExecTimeNowSecure = 68,
+	EExecSetUTCTimeAndOffset = 69,
+	EExecSetMachineConfiguration = 70,
+	EExecCaptureEventHook = 71,
+	EExecReleaseEventHook = 72,
+	EExecRequestEvent = 73,
+	EExecRequestEventCancel = 74,
+	EExecAddEvent = 75,
+	EExecSessionSendSync = 76,
+	EExecDllTls = 77,
+	EExecHalFunction = 78,
+	EExecWsRegisterThread = 79,
+	EExecFsRegisterThread = 80,
+	EExecProcessCommandLineLength = 81,
+	EExecTimerInactivity = 82,
+	EExecUserInactivityTime = 83,
+	EExecResetInactivityTime = 84,
+	EExecDebugPrint = 85,
+	EExecBreakPoint = 86,
+	EExecProfileStart = 87,
+	EExecProfileEnd = 88,
+	EExecExceptionHandler = 89,
+	EExecSetExceptionHandler = 90,
+	EExecModifyExceptionMask = 91,
+	EExecRaiseException = 92,
+	EExecIsExceptionHandled = 93,
+	EExecProcessGetMemoryInfo = 94,
+	EExecLibraryGetMemoryInfo = 95,
+	EExecMachineConfiguration = 96,
+	EExecSetMemoryThresholds = 97,
+	EExecLibraryType = 98,
+	EExecProcessType = 99,
+	EExecChunkBottom = 100,
+	EExecChunkTop = 101,
+	EExecThreadContext = 102,
+	EExecThreadCreate = 103,
+	EExecFindHandleOpen = 104,
+	EExecHandleClose = 105,
+	EExecChunkCreate = 106,
+	EExecChunkAdjust = 107,
+	EExecOpenObject = 108,
+	EExecHandleDuplicate = 109,
+	EExecMutexCreate = 110,
+	EExecSemaphoreCreate = 111,
+	EExecThreadOpenById = 112,
+	EExecProcessOpenById = 113,
+	EExecThreadKill = 114,
+	EExecThreadLogon = 115,
+	EExecThreadLogonCancel = 116,
+	EExecDllSetTls = 117,
+	EExecDllFreeTls = 118,
+	EExecThreadRename = 119,
+	EExecProcessRename = 120,
+	EExecProcessKill = 121,
+	EExecProcessLogon = 122,
+	EExecProcessLogonCancel = 123,
+	EExecThreadProcess = 124,
+	EExecServerCreate = 125,
+	EExecSessionCreate = 126,
+	EExecSessionCreateFromHandle = 127,
+	EExecDeviceLoad = 128,
+	EExecDeviceFree = 129,
+	EExecChannelCreate = 130,
+	EExecTimerCreate = 131,
+	EExecTimerHighRes = 132,
+	EExecAfterHighRes = 133,
+	EExecChangeNotifierCreate = 134,
+	EExecUndertakerCreate = 135,
+	EExecUndertakerLogon = 136,
+	EExecUndertakerLogonCancel = 137,
+	EExecKernelHeapDebug = 138,
+	EExecThreadGetCpuTime = 139,
+	EExecCodeSegCreate = 140,
+	EExecCodeSegLoaded = 141,
+	EExecLibraryCreate = 142,
+	EExecCodeSegOpen = 143,
+	EExecCodeSegClose = 144,
+	EExecCodeSegNext = 145,
+	EExecCodeSegInfo = 146,
+	EExecCodeSegAddDependency = 147,
+	EExecCodeSegDeferDeletes = 148,
+	EExecCodeSegEndDeferDeletes = 149,
+	EExecProcessCreate = 150,
+	EExecProcessLoaded = 151,
+	EExecCheckLoaderClientState = 152,
+	EExecThreadProcessCodeSeg = 153,
+	EExecCodeSegReadExportDir = 154,
+	EExecWaitDllLock = 155,
+	EExecReleaseDllLock = 156,
+	EExecLibraryAttach = 157,
+	EExecLibraryAttached = 158,
+	EExecStaticCallList = 159,
+	EExecLibraryDetach = 160,
+	EExecLibraryDetached = 161,
+	EExecLastThreadHandle = 162,
+	EExecThreadRendezvous = 163,
+	EExecProcessRendezvous = 164,
+	EExecMessageGetDesLength = 165,
+	EExecMessageGetDesMaxLength = 166,
+	EExecMessageIpcCopy = 167,
+	EExecMessageClient = 168,
+	EExecMessageSetProcessPriority = 169,
+	EExecMessageConstructFromPtr = 170,
+	EExecMessageKill = 171,
+	EExecMessageOpenObject = 172,
+	EExecProcessSecurityInfo = 173,
+	EExecThreadSecurityInfo = 174,
+	EExecMessageSecurityInfo = 175,
+	EExecCreatorSecurityInfo = 176,
+	EExecDisabledCapabilities = 177,
+	EExecChunkSetRestrictions = 178,
+	EExecMsgQueueCreate = 179,
+	EExecMsgQueueSend = 180,
+	EExecMsgQueueReceive = 181,
+	EExecMsgQueueNotifySpaceAvailable = 182,
+	EExecMsgQueueCancelSpaceAvailable = 183,
+	EExecMsgQueueNotifyDataAvailable = 184,
+	EExecMsgQueueCancelDataAvailable = 185,
+	EExecMsgQueueSize = 186,
+	EExecPropertyDefine = 187,
+	EExecPropertyDelete = 188,
+	EExecPropertyAttach = 189,
+	EExecPropertySubscribe = 190,
+	EExecPropertyCancel = 191,
+	EExecPropertyGetI = 192,
+	EExecPropertyGetB = 193,
+	EExecPropertySetI = 194,
+	EExecPropertySetB = 195,
+	EExecPropertyFindGetI = 196,
+	EExecPropertyFindGetB = 197,
+	EExecPropertyFindSetI = 198,
+	EExecPropertyFindSetB = 199,
+	EExecPowerEnableWakeupEvents = 200,
+	EExecPowerDisableWakeupEvents = 201,
+	EExecPowerRequestWakeupEventNotification = 202,
+	EExecPowerCancelWakeupEventNotification = 203,
+	EExecPowerDown = 204,
+	EExecProcessSetHandleParameter = 205,
+	EExecProcessSetDataParameter = 206,
+	EExecProcessGetHandleParameter = 207,
+	EExecProcessGetDataParameter = 208,
+	EExecProcessDataParameterLength = 209,
+	EExecMessageClientProcessFlags = 210,
+	EExecThreadStackInfo = 211,
+	EExecThreadGetHeap = 212,
+	EExecThreadAsProcess = 213,
+	EExecCondVarCreate = 214,
+	EExecCondVarWait = 215,
+	EExecCondVarSignal = 216,
+	EExecCondVarBroadcast = 217,
+	EExecPlatSecDiagnostic = 218,
+	EExecExceptionDescriptor = 219,
+	EExecThreadRequestSignal = 220,
+	EExecMutexIsHeld = 221,
+	EExecLeaveStart = 222,
+	EExecLeaveEnd = 223,
+	EExecSetDebugMaskIndex = 224,
+	EExecGetModuleNameFromAddress = 225,
+	EExecNotifyChanges = 226,
+	EExecSetGlobalUserData = 227,
+	EExecSessionSecurityInfo = 228,
+	EExecMessageClientStatus = 229,
+	EExecSetFloatingPointMode = 230,
+	EExecBTraceOut = 231,
+	EExecBTraceOutBig = 232,
+	EExecCheckFilter2 = 233,
+	EExecProcessExeExportData = 234,
+	EExecNotifyIfCodeSegDestroyed = 235,
+	EExecGetDestroyedCodeSegInfo = 236,
+	EExecSetWin32RuntimeHook = 237,
+	EExecGetBTraceId = 238,
+	EExecNotifyOnIdle = 239,
+	EExecCancelMiscNotifier = 240,
+	EExecNotifyObjectDestruction = 241,
+	EExecRegisterTrustedChunk = 242,
+	EExecUserThreadExiting = 243,
+	EExecKernMsgTest = 244,
+	EExecGetLatencyValues = 245,
+	EExecCalcKernelHeapUsed = 246,
+	};
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/symuser/exec_user.h	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,1601 @@
+// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+/**
+ @file
+ @internalComponent
+*/
+
+class Exec
+	{
+public:
+	static void WaitForAnyRequest();
+	static RAllocator* Heap();
+	static RAllocator* HeapSwitch(RAllocator*);
+	static TTrapHandler* PushTrapFrame(TTrap*);
+	static TTrap* PopTrapFrame();
+	static CActiveScheduler* ActiveScheduler();
+	static void SetActiveScheduler(CActiveScheduler*);
+	static TTimerLockSpec LockPeriod();
+	static TTrapHandler* TrapHandler();
+	static TTrapHandler* SetTrapHandler(TTrapHandler*);
+	static TInt LockedInc(TInt&);
+	static TInt LockedDec(TInt&);
+	static TUint32 DebugMask();
+	static TUint32 DebugMaskIndex(TUint);
+	static void SetDebugMask(TUint32);
+	static TUint32 FastCounter();
+	static TUint32 NTickCount();
+	static TInt SafeInc(TInt&);
+	static TInt SafeDec(TInt&);
+	static void SetReentryPoint(TLinAddr);
+	static TUint32 KernelConfigFlags();
+	static TInt UTCOffset();
+	static TInt GetGlobalUserData(TInt);
+	static TInt ObjectNext(TObjectType, TBuf8<KMaxFullName>&, TFindHandle&);
+	static TUint8* ChunkBase(TInt);
+	static TInt ChunkSize(TInt);
+	static TInt ChunkMaxSize(TInt);
+	static TUint HandleAttributes(TInt);
+	static TUint TickCount();
+	static void LogicalDeviceGetCaps(TInt, TDes8&);
+	static TBool LogicalDeviceQueryVersionSupported(TInt, const TVersion&);
+	static TBool LogicalDeviceIsAvailable(TInt, TInt, const TDesC8*, const TDesC8*);
+	static TInt ChannelRequest(TInt, TInt, TAny*, TAny*);
+	static TUint32 MathRandom();
+	static void IMB_Range(TAny*, TUint);
+	static TInt ResetMachine(TMachineStartupType);
+	static TLibraryFunction LibraryLookup(TInt, TInt);
+	static void LibraryFileName(TInt, TDes8&);
+	static void MutexWait(TInt);
+	static void MutexSignal(TInt);
+	static TInt ProcessId(TInt);
+	static void DllFileName(TInt, TDes8&);
+	static void ProcessResume(TInt);
+	static void ProcessFileName(TInt, TDes8&);
+	static void ProcessCommandLine(TInt, TDes8&);
+	static TExitType ProcessExitType(TInt);
+	static TInt ProcessExitReason(TInt);
+	static void ProcessExitCategory(TInt, TDes8&);
+	static TProcessPriority ProcessPriority(TInt);
+	static void ProcessSetPriority(TInt, TProcessPriority);
+	static TUint ProcessFlags(TInt);
+	static void ProcessSetFlags(TInt, TUint, TUint);
+	static TInt SemaphoreWait(TInt, TInt);
+	static void SemaphoreSignal1(TInt);
+	static void SemaphoreSignalN(TInt, TInt);
+	static void ServerReceive(TInt, TRequestStatus&, TAny*);
+	static void ServerCancel(TInt);
+	static void SetSessionPtr(TInt, const TAny*);
+	static TInt SessionSend(TInt, TInt, TAny*, TRequestStatus*);
+	static TInt ThreadId(TInt);
+	static TInt SessionShare(TInt&, TInt);
+	static void ThreadResume(TInt);
+	static void ThreadSuspend(TInt);
+	static TThreadPriority ThreadPriority(TInt);
+	static void ThreadSetPriority(TInt, TThreadPriority);
+	static TProcessPriority ThreadProcessPriority(TInt);
+	static void ThreadSetProcessPriority(TInt, TProcessPriority);
+	static TUint ThreadFlags(TInt);
+	static void ThreadSetFlags(TInt, TUint, TUint);
+	static TInt ThreadRequestCount(TInt);
+	static TExitType ThreadExitType(TInt);
+	static TInt ThreadExitReason(TInt);
+	static void ThreadExitCategory(TInt, TDes8&);
+	static void TimerCancel(TInt);
+	static void TimerAfter(TInt, TRequestStatus&, TInt);
+	static void TimerAt(TInt, TRequestStatus&, const EXEC_TIME&);
+	static void TimerLock(TInt, TRequestStatus&, TTimerLockSpec);
+	static TInt ChangeNotifierLogon(TInt, TRequestStatus&);
+	static TInt ChangeNotifierLogoff(TInt);
+	static void RequestSignal(TInt);
+	static void HandleName(TInt, TDes8&);
+	static void HandleFullName(TInt, TDes8&);
+	static void HandleInfo(TInt, THandleInfo*);
+	static void HandleCount(TInt, TInt&, TInt&);
+	static void After(TInt, TRequestStatus&);
+	static void At(const EXEC_TIME&, TRequestStatus&);
+	static void MessageComplete(TInt, TInt);
+	static void MessageCompleteWithHandle(TInt, TInt);
+	static TInt TimeNow(EXEC_TIME&, TInt&);
+	static TInt TimeNowSecure(EXEC_TIME&, TInt&);
+	static TInt SetUTCTimeAndOffset(const EXEC_TIME&, TInt, TUint, TUint);
+	static TInt SetMachineConfiguration(const TDesC8&);
+	static void CaptureEventHook();
+	static void ReleaseEventHook();
+	static void RequestEvent(TRawEventBuf&, TRequestStatus&);
+	static void RequestEventCancel();
+	static TInt AddEvent(const TRawEvent&);
+	static TInt SessionSendSync(TInt, TInt, TAny*, TRequestStatus*);
+	static TAny* DllTls(TInt, TInt);
+	static TInt HalFunction(TInt, TInt, TAny*, TAny*);
+	static void WsRegisterThread();
+	static void FsRegisterThread();
+	static TInt ProcessCommandLineLength(TInt);
+	static void TimerInactivity(TInt, TRequestStatus&, TInt);
+	static TInt UserInactivityTime();
+	static void ResetInactivityTime();
+	static void DebugPrint(TAny*, TInt);
+	static TInt BreakPoint();
+	static TInt ProfileStart(TInt);
+	static TInt ProfileEnd(TInt);
+	static TExceptionHandler ExceptionHandler(TInt);
+	static TInt SetExceptionHandler(TInt, TExceptionHandler, TUint32);
+	static void ModifyExceptionMask(TInt, TUint32, TUint32);
+	static TInt RaiseException(TInt, TExcType);
+	static TInt IsExceptionHandled(TInt, TExcType, TBool);
+	static TInt ProcessGetMemoryInfo(TInt, TModuleMemoryInfo&);
+	static TInt LibraryGetMemoryInfo(TInt, TModuleMemoryInfo&);
+	static TInt MachineConfiguration(TDes8&, TInt&);
+	static TInt SetMemoryThresholds(TInt, TInt);
+	static void LibraryType(TInt, TUidType&);
+	static void ProcessType(TInt, TUidType&);
+	static TInt ChunkBottom(TInt);
+	static TInt ChunkTop(TInt);
+	static void ThreadContext(TInt, TDes8&);
+	static TInt ThreadCreate(const TDesC8&, TOwnerType, SThreadCreateInfo8&);
+	static TInt FindHandleOpen(TOwnerType, const TFindHandle&);
+	static TInt HandleClose(TInt);
+	static TInt ChunkCreate(TOwnerType, const TDesC8*, TChunkCreate&);
+	static TInt ChunkAdjust(TInt, TInt, TInt, TInt);
+	static TInt OpenObject(TObjectType, const TDesC8&, TOwnerType);
+	static TInt HandleDuplicate(TInt, TOwnerType, TInt);
+	static TInt MutexCreate(const TDesC8*, TOwnerType);
+	static TInt SemaphoreCreate(const TDesC8*, TInt, TOwnerType);
+	static TInt ThreadOpenById(TUint, TOwnerType);
+	static TInt ProcessOpenById(TUint, TOwnerType);
+	static void ThreadKill(TInt, TExitType, TInt, const TDesC8*);
+	static void ThreadLogon(TInt, TRequestStatus*, TBool);
+	static TInt ThreadLogonCancel(TInt, TRequestStatus*, TBool);
+	static TInt DllSetTls(TInt, TInt, TAny*);
+	static void DllFreeTls(TInt);
+	static TInt ThreadRename(TInt, const TDesC8&);
+	static TInt ProcessRename(TInt, const TDesC8&);
+	static void ProcessKill(TInt, TExitType, TInt, const TDesC8*);
+	static void ProcessLogon(TInt, TRequestStatus*, TBool);
+	static TInt ProcessLogonCancel(TInt, TRequestStatus*, TBool);
+	static TInt ThreadProcess(TInt);
+	static TInt ServerCreate(const TDesC8*, TInt);
+	static TInt SessionCreate(const TDesC8&, TInt, const TSecurityPolicy*, TInt);
+	static TInt SessionCreateFromHandle(TInt, TInt, const TSecurityPolicy*, TInt);
+	static TInt DeviceFree(const TDesC8&, TInt);
+	static TInt ChannelCreate(const TDesC8&, TChannelCreateInfo8&, TInt);
+	static TInt TimerCreate();
+	static void TimerHighRes(TInt, TRequestStatus&, TInt);
+	static void AfterHighRes(TInt, TRequestStatus&);
+	static TInt ChangeNotifierCreate(TOwnerType);
+	static TInt UndertakerCreate(TOwnerType);
+	static TInt UndertakerLogon(TInt, TRequestStatus&, TInt&);
+	static TInt UndertakerLogonCancel(TInt);
+	static void KernelHeapDebug(TInt, TInt, TAny*);
+	static TInt ThreadGetCpuTime(TInt, EXEC_INT64&);
+	static TInt LastThreadHandle();
+	static void ThreadRendezvous(TInt);
+	static void ProcessRendezvous(TInt);
+	static TInt MessageGetDesLength(TInt, TInt);
+	static TInt MessageGetDesMaxLength(TInt, TInt);
+	static TInt MessageIpcCopy(TInt, TInt, SIpcCopyInfo&, TInt);
+	static TInt MessageClient(TInt, TOwnerType);
+	static TInt MessageSetProcessPriority(TInt, TProcessPriority);
+	static void MessageConstructFromPtr(TInt, TAny*);
+	static void MessageKill(TInt, TExitType, TInt, const TDesC8*);
+	static TInt MessageOpenObject(TInt, TObjectType, TInt, TOwnerType);
+	static void ProcessSecurityInfo(TInt, SSecurityInfo&);
+	static void ThreadSecurityInfo(TInt, SSecurityInfo&);
+	static void MessageSecurityInfo(TInt, SSecurityInfo&);
+	static void CreatorSecurityInfo(SSecurityInfo&);
+	static void DisabledCapabilities(SCapabilitySet&);
+	static TInt ChunkSetRestrictions(TInt, TUint);
+	static TInt MsgQueueCreate(const TDesC8*, TInt, TInt, TOwnerType);
+	static TInt MsgQueueSend(TInt, const TAny*, TInt);
+	static TInt MsgQueueReceive(TInt, TAny*, TInt);
+	static void MsgQueueNotifySpaceAvailable(TInt, TRequestStatus&);
+	static void MsgQueueCancelSpaceAvailable(TInt);
+	static void MsgQueueNotifyDataAvailable(TInt, TRequestStatus&);
+	static void MsgQueueCancelDataAvailable(TInt);
+	static TInt MsgQueueSize(TInt);
+	static TInt PropertyDefine(TUint, TUint, TPropertyInfo*);
+	static TInt PropertyDelete(TUint, TUint);
+	static TInt PropertyAttach(TUint, TUint, TOwnerType);
+	static void PropertySubscribe(TInt, TRequestStatus*);
+	static void PropertyCancel(TInt);
+	static TInt PropertyGetI(TInt, TInt*);
+	static TInt PropertyGetB(TInt, TUint8*, TInt);
+	static TInt PropertySetI(TInt, TInt);
+	static TInt PropertySetB(TInt, const TUint8*, TInt);
+	static TInt PropertyFindGetI(TUint, TUint, TInt*);
+	static TInt PropertyFindGetB(TUint, TUint, TUint8*, TInt);
+	static TInt PropertyFindSetI(TUint, TUint, TInt);
+	static TInt PropertyFindSetB(TUint, TUint, TUint8*, TInt);
+	static TInt PowerEnableWakeupEvents(TPowerState);
+	static void PowerDisableWakeupEvents();
+	static void PowerRequestWakeupEventNotification(TRequestStatus*);
+	static void PowerCancelWakeupEventNotification();
+	static TInt PowerDown();
+	static TInt ProcessSetHandleParameter(TInt, TInt, TInt);
+	static TInt ProcessSetDataParameter(TInt, TInt, const TUint8*, TInt);
+	static TInt ProcessGetHandleParameter(TInt, TObjectType, TOwnerType);
+	static TInt ProcessGetDataParameter(TInt, TUint8*, TInt);
+	static TInt ProcessDataParameterLength(TInt);
+	static TUint MessageClientProcessFlags(TInt);
+	static TInt ThreadStackInfo(TInt, TThreadStackInfo&);
+	static RAllocator* ThreadGetHeap(TInt);
+	static TInt ThreadAsProcess(TInt, TInt);
+	static TInt CondVarCreate(const TDesC8*, TOwnerType);
+	static TInt CondVarWait(TInt, TInt, TInt);
+	static void CondVarSignal(TInt);
+	static void CondVarBroadcast(TInt);
+	static TInt PlatSecDiagnostic(TPlatSecDiagnostic*);
+	static TLinAddr ExceptionDescriptor(TLinAddr);
+	static void ThreadRequestSignal(TInt);
+	static TBool MutexIsHeld(TInt);
+	static TTrapHandler* LeaveStart();
+	static void LeaveEnd();
+	static void SetDebugMaskIndex(TUint32, TUint);
+	static TInt GetModuleNameFromAddress(TAny*, TDes8&);
+	static void NotifyChanges(TUint);
+	static TInt SetGlobalUserData(TInt, TInt);
+	static TInt SessionSecurityInfo(TInt, SSecurityInfo&);
+	static const TRequestStatus* MessageClientStatus(TInt);
+	static TInt SetFloatingPointMode(TFloatingPointMode, TFloatingPointRoundingMode);
+	static TBool BTraceOut(TUint32, TUint32, const BTrace::SExecExtension&, TInt);
+	static TBool BTraceOutBig(TUint32, TUint32, const BTrace::SExecExtension&, TInt);
+	static TAny* ProcessExeExportData();
+	IMPORT_C static TInt SetWin32RuntimeHook(TAny*);
+	static TInt GetBTraceId(TInt);
+	static void NotifyOnIdle(TRequestStatus*);
+	static void CancelMiscNotifier(TRequestStatus*);
+	static void NotifyObjectDestruction(TInt, TRequestStatus*);
+	static void RegisterTrustedChunk(TInt);
+	static TBool UserThreadExiting(TInt);
+	};
+
+#ifdef __GEN_USER_EXEC_CODE__
+__EXECDECL__ void Exec::WaitForAnyRequest()
+	{
+	FAST_EXEC0(EFastExecWaitForAnyRequest);
+	}
+
+__EXECDECL__ RAllocator* Exec::Heap()
+	{
+	FAST_EXEC0(EFastExecHeap);
+	}
+
+__EXECDECL__ RAllocator* Exec::HeapSwitch(RAllocator*)
+	{
+	FAST_EXEC1(EFastExecHeapSwitch);
+	}
+
+__EXECDECL__ TTrapHandler* Exec::PushTrapFrame(TTrap*)
+	{
+	FAST_EXEC1(EFastExecPushTrapFrame);
+	}
+
+__EXECDECL__ TTrap* Exec::PopTrapFrame()
+	{
+	FAST_EXEC0(EFastExecPopTrapFrame);
+	}
+
+__EXECDECL__ CActiveScheduler* Exec::ActiveScheduler()
+	{
+	FAST_EXEC0(EFastExecActiveScheduler);
+	}
+
+__EXECDECL__ void Exec::SetActiveScheduler(CActiveScheduler*)
+	{
+	FAST_EXEC1(EFastExecSetActiveScheduler);
+	}
+
+__EXECDECL__ TTimerLockSpec Exec::LockPeriod()
+	{
+	FAST_EXEC0(EFastExecLockPeriod);
+	}
+
+__EXECDECL__ TTrapHandler* Exec::TrapHandler()
+	{
+	FAST_EXEC0(EFastExecTrapHandler);
+	}
+
+__EXECDECL__ TTrapHandler* Exec::SetTrapHandler(TTrapHandler*)
+	{
+	FAST_EXEC1(EFastExecSetTrapHandler);
+	}
+
+__EXECDECL__ TInt Exec::LockedInc(TInt&)
+	{
+	FAST_EXEC1(EFastExecLockedInc);
+	}
+
+__EXECDECL__ TInt Exec::LockedDec(TInt&)
+	{
+	FAST_EXEC1(EFastExecLockedDec);
+	}
+
+__EXECDECL__ TUint32 Exec::DebugMask()
+	{
+	FAST_EXEC0(EFastExecDebugMask);
+	}
+
+__EXECDECL__ TUint32 Exec::DebugMaskIndex(TUint)
+	{
+	FAST_EXEC1(EFastExecDebugMaskIndex);
+	}
+
+__EXECDECL__ void Exec::SetDebugMask(TUint32)
+	{
+	FAST_EXEC1(EFastExecSetDebugMask);
+	}
+
+__EXECDECL__ TUint32 Exec::FastCounter()
+	{
+	FAST_EXEC0(EFastExecFastCounter);
+	}
+
+__EXECDECL__ TUint32 Exec::NTickCount()
+	{
+	FAST_EXEC0(EFastExecNTickCount);
+	}
+
+EXPORT_C __EXECDECL__ void UserSvr::LockRamDrive()
+	{
+	FAST_EXEC0(EFastExecLockRamDrive);
+	}
+
+EXPORT_C __EXECDECL__ void UserSvr::UnlockRamDrive()
+	{
+	FAST_EXEC0(EFastExecUnlockRamDrive);
+	}
+
+EXPORT_C __EXECDECL__ TLinAddr UserSvr::RomHeaderAddress()
+	{
+	FAST_EXEC0(EFastExecRomHeaderAddress);
+	}
+
+EXPORT_C __EXECDECL__ TLinAddr UserSvr::RomRootDirectoryAddress()
+	{
+	FAST_EXEC0(EFastExecRomRootDirectoryAddress);
+	}
+
+__EXECDECL__ TInt Exec::SafeInc(TInt&)
+	{
+	FAST_EXEC1(EFastExecSafeInc);
+	}
+
+__EXECDECL__ TInt Exec::SafeDec(TInt&)
+	{
+	FAST_EXEC1(EFastExecSafeDec);
+	}
+
+__EXECDECL__ void Exec::SetReentryPoint(TLinAddr)
+	{
+	FAST_EXEC1(EFastExecSetReentryPoint);
+	}
+
+__EXECDECL__ TUint32 Exec::KernelConfigFlags()
+	{
+	FAST_EXEC0(EFastExecKernelConfigFlags);
+	}
+
+__EXECDECL__ TInt Exec::UTCOffset()
+	{
+	FAST_EXEC0(EFastExecUTCOffset);
+	}
+
+__EXECDECL__ TInt Exec::GetGlobalUserData(TInt)
+	{
+	FAST_EXEC1(EFastExecGetGlobalUserData);
+	}
+
+EXPORT_C __EXECDECL__ TBool BTrace::CheckFilter(TUint32)
+	{
+	FAST_EXEC1(EFastExecCheckFilter);
+	}
+
+__EXECDECL__ TInt Exec::ObjectNext(TObjectType, TBuf8<KMaxFullName>&, TFindHandle&)
+	{
+	SLOW_EXEC3(EExecObjectNext);
+	}
+
+__EXECDECL__ TUint8* Exec::ChunkBase(TInt)
+	{
+	SLOW_EXEC1(EExecChunkBase);
+	}
+
+__EXECDECL__ TInt Exec::ChunkSize(TInt)
+	{
+	SLOW_EXEC1(EExecChunkSize);
+	}
+
+__EXECDECL__ TInt Exec::ChunkMaxSize(TInt)
+	{
+	SLOW_EXEC1(EExecChunkMaxSize);
+	}
+
+__EXECDECL__ TUint Exec::HandleAttributes(TInt)
+	{
+	SLOW_EXEC1(EExecHandleAttributes);
+	}
+
+__EXECDECL__ TUint Exec::TickCount()
+	{
+	SLOW_EXEC0(EExecTickCount);
+	}
+
+__EXECDECL__ void Exec::LogicalDeviceGetCaps(TInt, TDes8&)
+	{
+	SLOW_EXEC2(EExecLogicalDeviceGetCaps);
+	}
+
+__EXECDECL__ TBool Exec::LogicalDeviceQueryVersionSupported(TInt, const TVersion&)
+	{
+	SLOW_EXEC2(EExecLogicalDeviceQueryVersionSupported);
+	}
+
+__EXECDECL__ TBool Exec::LogicalDeviceIsAvailable(TInt, TInt, const TDesC8*, const TDesC8*)
+	{
+	SLOW_EXEC4(EExecLogicalDeviceIsAvailable);
+	}
+
+EXPORT_C __EXECDECL__ TInt E32Loader::LocaleExports(TAny*, TLibraryFunction*)
+	{
+	SLOW_EXEC2(EExecLocaleExports);
+	}
+
+__EXECDECL__ TInt Exec::ChannelRequest(TInt, TInt, TAny*, TAny*)
+	{
+	SLOW_EXEC4(EExecChannelRequest);
+	}
+
+__EXECDECL__ TUint32 Exec::MathRandom()
+	{
+	SLOW_EXEC0(EExecMathRandom);
+	}
+
+__EXECDECL__ void Exec::IMB_Range(TAny*, TUint)
+	{
+	SLOW_EXEC2(EExecIMBRange);
+	}
+
+__EXECDECL__ TInt Exec::ResetMachine(TMachineStartupType)
+	{
+	SLOW_EXEC1(EExecResetMachine);
+	}
+
+__EXECDECL__ TLibraryFunction Exec::LibraryLookup(TInt, TInt)
+	{
+	SLOW_EXEC2(EExecLibraryLookup);
+	}
+
+__EXECDECL__ void Exec::LibraryFileName(TInt, TDes8&)
+	{
+	SLOW_EXEC2(EExecLibraryFileName);
+	}
+
+EXPORT_C __EXECDECL__ TInt UserSvr::ExecuteInSupervisorMode(TSupervisorFunction, TAny*)
+	{
+	SLOW_EXEC2(EExecExecuteInSupervisorMode);
+	}
+
+__EXECDECL__ void Exec::MutexWait(TInt)
+	{
+	SLOW_EXEC1(EExecMutexWait);
+	}
+
+__EXECDECL__ void Exec::MutexSignal(TInt)
+	{
+	SLOW_EXEC1(EExecMutexSignal);
+	}
+
+__EXECDECL__ TInt Exec::ProcessId(TInt)
+	{
+	SLOW_EXEC1(EExecProcessId);
+	}
+
+__EXECDECL__ void Exec::DllFileName(TInt, TDes8&)
+	{
+	SLOW_EXEC2(EExecDllFileName);
+	}
+
+__EXECDECL__ void Exec::ProcessResume(TInt)
+	{
+	SLOW_EXEC1(EExecProcessResume);
+	}
+
+__EXECDECL__ void Exec::ProcessFileName(TInt, TDes8&)
+	{
+	SLOW_EXEC2(EExecProcessFileName);
+	}
+
+__EXECDECL__ void Exec::ProcessCommandLine(TInt, TDes8&)
+	{
+	SLOW_EXEC2(EExecProcessCommandLine);
+	}
+
+__EXECDECL__ TExitType Exec::ProcessExitType(TInt)
+	{
+	SLOW_EXEC1(EExecProcessExitType);
+	}
+
+__EXECDECL__ TInt Exec::ProcessExitReason(TInt)
+	{
+	SLOW_EXEC1(EExecProcessExitReason);
+	}
+
+__EXECDECL__ void Exec::ProcessExitCategory(TInt, TDes8&)
+	{
+	SLOW_EXEC2(EExecProcessExitCategory);
+	}
+
+__EXECDECL__ TProcessPriority Exec::ProcessPriority(TInt)
+	{
+	SLOW_EXEC1(EExecProcessPriority);
+	}
+
+__EXECDECL__ void Exec::ProcessSetPriority(TInt, TProcessPriority)
+	{
+	SLOW_EXEC2(EExecProcessSetPriority);
+	}
+
+__EXECDECL__ TUint Exec::ProcessFlags(TInt)
+	{
+	SLOW_EXEC1(EExecProcessFlags);
+	}
+
+__EXECDECL__ void Exec::ProcessSetFlags(TInt, TUint, TUint)
+	{
+	SLOW_EXEC3(EExecProcessSetFlags);
+	}
+
+__EXECDECL__ TInt Exec::SemaphoreWait(TInt, TInt)
+	{
+	SLOW_EXEC2(EExecSemaphoreWait);
+	}
+
+__EXECDECL__ void Exec::SemaphoreSignal1(TInt)
+	{
+	SLOW_EXEC1(EExecSemaphoreSignal1);
+	}
+
+__EXECDECL__ void Exec::SemaphoreSignalN(TInt, TInt)
+	{
+	SLOW_EXEC2(EExecSemaphoreSignalN);
+	}
+
+__EXECDECL__ void Exec::ServerReceive(TInt, TRequestStatus&, TAny*)
+	{
+	SLOW_EXEC3(EExecServerReceive);
+	}
+
+__EXECDECL__ void Exec::ServerCancel(TInt)
+	{
+	SLOW_EXEC1(EExecServerCancel);
+	}
+
+__EXECDECL__ void Exec::SetSessionPtr(TInt, const TAny*)
+	{
+	SLOW_EXEC2(EExecSetSessionPtr);
+	}
+
+__EXECDECL__ TInt Exec::ThreadId(TInt)
+	{
+	SLOW_EXEC1(EExecThreadId);
+	}
+
+__EXECDECL__ TInt Exec::SessionShare(TInt&, TInt)
+	{
+	SLOW_EXEC2(EExecSessionShare);
+	}
+
+__EXECDECL__ void Exec::ThreadResume(TInt)
+	{
+	SLOW_EXEC1(EExecThreadResume);
+	}
+
+__EXECDECL__ void Exec::ThreadSuspend(TInt)
+	{
+	SLOW_EXEC1(EExecThreadSuspend);
+	}
+
+__EXECDECL__ TThreadPriority Exec::ThreadPriority(TInt)
+	{
+	SLOW_EXEC1(EExecThreadPriority);
+	}
+
+__EXECDECL__ void Exec::ThreadSetPriority(TInt, TThreadPriority)
+	{
+	SLOW_EXEC2(EExecThreadSetPriority);
+	}
+
+__EXECDECL__ TProcessPriority Exec::ThreadProcessPriority(TInt)
+	{
+	SLOW_EXEC1(EExecThreadProcessPriority);
+	}
+
+__EXECDECL__ void Exec::ThreadSetProcessPriority(TInt, TProcessPriority)
+	{
+	SLOW_EXEC2(EExecThreadSetProcessPriority);
+	}
+
+__EXECDECL__ TUint Exec::ThreadFlags(TInt)
+	{
+	SLOW_EXEC1(EExecThreadFlags);
+	}
+
+__EXECDECL__ void Exec::ThreadSetFlags(TInt, TUint, TUint)
+	{
+	SLOW_EXEC3(EExecThreadSetFlags);
+	}
+
+__EXECDECL__ TInt Exec::ThreadRequestCount(TInt)
+	{
+	SLOW_EXEC1(EExecThreadRequestCount);
+	}
+
+__EXECDECL__ TExitType Exec::ThreadExitType(TInt)
+	{
+	SLOW_EXEC1(EExecThreadExitType);
+	}
+
+__EXECDECL__ TInt Exec::ThreadExitReason(TInt)
+	{
+	SLOW_EXEC1(EExecThreadExitReason);
+	}
+
+__EXECDECL__ void Exec::ThreadExitCategory(TInt, TDes8&)
+	{
+	SLOW_EXEC2(EExecThreadExitCategory);
+	}
+
+__EXECDECL__ void Exec::TimerCancel(TInt)
+	{
+	SLOW_EXEC1(EExecTimerCancel);
+	}
+
+__EXECDECL__ void Exec::TimerAfter(TInt, TRequestStatus&, TInt)
+	{
+	SLOW_EXEC3(EExecTimerAfter);
+	}
+
+__EXECDECL__ void Exec::TimerAt(TInt, TRequestStatus&, const EXEC_TIME&)
+	{
+	SLOW_EXEC3(EExecTimerAt);
+	}
+
+__EXECDECL__ void Exec::TimerLock(TInt, TRequestStatus&, TTimerLockSpec)
+	{
+	SLOW_EXEC3(EExecTimerLock);
+	}
+
+__EXECDECL__ TInt Exec::ChangeNotifierLogon(TInt, TRequestStatus&)
+	{
+	SLOW_EXEC2(EExecChangeNotifierLogon);
+	}
+
+__EXECDECL__ TInt Exec::ChangeNotifierLogoff(TInt)
+	{
+	SLOW_EXEC1(EExecChangeNotifierLogoff);
+	}
+
+__EXECDECL__ void Exec::RequestSignal(TInt)
+	{
+	SLOW_EXEC1(EExecRequestSignal);
+	}
+
+__EXECDECL__ void Exec::HandleName(TInt, TDes8&)
+	{
+	SLOW_EXEC2(EExecHandleName);
+	}
+
+__EXECDECL__ void Exec::HandleFullName(TInt, TDes8&)
+	{
+	SLOW_EXEC2(EExecHandleFullName);
+	}
+
+__EXECDECL__ void Exec::HandleInfo(TInt, THandleInfo*)
+	{
+	SLOW_EXEC2(EExecHandleInfo);
+	}
+
+__EXECDECL__ void Exec::HandleCount(TInt, TInt&, TInt&)
+	{
+	SLOW_EXEC3(EExecHandleCount);
+	}
+
+__EXECDECL__ void Exec::After(TInt, TRequestStatus&)
+	{
+	SLOW_EXEC2(EExecAfter);
+	}
+
+__EXECDECL__ void Exec::At(const EXEC_TIME&, TRequestStatus&)
+	{
+	SLOW_EXEC2(EExecAt);
+	}
+
+__EXECDECL__ void Exec::MessageComplete(TInt, TInt)
+	{
+	SLOW_EXEC2(EExecMessageComplete);
+	}
+
+__EXECDECL__ void Exec::MessageCompleteWithHandle(TInt, TInt)
+	{
+	SLOW_EXEC2(EExecMessageCompleteWithHandle);
+	}
+
+__EXECDECL__ TInt Exec::TimeNow(EXEC_TIME&, TInt&)
+	{
+	SLOW_EXEC2(EExecTimeNow);
+	}
+
+__EXECDECL__ TInt Exec::TimeNowSecure(EXEC_TIME&, TInt&)
+	{
+	SLOW_EXEC2(EExecTimeNowSecure);
+	}
+
+__EXECDECL__ TInt Exec::SetUTCTimeAndOffset(const EXEC_TIME&, TInt, TUint, TUint)
+	{
+	SLOW_EXEC4(EExecSetUTCTimeAndOffset);
+	}
+
+__EXECDECL__ TInt Exec::SetMachineConfiguration(const TDesC8&)
+	{
+	SLOW_EXEC1(EExecSetMachineConfiguration);
+	}
+
+__EXECDECL__ void Exec::CaptureEventHook()
+	{
+	SLOW_EXEC0(EExecCaptureEventHook);
+	}
+
+__EXECDECL__ void Exec::ReleaseEventHook()
+	{
+	SLOW_EXEC0(EExecReleaseEventHook);
+	}
+
+__EXECDECL__ void Exec::RequestEvent(TRawEventBuf&, TRequestStatus&)
+	{
+	SLOW_EXEC2(EExecRequestEvent);
+	}
+
+__EXECDECL__ void Exec::RequestEventCancel()
+	{
+	SLOW_EXEC0(EExecRequestEventCancel);
+	}
+
+__EXECDECL__ TInt Exec::AddEvent(const TRawEvent&)
+	{
+	SLOW_EXEC1(EExecAddEvent);
+	}
+
+__EXECDECL__ TAny* Exec::DllTls(TInt, TInt)
+	{
+	SLOW_EXEC2(EExecDllTls);
+	}
+
+__EXECDECL__ TInt Exec::HalFunction(TInt, TInt, TAny*, TAny*)
+	{
+	SLOW_EXEC4(EExecHalFunction);
+	}
+
+__EXECDECL__ void Exec::WsRegisterThread()
+	{
+	SLOW_EXEC0(EExecWsRegisterThread);
+	}
+
+__EXECDECL__ void Exec::FsRegisterThread()
+	{
+	SLOW_EXEC0(EExecFsRegisterThread);
+	}
+
+__EXECDECL__ TInt Exec::ProcessCommandLineLength(TInt)
+	{
+	SLOW_EXEC1(EExecProcessCommandLineLength);
+	}
+
+__EXECDECL__ void Exec::TimerInactivity(TInt, TRequestStatus&, TInt)
+	{
+	SLOW_EXEC3(EExecTimerInactivity);
+	}
+
+__EXECDECL__ TInt Exec::UserInactivityTime()
+	{
+	SLOW_EXEC0(EExecUserInactivityTime);
+	}
+
+__EXECDECL__ void Exec::ResetInactivityTime()
+	{
+	SLOW_EXEC0(EExecResetInactivityTime);
+	}
+
+__EXECDECL__ void Exec::DebugPrint(TAny*, TInt)
+	{
+	SLOW_EXEC2(EExecDebugPrint);
+	}
+
+__EXECDECL__ TInt Exec::BreakPoint()
+	{
+	SLOW_EXEC0(EExecBreakPoint);
+	}
+
+__EXECDECL__ TInt Exec::ProfileStart(TInt)
+	{
+	SLOW_EXEC1(EExecProfileStart);
+	}
+
+__EXECDECL__ TInt Exec::ProfileEnd(TInt)
+	{
+	SLOW_EXEC1(EExecProfileEnd);
+	}
+
+__EXECDECL__ TExceptionHandler Exec::ExceptionHandler(TInt)
+	{
+	SLOW_EXEC1(EExecExceptionHandler);
+	}
+
+__EXECDECL__ TInt Exec::SetExceptionHandler(TInt, TExceptionHandler, TUint32)
+	{
+	SLOW_EXEC3(EExecSetExceptionHandler);
+	}
+
+__EXECDECL__ void Exec::ModifyExceptionMask(TInt, TUint32, TUint32)
+	{
+	SLOW_EXEC3(EExecModifyExceptionMask);
+	}
+
+__EXECDECL__ TInt Exec::RaiseException(TInt, TExcType)
+	{
+	SLOW_EXEC2(EExecRaiseException);
+	}
+
+__EXECDECL__ TInt Exec::IsExceptionHandled(TInt, TExcType, TBool)
+	{
+	SLOW_EXEC3(EExecIsExceptionHandled);
+	}
+
+__EXECDECL__ TInt Exec::ProcessGetMemoryInfo(TInt, TModuleMemoryInfo&)
+	{
+	SLOW_EXEC2(EExecProcessGetMemoryInfo);
+	}
+
+__EXECDECL__ TInt Exec::LibraryGetMemoryInfo(TInt, TModuleMemoryInfo&)
+	{
+	SLOW_EXEC2(EExecLibraryGetMemoryInfo);
+	}
+
+__EXECDECL__ TInt Exec::MachineConfiguration(TDes8&, TInt&)
+	{
+	SLOW_EXEC2(EExecMachineConfiguration);
+	}
+
+__EXECDECL__ TInt Exec::SetMemoryThresholds(TInt, TInt)
+	{
+	SLOW_EXEC2(EExecSetMemoryThresholds);
+	}
+
+__EXECDECL__ void Exec::LibraryType(TInt, TUidType&)
+	{
+	SLOW_EXEC2(EExecLibraryType);
+	}
+
+__EXECDECL__ void Exec::ProcessType(TInt, TUidType&)
+	{
+	SLOW_EXEC2(EExecProcessType);
+	}
+
+__EXECDECL__ TInt Exec::ChunkBottom(TInt)
+	{
+	SLOW_EXEC1(EExecChunkBottom);
+	}
+
+__EXECDECL__ TInt Exec::ChunkTop(TInt)
+	{
+	SLOW_EXEC1(EExecChunkTop);
+	}
+
+__EXECDECL__ void Exec::ThreadContext(TInt, TDes8&)
+	{
+	SLOW_EXEC2(EExecThreadContext);
+	}
+
+__EXECDECL__ TInt Exec::ThreadCreate(const TDesC8&, TOwnerType, SThreadCreateInfo8&)
+	{
+	SLOW_EXEC3(EExecThreadCreate);
+	}
+
+__EXECDECL__ TInt Exec::FindHandleOpen(TOwnerType, const TFindHandle&)
+	{
+	SLOW_EXEC2(EExecFindHandleOpen);
+	}
+
+__EXECDECL__ TInt Exec::HandleClose(TInt)
+	{
+	SLOW_EXEC1(EExecHandleClose);
+	}
+
+__EXECDECL__ TInt Exec::ChunkCreate(TOwnerType, const TDesC8*, TChunkCreate&)
+	{
+	SLOW_EXEC3(EExecChunkCreate);
+	}
+
+__EXECDECL__ TInt Exec::ChunkAdjust(TInt, TInt, TInt, TInt)
+	{
+	SLOW_EXEC4(EExecChunkAdjust);
+	}
+
+__EXECDECL__ TInt Exec::OpenObject(TObjectType, const TDesC8&, TOwnerType)
+	{
+	SLOW_EXEC3(EExecOpenObject);
+	}
+
+__EXECDECL__ TInt Exec::HandleDuplicate(TInt, TOwnerType, TInt)
+	{
+	SLOW_EXEC3(EExecHandleDuplicate);
+	}
+
+__EXECDECL__ TInt Exec::MutexCreate(const TDesC8*, TOwnerType)
+	{
+	SLOW_EXEC2(EExecMutexCreate);
+	}
+
+__EXECDECL__ TInt Exec::SemaphoreCreate(const TDesC8*, TInt, TOwnerType)
+	{
+	SLOW_EXEC3(EExecSemaphoreCreate);
+	}
+
+__EXECDECL__ TInt Exec::ThreadOpenById(TUint, TOwnerType)
+	{
+	SLOW_EXEC2(EExecThreadOpenById);
+	}
+
+__EXECDECL__ TInt Exec::ProcessOpenById(TUint, TOwnerType)
+	{
+	SLOW_EXEC2(EExecProcessOpenById);
+	}
+
+__EXECDECL__ void Exec::ThreadKill(TInt, TExitType, TInt, const TDesC8*)
+	{
+	SLOW_EXEC4(EExecThreadKill);
+	}
+
+__EXECDECL__ void Exec::ThreadLogon(TInt, TRequestStatus*, TBool)
+	{
+	SLOW_EXEC3(EExecThreadLogon);
+	}
+
+__EXECDECL__ TInt Exec::ThreadLogonCancel(TInt, TRequestStatus*, TBool)
+	{
+	SLOW_EXEC3(EExecThreadLogonCancel);
+	}
+
+__EXECDECL__ TInt Exec::DllSetTls(TInt, TInt, TAny*)
+	{
+	SLOW_EXEC3(EExecDllSetTls);
+	}
+
+__EXECDECL__ void Exec::DllFreeTls(TInt)
+	{
+	SLOW_EXEC1(EExecDllFreeTls);
+	}
+
+__EXECDECL__ TInt Exec::ThreadRename(TInt, const TDesC8&)
+	{
+	SLOW_EXEC2(EExecThreadRename);
+	}
+
+__EXECDECL__ TInt Exec::ProcessRename(TInt, const TDesC8&)
+	{
+	SLOW_EXEC2(EExecProcessRename);
+	}
+
+__EXECDECL__ void Exec::ProcessKill(TInt, TExitType, TInt, const TDesC8*)
+	{
+	SLOW_EXEC4(EExecProcessKill);
+	}
+
+__EXECDECL__ void Exec::ProcessLogon(TInt, TRequestStatus*, TBool)
+	{
+	SLOW_EXEC3(EExecProcessLogon);
+	}
+
+__EXECDECL__ TInt Exec::ProcessLogonCancel(TInt, TRequestStatus*, TBool)
+	{
+	SLOW_EXEC3(EExecProcessLogonCancel);
+	}
+
+__EXECDECL__ TInt Exec::ThreadProcess(TInt)
+	{
+	SLOW_EXEC1(EExecThreadProcess);
+	}
+
+__EXECDECL__ TInt Exec::ServerCreate(const TDesC8*, TInt)
+	{
+	SLOW_EXEC2(EExecServerCreate);
+	}
+
+__EXECDECL__ TInt Exec::SessionCreate(const TDesC8&, TInt, const TSecurityPolicy*, TInt)
+	{
+	SLOW_EXEC4(EExecSessionCreate);
+	}
+
+__EXECDECL__ TInt Exec::SessionCreateFromHandle(TInt, TInt, const TSecurityPolicy*, TInt)
+	{
+	SLOW_EXEC4(EExecSessionCreateFromHandle);
+	}
+
+EXPORT_C __EXECDECL__ TInt E32Loader::DeviceLoad(TAny*, TInt)
+	{
+	SLOW_EXEC2(EExecDeviceLoad);
+	}
+
+__EXECDECL__ TInt Exec::DeviceFree(const TDesC8&, TInt)
+	{
+	SLOW_EXEC2(EExecDeviceFree);
+	}
+
+__EXECDECL__ TInt Exec::ChannelCreate(const TDesC8&, TChannelCreateInfo8&, TInt)
+	{
+	SLOW_EXEC3(EExecChannelCreate);
+	}
+
+__EXECDECL__ TInt Exec::TimerCreate()
+	{
+	SLOW_EXEC0(EExecTimerCreate);
+	}
+
+__EXECDECL__ void Exec::TimerHighRes(TInt, TRequestStatus&, TInt)
+	{
+	SLOW_EXEC3(EExecTimerHighRes);
+	}
+
+__EXECDECL__ void Exec::AfterHighRes(TInt, TRequestStatus&)
+	{
+	SLOW_EXEC2(EExecAfterHighRes);
+	}
+
+__EXECDECL__ TInt Exec::ChangeNotifierCreate(TOwnerType)
+	{
+	SLOW_EXEC1(EExecChangeNotifierCreate);
+	}
+
+__EXECDECL__ TInt Exec::UndertakerCreate(TOwnerType)
+	{
+	SLOW_EXEC1(EExecUndertakerCreate);
+	}
+
+__EXECDECL__ TInt Exec::UndertakerLogon(TInt, TRequestStatus&, TInt&)
+	{
+	SLOW_EXEC3(EExecUndertakerLogon);
+	}
+
+__EXECDECL__ TInt Exec::UndertakerLogonCancel(TInt)
+	{
+	SLOW_EXEC1(EExecUndertakerLogonCancel);
+	}
+
+__EXECDECL__ void Exec::KernelHeapDebug(TInt, TInt, TAny*)
+	{
+	SLOW_EXEC3(EExecKernelHeapDebug);
+	}
+
+__EXECDECL__ TInt Exec::ThreadGetCpuTime(TInt, EXEC_INT64&)
+	{
+	SLOW_EXEC2(EExecThreadGetCpuTime);
+	}
+
+EXPORT_C __EXECDECL__ TInt E32Loader::CodeSegCreate(TCodeSegCreateInfo&)
+	{
+	SLOW_EXEC1(EExecCodeSegCreate);
+	}
+
+EXPORT_C __EXECDECL__ TInt E32Loader::CodeSegLoaded(TCodeSegCreateInfo&)
+	{
+	SLOW_EXEC1(EExecCodeSegLoaded);
+	}
+
+EXPORT_C __EXECDECL__ TInt E32Loader::LibraryCreate(TLibraryCreateInfo&)
+	{
+	SLOW_EXEC1(EExecLibraryCreate);
+	}
+
+EXPORT_C __EXECDECL__ TInt E32Loader::CodeSegOpen(TAny*, TInt)
+	{
+	SLOW_EXEC2(EExecCodeSegOpen);
+	}
+
+EXPORT_C __EXECDECL__ void E32Loader::CodeSegClose(TAny*)
+	{
+	SLOW_EXEC1(EExecCodeSegClose);
+	}
+
+EXPORT_C __EXECDECL__ void E32Loader::CodeSegNext(TAny*&, const TFindCodeSeg&)
+	{
+	SLOW_EXEC2(EExecCodeSegNext);
+	}
+
+EXPORT_C __EXECDECL__ void E32Loader::CodeSegInfo(TAny*, TCodeSegCreateInfo&)
+	{
+	SLOW_EXEC2(EExecCodeSegInfo);
+	}
+
+EXPORT_C __EXECDECL__ TInt E32Loader::CodeSegAddDependency(TAny*, TAny*)
+	{
+	SLOW_EXEC2(EExecCodeSegAddDependency);
+	}
+
+EXPORT_C __EXECDECL__ void E32Loader::CodeSegDeferDeletes()
+	{
+	SLOW_EXEC0(EExecCodeSegDeferDeletes);
+	}
+
+EXPORT_C __EXECDECL__ void E32Loader::CodeSegEndDeferDeletes()
+	{
+	SLOW_EXEC0(EExecCodeSegEndDeferDeletes);
+	}
+
+EXPORT_C __EXECDECL__ TInt E32Loader::ProcessCreate(TProcessCreateInfo&, const TDesC8*)
+	{
+	SLOW_EXEC2(EExecProcessCreate);
+	}
+
+EXPORT_C __EXECDECL__ TInt E32Loader::ProcessLoaded(TProcessCreateInfo&)
+	{
+	SLOW_EXEC1(EExecProcessLoaded);
+	}
+
+EXPORT_C __EXECDECL__ TInt E32Loader::CheckClientState(TInt)
+	{
+	SLOW_EXEC1(EExecCheckLoaderClientState);
+	}
+
+EXPORT_C __EXECDECL__ TAny* E32Loader::ThreadProcessCodeSeg(TInt)
+	{
+	SLOW_EXEC1(EExecThreadProcessCodeSeg);
+	}
+
+EXPORT_C __EXECDECL__ void E32Loader::ReadExportDir(TAny*, TLinAddr*)
+	{
+	SLOW_EXEC2(EExecCodeSegReadExportDir);
+	}
+
+__EXECDECL__ TInt E32Loader::WaitDllLock()
+	{
+	SLOW_EXEC0(EExecWaitDllLock);
+	}
+
+__EXECDECL__ TInt E32Loader::ReleaseDllLock()
+	{
+	SLOW_EXEC0(EExecReleaseDllLock);
+	}
+
+__EXECDECL__ TInt E32Loader::LibraryAttach(TInt, TInt&, TLinAddr*)
+	{
+	SLOW_EXEC3(EExecLibraryAttach);
+	}
+
+__EXECDECL__ TInt E32Loader::LibraryAttached(TInt)
+	{
+	SLOW_EXEC1(EExecLibraryAttached);
+	}
+
+__EXECDECL__ TInt E32Loader::StaticCallList(TInt&, TLinAddr*)
+	{
+	SLOW_EXEC2(EExecStaticCallList);
+	}
+
+__EXECDECL__ TInt E32Loader::LibraryDetach(TInt&, TLinAddr*)
+	{
+	SLOW_EXEC2(EExecLibraryDetach);
+	}
+
+__EXECDECL__ TInt E32Loader::LibraryDetached()
+	{
+	SLOW_EXEC0(EExecLibraryDetached);
+	}
+
+__EXECDECL__ TInt Exec::LastThreadHandle()
+	{
+	SLOW_EXEC0(EExecLastThreadHandle);
+	}
+
+__EXECDECL__ void Exec::ThreadRendezvous(TInt)
+	{
+	SLOW_EXEC1(EExecThreadRendezvous);
+	}
+
+__EXECDECL__ void Exec::ProcessRendezvous(TInt)
+	{
+	SLOW_EXEC1(EExecProcessRendezvous);
+	}
+
+__EXECDECL__ TInt Exec::MessageGetDesLength(TInt, TInt)
+	{
+	SLOW_EXEC2(EExecMessageGetDesLength);
+	}
+
+__EXECDECL__ TInt Exec::MessageGetDesMaxLength(TInt, TInt)
+	{
+	SLOW_EXEC2(EExecMessageGetDesMaxLength);
+	}
+
+__EXECDECL__ TInt Exec::MessageClient(TInt, TOwnerType)
+	{
+	SLOW_EXEC2(EExecMessageClient);
+	}
+
+__EXECDECL__ TInt Exec::MessageSetProcessPriority(TInt, TProcessPriority)
+	{
+	SLOW_EXEC2(EExecMessageSetProcessPriority);
+	}
+
+__EXECDECL__ void Exec::MessageConstructFromPtr(TInt, TAny*)
+	{
+	SLOW_EXEC2(EExecMessageConstructFromPtr);
+	}
+
+__EXECDECL__ void Exec::MessageKill(TInt, TExitType, TInt, const TDesC8*)
+	{
+	SLOW_EXEC4(EExecMessageKill);
+	}
+
+__EXECDECL__ TInt Exec::MessageOpenObject(TInt, TObjectType, TInt, TOwnerType)
+	{
+	SLOW_EXEC4(EExecMessageOpenObject);
+	}
+
+__EXECDECL__ void Exec::ProcessSecurityInfo(TInt, SSecurityInfo&)
+	{
+	SLOW_EXEC2(EExecProcessSecurityInfo);
+	}
+
+__EXECDECL__ void Exec::ThreadSecurityInfo(TInt, SSecurityInfo&)
+	{
+	SLOW_EXEC2(EExecThreadSecurityInfo);
+	}
+
+__EXECDECL__ void Exec::MessageSecurityInfo(TInt, SSecurityInfo&)
+	{
+	SLOW_EXEC2(EExecMessageSecurityInfo);
+	}
+
+__EXECDECL__ void Exec::CreatorSecurityInfo(SSecurityInfo&)
+	{
+	SLOW_EXEC1(EExecCreatorSecurityInfo);
+	}
+
+__EXECDECL__ void Exec::DisabledCapabilities(SCapabilitySet&)
+	{
+	SLOW_EXEC1(EExecDisabledCapabilities);
+	}
+
+__EXECDECL__ TInt Exec::ChunkSetRestrictions(TInt, TUint)
+	{
+	SLOW_EXEC2(EExecChunkSetRestrictions);
+	}
+
+__EXECDECL__ TInt Exec::MsgQueueCreate(const TDesC8*, TInt, TInt, TOwnerType)
+	{
+	SLOW_EXEC4(EExecMsgQueueCreate);
+	}
+
+__EXECDECL__ TInt Exec::MsgQueueSend(TInt, const TAny*, TInt)
+	{
+	SLOW_EXEC3(EExecMsgQueueSend);
+	}
+
+__EXECDECL__ TInt Exec::MsgQueueReceive(TInt, TAny*, TInt)
+	{
+	SLOW_EXEC3(EExecMsgQueueReceive);
+	}
+
+__EXECDECL__ void Exec::MsgQueueNotifySpaceAvailable(TInt, TRequestStatus&)
+	{
+	SLOW_EXEC2(EExecMsgQueueNotifySpaceAvailable);
+	}
+
+__EXECDECL__ void Exec::MsgQueueCancelSpaceAvailable(TInt)
+	{
+	SLOW_EXEC1(EExecMsgQueueCancelSpaceAvailable);
+	}
+
+__EXECDECL__ void Exec::MsgQueueNotifyDataAvailable(TInt, TRequestStatus&)
+	{
+	SLOW_EXEC2(EExecMsgQueueNotifyDataAvailable);
+	}
+
+__EXECDECL__ void Exec::MsgQueueCancelDataAvailable(TInt)
+	{
+	SLOW_EXEC1(EExecMsgQueueCancelDataAvailable);
+	}
+
+__EXECDECL__ TInt Exec::MsgQueueSize(TInt)
+	{
+	SLOW_EXEC1(EExecMsgQueueSize);
+	}
+
+__EXECDECL__ TInt Exec::PropertyDefine(TUint, TUint, TPropertyInfo*)
+	{
+	SLOW_EXEC3(EExecPropertyDefine);
+	}
+
+__EXECDECL__ TInt Exec::PropertyDelete(TUint, TUint)
+	{
+	SLOW_EXEC2(EExecPropertyDelete);
+	}
+
+__EXECDECL__ TInt Exec::PropertyAttach(TUint, TUint, TOwnerType)
+	{
+	SLOW_EXEC3(EExecPropertyAttach);
+	}
+
+__EXECDECL__ void Exec::PropertySubscribe(TInt, TRequestStatus*)
+	{
+	SLOW_EXEC2(EExecPropertySubscribe);
+	}
+
+__EXECDECL__ void Exec::PropertyCancel(TInt)
+	{
+	SLOW_EXEC1(EExecPropertyCancel);
+	}
+
+__EXECDECL__ TInt Exec::PropertyGetI(TInt, TInt*)
+	{
+	SLOW_EXEC2(EExecPropertyGetI);
+	}
+
+__EXECDECL__ TInt Exec::PropertyGetB(TInt, TUint8*, TInt)
+	{
+	SLOW_EXEC3(EExecPropertyGetB);
+	}
+
+__EXECDECL__ TInt Exec::PropertySetI(TInt, TInt)
+	{
+	SLOW_EXEC2(EExecPropertySetI);
+	}
+
+__EXECDECL__ TInt Exec::PropertySetB(TInt, const TUint8*, TInt)
+	{
+	SLOW_EXEC3(EExecPropertySetB);
+	}
+
+__EXECDECL__ TInt Exec::PropertyFindGetI(TUint, TUint, TInt*)
+	{
+	SLOW_EXEC3(EExecPropertyFindGetI);
+	}
+
+__EXECDECL__ TInt Exec::PropertyFindGetB(TUint, TUint, TUint8*, TInt)
+	{
+	SLOW_EXEC4(EExecPropertyFindGetB);
+	}
+
+__EXECDECL__ TInt Exec::PropertyFindSetI(TUint, TUint, TInt)
+	{
+	SLOW_EXEC3(EExecPropertyFindSetI);
+	}
+
+__EXECDECL__ TInt Exec::PropertyFindSetB(TUint, TUint, TUint8*, TInt)
+	{
+	SLOW_EXEC4(EExecPropertyFindSetB);
+	}
+
+__EXECDECL__ TInt Exec::PowerEnableWakeupEvents(TPowerState)
+	{
+	SLOW_EXEC1(EExecPowerEnableWakeupEvents);
+	}
+
+__EXECDECL__ void Exec::PowerDisableWakeupEvents()
+	{
+	SLOW_EXEC0(EExecPowerDisableWakeupEvents);
+	}
+
+__EXECDECL__ void Exec::PowerRequestWakeupEventNotification(TRequestStatus*)
+	{
+	SLOW_EXEC1(EExecPowerRequestWakeupEventNotification);
+	}
+
+__EXECDECL__ void Exec::PowerCancelWakeupEventNotification()
+	{
+	SLOW_EXEC0(EExecPowerCancelWakeupEventNotification);
+	}
+
+__EXECDECL__ TInt Exec::PowerDown()
+	{
+	SLOW_EXEC0(EExecPowerDown);
+	}
+
+__EXECDECL__ TInt Exec::ProcessSetHandleParameter(TInt, TInt, TInt)
+	{
+	SLOW_EXEC3(EExecProcessSetHandleParameter);
+	}
+
+__EXECDECL__ TInt Exec::ProcessSetDataParameter(TInt, TInt, const TUint8*, TInt)
+	{
+	SLOW_EXEC4(EExecProcessSetDataParameter);
+	}
+
+__EXECDECL__ TInt Exec::ProcessGetHandleParameter(TInt, TObjectType, TOwnerType)
+	{
+	SLOW_EXEC3(EExecProcessGetHandleParameter);
+	}
+
+__EXECDECL__ TInt Exec::ProcessGetDataParameter(TInt, TUint8*, TInt)
+	{
+	SLOW_EXEC3(EExecProcessGetDataParameter);
+	}
+
+__EXECDECL__ TInt Exec::ProcessDataParameterLength(TInt)
+	{
+	SLOW_EXEC1(EExecProcessDataParameterLength);
+	}
+
+__EXECDECL__ TUint Exec::MessageClientProcessFlags(TInt)
+	{
+	SLOW_EXEC1(EExecMessageClientProcessFlags);
+	}
+
+__EXECDECL__ TInt Exec::ThreadStackInfo(TInt, TThreadStackInfo&)
+	{
+	SLOW_EXEC2(EExecThreadStackInfo);
+	}
+
+__EXECDECL__ RAllocator* Exec::ThreadGetHeap(TInt)
+	{
+	SLOW_EXEC1(EExecThreadGetHeap);
+	}
+
+__EXECDECL__ TInt Exec::ThreadAsProcess(TInt, TInt)
+	{
+	SLOW_EXEC2(EExecThreadAsProcess);
+	}
+
+__EXECDECL__ TInt Exec::CondVarCreate(const TDesC8*, TOwnerType)
+	{
+	SLOW_EXEC2(EExecCondVarCreate);
+	}
+
+__EXECDECL__ TInt Exec::CondVarWait(TInt, TInt, TInt)
+	{
+	SLOW_EXEC3(EExecCondVarWait);
+	}
+
+__EXECDECL__ void Exec::CondVarSignal(TInt)
+	{
+	SLOW_EXEC1(EExecCondVarSignal);
+	}
+
+__EXECDECL__ void Exec::CondVarBroadcast(TInt)
+	{
+	SLOW_EXEC1(EExecCondVarBroadcast);
+	}
+
+__EXECDECL__ TInt Exec::PlatSecDiagnostic(TPlatSecDiagnostic*)
+	{
+	SLOW_EXEC1(EExecPlatSecDiagnostic);
+	}
+
+__EXECDECL__ TLinAddr Exec::ExceptionDescriptor(TLinAddr)
+	{
+	SLOW_EXEC1(EExecExceptionDescriptor);
+	}
+
+__EXECDECL__ void Exec::ThreadRequestSignal(TInt)
+	{
+	SLOW_EXEC1(EExecThreadRequestSignal);
+	}
+
+__EXECDECL__ TBool Exec::MutexIsHeld(TInt)
+	{
+	SLOW_EXEC1(EExecMutexIsHeld);
+	}
+
+__EXECDECL__ TTrapHandler* Exec::LeaveStart()
+	{
+	SLOW_EXEC0(EExecLeaveStart);
+	}
+
+__EXECDECL__ void Exec::LeaveEnd()
+	{
+	SLOW_EXEC0(EExecLeaveEnd);
+	}
+
+__EXECDECL__ void Exec::SetDebugMaskIndex(TUint32, TUint)
+	{
+	SLOW_EXEC2(EExecSetDebugMaskIndex);
+	}
+
+__EXECDECL__ TInt Exec::GetModuleNameFromAddress(TAny*, TDes8&)
+	{
+	SLOW_EXEC2(EExecGetModuleNameFromAddress);
+	}
+
+__EXECDECL__ void Exec::NotifyChanges(TUint)
+	{
+	SLOW_EXEC1(EExecNotifyChanges);
+	}
+
+__EXECDECL__ TInt Exec::SetGlobalUserData(TInt, TInt)
+	{
+	SLOW_EXEC2(EExecSetGlobalUserData);
+	}
+
+__EXECDECL__ TInt Exec::SessionSecurityInfo(TInt, SSecurityInfo&)
+	{
+	SLOW_EXEC2(EExecSessionSecurityInfo);
+	}
+
+__EXECDECL__ const TRequestStatus* Exec::MessageClientStatus(TInt)
+	{
+	SLOW_EXEC1(EExecMessageClientStatus);
+	}
+
+__EXECDECL__ TInt Exec::SetFloatingPointMode(TFloatingPointMode, TFloatingPointRoundingMode)
+	{
+	SLOW_EXEC2(EExecSetFloatingPointMode);
+	}
+
+EXPORT_C __EXECDECL__ TBool BTrace::CheckFilter2(TUint32, TUint32)
+	{
+	SLOW_EXEC2(EExecCheckFilter2);
+	}
+
+__EXECDECL__ TAny* Exec::ProcessExeExportData()
+	{
+	SLOW_EXEC0(EExecProcessExeExportData);
+	}
+
+EXPORT_C __EXECDECL__ TInt E32Loader::NotifyIfCodeSegDestroyed(TRequestStatus&)
+	{
+	SLOW_EXEC1(EExecNotifyIfCodeSegDestroyed);
+	}
+
+EXPORT_C __EXECDECL__ TInt E32Loader::GetDestroyedCodeSegInfo(TCodeSegLoaderCookie&)
+	{
+	SLOW_EXEC1(EExecGetDestroyedCodeSegInfo);
+	}
+
+EXPORT_C __EXECDECL__ TInt Exec::SetWin32RuntimeHook(TAny*)
+	{
+	SLOW_EXEC1(EExecSetWin32RuntimeHook);
+	}
+
+__EXECDECL__ TInt Exec::GetBTraceId(TInt)
+	{
+	SLOW_EXEC1(EExecGetBTraceId);
+	}
+
+__EXECDECL__ void Exec::NotifyOnIdle(TRequestStatus*)
+	{
+	SLOW_EXEC1(EExecNotifyOnIdle);
+	}
+
+__EXECDECL__ void Exec::CancelMiscNotifier(TRequestStatus*)
+	{
+	SLOW_EXEC1(EExecCancelMiscNotifier);
+	}
+
+__EXECDECL__ void Exec::NotifyObjectDestruction(TInt, TRequestStatus*)
+	{
+	SLOW_EXEC2(EExecNotifyObjectDestruction);
+	}
+
+__EXECDECL__ void Exec::RegisterTrustedChunk(TInt)
+	{
+	SLOW_EXEC1(EExecRegisterTrustedChunk);
+	}
+
+__EXECDECL__ TBool Exec::UserThreadExiting(TInt)
+	{
+	SLOW_EXEC1(EExecUserThreadExiting);
+	}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/symuser/exestub.cpp	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,25 @@
+// Copyright (c) 1997-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+#include <e32std.h>
+
+extern TInt E32Main();
+IMPORT_C void SymInit(int argc, char *argv[]);
+
+int main(int argc, char *argv[])
+	{
+	SymInit(argc, argv);
+	return E32Main();
+	}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/symuser/loader.cpp	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,142 @@
+// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+#include <stdio.h>
+
+#include <e32ldr.h>
+#include <u32std.h>
+#include <e32std.h>
+
+#ifndef __linux__
+#include <windows.h>
+#include <winbase.h>
+
+// Windows version of the function
+TInt RLoader::LoadLocale(const TDesC& aLocaleDllName, TLibraryFunction* aExportList)
+	{
+	typedef int (__cdecl *MYPROC)(LPWSTR);
+	MYPROC myFunc;
+	TBuf<256> nameBuf;
+	nameBuf.Copy(aLocaleDllName);
+	nameBuf.ZeroTerminate();
+
+	iHandle = (TAny*)LoadLibraryEx((const WCHAR*)(nameBuf.Ptr()), NULL, DONT_RESOLVE_DLL_REFERENCES|LOAD_WITH_ALTERED_SEARCH_PATH);
+	if ( iHandle == NULL )
+		{
+		DWORD err = GetLastError();
+		printf("Error loading locale: Win system error %lu", (unsigned long)err);
+		return KErrGeneral;
+		}
+
+	for ( TInt i = 1 ; i < KNumLocaleExports ; i ++ )
+		{
+		myFunc = (MYPROC) GetProcAddress((HMODULE)iHandle, (LPCSTR)i);
+		if ( myFunc != NULL )
+			{
+			aExportList[i] = (TLibraryFunction)myFunc;
+			}
+		else
+			{
+			DWORD err = GetLastError();
+			printf("Error loading locale function: Win system error %lu", (unsigned long)err);
+			FreeLibrary((HMODULE)iHandle);
+			return KErrGeneral;
+			}
+		}
+	return KErrNone;
+	}
+
+void RLoader::Free()
+	{
+	if (iHandle != NULL)
+		{
+		FreeLibrary((HMODULE)iHandle);
+		iHandle = NULL;
+		}
+	}
+
+#else
+
+#include <dlfcn.h>
+
+// Mangled function names
+const char funcnames [22][60] =
+	{
+	"Dummy",
+	"_ZN4Locl9AmPmTableEv",
+	"_ZN4Locl7CharSetEv",
+	"_ZN4Locl9CollTableEv",
+	"_ZN4Locl14CurrencySymbolEv",
+	"_ZN4Locl15DateSuffixTableEv",
+	"_ZN4Locl11DayAbbTableEv",
+	"_ZN4Locl8DayTableEv",
+	"_ZN4Locl9FoldTableEv",
+	"_ZN4Locl8LanguageEv",
+	"_ZN4Locl10LocaleDataEP11SLocaleData",
+	"_ZN4Locl10LowerTableEv",
+	"_ZN4Locl13MonthAbbTableEv",
+	"_ZN4Locl10MonthTableEv",
+	"_ZN4Locl8MsgTableEv",
+	"_ZN4Locl9TypeTableEv",
+	"_ZN4Locl7UniCodeEv",
+	"_ZN4Locl10UpperTableEv",
+	"_ZN4Locl19ShortDateFormatSpecEv",
+	"_ZN4Locl18LongDateFormatSpecEv",
+	"_ZN4Locl19FatUtilityFunctionsEv",
+	};
+
+// Linux version of the function
+TInt RLoader::LoadLocale(const TDesC& aLocaleDllName, TLibraryFunction* aExportList)
+	{
+	TBuf8<256> nameBuf;
+	nameBuf.Copy(aLocaleDllName);
+	const char* name = reinterpret_cast<const char*>(nameBuf.PtrZ());
+
+	iHandle = dlopen(name, RTLD_NOW);
+	TLibraryFunction myFunc;
+
+	if(iHandle == NULL) {
+		printf("Error loading locale: %s\n", dlerror());
+		return KErrGeneral;
+	}
+
+	for ( TInt i = 1 ; i < KNumLocaleExports ; i ++ )
+		{
+		myFunc = (TLibraryFunction) dlsym(iHandle, funcnames[i]);
+		if ( myFunc != NULL )
+			{
+			aExportList[i] = (TLibraryFunction)myFunc;
+			}
+		else
+			{
+			printf("Error loading locale function: %s\n", dlerror());
+			dlclose(iHandle);
+			return KErrGeneral;
+			}
+		}
+	return KErrNone;
+	}
+
+void RLoader::Free()
+	{
+	if ( iHandle != NULL )
+		{
+		dlclose(iHandle);
+		iHandle = NULL;
+		}
+	}
+
+#endif
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/symuser/new.cpp	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,50 @@
+// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+#include "e32std.h"
+
+EXPORT_C TAny* operator new(TUint aSize) __NO_THROW
+//
+// The global new operator.
+//
+	{
+	return User::Alloc(aSize);
+	}
+
+EXPORT_C TAny* operator new[](TUint aSize) __NO_THROW
+    {
+    return User::Alloc(aSize);
+    }
+
+EXPORT_C TAny* operator new(TUint aSize, TUint aExtraSize) __NO_THROW
+//
+// Allocate the requested size plus the extra.
+//
+	{
+	return  User::Alloc(aSize + aExtraSize);
+	}
+
+EXPORT_C void operator delete(TAny* aPtr) __NO_THROW
+//
+// The replacement delete operator.
+//
+	{
+	User::Free(aPtr);
+	}
+
+EXPORT_C void operator delete[](TAny* aPtr) __NO_THROW
+    {
+    User::Free(aPtr);
+    }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/symuser/symuser.cpp	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,67 @@
+// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// main.cpp
+// 
+//
+
+#include <stdlib.h>
+#include <time.h>
+
+#include "e32base.h"
+#include "us_data.h"
+#include "e32const.h"
+
+// Globals
+TLocalThreadData gThreadData;
+int gArgc = 0;
+char **gArgv = NULL;
+
+// ***
+// LocalThreadData
+//
+TLocalThreadData* LocalThreadData()
+	{
+	return &gThreadData;
+	}
+
+// ***
+// ForceKeyFunction
+// This is the key function that forces the class impedimenta to be get exported
+//
+#if (defined(__TOOLS2__) && defined(__linux__))
+EXPORT_C void XLeaveException::ForceKeyFunction()
+	{
+	}
+#endif
+
+// ***
+// main
+//
+EXPORT_C void SymInit(int argc, char *argv[])
+	{
+	gArgc = argc;
+	gArgv = argv;
+	srand(time(NULL));
+	}
+
+const TInt KIrrelevantInt = 1;
+
+EXPORT_C TThreadId RThread::Id() const{ return KIrrelevantInt;}
+
+EXPORT_C void RThread::SetPriority(TThreadPriority aPriority) const{}
+
+EXPORT_C TThreadPriority RThread::Priority() const{ return EPriorityNormal; }
+
+//end of file
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/symuser/test.pl	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,152 @@
+#!/usr/bin/perl
+
+# Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "Symbian Foundation License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+use strict;
+use warnings;
+use Test;
+use Getopt::Long qw(:config auto_version auto_help);
+use File::Spec::Functions;
+use File::Basename;
+use File::Copy;
+
+# The following are the tests to run
+BEGIN { plan tests => 60 }
+my @tests = qw/t_bflat t_bseg t_buf t_rbuf t_char t_circ t_collate t_des t_farray t_func t_graph t_key t_lex t_match t_parray t_que t_readar t_regn t_sque t_varray t_versio t_hashtab t_huff t_float t_i64 t_i64_2 t_math t_math2 t_trap t_ctrap/;
+
+# Make sure we're in the correct folder
+chdir('../symuser') or die "Failed to set folder: $!";
+
+# Version of the script - just use the date
+$main::VERSION = '13-Oct-08';
+
+# Get command line arguments
+print "\n";
+my ( $verbose, $skip );
+GetOptions("verbose" => \$verbose, "skip" => \$skip) or pod2usage(2);
+
+my $win32 = 1 if $^O =~ /MSWin32/;
+print "Running on Win32\n" if $win32 && $verbose;
+print "Running on Linux\n" if !$win32 && $verbose;
+
+# Some files have to be copied to an accessible location
+unlink 'UnicodeData.txt';
+copy(catfile('..', 'e32test', 'buffer', 'UnicodeData.txt'), 'unicodedata.txt') or die "Failed to copy file: $!";
+
+# Build the code and run the tests
+doBuild() if (!$skip);
+foreach my $test ( @tests )
+	{
+	doTest('deb', $test);
+	doTest('rel', $test);
+	}
+
+# ***
+# Runs test code
+#
+sub doTest
+	{
+	my ( $variant, $name ) = @_;
+
+	my $test;
+	if ($win32)
+		{
+		$test = catfile($ENV{EPOCROOT}, 'epoc32', 'release', 'tools2', $variant, "$name.exe");
+		}
+	else
+		{
+		# Have to set library path for Linux
+		$ENV{LD_LIBRARY_PATH} =~ s[/epoc32[^:]+:/][];
+		$ENV{LD_LIBRARY_PATH} = "$ENV{EPOCROOT}epoc32/release/tools2/linux-i386/$variant:$ENV{LD_LIBRARY_PATH}";
+		$test = catfile($ENV{EPOCROOT}, 'epoc32', 'release', 'tools2', 'linux-i386', $variant, $name);
+		}
+
+	die "Can't find test exe: $test" if !-e $test;
+	print "Running test: $test\n" if $verbose;
+
+	my $pass;
+	open TEST, "$test|" or die "Failed to start test $test: $!";
+	while(<TEST>)
+		{
+		print "\t$_" if $verbose;
+		$pass = 1 if /^RTEST: SUCCESS/ or /TEST Successfully Completed/;
+		}
+
+	print "FAIL: $test\n" if (!$pass);
+	ok($pass);	
+	close TEST;
+	}
+
+# ***
+# Builds the test code
+# *
+sub doBuild
+	{
+	# First of all see if SBSv2 is installed
+	my $sbs_ver = 1;
+	open SBS, 'sbs -v 2>&1|' or die "Failed to execute command: $!";
+	while(<SBS>)
+		{
+		if (/^sbs version/)
+			{
+			$sbs_ver = 2;
+			last;
+			}
+		}
+	close SBS;
+	
+	# Override the result using environment variable
+	$sbs_ver = 1 if $ENV{SBS_VERSION} && $ENV{SBS_VERSION} == 1;
+	my $nul = $win32 ? 'nul' : '/dev/null';
+	my $redir = $verbose? '' : " >$nul 2>&1";
+
+	# Now build the test code - assumes current working directory is correct!
+	print "Building test code using SBSv$sbs_ver\n" if $verbose;
+	if ($sbs_ver == 1)
+		{
+		print "Building test code using SBSv1\n";
+
+		# Use the old build system
+		system("bldmake bldfiles$redir");
+		system("abld test makefile$redir");
+		system("abld test clean$redir");
+		system("abld test build$redir");
+		}
+	else
+		{
+		print "Building test code using SBSv2\n";
+
+		# Use the new build system
+		system("sbs -c tools2.test CLEAN$redir");
+		system("sbs -c tools2.test$redir");
+		}
+	}
+
+=head1 NAME
+
+test.pl - A script for running tests
+
+=head1 SYNOPSIS
+
+test.pl [-help] [-version] [-verbose] [-skip]
+
+ Options:
+   -help      brief help message
+   -version   version of the script
+   -verbose   print what the scripts does
+   -skip      skip building the code
+
+=cut
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/symuser/x86hlp.cia	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,18 @@
+// Copyright (c) 1997-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+#include "u32std.h"
+#include <x86hlp_gcc.inl>
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/symutil/group/bld.inf	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,35 @@
+// Copyright (c) 1997-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+PRJ_EXPORTS
+
+../inc/errorstrings.h    /epoc32/include/x86tool/
+../inc/errortranslator.h    /epoc32/include/x86tool/
+../inc/utils.h    /epoc32/include/x86tool/
+
+PRJ_PLATFORMS
+TOOLS2
+
+
+PRJ_EXTENSIONS
+
+#ifdef TOOLS2
+start extension tools/x86tool
+option TARGET_NAME symutil
+option TARGET_TYPE lib
+option SOURCE_DIRS ../src
+option INCLUDES ../inc ../../e32/include
+end
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/symutil/inc/errorstrings.h	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,62 @@
+// Copyright (c) 1997-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+ERRORSTRING(No error [KErrNone]),
+ERRORSTRING(Unable to find the specified object [KErrNotFound]),
+ERRORSTRING(General (unspecified) error [KErrGeneral]),
+ERRORSTRING(The operation was cancelled [KErrCancel]),
+ERRORSTRING(Not enough memory. Close some applications and try again [KErrNoMemory]),
+ERRORSTRING(The operation requested is not supported [KErrNotSupported]),
+ERRORSTRING(Malformed query [KErrArgument]),
+ERRORSTRING(Total loss of precision [KErrTotalLossOfPrecision]),
+ERRORSTRING(Bad object [KErrBadHandle]),
+ERRORSTRING(Overflow [KErrOverflow]),
+ERRORSTRING(Underflow [KErrUnderflow]),
+ERRORSTRING(Already exists [KErrAlreadyExists]),
+ERRORSTRING(Unable to find the specified folder [KErrPathNotFound]),
+ERRORSTRING(Closed [KErrDied]),
+ERRORSTRING(The specified object is currently in use by another program [KErrInUse]),
+ERRORSTRING(Server has closed [KErrServerTerminated]),
+ERRORSTRING(Server busy [KErrServerBusy]),
+ERRORSTRING(Completion error [KErrCompletion]),
+ERRORSTRING(Not ready [KErrNotReady]),
+ERRORSTRING(Unknown error [KErrUnknown]),
+ERRORSTRING(Corrupt [KErrCorrupt]),
+ERRORSTRING(Access denied [KErrAccessDenied]),
+ERRORSTRING(Locked [KErrLocked]),
+ERRORSTRING(Failed to write [KErrWrite]),
+ERRORSTRING(Wrong disk present [KErrDisMounted]),
+ERRORSTRING(Unexpected end of file [KErrEof]),
+ERRORSTRING(Disk full [KErrDiskFull]),
+ERRORSTRING(Bad device driver [KErrBadDriver]),
+ERRORSTRING(Bad name [KErrBadName]),
+ERRORSTRING(Comms line failed [KErrCommsLineFail]),
+ERRORSTRING(Comms frame error [KErrCommsFrame]),
+ERRORSTRING(Comms overrun error [KErrCommsOverrun]),
+ERRORSTRING(Comms parity error [KErrCommsParity]),
+ERRORSTRING(Timed out [KErrTimedOut]),
+ERRORSTRING(Failed to connect [KErrCouldNotConnect]),
+ERRORSTRING(Failed to disconnect [KErrCouldNotDisconnect]),
+ERRORSTRING(Disconnected [KErrDisconnected]),
+ERRORSTRING(Bad library entry point [KErrBadLibraryEntryPoint]),
+ERRORSTRING(Bad descriptor [KErrBadDescriptor]),
+ERRORSTRING(Interrupted [KErrAbort]),
+ERRORSTRING(Too big [KErrTooBig]),
+ERRORSTRING(Divide by zero [KErrDivideByZero]),
+ERRORSTRING(Batteries too low [KErrBadPower]),
+ERRORSTRING(Folder full [KErrDirFull]),
+ERRORSTRING(Hardware not available [KErrHardwareNotAvailable]),
+ERRORSTRING(Session closed [KErrSessionClosed]),
+ERRORSTRING(Permission denied when attempting operatio [KErrPermissionDenied])
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/symutil/inc/errortranslator.h	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,18 @@
+// Copyright (c) 1997-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+#include <e32std.h>
+
+void TranslateError(TInt aErrorCode, TDes8& aTarget);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/symutil/inc/utils.h	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,40 @@
+// Copyright (c) 1997-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+#include <e32std.h>
+#include <time.h>
+
+/**
+ * Creates a NULL terminated string from aSource and stores into aTarget.
+ */
+extern const TInt CreateNullTerminatedString(TDes8& aTarget, const TDesC8& aSource);
+
+/**
+ * Creates a NULL terminated string from aSource and stores into aTarget.
+ * The 16 to 8 bit conversion is performed via TDes16::Collapse
+ */
+extern const TInt CreateNullTerminatedString(TDes8& aTarget, const TDesC& aSource);
+
+/**
+ * Creates a NULL terminated string from aSource and stores into aTarget.
+ */
+extern const TInt CreateNullTerminatedString(TDes& aTarget, const TDesC& aSource);
+
+
+extern const void TTime_to_time_t(TTime& aSource, time_t& aTarget) ;
+
+extern const void TTime_to_tm(TTime& aTime, struct tm& aTarget ) ;
+
+extern const void time_t_to_TTime(time_t& aSource, TTime& aTarget) ;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/symutil/src/errortranslator.cpp	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,51 @@
+// Copyright (c) 1997-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+#include <e32std.h>
+
+const TInt KMaxErrorStringLength = 100;
+static const TText8 KErrorMessages[][KMaxErrorStringLength+1]=
+	{
+#define ERRORSTRING(s) #s
+#include "errorstrings.h"
+#undef ERRORSTRING
+	};
+
+
+void TranslateError(TInt aErrorCode, TDes8& aTarget)
+	{
+	aErrorCode = - aErrorCode;
+	if ( aErrorCode > 46 )
+		{
+		_LIT8(KNoTranslationAvailable, "");
+		aTarget.Copy(KNoTranslationAvailable);
+		aTarget.Append(' ');
+		aTarget.Append('-');
+		aTarget.AppendNum(aErrorCode);
+		}
+	else if ( aErrorCode >= 0 )
+		{
+		aTarget.Copy(KErrorMessages[aErrorCode]);
+		}
+	else
+		{
+		_LIT8(KNoTranslationAvailable, "");
+		aTarget.Copy(KNoTranslationAvailable);
+		aTarget.Append(' ');
+		aTarget.AppendNum(aErrorCode);
+		}
+	}
+
+// end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/symutil/src/utils.cpp	Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,91 @@
+// Copyright (c) 1997-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+#include <utils.h>
+#include <time.h>
+/**
+ * Creates a NULL terminated string from aSource and stores into aTarget.
+ */
+const TInt CreateNullTerminatedString(TDes8& aTarget, const TDesC8& aSource)
+	{
+	aTarget.Append(aSource);
+	aTarget.Append('\0');
+	return KErrNone;
+	}
+
+/**
+ * Creates a NULL terminated string from aSource and stores into aTarget.
+ * The 16 to 8 bit conversion is performed via TDes16::Collapse
+ */
+const TInt CreateNullTerminatedString(TDes8& aTarget, const TDesC& aSource)
+	{
+	aTarget.Copy(aSource);
+	aTarget.Append('\0');
+	return KErrNone;
+	}
+
+/**
+ * Creates a NULL terminated string from aSource and stores into aTarget.
+ */
+const TInt CreateNullTerminatedString(TDes& aTarget, const TDesC& aSource)
+	{
+	aTarget.Append(aSource);
+	aTarget.Append('\0');
+	return KErrNone;
+	}
+
+const void TTime_to_time_t(TTime& aSource, time_t& aTarget)
+	{
+	TDateTime dateTime = aSource.DateTime();
+	struct tm stm;
+
+	stm.tm_year = dateTime.Year() - 1900;
+	stm.tm_mon  = (int)dateTime.Month();
+	stm.tm_mday = 1 + dateTime.Day();
+	stm.tm_hour = dateTime.Hour();
+	stm.tm_min = dateTime.Minute();
+	stm.tm_sec = dateTime.Second();
+
+	aTarget = mktime(&stm);
+	}
+
+const void TTime_to_tm(TTime& aSource, tm& aTarget )
+	{
+	TDateTime dateTime = aSource.DateTime();
+	aTarget.tm_year = dateTime.Year() - 1900;
+	aTarget.tm_mon  = (int)dateTime.Month();
+	aTarget.tm_mday = 1 + dateTime.Day();
+	aTarget.tm_hour = dateTime.Hour();
+	aTarget.tm_min = dateTime.Minute();
+	aTarget.tm_sec = dateTime.Second();
+	}
+
+const void time_t_to_TTime(time_t& aSource, TTime& aTarget)
+	{
+	struct tm* ptm = localtime( &aSource );
+
+	TDateTime datetime (
+			ptm->tm_year +1900,
+			(TMonth)(EJanuary + ptm->tm_mon),
+			ptm->tm_mday - 1,
+			ptm->tm_hour,
+			ptm->tm_min,
+			ptm->tm_sec, 0
+			);
+	TTime tmp(datetime);
+	aTarget = tmp;
+	}
+
+//end of file